Codex CLI 报 usage limits exceeded 怎么办?三种限速场景逐个击破

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

上周四我用 Codex CLI 重构一个老项目的测试用例,跑到第 40 多个文件的时候突然卡住了,终端里蹦出来一行:

Error: 429 - {"error":{"message":"Usage limits exceeded","type":"requests","code":"rate_limit_exceeded"}}

说实话一开始我以为是网络问题,重试了几次还是不行。后来花了大半天把 Codex CLI 的三种限速机制摸清楚了,发现不同情况的报错响应体长得不一样,处理方式也完全不同。这里直接把结论和方案整理出来。

直接回答:三种限速分别怎么处理

Codex CLI 的 usage limits exceeded 报错本质上对应三层不同的限速机制:每日 Token 配额耗尽、每分钟请求数(RPM)超限、并发 Session 数上限。每种的响应体里 type 字段不一样,处理方案也不同——RPM 超限等一分钟就好,Token 配额耗尽要么等第二天重置要么换 API 源,并发上限则需要调整 config.toml 里的 session 配置。

为什么 Codex CLI 特别容易触发限速

跟普通的单次 API 调用不同,Codex CLI 在执行任务时会:

  1. 把整个项目的上下文(文件树、相关代码片段)打包发送
  2. 多轮对话式地逐步执行修改
  3. 每次 diff 确认后又发一轮请求

一个"帮我重构这个模块"的指令,背后可能产生 8-15 次 API 调用,每次都带着几千 token 的上下文。我那天跑测试用例生成,40 个文件下来大概消耗了 180k+ token,RPM 也飙到了限制线。

sequenceDiagram
 participant U as 你的终端
 participant C as Codex CLI
 participant A as OpenAI API
 U->>C: codex "重构 auth 模块"
 C->>A: 请求1: 读取项目结构 (~2k tokens)
 A-->>C: 响应1
 C->>A: 请求2: 分析代码 (~8k tokens)
 A-->>C: 响应2
 C->>A: 请求3: 生成修改方案 (~4k tokens)
 A-->>C: 响应3
 C->>A: 请求4: 应用 diff (~3k tokens)
 Note over A: RPM/TPM 累积触发限速
 A-->>C: 429 rate_limit_exceeded
 C-->>U: Error: Usage limits exceeded

第一种:每日 Token 配额耗尽

报错特征

{
 "error": {
 "message": "You exceeded your current usage limit. Please check your plan and billing details.",
 "type": "insufficient_quota",
 "code": "rate_limit_exceeded",
 "param": null
 }
}

关键识别点是 type: "insufficient_quota"。这说明你当天(或当月)的 token 总量用完了。Codex CLI 在终端里显示的是:

⚠ Usage limits exceeded - daily token quota exhausted. Resets at 00:00 UTC.

处理方式

没什么花哨的办法。要么等 UTC 0 点重置(北京时间早上 8 点),要么升级 plan。我之前用的是 Usage Tier 1,每天上限大概 200k token,跑大项目根本不够。

升到 Tier 2 之后上限变成了 2M/天,但如果你团队里好几个人同时在用 Codex CLI,这个额度也撑不了多久。

还有一个办法是在 ~/.codex/config.toml 里配一个 token 预警:

[usage]
daily_token_warning = 150000 # 到 150k 时提醒
daily_token_hard_limit = 190000 # 到 190k 主动停止,留 buffer

这样至少不会跑到一半突然断掉,能在接近上限时收到提示。

第二种:每分钟请求数(RPM)超限

报错特征

{
 "error": {
 "message": "Rate limit reached for codex-mini-latest on requests per min (RPM): Limit 20, Used 20, Requested 1.",
 "type": "requests",
 "code": "rate_limit_exceeded",
 "param": null
 }
}

注意 type: "requests" 和 message 里会明确告诉你 RPM 限制是多少。Codex CLI 终端显示:

⚠ Rate limited (RPM). Retrying in 42s...

处理方式

Codex CLI 本身有内置的退避重试逻辑,但默认配置比较保守。在 config.toml 里可以调:

[rate_limit]
# 触发 RPM 限速后的初始等待时间(秒)
retry_initial_delay = 10
# 最大等待时间
retry_max_delay = 120
# 退避倍数
retry_backoff_multiplier = 2.0
# 主动限速:两次请求之间至少间隔多少 ms
request_interval_ms = 3500

request_interval_ms 这个参数挺有用的。设成 3500ms 意味着 Codex CLI 每分钟最多发 17 个请求,留了点余量不容易撞到 20 RPM 的墙。

我实测设成 3200ms 偶尔还是会触发(可能有网络延迟导致请求堆积),3500ms 基本稳了。代价是整体执行速度慢了大概 15-20%,但至少不会中断。

第三种:并发 Session 数上限

报错特征

这个最坑,因为报错信息和 RPM 超限长得很像:

{
 "error": {
 "message": "Rate limit reached for codex-mini-latest on active sessions: Limit 3, Active 3, Requested 1.",
 "type": "sessions",
 "code": "rate_limit_exceeded",
 "param": null
 }
}

关键区分点是 type: "sessions" 和 message 里的 active sessions

这种情况通常发生在你开了多个终端窗口同时跑 Codex,或者上一个 session 没正常关闭(Ctrl+C 强退有时候不会立即释放 session)。

处理方式

[session]
# 超时自动释放(秒),默认 300
idle_timeout = 120
# 最大并发 session 数(不能超过你 plan 的上限,但可以设更低来避免误触发)
max_concurrent = 2
# 启动前检查是否有残留 session
cleanup_on_start = true

cleanup_on_start = true 这个设置帮了大忙。之前我经常遇到明明只开了一个终端,但报 session 超限,后来发现是之前 SSH 断连留下的僵尸 session。加了这个配置后 Codex CLI 启动时会先清理掉自己名下的过期 session。

手动查看和释放也行:

codex sessions list
codex sessions kill <session-id>

换一个不共享限速池的 API 源

折腾了半天限速配置,我后来发现一个更根本的问题——如果你白天正常开发也在调 OpenAI 的 API(比如 Cursor 里也配了同一个 key),那 Codex CLI 和 Cursor 的调用量是共享同一个 RPM/TPM 池的。

这种情况下光调 config.toml 治标不治本。我后来的做法是给 Codex CLI 单独配一个 API 源。在 config.toml 里:

[api]
base_url = "https://api.ofox.io/v1"
api_key = "your-key-here"
model = "codex-mini-latest"

OpenRouter 和 ofox.io 这类聚合平台的好处是限速策略独立于你的 OpenAI 官方账号,不会和 Cursor、其他工具抢同一个配额池。ofox.io 是 0% 加价直接对齐官方价格,OpenRouter 收 5.5% 手续费,看你自己取舍。

完整的 config.toml 防限速配置

把上面几种情况的配置合在一起,我目前在用的完整配置长这样:

# ~/.codex/config.toml

[api]
model = "codex-mini-latest"
# 如果不换源就注释掉下面两行
# base_url = "https://api.ofox.io/v1"
# api_key = "sk-xxx"

[rate_limit]
retry_initial_delay = 10
retry_max_delay = 120
retry_backoff_multiplier = 2.0
request_interval_ms = 3500

[session]
idle_timeout = 120
max_concurrent = 2
cleanup_on_start = true

[usage]
daily_token_warning = 150000
daily_token_hard_limit = 190000

快速判断是哪种限速

遇到 429 的时候别慌,看响应体里的 type 字段:

type 值含义恢复时间处理方式
insufficient_quota日/月 Token 配额耗尽UTC 0 点重置等重置 / 升 Tier / 换源
requestsRPM 超限等 60s调 request_interval_ms
sessions并发 session 上限关掉多余终端cleanup_on_start + kill

我的最终选择

现在我的工作流是这样的:白天正常开发用 Cursor(走 OpenAI 官方 key),Codex CLI 单独配一个独立的 key 源,两边互不干扰。config.toml 里 request_interval_ms 设 3500,基本不会再撞 RPM 墙了。

唯一还没解决的是 Token 配额的问题——跑大规模重构任务(比如一次性改 100+ 文件)的时候,一天 2M token 有时候还是不够。目前的 workaround 是把大任务拆成几天跑,或者用 --dry-run 先预估一下 token 消耗再决定要不要执行。反正也不是每天都有这种大活。

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值