先叠个甲
我是一个学生,这是我第一次在Github上发issues,以下内容和调研过程基本都是由AI完成的,内容大部分我也看不太懂,如果有任何不合适的地方或者错误请宽容一下,谢谢🌹🌹,如果需要更详细的数据随时联系我
环境
- dsh 0.1.7-rc.2,@mars-sea/dsh-commandcode-provider 0.11.12(web profile)
- 模型:commandcode/deepseek/deepseek-v4.1-flash;套餐 Go(Provider API 返回 403,走 /alpha/generate)
- Windows 11 + Node v24.14.1;cordis.patch.yml 中 requestTimeoutMs: 60000
- 网络经 Clash TUN → 新加坡节点,实测节点到 api.commandcode.ai 延迟 71–136ms
现象
同一会话内,cacheReadTokens 会间歇性掉回 ~6,144(量级与"系统提示 + 26 个工具 schema"这段共享静态前缀相当),
此时未缓存输入达 2.1–3.2 万 token,需要重新预填充;该步耗时从热缓存时的 5–7 秒涨到 20–100 秒。
一个 14 步的会话里出现 4 次。
数据(session 370f0615,14 步,最大提示 46,865 tok,失败尝试 0 次、引擎重试 0 次)
| step |
总提示 |
已缓存 |
未缓存 |
命中率 |
首token |
输出 |
| 1/4 |
27,464 |
23,296 |
4,168 |
84.8% |
27.8s |
92 |
| 1/5 |
28,062 |
6,656 |
21,406 |
23.7% |
5.0s |
276 |
| 1/6 |
29,408 |
28,288 |
1,120 |
96.2% |
6.5s |
4,865 |
| 1/7 |
34,341 |
34,176 |
165 |
99.5% |
6.6s |
104 |
| 1/8 |
34,496 |
6,144 |
28,352 |
17.8% |
19.9s |
57 |
| 1/9 |
35,613 |
34,432 |
1,181 |
96.7% |
6.5s |
1,634 |
| 1/10 |
37,326 |
6,784 |
30,542 |
18.2% |
22.4s |
104 |
| 1/11 |
37,459 |
37,120 |
339 |
99.1% |
5.5s |
57 |
| 1/12 |
38,601 |
6,144 |
32,457 |
15.9% |
55.2s |
7,774 |
| 1/14 |
46,865 |
46,336 |
529 |
98.9% |
36.7s |
1,895 |
同账号同模型的对照:官方 CLI 1.65.2 连跑 60 次调用,累计 10,083,417 提示 token、命中 9,779,712(97.0%),
稳态 99.7–99.9%,全程只有 1 次掉到 3.4%。插件侧同期三个会话分别是 68.2% / 85.6% / 91.7%。
已排除(附证据)
- 网络/代理:流式正常(单请求 1000+ 事件、最大事件间隔 2.1s),本会话 0 次 TRANSPORT/连接错误
- 超时与重试:上表这些慢步的失败尝试和引擎重试均为 0
- 会话标识:做过 A/B(随机 threadId vs 固定 threadId + x-session-id),两者缓存行为一致
- 统计口径:确认 dsh 会话日志里 inputTokens 是"未缓存"、cacheReadTokens 是"已缓存",相加才是总提示
怀疑点
- 插件 buildCliBody 的请求体顶层字段:config / memory / taste / skills / params / threadId
- 官方 CLI 1.65.2 的请求体:config / memory / taste / skills / permissionMode / threadId / promptCache,
且 system 以分节数组发送(systemSections)。插件这两项都没有发送。
- Command Code 官方仓库 issue #346(p1,已关闭)承认过"deepseek-v4 缓存命中率远低于同一 DeepSeek 官方 provider",
并在 CLI 0.33.0 修复,修复说明为 "dynamic prefix cache thrashing by relocating volatile dynamic context block",
官方称可省 2.9x–21x 成本。插件是自己拼请求体,可能没有继承这个"易变内容块位置"的修复。
请求
- 对比插件与 CLI ≥0.33.0 的请求体布局(尤其易变/动态内容落在哪个字段、哪个位置),确认是否会把前缀切开
- 考虑像 CLI 一样发送 promptCache / permissionMode
- 为请求体/响应元数据增加抓取开关(DSH_COMMANDCODE_TRACE 目前只抓响应流);
另外插件目前不持久化 provider 侧的 trace/generation ID(dsh 会话日志里 generationId /
providerRequestId / x-trace-id / promptCacheHitTokens 均为 0 处),而官方 CLI 会把 traceIds
写进 ~/.commandcode/projects/.meta.json。有 ID 服务端才能定位到具体请求。
补充说明(诚实起见)
本会话也存在"缓存热但依然慢"的步(1/4 命中 84.8% 仍耗时 27.8s、输出仅 92 token;1/14 命中 98.9% 耗时 36.7s),
所以这个 issue 主要针对"请求体构造是否触发前缀缓存失效",并不声称解释了全部延迟。
复现方法
解压 ~/.dsh/sessions/**/session.v4.jsonl.zstd,逐条读取 assistant/message 事件里的 usage.cacheReadTokens / usage.inputTokens
(注意 inputTokens 是未缓存部分)。
先叠个甲
我是一个学生,这是我第一次在Github上发issues,以下内容和调研过程基本都是由AI完成的,内容大部分我也看不太懂,如果有任何不合适的地方或者错误请宽容一下,谢谢🌹🌹,如果需要更详细的数据随时联系我
环境
现象
同一会话内,cacheReadTokens 会间歇性掉回 ~6,144(量级与"系统提示 + 26 个工具 schema"这段共享静态前缀相当),
此时未缓存输入达 2.1–3.2 万 token,需要重新预填充;该步耗时从热缓存时的 5–7 秒涨到 20–100 秒。
一个 14 步的会话里出现 4 次。
数据(session 370f0615,14 步,最大提示 46,865 tok,失败尝试 0 次、引擎重试 0 次)
同账号同模型的对照:官方 CLI 1.65.2 连跑 60 次调用,累计 10,083,417 提示 token、命中 9,779,712(97.0%),
稳态 99.7–99.9%,全程只有 1 次掉到 3.4%。插件侧同期三个会话分别是 68.2% / 85.6% / 91.7%。
已排除(附证据)
怀疑点
且 system 以分节数组发送(systemSections)。插件这两项都没有发送。
并在 CLI 0.33.0 修复,修复说明为 "dynamic prefix cache thrashing by relocating volatile dynamic context block",
官方称可省 2.9x–21x 成本。插件是自己拼请求体,可能没有继承这个"易变内容块位置"的修复。
请求
另外插件目前不持久化 provider 侧的 trace/generation ID(dsh 会话日志里 generationId /
providerRequestId / x-trace-id / promptCacheHitTokens 均为 0 处),而官方 CLI 会把 traceIds
写进 ~/.commandcode/projects/.meta.json。有 ID 服务端才能定位到具体请求。
补充说明(诚实起见)
本会话也存在"缓存热但依然慢"的步(1/4 命中 84.8% 仍耗时 27.8s、输出仅 92 token;1/14 命中 98.9% 耗时 36.7s),
所以这个 issue 主要针对"请求体构造是否触发前缀缓存失效",并不声称解释了全部延迟。
复现方法
解压 ~/.dsh/sessions/**/session.v4.jsonl.zstd,逐条读取 assistant/message 事件里的 usage.cacheReadTokens / usage.inputTokens
(注意 inputTokens 是未缓存部分)。