一天省 60 刀:DeepSeek-Reasonix 把缓存命中率干到 99.82%
一天省 60 刀:DeepSeek-Reasonix 把缓存命中率干到 99.82%
用 DeepSeek API 写代码,你以为最贵的是模型调用?错。最贵的是重复发送同样的上下文。
一个正常编程 session 里,系统提示词、工具定义、历史对话这些内容占了 90% 以上的 token,而且每次请求几乎一模一样。DeepSeek 提供了前缀缓存——命中时价格是正常输入的 10%。但问题是:大多数 Agent 框架的缓存命中率只有 20-60%,因为它们的循环设计会不断破坏前缀字节对齐。
DeepSeek-Reasonix 干了一件狠事:把整个 Agent 循环围绕缓存稳定性重新设计。结果?真实用户单日 4.35 亿输入 token,99.82% 缓存命中,花费 $1.38——没有缓存的话是 $61。
13,644 Stars,790 Forks,MIT 协议,TypeScript 实现。
本文提纲
- 为什么缓存命中率是 Coding Agent 的命脉
- 三根支柱:缓存优先循环、工具调用修复、成本控制
- 99.82% 命中率是怎么做到的
- 工具调用修复:应对 DeepSeek 的四个故障模式
- 成本控制:从 Flash 到 Pro 的分层策略
- 上手体验:五分钟跑起来
为什么缓存命中率是 Coding Agent 的命脉
先算一笔账。DeepSeek v4-flash 的定价(每百万 token):
| 类型 | 价格 |
|---|---|
| 输入(缓存未命中) | $0.14 |
| 输入(缓存命中) | $0.0028 |
| 输出 | $0.28 |
缓存命中时,输入成本降了 50 倍。一个长 session 动辄上亿输入 token,命中率的差别就是 $1 和 $60 的差别。
DeepSeek 的前缀缓存机制有一个硬性要求:请求的字节前缀必须和上一次请求完全一致。差一个字节,缓存就失效。
大多数 Agent 框架在循环中会做这些事:
- 重新排列历史消息
- 动态修改系统提示词(注入时间戳、计数器等)
- 在对话中内联工具结果,改变前缀结构
- 每次请求重新序列化工具定义
每一个操作都会破坏前缀字节对齐,缓存命中率直线下降。
三根支柱:缓存优先循环、工具调用修复、成本控制
Reasonix 的架构围绕三根支柱构建,每一根都解决通用 Agent 框架根本没注意到的问题:
graph TB
subgraph ReasonixArchitecture
P1["Pillar 1
Cache-First Loop
Immutable prefix design"]
P2["Pillar 2
Tool-Call Repair
4-pass error recovery"]
P3["Pillar 3
Cost Control
Flash-first tiering"]
end
P1 -->|stable prefix| P2
P2 -->|clean calls| P3
P3 -->|low cost| GOAL["Leave-it-running agent"]Pillar 1 — 缓存优先循环
Reasonix 把上下文分成三个区域:
┌─────────────────────────────────────────┐
│ IMMUTABLE PREFIX │ ← session 内固定不变
│ system + tool_specs + few_shots │ 缓存命中候选
├─────────────────────────────────────────┤
│ APPEND-ONLY LOG │ ← 单调增长
│ [assistant₁][tool₁][assistant₂]... │ 保持之前 turn 的前缀
├─────────────────────────────────────────┤
│ VOLATILE SCRATCH │ ← 每 turn 重置
│ R1 thought, transient plan state │ 永远不发送上游
└─────────────────────────────────────────┘三条不变量:
- 前缀只算一次,计算后哈希并锁定,session 内不再变
- 日志只追加,不重写、不重排
- 临时草稿独立存储,通过 Pillar 2 提炼后才折叠进日志
当上下文接近上限时,Reasonix 不会重写已有内容——而是把旧 turn 摘要成一条新消息追加到前缀后面。前缀本身不变,缓存照常命中。
99.82% 命中率是怎么做到的
这不是理论数字,是真实用户 2026-05-01 的 DeepSeek 后台截图:
| 指标 | 数值 |
|---|---|
| 缓存命中 token | 435,033,856 |
| 缓存未命中 token | 767,616 |
| 缓存命中率 | 99.82% |
| 当日实际花费 | $1.38(v4-flash) |
| 无缓存同等负载 | $61.06 |
对比其他客户端的典型命中率:
- DeepSeek 官方网页聊天:60-80%(单对话内),新 session 归零
- Cherry Studio / Open WebUI 等通用 SDK:30-60%
- Cline / Continue 等 XML 工具调用客户端:更低(工具结果内联到对话,移位字节)
Reasonix 的 99.82% 来自四个设计决策的叠加效果:
- ImmutablePrefix — 系统提示词 + 工具规格在 session 启动时冻结
- AppendOnlyLog — turn 只追加,不重排不编辑
- VolatileScratch — 思维链和临时状态放在缓存前缀之外
- Auto-compact — 上下文溢出时折叠旧 turn,但不修改前缀
这四个机制各守一个防线,缺一个都达不到这个数字。
工具调用修复:应对 DeepSeek 的四个故障模式
DeepSeek 模型在工具调用上有一些经验性的故障模式。Reasonix 没有假装它们不存在,而是为每种模式建了专门的修复管线:
Pass 1 — flatten(扁平化)
参数超过 10 个或嵌套深度超过 2 层时,DeepSeek 容易丢参数。flatten 自动检测复杂 schema,把参数展开成点分 notation 给模型看,调用时再重新嵌套回去。
Pass 2 — scavenge(回收)
有时候 DeepSeek 会把工具调用的 JSON 写在 reasoning_content(思维过程)里,但忘记在最终消息中输出。scavenge 用正则 + JSON 解析器扫描思维过程,把遗漏的工具调用捡回来。
Pass 3 — truncation(截断修复)
max_tokens 限制导致 JSON 输出被截断。truncation 检测不平衡的 JSON,尝试自动闭合括号,或者请求一个续写补全。
Pass 4 — storm(风暴抑制)
同一 (tool, args) 在滑动窗口内重复出现——模型反复调用同一个工具。storm 直接抑制重复调用,注入一条反思 turn 让模型换个方向。
这四个 pass 串联运行,每 pass 独立处理自己的故障模式。它们不是可选优化——是 Reasonix 循环的固定环节。
成本控制:从 Flash 到 Pro 的分层策略
Reasonix v0.6 引入了完整的成本控制体系。核心思路:大部分 turn 不需要最强模型。
三档预设
| 预设 | 模型 | 适用场景 | 成本倍率 |
|---|---|---|---|
flash |
v4-flash | 日常编码 | 1× |
auto(默认) |
flash → 按需升级 pro | 混合场景 | 1-3× |
pro |
v4-pro | 复杂推理 | ~12× |
默认 auto 模式下,大部分 turn 跑 flash,遇到困难 turn 自动升级到 pro。所有辅助调用(摘要、子 agent、截断修复重试)强制使用 flash,没有理由用 pro 价格跑"把工具结果改写成自然语言"这种任务。
模型自我升级
模型自己判断当前任务是否超出自己的能力范围。如果 flash 模型觉得这个任务需要更强的推理,它会在回复的第一行输出 <<<NEEDS_PRO>>> 标记。系统立即中止当前 flash 调用,用 pro 重跑这个 turn。
没有失败计数器,没有工具错误统计,纯粹靠模型自省。简单直接。
Turn 级自动压缩
每个工具结果超过 3000 token 的,在 turn 结束时自动压缩到这个上限。模型在当前 turn 看到完整内容,后续 turn 只看到摘要。如果后续需要细节,多一次 read_file 调用比把 12KB 拖进每个未来 prompt 便宜得多。
上手体验:五分钟跑起来
# 安装(Node >= 22)
npm install -g reasonix
# 进入项目目录,启动
cd my-project
reasonix code首次运行会要求粘贴 DeepSeek API Key。之后自动记住。
不想全局安装的话:
npx reasonix code # 一次性运行,总是最新版核心命令
| 命令 | 用途 |
|---|---|
reasonix code [dir] |
编码 Agent,挂载文件系统和 Shell 工具 |
reasonix chat |
纯聊天,不碰磁盘 |
reasonix run "task" |
一次性执行,输出到 stdout |
reasonix doctor |
环境检查:Node、API Key、MCP |
内建能力
- SEARCH/REPLACE 编辑:Agent 提出修改建议,
/apply后才落盘 - MCP 支持:stdio + SSE + Streamable HTTP
- Skills 系统:Markdown 格式的可复用剧本,支持 subagent 隔离执行
- Memory:用户私有知识钉入前缀,跨 session 保持
- Hooks:生命周期事件触发 Shell 命令
- Web 搜索:支持 Bing、百度、SearXNG、Tavily 等 8 种引擎
- QQ 通道:把现有 session 延伸到 QQ,远程交互
- 桌面客户端:Tauri 原生 GUI(预发布阶段)
与同类工具对比
| 特性 | Reasonix | Claude Code | Cursor | Aider |
|---|---|---|---|---|
| 后端 | DeepSeek | Anthropic | OpenAI/Anthropic | 任意(OpenRouter) |
| 协议 | MIT | 闭源 | 闭源 | Apache 2 |
| DeepSeek 前缀缓存 | 深度优化 | 不适用 | 不适用 | 偶发命中 |
| 单任务成本 | 低 | 高 | 订阅+用量 | 取决于模型 |
| 内建 Web Dashboard | 有 | 无 | N/A | 无 |
Reasonix 有意不支持多后端——绑定 DeepSeek 是特性不是限制。只有绑定一个后端,才能把缓存优化到极致。
作者: itech001 来源: 公众号:AI人工智能时代 网站: https://www.theaiera.cn/ 每日分享最前沿的AI新闻资讯和技术研究。
本文首发于 AI人工智能时代,转载请注明出处。