Skip to content

fix: 把 magpie 的模型 id 换回上游原值,否则国际站全部 403(0.2.39) - #4

Merged
MYCF711 merged 1 commit into
mainfrom
fix/loader-model-map
Nov 3, 2026
Merged

MYCF711 merged 1 commit into
mainfrom
fix/loader-model-map

Conversation

@MYCF711

@MYCF711 MYCF711 commented Nov 3, 2026

Copy link
Copy Markdown
Owner

现象

国际站 2 条模型全部 403 Forbidden。

取证(直连上游,同一份凭据)

发给上游的 model 结果
monkeycode-basic/deepseek-flash 200
monkeycode-basic-deepseek-flash(slug) 403 Forbidden
<uuid> 403 Forbidden
deepseek-flash(裸名) 403 Forbidden

根因

magpie 构造上游请求时用的是:

api: { id: m.id ?? was?.api.id ?? key }   // m 是插件 config 返回的模型条目

—— 它拿我们返回的 id(斜杠被压成连字符),config 里给的 api.id 被无视。
而模型 id 又不能带斜杠:magpie 会把 <a>/<b> 读成 provider 边界,长出
monkeycode-basic / monkeycode-pro / monkeycode-ultra 三个不存在的供应商。

修法

在自己的 loader.fetch 里换回来:读目录缓存拿 id → apiId,把请求体里的
model 从 magpie 的 id 换回平台原值,再补 system、再按最终 body 算签名。

测试(新增 4 条)

  • magpie 的 id 被换回原值
  • 已经是原值时幂等
  • 目录里没有的 model 原样放行
  • 改完 model 后补 system 且签名头存在
node --test → 246 pass / 0 fail
node scripts/check.mjs → 49 通过 · 0 失败

真机:国际站 2 条模型全部 403 Forbidden。直连上游实测同一份凭据、同一个模型:
  monkeycode-basic/deepseek-flash       -> 200
  monkeycode-basic-deepseek-flash slug  -> 403 Forbidden
  UUID / 裸名 deepseek-flash            -> 403 Forbidden

根因在 magpie:它用 `api: { id: m.id ?? was?.api.id ?? key }` —— 我们返回的 `id`
(斜杠压成连字符),config 里的 `api.id` 被无视。而模型 id 又不能带斜杠(会被当
provider 边界)。所以只能在 loader.fetch 里换回来:读目录缓存的 id -> apiId 映射,
改请求体的 model,再补 system、再算签名。

- 新增 tests/loader-model-map.test.mjs 锁住改写 + 幂等 + 未知 model 放行 + 签名
@MYCF711
MYCF711 merged commit 735655b into main Nov 3, 2026
4 checks passed
@MYCF711
MYCF711 deleted the fix/loader-model-map branch November 3, 2026 23:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant