Skip to main content

WorkflowManager API

The WorkflowManager class manages workflow discovery, loading, and execution from markdown files.

Import

from praisonaiagents.memory import WorkflowManager, Workflow, WorkflowStep

WorkflowStep

A dataclass representing a single step in a workflow.

Constructor

WorkflowStep(
    name: str,
    description: str = "",
    action: str = "",
    condition: Optional[str] = None,
    on_error: Literal["stop", "continue", "retry"] = "stop",
    max_retries: int = 1,
    context_from: Optional[List[str]] = None,
    retain_full_context: bool = True,
    output_variable: Optional[str] = None,
    agent_config: Optional[Dict[str, Any]] = None,
    tools: Optional[List[Any]] = None
)

Parameters

ParameterTypeDefaultDescription
namestrrequiredStep name
descriptionstr""Step description
actionstr""The action/prompt to execute
conditionOptional[str]NoneCondition for execution
on_errorLiteral["stop", "continue", "retry"]"stop"Error handling mode
max_retriesint1Maximum retry attempts
context_fromOptional[List[str]]NoneSteps to include context from
retain_full_contextboolTrueInclude all previous outputs
output_variableOptional[str]NoneCustom variable name for output
agent_configOptional[Dict[str, Any]]NonePer-step agent configuration
toolsOptional[List[Any]]NoneTools for this step

Agent Config Options

When using agent_config, you can specify:
KeyTypeDescription
rolestrAgent role (e.g., “Researcher”)
goalstrAgent goal
backstorystrAgent backstory
llmstrLLM model override
verboseboolEnable verbose output

Example

step = WorkflowStep(
    name="research",
    action="Research {{topic}}",
    agent_config={
        "role": "Researcher",
        "goal": "Find comprehensive information",
        "backstory": "Expert researcher"
    },
    tools=["tavily_search"],
    output_variable="research_data"
)

Workflow

A dataclass representing a complete workflow with multiple steps.

Constructor

Workflow(
    name: str,
    description: str = "",
    steps: List[WorkflowStep] = [],
    variables: Dict[str, Any] = {},
    file_path: Optional[str] = None,
    default_agent_config: Optional[Dict[str, Any]] = None,
    default_llm: Optional[str] = None,
    memory_config: Optional[Dict[str, Any]] = None,
    planning: bool = False,
    planning_llm: Optional[str] = None
)

Parameters

ParameterTypeDefaultDescription
namestrrequiredWorkflow name
descriptionstr""Workflow description
stepsList[WorkflowStep][]List of workflow steps
variablesDict[str, Any]{}Default variables
file_pathOptional[str]NoneSource file path
default_agent_configOptional[Dict[str, Any]]NoneDefault agent config for all steps
default_llmOptional[str]NoneDefault LLM model
memory_configOptional[Dict[str, Any]]NoneMemory configuration
planningboolFalseEnable planning mode
planning_llmOptional[str]NoneLLM for planning

Example

workflow = Workflow(
    name="research_pipeline",
    description="Multi-agent research workflow",
    default_llm="gpt-4o-mini",
    planning=True,
    steps=[
        WorkflowStep(name="research", action="Research AI"),
        WorkflowStep(name="write", action="Write report")
    ],
    variables={"topic": "AI trends"}
)

WorkflowManager

The main class for managing and executing workflows.

Constructor

WorkflowManager(
    workspace_path: Optional[str] = None,
    verbose: int = 0
)

Parameters

ParameterTypeDefaultDescription
workspace_pathOptional[str]NonePath to workspace (defaults to cwd)
verboseint0Verbosity level (0-3)

Methods

execute()

Execute a workflow synchronously.
def execute(
    workflow_name: str,
    executor: Optional[Callable[[str], str]] = None,
    variables: Optional[Dict[str, Any]] = None,
    on_step: Optional[Callable[[WorkflowStep, int], None]] = None,
    on_result: Optional[Callable[[WorkflowStep, str], None]] = None,
    default_agent: Optional[Any] = None,
    default_llm: Optional[str] = None,
    memory: Optional[Any] = None,
    planning: bool = False,
    stream: bool = False,
    verbose: int = 0
) -> Dict[str, Any]

Parameters

ParameterTypeDefaultDescription
workflow_namestrrequiredName of workflow to execute
executorOptional[Callable]NoneFunction to execute each step
variablesOptional[Dict]NoneVariables to substitute
on_stepOptional[Callable]NoneCallback before each step
on_resultOptional[Callable]NoneCallback after each step
default_agentOptional[Any]NoneDefault agent for steps
default_llmOptional[str]NoneDefault LLM model
memoryOptional[Any]NoneShared memory instance
planningboolFalseEnable planning mode
streamboolFalseEnable streaming output
verboseint0Verbosity level

Returns

{
    "success": bool,
    "workflow": str,
    "results": [
        {
            "step": str,
            "status": "success" | "failed" | "skipped",
            "output": str | None,
            "error": str | None
        }
    ],
    "variables": Dict[str, Any]
}

Example

from praisonaiagents import Agent
from praisonaiagents.memory import WorkflowManager

agent = Agent(name="Assistant", llm="gpt-4o-mini")
manager = WorkflowManager()

result = manager.execute(
    "deploy",
    default_agent=agent,
    variables={"environment": "production"},
    on_step=lambda step, i: print(f"Starting: {step.name}"),
    on_result=lambda step, output: print(f"Done: {step.name}")
)

if result["success"]:
    print("Workflow completed!")

aexecute()

Execute a workflow asynchronously.
async def aexecute(
    workflow_name: str,
    executor: Optional[Callable[[str], str]] = None,
    variables: Optional[Dict[str, Any]] = None,
    on_step: Optional[Callable[[WorkflowStep, int], None]] = None,
    on_result: Optional[Callable[[WorkflowStep, str], None]] = None,
    default_agent: Optional[Any] = None,
    default_llm: Optional[str] = None,
    memory: Optional[Any] = None,
    planning: bool = False,
    stream: bool = False,
    verbose: int = 0
) -> Dict[str, Any]

Parameters

Same as execute().

Example

import asyncio
from praisonaiagents.memory import WorkflowManager

manager = WorkflowManager()

async def main():
    # Run multiple workflows concurrently
    results = await asyncio.gather(
        manager.aexecute("research", default_llm="gpt-4o-mini"),
        manager.aexecute("analysis", default_llm="gpt-4o-mini"),
    )
    return results

results = asyncio.run(main())

list_workflows()

List all available workflows.
def list_workflows() -> List[Workflow]

Returns

List of Workflow objects.

Example

manager = WorkflowManager()
workflows = manager.list_workflows()

for workflow in workflows:
    print(f"{workflow.name}: {len(workflow.steps)} steps")

get_workflow()

Get a specific workflow by name.
def get_workflow(name: str) -> Optional[Workflow]

Parameters

ParameterTypeDescription
namestrWorkflow name (case-insensitive)

Returns

Workflow object or None if not found.

create_workflow()

Create a new workflow file.
def create_workflow(
    name: str,
    description: str = "",
    steps: Optional[List[Dict[str, str]]] = None,
    variables: Optional[Dict[str, Any]] = None
) -> Workflow

Parameters

ParameterTypeDefaultDescription
namestrrequiredWorkflow name
descriptionstr""Workflow description
stepsOptional[List[Dict]]NoneList of step definitions
variablesOptional[Dict]NoneDefault variables

Example

manager = WorkflowManager()

workflow = manager.create_workflow(
    name="Code Review",
    description="Review code changes",
    steps=[
        {"name": "Lint", "action": "Run linting"},
        {"name": "Test", "action": "Run tests"},
        {"name": "Review", "action": "Review code"}
    ],
    variables={"branch": "main"}
)

get_stats()

Get workflow statistics.
def get_stats() -> Dict[str, Any]

Returns

{
    "total_workflows": int,
    "total_steps": int,
    "workflows_dir": str
}

reload()

Reload workflows from disk.
def reload() -> None

Variable Substitution

Workflows support variable substitution using {{variable}} syntax:
VariableDescription
{{variable_name}}User-defined variable
{{previous_output}}Output from previous step
{{step_name_output}}Output from specific step

Example

workflow = Workflow(
    name="pipeline",
    variables={"topic": "AI"},
    steps=[
        WorkflowStep(
            name="research",
            action="Research {{topic}}",
            output_variable="research_data"
        ),
        WorkflowStep(
            name="analyze",
            action="Analyze: {{research_data}}"
        ),
        WorkflowStep(
            name="write",
            action="Write about {{previous_output}}"
        )
    ]
)

See Also