11.7 MagenticWorkflow 自主编排
`MagenticWorkflow` 实现了自主多 Agent 编排模式(对齐 MAF Magentic-One)——一个 Orchestrator Agent 通过推理-行动循环(ReAct loop)自主分解任务,动态调度子 Agent 和工具完成复杂目标。
执行流程
graph TD
U[用户输入] --> O[Orchestrator Agent]
O -->|"分析任务"| P[Plan: 子任务分解]
P -->|"调度 Agent"| SA[Sub-Agent.run]
P -->|"调用工具"| T[Tool.call]
SA --> R[收集结果]
T --> R
R -->|"评估进度"| D{任务完成?}
D -->|否| O
D -->|是| OUT[最终输出]
每次"推理 → 调度 → 收集 → 评估"为一个 SuperStep,由 `WorkflowEngine` 驱动执行。所有调度过程产生完整的 `WorkflowEvent` 事件流。
API 参考
MagenticWorkflowBuilder(对齐 MAF)
use rust_agent_workflow::MagenticWorkflowBuilder;
let workflow = MagenticWorkflowBuilder::new()
.orchestrator(main_agent) // 主控 Agent(推理+决策)
.add_sub_agent(coder) // 子 Agent
.add_sub_agent(reviewer) // 子 Agent
.add_tool(search_tool) // 可用工具
.max_iterations(10) // 最大推理轮次
.build()?;
let agent: Arc<dyn IAgent> = workflow.as_agent();
let stream = agent.run(messages, session, None).await?;
配置选项
| 方法 | 说明 | |------|------| | `orchestrator(agent)` | 必须:设置主控 Orchestrator Agent | | `add_sub_agent(agent)` | 添加可调度的子 Agent | | `add_tool(tool)` | 添加 Orchestrator 可用的工具 | | `max_iterations(n)` | 最大推理-行动轮次(默认 10) |
内部架构
pub struct MagenticWorkflow {
orchestrator_id: String, // Orchestrator 节点 ID
sub_agents: Vec<Arc<dyn IAgent>>, // 可调度子 Agent 池
tools: Vec<Arc<dyn ITool>>, // 可用工具集
max_iterations: usize, // 最大推理轮次
graph: WorkflowGraph, // 引擎执行图
}
内部建图:`Orchestrator → FanOut → [SubAgent₁, ..., SubAgentₙ]`,每个子 Agent 节点可产出输出。
完整示例
use std::sync::Arc;
use rust_agent_core::{IAgent, ChatMessage, Content, ITool};
use rust_agent_workflow::MagenticWorkflowBuilder;
use rust_agent_framework::AgentBuilder;
use futures_util::StreamExt;
async fn run_magentic_task() -> anyhow::Result<()> {
let client = DeepSeekChatClient::new(/* ... */)?;
// Orchestrator — 负责任务分解和调度决策
let orchestrator = AgentBuilder::new("orchestrator")
.chat_client(client.clone())
.instructions(
"你是任务编排员。分析用户的复杂请求,将其分解为可执行的子任务。\n\
可用专家:coder(代码)、reviewer(审查)、analyst(分析)。\n\
每次响应只调度一个专家或调用一个工具,然后评估结果。"
)
.build()?;
// 子 Agent:代码专家
let coder = AgentBuilder::new("coder")
.chat_client(client.clone())
.instructions("你是代码专家。生成高质量代码。")
.with_description("代码专家")
.build()?;
// 子 Agent:审查专家
let reviewer = AgentBuilder::new("reviewer")
.chat_client(client.clone())
.instructions("你是代码审查员。审查代码并给出建议。")
.with_description("审查专家")
.build()?;
let workflow = MagenticWorkflowBuilder::new()
.orchestrator(orchestrator)
.add_sub_agent(coder)
.add_sub_agent(reviewer)
.max_iterations(10)
.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 {
if let Ok(result) = chunk {
for content in &result.contents {
if let Content::Text(ref t) = content {
print!("{}", t.delta);
}
}
}
}
Ok(())
}
适用场景
| 场景 | 说明 | |------|------| | 复杂任务分解 | Orchestrator 将大任务分解为子任务,逐一委托 | | 动态工作流 | 执行路径由 Orchestrator 在运行时根据中间结果决定 | | 多工具编排 | Orchestrator 选择合适工具处理每个子步骤 | | 迭代优化 | 多轮"生成→审查→修改"循环达到满意结果 |
与 HandoffWorkflow 的区别
| 方面 | HandoffWorkflow | MagenticWorkflow | |------|----------------|------------------| | 路由方式 | Triage 选择一个专家 | Orchestrator 动态调度多个专家 | | 轮次 | 一次路由,单专家执行 | 多轮推理-行动循环 | | 任务粒度 | 整体任务分配 | 子任务分解 + 逐步执行 | | 适用场景 | 明确领域分类 | 复杂、需多步推理的任务 |
注意事项
1. **max_iterations**:安全上限,防止 Orchestrator 无限循环 2. **事件可观测**:Orchestrator 和每个子 Agent 的调度过程通过 `WorkflowEvent` 完全可见 3. **引擎驱动**:内部由 WorkflowEngine 执行,自动获得检查点、重试、超时 4. **子 Agent 发现**:可通过 `get_subagent()` 获取子 Agent 引用