openrig 配置编排:用 YAML 统一管理 Claude Code 与 Codex 多工具环境
发布时间:2026/10/2 17:19:16 锦皓数字建站

1. openrig 到底是个什么东西第一次看到 openrig 这个名字很多人会以为是某个硬件外设或者开源机械臂项目。实际上它跟物理设备没有半点关系而是一个围绕 AI 编程助手做配置编排与运行环境管理的工具思路。简单说openrig 要解决的核心问题是当你同时使用 Claude Code、Codex 这类命令行 AI 编程工具时如何用一份统一的 YAML 配置把模型接入、端点路由、环境变量、项目级参数这些东西全部管起来而不是每换一个工具就重新配一遍。我最初接触这个方向是因为团队里有人用 Claude Code有人用 Codex还有人两个混着用。每个人电脑上的配置都不一样有人把 API 端点写在 shell 的 profile 里有人写在工具自己的配置文件里结果就是同一个项目在不同人机器上跑出来的行为不一致。更麻烦的是当你想把某个工具从云端模型切到本地模型或者从一家服务商切到另一家改配置的过程极其零散容易漏改、容易冲突。openrig 这类工具的价值就在这里它把工具怎么启动、连哪个端点、用哪个模型、带哪些参数抽象成一份声明式的 YAML让配置变成可版本控制、可复用、可审查的东西。它适合谁如果你只是偶尔用一下 AI 补全代码那确实用不上。但如果你满足下面任意一条openrig 这套思路就值得认真看一是你同时维护多个 AI 编程工具的配置二是你的项目需要固定模型行为不能今天一个样明天一个样三是你在团队里需要把配置标准化让新人 clone 下来就能跑四是你在本地和云端模型之间来回切换需要一个统一的切换入口。这几类场景下手工维护配置的边际成本会迅速上升而声明式编排正好对症。需要先说明一点openrig 本身并不是一个官方标准它更像是一类配置编排层的统称。你在网上搜到的具体实现可能各不相同有的是一组脚本有的是一个 Node.js 写的 CLI 包装器有的干脆就是一套约定俗成的 YAML 目录结构。所以下面我讲的内容重点放在这套编排思路怎么落地而不是某个特定仓库的逐行代码。理解了思路你换成任何具体实现都能套上去。2. 为什么用 YAML 做配置中枢2.1 YAML 在 AI 工具链里的天然优势选 YAML 而不是 JSON 或者 TOML不是随便定的。AI 编程工具的配置里嵌套结构特别多一个工具下面有模型配置模型配置下面有端点、鉴权、超时、重试策略再往下还有每个项目覆盖的参数。JSON 写这种多层嵌套括号和引号一多就容易看花眼而且 JSON 不支持注释你想在配置里写一句这个端点只在测试环境用都没地方写。TOML 虽然支持注释但深层嵌套的表达能力偏弱遇到数组套对象再套数组的结构会很别扭。YAML 恰好在这几点上都比较舒服缩进表达层级一眼能看出从属关系支持注释方便标注每个字段的用途和注意事项支持锚点和引用可以把重复的配置片段抽出来复用。这最后一点对 openrig 特别关键——你可能有五六个项目它们的端点配置完全一样只是模型名不同用 YAML 锚点就能只写一份端点定义其他地方引用即可。# 公共端点定义用锚点标记 endpoints: primary: primary_endpoint base_url: https://api.example.com/v1 timeout: 60 retry: 3 # 不同工具引用同一个锚点 tools: claude-code: endpoint: *primary_endpoint model: claude-sonnet codex: endpoint: *primary_endpoint model: gpt-codex上面这段就是 YAML 锚点的典型用法。primary_endpoint定义了一个锚点*primary_endpoint引用它。改端点地址只需要改一处所有引用它的工具自动生效。这种复用能力在纯 JSON 里要靠工具自己实现YAML 是语言层面就支持的。2.2 声明式配置和命令式脚本的区别很多人第一反应是写个 shell 脚本用 export 设置环境变量然后启动工具。这属于命令式做法你告诉系统先做这个再做那个。命令式的问题在于它描述的是过程不是状态。脚本跑一半失败了你不知道当前处于什么状态脚本重复跑可能重复设置导致冲突想在脚本里做条件判断很快就变成一堆 if-else 面条。声明式配置描述的是最终应该是什么样。你写清楚期望的端点、模型、参数至于怎么把这些应用到具体工具上交给编排层去处理。好处是可预测同样的配置跑多少次结果都一样可审查配置本身就是文档review 的时候一眼能看出改了什么可回滚配置进了 git出问题直接 revert。我踩过的一个坑是早期用脚本管理配置某次改端点地址时漏改了 Codex 那一份结果 Claude Code 走新端点Codex 还走旧端点两边行为不一致排查了半天才发现是脚本里两处硬编码没同步。换成 YAML 锚点之后这种改一处漏一处的问题从根上消失了。2.3 配置分层全局、项目、会话三级openrig 这类工具通常会把配置分成三层理解这个分层是理解整个体系的关键。全局层放的是跨项目通用的东西端点地址、鉴权信息、默认超时、日志级别。这一层通常放在用户主目录下比如~/.config/openrig/global.yaml。它不随项目变化是机器级别的基础设置。项目层放的是跟具体项目绑定的配置这个项目用哪个模型、要不要开某些实验性参数、项目特有的系统提示词。这一层放在项目根目录比如.openrig.yaml跟着代码一起进版本控制。新人 clone 项目后项目层配置自动就位只需要补全局层的鉴权信息。会话层是临时覆盖比如你今天想临时换个模型试试效果不想改项目配置就可以在启动命令里带一个覆盖参数。这一层优先级最高但生命周期最短会话结束就失效。三层的优先级是会话层 项目层 全局层。这个顺序符合直觉——越具体的配置优先级越高。理解了这个你就知道为什么有时候改了全局配置却不生效很可能是项目层把它覆盖了。3. 环境准备Node.js 与工具链安装3.1 Node.js 版本选择与安装openrig 这类编排工具以及 Claude Code、Codex 的 CLI 版本绝大多数都是 Node.js 生态的产物。所以第一步是把 Node.js 装对。这里有个高频坑不要盲目装最新版。网上经常有人报error installing 24.21.0: node.js v24.21.0 is not yet released or is not available这种错原因就是版本号写错了或者用了还没正式发布的版本。稳妥的做法是装LTS长期支持版本。LTS 版本经过充分测试生态兼容性最好。截至我写这篇内容时Node.js 20.x 和 22.x 都是 LTS 线选哪个都行我一般推荐 20.x因为它的兼容性验证最充分。安装方式按系统分Windows直接去 Node.js 官网下载 LTS 的.msi安装包双击一路下一步即可。安装完在 PowerShell 里跑node -v和npm -v验证。macOS推荐用nvmNode Version Manager管理方便多版本切换。装好 nvm 后nvm install 20再nvm use 20。Ubuntu / Linux同样推荐 nvm不要用apt install nodejs因为系统源里的版本往往偏旧而且升级麻烦。# 安装 nvmmacOS / Linux curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重新加载 shell 配置 source ~/.bashrc # 或 ~/.zshrc # 安装并使用 Node.js 20 LTS nvm install 20 nvm use 20 nvm alias default 20 # 验证 node -v # 应输出 v20.x.x npm -v注意如果你之前用系统包管理器装过 Node.js装 nvm 之前最好先卸载干净否则可能出现 PATH 冲突node -v显示的版本和你以为的不一致。3.2 包管理器与全局工具安装Node.js 装好后npm 会自带。但 npm 装全局包有时候会遇到权限问题尤其是在 Linux 和 macOS 上。我的建议是配置一个用户级的全局目录避免每次都要 sudo。# 创建用户级全局目录 mkdir -p ~/.npm-global npm config set prefix ~/.npm-global # 把该目录加入 PATH写进 ~/.bashrc 或 ~/.zshrc export PATH~/.npm-global/bin:$PATH source ~/.bashrc这样配置之后npm install -g装的包会进到~/.npm-global不需要 sudo也不会污染系统目录。这个习惯我从很早以前就养成了省去了无数权限相关的麻烦。接下来装 Claude Code 和 Codex 的 CLI。这两个工具的安装命令会随版本变化以官方文档为准但大体形式是# 安装 Claude Code CLI示例以官方为准 npm install -g anthropic-ai/claude-code # 安装 Codex CLI示例以官方为准 npm install -g openai/codex装完之后claude --version和codex --version应该能正常输出版本号。如果提示 command not found八成是 PATH 没配好检查一下~/.npm-global/bin是否在 PATH 里。3.3 编辑器侧配置VS Code 接入很多人习惯在 VS Code 里用这些工具而不是纯终端。VS Code 接入 Claude Code 或 Codex通常有两种方式一是装对应的扩展二是在 VS Code 的集成终端里直接跑 CLI。扩展的好处是有图形界面、能跟编辑器深度集成CLI 的好处是配置完全走 openrig 那一套行为一致。我个人的选择是日常用 CLI因为配置统一、可脚本化需要看 diff、做交互式 review 的时候用扩展。两者不冲突可以共存。VS Code 的settings.json里可以配置集成终端的默认 shell 和环境变量如果你希望 VS Code 里的终端也走 openrig 的配置记得把相关环境变量在这里也带上。4. openrig 配置结构实战拆解4.1 一份完整的 openrig YAML 长什么样光讲概念太虚直接上一份我实际在用的配置结构。这份配置同时管理 Claude Code 和 Codex 两个工具支持在云端端点和本地端点之间切换。# ~/.config/openrig/global.yaml version: 1 # 端点定义区 endpoints: cloud: base_url: https://api.example.com/v1 api_key_env: OPENRIG_CLOUD_KEY # 从环境变量读 key不硬编码 timeout: 60 retry: 3 local: base_url: http://127.0.0.1:1234/v1 api_key_env: OPENRIG_LOCAL_KEY timeout: 120 retry: 1 # 工具定义区 tools: claude-code: command: claude endpoint: cloud model: claude-sonnet env: CLAUDE_CODE_DISABLE_TELEMETRY: 1 codex: command: codex endpoint: cloud model: gpt-codex env: CODEX_LOG_LEVEL: info # 默认行为 defaults: tool: claude-code endpoint: cloud这份配置有几个设计点值得说。第一API key 不写进 YAML而是通过api_key_env指定从哪个环境变量读。这样配置文件可以安全地进 git不会泄露密钥。第二端点和工具分开定义工具通过名字引用端点切换端点只需要改工具定义里的endpoint字段。第三defaults区定义了不指定参数时的默认行为减少每次启动都要敲一堆参数的负担。4.2 项目级配置的覆盖机制全局配置管通用部分项目级配置管差异部分。项目根目录放一个.openrig.yaml# .openrig.yaml项目根目录 version: 1 extends: global # 继承全局配置 # 覆盖默认工具 defaults: tool: codex # 项目专属覆盖 tools: codex: model: gpt-codex-mini # 这个项目用更便宜的模型 env: CODEX_LOG_LEVEL: debug # 这个项目要详细日志 # 项目专属参数 project: system_prompt_file: .openrig/prompt.md context_files: - src/**/*.ts - docs/architecture.mdextends: global声明继承全局配置然后在需要的地方覆盖。注意覆盖是深度合并还是整体替换不同实现不一样这点要查清楚。我用的实现是深度合并tools.codex下面只写了model和env那么command和endpoint会从全局继承只有明确写了的字段才覆盖。这个行为符合直觉但如果你用的实现是整体替换那就要把完整定义都写全否则会丢字段。4.3 环境变量注入与密钥管理密钥管理是配置编排里最容易出事的地方。我见过有人把 API key 直接写在 YAML 里然后提交到公开仓库结果 key 被扫走刷爆额度。正确做法是配置里只放环境变量名真实值放在环境变量或密钥管理工具里。# 在 shell 配置里设置~/.bashrc 或 ~/.zshrc export OPENRIG_CLOUD_KEYsk-xxxxxxxx export OPENRIG_LOCAL_KEYnot-needed-for-local如果团队协作环境变量怎么同步我的做法是全局配置进 git不含密钥密钥通过团队内部的密钥管理工具分发每个人在自己机器上设置环境变量。新人入职时clone 配置仓库然后按文档设置几个环境变量就能跑起来。这样既保证了配置一致性又不会泄露密钥。注意不要把密钥写进项目级的.openrig.yaml然后提交。哪怕仓库是私有的密钥进 git 历史之后很难彻底清除一旦仓库权限变更或者有人 fork密钥就泄露了。5. 多工具协同与端点切换实操5.1 Claude Code 与 Codex 的配置差异Claude Code 和 Codex 虽然都是 AI 编程 CLI但配置项并不完全一样。Claude Code 更强调项目上下文和权限控制Codex 更强调模型选择和端点灵活性。openrig 的价值就在于把这些差异封装在工具定义里对使用者暴露统一的接口。配置维度Claude CodeCodexopenrig 统一处理方式端点配置环境变量或配置文件配置文件为主统一在 endpoints 区定义模型选择启动参数或配置启动参数或配置统一在 tools 区指定鉴权方式API key 环境变量API key 环境变量统一用 api_key_env 引用日志级别环境变量控制环境变量控制统一在 env 区注入项目上下文自动读取项目文件需显式指定统一在 project 区声明这张表不是绝对的具体字段以各工具官方文档为准但思路是通用的把每个工具的差异点找出来在 openrig 层做归一化让上层使用体验一致。5.2 云端与本地模型的无缝切换本地模型比如通过 LM Studio 或其他本地推理服务跑起来的模型和云端模型的切换是 openrig 最实用的场景之一。本地模型的好处是数据不出机器、没有网络延迟、不消耗额度坏处是能力通常弱于云端大模型。所以理想状态是日常简单任务走本地复杂任务走云端切换成本要低。在 openrig 里切换就是改一个字段的事# 用默认云端 openrig run # 临时切到本地 openrig run --endpoint local # 或者改项目配置长期用本地 # .openrig.yaml 里把 tools.codex.endpoint 改成 local本地端点通常不需要真实 API key但很多工具会检查这个字段是否存在所以给个占位值即可。本地推理服务的地址一般是http://127.0.0.1:端口/v1这种形式具体端口看你用的推理服务。我实测下来本地模型在代码补全、简单重构这类任务上够用但涉及复杂逻辑推理或者跨文件重构还是云端模型更靠谱。所以我的配置是默认走云端需要处理敏感代码时手动切本地。这个切换动作在 openrig 里就是加一个参数比改一堆环境变量省事太多。5.3 端点故障时的降级策略端点不可能永远可用。云端服务可能限流、可能临时故障本地服务可能没启动。openrig 的配置里可以定义降级链主端点失败时自动尝试备用端点。endpoints: primary: base_url: https://api.example.com/v1 api_key_env: OPENRIG_CLOUD_KEY timeout: 60 fallback: base_url: http://127.0.0.1:1234/v1 api_key_env: OPENRIG_LOCAL_KEY timeout: 120 tools: codex: command: codex endpoint: primary fallback_endpoint: fallback # 主端点失败时用这个 model: gpt-codex降级策略要注意一点不是所有失败都该降级。鉴权失败key 错了降级到本地可能掩盖问题网络超时降级是合理的。所以配置里最好能区分错误类型只对特定错误触发降级。这个逻辑不同实现支持程度不一样如果工具本身不支持可以在外层包一层脚本做判断。6. 常见问题与排查实录6.1 配置不生效的排查顺序配置改了但行为没变这是最高频的问题。排查顺序我总结成一条链先确认读的是哪份配置再确认优先级最后确认字段名。第一步确认工具实际加载的配置文件路径。很多工具支持--config参数或者环境变量指定配置路径先用这个确认它读的是不是你改的那份。我遇到过改了项目配置但工具读的是全局配置的情况就是因为工作目录不对工具没找到项目级配置。第二步确认优先级。会话层 项目层 全局层如果你在全局改了但项目层有覆盖那全局的改动就是不生效的。用工具的 dry-run 或者 verbose 模式打印最终生效的配置一眼就能看出哪层赢了。第三步确认字段名拼写。YAML 对字段名大小写敏感base_url和baseUrl是两个不同的字段。这种错误不会报错只会静默忽略特别隐蔽。建议配置写完后用 YAML 校验工具过一遍至少保证语法正确。6.2 常见错误速查表错误现象可能原因排查方法command not foundPATH 未包含全局 bin 目录检查~/.npm-global/bin是否在 PATH鉴权失败 401环境变量未设置或 key 错误echo $OPENRIG_CLOUD_KEY确认值存在连接超时端点地址错误或服务未启动curl 直接测端点连通性模型不支持模型名拼写错误或端点不支持该模型对照端点文档确认模型名配置不生效优先级覆盖或字段名错误用 verbose 模式打印生效配置YAML 解析报错缩进错误或特殊字符未转义用 YAML linter 校验本地端点连不上本地推理服务未启动确认服务进程和端口版本不兼容Node.js 版本过旧或过新切到 LTS 版本重试这张表里的每一条我都实际遇到过。其中模型不支持那条特别值得说有时候端点支持某个模型但你的账号权限不够报错信息会写成模型不支持容易误导。遇到这种先确认账号权限再怀疑模型名。6.3 几个容易忽略的细节YAML 的布尔值陷阱。YAML 里yes、no、on、off会被解析成布尔值如果你本来想写字符串就会出问题。比如某个字段期望字符串on你写成on解析出来是true。解决办法是给可能歧义的值加引号。环境变量的作用域。在 shell 里export的变量只对当前 shell 及其子进程有效。如果你在 VS Code 里跑工具而 VS Code 是从图形界面启动的它可能读不到你在.bashrc里 export 的变量。这种情况要么在 VS Code 的配置里单独设置要么从终端启动 VS Code。配置文件的编码。YAML 默认按 UTF-8 解析如果你在 Windows 上用记事本编辑可能存成带 BOM 的 UTF-8某些解析器会报错。用 VS Code 或者专门的编辑器确认保存为无 BOM 的 UTF-8。路径分隔符。Windows 用反斜杠Linux/macOS 用正斜杠。YAML 里写路径建议统一用正斜杠大多数工具在 Windows 上也能正确识别正斜杠反而反斜杠在 YAML 里需要转义容易出错。7. 团队协作中的配置标准化7.1 把配置纳入版本控制团队里每个人机器上的配置不一样是协作效率的隐形杀手。同一个项目A 用云端模型B 用本地模型C 的端点地址还是旧的结果三个人跑出来的行为都不一样讨论问题时鸡同鸭讲。解决办法是把配置纳入版本控制项目级配置跟着代码走全局配置单独一个仓库管理。项目级配置进项目仓库好处是配置和代码同步演进。改了项目结构配置里的上下文文件列表也跟着改review 的时候一起看。全局配置单独一个仓库好处是跨项目复用新人入职 clone 一次就搞定基础环境。7.2 新人上手流程设计新人入职理想流程是clone 代码仓库clone 配置仓库设置几个环境变量然后就能跑。这里面最容易卡住的是环境变量设置因为涉及密钥不能写进仓库。我的做法是提供一个setup.sh脚本引导新人设置环境变量并做基本验证。#!/bin/bash # setup.sh - 新人环境初始化 set -e echo 检查 Node.js 版本... node -v || { echo 请先安装 Node.js LTS; exit 1; } echo 检查全局工具... claude --version || npm install -g anthropic-ai/claude-code codex --version || npm install -g openai/codex echo 请设置以下环境变量写入 ~/.bashrc 或 ~/.zshrc echo export OPENRIG_CLOUD_KEY你的密钥 echo export OPENRIG_LOCAL_KEYlocal echo 验证配置... openrig validate || echo 配置校验失败请检查这个脚本不处理密钥本身只做检查和引导密钥还是由新人自己设置。这样既降低了上手门槛又不会把密钥写进任何文件。7.3 配置变更的审查要点配置进 git 之后变更就要走 review。review 配置时重点看三样密钥有没有混进来、端点地址对不对、模型名有没有拼错。密钥混入是最严重的一旦合并进主分支清理起来很麻烦。可以在 CI 里加一个检查扫描配置文件里有没有疑似密钥的字符串比如以sk-开头的长串。端点地址和模型名的错误往往要到运行时才暴露所以 review 时要对照文档确认。如果团队有测试环境最好在合并前跑一次冒烟测试确认配置能正常加载、能连上端点、能调用模型。8. 我踩过的坑和几条实用建议先说一个最坑的YAML 缩进用 Tab 还是空格。YAML 规范禁止用 Tab 缩进但有些编辑器默认 Tab 键插入的是 Tab 字符保存后解析就报错。解决办法是在编辑器里设置Tab 键插入空格并且把 YAML 文件的缩进统一成 2 个空格。这个坑我踩过不止一次每次都是排查半天才发现是缩进字符的问题。第二个坑是环境变量名大小写。Linux 和 macOS 的环境变量名区分大小写Windows 不区分。如果你在 Windows 上设置OPENRIG_CLOUD_KEY在 Linux 上写成openrig_cloud_keyWindows 上能跑Linux 上就找不到。团队协作时统一用大写加下划线的命名规范避免这种跨平台差异。第三个坑是本地端点的端口冲突。本地推理服务默认端口可能和你机器上其他服务冲突启动失败但报错信息不明显。遇到本地端点连不上先确认端口有没有被占用换个端口试试。几条实用建议配置写完先跑校验命令别等到运行时才发现语法错误密钥用环境变量管理永远不要写进配置文件配置进 git但密钥不进多工具协同先统一端点定义再分别配置工具差异本地和云端切换做成一个参数的事别搞成改一堆文件。最后分享一个小技巧给 openrig 配置加一个openrig doctor之类的自检命令一次性检查 Node.js 版本、全局工具是否安装、环境变量是否设置、端点是否可达、配置文件是否合法。这个命令在排查问题时特别省事新人上手也能自己先跑一遍减少来问你的次数。我自己写了一个简单的版本就是把上面那些检查串起来输出一份体检报告哪项不通过一目了然。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。