背景
用 Claude Code、Cursor 这类 AI 编程工具的同学应该都有体感:一个 50 轮的 agentic 会话,60% 以上的 context 是重复的。系统提示每轮重发,工具定义每轮重发,早就不看的文件内容还占着坑位。
结果就是:钱白花了,模型还变笨了("lost in the middle" 效应,论文实锤的)。
我去看了一圈现有方案:
- LangChain 的 SummarizationMiddleware?只能在 LangChain 里用
- Claude Code 的 /compact?只能用 Claude,只能在 CLI 里
- 各种 token 计数工具?只能告诉你用了多少,不能帮你管
没有一个开源项目做跨模型、跨框架的统一 context 管理。
所以我做了一个。
save-your-tokens
一句话:LLM context window 的虚拟内存管理器。
操作系统不会把所有文件都塞进 RAM,你的 LLM 应用也不该把所有消息都塞进 context window。
核心机制
三层 Context 模型:每段 context 归属一个层级,各有独立预算
┌────────────┬───────────┬────────┬─────────────────────────────────┐ │ 层级 │ 生命周期 │ 预算 │ 举例 │ ├────────────┼───────────┼────────┼─────────────────────────────────┤ │ Persistent │ 跨会话 │ 5-15% │ CLAUDE.md、系统提示、工具定义 │ ├────────────┼───────────┼────────┼─────────────────────────────────┤ │ Session │ 单会话 │ 20-40% │ progress.md、任务状态、关键事实 │ ├────────────┼───────────┼────────┼─────────────────────────────────┤ │ Ephemeral │ 单轮/几轮 │ 剩余 │ 工具输出、用户消息、文件内容 │ └────────────┴───────────┴────────┴─────────────────────────────────┘
分级超限响应:不是一刀切,而是渐进式
- 小幅超出(<5%)→ 警告
- 中幅超出(5-20%)→ 自动压缩
- 严重超出(>20%)→ 拒绝加载
主动压缩:不等你撞墙,提前帮你腾空间
- 过期内容自动丢弃
- 膨胀内容自动摘要
- Session 层定期精简
- Persistent 层最后才动(兜底)
跨模型、跨框架
pip install save-your-tokens[claude] # Claude pip install save-your-tokens[openai] # OpenAI
适配器模式,实现 count_tokens() + format_context() 就能接入任何模型。集成层两层设计:内层统一逻辑,外层各框架写自己的胶水代码(hooks、middleware 等)。
CLI 开箱即用
syt init --profile agentic # 初始化 syt analyze # 分析当前目录 context 用量 syt compact # 一键压缩 syt compact progress.md # 压缩指定文件
Python API
from save_your_tokens.core.budget import BudgetEngine from save_your_tokens.core.spec import BUILTIN_PROFILES
engine = BudgetEngine(context_window=200_000, profile=BUILTIN_PROFILES["agentic"])
添加 context → 检查预算 → 自动压缩,三步闭环
参考数据
JetBrains Research 2026 年 3 月发的论文显示,混合 context 管理在 SWE-bench 上实现了 7-11% 的成本降低,同时准确率提升 2.6%。这是我们的基线目标。
项目状态
Phase 1 开发中,核心接口和数据模型已完成,正在写测试和跑 benchmark。
MIT 协议,欢迎贡献:
- 给你喜欢的模型写 adapter
- 给你用的框架写 integration
- 跑你的真实场景 benchmark
GitHub:github.com/zzhou23/sav…