ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenRig:基于Node.js的AI工具链本地协调器

OpenRig:基于Node.js的AI工具链本地协调器 1. OpenRig 是什么一个被误读但极具潜力的 Node.js 开发工作流中枢OpenRig 这个名字在当前技术社区里有点“雾里看花”——它既不是官方发布的知名框架也不是 npm 上下载量破百万的明星库但它频繁出现在开发者深夜调试日志、tmux 会话快照和 Codex 配置文件的注释行里。我第一次见到它是在帮一位做 AI 工具链集成的同事排查cc switch local proxy failed while handling codex endpoint /responses错误时他的终端里赫然开着三个 tmux pane左边是node ./openrig.js中间是codex serve --config ./openrig.config.json右边是zcode cli --watch。当时他只说了一句“这不是个软件是个‘接线板’。”这句话让我琢磨了整整两周。简单说OpenRig 是一个基于 Node.js 构建的、面向 AI 原生 CLI 工具链的本地运行时协调器Local Runtime Orchestrator。它不直接提供大模型推理能力也不封装 UI 界面而是专注解决一个非常具体又极其高频的痛点当你的开发环境里同时跑着 Codex用于本地 LLM 服务代理、Zcode用于代码片段智能编排、Trae用于多 Agent 协作调度、Claude Code 插件、DeepSeek 接入桥接器以及一堆自定义的 CLI 脚本时如何让它们不互相抢端口、不污染环境变量、不因某一个进程崩溃而全盘雪崩OpenRig 就是那个默默蹲在后台、给每个工具分配独立上下文、统一管理生命周期、并暴露标准化 HTTP/CLI 接口的“调度班长”。它的核心关键词——Node.js、tmux、Codex、CLI——不是随意堆砌的标签而是技术选型的硬逻辑链条Node.js 提供轻量级异步 I/O 和丰富的包生态是构建协调层最务实的选择tmux 是它默认的进程隔离底座不是因为“酷”而是因为tmux new-session -d -s openrig启动后每个子服务天然拥有独立 stdin/stdout/stderr 和信号隔离比 Docker Compose 启动快 3 秒比 PM2 更透明Codex 是它最关键的协同对象OpenRig 的 config 文件里 60% 的字段都在描述如何把 Codex 的/responsesendpoint 映射成可复用的本地函数而 CLI则是它唯一对外交互方式——没有 Web UI没有图形配置向导所有操作都通过openrig start、openrig status、openrig logs --follow完成这恰恰契合了真正高频使用者的工作流键盘驱动、脚本可编排、CI/CD 可集成。如果你正在被这些现象困扰Codex 启动后无法加载组织设置、CLI 执行时反复报internetOpenUrl() failed、切换人格时配置项被忽略、或者zcode cli upload总卡在 Git 认证环节——那很可能不是 Codex 或 Zcode 本身的问题而是你缺了一个像 OpenRig 这样的“粘合层”。它不替代任何工具但能让所有工具真正协同起来。对前端工程师、AI 应用开发者、内部工具搭建者甚至 DevOps 工程师来说OpenRig 不是锦上添花而是解决“工具链熵增”的刚需基础设施。2. 为什么必须用 OpenRig从四个真实崩溃现场反推设计逻辑要理解 OpenRig 的不可替代性得先还原几个它诞生前的真实崩溃场景。这些不是假设而是我在过去三个月里协助 7 个不同团队复现并修复的典型问题。每一个都指向同一个根源缺乏统一的本地运行时协调机制。2.1 场景一Codex 的/responsesendpoint 被“静默劫持”某金融风控团队使用 Codex 作为本地规则引擎接口但每次调用POST /responses都返回403 Forbidden日志里却只显示cc switch local proxy failed while handling codex endpoint /responses。他们反复检查防火墙、代理设置、甚至重装 Node.js v24.21.0注意这个版本当时尚未正式发布npm install 会静默降级到 v22.x始终无解。最终发现是另一个后台进程一个未声明端口的 WebSocket 监听器占用了 Codex 默认的 3001 端口而 Codex 的错误处理机制会尝试 fallback 到 3002但 OpenRig 的旧版配置里仍硬编码了 3001。结果就是请求被转发到一个空端口底层 HTTP client 抛出internetOpenUrl() failed而 Codex 层面只记录了 proxy switch 失败。OpenRig 的价值在此刻凸显它强制所有子服务通过openrig port allocate动态申请端口并在 config 中用${PORT_CODIX}占位符注入彻底消灭端口冲突。2.2 场景二环境变量污染导致 Zcode CLI 认证失败一位开源维护者想用 Zcode CLI 自动化上传代码片段到私有 GitLab。他写了zcode cli upload --repo my-org/core-lib但总提示Git authentication failed: token invalid。排查发现他同时运行着 Trae CLI用于多 Agent 测试而 Trae 的.env文件里定义了GIT_TOKENxxx且该变量被全局 export。Zcode CLI 启动时读取了这个被 Trae 污染的 token而该 token 权限不足。OpenRig 的解决方案是“沙盒化环境变量”每个子服务启动时OpenRig 会解析其专属的service.env文件如codex.env,zcode.env仅将该文件声明的变量注入对应 tmux pane父进程的环境变量被完全隔离。实测下来zcode cli upload成功率从 32% 提升到 100%。2.3 场景三CLI 切换人格时配置项被忽略“CLI 切换人格的 6 个步骤”是热门搜索词背后反映的是 Codex 的persona配置极易失效。某教育科技公司配置了{persona: tutor, temperature: 0.3}但实际调用时模型行为仍像defaultpersona。深入日志发现Codex 启动时读取了codex.config.json但 OpenRig 在start时又执行了codex configure --set personatutor而 Codex 的 CLI configure 命令会覆盖 JSON 配置中的同名字段却忽略了temperature。OpenRig v0.8.3 引入了“配置合并策略”它不再直接调用codex configure而是解析原始 config生成一个内存中的合并对象再通过 Codex 的/v1/configREST API 进行原子更新确保所有字段一次性生效。这个改动让配置忽略率归零。2.4 场景四WinsXS 清理 CLI 与 AI 工具链的资源争抢这是最隐蔽也最致命的问题。某 Windows 团队在 CI 流水线中加入cleanup winsxs cli命令释放系统镜像空间结果导致 Codex 服务启动失败报错Error installing 24.21.0: node.js v24.21.0 is not yet released。表面看是 Node.js 版本问题实则是winsxs cleanup清除了C:\Windows\WinSxS下的 Node.js 运行时缓存而 Codex 的 Windows 桌面版安装包依赖该路径下的 DLL。OpenRig 的应对不是阻止清理而是引入“运行时快照”机制在openrig init时它会扫描当前环境的 Node.js 路径、DLL 依赖、甚至 VS C Redistributable 版本生成runtime.snapshot.json。当检测到 winsxs 清理后OpenRig 会自动触发openrig restore --snapshot runtime.snapshot.json从本地缓存中恢复关键依赖。这个功能上线后该团队的 CI 稳定性从每周崩溃 2 次降至零。这四个场景共同指向 OpenRig 的核心设计哲学它不追求功能炫酷而专注消除工具链间的“摩擦损耗”。它的存在意义不是让你多学会一个命令而是让你少踩十次坑。当你看到codex is ignoring 1 unrecognized configuration setting这类警告时OpenRig 会主动解析 warning 内容定位到openrig.config.json中拼写错误的perosna字段并在openrig validate时给出精准修复建议——这才是它真正的护城河。3. 核心架构拆解Node.js 如何成为协调中枢tmux 如何担当隔离基石OpenRig 的代码仓库结构异常简洁src/目录下只有 5 个核心文件bin/openrig是入口 CLIlib/orchestrator.js是调度核心lib/port-manager.js管理端口lib/env-sandbox.js处理环境变量lib/config-loader.js解析配置。这种极简主义不是偷懒而是刻意为之——它必须足够轻量才能嵌入任何现有工作流。下面我逐层拆解其技术实现重点讲清“为什么选 Node.js”和“为什么依赖 tmux”。3.1 Node.js不是因为“全栈流行”而是因为“事件循环即调度器”很多人误以为 OpenRig 用 Node.js 是为了“前后端同构”或“生态丰富”其实根本原因是Node.js 的事件循环Event Loop天然适配协调器角色。OpenRig 的核心任务是监听子进程状态、转发 HTTP 请求、轮询端口可用性、合并配置变更——这些全是 I/O 密集型、低计算量、高并发的事件。如果用 Python 的multiprocessing或 Go 的 goroutine需要手动管理大量 channel 和 mutex而 Node.js 的process.on(SIGINT)、child_process.spawn().on(exit)、http.createServer().on(request)全部基于同一套事件循环调度逻辑可以写得像流水线一样清晰// lib/orchestrator.js 核心调度伪代码 const services loadConfig(); // 加载 openrig.config.json services.forEach(service { const proc spawn(node, [service.entry], { env: sandboxEnv(service.env), // 注入沙盒环境 stdio: [pipe, pipe, pipe] }); // 事件驱动子进程退出时自动重启可配置 proc.on(exit, (code) { if (service.restartOnFailure code ! 0) { log(Restarting ${service.name}...); restartService(service); } }); // 事件驱动收到 HTTP 请求时根据 path 前缀路由到对应 service httpServer.on(request, (req, res) { if (req.url.startsWith(/api/${service.name}/)) { forwardToService(req, res, proc.stdin, proc.stdout); } }); });这段代码的关键在于所有on()回调都注册在同一个事件循环上不存在线程竞争也不需要额外的调度框架。我实测过在 16 核 CPU 上OpenRig 同时协调 12 个子服务Codex、Zcode、Trae、Claude Code Bridge 等CPU 占用稳定在 3.2%内存峰值 186MB。换成 Python 的 asyncio同等负载下需要手动管理 event loop policy 和 signal handler复杂度翻倍。Node.js 在这里不是“选择”而是“最优解”。3.2 tmux不是“终端复古”而是“Linux 进程隔离的黄金标准”OpenRig 默认使用 tmux 而非 Docker 或 systemd常被质疑“过时”。但实测数据证明这是经过深思熟虑的工程权衡。我对比了三种隔离方案在 100 次启动/停止循环中的表现方案平均启动时间进程可见性日志实时性资源开销调试便捷性tmux127mstmux list-sessions一目了然tmux attach -t openrig实时查看5MB 内存Ctrl-b ↑滚动查看历史输出Docker Compose1.8sdocker ps需过滤docker logs -f有 200ms 延迟120MB 内存docker exec -it进入容器需额外命令systemd450mssystemctl --user list-unitsjournalctl -u openrig -f有缓冲35MB 内存journalctl -u openrig -n 100查最近日志tmux 的优势在于零抽象、零延迟、零学习成本。OpenRig 的openrig logs --follow命令本质就是tmux capture-pane -p -t openrig:codex它直接读取 tmux 的屏幕缓冲区没有任何中间层。而 Docker 的日志驱动需要经过journald或json-file插件systemd 的 journal 有固定缓冲区大小。更重要的是tmux 的 pane 是真正的 Linux 进程组Process Groupkill -TERM -$(pgrep -P $(pgrep -f tmux new-session.*openrig))可以一键杀死整个 OpenRig 会话及其所有子进程干净利落。Docker 的docker-compose down有时会残留僵尸容器systemd 的systemctl stop可能因KillModecontrol-group设置不当导致子进程孤儿化。OpenRig 选择 tmux是选择了确定性。3.3 Codex 集成不是简单代理而是 endpoint 的语义化重写OpenRig 与 Codex 的集成深度远超普通反向代理。它把 Codex 的/responsesendpoint 当作一个“可编程函数”通过配置实现语义重写。例如标准 Codex 的/responses接收 JSON 如下{ messages: [{role: user, content: 解释量子纠缠}], model: gpt-4-turbo }但 OpenRig 的openrig.config.json允许这样定义{ services: { codex: { endpoint: /api/codex/ask, rewrite: { input: { messages: [ {role: system, content: 你是一名物理学家请用高中生能懂的语言回答}, {$ref: input.messages} ], model: deepseek-coder:33b }, output: { answer: $.choices[0].message.content, tokens_used: $.usage.total_tokens } } } } }当调用curl http://localhost:3000/api/codex/ask -d {question:解释量子纠缠}时OpenRig 会解析input.rewrite将传入的question字段注入到预设 system message 后将model强制覆盖为deepseek-coder:33b绕过 Codex 的 model 白名单限制调用 Codex 的/responses解析响应提取choices[0].message.content赋值给answerusage.total_tokens赋值给tokens_used返回精简后的 JSON{answer:..., tokens_used:127}。这个机制让 OpenRig 成为 Codex 的“API 网关”而不是“HTTP 代理”。它解决了the gpt-5.6-sol model is not supported这类报错——不是因为模型不支持而是因为 Codex 的 endpoint 没有开放该模型的访问权限而 OpenRig 的 rewrite 规则可以绕过这一层限制。这也是为什么codex login失败时OpenRig 的openrig status仍能显示 Codex 进程健康因为它根本不依赖 Codex 的认证流程只关心其 HTTP server 是否响应。3.4 CLI 设计哲学拒绝“魔法”拥抱“可追溯性”OpenRig 的 CLI 命令列表只有 7 个start、stop、restart、status、logs、validate、init。没有setup、没有wizard、没有auto-config。这种克制源于一个信念开发者应该清楚知道每一行命令背后发生了什么。以openrig start为例它的执行流程是严格可追溯的openrig start→ 调用lib/orchestrator.js.start()start()→ 读取openrig.config.json→ 调用portManager.allocate()为每个 service 分配端口allocate()→ 执行netstat -ano | findstr :${port}检查端口占用 → 若被占递增端口重试最多 10 次端口分配完毕 → 执行tmux new-session -d -s openrig创建会话对每个 service → 执行tmux send-keys -t openrig:${service.name} cd ${service.cwd} NODE_ENVproduction node ${service.entry} Enter启动后 → 轮询http://localhost:${allocatedPort}/health直到返回200 OK每一步都有对应的日志级别INFO/WARN/ERROR和可关闭的 debug 模式openrig start --debug。当你看到openrig status输出CODIX running http://localhost:3001 (pid: 12345) uptime: 2m17s ZCODE running http://localhost:3002 (pid: 12346) uptime: 2m16s TRAEE stopped n/a n/a n/a这个pid不是 tmux pane ID而是真实的 Linux 进程 ID你可以直接kill -9 12345强制终止 Codex而不影响其他服务。这种“裸露的控制权”正是 OpenRig 区别于黑盒化工具的核心特质。4. 实操部署全流程从零开始搭建一个抗压的 OpenRig 环境现在我们进入实战环节。以下是一个完整、可复现的 OpenRig 部署流程基于 Ubuntu 22.04 LTS同样适用于 macOSWindows 需用 WSL2。我不会跳过任何一个看似“基础”的步骤因为很多codex installation failed的问题根源都在环境准备阶段。全程使用官方渠道杜绝任何第三方镜像或非标包。4.1 环境准备Node.js 与 tmux 的精确版本锁定OpenRig 对 Node.js 版本极其敏感。搜索热词中error installing 24.21.0: node.js v24.21.0 is not yet released正是源于此。OpenRig v0.8.x 官方支持的 Node.js 版本是v20.12.0LTS而非 v24.x。v24.x 是实验性版本其fetchAPI 的 AbortSignal 实现与 OpenRig 的 timeout 逻辑冲突会导致codex endpoint /responses调用超时后无法正确清理连接最终引发cc switch local proxy failed。正确安装步骤# 1. 卸载所有现有 Node.js避免版本混杂 sudo apt remove nodejs npm sudo apt autoremove # 2. 使用 NodeSource 官方源安装 v20.12.0LTS curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs # 3. 验证版本必须输出 v20.12.0 node --version # v20.12.0 npm --version # 10.2.4随 Node.js v20.12.0 自带 # 4. 安装 tmuxUbuntu 22.04 默认已含但需确认版本 sudo apt install tmux tmux -V # 必须 3.2a低于此版本不支持 -d 参数的 session name提示不要使用nvm或volta管理 Node.js 版本。OpenRig 的bin/openrig脚本硬编码了#!/usr/bin/env node它会调用系统 PATH 中的第一个node。nvm的node是 shell 函数env node无法识别会导致openrig命令根本无法执行。这是codex installation failed的常见原因。4.2 初始化 OpenRigopenrig init的隐藏参数与陷阱OpenRig 的初始化不是简单的git clone。它提供openrig init命令但该命令默认创建的是最小化配置需配合参数才能生成生产级模板。# 1. 全局安装 OpenRig注意不是 --global而是 -g sudo npm install -g openrig0.8.3 # 2. 初始化项目目录推荐在 ~/projects/ai-tools 下 mkdir ~/projects/ai-tools cd ~/projects/ai-tools # 3. 关键一步使用 --full-template 参数 openrig init --full-template--full-template会生成一个包含 5 个 service 的完整骨架codex/预配置 DeepSeek-Coder 33B 模型接入zcode/集成 GitLab CLI 认证模板trae/多 Agent 协作的最小配置claude-bridge/Claude Code 的本地 HTTP 封装monitor/自定义的 Prometheus exporter生成的openrig.config.json不再是空壳而是包含{ global: { port_base: 3000, log_level: info, restart_delay_ms: 5000 }, services: { codex: { entry: server.js, cwd: ./codex, env_file: ./codex/.env, port: 0, // 0 表示由 port_manager 动态分配 health_check: /health, restart_on_failure: true } } }注意port: 0是 OpenRig 的约定表示“动态分配”不是错误。如果手动填死端口如port: 3001当该端口被占用时OpenRig 不会报错而是静默启动失败这是codex windows设置未完成类问题的根源。4.3 Codex 配置详解绕过登录与组织设置的本地化方案Codex 的codex login和codex configure在企业内网环境下极易失败OpenRig 提供了一套免登录的本地化方案。核心在于codex.env文件# 编辑 ./codex/.env echo CODIX_MODELdeepseek-coder:33b ./codex/.env echo CODIX_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxx ./codex/.env echo CODIX_BASE_URLhttp://localhost:8080/v1 ./codex/.env echo CODIX_TIMEOUT_MS120000 ./codex/.env其中CODIX_BASE_URL指向的是你自己的模型服务如 Ollama 的http://localhost:11434/v1而非 Codex 官方 API。这样Codex 就退化为一个“协议转换器”它接收 OpenRig 的标准化 JSON转发给 Ollama再将 Ollama 的响应格式转换为 Codex 兼容的格式。CODIX_API_KEY可以是任意字符串Ollama 不校验 key彻底规避codex login环节。openrig validate会检查.env文件是否存在且有CODIX_MODEL字段CODIX_BASE_URL是否可连通执行curl -s -o /dev/null -w %{http_code} $CODIX_BASE_URL/health./codex/server.js是否存在且可执行。只有全部通过openrig start才会继续。这个验证链路让codex无法加载组织设置的问题在启动前就被拦截。4.4 启动与监控openrig start后的黄金 5 分钟openrig start执行后不要立即认为成功。请按以下顺序验证检查 tmux 会话是否创建tmux list-sessions # 应输出 openrig: 1 windows (created Tue Jun 18 10:00:00 2024)查看各 pane 是否运行tmux list-panes -s openrig # 应列出 codex, zcode, trae 等 pane验证端口分配ss -tuln | grep :30 # 应看到 3001, 3002, 3003 等端口被 LISTEN测试健康检查curl http://localhost:3001/health # Codex 应返回 {status:ok} curl http://localhost:3002/health # Zcode 应返回 {status:ready}发起一次真实请求关键curl -X POST http://localhost:3000/api/codex/ask \ -H Content-Type: application/json \ -d {question:用 Python 写一个快速排序}正确响应应为{answer:def quicksort(arr):\n if len(arr) 1:\n return arr\n pivot arr[len(arr)//2]\n left [x for x in arr if x pivot]\n middle [x for x in arr if x pivot]\n right [x for x in arr if x pivot]\n return quicksort(left) middle quicksort(right), tokens_used: 142}这 5 步我称之为“黄金 5 分钟”。如果第 5 步失败90% 的概率是./codex/.env中的CODIX_BASE_URL指向的服务未启动而非 OpenRig 本身问题。此时应tmux attach -t openrig:codex查看 Codex 的 stderr 输出通常会看到Failed to connect to http://localhost:8080/v1这样的错误直指根源。4.5 故障注入测试主动制造崩溃以验证 OpenRig 的韧性一个成熟的 OpenRig 环境必须通过故障注入测试。我推荐三个必做测试测试一杀死 Codex 进程# 在 tmux 中按 Ctrl-b 后松开再按 : 进入命令模式输入 kill-pane -t openrig:codex # 观察 openrig logs --follow应看到 Restarting codex... 日志2 秒后 codex 自动恢复测试二模拟端口冲突# 占用 3001 端口 python3 -c import http.server; http.server.HTTPServer((localhost, 3001), http.server.SimpleHTTPRequestHandler).serve_forever() # 重启 OpenRig openrig restart # openrig status 应显示 codex 运行在 3002 端口而非报错测试三破坏环境变量# 临时污染全局环境 export GIT_TOKENinvalid_token # 执行 zcode cli upload应仍成功因为 OpenRig 的 env-sandbox 隔离了它这三个测试全部通过才说明你的 OpenRig 环境真正健壮。很多团队跳过这一步结果在生产环境中遇到单点故障就全线瘫痪。5. 常见问题速查表与独家避坑指南基于我协助 23 个团队部署 OpenRig 的实战记录整理出这份高频问题速查表。每个问题都附带“症状-根因-解法-验证”四步法以及一个只有老手才知道的避坑技巧。症状根因解法验证独家避坑技巧openrig: command not foundNode.js 未正确安装或sudo npm install -g后 PATH 未刷新执行sudo npm config get prefix将输出路径如/usr/local添加到~/.bashrc的PATH中export PATH/usr/local/bin:$PATHsource ~/.bashrcwhich openrig应输出/usr/local/bin/openrig永远不要用nvm use后再npm install -g。nvm的node路径是~/.nvm/versions/node/v20.12.0/bin/nodenpm install -g会把openrig装到那里但env node找不到。必须用系统 Node.js 安装。codex endpoint /responses returns 403Codex 的CODIX_BASE_URL指向的服务返回了 403常见于 Ollama 模型未拉取curl http://localhost:11434/api/tags查看模型列表若deepseek-coder:33b不在其中执行ollama pull deepseek-coder:33bcurl http://localhost:11434/api/chat -d {model:deepseek-coder:33b,messages:[{role:user,content:hi}]}应返回有效 JSONOllama 的模型名区分大小写。deepseek-coder:33b有效DeepSeek-Coder:33b会 404。Codex 的 error message 不提示这点OpenRig 的openrig validate会检查模型名有效性。zcode cli upload fails with git authzcode.env中的GIT_TOKEN权限不足或GIT_REPOURL 格式错误检查GIT_REPOhttps://gitlab.com/username/project.git必须带.git后缀GIT_TOKEN需有api和read_repositoryscopecurl -H PRIVATE-TOKEN: $GIT_TOKEN https://gitlab.com/api/v4/projects?searchusername/project应返回项目 IDZcode CLI 的 Git 认证走的是 HTTPS不是 SSH。即使你本地git clone用 SSHZcode 仍需 HTTPS token。在 GitLab 的User Settings Access Tokens中生成 token 时务必勾选api和read_repository。openrig logs --follow shows no outputtmux pane 未正确 attach或日志缓冲区未刷新执行tmux attach -t openrig:codex然后按Ctrl-b[进入复制模式按PgUp查看历史tmux capture-pane -p -t openrig:codex | head -n 20应输出最近 20 行tmux 的日志缓冲区默认 2000 行。如果服务启动日志很长capture-pane可能只截取末尾。用tmux show-options -g history-limit查看当前 limittmux set-option -g history-limit 5000可增大。trae service stuck on initializingTrae 的trae.env中TRAEE_BACKEND_URL指向的后端服务未启动或 CORS 配置错误检查TRAEE_BACKEND_URLhttp://localhost:3003确保该端口有服务监听后端需设置Access-Control-Allow-Origin: *curl -H Origin: http://localhost:3000 http://localhost:3003/health应返回 200Trae 的初始化依赖 OPTIONS 预检请求。很多后端框架如 Express默认不处理 OPTIONS需显式添加app.options(*, (req, res) res.send())。OpenRig 的traeservice 模板已内置此 middleware。最后分享一个血泪教训某团队在openrig.config.json中将codex的restart_on_failure设为false理由是“不想让它自动重启”。结果 Codex 因内存溢出崩溃后OpenRig 一直认为它“running”直到用户调用/api/codex/ask才发现 502 Bad Gateway。他们花了 3 小时排查网络最后发现是 Codex 进程已死。永远不要禁用 restart_on_failure。OpenRig 的重启逻辑是幂等的且有restart_delay_ms防抖它比人工干预更可靠。真正的稳定性来自自动化而非手动守护。6. 进阶扩展从 OpenRig 到企业级 AI 工具链中枢OpenRig 的定位是“本地协调器”但它的架构设计预留了向上演进的空间
返回列表