

先说我为啥盯上这个项目。
我手上有个内部用的小玩意儿——一个跑在告警平台上的 SRE 排查 agent。逻辑很糙:告警进来,它去捞最近五分钟的日志,再去查几个相关服务的指标,再调一下 trace,然后让 Claude 给出"大概是哪儿炸了"的判断。
听起来挺优雅,对吧?跑起来才发现,最大的成本不在思考,在喂料。一次排查动不动就把六七万 token 塞进去,里面 80% 是日志,重复的 stack trace 一糊一大片,JSON 里同一个字段在不同对象里出现一千次。Claude 看完每次都很有耐心地告诉我:"根据日志显示,xxxx 服务出现了 OOM"——废话,我知道是 OOM,我想知道为什么 OOM。
那一周对账,光这一个 agent 烧了我三百多。我老板没说啥,我自己心里慌。
正好那两天 GitHub Trending 上 chopratejas/headroom 蹭蹭涨星,README 里直接挂着一行字:
"Up to 80% token savings. Open-source, runs locally."
就这一行,我就去翻了它的代码。
很多上下文压缩的方案是"让模型自己总结一下历史",听起来挺聪明,实际上你得多调一次 LLM,省了输入又花了输出,还可能把关键信息总结没。
Headroom 的思路完全是另一套——它根本不让 LLM 来干这个活。
它在 agent 和 LLM 之间插一个本地压缩层,这层会:
我画了张架构图凑合看一下:

整个流程跑在本地,数据不出你的机器,对那种合规要求苛刻的场景挺友好。
这是它最讨我喜欢的地方——不强迫你改代码。

我把这四种用法挨个看了一遍,结合我那个 SRE agent 的形态,最后选了 proxy 模式——因为我那玩意儿是 Go 写的,懒得动它。
headroom wrap claude
headroom wrap cursor
headroom wrap aider
headroom wrap copilot包完之后你正常用 Claude Code,它背后的所有上下文都会先过一遍 Headroom。你完全无感。这是写 README 的人在炫技:他知道大部分用户根本不想学新东西。
headroom proxy --port 8787然后把你 agent 里 OPENAI_BASE_URL 或者 ANTHROPIC_BASE_URL 改成 http://localhost:8787,齐活。Go、Rust、Java、PHP,不挑语言。
from headroom import compress
compressed = compress(messages, model="claude-sonnet-4-5")或者更优雅地用它的 SDK Wrapper,连 compress 都不用自己调:
from headroom import withHeadroom
from anthropic import Anthropic
client = withHeadroom(Anthropic())
# 之后所有 client.messages.create 都自动压挂成 MCP,让其他支持 MCP 的客户端把它当成"压缩工具"调用,适合多 agent 系统里做共享中间件。
我比较好奇的是:到底是怎么做到 92% 还不掉精度的?
翻了一圈代码和它附的几篇 paper 引用,大致是这么三层活:
这块是它的灵魂。任何一段输入进来,先做一次"这是啥"的判定:
内容类型 | 路由去向 | 典型场景 |
|---|---|---|
JSON 数组 / 对象 |
| tool 返回值、API response |
源代码 |
| 代码库探索、补全上下文 |
日志、纯文本 |
| 日志、文档、RAG 片段 |
历史对话 |
| 多轮对话回看 |
判错了怎么办?它内部有打分机制,评估压缩前后的语义保留度,过低就退回原文。这个 fallback 我觉得比那些"一压到底"的方案靠谱多了。
这是它真正让我决定要在生产用的原因。
普通压缩工具压完就压完了,丢了的细节再也回不来。Headroom 不一样:原文留在本地,压缩版的内容里会带一个引用句柄,比如 [ref: log_chunk_a3f]。LLM 在推理过程中如果觉得"这块好像有信息我需要看",它可以主动调一个 headroom_retrieve 工具,把原文展开。
这就让"压缩"这件事从"破坏性操作"变成了"惰性加载"。我看到这个设计的瞬间,就知道这哥们做过生产系统——只有在生产里被坑过,才会提前把后悔药备好。
这块比较细。Anthropic / OpenAI 都有 prompt cache,缓存命中价格能差几倍。Headroom 在压缩的时候会刻意保持前缀稳定,让缓存更容易命中。压缩 + 缓存命中双 buff,账单上的反应就更明显了。
光看 README 数字没意思,我把它的官方 benchmark 拉出来对比,再结合我那个 SRE agent 的实际形态,估了一下我能省多少。
工作负载 | 压缩前 Token | 压缩后 Token | 节省 |
|---|---|---|---|
代码搜索(100 条结果) | 17,765 | 1,408 | 92% |
SRE 故障排查 | 65,694 | 5,118 | 92% |
GitHub Issue 分类 | 54,174 | 14,761 | 73% |
代码库探索 | 78,502 | 41,254 | 47% |
而且作者很有职业道德,把"压缩之后会不会变蠢"也单独跑了 benchmark:
评测集 | 压缩前 | 压缩后 | 备注 |
|---|---|---|---|
GSM8K(数学推理) | 87% | 87% | 完全一致 |
TruthfulQA(事实问答) | 53% | 56% | 反而涨了 3 分 |
SQuAD v2(阅读理解) | 97% | 97% | 同时压了 19% |
BFCL(工具调用) | 97% | 97% | 同时压了 32% |
注意 TruthfulQA 那一行——压完反而变准了。我猜测原因是噪声本来就在干扰模型,把噪声去掉模型反而清醒。这个观察跟我自己平时调 prompt 的经验是吻合的:很多时候不是上下文不够,是上下文太脏。
我那个 agent 的输入大致是:
按 Headroom 各类压缩器的官方平均压缩比往这个分布上一套,估出来的总节省大概是 80% 左右。换算回我之前一晚上三百块的账单,理论上能压到 六十块。
我自己估完都觉得有点夸张,所以专门去翻了它 issue 区有没有人吐槽"实际没那么神"——翻了大概三十条 issue,主要的负面反馈集中在两类:
没有看到"压完答错了"这种致命吐槽。这个口碑在 5k+ star 的新项目里算很干净的。
如果你想接进自己项目,我把会卡住人的几个点提前列出来:
# Python(推荐,特性最全)
pip install "headroom-ai[all]"
# Node.js
npm install headroom-ai
# Docker(生产推荐)
docker pull ghcr.io/chopratejas/headroom:latest[all] 会把所有子模块一起装,包括 proxy / mcp / ml / code / memory。如果你只用 proxy,可以装 [proxy] 减小体积。Python 要 3.10+,老版本会报奇怪的类型错误。
它的 proxy 默认朝 Anthropic 转。如果你用的是 OpenAI 兼容的端点(包括国内一堆代理),需要在配置里指明 upstream,否则启动会卡住没报错。这个我看 issue 区有人翻过车。
如果你想让 LLM 用 headroom_retrieve 反查原文,得在你的 agent 工具列表里把这个工具暴露出去。Wrap 模式自动帮你做了,proxy 模式需要你自己注册。这点 README 写得不算清楚,要看 docs 才能搞明白。
from headroom import SharedContext
ctx = SharedContext()
ctx.put("这个项目的数据库连接串是 xxx")
# 在另一个 agent 里
db_url = ctx.get("数据库连接串") # 自动去重、自动关联这个我蹲了一下,本质是用本地 SQLite 当 KV,再做嵌入检索。简洁,没炫技,但对多 agent 协作场景很实用。
headroom learn --agent claude --source ./sessions/把过去的对话扔进去,它会找出 agent 频繁犯的错,写进 CLAUDE.md / AGENTS.md,下次自动加载。这功能介于"花活"和"实用"之间,我个人会先观察两周再决定要不要用。
这部分我必须说人话。
我看 GitHub 项目的口味比较挑,喜欢那种"作者明显被坑过、知道自己在解什么"的项目。Headroom 完全是这类。
它身上有几个非常成熟的判断:
要说不足,我也老实讲:
但综合起来,我会推荐任何在生产里跑 agent 的团队都至少试一下 proxy 模式——零代码改动、零风险、跑一周拉账单看效果,这种买卖太划算了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。