Repository navigation
v1.7.7 — 别再让你为了一个「等一会儿」去重新登录
报错说「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 → 测试变红。