ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

使用 Codex 自动完成 Gitee 仓库全托管:把 auth.json 改到 TaoToken

使用 Codex 自动完成 Gitee 仓库全托管:把 auth.json 改到 TaoToken

1. 为什么要把 Codex 的 auth.json 改到 TaoToken

如果你正在用 Codex 做 Gitee 仓库的全托管——批量 Fork、定时同步上游、通过 OpenAPI 拉取仓库元数据——那你迟早会撞上一个问题:Codex 默认走的是官方鉴权通道,一旦涉及多仓库、多任务并发,额度、区域、模型版本都会变成不确定因素。我试过在同一个下午连续跑十几个 Fork 同步任务,中途因为鉴权通道抖动导致三个任务卡在reading choices阶段,排查了半小时才发现是上游通道的问题。

这篇要解决的就是这件事:把 Codex 的auth.json从默认配置改到 TaoToken 的统一 Key/API 通道,让 Codex 在 Gitee 仓库全托管场景下有一个稳定、可观测、可切换模型的鉴权底座。TaoToken 在这里扮演的角色是「统一 API 通道」——它把模型调用收敛到一个 Base URL 和一把 Key 上,Codex 只管发请求,不用关心背后是哪个模型供应商。

适合谁看:已经在用 Codex CLI 或 Codex 类 Agent 工具、需要批量管理 Gitee 仓库(Fork、同步、OpenAPI 调用)、并且希望把模型鉴权从「碰运气」变成「可配置」的开发者。你不需要是 Codex 老手,但至少要能跑通codex命令、知道auth.json大概在哪。

核心检索词先明确:Codex auth.json 配置 TaoToken 接入 Gitee 仓库全托管。这句话拆开就是三件事——改哪个文件、填什么内容、改完之后 Gitee 的 Fork 和同步任务怎么验证。下面按这个顺序来。

先说清楚边界:TaoToken 不是 Gitee 的替代品,也不是 Git 客户端。它只负责模型调用这一层。Gitee 的私人令牌、仓库权限、Fork 关系这些,还是走 Gitee 自己的 OpenAPI。两者是叠加关系,不是替换关系。这一点想清楚,后面的配置就不会乱。

2. TaoToken 前置准备:Key、Base URL 与 Codex 的对接位置

在动auth.json之前,你得先把 TaoToken 这边的三样东西拿到手:API Key、Base URL、以及你要用的 Model ID。这三样是后面所有配置的基础,缺一个都跑不起来。

2.1 获取 API Key 与确认 Base URL

打开 TaoToken 控制台,进入 API Keys 页面创建一个新的 Key。建议按用途命名,比如codex-gitee-automation,这样后面如果要在多个 Agent 之间区分额度,一眼就能认出来。Key 只在创建时完整显示一次,复制后先放到安全的地方,别直接粘到聊天窗口或者 Git 配置文件里。

Base URL 固定为:

https://taotoken.net/api

注意这里不带任何查询参数,就是干净的 API 根路径。Codex 的auth.json里填的就是这个值。如果你之前见过别人写带/v1的地址,那是 OpenAI 兼容层的写法,TaoToken 的接入文档里给的是上面这个根路径,以文档为准。

Model ID 这块,Codex 场景下常用的几个模型在 TaoToken 的模型列表里都能查到。你可以在控制台的模型页面确认当前可用的 ID,比如claude-sonnet-4-5这类。记住这个 ID,auth.json里要填。

2.2 Codex 的 auth.json 在哪

Codex CLI 的鉴权文件默认在用户目录下的.codex文件夹里:

~/.codex/auth.json

Windows 下是%USERPROFILE%\.codex\auth.json。如果你之前登录过官方账号,这个文件已经存在,里面是官方通道的 token 结构。我们要做的是把它改成指向 TaoToken 的配置。

改之前先备份一份:

cp ~/.codex/auth.json ~/.codex/auth.json.bak

这一步别省。改错了能一键回滚,比重新登录省事得多。

2.3 为什么不是改环境变量而是改 auth.json

Codex 读取鉴权信息的优先级里,auth.json是持久化配置,环境变量是临时覆盖。对于 Gitee 全托管这种要长期跑、可能要挂定时任务或 CI 的场景,写进auth.json更稳。环境变量在 cron 或 systemd 里容易丢,而且多个任务之间会互相污染。所以这篇统一走auth.json方案。

如果你同时用 Cline MCP 或者 Claude Code,它们的配置位置不一样——Cline 走 MCP 的 settings,Claude Code 走自己的配置文件。但核心三件套是一样的:Base URL、Key、Model ID。记住这个模式,换工具只是换个文件路径。

3. 可复制配置:auth.json 完整片段与 Gitee 令牌分离

这一节是全文最核心的部分。我会给出auth.json的完整可复制片段,然后说明 Gitee 令牌为什么不能写进这个文件,以及正确的存放方式。

3.1 auth.json 完整配置片段

把~/.codex/auth.json的内容替换成下面这个结构。注意把sk-开头的 Key 换成你自己在 TaoToken 控制台创建的那把:

{ "OPENAI_API_KEY": "sk-your-taotoken-key-here", "OPENAI_BASE_URL": "https://taotoken.net/api", "OPENAI_MODEL": "claude-sonnet-4-5", "provider": "openai-compatible", "preferred_auth_method": "apikey" }

逐字段说明一下,避免你填错:

字段值说明
OPENAI_API_KEY你的 TaoToken Key以sk-开头,控制台创建
OPENAI_BASE_URLhttps://taotoken.net/api固定值,不带/v1
OPENAI_MODEL模型 ID从 TaoToken 模型列表选
provideropenai-compatible告诉 Codex 走兼容层
preferred_auth_methodapikey用 Key 鉴权,不走 OAuth

这里有个坑要提前说:有些版本的 Codex 对provider字段的取值敏感,如果你填了openai而不是openai-compatible,它可能会尝试走官方 OAuth 流程,然后报OAuth相关的错误。以你本地 Codex 版本的文档为准,但openai-compatible是兼容性最好的写法。

3.2 Gitee 令牌为什么不写进 auth.json

auth.json只管模型调用鉴权,Gitee 的私人令牌是另一套东西。把 Gitee 令牌写进auth.json有两个问题:一是职责混乱,模型配置和仓库权限混在一起,后面排查问题分不清是哪层出错;二是安全风险,auth.json可能会被某些工具读取或同步,Gitee 令牌泄露的后果比模型 Key 更严重——它能直接操作你的仓库。

正确做法是把 Gitee 令牌存到系统 Keychain,Codex 在需要时动态读取。macOS 下:

security add-generic-password \ -a gitee-user001 \ -s codex-gitee-token \ -w "你的GITEE_TOKEN" \ -U

gitee-user001换成你的 Gitee 用户名,你的GITEE_TOKEN换成在 Gitee「设置 -> 私人令牌」里生成的那串。生成时勾选projects权限就够了,别全选。

Linux 下可以用secret-tool或者直接放一个权限为600的文件,但 Keychain 方案更干净。Windows 下用凭据管理器。

3.3 验证 auth.json 是否被正确加载

改完文件后,跑一个最小请求确认 Codex 能读到新配置:

codex --version codex "用一句话说明当前使用的模型"

如果返回正常文本,说明auth.json生效了。如果报401或者local proxy failed,先别急着改 Gitee 那边,问题在模型鉴权层,回到 3.1 检查 Key 和 Base URL。

这一步过了,再往下走 Gitee 的 Fork 和同步。顺序不能反,否则出错时你不知道是模型层还是仓库层的问题。

4. 验证请求:一次 Gitee Fork 同步任务的完整动作与预期输出

配置改完只是开始,真正要验证的是「Codex 能不能在 TaoToken 通道下,稳定地完成 Gitee 仓库全托管任务」。这一节用一个具体的 Fork 同步任务来跑通全流程。

4.1 验证 Gitee 授权是否可用

先确认 Codex 能从 Keychain 读到 Gitee 令牌,并调用 OpenAPI 验证身份:

TOKEN=$(security find-generic-password \ -a gitee-user001 \ -s codex-gitee-token \ -w) curl -s -H "Authorization: token $TOKEN" \ https://gitee.com/api/v5/user | head -20

预期输出是一段 JSON,包含你的 Gitee 用户名、ID、邮箱等字段。HTTP 状态码是 200。如果返回401,说明令牌无效或权限不足,回 Gitee 重新生成。

这一步的意义在于:把「Gitee 授权」和「模型鉴权」分开验证。两个都通了,再组合起来跑任务。

4.2 通过 OpenAPI 创建 Fork

假设上游仓库是bdca/aibot,你要 Fork 到自己的空间:

curl -X POST \ -H "Authorization: token $TOKEN" \ https://gitee.com/api/v5/repos/bdca/aibot/forks

预期返回 HTTP201,响应体里包含新仓库的full_name,格式是你的用户名/aibot。同时fork字段为true,parent字段指向bdca/aibot。

如果返回403,检查令牌的projects权限是否勾选。如果返回404,检查上游仓库路径是否写对。

4.3 让 Codex 接管后续同步任务

Fork 创建好之后,把同步逻辑交给 Codex。你可以用自然语言描述任务,比如:

帮我把 gitee-user001/aibot 的 test 分支与上游 bdca/aibot 的 test 分支同步, 如果有冲突先列出来不要自动合并。

Codex 会通过 Gitee OpenAPI 拉取两个仓库的分支信息,比较 commit 差异,然后执行同步。整个过程你不需要手敲 git 命令,也不需要打开 Gitee Desktop。

预期输出是一段任务报告,包含:上游最新 commit hash、本地 Fork 当前 commit hash、需要同步的 commit 数量、同步结果。如果一切正常,最后会显示sync completed或类似状态。

4.4 验证模型通道在任务中是否稳定

跑完上面这个同步任务后,回头看 Codex 的日志(通常在~/.codex/logs下),确认整个过程中没有出现reading choices报错或者超时重试。如果出现了,说明 TaoToken 通道在这个时间段有波动,可以换个模型 ID 再试,或者检查网络。

这一步是「全托管」的关键:任务能跑通一次不算数,要能稳定跑通多次。建议连续跑三次同样的同步任务,观察成功率。

5. 本篇常见错误排查:401、local proxy failed、reading choices、OAuth

这一节把配置和验证过程中最容易撞到的四类报错集中处理。每个都给出真实报错文本、原因和修复动作。

5.1 401 Unauthorized

报错文本:

Error: 401 Unauthorized {"error":{"message":"Invalid API key","type":"invalid_request_error"}}

原因通常是三种:Key 复制时带了空格或换行、Key 已过期或被删除、auth.json里的OPENAI_API_KEY字段名写错。

修复:重新从 TaoToken 控制台复制 Key,确认auth.json里字段名是OPENAI_API_KEY而不是API_KEY或OPENAI_KEY。改完保存,重新跑codex "test"。

5.2 local proxy failed

报错文本:

Error: local proxy failed to start

这个通常出现在 Codex 尝试启动本地代理但端口被占用,或者auth.json里的provider字段和实际通道不匹配时。

修复:先检查有没有其他 Codex 进程在跑,ps aux | grep codex杀掉残留进程。然后确认provider是openai-compatible。如果还不行,把auth.json恢复成备份,重新按 3.1 的片段填一遍。

5.3 reading choices 报错

报错文本:

Error: failed to read choices from response

这是模型返回的响应格式和 Codex 预期不一致导致的,常见于 Model ID 填错或者通道返回了非标准结构。

修复:确认OPENAI_MODEL填的是 TaoToken 模型列表里真实存在的 ID。如果 ID 对但还是报错,换一个模型 ID 试,比如从claude-sonnet-4-5换成同系列的其他版本。这个报错和 Gitee 无关,纯粹是模型层的问题。

5.4 OAuth 相关报错

报错文本:

Error: OAuth flow failed, please login again

出现这个说明 Codex 还在尝试走官方 OAuth 流程,没有走你的auth.json配置。原因通常是preferred_auth_method字段缺失或值不对。

修复:确认auth.json里有"preferred_auth_method": "apikey"。如果之前登录过官方账号,可能还有缓存的 OAuth token 在干扰,删掉~/.codex/下除auth.json外的其他鉴权缓存文件,重启 Codex。

5.5 排查顺序建议

遇到报错时,按这个顺序定位:先看是不是模型层(401、reading choices、OAuth),再看是不是 Codex 进程层(local proxy failed),最后才看 Gitee 层(403、404)。模型层的问题占大多数,而且改auth.json就能解决。

如果你用的是 Cline MCP 或 Claude Code,报错文本会不一样,但排查逻辑相同:先确认 Base URL、Key、Model ID 三件套填对,再看工具本身的配置格式。

6. 把 Gitee 全托管跑成日常:CTA 与后续动作

配置跑通之后,Gitee 仓库全托管就可以变成日常动作了。批量 Fork、定时同步、OpenAPI 拉取仓库元数据,这些都可以交给 Codex 在 TaoToken 通道下执行。你只需要维护好两样东西:auth.json里的模型配置,和 Keychain 里的 Gitee 令牌。

后续如果要扩展,几个方向可以参考:

一是把同步任务写成脚本,挂到 cron 或 systemd timer 上,Codex 负责执行,TaoToken 负责模型调用,Gitee OpenAPI 负责仓库操作。三层各司其职,出问题好定位。

二是如果你同时管理多个 Gitee 账号,Keychain 里可以存多个 service 条目,Codex 按账号切换读取。auth.json不用动,模型通道是共享的。

三是模型 ID 可以按任务类型切换。批量 Fork 这种轻量任务用便宜快速的模型,复杂的冲突分析用能力强的模型。TaoToken 的模型列表里可以随时查可用 ID。

需要创建新的 API Key 或者查看模型列表,去控制台:

https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_gitee_auth

接入文档里有完整的字段说明和示例,配置时对照着看:

https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_gitee_auth

想先在网页里验证模型通道是否正常,可以用模型对话页面发一条测试消息:

https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_gitee_auth

如果你打算把 Codex 长期挂在 Gitee 仓库管理上跑,Coding Plan 比按量计费更划算,适合这种持续性的 Agent 任务:

https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex_gitee_auth

最后提醒一句:Gitee 令牌的权限别给太大,projects够用就行。模型 Key 和 Gitee 令牌分开存,auth.json里永远不要出现 Gitee 令牌。这个习惯养成了,后面不管换什么工具、加什么任务,都不会乱。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进