1. openrig 到底是个什么东西
第一次看到 openrig 这个名字,我下意识以为是某个硬件外设的开源项目,毕竟“rig”这个词在矿机、直播设备、测试台架这些圈子里太常见了。但把标题和那串热搜词放在一起看——Claude Code、Codex、YAML、Node.js——方向就很清楚了:这是一个围绕 AI 编程助手做编排、配置和本地化接入的工具类项目。说白了,openrig 想解决的是“我手头有好几个 AI 编程工具,怎么把它们统一管起来、按需切换、还能本地跑”的问题。
我接触这类工具的时间不算短,从最早手动改配置文件,到后来用脚本批量切换,再到现在这种带 YAML 配置的编排方案,踩过的坑能写满一个笔记本。openrig 吸引我的点在于它把配置这件事从“散落在各个工具目录里的 JSON”收敛成了“一份 YAML 说了算”,而且明确绑定了 Node.js 生态。这意味着你不需要为了用它再去学一门新语言,前端、后端、运维的同学都能快速上手。
它适合谁?三类人最值得看:一是同时用 Claude Code 和 Codex 的开发者,想省掉来回切换的麻烦;二是需要在本地模型和云端模型之间做路由的人,比如把简单补全丢给本地、复杂重构丢给云端;三是团队里负责统一开发环境的人,需要一份可版本管理的配置文件来约束所有人的工具行为。如果你只是偶尔用一下某个 AI 助手,那 openrig 可能有点重,但只要你开始认真把 AI 编程工具当生产力,它就有价值。
2. 核心设计思路与方案选型拆解
2.1 为什么是 YAML 而不是 JSON 或 TOML
openrig 选 YAML 作为配置载体,这个决定背后有很实际的考量。JSON 的问题是写注释不方便,而 AI 工具的配置里恰恰有大量需要解释的地方,比如“这个模型走本地是因为延迟低”“这个端点只在特定网络环境下启用”。TOML 虽然支持注释,但嵌套结构一深就变得很难读,尤其是涉及多工具、多模型、多路由规则的时候。
YAML 的优势在于它对层级和列表的表达非常自然。你可以这样描述一个路由规则:当请求来自 Claude Code 且模型名包含“local”时,转发到本地端点;否则走云端。这种带条件的逻辑用 YAML 写出来几乎就是自然语言的映射。而且 YAML 在 DevOps 圈子里已经是事实标准,Kubernetes、Ansible、GitHub Actions 都在用,学习成本几乎为零。
注意:YAML 对缩进极其敏感,Tab 和空格混用是新手最常见的翻车点。openrig 的配置文件建议统一用两个空格缩进,并且在编辑器里开启“显示空白字符”,一眼就能看出问题。
2.2 Node.js 作为运行时的取舍
选 Node.js 而不是 Python 或 Go,我认为 openrig 的意图很明确:贴近前端和全栈开发者的日常环境。Claude Code 和 Codex 的很多用户本身就是写 JavaScript/TypeScript 的,机器上大概率已经装了 Node.js。用 Node.js 写编排层,意味着安装成本几乎为零,不需要额外配 Python 虚拟环境或者编译 Go 二进制。
另一个原因是 Node.js 的异步 I/O 模型非常适合做代理和转发。openrig 的核心工作之一就是在本地起一个轻量服务,接收来自各个 AI 工具的请求,根据 YAML 里的规则决定转发到哪个上游。这种场景下,Node.js 的事件循环机制比同步阻塞的模型更合适,而且生态里有大量成熟的 HTTP 客户端和流处理库可以直接用。
不过 Node.js 也有它的坑,最典型的就是版本问题。热搜词里那条“error installing 24.21.0: node.js v24.21.0 is not yet released”就是活生生的例子——有人照着某个教程去装一个根本不存在的版本。openrig 对 Node.js 版本有要求,但不会要求你装什么奇怪的非 LTS 版本,老老实实用 LTS 就行。
2.3 多工具接入的架构逻辑
openrig 要同时伺候 Claude Code 和 Codex,这两个工具虽然都是 AI 编程助手,但它们的接口形态、认证方式、请求格式并不完全一样。Claude Code 有自己的订阅体系和端点规范,Codex 则是另一套。openrig 的做法是在中间加一层适配,把不同工具的请求归一化成内部格式,再根据配置分发出去。
这个设计的好处是解耦。今天你用的是 Claude Code 和 Codex,明天想加一个新工具,只需要写一个适配器,不用动核心逻辑。对用户来说,你只需要在 YAML 里声明“我要接入哪些工具、每个工具走哪个端点”,剩下的脏活累活 openrig 帮你干了。
3. 环境准备与安装实操
3.1 Node.js 的正确安装方式
不管你用 Windows、macOS 还是 Ubuntu,装 Node.js 的第一原则是:去官网下 LTS 版本,别去第三方站点下什么“优化版”“绿色版”。Node.js 官网的下载页面很直白,LTS 那一栏就是给你用的。截至我写这篇内容的时候,Node.js 的 LTS 版本号是 20.x 和 22.x 这两个大版本,openrig 在这两个版本上都跑得很稳。
Windows 用户直接下 .msi 安装包,一路下一步就行,安装程序会自动把 node 和 npm 加到 PATH 里。macOS 用户如果装了 Homebrew,一句brew install node@22就搞定。Ubuntu 用户我建议用 NodeSource 的源,比系统自带的版本新,命令大概是先加源再 apt install,具体版本号去 NodeSource 官网查最新的。
# Ubuntu 下用 NodeSource 安装 Node.js 22 LTS 的示例 curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt-get install -y nodejs装完之后验证一下:
node -v npm -v两个命令都能输出版本号,说明环境没问题。如果 node 能跑但 npm 报错,大概率是 PATH 没配好,检查一下安装路径有没有加到环境变量里。
提示:如果你之前装过其他版本的 Node.js,建议先用 nvm 或者系统包管理器清理干净,避免多个版本打架。我见过有人机器上同时存在三个 node 可执行文件,最后自己都搞不清在用哪个。
3.2 openrig 的获取与初始化
openrig 的获取方式取决于它的发布形态。如果是 npm 包,直接npm install -g openrig就行;如果是源码仓库,就 clone 下来再npm install。我建议优先看官方仓库的 README,里面会写清楚推荐的安装方式。
初始化通常分两步:先生成一份默认配置,再根据你的实际情况改。默认配置里一般会包含几个占位符,比如端点地址、API Key 的引用方式、默认路由规则。不要急着把所有东西都填满,先让最小配置跑起来,再逐步加东西。
# 假设 openrig 提供了 init 命令 openrig init # 这会在当前目录生成 openrig.yaml 或者 ~/.openrig/config.yaml生成之后先别改,直接尝试启动一次,看看能不能正常加载配置。如果启动就报错,说明环境还有问题,先解决环境再谈配置。
3.3 目录结构与配置文件位置
openrig 的配置文件位置通常有两个选择:项目级和用户级。项目级的放在项目根目录,只对当前项目生效;用户级的放在 home 目录下,对所有项目生效。我的习惯是把通用规则放用户级,把项目特有的路由放项目级,这样既不会污染全局,也不用每个项目都重复写一遍。
典型的目录结构大概长这样:
~/.openrig/ config.yaml # 全局配置 adapters/ # 自定义适配器 logs/ # 运行日志 项目目录/ openrig.yaml # 项目级配置,会覆盖全局的同名配置项日志目录很重要,出问题的时候第一件事就是看日志。openrig 的日志一般会记录每个请求的来源、目标端点、响应状态,排查路由问题时非常有用。
4. YAML 配置文件的编写要点
4.1 配置文件的基本骨架
一份能跑的 openrig 配置,至少需要三个部分:端点定义、工具定义、路由规则。端点定义告诉 openrig 有哪些上游可以转发;工具定义说明要接入哪些 AI 编程工具;路由规则决定什么请求走什么端点。
endpoints: local: base_url: "http://127.0.0.1:1234/v1" api_key: "not-needed" cloud: base_url: "https://api.example.com/v1" api_key: "${CLOUD_API_KEY}" tools: claude-code: enabled: true default_endpoint: cloud codex: enabled: true default_endpoint: local routes: - match: tool: claude-code model_contains: "local" target: local - match: tool: codex target: cloud这个骨架里,${CLOUD_API_KEY}是环境变量引用,不要把密钥明文写在 YAML 里。openrig 支持这种引用方式,启动时会从环境变量里读。
4.2 端点配置的细节与陷阱
端点配置里最容易出问题的是 base_url 的格式。有些工具要求 URL 以/v1结尾,有些要求不带,还有些要求带完整的路径。openrig 一般会在适配器里处理这些差异,但如果你自己写适配器,就要特别注意。
另一个坑是超时设置。本地模型端点如果没启动,请求会一直挂着,默认超时可能长达几十秒。建议在端点配置里显式设置超时:
endpoints: local: base_url: "http://127.0.0.1:1234/v1" timeout_ms: 5000 retries: 1timeout_ms设成 5000 意味着 5 秒没响应就放弃,retries设成 1 表示失败后重试一次。这两个参数要根据你的本地模型启动速度来调,模型加载慢的话超时给大一点,但别超过 30 秒,否则用户体验很差。
4.3 路由规则的匹配逻辑
路由规则是 openrig 最灵活也最容易写错的部分。匹配条件通常支持按工具名、模型名、请求路径、甚至请求头来匹配。多个条件之间是“与”的关系,多个规则之间是“从上到下,先匹配先赢”。
写路由规则的时候,我建议把最具体的规则放前面,最宽泛的放后面。比如你先写“claude-code 且模型名包含 local 走本地”,再写“claude-code 走云端”,这样本地规则优先,不会被子规则覆盖。
注意:YAML 里的布尔值 true/false 不要加引号,加了引号就变成字符串了。openrig 在解析时如果发现类型不对,可能会静默忽略这条规则,导致你以为配了但实际没生效。
5. 接入 Claude Code 与 Codex 的实操过程
5.1 Claude Code 的接入配置
Claude Code 的接入核心是让它把请求发到 openrig 的本地端口,而不是直接发到官方端点。这通常通过设置环境变量或者修改 Claude Code 的配置文件来实现。具体变量名取决于 Claude Code 的版本,常见的有ANTHROPIC_BASE_URL这类。
在 openrig 这边,你需要确保监听端口和 Claude Code 配置的端口一致。默认端口一般是 8787 或者类似的,可以在配置里改:
server: host: "127.0.0.1" port: 8787然后在 Claude Code 那边把 base URL 指向http://127.0.0.1:8787。如果 Claude Code 有订阅校验,openrig 的适配层需要正确处理认证头,把请求原样转发或者替换成配置里的密钥。
热搜词里有一条“your organization has disabled claude subscription access for claude code”,这说明有些组织会禁用订阅访问。这种情况下,openrig 的价值就更明显了——你可以把请求路由到其他兼容端点,绕过组织限制。当然,前提是你有合法的替代端点可用。
5.2 Codex 的接入与端点适配
Codex 的接入逻辑类似,但它的请求格式和认证方式跟 Claude Code 不一样。openrig 需要针对 Codex 写一个适配器,把它的请求转换成内部格式,再转发到目标端点。
Codex 有一个比较特殊的地方是它可能对模型名有校验。热搜词里那条“the 'gpt-5.6-sol' model is not supported when using codex with a...”就是典型的模型名不匹配问题。openrig 可以在路由层做模型名映射,把 Codex 发来的模型名替换成目标端点支持的模型名:
routes: - match: tool: codex model: "gpt-5.6-sol" target: cloud rewrite: model: "gpt-4o"这样 Codex 以为自己在用 gpt-5.6-sol,实际上请求被转发到了 gpt-4o。这种映射在接入第三方端点时特别有用。
5.3 本地模型与云端模型的混合路由
混合路由是 openrig 最实用的场景之一。我的配置习惯是:代码补全、简单问答走本地模型,因为延迟低、不花钱;复杂重构、长上下文分析走云端,因为能力强。实现方式就是在路由规则里按请求特征分流。
判断请求特征的方式有很多,比如按请求的 token 数量、按模型名、按工具名。openrig 一般支持在匹配条件里写表达式,你可以这样配:
routes: - match: tool: claude-code max_tokens_gt: 4000 target: cloud - match: tool: claude-code target: local第一条规则说,如果请求的最大 token 数超过 4000,走云端;否则走本地。这样既保证了复杂任务的质量,又节省了简单任务的成本。
提示:本地模型的上下文窗口通常比云端小,如果请求超长,本地模型可能会截断或者报错。在路由规则里加上 token 数判断,可以避免这类问题。
6. 常见问题与排查技巧实录
6.1 启动失败与端口占用
openrig 启动失败最常见的原因是端口被占用。报错信息一般是“EADDRINUSE”,意思是地址已经在使用中。解决办法有两个:换端口,或者找到占用端口的进程杀掉。
# macOS/Linux 下查看谁占用了 8787 端口 lsof -i :8787 # Windows 下用 netstat netstat -ano | findstr :8787找到 PID 之后,确认那个进程不重要再杀。如果是另一个 openrig 实例在跑,直接杀掉旧的就行。
6.2 请求转发失败与超时
请求转发失败的原因很多,按排查顺序我一般这样查:先看 openrig 日志有没有收到请求,再看目标端点是否可达,最后看认证是否通过。
如果日志显示请求收到了但转发失败,用 curl 直接测目标端点:
curl -X POST http://127.0.0.1:1234/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model":"local-model","messages":[{"role":"user","content":"hi"}]}'如果 curl 能通但 openrig 转发不通,那就是 openrig 的配置问题,重点检查 base_url 和认证头。如果 curl 也不通,那就是目标端点本身的问题,跟 openrig 无关。
6.3 模型名不匹配与端点报错
模型名不匹配是接入第三方端点时的高频问题。不同端点支持的模型名不一样,Codex 发来的模型名可能目标端点根本不认识。解决办法就是在路由规则里做重写,把不认识的模型名映射成认识的。
我整理了一个常见问题速查表,方便你对照排查:
| 现象 | 可能原因 | 排查方法 | 解决方式 |
|---|---|---|---|
| 启动报 EADDRINUSE | 端口被占用 | lsof 查端口 | 换端口或杀进程 |
| 请求 404 | base_url 路径不对 | curl 测端点 | 补全或去掉 /v1 |
| 请求 401 | 认证头缺失或错误 | 看日志请求头 | 检查 api_key 配置 |
| 请求超时 | 端点不可达或太慢 | curl 测延迟 | 调大 timeout_ms |
| 模型不支持 | 模型名不匹配 | 看端点文档 | 路由里 rewrite model |
| 配置不生效 | YAML 缩进或类型错误 | 用 yamllint 检查 | 修正缩进和引号 |
6.4 配置文件语法错误的快速定位
YAML 语法错误有时候报错信息很模糊,只说“解析失败”但不告诉你哪一行。这时候可以用在线 YAML 校验工具,或者本地装个 yamllint:
npm install -g yaml-lint yaml-lint openrig.yaml它会精确指出哪一行哪个字符有问题。我踩过的最隐蔽的坑是中文冒号和英文冒号混用,肉眼几乎看不出来,但解析器直接报错。用 lint 工具一跑就现原形了。
7. 我个人的实操心得与后续扩展
用 openrig 这段时间,最大的体会是:配置文件的版本管理比配置本身更重要。我把 openrig.yaml 放进了 git 仓库,每次改动都有记录,出问题可以快速回滚。而且团队里其他人可以直接复用我的配置,省去了重复沟通的成本。
另一个心得是不要一次性把所有功能都配上。我一开始想把 Claude Code、Codex、本地模型、云端模型全接进来,结果配置复杂到自己都看不懂。后来改成先接一个工具、一个端点,跑通之后再逐步加,每次只改一个变量,出问题容易定位。
后续如果想扩展,我建议从两个方向入手:一是写自定义适配器,把公司内部的其他 AI 工具也接进来;二是加监控和统计,记录每个端点的调用次数、平均延迟、失败率,用数据来优化路由规则。openrig 的架构留了这些扩展点,只要 YAML 里能描述清楚,实现起来并不复杂。
最后分享一个小技巧:在路由规则里加一条“兜底规则”,把所有没匹配上的请求都转发到一个默认端点。这样即使前面的规则写漏了,也不会导致请求直接失败,至少有个地方能接住。