1. 321 个文档、15 小时、30 个 Agent:我踩过的坑
Codex 15 小时跑完 OpenAI 321 个文档,Claude Code 同时拉起 30 个 Agent 做批量翻译——这套组合拳听起来很猛,但真正落地时,最容易被忽略的不是模型能力,而是统一 Key 接入和多 Agent 配置骨架。我这次用 TaoToken 把 Codex、Claude Code、GLM 几个入口收敛到一套 Key 上,才把 321 个 HTML 文档的抓取、翻译、校验流水线跑通。
这篇文章不讲虚的,直接交付三样东西:可复制的settings.json与config.toml配置片段、TaoToken 统一 Key 接入步骤、以及 Agent 并发与超时的验证动作。适合正在做文档批处理、多 Agent 协作、或者想把 Codex/Claude Code 接进自己流水线的开发者。如果你只是偶尔问几个问题,这篇可能偏重;但只要你手上有几百个页面要处理,下面的配置骨架能帮你少走至少两天弯路。
先说结论:321 个文档里,API Docs 156 个、Codex Docs 与 use-cases 152 个、Apps SDK 3 个、导航首页 9 个、Developers 首页 1 个。抓取阶段用 Codex 跑镜像克隆,翻译阶段用 Claude Code 拉起多 Agent,全程通过 TaoToken 统一 Key 调度。下面按工程顺序拆。
2. TaoToken 前置:统一 Key 与入口选择
TaoToken 在这里的角色是统一接入层:你不需要为每个模型单独维护一套 Key 和 endpoint,而是用一套 Key 走同一个 API 入口,再在配置里切换模型。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (注意 API 地址不加 UTM 参数)。
具体要拿的东西有三样:
第一,API Key。进控制台创建,地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,创建完在 API Keys 页面复制,页面是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。这个 Key 后面会同时写进 Codex 的config.toml和 Claude Code 的settings.json。
第二,确认模型名。文档批处理场景我用到的是 Codex 系列和 GLM 系列,模型对话入口在 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite ,你可以先在对话页确认模型可用,再写进配置。
第三,接入文档。配置字段、超时参数、并发限制这些细节以官方文档为准,地址是 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。我下面给的配置片段是实测可用的骨架,但字段含义建议对照文档确认一遍。
注意:API Key 只放在本地配置文件或环境变量里,不要提交到 Git。文档批处理项目通常会把配置目录加进
.gitignore。
3. 可复制配置:settings.json 与 config.toml
这一节是全文的核心。Codex 和 Claude Code 读的是不同格式的配置文件,但都指向同一个 TaoToken API 基址。先给 Codex 的config.toml:
# ~/.codex/config.toml model = "codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat" [request] timeout_ms = 600000 max_retries = 3关键点三个:base_url指向 TaoToken API,env_key指定从环境变量读 Key,timeout_ms给到 10 分钟——文档批处理单页可能很大,超时太短会频繁断。环境变量这样设:
export TAOTOKEN_API_KEY="sk-你的Key"再给 Claude Code 的settings.json,这是多 Agent 协作的核心:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的Key", "ANTHROPIC_MODEL": "claude-sonnet-4-5", "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "8192", "MAX_THINKING_TOKENS": "4096" }, "permissions": { "allow": ["Read", "Write", "Bash(npm run *)", "Bash(node *)"] }, "concurrency": { "maxAgents": 30, "taskTimeoutMs": 900000, "retryOn429": true, "backoffMs": 2000 } }maxAgents设 30 是这次实测的并发上限,taskTimeoutMs给 15 分钟,retryOn429打开——多 Agent 并发时 429 几乎必然出现,关键是退避重试而不是直接失败。permissions.allow只放开必要的命令,避免 Agent 乱跑。
如果你要做长期编码或 Agent 流水线,建议直接上 Coding Plan,入口是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,比按量计费更适合这种长时间批量任务。
4. 验证请求:从单页到 321 页流水线
配置写完先别急着跑全量,用单页验证链路通不通。Codex 侧跑一条最小命令:
codex exec "读取 openai/_build/package.json,列出所有 npm scripts 名称" \ --config ~/.codex/config.toml能正常返回脚本列表,说明 Key、base_url、模型名三者都对。如果报 401,检查TAOTOKEN_API_KEY是否 export 成功;报 404,检查base_url是不是漏了/api。
Claude Code 侧验证多 Agent 是否真的并发:
claude -p "统计 openai/cn 目录下 html 文件数量,输出数字" \ --settings ~/.claude/settings.json返回 321 就对了。接着跑真正的批处理流水线,抓取阶段命令如下:
cd openai/_build npm install npm run fetch -- --concurrency=2 --delay=250 npm run mirror -- --force --scope=home,api,codex --delay=1000 npm run mirror:use-cases npm run mirror:nav npm run search npm run cn:scaffold--concurrency=2和--delay=250是防触发限制的关键,别贪快。翻译阶段用 Claude Code 拉起多 Agent,核心是让每个 Agent 只处理一个页面、只翻可见文本节点:
node cn-translate-batch.mjs --mode=page --batch=60 --concurrency=30--batch=60表示每 60 条文本打成一个窗口发给模型,--concurrency=30对应 30 个 Agent。实测下来,60 条一批既不会撑爆上下文,又能把效率拉满。翻译结果写进translations.json作为唯一映射表,再用cn-translate-safe.mjs apply回填 HTML,只动可见文本,不碰属性、脚本、代码块和 URL。
成功结果长这样:321 个 HTML 文件处理,307 个已修改,306 个完全翻译,导航、侧边栏、UI 标签全部中文化,剩余 5% 是代码示例和结构元素,正确跳过。校验阶段跑一遍结构检查,确认astro-island数量、代码块数量、英文残留比例都没异常。
5. 本篇常见错排查
429 错误频繁出现。多 Agent 并发时这是最常见的。先降maxAgents,从 30 降到 15 观察;同时确认retryOn429和backoffMs生效。如果降并发后仍大量 429,检查是不是多个 Agent 在抢同一个页面,任务分配要按页面去重。
翻译后 HTML 结构损坏。根因通常是直接对整段 HTML 做字符串替换,碰到了astro-island、代码块或属性里的 JSON。正确做法是抽取文本节点、生成翻译清单、模型只翻 JSON 里的文本、脚本回填。回填后必须跑校验:HTML 是否可解析、关键组件数量是否变化、代码块数量是否变化。
部分页面大量英文没翻译。这次踩到一个提取规则的坑:shouldTranslate里有一条if (/^[,.;:|]/.test(value)) return false;,本意是滤掉纯标点碎片,却误杀了<strong>标签</strong>: 正文这种以冒号开头的正文片段。影响范围是 1931 个文本节点、横跨 218 个页面。修复方式是放宽规则,只过滤纯标点,不过滤带正文的片段。
翻译条目错位。模型偶尔在长度正确的返回里把数组项对调,二分检测不到。处理方式是揪出可疑条目,清除后用batch=1单条重翻,单条不可能错位。这次 24528 条里只有 93 条不含中文,其中大部分是该保留的版本号和专有名词。
超时中断导致对话作废。长任务一定要设taskTimeoutMs并开启断点续传。translations.json作为幂等映射表,中断后重跑只翻没翻过的,不会重复消耗。
6. 接入与排障入口
如果你在配置settings.json或config.toml时卡住,优先看接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,字段含义和超时参数都在里面。Key 相关的问题去 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。想先验证模型能不能正常返回,用模型对话页最快:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。长期跑文档批处理或 Agent 流水线,直接看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。
最后留一个我实测的参数组合:抓取阶段concurrency=2, delay=250,翻译阶段batch=60, concurrency=30, taskTimeoutMs=900000,回填后必跑结构校验。这套参数在 321 页规模下零失败推进,你可以直接拿去改。