1. 为什么要在 ChatGPT(原 Codex)里改 Base URL 接本地模型
2026 年,OpenAI 已经把 Codex 客户端统一更名为 ChatGPT 桌面端,但底层那套「读配置、发请求、拿 choices」的机制没变。很多人第一次听到「本地模型接入」会以为要重装客户端,其实核心动作只有一个:把请求的 Base URL 从官方端点改到你自己可控的网关,再把鉴权 Key 换成对应网关签发的 Key。改完这两处,客户端发出去的请求就会落到你指定的模型上,token 消耗也从此看得见、管得住。
这件事适合三类人。第一类是日常写代码、写脚本,希望把简单补全、格式化、注释生成这类高频低难度任务放到本地或低成本通道,把云端额度留给真正复杂的推理。第二类是团队里做内部工具,代码和工作数据不想整段外发,需要一个统一入口做路由和审计。第三类是已经在用 Claude Code、Cline、Codex 这类 Agent 工具,想用同一套 Base URL + Key + Model ID 打通多个客户端,不想每个工具单独配一遍。
我试过最笨的办法:每个客户端手动填 endpoint、手动填 key、手动填模型名,结果换一台机器就全乱。后来把配置收敛到一份 settings 文件,再用 TaoToken 做统一入口,改一处、全端生效,排障也简单——请求发不出去就看 Base URL,返回 401 就看 Key,返回模型不存在就看 Model ID。这篇就按这个思路,把 ChatGPT(原 Codex)接入本地模型场景下的 Base URL 与鉴权配置完整走一遍,包含可复制片段、一次真实请求验证,以及几个高频报错的定位方法。
需要先明确一个概念:这里的「本地模型」不是指模型权重必须跑在你笔记本上,而是指请求的出口由你决定。你可以把 Base URL 指向局域网里的推理服务,也可以指向一个统一网关,由网关再决定这次请求走本地还是走云端。ChatGPT 客户端本身不关心模型在哪,它只关心「我按这个地址发请求,能不能拿到符合 OpenAI 格式的响应」。所以整篇的关键词就是 Base URL、Key、Model ID 三件套,以及 token 用量怎么在这条链路上被统计和限制。
2. TaoToken 前置准备:Base URL、Key 与 Model ID 三件套
在动手改 ChatGPT(原 Codex)之前,先把三样东西准备好,后面所有配置都围绕它们展开。第一是 Base URL,也就是请求的根地址;第二是 API Key,用来鉴权;第三是 Model ID,告诉网关你要调哪个模型。这三者缺一不可,而且必须来自同一个来源,否则就会出现「地址对了但 key 不认」或者「key 对了但模型名不存在」的典型错配。
TaoToken 在这里扮演的是统一入口的角色。它的 API 根地址是https://taotoken.net/api,注意这个地址不带任何查询参数,直接作为 Base URL 使用。很多客户端要求 Base URL 以/v1结尾,那是因为它们内部会拼/chat/completions;而有些客户端要求你填到根,由它自己补路径。这两种情况要分清,填错就是 404。我的做法是:先看客户端文档里 Base URL 的示例格式,再决定要不要加/v1。
Key 的获取在控制台完成,登录后进入 API Keys 页面创建。创建时建议按用途命名,比如codex-local、cline-dev,这样后面看用量时能对上号。Key 只在创建时完整显示一次,复制后妥善保存。如果你同时用多个客户端,不要图省事共用一个 Key,分开建、分开管,出问题好定位,也方便单独吊销。
Model ID 是最容易被忽略的一环。ChatGPT 客户端里显示的模型名,和网关实际接受的 Model ID 不一定一致。你要以网关文档里列出的可用模型 ID 为准。比如你想走本地推理,就要确认网关那边确实挂了一个本地模型,并且它有明确的 ID。填一个网关上不存在的 ID,返回的报错通常是model not found或者invalid model,而不是 401,这一点在排障时很有用。
把这三样整理成一张小卡片,后面配置时直接抄:
| 项目 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 根地址,是否加/v1看客户端要求 |
| API Key | 控制台创建,形如sk-... | 按用途命名,单独管理 |
| Model ID | 以网关文档为准 | 本地模型和云端模型 ID 不同 |
注意:Base URL 和 Key 必须配套。用 A 网关的地址配 B 网关的 Key,一定鉴权失败。换网关时两样一起换。
准备好之后,先别急着改 ChatGPT 客户端。建议先用一条 curl 命令验证这套三件套本身是通的,确认没问题再往客户端里填。这样能把「网关配置问题」和「客户端配置问题」分开,排障效率高很多。下一节就给可复制的配置片段和这条验证命令。
3. 可复制配置:settings.json / config.toml 与请求片段
不同客户端读的配置文件不一样,ChatGPT(原 Codex)桌面端在 2026 版里主要认两类:一类是 JSON 格式的 settings,一类是 TOML 格式的 config。下面给两份可直接复制的片段,路径按各客户端默认位置放置。核心字段就三个:base_url、api_key、model。
先看 JSON 版本,适合大多数图形化客户端和部分 Agent 工具:
{ "provider": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key", "model": "你的ModelID", "timeout": 60, "max_retries": 2 }再看 TOML 版本,适合 Codex 系和一些命令行 Agent:
[model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" api_key = "sk-你的Key" [profiles.local] model_provider = "taotoken" model = "你的ModelID"如果你用的是 Claude Code 这类需要环境变量的工具,可以这样写:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的Key" export ANTHROPIC_MODEL="你的ModelID"注意 Claude Code 的变量名是ANTHROPIC_前缀,别和 OpenAI 系的OPENAI_混用。混用的结果通常是请求发出去了但鉴权头不对,返回 401。三件套里 Base URL、Key、Model ID 必须同时出现在同一份配置里,缺一个都会失败。
配置写好后,先用 curl 做一次最小验证,确认网关侧是通的:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的Key" \ -d '{ "model": "你的ModelID", "messages": [{"role": "user", "content": "只回复两个字:通了"}], "max_tokens": 16 }'如果返回的 JSON 里有choices数组,并且message.content是「通了」,说明 Base URL、Key、Model ID 三件套全部正确。这时候再回到 ChatGPT 客户端里填同样的值,成功率就很高。如果这条 curl 就失败了,那问题一定在网关侧或三件套本身,跟客户端无关,先解决它。
提示:把
max_tokens设小一点做验证,省额度也快。验证通过后再在客户端里放开正常长度。
配置片段里的timeout和max_retries不是必填,但建议加上。本地模型首次加载可能慢,超时设太短会误报失败;重试次数设 2 次足够,太多会在真正出错时反复消耗额度。这些参数在排障时也有用——如果日志里看到重试记录,说明是超时或网络抖动,而不是鉴权问题。
4. 验证请求与成功结果:一次完整的本地模型调用
配置填完,接下来做一次端到端验证。打开 ChatGPT(原 Codex)客户端,新建对话,在模型列表里选择你配置的那个入口。如果客户端支持自定义 provider,确认它读到了你写的 base_url 和 model。然后发一条简单指令,比如「用 Python 写一个读取 JSON 文件并打印键名的函数」。
请求发出去后,观察三件事。第一,响应是否正常返回,内容是否符合预期;第二,客户端的状态栏或日志里,请求地址是不是你配置的 Base URL;第三,如果网关有用量面板,去面板里确认这次调用被记录,并且 token 数有增加。这三点都满足,才算真正接入成功。
成功返回的响应结构大致是这样:
{ "id": "chatcmpl-xxxx", "object": "chat.completion", "model": "你的ModelID", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "def read_json_keys(path):\n import json\n with open(path) as f:\n data = json.load(f)\n return list(data.keys())" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 32, "completion_tokens": 48, "total_tokens": 80 } }重点看usage字段。prompt_tokens是你发出去的,completion_tokens是模型返回的,两者相加是这次消耗。如果你在网关侧设了配额,这个数字就是扣减依据。本地模型场景下,如果模型真的跑在本地,这部分 token 不产生云端费用,但网关仍会统计,方便你做用量分析。
验证时如果客户端显示「正在生成」但迟迟不返回,先别急着判定失败。本地模型首次推理要加载权重,冷启动可能十几秒甚至更久。等一次完整返回后,第二次就会快很多。如果超过你设的 timeout 还没动静,去看客户端日志,通常会看到timeout或read timeout字样,这时候把 timeout 调大再试。
还有一种情况是返回了内容但明显不是你要的模型风格。比如你配的是本地小模型,返回却像云端大模型。这通常是 Model ID 填错,或者网关的路由策略把请求转到了别的模型。回到配置里核对 Model ID,并在网关侧确认这个 ID 对应的实际模型。三件套里 Model ID 是最容易「看起来对、实际错」的一项,多核对一遍不亏。
验证通过后,建议把这次成功的配置备份一份。换机器、重装客户端时直接恢复,不用重新摸索。同时记下这次请求的 token 数,作为后续用量管理的基线。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
接入过程中最常见的几类报错,基本都能从三件套和网络链路两个方向定位。下面按报错原文对照排查,每条都给可执行的动作。
401 Unauthorized / invalid api key:鉴权失败。先确认 Key 有没有复制完整,前后有没有多余空格。再确认这个 Key 属于你填的 Base URL 对应的网关。用 curl 单独测一次,如果 curl 也 401,就是 Key 本身的问题,去控制台重新创建一个。如果 curl 通、客户端 401,那就是客户端没读到你的配置,检查配置文件路径和格式,JSON 少个逗号也会导致整份配置不生效。
local proxy failed / connection refused:客户端尝试连本地代理或本地端口失败。这通常发生在你把 Base URL 填成了http://localhost:xxxx但本地服务没起来。如果你用的是统一网关,Base URL 应该是网关地址,不是 localhost。检查配置里有没有残留的旧地址,改回https://taotoken.net/api再试。
reading choices / cannot read property choices:客户端拿到了响应,但响应结构里没有choices字段。原因通常是网关返回了错误 JSON,而客户端仍按成功响应去解析。去看原始响应体,里面一般有error字段说明真实原因,常见的是模型不存在或参数不合法。把 Model ID 和请求参数核对一遍。
OAuth / token exchange failed:客户端走了 OAuth 流程而不是 API Key 鉴权。ChatGPT 桌面端某些版本默认用账号登录,需要手动切换到 API Key 模式。在设置里找到鉴权方式,改成 API Key,填入你的 Key。如果找不到切换入口,检查客户端版本,2026 版一般在「高级设置」或「开发者选项」里。
model not found / invalid model:Model ID 不对。以网关文档列出的 ID 为准,不要用客户端下拉里显示的别名。本地模型和云端模型 ID 不同,确认你要调的是哪一个。
429 Too Many Requests:触发限流或配额用尽。去网关用量面板看当前消耗,确认是否达到你设的上限。如果是限流,降低并发或稍后重试;如果是配额,调整配额或换用本地模型通道。
排查时有个通用顺序:先用 curl 验证三件套,再看客户端日志里的实际请求地址,最后看网关侧记录。这三步能把问题范围从大到小锁定。多数「客户端报错」最后都落在配置文件的某个字段上,而不是客户端本身有 bug。
注意:改完配置文件后,记得完全重启客户端。有些客户端只在启动时读一次配置,热改不生效,会让你误以为改错了。
6. 把 token 用量管起来:从这次接入继续往下走
接入成功只是第一步,真正让「token 自由」落地的是用量管理。本地模型场景下,简单任务走本地、复杂任务走云端,这个分流策略能显著压低成本。你可以在网关侧设置配额,超过阈值自动停止云端调用,避免意外超支。同时在客户端里把默认模型设成本地模型,需要强推理时再手动切换。
如果你还在用 Claude Code、Cline 这类 Agent 工具,可以把同一套 Base URL 和 Key 复用过去,实现一次配置、多端使用。每个工具单独建一个 Key,方便按工具维度看用量。模型 ID 按工具用途选:写代码用代码能力强的,写文档用长文本能力强的,本地小模型适合格式化和补全。
下一步可以做的几件事:去控制台创建专用 Key 并设配额;把这次验证成功的配置片段存进版本管理;在网关用量面板里观察一周的 token 分布,找出哪些任务其实可以下沉到本地模型。做完这些,你对 token 的掌控就从「大概知道花了多少」变成「每一笔都清楚去向」。
需要创建 Key 和查看接入文档的话,可以从这里进:API Keys 页面在控制台的密钥管理里,接入文档在文档中心。想先验证模型是否可用,用模型对话页面发一条测试消息最快。如果你打算长期用 Agent 做编码,Coding Plan 那条线更适合持续跑量。地址统一从https://taotoken.net/api进,Key 和文档都在里面。