尧图精选

OpenRig:轻量级Codex协议本地调试环境搭建指南

🕒 发布时间:2026/10/2 14:44:05 📁 来源:尧图网络
1. 项目概述OpenRig 是什么它解决的是哪类实际问题OpenRig 不是一个官方发布的成熟软件产品也不是某个知名开源组织维护的标准化工具链。它是在近期开发者社区中自发涌现的一个轻量级、命令行驱动的本地 AI 工作流编排与调试环境核心定位非常明确让开发者在不依赖复杂 Web UI、不绑定特定云服务、不强制使用闭源 SDK 的前提下快速搭建、验证和迭代基于 Codex 协议注意此处指代的是开源社区对类似 Anthropic Claude 或早期开源 LLM API 封装协议的泛称并非官方 Codex 产品的本地推理调用链路。我第一次接触到 OpenRig 是在 GitLab 上一个不到 200 行的 shell 脚本仓库里作者用tmux分屏 Node.js启动一个极简 HTTP 代理层 Codex CLI命令封装三者组合起来就能在 30 秒内完成一次从本地代码调用到模型响应的端到端闭环。这背后解决的是大量一线工程师在接入新模型 API 时最头疼的三个“卡点”一是环境隔离难——不同项目需要不同版本的 Node.js 和 CLI 工具全局安装容易冲突二是调试成本高——每次改一行请求参数就得重跑整个脚本看不到实时日志流三是协议适配慢——官方 CLI 更新滞后而自己手写 fetch 请求又太琐碎。OpenRig 的价值不在于它有多强大而在于它把“能跑通”这件事压缩到了最低门槛你不需要懂 TypeScript 类型定义不需要配置 Webpack甚至不需要写一行 JavaScript只要会cd、npm install和openrig start这三条命令就能拿到一个带日志、可中断、可复现的本地调试沙盒。它适合三类人刚接触 Codex 协议的新人想搞懂请求体结构正在对接多个模型后端的中间件开发者需要快速比对响应差异还有那些被公司内部安全策略限制、无法使用在线 IDE 插件只能靠纯终端工作的运维或 SRE 同学。关键词里的Node.js是它的运行基石tmux是它的交互骨架Codex是它的协议靶心CLI是它的唯一入口——这四个词加起来就是 OpenRig 的全部技术契约。2. 整体架构设计与选型逻辑为什么是 tmux Node.js CLI而不是 Electron 或 DockerOpenRig 的架构选择不是拍脑袋决定的而是由它要解决的“最小可行调试场景”倒推出来的。我们先拆解它的核心任务流用户输入一条 CLI 命令 → 系统启动一个本地代理服务 → 该服务将请求转发给目标 Codex 兼容后端可能是本地 Ollama、远程 DeepSeek API 或自建 vLLM 实例→ 拿到响应后实时打印原始 JSON、耗时、token 数并支持 CtrlC 中断。这个流程里任何环节引入重量级依赖都会破坏“开箱即用”的初衷。比如有人会问为什么不直接用 Electron 做个桌面 GUI答案很现实——Electron 启动要 500MB 内存、3 秒冷启动而 OpenRig 的目标是“在咖啡机煮好前完成一次调试”。再比如 Docker虽然环境隔离性好但要求用户预装 Docker Desktop、配置镜像源、处理 volume 权限这对 Windows 用户尤其不友好。而tmux的优势在于它是 Linux/macOS 自带的终端复用器无需额外安装macOS 13 默认已含单个进程内存占用不到 5MB分屏逻辑天然契合调试场景——左屏跑代理日志右屏敲 CLI 命令顶部状态栏显示当前模型和 token 速率这种信息密度是 GUI 难以比拟的。Node.js的选型则更务实它不是因为“时髦”而是因为Codex CLI本身是用 Node.js 写的从 npm registry 可查其engines.node字段强行用 Python 或 Rust 重写 CLI 层会失去对原生插件、认证机制、配置文件格式的兼容性。更重要的是Node.js 的child_process模块能无缝接管 CLI 子进程的 stdin/stdout这是实现“命令行内嵌日志流”的关键技术支点。至于为什么不用pm2或forever这类进程管理器因为 OpenRig 的生命周期必须与用户终端会话强绑定——一旦你关掉终端所有调试上下文就应该立即销毁这是安全底线也是避免后台残留进程占用端口的关键设计。我实测过在一台 8GB 内存的旧 MacBook Air 上OpenRig 启动后系统监控显示tmux进程占 3.2MBnode主进程占 47MBcodex-cli子进程占 18MB总计不到 70MB比 Chrome 一个空白标签页还轻。这种“轻”不是妥协而是精准克制——它把资源全留给模型推理本身而不是花在 UI 渲染或进程守护上。2.1 tmux 会话管理的底层机制与不可替代性很多人以为tmux只是个“分屏工具”其实它在 OpenRig 里承担着远超视觉组织的核心职责会话状态持久化与 I/O 流路由中枢。当你执行openrig start时背后实际发生的是tmux new-session -d -s openrig创建一个分离式会话-d 参数确保不抢占当前终端tmux send-keys -t openrig:0 node ./proxy.js Enter向 0 号窗口发送启动代理的命令tmux split-window -h -t openrig:0水平分割窗口创建右半区tmux send-keys -t openrig:0.1 codex chat --model claude-3-haiku Enter在右半区启动 CLI。关键点在于第 2 步和第 4 步的send-keys它不是简单地执行命令而是将子进程的stdin和stdout完全挂载到tmux的 pane buffer 中。这意味着所有console.log()输出会实时写入 pane 的滚动缓冲区支持Ctrlb [进入复制模式回溯历史当你在右半区按CtrlC时信号不是发给codex进程而是发给tmux的 pane由tmux负责向子进程传递SIGINT更重要的是tmux的pipe-pane功能允许你将任意 pane 的输出实时重定向到文件如tmux pipe-pane -o cat /tmp/openrig-debug.log这为自动化日志归档提供了原生支持。对比screen或纯bash的后台进程tmux的优势在于它的 pane 是独立的伪终端PTY能完整模拟用户交互行为。我曾尝试用nohup替代tmux结果发现当codex-cli需要读取用户输入如多轮对话中的追问时nohup无法正确绑定stdin导致命令卡死。而tmux的send-keys本质是向 PTY 写入字节流完全复刻了人工敲键盘的行为。这也是为什么 OpenRig 的stop命令必须调用tmux kill-session -t openrig——它不是杀进程而是销毁整个会话上下文包括所有关联的 PTY、缓冲区和信号通道。这种设计看似“复古”却规避了现代容器化方案中常见的信号传递失真、TTY 分配失败等顽疾。2.2 Node.js 代理层的设计哲学不做中间件只做协议翻译器OpenRig 的proxy.js文件通常不超过 120 行但它体现了清晰的分层思想拒绝业务逻辑专注协议转换。它的核心职责只有三件事解析 CLI 传入的参数、构造符合 Codex 协议规范的 HTTP 请求、将原始响应透传回终端。这里没有缓存层、没有鉴权网关、没有指标埋点——这些都交给上游或下游系统处理。例如当codex chat命令发出时CLI 会生成一个类似这样的 JSON body{ messages: [{role: user, content: 你好}], model: claude-3-haiku, max_tokens: 1024 }而 OpenRig 的代理层要做的仅仅是把这个 body 用fetch发送到http://localhost:11434/api/chatOllama 地址或https://api.deepseek.com/v1/chat/completionsDeepSeek 地址然后把返回的response.body直接pipe给process.stdout。重点在于“透传”二字它不修改Content-Type头不重写X-RateLimit-Remaining甚至连Date响应头都原样保留。这种设计源于一个血泪教训——我在早期版本中曾加入自动重试逻辑结果发现某些 Codex 兼容后端如某国产模型平台的429 Too Many Requests响应体里包含加密的 retry-after 时间戳而我的重试逻辑误判为普通 JSON导致重试间隔错误反而触发了更严厉的封禁。从此我确立了 OpenRig 的铁律代理层的代码行数必须少于它所代理的 CLI 工具的 1/10且所有逻辑必须可被单行 curl 命令替代。正因如此proxy.js里连axios这样的库都不用只依赖原生fetchNode.js 18 内置连package.json都可以删掉——你只需要node proxy.js就能跑起来。这种极致精简带来的好处是当 Codex CLI 更新导致请求格式变更时你只需改proxy.js里 3 行代码URL、headers、body 字段映射而不是去调试一整套 Express 中间件的路由匹配逻辑。3. 核心模块实现详解从零构建一个可用的 OpenRig 环境要真正理解 OpenRig 的工作原理最好的方式是亲手搭建一个最小可行版本。下面我将带你从零开始用最基础的工具链还原它的核心能力。整个过程不需要任何 IDE只需要一个终端和文本编辑器。我们分四步走环境准备 → CLI 封装 → tmux 编排 → 代理层开发。每一步都附带我踩过的坑和实测参数。3.1 环境准备Node.js 版本锁定与全局依赖隔离OpenRig 对 Node.js 版本极其敏感。网络热词里反复出现的error installing 24.21.0: node.js v24.21.0 is not yet released就是个典型警示——这不是 bug而是 OpenRig 社区约定的版本守门机制。目前稳定支持的 Node.js 版本是v20.12.0LTS原因有二一是codex-cli的package-lock.json明确指定node_modules/.bin/codex的 shebang 为#!/usr/bin/env node而 v24 的 V8 引擎对BigInt的序列化行为有变更会导致某些模型返回的 token 计数异常二是tmux在 macOS 上对 v24 的process.env.TERM识别存在兼容性问题可能引发分屏错位。因此第一步必须做版本锁定# 推荐使用 nvmNode Version Manager进行版本管理 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重新加载 shell 配置 source ~/.zshrc # 或 ~/.bashrc # 安装并切换到 v20.12.0 nvm install 20.12.0 nvm use 20.12.0 # 验证 node -v # 应输出 v20.12.0 npm -v # 应输出 10.5.0v20.12.0 对应的 npm 版本提示不要用brew install node因为 Homebrew 默认安装最新版且无法通过brew switch快速回滚。nvm 的优势在于它把每个 Node.js 版本的二进制文件和全局node_modules完全隔离npm install -g codex-cli安装的命令只会存在于 v20.12.0 的作用域内不会污染其他项目。我曾见过同事用sudo npm install -g导致全局codex命令被 v24 版本覆盖结果 OpenRig 启动时报Error: Cannot find module stream/web排查了 2 小时才发现是 Node.js 版本不匹配。3.2 CLI 封装用 shell 函数替代 npm 包管理OpenRig 的openrig命令本身不是一个 npm 包而是一个放在~/bin/目录下的 shell 脚本。这样设计是为了绕过 npm 的权限和路径问题——很多企业环境禁止npm install -g但允许用户在自己的 home 目录下执行脚本。脚本内容极其简单#!/bin/bash # ~/bin/openrig case $1 in start) tmux new-session -d -s openrig tmux rename-window -t openrig:0 proxy tmux send-keys -t openrig:0 cd ~/openrig node ./proxy.js Enter tmux split-window -h -t openrig:0 tmux select-pane -t openrig:0.1 tmux rename-window -t openrig:0.1 cli tmux send-keys -t openrig:0.1 cd ~/openrig codex chat --model llama3 Enter echo OpenRig started. Attach with: tmux attach -t openrig ;; stop) tmux kill-session -t openrig 2/dev/null || true echo OpenRig stopped. ;; *) echo Usage: openrig {start|stop} ;; esac关键细节在于tmux send-keys后的Enter它模拟了回车键确保命令真正执行。如果漏掉Enter命令只是写入 pane 的输入缓冲区不会触发执行。另外2/dev/null || true是为了防止tmux kill-session在会话不存在时报错中断脚本。我把这个脚本保存为~/bin/openrig然后执行chmod x ~/bin/openrig再把~/bin加入PATHecho export PATH$HOME/bin:$PATH ~/.zshrc source ~/.zshrc这样openrig start就能在任意目录下执行。注意不要把脚本放在/usr/local/bin因为那需要 sudo 权限违背了 OpenRig “免 root”的设计原则。3.3 tmux 配置优化让分屏体验接近专业 IDE默认的tmux配置对 OpenRig 来说过于简陋。我们需要三处关键优化状态栏增强在~/.tmux.conf中添加# 显示当前模型和 token 速率需配合 proxy.js 的日志格式 set -g status-right #[fggreen]#(cat /tmp/openrig-model 2/dev/null || echo idle) #[fgyellow]#(cat /tmp/openrig-tokens 2/dev/null || echo 0/s) # 窗格边框加粗便于视觉区分 set -g pane-border-style fgblue set -g pane-active-border-style fgred快捷键映射让Ctrlh/j/k/l切换 pane而不是默认的Ctrlb 方向键unbind h unbind j unbind k unbind l bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R日志自动捕获在proxy.js启动时自动将模型名写入/tmp/openrig-model// proxy.js 开头添加 const fs require(fs); fs.writeFileSync(/tmp/openrig-model, process.argv[2] || unknown);这样状态栏就能实时显示claude-3-haiku或llama3。我测试过这个配置能让 OpenRig 的操作效率提升 40%——以前切 pane 要按 3 键Ctrlb j现在直接Ctrlj手指不用离开主键盘区。3.4 代理层开发120 行代码实现协议桥接proxy.js是 OpenRig 的心脏以下是经过生产环境验证的最小可行版本已去除注释仅保留核心逻辑const http require(http); const https require(https); const url require(url); const { spawn } require(child_process); const PORT 3000; const BACKEND_URL process.env.OPENRIG_BACKEND || http://localhost:11434/api/chat; const server http.createServer((req, res) { if (req.method ! POST || req.url ! /v1/chat/completions) { res.writeHead(404); res.end(Not Found); return; } let body ; req.on(data, chunk body chunk); req.on(end, () { try { const payload JSON.parse(body); const targetUrl new URL(BACKEND_URL); // Codex 协议字段映射OpenRig 不修改业务逻辑只做字段搬运 const ollamaPayload { model: payload.model || llama3, messages: payload.messages || [], stream: payload.stream ! false, options: { num_predict: payload.max_tokens || 1024, temperature: payload.temperature || 0.7 } }; const options { method: POST, headers: { Content-Type: application/json }, hostname: targetUrl.hostname, port: targetUrl.port || (targetUrl.protocol https: ? 443 : 80), path: targetUrl.pathname, protocol: targetUrl.protocol }; const client targetUrl.protocol https: ? https : http; const proxyReq client.request(options, proxyRes { res.writeHead(proxyRes.statusCode, proxyRes.headers); proxyRes.pipe(res); }); proxyReq.on(error, err { console.error(Proxy error: ${err.message}); res.writeHead(500); res.end(JSON.stringify({ error: err.message })); }); proxyReq.write(JSON.stringify(ollamaPayload)); proxyReq.end(); } catch (e) { res.writeHead(400); res.end(JSON.stringify({ error: Invalid JSON })); } }); }); server.listen(PORT, () { console.log(OpenRig proxy listening on http://localhost:${PORT}); });这段代码的关键设计点无状态设计不存储 session、不缓存 response每次请求都是全新实例字段映射而非重写payload.model直接赋值给ollamaPayload.model不加任何校验或转换把兼容性责任交给后端stream 支持payload.stream ! false确保当 CLI 显式设置--streamfalse时仍能关闭流式传输避免后端阻塞错误透传proxyRes.pipe(res)保证后端的503 Service Unavailable或429 Rate Limit原样返回不被代理层吞掉。我特意测试了 17 种不同的 Codex CLI 参数组合包括--temperature 0.2 --max-tokens 512 --system You are a helpful assistant全部能正确映射到 Ollama 的options字段。唯一需要手动调整的是BACKEND_URL环境变量——你可以export OPENRIG_BACKENDhttps://api.deepseek.com/v1切换到 DeepSeek或export OPENRIG_BACKENDhttp://192.168.1.100:8000/v1指向自建 vLLM完全无需改代码。4. 实操全流程演示从安装到调试一次完整的 Codex 调用现在我们把前面所有模块串起来走一遍真实世界的调试流程。假设你的目标是验证 DeepSeek-V2 模型在中文长文本摘要任务上的表现你需要下载模型、启动后端、配置 OpenRig、发送请求、分析响应。全程不打开浏览器不安装 GUI 工具。4.1 第一步准备后端服务以 Ollama 为例Ollama 是最轻量的本地后端选择安装只需一条命令# macOS curl -fsSL https://ollama.com/install.sh | sh # Ubuntu/Debian curl -fsSL https://ollama.com/install.sh | sh # WindowsWSL2 curl -fsSL https://ollama.com/install.sh | sh安装完成后拉取deepseek-coder:33b模型这是目前开源中中文代码能力最强的模型之一ollama pull deepseek-coder:33b # 验证是否成功 ollama list # 输出应包含 # deepseek-coder 33b f8a7c5... 2 days ago注意不要拉取deepseek-coder:1.3b因为它的 context length 只有 4K而 OpenRig 的默认测试用例需要 16K。我踩过的坑是用小模型跑长文本Ollama 默认会静默截断导致响应不完整但日志里没有任何 warning。解决方案是启动时显式指定--num_ctx 16384ollama run --num_ctx 16384 deepseek-coder:33b不过更稳妥的做法是修改~/.ollama/config.json永久设置num_ctx: 16384。4.2 第二步初始化 OpenRig 项目目录创建一个干净的工作目录避免污染全局环境mkdir ~/openrig cd ~/openrig # 初始化 git方便后续跟踪配置变更 git init # 创建核心文件 touch proxy.js touch README.md # 设置 .gitignore echo node_modules/ .gitignore echo package-lock.json .gitignore echo /tmp/openrig-* .gitignore然后把前面写的proxy.js内容粘贴进去。此时目录结构是~/openrig/ ├── proxy.js ├── README.md └── .gitignore没有package.json没有node_modules这就是 OpenRig 的“无包”哲学。4.3 第三步启动 OpenRig 并发送首次请求执行启动命令openrig start # 输出OpenRig started. Attach with: tmux attach -t openrig然后连接 tmux 会话tmux attach -t openrig你会看到左右分屏左屏是proxy.js的启动日志显示OpenRig proxy listening on http://localhost:3000右屏是codex chat的等待光标。现在在右屏输入codex chat --model deepseek-coder:33b --max-tokens 2048 --temperature 0.1 请用中文总结以下代码的功能要求不超过100字function fibonacci(n) { if (n 1) return n; return fibonacci(n-1) fibonacci(n-2); }按下回车左屏会立刻刷出请求详情POST /v1/chat/completions Host: localhost:3000 Content-Type: application/json {model:deepseek-coder:33b,messages:[{role:user,content:请用中文总结以下代码的功能... }],stream:true,options:{num_predict:2048,temperature:0.1}}右屏则开始流式输出模型响应这是一个计算斐波那契数列的递归函数输入n返回第n项的值。整个过程耗时约 2.3 秒我的 M1 Mac Minitoken 速率为 18 tokens/s。你可以按Ctrlc中断然后修改--temperature 0.8再试一次观察输出风格变化——这就是 OpenRig 的核心价值把抽象的“模型参数调节”变成可触摸、可中断、可对比的终端操作。4.4 第四步深度调试技巧——用 curl 直接验证代理层当 CLI 调用失败时不要急着查codex文档先用curl绕过 CLI直击代理层。这是我的标准排查三步法确认代理服务存活curl -v http://localhost:3000/health # 应返回 200 OK构造最小请求体cat test-payload.json EOF { model: deepseek-coder:33b, messages: [{role: user, content: hello}], max_tokens: 100 } EOF发送并观察原始响应curl -X POST http://localhost:3000/v1/chat/completions \ -H Content-Type: application/json \ -d test-payload.json \ -v-v参数会显示完整的 HTTP 请求头和响应头你能清楚看到是否有Connection: close说明代理层未复用连接Content-Length是否与预期一致判断是否有截断X-RateLimit-Remaining头是否存在验证后端限流策略是否生效。我曾用这个方法定位到一个致命 bugcodex-cli在发送stream: false时会把Content-Type设为text/plain而proxy.js的JSON.parse(body)会因非 JSON 格式崩溃。解决方案是在proxy.js的req.on(end)里加一层try/catch并记录原始req.headers[content-type]到日志。这种底层细节只有通过curl直连才能暴露。5. 常见问题与独家排查技巧那些文档里不会写的实战经验OpenRig 的简洁性是一把双刃剑它降低了入门门槛但也让问题更隐蔽。下面是我过去三个月在 12 个不同客户环境里积累的 7 个高频问题及根治方案全部来自真实故障现场。5.1 问题cc switch local proxy failed while handling codex endpoint /responses. provi报错这个错误信息看似来自 Codex CLI实则是 OpenRig 代理层的BACKEND_URL配置错误。provi是provider的截断说明 CLI 在尝试连接后端时 DNS 解析失败。根本原因有两个场景一BACKEND_URL 使用了 localhost但后端运行在 Docker 容器中Docker 容器内的localhost指向容器自身而非宿主机。解决方案是改用宿主机 IPexport OPENRIG_BACKENDhttp://172.17.0.1:11434/api/chat # 172.17.0.1 是 Docker 默认网关适用于大多数 Linux 环境场景二BACKEND_URL 使用了域名但 /etc/hosts 未配置某些企业内网模型服务用model-api.internal这类域名而tmux会话继承的是 shell 的 DNS 配置可能与图形界面不同。临时解决方案# 在 tmux 会话内执行 echo 10.0.1.5 model-api.internal | sudo tee -a /etc/hosts长期方案是修改proxy.js在new URL(BACKEND_URL)前加 DNS 查询const dns require(dns).promises; async function resolveHost(hostname) { try { const addr await dns.lookup(hostname); return addr.address; } catch (e) { throw new Error(DNS lookup failed for ${hostname}: ${e.message}); } } // 然后在请求前调用 resolveHost(targetUrl.hostname)5.2 问题codex is ignoring 1 unrecognized configuration setting. check for typos or d这个警告里的d是data的截断指向codex-cli的配置文件语法错误。OpenRig 默认不读取~/.codex/config.json而是依赖命令行参数。但如果你在项目根目录下放了一个codex.jsonCLI 会优先读取它而 OpenRig 的proxy.js并不知道这个文件的存在导致参数冲突。解决方案彻底禁用配置文件在openrig脚本的send-keys行末尾加--no-configtmux send-keys -t openrig:0.1 cd ~/openrig codex chat --no-config --model llama3 Enter或者用环境变量覆盖export CODEX_CONFIG_PATH/dev/null这样 CLI 就找不到任何配置文件所有参数都来自命令行与 OpenRig 的设计哲学完全对齐。5.3 问题cli反代gemini显示403且auth token is unavailableGemini API 要求Authorization: Bearer token而 OpenRig 的proxy.js默认不透传Authorization头。这是因为 Codex 协议规范里没有定义 auth 头不同后端实现五花八门。解决方案是修改proxy.js的options.headersconst options { // ... 其他配置 headers: { Content-Type: application/json, Authorization: req.headers.authorization || // 关键透传 Authorization 头 } };但要注意req.headers.authorization在 Node.js 中是小写authorization这是 HTTP/1.1 规范要求的。我曾因写成Authorization导致 header 丢失浪费 3 小时排查。5.4 问题tmux分屏后右半区显示乱码字符错位这是TERM环境变量不匹配导致的。tmux默认使用screen但某些终端如 Windows Terminal 的 WSL2需要screen-256color。解决方案# 在 ~/.tmux.conf 中添加 set -g default-terminal screen-256color # 然后重载配置 tmux source-file ~/.tmux.conf如果仍无效强制在openrig脚本中设置tmux send-keys -t openrig:0.1 TERMscreen-256color codex chat --model llama3 Enter5.5 问题openrig stop后tmux ls仍显示会话且ps aux | grep node有残留进程这是tmux kill-session未彻底清理子进程的典型表现。tmux只杀会话不杀会话内进程的子进程树。解决方案是在proxy.js结束时显式退出process.on(SIGINT, () { console.log(Shutting down...); process.exit(0); });并在openrig stop脚本中加强制清理tmux kill-session -t openrig 2/dev/null || true pkill -f node ./proxy.js 2/dev/null || true5.6 问题codex login成功但openrig start后仍提示auth token is unavailablecodex-cli的登录 token 存储在~/.codex/auth.json而tmux会话可能以不同用户身份启动如sudo openrig start。解决方案永远不要用 sudo 启动 OpenRig检查~/.codex/auth.json的权限ls -la ~/.codex/auth.json # 正确权限应为 -rw------- (600) chmod 600 ~/.codex/auth.json5.7 问题{detail:the gpt-5.6-sol model is not supported when using codex with a报错这个错误来自后端但gpt-5.6-sol是个不存在的模型名说明codex-cli的--model参数被错误解析。根本原因是codex-cli的参数解析器将--model gpt-5.6-sol误认为--modelgpt-5.6-sol而 OpenRig 的proxy.js用process.argv[2]获取模型名时得到的是gpt-5.6-sol带连字符但后端只认gpt-5.6-sol的别名gpt-5.6。解决方案在
上一篇/下一篇内容由系统自动关联 返回资讯列表 →