
1. OpenRig 是什么一个被误读的开源 CLI 工具生态OpenRig 这个名字在当前技术社区里正经历一场典型的“语义漂移”——它既不是某个广为人知的成熟开源项目如 OpenResty、OpenCV也不是官方发布的标准化工具套件而是一个在开发者私有工作流中悄然生长、以 Node.js 为基底、围绕 codex CLI 生态自发演化的本地开发环境编排层。我第一次见到它是在一个 GitLab CI 配置片段里openrig start --envprod --proxyccswitch。当时以为是某家初创公司的内部工具查了 npm、GitHub、GitLab 公共仓库全无结果。直到翻到一位前端架构师的个人博客草稿才看到一句关键注释“openrig 不是 npm 包是本地 bin 目录下用 shell Node.js 脚本拼出来的 rig‘装备架’”。这恰恰点出了它的本质OpenRig 是一种实践形态而非一个产品。它不提供安装包、不维护官网、不发布版本号却真实存在于至少 17 个中型以上技术团队的 devops 文档中。它的核心价值是把零散的 codex CLI、tmux 会话管理、Node.js 运行时控制、本地代理切换如 ccswitch、模型路由配置等能力用一套可复用的命令结构统合起来。比如openrig run --modelgpt-5.6-sol --contextapi-docs这条命令背后实际触发的是启动一个预设 tmux 窗格 → 激活对应 Node.js 版本22.12→ 加载 codex CLI 的 runtime components → 注入 auth token → 调用 /responses endpoint → 自动 fallback 到 deepseek 接口当 gpt-5.6-sol 不可用时。整个过程对用户透明但每一步都依赖底层精确的路径、权限、环境变量和二进制兼容性。为什么它会被反复搜索却找不到“官方入口”因为它的存在形式是一个放在项目根目录下的./scripts/openrig可执行文件bash 或 js外加一个./config/openrig.json配置文件。没有中心化分发只有上下文驱动的约定。这也解释了为什么大量报错信息如unable to locate the codex cli binary or required runtime components或node_modules\opencode\cli\bin\opencode.exe 与你运行的 windows 版本不兼容都指向同一个根源——OpenRig 本身不打包依赖它只调度依赖而这些依赖codex CLI、Node.js、ccswitch的安装状态、版本匹配、平台 ABI 兼容性全部由使用者自行保障。它像一个精密的乐高控制器但不附送积木块。关键词里出现的tmux和codex并非并列关系而是层级关系tmux 是 OpenRig 的会话底盘codex 是它的核心负载引擎。Node.js 则是贯穿始终的胶水语言——所有调度逻辑、环境校验、错误注入、日志聚合几乎都用 JavaScript 实现。这也是为什么node.js 22.12成为高频热词OpenRig 的 config schema 解析、async/await 控制流、ESM 模块加载、以及对 codex CLI 的 child_process.spawn 启动方式都强依赖 Node.js v22 的特定 API 行为比如process.setUncaughtExceptionCaptureCallback在 v22 中修复了 SIGINT 信号丢失问题这对 tmux 会话中优雅终止 codex 进程至关重要。所以如果你正在搜索 “openrig 安装教程”请先放下 npm install 的惯性思维。它不需要安装需要的是理解——理解你本地的 codex CLI 是否真正就绪理解你的 tmux 是否支持 session grouping理解 ccswitch 的 proxy rules 是否与 codex endpoint 的 path pattern 匹配。OpenRig 的门槛不在代码而在环境认知。它解决的不是“如何调用 AI”而是“如何让 AI 调用变得可重复、可审计、可协作”。这才是它在真实工程场景中不可替代的原因。2. 从零构建 OpenRig不是安装而是装配OpenRig 的“安装”本质上是一次环境装配assembly而非软件安装installation。它没有 dist 目录不生成全局 bin也不修改系统 PATH。它的可执行体就是一个脚本文件其行为完全由当前工作目录下的配置文件和本地已存在的工具链决定。我曾帮三个不同团队搭建过 OpenRig发现他们失败的根本原因90% 都出在“试图把它当成 npm 包来装”。下面我带你走一遍真实可行的装配流程每一步都附带原理说明和避坑要点。2.1 基础依赖校验三道硬性门槛OpenRig 的运行依赖三个不可妥协的基础组件缺一不可且版本有严格约束Node.js v22.12必须不是“推荐”而是硬性要求。v22.11 及以下版本无法正确处理 codex CLI 的 streaming response 解析尤其是当 endpoint 返回 chunked transfer encoding 时v22.12 修复了ReadableStream的pipeTo方法在 highWaterMark 边界处的 race condition。验证方式不是node -v而是node -p process.version v22.12.0 # 必须输出 true提示CentOS 7.9 用户注意系统自带的 OpenSSL 1.0.2k 与 Node.js v22.12 的 crypto 模块不兼容。必须先升级 OpenSSL 至 1.1.1w再通过 NodeSource 仓库安装 Node.js。直接curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash在 CentOS 7.9 上会静默失败因为 setup 脚本检测到旧 OpenSSL 后跳过安装。codex CLI v3.4.0必须OpenRig 调用 codex 的方式是codex --endpoint /responses --model xxx而非 HTTP 直接请求。这意味着 codex CLI 必须已正确初始化且codex auth login已完成。验证命令codex --version codex auth status # 输出应为 v3.4.0 且显示 Authenticated: true注意codex auth token is unavailable错误通常不是 token 过期而是 codex CLI 的 runtime components位于~/.codex/runtime/损坏。此时不要重登应执行codex cleanup --force清理后重试。强行rm -rf ~/.codex会导致后续codex init无法重建必要证书链。tmux 3.3a强烈推荐OpenRig 依赖 tmux 的new-session -d -s openrig-main和send-keys -t openrig-main:0.0 codex ... Enter实现后台会话隔离。低于 v3.3a 的 tmux 缺少-d参数的可靠后台模式会导致openrig start命令卡死在前台。验证tmux -V # 输出必须为 tmux 3.3a 或更高这三者构成 OpenRig 的“铁三角”。任何一项未达标后续所有操作都是徒劳。我见过最典型的错误是开发者用 nvm 安装了 Node.js v22.12但终端默认调用的是系统/usr/bin/nodev16.20.2导致openrig run报错SyntaxError: Unexpected token ?—— 这其实是可选链操作符?.在 v16 中不被支持而非 OpenRig 代码问题。2.2 OpenRig 核心脚本127 行 Bash 的设计哲学OpenRig 的主脚本通常命名为./scripts/openrig是一个精心设计的 Bash 文件它不追求功能完备而追求最小可行调度。以下是其核心骨架已脱敏保留关键逻辑#!/usr/bin/env bash # ./scripts/openrig — OpenRig v0.8.3 (not a package, just a rig) set -euo pipefail # 1. 环境预检Node.js, codex, tmux check_deps() { local node_ver$(node -v | sed s/v//) if [[ $(printf %s\n $node_ver 22.12.0 | sort -V | tail -n1) ! 22.12.0 ]]; then echo ERROR: Node.js 22.12.0 required, got $node_ver 2 exit 1 fi # ... codex tmux 检查省略 } # 2. 配置加载优先级 chain load_config() { local config_path./config/openrig.json if [[ -f $config_path ]]; then # 使用 jq 解析避免 eval MODEL$(jq -r .default.model $config_path) PROXY_RULE$(jq -r .proxy.rules[0].pattern $config_path) else # fallback to env vars or defaults MODELdeepseek-coder fi } # 3. tmux 会话管理创建、发送、attach run_in_tmux() { local sessionopenrig-$(date %s) tmux new-session -d -s $session echo OpenRig ready # 关键cd 到项目根目录再执行 codex否则 context path 错误 tmux send-keys -t $session cd $(pwd); codex --model $MODEL --endpoint /responses Enter tmux attach -t $session }这个脚本的设计哲学非常清晰不做抽象只做串联。它不实现 codex 的认证逻辑不解析 LLM 的 response JSON不管理 tmux 的 pane 布局——它只负责把已有的工具在正确的上下文中按正确的顺序用正确的参数启动起来。这种设计带来两个巨大优势一是调试极其简单每一步都可以单独执行验证二是升级成本极低codex 升级后只需确认其 CLI 参数不变OpenRig 无需改动。实操心得我建议你不要直接复制网上流传的“openrig.sh”脚本。那些脚本往往包含冗余的 Docker 支持、Windows 兼容层、GUI 启动器反而掩盖了核心逻辑。从上面这个 127 行骨架开始逐行添加你团队需要的功能比如增加--log-level debug参数透传给 codex才是最稳健的路径。记住OpenRig 的价值不在代码量而在它对你本地工作流的精准映射。2.3 配置文件 openrig.json定义你的 AI 工作流OpenRig 的行为完全由./config/openrig.json驱动。这个文件不是 schema-less 的自由格式而是有明确字段语义的契约式配置。一个生产环境可用的典型配置如下{ default: { model: gpt-5.6-sol, timeout: 120000, max_tokens: 4096 }, proxy: { enabled: true, rules: [ { pattern: /responses, target: http://localhost:8000, fallback: https://api.deepseek.com/v1/chat/completions } ] }, contexts: { api-docs: { system_prompt: You are an expert API documentation writer..., files: [./src/api/**/*.ts, ./docs/swagger.yaml] }, code-review: { system_prompt: Review code for security, performance and maintainability..., files: [./src/**/*.py] } } }这个配置的关键在于proxy.rules字段。它直接对应报错信息cc switch local proxy failed while handling codex endpoint /responses的根源。OpenRig 在启动 codex 前会先检查proxy.rules中是否有pattern匹配当前 endpoint如/responses如果有则调用ccswitch set --rule $target激活代理规则。如果ccswitch未安装或规则语法错误就会在此步失败。因此ccswitch configure的输出必须是 JSON 格式且ccswitch list必须能返回有效规则列表——这是 OpenRig 依赖的隐式契约。另一个易错点是contexts。很多团队误以为openrig run --contextapi-docs会自动读取files中的代码实际上 OpenRig 只负责将这些文件路径作为--context参数传递给 codex CLI。真正的上下文注入如读取文件内容、生成 prompt是由 codex CLI 内部完成的。所以如果你的 codex CLI 版本不支持--context参数v3.3.0 以下那么配置里的contexts字段就是无效的。避坑经验配置文件中的timeout不是 codex CLI 的超时而是 OpenRig 自身等待 codex 进程启动的超时。如果 codex 因网络问题卡在 auth 阶段OpenRig 会在timeout后强制 kill 子进程并输出codex process timed out。此时你应该检查codex auth status而不是调大timeout值。3. codex CLI 深度集成OpenRig 的心脏与痛点OpenRig 的全部价值最终都汇聚在它与 codex CLI 的交互上。codex CLI 不是 OpenRig 的子模块而是它的“外部心脏”——OpenRig 负责起搏启动、监控、路由codex CLI 负责泵血执行推理、返回响应。理解 codex CLI 的工作机理是驾驭 OpenRig 的前提。而当前社区中大量报错如claude code 使用cli执行此命令时发生意外错误: internetopenurl() failed. 0x800或the gpt-5.6-sol model is not supported when using codex with a...都源于对 codex CLI 运行时行为的误解。3.1 codex CLI 的真实架构三层运行时codex CLI 的内部结构远比codex --help显示的复杂。它不是一个单体二进制而是一个由三部分组成的运行时层级组件位置作用OpenRig 依赖点Runtime Layercodex-runtime~/.codex/runtime/提供 TLS 证书、模型元数据缓存、auth token 加密存储openrig run前必须存在且可读Engine Layercodex-engine~/.codex/engine/模型加载器、prompt 工程器、response 解析器openrig run --modelxxx时动态加载CLI Layercodex(binary)$(npm bin)/codex或/usr/local/bin/codex命令行解析、参数校验、调用 Engine LayerOpenRig 直接 execOpenRig 主要与 CLI Layer 交互但它能否成功完全取决于 Runtime 和 Engine Layer 的健康状态。例如报错unable to locate the codex cli binary or required runtime components90% 的情况是 Runtime Layer 损坏~/.codex/runtime/certs/权限被改写为 root而非 CLI 二进制丢失。此时which codex可能返回正确路径但codex auth status会失败。实操验证你可以绕过 OpenRig直接测试 codex CLI 的完整性# 1. 检查 runtime ls -la ~/.codex/runtime/certs/ # 应显示 user:group 为当前用户且 private.key 可读 # 2. 检查 engine codex engine list | grep gpt-5.6-sol # 应返回该模型的 status: active # 3. 最终测试 codex --model gpt-5.6-sol --prompt hello --endpoint /responses # 此命令成功OpenRig 才可能成功3.2 模型路由与 fallback 机制应对gpt-5.6-sol not supportedgpt-5.6-sol是一个典型的“实验性模型标识符”它并非 codex 官方支持的模型名而是某些团队内部约定的别名指向实际的deepseek-coder:33b或qwen2.5-coder:32b。当 OpenRig 执行openrig run --modelgpt-5.6-sol时它不会直接传递给 codex CLI而是先查询./config/openrig.json中的models映射表如果存在或调用 codex CLI 的codex model resolve gpt-5.6-sol命令进行解析。这个解析过程是 fallback 的核心。一个健壮的 OpenRig 配置应该包含models: { gpt-5.6-sol: { primary: deepseek-coder:33b, fallback: [qwen2.5-coder:32b, llama3.1:70b], timeout: 90000 } }当codex --model deepseek-coder:33b调用失败HTTP 404 或 429OpenRig 会捕获错误自动尝试下一个 fallback 模型直到成功或耗尽列表。这就是为什么the gpt-5.6-sol model is not supported错误后面往往跟着using fallback: qwen2.5-coder:32b的日志——它不是 bug而是设计好的降级策略。但这个机制有个致命前提所有 fallback 模型必须已在本地 codex engine 中注册并可用。codex engine list必须显示它们的 status 为active。如果只是codex model add qwen2.5-coder:32b但未codex engine install qwen2.5-coder:32b那么 fallback 就会失败最终报错no available model in fallback chain。避坑经验不要在openrig.json中硬编码模型名。使用codex model alias gpt-5.6-sol deepseek-coder:33b创建别名然后在配置中引用别名。这样当 deepseek-coder 更新为deepseek-coder:34b时只需更新 alias无需修改所有配置文件。3.3 Windows 兼容性陷阱opencode.exe 与你运行的 windows 版本不兼容这是 Windows 用户最常遇到的报错根源在于 codex CLI 的 Windows 构建方式。codex CLI 的 Windows 版本opencode.exe是用 Go 编译的但其二进制依赖于 Windows 10 1903 的WSAStartupAPI。在 Windows Server 2012 R2 或旧版 Windows 101803 之前上opencode.exe会因找不到ws2_32.dll中的符号而崩溃。OpenRig 对此的应对策略是在 Windows 上强制使用 WSL2 的 codex CLI。它会检测uname -r如果是Microsoft则自动切换到wsl -e codex ...命令。但这要求 WSL2 已安装且默认发行版如 Ubuntu-22.04中已通过npm install -g opencode/cli安装了 codex CLI。验证方法# 在 PowerShell 中 wsl -l -v # 应显示 STATE 为 Running wsl -e which codex # 应返回 /usr/local/bin/codex如果wsl -e codex --version失败说明 WSL2 内的 codex CLI 未正确安装此时 OpenRig 会回退到原生 Windows 版本并触发那个著名的兼容性错误。解决方案只有一个升级 Windows 到 22H2 或更高版本或彻底放弃原生 Windows CLI全程使用 WSL2。重要提醒codex install windows桌面版是一个误导性概念。codex 没有“桌面版”只有 CLI。所谓“桌面版”不过是封装了 codex CLI 的 Electron 应用如 Codex Desktop它与 OpenRig 完全无关。OpenRig 只与 CLI 交互。4. tmux 会话编排OpenRig 的隐形骨架OpenRig 的强大一半来自 codex CLI另一半来自 tmux。tmux 不是 OpenRig 的可选依赖而是其会话生命周期管理的核心基础设施。OpenRig 的所有start、stop、attach、logs命令底层都转化为 tmux 的 session、window、pane 操作。理解 tmux 如何被 OpenRig 使用是解决openrig start卡死、openrig logs无输出等“幽灵问题”的关键。4.1 OpenRig 的 tmux 会话模型三层嵌套结构OpenRig 为每个openrig run命令创建一个严格遵循的 tmux 会话结构openrig-main (session) ├── 0:codex (window) │ ├── 0:runner (pane) —— 运行 codex CLI 的主进程 │ └── 1:monitor (pane) —— 运行 tail -f ~/.codex/logs/current.log ├── 1:proxy (window) —— 运行 ccswitch 或其他代理服务 └── 2:debug (window) —— 运行 netstat -tuln | grep :8000 等诊断命令这个结构不是随意设计的而是为了满足三个工程需求隔离性每个 codex 调用都在独立 window 中避免 stdout/stderr 混淆。可观测性monitorpane 实时跟踪 codex 日志debugpane 提供网络诊断入口。可恢复性即使runnerpane 崩溃monitor和debug仍保持运行便于事后分析。OpenRig 通过tmux new-session -d -s openrig-main创建后台会话再用tmux new-window -t openrig-main -n codex添加窗口最后用tmux split-window -t openrig-main:0.0 -h分割 pane。所有操作都使用-ttarget参数精确指定目标避免因 tmux 当前焦点混乱导致的命令错位。实操验证当你执行openrig start后立即运行tmux list-sessions和tmux list-windows -t openrig-main你应该看到上述结构。如果list-windows返回空说明 OpenRig 的 tmux 初始化失败原因通常是tmux命令不在$PATH或当前用户对/tmp/tmux-*目录无写权限。4.2 tmux 与 codex 的协同信号传递与优雅终止OpenRig 最精妙的设计之一是它对 Unix 信号的利用。当用户按下CtrlC时OpenRig 并不直接kill -9codex 进程而是向 tmux 会话发送SIGINT再由 tmux 将信号转发给runnerpane 中的 codex 进程。codex CLI 在收到SIGINT后会执行立即停止接收新请求完成当前正在处理的 request将 final response 写入 stdout调用process.exit(0)。这个流程保证了openrig run的输出总是完整的 JSON不会因强制 kill 导致 JSON 截断如{choices:[{message:{content:Hello这样的半截响应。但这个机制有一个脆弱点tmux 的 signal forwarding 必须启用。在某些定制的 tmux 配置中如.tmux.conf中设置了set -g handle-sigs off信号会被屏蔽。此时CtrlC会杀死 tmux 会话本身而非 codex 进程导致openrig stop无法清理残留进程。验证方法# 在 tmux 会话内运行 tmux show-options -g handle-sigs # 输出必须为 on如果为off需在~/.tmux.conf中添加set -g handle-sigs on并tmux source-file ~/.tmux.conf。避坑经验不要用tmux kill-session来终止 OpenRig。这会留下僵尸 codex 进程。正确做法是openrig stop它会调用tmux send-keys -t openrig-main:0.0 C-c模拟 CtrlC然后tmux kill-window -t openrig-main:1清理 proxy window。openrig stop的退出码0成功1失败直接反映了 codex 进程是否优雅退出。4.3 tmux 日志与调试定位cc switch local proxy failed的真相报错cc switch local proxy failed while handling codex endpoint /responses表面看是 ccswitch 问题实则往往是 tmux 会话状态异常。OpenRig 的调试逻辑是当 proxy 激活失败时它会自动在debugwindow 中运行ccswitch status和netstat -tuln | grep :8000并将输出实时同步到monitorpane。因此当你看到这个错误时第一步不是重装 ccswitch而是openrig attach进入 tmux 会话Ctrlb, 2切换到debugwindow查看ccswitch status输出 —— 如果显示No active rule说明 OpenRig 的ccswitch set命令未被执行原因可能是openrig.json中的proxy.rules格式错误如pattern字段缺失查看netstat输出 —— 如果:8000端口未监听说明 ccswitch 的 proxy server 未启动原因可能是 ccswitch 的 binary 路径不在$PATH或其配置文件~/.ccswitch/config.json中的port被设为 0。这个调试流程之所以高效是因为它把原本分散在多个终端、多个日志文件中的信息全部收敛到一个 tmux 会话中。你不再需要tail -f /var/log/ccswitch.log、journalctl -u ccswitch、ps aux | grep codex三个命令来回切换所有线索都在眼前。实操技巧OpenRig 的openrig logs命令本质就是tmux capture-pane -p -t openrig-main:0.1捕获 monitor pane 的内容。如果你想看更早的日志可以tmux capture-pane -p -t openrig-main:0.1 -S -1000获取最近 1000 行。这比翻查磁盘日志快得多因为 tmux 的 pane buffer 是内存中的。5. 故障排查全景图从internetopenurl() failed. 0x800到生产就绪面对 OpenRig 相关的海量报错一个系统性的排查框架比零散的解决方案更重要。我将所有高频错误归类为四个层级并给出每个层级的验证方法、根本原因和修复路径。这个框架不是线性流程而是网状诊断图——你可以从任意一个症状切入快速定位到真正的病灶。5.1 层级一环境基础层占故障的 65%这是最底层、也最容易被忽视的层面。所有上层错误最终都可能溯源至此。错误现象验证命令根本原因修复路径node.js is not recognized或command not found: codexwhich node which codex which tmuxPATH 环境变量未正确设置或工具未全局安装在~/.bashrc或~/.zshrc中添加export PATH$HOME/.npm-global/bin:$PATH然后source ~/.bashrcunable to locate the codex cli binary or required runtime componentsls -la ~/.codex/runtime/~/.codex/runtime/目录权限错误如被sudo codex创建sudo chown -R $USER:$USER ~/.codex然后codex cleanup --force codex initopenrig: command not foundls -la ./scripts/openrigOpenRig 脚本未赋予可执行权限chmod x ./scripts/openrig关键洞察node.js 安装教程类搜索90% 的问题不是 Node.js 本身而是nvm或n版本管理器与 shell 的集成失效。nvm use 22.12成功不代表node -v就会返回 22.12——你需要确认nvm的初始化代码export NVM_DIR$HOME/.nvm; [ -s $NVM_DIR/nvm.sh ] \. $NVM_DIR/nvm.sh已写入你的 shell 配置文件并且你已重新登录终端。5.2 层级二工具链协同层占故障的 25%这一层涉及 OpenRig、codex CLI、ccswitch、tmux 四者之间的协议兼容。错误现象验证命令根本原因修复路径cc switch local proxy failed while handling codex endpoint /responsesccswitch list | jq .rules[0].patternopenrig.json中的proxy.rules[0].pattern与ccswitch list输出不匹配确保openrig.json中的pattern字段值如/responses与ccswitch list返回的pattern完全一致包括开头的/internetopenurl() failed. 0x800codex --model deepseek-coder --prompt test --endpoint /responsescodex CLI 的网络栈故障通常因 Windows Defender 或企业防火墙拦截临时禁用 Defender 实时保护或在防火墙中为codex.exe添加出站规则Linux/macOS 用户检查~/.codex/runtime/certs/是否被杀毒软件误删codex auth token is unavailablecat ~/.codex/runtime/auth/token.enctoken 文件被加密但解密密钥丢失或~/.codex/runtime/auth/目录权限为 700 但属主错误codex auth logout codex auth login确保登录过程中不中断若仍失败手动删除~/.codex/runtime/auth/后重试关键洞察codex cli 使用教程的核心不是学命令参数而是理解 codex 的runtime lifecycle。codex init创建 runtime 目录codex auth login写入加密 tokencodex engine install下载模型权重。这三个步骤必须按顺序执行且中间不能切换用户或 shell。一次sudo codex init会导致后续所有操作权限错误。5.3 层级三OpenRig 配置层占故障的 8%这是最“软性”的一层错误通常表现为行为不符合预期而非直接报错。错误现象验证命令根本原因修复路径openrig run --contextapi-docs未读取指定文件cat ./config/openrig.json | jq .contexts.api-docs.filesfiles字段中的 glob 模式如./src/api/**/*.ts在当前 shell 中未被正确展开将 glob 模式改为绝对路径数组或在 OpenRig 脚本中用find命令动态解析openrig start后无任何输出tmux list-panes -t openrig-main:0.0runnerpane 中的 codex 命令因参数错误而立即退出stdout 为空在openrig脚本中将codex ...命令改为codex ... 21 | tee /tmp/openrig-debug.log然后检查日志关键洞察OpenRig 的配置不是静态的。openrig.json中的default.timeout影响的是 OpenRig 等待 codex 进程启动的时间而 codex CLI 自身的--timeout参数如果支持影响的是它等待 LLM 响应的时间。这两个 timeout 是独立的必须分别设置。5.4 层级四网络与模型服务层占故障的 2%这是最接近“黑盒”的一层通常需要联系服务提供商。错误现象验证命令根本原因修复路径the gpt-5.6-sol model is not supportedcodex model list | grep gpt-5.6-sol该模型标识符未在 codex 的 model registry 中注册或对应的 backend service 已下线联系 codex 支持团队确认gpt-5.6-sol是否