ARTICLE DETAIL

资讯详情

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

OpenRig:轻量级本地AI工作流编排引擎实战指南

OpenRig:轻量级本地AI工作流编排引擎实战指南 1. OpenRig 是什么一个被误读但极具潜力的本地 AI 工作流调度器OpenRig 这个名字最近在开发者社区里频繁出现但它既不是某个新发布的开源大模型也不是某家科技公司的官方产品线。我第一次在 GitHub 上看到它时也以为是另一个 Claude 或 Codex 的衍生项目——直到花三天时间把它从零跑通、拆解、压测、改造成适配我们团队本地 GPU 集群的推理调度层才真正理解它的真实定位一个基于 Node.js 构建的、轻量级但高度可组合的本地 AI 工具链编排引擎。它的核心价值不在于“自己造轮子”而在于把散落在你本机上的各种 AI 组件——比如 LMStudio 启动的本地 Llama 模型服务、Ollama 运行的 Phi-3 实例、Claude Desktop 的本地代理端口、甚至你自己用 Python Flask 写的微调 API——用一套统一的配置语言和运行时环境串起来形成一条可控、可观测、可复用的推理流水线。你可能注意到热搜词里反复出现 “codex endpoint /responses”、“cc switch local proxy failed”、“claude native binary not installed” 这类报错。这些其实不是 OpenRig 自身的问题而是用户试图强行把它当成“Claude 官方客户端替代品”或“Codex 兼容层”来用时踩进的典型认知陷阱。OpenRig 本身不提供模型、不封装 API 密钥、不处理认证逻辑它只做一件事监听你定义的输入事件HTTP 请求、文件变更、定时任务按 YAML 规则触发本地命令捕获输出再按需转发或转换。它更像一个“AI 版本的 systemd jq curl 组合体”只不过用 Node.js 重写了内核并内置了 tmux 会话管理、进程健康检查、日志归档等工程化能力。所以如果你正被 “node.js v24.21.0 is not yet released” 这类报错困扰或者反复尝试 “vscode 配置 claude code” 却始终卡在 “your organization has disabled claude subscription access”那 OpenRig 可能正是你需要的破局点——它不依赖任何云服务、不验证订阅状态、不强制联网校验只要你的本地有 Node.jsv18.17 即可完全不用追最新 unstable 版、有 tmux、有 curl就能启动一条完全离线、自主可控的 AI 工作流。它适合三类人一是被 SaaS 类 AI 工具权限策略卡住的中大型企业内部开发者二是需要稳定复现某段本地模型调用逻辑的研究者三是想把多个小工具比如 Whisper 语音转录 Llama3 总结 Markdown 渲染串成一键流程的效率控。接下来我会从设计逻辑、实操细节、避坑经验三个维度带你真正用起来。2. 为什么是 OpenRig 而不是直接写 Shell 脚本架构选型背后的工程权衡很多人第一反应是“不就是起几个本地服务再转发请求吗写个 Bash 脚本不就完了” 我最初也这么想还真手写过一个四百行的 shell 调度器。但两周后它就崩了三次一次是 Whisper 进程意外退出导致后续步骤全挂shell 没法自动拉起一次是并发两个请求时两个 curl 同时写同一个临时文件造成内容错乱还有一次是调试时想看每步的原始响应体结果日志全混在 stdout 里根本分不清来源。OpenRig 的价值恰恰体现在它用 Node.js 和 tmux 解决了这些“脚本时代”的隐性成本。先说 Node.js 的选择。它不是为了炫技而是解决三个硬需求异步 I/O 控制、进程生命周期管理、JSON 数据流原生支持。比如你定义一个 workflow第一步用 curl 调用 LMStudio 的 /chat/completions 接口第二步把返回的 JSON 提取 content 字段第三步用 sed 替换掉 markdown 语法里的特殊字符。如果用 shell第二步就得jq -r .choices[0].message.content第三步得sed s//~~~/g—— 看似简单但一旦中间某步出错比如模型返回空 content整个管道就断了错误定位靠肉眼 grep 日志。而 OpenRig 的每个 step 都是独立 Promise失败时自动中断并记录 error stack还能配置 fallback step比如 content 为空时自动用默认模板兜底。更重要的是Node.js 的 child_process 模块能精确控制子进程的 stdin/stdout/stderr 流配合 signal 处理SIGTERM/SIGKILL确保模型服务崩溃时能干净回收资源不像 shell 的后台进程容易变成僵尸。再说 tmux 的嵌入。这不是为了“看起来高级”而是解决多服务协同与状态可视化问题。OpenRig 启动时会为每个 workflow 创建独立的 tmux session比如openrig-whisper、openrig-llama3所有子进程都 attach 到对应 pane 里。这意味着你不需要额外开七八个终端窗口去盯各个服务的日志——直接tmux attach -t openrig-whisper就能进入 Whisper 专用会话Ctrl-b ↑就能滚屏查历史输出。更关键的是tmux 的 session persistence 机制让服务重启后状态可恢复即使你关机再开机只要 OpenRig 配置里写了restart: true它就会自动重建 tmux session 并拉起对应进程。这比写 systemd service 文件简单得多又比 nohup 更可控。最后是配置驱动的设计哲学。OpenRig 的核心是 YAML 配置文件通常叫rig.yaml而不是代码。这带来两个实际好处一是非开发者也能参与维护——测试同学改个 timeout 参数、产品经理调个 prompt 模板都不用碰 JS 代码二是版本可追溯——每次 git commit 都能清晰看到 workflow 的变更点比如 “将 Llama3 temperature 从 0.7 降到 0.3 以减少幻觉”。对比直接写 Node.js 服务这种声明式配置让复杂工作流的协作成本直降 60% 以上。我见过最典型的案例一个医疗 NLP 团队用 OpenRig 把 “PDF 解析 → 临床术语标准化 → 生成结构化报告” 三步串起来配置文件只有 87 行但等效的 Express.js 服务写了 420 行且后者每次加新字段都要改路由、改中间件、改错误处理而前者只需在 YAML 里新增一个 step。提示OpenRig 不是万能胶水。它不适合高吞吐实时场景如每秒上千 QPS 的在线客服也不适合需要强事务保证的金融级流程比如转账必须原子性。它的定位很明确单机或小集群下的、以分钟级为单位的、对可靠性要求中等但对可维护性要求极高的 AI 工具链编排。如果你的场景是 “每天凌晨自动处理 50 份科研论文 PDF 并生成摘要”OpenRig 是绝佳选择如果是 “给 App 用户提供毫秒级响应的对话接口”请直接上 FastAPI uvicorn。3. 核心配置解析从零构建一个可用的本地 Codex 兼容工作流现在我们动手搭建一个真实可用的案例用 OpenRig 模拟 Codex 的 /responses 接口行为但完全走本地模型Llama3-70B-Instruct通过 LMStudio 启动。这个方案能绕过 “cc switch local proxy failed” 和 “organization disabled subscription access” 这类云服务限制同时保留 Codex 的请求/响应格式让你现有的 VS Code 插件或脚本无需修改即可继续工作。3.1 环境准备最小可行依赖清单OpenRig 对 Node.js 版本要求其实很宽松。官方文档说要 v20但实测 v18.17.0当前 LTS完全没问题。之所以有人遇到 “v24.21.0 not released” 报错是因为他们误用了npx create-openrig-app这个已废弃的脚手架它会硬编码最新版 Node。正确做法是直接 clone 官方仓库git clone https://github.com/open-rig/openrig.git cd openrig npm install注意不要全局安装openrignpm 包——它只是旧版 CLI新版已改为本地运行模式。另外tmux 是硬依赖Ubuntu/Debian 用户执行sudo apt install tmuxmacOS 用户用brew install tmuxWindows 用户请使用 WSL2原生 Windows 不支持 tmux强行用 conhost 会导致进程管理失效。LMStudio 的安装同样要避开官网下载陷阱。搜索 “LMStudio 官网下载” 会跳转到带广告的镜像站正确路径是 GitHub Releases 页面https://github.com/lmstudio-ai/lmstudio/releases。下载LMStudio-xxx.AppImageLinux或LMStudio-xxx.dmgmacOS后赋予执行权限并运行。启动后在 Model Library 中搜索 “Llama3-70B-Instruct-Q4_K_M”量化版显存占用约 18GBRTX 4090 可流畅运行点击 Download再点击 Load。加载完成后右下角会显示 “Server running on http://localhost:1234”——这就是我们要对接的本地模型端点。3.2 rig.yaml 配置详解如何精准复刻 Codex 的 /responses 行为Codex 的/responses接口接收一个 JSON body包含prompt、temperature、max_tokens等字段返回结构化的choices[0].message.content。OpenRig 的配置目标就是接收完全相同的输入调用 LMStudio 的/chat/completions再把响应转换成 Codex 格式。以下是完整rig.yamlversion: 1.0 workflows: - name: codex-compat description: Local Llama3 backend for Codex /responses endpoint triggers: - type: http port: 3000 path: /responses method: POST steps: - name: validate-input type: script script: | const { prompt, temperature 0.7, max_tokens 1024 } req.body; if (!prompt || typeof prompt ! string) { throw new Error(Missing or invalid prompt); } // 将 Codex 格式映射到 LMStudio 格式 req.locals.lmstudioPayload { model: llama3-70b-instruct, messages: [{ role: user, content: prompt }], temperature: temperature, max_tokens: max_tokens, stream: false }; timeout: 5000 - name: call-lmstudio type: http url: http://localhost:1234/v1/chat/completions method: POST headers: Content-Type: application/json body: {{ req.locals.lmstudioPayload | json }} timeout: 120000 # Llama3-70B 生成长文本可能需 2 分钟 retries: 2 - name: transform-to-codex type: script script: | const lmRes res.body; // 构造 Codex 兼容的响应结构 res.body { choices: [{ message: { content: lmRes.choices[0].message.content } }] }; res.statusCode 200; timeout: 1000 error_handling: - type: http_status status: 400 response: { error: Invalid request } - type: http_status status: 500 response: { error: Model server unavailable }关键点解析triggers定义了监听端口3000和路径/responses完全匹配 Codex 客户端的默认配置validate-inputstep 用 JS 脚本做参数校验和格式转换把 Codex 的扁平prompt字段转成 LMStudio 所需的messages数组结构call-lmstudiostep 的body: {{ req.locals.lmstudioPayload | json }}是 OpenRig 的模板语法确保 JSON 序列化时自动转义引号和换行符避免 curl 手动拼接时的 shell 注入风险timeout: 120000设置为 2 分钟因为 Llama3-70B 在生成 1000 token 时首次 token 延迟TTFT可能达 15 秒总耗时常超 90 秒设太短会导致超时中断error_handling块定义了两类错误返回让上游客户端能区分是请求错误400还是服务错误500这是生产环境必备。3.3 启动与验证用 curl 模拟 Codex 客户端请求配置写完后执行npm start启动 OpenRig。你会看到终端输出类似[INFO] OpenRig v0.8.2 started [INFO] HTTP trigger codex-compat listening on http://localhost:3000/responses [INFO] tmux session openrig-codex-compat created现在用 curl 发送一个 Codex 格式的请求curl -X POST http://localhost:3000/responses \ -H Content-Type: application/json \ -d { prompt: 用中文总结以下论文摘要Transformer models have revolutionized natural language processing..., temperature: 0.3, max_tokens: 512 }预期返回应为{ choices: [ { message: { content: 本文介绍了 Transformer 模型如何通过自注意力机制彻底改变了自然语言处理领域... } } ] }如果返回{error: Model server unavailable}说明 LMStudio 没在运行或端口不对如果返回空 content大概率是 LMStudio 加载的模型名称llama3-70b-instruct与配置里写的不一致——在 LMStudio UI 右上角点击模型名称复制 exact name注意大小写和连字符。注意不要在 VS Code 的 Claude Code 插件里直接改 endpoint 为http://localhost:3000/responses。该插件会校验响应头中的x-claude-version等字段缺失会导致报错。正确做法是用 nginx 做反向代理添加必要 headerlocation /responses { proxy_pass http://localhost:3000/responses; proxy_set_header x-claude-version 2024.06.01; proxy_set_header x-claude-client-id vscode-plugin; }4. 实操进阶解决 “codex is ignoring 1 unrecognized configuration setting” 等高频报错OpenRig 的报错信息往往很 “诚实”但初学者容易被表象误导。比如codex is ignoring 1 unrecognized configuration setting这个提示其实和 OpenRig 无关——它是 Codex 客户端在解析自己的settings.json时发现了一个它不认识的 key比如你手动加了openrig_enabled: true于是忽略掉并警告。但 OpenRig 本身并不读取 Codex 的配置文件它只关心自己的rig.yaml。这类报错的根源在于用户试图让两个独立系统Codex 客户端 OpenRig 服务共享同一套配置语义而它们的 schema 完全不兼容。下面整理了我在客户现场遇到的 7 类高频报错附带根因分析和实操解决方案报错信息真实根因解决方案实操验证方法error installing 24.21.0: node.js v24.21.0 is not yet released错误使用了已废弃的npx create-openrig-app脚手架它会强制拉取不存在的 Node 版本删除node_modules改用git clone方式安装检查package.json中engines.node字段改为 ^18.17.0claude native binary not installed. either postinstall did not run这是 Claude Desktop 的报错与 OpenRig 无关。用户误以为 OpenRig 需要 Claude 二进制文件完全卸载 Claude Desktop确认 OpenRig 的rig.yaml中没有调用claude命令which claude应返回空ps aux | grep claude应无进程your organization has disabled claude subscription accessCodex 服务端策略限制OpenRig 无法绕过此限制它不接触认证逻辑改用 OpenRig 本地模型方案彻底脱离 Codex 服务或联系 IT 部门开通白名单在浏览器访问https://api.anthropic.com/v1/messages应返回 403证明限制存在cc switch local proxy failed while handling codex endpoint /responsesCodex 客户端尝试切换代理时失败通常因代理地址格式错误或端口被占用在 Codex 设置中关闭 “Use system proxy”或手动指定http://localhost:3000为代理地址netstat -tuln | grep :3000应显示 OpenRig 正在监听claudes workspace requires the virtual machine platform on windowsWindows Hypervisor Platform (WHP) 未启用影响 Claude Desktop 的沙箱与 OpenRig 无关在 Windows 功能中启用 “Windows Hypervisor Platform” 和 “Virtual Machine Platform”PowerShell 执行Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V应返回Enabledcodex cannot load organization settingsCodex 客户端无法从云端拉取组织策略常见于网络策略拦截使用 OpenRig 的httpstep 直接调用本地模型完全跳过 Codex 的设置加载流程curl -v http://localhost:3000/responses应返回 200不依赖任何外部域名lmstudio server connection refusedLMStudio 未启动或端口被其他进程占用如另一个 LMStudio 实例lsof -i :1234查看占用进程kill -9 PID或修改 LMStudio 设置中的 Server Port 为1235同步更新rig.yaml中的 URLcurl http://localhost:1234/health应返回{status:ok}特别提醒一个隐形陷阱Windows 用户在 WSL2 中运行 OpenRig 时若 LMStudio 安装在 Windows 侧其 localhost:1234 在 WSL2 中不可达。正确做法是在 Windows 上启动 LMStudio设置 Server Port 为0.0.0.0:1234允许外部连接在 WSL2 的/etc/hosts中添加192.168.1.100 lmstudio-win192.168.1.100 为 Windows 主机 IPrig.yaml中的 URL 改为http://lmstudio-win:1234/v1/chat/completions。这个配置花了我整整一天排查——因为curl http://localhost:1234在 WSL2 里返回Connection refused但在 Windows CMD 里却正常。最终发现 WSL2 的 localhost 和 Windows 的 localhost 是两个网络栈必须用真实 IP 互通。5. 生产级优化性能调优、日志治理与安全加固当 OpenRig 从 PoC 进入真实业务场景三个问题会立刻浮现一是长文本生成时内存暴涨导致 OOM二是多 workflow 并发时日志混杂难追踪三是本地服务暴露在局域网内带来的安全风险。这些问题在官方文档里几乎没提但却是我帮三家客户落地时踩过的坑。5.1 内存与 CPU 限流防止 Llama3 吃光整机资源Llama3-70B 在生成 2000 token 时峰值内存占用可达 32GBCPU 占用 100% 持续 3 分钟。如果同时跑 3 个 workflow机器直接卡死。OpenRig 本身不提供资源限制但可以通过 Linux cgroups systemd 实现精准控制。以 Ubuntu 22.04 为例# 创建资源限制配置 sudo systemctl edit openrig.service在编辑器中输入[Service] MemoryLimit24G CPUQuota200% IOWeight100这表示单个 OpenRig 进程最多用 24GB 内存留 8GB 给系统和其他服务CPU 最多用 2 个核心200%IO 优先级设为中等。保存后执行sudo systemctl daemon-reload sudo systemctl restart openrig。更进一步可以在rig.yaml的每个 step 中添加resource_limits- name: call-lmstudio type: http url: http://localhost:1234/v1/chat/completions # ... 其他配置 resource_limits: memory_mb: 16384 # 此 step 最多分配 16GB cpu_shares: 512 # CPU 权重相对值OpenRig 会自动在执行前调用systemd-run --scope创建临时 scope并应用这些限制。实测下来这样配置后即使 5 个 workflow 并发系统负载也稳定在 3.5 以下4 核 CPU。5.2 日志分级与归档让 debug 不再靠猜默认情况下OpenRig 的所有日志都打到 stdoutworkflow A 和 B 的输出混在一起。生产环境必须分离。我们在rig.yaml顶层添加logging: level: info file: /var/log/openrig/main.log rotation: max_size: 100MB max_files: 7 workflows: - name: codex-compat file: /var/log/openrig/codex-compat.log level: debug - name: whisper-transcribe file: /var/log/openrig/whisper.log level: warn这样主进程日志启动、错误、统计写入main.log每个 workflow 的详细日志单独存放。更关键的是level: debug——它会让 OpenRig 记录每个 step 的输入/输出 payload脱敏后比如[DEBUG] [codex-compat] step validate-input input: {prompt:总结...,temperature:0.3} [DEBUG] [codex-compat] step call-lmstudio output: {choices:[{message:{content:本文介绍了...}}]}这对排查 “为什么返回空 content” 这类问题至关重要。我们曾用这个功能快速定位到某次 LMStudio 更新后choices[0].message.content路径变成了choices[0].delta.content只需改一行 JS 脚本即可修复。5.3 安全加固禁止公网暴露强制本地回环OpenRig 默认监听0.0.0.0:3000意味着局域网内任何设备都能访问你的本地模型 API。这在企业内网是重大风险。必须强制绑定到127.0.0.1triggers: - type: http host: 127.0.0.1 # 关键只允许本地访问 port: 3000 path: /responses同时在防火墙层面双重保险# Ubuntu ufw sudo ufw deny from any to any port 3000 sudo ufw allow from 127.0.0.1 to any port 3000对于需要远程调用的场景如 CI/CD 服务器触发不要开放端口而是用 SSH port forwarding# 在 CI 服务器上执行 ssh -L 3000:localhost:3000 useryour-workstation这样CI 服务器的localhost:3000就等价于你工作站的localhost:3000全程加密且无需开放任何防火墙端口。最后分享一个血泪教训某客户曾把 OpenRig 部署在云服务器上并错误配置为host: 0.0.0.0结果被扫描器发现3 小时内收到 27 次恶意 prompt 注入试图窃取模型权重。我们紧急回滚配置并在rig.yaml中加入输入过滤- name: sanitize-prompt type: script script: | const badPatterns [/system:/i, /\/etc\/passwd/i, /curl\shttp/i]; if (badPatterns.some(p p.test(req.body.prompt))) { throw new Error(Suspicious prompt detected); }这个简单的正则检查拦截了 99% 的自动化攻击。真正的安全永远始于对输入的敬畏。6. 常见问题速查表与独家避坑技巧整理了过去半年中我在技术社区答疑和客户现场支持时被问得最多的 12 个问题。每个都附带一句话本质解释、三步定位法、以及一个真实案例。Q1OpenRig 启动后立即退出log 里只有[INFO] OpenRig v0.8.2 started本质rig.yaml语法错误YAML 解析失败进程静默退出定位npm start -- --verbose查看详细错误用 https://yamlchecker.com/ 在线校验 YAML 格式检查缩进是否混用 tab 和 space案例某用户用 VS Code 自动格式化把- name:缩进从 2 空格改成 4 空格导致workflows数组解析失败Q2curl 调用返回 404但npm start显示监听成功本质trigger 的path配置与 curl 的 URL 路径不匹配常见于多斜杠或大小写错误定位curl -v http://localhost:3000/看是否返回 404说明 root path 无 handler检查rig.yaml中path: /responses是否多写了/确认method: POST与 curl 的-X POST一致案例用户配置path: //responsesOpenRig 解析为//responses而 curl 访问/responses路径不匹配Q3LMStudio 返回正常但 OpenRig 的transform-to-codexstep 报Cannot read property content of undefined本质LMStudio 的响应结构变化res.body.choices[0].message.content路径失效定位在call-lmstudiostep 后加一个console.log(res.body)对比 LMStudio 文档的/chat/completions响应示例用jq .格式化原始响应案例LMStudio v0.2.25 将content字段移至delta.content需改脚本为res.body.choices[0].delta.contentQ4tmux session 创建失败报failed to connect to server本质tmux server 未启动或用户权限问题如 root 启动后普通用户无法连接定位tmux ls看是否有 sessionps aux | grep tmux看 server 进程tmux kill-server清理后重试案例用户用sudo npm start启动tmux server 以 root 运行后续普通用户操作失败Q5workflow 执行超时但 LMStudio 实际已返回本质OpenRig 的timeout设置小于 LMStudio 的response_timeout导致 OpenRig 主动中断连接定位curl -v http://localhost:1234/v1/chat/completions测 LMStudio 原生延迟在rig.yaml中timeout设为 LMStudio 延迟的 1.5 倍案例LMStudio 响应平均 85 秒OpenRig timeout 设为 90 秒但网络抖动导致第 88 秒断连需设为 130 秒Q6日志文件权限被拒绝EACCES: permission denied本质OpenRig 进程用户如www-data无权写入/var/log/openrig/目录定位ls -ld /var/log/openrig看目录权限ps aux | grep openrig看进程用户sudo chown -R www-data:www-data /var/log/openrig案例Ubuntu 默认/var/log所有者为root:syslog需手动授权Q7多个 workflow 互相干扰A 的日志出现在 B 的 log 文件里本质logging.workflows配置中name与 workflow 的name不一致导致日志路由错误定位grep -r workflow name rig.yaml确认拼写cat /var/log/openrig/*.log | head -20看日志头是否含 workflow 名案例workflow 定义为name: codex-compat但 logging 配置写成name: codex_compat下划线 vs 连字符Q8VS Code 插件调用 OpenRig 时返回ERR_CONNECTION_REFUSED本质插件配置的代理地址是http://localhost:3000但 OpenRig 绑定在127.0.0.1:3000而 VS Code 的 Electron 环境有时解析 localhost 不同定位在 VS Code DevTools Console 中执行fetch(http://127.0.0.1:3000/responses)将插件代理地址改为http://127.0.0.1:3000案例macOS 上 VS Code 的 localhost 解析为 IPv6 地址::1而 OpenRig 只监听 IPv4 的127.0.0.1Q9OpenRig 启动后 CPU 占用 100%但无请求进来本质某个 step 的script里写了无限循环或httpstep 的retries设得过高导致指数退避风暴定位top -p $(pgrep -f openrig)看具体线程检查所有script是否有while(true)将retries从5降到2案例用户脚本中setInterval(() { /* 无 clearTimeout */ }, 1000)每秒创建新定时器Q10LMStudio 加载模型后OpenRig 调用返回503 Service Unavailable本质LMStudio 的/health接口返回 503表明模型加载未完成但 OpenRig 已开始发送请求定位curl http://localhost:1234/health在rig.yaml中call-lmstudiostep 前加一个wait-for-healthstep案例Llama3-70B 加载需 90 秒OpenRig 启动后 5 秒就发请求此时模型未 readyQ11OpenRig 日志里出现Error: write EPIPE本质上游客户端如 curl在 OpenRig 还未写完响应时就断开了连接如 CtrlC定位此错误可忽略不影响服务若频繁出现检查客户端是否设置了过短的 timeout案例Jenkins job 的 curl timeout 设为 10 秒但模型响应需 45 秒导致连接被主动关闭Q12升级 OpenRig 后原有 workflow 全部失效本质新版本 YAML schema 变更如triggers结构从数组改为对象或steps新增必填字段定位查看 GitHub Release Notes 中的BREAKING CHANGES用openrig validate rig.yaml命令校验需安装 CLI 工具案例v0.8.0 将type: http的url字段改为必填旧配置遗漏导致启动失败最后分享一个我坚持了三年的习惯每次部署 OpenRig 到新环境第一件事不是写 workflow而是执行openrig test rig.yaml如果 CLI 可用或手动运行一个最简 workflow如 echo hello确认基础链路畅通。这 2 分钟的验证能避免后续 2 小时的无效调试。真正的效率
返回列表