
1. openrig 到底想解决什么问题第一次看到openrig这个名字我下意识以为是某个硬件机架项目直到翻了一圈相关讨论才反应过来——它瞄准的是当下最火的两类终端 AI 编程工具Claude Code 和 Codex。简单说openrig想做的事情是给这些命令行 AI 助手做一层统一的“装备架”让你用一份 YAML 配置就能切换模型、切换端点、切换工具链而不是每换一个工具就重装一遍环境、重配一遍参数。这个痛点我太熟了。过去半年里我本地同时装着 Claude Code、Codex CLI还有几个自己写的调用脚本。每次想换个模型试试效果就得改环境变量、改配置文件、重启终端有时候还要处理 npm 全局包版本冲突。更麻烦的是Claude Code 和 Codex 的配置格式完全不一样一个是 JSON 加环境变量一个是 TOML 加 YAML想统一管理基本靠手写脚本硬凑。openrig出现的意义就是把这堆零散的配置收敛到一个 YAML 文件里用一套声明式的方式描述“我要用什么模型、走哪个端点、带哪些参数”。从热搜词能看出来大家最关心的几个点集中在Claude Code 安装、Codex 安装、YAML 文件怎么写、npm 安装卸载、以及各种端点连接失败的报错。这些恰好就是openrig要覆盖的场景。它适合谁我觉得三类人最需要一是同时用多个 AI 编程工具的开发者二是想快速切换本地模型和云端模型做对比的人三是被 npm 全局包和 PATH 环境变量折腾到崩溃的 Windows 用户。如果你只是偶尔用一下某个工具那确实没必要上openrig但如果你每天都在跟这些 CLI 打交道它能省下的时间相当可观。2. 核心设计思路与方案选型拆解2.1 为什么是 YAML 而不是 JSON 或 TOMLopenrig选择 YAML 作为核心配置格式这个决定背后有很实际的考量。JSON 不支持注释你没法在配置里写“这行是给本地模型用的那行是备用端点”过两周回来看就忘了。TOML 虽然支持注释但嵌套结构写起来很啰嗦尤其是当你要描述多个 provider、多个 model、多个 endpoint 的层级关系时TOML 的[section.subsection]语法会让人眼花。YAML 的优势在于缩进即层级注释随便写列表和字典混排很自然。举个实际例子你要配置两个模型端点一个走本地服务一个走云端 APIYAML 大概长这样providers: - name: local-llm type: openai-compatible base_url: http://127.0.0.1:1234/v1 api_key: not-needed models: - name: qwen2.5-coder context_window: 32768 - name: cloud-api type: anthropic base_url: https://api.anthropic.com api_key: ${ANTHROPIC_API_KEY} models: - name: claude-sonnet context_window: 200000同样的内容用 JSON 写光是引号和逗号就能让你改到怀疑人生。而且 YAML 支持环境变量插值${ANTHROPIC_API_KEY}这样密钥就不用硬编码在文件里配合.gitignore可以安全地提交配置模板。注意YAML 对缩进极其敏感Tab 和空格混用会直接报解析错误。我建议统一用两个空格缩进并且在编辑器里开启“显示空白字符”这样能一眼看出问题。2.2 统一抽象层怎么屏蔽 Claude Code 和 Codex 的差异Claude Code 和 Codex 虽然都是终端 AI 助手但它们的配置模型完全不同。Claude Code 主要靠环境变量比如ANTHROPIC_API_KEY、ANTHROPIC_BASE_URL加上项目根目录的.claude文件夹来管理行为。Codex 则更依赖~/.codex/config.toml和 YAML 格式的 profile 文件。openrig的做法是在中间加一层适配器你只写一份openrig.yaml它根据你当前激活的工具生成对应的配置文件或者设置对应的环境变量。这个适配层的关键在于“能力映射”。比如 Claude Code 支持max_tokens参数Codex 可能叫max_output_tokensopenrig内部维护一张映射表把统一配置里的字段翻译成各工具认识的格式。再比如端点路径Claude Code 默认走/v1/messagesCodex 可能走/responses适配器会根据 provider 类型自动拼接正确的路径。我实测下来这种抽象层最大的好处是“换工具不换配置”。以前我想从 Claude Code 切到 Codex 试试同一个模型得手动改三四个地方现在只需要在openrig.yaml里改一行active_tool: codex然后跑一条切换命令就行。2.3 与 npm 生态的集成策略openrig本身通过 npm 分发这意味着它的安装和更新走的是大家最熟悉的npm install -g openrig路径。但 npm 生态有个老问题全局包多了之后PATH 环境变量容易乱Windows 上还经常遇到 PowerShell 执行策略拦截.ps1脚本的情况。热搜词里“npm 无法加载文件 npm.ps1因为在此系统上禁止运行脚本”就是典型症状。openrig在设计上做了两件事来缓解这个问题。第一它尽量把依赖打包进自己的node_modules减少对全局包的依赖避免版本冲突。第二它提供了一个openrig doctor命令专门检查环境问题Node 版本、npm 全局路径、PATH 是否包含 npm 目录、PowerShell 执行策略是否放行。这个命令的输出会直接告诉你哪一步出了问题以及对应的修复命令。实操心得在 Windows 上装完 Node 之后如果npm命令报执行策略错误不要急着改注册表。先以管理员身份打开 PowerShell跑Set-ExecutionPolicy RemoteSigned -Scope CurrentUser然后重启终端。这个操作只影响当前用户比改全局策略安全得多。3. 核心配置细节与实操要点3.1 openrig.yaml 的完整字段说明一份典型的openrig.yaml包含四个顶层区块providers、tools、profiles、defaults。providers定义模型服务端点tools定义你本地装了哪些 CLI 工具以及它们的可执行文件路径profiles把 provider 和 tool 组合成可切换的预设defaults设置默认激活的 profile。先看providers区块。每个 provider 必须包含name、type、base_url三个字段。type决定了适配器怎么处理请求常见值有openai-compatible、anthropic、google、local。base_url是端点根地址注意不要带尾部的/v1或/messages适配器会自己拼。api_key支持三种写法直接写字符串、写${ENV_VAR}引用环境变量、写file:/path/to/key从文件读取。我推荐用环境变量方式这样配置文件可以安全地分享给团队。tools区块相对简单主要是告诉openrig你的 Claude Code 和 Codex 装在哪。如果你是用 npm 全局安装的通常不需要手动指定路径openrig会自动从 PATH 里找。但如果你用了 nvm 或者自定义安装目录就需要显式写出来tools: claude-code: command: claude config_dir: ~/.claude codex: command: codex config_dir: ~/.codexprofiles是核心中的核心。每个 profile 把 provider 和 tool 绑定并且可以覆盖参数profiles: - name: claude-local tool: claude-code provider: local-llm model: qwen2.5-coder overrides: max_tokens: 8192 temperature: 0.2 - name: codex-cloud tool: codex provider: cloud-api model: claude-sonnet overrides: max_output_tokens: 16384defaults区块就一行active_profile: claude-local。切换 profile 用openrig use codex-cloud它会自动更新defaults并重新生成各工具的配置文件。3.2 环境变量与密钥管理的最佳实践密钥管理是很多人踩坑的地方。我见过有人把 API Key 直接写在 YAML 里然后提交到 Git结果被扫描工具抓到密钥泄露。openrig支持环境变量插值但环境变量本身怎么管理也有讲究。在 macOS 和 Linux 上我习惯把密钥放在~/.openrig/env文件里权限设为600然后在 shell 的启动脚本里source这个文件。openrig启动时会自动读取这个文件不需要你手动 export。在 Windows 上可以用setx设置用户级环境变量但注意setx有长度限制太长的密钥可能被截断。更稳妥的方式是用openrig的secrets子命令它会把密钥加密后存在~/.openrig/secrets.enc用的时候再解密注入。注意如果你在团队里共享openrig.yaml一定要把api_key字段写成${VAR_NAME}形式并且在 README 里说明需要设置哪些环境变量。千万不要图省事直接写明文。3.3 多工具共存的目录结构规划当 Claude Code、Codex 和openrig同时存在时目录结构容易乱。我建议这样规划~/.openrig/ openrig.yaml # 主配置 env # 环境变量不提交 secrets.enc # 加密密钥可选 generated/ # 自动生成的工具配置 claude-code.json codex.toml ~/.claude/ # Claude Code 自己的目录 ~/.codex/ # Codex 自己的目录openrig在切换 profile 时会把生成的配置写入generated/目录然后通过符号链接或者复制的方式同步到各工具的实际配置位置。这样做的好处是原始配置永远由openrig管理工具自己产生的临时改动不会污染主配置。如果你哪天不想用openrig了直接把generated/里的文件复制回去就行迁移成本很低。4. 完整实操流程与关键环节实现4.1 从零开始安装 openrig假设你是一台全新的 Windows 机器什么都没装。第一步是装 Node.js。去官网下载 LTS 版本安装时勾选“Add to PATH”。装完之后打开 PowerShell跑node -v和npm -v确认版本。如果npm -v报“无法加载文件 npm.ps1因为在此系统上禁止运行脚本”按前面说的方法改执行策略。第二步是配置 npm 国内源。默认源在国内访问可能很慢换成淘宝源能快不少npm config set registry https://registry.npmmirror.com第三步安装openrignpm install -g openrig装完之后跑openrig --version如果能正常输出版本号说明安装成功。如果报“command not found”检查 npm 全局目录是否在 PATH 里。用npm config get prefix看全局目录在哪然后手动把这个路径加到系统 PATH 里。实操心得Windows 上 npm 全局目录通常是C:\Users\你的用户名\AppData\Roaming\npm。这个路径默认可能不在 PATH 里需要手动加。加完之后一定要重启终端否则不生效。4.2 初始化配置并接入第一个模型安装完成后在任意目录跑openrig init。它会问你几个问题用哪个工具Claude Code / Codex / 两者、模型端点类型云端 API / 本地服务、API Key 怎么提供。回答完之后它会在~/.openrig/下生成一份openrig.yaml模板。如果你用的是本地模型服务比如 LM Studio 或者 Ollamabase_url通常填http://127.0.0.1:1234/v1LM Studio 默认端口或者http://127.0.0.1:11434/v1Ollama 默认端口。api_key随便填一个非空字符串就行本地服务通常不校验。model字段填你在本地服务里加载的模型名称比如qwen2.5-coder-7b-instruct。配置写好后跑openrig validate检查语法和字段完整性。这个命令会逐项检查 provider 是否可达、tool 命令是否存在、profile 引用是否有效。如果一切正常跑openrig use profile-name激活配置。激活之后直接运行claude或codex它们就会用你配置的端点和模型。4.3 切换模型与端点的实际操作切换是openrig最常用的功能。假设你配置了两个 profilelocal-fast走本地小模型cloud-strong走云端大模型。日常写代码用local-fast遇到复杂重构切到cloud-strong。切换命令是openrig use cloud-strong。执行后openrig会做三件事更新defaults.active_profile、重新生成各工具的配置文件、输出当前激活的 profile 摘要。摘要里会显示工具名、provider、model、端点地址方便你确认。如果你只想临时切换一次不想改默认配置可以用openrig run --profile cloud-strong -- claude。这个命令会临时注入环境变量并启动 Claude Code退出后默认配置不变。这个用法在脚本里特别方便比如你写了个自动化任务需要临时用某个特定模型跑一遍。注意切换 profile 后已经运行的 Claude Code 或 Codex 会话不会自动更新配置。你需要退出当前会话重新启动新配置才会生效。这一点很多人第一次用会忽略以为切换没成功。4.4 验证配置是否生效的三种方法第一种方法是用openrig status。它会显示当前激活的 profile、各工具的配置路径、以及最近一次配置生成的时间戳。如果时间戳很旧说明你可能手动改过工具配置需要跑openrig sync重新同步。第二种方法是直接问模型。启动 Claude Code 后输入“你是什么模型”看它回答的模型名称是否和你配置的一致。这个方法最直接但有些模型会拒绝回答这类问题或者回答不准确。第三种方法是看日志。openrig会在~/.openrig/logs/下记录每次配置生成和切换的详细日志。如果你怀疑配置没生效可以tail -f这个日志文件然后重新切换一次 profile看日志里有没有报错。我排查端点连接问题时基本都靠这个日志。5. 常见报错与排查技巧实录5.1 端点连接失败的典型原因热搜词里有一条“cc switch local proxy failed while handling codex endpoint /responses”这个报错我遇到过好几次。根本原因通常是base_url配错了或者端点路径拼接不对。Codex 的/responses路径和 Claude Code 的/v1/messages路径不一样如果你把 Claude Code 的配置直接套到 Codex 上就会 404。排查步骤先用curl手动测端点。比如curl http://127.0.0.1:1234/v1/models看能不能返回模型列表。如果 curl 通但工具不通说明是路径拼接问题检查openrig.yaml里 provider 的type字段是否和工具匹配。type: anthropic的 provider 不能直接给 Codex 用需要改成type: openai-compatible或者加一个适配层。另一个常见原因是本地服务没启动。LM Studio 和 Ollama 都需要手动启动服务并且要在设置里开启“允许局域网访问”或者“兼容 OpenAI API”。如果你在 Docker 里跑服务还要注意端口映射和防火墙。5.2 npm 全局包冲突与卸载残留openrig依赖一些 npm 包如果你之前装过旧版本的 Claude Code 或 Codex可能会有版本冲突。典型症状是openrig启动时报ERESOLVE overriding peer dependency警告或者某个依赖模块找不到。处理方法是先清理全局包npm uninstall -g claude-code codex openrig npm cache clean --force npm install -g openrig如果卸载后还有残留手动去 npm 全局目录npm config get prefix的输出路径把相关文件夹删掉。Windows 上还要检查AppData\Roaming\npm和AppData\Roaming\npm-cache两个目录。实操心得npm 的缓存有时候会缓存损坏的包元数据导致重装也报同样的错。npm cache clean --force能解决大部分玄学问题。如果还不行试试npm cache verify它会校验缓存完整性并修复可修复的部分。5.3 YAML 语法错误的快速定位YAML 报错信息通常很模糊比如“mapping values are not allowed here”但不告诉你哪一行有问题。我的经验是先看报错行号附近的缩进确认没有 Tab 混入然后检查冒号后面有没有空格YAML 要求key: value冒号后必须有一个空格最后检查列表项的短横线后面有没有空格。如果配置很长可以用在线 YAML 校验工具先过一遍。或者用openrig validate --verbose它会输出更详细的解析过程帮你定位到具体字段。我一般写配置的时候会分块写每写完一个区块就跑一次 validate这样出错时范围小好排查。5.4 常见问题速查表报错关键词可能原因解决方法npm.ps1 cannot be loadedPowerShell 执行策略限制Set-ExecutionPolicy RemoteSigned -Scope CurrentUsercommand not found: openrignpm 全局目录不在 PATH把npm config get prefix输出加到 PATHECONNREFUSED 127.0.0.1:xxxx本地模型服务未启动启动 LM Studio / Ollama 并开启 API404 /responses端点路径与工具不匹配检查 provider 的type字段ERESOLVE peer dependency全局包版本冲突卸载重装清理 npm 缓存YAML parse error缩进或冒号格式错误用两个空格缩进冒号后加空格model not supported模型名称拼写错误用curl /v1/models确认可用模型名context window exceeded上下文长度超限在 profile 里调小max_tokens6. 进阶用法与个人经验补充6.1 用 profile 组合实现场景化切换openrig的 profile 不只是“模型工具”的绑定你还可以用extends字段做继承。比如定义一个基础 profile然后派生出几个变体profiles: - name: base-local tool: claude-code provider: local-llm model: qwen2.5-coder overrides: temperature: 0.2 - name: local-creative extends: base-local overrides: temperature: 0.8 - name: local-precise extends: base-local overrides: temperature: 0.0这样你只需要维护一份基础配置变体只写差异部分。我平时写代码用local-precise写文档用local-creative切换起来很快。extends支持多层继承但我不建议超过三层否则配置来源太分散排查问题麻烦。6.2 把 openrig 集成到 shell 别名里如果你每天都要切换好几次 profile可以设几个 shell 别名。在~/.bashrc或~/.zshrc里加alias orcopenrig use cloud-strong claude alias orlopenrig use local-fast claude alias orxopenrig use codex-cloud codex这样你输入orc就自动切到云端强模型并启动 Claude Code输入orl就切到本地快模型。我用了几个月效率提升很明显尤其是需要频繁对比不同模型输出的时候。Windows 上可以在 PowerShell 的$PROFILE文件里加函数function orc { openrig use cloud-strong; claude } function orl { openrig use local-fast; claude }6.3 配置文件版本管理的小技巧openrig.yaml我建议纳入 Git 管理但密钥部分用环境变量。具体做法是在仓库里放一份openrig.yaml.example把api_key写成${ANTHROPIC_API_KEY}然后.gitignore里排除openrig.yaml和env。团队成员克隆仓库后复制 example 文件为openrig.yaml再自己设置环境变量。如果你有多台机器可以用 Git 同步配置但每台机器的本地服务地址可能不同比如台式机是127.0.0.1笔记本连远程服务器是另一个 IP。这种情况可以用openrig的--host参数覆盖或者在 profile 里用环境变量${LOCAL_LLM_HOST}每台机器设置不同的值。6.4 性能调优的几个观察本地模型跑起来之后响应速度主要受三个因素影响模型大小、上下文长度、硬件。我实测下来7B 级别的代码模型在 16GB 内存的机器上跑首 token 延迟大概 1-2 秒生成速度 20-30 token/s。如果你觉得慢优先调小max_tokens和context_window这两个参数对内存占用影响最大。另外openrig本身的开销很小它主要是在启动时做配置生成和环境变量注入运行时不常驻内存。所以如果你觉得卡问题基本都在模型服务端不在openrig。可以用openrig doctor --perf看各环节耗时定位瓶颈在哪。6.5 后续可以扩展的方向openrig目前主要覆盖 Claude Code 和 Codex但它的适配器架构是开放的。如果你用其他 CLI 工具可以自己写一个适配器插件放到~/.openrig/adapters/目录下。适配器就是一个 JS 文件导出generateConfig和injectEnv两个函数。我试过给一个内部工具写适配器大概 50 行代码就搞定了。另一个方向是配置的远程同步。现在配置是本地文件如果你在多台机器之间同步得靠 Git 或者手动复制。未来如果openrig支持从远程 URL 拉取配置或者集成密钥管理服务会更方便。不过目前手动管理也够用毕竟配置文件不大改动的频率也不高。我个人在实际操作中的体会是openrig最大的价值不是某个具体功能而是把“配置”这件事从各工具的碎片化文档里抽出来变成一份你自己能看懂、能版本管理、能快速切换的声明式文件。一旦习惯了这种模式再回去手动改环境变量就会觉得非常别扭。如果你也在同时用多个 AI 编程工具建议花半小时把openrig配起来后面省下的时间绝对值得。