Skip to content

v1.7.7 — 别再让你为了一个「等一会儿」去重新登录

Choose a tag to compare

@XDTrees XDTrees released this 01 Oct 07:09
· 51 commits to main since this release

报错说「API 密钥无效」,于是你跑去重新登录 —— 但密钥根本没问题,只是那个模型暂时限流了。

问题一:限流被说成了「密钥无效」

你会看到:国际版用 hy4 时,偶尔弹出「API 密钥无效」。你重新登录、换账号,都不一定管用。

为什么:看日志就清楚了(时间连着三行):

14:50:22  qingche526  rate-limited on hy4-preview-f  → cooling + rotating
14:50:23  aosi526     rate-limited on hy4-preview-f  → cooling + rotating
14:50:25  401: "no WorkBuddy credential found; sign in on the desktop app"

两个账号的 hy4-preview-f 都被限流冷却了(一小时),于是池子里暂时没有可用账号。可插件判断「有没有被限流」用的是本次请求内的临时记录 —— 上次请求造成的冷却,它看不见。于是它以为「一个账号都没有 → 你没登录」→ 报 401。

DSH 把 401 显示成「API 密钥无效」。你被派去修一个根本没坏的东西。

怎么修的:不再靠本次请求的临时记录猜,而是直接问账号池「为什么现在没有可用账号」,然后按真实原因报对应的错:

真实情况 以前 现在
模型限流中 401 密钥无效 429 该模型限流中(等一会儿即可)
账号全被关/移出 401 密钥无效 403 账号全部已关闭(去卡片打开)
积分低于保留线 401 密钥无效 402 积分不足
确实没登录 401 401(这个才是对的)

四种情况需要完全相反的处理,以前却都推给你「重新登录」。现在只有真的该重新登录时才这么说。

问题二:上下文「压缩」把目标设得比原文还大

日志里抓到的:

context overrun on deepseek-v4.1-flash (~791793 tokens); compacting to ~797952
                                  ↑ 原文 79.1 万                    ↑ 目标 79.7 万

压缩目标比要压缩的东西还大 —— 等于什么都没压,重试当然又超限。而日志看起来还挺像"我处理过了"。

为什么:目标值是按目录里写的窗口算的(deepseek-v4.1-flash 标称 1M),取 80% → 797952。但标称 1M 是宣传值,不是真实生效上限 —— 否则它就不会被拒了。

怎么修的:正在超限的那个请求本身就是证据。既然它太大了,目标就必须明显小于它。现在取「按窗口算」和「按原文一半」的较小值:

原文 791793 → 目标 395896      (真正压掉一半)

顺便:这类报错终于有线索了

上游的 model_param_invalid 里 param 字段是空的 —— 它只说「参数不符合要求」,不说是哪个参数。你之前贴的那条 11133 就是这样,等于没有线索。

现在遇到 400 时,日志会记下请求的形状(顶层参数名、各角色的消息条数、工具数量、内容字符数):

rejected the request as invalid (model deepseek-v4.1-flash) —
keys=[max_tokens messages model reasoning_effort stream temperature tool_choice tools top_k top_p]
messages=122 (system:1 user:61 assistant:30 tool:30) tools=77 contentChars=481233

只有形状,没有内容(对话是你的,不该进日志)。下次再遇到,日志里就能看出是哪个参数/哪个维度不对。

我排查时的事

我一开始想直接复现 11133,试了:采样参数(top_k/repetition_penalty/temperature/top_p)、推理档位(minimal 到 max,还试了无效档位)、各种消息形状(回放 reasoning_content、工具调用链)、消息数量(最多 362 条)、77 个工具 + 长会话、超长 prompt ——国内版和国际版全部返回 200。

我没能复现它,所以没有针对 11133 写"修复"(那会是猜测)。改的都是从日志里坐实的问题:那两个是确凿的。这个 11133 加上刚加的形状日志,下次出现时就能定位了。

验证

  • 类型检查全绿,测试 325 项全绿(+12)。
  • 新增 tests/pool-availability.test.ts(7 项):池能正确区分「无人登录 / 模型限流 / 账号全关 / 积分保留 / 可用」、限流时返回 429 且文案不含「sign in」、真没登录时仍是 401、不把另一个 region 的账号算进来、过期冷却自动视为可用。
  • 新增 tests/context-budget-budget.test.ts(5 项):目录窗口远大于原文时目标必须更小(用日志里那组真实数字)、窗口未知时减半、窗口小于原文时也不放大、目标不为零。
  • 反向验证:把 429 分支禁用、退回原来的 401 → 测试变红。