Headroom 是一个 上下文压缩中间层,用 Rust 核心 + Python 编排,号称可以降低 60-95% 的 token 消耗。 项目本身代码量巨大(60+ 子模块),整体不适合直接使用——它是一个独立产品,架构假设与 BA 差异很大。 但其中有 3-4 个具体思路值得 BA 参考,特别是在上下文压缩策略、KV Cache 优化、跨会话记忆搜索方面。
一个部署在 LLM 调用链路中的透明代理,拦截 API 请求,对上下文进行压缩后再转发给模型。
headroom proxy --port 8787,零代码改动from headroom import compressheadroom wrap claude|codex|copilot| 维度 | Headroom | Blade Agent |
|---|---|---|
| 定位 | 通用 LLM 上下文压缩中间件 | 面向非技术用户的 AI Agent 平台 |
| 部署形态 | 透明代理 / 库 / MCP | 全栈应用(后端 + 前端 + 沙盒 + CLI) |
| 上下文管理 | 6 种专用压缩器 + CCR 可逆缓存 + 前缀对齐 | 内联归档 + LLM 摘要兜底 + 分支回溯 |
| Token 计数 | 精确 tokenizer + provider 级缓存经济模型 | 精确 tokenizer 优先,4字符≈1token 兜底 |
| KV Cache | CacheAligner 主动稳定前缀,量化缓存收益 | 无显式 KV Cache 优化 |
| 记忆系统 | 跨 Agent 层级记忆(USER→SESSION→AGENT→TURN) | MemoryStore + 语义搜索(SiliconFlow embedding) |
| LLM 集成 | 代理转发,支持 Anthropic/OpenAI/Gemini/Bedrock | OpenAI 兼容层(OpenRouter/MiniMax/Qwen/Kimi 等) |
| 流式处理 | SSE 透传 + WebSocket 代理 | SSE 流式 + Socket.IO 投影事件 |
| 核心语言 | Rust(性能关键路径)+ Python(编排) | Python 全栈 + Go CLI + React 前端 |
Headroom 是"拦截代理",假设自己是一个黑盒中间层。BA 的 agent loop 需要自己控制上下文构建的每一步(分支回溯、tool result 归档、planning 模式切换等),插一个透明代理会丢失这些语义。
60+ 子模块、Rust 编译链、ONNX 模型下载、spaCy NER……引入整个 Headroom 会让 BA 的构建和部署复杂度翻倍。BA 用 PyArmor 加密、单文件 <1500 行限制也不兼容。
Headroom 的压缩面向"通用 LLM 调用",BA 的上下文是结构化的 agent 历史(带分支、带事件流、带 tool call 语义)。直接压缩会破坏 BA 的投影一致性约束(流式/历史一致性)。
README 提到了极多特性但 GitHub 上星标不多,文档中的性能数字(60-95% 压缩)缺乏独立验证。"phase-based development" 文档暗示架构仍在频繁变动。
按对 BA 的实际价值排序,从高到低:
Headroom 做了什么:对 JSON 数组类型的 tool result,不是简单截断,而是做统计采样——保留 schema 描述 + 首尾代表性样本 + 异常/错误条目 + 去重。压缩比可达 80%+ 且不丢关键信息。
BA 现状:Compactor 的 inline archiving 把大 tool result 整体提取到外部文件,替换为引用。这是"全有或全无"的策略——要么原文,要么只剩一个引用链接。
借鉴方式:
bash 工具返回的大型 JSON / 日志 / 列表类输出,在归档前先做内容感知的摘要:保留 schema + 统计特征 + 异常行 + 首尾样本compaction/ 模块增加一个 smart_archive.py,作为 inline archiving 的增强# 伪代码:结构化 tool result 的智能摘要
def smart_summarize_tool_result(content: str, max_tokens: int = 500) -> str:
# 1. 检测内容类型
if is_json_array(content):
items = json.loads(content)
schema = extract_schema(items[0])
errors = [i for i in items if has_error_field(i)]
sample = items[:3] + items[-2:] # 首3尾2
return f"[{len(items)} items, schema: {schema}]\n" \
f"Errors ({len(errors)}): {json.dumps(errors[:5])}\n" \
f"Sample: {json.dumps(sample)}"
elif looks_like_log(content):
lines = content.splitlines()
errors = [l for l in lines if re.search(r'error|fail|exception', l, re.I)]
unique = dedupe_similar_lines(lines)
return f"[{len(lines)} lines, {len(errors)} errors]\n" \
f"Errors: {'\\n'.join(errors[:10])}\n" \
f"Unique patterns ({len(unique)}): {'\\n'.join(unique[:15])}"
else:
return content[:max_tokens * 4] # 回退到截断
Headroom 做了什么:CacheAligner 通过检测动态内容(日期、UUID、session ID)并将其移到 prompt 尾部,让前缀保持稳定,最大化 Anthropic/OpenAI 的 KV Cache 命中率。Anthropic 缓存命中有 90% 折扣。
BA 现状:PromptBuilder 按固定顺序构建提示词,但没有考虑前缀稳定性。每次会话的 system prompt 中可能包含变化的时间戳、用户信息等,导致缓存失效。
借鉴方式:
PromptBuilder 中,将不变的部分(系统提示词模板、技能定义、模式说明)固定在前面cache_control: {"type": "ephemeral"}预期收益:对于多轮会话,prompt cache hit 率可从接近 0% 提升到 80%+,直接降低 API 成本。
Headroom 做了什么:压缩时在原位留一个哈希标记 <<ccr:HASH N rows_dropped>>,原始内容存 SQLite。LLM 可以调用 headroom_retrieve 工具按需取回。这让有损压缩变成了"可逆"的。
BA 现状:inline archiving 把内容移到外部文件,留一个"已归档"的引用。但 agent 没有工具去读取归档内容——一旦归档就彻底丢失了上下文。
借鉴方式:
builtin:RetrieveArchive)让 agent 可以按需取回归档的完整内容Headroom 做了什么:对"机械性续行"(文件读取、测试通过等 tool result 后的继续)降低 output_config.effort,减少输出 token。对"错误续行"保持正常 effort。
BA 现状:每次 LLM 调用使用相同的配置参数,无论是简单的 tool result 续行还是复杂的用户问题。
借鉴方式:
agent_loop 中,判断当前轮次类型:如果是 clean tool result 后的续行(非错误),可以降低 thinking budgetis_error=False → 机械续行Headroom 做了什么:headroom learn 分析 agent 的 JSONL 会话记录,挖掘失败模式(循环、重复错误、超时),自动生成建议写入 CLAUDE.md。
BA 可以借鉴什么:BA 已经有完整的 JSONL 历史存储,可以做一个离线分析工具: 扫描历史会话中的 tool call 失败率、循环模式、compaction 触发频率等,帮助优化 agent 行为和提示词。 这不是紧急需求,但如果 BA 积累了足够多的会话数据,这类分析会很有价值。
| 优先级 | 思路 | 实施难度 | 预期收益 | 前置条件 |
|---|---|---|---|---|
| P0 | KV Cache 前缀稳定化 | 低(调整拼接顺序) | API 成本降低 30-50% | 无 |
| P1 | 结构化 Tool Result 压缩 | 中(200-300 行 Python) | 上下文利用率显著提升 | 无 |
| P2 | Effort Routing | 低(agent_loop 加判断) | 输出 token 减少 20-30% | 需要验证对不同模型的兼容性 |
| P2 | CCR 可逆压缩 | 中(需要新工具 + 存储) | 允许更激进的压缩 | 先完成 Tool Result 压缩 |
| P3 | 会话失败分析 | 中高(需要 pattern 设计) | 长期优化 agent 质量 | 足够的会话数据积累 |
Headroom 是一个有野心的项目,但它的价值在于思路而非代码。BA 应该从中学到的核心教训是:
以上思路都可以在 BA 现有架构内实现,不需要引入 Headroom 作为依赖。P0(KV Cache 前缀稳定化)甚至可以在一次 PR 内完成。