当一个 Agent 返回了正确答案,账单却比预期高很多,第一反应通常是怀疑模型价格或模型能力。真正的差异可能藏在模型外面:运行时把多少上下文送进每一轮、调用了多少次模型、工具结果保留多久,以及哪些工作可以交给代码或子代理完成。
这层包住模型循环的运行时,通常叫 Agent Harness。本文根据 Avi Chawla 的文章和 TrueForge 的公开文档,拆开它怎样影响 token 成本、执行速度与凭据安全。读完后,你可以用一组具体问题检查自己的 Agent:成本究竟花在了模型上,还是花在了上下文搬运上?
先看结论
| 问题 | 关键判断 |
|---|---|
| 成本从哪里来 | 上下文会在每次模型调用中重新参与处理,工具往返还会增加调用次数 |
| 首要优化点 | 让启动上下文保持轻量,并控制运行过程中不断增长的结果 |
| 常用手段 | 延迟加载工具、卸载大结果、子代理隔离、Code Mode、上下文压缩 |
| 安全边界 | 沙箱负责代码、文件和 Shell;Harness 持有凭据并代理工具请求 |
| 适用范围 | 多工具、多步骤、多人并发的 Agent 最容易从中受益,简单单轮问答收益有限 |
Harness 到底负责什么
一个只服务开发者自己的 Agent,往往可以假设机器、终端和操作者都在身边。放到真实用户面前,运行时还要处理这些问题:
- 任务执行到一半服务器重启,状态能否恢复;
- 敏感操作需要审批,审批可能在另一台设备上稍后完成;
- 多个用户同时运行同一个 Agent,彼此的会话不能串起来;
- 对话继续时,只能看到自己的历史和状态。
因此,生产 Harness 会接管工具执行、上下文、记忆、会话持久化、错误处理、权限和并发。它也决定哪些内容在下一轮继续携带。模型负责完成推理,Harness 负责安排推理发生的方式。
为什么一个工具结果会被读很多遍
假设某个工具在第 4 步返回了 50,000 token 的 JSON,而运行时没有把它移出对话。到第 19 步,模型已经再次读取这份结果 15 次:
50,000 token × 16 次读取 = 800,000 token 的上下文占用
提示词缓存可以降低重复前缀的计费价格,但不会让这 50,000 token 从上下文窗口消失。模型仍然要在每次调用中处理它,才能生成下一步结果;如果更早的内容发生变化,缓存还可能失效。
工具定义也会占据启动上下文。每个工具都带有名称、描述和输入输出结构,接入大量 MCP 服务后,真正的用户问题可能还没有出现,提示词已经很长。
所以要分开看两个变量:
- 每次调用时,模型要读取多少上下文;
- 一个任务需要调用模型多少次。
扩大上下文窗口只能解决“装不下”的问题,无法自动解决“每轮都在处理大量旧内容”的成本问题。
TrueForge 的五种上下文控制方式
TrueForge 的 Harness Capabilities 文档把输入上下文和运行时上下文分开管理。前者在任务开始时加载,后者随着用户消息、工具调用、工具结果和子代理结果逐步增长。
1. 延迟加载:开始时只带目录
技能先提供名称和描述,只有任务确实需要时才从沙箱读取完整的 SKILL.md。工具也可以关闭预加载,让模型先看到 MCP 服务的名称和简介,随后按需查询:
list_tools:列出服务可用的工具;get_tool_info:读取某个工具的描述和输入输出结构;get_tool_output_schema:只读取输出形状,便于编写处理脚本;call_tool:确认需要后再调用工具。
如果一个内部服务有 100 个工具,而当前任务只需要其中 2 个,其余定义就不必进入这次运行的提示词。
2. 大结果卸载:把全文放到沙箱文件
假设工单系统返回 400 条记录,每条带标题、描述、评论、标签、负责人和时间戳,而当前问题只需要账号 ID 与主题。Harness 可以把完整结果写入沙箱文件,只在上下文里留下简短预览和文件路径。
后续需要完整数据时,Agent 再通过沙箱读取、过滤或解析文件。并行工具同时返回多个大结果时,运行时可以优先卸载最大的结果,让这一批响应先低于上下文预算。
这一步的核心不是删除数据,完整结果仍然保留,只改变它进入模型上下文的时机和形态。
3. 子代理:把中间过程留在独立上下文
如果 12 个客户各自需要查询工单、CRM 和文档,根 Agent 可以把 12 组原始记录全部带在自己的历史里,也可以为每个客户创建一个子代理。
子代理在独立上下文中完成查询,只把短摘要返回给根 Agent。根 Agent 看到的是 12 份摘要,不需要反复携带 12 组原始数据。这种隔离同时保留了并行执行的可能性。
4. Code Mode:让代码完成数据处理
“把工单和账号表按 ID 连接,再统计每个账号的数量”属于数据连接任务。若让模型逐轮拉取两份数据、匹配字段、计算结果,原始记录会经过多次模型调用。
Code Mode 则让 Agent 在沙箱里写一个脚本,直接调用工具,在代码中完成连接、过滤、排序和汇总,最后只打印结果表。原始 ID 和记录留在脚本或文件中,模型只接收它真正需要解释的摘要。
这还减少了手算错误:计数、求和和分组由代码执行,模型负责选择处理方式和解释结果。
5. 上下文压缩:历史过长时保留结构化摘要
前面几种方式主要控制新结果进入上下文的方式。对话本身变成大 payload 后,就需要压缩历史。
TrueForge 当前文档显示,压缩默认在活动上下文超过 50,000 token 后触发。运行时会把意图、关键决策、文件与产物、错误与修复、下一步等内容整理成结构化摘要,用它替换较早的消息;完整事件历史仍保存在服务端。
压缩是有损的。它适合保留任务状态,不适合代替对关键原文、精确日志或完整数据的持久化。需要细节时,应回到沙箱文件或事件记录中读取。
凭据为什么不该放进沙箱
减少上下文后,Agent 往往需要更自由地运行代码、读写文件和访问外部系统。把模型 API key 或 MCP 凭据直接放进沙箱,会让生成代码拥有和 Harness 相同的秘密。
TrueForge 将 Agent 循环和凭据留在服务端,沙箱只负责代码、文件和 Shell。当沙箱脚本调用 call_tool 时,请求会回到 Harness,由 Harness 使用已保存的凭据访问 MCP 服务,再把结果返回给沙箱。
这样,工单和账号数据可以留在沙箱里处理,脚本本身不需要知道认证信息。需要审批的工具仍会暂停等待批准,Code Mode 也不能绕开权限模型。
基准数据说明了什么
TrueForge 官方基准页使用 14 个企业任务,连接 Jira 风格的项目跟踪器、Salesforce 风格的 CRM 和 Drive 风格的文档库。每个配置使用相同模型、相同工具、相同系统提示词和全新的会话,每种配置运行 3 次,再报告平均值。独立的 LLM 评审只看任务标准和答案,不知道答案来自哪个 Harness。
当前公开表格如下:
| 配置 | 平均完成任务 | 每次成本 | 每次 token |
|---|---|---|---|
| Claude Managed Agents · Opus 4.8 | 10.7 / 14 | $11.8 | 10.0M |
| TrueForge · Opus 4.8 | 10.7 / 14 | $8.6 | 3.7M |
| TrueForge · GLM-5.2 | 11.7 / 14 | $3.0 | 3.8M |
| deepagents · Opus 4.8 | 10.0 / 14 | $21.2 | 16.5M |
| deepagents · GLM-5.2 | 12.0 / 14 | $9.1 | 11.9M |
从同模型配置看,TrueForge 使用约 37% 的 Claude Managed Agents token,约 22% 的 deepagents token;3.7M 与 10.0M 的比值约为 2.7 倍差距。这个结果支持一个重要判断:相同模型和工具下,运行时怎样携带上下文,会显著改变成本。
也要留意基准的边界。14 个任务、每种配置 3 次试验,足以展示工程方向,不能保证所有业务都能得到相同的比例。模型价格、任务类型、工具返回大小和 Harness 配置变化后,结果都会变化。
在本机运行 TrueForge
官方 Quickstart 当前要求 Node.js 22.14 或更高版本。本地模式只需要一个进程和 SQLite:
npx @truefoundry/trueforge
启动后打开 http://localhost:8790,然后按这个顺序配置:
- 在 Settings → Models 添加模型提供商;
- 在 Settings → Connectors 连接 MCP 服务;
- 如果要使用技能、Code Mode 或文件卸载,在 Settings → Sandbox providers 配置 Daytona;
- 创建 Agent,选择模型、连接器、技能和指令;
- 先用一个小任务验证工具调用、结果摘要和审批行为,再扩大任务范围。
本地模式默认没有登录,官方建议只绑定本机地址。需要多人共享时,使用 hosted mode,以 Postgres 保存持久数据、Redis 支持多副本之间的协作,并通过 Docker Compose 或 Helm 部署。
一份可执行的检查清单
当 Agent 成本上升时,可以按下面顺序检查:
- 记录每次模型调用的输入 token、输出 token、工具名和响应大小;
- 找出重复出现的大段工具结果,确认它们是否每轮都被重读;
- 对工具定义启用按需加载,先减少启动上下文;
- 将大结果保存到文件,只把预览、路径和必要字段送进模型;
- 将连接、聚合、排序等确定性处理移入代码;
- 把互相独立的实体查询拆到子代理,再让根 Agent 只接收摘要;
- 检查凭据是否只由 Harness 或服务端持有;
- 为长对话设置压缩阈值,并保留可回查的原始事件和文件。
这套检查顺序可以帮助团队先找到“上下文搬运”问题,再决定是否更换模型。模型升级仍然有价值,但它无法阻止运行时把同一份 50,000 token 结果重复送入 16 次调用。
适用边界
Agent Harness 最有价值的场景是:任务步骤多、工具返回大、需要并行查询、会话要跨重启恢复,或多个用户共享同一个服务。若只是一次短问答、没有外部工具和长历史,延迟加载、子代理与压缩带来的收益很小。
基准数据来自 TrueForge 项目维护者公开的测试,适合用来理解成本结构和复现实验,不应直接当成所有框架的排名。采用开源 Harness 的主要价值在于可以检查并修改上下文、工具和权限策略;是否值得引入,仍要用自己的任务、模型和数据验证。
总结
Agent 花费过高时,先沿着 trace 看每一轮到底携带了什么。延迟加载减少启动负担,结果卸载和压缩减少历史负担,子代理隔离中间过程,Code Mode 把数据处理交给代码,服务端凭据代理则守住安全边界。
这些机制共同说明了一件事:模型只看到 Harness 递给它的上下文。把这层运行时设计好,同一个模型就可能用更少的 token 完成相近的工作;把它交给默认配置,成本会随着工具数量和任务长度一起增长。
如果这类 AI 助手、开发工具和软件工程实践对你有帮助,欢迎关注 Aide Hub。这里会继续记录可验证的工具与工程经验。