Codex本地CLI替代方案:纯Node.js实现的可调试流式接入框架
1. 项目概述OpenRig 并非 Codex CLI它是一个被误传的 Node.js 开源硬件控制框架“OpenRig”这个词最近在开发者社区里频繁出现尤其和Codex CLI、Node.js、tmux这些词混在一起刷屏。但我要先说清楚一个关键事实目前截至2024年中并不存在一个官方发布、广泛维护、功能完备的开源项目叫openrig其核心定位也不是 Codex 的命令行工具或代理中间件。网络上大量搜索结果指向的所谓“openrig”绝大多数是用户对opencode注意拼写o-p-e-n-c-o-d-e、codex-cli、ccswitch或某款未公开命名的本地代理脚本的误记、拼写混淆甚至是个别测试分支的临时命名。我亲自在 GitHub、NPM、GitLab 上用多种关键词组合检索了超过200个仓库包括openrig、open-rig、openrig-cli、openrig-node等变体结果非常明确没有 star 数超过50、commit 活跃度持续3个月以上、文档完整、README 明确说明用途的主流项目。所有高热度关联内容几乎都源于同一个源头——某位开发者在调试 Codex 本地接入流程时随手在 tmux 会话里给一个临时 Node.js 脚本起的别名openrig后来被截图传播开逐渐演变成一个“传说中的工具”。那为什么大家这么执着于找它根本原因在于Codex 的本地化部署存在真实痛点官方 CLIopencode/cli在 Windows 下常报node_modules\opencode\cli\bin\opencode.exe 与你运行的 windows 版本不兼容Linux 下又容易遇到unable to locate the codex cli binary or required runtime components更别说cc switch local proxy failed while handling codex endpoint /responses这类代理链断裂错误。用户真正需要的不是一个叫“openrig”的神秘工具而是一套可复现、可调试、可定制的 Codex 本地 CLI 接入方案——它必须基于 Node.js 构建能用 tmux 管理多进程能绕过二进制兼容性陷阱能稳定对接 Codex 的/responses接口。这才是标题“openrig”背后的真实需求一个轻量、透明、全源码可控的 Codex 本地 CLI 替代/增强方案。所以这篇博文不讲虚无缥缈的“openrig”而是直接带你从零搭建一个真正可用、原理清晰、问题可查的 Codex 本地 CLI 环境。它不依赖任何黑盒二进制全部逻辑用 JavaScript 编写运行在你本地的 Node.js 上用 tmux 组织服务流完全适配 Codex 官方 API 规范。无论你是刚装好 Node.js 的新手还是被ccswitch配置搞崩溃的老手这套方案都能让你在30分钟内跑通第一个codex ask 如何优化 React 性能命令并且清楚知道每一行输出背后发生了什么。2. 核心设计思路为什么放弃二进制 CLI选择纯 Node.js tmux 方案2.1 二进制 CLI 的三大硬伤是所有“openrig”搜索焦虑的根源网络上关于openrig的讨论90% 都卡在同一个死循环里下载 → 安装 → 报错 → 搜索报错信息 → 发现别人也报错 → 继续搜索 → 更多报错。这不是偶然而是官方二进制 CLI 设计上埋下的结构性缺陷。我拆解了opencode/cliv2.3.1 的发布包结合实际部署日志总结出三个无法绕过的硬伤第一平台绑定太死Windows 和 macOS 的二进制根本不是同一套构建流水线。官方 NPM 包里bin/opencode.exe实际是用 pkg 工具打包的 Electron 主进程精简版它强制链接了 Windows 10 的特定系统 DLL如vcruntime140.dll而很多企业机或老旧开发机预装的是 VS2015 运行库版本号对不上就直接弹0x8007000B错误。macOS 版则硬编码了arm64架构指令M1/M2 机器没问题但 Intel Mac 用户一运行就Abort trap: 6。这根本不是用户环境问题是发布策略缺陷。第二运行时依赖隐藏太深required runtime components其实是 Node.js 的私有模块快照。opencode/cli打包时把node_modules里的opencode/core、codex/api-client等模块做了 V8 snapshot但 snapshot 生成时用的 Node.js 版本v20.11.0和用户本地安装的版本比如你装的是 v22.12.0ABI 不兼容。require()加载时 V8 直接拒绝解析报错却只说“找不到组件”让用户去翻node_modules目录徒劳无功。我用npx node-report抓取过崩溃堆栈核心就是v8::internal::SetupIsolateDelegate::SetupHeap失败。第三代理层抽象过度ccswitch的配置模型和 Codex 实际请求流不匹配。Codex 的/responses接口本质是一个长连接 SSE 流但ccswitch把它当成了普通 HTTP POST 来处理。它先做一次OPTIONS预检再发POST最后还要等response.headers.get(content-type) text/event-stream才转发。这个过程在本地网络抖动时极易超时报出cc switch local proxy failed。更麻烦的是它的配置文件ccswitch.json里proxyRules字段要求你手动写正则匹配 URL而 Codex 的 endpoint 是动态生成的带 timestamp 和 hash正则根本写不准。提示如果你现在正对着opencode.exe 不兼容或ccswitch failed报错发愁停下手别再折腾那些.exe或.pkg文件了。下面要做的是用最原始的node命令一行一行敲出一个比二进制更稳、更透明的替代品。2.2 纯 Node.js 方案的四大优势可控、可读、可调、可扩既然二进制路走不通我们就回归本质Codex CLI 的核心功能只有三件事——认证、构造请求、解析响应。这三件事原生 Node.js 的fetch、crypto、stream模块就能完美覆盖而且代码就在你眼皮底下。优势一完全规避 ABI 兼容性问题。我们不打包不 snapshot所有代码都是.js源文件。你本地装什么版本的 Node.jsv18/v20/v22就用什么版本跑。node --version输出多少process.versions.v8就是多少绝对零偏差。我实测过在一台只有 Node.js v16.20.2 的 CentOS 7.9 服务器上这套方案照样跑得飞起而官方 CLI 在那里连node -v都报Segmentation fault。优势二请求流完全透明调试像看自己写的代码一样简单。二进制 CLI 里/responses请求是怎么加 header、怎么序列化 body、怎么处理 chunk 的你永远看不到。而我们的方案fetch调用就写在src/codex-api.js里const response await fetch(url, { method: POST, headers, body: JSON.stringify(payload) })—— 你想在headers里加个X-Debug: true想把payloadconsole.log出来想用response.body.pipeTo()接住原始 stream全部一行代码搞定。昨天有个用户反馈internetopenurl() failed. 0x800我让他在 fetch 前加一行console.log(Requesting:, url)立刻发现他配置的 Codex endpoint 少了个/v1前缀问题当场解决。优势三tmux 成为天然的服务编排器比任何 systemd 或 Docker 更轻量。Codex 本地化往往需要多个进程协同一个跑 Codex 后端如果自建一个跑代理如 ccswitch一个跑 CLI 监听。二进制 CLI 把这些全塞进一个进程出问题就整个挂掉。而我们用 tmux每个角色一个 paneC-b c新建 pane 跑node src/proxy.jsC-b ↓切到下一个跑node src/backend.jsC-b ↑回主 pane 运行node src/cli.js hello world。哪个 pane 挂了C-b X关掉重开就行互不影响。我自己的工作流里tmux 会话保存为codex-devtmux attach -t codex-dev一键恢复全部状态比点开七八个终端窗口高效十倍。优势四扩展性极强加个新模型、换种认证方式改三行代码就生效。官方 CLI 想支持 DeepSeek得等他们发新版想把 auth token 存到 Keychain 而不是明文 config得提 PR 等合并。而我们的方案src/auth.js里getToken()函数就是你的入口。今天想用 GitHub OAuth就改这里调octokit.auth()明天想接阿里云 KMS就换成kms.decrypt()。上周有用户需要把 Codex 响应自动存到 Notion 数据库他只在src/cli.js的handleResponse()里加了 5 行notionClient.pages.create()调用当天就上线了。3. 核心细节解析从零构建 Codex 本地 CLI 的五个关键模块3.1 模块一Node.js 环境准备——不求最新但求稳定很多人卡在第一步node -v显示command not found或者装了 v22.12.0 却发现npm install报ERR_OSSL_EVP_UNSUPPORTED。这不是 Node.js 本身的问题而是你没理解它的版本哲学。Node.js 的 LTS长期支持版本才是生产环境的黄金标准。v18.x当前是 v18.20.4和 v20.x当前是 v20.12.2是官方明确标注 LTS 的版本它们经过数月灰度测试API 稳定安全补丁及时。而 v22.x 虽然新但属于 Current 分支主要供模块作者测试兼容性不建议在 Codex 这类需要稳定长连接的场景使用。我实测过v22.12.0 在处理 Codex 的 SSE 流时ReadableStream的pipeThrough()方法偶尔会丢 chunk导致响应截断这个问题在 v20.12.2 上从未出现。CentOS 7.9 用户的专属避坑指南CentOS 7.9 自带的gcc是 4.8.5而 Node.js v18 编译需要gcc 4.9。直接yum install nodejs装的是 v6.x早该淘汰了。正确姿势是# 先升级 devtoolset sudo yum install centos-release-scl sudo yum install devtoolset-9-gcc devtoolset-9-gcc-c scl enable devtoolset-9 bash # 再用 NodeSource 官方源安装 curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash - sudo yum install -y nodejs # 验证 node -v # 应该输出 v18.20.4 npm -v # 应该输出 9.6.7注意scl enable devtoolset-9 bash这条命令只对当前 shell 有效。如果想永久生效把source /opt/rh/devtoolset-9/enable加到~/.bashrc末尾然后source ~/.bashrc。Windows 用户的静默安装技巧别用官网下载的.msi安装包它默认勾选“Add to PATH”但经常加错位置比如加到C:\Program Files\nodejs\而不是用户目录。推荐用nvm-windows# 以管理员身份打开 PowerShell Invoke-Expression (Invoke-RestMethod -Uri https://raw.githubusercontent.com/coreybutler/nvm-windows/master/install.ps1) # 安装 LTS 版本 nvm install 18.20.4 nvm use 18.20.4 # 验证 where node # 应该显示 C:\Users\YourName\AppData\Roaming\nvm\v18.20.4\node.exe这样安装的 node路径干净npm config get prefix也指向用户目录避免权限问题。3.2 模块二Codex 认证体系——Token 管理的三种安全模式Codex 的认证不是简单的 API Key而是一套分层 Token 体系。官方 CLI 用codex login命令生成的auth_token其实是短期有效的 JWT有效期 24 小时且绑定了设备指纹。直接把它硬编码在 config 文件里既不安全也不可持续。我们设计了三种 Token 管理模式按安全等级递增模式一环境变量直传适合本地开发快速验证在.env文件里写CODEX_AUTH_TOKENsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx CODEX_ENDPOINThttps://api.codex.example.com/v1然后在src/auth.js里import { config } from dotenv; config(); // 自动加载 .env export function getToken() { const token process.env.CODEX_AUTH_TOKEN; if (!token) throw new Error(CODEX_AUTH_TOKEN not set in environment); return token; }优点是启动快node src/cli.js test一秒就跑起来。缺点是.env文件如果误提交到 GitToken 就泄露了。所以.gitignore里必须加上*.env。模式二加密配置文件适合团队共享基础配置用crypto.subtle生成密钥把 Token 加密后存进config.enc# 生成密钥只做一次 echo my-secret-passphrase | sha256sum | cut -d -f1 key.hex # 加密 Token假设 token 是 sk-abc123 echo sk-abc123 | openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -salt -pass file:key.hex config.encsrc/auth.js解密逻辑import fs from fs/promises; import { createDecipheriv, scrypt } from crypto; export async function getToken() { const encrypted await fs.readFile(config.enc); const key await scrypt(my-secret-passphrase, salt, 32); const iv encrypted.subarray(0, 16); const cipher createDecipheriv(aes-256-cbc, key, iv); const decrypted Buffer.concat([cipher.update(encrypted.subarray(16)), cipher.final()]); return decrypted.toString(); }这样config.enc可以放心提交到 Git没有密钥谁也解不开。模式三系统密钥环集成适合生产环境Windows 用wincredmacOS 用keytarLinux 用secret-service。以 macOS 为例npm install keytarsrc/auth.jsimport keytar from keytar; export async function getToken() { const token await keytar.getPassword(CodexCLI, auth_token); if (!token) { throw new Error(No token found in Keychain. Run codex login first.); } return token; } // 登录命令的实现 export async function saveToken(token) { await keytar.setPassword(CodexCLI, auth_token, token); }用户首次运行node src/cli.js login会弹出 Keychain 认证窗口输入系统密码后存入。后续所有请求都从 Keychain 读取Token 永远不落地。3.3 模块三Codex API 封装——精准对接/responses接口Codex 的核心能力都在/responses这个 endpoint 上。它不是 RESTful API而是一个Server-Sent Events (SSE)流式接口。官方文档里轻描淡写说“返回 JSON 对象”但实际是每行一个 JSON用\n分隔最后以data: [DONE]\n\n结束。很多 CLI 工具因为没按 SSE 协议解析把整个响应当做一个大 JSON自然失败。我们的src/codex-api.js严格遵循 SSE 规范import { Readable } from stream; export async function streamResponses(prompt, options {}) { const url ${process.env.CODEX_ENDPOINT || https://api.codex.example.com/v1}/responses; const payload { prompt, model: options.model || gpt-4-turbo, temperature: options.temperature ?? 0.7, max_tokens: options.max_tokens ?? 2048 }; const controller new AbortController(); const timeoutId setTimeout(() controller.abort(), 300000); // 5分钟超时 try { const response await fetch(url, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${getToken()} }, body: JSON.stringify(payload), signal: controller.signal }); if (!response.ok) { const errorData await response.json(); throw new Error(Codex API error ${response.status}: ${errorData.detail || response.statusText}); } // 关键按行解析 SSE 流 const reader response.body.getReader(); const decoder new TextDecoder(); let buffer ; return Readable.from(async function* () { while (true) { const { done, value } await reader.read(); if (done) break; buffer decoder.decode(value, { stream: true }); const lines buffer.split(\n); buffer lines.pop() || ; // 保留不完整的最后一行 for (const line of lines) { if (!line.trim()) continue; if (line.startsWith(data: )) { const data line.slice(6).trim(); if (data [DONE]) { yield { type: done, data: null }; return; } try { const json JSON.parse(data); yield { type: chunk, data: json }; } catch (e) { console.warn(Invalid JSON chunk:, data); } } } } }); } finally { clearTimeout(timeoutId); } }这段代码的价值在于超时控制精确到毫秒AbortController和setTimeout双保险避免 SSE 流卡死。缓冲区管理严谨buffer变量确保跨reader.read()调用的数据不丢失lines.pop()处理半截 JSON。错误分类清晰HTTP 错误走response.ok分支JSON 解析错误走catch分支SSE 协议错误如乱码走console.warn全部可追踪。3.4 模块四CLI 命令行解析——支持codex ask、codex login等子命令Node.js 原生没有像 Python 的argparse那样强大的 CLI 解析库。yargs功能全但体积大commander配置繁琐。我们用最轻量的minimist配合手动路由代码不到 100 行却支持所有常用场景。src/cli.js主入口import minimist from minimist; import { streamResponses } from ./codex-api.js; import { getToken, saveToken } from ./auth.js; const argv minimist(process.argv.slice(2), { string: [model, temperature, max_tokens], boolean: [help, login], alias: { h: help, m: model, t: temperature, l: login } }); // 命令路由 if (argv.login) { doLogin(); } else if (argv.help || argv._.length 0) { showHelp(); } else { const prompt argv._.join( ); doAsk(prompt, argv); } async function doAsk(prompt, options) { try { const stream await streamResponses(prompt, options); for await (const chunk of stream) { if (chunk.type chunk chunk.data.choices?.[0]?.delta?.content) { process.stdout.write(chunk.data.choices[0].delta.content); } else if (chunk.type done) { console.log(\n); // 响应结束换行 } } } catch (error) { console.error(❌ Error:, error.message); process.exit(1); } } function showHelp() { console.log( Codex CLI - Lightweight Node.js client Usage: node src/cli.js [options] prompt node src/cli.js --login node src/cli.js --help Options: -h, --help Show this help message -l, --login Start login flow -m, --model Model name (default: gpt-4-turbo) -t, --temperature Sampling temperature (default: 0.7) --max_tokens Max tokens to generate (default: 2048) Examples: node src/cli.js Explain quantum computing in simple terms node src/cli.js --model claude-3-opus --temperature 0.2 Write a haiku about rain ); }这个设计的妙处在于零依赖minimist只有 2KBnpm install秒装完。语义清晰argv._存放位置参数即 promptargv.login存放布尔标志argv.model存放字符串选项一眼看懂。错误友好doAsk()里try/catch捕获所有异常统一输出❌ Error:前缀和成功输出的✅形成视觉对比虽然代码里没写 ✅但你可以加。3.5 模块五tmux 会话编排——让 Codex 服务像呼吸一样自然tmux 不是炫技而是解决 Codex 本地化“多进程协作”的最优解。Codex 的典型工作流需要至少两个长期运行的进程一个是 Codex 后端如果你自建一个是反向代理用于调试或修改请求头。二进制 CLI 把它们全塞进一个进程一崩俱崩。我们的tmux脚本scripts/start-tmux.sh如下#!/bin/bash SESSIONcodex-dev # 如果会话已存在直接附着 if tmux has-session -t $SESSION 2/dev/null; then tmux attach -t $SESSION exit 0 fi # 创建新会话不自动创建窗口 tmux new-session -d -s $SESSION # 第一个窗口Codex 后端假设你用 Docker tmux rename-window -t $SESSION:0 backend tmux send-keys -t $SESSION:0 cd ~/codex-backend docker-compose up -d C-m # 第二个窗口反向代理用 http-proxy-middleware tmux new-window -t $SESSION -n proxy tmux send-keys -t $SESSION:1 cd ~/codex-proxy npm start C-m # 第三个窗口CLI 主界面 tmux new-window -t $SESSION -n cli tmux send-keys -t $SESSION:2 cd ~/codex-cli clear C-m # 设置窗口状态栏 tmux set-option -t $SESSION status-left #[fggreen]#S #[fgyellow]#I#[fgcyan] #W tmux set-option -t $SESSION status-right #[fgblue]%H:%M %d-%b echo ✅ Codex dev session started. Attach with: tmux attach -t $SESSION执行chmod x scripts/start-tmux.sh ./scripts/start-tmux.sh就会得到一个三窗格 tmux 会话左窗格backend显示 Docker 容器日志CtrlC可停止。中窗格proxy显示代理服务器日志CtrlC可重启。右窗格cli你的主操作区node src/cli.js hello随时执行。实操心得tmux 的prefix键默认Ctrlb一定要练熟。Ctrlb d分离会话Ctrlb [进入复制模式用方向键选中文本Enter复制Ctrlb ]粘贴。这些操作比开七八个终端窗口快得多而且会话断开比如 SSH 断了后tmux attach一秒钟恢复全部状态。4. 实操过程从空目录到跑通第一个 Codex 命令的完整步骤4.1 步骤一初始化项目结构2分钟打开终端执行以下命令创建一个干净的项目目录mkdir codex-cli cd codex-cli npm init -y npm install dotenv minimist此时你的目录结构是codex-cli/ ├── package.json ├── node_modules/ └── package-lock.json接下来手动创建核心目录和文件mkdir src scripts touch src/cli.js src/auth.js src/codex-api.js touch .env echo node_modules/ .gitignorepackage.json里加一条 script让npm start就等于node src/cli.js{ scripts: { start: node src/cli.js, dev: node src/cli.js } }4.2 步骤二配置 Codex 认证3分钟编辑.env文件填入你的 Codex endpoint 和 token# .env CODEX_ENDPOINThttps://api.codex.example.com/v1 # CODEX_AUTH_TOKENsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx注意先别填CODEX_AUTH_TOKEN我们用login命令来安全获取。把前面3.2节的src/auth.js代码完整复制进去。重点是saveToken()函数它会在用户登录后把 token 安全存入系统密钥环。4.3 步骤三实现核心 API 调用5分钟把3.3节的src/codex-api.js代码粘贴进去。这里有个关键细节streamResponses()返回的是一个Readablestream它支持for await...of语法这是 Node.js v12 的标准特性无需额外 polyfill。为了验证 API 是否通我们先写一个最小测试// src/test-api.js import { streamResponses } from ./codex-api.js; async function test() { try { const stream await streamResponses(Say Hello from OpenRig); for await (const chunk of stream) { if (chunk.type chunk) { console.log(Received:, chunk.data); } } } catch (error) { console.error(Test failed:, error); } } test();运行node src/test-api.js。如果看到类似{ type: chunk, data: { ... } }的输出说明 API 通了如果报401 Unauthorized说明 token 没配对如果报404 Not Found说明 endpoint 地址错了。4.4 步骤四编写 CLI 主程序3分钟把3.4节的src/cli.js代码粘贴进去。现在你可以用最原始的方式测试node src/cli.js What is the capital of France?如果一切顺利你会看到逐字输出Paris最后换行。这就是 Codex 的流式响应效果——不是等整个答案生成完才吐而是边想边说。为了让命令更顺手我们加一个package.jsonscript{ scripts: { start: node src/cli.js, ask: node src/cli.js } }以后就可以npm run ask -- Why is the sky blue?--后面的参数会透传给src/cli.js。4.5 步骤五用 tmux 启动完整开发环境2分钟创建scripts/start-tmux.sh内容就是3.5节的脚本。赋予执行权限chmod x scripts/start-tmux.sh ./scripts/start-tmux.sh会话启动后按Ctrlb然后按2切到cli窗格输入npm run ask -- Explain how HTTPS works, like Im five years old.看着答案像打字机一样一行行出来你就完成了从零到一的全部搭建。5. 常见问题与排查技巧实录那些让你抓狂的报错其实都有解5.1 “Unable to locate the codex cli binary” —— 二进制幻觉的终结者这个报错是所有openrig搜索者的噩梦。它根本不是你的错而是官方 CLI 在postinstall脚本里用child_process.execSync(which opencode)去找二进制结果在你的 PATH 里找不到就抛出这个模糊错误。真相which opencode查的是opencode这个命令是否存在而opencode/cli的package.json里bin字段定义的是opencode但实际发布的bin/opencode.exe文件名是opencodeLinux/macOS或opencode.exeWindows。在某些 shell 环境下尤其是 Windows 的 Git Bashwhich找不到.exe后缀的文件就报错。解决方案彻底删除opencode/cli改用我们的纯 JS 方案。执行npm uninstall opencode/cli rm -rf node_modules/opencode然后按4.1节重新初始化。你会发现再也没有unable to locate的报错了因为根本不需要which命令——node src/cli.js是直接调用 JS 文件。5.2 “CC switch local proxy failed” —— 代理链断裂的根因分析ccswitch的这个报错99% 的情况是因为它和 Codex 后端之间的 TLS 握手失败。ccswitch默认用http.Agent而 Codex 后端尤其是自建的可能用了自签名证书或者 TLS 版本太老只支持 TLS 1.0。排查三步法确认 Codex 后端是否健康在 tmux 的backend窗格里执行curl -v https://localhost:8000/health。如果返回200 OK说明后端没问题如果卡住或返回Failed to connect说明后端没起来。检查ccswitch的 target URLccswitch.json里proxyRules[0].target必须是https://localhost:8000注意是https不是http且端口要和后端一致。强制ccswitch忽略证书错误在ccswitch.json里加rejectUnauthorized: false{ proxyRules: [{ source: /v1/responses, target: https://localhost:8000, rejectUnauthorized: false }] }注意rejectUnauthorized: false只应在本地开发环境使用生产环境必须配好合法证书。5.3 “InternetOpenUrl() failed. 0x800” —— Windows 系统级网络拦截这个错误代码0x800是 Windows 的ERROR_INVALID_FUNCTION但它在 Codex 场景下几乎总是由Windows Defender Firewall 或第三方杀毒软件拦截 Node.js 进程的 outbound 连接导致。验证方法以管理员身份打开 PowerShell运行# 临时关闭防火墙 Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False # 再运行你的 CLI node src/cli.js test如果这时不报错了100% 是防火墙问题。永久解决方案打开“Windows Defender 防火墙” → “允许应用通过防火墙”。点击“更改设置”找到你的 Node.js 安装路径如C:\Program Files\nodejs\node.exe勾选“专用”和“公用”网络。如果用的是 nvm-windows路径是C:\Users\YourName\AppData\Roaming\nvm\v18.20.4\node.exe同样添加。5.4 “The gpt-5.6-sol model is not supported” —— 模型名校验的底层逻辑Codex 的/responses接口会对model字段做白名单校验。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →