Skip to main content
Workflow History enables your Agno workflows to remember and reference previous conversations, transforming isolated executions into continuous, context-aware interactions. Instead of starting fresh each time, with Workflow History you can:
  • Build on previous interactions - Reference the context of past interactions
  • Avoid repetitive questions - Avoid requesting previously provided information
  • Maintain context continuity - Create a conversational experience
  • Learn from patterns - Analyze historical data to make better decisions
Note that this feature is different from add_history_to_context. This does not add the history of a particular agent or team, but the full workflow history to either all or some steps.

How It Works

When workflow history is enabled, previous messages are automatically injected into agent/team inputs as structured context:
<workflow_history_context>
[run-1]
input: Create content about AI in healthcare
response: # AI in Healthcare: Transforming Patient Care...

[run-2] 
input: Make it more family-focused
response: # AI in Family Healthcare: A Parent's Guide...
</workflow_history_context>

Your current input goes here...
Along with this, in using Steps with custom functions, you can access this history in the following ways:
  1. As a formatted context string as shown above
  2. In a structured format as well for more control
[
    (<workflow input from run 1>)(<workflow output from run 1>),
    (<workflow input from run 2>)(<workflow output from run 2>),
]
Example-
def custom_function(step_input: StepInput) -> StepOutput:
    # Option 1: Structured data for analysis
    history_tuples = step_input.get_workflow_history(num_runs=3)
    for user_input, workflow_output in history_tuples:
        # Process each conversation turn

    # Option 2: Formatted context for agents  
    context_string = step_input.get_workflow_history_context(num_runs=3)

    return StepOutput(content="Analysis complete")
You can use these helper functions to access the history:
  • step_input.get_workflow_history(num_runs=3)
  • step_input.get_workflow_history_context(num_runs=3)
Refer to StepInput reference for more details.

Control Levels

You can be specific about which Steps to add the history to:

Workflow-Level History

Add workflow history to all steps in the workflow:
workflow = Workflow(
    steps=[research_step, analysis_step, writing_step],
    add_workflow_history_to_steps=True  # All steps get history
)

Step-Level History

Add workflow history to specific steps only:
Step(
    name="Content Creator", 
    agent=content_agent,
    add_workflow_history=True  # Only this step gets history
)
You can also put add_workflow_history=False to disable history for a specific step.

Precedence Logic

Step-level settings always take precedence over workflow-level settings:
workflow = Workflow(
    steps=[
        Step("Research", agent=research_agent),                              # None → inherits workflow setting
        Step("Analysis", agent=analysis_agent, add_workflow_history=False),  # False → overrides workflow  
        Step("Writing", agent=writing_agent, add_workflow_history=True),     # True → overrides workflow
    ],
    add_workflow_history_to_steps=True  # Default for all steps
)

History Length Control

By default, all available history is included (no limit). It is recommended to use a fixed history run limit to avoid bloating the LLM context window. You can control this at both levels:
# Workflow-level: limit history for all steps
workflow = Workflow(
    add_workflow_history_to_steps=True,
    num_history_runs=5  # Only last 5 runs
)

# Step-level: override for specific steps
Step("Analysis", agent=analysis_agent, 
     add_workflow_history=True,
     num_history_runs=3  # Only last 3 runs for this step
)

Developer Resources

Explore the different examples in Workflow History Examples for more details.
I