Skip to content

[Bug] Coding Plan 5 小时限额打满后静默切到 Start Plan 档位继续调用;配置里套餐档位自相矛盾,模型选择落库报外键错误(v3.14.3 桌面版) #864

Description

@DOIT-Ben

Coding Plan 5 小时限额打满后静默切到 Start Plan 档位;配置里套餐档位自相矛盾,且模型选择写入数据库失败(v3.14.3 桌面版)

摘要

使用 BigModel Coding Plan 跑 GLM-5.3-Flash 时,5 小时限额打满(HTTP 429,错误码 1308)后,客户端在 6 秒内把请求切到 account:bigmodel-start-plan 继续跑,全程没有提示,也没有询问是否允许换档。同一时刻设置文件里两个键对"用哪个套餐"的说法互相矛盾。

我需要官方确认的是:切到 Start Plan 之后的调用,走的是哪套计费? 本机日志只有 token 用量,没有金额字段,我无法自证是否产生了套餐外扣费。这也是我提这个 issue 的直接原因。

另外发现一个独立的写入缺陷:session.model_selection.persist_failed 报 FOREIGN KEY constraint failed,一晚上出现 22 次,用户的模型选择没能落库。

环境

  • ZCode 桌面版 3.14.3(ZCODE_APP_VERSION=3.14.3,ZCODE_BUILD_COMMIT_ID=ab4d5e6b,win32 x64)
  • Windows 11,时区 Asia/Shanghai
  • 账号:BigModel Coding Plan(个人版),模型 GLM-5.3-Flash
  • 时间:2026-09-28 晚 ~ 09-29 00:14(北京时间)

一、静默切换档位

时间线(北京时间,日志原文时间戳已转本地时区)

09-28 22:45:35  model.request.failed  HTTP 429
                [1308][已达到 5 小时的使用上限。您的限额将在 2026-09-29 02:28:02 重置。]
                provider = account:bigmodel-individual-coding-plan

09-28 22:46:11  继续用 new-provider-4 / deepseek-v4.1-flash
09-28 22:46:13  继续用 account:bigmodel-individual-coding-plan / GLM-5.3-Flash(又通了)

09-29 00:13:59  model.request.failed  HTTP 429
                [1308][已达到 5 小时的使用上限。您的限额将在 2026-09-29 03:46:12 重置。]
                provider = account:bigmodel-individual-coding-plan

09-29 00:14:05  model.request.completed
                provider = account:bigmodel-start-plan   ← 6 秒后换了档位
                model    = GLM-5.3-Flash
                端点     = https://zcode.z.ai/api/v1/zcode-plan/anthropic
09-29 00:14:05 / 00:14:14  又 4 次成功

关键点:00:13:59 的报错明确说限额要到 03:46 才重置,但 6 秒后就有 GLM-5.3-Flash 请求成功了 —— 因为客户端把请求发到了 Start Plan(另一个档位),而不是等待原套餐限额恢复。

为什么这值得关注

按源码里的定义,这是两个不同的套餐档位,不是同一个池子:

  • account:bigmodel-individual-coding-plan → BigModel 个人版 Coding Plan,端点 https://open.bigmodel.cn/api/anthropic
  • account:bigmodel-start-plan → Start Plan,端点 https://zcode.z.ai/api/v1/zcode-plan/anthropic

config/provider/zcode-builtin.json 里两者的 access.mode 分别是 individual-coding-plan 和 start-plan。

需要官方确认:限额打满后自动换档,是设计行为还是缺陷?换档后的调用按哪套计费?

期望行为

  1. 限额打满后不要自动切到另一个档位;应该停下并提示用户("5 小时限额已满,02:28 恢复,是否改用其他档位/供应商?")。
  2. 如果确实要自动切换,必须在界面上明确告知切换到了哪个档位、按什么计费。
  3. 提供按档位/渠道的用量明细,让用户能自查有没有套餐外消耗。

二、设置文件里套餐档位自相矛盾

同一份 setting.json 里两个键对 bigmodel 家族指向不同档位:

"providerFamilyConnectionSelections": {
  "zai":      { "kind": "individual-coding-plan" },
  "bigmodel": { "kind": "individual-coding-plan" }
},
"modelProviderFamilySelectedKeys": {
  "zai":      "coding-plan:builtin:zai-coding-plan",
  "bigmodel": "coding-plan:builtin:bigmodel-start-plan"
}

connectionSelections.bigmodel 说 individual-coding-plan,selectedKeys.bigmodel 却说 start-plan。两个键描述的是同一件事,取值不一致。

对照 zai 家族:connectionSelections.zai = individual-coding-plan 与 selectedKeys.zai = coding-plan:builtin:zai-coding-plan 是一致的。只有 bigmodel 家族对不上。

coding-plan-cache.json 里几个档位的状态也都是不可用:

"builtin:zai-start-plan":          { "status": "available" },
"builtin:zai-coding-plan":         { "status": "unavailable", "reason": "coding_plan_not_entitled" },
"builtin:bigmodel-coding-plan":    { "status": "unavailable", "reason": "coding_plan_not_connected" },
"builtin:bigmodel-start-plan":     { "status": "unavailable", "reason": "coding_plan_not_authenticated" }

需要官方确认:当这两个键不一致时,客户端以哪个为准?这会不会就是上面"限额满了自动切档"的根因?

三、模型选择写入数据库失败(22 次)

一晚上出现 22 条 session.model_selection.persist_failed,全部是同一个错误:

{"event":"session.model_selection.persist_failed","level":"warn",
 "context":{"error":"FOREIGN KEY constraint failed","modelId":"glm-5.3","providerId":"new-provider-4"}}

时间分布(北京时间):00:25(8 次)、12:06(2 次)、20:49(2 次)、21:08(2 次)、21:18(4 次)、21:32(4 次)、22:12(2 次)、22:29(2 次)、22:52(2 次)、22:53(2 次)、23:18(2 次)、23:20(2 次)、23:35(2 次)。

涉及 new-provider-4、new-provider-2、new-provider、aad839c6-...、opencode-zen-chat 以及官方 account:bigmodel-individual-coding-plan。

同一次切换里,session.model.updated 成功了,但落库失败:

{"event":"session.model.updated","context":{"model":"new-provider-4/glm-5.3",
 "previousModel":"account:bigmodel-individual-coding-plan/GLM-5.3"}}
{"event":"session.model_selection.persist_failed","context":{"error":"FOREIGN KEY constraint failed",
 "modelId":"glm-5.3","providerId":"new-provider-4"}}

影响:用户选的模型没能存进数据库。重启后会话可能回到旧模型,而用户以为已经改过了 —— 这个体感很像"我明明切了模型,怎么还在用另一个"。怀疑与 session-store 的 provider 外键约束有关(provider 记录先于 selection 写入,或自定义 provider 未在引用表登记)。

复现步骤

  1. 用 BigModel Coding Plan(个人版)跑 GLM-5.3-Flash,把 5 小时限额打满。
  2. 观察限额报错(HTTP 429 / 1308)之后是否有请求继续成功。
  3. 检查 setting.json 里 providerFamilyConnectionSelections.bigmodel 与 modelProviderFamilySelectedKeys.bigmodel 是否指向同一档位。
  4. 反复切换模型,检查日志里是否出现 session.model_selection.persist_failed。

实际结果:限额满后 6 秒切到 Start Plan 并成功;两个配置键不一致;模型选择落库报外键错误。

期望结果:限额满后停下并提示;两个配置键语义一致;模型选择能正常持久化,失败时在界面报错而不是只写 warn 日志。

证据

以上全部来自本机宿主日志 ~/.zcode/cli/log/zcode-2026-09-28.jsonl、zcode-2026-09-29.jsonl,以及 ~/.zcode/v2/setting.json、~/.zcode/v2/coding-plan-cache.json。已脱敏:会话正文、API key、供应商真实名称均未包含(自定义 provider 保留原始标识符以便定位)。

如果需要,我可以补上完整的原始日志片段或导出相关时间窗。

补充说明

我无法从本机日志确认是否真的产生了扣费 —— 日志里只有 usageInputTokens / usageOutputTokens 这类 token 计数,没有金额或计费渠道字段。所以我把问题收敛成可验证的三条,计费部分请官方结合账号后台核实。如果第一条"限额满后切档"按设计就是不计费的降级兜底,请说明;如果是计费行为,希望补上明确提示。

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions