Overview
AgentSessionManager.WorkflowBridge is a thin integration layer for calling ASM from external workflow/DAG engines.
It is not a workflow runtime. It wraps SessionManager with workflow-friendly helpers for:
- Step execution (
step_execute/3) - Result normalization (
step_result/2) - Shared session setup/teardown (
setup_workflow_session/3,complete_workflow_session/3) - Error routing decisions (
classify_error/1)
One-Shot Pattern
Use one-shot mode when each workflow step is independent.
alias AgentSessionManager.WorkflowBridge
{:ok, result} =
WorkflowBridge.step_execute(store, adapter, %{
input: %{messages: [%{role: "user", content: "Summarize this file"}]}
})Notes:
- One-shot creates a new session per step.
- You still get normalized
StepResultoutput. - If
storeis{module, context}, WorkflowBridge transparently uses a multi-step fallback becauseSessionManager.run_once/4does not support module-backed tuples.
Multi-Run Pattern
Use multi-run mode when steps need continuity across a shared session.
alias AgentSessionManager.WorkflowBridge
{:ok, session_id} =
WorkflowBridge.setup_workflow_session(store, adapter, %{
agent_id: "review-workflow",
context: %{system_prompt: "You are concise."}
})
{:ok, _r1} =
WorkflowBridge.step_execute(store, adapter, %{
session_id: session_id,
input: %{messages: [%{role: "user", content: "Remember: TOKEN-42"}]}
})
{:ok, _r2} =
WorkflowBridge.step_execute(store, adapter, %{
session_id: session_id,
input: %{messages: [%{role: "user", content: "What token?"}]},
continuation: :auto,
continuation_opts: [max_messages: 50]
})
:ok = WorkflowBridge.complete_workflow_session(store, session_id)Lifecycle behavior:
setup_workflow_session/3creates + activates a sessioncomplete_workflow_session/3defaults to completion- pass
status: :failed(and optionalerror:) to fail it
Error Classification
Use classify_error/1 to convert ASM errors into retry/failover/abort signals.
alias AgentSessionManager.Core.Error
alias AgentSessionManager.WorkflowBridge
classification = WorkflowBridge.classify_error(Error.new(:provider_timeout, "timed out"))
# => %{retryable: true, category: :provider, recommended_action: :retry}Recommended action mapping:
| Error Code | Recommended Action |
|---|---|
:provider_timeout | :retry |
:provider_rate_limited | :wait_and_retry |
:provider_unavailable | :failover |
:storage_connection_failed | :retry |
:timeout | :retry |
:max_runs_exceeded | :wait_and_retry |
:cancelled | :cancel |
:policy_violation | :cancel |
:validation_error | :abort |
:session_not_found | :abort |
:run_not_found | :abort |
:provider_error | :abort |
:provider_authentication_failed | :abort |
:provider_quota_exceeded | :abort |
| any other code | :abort |
Data Contract
step_execute/3 returns {:ok, %WorkflowBridge.StepResult{...}}:
outputfull provider output mapcontentextracted output text when presenttoken_usagetoken counts mapsession_id,run_ididentity fieldseventsraw event liststop_reasonconvenience routing signaltool_calls,has_tool_callstool routing signalpersistence_failuresevent persistence countworkspace,policyoptional execution metadataretryablereserved routing flag (currentlyfalsefor success)
Integration With Jido
Jido Action modules can call WorkflowBridge directly:
- per-step execution uses
step_execute/3 - workflow setup/teardown actions use
setup_workflow_session/3andcomplete_workflow_session/3 - failure routing uses
classify_error/1
This keeps Jido actions thin while centralizing ASM-specific behavior in one module.
Store Compatibility
SessionManager.run_once/4 only accepts process-backed store references (pid, registered atom, :via, :global).
It rejects module-backed stores ({module, context}), which are common for persistence adapters like Ecto.
WorkflowBridge handles this automatically:
- process-backed store -> one-shot path uses
run_once/4 - module-backed store -> one-shot path uses explicit
start_session -> activate_session -> start_run -> execute_run -> complete_session
The caller always receives the same normalized StepResult contract.