DeepAgent 与 harness
在 ReActAgent 外面再包一层:工具、子代理、工作空间和默认 Rail 由工厂一次装配;事件分内外两层触发。
依据 agent-core 0.1.20 · develop@fbe6a0d9(2026-11-13)核实
为什么还要一层
ReActAgent 只管"想一步、做一步"的循环。真正干活的智能体还需要很多周边设施:读写文件的工作空间、待办清单、子代理、技能、安全约束、模型异常检测……这些都是 harness(openjiuwen/harness/)提供的,DeepAgent 把它们装到一个 ReActAgent 外面。
DeepAgent(外层)
├─ 外层任务循环(可选):把大任务拆成多轮
├─ 工作空间、子代理、技能、工具
├─ 默认 Rail:安全、模型异常检测……
└─ 内层 ReActAgent:每轮任务里真正"想一步、做一步"
源码DeepAgentagent-core/openjiuwen/harness/deep_agent.py:320@fbe6a0d9
一个工厂函数装配全部
from openjiuwen.harness.factory import create_deep_agent
agent = create_deep_agent(
model, # 已构造好的 Model 实例
system_prompt="你负责回答客户的交期询问。",
tools=[check_inventory, calc_promise, create_order],
subagents=[...], # 子代理:可以用不同模型、工具和提示词
rails=[PromiseGateRail(store)], # 先排队,第一次 invoke 时注册
workspace="./workspace", # 文件工具的工作目录
enable_task_loop=True, # 开启外层任务循环
)
示意代码,参数名取自 create_deep_agent 的签名;工具和 Rail 是你自己的对象。本站没有连接真实模型运行它。
几个默认值值得记住:
| 参数 | 默认 | 含义 |
|---|---|---|
enable_security_rail | True | 默认挂 SecurityRail,往提示词里加安全说明 |
enable_model_anomaly_detection_rail | True | 默认挂 ModelAnomalyDetectionRail:流式卡顿超时、重复输出重试、工具死循环时压缩 |
restrict_to_work_dir | True | 文件访问限制在工作空间内 |
enable_task_loop | False | 外层任务循环默认关闭 |
max_iterations | None | 内层 ReAct 不设上限 |
传了 subagents 会自动加 SubagentRail,传了 skills 会自动加 SkillUseRail,enable_task_planning=True 会加 TaskPlanningRail。如果你自己已经传了同类 Rail,工厂不会重复添加。
事件分两层
这是 DeepAgent 最容易踩的地方。Rail 关卡里讲的 13 个事件,在 DeepAgent 上由两个对象分别触发:
| 集合 | 事件 | 回调注册到 |
|---|---|---|
_OUTER_ONLY_EVENTS | BEFORE_INVOKE、AFTER_INVOKE | 外层 DeepAgent |
_DEEP_EVENTS | BEFORE_TASK_ITERATION、AFTER_TASK_ITERATION | 外层任务循环 |
_BRIDGE_EVENTS | 模型调用、工具调用、AFTER_REACT_ITERATION、输入相关事件 | 桥接到内层 ReActAgent |
开了任务循环以后,每轮任务先触发 BEFORE_TASK_ITERATION,再调用一次内层 react_agent.invoke(),最后触发 AFTER_TASK_ITERATION。这一轮即使失败,AFTER_TASK_ITERATION 也会补触发一次。
于是有两种"轮":任务的一轮(外层)和 ReAct 的一轮(内层)。一轮任务里可能有好几轮 ReAct。
动手:选对事件
三个任务都只让你选一个事件,看它在两轮任务里触发几次、在哪一层。
小结
- DeepAgent = 内层 ReActAgent + harness 周边设施,用
create_deep_agent一次装配。 - 默认已经挂了安全和模型异常检测两道 Rail,传子代理、技能等会自动补对应的 Rail。
- 事件分内外两层;"任务一轮"和"ReAct 一轮"是两回事,按你要的频率选事件。
源码出处
- agent-core/openjiuwen/harness/deep_agent.py:320
class DeepAgentDeepAgent 本体 - agent-core/openjiuwen/harness/factory.py:464
def create_deep_agent装配入口与全部参数 - agent-core/openjiuwen/harness/factory.py:398
default_rails = [默认挂上的 Rail - agent-core/openjiuwen/harness/deep_agent.py:166
_BRIDGE_EVENTS = frozenset事件分到内层还是外层 - agent-core/openjiuwen/harness/deep_agent.py:210
_DEFAULT_DIRECT_TOOL_NAMES = frozenset内置工具清单 - agent-core/openjiuwen/harness/task_loop/task_loop_event_executor.py:52
class TaskLoopEventExecutor外层任务循环如何调用内层 - agent-core/openjiuwen/harness/AGENTS.mdharness 的模块地图
链接指向固定提交,仓库后续更新不影响这里的行号。
过关测验
1. create_deep_agent 是同步函数,传进去的 rails 什么时候真正注册?
2. 在 DeepAgent 上注册一个覆写 before_tool_call 的 Rail,它会在哪一层触发?
3. 开了外层任务循环,某一轮任务执行失败了,AFTER_TASK_ITERATION 还会触发吗?