Skip to content

[Bug] 会话中途 cacheReadTokens 反复回落到 ~6,144(只剩静态前缀),2–3 万 token 被重新预填充 #64

Description

@smartxm

先叠个甲

我是一个学生,这是我第一次在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%。

已排除(附证据)

  1. 网络/代理:流式正常(单请求 1000+ 事件、最大事件间隔 2.1s),本会话 0 次 TRANSPORT/连接错误
  2. 超时与重试:上表这些慢步的失败尝试和引擎重试均为 0
  3. 会话标识:做过 A/B(随机 threadId vs 固定 threadId + x-session-id),两者缓存行为一致
  4. 统计口径:确认 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 成本。插件是自己拼请求体,可能没有继承这个"易变内容块位置"的修复。

请求

  1. 对比插件与 CLI ≥0.33.0 的请求体布局(尤其易变/动态内容落在哪个字段、哪个位置),确认是否会把前缀切开
  2. 考虑像 CLI 一样发送 promptCache / permissionMode
  3. 为请求体/响应元数据增加抓取开关(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 是未缓存部分)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions