Skip to main content
概览 从”解决什么问题”入手介绍 harness 的能力。本文换一个视角,解释架构本身:为什么这样设计、各层职责是什么、一次 call() 究竟经历了什么,以及状态如何在系统中流动。

1. 设计理念

理解 harness 架构需要先理解三个核心决策。

决策一:薄包装,不替换推理循环

HarnessAgent 不是一个新的推理引擎——它只是 ReActAgent薄包装,自身只做两件额外的事:
  • bindRuntimeContext(ctx):每次 call() 开头,把当次身份(sessionIduserId)分发给关心它的 hook,并按需从 Session 恢复 Memory 状态;
  • forceCompactAndRetry:当模型真的返回 ContextOverflow 错误时,强制压缩并重试一次。
其余所有能力——工作区注入、记忆管理、会话持久化、子 agent 编排——全部通过 ReActAgent 已有的 HookToolkit 扩展点注入。这样做的好处是:ReActAgent 的能力完整保留,harness 只叠加,不替换。

决策二:Hook 驱动,能力正交

每个 hook 只做一件事,通过 priority 在同一个事件上排好执行顺序:
  • CompactionHook(10) 在推理前检查是否需要压缩历史;
  • SubagentsHook(80) 在推理前注入子 agent 列表;
  • WorkspaceContextHook(900) 最后叠加工作区文件——因为它是最终拼进 system prompt 的一层,需要在所有前置处理完成后才运行。
Hook 之间不持有彼此的引用,只通过三个共享对象通信。每项能力都能独立开关:compaction 需显式配置,session persistence 默认开启,toolResultEviction 按需启用。

决策三:共享对象是唯一耦合点

所有 hook 都通过同一组”通用语言”协作:

2. 顶层架构图

三层职责一眼看清
  • 薄包装层(HarnessAgent):负责 per-call 的身份绑定与极端情况兜底;
  • 推理内核(ReActAgent):负责 Hook 事件驱动 + ReAct 循环 + 工具执行;
  • 共享对象层:三个对象是所有 Hook 的协作底座,不属于任何 Hook,被所有 Hook 读写。

3. 构建阶段(Builder.build()

能力注入发生在一次性的构建阶段,构建完成后运行期不再改变 hook 链或 toolkit 组成:
✗可选 的 hook 只在满足条件时装配:CompactionHook 需调用 .compaction(...)SandboxLifecycleHookfilesystem(SandboxFilesystemSpec)ToolResultEvictionHook.toolResultEviction(...)

4. Hook 事件管道

ReActAgent 在 ReAct 循环的各个关键节点触发事件;Hook 在对应事件上按 priority 升序执行。下表是完整的 Hook × 事件矩阵: priority 的排布体现了设计意图:
  • 0:纯日志,最先运行,不干扰任何事件;
  • 5/6/10:记忆与压缩,在推理循环外围处理上下文生命周期;
  • 50:沙箱生命周期与工具结果卸载,在 acting 阶段就地处理;
  • 80:子 agent 注入,先于工作区注入——因为子 agent 信息需要出现在 system prompt 里;
  • 900:最后写 system prompt(WorkspaceContextHook)和持久化(SessionPersistenceHook)——保证它们叠加在所有前置处理之上,且记忆先 flush 再 snapshot。

5. call() 生命周期时序


6. 状态流转

状态在 harness 里有三个层次,从短到长: 核心规律
  • Memory 是调用内的”工作内存”,随 call() 结束通过两条路持久化;
  • WorkspaceSession 保证”下次同 sessionId 还记得这一轮”;
  • MEMORY.md + FTS 索引保证”长期事实不随 session 丢失”。

7. 几个典型协作场景

场景 A — 工作区文件如何变成模型看到的 system prompt

场景 B — 长会话里事实如何沉淀进 MEMORY.md

场景 C — 同一 sessionId 如何跨调用”记住”历史

场景 D — 主 agent 委派子 agent:同步与后台两条路径


延伸阅读

  • Workspace — 工作区目录结构、WorkspaceManager 两层读写细节
  • Memory — 双层记忆模型、压缩配置、FTS5 检索
  • Filesystem — AbstractFilesystem 三种模式与扩展方式
  • Subagent — 子 agent 声明格式、TaskRepository、五行判定表
  • Session — WorkspaceSession / JsonSession 序列化协议
  • Tool — 内置工具参考与注册方式