目录
文章目录
-
- 目录
- [1. 为什么需要自定义 API](#1. 为什么需要自定义 API)
- [2. 环境准备](#2. 环境准备)
-
- [2.1 安装 Codex CLI](#2.1 安装 Codex CLI)
- [2.2 认识配置文件](#2.2 认识配置文件)
- [3. 配置文件结构解析](#3. 配置文件结构解析)
- [4. 场景一:接入第三方云端 API](#4. 场景一:接入第三方云端 API)
- [5. 场景二:接入本地模型](#5. 场景二:接入本地模型)
-
- [5.1 接入 Ollama](#5.1 接入 Ollama)
- [5.2 接入 LM Studio](#5.2 接入 LM Studio)
- [5.3 接入 vLLM](#5.3 接入 vLLM)
- [6. 多服务商共存与模型切换](#6. 多服务商共存与模型切换)
- [7. 环境变量与密钥安全](#7. 环境变量与密钥安全)
- [8. 常见问题与排查](#8. 常见问题与排查)
-
- [8.1 报错含义:API key not found](#8.1 报错含义:API key not found)
- [8.2 返回 404 或接口不兼容](#8.2 返回 404 或接口不兼容)
- [8.3 返回 401 或 403](#8.3 返回 401 或 403)
- [8.4 本地模型连接失败](#8.4 本地模型连接失败)
- [8.5 模型输出质量差或不支持工具调用](#8.5 模型输出质量差或不支持工具调用)
- [8.6 请求超时或连接被重置](#8.6 请求超时或连接被重置)
- [9. 接入流程总览](#9. 接入流程总览)
- [10. 总结](#10. 总结)
1. 为什么需要自定义 API
Codex CLI 是 OpenAI 推出的命令行编程助手,它把大语言模型直接搬进了终端:你可以在项目目录里发起对话、让模型查看文件、执行命令、修改代码,并且每一步都保留在会话上下文中。官方安装后,Codex 默认使用 OpenAI 的 API 服务,但对很多开发者和团队来说,这并不是唯一或最优的选择。
我们常常希望接入自己的模型,原因主要有三类:
- 降低成本:第三方模型(如 DeepSeek、Kimi、智谱 GLM)在编码场景下性价比更高,尤其是长会话、大规模批处理时,费用差异非常明显。
- 数据隐私:企业内部代码不希望出内网,需要接入本地部署的模型,让源代码、敏感配置始终留在自己的服务器上。
- 灵活可控:用 vLLM、Ollama、LM Studio 等工具自托管模型,完全掌握推理链路、模型版本、上下文长度和并发策略,甚至可以针对自家业务做微调。
好消息是,Codex CLI 的配置文件非常开放。它不关心模型到底跑在谁的服务器上,只关心一件事:服务端是否提供 OpenAI 兼容接口 。只要你的服务端能响应标准的 /v1/chat/completions 或 /v1/responses 请求,几乎都可以直接接入。
简单理解:Codex CLI 本质上是一个"聪明的 API 客户端"。我们把它的默认地址从 OpenAI 换到第三方或本地地址,就完成了模型替换;配置文件的职责,就是告诉 Codex "去哪里找模型、用什么密钥、走哪种协议"。
下面我们从零开始,先装好环境,再逐层拆解配置,最后一步步把云端、本地的专属模型挂到 Codex 上。
2. 环境准备
2.1 安装 Codex CLI
Codex CLI 基于 Node.js 运行,推荐使用 npm 全局安装。安装前请确认本机已具备较新的 Node.js 环境(建议 Node 18 及以上):
bash
node --version
npm --version
确认无误后执行:
bash
npm install -g @openai/codex
安装完成后验证版本:
bash
codex --version
如果能正常打印出版本号,说明安装成功。如果你是 Homebrew 用户,也可以执行:
bash
brew install codex
Windows 用户同样可以使用 npm 安装。若在 PowerShell 中遇到执行策略限制,可先运行
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned,或在安装后直接通过npx @openai/codex调用。
2.2 认识配置文件
Codex 的配置保存在以下位置(Linux / macOS):
~/.codex/config.toml
Windows 默认在:
%USERPROFILE%\.codex\config.toml
如果文件不存在,直接创建即可。配置文件使用 TOML 格式,整体分为两大块:
- 顶层默认值 :
model、model_provider,决定 Codex 启动后默认使用哪个模型。 - 服务商定义区 :
[model_providers.xxx],描述每个模型供应方的连接信息。
另外,Codex 还支持项目级配置与实验性功能开关,但在"接入自定义 API"这个主题下,我们只需要掌握上面的核心字段就足够了。
顺带说明:Codex 在启动时会按顺序查找配置,项目目录下的 .codex/config.toml 优先级高于用户主目录的全局配置。日常个人使用直接改 ~/.codex/config.toml 即可;团队项目若要强制指定某个模型,可以放在项目级配置中。
3. 配置文件结构解析
先看一份最小可用的 OpenAI 官方配置:
toml
model = "gpt-5-codex"
model_provider = "openai"
[model_providers.openai]
name = "OpenAI"
base_url = "https://api.openai.com/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"
逐项说明:
| 字段 | 作用 | 示例值 |
|---|---|---|
model |
默认使用的模型名,必须与所选服务商支持的模型名一致 | gpt-5-codex |
model_provider |
指向下方 [model_providers.xxx] 中定义的服务商 |
openai |
name |
显示名称,主要用于交互界面展示 | OpenAI |
base_url |
API 的基础地址,通常以 /v1 结尾 |
https://api.openai.com/v1 |
env_key |
API Key 对应的环境变量名,Codex 从该环境变量读取密钥 | OPENAI_API_KEY |
wire_api |
通信协议,可选 chat 或 responses |
responses |
其中最关键、也最容易搞错的是 wire_api:
chat:兼容标准 OpenAI Chat Completions 接口,路径为/v1/chat/completions。第三方模型、本地推理框架大多使用这个协议。responses:OpenAI 较新的 Responses API,功能更完整,能更好地支持 Codex 的 agent 能力(如工具调用、多轮状态管理)。目前只有 OpenAI 官方模型使用它最稳妥。
关键点:第三方服务几乎都选
wire_api = "chat",只有 OpenAI 官方全家桶才用responses。如果你把第三方模型误配成responses,大概率会出现 404 或"接口不存在"的报错。
这里再强调一条容易被忽略的规则:base_url 的结尾是否带 /v1、是否多一个 /,都会影响最终请求地址。Codex 最终请求的完整 URL 大致是:
{base_url}/chat/completions
所以对 Chat Completions 服务来说,base_url 应以 /v1 收尾;如果服务商文档给的是 https://api.example.com/v1/chat/completions,配置时只截取前面的 https://api.example.com/v1。
4. 场景一:接入第三方云端 API
以 DeepSeek 为例,它的接口完全兼容 OpenAI Chat Completions。接入前需要先在 DeepSeek 开放平台创建 API Key,然后在 config.toml 中新增一个服务商:
toml
model = "deepseek-chat"
model_provider = "deepseek"
[model_providers.deepseek]
name = "DeepSeek"
base_url = "https://api.deepseek.com/v1"
env_key = "DEEPSEEK_API_KEY"
wire_api = "chat"
然后在终端设置环境变量:
bash
export DEEPSEEK_API_KEY="sk-你的密钥"
启动 Codex 后,它就会用 deepseek-chat 模型并通过 DeepSeek 的接口完成对话。验证是否生效,可以启动后输入:
/status
这条命令会显示当前模型、服务商、Token 使用量等信息,方便快速确认配置是否命中。
同样的套路适用于其他兼容服务商:
| 服务商 | base_url | 常用模型 |
|---|---|---|
| DeepSeek | https://api.deepseek.com/v1 |
deepseek-chat、deepseek-reasoner |
| Kimi(月之暗面) | https://api.moonshot.cn/v1 |
kimi-k2、moonshot-v1-8k |
| 智谱 GLM | https://open.bigmodel.cn/api/paas/v4 |
glm-4-plus、glm-4-air |
| 通义千问 | https://dashscope.aliyuncs.com/compatible-mode/v1 |
qwen-max、qwen-coder-plus |
| SiliconFlow | https://api.siliconflow.cn/v1 |
Qwen/Qwen2.5-Coder-7B-Instruct、deepseek-ai/DeepSeek-V3 |
接入步骤可以归纳为三板斧:
- 到对应平台开通服务,创建 API Key。
- 把服务商的
base_url填入配置,wire_api设为chat。 - 设置
env_key对应的环境变量,并把想要使用的模型名写到顶层model字段。
注意:每家服务商的"模型名"并不通用。
qwen-coder-plus只有通义千问认识,glm-4-plus只有智谱认识。填错模型名时,服务端通常会返回类似 "Model Not Exist" 或 400 错误。
5. 场景二:接入本地模型
本地模型适合对数据敏感或离线开发的场景,常见方案有 Ollama、LM Studio、vLLM。三者的共同点都是:在本机或内网服务器上启动一个 OpenAI 兼容的 HTTP 服务,然后让 Codex 指向 localhost。
接入本地模型时还有一点和云端不同:本地服务通常不需要真实 API Key 。但 Codex 会校验 env_key 对应的环境变量是否存在,所以我们需要给一个占位值。
5.1 接入 Ollama
Ollama 是一个轻量的本地模型运行工具,安装后默认监听 http://localhost:11434,并提供了 OpenAI 兼容接口。接入前先启动 Ollama 并拉取模型:
bash
ollama pull qwen2.5-coder:7b
拉取完成后可以先手动验证模型能不能跑:
bash
ollama run qwen2.5-coder:7b "hello"
然后添加配置:
toml
model = "qwen2.5-coder:7b"
model_provider = "ollama"
[model_providers.ollama]
name = "Ollama"
base_url = "http://localhost:11434/v1"
env_key = "OLLAMA_API_KEY"
wire_api = "chat"
注意:Ollama 本地服务不需要真实密钥,但 Codex 会校验 env_key 对应的环境变量是否存在,所以随便给个占位值即可:
bash
export OLLAMA_API_KEY="ollama"
小技巧:7B 模型对日常补全已经可用,但 Codex 的 agent 工作流会频繁调用工具、读取多文件上下文,显存允许的情况下建议优先使用
qwen2.5-coder:14b或更大的模型,任务成功率会明显提升。
5.2 接入 LM Studio
LM Studio 是带图形界面的本地模型工具,适合喜欢可视化操作的用户。在 LM Studio 中下载模型后,进入 Local Server 页面点击 Start Server,默认 OpenAI 兼容地址是 http://localhost:1234/v1。配置方式与 Ollama 完全一致:
toml
model = "qwen2.5-coder-instruct"
model_provider = "lmstudio"
[model_providers.lmstudio]
name = "LM Studio"
base_url = "http://localhost:1234/v1"
env_key = "LMSTUDIO_API_KEY"
wire_api = "chat"
同样设置占位环境变量:
bash
export LMSTUDIO_API_KEY="lmstudio"
LM Studio 中加载的模型名会显示在 Server 页面上,model 字段要与之保持一致。如果加载的是 GGUF 量化模型,模型名可能带 -GGUF 之类的后缀,留意页面上显示的准确名称。
5.3 接入 vLLM
vLLM 是高吞吐量的推理引擎,通常部署在带 GPU 的 Linux 服务器上,适合生产环境或多人共用场景。启动时默认在 http://localhost:8000/v1 提供 OpenAI 兼容接口:
bash
vllm serve Qwen/Qwen2.5-Coder-7B-Instruct --served-model-name qwen2.5-coder
这里 --served-model-name 负责对外暴露的模型名,配置里的 model 要写这个对外名称,而不是 Hugging Face 仓库路径:
toml
model = "qwen2.5-coder"
model_provider = "vllm"
[model_providers.vllm]
name = "vLLM"
base_url = "http://localhost:8000/v1"
env_key = "VLLM_API_KEY"
wire_api = "chat"
再设置占位环境变量即可:
bash
export VLLM_API_KEY="vllm"
如果 vLLM 部署在另一台内网机器上,把 localhost 换成对应的内网 IP 即可。多用户共用时建议统一维护这套配置,让每个人都通过同一入口访问。
6. 多服务商共存与模型切换
一个配置文件中可以同时定义多个服务商,方便快速切换。例如:
toml
model = "deepseek-chat"
model_provider = "deepseek"
[model_providers.deepseek]
name = "DeepSeek"
base_url = "https://api.deepseek.com/v1"
env_key = "DEEPSEEK_API_KEY"
wire_api = "chat"
[model_providers.ollama]
name = "Ollama"
base_url = "http://localhost:11434/v1"
env_key = "OLLAMA_API_KEY"
wire_api = "chat"
[model_providers.openai]
name = "OpenAI"
base_url = "https://api.openai.com/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"
这份配置同时登记了 DeepSeek、Ollama 和 OpenAI 三家,顶层默认走 DeepSeek。真正使用时,我们不必每次都改配置文件,在 Codex 的交互式会话(TUI)中,输入以下命令即可动态切换模型:
/model deepseek-chat
如果切换的模型属于另一个服务商,可以加上服务商前缀来避免歧义。切回本地模型同理:
/model ollama/qwen2.5-coder:7b
模型标识的完整格式可以理解为:
服务商名/模型名
- 不带前缀时,Codex 默认在当前
model_provider下查找模型。 - 带上
ollama/、deepseek/这类前缀时,则会到对应服务商中查找,跨服务商切换立刻生效。
实用建议:日常联网开发用云端模型,处理敏感代码或断网环境时用
/model ollama/...一键切回本地,既省成本又兼顾隐私。
7. 环境变量与密钥安全
强烈建议不要把 API Key 直接写进 config.toml,而是通过环境变量注入。这样配置文件里只有变量名,没有真实密钥,即使把配置分享给同事或提交到 Git,也不会直接泄露凭证。
常用做法是把密钥写进 shell 配置文件:
bash
# ~/.zshrc 或 ~/.bashrc
export DEEPSEEK_API_KEY="sk-你的密钥"
export OPENAI_API_KEY="sk-你的密钥"
修改后刷新配置:
bash
source ~/.zshrc
如果你使用 fish,写入 ~/.config/fish/config.fish 后执行 source ~/.config/fish/config.fish 即可。
Windows 用户则可以通过系统环境变量设置,或使用 PowerShell 的 setx 永久写入:
powershell
setx DEEPSEEK_API_KEY "sk-你的密钥"
设置完成后需要重开终端,新的环境变量才会注入到当前进程。
这样既能避免密钥随配置文件泄露(比如误提交到 Git),也方便在不同机器间复用同一份 config.toml:配置只管"结构",密钥由每台机器各自持有。
提示:
env_key的值只是环境变量名 ,Codex 会根据这个名字去进程环境中查找真正的密钥。所以env_key = "DEEPSEEK_API_KEY"和export DEEPSEEK_API_KEY=...两处的变量名必须严格一致,包括大小写。
再补充两条安全习惯:
- 如果团队使用 Git 管理 dotfiles,确保
~/.zshrc不要被公开仓库收录,或把密钥单独放到.env文件并加入.gitignore。 - 在公司服务器上运行时,不要用
echo直接把密钥打到日志里;排查问题优先用echo $VAR_NAME只确认变量是否存在、是否为空。
8. 常见问题与排查
下面覆盖从"连不上"到"答得差"的常见问题,建议按顺序排查。
8.1 报错含义:API key not found
如果看到类似 no API key found for provider 的提示,说明 env_key 指定的环境变量没有设置。检查当前 shell:
bash
echo $DEEPSEEK_API_KEY
为空的话,补齐环境变量并重启 Codex。需要留意的是:环境变量是在进程启动时 读取的,修改 ~/.zshrc 后没有 source、或者没有重开终端,新变量不会生效。
8.2 返回 404 或接口不兼容
先确认 base_url 是否以 /v1 结尾,并用 curl 手动验证连通性:
bash
curl https://api.deepseek.com/v1/models \
-H "Authorization: Bearer $DEEPSEEK_API_KEY"
能返回模型列表,说明接口可用。如果服务端只兼容 Chat Completions,记得把 wire_api 改为 chat。
排查顺序建议:
- 检查
base_url是不是多了或少了/v1。 - 确认
wire_api与目标服务匹配(第三方用chat)。 - 用上面的
curl命令独立验证,排除 Codex 配置之外的网络问题。
8.3 返回 401 或 403
401/403 通常是鉴权失败,而不是接口找不到。可能原因:
- 环境变量名与
env_key不一致(例如配置里是DEEPSEEK_API_KEY,实际 export 的是DEEPSEEK_KEY)。 - API Key 本身失效、被禁用或额度用尽。
- 认证头格式问题,这通常由服务商兼容性导致,优先确认模型确实支持 OpenAI 规范。
可以先复现一下带鉴权的请求:
bash
curl https://api.deepseek.com/v1/models \
-H "Authorization: Bearer $DEEPSEEK_API_KEY"
如果这里也返回 401,说明问题在密钥本身;如果这里正常而 Codex 报错,再回头检查 env_key 拼写。
8.4 本地模型连接失败
本地服务走 HTTP,确认服务已启动且监听地址正确:
bash
# 检查 Ollama
curl http://localhost:11434/v1/models
# 检查 vLLM
curl http://localhost:8000/v1/models
同时留意防火墙、容器端口映射等因素,必要时把 localhost 换成实际 IP。
另一个常见坑是"本地服务启动了,但进程的监听地址不是你以为的那个"。可以确认:
bash
# 查看 11434 端口监听情况
lsof -i :11434
如果服务跑在 Docker 里,记得用 -p 做端口映射,例如:
bash
docker run -d -p 8000:8000 vllm/vllm-openai ...
8.5 模型输出质量差或不支持工具调用
Codex 依赖模型具备一定的**工具调用(function calling)**能力。部分开源小模型对工具调用支持不完整,可能导致编辑、执行命令等环节异常。建议优先选择专门针对编码和 Agent 场景优化的模型,例如 qwen2.5-coder、deepseek-chat 等。
如果模型经常"答非所问"或无法正确调用工具,可以依次尝试:
- 更换为支持 function calling 的模型,并确认推理框架开启了工具调用能力。
- 检查上下文长度设置,过小的上下文会被截断,导致模型"失忆"。
- 减少单次任务复杂度,把大任务拆成小步骤。
8.6 请求超时或连接被重置
遇到超时,可以看看是否走了系统代理。很多国内开发者会开启 HTTP 代理访问海外服务,但接入本地 Ollama、LM Studio 时,这个代理反而会拦截 localhost 请求。一般需要把 localhost、127.0.0.1 加入代理例外列表:
bash
export NO_PROXY="localhost,127.0.0.1"
如果目标是内网服务器,也建议把对应 IP 或域名加入 NO_PROXY。
9. 接入流程总览
为了更直观地梳理整个过程,可以把"从零到一接入自定义模型"抽象成下面的流程:
#mermaid-svg-wKTdm7g34kzxlVQx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wKTdm7g34kzxlVQx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wKTdm7g34kzxlVQx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wKTdm7g34kzxlVQx .error-icon{fill:#552222;}#mermaid-svg-wKTdm7g34kzxlVQx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wKTdm7g34kzxlVQx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wKTdm7g34kzxlVQx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wKTdm7g34kzxlVQx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wKTdm7g34kzxlVQx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wKTdm7g34kzxlVQx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wKTdm7g34kzxlVQx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wKTdm7g34kzxlVQx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wKTdm7g34kzxlVQx .marker.cross{stroke:#333333;}#mermaid-svg-wKTdm7g34kzxlVQx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wKTdm7g34kzxlVQx p{margin:0;}#mermaid-svg-wKTdm7g34kzxlVQx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wKTdm7g34kzxlVQx .cluster-label text{fill:#333;}#mermaid-svg-wKTdm7g34kzxlVQx .cluster-label span{color:#333;}#mermaid-svg-wKTdm7g34kzxlVQx .cluster-label span p{background-color:transparent;}#mermaid-svg-wKTdm7g34kzxlVQx .label text,#mermaid-svg-wKTdm7g34kzxlVQx span{fill:#333;color:#333;}#mermaid-svg-wKTdm7g34kzxlVQx .node rect,#mermaid-svg-wKTdm7g34kzxlVQx .node circle,#mermaid-svg-wKTdm7g34kzxlVQx .node ellipse,#mermaid-svg-wKTdm7g34kzxlVQx .node polygon,#mermaid-svg-wKTdm7g34kzxlVQx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wKTdm7g34kzxlVQx .rough-node .label text,#mermaid-svg-wKTdm7g34kzxlVQx .node .label text,#mermaid-svg-wKTdm7g34kzxlVQx .image-shape .label,#mermaid-svg-wKTdm7g34kzxlVQx .icon-shape .label{text-anchor:middle;}#mermaid-svg-wKTdm7g34kzxlVQx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wKTdm7g34kzxlVQx .rough-node .label,#mermaid-svg-wKTdm7g34kzxlVQx .node .label,#mermaid-svg-wKTdm7g34kzxlVQx .image-shape .label,#mermaid-svg-wKTdm7g34kzxlVQx .icon-shape .label{text-align:center;}#mermaid-svg-wKTdm7g34kzxlVQx .node.clickable{cursor:pointer;}#mermaid-svg-wKTdm7g34kzxlVQx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wKTdm7g34kzxlVQx .arrowheadPath{fill:#333333;}#mermaid-svg-wKTdm7g34kzxlVQx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wKTdm7g34kzxlVQx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wKTdm7g34kzxlVQx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wKTdm7g34kzxlVQx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wKTdm7g34kzxlVQx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wKTdm7g34kzxlVQx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wKTdm7g34kzxlVQx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wKTdm7g34kzxlVQx .cluster text{fill:#333;}#mermaid-svg-wKTdm7g34kzxlVQx .cluster span{color:#333;}#mermaid-svg-wKTdm7g34kzxlVQx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wKTdm7g34kzxlVQx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wKTdm7g34kzxlVQx rect.text{fill:none;stroke-width:0;}#mermaid-svg-wKTdm7g34kzxlVQx .icon-shape,#mermaid-svg-wKTdm7g34kzxlVQx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wKTdm7g34kzxlVQx .icon-shape p,#mermaid-svg-wKTdm7g34kzxlVQx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wKTdm7g34kzxlVQx .icon-shape .label rect,#mermaid-svg-wKTdm7g34kzxlVQx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wKTdm7g34kzxlVQx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wKTdm7g34kzxlVQx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wKTdm7g34kzxlVQx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 第三方云端
本地自托管
是
否
安装 Codex CLI
创建 config.toml
模型部署方式
填写服务商 base_url 与 env_key
启动 Ollama / LM Studio / vLLM
设置环境变量注入 API Key
启动 Codex 并验证 /status
是否正常响应
用 /model 按需切换模型
curl 验证 / 检查 wire_api / 排查代理
无论走云端还是本地,核心判断都在"服务端是否提供 OpenAI 兼容接口",剩下的只是把地址、密钥和协议三个参数填对。
10. 总结
Codex CLI 自定义 API 的核心就在 config.toml 的 [model_providers] 段落:只要服务端提供 OpenAI 兼容接口,配置好 base_url、env_key 和 wire_api 就能接入。
回顾一下关键步骤:
- 安装 Codex CLI,并用
codex --version验证。 - 在
~/.codex/config.toml中定义服务商。 - 用
model和model_provider指定默认模型。 - 通过环境变量注入 API Key,避免明文泄露。
- 启动后可用
/model随时切换模型。 - 遇到问题优先用
curl验证接口连通性,再检查wire_api与代理配置。
掌握这套配置方法后,无论是云端性价比模型还是内网私有模型,都能灵活挂载到 Codex 上,打造真正属于自己的 AI 编程工作流。