11.2 SequentialWorkflow 顺序编排
`SequentialWorkflow` 实现了流水线模式的 Agent 编排——Agent 按顺序链式执行,每个 Agent 接收前一个 Agent 的输出作为输入。内部由 `WorkflowEngine` 驱动,自动获得检查点、重试、超时、流式事件等基础设施能力。
执行流程
sequenceDiagram
participant U as 用户
participant WF as SequentialWorkflow
participant E as WorkflowEngine
participant A1 as Agent 1(研究者)
participant A2 as Agent 2(摘要员)
U->>WF: as_agent().run(input)
WF->>E: 构建图 Agent1→Agent2
E->>A1: NodeInvoking + 消息分发
A1-->>E: NodeStreaming(实时流式)
A1-->>E: NodeCompleted
E->>E: 通过 EdgeRunner 路由到 Agent2
E->>A2: NodeInvoking + 消息分发
A2-->>E: NodeStreaming(实时流式)
A2-->>U: 最终输出流
内部建图:`Agent1 → DirectEdge → Agent2 → ... → AgentN`,通过 `WorkflowAgent` 桥接为 IAgent。
API 参考
SequentialWorkflowBuilder(对齐 MAF)
use rust_agent_workflow::SequentialWorkflowBuilder;
let workflow = SequentialWorkflowBuilder::new()
.add_agent(researcher)
.add_agent(summarizer)
.add_agent(translator)
.build()?;
// 统一门面
let agent: Arc<dyn IAgent> = workflow.as_agent();
let stream = agent.run(messages, session, None).await?;
快捷构造
let workflow = SequentialWorkflow::from_agents(vec![
researcher, summarizer, translator,
])?;
// 返回引擎双流
let (events, outputs) = workflow.run(input, session, None).await?;
// 或使用向后兼容的单流接口
let stream = workflow.run_agent(input, session, None).await?;
内部实现
`SequentialWorkflow` 通过 `WorkflowBuilder` 构建顺序图,由 `WorkflowEngine` 驱动:
fn from_agents(agents: Vec<Arc<dyn IAgent>>) -> Result<Self> {
let mut builder = WorkflowBuilder::new();
for (i, agent) in agents.iter().enumerate() {
let node_id = format!("seq_agent_{}", i);
builder = builder.add_node(
node_id.clone(),
Arc::new(AgentExecutor::new(node_id.clone(), agent.clone())),
);
if i > 0 {
builder = builder.add_edge(&prev_id, &node_id);
} else {
builder = builder.set_start(node_id.clone());
}
prev_id = node_id.clone();
}
builder = builder.with_output_from(&prev_id);
builder.build()
}
`as_agent()` 返回由 `WorkflowAgent` 封装的 IAgent,内部使用 WorkflowEngine 驱动执行。
完整示例
use std::sync::Arc;
use rust_agent_core::{IAgent, ChatMessage};
use rust_agent_workflow::SequentialWorkflowBuilder;
use rust_agent_framework::AgentBuilder;
use futures_util::StreamExt;
async fn run_documentation_pipeline() -> anyhow::Result<()> {
let client = DeepSeekChatClient::new(/* ... */)?;
// 研究员
let researcher = AgentBuilder::new("researcher")
.chat_client(client.clone())
.instructions("你是信息研究员。收集并整理关于用户主题的全面信息。")
.with_description("信息研究员")
.max_tool_rounds(5)
.build()?;
// 摘要员
let summarizer = AgentBuilder::new("summarizer")
.chat_client(client.clone())
.instructions("将输入内容精简为 3-5 个核心要点。")
.with_description("内容摘要员")
.build()?;
// 构建工作流
let workflow = SequentialWorkflowBuilder::new()
.add_agent(researcher)
.add_agent(summarizer)
.build()?;
let agent: Arc<dyn IAgent> = workflow.as_agent();
let input = vec![ChatMessage::user("请研究 Rust 异步编程的最佳实践")];
let mut stream = agent.run(input, None, None).await?;
while let Some(chunk) = stream.next().await {
match chunk {
Ok(result) => {
for content in &result.contents {
if let Content::Text(ref t) = content {
print!("{}", t.delta);
}
}
}
Err(e) => eprintln!("错误: {}", e),
}
}
Ok(())
}
适用场景
| 场景 | 说明 | |------|------| | 研究 → 摘要 → 翻译 | 信息处理流水线 | | 代码生成 → 代码审查 → 测试生成 | 软件开发流水线 | | 数据采集 → 数据清洗 → 分析报告 | 数据处理流水线 | | 问题分析 → 方案设计 → 方案评审 | 决策流水线 |
注意事项
1. **引擎驱动**:内部由 WorkflowEngine 执行,自动获得检查点和完整事件流 2. **as_agent() 门面**:返回的 IAgent 可通过 `get_subagent()` 发现子 Agent 3. **错误处理**:如果中间 Agent 运行失败,引擎执行补偿回滚并返回错误 4. **向后兼容**:`from_agents()` 快捷构造和 `run_agent()` 单流接口保留,`SequentialPattern` 别名仍可用