跳到主要内容

Agent Harness

Agent harness 是运行时,将用户消息(或 webhook 触发,或 cron tick)转换为完整的、使用工具的 LLM 交互。它拥有工具调用循环、sub-agent 调度、触发器分类管道以及围绕它们的钩子表面。

一个 turn 的形状

每个 turn——无论用户刚刚输入消息、Telegram webhook 触发、还是 9am cron tick——都经过相同的生命周期:

inbound → trigger triage → Agent::turn() → post-turn hooks

Agent::turn 中:

  1. 恢复会话 transcript(如果是新进程)
  2. 构建系统提示(仅首次 turn)
  3. 注入记忆上下文
  4. 进入工具调用循环
  5. 调度工具调用
  6. 上下文守卫/压缩
  7. 停止钩子检查
  8. 最终助手文本

工具调用循环

内部 Agent::turn,工具调用循环运行最多 max_tool_iterations 轮(默认 10):

loop {
1. 上下文守卫 - 如果历史太大,微压缩/自动压缩
2. 停止钩子检查 - 预算上限、最大迭代、自定义杀死开关
3. 提供商调用 - 发送消息 + 工具规格,流式响应
4. 解析响应 - 从工具调用中分离助手文本
5. 如果无工具调用 - 返回最终文本
6. 执行工具调用 - 调度每个(下一节)
7. 总结过大 - 路由巨大工具输出通过总结器代理
8. 追加结果 - 将工具结果推入历史,循环
}

Sub-agents - 编排器模式

OpenHuman 是多 agent。用户聊天的 agent 是编排器——一个高级、策略级 agent,决定何时直接回答、何时使用直接工具、何时生成专业 sub-agent。

内置原型

原型何时使用
orchestrator顶级 agent
planner多步分解
researcher网络/文档查找
code_executor编写、运行、调试代码
critic代码审查
summarizer压缩过大工具结果
archivist记忆蒸馏
tool_maker自愈——为缺失命令编写 polyfill

Spawn 层次和层级

三个层级:

  • chat - 快速、UX 聚焦
  • reasoning - 慢速、深度思考
  • worker - 叶子,什么都不能 spawn
层级可以 spawn不能 spawn
chatreasoning, worker另一个 chat
reasoningworker另一个 reasoning、任何 chat
worker任何东西

触发器分类

当 webhook 触发、cron tick 或 Composio 事件到达时,系统不能直接将其交给编排器。触发器分类管道是门:

TriggerEnvelope → run_triage → TriageDecision → apply_decision

├─► drop (噪音)
├─► notify only
├─► spawn trigger_reactor
└─► spawn orchestrator

钩子

停止钩子(turn 中)

停止钩子在工具调用循环的迭代之间触发。它们是预算上限、速率限制和自定义杀死开关的策略杠杆。

Post-turn 钩子

Post-turn 钩子在 turn 完成后在后台触发。内置消费者:

  • Archivist - 提炼哪些事实值得持久化
  • Learning - 反思、工具跟踪器、用户画像更新
  • Cost log - 最终每 turn 成本行

中断

当用户按 Ctrl+C 或发送 /stop 时:

  • 中断围栏翻转
  • 每个运行的 sub-agent 看到相同标志并在其下一个检查点退出
  • 飞行中的提供商流被丢弃
  • 档案管理员仍会用任何部分上下文触发,因此对话不会丢失

下一步

  • 架构概览 - 更大图景中的位置
  • 记忆树 - 记忆加载器读取和 post-turn 钩子写入的位置
  • 模型路由 - model: "hint:reasoning" 如何解析为具体提供商+模型