Codex invalid_request_error 请求错误解决教程

这个错误一般出现在接入 Codex 接口、在 Cursor/VS Code 插件里配置 Codex 能力,或者自己用脚本调用代码生成接口时。表面上看只是返回了 invalid_request_error,但真正原因通常藏在响应体里的 message、请求参数和模型名称里。排查时不要先怀疑网络,先把完整请求和完整返回打印出来。

一、常见错误现象

典型返回大概是下面这种:

### token云桥中转 0029.org ###
{
  "error": {
    "message": "Invalid request: ...",
    "type": "invalid_request_error",
    "param": "model",
    "code": null
  }
}

也可能是命令行里只看到一行:

Error: 400 invalid_request_error

如果是在插件里遇到,常见表现是:代码补全没有结果、生成代码失败、聊天窗口提示请求错误、日志里出现 400。这里要注意,invalid_request_error 多数是“请求格式或参数不合法”,不是服务端宕机,也不是单纯的 key 失效。

二、先判断是哪一类原因

1. 模型名称写错或接口不匹配

最常见的是模型名和接口路径不对应。例如你用的是 chat/completions 风格的接口,却传了不支持该接口的模型;或者把旧项目里的模型名直接复制过来,平台已经不支持。

建议先检查配置文件里的模型名:

cat .env
cat config.json

重点看这些字段:

  • OPENAI_MODELMODEL_NAME 是否拼写正确
  • base_url 是否和当前平台文档一致
  • 插件里是否同时配置了多个 provider,实际走的不是你以为的那个

2. 请求体字段写错

很多人会把不同接口的参数混用,比如把 promptmessagesinput 混在一起。Codex 相关场景经常涉及代码上下文,字段稍微不对就会直接 400。

可以用最小请求先测,不要一上来带一堆上下文:

curl -s -X POST "$BASE_URL/v1/chat/completions" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "你的模型名",
    "messages": [
      {"role": "user", "content": "用 Python 写一个 hello world"}
    ]
  }'

如果最小请求能通,说明 key、base_url、模型大概率没问题,错误在你原来的参数里。

3. JSON 格式不合法

手写 curl 时经常出现引号、换行、逗号问题。特别是把代码片段塞进 JSON 字符串,里面有双引号、反斜杠、换行,很容易把 JSON 破坏掉。

可以先把请求体保存成文件,再用工具校验:

cat request.json | jq .

如果 jq 都解析不了,就不用继续查接口了,先修 JSON。

4. 参数超过限制

Codex 类请求经常会把整个文件、diff、报错日志都塞进去,导致上下文过长。部分平台会返回上下文超限,也可能归到 invalid_request_error

排查方法很简单:把输入缩到 10 行以内测试。如果短文本能成功,长文本失败,就要做裁剪:

  • 只传相关函数,不要传整个仓库文件
  • 日志只保留最后一段异常栈
  • diff 太大时按文件分批提交
  • 减少 system prompt 里的冗余说明

三、按顺序修复

步骤 1:打印完整响应

不要只看封装库抛出的异常。Node.js 项目可以临时这样打印:

try {
  const result = await client.chat.completions.create(payload);
  console.log(result);
} catch (err) {
  console.error("status:", err.status);
  console.error("message:", err.message);
  console.error("response:", err.response?.data || err);
}

Python 项目也类似:

try:
    resp = client.chat.completions.create(**payload)
    print(resp)
except Exception as e:
    print("error:", repr(e))
    if hasattr(e, "response"):
        print(e.response.text)

先看 param 字段,如果它指向 modelmessagestemperature,基本就能缩小范围。

步骤 2:确认 base_url 和 API Key

如果你使用的是官方接口,就确认环境变量没有被旧配置覆盖;如果使用中转服务,也要确认路径兼容和模型映射。实际项目里,为了减少网络和额度方面的折腾,我会把测试环境接到 token云桥AI中转站 0029.org 这类中转站先跑通,再回到生产配置做对照,关键是方便区分“代码问题”和“通道问题”。

echo $OPENAI_API_KEY
echo $BASE_URL

注意不要在截图、日志、工单里暴露完整 key。排查时最多保留前后几位。

步骤 3:把请求降到最小

把原来的复杂 payload 暂时替换成最小请求。比如:

{
  "model": "你的模型名",
  "messages": [
    {
      "role": "user",
      "content": "解释一下 git rebase 的作用"
    }
  ]
}

如果这一步仍然报 invalid_request_error,重点查模型名、接口地址、鉴权方式。如果这一步成功,再逐个加回参数,例如 temperaturemax_tokens、上下文内容,直到复现错误。

步骤 4:检查数值参数范围

有些 SDK 不会提前校验参数,错误会直接由服务端返回。例如:

  • temperature 写成了字符串:"0.7"
  • max_tokens 写得过大
  • top_p 超出允许范围
  • messages 为空数组
  • role 写成了 assistant_user 之类的无效值

建议先去掉所有可选参数,只保留 modelmessages,确认成功后再加。

四、修复后的验证方式

修完不要只在插件里点一次“生成代码”就算结束,最好用命令行做一次稳定验证。

curl -i -X POST "$BASE_URL/v1/chat/completions" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d @request.json

重点看三点:

  • HTTP 状态码是否为 200
  • 返回体里是否有正常内容
  • 同一个请求连续执行 2 到 3 次是否稳定

如果命令行成功,但 IDE 插件失败,问题通常在插件配置:代理、base_url、模型字段、工作区环境变量。可以重启 IDE,或者删除插件缓存后再试。

五、避免再次踩坑

  • 把可用的最小请求保存成 request.json,以后出问题先用它对照。
  • 模型名不要散落在代码各处,统一放到环境变量或配置中心。
  • 上线前打印一次脱敏后的请求参数,尤其是 modelbase_url、输入长度。
  • 大段代码请求要做截断,不要无脑塞整个文件。
  • 升级 SDK 后重新跑一次最小请求,确认接口字段没有变化。

总结

Codex invalid_request_error 的排查思路很固定:先拿到完整错误,再检查模型名、接口路径、JSON 格式、参数范围和上下文长度。不要一开始就改一堆配置,先用最小请求验证通路,再逐项加回原来的参数,基本都能定位到具体问题。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐