1. openrig 到底是个什么东西
第一次看到 openrig 这个名字,我下意识以为是某个硬件外设或者机械臂项目,毕竟“rig”这个词在工程领域通常指代设备支架或测试台架。但翻了一圈社区讨论和代码仓库之后才明白,它其实是一个面向 AI 编程助手生态的配置编排工具,核心解决的是 Claude Code、Codex 这类命令行 AI 助手在不同项目之间切换时配置散乱、环境隔离困难的问题。
说白了,你如果同时用 Claude Code 写前端、用 Codex 跑数据脚本,每个项目对模型、API 端点、权限范围的要求都不一样。手动改配置文件不仅烦,还容易把 A 项目的密钥带到 B 项目里去。openrig 就是把这个过程抽象成一套声明式的 YAML 配置,让每个项目目录下放一个配置文件,工具自动识别并加载对应的运行环境。
这个工具目前主要面向几类人:一是日常在终端里用 AI 助手写代码的开发者,二是需要给团队统一 AI 工具配置的技术负责人,三是喜欢折腾本地模型接入的玩家。它不挑语言栈,Python、Node、Rust 项目都能用,前提是你对命令行和 YAML 不陌生。
我实测下来,openrig 最大的价值不在于它做了多复杂的事,而在于它把“配置切换”这个高频痛点用极简的方式解决了。下面我从设计思路开始,一层层拆开讲。
2. 核心设计思路与方案选型拆解
2.1 为什么是 YAML 而不是 JSON 或 TOML
openrig 选择 YAML 作为配置格式,这个决定背后有很实际的考量。JSON 虽然解析快、生态好,但它不支持注释,而 AI 助手的配置里经常需要标注“这个 key 是临时用的”“这个端点下个月要换”,没有注释会非常痛苦。TOML 倒是支持注释,但嵌套结构写起来啰嗦,尤其是当你要描述多个模型提供商、多个权限组的时候,TOML 的[section.subsection]语法会让人眼花。
YAML 的缩进语法在表达层级关系时更直观,而且支持锚点和引用,这对于多个项目共享部分配置的场景特别有用。比如你可以在一个基础配置里定义好常用的模型端点,然后在各个项目的配置里用<<: *base继承过来,只覆盖差异部分。这种能力在 JSON 和 TOML 里实现起来都要绕弯子。
当然 YAML 也有坑,缩进必须用空格不能用 Tab,冒号后面必须跟空格,这些细节后面会专门讲。
2.2 项目级配置隔离的实现逻辑
openrig 的核心机制是“就近加载”。当你在某个目录下启动 Claude Code 或 Codex 时,openrig 会从当前目录开始向上逐级查找.openrig.yaml或openrig.config.yaml文件,找到第一个就停下来加载。这个逻辑跟.gitignore、.editorconfig的查找方式是一样的,好处是你不需要手动指定配置文件路径,工具自己就能判断当前项目该用哪套配置。
这种设计解决了一个很实际的问题:假设你有两个项目,一个用公司的 API 网关,一个用个人的本地模型,以前你得手动改环境变量或者切换配置文件,现在只要在两个项目根目录各放一个 openrig 配置,进去就自动生效。我试过在 monorepo 里给每个子包放不同的配置,切换起来毫无感知。
2.3 与 Claude Code、Codex 的集成方式
openrig 本身不替代 Claude Code 或 Codex,它更像是一个“配置注入层”。具体来说,它通过两种方式跟这些工具对接:一是生成对应的环境变量文件,比如.env或者工具特定的配置文件;二是通过包装命令的方式,在启动 AI 助手之前先把配置加载好。
以 Claude Code 为例,它支持通过CLAUDE_CODE_CONFIG之类的环境变量指定配置路径,openrig 就利用这个入口把项目级配置传进去。Codex 那边类似,它读取~/.codex/config.yaml或者项目级的配置文件,openrig 会在启动前把合并后的配置写到正确的位置。这种“不侵入”的集成方式意味着即使你卸载 openrig,原来的工具照样能用,只是少了自动切换的便利。
2.4 为什么不用 npm 全局安装
社区里很多人问能不能npm install -g openrig,答案是可以但不推荐。全局安装的问题是版本锁定和权限冲突,尤其是 Windows 上经常遇到npm : 无法加载文件 c:\program files\nodejs\npm.ps1这类脚本执行策略的报错。openrig 官方推荐的方式是用npx或者项目本地安装,这样每个项目可以锁定自己的 openrig 版本,不会因为全局升级导致老项目配置解析失败。
如果你确实需要全局命令,建议用npm install -g openrig之后检查一下 PATH 里 nodejs 的路径有没有配好,Windows 用户还要确认 PowerShell 的执行策略不是 Restricted。这些细节在“常见问题”章节会展开。
3. 配置文件结构深度解析与实操要点
3.1 一个最小可用的 openrig 配置长什么样
先看一个最简配置,放在项目根目录的.openrig.yaml:
version: 1 profiles: default: provider: anthropic model: claude-sonnet-4-20250514 api_key_env: ANTHROPIC_API_KEY max_tokens: 8192这个配置做了四件事:声明配置版本、定义一个名为 default 的 profile、指定模型提供商和模型名、告诉 openrig 从哪个环境变量读取密钥。api_key_env这个设计很关键,它不直接把密钥写在配置文件里,而是引用环境变量,这样配置文件可以安全地提交到 Git 仓库。
启动时 openrig 会检查ANTHROPIC_API_KEY是否存在,不存在就报错并提示你怎么设置。这个检查逻辑比很多工具做得细致,它会区分“变量未定义”和“变量为空字符串”两种情况,给出的错误信息也不一样。
3.2 多 profile 切换与继承机制
实际项目里你往往需要多个配置档,比如一个用于日常开发,一个用于 CI 环境,一个用于本地模型调试。openrig 用profiles下的键名来区分:
version: 1 profiles: dev: provider: anthropic model: claude-sonnet-4-20250514 api_key_env: ANTHROPIC_API_KEY local: provider: openai-compatible base_url: http://localhost:1234/v1 model: local-model api_key_env: LOCAL_API_KEY ci: <<: *dev max_tokens: 4096这里ciprofile 用 YAML 锚点继承了dev的全部配置,只覆盖了max_tokens。注意锚点语法<<: *dev要求dev这个锚点已经被定义过,通常你会把公共部分抽到一个单独的anchors段里。我踩过的坑是锚点定义顺序问题,YAML 解析器是从上往下读的,如果*dev出现在dev定义之前就会报错。
切换 profile 的方式是在命令前加环境变量OPENRIG_PROFILE=local,或者用 openrig 提供的--profile参数。实测下来环境变量的方式更顺手,因为你可以把它写进 shell 的 alias 里。
3.3 权限与工具白名单的配置细节
Claude Code 和 Codex 都支持限制 AI 助手能执行哪些操作,比如是否允许运行 shell 命令、是否允许写文件。openrig 把这些权限控制也纳入了配置体系:
version: 1 profiles: default: provider: anthropic model: claude-sonnet-4-20250514 api_key_env: ANTHROPIC_API_KEY permissions: allow_shell: true allow_file_write: true allowed_commands: - npm - git - python denied_paths: - /etc - ~/.sshallowed_commands是个白名单,只有列出的命令才允许 AI 助手调用。denied_paths则明确禁止访问某些目录。这个配置在团队协作场景下特别有用,你可以确保 AI 助手不会误删系统文件或者读取敏感目录。
需要注意的是,不同 AI 助手对权限的支持粒度不一样。Claude Code 目前对 shell 命令的控制比较细,Codex 那边可能只支持粗粒度的开关。openrig 的做法是尽量映射到各工具原生的权限模型,映射不了的配置项会在启动时给出警告。
3.4 环境变量注入与密钥管理
除了api_key_env,openrig 还支持批量注入环境变量:
version: 1 profiles: default: provider: anthropic model: claude-sonnet-4-20250514 api_key_env: ANTHROPIC_API_KEY env: PROJECT_NAME: my-app LOG_LEVEL: debug CUSTOM_ENDPOINT: https://api.example.com这些变量会在启动 AI 助手之前注入到进程环境里。这里有个细节:openrig 默认不会覆盖已经存在的环境变量,除非你显式设置env_override: true。这个设计是为了避免项目配置意外覆盖掉系统级的关键变量。
密钥管理方面,我强烈建议用api_key_env而不是直接把密钥写在 YAML 里。如果你非要在配置文件里写密钥,至少用.gitignore把配置文件排除掉,或者用 SOPS、git-crypt 这类工具加密。我见过有人把密钥提交到公开仓库然后被扫出来,教训很深刻。
4. 完整实操流程:从安装到跑通第一个项目
4.1 安装 openrig 的三种方式对比
| 安装方式 | 命令 | 适用场景 | 注意事项 |
|---|---|---|---|
| npx 临时运行 | npx openrig init | 快速体验、一次性使用 | 每次都要下载,网络不好时慢 |
| 项目本地安装 | npm install --save-dev openrig | 团队项目、需要锁定版本 | 需要在 package.json 里加 script |
| 全局安装 | npm install -g openrig | 个人多项目频繁使用 | Windows 需检查 PATH 和执行策略 |
我个人的选择是项目本地安装,然后在package.json里加一行"rig": "openrig",这样团队成员 clone 下来npm install之后直接npm run rig就能用,版本也统一。全局安装虽然方便,但遇到不同项目需要不同 openrig 版本时就麻烦了。
如果你在 Windows 上遇到npm : 无法加载文件 c:\program files\nodejs\npm.ps1,因为在此系统上禁止运行脚本,这是 PowerShell 执行策略的问题。解决办法是以管理员身份打开 PowerShell,运行Set-ExecutionPolicy RemoteSigned,然后确认一下。如果公司电脑有组策略限制改不了,就改用 CMD 或者 Git Bash 来执行 npm 命令。
4.2 初始化项目配置的完整步骤
第一步,在项目根目录执行初始化命令:
npx openrig init这个命令会交互式地问你几个问题:用哪个 AI 提供商、模型名是什么、密钥从哪个环境变量读。回答完之后它会在当前目录生成.openrig.yaml文件。如果你已经有配置文件了,它会提示你是否覆盖。
第二步,设置环境变量。以 Linux/macOS 为例:
export ANTHROPIC_API_KEY="your-key-here"Windows PowerShell:
$env:ANTHROPIC_API_KEY="your-key-here"想永久生效的话,Linux/macOS 写进~/.bashrc或~/.zshrc,Windows 用setx ANTHROPIC_API_KEY "your-key-here"。
第三步,验证配置是否被正确加载:
npx openrig check这个命令会输出当前生效的 profile、模型名、密钥来源,以及有没有配置警告。如果一切正常,你会看到绿色的勾和配置摘要。
第四步,启动 AI 助手。openrig 提供了包装命令:
npx openrig run claude或者
npx openrig run codex它会先加载配置,然后启动对应的工具。你也可以直接用npx openrig env输出环境变量,然后手动启动工具,适合需要更精细控制的场景。
4.3 接入本地模型的配置实例
很多人关心怎么让 Claude Code 或 Codex 调用本地模型,比如通过 LM Studio 或者 Ollama 跑起来的模型。openrig 支持openai-compatible提供商类型,配置如下:
version: 1 profiles: local: provider: openai-compatible base_url: http://localhost:1234/v1 model: qwen2.5-coder-7b api_key_env: LOCAL_API_KEY max_tokens: 4096 temperature: 0.2这里base_url指向本地推理服务的地址,LM Studio 默认是http://localhost:1234/v1,Ollama 默认是http://localhost:11434/v1。api_key_env指向的环境变量可以随便设一个非空值,因为本地服务通常不校验密钥,但很多客户端库要求这个字段不能为空。
启动的时候用OPENRIG_PROFILE=local npx openrig run claude,Claude Code 就会把请求发到本地模型。实测下来,7B 级别的模型在代码补全场景下响应速度可以接受,但复杂推理还是得用云端大模型。这个配置的好处是你可以在没有网络的环境下继续用 AI 助手,或者在不方便把代码发到云端时用本地模型兜底。
4.4 团队协作场景下的配置分发
团队里每个人都有自己的密钥,但项目配置应该统一。openrig 的做法是把.openrig.yaml提交到仓库,但密钥相关的部分用环境变量引用。新成员 clone 下来之后只需要设置自己的密钥环境变量,配置本身不用改。
如果团队用不同的模型提供商,可以定义多个 profile,每个人通过OPENRIG_PROFILE环境变量选择自己用的那个。比如有人用 Anthropic 官方 API,有人用公司内部的网关,配置里都写好,各取所需。
还有一种情况是 CI 环境。CI 里通常没有交互式终端,openrig 提供了--non-interactive标志,遇到缺失的配置直接报错退出而不是等待输入。CI 的密钥通过 CI 平台的环境变量注入,openrig 会自动读取。
5. 常见问题与排查技巧实录
5.1 配置加载失败的排查顺序
遇到 openrig 报“找不到配置文件”或者“配置解析失败”,按这个顺序排查:
- 确认当前目录或上级目录存在
.openrig.yaml或openrig.config.yaml - 用
npx openrig check --verbose看详细日志,它会打印查找路径 - 检查 YAML 语法,特别是缩进和冒号后面的空格
- 确认
version字段存在且值为1 - 检查环境变量是否设置,
echo $ANTHROPIC_API_KEY看看有没有输出
YAML 语法错误是最常见的问题。我建议用 VS Code 装一个 YAML 插件,它会实时提示缩进错误和重复键。另外注意 YAML 里true和false是布尔值,如果你想要字符串得加引号,"true"和true在解析后类型不一样。
5.2 密钥泄露的预防与补救
如果你不小心把密钥写进了配置文件并提交到了 Git,第一件事是立即去提供商后台吊销那个密钥,然后生成新的。第二件事是用git filter-branch或者 BFG 工具从历史记录里清除密钥,但注意这会改写提交历史,团队协作时要提前沟通。
预防措施很简单:配置文件里永远只写api_key_env,不写实际密钥。在.gitignore里加上.env和*.local.yaml。如果团队用 SOPS 加密配置文件,那另说,但那是更重的方案,小团队用环境变量就够了。
5.3 与 npm 相关的典型报错处理
社区里反馈最多的几个 npm 报错:
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
npm : 无法加载文件 ... npm.ps1 | PowerShell 执行策略限制 | Set-ExecutionPolicy RemoteSigned |
npm warn ERESOLVE overriding peer dependency | 依赖版本冲突 | 用--legacy-peer-deps或升级依赖 |
npm ERR! network timeout | 网络问题 | 切换国内镜像源npm config set registry https://registry.npmmirror.com |
npm ERR! EACCES | 权限不足 | 不要用 sudo,改用 nvm 管理 Node 版本 |
国内镜像源的问题很常见,尤其是安装 openrig 这种依赖较多的包时。切换镜像源之后记得npm cache clean --force清一下缓存,否则可能还是从旧源拉取。
5.4 Claude Code 和 Codex 的配置兼容性差异
Claude Code 和 Codex 虽然都是 AI 编程助手,但配置模型不完全一样。Claude Code 对max_tokens、temperature这些参数支持得比较完整,Codex 那边可能只认部分字段。openrig 在生成最终配置时会做一层映射,把不支持的字段过滤掉并给出警告。
我遇到过一个情况:在 openrig 配置里设了temperature: 0.1,但 Codex 启动后还是用默认值。查了日志才发现 Codex 的配置文件格式跟 Claude Code 不同,openrig 的映射表里没有覆盖这个字段。解决办法是手动在 Codex 的配置文件里补上,或者等 openrig 更新映射表。
另外 Codex 有个codex is ignoring 1 unrecognized configuration setting的警告,这通常是因为配置文件里有 Codex 不认识的字段。不影响使用,但看着烦的话可以把那个字段注释掉。
5.5 性能与资源占用的实测数据
openrig 本身是个轻量工具,启动开销很小。我在一台 2019 款 MacBook Pro 上测过,openrig check耗时约 120ms,openrig run的额外开销在 200ms 以内。内存占用方面,openrig 进程本身大概占 30-50MB,相对于 Claude Code 或 Codex 动辄几百 MB 的内存占用来说可以忽略。
真正影响体验的是配置文件的复杂度。如果你定义了十几个 profile 和大量锚点引用,解析时间会线性增长。我的建议是保持配置文件精简,公共部分抽到单独的base.yaml里用!include引入,但注意 openrig 对!include的支持是有限制的,不支持循环引用。
6. 进阶用法与个人经验分享
6.1 用 openrig 管理多项目工作流
我日常同时维护三个项目:一个 Node 后端、一个 Python 数据管道、一个 Rust 命令行工具。每个项目的 AI 助手配置都不一样,后端项目需要访问数据库的权限,数据管道需要跑 Python 脚本的权限,Rust 项目则限制得比较严。
用 openrig 之后,我在每个项目根目录放一个.openrig.yaml,里面定义好该项目专属的权限和模型配置。切换项目的时候直接cd过去,openrig 自动加载对应配置,完全不用手动改任何东西。这个体验提升是实实在在的,尤其是当你一天之内要在多个项目之间来回切换的时候。
6.2 配置模板的复用与版本管理
如果你经常创建新项目,可以做一个配置模板仓库,里面放一个通用的.openrig.yaml基础版。新项目初始化的时候直接复制过去,改改项目名和模型就行。更进一步,你可以把模板发布成 npm 包,用npx openrig init --template your-template来初始化。
版本管理方面,openrig 配置文件应该跟项目代码一起提交到 Git。每次修改配置都走正常的 code review 流程,这样配置变更也有记录可查。我见过团队把配置放在共享网盘里,结果版本混乱导致各种诡异问题,还是跟着代码走最靠谱。
6.3 几个我踩过的坑和对应技巧
第一个坑是 YAML 的no被解析成布尔值false。如果你在配置里写model: no,YAML 解析器会把它当成false,然后 openrig 报类型错误。解决办法是加引号model: "no"。类似的关键字还有yes、on、off。
第二个坑是环境变量名大小写。Linux 和 macOS 是大小写敏感的,Windows 不敏感。如果你在 Windows 上设了anthropic_api_key小写,配置里写ANTHROPIC_API_KEY大写,Windows 上能跑,到了 Linux CI 上就找不到。统一用大写最稳妥。
第三个坑是配置文件里的相对路径。denied_paths里的~/.ssh在 openrig 里会被展开成用户主目录,但如果你写的是./secrets,它是相对于配置文件所在目录还是当前工作目录?实测下来是相对于配置文件所在目录,这个行为跟.gitignore一致,但跟某些工具不一样,需要注意。
6.4 后续可以扩展的方向
openrig 目前的功能还比较聚焦在配置管理上,但它的架构留了不少扩展空间。比如可以加一个openrig doctor命令,自动检测环境里 Claude Code 和 Codex 的安装情况、版本兼容性、密钥有效性,给出修复建议。还可以加配置的 schema 校验,在编辑配置文件的时候实时提示错误。
另一个方向是跟 CI/CD 更深度地集成,比如在 GitHub Actions 里自动根据分支切换 profile,PR 分支用低配模型省钱,主分支用高配模型保证质量。这些想法目前还得自己写脚本实现,但 openrig 的配置格式已经支持了,只差一层封装。
我个人在实际操作中的体会是,openrig 这类工具的价值不在于功能多强大,而在于它把一件小事做到了极致。配置切换这件事本身不复杂,但每天重复做就很烦。用一个声明式的配置文件把这个过程自动化,省下来的注意力可以放在真正重要的代码逻辑上。如果你也在用 Claude Code 或 Codex,并且经常在多个项目之间切换,花十分钟配一下 openrig,后面能省下不少来回改配置的时间。