Headroom 深度拆解:当 AI Agent 学会「断舍离」——从上下文压缩层、CCR 可逆检索到 6 大压缩算法的工程全貌(2026)
一句话结论:在 AI 编程助手成为日常标配的今天,真正拖垮你的不是模型能力,而是每一次工具调用返回的那一大坨冗余上下文。Headroom 在 Agent 与 LLM Provider 之间插入一层本地优先、内容感知、完全可逆的上下文压缩中间件,实测把 Token 消耗砍掉 60–95%,而答案质量几乎不缩水。本文从背景痛点到核心概念,从架构全貌到可运行的代码实战,再到 6 大压缩算法的工程权衡,给你一个能直接动手落地的完整认知。
一、背景:你的 AI Agent 正在被 Token「拖垮」
先讲一个你大概率经历过的场景。
你让 Claude Code 在一个中等规模的代码库里排查一个线上故障。它先跑了一遍 grep,返回 100 条匹配,光这一下就是一万多 Token;接着它读了三个文件,每个文件两三千行,又是上万 Token;然后它调用了一个内部 API,对方返回了一整段嵌套 JSON 日志,里面 80% 是重复的成功记录;最后它把前面所有的对话历史又带着滚了一遍。一次排障下来,六万 Token 就这么悄无声息地烧掉了。
这还不是最糟的。最糟的是——这六万 Token 里,真正承载信息的部分可能不到两万。
1.1 Token 爆炸的三个真相
我观察过大量 Agent 的真实运行轨迹,Token 膨胀主要来自三个结构性来源:
- 工具输出的结构冗余。一次
curl返回的 JSON、一段kubectl logs的日志流、一个 RAG 检索返回的 20 个 chunk,天然带着大量重复模板。一个 2000 行的日志文件,可能只有 3 行是错误,其余全是 "INFO level=info msg=heartbeat"。 - 对话历史的累加效应。Agent 是「轮转」的:每一轮都要把系统提示 + 历史消息 + 当轮输入一起喂给模型。上下文窗口被历史消息撑到爆炸,而越靠后的历史,信息密度越低。
- RAG 结果的过度投喂。为了「不漏掉」,我们习惯把 top-20 的检索片段全部塞进 prompt,但其中大半和当前问题无关。
社区里一个被广泛引用的结论是:Agent 上下文里 60% 以上的 Token 花在了结构冗余上,而不是信息本身。换句话说,你花在 API 账单上的钱,一大半买的是「噪音」。
1.2 为什么「截断」和「摘要」都不work
面对膨胀,直觉反应有两种,但都治标不治本:
- 硬截断(truncation):只保留前 N 个 Token。问题是在日志里,最关键的往往就是最后那一行
FATAL。截断 = 让 Agent 变瞎。 - 摘要(summarization):用 LLM 先总结一遍。问题在于摘要会破坏结构关系——JSON 的字段依赖、代码的语法结构、日志的时间线,一旦被「自然语言化」就再也还原不回来了,Agent 无法在破损的结构上做精确推理。而且摘要本身又要消耗一轮 Token,属于「为了省钱先花钱」。
真正的需求是:在保留关键信息、不破坏结构、且能随时取回原文的前提下,把体积压下去。 这正是 Headroom 的切入点。
二、核心概念:上下文压缩层(Context Compression Layer)
Headroom(仓库 chopratejas/headroom,Apache-2.0,核心为 Python 包 headroom-ai + TypeScript SDK,Rust 重写进行中)把自己定位为「AI Agent 的上下文压缩层」。用一张图理解它的位置:
你的 Agent ──原始内容──▶ [ Headroom 压缩层 ] ──压缩后内容──▶ LLM Provider
│
└──原始内容存入本地 Store(带 id)──▶ 模型按需 headroom_retrieve 取回
它不改变你的 Agent 逻辑,不替换你的模型,只是在中间插了一层「智能节流阀」。
2.1 这不是「摘要」,是「上下文工程」
Headroom 作者反复强调的一个观点:把它简单理解为摘要工具,是严重低估了它。普通摘要只关心「把长文本变短」;而 Agent 场景复杂得多:
- 日志里可能只有一行错误最关键;
- JSON 里字段关系不能乱;
- 代码压缩不能破坏语法结构;
- RAG 片段需要保留可追溯性;
- 工具输出还可能在后续步骤被再次引用。
所以 Headroom 关心的是上下文工程(Context Engineering):判断内容类型 → 选合适的压缩策略 → 稳定提示前缀以提高 Provider 的 KV cache 命中率 → 把原文存在本地 → 必要时让 LLM 通过工具取回细节。这比单纯截断上下文可靠得多,也更接近生产系统的真实需求。
2.2 四条设计原则
我把 Headroom 的设计哲学提炼成四条原则,这四条也是你评估任何「上下文压缩方案」时的标尺:
- 内容类型感知(Content-type aware):JSON、代码、自然语言、日志、图像,不该用同一套策略。对 JSON 做结构压缩,对日志做统计聚合,对代码做语义保持的精简。
- 可逆(Reversible):原文永远本地保留,模型随时能取回。压缩只是「推迟」信息的呈现,而非「销毁」信息。这是它敢激进压缩的底气。
- 非侵入(Non-invasive):不改一行 Agent 代码、不换模型。它可以是库、可以是代理、可以是 MCP 工具——怎么接入都行。
- 本地优先(Local-first):原始上下文存在你自己的机器上,不上传第三方。这同时解决了隐私和延迟两个问题。
三、架构分析:Headroom 的工程全貌
3.1 四步工作流
Headroom 的核心流程可以拆成四步:
- 进入(Ingest):内容来源可以是工具输出、日志、RAG 结果、文件内容、对话历史,或某个 Agent wrapper 捕获到的上下文。
- 路由(Route):
ContentRouter判断内容类型——JSON、代码、自然语言、日志、图像,分别走不同策略。 - 压缩(Compress):对应引擎对内容做压缩,产出「压缩视图」。
- 存储与取回(Store & Retrieve):原始内容存入本地 Store(带唯一 id),压缩视图进入模型;若模型需要原文,通过
headroom_retrieve(id)工具按需取回。
关键点在于第 4 步的解耦:模型默认只看到压缩视图,但随时拥有一把「回到原文」的钥匙。这让 Headroom 敢于把压缩率推到 90%+,因为它知道信息没有真正丢失。
3.2 ContentRouter:内容类型感知的入口
ContentRouter 是整个管道的大脑。它用一组启发式规则判断内容类型:
- JSON:尝试
JSON.parse,判断是对象还是数组、是否嵌套、是否有重复 schema 的数组元素。 - 代码:根据文件扩展名或语言标记(
python /go)选择 CodeCompressor。 - 日志:匹配时间戳 + 日志级别(
ERROR/WARN/INFO)模式,识别高频模板行。 - 散文/自然语言:走语义剪枝路线。
- 图像:走多模态占位/描述路线(目前较弱,Rust 重写后预期增强)。
路由结果决定了后续用哪个压缩引擎、采取什么激进程度——这是 Headroom 比「一刀切截断」聪明的地方。
3.3 四种集成模式:Library / Proxy / Agent Wrap / MCP Server
Headroom 最实用的设计之一,是它提供了四种接入姿势,覆盖从「我愿意改代码」到「我一行都不想改」的全部光谱:
| 模式 | 怎么用 | 侵入性 | 适合谁 |
|---|---|---|---|
| Library | import headroom,在代码里包裹工具输出 | 高(需改代码) | 自研 Agent、要精细控制 |
| Proxy | 在应用和 LLM API 之间架一层代理,兼容 OpenAI/Anthropic | 零(改 base_url 即可) | 现成应用、快速见效 |
| Agent Wrap | 用装饰器包住 Agent 的工具调用 | 中 | 框架型 Agent |
| MCP Server | 把 headroom_retrieve 暴露成 MCP 工具 | 零(Agent 自动发现) | 任意支持 MCP 的 Agent |
我的建议:先上 Proxy 模式验证收益(改一个 base_url 就能看到账单变化),再在关键路径用 Library 模式做精细调优,最后用 MCP Server 模式让所有 Agent 共享同一套可逆检索。
3.4 CCR:让压缩「无损」的核心创新
CCR(Compressed Context Retrieval,压缩上下文检索)是 Headroom 区别于「云压缩 API」的基石。它的工作方式是:
- 压缩时:对一段 100 行 JSON 日志,Headroom 可能只保留关键统计(「87 条成功、2 条警告、1 条致命错误」)+ 异常样本(那 1 条 FATAL 的完整内容)。
- 存储时:完整原文按 id 存入本地 Store。
- 取回时:模型如果觉得「那 2 条警告具体是什么?」可以通过
headroom_retrieve(id, query="warnings")把原文相关片段拉回来。
这带来一个微妙但重要的认知转变:压缩不再是「有损降级」,而是「延迟呈现」。信息密度低的段落被折叠,信息密度高的片段被保留,模型在需要时又能展开。实测在保持 97%+ 信息精度的前提下,对日志、代码等数据类型压缩效果尤其显著。
3.5 稳定前缀与 KV Cache 命中率
这是很多文章忽略、但工程上极关键的一点。主流 LLM Provider(OpenAI、Anthropic、Gemini)都有 KV cache:如果连续请求的 prompt 前缀一致,Provider 可以复用前面算好的 Key/Value 缓存,大幅降低延迟和成本。
Headroom 通过稳定提示前缀(固定的系统提示 + 固定的压缩标记格式)来提高前缀命中率。也就是说,压缩本身省了 Token,而稳定前缀又让「省下来的 Token」进一步享受缓存折扣——两层收益叠加。这一点在你有大量「结构相似」的请求(比如同一代码库里的反复排查)时,效果会被放大。
3.6 三大压缩引擎
Headroom 内置三个互补的压缩引擎:
- SmartCrusher:通用型、结构感知的压缩器,处理 JSON、自然语言等混合内容。
- CodeCompressor:AST 感知的代码精简器,在保持语法正确和可理解性的前提下压掉冗余(如折叠明显重复的样板、保留关键控制流)。
- Kompress-base:基于学习的压缩器,用模型理解内容语义做更激进的剪枝。
实际使用中,通常通过 strategy="auto" 让 ContentRouter 自动选型,也可以显式指定。
四、代码实战
光讲架构不够,我们直接上手。下面分四个层次:先用 Headroom 官方接口感受「开箱即用」,再从零写一个迷你上下文压缩器,把原理落实成可运行的代码。
4.1 Library 模式:三行接入
# pip install headroom-ai
from headroom import Headroom
hr = Headroom(strategy="auto") # auto = 让 ContentRouter 自动选型
# 把工具输出包进 compress,再喂给模型
raw_tool_output = call_my_tool() # 一大坨 JSON / 日志
compressed = hr.compress(raw_tool_output, content_type="json")
llm_response = model.chat(compressed) # 模型看到的是压缩视图
hr.compress 返回的对象里同时携带了「压缩文本」和「可取回的 id」,你可以把它透传进你的 prompt 构造逻辑。对于自研 Agent,这是最灵活的方式——你可以在工具调用层统一拦截。
4.2 Proxy 模式:零代码改造
如果你的应用已经用了 OpenAI/Anthropic 的 SDK,改一个 base_url 就能让所有流量经过 Headroom:
from headroom.proxy import HeadroomProxy
proxy = HeadroomProxy(
upstream="https://api.anthropic.com",
token="sk-ant-xxxx",
compress_request=True, # 压缩发往模型的请求体
compress_response=False, # 是否也压缩返回(通常不需要)
)
# 把 SDK 的 base_url 指向 proxy 监听的本地端口即可
# openai.base_url = "http://127.0.0.1:8787/v1"
Proxy 模式的好处是完全不改业务代码,最适合「先验证收益」的阶段。它的代价是引入一个本地服务进程,需要处理它的可用性与监控。
4.3 MCP Server 模式:让任意 Agent 自动发现
把 headroom_retrieve 注册成 MCP 工具后,任何支持 MCP 的 Agent(Claude Code、Cursor 等)都能自动发现并使用它来取回原文:
// ~/.claude/mcp_servers.json 片段
{
"mcpServers": {
"headroom": {
"command": "headroom",
"args": ["mcp", "--store", "~/.headroom/store"]
}
}
}
这样你的 Agent 在对话中就能自然地说「让我取回那次报错的原始日志」,Headroom 负责把 id 对应的原文片段喂回去。
4.4 自己动手:从零写一个迷你上下文压缩器
理解一个系统最好的方式,是把它重写一遍(哪怕简化)。下面这个 mini_compress.py 实现了 Headroom 的核心思想:内容路由 + 三类压缩 + 可逆存储 + 按需取回。它不依赖任何第三方库,直接可跑。
"""
mini_compress.py —— Headroom 核心思想的极简实现(教学用,非生产)
演示:内容路由 / JSON结构压缩 / 日志统计压缩 / 可逆存储 / 按需取回
"""
import hashlib
import json
import re
from collections import Counter
from dataclasses import dataclass, field
from typing import Any
# ---------- 1. 可逆存储:压缩视图 + 原文都在,靠 id 取回 ----------
@dataclass
class ReversibleStore:
_data: dict[str, str] = field(default_factory=dict)
def put(self, raw: str) -> str:
# 用内容哈希当 id,天然去重
cid = hashlib.sha1(raw.encode("utf-8")).hexdigest()[:12]
self._data[cid] = raw
return cid
def get(self, cid: str) -> str | None:
return self._data.get(cid)
def search(self, cid: str, query: str) -> str:
"""极简取回:在原文里按 query 关键字抽取相关行"""
raw = self._data.get(cid, "")
hits = [line for line in raw.splitlines() if query.lower() in line.lower()]
return "\n".join(hits) if hits else raw # 没命中就返回全文兜底
# ---------- 2. 三类压缩器 ----------
def compress_json(value: Any, max_samples: int = 3) -> dict:
"""结构感知压缩:数组只保留 schema + 少量样本,对象折叠重复键"""
if isinstance(value, list):
if not value:
return {"__type__": "array", "len": 0}
schema = _infer_schema(value[0])
samples = value[:max_samples]
return {
"__type__": "array",
"len": len(value),
"schema": schema,
"samples": samples,
"note": f"仅保留前 {max_samples}/{len(value)} 条样本,原文可经 retrieve 取回",
}
if isinstance(value, dict):
return {k: compress_json(v) for k, v in value.items()}
return value
def _infer_schema(sample: Any) -> str:
if isinstance(sample, dict):
return "object{" + ",".join(sample.keys()) + "}"
return type(sample).__name__
def compress_log(text: str) -> dict:
"""日志统计压缩:按级别聚合 + 保留错误/警告样本"""
lines = text.splitlines()
levels = Counter()
errors, warns = [], []
for line in lines:
m = re.search(r"\b(DEBUG|INFO|WARN|ERROR|FATAL)\b", line)
lvl = m.group(1) if m else "UNKNOWN"
levels[lvl] += 1
if lvl in ("ERROR", "FATAL"):
errors.append(line)
elif lvl == "WARN":
warns.append(line)
return {
"__type__": "log",
"total_lines": len(lines),
"level_histogram": dict(levels),
"error_samples": errors[:5],
"warn_samples": warns[:5],
}
def compress_prose(text: str, max_chars: int = 800) -> str:
"""散文语义剪枝(极简版):过短原样返回,过长抽取首尾+关键句"""
if len(text) <= max_chars:
return text
sentences = re.split(r"(?<=[。!?])", text)
keep = sentences[:3] + sentences[-3:]
return "".join(keep) + f"\n…[已剪枝,原文 {len(text)} 字,可经 retrieve 取回]"
# ---------- 3. ContentRouter:内容类型感知路由 ----------
class ContentRouter:
def route(self, raw: str, hint: str | None = None) -> tuple[str, Any]:
if hint == "json" or (raw.strip().startswith(("{", "[")) and self._is_json(raw)):
return "json", compress_json(json.loads(raw))
if hint == "log" or self._looks_like_log(raw):
return "log", compress_log(raw)
if hint == "prose":
return "prose", compress_prose(raw)
# 默认当散文处理
return "auto", compress_prose(raw)
@staticmethod
def _is_json(s: str) -> bool:
try:
json.loads(s)
return True
except Exception:
return False
@staticmethod
def _looks_like_log(s: str) -> bool:
return bool(re.search(r"\b(DEBUG|INFO|WARN|ERROR|FATAL)\b", s)) and "\n" in s
# ---------- 4. MiniHeadroom:编排以上所有部件 ----------
class MiniHeadroom:
def __init__(self):
self.router = ContentRouter()
self.store = ReversibleStore()
def compress(self, raw: str, hint: str | None = None) -> dict:
cid = self.store.put(raw) # 先存原文(可逆的关键)
ctype, view = self.router.route(raw, hint)
return {
"cid": cid,
"content_type": ctype,
"compressed_view": view,
"retrieve_hint": f"需要细节时调用 headroom_retrieve(cid='{cid}')",
}
def retrieve(self, cid: str, query: str = "") -> str:
return self.store.search(cid, query)
# ---------- 5. 演示 ----------
if __name__ == "__main__":
hr = MiniHeadroom()
# 场景 A:一大坨 JSON 工具输出
big_json = json.dumps({
"items": [{"id": i, "status": "ok", "ts": 1700000000 + i} for i in range(500)],
"meta": {"page": 1, "total": 500},
})
r = hr.compress(big_json, hint="json")
print("【JSON 压缩视图】")
print(json.dumps(r["compressed_view"], ensure_ascii=False, indent=2)[:400], "...\n")
# 场景 B:一段日志
logs = "\n".join(
(["INFO level=info msg=heartbeat"] * 90)
+ ["ERROR level=error msg=db connection refused host=10.0.0.5"]
+ ["WARN level=warn msg=retry 1"]
+ ["FATAL level=fatal msg=oom killer triggered pid=8821"]
)
r2 = hr.compress(logs, hint="log")
print("【日志压缩视图】")
print(json.dumps(r2["compressed_view"], ensure_ascii=False, indent=2), "\n")
# 场景 C:按需取回原文中的 ERROR 行
print("【按需取回 ERROR 行】")
print(hr.retrieve(r2["cid"], query="ERROR"))
运行这段代码的输出会让你直观看到:500 条 JSON 数组被压成「schema + 3 条样本」,一段 93 行的日志被压成「级别直方图 + 错误样本」,而任何时候你都能用 retrieve(cid, query) 把原文相关片段拉回来。这就是 Headroom 思想的「最小可用实现」。
说明:生产级 Headroom 远比这复杂(多算法组合、学习式压缩、KV cache 前缀稳定、并发安全的 Store、流式处理等),但上面这 150 行已经把它的骨架讲清楚了。
五、性能优化:6 大压缩算法与工程权衡
Headroom 把压缩拆成一串可组合的算法。理解每个算法的「省多少」和「冒什么险」,是做好工程权衡的前提。
5.1 六大算法一览
- 格式归一化(Format Normalization):把 JSON 规范化(去空白、统一 key 顺序)、把代码格式化标准化。这是零信息损失的「免费午餐」,通常能省 10–20%。
- 近似去重(Approximate Deduplication):对归一化后的行做哈希,识别并折叠近似重复(日志心跳、重复的成功记录)。日志场景能再省 40–60%。
- 结构感知压缩(Structure-aware Compression):对数组只保留 schema + 样本,对对象折叠重复键。JSON 工具输出场景的「主力算法」,省 70–85%。
- 语义剪枝(Semantic Pruning):丢掉低信息密度行,保留错误/警告/数字/异常。配合分级策略,对散文和混合内容有效。
- 统计/直方图压缩(Statistical Compression):把日志流替换成聚合统计(级别直方图、Top-N 错误)。这是把「过程」变成「结论」,省得最狠但最不可逆(靠 retrieve 兜底)。
- KV Cache 前缀稳定(Stable Prefix):不属于「压内容」,而是「压重复」。稳定前缀让 Provider 复用 KV cache,间接再降一截延迟和成本。
5.2 不同内容类型的压缩率与精度(实测量级参考)
| 内容类型 | 主力算法 | 典型压缩率 | 精度保持 | 主要风险 |
|---|---|---|---|---|
| JSON 工具输出 | 结构感知 + 去重 | 80–90% | 97%+ | 样本没覆盖到的边缘字段 |
| 日志流 | 直方图 + 语义剪枝 | 90–95% | 95%+ | 罕见错误被聚合掉 |
| 代码 | 结构感知(谨慎) | 30–50% | 99% | 压太狠会破坏可理解性 |
| 散文/RAG chunk | 语义剪枝 | 50–70% | 90%+ | 上下文依赖被切断 |
| 对话历史 | 结构感知 + 稳定前缀 | 40–60% | 95%+ | 早期决策依据丢失 |
可以看到一个规律:越是「结构化、高冗余」的内容,压缩率越高;越是「语义密集、低冗余」的内容(如代码、关键决策),越要手下留情。
5.3 工程权衡:激进还是保守?
Headroom 的压缩强度通常可调(激进/均衡/保守)。我的经验法则:
- 排障、日志分析类任务:可以激进。反正有
retrieve兜底,先压到最小,模型需要细节再拉。 - 需要精确推理的代码任务:保守。代码压太狠,模型会基于「看不懂的片段」做错误推断,反而更贵(多一轮重试)。
- 长对话历史的滚动压缩:均衡。对早期历史做结构压缩,近期几轮保持原样,避免「lost in the middle」。
还有一个反直觉的点:有时压缩反而提升了质量。当上下文里 60% 是噪音时,去掉噪音等于帮模型「聚焦」。不少用户反馈,开了 Headroom 后,不仅账单降了,回答反而更准——因为模型不再被海量无关日志淹没。
六、生产落地:踩坑与最佳实践
理论和代码都清楚了,落地时还有几个坑要提前说。
6.1 隐私:压缩 ≠ 脱敏
Headroom 是本地优先的,原文存你机器上,这解决了「原文外传」的问题。但注意:压缩视图是要发给 LLM 的。如果原文里有密钥、PII,压缩器并不会自动帮你脱敏——它只是去掉冗余,不识别敏感信息。所以:
- 在压缩前,先过一道 PII/密钥扫描与脱敏;
- 敏感日志(含 token、密码)建议直接走「不压缩也不投喂」的黑名单策略;
- 本地 Store 本身也要按敏感数据对待(加密 at rest、定期清理)。
6.2 什么时候「不该用」
Headroom 不是银弹:
- 小上下文(< 2k Token):压缩本身有开销(路由 + 存储 + 可能多一次 retrieve),省下的不够付油钱。
- 要求零延迟、零额外往返的任务:如果压缩视图里丢了关键信息,模型多一次
retrieve往返,延迟反而上升。这种场景宁可用保守策略。 - 法律/合规要求「原始上下文必须进模型」的场景:可逆压缩意味着模型默认看不到原文,需要确认这满足你的合规口径。
6.3 与 RAG 的关系
Headroom 和 RAG 是互补而非替代:
- 压缩投喂前:RAG 召回 20 个 chunk 后,先用 Headroom 压缩再注入,避免「投喂过多」;
- 压缩返回后:工具返回的检索结果同样可以压缩;
- 更进一步,Headroom 可以充当「重排 + 压缩」的一体化层,在检索和推理之间做信息密度调控。
6.4 可观测性:盯住两个指标
上线后,建议监控两个指标:
- 压缩率(Compression Ratio):
1 - 压缩后Token / 原始Token。低于 30% 说明内容本就紧凑,可能不值得压。 - 取回频率(Retrieve Frequency):模型调
headroom_retrieve的次数。太高说明压缩太激进,欠压;太低且质量 OK,说明可以再激进点。
这两个指标构成一个反馈环,帮你把策略调到「甜区」。
七、总结与展望
回到开头的那个场景:Claude Code 一次排障烧掉六万 Token,其中两万是信息、四万是噪音。Headroom 做的事,本质上是帮 Agent 学会「断舍离」——把噪音折叠,把信号留下,把原文锁进抽屉随时可取。
从工程视角看,Headroom 代表了一个正在成形的趋势:上下文工程(Context Engineering)正在从「prompt 工程」里独立出来,成为 Agent 基础设施的必装组件。未来我们搭建 Agent,不会只关心「选哪个模型、写什么提示词」,还会标配一层像 Headroom 这样的压缩/检索中间件——就像今天每个 Web 服务都标配一层缓存。
几个值得关注的演进方向:
- Rust 重写:官方已在推进 Rust 版本,目标是把压缩吞吐和内存占用压到极致,让它在高频流式场景里也能零感介入。
- 学习式压缩走向主流:
Kompress-base这类用模型理解语义的压缩器,会从「可选」变成「默认」,进一步拉近压缩率与精度的边界。 - 与 Agent 框架深度集成:当主流框架(LangChain、AutoGen、Claude Code 插件体系)把压缩层当成一等公民,接入成本会趋近于零。
最后给一句实在的建议:先 Proxy 模式跑一周,看你的账单曲线。 如果像社区里很多人那样看到 60–90% 的降幅,你大概率会和我一样,把它列为 Agent 技术栈的常驻组件。毕竟,在 AI 编程这件事上,省下来的每一分 Token,都是省下来的真金白银和等待时间。
参考资料:Headroom 官方仓库(chopratejas/headroom)、官方文档、GitHub Trending 2026W25 周报、社区深度解析文章。本文代码示例为教学性极简实现,生产部署请以官方 SDK 为准。