原标题:Github狂揽4万Star,这个开源项目让Agent节省60~95%的token消耗
最近用 Claude Code、Codex、Cursor、Aider 这类 AI Agent 写代码的人,应该都遇到过一个问题:Agent 很好用,但账单也是真的会动。
不是因为它每次都在写什么惊天动地的架构。更多时候,它只是在重复做一些很普通的事:读文件、搜代码、跑测试、贴日志、分析工具返回结果。你看见的是一句“继续”,模型那边可能已经吃进去了几千、几万 token。
这就是 Agent 开发和普通聊天不一样的地方。普通聊天主要为问答付费;Agent 场景里,你还在为上下文搬运付费。
今天看一个开源项目:chopratejas/headroom。
它干的事很直接:
在工具输出、日志、文件、检索片段、历史对话进入 LLM 之前,先压缩或筛选一遍,让模型少读噪声,多读有用信息。
官方 README 给它的定位是:The context compression layer for AI agents。项目宣称,在一些真实 Agent 工作负载里,可以减少 60% 到 95% token,并提供 library、proxy、MCP server、Agent wrap 等接入方式。
这个方向有意思的地方不只是“省钱”。它其实在提醒我们:上下文不是越多越好,尤其是 Agent 这种会疯狂调用工具的系统。
Agent 为什么特别浪费 token
普通聊天里,token 主要花在用户问题和模型回复上。
Agent 不一样。它会不断把工具结果塞回上下文:
• rg 搜索出 100 条代码结果
• cat 读取一个几百行文件
• 测试失败后贴一大段堆栈
• CI 日志里混着大量成功步骤和少数错误
• RAG / 搜索检索返回几十段相似资料
• 多轮之后,历史上下文越滚越长
这些内容有一个共同点:有用信息不多,噪声很大。
比如一次测试失败,真正值得模型看的可能只有几件事:哪个测试失败、断言是什么、关键异常栈在哪里、最近改了哪些文件。
但现实里,模型经常会吃下整段日志。你付费让它读了一堆 passed、installed、cached,还有一些和当前问题没关系的 warning。
Headroom 想解决的就是这个问题。
它不是换便宜模型,也不是让你少用 Agent,而是在 Agent 和模型之间加一层上下文压缩。
Headroom 到底做了什么
可以把 Headroom 理解成一个本地运行的上下文网关。
原来的链路是:
1Agent / App -> LLM Provider
加上 Headroom 后变成:
1Agent / App -> Headroom -> LLM Provider
它会先判断上下文内容大概属于哪一类,再选择压缩策略:
- • JSON / API 返回:保留异常、边界和代表性样本,压掉重复项
- • 日志 / 测试输出:保留失败、错误和关键变化,删掉大量正常噪声
- • 搜索结果:保留更相关的片段;已经很精简的 grep/search 输出可能直接透传
- • 普通文本:压缩冗余表达
- • RAG 文档上下文:取决于内容形态,部分场景会保守透传
- • 对话历史:减少长期滚动上下文的浪费
- • 代码:默认非常保守,很多场景会直接透传,避免把模型需要看的代码压没
最后这点挺重要。
token 优化不是压得越狠越好。把真正的错误信息压没了,省下来的钱会以调试时间的形式还回来。Headroom 的设计里有一个 CCR,也就是 Compress-Cache-Retrieve:先压缩,把原文缓存在本地;如果模型后面需要原始内容,再取回来。
它要做的不是简单丢上下文,而是先给模型一个更小的工作集。
省 token 为什么能省钱
LLM API 的费用通常和输入 token、输出 token 都有关。Agent 的输入 token 很容易膨胀,因为工具调用会把机器可读、但人根本不想完整读的内容塞回上下文。
Headroom 官方 README 里列了几组 Agent 工作负载的压缩结果:
| 场景 | 压缩前 | 压缩后 | 节省 |
|---|---|---|---|
| 代码搜索,100 条结果 | 17,765 | 1,408 | 92% |
| SRE 事故调试 | 65,694 | 5,118 | 92% |
| GitHub issue 分诊 | 54,174 | 14,761 | 73% |
| 代码库探索 | 78,502 | 41,254 | 47% |
这些数字别直接理解成“谁用了都能省 90%”。更现实的说法是:如果你的 Agent 工作流里有大量工具输出、日志、搜索结果、JSON 数据,它就有机会帮你省下明显的输入成本。
它抓住的是 Agent 成本里最常见的一块浪费:工具输出太长,信息密度太低。
它适合谁
我觉得 Headroom 最适合这几类人:
- 1. 每天高频使用 AI 编程 Agent 的开发者
- 2. 在大代码库里频繁让 Agent 搜索、阅读、跑测试的团队
- 3. 做数据库查询、API 工具调用、检索增强应用的 LLM 开发者
- 4. 有多 Agent 协作,希望共享压缩上下文和记忆的系统
- 5. 想降低 API 成本,但又不想简单换小模型的人
尤其是第二类。
很多开发者以为 Agent 账单高,是模型太贵。真实编码场景里,贵的经常是另一件事:模型反复读了太多它不该完整读的东西。
这和人类工程师一样。你不会把 10 万行日志扔给同事说“你自己看吧”。你会先筛出错误、上下文、最近改动和可疑路径。
Headroom 做的就是把这个筛选过程自动化一部分。
什么时候别急着用
这类工具不是银弹。
根据 Headroom 文档,它在下面这些场景收益有限:
- • 很短的单轮对话• 没有工具输出的普通聊天• 纯代码阅读/修改场景,因为代码默认会被保护或透传• 已经非常精简的 grep/search 输出• 对延迟极其敏感、但 token 成本不是问题的链路
还有一个现实问题:它需要在本地运行代理,或者集成 SDK。个人开发者通常能接受;公司内网、代理、证书、审计要求比较严格的环境,就要多评估一步。
所以我不会建议一上来全局打开。先放到最浪费 token 的地方试:
- • 长日志• 大 JSON• 搜索结果• 检索结果或相似资料片段• 长 Agent session
有收益,再扩大范围。
快速上手
Headroom 支持多种接入方式:Python library、TypeScript SDK、proxy、MCP server、Agent wrap。
如果只是想体验,建议先从 proxy 或 wrap 开始。
1. 安装
Python 需要 3.10+。
1pip install "headroom-ai[all]"
如果你使用 Node / TypeScript:
1npm install headroom-ai
2. 包一层现有 Agent
如果你用 Claude Code、Codex、Cursor、Aider、Copilot CLI,可以先试官方提供的 wrap:
1headroom wrap claude
Codex:
1headroom wrap codex
Aider:
1headroom wrap aider
这种方式适合先试水。不用改业务代码,先看自己的 Agent 工作流到底能省多少。
3. 或者启动本地代理
1headroom proxy --port 8787
然后把 OpenAI-compatible client 指向这个本地代理:
1OPENAI_BASE_URL=http://localhost:8787/v1 your-app
如果是 Claude Code,可以按官方文档里的方式指定 Anthropic base URL:
1ANTHROPIC_BASE_URL=http://localhost:8787 claude
4. 查看节省情况
代理跑起来后,可以看统计:
1curl http://localhost:8787/stats
也可以用:
1headroom perf
重点看这些指标:
- • 压缩前 token• 压缩后 token• tokens saved• 压缩比例• 是否影响最终回答质量• 是否增加了不可接受的延迟
不要只看“省了多少”。更该看的是:省下 token 后,Agent 有没有继续把事情做对。
5. 在代码里直接调用
如果你在写自己的 LLM 应用,可以直接在 Python 里压缩 messages:
1234567891011121314151617181920212223
from headroom import compress
from openai import OpenAI
client = OpenAI()
messages = [
{"role": "system", "content": "You analyze tool outputs."},
{"role": "user", "content": "Summarize the important failures."},
{
"role": "tool",
"content": "... very long logs / JSON / search results ..."
},
]
result = compress(messages, model="gpt-4o")
response = client.chat.completions.create(
model="gpt-4o",
messages=result.messages,
)
print(f"saved: {result.tokens_saved}")
print(response.choices[0].message.content)
TypeScript 也有类似写法:
12345678
import { compress } from "headroom-ai";
const result = await compress(messages, {
model: "gpt-4o",
baseUrl: "http://localhost:8787",
});
console.log(result.tokensSaved);
注意:官方文档说明 TypeScript SDK 会调用本地 Headroom proxy,所以要先启动代理。
我会怎么落地它
如果我是团队里的技术负责人,不会第一天就把 Headroom 接到所有 LLM 请求上。
我会先找一个 token 浪费最明显的场景,比如 CI 日志分析、SRE 日志诊断、代码搜索结果总结。跑一周 A/B:一半走原始链路,一半走 Headroom。记录成本、延迟、任务成功率和人工返工次数。
如果成本明显下降,成功率没掉,再扩到更多 Agent 工作流。关键生产链路要留回退开关,压缩异常时直接透传原文。
省 token 是目标,但不是唯一目标。Agent 系统最后看的还是单位成本下的可靠完成率。
上下文不是垃圾桶
Headroom 有意思的地方,不只是它能不能帮你省下某个百分比的 token。
它提醒我们一件事:上下文窗口再大,也不该被当成垃圾桶。
过去一年,很多 LLM 应用的设计方式有点粗暴:窗口变大了,就多塞;模型变强了,就少做结构化;工具输出长了,就直接交给模型。
结果很直接:成本上去,延迟上去,模型注意力还会被噪声稀释。
Agent 真正工程化以后,核心能力不只是“会调用工具”,还包括“知道哪些工具结果值得进入上下文,以什么形式进入上下文”。
Headroom 这类项目的价值就在这里:它把上下文管理从 prompt 工程里的手工技巧,变成了一个可以插拔、可观测、可优化的系统层。
参考链接
- • GitHub 仓库:chopratejas/headroom• 官方文档:Headroom Docs• 快速上手:Quickstart• 使用边界:Limitations• 代理模式:Proxy Server
428