Action Framework
The action framework provides the foundational classes for building reusable workflow components that follow GitHub Actions patterns.
Core Classes
causaliq_workflow.action
Action
Base class for all workflow actions.
Methods:
-
run–Execute action with validated inputs, return outputs.
-
validate_inputs–Validate input values against input specifications.
run
abstractmethod
run(
inputs: Dict[str, Any], mode: str = "run", context: Optional[WorkflowContext] = None
) -> Dict[str, Any]
Execute action with validated inputs, return outputs.
Parameters:
-
(inputsDict[str, Any]) –Dictionary of input values keyed by input name
-
(modestr, default:'run') –Execution mode ('dry-run', 'run', 'compare')
-
(contextOptional[WorkflowContext], default:None) –Workflow context for optimization and intelligence
Returns:
-
Dict[str, Any]–Dictionary of output values keyed by output name
Raises:
-
ActionExecutionError–If action execution fails
validate_inputs
validate_inputs(inputs: Dict[str, Any]) -> bool
Validate input values against input specifications.
Parameters:
-
(inputsDict[str, Any]) –Dictionary of input values to validate
Returns:
-
bool–True if all inputs are valid
Raises:
-
ActionValidationError–If validation fails
ActionInput
dataclass
ActionInput(
name: str,
description: str,
required: bool = False,
default: Any = None,
type_hint: str = "Any",
)
Define action input specification.
ActionOutput
dataclass
ActionOutput(name: str, description: str, value: Any)
Define action output specification.
Exception Handling
ActionExecutionError
Raised when action execution fails.
ActionValidationError
Raised when action input validation fails.
Quick Example
from causaliq_workflow.action import Action, ActionExecutionError
from typing import Any, Dict
class MyStructureLearnerAction(Action):
"""Custom structure learning action."""
name = "my-structure-learner"
version = "1.0.0"
description = "Custom causal structure learning implementation"
def run(self, inputs: Dict[str, Any]) -> Dict[str, Any]:
"""Execute the structure learning algorithm."""
try:
# Your implementation here
return {
"graph_path": "/path/to/output.graphml",
"node_count": 5,
"edge_count": 8,
}
except Exception as e:
raise ActionExecutionError(f"Structure learning failed: {e}") from e
Design Patterns
Action Implementation Guidelines
- Inherit from Action base class - Provides standardized interface
- Define comprehensive inputs - Use ActionInput for type safety
- Document outputs clearly - Help users understand action results
- Handle errors gracefully - Use ActionExecutionError and ActionValidationError
- Follow semantic versioning - Enable workflow compatibility tracking
- Create GraphML output - Use standardized format for causal graphs
Testing Your Actions
import pytest
from pathlib import Path
from causaliq_workflow.action import ActionExecutionError
def test_my_action_success():
"""Test successful action execution."""
action = MyStructureLearnerAction()
inputs = {
"data_path": "/path/to/test_data.csv",
"output_dir": "/path/to/output",
"alpha": 0.05,
}
result = action.run(inputs)
assert "graph_path" in result
assert "node_count" in result
assert "edge_count" in result
assert Path(result["graph_path"]).exists()
def test_my_action_missing_file():
"""Test action fails gracefully with missing input."""
action = MyStructureLearnerAction()
inputs = {
"data_path": "/nonexistent/file.csv",
"output_dir": "/path/to/output",
}
with pytest.raises(ActionExecutionError):
action.run(inputs)