ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Codex 开源 harness 全面了解:从 auth.json 到 Base URL 的接入配置拆解

Codex 开源 harness 全面了解:从 auth.json 到 Base URL 的接入配置拆解 1. 为什么本地跑 Codex harness 总卡在接入层Codex 开源 harness 是 OpenAI 放出的编码 agent 运行时Apache-2.0 协议核心引擎已经用 Rust 重写仓库里codex-rs/目录承载了绝大部分逻辑codex-cli/只剩一层很薄的 Node 包装。它能做什么简单说它把「模型对话」和「本地文件读写、命令执行」串成一个可编排的回合循环你给它一个任务它自己决定读哪个文件、跑哪条命令、改哪一行。适合谁适合想把编码 agent 嵌进自己工作流、CI 流水线或者单纯想搞明白 agent 运行时到底怎么组织的人。但真正动手的人会发现harness 本身跑起来不难难的是接入层。auth.json放哪、字段叫什么、Base URL 怎么指、模型 ID 从哪来这几件事一旦错一个表现就是各种看不懂的报错要么 401要么local proxy failed要么流式响应里reading choices直接断掉。我见过太多人卡在这一步以为是 harness 有 bug其实是配置没对齐。这篇就聚焦接入层把auth.json和 Base URL 的配置拆开讲给可复制的片段最后用一个真实请求验证链路。你跟着做能跑通一次完整的模型调用确认 harness 到模型服务这条链路是活的。核心检索词就三个Codex、harness、开源接入配置。读完你应该能自己判断「是配置问题还是网络问题」。先说清楚一个前提Codex harness 的接入层设计是「认证信息」和「服务端点」分离的。认证走auth.json端点走环境变量或配置文件里的 Base URL。这两者必须同时正确缺一不可。很多人只改了 Base URL 却忘了auth.json里的 key或者反过来结果就是反复 401。2. TaoToken 前置把 Key 和端点准备好在动 Codex harness 之前你得先有一个能用的模型服务端点和一个 API Key。这里我用 TaoToken 作为示例端点因为它同时提供 OpenAI 兼容接口和 Claude Code 兼容接口对 Codex 这种走 OpenAI 协议风格的 harness 比较友好。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进控制台拿 Key。拿 Key 的路径是登录后进 console找到 API Keys 页面新建一个 Key。这个 Key 就是后面要写进auth.json的东西。注意Key 只在创建时完整显示一次复制下来存好。如果你用的是团队账号确认一下这个 Key 有没有绑定到你想用的模型组。端点方面TaoToken 的 API 基址是 https://taotoken.net/api 注意这个地址不带任何查询参数是纯粹的 Base URL。Codex harness 里配置 Base URL 时通常需要的是「到/v1之前」的那一段具体取决于 harness 版本对路径的拼接方式。这一点后面配置章节会展开。模型 ID 这块你需要确认自己要用哪个模型。Codex harness 默认会读配置里的 model 字段如果你不指定它可能用一个内置默认值而那个默认值在你的端点上未必存在。所以最稳的做法是显式写死模型 ID。TaoToken 的模型列表可以在模型对话页面或者文档里查到选一个你账号有权限的。这里有个容易踩的坑有些人把 Key 直接写进 shell 的export OPENAI_API_KEYxxx然后指望 harness 自动读。Codex harness 确实支持读环境变量但它的读取优先级和字段名在不同版本里变过。为了可复现我建议统一走auth.json把环境变量作为兜底而不是主路径。这样你换机器、换 shell 都不会因为忘了 export 而失败。另外提醒一句auth.json里存的 Key 是明文别把它提交到 git。放到~/.codex/下面并且确认这个目录不在任何仓库的追踪范围内。团队协作时用.gitignore把auth.json和config.toml都排除掉只提交一份脱敏的示例文件。3. 可复制配置auth.json 与 Base URL 拆解这一节是重点给可直接复制的片段。先明确目录约定Codex harness 默认读~/.codex/下的配置。auth.json和config.toml都放这里。如果你用CODEX_HOME环境变量改了目录那下面的路径要相应替换。先看auth.json。它的结构在不同版本略有差异但核心字段是固定的。下面这份是实测可用的最小结构{ OPENAI_API_KEY: sk-你的TaoToken密钥, OPENAI_BASE_URL: https://taotoken.net/api }注意两点。第一字段名是OPENAI_API_KEY和OPENAI_BASE_URL不是api_key或base_url。Codex harness 读的是这套大写蛇形命名。第二OPENAI_BASE_URL这里填的是不带/v1的基址harness 内部会自己拼/v1/chat/completions或/v1/responses。如果你填成https://taotoken.net/api/v1很可能拼出/api/v1/v1/...这种重复路径直接 404。然后是config.toml。这个文件管的是 harness 的行为包括模型选择、沙箱模式、审批策略。接入层相关的关键片段如下model 你选定的模型ID model_provider openai [sandbox] mode workspace-write [approval] policy on-requestmodel_provider openai这行告诉 harness 走 OpenAI 兼容协议这样它才会去读auth.json里的OPENAI_BASE_URL。如果你不写这行某些版本会走默认 provider可能忽略你的 Base URL。如果你更习惯用环境变量而不是auth.json等价配置是export OPENAI_API_KEYsk-你的TaoToken密钥 export OPENAI_BASE_URLhttps://taotoken.net/api但如前所述环境变量在子进程、CI 环境里容易丢auth.json更稳。两者同时存在时auth.json优先级更高。关于模型 ID这里给一个判断方法如果你不确定端点上有哪些模型先用模型对话页面手动发一条消息看它返回的模型名或者查文档里的模型列表。把那个确切的字符串填进model字段。别用模糊匹配harness 不做模型名归一化。还有一个细节config.toml里的键名是 snake_case比如model_provider而不是modelProvider。这个和auth.json的大写风格不一样别混。我见过有人把auth.json写成小写结果 harness 读不到报 401查了半天以为是 Key 失效。配置写完用cat ~/.codex/auth.json确认一下内容注意别在共享屏幕上暴露 Key。然后就可以进下一步验证了。4. 验证请求跑一次确认链路可用配置对不对跑一次就知道。Codex harness 提供了无头模式codex exec适合做链路验证因为它不启动 TUI输出直接打到 stdout方便看结果。最简验证命令codex exec --json 用一句话说明当前目录下有哪些文件这条命令会做几件事读auth.json拿 Key 和 Base URL读config.toml拿模型和 provider然后向https://taotoken.net/api/v1/...发一个请求把模型返回的内容以 JSON 形式打出来。如果链路通你会看到类似这样的输出结构{type:message,role:assistant,content:当前目录下有 README.md、src、package.json 等文件。}具体字段名可能因版本而异但关键是你能看到 assistant 的回复内容而不是错误对象。看到内容说明认证、端点、模型三件事都对了。如果你想更直接地验证 Base URL 和 Key可以绕过 harness用 curl 打一发curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoToken密钥 \ -H Content-Type: application/json \ -d { model: 你选定的模型ID, messages: [{role: user, content: ping}] }这个 curl 能通说明 Key 和端点没问题那 harness 再报错就一定是 harness 配置的问题排查范围立刻缩小。这是个很实用的二分法先用 curl 确认服务侧再用codex exec确认 harness 侧。验证时注意看 HTTP 状态码。200 是通401 是 Key 问题404 是路径拼接问题429 是限流。把这几个码记住后面排错直接对号入座。跑通之后你可以把codex exec接进脚本比如在 CI 里做一次冒烟测试确认每次部署后接入层还是活的。命令加--json就是为了方便脚本解析。5. 常见错排查401、local proxy failed、reading choices这一节按真实报错来对。你大概率会遇到下面几类。第一类401 Unauthorized。报错原文通常是{error:{message:Incorrect API key provided,type:invalid_request_error}}。原因有三个可能Key 写错了、Key 没写进auth.json而是只写了环境变量但没生效、或者auth.json字段名写成了小写。排查顺序先cat ~/.codex/auth.json看字段名是不是OPENAI_API_KEY再看值有没有多余空格或换行。如果都对用第 4 节的 curl 直接测 Keycurl 也 401 就是 Key 本身的问题去 console 重新生成一个。第二类local proxy failed或connection refused。这个报错说明 harness 尝试连一个本地代理端口但那个端口没服务。常见原因是你的环境里设了HTTP_PROXY或HTTPS_PROXY环境变量harness 继承了它于是把请求发到了本地代理。解决办法是检查并清掉这些变量unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy然后重跑codex exec。如果你确实需要走代理那要确保代理服务在跑且能转发到taotoken.net。但多数情况下直连就够了多余的代理变量只会添乱。第三类reading choices相关报错比如error reading choices: unexpected end of JSON input。这个通常出现在流式响应场景说明 harness 在解析 SSE 流的时候收到的数据不完整或者格式不对。可能原因Base URL 填错导致返回了 HTML 错误页而不是 JSON、模型 ID 不存在导致端点返回了非预期结构、或者网络中断。排查先用 curl 非流式打一发确认返回的是标准 JSON再检查OPENAI_BASE_URL有没有多写/v1最后确认模型 ID 拼写。第四类OAuth 相关报错。如果你看到OAuth token expired或failed to refresh token说明 harness 在读某个 OAuth 凭证而不是你的 API Key。这通常是因为auth.json里混入了 OAuth 字段或者 harness 版本默认走了 OAuth 流程。解决办法是清空auth.json只保留OPENAI_API_KEY和OPENAI_BASE_URL两个字段删掉任何tokens、oauth之类的键。把这几类报错和对应动作整理成一张表方便你对照报错关键词最可能原因第一步动作401 / Incorrect API keyKey 错或字段名错检查 auth.json 字段名与值local proxy failed代理环境变量干扰unset 所有 proxy 变量reading choicesBase URL 或模型 ID 错curl 验证端点返回 JSONOAuth token expiredauth.json 混入 OAuth 字段只保留两个核心字段排查的核心思路是二分先用 curl 确认服务侧再用 harness 确认客户端侧。两边都通链路就通。6. 接入之后把配置固化下来链路跑通只是开始真正省事的是把配置固化。我的做法是把~/.codex/auth.json和~/.codex/config.toml做成模板换机器时直接复制只改 Key 和模型 ID 两个值。模板里OPENAI_BASE_URL固定填 https://taotoken.net/api 这样端点不会写错。如果你要在多台机器上同步别把 Key 提交到仓库。用一个本地脚本在首次运行时提示输入 Key 并写入auth.json脚本本身可以提交。这样既省事又不泄露。另外Codex harness 的配置键名演进比较快你升级版本后如果突然报配置错误先对照你装的版本的官方 config 参考确认键名没变。接入层的两个核心字段OPENAI_API_KEY和OPENAI_BASE_URL相对稳定但 provider 相关的键可能会调整。最后给一个实用技巧把验证命令写成一个 shell 函数每次改完配置跑一下几秒钟确认链路。比如codex_check() { codex exec --json reply with ok 21 | head -5 }输出里能看到 assistant 内容就是通看到 error 就按第 5 节排查。这个习惯能帮你把接入层的问题挡在真正干活之前。
返回列表