一句话结论:Headroom 是给 AI Agent 用的「上下文压缩层」。它在工具输出、日志、RAG 片段、文件和对话历史送进大模型之前,先在你自己机器上把这些材料压缩一遍——同样的答案,零头的 token。可以用库、代理、一键包裹、MCP 四种形态接入,多数场景不改一行代码就能省下三到六成输入 token,而且压缩是可逆的:原文留在本地,模型需要时随时取回。

一、被忽视的成本黑洞:上下文
如果你每天都在用 Claude Code、Cursor、Codex 这类编程 Agent,大概有过这样的体感:一次长会话跑下来,账单上的 token 数高得离谱,可其中真正”有信息量”的内容其实没多少。大模型的计费与延迟几乎完全由 token 决定,而在 Agent 工作流里,token 消耗的重心早已从”用户问了什么”转移到”Agent 读了什么”。
一次典型的编码任务,喂给模型的上下文里,用户指令可能只占个位数百分比,剩下的大头是:工具返回值(一次代码搜索返回上百条结果)、日志与报错(SRE 排障动辄几万 token 的转储)、RAG 召回片段、整段文件内容,以及不断膨胀、被反复重新计费的对话历史。
这些材料有一个共同特征:高度冗余、结构重复,但模型又确实需要从中读到关键信息。传统做法要么”截断历史”(丢信息),要么”原样塞进去”(烧钱)。Headroom 提供了第三条路:在送进模型之前,把上下文本身压缩一遍——保留语义,砍掉冗余。
二、一句话定位,和它背后的三个承诺
Headroom compresses everything your AI agent reads — tool outputs, logs, RAG chunks, files, and conversation history — before it reaches the LLM. Same answers, fraction of the tokens. Compression runs on your machine; no prompt or file content is sent anywhere to be compressed.
拆开这句官方定义,有三个关键承诺值得逐一体会。第一,“同样的答案”——压缩不能伤害模型的理解与准确率,否则省下的 token 会以更差的输出代价还回来。第二,“零头的 token”——它的目标不是省 5%、10%,而是在合适场景下把输入砍掉三到六成,重复性高的负载甚至能到 90%。第三,“在你自己的机器上运行”——它是一个本地中间件,不是把数据上传到某个云端做”智能压缩”,这决定了它能进入对隐私敏感的团队。
它把自己稳稳放在“你的 Agent ↔ 模型供应商”之间:上游可以是 Claude Code、Cursor、LangChain、你自己的代码;下游可以是 Anthropic、OpenAI、Bedrock 等任意兼容端点。中间这一层,就是 Headroom。
三、它到底在压缩什么
理解 Headroom 的第一步,是理解它压缩的对象不是”用户的问题”,而是问题周围那一圈庞大的支撑材料。README 里那张演示 GIF 很能说明问题:一段 10,144 token 的日志转储被压到 1,260 token,而其中那条关键的 FATAL 报错行逐字节保留。
这就是它的设计哲学:冗余可以丢,关键信号一个字节都不能错。一条崩溃日志的行号、一个 JSON 数组里那条”异常值”记录、一段代码的函数签名——这些是模型真正需要的”针”,而 Headroom 要丢掉的是那堆”草垛”。压缩器不是简单做 gzip 或截断,而是按内容类型识别什么该留、什么该压。
四、架构拆解:一条四层流水线
Headroom 的核心是一条在本地运行的处理流水线。把它的官方架构图翻译成文字,一次请求大致经过这样几站:
其中三个压缩器各司其职,选错就会要么压不动、要么压坏:
- SmartCrusher(通用 JSON):处理字典数组、嵌套对象、混合类型。它的关键取舍不是靠关键词表,而是基于字段方差统计——保留错误项、保留”偏离正常统计范围”的值、保留首尾边界,靠数据分布判断哪条记录值得留。
- CodeCompressor(AST 感知):面向 Python、JS/TS、Go、Rust、Java、C/C++、Perl。基于抽象语法树而非正则,保住函数签名、控制流骨架这类结构信息,压掉可推导的实现噪声。
- Kompress-v2-base(文本):Headroom 自研、开源在 HuggingFace 上的模型,专门在 agentic 轨迹上训练,用来处理自然语言与半结构化文本——这是它区别于”纯规则压缩”的地方,把机器学习模型放进了本地流水线。
还有一个容易被忽略、却直接决定真实账单的细节是 CacheAligner。主流供应商都有 KV-cache(提示词缓存),命中的前缀计费便宜得多;一旦你在前缀里塞进时间戳、随机 ID 这类每次都不一样的易变内容,缓存就被击穿、整段重算。Headroom 用”活动区压缩”只压新增字节(新的工具输出、最新一轮),让冻结的前缀保持逐字节一致,既压了增量又保住了缓存命中,而且从不重写你的提示词。

五、四种接入形态:从改一行代码到零改动
Headroom 的一个聪明设计,是它不逼你重构。同一套压缩流水线,暴露成四种由轻到重的接入方式:
| 形态 | 怎么接 | 适合谁 |
|---|---|---|
| 内联库 Library | compress(messages) |
要把压缩嵌进自己应用逻辑的开发者 |
| 代理 Proxy | headroom proxy --port 8787 |
零代码改动、任意语言,把 base URL 指过来即可 |
| 一键包裹 Wrap | headroom wrap claude |
不想理解细节、一条命令吃到压缩的用户 |
| MCP 服务 | headroom_compress / _retrieve / _stats |
任何 MCP 客户端 |
其中 wrap 模式最有”产品味”:它不只是起个代理,还会顺手装上 Serena 做语义代码导航,并把 Agent 配置成经由 Headroom 路由;unwrap 一键还原。对开发者,内联库的接口极其克制——一行 compress() 就返回压缩后的消息、省下的 token 数和压缩率:
from headroom import compress
from openai import OpenAI
messages = [{"role": "user", "content": "Analyze these results"}]
result = compress(messages, model="gpt-4o")
client = OpenAI()
response = client.chat.completions.create(model="gpt-4o", messages=result.messages)
print(f"Saved {result.tokens_saved} tokens ({result.compression_ratio:.0%})")

六、实测数据:省了多少、准不准
Headroom 没有只喊口号,而是把 benchmark 脚本开源,用供应商官方 tokenizer 和真实 compress()、固定随机种子离线复现。四个来自真实 MCP 输出格式的场景如下:
| 场景 | 压缩前 | 压缩后 | 节省 |
|---|---|---|---|
| SRE 事故排障(日志) | 55,957 | 24,340 | 57% |
| 代码库探索 | 58,801 | 33,895 | 42% |
| GitHub Issue 分诊 | 46,067 | 32,429 | 30% |
| 代码搜索(100 条结果) | 17,199 | 13,597 | 21% |
光省 token 还不够,压缩不能把答案压坏。它给出的准确率对照(N=100):
| 基准 | 类别 | Baseline | Headroom | 差值 |
|---|---|---|---|---|
| GSM8K | 数学 | 0.870 | 0.870 | ±0.000 |
| TruthfulQA | 事实 | 0.530 | 0.560 | +0.030 |
| SQuAD v2 | 问答 | — | 97% | 19% 压缩下 |
| BFCL | 工具调用 | — | 97% | 32% 压缩下 |
一个加分的诚实细节:项目自己指出,N=100 时 ±0.03 落在置信区间内,所以 TruthfulQA 的 +0.030 应解读为”没有可检测的差异”,而非”变好了”。这种主动给数据降温的写法,把结论限定在证据能支撑的范围内。
至于压缩本身的开销几乎可以忽略:10K token 的 JSON 搜索结果 p50 仅 0.21 ms,100K token 也才 1.4 ms,不会体现在 Agent 的端到端延迟里。而节省比例与负载的重复度正相关——重复 JSON 数组、日志行可超过 90%,散文与本就密集的输出几乎压不动。正确姿势是拿 headroom savings 跑你自己的真实流量。
七、第二战场:连”模型写回来的话”也省
前面所有数字都在讲输入侧——你发出去的部分。但别忘了,模型写回来的每个 token 同样计费,而在 Opus 这类模型上,输出价格约为输入的 5 倍。更关键的是,大量输出其实是”客套”:一句”好的,让我来……”的开场白、把你刚给的代码原样复述一遍、以及在”读一个文件”这种常规步骤上动用深度思考。
Headroom 在代理层顺手把这块也削了,且不改你的代码:
- Verbosity steering(冗长度引导):在系统提示词末尾追加一句”简洁、别复述上下文”——放在末尾是为了不打断提示词缓存命中。
- Effort routing(思考强度路由):当这一轮只是”模型拿到工具结果后继续”(读了个文件、测试通过),把思考预算调低;遇到新问题和报错则保持完整强度。
更有意思的是 headroom learn --verbosity:它去读你过去的会话,从你打断长回答、或没读完就翻页的行为里,反推出你偏好的简洁程度,再自动定档。而输出节省本质是”反事实”的(我们看不到模型本来会写多少),所以它给出的是带置信区间的估计,并明确标注为 [estimated]。
export HEADROOM_OUTPUT_SHAPER=1 # 打开输出整形(默认关闭)
headroom proxy --port 8787
headroom learn --verbosity # 预览(dry run)
headroom learn --verbosity --apply # 保存,代理自动生效
八、本地执行与隐私边界
把”压缩层”插在敏感代码和云端模型之间,团队最关心的必然是:我的数据会不会被这层截走?Headroom 的回答很直接——压缩在你自己的机器上运行,任何提示词或文件内容都不会被发送出去做压缩。它是一个本地进程,不是又一个云端 API。

需要如实说明的是:Headroom 处理的对象本来就要发给模型供应商——它不改变”你把提示词发给了 Anthropic/OpenAI”这一事实,只是让发出去的内容更小。它的隐私价值在于”压缩这一步不额外引入第三方、不上传原文”。对合规敏感的团队,仍应把它当作自己可控的本地组件来审计,而不是当作脱敏工具。
九、生态兼容矩阵
Headroom 的野心是做”通用中间层”,覆盖面很广。除各家编程 Agent 外,还提供与主流框架的挂钩方式(withHeadroom(new Anthropic())、Vercel AI SDK 中间件、LiteLLM 回调、LangChain / Agno 模型包装、ASGI 中间件、多 Agent 的 SharedContext 等)。主要 Agent 的 wrap 支持情况:
| Agent | wrap | 备注 |
|---|---|---|
| Claude Code | ✅ | 支持 –memory · –code-graph · –1m · –tool-search |
| Codex / Grok CLI | ✅ | Codex 与 Claude 共享记忆;Grok 经 GROK_MODELS_BASE_URL 路由 |
| Aider / Copilot CLI / Goose / OpenHands / Cline / Continue / OpenCode | ✅ | 起代理 + 启动 / 注入配置 |
| VS Code Copilot | ✅ | 透明代理,保留所选模型 |
| Cursor / ZCode | 手动 | 起代理并打印 base URL,填进各自设置 |
| Cortex Code | 仅库 | 库模式省 60–65%,无 wrap |
此外还有跨 Agent 共享记忆:Claude、Codex、Gemini、Grok 共用一个带来源标记、自动去重的记忆库。对同时在多个 Agent 间切换的重度用户,这意味着”项目上下文”不再每个工具各存一份。
十、什么时候用、什么时候别用
一个成熟的项目会告诉你它的边界。简单说,适合你,如果你每天跑编码 Agent、想在不改代码的前提下省钱、在多个 Agent 间工作想要一份共享记忆、或需要可逆的压缩(原文在 TTL 内可通过 CCR 取回)——它的收益在”长会话 + 重工具输出”时最明显。
反过来,可以跳过,如果你只用单一供应商的原生压缩且不需要跨 Agent 记忆、或在无法运行本地进程的沙箱环境里工作。短对话、纯散文、本就密集的输出几乎压不动,低于 min_input_words 的块会原样返回。换句话说,Headroom 不是”魔法省钱按钮”,而是一个对负载类型敏感的基础设施。
十一、60 秒上手
安装与三种典型启动路径,README 给得很清爽:
# 安装
uv tool install --python 3.13 "headroom-ai[all]" # 自包含 CLI 环境
pip install "headroom-ai[all]" # Python(附带 headroom CLI)
npm install headroom-ai # 仅 TypeScript SDK,无 CLI
# 选一种模式
headroom deploy # 一键本地部署 + Agent 配置
headroom wrap claude # 包裹一个编码 Agent
headroom proxy --port 8787 # 零改动的 drop-in 代理
# 体检 + 看省了多少
headroom doctor
headroom dashboard # 实时节省(需代理在跑)
一个容易踩的坑:headroom CLI 只随 PyPI 包发布;npm 的 headroom-ai 只是可 import 的 TypeScript 库,没有 headroom 命令。想用 CLI,走 pip / uv。
写在最后
回看 Headroom 的设计,它真正的价值不在”某个压缩算法多聪明”,而在于把一个原本散落在每个团队、每个 Agent 配置里的脏活——上下文裁剪、缓存对齐、增量压缩、可逆检索、输出整形、跨 Agent 记忆——沉淀成了一个可插拔的本地中间件。它踩中了 Agent 时代的三个真实痛点:账单、延迟、信任。
如果你正被长会话的 token 账单困扰,Headroom 值得一试;但更成熟的姿势是把它当作一层基础设施来度量、来审计,而不是当作一键魔法。毕竟在 Agent 的世界里,最贵的往往不是模型,而是你喂给模型的那些本可以不说出口的话。项目地址:github.com/headroomlabs-ai/headroom · 官方文档:docs.headroomlabs.ai · 协议:Apache 2.0

AI TOOL PUSH






