Coding agent 工具懒加载及生命周期管理

Coding Agent 在实际运行中经常出现输入 token 达数百万,而输出 token 仅数千的极端失衡现象。除了读取项目代码文件带来的上下文膨胀外,另一个主要原因是挂载了大量工具(尤其是 MCP 工具)

  • 工具执行率极低:大量工具从未被实际调用,但其描述信息持续占用 token,造成严重浪费。
  • Schema 与描述占用上下文窗口:工具描述和 JSON Schema 体积庞大,极易触达上下文上限,迫使系统在任务执行初期就启动上下文压缩机制。

核心优化方案

1. 工具懒加载(按需加载)

借鉴 Skill 的按需加载机制,引入工具懒加载能力,并配合生命周期管理,显著减少无效工具传输。

加载策略:不采用关键字检索或 RAG 搜索,而是沿用 Skill 的渐进式披露思路:

  • 仅向模型提供不超过 50 字的工具描述摘要
  • 由模型自主判断并选择需要加载的工具。

摘要来源

  • 内部工具:工具注册时直接配置简短摘要;
  • MCP 工具:对每个 MCP Server 的工具描述进行自动摘要总结。

2. 工具生命周期管理

已加载的工具在单次对话结束时即被自动卸载,其生命周期严格限定在一次对话范围内。若后续需要,必须重新加载。

设计依据:若将生命周期放宽到会话(Session)粒度,随着对话轮次增加,Coding Agent 的后续请求将累积越来越多的工具,持续挤占上下文窗口。因此,在对话结束时卸载是更合理的选择。

3. 自动卸载

工具懒加载与生命周期管理已在 v1.6.0 实现,但仍存在问题:若单次对话极长(执行上百甚至上千次工具调用),即使采用对话级生命周期,对话后期依然会累积大量已加载工具,而这些工具在首次调用后的复用率通常很低。

为此引入自动卸载机制:在对话进行过程中,Coding Agent 会动态识别并卸载当前任务不再需要的工具,从而解决长对话场景下的工具累积问题。

配套优化项

  • 并行加载:与 Skill 懒加载类似,工具加载需要模型参与选择。若单独发起加载请求,同样会消耗大量 token。当前实现尽量将工具加载/卸载与其他工具执行并行化,降低额外开销。
  • 白名单机制:对于 todotask 等高频基础工具,直接加入白名单默认提供,避免 Coding Agent 反复加载。

后续改进方向

  • 多层渐进式披露:当前工具自身的渐进式披露对 Skill、Subagent 类工具不够友好。现阶段将 Skill 工具直接纳入白名单,Subagent 则未做处理。后续应为这类工具配置更精准的摘要描述,而非简单白名单化。
  • 动态白名单:对于懒加载的工具判断是通过占用 token 的数量,如果一个工具信息本身占用很少的 token 可以直接放入白名单中,这些工具即使避免了多次无效调用,但是只要有一次单独加载请求,消耗的 token 得不偿失。
  • Subagent & Agent Team:Subagent 直接禁用了工具懒加载机制,但是有些 subagent 可能会使用全量工具,应该启用工具懒加载机制。
  • Skill 生命周期:Skill 同样应纳入生命周期管理,避免长期占用上下文窗口,当前尚未实现。