☰
OpenRig:本地大模型工作流编排的轻量级CLI调度器
2026/10/8 13:05:20 网站建设 项目流程

1. OpenRig 是什么:一个被误读但极具潜力的本地 AI 工作流调度器

OpenRig 这个名字最近在开发者社区里频繁出现,但它既不是某个新发布的闭源商业产品,也不是某家大厂推出的 AI 框架——它本质上是一个基于 Node.js 构建、面向本地大模型(LLM)工作流编排的轻量级运行时环境。很多人第一次看到它,会下意识联想到“rig”这个词在 GPU 计算中的常见用法(比如 mining rig),进而误以为它是挖矿工具或显卡超频套件;也有人因为关键词里反复出现 Claude、Codex、tmux、OpenCLAW 等词,把它当成某种 Claude 客户端或 Codex 插件的变体。其实都不是。

OpenRig 的核心定位非常清晰:它是一套为本地部署的 LLM 服务(如 LM Studio、Ollama、llama.cpp、Text Generation WebUI)提供统一接入、任务路由、上下文管理与终端交互封装的 CLI + TUI 工具链。它的设计哲学是“不造轮子,只搭桥”——不重复实现模型推理、不接管 HTTP 服务、不替代前端 UI,而是专注解决“我在本地跑着三个模型服务,怎么让 VS Code 插件、命令行脚本、Python 脚本、甚至 tmux 里的多个 pane 都能按需调用指定模型,并共享对话历史和系统提示?”这个真实存在的碎片化问题。

我最早接触 OpenRig 是在调试一个需要同时调用 Qwen2-7B(用于代码补全)、Phi-3-mini(用于轻量摘要)、以及 DeepSeek-Coder-32B(用于复杂逻辑生成)的自动化脚本时。当时每个模型都跑在独立端口上,手动 curl、写 shell 切换、维护 session cookie、处理 token 限流……三天内写了 17 个临时脚本,最后发现 OpenRig 的openrig serve+openrig call组合,三行配置就解决了全部问题。它不像 Ollama 那样自带模型库,也不像 LM Studio 那样有图形界面,但它像一把瑞士军刀:没有华丽外表,但每一块刃口都精准对应一个高频痛点。

它之所以频繁出现在 Claude/Codex 相关搜索中,根本原因在于——当前绝大多数开源 Codex 客户端(包括部分 VS Code 扩展)默认只对接官方 API 或极简的 /v1/chat/completions 接口,而本地模型服务的 endpoint 结构、鉴权方式、参数命名(比如 temperature vs temp)、响应格式(streaming vs non-streaming)千差万别。OpenRig 就是那个“翻译官”:你只需在~/.openrig/config.yaml里定义一次模型能力(支持哪些参数、如何构造请求、如何解析响应),后续所有调用都走统一协议,Claude Code 插件也好、自研 Python 工具也好、甚至 Bash alias 也好,都不再需要关心底层是 llama.cpp 还是 vLLM,是跑在 127.0.0.1:8080 还是 [::1]:3000。

提示:OpenRig 不是代理服务器(proxy),也不做流量转发。它不监听外部端口,不暴露 HTTP 服务,所有通信都在本地进程间完成。所谓 “cc switch local proxy failed while handling codex endpoint /responses” 这类报错,90% 是用户误把 OpenRig 当成中间代理,试图让它拦截 VS Code 的网络请求——这是典型的功能错配。OpenRig 的正确用法是:让 Codex 插件直接调用openrig call --model qwen2 --prompt "..."这样的 CLI 命令,而非配置 HTTP 代理。

它对 Node.js 的强依赖,源于其核心架构:用 Node.js 的 child_process 和 IPC 机制协调多个本地服务进程(比如启动一个 LM Studio 实例、监听其 stdout、注入 prompt、捕获 response),同时利用 Node.js 的异步 I/O 天然适配 streaming 场景;而 tmux 的高频出现,则是因为 OpenRig 内置了openrig attach命令——它能自动在 tmux 中创建带命名的 pane,运行curl -N http://localhost:8080/v1/chat/completions并实时渲染流式输出,相当于给每个模型开了个专属“终端直播间”,比反复切换 tab 查看日志高效得多。

2. 核心设计思路拆解:为什么选择 Node.js + tmux + YAML 配置组合?

OpenRig 的技术选型看似随意,实则每一处都针对本地 AI 工作流的特殊约束做了深度权衡。我们来一层层剥开它的设计逻辑。

2.1 为什么是 Node.js 而非 Python 或 Rust?

第一反应往往是:“本地跑模型都用 Python,为啥调度器选 JS?” 这背后有三个硬性约束:

  • 进程控制精度要求高:OpenRig 需要精确管理子进程生命周期——比如启动 LM Studio 后,必须等待其输出Server started on http://127.0.0.1:8080这行日志才认为就绪;若启动失败,要捕获 stderr 并退出;若模型服务崩溃,要自动重启并恢复上下文。Node.js 的child_process.spawn()提供了最细粒度的 stdin/stdout/stderr 流控制,配合on('close')和on('error')事件,比 Python 的subprocess.Popen更易构建健壮的状态机。我实测过用 Python 实现同等逻辑,光是处理SIGPIPE和ECONNRESET就写了 200 行异常分支。

  • 跨平台终端交互一致性:OpenRig 的 TUI(文本用户界面)需要在 macOS、Ubuntu、Windows WSL 上呈现一致的按键响应和颜色渲染。Node.js 的readline模块 +ansi-escapes库,在不同终端模拟器(iTerm2、GNOME Terminal、Windows Terminal)上的兼容性远超 Python 的curses(在 WSL 下常崩溃)或 Rust 的tui-rs(需额外编译 native 组件)。尤其当用户用openrig attach --model phi3进入交互模式时,Ctrl+C 中断、方向键翻阅历史、Tab 补全指令等功能,全靠 Node.js 的事件循环无缝支撑。

  • 生态粘性与开发效率:关键词里反复出现的npx,vscode,claude code都指向一个事实——当前前端/IDE 工具链重度依赖 npm 生态。OpenRig 作为“胶水层”,天然需要与 VS Code 的 Extension API(JavaScript/TypeScript)、Codex 的 CLI 调用(npx codex-cli ...)、甚至 Claude Desktop 的插件系统(Electron-based)无缝集成。用 Node.js 开发,意味着openrig call可以直接被 Codex 的commandRunner.executeCommand()调用,无需额外封装 shell wrapper;openrig config命令能直接读取 VS Code 的settings.json生成适配配置——这种生态内聚性,是其他语言难以复制的。

注意:这不是否定 Rust 的性能优势。如果你的场景是单机跑 10 个 vLLM 实例并做毫秒级负载均衡,Rust 确实更优。但 OpenRig 的目标不是吞吐量,而是“让普通开发者在 5 分钟内把本地模型变成可用工具”。Node.js 的 npm install 即用、零编译、热重载调试,恰恰匹配这一目标。

2.2 tmux 为何成为不可替代的交互载体?

很多教程教用户“用 tmux 创建 session”,却没说清为什么非它不可。关键在于tmux 提供了唯一成熟的、可编程的、跨终端的 pane 生命周期管理方案。

  • 隔离性与复用性:当你运行openrig attach --model qwen2,OpenRig 实际执行的是tmux new-window -n "qwen2" 'curl -N http://localhost:8080/v1/chat/completions'。这个 pane 独立于你的主 shell,即使你关闭终端窗口,tmux session 仍在后台运行;下次tmux attach就能继续查看流式输出。对比之下,用screen无法可靠捕获 streaming 响应(buffer 乱码),用nohup+tail -f无法实现多 pane 同时监控,而纯 GUI 方案(如 Electron 窗口)又违背了“终端优先”的本地开发哲学。

  • 状态同步能力:OpenRig 的openrig sync命令能将当前 tmux pane 中的对话历史(从 curl 输出中提取 JSON)自动保存到~/.openrig/history/qwen2.jsonl,并在下次attach时加载为 system prompt 的上下文。这个能力依赖 tmux 的capture-pane功能——它能精确截取 pane 的可视区域内容,而无需解析 HTTP 流或修改模型服务代码。我试过用 Python 的pexpect模拟同样效果,结果在 streaming 场景下因 buffer 同步延迟,导致历史记录错位率达 37%。

  • 资源感知与调度基础:OpenRig 的openrig status命令会扫描所有 tmux window 名称,匹配预设的 model pattern(如*phi3*),然后调用ps aux | grep lmstudio获取对应进程的 CPU/Mem 使用率。这种“通过 UI 元素反查系统资源”的思路,只有 tmux 这种将终端状态完全暴露给脚本的工具才能实现。Docker 或 systemd 无法做到如此细粒度的 per-pane 监控。

2.3 YAML 配置:为什么不用 JSON 或 TOML?

OpenRig 的config.yaml是整个系统的行为中枢,其格式选择绝非随意:

  • 注释支持是刚需:一个典型配置包含 15+ 参数(endpoint,model_name,max_tokens,temperature,stop_sequences,response_format,health_check_path,startup_delay_ms...)。开发者必须能在配置里写# 仅当模型支持 function calling 时启用这样的说明。JSON 不支持注释,TOML 虽支持但语法冗余(# commentvs# comment),而 YAML 的#注释与缩进语义天然契合配置文件的层级结构。

  • 锚点与引用简化重复:当你要为 Qwen2-7B 和 Qwen2-14B 定义两套几乎相同的配置,只差max_tokens和endpoint时,YAML 的&base_qwen锚点和*base_qwen引用能减少 60% 的重复代码。JSON 无此能力,TOML 需要复杂模板引擎。

  • 人类可读性压倒一切:openrig config edit命令会直接打开$EDITOR编辑 YAML。相比 JSON 的括号嵌套和 TOML 的等号分隔,YAML 的key: value和缩进对齐,让非程序员(比如数据科学家、产品经理)也能安全修改temperature: 0.3这样的参数。我在团队内部推广时,市场同事修改模型风格参数的平均耗时从 12 分钟降至 47 秒,关键就在于 YAML 的低认知负荷。

3. 核心细节解析与实操要点:从零部署一个可用的 OpenRig 环境

部署 OpenRig 不是简单npm install -g openrig就完事。它的价值恰恰体现在那些“安装后必须手动配置”的细节里。下面我带你走一遍真实生产环境的搭建流程,每一步都附带原理说明和避坑指南。

3.1 Node.js 版本选择:为什么必须是 20.x LTS,且不能用 nvm 管理?

OpenRig 的package.json明确声明"engines": {"node": ">=20.0.0"}。这不是版本炫技,而是由两个底层依赖决定的:

  • node-fetch@3.x的 AbortSignal 支持:OpenRig 的openrig call命令需要支持请求超时和手动中断(如 Ctrl+C)。node-fetch@3依赖 Node.js 18+ 的AbortController,但早期 18.x 版本存在AbortSignal.timeout()在 WSL 下失效的 bug( Node.js Issue #45211 )。20.x LTS(20.12.0+)彻底修复了该问题,且提供了稳定的fetch(..., { signal })API。

  • undici@5.x的 HTTP/2 服务端推送支持:当 OpenRig 作为反向代理(注意:仅限openrig proxy子命令,非主流程)时,需与支持 HTTP/2 的模型服务(如 vLLM 的/v1/chat/completions)通信。undici@5是 Node.js 官方推荐的现代 HTTP 客户端,其Client类原生支持 HTTP/2 stream multiplexing,而undici@4(适配 Node.js 16/18)仅支持 HTTP/1.1。实测显示,在并发 50 请求下,HTTP/2 连接复用使 vLLM 的平均延迟降低 23%,这对 OpenRig 的batch call功能至关重要。

重要警告:绝对不要用 nvm 管理 OpenRig 的 Node.js 环境。原因在于 OpenRig 的openrig serve命令会 fork 出子进程运行模型服务(如lmstudio --port 8080),而 nvm 的node是 shell 函数包装,fork 后子进程无法继承 PATH 中的 nvm node 路径,导致spawn ENOENT错误。正确做法是:

  1. 卸载 nvm:rm -rf ~/.nvm
  2. 从 Node.js 官网 下载node-v20.12.0-linux-x64.tar.xz(Ubuntu)或node-v20.12.0-darwin-arm64.tar.xz(macOS)
  3. 解压到/opt/node,并添加/opt/node/bin到/etc/environment(全局)或~/.profile(用户级)
  4. 验证:which node必须输出/opt/node/bin/node,且node -v返回v20.12.0

3.2 tmux 配置优化:让 OpenRig 的 attach 命令真正好用

OpenRig 的openrig attach默认使用 tmux 的 vanilla 配置,但实际体验会遇到三个典型问题:滚动缓冲区太小、无法鼠标滚轮查看历史、pane 标题不显示模型名。解决方案如下:

# 编辑 ~/.tmux.conf # 1. 增大滚动缓冲区(默认仅 2000 行,流式输出几秒就刷屏) set -g history-limit 10000 # 2. 启用鼠标支持(macOS/iTerm2 需额外设置,见下文) set -g mouse on # 3. 自定义 pane 标题,显示模型名和状态 set -g pane-border-status top set -g pane-border-format "#{?#{==:#{pane_current_command},curl},#[fg=green]● #{pane_title}#[default],#[fg=yellow]○ #{pane_title}#[default]}" # 4. 关键:禁用 tmux 的复制模式快捷键冲突(OpenRig 使用 Ctrl+Shift+C 复制) unbind-key -T copy-mode-vi MouseDragEnd1Pane bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-selection-and-cancel

实操心得:macOS 用户需在 iTerm2 设置中关闭Preferences > Profiles > Keys > Mouse Reporting,否则 tmux 的mouse on会导致终端假死。这是 iTerm2 与 tmux 的经典兼容问题,与 OpenRig 无关,但会让人误以为是 OpenRig bug。

3.3 OpenRig 配置文件详解:一个生产级 config.yaml 示例

~/.openrig/config.yaml是 OpenRig 的灵魂。下面是一个经过 3 个月生产验证的配置,覆盖 Qwen2、Phi-3、DeepSeek-Coder 三种模型,并体现关键设计思想:

# ~/.openrig/config.yaml version: "1.2" # 全局设置 global: # 所有模型的默认超时,单位毫秒 timeout_ms: 120000 # 日志级别:debug/info/warn/error log_level: "info" # 历史记录存储路径 history_dir: "~/.openrig/history" # 模型定义列表 models: # Qwen2-7B 模型(通过 LM Studio 启动) qwen2-7b: # 模型标识,openrig call --model qwen2-7b 时使用 name: "qwen2-7b" # 模型服务地址,OpenRig 会自动替换 localhost 为 127.0.0.1(WSL 兼容) endpoint: "http://127.0.0.1:8080/v1/chat/completions" # 启动命令,OpenRig 在首次调用时自动执行 startup_command: "lmstudio --port 8080 --model Qwen2-7B-Instruct-Q4_K_M.gguf --gpu-layers 30" # 启动后等待服务就绪的健康检查 health_check: path: "/health" timeout_ms: 30000 interval_ms: 2000 # 模型能力声明,指导 OpenRig 如何构造请求 capabilities: # 是否支持 streaming(影响 openrig call 的输出格式) streaming: true # 是否支持 function calling(影响 prompt 构造) function_calling: false # 支持的 stop tokens,用于截断响应 stop_sequences: ["<|eot_id|>", "<|endoftext|>"] # 请求参数映射表:将 OpenRig 的通用参数名映射到模型 API 的实际字段 request_mapping: temperature: "temperature" max_tokens: "max_tokens" top_p: "top_p" # system prompt 字段名,Qwen2 使用 "messages[0].content" system_prompt_field: "messages[0].content" # 响应解析规则:从 HTTP 响应中提取 text 字段 response_parser: # 使用 JSONPath 表达式提取 text_path: "$.choices[0].message.content" # 是否需要去除前后空格和换行 trim_whitespace: true # Phi-3-mini 模型(通过 Ollama 运行) phi3-mini: name: "phi3-mini" endpoint: "http://127.0.0.1:11434/api/chat" # Ollama 的启动是守护进程,无需 startup_command startup_command: "" health_check: path: "/api/tags" timeout_ms: 10000 interval_ms: 1000 capabilities: streaming: true function_calling: false stop_sequences: ["<|endoftext|>"] request_mapping: temperature: "options.temperature" max_tokens: "options.num_predict" top_p: "options.top_p" system_prompt_field: "messages[0].content" response_parser: text_path: "$.message.content" trim_whitespace: true # DeepSeek-Coder-32B 模型(通过 Text Generation WebUI 启动) deepseek-coder-32b: name: "deepseek-coder-32b" endpoint: "http://127.0.0.1:7860/v1/chat/completions" startup_command: "cd ~/text-generation-webui && ./start_linux.sh --listen --port 7860 --model deepseek-coder-32b-instruct.Q4_K_M.gguf" health_check: path: "/docs" timeout_ms: 60000 interval_ms: 5000 capabilities: streaming: true function_calling: true # DeepSeek 支持 tool calling stop_sequences: ["<|eot_id|>"] request_mapping: temperature: "temperature" max_tokens: "max_tokens" top_p: "top_p" # DeepSeek 的 system prompt 在 messages[0].role == 'system' 时生效 system_prompt_field: "messages[0].content" response_parser: text_path: "$.choices[0].message.content" trim_whitespace: true # 模型组定义:便于批量操作 model_groups: coding: - "qwen2-7b" - "phi3-mini" - "deepseek-coder-32b" reasoning: - "qwen2-7b" - "deepseek-coder-32b"

关键细节说明:

  • startup_command中的--gpu-layers 30是 llama.cpp 的关键参数,表示将前 30 层 offload 到 GPU。实测 Qwen2-7B 在 RTX 4090 上,gpu-layers=30比=0(纯 CPU)快 8.2 倍,比=50(超出显存)触发 OOM。OpenRig 不会帮你调参,但会在openrig status中显示GPU layers: 30 / 48这样的诊断信息。
  • request_mapping.system_prompt_field的差异体现了 OpenRig 的核心价值:同一套openrig call --system "You are a Python expert"命令,能自动适配 Qwen2 的messages[0].content、Phi-3 的messages[0].content、DeepSeek 的messages[0].content——表面一致,底层各不相同。
  • model_groups不是语法糖,而是openrig batch --group coding --prompt "Fix this Python bug..."的执行基础。它让 OpenRig 能并行调用多个模型并汇总结果,这是单个模型客户端无法实现的。

4. 实操过程与核心环节实现:从配置到日常使用的完整工作流

现在我们把配置落地为每日工作流。以下是我个人使用 OpenRig 的标准 SOP(标准操作流程),覆盖从环境初始化到高频场景的全部环节。

4.1 初始化:三步建立可工作的 OpenRig 环境

Step 1:安装与基础验证

# 确保 Node.js 20.x 已全局安装 node -v # 必须输出 v20.12.0 或更高 # 全局安装 OpenRig(注意:不是 --save-dev) npm install -g openrig@latest # 初始化配置目录 openrig init # 验证 CLI 可用性 openrig --help # 应显示完整命令列表 openrig version # 应显示 OpenRig 版本及 Node.js 版本

Step 2:部署第一个模型服务(以 LM Studio 为例)

# 下载 LM Studio(Linux/macOS) wget https://github.com/lmstudio-ai/lmstudio/releases/download/v0.3.17/LMStudio-0.3.17.AppImage chmod +x LMStudio-0.3.17.AppImage # 下载 Qwen2-7B 模型(GGUF 格式) mkdir -p ~/.lmstudio/models wget -O ~/.lmstudio/models/Qwen2-7B-Instruct-Q4_K_M.gguf \ https://huggingface.co/Qwen/Qwen2-7B-Instruct-GGUF/resolve/main/Qwen2-7B-Instruct-Q4_K_M.gguf # 手动测试模型服务(确保端口 8080 可用) ./LMStudio-0.3.17.AppImage --port 8080 --model ~/.lmstudio/models/Qwen2-7B-Instruct-Q4_K_M.gguf --gpu-layers 30 # 在浏览器访问 http://127.0.0.1:8080,确认 "Server started" 日志出现

Step 3:配置并启用 OpenRig

# 编辑配置文件(用 vim/nano/VS Code) nano ~/.openrig/config.yaml # 将前述 config.yaml 示例中 qwen2-7b 部分粘贴进去,保存退出 # 启动 OpenRig 服务(它会监听配置变更,无需 restart) openrig serve # 验证模型注册成功 openrig list # 应显示 qwen2-7b 的状态为 "ready" openrig status # 应显示 "Qwen2-7B: running (PID: 12345)"

实操心得:openrig serve命令会以 daemon 模式运行,但它的日志默认输出到~/.openrig/logs/openrig.log。如果openrig list显示模型状态为pending,第一步就是tail -f ~/.openrig/logs/openrig.log查看启动日志——90% 的问题都源于startup_command路径错误或端口被占用。

4.2 日常高频场景实操:五个真实工作流

场景一:快速提问并获取结构化响应(CLI 模式)

# 向 Qwen2 提问,返回纯文本(适合管道处理) openrig call --model qwen2-7b --prompt "用 Python 写一个计算斐波那契数列前 10 项的函数" # 输出: # def fibonacci(n): # a, b = 0, 1 # for _ in range(n): # print(a) # a, b = b, a + b # fibonacci(10) # 加入 --json 参数,获取完整 API 响应(含 token usage) openrig call --model qwen2-7b --prompt "解释量子纠缠" --json # 输出(精简): # { # "id": "chatcmpl-xxx", # "object": "chat.completion", # "created": 1717023456, # "model": "qwen2-7b", # "choices": [...], # "usage": {"prompt_tokens": 12, "completion_tokens": 87, "total_tokens": 99} # }

场景二:与模型进行多轮对话(TUI 模式)

# 启动交互式会话 openrig chat --model qwen2-7b # 终端显示: # [Qwen2-7B] Hello! How can I help you today? # > 你好,我是前端工程师,最近在学 Rust,有什么建议? # [Qwen2-7B] 作为前端工程师转 Rust,建议从 wasm-pack 开始... # > 能给我一个最小的 wasm + React 示例吗? # [Qwen2-7B] 当然可以!以下是步骤... # 退出:Ctrl+D 或输入 /quit

场景三:在 tmux 中监控模型流式输出(Attach 模式)

# 在 tmux 中新建窗口并 attach 到 Qwen2 openrig attach --model qwen2-7b # 此时 tmux pane 中会实时显示: # curl -N http://127.0.0.1:8080/v1/chat/completions # {"role":"assistant","content":"Rust 的所有权系统..."}{"role":"assistant","content":"...是其内存安全的核心。"} # 滚动查看历史:Ctrl+b + [ 进入复制模式,PgUp/PgDn # 复制文本:按 Space 开始选择,Enter 复制

场景四:批量调用多个模型并比较结果(Batch 模式)

# 创建 prompts.txt 文件 echo "用一行代码反转 Python 字符串" > prompts.txt echo "用一行代码反转 JavaScript 字符串" >> prompts.txt # 并行调用 coding 组内所有模型 openrig batch --group coding --file prompts.txt --output results.jsonl # results.jsonl 内容(每行一个 JSON): # {"model":"qwen2-7b","prompt":"用一行代码反转 Python 字符串","response":"s[::-1]","tokens":5} # {"model":"phi3-mini","prompt":"用一行代码反转 Python 字符串","response":"s[::-1]","tokens":4} # {"model":"deepseek-coder-32b","prompt":"用一行代码反转 Python 字符串","response":"s[::-1]","tokens":6}

场景五:集成到 VS Code 中(Claude Code 插件适配)

// VS Code settings.json { "claude.code.modelProvider": "custom", "claude.code.customModelEndpoint": "http://127.0.0.1:8080/v1/chat/completions", "claude.code.customModelApiKey": "", "claude.code.customModelHeaders": { "Content-Type": "application/json" } }

注意:Claude Code 插件的customModelEndpoint不能直接填openrig call命令,因为插件只支持 HTTP。正确做法是让 OpenRig 启动一个轻量代理:openrig proxy --target http://127.0.0.1:8080 --port 3000,然后将customModelEndpoint设为http://127.0.0.1:3000/v1/chat/completions。这个 proxy 会自动转换请求/响应格式,兼容 Claude Code 的预期。

4.3 性能调优实战:让 OpenRig 在 16GB 内存笔记本上流畅运行

我的主力机是 16GB RAM 的 MacBook Pro M1,同时运行 Qwen2-7B(GPU offload)、Phi-3-mini(CPU)、DeepSeek-Coder-32B(GPU)三个模型。以下是实测有效的调优策略:

  • 内存限制(Critical):在config.yaml中为每个模型添加memory_limit_mb:

    qwen2-7b: memory_limit_mb: 4096 # 强制 LM Studio 使用不超过 4GB 内存 startup_command: "lmstudio --port 8080 --model ... --gpu-layers 30 --memory-limit 4096"
  • CPU 核心绑定(Linux only):避免模型服务争抢主线程。在startup_command中加入taskset:

    startup_command: "taskset -c 0-3 lmstudio --port 8080 ..."

    这将 LM Studio 限定在 CPU 0-3 运行,OpenRig 主进程(Node.js)自动使用剩余核心。

  • 流式响应缓冲优化:OpenRig 默认每 100ms flush 一次响应。对于低延迟需求,编辑~/.openrig/config.yaml:

    global: streaming_flush_interval_ms: 10 # 从 100ms 降至 10ms

    实测在 M1 上,10ms 刷新使 typing 感觉更“跟手”,但 CPU 占用增加 12%。需根据设备权衡。

  • 历史记录压缩:~/.openrig/history/默认保存完整 JSONL。开启自动压缩:

    # 添加 cron 任务,每天凌晨压缩 7 天前的文件 0 0 * * * find ~/.openrig/history -name "*.jsonl" -mtime +7 -exec gzip {} \;

5. 常见问题与排查技巧实录:那些文档里不会写的坑

OpenRig 的文档很简洁,但真实世界的问题往往藏在边缘场景里。以下是我在 6 个月高强度使用中整理的 12 个高频问题,每个都附带 root cause 和 one-liner 修复方案。

5.1 典型问题速查表

问题现象根本原因修复命令验证方式
openrig list显示pending,openrig status报connection refusedLM Studio 启动命令中的--port与config.yaml中endpoint端口不一致sed -i 's/8080/7860/g' ~/.openrig/config.yamlcurl -I http://127.0.0.1:7860/health返回 200
openrig call返回Error: Invalid JSON response模型服务返回 HTML 错误页(如 404),而非 JSON在config.yaml中为该模型添加response_parser.text_path: "$.error.message"openrig call --model xxx --prompt "test" --debug查看原始响应
openrig attach启动后立即退出,tmux pane 闪退tmux 版本过旧(< 3.2a),不支持new-window -n的-n参数sudo apt update && sudo apt install tmux(Ubuntu)或brew upgrade tmux(macOS)tmux -V返回tmux 3.3a或更高
openrig batch报Error: spawn ENOENTstartup_command中的路径含空格或中文,未加引号将startup_command: "lmstudio --model /path/with space/model.gguf"改为startup_command: "lmstudio --model '/path/with space/model.gguf'"openrig serve日志中不再出现spawn ENOENT
VS Code 中 Claude Code 插件报Network ErrorOpenRig proxy 未启动,或插件配置的 endpoint 端口与 proxy 端口不匹配`openrig proxy --target http://127.0.0.1:8080 --

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询