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:
- As a formatted context string as shown above
- 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.