ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

openrig 统一编排 Claude Code 与 Codex:YAML 配置与 Node.js 实战

openrig 统一编排 Claude Code 与 Codex:YAML 配置与 Node.js 实战 1. 从“openrig”这个名字说起它到底想解决什么问题第一次看到“openrig”这个词我脑子里蹦出来的画面是矿机机架、服务器机柜或者某种硬件测试台。但结合热搜词里那一串 Claude Code、Codex、YAML、Node.js 来看这明显不是一个硬件项目而是一个围绕 AI 编程助手做“统一编排”的工具。rig 在英文里有“装配、搭台子”的意思open 则点明了它的开源属性——说白了openrig 想干的事就是把散落各处的 AI 编码工具Claude Code、Codex 这类 CLI 智能体用一套配置文件管起来让它们像乐高一样能拼、能换、能复用。我接触这类工具大概是从去年开始那时候大家还在手动敲claude命令、手动改环境变量、手动切 API 端点。痛点非常集中配置散、切换烦、复现难。你在一台机器上跑通了 Claude Code 接本地模型换台机器就得从头再来一遍你想同时用 Codex 处理一个任务、用 Claude Code 处理另一个任务两边配置互相打架。openrig 这类项目的价值就在这儿——它把“工具怎么装、模型怎么接、参数怎么传”全部收敛到一份 YAML 里用 Node.js 做运行时一条命令拉起整套环境。适合谁看这篇内容三类人。第一类是刚听说 Claude Code、Codex 但还没跑起来的开发者你需要一个清晰的安装和配置路径第二类是已经在用但被多工具切换折磨的人你需要一套统一管理方案第三类是想基于 openrig 做二次开发或集成到自己工作流里的工程师你需要理解它的设计取舍。下面我会从整体设计、核心细节、实操落地、问题排查四个层面把 openrig 这套东西拆开讲透。2. 整体设计与思路拆解为什么是 YAML Node.js 这套组合2.1 用 YAML 做配置层的真实考量很多人第一反应是为什么不用 JSONJSON 不是更通用吗我实际用下来YAML 在“人写配置”这个场景里优势非常明显。JSON 不允许注释不允许尾逗号多层嵌套时括号看得人眼花而 openrig 要管理的配置项包括模型端点、API 密钥引用、工具启动参数、环境变量注入、代理规则等层级深、注释需求强。YAML 的缩进式结构天然适合表达“某个工具下面挂哪些模型、每个模型带哪些参数”这种树形关系。举个实际对比。用 JSON 写一个 Claude Code 接本地模型的配置大概是这样{ tools: { claude-code: { endpoint: http://localhost:1234/v1, model: local-model, env: { ANTHROPIC_BASE_URL: http://localhost:1234 } } } }同样的东西用 YAMLtools: claude-code: endpoint: http://localhost:1234/v1 model: local-model env: ANTHROPIC_BASE_URL: http://localhost:1234少了大量引号和括号可读性提升不是一点半点。更重要的是YAML 支持锚点和引用这在多工具共享同一套模型配置时极其有用。你可以定义一个defaults锚点然后让 Claude Code 和 Codex 都引用它改一处全生效。这是 JSON 做不到的。提示YAML 对缩进极其敏感Tab 和空格混用会直接报解析错误。我踩过的坑是编辑器自动把 Tab 转成空格但宽度不一致排查了半小时。建议统一用两个空格缩进并在编辑器里开启“显示空白字符”。2.2 Node.js 作为运行时的合理性openrig 选 Node.js 不是随便选的。Claude Code 和 Codex 这类工具本身就是 Node.js 生态的产物它们的 CLI 通过 npm 分发运行时依赖 Node 环境。openrig 要做的“编排”工作——读取 YAML、解析配置、启动子进程、注入环境变量、转发请求——用 Node.js 写是最顺手的因为它可以直接调用child_process管理子进程用fs读配置用http模块做本地代理转发不需要跨语言桥接。另一个原因是跨平台。Node.js 在 Windows、macOS、Linux 上行为一致openrig 的用户不可能只用一种系统。热搜词里同时出现了“claude code windows”“ubuntu 配置 claude code”“codex 安装 windows 桌面版”说明用户群体横跨三大平台。Node.js 的跨平台能力让 openrig 只需要维护一套代码。版本选择上有个坑要注意。热搜里有一条“error installing 24.21.0: node.js v24.21.0 is not yet released”这说明有人试图安装一个不存在的版本。Node.js 的版本号是有规律的偶数版本是 LTS长期支持奇数版本是 Current尝鲜。生产环境应该用 LTS比如 20.x 或 22.x。24.x 如果还没发布 LTS就不要在生产环境用。2.3 统一编排的核心思路openrig 的设计哲学可以用一句话概括配置即环境。你不再手动 export 一堆环境变量不再手动改工具的配置文件而是把所有东西写进一份 openrig 的 YAML然后由它来生成各个工具需要的运行环境。这个思路解决了一个很实际的问题Claude Code 和 Codex 各自有自己的配置方式。Claude Code 读环境变量比如ANTHROPIC_BASE_URL、ANTHROPIC_API_KEYCodex 读自己的配置文件通常在用户目录下的.codex目录。如果你要同时用两个工具接不同的模型手动管理这些配置会疯掉。openrig 在中间做了一层抽象你只描述“我要什么”它负责“怎么给”。3. 核心细节解析与实操要点配置、安装、接入3.1 openrig 的 YAML 配置结构长什么样基于常见实践openrig 的配置文件通常命名为openrig.yaml或rig.yaml放在项目根目录或用户配置目录。它的结构大致分三层全局设置、工具定义、模型定义。version: 1 defaults: timeout: 30000 retry: 2 models: local-qwen: provider: openai-compatible endpoint: http://localhost:1234/v1 api_key: ${LOCAL_API_KEY} model_name: qwen2.5-coder remote-glm: provider: openai-compatible endpoint: https://open.bigmodel.cn/api/paas/v4 api_key: ${GLM_API_KEY} model_name: glm-4 tools: claude-code: model: local-qwen env: ANTHROPIC_BASE_URL: ${models.local-qwen.endpoint} ANTHROPIC_API_KEY: ${models.local-qwen.api_key} codex: model: remote-glm config: model_provider: openai model: ${models.remote-glm.model_name}这里有几个设计细节值得说。第一${}语法做变量引用避免密钥硬编码。第二models和tools分离一个模型可以被多个工具引用改模型配置不用动工具配置。第三defaults提供全局兜底减少重复。注意API 密钥绝对不要直接写进 YAML 然后提交到代码仓库。用环境变量引用或者用.env文件配合 gitignore。我见过有人把密钥写进配置推到公开仓库结果被扫到滥用账单直接爆掉。3.2 Node.js 环境准备版本、安装、验证openrig 跑起来的前提是 Node.js 环境正确。这一步看着简单但热搜里大量“node.js 安装”“node.js 官网下载”“安装 node.js”说明很多人卡在这儿。Windows 用户直接去 Node.js 官网下载 LTS 版本的.msi安装包双击一路下一步即可。安装完成后打开 PowerShell 或 CMD输入node -v npm -v能输出版本号就说明装好了。如果提示“不是内部或外部命令”说明 PATH 没配好重新安装并勾选“Add to PATH”。macOS 用户我强烈建议用nvmNode Version Manager而不是直接装。原因很简单不同项目可能需要不同 Node 版本nvm 让你随时切换。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install 20 nvm use 20Ubuntu 用户可以用 NodeSource 的源装比系统自带的版本新curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs装完之后验证一下顺便把 npm 的镜像源配一下国内网络环境下能省很多时间npm config set registry https://registry.npmmirror.com3.3 Claude Code 和 Codex 的安装与接入Claude Code 的安装方式是通过 npm 全局安装npm install -g anthropic-ai/claude-code装完之后在终端输入claude就能启动。但默认它连的是官方端点如果你想接本地模型或第三方兼容端点就需要通过环境变量覆盖。这正是 openrig 发挥作用的地方——它帮你把这些环境变量管起来。Codex 的安装类似也是 npm 全局包。装完之后它会在用户目录生成配置目录。Codex 的配置比 Claude Code 复杂一些因为它支持多种 provider需要指定model_provider、model、base_url等。热搜里有一条“codex 接入 deepseek”这其实是很多人的真实需求用 Codex 的交互界面但后端接 DeepSeek 的模型。做法是在 Codex 配置里把 provider 设成 openai 兼容模式base_url 指向 DeepSeek 的端点model 填对应的模型名。openrig 的 YAML 里可以把这个配置模板化一键切换。3.4 本地代理与端点转发的关键点热搜里有一条“cc switch local proxy failed while handling codex endpoint /responses”这暴露了一个核心问题Claude Code 和 Codex 使用的 API 协议不完全一样。Claude Code 走的是 Anthropic 的消息格式Codex 走的是 OpenAI 的 responses 格式。如果你用一个本地代理同时服务两者就需要做协议转换。openrig 如果内置了本地代理功能它要处理的就是接收 Claude Code 发来的 Anthropic 格式请求转换成 OpenAI 格式发给后端模型再把响应转回 Anthropic 格式。这个转换层是很多问题的根源——字段映射不对、流式响应处理不当、错误码没透传都会导致“local proxy failed”。实操建议先用最简单的场景验证代理是否工作。不要一上来就接复杂模型先用一个 echo 服务或者最基础的 OpenAI 兼容端点测试连通性。确认请求能通、响应能回再逐步加复杂度。4. 实操过程与核心环节实现从零跑通一套 openrig 环境4.1 环境初始化与依赖安装我以 Ubuntu 22.04 为例完整走一遍。第一步确认系统基础环境sudo apt update sudo apt upgrade -y sudo apt install -y curl git build-essential第二步装 Node.js 20 LTScurl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs node -v # 应该输出 v20.x.x第三步装 openrig。如果它是 npm 包npm install -g openrig如果是源码仓库git clone https://github.com/your-org/openrig.git cd openrig npm install npm link第四步装 Claude Code 和 Codexnpm install -g anthropic-ai/claude-code npm install -g openai/codex到这里基础环境就绪。验证一下which claude which codex which openrig三个路径都能输出说明安装成功。4.2 编写第一份 openrig 配置在项目目录下创建openrig.yaml。我先写一个最小可用版本只接一个本地模型version: 1 models: local: provider: openai-compatible endpoint: http://127.0.0.1:1234/v1 api_key: not-needed model_name: local-model tools: claude-code: model: local env: ANTHROPIC_BASE_URL: http://127.0.0.1:1234 ANTHROPIC_API_KEY: not-needed这里endpoint指向本地推理服务比如 LM Studio 或 Ollama 的 OpenAI 兼容接口。ANTHROPIC_BASE_URL之所以不带/v1是因为 Claude Code 会自己拼路径这个细节很多人搞错导致 404。4.3 启动与验证流程配置写好后用 openrig 拉起环境openrig up它应该会读取 YAML解析出 claude-code 工具需要的环境变量然后启动一个 shell 或者直接启动 claude。如果 openrig 的设计是生成环境文件那可能是openrig env .env source .env claude验证是否接通在 Claude Code 里输入一个简单问题比如“你好请回复 OK”。如果模型正常响应说明链路通了。如果报错看错误信息是连接失败还是认证失败还是模型不存在分别排查。4.4 多工具并行配置的实操真正体现 openrig 价值的是多工具场景。假设我要 Claude Code 接本地 QwenCodex 接远程 GLMversion: 1 models: local-qwen: provider: openai-compatible endpoint: http://127.0.0.1:1234/v1 api_key: not-needed model_name: qwen2.5-coder-7b remote-glm: provider: openai-compatible endpoint: https://open.bigmodel.cn/api/paas/v4 api_key: ${GLM_API_KEY} model_name: glm-4-plus tools: claude-code: model: local-qwen env: ANTHROPIC_BASE_URL: http://127.0.0.1:1234 ANTHROPIC_API_KEY: not-needed codex: model: remote-glm config: model_provider: openai model: glm-4-plus base_url: https://open.bigmodel.cn/api/paas/v4GLM_API_KEY从环境变量读不写死在文件里。启动时export GLM_API_KEYyour-key-here openrig up这样两个工具各接各的模型互不干扰。切换模型只需要改 YAML 里的model字段不用动任何环境变量。4.5 参数计算与超时设置超时设置是个容易被忽略但很关键的参数。本地小模型推理慢7B 模型在消费级显卡上生成 500 token 可能要 30 秒以上。如果超时设成默认的 10 秒请求会频繁中断。我的经验值本地 7B 模型超时设 120 秒本地 14B 以上设 300 秒远程 API设 60 秒足够。重试次数设 2 次但要注意——如果模型本身不支持幂等重试可能导致重复生成。对于流式响应重试要谨慎。defaults: timeout: 120000 retry: 2 retry_delay: 2000单位是毫秒。retry_delay是重试间隔给后端一点恢复时间。5. 常见问题与排查技巧实录5.1 安装阶段的典型报错热搜里“error installing 24.21.0: node.js v24.21.0 is not yet released”这个错误原因是 npm 包声明了不存在的 Node 版本依赖。解决办法是检查包的engines字段或者直接用--ignore-engines跳过检查不推荐可能有兼容问题。更稳妥的做法是看这个包实际需要什么版本装对应的 LTS。另一个常见问题是权限。Linux 下全局安装 npm 包如果没配好会报EACCES。解决办法是配置 npm 的全局目录到用户目录mkdir -p ~/.npm-global npm config set prefix ~/.npm-global export PATH~/.npm-global/bin:$PATH5.2 连接与认证类问题“your organization has disabled claude subscription access for claude code”这个报错说明账号层面的订阅权限被限制了。这不是技术问题是账号配置问题。需要检查账号的订阅状态和组织策略。如果是个人账号确认订阅是否有效如果是组织账号联系管理员确认策略。“codex 无法加载组织设置”类似通常是配置文件路径不对或者权限不足。Codex 的配置目录在用户 home 下检查文件是否存在、格式是否正确、权限是否可读。5.3 代理转发失败的排查思路“cc switch local proxy failed while handling codex endpoint /responses”这个错误排查顺序应该是确认代理进程在跑端口在监听netstat -tlnp | grep 端口号确认请求能到达代理用 curl 直接打代理端点确认代理能连到后端看代理日志里的上游请求确认协议转换正确对比请求和响应的字段我遇到过一次代理收到请求后一直挂起最后发现是流式响应的Transfer-Encoding头没处理好客户端在等一个永远不会来的结束标志。解决办法是在代理层正确处理 chunked 编码确保每个 chunk 都 flush。5.4 常见问题速查表问题现象可能原因排查方向解决方式命令找不到PATH 未配置echo $PATH把 npm 全局 bin 加入 PATH安装报版本错误包声明了不存在的 Node 版本看包 engines 字段装对应 LTS 或跳过检查连接超时端点地址错误或服务未启动curl 测试端点修正地址或启动服务认证失败密钥错误或权限不足检查密钥和账号状态更新密钥或联系管理员代理挂起流式响应处理不当看代理日志修正 chunked 编码处理模型不存在模型名拼写错误对比模型列表修正 model_name配置不生效YAML 缩进错误用 YAML 校验工具统一缩进为两个空格5.5 独家避坑经验第一个坑不要在生产环境用 Current 版 Node。奇数版本号21、23是尝鲜版生命周期短API 可能变。用偶数 LTS。第二个坑YAML 里的布尔值陷阱。YAML 会把yes、no、on、off解析成布尔值如果你本意是字符串要加引号。我见过有人把模型名写成on结果被解析成true排查半天。第三个坑环境变量优先级。openrig 注入的环境变量和系统已有的环境变量可能冲突。搞清楚谁覆盖谁通常 openrig 注入的应该优先但具体看实现。建议在配置里显式声明所有需要的变量不要依赖系统环境。第四个坑本地模型的上下文长度。Claude Code 和 Codex 会发送很长的上下文包括文件内容、对话历史本地小模型的上下文窗口可能不够导致请求被截断或报错。用本地模型时选上下文至少 32K 的8K 的根本不够用。第五个坑端口冲突。本地推理服务和代理服务可能抢同一个端口。启动前用lsof -i :端口号检查一下。6. 进阶玩法与扩展思路6.1 多模型路由策略openrig 的 YAML 结构天然支持多模型。你可以定义多个模型然后在工具层面做路由。比如简单任务走本地小模型快、免费复杂任务走远程大模型慢、收费。实现方式可以是在 openrig 里加一层路由逻辑根据请求的 token 数或关键词决定用哪个模型。models: fast-local: endpoint: http://127.0.0.1:1234/v1 model_name: qwen2.5-coder-7b smart-remote: endpoint: https://api.example.com/v1 model_name: large-model routing: rules: - match: token_count 2000 model: fast-local - match: default model: smart-remote这种配置在 openrig 里是否原生支持要看具体实现但思路是通用的——把路由规则也配置化。6.2 与 VS Code 的集成热搜里“vscode 配置 claude code”“claude code for vs code”“vscode 接入 claude code”出现频率很高。Claude Code 有 VS Code 扩展装完之后可以在编辑器里直接调用。关键是让扩展读到 openrig 管理的环境变量。做法是在 VS Code 的settings.json里配置终端环境或者用 openrig 生成一个.env文件然后在 VS Code 的 launch 配置里引用。更彻底的方式是让 openrig 直接管理 VS Code 的终端 profile启动终端时自动注入环境。6.3 配置的版本管理与团队共享openrig 的 YAML 配置适合纳入版本管理。但密钥不能进仓库。我的做法是YAML 里用${VAR}引用仓库里放一个.env.example说明需要哪些变量实际.env文件 gitignore 掉。团队成员 clone 之后复制.env.example为.env填入自己的密钥即可。这样既保证了配置的可复现性又不会泄露密钥。新人入职当天就能跑通环境不用口口相传“你要先 export 这个再 export 那个”。6.4 监控与日志openrig 作为中间层天然适合做日志收集。每个请求的模型、耗时、token 数、是否成功都可以记录下来。这些数据对于优化配置很有价值——你会发现某些模型在特定任务上表现更好某些超时设置需要调整。日志格式建议用结构化 JSON方便后续分析{timestamp:2025-01-15T10:30:00Z,tool:claude-code,model:local-qwen,duration_ms:4500,tokens_in:1200,tokens_out:350,status:success}积累一段时间后你就能用数据回答“本地模型到底够不够用”“远程 API 的成本主要花在哪”这类问题。7. 我对这套方案的真实体会openrig 这类工具的核心价值不在于它做了多复杂的事而在于它把“配置管理”这件事从手工劳动变成了声明式描述。我用下来的感受是一旦配置写对了后面切换模型、切换工具、迁移环境都是分钟级的事但配置本身有学习成本YAML 的坑、环境变量的优先级、协议转换的细节都需要踩一遍才清楚。如果你刚开始接触我的建议是先用最小配置跑通一个工具接一个模型确认链路通了再往上加复杂度。不要一上来就搞多模型多工具出了问题根本不知道是哪一层的事。另外把每次成功的配置存下来形成自己的模板库下次遇到类似场景直接改改就能用。最后分享一个我常用的调试技巧在 openrig 启动时加一个--dry-run或者--verbose参数如果支持的话把最终生成的环境变量和配置打印出来。这样你能清楚看到 openrig 到底给你的工具喂了什么比在黑盒里猜要高效得多。如果 openrig 不支持那就手动在启动脚本里env | grep ANTHROPIC看一眼同样管用。
RELATED READING

延伸阅读

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