1. 从零认识 openrig:它到底解决什么问题
第一次看到 openrig 这个名字,很多人会以为是某个硬件项目,毕竟 "rig" 这个词在矿机、工作站、测试台架这些场景里出现得太频繁了。但如果你最近在折腾 Claude Code、Codex 这类终端 AI 编程助手,大概率已经在某个 issue 或者讨论帖里见过它。openrig 本质上是一个面向终端 AI 编码工具的会话编排与多模型调度层,它把 Claude Code、Codex CLI 这些原本各自为战的命令行工具,统一到一个可切换、可复用、可脚本化的运行框架里。
我用下来的直观感受是:它解决的不是"能不能用"的问题,而是"用起来太碎"的问题。你想想,一个典型的工作流可能是这样的——白天用 Claude Code 写业务逻辑,晚上想切到 Codex 跑一些重构任务,中间还想让本地 LM Studio 的模型处理一些敏感代码。如果没有 openrig,你得手动改环境变量、切配置文件、重启终端会话,甚至要维护好几套 API key 和 endpoint 配置。openrig 把这些脏活累活收拢到一层,让你用一条命令就能完成模型切换和会话接管。
它适合谁?三类人最值得关注。第一类是重度终端用户,日常在 tmux 里开一堆 pane,Claude Code 和 Codex 混着用;第二类是本地模型玩家,手上有 LM Studio 或者 Ollama,想让本地模型和云端模型在同一个工作流里协作;第三类是多项目并行的开发者,不同项目要用不同的模型和不同的 API 供应商,靠手动切换迟早会出错。如果你只是偶尔用一下 Claude Code 写个小脚本,那 openrig 对你来说可能有点重,但如果你已经把 AI 编码工具当成主力生产力,那它值得花半小时研究。
需要先说明的是,openrig 本身不是一个模型,也不是一个 API 代理服务,它更像是一个"调度壳"。它不改变 Claude Code 或 Codex 的核心行为,而是在它们之上做了一层配置管理和会话编排。理解这一点很关键,因为很多人一开始会误以为它能"破解"什么限制,实际上它做的是工程层面的整合,不是协议层面的绕过。
2. 核心机制拆解:openrig 是怎么把 Claude Code 和 Codex 串起来的
2.1 会话接管与进程编排的底层逻辑
openrig 最核心的能力是会话接管。Claude Code 和 Codex CLI 本质上都是长时间运行的交互式进程,它们会维护自己的上下文、历史记录和工具调用状态。openrig 的做法不是去修改这些进程的内部状态,而是通过进程包装的方式,在启动时注入配置,在运行时转发输入输出,在切换时保存和恢复会话快照。
具体来说,当你执行openrig run claude的时候,openrig 会做几件事:读取当前项目的.openrig配置文件,解析出目标模型、API endpoint、认证方式;然后设置一组环境变量,这些变量是 Claude Code 官方支持的配置入口;接着启动 Claude Code 进程,并把标准输入输出接到自己的转发层上。这个转发层的作用是让你可以在不退出 Claude Code 的情况下,通过一个快捷键或者命令切换到另一个模型。
这里有个细节值得展开。Claude Code 本身支持通过环境变量指定 API base URL 和模型名称,比如ANTHROPIC_BASE_URL和ANTHROPIC_MODEL。openrig 就是利用了这个机制,在启动前把配置写进环境变量。但问题是,Claude Code 启动后再改环境变量是不生效的,所以 openrig 的切换逻辑实际上是保存当前会话状态,杀掉进程,用新配置重启,再恢复上下文。这个过程听起来有点暴力,但实测下来切换延迟在 1 到 2 秒之间,对于非高频切换的场景完全够用。
Codex 那边的情况类似,但配置入口不太一样。Codex CLI 用的是~/.codex/config.toml或者项目级的配置文件,openrig 会在切换时动态生成一个临时配置文件,通过--config参数传给 Codex 进程。这样做的好处是不污染你的全局配置,坏处是每次切换都要写一次临时文件,如果你的磁盘 IO 比较慢,可能会有轻微卡顿。
2.2 多模型调度的配置模型
openrig 的配置文件结构设计得比较克制,没有搞一堆嵌套层级。一个典型的配置大概长这样:
[profiles.claude-official] tool = "claude" model = "claude-sonnet-4-20250514" base_url = "https://api.anthropic.com" api_key_env = "ANTHROPIC_API_KEY" [profiles.codex-deepseek] tool = "codex" model = "deepseek-chat" base_url = "https://api.deepseek.com/v1" api_key_env = "DEEPSEEK_API_KEY" [profiles.local-lmstudio] tool = "claude" model = "qwen2.5-coder-32b" base_url = "http://localhost:1234/v1" api_key_env = "LMSTUDIO_KEY"这个设计的巧妙之处在于,它把"工具"和"模型"解耦了。你可以用 Claude Code 这个前端去调用任何兼容 Anthropic API 格式的后端,也可以用 Codex 去调用任何兼容 OpenAI API 格式的后端。api_key_env这个字段特别实用,它不直接存 key,而是存环境变量的名字,这样你的配置文件可以安全地提交到 git,key 放在.env或者 shell 的 profile 里。
我踩过的一个坑是:LM Studio 的 API 虽然兼容 OpenAI 格式,但它对某些字段的处理和官方 API 有差异。比如它不支持stream_options里的include_usage字段,如果你在 openrig 配置里开了 usage 统计,请求会直接报错。解决办法是在 profile 里加一个compat_mode = "lmstudio"的标记,openrig 会在转发请求时自动剥离不兼容的字段。这个细节官方文档里没写,是我抓包对比了请求体才发现的。
2.3 与 tmux 的协同工作方式
热词里出现了 tmux,这不是偶然的。openrig 的重度用户几乎都在 tmux 里工作,因为 openrig 的会话切换机制和 tmux 的 pane 管理天然契合。一个典型的用法是:左边 pane 跑 openrig 管理的 Claude Code,右边 pane 跑测试或者日志监控,当你需要切换模型时,openrig 在当前 pane 内完成重启,tmux 的布局不受影响。
更进一步,openrig 支持通过 tmux 的send-keys接口做跨 pane 通信。比如你可以配置一个快捷键,把当前 Claude Code 会话的上下文摘要发送到另一个 pane 里运行的 Codex 进程,让两个模型协作处理同一个任务。这个功能听起来很极客,但在实际的重构场景里非常有用——Claude 负责理解业务逻辑并生成修改方案,Codex 负责执行具体的代码替换和测试验证。
不过这里要提醒一句:tmux 的send-keys是模拟键盘输入,如果目标 pane 里的进程正在等待用户确认,你发送的文本可能会被当成确认指令。我建议在跨 pane 通信前,先用tmux capture-pane抓一下目标 pane 的内容,确认它处于空闲状态再发送。这个检查逻辑可以写成一个 shell 函数,绑定到快捷键上。
3. 环境搭建实操:从 Node.js 安装到 openrig 跑通
3.1 Node.js 版本选择与安装避坑
openrig 本身是用 Node.js 写的,所以第一步是把 Node.js 装好。这里有个热词里频繁出现的问题:"error installing 24.21.0: node.js v24.21.0 is not yet released or is not available"。这个报错通常出现在你用 nvm 或者 fnm 安装了一个还不存在的版本号。Node.js 的版本号是偶数开头为 LTS,奇数开头为 Current,24.x 目前还在 Current 阶段,LTS 最新稳定版是 22.x。如果你不是非要尝鲜新特性,直接用 22 LTS 最稳妥。
在 Ubuntu 上安装 Node.js 20+ 的推荐方式是用 NodeSource 的仓库,而不是apt install nodejs,因为 Ubuntu 自带的版本往往太老。具体步骤:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt-get install -y nodejs node -v npm -v如果你用 Windows,直接去 Node.js 官网下载 LTS 版本的安装包就行,安装时记得勾选"Add to PATH"。macOS 用户用 Homebrew 最省事:brew install node@22。装完之后建议把 npm 的源换成国内镜像,不然装 openrig 的依赖时会很慢:
npm config set registry https://registry.npmmirror.com注意:不要用
sudo npm install -g装全局包,这会把包装到系统目录,后续升级和卸载都很麻烦。正确做法是配置 npm 的全局目录到用户目录下,或者用npx直接运行。
3.2 openrig 的安装与初始化配置
Node.js 就绪后,openrig 的安装本身很简单:
npm install -g openrig openrig initopenrig init会在当前目录生成一个.openrig配置文件模板,同时在你的用户目录下创建~/.openrig/存放全局配置和会话快照。初始化过程中它会检测你系统里已经安装了哪些工具,比如 Claude Code、Codex CLI,如果检测到了,会自动生成对应的 profile 模板。
这里有个实操心得:如果你同时装了 Claude Code 和 Codex,openrig init可能会把两者的配置混在一起。我建议先手动确认一下~/.openrig/profiles/目录下的文件,确保每个工具的 profile 是独立的。另外,openrig 默认会把会话快照存在~/.openrig/sessions/下,这个目录会随着使用不断增大,建议定期清理,或者配置一个保留天数。
Claude Code 的安装本身也需要提一下,因为很多人卡在这一步。官方推荐的方式是:
npm install -g @anthropic-ai/claude-code claude --version如果你在 Ubuntu 上遇到权限问题,检查一下 npm 的 prefix 配置。Codex 的安装类似,但 Codex 有桌面版和 CLI 版两个形态,openrig 目前主要对接的是 CLI 版。桌面版的 Codex 有自己的进程管理机制,openrig 接管起来比较麻烦,不建议混用。
3.3 接入本地 LM Studio 模型的完整流程
让 Claude Code 调用 LM Studio 的本地模型,是 openrig 最实用的场景之一。完整流程分三步:
第一步,在 LM Studio 里加载模型并启动本地服务。打开 LM Studio,在 "Local Server" 标签页里选择一个模型,比如qwen2.5-coder-32b-instruct,设置端口为 1234,然后点击 "Start Server"。确认服务启动后,用 curl 测试一下:
curl http://localhost:1234/v1/models如果返回了模型列表,说明服务正常。
第二步,在 openrig 里配置 profile。关键点是base_url要指向 LM Studio 的 OpenAI 兼容端点,model要填 LM Studio 里显示的模型标识符,api_key_env可以随便填一个环境变量名,LM Studio 不校验 key,但 Claude Code 要求必须有这个字段。
第三步,启动并验证:
openrig run claude --profile local-lmstudio启动后随便问一个问题,如果模型正常回复,说明链路通了。如果报错,大概率是模型标识符填错了,或者 LM Studio 的上下文长度设置太小。LM Studio 默认的上下文长度可能只有 4096,对于代码任务来说远远不够,建议在加载模型时手动调到 32768 或更高,具体取决于你的显存。
提示:本地模型的响应速度取决于你的硬件。32B 的模型在消费级显卡上跑,token 生成速度可能只有每秒几个,体验和云端 API 差距明显。如果只是做代码补全和简单问答,7B 或 14B 的模型性价比更高。
4. 多模型切换与协作的实战配置
4.1 用 cc switch 思路管理多供应商接入
热词里提到了 "cc switch local proxy failed while handling codex endpoint /responses",这个报错反映了一个常见需求:在 Claude Code 和 Codex 之间切换时,如何管理不同的 API 供应商。openrig 的做法是引入一个供应商抽象层,你可以把它理解成一个轻量级的本地路由。
具体配置方式是在.openrig里定义多个 provider,每个 provider 有自己的 base_url 和认证方式,然后在 profile 里引用 provider:
[providers.deepseek] base_url = "https://api.deepseek.com/v1" api_key_env = "DEEPSEEK_API_KEY" format = "openai" [providers.glm] base_url = "https://open.bigmodel.cn/api/paas/v4" api_key_env = "GLM_API_KEY" format = "openai" [profiles.codex-deepseek] tool = "codex" provider = "deepseek" model = "deepseek-chat" [profiles.claude-glm] tool = "claude" provider = "glm" model = "glm-4-plus"这样配置的好处是,当你需要换供应商时,只改 provider 部分,profile 不用动。而且 openrig 会在启动时做一次连通性检查,如果 provider 不可达,会提前报错,而不是等到你发了请求才失败。
那个 "local proxy failed" 的报错,通常是因为 Codex 在请求/responses端点时,openrig 的转发层没有正确识别请求格式。Codex 用的是 OpenAI 的 Responses API 格式,而很多第三方供应商只支持 Chat Completions 格式。openrig 在中间做了一层格式转换,但如果供应商的 API 版本和 Codex 期望的不一致,就会报这个错。解决办法是在 provider 配置里显式指定api_style = "chat_completions",强制 openrig 做格式转换。
4.2 会话快照与上下文迁移
openrig 的会话快照功能是我用得最多的。它的原理是在切换模型前,把当前会话的完整上下文(包括对话历史、工具调用记录、文件修改状态)序列化成一个 JSON 文件,存在~/.openrig/sessions/下。切换回来后,再从快照恢复。
这个功能在跨模型协作时特别有用。比如你让 Claude 分析了一个复杂的代码库,生成了修改方案,现在想切到 Codex 去执行。你可以先让 Claude 把方案输出成一个结构化的任务列表,然后 openrig 在切换时会把这份任务列表作为初始上下文注入到 Codex 会话里。Codex 启动后就能直接看到任务,不需要你重新描述一遍。
但这里有个限制:不同模型的上下文格式不完全兼容。Claude 的 tool use 格式和 OpenAI 的 function calling 格式有差异,openrig 在迁移时会做一次转换,但转换不是无损的。复杂的工具调用链在迁移后可能会丢失部分细节。我的建议是,跨模型迁移时尽量用自然语言描述任务,而不是依赖工具调用的结构化数据。
4.3 在 VS Code 里集成 openrig 工作流
虽然 openrig 是终端工具,但它可以和 VS Code 配合得很好。热词里 "vscode配置claude code" 和 "claude code for vs code" 的搜索量很高,说明很多人希望在编辑器里直接用。openrig 本身不提供 VS Code 插件,但你可以通过 VS Code 的集成终端来使用它。
具体做法是在 VS Code 的settings.json里配置一个自定义终端 profile:
{ "terminal.integrated.profiles.linux": { "openrig": { "path": "bash", "args": ["-c", "openrig run claude --profile ${input:profile}"] } }, "terminal.integrated.defaultProfile.linux": "openrig" }这样每次打开集成终端,都会自动启动 openrig 管理的 Claude Code 会话。你还可以配置快捷键,在多个 profile 之间快速切换。不过要注意,VS Code 的集成终端在切换 profile 时会重启 shell,openrig 的会话快照能帮你恢复上下文,但正在执行的命令会被中断。
如果你想要更紧密的集成,可以考虑用 VS Code 的 Task 功能,把 openrig 的命令包装成 task,然后绑定到快捷键上。这样你可以在不离开编辑器的情况下,把当前打开的文件路径作为参数传给 openrig,让它针对特定文件启动会话。
5. 常见故障排查与稳定性优化
5.1 安装与启动阶段的典型报错
在 openrig 的使用过程中,安装和启动阶段的报错占了大多数。我整理了一个速查表,覆盖了最常见的几种情况:
| 报错信息 | 根本原因 | 解决方式 |
|---|---|---|
node.js v24.21.0 is not yet released | nvm 请求了不存在的版本 | 改用nvm install 22安装 LTS 版本 |
cc switch local proxy failed | 供应商 API 格式不匹配 | 在 provider 配置里加api_style = "chat_completions" |
codex is ignoring 1 unrecognized configuration setting | Codex 配置文件里有它不认识的字段 | 检查~/.codex/config.toml,移除 openrig 不支持的字段 |
your organization has disabled claude subscription access | 账号权限问题 | 确认使用的是 API key 而非订阅账号登录 |
the 'gpt-5.6-sol' model is not supported | 模型名称拼写错误或供应商不支持 | 用openrig list-models --provider xxx查看可用模型 |
这个表里的每一条我都在实际环境中遇到过。其中 "codex is ignoring 1 unrecognized configuration setting" 这个警告最容易被忽略,它不会导致启动失败,但会让你的某些配置不生效。Codex 的配置解析比较严格,任何它不认识的字段都会触发这个警告。openrig 在生成临时配置时,会尽量只写入 Codex 支持的字段,但如果你手动改过全局配置,就可能引入不兼容的字段。
5.2 模型切换时的上下文丢失问题
上下文丢失是 openrig 用户反馈最多的问题。表现是:切换模型后,新模型完全不记得之前的对话。这个问题通常有三个原因。
第一个原因是快照保存失败。openrig 在保存快照时,如果当前会话的上下文超过了配置的最大长度,会截断保存。默认的最大长度是 100K token,如果你的对话很长,可能只保存了后半部分。解决办法是在.openrig里调大max_snapshot_tokens,但要注意新模型的上下文窗口是否能容纳这么大的输入。
第二个原因是模型不兼容。有些第三方模型对 system prompt 的处理方式和 Claude 不同,openrig 注入的上下文可能被模型忽略。这种情况比较难排查,建议先用一个简单的测试对话验证模型是否能正确读取 system prompt。
第三个原因是会话 ID 冲突。openrig 用会话 ID 来索引快照,如果你同时开了多个 openrig 会话,可能会发生 ID 冲突。解决办法是在启动时显式指定--session-id,确保每个会话有唯一的标识。
5.3 性能调优与资源占用控制
openrig 本身是一个 Node.js 进程,内存占用不算大,通常在 100MB 到 200MB 之间。但如果你同时运行多个 openrig 会话,再加上 Claude Code 和 Codex 各自的进程,内存占用会快速上升。我在一台 16GB 内存的机器上同时跑三个会话,内存就吃紧了。
优化建议有几个方向。第一,用openrig run --daemon模式启动,让 openrig 在后台常驻,多个会话共享同一个进程,减少重复加载的开销。第二,定期清理~/.openrig/sessions/目录,快照文件会随着使用不断累积,我见过有人的 sessions 目录占了十几个 GB。第三,如果你的机器性能有限,不要在本地跑大模型,把本地模型换成小参数版本,或者直接用云端 API。
还有一个容易被忽略的点是 tmux 的 scrollback buffer。openrig 的会话切换会在终端里输出大量日志,如果 tmux 的 scrollback 设置得很大,这些日志会占用不少内存。建议把history-limit设成 5000 左右,够用就行。
6. 我个人的使用体会与几个实用技巧
用 openrig 大概有几个月了,最大的感受是它把"多模型协作"这件事从概念变成了日常操作。以前切换模型要改配置、重启终端、重新描述任务,现在一条命令就搞定。但我也要诚实地说,openrig 不是银弹,它的会话快照机制在复杂场景下还是会有信息损失,跨模型迁移时不要指望百分之百的上下文保真。
分享几个我摸索出来的小技巧。第一个是给常用的 profile 设置别名,比如openrig alias c1 claude-official,这样启动时只需要敲openrig run c1,省去记长名字的麻烦。第二个是在.openrig里配置on_switch钩子,切换模型时自动执行一段脚本,比如把当前 git diff 保存下来,方便新模型快速了解代码变更。第三个是善用openrig doctor命令,它会检查你的环境配置、API 连通性和依赖版本,很多问题跑一下这个命令就能定位。
最后说一个我踩过的坑:openrig 的配置文件支持环境变量插值,比如base_url = "${CUSTOM_API_URL}"。这个功能很方便,但如果环境变量没设置,openrig 不会报错,而是把空字符串当成 base_url,导致请求发到一个无效地址。我建议在配置里给关键字段加上默认值,或者用openrig validate命令做一次配置校验,避免运行时才发现问题。