Codex 使用 OpenAI Responses 协议(wire_apiresponses),a4api 勾选 codex 目标的配置方案会把服务商与模型写入 ~/.codex/config.toml,并同步维护模型目录 models.json。上游原生支持 Responses 时直连,否则经本地翻译代理把 Responses 翻译为 Chat Completions 转发,让智谱等只有 Chat Completions 的服务商也能驱动 Codex。本文章介绍该目标的托管字段、写入示例、直连与代理两种链路、模型目录的维护逻辑与常见问题。

1. 写入哪个文件、写哪些内容

目标文件为 ~/.codex/config.toml(可用环境变量 A4API_CODEX_CONFIG_PATH 覆盖)。切换时更新两类内容:

位置 字段 写入内容
顶层 model 配置方案中的模型名
顶层 model_provider 指向 a4api 托管的服务商条目键名
[model_providers.a4api_p<服务商ID>] name / base_url / wire_api / experimental_bearer_token 服务商条目本体

托管条目以 a4api_p 为前缀加服务商 ID 命名;切换时会先移除旧的 a4api 托管条目再写入新条目,用户自己定义的其他 model_providers 条目原样保留wire_api 固定为 responses,适配 Codex CLI 的 Responses 协议。

1.1 直连上游(原生 Responses)

服务商勾选了「原生 Responses」(当前预置模板中仅 DeepSeek-openai)时,Codex 直接访问上游:

model = "deepseek-v4-flash"
model_provider = "a4api_p3"

[model_providers.a4api_p3]
name = "DeepSeek-openai"
base_url = "https://api.deepseek.com/"
wire_api = "responses"
experimental_bearer_token = "sk-真实APIKey"

1.2 经本地代理转发(非原生上游)

上游只提供 Chat Completions 时(智谱 v4、OpenRouter、本地 LLM Studio 等),base_url 指向本地翻译代理,鉴权 token 换成代理 token,真实 API Key 不落盘:

model = "glm-4.7"
model_provider = "a4api_p4"

[model_providers.a4api_p4]
name = "智谱-openai"
base_url = "http://127.0.0.1:17890"
wire_api = "responses"
experimental_bearer_token = "本地代理鉴权token"

代理在转发前把 Responses 请求翻译为 Chat Completions,详见本地翻译代理

2. 模型目录 models.json

Codex 解析一个自定义模型时需要完整的元数据(上下文窗口、推理档位、工具形态等),这些信息来自模型目录:默认 ~/.codex/models.json,或跟随 config.toml 中 model_catalog_json 指定的路径(可用环境变量 A4API_CODEX_CATALOG_PATH 覆盖)。

切换时 a4api 确保所用模型出现在目录里,规则如下:

目录现状 a4api 的动作
已有该模型的完整条目(含消息模板等深度字段) 不做任何改动
已有该模型的简略条目 移除后按完整模板重建,避免 Codex 解析失败
没有该模型 优先复制目录中已有条目的结构(如 deepseek-v4-flash),目录为空时使用内置默认模板,仅替换标识字段

重建条目时统一设置 slugdisplay_name 为模型名、描述标注 via a4api local proxy,并把 context_windowmax_context_window 设为 200000、有效窗口占比 95%。models.json 的写法同样是先备份语义上的安全写入——临时文件加原子替换。

3. 切换后的生效方式

Codex 在进程启动时读取 config.toml 与模型目录,切换完成后界面会明确提示「重启 Codex 后生效」。a4api 不代管 Codex 进程的重启(与 Claude Code 的一键重启不同),手动重开终端里的 Codex 即可。

graph LR A[点击切换
含 codex 目标] --> B{服务商是否
原生 Responses} B -->|是| C[config.toml
指向上游+真实Key] B -->|否| D[启动本地代理
config.toml 指向代理] C --> E[维护 models.json
模型元数据] D --> E E --> F[提示重启 Codex] F --> G[Codex 重启后
新配置生效] style A fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px style B fill:#ebdef0,stroke:#8e44ad,stroke-width:2px style C fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style D fill:#ffecd6,stroke:#e67e22,stroke-width:2px style E fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px style F fill:#fdebd0,stroke:#b7950b,stroke-width:2px style G fill:#d5f5e3,stroke:#27ae60,stroke-width:2px

4. 备份与合并保护

与 Claude Code 目标一致,写入 config.toml 前自动备份到数据目录(命名 codex.config.时间戳.toml.bak,滚动保留 5 份),写入采用临时文件加原子替换。合并策略上只动顶层 modelmodel_provider 与 a4api 前缀的服务商条目,用户手工维护的 MCP 配置、审批策略等其他 TOML 内容不受影响。

三端统一的备份与回滚方法见配置方案与一键切换第 5 节;config.toml 及相关文件的实际落盘位置见数据目录与日志说明

5. 常见问题

问:为什么我的 Codex 配置没有走本地代理?

答:说明你选的服务商带有「原生 Responses」标记,Codex 直连上游 /responses 接口,这是设计内的最优路径,延迟更低、少一跳转发。目前仅 DeepSeek 官方满足条件。

问:请求报 400 上游错误怎么办?

答:0.1.1 至 0.1.3 版本已修复三类典型 400(developer 角色映射、残缺 tool_call 历史、tool 响应顺序),若仍遇到请确认升级到最新版;仍复现时附上 ~/.a4api/logs/a4api.log 相关片段反馈,见版本更新说明

问:models.json 里多了一个我没建过的条目?

答:那是 a4api 为切换所用模型补全的元数据条目,描述会标注 via a4api local proxy。它只增不删、不影响你自己维护的条目;不需要时删除该条目即可,下次切换会按需重建。

问:同一个服务商想同时给 Claude Code 和 Codex 用?

答:直接在配置方案里同时勾选两个目标即可。注意此时应选择 OpenAI 兼容类型服务商:Claude Code 一侧由本地翻译代理供给 Anthropic 流量,Codex 一侧视原生能力直连或走代理,两端互不干扰。