1. 这个报错到底在说什么
第一次看到Selected model is at capacity. Please try a different model这条提示的人,多半是在终端里敲完命令、满怀期待地等着模型吐字,结果屏幕上冷不丁冒出这么一行英文。它不像语法错误那样有明确的文件行号,也不像网络超时那样直白,字面意思是"你选的这个模型已经满载了,请换一个模型试试"。很多人第一反应是:是不是我配置写错了?是不是账号出问题了?其实都不是,这条提示的核心信息非常单纯——你请求的那个模型,当前服务端的并发或配额已经打满了,暂时接不了新的请求。
我把它类比成去一家很火的餐厅吃饭。你拿着号排队,前台告诉你"今天这个招牌菜的备料用完了,您要不换个别的菜"。菜没问题,你也没问题,就是这道菜此刻供不应求。放到 codex 这类命令行 AI 编程助手的场景里,"招牌菜"就是你config.toml里指定的那个模型名,比如gpt-5.6-sol、gpt-6-astra这类。当同一时间大量用户都在调用同一个模型,服务端的容量池被占满,后来的请求就会被直接挡回来,并附上这句提示。
这条报错之所以让人头疼,是因为它不是本地错误。你在本地怎么改代码、怎么重装、怎么重启终端,都不会让服务端的容量凭空多出来。它属于典型的"上游限流"类问题,处理思路和本地配置错误完全是两条路。搞混了这一点,就会陷入反复折腾本地环境的死循环,白白浪费时间。
那这篇内容适合谁看?三类人最需要:一是刚装好 codex、还在摸索config.toml怎么配的新手;二是已经用了一段时间、突然某天开始频繁撞上这条提示的老用户;三是把 codex 接进自己工作流、需要保证稳定可用的重度使用者。不管你是哪一类,下面我会从原理、配置、排查到实操,把这条报错彻底拆开讲清楚,让你下次再看到它时,能三秒钟判断出该干什么。
2. 为什么偏偏是你撞上了这条提示
2.1 容量限制背后的真实机制
要理解这条报错,得先明白"容量"这个词在模型服务里指什么。模型服务端并不是一台无限算力的机器,它背后是一组有限的推理资源。每个模型(尤其是那些参数大、推理慢的旗舰模型)能同时处理的请求数是有限的,这个上限通常由几个因素共同决定:GPU 显存能塞下多少个并发会话、服务商的调度策略给单个模型分配了多少配额、以及当前时刻全局有多少人在抢同一份资源。
当并发请求数逼近这个上限,服务端有两种处理方式:一种是排队,让你的请求等着,等有资源了再处理;另一种是直接拒绝,返回一个明确的错误让你换模型。Selected model is at capacity属于后者,也就是快速失败策略。这种策略对服务端友好,能避免请求堆积导致雪崩,但对用户体验就不那么友好了——你拿到的是一个冷冰冰的拒绝,而不是一个"请稍候"。
这里有个容易被忽略的点:容量限制往往是按模型维度算的,不是按账号维度。也就是说,同一个账号,调用 A 模型可能畅通无阻,调用 B 模型却一直撞墙。这就解释了为什么很多人会困惑"我明明能用,怎么换个模型就不行了"。答案很简单,你换的那个模型正好是当前的热门款,大家都在挤。
2.2 高峰期与热门模型的叠加效应
容量打满不是随机发生的,它有明显的时间规律和模型偏好。从经验上看,工作日的白天(尤其是上午十点到下午四点这个区间)是调用高峰,因为大量开发者在这个时段集中干活。而某些刚发布、口碑好、或者被社区广泛推荐的模型,会长期处于"供不应求"状态,哪怕不是高峰时段也容易满载。
我观察到一个现象:每当社区里有人分享"某某模型写代码特别强"之后,接下来几天这个模型的满载概率会明显上升。这就是典型的热点聚集——好东西大家都想用,结果就是谁都用得不太顺畅。所以如果你发现某个模型突然开始频繁报容量错误,很可能不是你的问题,而是它最近"出圈"了。
理解这一点很重要,因为它直接决定了应对策略:与其死磕一个热门模型,不如准备一个"备胎模型"随时切换。这也是这条报错提示里"Please try a different model"这句话的真正含义——它在委婉地建议你,别在一棵树上吊死。
2.3 这条报错和其他报错的本质区别
很多人会把这条报错和另外几条搞混,这里必须掰扯清楚,否则排查方向会完全跑偏。
| 报错信息 | 本质原因 | 处理方向 |
|---|---|---|
| Selected model is at capacity | 服务端该模型并发打满 | 换模型或错峰重试 |
| model is not supported | 模型名不被当前账号/渠道支持 | 检查模型名与账号权限 |
| model does not exist | 模型名拼写错误或已下线 | 核对模型名拼写 |
| provider 缺少 base_url 配置 | 本地配置文件缺字段 | 补全 config.toml |
| context length is ... tokens | 输入内容超出上下文窗口 | 精简输入或换长上下文模型 |
| auth token is unavailable | 认证信息缺失或过期 | 重新登录/刷新凭证 |
看这张表就明白了:at capacity是唯一一条纯粹由服务端负载引起的报错,其他几条都或多或少和你的本地配置、账号状态、输入内容有关。把这条区分开,你就能避免"明明是服务端忙,却去改本地配置"这种南辕北辙的操作。
3. 遇到这条报错,正确的处理顺序
3.1 第一步永远是确认模型名
在动手换模型之前,先花十秒钟确认一件事:你当前配置里写的模型名,到底是不是你真正想用的那个。因为有时候报错里的模型名会暴露一个隐藏问题——你可能配了一个根本不该用的模型。
打开你的config.toml,找到类似这样的段落:
[model] name = "gpt-5.6-sol"或者在某些配置结构里是这样:
model = "gpt-6-astra" provider = "default"确认这个name或model字段的值。如果它指向的是一个你并不熟悉的模型名,那可能是之前复制配置时带进来的,或者被某个模板覆盖了。这种情况下,报容量错误反而是好事——它提醒你配置可能有问题。
提示:改完
config.toml后一定要重启 codex 会话,很多配置是启动时读取的,热改不生效。
3.2 换模型是最直接的解法
确认模型名没问题后,最直接的动作就是换一个模型。这不是妥协,而是最符合成本效益的选择。具体怎么换,取决于你的配置方式。
如果是通过配置文件指定模型,直接改config.toml里的模型名,换成一个当前不那么热门的同类模型。比如你原本用的是某个旗舰推理模型,可以临时换成一个轻量一些、响应更快的模型。写代码这件事,很多时候轻量模型完全够用,没必要每次都上最重的那个。
如果是通过命令行参数指定,那更简单,直接在命令里带上模型参数:
codex --model <另一个模型名>如果你用的是支持多模型切换的客户端或插件,通常在界面上就有模型下拉框,点一下换个模型即可。这种方式最省事,不用碰配置文件。
我个人的习惯是常备两到三个模型:一个主力(能力强但可能满载)、一个备胎(能力够用且相对空闲)、一个应急(轻量快速)。主力撞墙就切备胎,备胎也忙就上应急。这样基本不会因为单个模型满载而卡住工作。
3.3 错峰重试的时机把握
如果你就是非某个模型不可,那换模型这条路走不通,只能等。但"等"也是有讲究的,不是傻等。
根据经验,容量打满通常有明显的波峰波谷。工作日的午休时段(十二点到一点半)和傍晚之后,负载会明显下降。如果你不着急,把任务挪到这些时段,成功率会高很多。另外,整点前后往往是个小高峰(很多人习惯整点开始干活),避开整点前后十分钟,也能提升一点成功率。
重试的节奏也要注意。不要一秒钟点一次,那样只会让你更快撞上限制,甚至可能触发更严格的限流。合理的做法是间隔三十秒到一分钟重试一次,给服务端一点喘息空间。如果连续重试五六次都失败,那就说明这个时段确实太挤了,果断换模型或者换个时间,别硬耗。
注意:频繁快速重试可能被判定为异常流量,反而延长你的等待时间。慢一点,稳一点。
4. 从配置层面根治这类问题
4.1 config.toml 的关键字段梳理
与其每次撞墙了才手忙脚乱地改,不如一开始就把配置理顺。codex 的config.toml里,和模型选择、容量问题相关的字段主要有这么几个,我逐个说清楚。
model或[model] name:这是最核心的字段,决定你默认用哪个模型。建议不要写死一个最热门的,而是写一个相对稳定的。
provider:指定模型来自哪个提供方。这个字段如果配错,会直接导致provider 缺少 base_url 配置之类的错误,和容量问题叠加在一起,排查起来更麻烦。
base_url:提供方的接口地址。这个字段缺失或写错,请求根本发不出去,自然也就谈不上容量问题了。所以遇到任何模型相关报错,先确认这个字段在不在、对不对。
max_tokens或上下文相关配置:控制单次请求的规模。请求越大,占用的服务端资源越多,越容易撞上容量限制。适当调小这个值,有时能提高成功率。
把这些字段理清楚,你就能在报错出现时快速定位:是模型名的问题、提供方的问题,还是纯粹的容量问题。
4.2 多模型配置的写法
真正省心的做法,是在配置里就准备好多个模型,需要时快速切换。虽然不同版本的 codex 配置格式略有差异,但思路是通用的:把常用模型都列出来,用注释或分组管理。
# 主力模型,能力强但高峰期易满载 model = "gpt-5.6-sol" # 备选方案(需要时手动切换) # model = "gpt-6-astra" # model = "deepseek-v4"这种"注释切换法"虽然土,但极其可靠,不依赖任何额外工具。改一行、重启、生效,三步搞定。对于不想折腾复杂配置的人来说,这是最实用的方案。
如果你用的客户端支持模型别名或预设,那就更好了,可以配置成"主力/备胎/应急"三档,一键切换。具体写法参考你所使用工具的文档,核心思路是一样的:永远给自己留后路。
4.3 环境变量与配置文件的优先级
这里有个坑很多人踩过:你改了config.toml,但发现没生效,模型还是原来那个。这通常是因为环境变量的优先级高于配置文件。
很多工具会先读环境变量(比如CODEX_MODEL之类的),如果环境变量存在,就忽略配置文件里的值。所以如果你在 shell 里 export 过模型相关的变量,改配置文件是没用的,得去改环境变量,或者把环境变量清掉。
排查方法很简单,在终端里执行:
env | grep -i model看看有没有和模型相关的环境变量。如果有,那就是它在"作祟"。要么改它,要么 unset 它,让配置文件重新掌握控制权。这个细节不起眼,但能省下你半小时的困惑。
5. 实操:一次完整的排查与恢复过程
5.1 现场还原
假设这样一个场景:你早上打开终端,准备用 codex 处理一段代码重构,敲下命令后,等了几秒,屏幕上出现:
error running remote compact task: selected model is at capacity. please try a different model.注意这里还带了remote compact task的字样,说明是在执行某个远程任务时撞上的。这时候别慌,按下面的流程走一遍。
5.2 逐步排查
第一步,确认当前模型。查看你的config.toml,找到模型字段。假设看到的是model = "gpt-5.6-sol"。
第二步,判断是不是容量问题。这条报错本身就是最直接的证据,不需要额外验证。但为了确认不是配置问题,可以顺手检查一下base_url和provider字段是否完整。如果这两个字段都在、格式也对,那基本可以确定就是容量问题。
第三步,换模型。把config.toml里的模型名改成一个备选,比如deepseek-v4或你手头其他可用的模型。保存文件。
第四步,重启会话。关掉当前 codex 进程,重新启动。这一步不能省,因为配置是启动时加载的。
第五步,验证。重新执行刚才失败的命令,如果这次顺利跑通,说明问题解决。如果还是报错,但报的是别的错(比如模型不支持),那就说明新换的模型名有问题,需要再核对。
5.3 恢复后的收尾
问题解决后,别急着关掉。花一分钟做两件事:一是把这次用成功的备选模型记下来,作为下次的参考;二是如果你有多个项目或环境,检查一下其他地方的配置是不是也写死了那个容易满载的模型,顺手一起改了,避免下次在别的地方再撞一次。
我自己的习惯是维护一个"模型可用性小抄",记录哪些模型在什么时段比较稳。时间长了,你就能形成自己的经验判断,遇到容量问题几乎不用思考就知道该切哪个。
6. 常见问题速查与避坑经验
6.1 高频问题速查表
| 现象 | 可能原因 | 解决动作 |
|---|---|---|
| 换模型后仍报容量错误 | 新模型也是热门款 | 再换一个更冷门的,或错峰 |
| 改了配置没生效 | 环境变量覆盖了配置 | 检查并清理相关环境变量 |
| 报错变成 model not supported | 新模型名不被账号支持 | 换回受支持的模型名 |
| 报错变成 provider 缺少 base_url | 换模型时误删了配置字段 | 补回 base_url 字段 |
| 一直重试一直失败 | 当前时段整体负载高 | 停手,换时段再来 |
| 报错里模型名很陌生 | 配置被模板覆盖 | 核对并改回目标模型 |
这张表基本覆盖了围绕这条报错最常见的几种衍生情况。遇到问题时先对号入座,能省下大量瞎试的时间。
6.2 几个容易踩的坑
第一个坑:把容量问题当成配置问题。这是最浪费时间的错误。看到报错就一头扎进配置文件里翻,结果配置根本没问题,纯粹是服务端忙。记住,at capacity这四个字就是容量问题的标志,看到它优先考虑换模型或等待,而不是改配置。
第二个坑:在错误的文件里改配置。有些工具会在多个位置存放配置,比如用户目录下一个、项目目录下一个。你改了 A,实际生效的是 B,自然没反应。搞清楚你的工具到底读哪个文件,是排查的前提。
第三个坑:忽略大小写和拼写。模型名往往对大小写敏感,gpt-5.6-sol和GPT-5.6-SOL可能被当成两个不同的东西。复制模型名时务必原样粘贴,别手敲。
第四个坑:重试太猛。前面提过,这里再强调一次。快速连续重试不仅没用,还可能让你进入更严格的限流名单。慢下来,给彼此一点空间。
6.3 我个人的几条经验
用久了之后,我总结出几条比较实用的心得。第一,永远不要在配置里只写一个模型,哪怕你平时只用那一个,也要在注释里备好替代方案,关键时刻能救命。第二,把模型切换当成肌肉记忆,撞到容量错误的第一反应就是切模型,而不是研究报错,这样效率最高。第三,记录你的成功时段,时间长了你会发现自己的"黄金时段",把重要任务安排在那时候,成功率明显更高。
还有一条比较反直觉的:别迷信最强模型。很多时候,一个中等能力的模型写出来的代码,和旗舰模型差别没那么大,但可用性和响应速度好得多。为了那一点点能力提升去死磕一个天天满载的模型,性价比其实很低。选模型和选工具一样,合适比最强重要。
7. 把这条报错变成你的配置优化契机
说到底,Selected model is at capacity这条报错本身并不可怕,它甚至算不上一个"错误",更像是一个善意的提醒:你选的这条路现在有点堵,旁边还有别的路可以走。真正让人头疼的,是那些把这条提示误读成配置故障、然后在本地环境里反复折腾的人。
我见过太多人因为这条报错去重装 codex、去改各种莫名其妙的字段、去怀疑自己的账号,最后发现问题根本不在自己这边。这种经历一次就够了,希望这篇内容能帮你跳过这个阶段。下次再看到它,你应该能条件反射地做出判断:哦,模型忙了,切一个,或者等会儿再来。
从更长远的角度看,这条报错其实在逼你养成一个好习惯——不要依赖单一模型。无论是出于容量考虑,还是出于成本、稳定性、能力互补的考虑,手头常备几个可切换的模型,都是更成熟的使用方式。当你把模型切换练成习惯,这条报错对你来说就不再是障碍,而只是一个再普通不过的日常操作提示。
最后分享一个小技巧:如果你经常在固定时段工作,不妨提前十分钟先把模型切到一个相对冷门的备选上,避开高峰的切换手忙脚乱。这个动作花不了几秒钟,但能让你整个工作流顺畅很多。用久了你会发现,真正影响效率的往往不是模型能力,而是这些不起眼的流程细节。