HRouter

Codex 常见报错:exceeded retry limit、provider 配置、auth.json

这一页汇总 Codex 接入 HRouter 时最常见的几类问题:重试耗尽、provider 配置错误、找不到 Key、长对话不压缩、模型不可用。Codex 的配置写在 config.toml 和 auth.json 两个文件里,大部分问题是其中某一项写错了。

安装和配置步骤见 Codex 安装与配置。

“exceeded retry limit, last status: 429”

Codex 遇到失败会自动重试,多次仍失败后只显示最后一个状态码,不显示原因。这个 429 不一定是限流,真正的原因在响应内容里。用 curl 直接请求一次,看返回的错误码:

curl -i https://hrouter.net/v1/responses \
  -H "Authorization: Bearer $HROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"model\": \"$HROUTER_MODEL\", \"input\": \"你好\"}"
错误码 去看
API_KEY_QUOTA_EXHAUSTED、USAGE_LIMIT_EXCEEDED、限流 429 限流与额度
INSUFFICIENT_BALANCE 余额不足
model_not_found(404) model_not_found

provider 配置错误

提示 provider 不存在、找不到 provider,或者一直在要求选择登录方式,检查 config.toml:

  1. model_provider = "hrouter" 必须和 [model_providers.hrouter] 的节名完全一致,包括大小写。
  2. 节里要有 base_url = "https://hrouter.net/v1" 和 wire_api = "responses"。
  3. 文件格式是 TOML,字符串用半角双引号,粘贴时注意别被替换成中文引号。

正确的完整示例见 Codex 安装与配置。

提示找不到 API Key

Key 写在 ~/.codex/auth.json(Windows 是 C:\Users\你的用户名\.codex\auth.json),不是环境变量:

{
  "OPENAI_API_KEY": "sk-xxxxx"
}
  • 键名必须是 OPENAI_API_KEY。
  • 文件必须是合法 JSON:不能有多余的逗号,不能有注释。
  • config.toml 里要有 requires_openai_auth = true。

长对话没有触发自动压缩

provider 的 name 必须精确是 OpenAI,大小写敏感:

[model_providers.hrouter]
name = "OpenAI"

写成 openai、HRouter 或别的值,Codex 就不会尝试远程压缩。同时检查 model_context_window 和 model_auto_compact_token_limit 是否设置合理。

走错接口或协议

  • wire_api 必须是 "responses",不要改成 chat。
  • base_url 必须带 /v1:https://hrouter.net/v1;不要再写 /responses。见 API 404 报错。
  • 只有聊天正常,代理类任务失败:优先怀疑没有走 Responses API。

模型不可用

换成当前 Key 返回的 Codex 模型:

  1. 查询模型列表,见 查询可用模型。
  2. 修改 config.toml 里的 model。
  3. 用 HRouter Desktop 的话,编辑配置后重新点击“识别 Key”,保存新的模型绑定。

配置改了不生效

重新打开终端,重新启动 codex;多个位置配置冲突时只保留一处,见 配置不生效怎么排查。

在 VSCode、JetBrains 里不可用

先确认终端里直接运行 codex 正常,见 Codex VSCode 和 Codex JetBrains。

自检清单

  1. codex --version 能输出版本号。
  2. ~/.codex/config.toml 里 provider 的 name、base_url、wire_api 三项正确。
  3. ~/.codex/auth.json 是合法 JSON,键名是 OPENAI_API_KEY。
  4. curl https://hrouter.net/v1/models -H "Authorization: Bearer $你的Key" 返回 200,且列表里有你配置的模型。
  5. 发一句测试消息,在 使用记录 能看到请求。