
1. openrig 到底在解决什么问题第一次看到 openrig 这个名字很多人会以为是某个硬件外设或者机械臂项目但如果你最近在折腾 Claude Code、Codex 这类命令行 AI 编程工具大概率已经隐约感觉到它要处理的是什么了。简单说openrig 是一个围绕 AI 编程助手运行环境做统一编排的开源工具它把 Claude Code、Codex 这类 CLI 工具的安装、配置、模型接入、代理转发、YAML 参数管理整合到一套可复用的结构里。你可以把它理解成一个“脚手架 配置中枢”让你不用每次换模型、换机器、换项目时都从头折腾一遍环境。我最初接触这类需求是因为手上同时跑着 Claude Code 和 Codex 两套工具一个用来做代码补全和重构一个用来跑批量任务和终端命令执行。问题在于两者的配置格式不一样模型来源不一样有的走本地 LM Studio有的走第三方 API还有的需要在 VS Code 里做额外配置。每次换一台机器光是 Node.js 版本、YAML 文件路径、环境变量、代理转发这几件事就能耗掉大半天。openrig 出现的意义就是把这些零散环节收拢到一个 rig 里用声明式的方式管理起来。它适合的人群其实很明确一是已经在用 Claude Code 或 Codex但被配置问题反复折磨的开发者二是想在本地接入 LM Studio、DeepSeek、Qwen、GLM 等模型又不希望每次手动改一堆参数的人三是团队里需要统一 AI 编程工具环境避免“你这能跑我这跑不了”的尴尬。哪怕你只是刚听说 Claude Code想找个不那么痛苦的上手路径openrig 的思路也值得参考。提示openrig 本身不是模型也不是 Claude Code 或 Codex 的替代品它更像是一个“环境编排层”。理解这一点后面很多设计就能看懂了。2. 核心设计思路与方案选型拆解2.1 为什么用 YAML 做配置中枢openrig 选择 YAML 作为主要配置格式这个决定背后有很实际的考量。Claude Code 和 Codex 各自的配置文件格式并不统一有的用 JSON有的用 TOML有的干脆靠环境变量。如果 openrig 再用一套私有格式学习成本就上去了。YAML 的好处是结构清晰、可读性强而且在前端、DevOps、AI 工具链里已经被广泛接受。你写一个rig.yaml里面定义模型端点、工具路径、环境变量、启动参数openrig 负责把它翻译成各个工具认识的格式。更重要的是YAML 对“人”友好。JSON 写多了容易漏逗号、多括号TOML 虽然好一点但嵌套深了也晕。YAML 用缩进表达层级配合注释非常适合用来描述“我要用哪个模型、走哪个端口、传什么参数”这类配置。比如你要把 Codex 接到 DeepSeek只需要在 YAML 里改一个base_url和api_key引用不用去翻 Codex 的源码或文档找环境变量名。当然YAML 也有坑。缩进必须用空格不能用 Tab冒号后面要留空格字符串里有特殊字符要加引号。这些细节在 openrig 的文档里通常会有示例但新手第一次写还是容易翻车。我的建议是先用 openrig 提供的模板跑通之后再逐项修改不要一上来就手写全量配置。2.2 Node.js 版本管理与工具链隔离Claude Code 和 Codex 大多是基于 Node.js 生态分发的这就绕不开 Node.js 版本问题。热搜里有人遇到 “error installing 24.21.0: node.js v24.21.0 is not yet released or is not available”这就是典型的版本号写错或者源里还没有对应版本。openrig 在设计上通常会建议使用 LTS 版本比如 Node.js 20 或 22而不是追最新的奇数版本。原因很简单AI 编程工具的依赖树里经常有原生模块奇数版本 Node.js 的 ABI 不稳定容易编译失败。openrig 的做法一般是通过版本管理器如 nvm、fnm 或 volta来锁定 Node.js 版本然后在 rig 配置里声明node_version: 20。这样无论你换到哪台机器只要 openrig 初始化就会自动切换到正确的 Node.js 版本。这个设计避免了“我本地能跑服务器上跑不了”的经典问题。如果你之前习惯直接去 Node.js 官网下载安装包建议换成版本管理器后期维护会轻松很多。另外openrig 通常会为每个项目或每个 rig 创建独立的依赖目录避免全局安装的 Claude Code 和 Codex 互相干扰。比如 Claude Code 可能依赖某个版本的anthropic-ai/sdk而 Codex 依赖另一个版本全局装在一起就容易冲突。隔离之后每个 rig 有自己的node_modules升级一个不会影响另一个。2.3 代理转发与多模型接入的抽象层热搜里有一条 “cc switch local proxy failed while handling codex endpoint /responses”这反映了一个很典型的场景你用一个本地代理来切换不同的模型后端但代理在处理 Codex 的/responses端点时失败了。openrig 要解决的就是这类问题。它通常会在本地起一个轻量转发层把 Claude Code 和 Codex 发出的请求根据配置路由到不同的上游可能是 LM Studio 的本地端口可能是 DeepSeek 的 API也可能是 Qwen 或 GLM 的兼容端点。这个转发层的价值在于“统一入口多处出口”。Claude Code 和 Codex 各自可能只支持特定的 API 格式但通过 openrig 的适配你可以让它们都走同一个本地地址然后由 openrig 决定实际请求发往哪里。这样做的好处是切换模型时不需要改 Claude Code 或 Codex 本身的配置只需要改 openrig 的 YAML。对于经常在本地模型和云端模型之间切换的人来说这个设计能省下大量重复劳动。不过代理转发也有注意事项。第一端口不要和系统里已有服务冲突建议用 3000 以上的高位端口。第二如果上游是 HTTPS本地转发层要正确处理证书和超时。第三Codex 的/responses端点对请求体格式比较敏感转发时不要随意修改 header 和 body否则容易出现 “unrecognized configuration setting” 之类的报错。3. 核心细节解析与实操要点3.1 安装前的环境自查清单在真正动手安装 openrig 之前我建议先做一轮环境自查。这一步看起来简单但能避免后面 80% 的诡异问题。你需要确认的东西包括操作系统版本、Node.js 版本、包管理器、网络连通性、以及是否已经安装过 Claude Code 或 Codex。如果之前装过最好先清理掉全局安装的旧版本避免 PATH 里出现多个同名命令。检查项推荐状态检查命令常见问题操作系统macOS 12 / Ubuntu 20.04 / Windows 10uname -a或winverWindows 下路径空格导致脚本失败Node.jsLTS 20 或 22node -v版本过新或过旧导致依赖编译失败包管理器npm 10 或 pnpm 8npm -vnpm 源慢导致安装超时Git2.30git --version缺少 Git 导致某些依赖无法拉取端口占用3000-4000 空闲lsof -i :3000代理端口被占导致启动失败自查完之后建议把 Node.js 版本切换命令也准备好。如果你用 nvm就是nvm use 20如果用 fnm就是fnm use 20。openrig 在初始化时通常会读取一个.nvmrc或.node-version文件所以提前放好这个文件能让流程更顺。注意Windows 用户如果遇到路径相关报错优先检查用户名里是否有空格或中文。很多 Node.js 工具链对非 ASCII 路径支持不好建议把项目放在C:\dev\这类纯英文短路径下。3.2 YAML 配置文件的结构与关键字段openrig 的 YAML 配置一般分为几个大块全局设置、模型端点、工具定义、代理规则。全局设置里放 Node.js 版本、日志级别、工作目录模型端点里定义每个上游模型的名称、类型、base_url、api_key 引用工具定义里声明 Claude Code 和 Codex 的启动命令和参数代理规则里描述请求如何路由。一个典型的配置片段大概长这样version: 1 node: version: 20 package_manager: npm models: local_lmstudio: type: openai_compatible base_url: http://127.0.0.1:1234/v1 api_key: not-needed deepseek: type: openai_compatible base_url: https://api.deepseek.com/v1 api_key: ${DEEPSEEK_API_KEY} tools: claude_code: enabled: true model: local_lmstudio codex: enabled: true model: deepseek proxy: port: 3456 routes: - from: /v1/responses to: codex这里有几个关键点。第一api_key用${DEEPSEEK_API_KEY}这种环境变量引用不要把明文密钥写进 YAML否则一旦提交到 Git 就麻烦了。第二type字段决定 openrig 用哪种适配器去转换请求openai_compatible是最通用的大多数本地模型和第三方 API 都支持。第三routes里的from和to要对应好Codex 的/responses端点如果路由错了就会出现前面提到的代理失败。写 YAML 的时候我习惯先用yamllint检查一遍语法再让 openrig 去解析。这样能把缩进错误、重复键、类型错误提前暴露出来比等到运行时看报错要高效得多。3.3 Claude Code 与 Codex 的接入差异Claude Code 和 Codex 虽然都是 AI 编程 CLI但接入方式有差异。Claude Code 通常更依赖环境变量和配置文件比如ANTHROPIC_API_KEY、ANTHROPIC_BASE_URL这类。Codex 则更倾向于用命令行参数和项目级配置。openrig 在处理这两者时会分别生成对应的配置片段而不是强行统一。对于 Claude Codeopenrig 一般会设置ANTHROPIC_BASE_URL指向本地代理然后把ANTHROPIC_API_KEY设为一个占位符实际鉴权由代理层完成。这样做的好处是Claude Code 以为自己在和一个标准的 Anthropic 端点通信但实际上请求被转发到了 LM Studio 或 DeepSeek。对于 Codexopenrig 可能会生成一个codex.yaml或类似文件里面指定model_provider和base_url。这里有一个容易踩的坑Claude Code 在某些版本里会校验 API 返回的结构如果本地模型返回的 JSON 字段不完整就会报 “your organization has disabled claude subscription access” 之类的错误。这通常不是权限问题而是响应格式不兼容。解决办法是在 openrig 的代理层加一层响应适配把本地模型的输出包装成 Claude Code 期望的格式。Codex 那边则要注意 “codex is ignoring 1 unrecognized configuration setting” 这个警告。这通常是因为 YAML 里写了 Codex 不认识的字段。openrig 的模板一般会标注哪些字段是 Codex 支持的哪些是 openrig 自己用的。如果你手动加了字段最好先查一下 Codex 的文档确认它是否认识。4. 完整实操流程与关键环节实现4.1 从零初始化一个 openrig 项目假设你现在是一台干净的 Ubuntu 机器想从零把 Claude Code 和 Codex 都跑起来并且让它们共用一套模型配置。第一步是安装 Node.js 版本管理器。我一般用 fnm因为它启动快、跨平台支持好。安装命令是curl -fsSL https://fnm.vercel.app/install | bash然后按照提示把 shell 配置加进去。装完之后fnm install 20再fnm use 20确认node -v输出 v20.x。第二步是获取 openrig。通常是通过 npm 全局安装或者从源码克隆。如果是 npm命令大概是npm install -g openrig如果是源码就是git clone之后npm install npm link。我倾向于源码方式因为可以随时看它的适配层实现遇到问题好排查。装完之后运行openrig init它会引导你生成一个基础的rig.yaml。第三步是编辑rig.yaml。把模型端点、工具开关、代理端口按你的实际情况填好。如果你本地已经跑了 LM Studio就填 LM Studio 的地址如果你想用 DeepSeek就填 DeepSeek 的 API 地址并把密钥放到环境变量里。填完之后运行openrig validate它会检查 YAML 语法和字段合法性。第四步是启动。openrig up会依次做几件事切换 Node.js 版本、安装 Claude Code 和 Codex 的依赖、生成各自的配置文件、启动本地代理。如果一切顺利你会看到代理监听在配置的端口上Claude Code 和 Codex 的命令也可以正常调用了。4.2 本地模型接入的参数计算与调试接入本地 LM Studio 时有几个参数需要算清楚。首先是上下文长度。LM Studio 里加载模型时会设置context length这个值要和 Claude Code 或 Codex 期望的上下文匹配。如果本地模型只支持 8K 上下文而 Claude Code 默认发 32K 的请求就会报错。解决办法是在 openrig 的模型配置里加一个max_tokens或context_window字段让代理层做截断或提示。其次是并发数。本地模型的推理速度有限如果 Claude Code 同时发多个请求LM Studio 可能会排队甚至崩溃。openrig 的代理层一般可以配置max_concurrent_requests建议从 1 开始稳定后再逐步加到 2 或 3。这个值没有固定公式取决于你的显卡显存和模型大小。我的经验是7B 模型在 8GB 显存上并发 1 比较稳14B 模型在 12GB 显存上并发 1 也可能吃力。第三是超时时间。本地模型首次加载和长文本推理都可能超过默认的 30 秒超时。openrig 的代理配置里通常有timeout字段建议设成 120 秒或更长。如果你发现 Claude Code 频繁报超时但 LM Studio 日志显示请求还在处理那多半就是超时设短了。调试的时候我习惯先用curl直接打本地代理的端点确认它能正确转发到 LM Studio 并返回结果。比如curl http://127.0.0.1:3456/v1/models看看返回的模型列表对不对。然后再用 Claude Code 或 Codex 去调这样能把问题范围缩小到“代理层”还是“工具层”。4.3 第三方 API 接入与密钥管理接入 DeepSeek、Qwen、GLM 这类第三方 API 时最关键的是密钥管理。绝对不要把密钥明文写在 YAML 里也不要在命令行里直接export之后就不管了。推荐的做法是用.env文件配合dotenv或者用系统级的密钥管理工具。openrig 通常支持从环境变量读取密钥你只需要在 YAML 里写${DEEPSEEK_API_KEY}然后在.env里写DEEPSEEK_API_KEYsk-xxx并把.env加入.gitignore。另一个要注意的是 API 兼容性。虽然很多第三方 API 声称兼容 OpenAI 格式但细节上可能有差异。比如 DeepSeek 的/v1/chat/completions和 Codex 期望的/v1/responses就不是一回事。openrig 的适配层需要做路径重写和请求体转换。如果你发现 Codex 调 DeepSeek 时报 404 或 400先检查代理日志里实际发出的路径和请求体再对照 DeepSeek 的文档看哪里不匹配。还有一个实际问题是速率限制。第三方 API 通常有 QPS 或 TPM 限制Claude Code 和 Codex 在批量处理时容易触发。openrig 的代理层可以加一个简单的令牌桶限流或者配置重试策略。我的做法是在代理层加retry_on_429: true和retry_delay: 2s这样遇到限流时自动等待重试而不是直接报错给上层工具。5. 常见问题与排查技巧实录5.1 安装与启动阶段的典型报错安装阶段最常见的问题是 Node.js 版本不对。热搜里那条 “error installing 24.21.0: node.js v24.21.0 is not yet released” 就是典型。解决办法很简单不要手动指定一个不存在的版本号用fnm ls-remote或nvm ls-remote看一下有哪些版本可用然后选一个 LTS。如果你在 CI 环境里建议把 Node.js 版本写死在配置文件里不要用latest。第二个常见问题是权限。在 Linux 或 macOS 上全局安装 npm 包可能需要sudo但用sudo装完之后又会出现权限混乱。更好的做法是配置 npm 的全局目录到用户目录下比如npm config set prefix ~/.npm-global然后把~/.npm-global/bin加到 PATH。这样不需要sudo也不会污染系统目录。第三个问题是网络。npm 源慢或者某些包被墙会导致安装卡住。可以换成国内镜像源比如npm config set registry https://registry.npmmirror.com。但要注意有些 AI 工具的依赖包可能不在镜像源里这时候需要临时切回官方源。我的习惯是默认用镜像源遇到 404 再切官方源单独装那个包。5.2 代理转发失败的排查路径代理转发失败是 openrig 使用中最常见的问题表现包括 “cc switch local proxy failed while handling codex endpoint /responses”、连接被拒绝、返回 502 等。排查的时候我一般按这个顺序来确认代理进程在跑。ps aux | grep openrig或lsof -i :3456看端口有没有被监听。确认上游可达。用curl直接打上游的 base_url看能不能返回模型列表。看代理日志。openrig 一般会把请求路径、请求体、响应状态码打到日志里重点看实际转发的路径和上游期望的路径是否一致。检查 YAML 路由规则。from和to是否匹配有没有拼写错误。检查请求体格式。Codex 的/responses端点对字段名敏感如果代理层做了不必要的转换可能导致上游不认。报错信息可能原因排查方法解决方式connection refused代理未启动或端口错lsof -i :端口启动代理或改端口502 Bad Gateway上游不可达curl上游地址检查上游服务状态404 Not Found路径重写错误看代理日志路径修正 routes 配置401 Unauthorized密钥未传递检查环境变量确认 api_key 引用正确unrecognized settingYAML 字段不被识别对照工具文档删除或重命名字段提示排查代理问题时先把日志级别调到 debug能看到完整的请求和响应。问题解决后再调回 info避免日志刷屏。5.3 模型响应不兼容的处理经验本地模型或第三方 API 返回的响应和 Claude Code、Codex 期望的格式往往有差异。最常见的差异是字段缺失比如本地模型返回的 JSON 里没有usage字段而 Claude Code 会去读这个字段读不到就报错。解决办法是在 openrig 的代理层加一个响应补全逻辑把缺失的字段填上默认值。另一个差异是流式输出的格式。Claude Code 和 Codex 可能期望 SSE 格式的流式响应而某些本地模型只支持一次性返回。openrig 的适配层需要把一次性响应包装成 SSE 流或者反过来。这个转换如果做得不完整就会出现“请求发出去了但界面一直转圈”的情况。我的经验是先用非流式模式跑通确认基本链路没问题再开流式。还有一个坑是错误码。本地模型在遇到上下文超限时可能返回 500 而不是 400导致 Claude Code 认为是服务端故障而不断重试。openrig 的代理层可以把这类错误码规范化比如把上下文超限统一映射成 400并附带明确的错误信息。这样上层工具就能正确处理而不是陷入重试循环。6. 我踩过的坑与实操心得6.1 不要迷信“一键脚本”很多 openrig 的教程会提供一个一键安装脚本复制粘贴就能跑。我试过几次在干净的 Ubuntu 上确实能跑通但在已经有其他 Node.js 项目的机器上经常出现版本冲突。原因是脚本可能修改了全局的 Node.js 版本或 npm 配置影响了其他项目。我的建议是把 openrig 的安装过程拆开每一步都确认清楚它改了什么。特别是fnm use或nvm use这类命令最好在项目目录里用局部版本文件控制而不是全局切换。6.2 配置文件要进版本控制但密钥不能rig.yaml本身应该进 Git这样团队里每个人都能用同一套配置。但密钥、token、个人路径这些不能进。我的做法是把rig.yaml里的敏感字段都写成环境变量引用然后提供一个rig.example.yaml作为模板。新人克隆之后复制成rig.yaml填上自己的密钥就能用。这样既保证了配置一致性又避免了密钥泄露。6.3 日志和监控比想象中重要openrig 跑起来之后如果不看日志很多问题会积累到爆发才被发现。比如代理层的重试次数、上游的响应时间、模型的 token 消耗这些数据对排查问题和优化配置都很有价值。我一般会在代理层加一个简单的访问日志记录每次请求的路径、状态码、耗时和 token 数。跑一段时间之后就能看出哪个模型响应慢、哪个端点容易出错然后有针对性地调整。6.4 版本升级要谨慎Claude Code、Codex 和 openrig 本身都在快速迭代版本升级可能带来配置格式变化。我吃过一次亏升级 Codex 之后原来的codex.yaml里某个字段被重命名了导致启动时报 “unrecognized configuration setting”。后来我养成了习惯升级之前先看 changelog升级之后先在一个临时目录里跑一遍确认没问题再更新主环境。如果 openrig 支持版本锁定最好把关键依赖的版本固定住避免自动升级带来的意外。6.5 本地模型和云端模型混用的策略我现在的做法是日常的代码补全和简单重构走本地 LM Studio因为响应快、不花钱、隐私好。遇到复杂任务或者本地模型搞不定的再切到 DeepSeek 或 Qwen。openrig 的代理层让这个切换变得很简单只需要在 YAML 里改一个model字段或者用环境变量控制。这样既控制了成本又保证了复杂任务的处理能力。如果你也在纠结本地还是云端建议先用本地跑通流程再按需接入云端不要一上来就全用云端那样成本不好控制。