01
执行接口层:把外部请求准备成可以执行的任务
左上角“执行接口层(HTTP 入口)”同时承担对外接入和执行准备。调用方传来的通常是面向业务的信息:
- 要执行哪个 Agent 或 Workflow、哪个版本。
- 用户本次输入,以及会话标识、已有对话消息。
- 是否需要流式返回。
执行引擎还需要知道运行配置在哪里、历史上下文是什么、环境变量有哪些、这次执行属于哪个会话。因此,接口层会完成参数校验、版本与 IR 路径解析、历史消息加载、环境变量加载,以及请求上下文准备。
IR 是描述 Agent 或 Workflow 如何运行的结构化配置。它可以包含执行模式、节点、连接、模型和工具等信息,具体内容取决于运行类型。
经过这一层,“请运行这个工作流,输入是这段文字”就被准备为“使用这份确定的运行配置,带上这些输入、历史和环境信息,执行这个任务”。之后再交给 ir_execute()。
源码:agent-runtime/agent_runtime/serve/apis/app_run.py:535,673。
02
请求编排与模式分发:决定本次任务交给哪一种 Runner
中间这个框的核心职责,是组织一次执行,并选择它的顶层执行方式。它读取 IR 中的 configs.mode,按下面的规则分发:
一次请求在这里选择一个顶层 Runner。选择依据是配置中的模式;任务执行的每一步不会重新进行顶层分发,Agent 数量也不是这里的选择条件。
这一层还处理跨模式的执行事务:整理输入和全局变量、按配置接入内容审核,以及在流式执行链路中登记执行、关联取消操作和收尾清理。
两种层次的“编排”
- 请求编排:这次请求交给谁执行,如何组织上下文、输出和生命周期。
- 业务执行编排:下一步运行哪个节点、调用什么工具、交给哪个 Agent。
图中上排主要负责请求编排;中排三个模式负责各自的业务执行编排。
源码:agent-runtime/agent_runtime/serve/apis/orchestration.py:133,153,225,339。
03
Workflow:把声明式配置变成可执行的图,再管理这次图执行
Workflow 框里的三个小框,分别覆盖构建执行对象、推进业务步骤、管理执行状态。
① IRConverter:把 IR 转成运行对象
工作流 IR 描述节点、参数、连接和分支等配置。实际执行需要对应的 Python 组件对象与工作流对象,IRConverter 负责完成两者之间的转换。
工作流配置 → 节点与连接的运行时表示 → 可执行工作流
当前实现中,ir_to_workflow() 首先返回一个 LazyWorkflow,完整构图延后到实际执行时。转换器实现在 Runtime 项目的 jiuwen 包中。放在 Workflow 框内,表示这条路径使用它;Controller 构建 Agent Group、ReAct 注册子工作流时也会复用它。
② LazyWorkflow / Workflow:推进节点、分支和循环
LazyWorkflow 在首次 invoke() 或 stream() 时触发完整构图。
- 底层
Workflow 按照图结构执行节点、传递数据,并处理分支与循环。
同一个 LazyWorkflow 对象后续调用可以复用已经构建的图。复用范围是这个对象,不能直接推广为所有请求之间都共享同一张已构建的图。
例如,工作流预先定义“开始 → 知识检索 → 模型生成 → 条件判断 → 结束”,运行时就按这张图推进,由条件节点决定走哪条连接。节点本身可以包含模型、工具,甚至 Agent 能力。Workflow 的特征是由图结构组织执行。
③ 会话、恢复与流包装:让图执行可以持续管理
如果一个交互节点需要用户补充信息,执行过程是:
- 工作流运行到该节点,产生提问并保存中断状态。
- 当前请求把问题返回给调用方。
- 用户随后发起新请求,携带同一会话和补充输入。
- Runtime 检查可恢复状态,通过
InteractiveInput 等机制继续执行。
这是跨请求的恢复过程。是否恢复取决于有效检查点和执行状态;仅使用同一个会话标识,并不意味着一定从上次位置继续。上述职责由 WorkflowRunner 组织起来,执行输出再经过 WorkflowStreamDataWrapper 交给外层事件处理。
源码:agent-runtime/jiuwen/serve/controllers/execution/ir_converter.py:1591,1633;agent-runtime/jiuwen/extension/workflow/lazy_workflow.py:96,121,138;agent-runtime/agent_runtime/runner/workflow_runner.py:283,339,480,575,588。
04
ReAct:让模型根据当前信息和工具反馈决定下一步
ReAct 框的中心是 ReActAgent。它的执行通常呈现为一个循环:
模型读取任务与上下文 → 决定回答或调用工具
→ 执行工具 → 把结果交回模型 → 继续判断
Workflow 的推进主要依据预先定义的图,ReAct 的推进主要依据每轮模型输出和执行反馈。
注册能力和实际调用能力需要分开理解:注册了五个工具,表示它们可供使用;本次任务可能只调用其中一个,也可能直接回答。
顶层选择 ReAct,内部仍然可以调用工作流
例如,ReAct Agent 为完成用户任务,调用已经注册的“生成报表工作流”。整体仍由 ReActAgentRunner 驱动,只是在内部使用 Workflow 能力。当前注册子工作流的代码会调用 IRConverter,无需重新走一次顶层 Runner 分发。
因此,ReAct 可以理解为围绕一个主要决策 Agent 展开执行,但它能调用的能力可以相当复杂。
源码:agent-runtime/agent_runtime/runner/react_agent_runner.py:430,655,695,759,804,835。
05
Controller / PlanExecute:分清“选择成员”和“成员如何执行”
这个框有两层控制关系:Group 选择成员接手任务,成员再按自己的策略完成任务。
第一层:Agent Group 决定由哪个成员接手
IRConverter 根据配置创建或恢复 HierarchicalAgentGroup,组织成员 Agent 及其关系。
组内的 HierarchicalControlAgent 选择成员,通过 StandaloneRunner 发送消息,再根据成员执行结果决定继续、转交、结束或中断。多 Agent 在这里首先体现为成员之间的选择、消息调度与任务交接;当前这条控制链不能直接理解成所有 Agent 同时并行运行。
第二层:被选中的成员决定自己怎么完成任务
第三个小框“成员 Agent 的执行策略”描述这一层:
ControllerMode:围绕任务识别、工作流执行、交互与任务转交等控制逻辑推进。
PlanExecuteMode:围绕场景匹配、任务规划、逐步执行来推进。
例如,Group 选择“报表 Agent”接手任务;报表 Agent 使用 PlanExecute 策略,规划“取数、计算、生成报告”几个步骤,再逐步完成。“选报表 Agent”和“规划报表生成步骤”发生在不同层次。
图中列出了重点策略;代码中的策略工厂还支持其他模式,具体成员使用哪一种,取决于该成员配置的 plan_mode。
源码:agent-runtime/agent_runtime/runner/controller_runner.py:161,203,206;agent-runtime/jiuwen/multi_agent/agent_group/hierarchical_group/control_agent.py:53;agent-runtime/jiuwen/controller/agent/control_mode/control_factory.py:14。
07
事件适配与输出:把内部执行过程变成调用方能消费的结果
右上角这个框负责对外输出。这里实际上有两层转换:
底层执行片段 → 各 Runner 的事件包装或适配
→ EventHandler → 对外 SSE / JSON
第一层:各模式处理自己的底层事件
- Workflow 使用
WorkflowStreamDataWrapper。
- ReAct 使用
ReactStreamDataAdapter。
- Controller 使用
ControllerStreamDataAdapter。
它们处理各自底层框架产生的数据,把节点、模型、工具等执行信息整理成 Runtime 可以处理的事件。
第二层:EventHandler 整理对外协议与结果
外层 EventHandler 完成事件字段转换、输出整理、结果聚合,以及结束后的对话历史保存等。
当前应用运行入口,即使调用方要求非流式 JSON,内部也会使用流式执行,再由 EventHandler 消费整个事件流,聚合为最终响应。
- 流式返回:执行过程中持续向调用方发送事件。
- 非流式返回:内部处理完事件流,再一次返回聚合结果。
源码:agent-runtime/agent_runtime/serve/apis/app_run.py:367,415;agent-runtime/agent_runtime/event_handler/event_handler.py:151,187,194。
08
完整任务示例:把一次 Workflow 执行对应到图中的各个框
假设已经配置了一个工作流:“接收问题 → 检索知识库 → 调用模型生成回答 → 返回结果”。它与逻辑视图的对应关系如下:
表格将职责拆开以便对照。实际流式执行时,事件包装和返回会随着节点执行持续发生。
如果中途加入“需要用户补充条件”的交互节点,就会同时用到 Workflow 的会话与恢复职责,以及底部的状态与恢复能力。用户补充输入后,再经过入口和分发层进入恢复流程。
看图时可以沿着具体任务追踪:这一步由哪个模式负责推进,调用了哪项共享能力,产生的事件又经过哪一层返回。