先看现象。按示例调 chatcompletion_v2,HTTP 状态是 200,但返回体里 base_resp.status_code 是 1004,message 为鉴权失败,文档只说需要 GroupId 却没写位置。

原因不止一个,得分开看。GroupId 要作为 URL 查询参数而不是请求头。还有一种是API Key 与 GroupId 属于不同账号,混用了。

还有一种情况,请求头里多了空格导致 token 解析失败。

另外,代理层改写了 query 参数,GroupId 被丢掉。

动手时先把 GroupId 拼到 URL 上再请求

curl "https://api.minimax.chat/v1/text/chatcompletion_v2?GroupId=$GROUP_ID" -H "Authorization: Bearer $MINIMAX_KEY" -H 'Content-Type: application/json' -d '{"model":"abab6.5s-chat","messages":[{"role":"user","content":"hi"}]}'

接着打印返回体里的 base_resp 看具体错误码

print(resp['base_resp'])

再往下确认 key 与 GroupId 来自同一个账号

python -c "print(len(os.getenv('MINIMAX_KEY')))"

封装层统一补 GroupId,避免各处漏写

params = {'GroupId': GROUP_ID}

同一份数据我导出了两份,一份留底,一份拿来试。

这类问题以前遇到过,但这次的触发条件和上次不一样。

恢复的判定其实很直接。base_resp.status_code 变成 0,choices 里有正常回复,不再提示鉴权失败,日志里也能看到正确的 GroupId。

这类接口即使鉴权失败也返回 HTTP 200,业务错误藏在 base_resp 里,只看状态码会把失败当成功,务必解析业务码。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189