Skip to content

Workflow API

The Workflow API provides the components for defining, building, and executing workflows within the Curriculum Curator system.

WorkflowEngine

The WorkflowEngine class is responsible for executing workflow definitions:

from curriculum_curator.workflow.engine import WorkflowEngine

engine = WorkflowEngine(config)
workflow = engine.load_workflow("workflows/my_workflow.yaml")
result = engine.execute(workflow, parameters={"topic": "Python"})

Class Definition

class WorkflowEngine:
    """
    Engine for executing workflows defined in YAML configurations.

    The WorkflowEngine is responsible for orchestrating the execution of
    multi-stage workflows, including content generation, validation,
    and remediation stages.
    """

    def __init__(self, config=None, llm_manager=None, validation_manager=None, 
                 remediation_manager=None, prompt_registry=None):
        """
        Initialize a new WorkflowEngine.

        Args:
            config (dict, optional): Configuration options.
            llm_manager (LLMManager, optional): LLM manager instance.
            validation_manager (ValidationManager, optional): Validation manager instance.
            remediation_manager (RemediationManager, optional): Remediation manager instance.
            prompt_registry (PromptRegistry, optional): Prompt registry instance.
        """

    def load_workflow(self, workflow_path):
        """
        Load a workflow definition from a YAML file.

        Args:
            workflow_path (str): Path to the workflow YAML file.

        Returns:
            Workflow: The loaded workflow object.
        """

    def execute(self, workflow, parameters=None):
        """
        Execute a workflow with optional parameters.

        Args:
            workflow (Workflow): The workflow to execute.
            parameters (dict, optional): Parameters to pass to the workflow.

        Returns:
            WorkflowResult: The result of the workflow execution.
        """

    def execute_stage(self, stage, content=None, parameters=None):
        """
        Execute a single workflow stage.

        Args:
            stage (Stage): The stage to execute.
            content (str, optional): Input content for the stage.
            parameters (dict, optional): Parameters for the stage.

        Returns:
            tuple: (output_content, stage_result)
        """

    def execute_llm_generation_stage(self, stage, parameters=None):
        """
        Execute an LLM generation stage.

        Args:
            stage (Stage): The LLM generation stage to execute.
            parameters (dict, optional): Parameters for the stage.

        Returns:
            tuple: (generated_content, stage_result)
        """

    def execute_validation_stage(self, stage, content, parameters=None):
        """
        Execute a validation stage.

        Args:
            stage (Stage): The validation stage to execute.
            content (str): Content to validate.
            parameters (dict, optional): Parameters for the stage.

        Returns:
            tuple: (content, validation_result)
        """

    def execute_remediation_stage(self, stage, content, validation_results, parameters=None):
        """
        Execute a remediation stage.

        Args:
            stage (Stage): The remediation stage to execute.
            content (str): Content to remediate.
            validation_results (ValidationResult): Validation results.
            parameters (dict, optional): Parameters for the stage.

        Returns:
            tuple: (remediated_content, remediation_result)
        """

WorkflowBuilder

The WorkflowBuilder class provides an interactive way to build workflow definitions:

from curriculum_curator.workflow.builder import WorkflowBuilder

builder = WorkflowBuilder()
workflow = builder.build_interactive()
builder.save_workflow(workflow, "workflows/new_workflow.yaml")

Class Definition

class WorkflowBuilder:
    """
    Interactive builder for creating workflow definitions.

    The WorkflowBuilder provides a guided approach to creating workflow
    definitions without requiring manual YAML editing.
    """

    def __init__(self, prompt_registry=None, validator_registry=None, 
                 remediator_registry=None):
        """
        Initialize a new WorkflowBuilder.

        Args:
            prompt_registry (PromptRegistry, optional): Prompt registry instance.
            validator_registry (list, optional): List of available validators.
            remediator_registry (list, optional): List of available remediators.
        """

    def build_interactive(self):
        """
        Build a workflow interactively through command-line prompts.

        Returns:
            Workflow: The created workflow.
        """

    def add_stage_interactive(self, workflow):
        """
        Add a stage to a workflow interactively.

        Args:
            workflow (Workflow): The workflow to add a stage to.

        Returns:
            Stage: The added stage.
        """

    def add_llm_stage_interactive(self):
        """
        Add an LLM generation stage interactively.

        Returns:
            Stage: The created LLM generation stage.
        """

    def add_validation_stage_interactive(self):
        """
        Add a validation stage interactively.

        Returns:
            Stage: The created validation stage.
        """

    def add_remediation_stage_interactive(self):
        """
        Add a remediation stage interactively.

        Returns:
            Stage: The created remediation stage.
        """

    def save_workflow(self, workflow, output_path):
        """
        Save a workflow to a YAML file.

        Args:
            workflow (Workflow): The workflow to save.
            output_path (str): Path where to save the workflow.

        Returns:
            str: The path where the workflow was saved.
        """

Workflow Models

Workflow

class Workflow:
    """
    Represents a workflow definition.

    A workflow consists of metadata and a sequence of stages to be executed
    in order.

    Attributes:
        name (str): Name of the workflow.
        description (str): Description of the workflow.
        stages (list): List of Stage objects.
        metadata (dict): Additional metadata about the workflow.
    """

    def __init__(self, name, description="", stages=None, metadata=None):
        """
        Initialize a new Workflow.

        Args:
            name (str): Name of the workflow.
            description (str, optional): Description of the workflow.
            stages (list, optional): List of Stage objects.
            metadata (dict, optional): Additional metadata.
        """

    def add_stage(self, stage):
        """
        Add a stage to the workflow.

        Args:
            stage (Stage): The stage to add.

        Returns:
            Workflow: Self for chaining.
        """

    def to_dict(self):
        """
        Convert the workflow to a dictionary.

        Returns:
            dict: Dictionary representation of the workflow.
        """

    @classmethod
    def from_dict(cls, data):
        """
        Create a Workflow from a dictionary.

        Args:
            data (dict): Dictionary representation of a workflow.

        Returns:
            Workflow: The created instance.
        """

Stage

class Stage:
    """
    Represents a stage in a workflow.

    A stage is a single step in a workflow, such as content generation,
    validation, or remediation.

    Attributes:
        name (str): Name of the stage.
        type (str): Type of the stage (e.g., "llm_generation", "validation").
        parameters (dict): Parameters for the stage.
    """

    def __init__(self, name, type_, parameters=None):
        """
        Initialize a new Stage.

        Args:
            name (str): Name of the stage.
            type_ (str): Type of the stage.
            parameters (dict, optional): Parameters for the stage.
        """

    def to_dict(self):
        """
        Convert the stage to a dictionary.

        Returns:
            dict: Dictionary representation of the stage.
        """

    @classmethod
    def from_dict(cls, data):
        """
        Create a Stage from a dictionary.

        Args:
            data (dict): Dictionary representation of a stage.

        Returns:
            Stage: The created instance.
        """

Examples

Defining a Workflow Programmatically

from curriculum_curator.workflow.models import Workflow, Stage

# Create stages
generate_stage = Stage(
    name="Generate Module Outline",
    type_="llm_generation",
    parameters={
        "prompt_template": "module/outline.txt",
        "parameters": {
            "topic": "{topic}",
            "learning_level": "{learning_level}"
        }
    }
)

validate_stage = Stage(
    name="Validate Module Outline",
    type_="validation",
    parameters={
        "validators": [
            {
                "name": "readability",
                "parameters": {
                    "min_score": 60
                }
            }
        ]
    }
)

remediate_stage = Stage(
    name="Auto-Remediate Issues",
    type_="remediation",
    parameters={
        "remediators": [
            {
                "name": "sentence_splitter",
                "parameters": {
                    "max_sentence_length": 25
                }
            }
        ]
    }
)

# Create workflow
workflow = Workflow(
    name="Basic Module Generation",
    description="Generate module outline with validation and remediation",
    stages=[generate_stage, validate_stage, remediate_stage],
    metadata={
        "version": "1.0",
        "author": "Curriculum Curator Team"
    }
)

# Convert to dictionary for serialization
workflow_dict = workflow.to_dict()

Using the Workflow Engine

from curriculum_curator.workflow.engine import WorkflowEngine
from curriculum_curator.llm.manager import LLMManager
from curriculum_curator.validation.manager import ValidationManager
from curriculum_curator.remediation.manager import RemediationManager
from curriculum_curator.prompt.registry import PromptRegistry
from curriculum_curator.config.utils import load_config

# Load configuration
config = load_config("config.yaml")

# Initialize components
llm_manager = LLMManager(config)
validation_manager = ValidationManager(config)
remediation_manager = RemediationManager(config)
prompt_registry = PromptRegistry()

# Initialize the workflow engine
engine = WorkflowEngine(
    config=config,
    llm_manager=llm_manager,
    validation_manager=validation_manager,
    remediation_manager=remediation_manager,
    prompt_registry=prompt_registry
)

# Load a workflow
workflow = engine.load_workflow("workflows/module_generation.yaml")

# Execute the workflow
result = engine.execute(
    workflow,
    parameters={
        "topic": "Machine Learning Basics",
        "learning_level": "intermediate"
    }
)

# Process the result
print(f"Workflow '{result.workflow_name}' executed successfully.")
print(f"Content length: {len(result.content)} characters")
if hasattr(result, 'validation_results'):
    print(f"Validation passed: {result.validation_results.passed}")

Interactive Workflow Building

from curriculum_curator.workflow.builder import WorkflowBuilder
from curriculum_curator.prompt.registry import PromptRegistry

# Initialize components
prompt_registry = PromptRegistry()
builder = WorkflowBuilder(prompt_registry=prompt_registry)

# Build a workflow interactively
workflow = builder.build_interactive()

# Save the workflow
builder.save_workflow(workflow, "workflows/custom_workflow.yaml")