ASTER CODE / Meta Harness
Meta Harness 使用指南
查找组件组合、宿主扩展、上下文、目录加载、恢复和验证所用的接口。
Meta Harness 是 Aster Code 的执行组合层。宿主用它改变智能体的工作方式,无需重写整个执行循环。
Meta Harness 组合执行组件。Core 负责权限判定、事实记录、完成检查和资源收尾。
- 01先看底座
Core 维持权限、完成门禁和资源寿命。替换组件仍受这些约束。
harness_loop.rsL1591 ↗ - 02再看装配
默认配方包含五个组件。列表描述装配顺序。
meta_harness.rsL124 ↗ - 03最后看运行依据
组件从同一份日志读取状态。装配顺序不等于调用顺序。
fact_control.rsL126 ↗
职责边界
宿主可以选择默认配方、挂载已注册的 Rust 组件,或提供完整组件树。Meta Harness 把这些选择装配进同一个会话。事实日志、权限判定、完成检查和资源收尾仍由 Core 保留。
组合执行组件的原因
没有统一的组合边界时,宿主通常要修改执行程序。每个执行变体还要重新核对权限、恢复和完成检查。Meta Harness 分开可变策略与固定约束。不同执行方式因而在相同边界下运行,并留下可比较的事实。
Meta Harness 不会自动提高模型能力。它提供可替换的执行过程和可核对的运行依据。
运行循环
组件用 initial / step / output 根据事实重建状态和视图。infer 再选择下一动作。配方中的组件顺序不是运行时调用顺序。
工具调用先取得权限决定。结束运行前还要检查完成条件并等待资源收尾。动作结果写回事实日志,再进入下一轮。结果未知的外部操作仍需核实,不能靠日志重放盲目重试。
组件内部机制
连线表示共享事实与执行协作,不表示固定串行调用。光点是关系方向示意,不是实时请求。
装配顺序与运行时调用顺序分别理解。
演进历程9 个阶段
Core · 组件协作
实现机制 · 非实时运行数据
节点说明与全部来源
事实日志
Core 提供:组件读取同一事实日志重建状态。日志驱动下一步与恢复;未决的外部副作用仍需核实,不能靠重放盲目重试。
- 动作 key:识别同一运行中的动作,保留因果和重放身份。
- Run ID:将结果、取消和恢复绑定到准确的原运行。
- 事实重建:step / output 可再次执行,不能在其中直接发起外部副作用。
- 未决副作用:结果未知的外部操作先核实,不当成成功或自动重复。
system
默认组件:提供系统指令列表。候选可以提出调整这个槽,但权限提示与权限决定仍由 Core 管理。
- initial:建立组件初始状态。
- step:读取一条事实,重建状态。
- output:输出指令视图及当前可执行动作;不直接做网络或文件副作用。
tools
默认组件:向视图提供工具目录。工具实现通过原有会话接口注册;目录不是权限凭证。
- 工具目录:列出模型可选择的工具说明。
- 执行器:由既有程序、动态工具或 MCP 接口承接实际调用。
- 权限:每次执行仍经过 Core 权限检查。
budget
默认组件 + 调度器限制:组件显示工具调用预算,实际限制由 HarnessConfig 与调度器执行。删掉 budget 展示槽不等于移除上限。
- 工具次数:tool_budget 控制工具调用次数,不是费用或总运行时间。
- 状态转换:step_limit 与工具调用次数是不同计数。
- 配置继承:None 继承基础配置;显式零额度与不存在上限不同。
compact
默认组件 + 调度器动作:提供压缩阈值视图,由调度器触发压缩。当前 compact_after_chars 按 UTF-8 字节累计;token 压缩依赖适配器上报。
- 长度阈值:名称虽然含 chars,当前实现使用 Rust 字符串字节长度。
- token 观测:token 压缩需要真实输入 token 数据。
- 限制仍在:删除 compact 槽不能据此认定自动压缩已关闭。
infer
默认调度器:根据事实安排模型调用、工具执行、确认或压缩。装配顺序不是固定调用顺序;运行时根据日志状态和动作 key 选择下一步。
- 读状态:依据当前事实选择可执行转换。
- 动作 key:保留准确动作身份,支持恢复与去重判断。
- 调度:读取 HarnessConfig,不绕开权限和完成门禁。
host:<id>
Rust 宿主注册:HostHarnessRegistry 只挂载宿主已注册的 Rust 组件。更大调整可以由 HostHarnessAssembler 提供完整组件树。
- 注册表:未知 ID 或缺少注册表时拒绝装配。
- 完整组件树:Assembler 提供树;仍要核对传入的执行限制。
- 受控接纳:模型写出 host:<id> 不会下载或装载任意代码。
权限判定
Core 不可关闭:工具执行前必须有权限决定。系统提示、Hook、候选配方和宿主组件都不能代替授权。
- 拒绝:拒绝必须实际阻止执行。
- 询问:绑定准确调用与回答,超时不能变成批准。
- 固定边界:候选和 Assembler 不能清除 permission_overlay。
完成门禁
Core 不可关闭:修改后的完成状态需要与当前修改摘要对应的验证证据或宿主明确豁免,并等待资源收尾。
- 当前摘要:验证报告与本次 effect_digest 对齐。
- 明确豁免:宿主显式记录豁免;不是模型自称通过。
- 收尾完成:Run 资源仍未关闭时,不能据此报告成功。
图中五个默认组件展示状态、事实处理和输出职责。事实日志节点说明动作身份与重放边界。权限判定和完成门禁展示候选不能取消的约束。展开节点后,外层图谱保留当前组件的位置。
连线表示组件共享事实并参与同一次受控执行,不表示固定的串行调用。装配顺序与运行时动作选择是两个问题。host:<id> 代表宿主已有的注册入口。该图不加载新组件或执行代码。
相关案例:RSI 的执行程序演进。
接口索引
| 需求 | 接口 | 文档 |
|---|---|---|
| 调整提示、调用次数和压缩阈值 | HarnessComposeOptions + with_harness | 组件、预算与压缩 |
| 挂载自己的执行组件 | HostHarnessRegistry + host:<id> | 自定义组件与调度 |
| 替换整棵组件树 | HostHarnessAssembler + admit_component_tree | 自定义组件与调度 |
| 接入项目资料、Skills、MCP 或生命周期钩子 | SessionOptions 的上下文、工具和 Hook 接口 | 上下文、工具与 Hooks |
| 从一个目录加载指令、脚本和定时提示 | DirectoryProjection | Agent 目录与定时提示 |
| 保存会话,或从检查点继续执行 | save / resume_session_async / resume_run | 保存、中断与恢复 |
| 把宿主检查结果交给完成检查 | CompletionAttestor | 验证报告与资源清理 |
| 让监听器或租约跨工具轮次使用 | register_run_capability_effect | 验证报告与资源清理 |
| 给长期任务绑定工作要求、计划和等待条件 | WorkPolicyV1 + goal 接口 | 工作策略与长期目标 |
接入方式
示例接收一个能正常发送请求的 Rust Agent。模型配置与异步运行环境见宿主接入。示例不会另建模型连接。组件示例还使用工作区内的 aster-effect,无需为这些接口启用 advanced-harness。
多数嵌入场景使用 SessionOptions::with_harness 选择默认组件并调整参数。补充一个组件时使用 HostHarnessRegistry。需要完整组件树时使用 HostHarnessAssembler。
自定义组件和完整组件树是 Rust 宿主接口。ACP 客户端不能提交任意 Rust 组件。当前入口只接受三套预先列出的组合,具体列表见“组件、预算与压缩”。
能力协作
一个每日检查项目的 Agent 可以从目录读取指令和 Skills。宿主定时提交任务,Agent 使用 MCP 获取外部信息,并在结束前提交测试报告。中断后可以从保存的会话或检查点恢复。
目录负责组织文件,宿主负责时钟与外部服务,Meta Harness 负责装配执行组件。目录中的定时声明不会自行启动后台服务。
上下文、工具、持久记忆和目标控制通过会话接入。它们不是五个默认组件之外随意添加的组件名称,也不都需要 advanced-harness。构建开关与会话配置需要分别核对。
组件不能改掉的规则
每次工具调用仍要检查权限;修改后的完成状态仍要对应验证结果或明确豁免。组件名称、系统提示和 Hook 的返回值都不能代替这两项检查。
事实日志可以帮助恢复执行状态,但结果不明的外部操作仍需核实。一次运行的完成也不等于长期目标完成;目标需要另外检查所有步骤和等待条件。