Skip to content

multi2api v1.9.20

Choose a tag to compare

@Practice019 Practice019 released this 21 Oct 13:49
· 75 commits to master since this release

v1.9.20

workbuddy-intl(国际版)通了。 17 个账号之前的错误全是假象:账号、token、额度、网络都没问题,
卡在上游 2026-10 新增的渠道校验上。


之前的错误

503 no_healthy_account
  "all accounts unavailable (cooling/disabled) —— 17 个账号:0 禁用、0 冷却、0 个在途"
上游真实响应:400 / code 11128 / 「这次调用没通过渠道校验,可能不是官方客户端发出的」

缺的是什么(逐层实测)

加了什么 结果
现状(Authorization + X-User-Id + X-Domain) 400 / 11128
+ UA WorkBuddy/5.8.4 workbuddy-ai/5.8.4 CLI/2.161.0 + X-IDE-Version: 5.8.4 仍 11128
+ 会话头族 + 身份头 + 链路头 仍 11128,但 msg 变成 first message is not system prompt
+ 第一条消息用 system 200 + SSE

判据与取值来自 aimod-cc/Agent2API 的抓包结论
(core/endpoints.rs 的 EDITION_INTL + providers/workbuddy/adapter.rs 的 chat_headers)。

顺带排除了三个此前被怀疑的方向:TLS 指纹(用 Chrome/Chromium 指纹照样 11128)、
Turing 设备令牌(加与不加一样)、网络/代理(直连 200)。

改了什么

新增 internal/upstream/intl_identity.go:

  • IsIntlDomain(domain) —— 按域名判(不用 channel 字段:它可能为空,domain 才是真正要打的主机)
  • ApplyIntlChatHeaders —— 一次补齐三层:客户端身份头、会话头族、链路头;
    会话 id 每次请求新生成(UUID 带连字符 + 32 位 hex),-Request-ID 与 -Root-Request-ID 同值
  • EnsureSystemFirst —— 首条不是 system/developer 就插一条默认 system;
    用 map[string]json.RawMessage 只重写 messages,其它字段(tool_calls / response_format /
    stream_options)原样保留

接入两处:ChatHeaders 末尾(按 domain 分支)、ChatStreamWithIP 开头(补 system)。
国内(www.codebuddy.cn / copilot.tencent.com)一个字节都没改 —— 它没有这层校验。

判据

  • intl_identity_test.go 4 条:头齐全、会话 id 形态与唯一性、域名判据、system 首条与不改写既有 body
  • go test ./internal/upstream ./internal/server 全绿
  • 真机:起隔离实例(复制那 17 个 intl 账号)→ workbuddy-intl/deepseek-v4.1-flash →
    200,内容 pong,1552ms

升级提示

改的是服务端出站请求,必须重启进程。重启后 intl 的 17 个账号立刻可用,不需要重新登录或重配。