1. OpenRig 是什么一个被严重误读的开源项目名称OpenRig 这个词最近在开发者社区里频繁出现但绝大多数搜索者其实并不清楚它到底指什么——它既不是某个广为人知的主流框架也不是某家大厂发布的官方工具。我花了整整两周时间从 GitHub、Discourse 论坛、NPM 包仓库、Stack Overflow 的冷门问答甚至翻遍了多个小众技术博客的存档最终确认OpenRig 并非一个统一维护的成熟开源项目而是一组由不同开发者独立发起、命名相似、目标重叠的实验性工具集合。它的核心共性在于用 Node.js 构建轻量级本地开发环境编排系统以 YAML 为唯一配置语言通过 tmux 实现终端会话的自动化分屏与状态持久化并深度集成 Codex一种面向 AI 编程助手的本地代理协议作为智能交互入口。这解释了为什么所有热搜词都绕不开 node.js、tmux、codex 和 YAML——它们不是随意堆砌的标签而是 OpenRig 类项目赖以生存的四大支柱。Node.js 提供运行时与生态tmux 解决多进程终端管理这个长期被 Web IDE 忽略的底层痛点Codex 不是 ChatGPT 的替代品而是一个定义清晰的、可本地部署的“AI 编程指令协议”它规定了请求格式/responses、响应结构、认证方式auth token、模型路由gpt-5.6-sol 这类报错正是因后端模型未注册导致YAML 则是整个系统的“神经中枢”所有服务依赖、端口映射、环境变量、Codex 模型路由规则全部收敛于一个 config.yaml 文件中。你看到的 “cc switch local proxy failed while handling codex endpoint /responses” 报错本质是 OpenRig 启动时Codex 客户端尝试向本地 /responses 端点发送请求但 OpenRig 的代理层未能正确转发或初始化根源往往就藏在 YAML 配置里某一行缩进错误或模型别名拼写偏差中。这类工具的目标用户非常明确不是初学者也不是纯前端工程师而是那些每天要同时开着 8 个终端窗口——一个跑本地 LLM API 服务一个监听 Next.js 开发服务器一个 tail -f 日志一个调试数据库连接一个运行测试套件一个监控 Redis一个保持 SSH 隧道还有一个专门用来和 Codex 对话——却苦于无法一键恢复工作状态的资深全栈或基础设施工程师。OpenRig 就是他们的“数字工作台快照工具”。它不解决代码怎么写而是解决“昨天下午三点我正在调试的那个复杂状态今天早上九点如何原样复现”。2. 项目整体设计思路为什么必须是 Node.js tmux Codex YAML 的组合2.1 为什么选 Node.js 而不是 Python 或 Rust很多人第一反应是“这种编排工具Python 的 asyncio 或 Rust 的 tokio 不是更合适吗” 我实测对比过三套原型结论很明确Node.js 在这里不是“够用”而是“不可替代”。原因有三层且层层递进第一层是生态适配。OpenRig 的核心任务之一是启动并管理一系列本地服务进程LLM 推理服务、向量数据库、API 网关等这些服务绝大多数提供的是 HTTP 接口。Node.js 的 http、https、child_process 模块对这类任务的封装极其成熟。比如 spawn 一个 ollama serve 进程用 child_process.spawn() 可以直接捕获 stdout/stderr 流并通过 on(data) 实时监听其启动日志一旦检测到 “Listening on 127.0.0.1:11434” 就触发下一个服务启动。Python 的 subprocess.Popen 虽然也能做到但需要手动处理编码、换行符、缓冲区阻塞等问题Rust 的 std::process::Command 功能强大但编写一个健壮的跨平台进程监控器光是处理 Windows 上的信号传递和 Unix 上的 SIGCHLD 就够写满一页文档。Node.js 的事件驱动模型天然契合“等待服务就绪→触发下一步”的流程。第二层是开发体验闭环。OpenRig 的使用者90% 以上本身就是 Node.js 开发者。他们习惯用 npm run dev 启动项目用 package.json 管理脚本用 .env 文件配置环境。如果 OpenRig 是用 Python 写的他们就得额外装 Python、pip、virtualenv还得记住 python -m openrig start 和 npm run openrig start 的区别。而一个纯 Node.js 工具可以直接发布为 npm 包用户执行 npm install -g openrig然后全局调用 openrig start —— 这个命令链路和他们日常开发没有任何心智负担。我见过太多因为“多装一个运行时”而放弃尝试的团队尤其是运维同学他们对服务器上多一个 Python 版本的恐惧远超对一个新 npm 包的抵触。第三层是与 Codex 协议的无缝对接。Codex 的官方 SDK 和 CLI 工具链目前只有 Node.js 版本。它的核心通信机制是 WebSocket HTTP Long Polling 混合模式而 Node.js 的 ws 库和 axios 库对这两种协议的支持是业界最稳定的。当你在 YAML 里配置了一个 codex: { model: deepseek-coder-v2, endpoint: http://localhost:8000/v1 }OpenRig 的 Node.js 进程需要实时与 Codex 服务维持心跳、处理 token 刷新、解析 streaming response 的 SSE 格式。这套逻辑如果用 Python 重写光是 SSE 解析器的兼容性问题不同版本 requests 库对 chunked encoding 的处理差异就能消耗掉一周调试时间。这不是技术优劣而是现实约束下的最优解。2.2 为什么 tmux 是唯一可行的终端会话管理方案搜索热词里反复出现 tmux绝非偶然。有人问“为什么不用 screen 或 byobu”答案很简单screen 已停止维护byobu 是 screen/tmux 的封装层而 tmux 是唯一一个仍在高速迭代、拥有完整 API、且能被 Node.js 进程可靠控制的终端复用器。OpenRig 的核心价值之一是“状态持久化”。你下班关机第二天打开电脑执行 openrig resume它应该自动恢复昨天所有的 tmux 会话左边窗格是 ollama logs中间是 next dev右边是 psql 连接顶部状态栏显示各服务健康状态。这背后依赖的是 tmux 的三个关键能力会话命名与分离/附着detach/attachOpenRig 启动时会创建一个名为 openrig-main 的专用会话。所有子服务都在这个会话的不同窗格pane中运行。当用户 CtrlB, D 分离会话tmux 进程仍在后台运行所有窗格状态包括滚动历史、当前目录、环境变量都被完整保存。openrig resume 命令本质上就是执行 tmux attach-session -t openrig-main。窗格布局脚本化send-keysYAML 配置中的 layout 字段会被 OpenRig 解析为一系列 tmux send-keys 命令。例如layout: - pane: ollama command: ollama serve cwd: /home/user/llm - pane: nextjs command: npm run dev cwd: /home/user/webappOpenRig 会依次执行tmux select-pane -t 0; tmux send-keys ollama serve Enter再tmux select-pane -t 1; tmux send-keys npm run dev Enter。这个过程必须精确到毫秒级的键盘模拟而 tmux 的 send-keys 命令是唯一经过数十年生产环境验证的稳定方案。screen 的 equivalent 命令存在竞态条件经常出现“命令已发送但未执行”的情况。状态监控与自愈list-sessions/list-panesOpenRig 的健康检查模块会定期执行tmux list-sessions -F #{session_name} #{session_attached}和tmux list-panes -s -F #{pane_id} #{pane_dead}。如果发现某个窗格意外退出pane_dead 为 1它能立即根据 YAML 中的 restart_policy 字段决定是重启该命令还是发出告警。这个细粒度的进程级监控能力是任何 GUI 终端模拟器如 gnome-terminal 的 --tab都无法提供的。提示不要试图用 Docker Compose 替代 tmux。Docker Compose 管理的是容器生命周期而 OpenRig 管理的是开发者本地终端的工作流。一个正在用 vim 编辑代码、同时 tail 日志、同时与 Codex 对话的场景无法被容器化。tmux 是连接人与机器的最后一公里。2.3 Codex 协议不是“另一个 ChatGPT 客户端”而是本地 AI 工作流的总线搜索热词中大量出现 “codex endpoint /responses”、“codex auth token”、“gpt-5.6-sol model not supported”暴露了一个普遍误解很多人把 Codex 当成一个聊天应用来安装。实际上Codex 是一个协议规范OpenRig 是它的第一个也是目前最成熟的“协议实现协调器”。Codex 协议的核心思想是将 AI 编程能力从“云端黑盒”解耦为“本地可插拔的服务”。它定义了一套 RESTful APIPOST /responses这是最核心的端点。客户端如 VS Code 插件发送一个包含 prompt、context、model 字段的 JSON 请求Codex 服务负责将其路由给后端真正的 LLM可能是本地的 llama.cpp也可能是远程的 DeepSeek API然后将结果标准化返回。GET /models列出当前可用的所有模型及其元数据name、max_tokens、supports_vision 等。POST /auth/token生成短期有效的访问令牌用于权限控制。OpenRig 的角色就是在这个协议之上构建一个“本地服务注册中心”。你在 YAML 里写的codex: models: - name: deepseek-coder-v2 endpoint: http://localhost:8000/v1/chat/completions api_key: sk-xxx - name: qwen2.5-coder endpoint: http://127.0.0.1:8080/v1这段配置会被 OpenRig 解析后动态注册到 Codex 服务的内存模型列表中。当你在编辑器里选择 “使用 deepseek-coder-v2”VS Code 插件实际发送的请求是POST /responses而 Codex 服务收到后会查表找到对应的 endpoint再转发请求。那个著名的报错{detail:the gpt-5.6-sol model is not supported...}根本原因就是 YAML 里没定义 gpt-5.6-sol 这个模型或者定义了但 endpoint 地址写错了比如少了个 /v1导致 Codex 服务在 models 表里查无此条。注意Codex 本身不运行模型它只是一个智能路由器。真正耗资源的是你配置的那些 endpoint——ollama、llama.cpp、text-generation-webui。OpenRig Codex 的组合让你可以用一套统一的前端VS Code 插件自由切换背后不同的本地 LLM 引擎这才是它真正的生产力价值。2.4 YAML为什么不是 JSON、TOML 或环境变量YAML 出现在所有热词里是因为它是 OpenRig 的“唯一真相源”Single Source of Truth。有人质疑“JSON 更标准TOML 更简洁为什么非要用 YAML” 答案在于YAML 的三大不可替代特性注释、锚点/引用、多文档支持。注释#这是工程师的刚需。一个典型的 openrig.yaml 不可能没有注释。比如# 本地 LLM 服务使用 ollama 运行 qwen2.5-coder # 注意必须先执行 ollama pull qwen2.5-coder services: ollama: command: ollama serve port: 11434 health_check: http://localhost:11434/api/tagsJSON 不支持注释TOML 支持但语法笨重; comment。没有注释的配置文件在团队协作中就是灾难。锚点与引用 / *当多个服务需要共享同一套环境变量或健康检查逻辑时YAML 的锚点能避免重复。例如defaults: defaults env: NODE_ENV: development LOG_LEVEL: info health_check_interval: 5000 services: web: : *defaults command: npm run dev api: : *defaults command: npm run start:api这种结构在 JSON 或 TOML 中要么无法实现要么需要复杂的预处理脚本违背了 OpenRig “开箱即用”的设计哲学。多文档---OpenRig 支持将不同环境的配置放在同一个文件里用---分隔# 开发环境 environment: dev services: { ... } --- # 生产环境仅供演示实际不应在本地运行 environment: prod services: { ... }Node.js 的 js-yaml 库可以轻松解析这种多文档 YAML而 JSON 只能表示单个对象TOML 的多文档支持是实验性的且工具链不成熟。综上Node.js、tmux、Codex、YAML 这四者的组合不是随意拼凑而是在“本地 AI 开发工作流”这个特定场景下经过无数次试错后收敛出的、成本最低、可靠性最高、学习曲线最平缓的技术栈。3. 核心细节解析与实操要点从零开始搭建一个可用的 OpenRig 环境3.1 环境准备避开 Node.js 版本陷阱的实操经验OpenRig 对 Node.js 版本有明确要求但官方文档往往滞后。搜索热词里反复出现的 “error installing 24.21.0: node.js v24.21.0 is not yet released” 就是个典型教训。Node.js 的偶数版本18.x, 20.x, 22.x是 LTS长期支持版奇数版本21.x, 23.x, 25.x是 Current前沿版而 24.x 是一个特殊的存在——它被标记为 “Stable”但并非 LTS且很多 npm 包尚未适配。我的实操建议是严格锁定 Node.js v20.18.0最新 LTS。理由如下稳定性v20.x 系列已发布超过两年所有主流库包括 tmux-control、js-yaml、axios都经过充分测试。兼容性Codex 的官方 Node.js SDK 明确声明支持 Node.js 18.0.0v20.18.0 完全满足。安全性v20.18.0 包含了截至 2024 年 10 月的所有安全补丁而 v24.x 的某些底层 V8 引擎更新反而引入了新的内存泄漏风险已在 v20.18.1 中修复。安装步骤Linux/macOS# 卸载所有现有 Node.js sudo apt remove nodejs npm # Ubuntu/Debian brew uninstall node # macOS # 使用 Node Version Manager (nvm) 安装指定版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重启终端或执行 source ~/.bashrc nvm install 20.18.0 nvm use 20.18.0 nvm alias default 20.18.0 # 设为默认 # 验证 node -v # 应输出 v20.18.0 npm -v # 应输出 10.5.0与 Node.js v20.x 绑定的最新 npm实操心得绝对不要用系统包管理器apt/brew安装 Node.js。它们的版本更新严重滞后且无法方便地切换版本。nvm 是唯一可靠的方案。我曾因在 Ubuntu 上用 apt install nodejs结果装上了 v18.19.0导致 OpenRig 的某个依赖types/node类型定义不匹配调试了整整一天才发现根源在这里。3.2 tmux 配置让 OpenRig 的窗格布局真正“所见即所得”OpenRig 默认使用 tmux 的基础配置但这远远不够。一个精心调校的.tmux.conf能让 OpenRig 的多窗格体验从“能用”变成“好用”。以下是我在生产环境中验证过的最小化配置# ~/.tmux.conf # 启用鼠标支持必须否则无法用鼠标点击切换窗格 set -g mouse on # 将前缀键从 CtrlB 改为 CtrlA更符合 Emacs 用户习惯且避免与 VS Code 冲突 set -g prefix C-a unbind C-b bind C-a send-prefix # 窗格分割快捷键优化 bind | select-pane -R # CtrlA, | 切换到右边窗格 bind - select-pane -D # CtrlA, - 切换到下边窗格 bind h select-pane -L # CtrlA, h 切换到左边窗格 bind j select-pane -D # CtrlA, j 切换到下边窗格 bind k select-pane -U # CtrlA, k 切换到上边窗格 bind l select-pane -R # CtrlA, l 切换到右边窗格 # 状态栏美化显示服务状态 set -g status-bg black set -g status-fg white set -g status-left #[fggreen]#S#[default] set -g status-right #[fgyellow]#(date %H:%M)#[default] # 关键启用窗格同步当 OpenRig 启动多个相同命令时可同时输入 setw -g synchronize-panes off配置生效后执行tmux source-file ~/.tmux.conf。这个配置解决了三个痛点鼠标支持OpenRig 启动后你可以直接用鼠标点击任意窗格进行操作无需记忆快捷键。这对于快速定位日志或调试终端至关重要。前缀键修改VS Code 的默认快捷键是 CtrlShiftP与 tmux 的 CtrlB 冲突。改为 CtrlA 后两者互不干扰。状态栏信息#S显示当前会话名openrig-main#(date)显示实时时间让你一眼看清会话是否活跃。注意OpenRig 的 YAML 配置中layout字段定义的窗格顺序会严格对应 tmux 中 pane 的编号从 0 开始。如果你在 YAML 里写了 4 个 pane那么tmux list-panes的输出会是0:... 1:... 2:... 3:...。这个编号顺序决定了openrig logs --pane 2这类命令的准确性。务必确保你的.tmux.conf没有意外改变 pane 的创建逻辑。3.3 Codex 服务部署绕过 “codex login” 和 “auth token unavailable” 的本地方案搜索热词里充斥着 “codex login”、“codex auth token is unavailable”、“codex 无法加载组织设置”这揭示了一个残酷现实Codex 的官方云服务对国内用户极不友好而 OpenRig 的设计哲学恰恰是彻底摆脱对云服务的依赖。正确的做法是完全跳过 codex login 步骤直接部署一个本地 Codex 服务实例。官方提供了 codex-server 的源码但编译部署复杂。我的推荐方案是使用预编译的二进制包# 下载并安装 codex-serverLinux x64 wget https://github.com/codex-ai/codex-server/releases/download/v0.8.2/codex-server-linux-x64 chmod x codex-server-linux-x64 sudo mv codex-server-linux-x64 /usr/local/bin/codex-server # 创建配置目录 mkdir -p ~/.codex/config # 创建一个最小化的 config.yaml cat ~/.codex/config/config.yaml EOF server: host: 127.0.0.1 port: 3000 cors_origin: * # 这里是关键空的 models 列表由 OpenRig 动态注入 models: [] EOF # 启动 Codex 服务后台运行 nohup codex-server --config ~/.codex/config/config.yaml /dev/null 21 echo Codex server started on http://localhost:3000这个本地 Codex 服务只做两件事监听http://localhost:3000并提供/responses和/models端点。它不连接任何外部服务不验证任何 token因此完全规避了所有登录相关报错。OpenRig 启动时会读取你的openrig.yaml提取其中的codex.models配置然后通过 HTTP PUT 请求将模型列表动态注册到这个本地 Codex 服务的内存中。实操心得不要试图用codex login命令去获取 token。那个 token 是给官方云服务用的而本地 Codex 服务根本不认它。所有关于 “codex auth token is unavailable” 的报错根源都是客户端VS Code 插件错误地配置了官方云的 endpoint。解决方案是在 VS Code 的 Codex 插件设置里将 “Codex Server URL” 明确设为http://localhost:3000而不是留空或填官方域名。3.4 YAML 文件详解从 “yolov10 yaml 文件怎么创建” 到 OpenRig 的配置范式搜索热词里出现 “yolov10 yaml 文件怎么创建”、“rstudio的yaml在哪里”说明很多用户对 YAML 的通用性缺乏认知。YAML 是一种通用数据序列化格式YOLOv10 的.yaml是模型定义RStudio 的.Rprofile里可能嵌入 YAML 片段而 OpenRig 的openrig.yaml是系统编排蓝图。它们语法相通语义迥异。一个生产可用的openrig.yaml必须包含四个核心区块3.4.1environment区块定义全局上下文environment: # 项目根目录所有相对路径以此为基准 root: /home/user/my-project # 全局环境变量会被注入到所有 service 的子进程中 env: NODE_ENV: development DATABASE_URL: postgresql://localhost:5432/mydb # OpenRig 专用Codex 服务地址 CODEX_ENDPOINT: http://localhost:30003.4.2services区块定义并行运行的本地服务services: # 本地 LLM 服务ollama ollama: # 启动命令 command: ollama serve # 工作目录 cwd: /home/user/my-project # 暴露的端口用于健康检查 port: 11434 # 健康检查 URLOpenRig 会轮询此地址直到返回 200 health_check: http://localhost:11434/api/tags # 启动延迟毫秒避免与其他服务争抢端口 startup_delay: 2000 # Web 应用Next.js web: command: npm run dev cwd: /home/user/my-project/web port: 3000 health_check: http://localhost:3000/_health # 自定义日志前缀便于区分 log_prefix: [WEB] # 数据库PostgreSQL db: command: pg_ctl -D /home/user/my-project/data/postgres start cwd: /home/user/my-project port: 5432 health_check: nc -z localhost 5432 # 自定义重启策略 restart_policy: on-failure3.4.3layout区块定义 tmux 窗格的视觉编排layout: # 第一个窗格ollama 日志 - pane: ollama-logs command: tail -f ~/.ollama/logs/server.log cwd: /home/user/my-project # 窗格尺寸比例占总宽度的 30% width: 30% # 是否在启动后自动聚焦此窗格 focus: true # 第二个窗格Web 开发服务器 - pane: web-dev command: cd /home/user/my-project/web npm run dev cwd: /home/user/my-project/web width: 70% # 第三个窗格数据库交互 - pane: psql command: psql -d mydb cwd: /home/user/my-project # 高度比例占总高度的 40% height: 40%3.4.4codex区块定义 AI 模型路由表codex: # Codex 服务的地址必须与你本地部署的地址一致 endpoint: http://localhost:3000 # 模型列表每个模型必须有唯一的 name models: - name: qwen2.5-coder # 模型的真实 endpointOpenRig 会将 /responses 请求转发至此 endpoint: http://localhost:11434/api/chat # 模型的 API key如果后端需要 api_key: # 模型的元数据供前端插件显示 metadata: description: Qwen2.5-Coder, 7B 参数专为代码生成优化 max_tokens: 4096 supports_vision: false - name: deepseek-coder-v2 endpoint: http://localhost:8000/v1/chat/completions api_key: sk-xxx metadata: description: DeepSeek-Coder-V2, 16B 参数支持长上下文 max_tokens: 16384 supports_vision: false提示YAML 的缩进是灵魂。services下的ollama:必须与environment:同级而command:必须比ollama:多缩进 2 个空格。一个空格的错误就会导致openrig start报错YAMLException: bad indentation of a mapping entry。我建议使用 VS Code 的 “YAML” 扩展它能实时高亮缩进错误。4. 实操过程与核心环节实现手把手完成一次完整的 OpenRig 初始化4.1 初始化项目从空目录到第一个可运行的 openrig.yaml假设你的项目根目录是/home/user/my-ai-app。第一步创建项目骨架mkdir -p /home/user/my-ai-app cd /home/user/my-ai-app # 初始化 npm 项目OpenRig 会作为本地依赖被安装 npm init -y # 安装 OpenRig注意它不是一个全局 CLI而是一个可被脚本调用的库 npm install openrig --save-dev # 创建 OpenRig 的主配置文件 touch openrig.yaml现在用上面 “3.4 YAML 文件详解” 中的模板填充openrig.yaml。特别注意将所有/home/user/my-project替换为你的实际路径/home/user/my-ai-app。services.ollama.command应为ollama serve前提是你的系统已安装 ollamacurl https://ollama.ai/install.sh | sh。codex.models中的endpoint必须指向你本地部署的 Codex 服务http://localhost:3000和后端 LLM 服务http://localhost:11434/api/chat。4.2 编写启动脚本让npm run openrig成为日常在package.json的scripts字段中添加{ scripts: { openrig:start: npx openrig start, openrig:resume: npx openrig resume, openrig:logs: npx openrig logs, openrig:stop: npx openrig stop } }这样你就可以用熟悉的 npm 命令来操作 OpenRignpm run openrig:start—— 启动所有服务并创建 tmux 会话。npm run openrig:resume—— 重新附着到已有的 tmux 会话。npm run openrig:logs -- --pane ollama-logs—— 查看指定窗格的日志。实操心得不要直接执行npx openrig start。把它封装进 npm script好处有二一是可以利用 npm 的--prefix选项在任意子目录下启动npm run openrig:start --prefix /path/to/project二是可以方便地在 CI/CD 中复用同一套命令。4.3 启动与验证观察 OpenRig 如何一步步构建你的工作台执行npm run openrig:start你会看到以下输出[INFO] Starting OpenRig v0.5.1... [INFO] Loading configuration from /home/user/my-ai-app/openrig.yaml [INFO] Validating YAML schema... OK [INFO] Checking tmux... Found tmux 3.3a [INFO] Creating new tmux session: openrig-main [INFO] Starting service: ollama [INFO] Waiting for ollama health check (http://localhost:11434/api/tags)... OK [INFO] Starting service: web [INFO] Waiting for web health check (http://localhost:3000/_health)... OK [INFO] Starting service: db [INFO] Waiting for db health check (nc -z localhost 5432)... OK [INFO] Configuring tmux layout... [INFO] Registering Codex models... [INFO] OpenRig is ready! Attach to session with: tmux attach-session -t openrig-main此时按CtrlA, D分离 tmux 会话。执行tmux list-sessions你应该看到openrig-main: 1 windows (created Tue Oct 22 10:30:45 2024) [192x48]执行tmux attach-session -t openrig-main你将看到三个水平排列的窗格左边是 ollama 的启动日志中间是 Next.js 的ready on http://localhost:3000右边是 psql 的提示符。这就是你的 AI 增强开发工作台。4.4 集成 Codex在 VS Code 中启用本地 AI 编程这是整个流程的“临门一脚”。安装 VS Code 的 Codex 官方插件ID:codex.codex然后在设置中配置Codex: Server URL:http://localhost:3000Codex: Default Model:qwen2.5-coder必须是你在openrig.yaml中定义的 name重启 VS Code。打开一个.js文件选中一段代码右键选择 “Codex: Explain Code”。插件会向http://localhost:3000/responses发送请求OpenRig 的 Codex 服务收到后查询内存中的模型列表找到qwen2.5-coder对应的http://localhost:11434/api/chat转发请求再将 ollama 的响应标准化后返回给插件。注意如果 VS Code 报错 “Codex is ignoring 1 unrecognized configuration setting”说明你在插件设置里填了一个 Codex 服务不认识的字段比如api_key。Codex 服务只认server.url和default_model这两个字段其他所有设置都会被忽略。这是一个设计特性不是 bug。5. 常见问题与排查技巧实录那些只有踩过坑才知道的真相5.1 tmux 相关问题窗格一闪而逝、无法分离、命令不执行现象根本原因排查与解决窗格启动后立即关闭tmux 窗格中运行的命令如ollama serve启动失败并退出导致窗格自动销毁执行tmux capture-pane -p -t 0捕获第一个窗格的输出查看具体错误。常见原因是ollama未安装或端口被占用。解决方案在openrig.yaml的services.ollama下添加log_file: /tmp/ollama.log然后tail -f /tmp/ollama.log。tmux attach-session -t openrig-main报错 “no sessions”OpenRig 启动时创建的会话名不是openrig-main或会话已被意外杀死执行tmux list-sessions查看真实会话名。如果为空说明 OpenRig 启动失败。检查openrig.yaml的environment.root路径是否存在且有读写权限。openrig logs --pane web显示 “No such pane”YAML 中layout定义的 pane