Codex 的配置文件能改 Base URL,于是很多人第一反应是「把 key 一换不就接上国内模型了」。真跑起来常遇到调用成功但改文件改不动、工具调用报参数错、长任务半路断流。这篇不讲协议原理,只讲怎么判断某个国内模型能不能用在这类编程 Agent 上,以及接不上时先查哪里。
Codex 这类编程 Agent 的配置文件里能改 Base URL,于是很多人第一反应是「把 key 一换不就接上国内模型了」。真跑起来经常是另一种画面:测试请求返回成功,但让它改文件改不动;工具调用报参数错;一个多文件任务跑到一半突然断流,上下文全丢。这不是你配置写错了,多半是兼容性分层的问题。
这篇不讲协议原理,只讲怎么判断某个国内模型能不能用在这类编程 Agent 上:先分清「能连上」和「能跑完」是两件事,再按工具调用、长上下文、延迟与流式逐层实测,最后给一套从候选筛到定稿的顺序和退回方案。所有涉及具体模型清单和参数的地方,都建议你到站内页面核对当时的数字,别照抄别人的旧配置。
先分清两层兼容:协议能通,和任务能跑完
第一层是协议层:请求能发出去、能拿回结果,改一行 Base URL 基本就成立,验证成本极低,五分钟能测完。第二层是任务层:模型要在几十轮的长链路里稳定读文件、改文件、调工具、按格式返回,这才是真正的门槛。大量「接不上」的抱怨其实卡在第二层,而不是第一层。
| 层级 | 验证方式 | 通过标准 | 失败表现 |
|---|---|---|---|
| 协议层 | 发一条最简单的对话请求 | 有正常返回、无鉴权报错 | 401、404、字段不认 |
| 工具层 | 给一个必须调工具才能完成的小任务 | 参数结构正确、连续几轮都成功 | 参数多包一层、格式解析失败 |
| 任务层 | 跑一个真实的多文件小改动 | 能改对、能收尾、不半路崩 | 前几步对、后面开始乱改 |
判断顺序建议固定成两步:先跑通协议,再跑一个真实小改动。两层都过才算「能接」。只过第一层就上生产,翻车只是时间问题。什么情况下可以只看协议层?纯问答、只用来做单次补全的场景,对任务层要求低,这时确实不必卡得那么严。
协议层怎么核:接口形态、鉴权与字段名
先确认对方走的是 OpenAI 兼容还是 Anthropic 兼容那套路数。两套协议的请求体结构、系统提示词放的位置、工具调用字段名都不一样,直接决定你在 Codex 侧该选哪种接入方式。两个协议都支持时,优先选与客户端原生一致的那套,少一层转换就少一类报错。
- 鉴权头写法:是 Bearer 还是别的字段名,拼错了直接 401 而不是「连不上」
- 模型名字符串:大小写、连字符、后缀都可能影响路由,抄错一个字符就 404
- tools 字段结构:函数定义放哪一层,参数 schema 是不是标准 JSON Schema
- 流式返回的 SSE 事件格式:分块边界、结束标记,解析器对不上就只收到半截输出
- 超时与重试配置:客户端默认超时对国内链路是否偏短
核不准的时候,别靠第三方博客的示例代码,那多半是过期或者从别的产品抄来的。去厂商目录与官方价目页看当前支持的接入形态,再到站内价格追踪页面确认当时的计费口径,两处对得上再动手改配置。
工具调用是最大分水岭:能不能稳定改文件
编程 Agent 的核心动作就三个:读文件、写文件、执行命令,而且都要求模型按 schema 把参数吐出来。模型不支持工具调用,或者支持但输出不稳定,整个循环就断在这里——不是慢,是根本走不下去。
| 失败形态 | 你看到的现象 | 排查动作 |
|---|---|---|
| 完全不支持工具调用 | 模型把工具调用写成普通文本 | 看返回里有没有结构化的调用块 |
| 参数多包一层 | 下游报未知字段或类型不匹配 | 打印原始返回,比对 schema |
| 流式下工具块与文本混流 | 解析器只抓到一半参数 | 关掉流式再测一次做对照 |
| 参数偶发缺失 | 同一任务有时成有时败 | 连续跑多轮统计失败率 |
验法很朴素:给一个必须调工具才能完成的小任务,比如「读某个文件,在末尾追加一行」,连续跑几轮看失败率,而不是看单次是否成功。单次成功说明不了什么,三轮里坏一轮就不能拿来做长任务。
长上下文与多轮循环:跑到第几轮开始忘事
Agent 每一轮都要把文件内容、历史动作重新塞回上下文,消耗速度比聊天场景快得多。所以你要关注的不是「标称窗口多大」,而是三点:实际可用窗口多大、超限后是报错还是静默截断、被截断之后模型会不会开始重复已经做过的动作。
静默截断最坑。它不报错,表现是「前几步都对,后面突然开始乱改」,你会以为是模型变笨了,其实是上下文早被削掉了。没有报错就意味着你只能靠行为异常去反推。
- 记录每轮输入长度在客户端把每轮实际发送的 token 量打日志,跑完一个完整任务后看曲线,找出从第几轮开始逼近上限。
- 对比异常出现的位置把「模型开始重复动作」的那一轮和长度曲线对上,两者吻合基本就能确认是截断导致的。
- 换长任务再验一次换一个文件更多、轮数更长的任务重跑,如果异常出现得更早,说明余量确实不够,这个模型不适合长循环。
延迟与流式:首字慢、断流、超时的连锁反应
编程任务动辄几十轮调用,单次慢一点会被放大成整体卡住。所以先量延迟基线:第一次响应多久回来、单轮整体多久结束,拿到自己的数字之后再判断是模型本身慢,还是你这条链路的问题。站内测速页可以帮你建立一个可比的基线,去 /tools/speed-test 拿当时的数字。
- 首字延迟高但整体不慢:影响交互手感,不影响批处理型任务
- 整体单轮慢:几十轮累加下来会把一个十分钟的任务拖成一小时
- 中途断流:本轮上下文直接丢失,客户端要重试,重试还可能重复计费
- 超时设置偏短:长输出被客户端主动掐断,看起来像模型不返回
- 重试策略缺失:一次断流就得整个任务从头开始
什么情况不适用这套标准:短小的补全类任务对首字延迟敏感度低,也不容易触发断流,不必按长任务的标准去苛求。反过来说,如果你的任务本身就是长循环,那延迟和流式稳定性必须一起看,只测一项没有意义。
选型五步:从候选到定下一个能用的
上面几节是判断维度,这一节把它们串成一个可执行的流程。核心思路是先按任务形态收窄,再用实测淘汰,最后留备选,而不是拿一堆参数表横向比分数。
- 明确任务形态先写下你的真实用法:单次补全、单文件改写,还是多文件多轮 Agent 循环。形态不同,下面几步的权重完全不同。
- 按协议兼容度做第一轮筛选只留下接入方式与客户端原生一致或转换层最少的候选,把需要额外写适配代码的先放一边。
- 用一个真实小需求做闭环实测不要用「你好」测。拿一个你自己项目里的真实小改动,记录成功率和平均轮数。
- 按失败模式淘汰工具调用不稳、长上下文容易崩的优先出局;这类问题往往改提示词也救不回来。
- 留一个备选写进配置主模型和备选模型都配好,出问题能切换,不要只押一家。
候选模型的具体清单和当前参数,建议以站内模型资料库和价格追踪页为准,那里会随厂商调整同步更新。榜单和排名类的信息同理,去 /rankings 看当时的数字,别用几个月前的截图做决策。
换模型之后:怎么验、怎么退回
换模型最容易犯的错是「换完感觉一下」。感觉不可复现,也没法回滚。正确做法是换之前先固定一组用例,同一批任务在新旧模型上各跑一遍,比成功率和耗时,而不是比主观印象。
| 动作 | 怎么做 | 判断标准 |
|---|---|---|
| 固定用例集 | 挑 5 到 10 个真实小任务存档 | 每次换模型都用同一批 |
| 对照跑 | 新旧模型各跑一遍,记成功率和轮数 | 新模型至少不明显更差 |
| 保留旧配置 | 把旧模型配置留成可切换的一份 | 一条命令能切回 |
| 记录改动 | 模型名、参数、提示词是否同步调整 | 出问题时能定位是哪个变量导致 |
另外提醒一点:换模型时提示词往往要跟着调。工具调用字段、输出格式约束这些,在不同模型上的敏感度不一样。建议每次只改一个变量,别同时换模型又重写提示词,出了问题根本没法归因。
这些情况别硬接国内模型
不是所有场景都值得折腾接入。下面几类情况,投入产出比往往很差,早点放弃反而省事。
- 依赖特定厂商私有工具链或专有格式的流程:换模型往往要重写大半提示词,收益不成正比
- 输出格式容错极低的场景:比如结果直接喂给下游解析器,格式抖一次就全线报错
- 有明确数据合规地域要求、但候选模型侧条款读不清的:先按合规口径筛掉,再谈性能
- 只在极低频、一次性任务上使用:选型花费的时间可能超过省下的成本
- 团队里没人愿意长期维护配置的:接入只是开始,后续排错才是持续成本
判断标准可以简化成一句话:这项任务如果换成人工手动做,一次要花多久。如果换模型带来的收益远小于维护成本,那就别接,用现成的就好。数据合规相关的条款口径,建议到站内指南中心对照当时的说明,不要凭印象判断。
下一步把候选模型列出来,先跑一遍协议层和工具调用的小任务,用数据淘汰掉一批,再去看站内资料库和价格追踪页核对当前参数与计费口径,最后留一个备选写进配置。→常见问题
Codex 接国内模型是改个 Base URL 就行吗?
改地址只是第一步,能不能用取决于两件事:协议形态对不对得上,以及模型在真实任务里能不能稳定完成多轮工具调用。前者几分钟能验,后者得跑一个完整小任务才算数。建议先按这两层分别确认,别拿一次成功的测试请求当结论。
接入成功后模型不听话、改了错的地方,是模型不行吗?
先别下结论。按顺序查:工具调用参数是否被正确解析、上下文是不是到某一轮被静默截断、提示词里对文件范围和改动边界的约束是否够明确。这三项里任何一项出问题,表现都像「模型不听话」。逐项排除完再判断模型本身。
国内模型支持工具调用的多吗,怎么快速判断?
不要只看文档写「支持 function calling」,那通常只说明字段能被接受。真正的判断是跑一个必须调工具才能完成的小任务,连续跑几轮看失败率。文档标支持但参数结构经常多包一层或漏必填字段的情况并不少见,实测才算数。
多个国内模型能不能配在一起做降级?
可以,前提是两个模型的协议路数一致或客户端能分别配置。做法是主选跑不通时自动切备选,但要注意两边的提示词可能需要微调,切过去效果会打折。备选方案建议只在报错、超时这类硬失败时触发,不要因为一次输出不好看就切。
接上之后成本和官方直连比是什么水平?
这里面变量太多:计价单位、上下文计费口径、缓存是否命中、失败重试的重复消耗都会影响最终账单。具体数字别听人说,到站内的官方 API 价格页和模型成本计算器按你自己的用量口径算一遍,再和实际账单对一次。