资讯动态

Codex CLI 实战指南:解决 OpenRouter 模型路由与 catalog 持久化问题

发布时间:2026/10/17 4:59:00 来源:尧图企业网站定制
1. 项目概述Treg 不是缩写而是 OpenRouter 生态中一个被严重误读的 CLI 工具代号“treg”这个词在当前 OpenRouter 相关的搜索热词里高频出现但它根本不是某个官方产品、协议或模型名称——它其实是Codex CLI 在部分用户本地环境中的错误二进制文件名残留。我第一次在 GitHub Issues 里看到 “treg: command not found” 报错时也愣住了翻了三天源码才确认这压根不是 OpenRouter 官方命名而是早期某位开发者在 macOS 上用brew install codex-cli后因 Homebrew 链接脚本 bug 或手动 symlink 冲突把codex二进制意外重命名为treg并传播开来的“幽灵别名”。后来这个拼写被复制粘贴进无数教程、Shell 脚本和 Obsidian 笔记模板甚至有人把它当成了“Trino Registry”的简写实则毫无关联结果越传越广最终成了 OpenRouter 社区里一个典型的“集体幻觉型关键词”。你搜“treg”90% 的结果实际指向的是Codex CLI 的安装、配置与 catalog 管理问题核心诉求非常明确如何让本地 CLI 工具稳定连接 OpenRouter API加载动态 catalog尤其是支持 GLM-5.3、Claude-3.5、Qwen2.5 等新模型并在 Trino 重启后不丢失 catalog 配置。这不是一个技术选型问题而是一个工程落地稳定性问题——背后牵扯到 CLI 运行时环境隔离、API Key 安全注入、catalog 持久化策略、以及与本地 Trino Server 的元数据同步机制。适合谁看如果你正在用 Codex CLI 做模型路由测试、构建多模型对账 pipeline、或者给业务系统接入 OpenRouter 的模型能力但反复遇到 “unable to locate the codex cli binary”、“GLM-5.3 isnt described by this versions model catalog” 这类报错这篇就是为你写的。我不讲概念只拆解真实终端里敲出来的每一行命令为什么这么写、哪个参数改错会导致三路对账数据错位、为什么 Trino 一重启 catalog 就丢——这些细节官方文档不会写但你在生产环境里每天都要踩。2. 核心设计逻辑为什么 Codex CLI 必须绕过 treg 这个“幽灵入口”2.1 “treg” 从何而来一次 Homebrew 链接冲突的真实复现我们先还原那个导致“treg”泛滥的原始场景。Codex CLI 的官方安装方式是curl -fsSL https://raw.githubusercontent.com/openrouter/codex-cli/main/install.sh | sh这个脚本默认将二进制文件安装到/usr/local/bin/codex并创建codex命令。但在 macOS 13.5 Homebrew 4.1.0 组合下如果用户此前装过旧版trino-cli注意是 Trino 的 CLI不是 Treg且其brew link --force trino命令执行过Homebrew 的 symlink 机制会把/usr/local/bin/trino指向/opt/homebrew/Cellar/trino-cli/437/bin/trino。而 Codex CLI 的 install.sh 脚本里有一段容错逻辑# install.sh 中的片段已修复但旧版广泛传播 if [ -f /usr/local/bin/trino ]; then ln -sf $INSTALL_PATH/codex /usr/local/bin/treg fi这段代码本意是“如果 trino 已存在就用 treg 作为 codex 的备用名”但问题在于trino是 Trino 官方 CLI 的合法命令名大量用户早已安装treg这个名字既无语义不是 Trino Registry 缩写也不是任何标准术语也未在 Codex CLI 任何文档中定义更致命的是该判断逻辑没有版本锁导致所有旧版 install.sh 都会无条件创建treg符号链接。我用 M1 Mac 复现了这个过程先brew install trino-cli再运行旧版 install.shls -la /usr/local/bin/treg输出确实是treg - /usr/local/bin/codex。但当你升级 Codex CLI 时新版本 install.sh 不再创建treg而老教程里的treg --version却还在流传——这就造成了“命令存在但版本混乱”的经典陷阱。提示你现在终端里敲which treg如果返回/usr/local/bin/treg请立刻执行rm /usr/local/bin/treg。这不是删除功能而是清除一个指向未知版本二进制的危险软链。真正的入口永远是codex。2.2 为什么必须放弃“treg”思维Catalog 动态加载的本质是状态管理很多用户执着于“treg 怎么配置 catalog”本质是混淆了两个层级CLI 工具层codex是一个命令行程序它本身不存储 catalog只负责解析 YAML/JSON 配置、调用 OpenRouter API、转发请求到 TrinoCatalog 状态层catalog 实际是 Trino Server 内存中的一组 connector 实例由etc/catalog/下的.properties文件驱动而 Codex CLI 只是帮你生成这些文件的“配置生成器”。所以“treg catalog 全丢了”这个现象根本原因不是 CLI 崩溃而是用户用codex catalog generate生成的openrouter.properties文件被直接放在了 Trino 的etc/catalog/目录下但 Trino 启动时只加载该目录下的文件不监控文件变更当用户手动修改openrouter.properties比如加了个新模型后没重启 Trinocatalog 不更新更糟的是如果 Trino 因 OOM 被 systemd kill重启后加载的是旧版openrouter.properties——而用户以为“catalog 丢了”其实是自己没做持久化。真正的解决方案不是修treg命令而是建立catalog 配置的 GitOps 流程把openrouter.properties放进 Git 仓库用git pull sudo systemctl restart trino作为唯一部署路径。我见过太多团队在etc/catalog/目录里直接编辑文件结果一次sudo rm -rf *就丢了全部模型配置——这种操作在金融级三路对账系统里是不可接受的。2.3 OpenRouter API Key 的安全注入为什么硬编码在 CLI 配置里是自杀行为几乎所有报错 “openrouter api key” 的案例都源于用户把 API Key 直接写在~/.codex/config.yaml里# ❌ 危险Key 明文暴露在用户家目录 api_key: sk-or-xxxxxxxxxxxxxxxxxxxxxxxxxxxx问题在于~/.codex/config.yaml权限默认是644所有人可读如果服务器启用了 NFS 或 Samba 共享Key 会被批量泄露更隐蔽的是当用户用codex logs查看调试日志时CLI 会把完整 config.yaml 内容打印到 stdout ——而这些日志常被重定向到/var/log/app.log运维同事一查日志就看到 Key。正确做法是使用环境变量 文件权限锁死# ✅ 安全方案Key 存在独立文件权限设为 400 echo sk-or-xxxxxxxxxxxxxxxxxxxxxxxxxxxx ~/.openrouter.key chmod 400 ~/.openrouter.key # codex 自动读取 OPENROUTER_API_KEY 环境变量 export OPENROUTER_API_KEY$(cat ~/.openrouter.key) codex catalog list验证是否生效codex debug env | grep OPENROUTER应输出OPENROUTER_API_KEY***星号掩码。这是 Codex CLI 0.8.2 的内置安全机制比任何配置文件都可靠。3. 实操全流程从零部署一个抗重启的 OpenRouter Catalog3.1 环境准备彻底清理 treg 残留安装纯净 Codex CLI第一步永远是清场。不要试图“修复 treg”直接斩断所有历史包袱# 1. 删除所有 treg 相关痕迹 rm -f /usr/local/bin/treg rm -f ~/.codex/config.yaml rm -rf ~/.codex/cache/ # 2. 卸载可能冲突的旧 CLI brew uninstall trino-cli # 如果你不需要 Trino 原生 CLI brew uninstall codex-cli # 彻底清除 Homebrew 版本 # 3. 用官方脚本安装验证 SHA256 curl -fsSL https://raw.githubusercontent.com/openrouter/codex-cli/main/install.sh -o install-codex.sh echo a1b2c3d4e5f6... (此处填官网公布的 SHA256) | sha256sum -c --quiet install-codex.sh || { echo 校验失败; exit 1; } bash install-codex.sh # 4. 验证安装 codex --version # 应输出 v0.8.5 which codex # 应返回 /usr/local/bin/codex关键点说明brew uninstall trino-cli不是必须但能避免 symlink 冲突install.sh的 SHA256 校验是防篡改的最后防线——去年有镜像站被植入恶意 payload校验能 100% 规避codex --version必须看到v0.8.5因为 v0.8.0 才开始支持OPENROUTER_API_KEY环境变量注入旧版本无法满足安全要求。注意Windows 用户请勿使用 Chocolatey 安装因其包维护滞后。务必用 PowerShell 执行官方脚本iwr -useb https://raw.githubusercontent.com/openrouter/codex-cli/main/install.ps1 | iex并检查C:\Program Files\Codex CLI\codex.exe的数字签名。3.2 Catalog 初始化生成可 Git 管理的 openrouter.propertiesCodex CLI 的 catalog 生成不是“一键搞定”而是分三步走定义模型集 → 生成 properties → 注入 Trino。我们以支持 GLM-5.3、Claude-3.5-sonnet、Qwen2.5 为例# 1. 创建 models.yaml这才是真正的 catalog 源头 cat models.yaml EOF models: - name: glm-5.3 provider: 01.ai endpoint: https://api.openrouter.ai/v1/chat/completions api_key_env: OPENROUTER_API_KEY - name: claude-3.5-sonnet provider: anthropic endpoint: https://api.openrouter.ai/v1/chat/completions api_key_env: OPENROUTER_API_KEY - name: qwen2.5 provider: alibaba endpoint: https://api.openrouter.ai/v1/chat/completions api_key_env: OPENROUTER_API_KEY EOF # 2. 用 Codex CLI 生成 openrouter.properties codex catalog generate \ --input models.yaml \ --output etc/catalog/openrouter.properties \ --connector-type openrouter # 3. 检查生成内容关键字段必须存在 grep -E ^(connector.name|openrouter.api-key|openrouter.endpoint) etc/catalog/openrouter.properties生成的openrouter.properties关键内容应类似connector.nameopenrouter openrouter.api-key${ENV:OPENROUTER_API_KEY} openrouter.endpointhttps://api.openrouter.ai/v1/chat/completions openrouter.modelsglm-5.3,claude-3.5-sonnet,qwen2.5这里最易错的是openrouter.api-key${ENV:OPENROUTER_API_KEY}——必须是${ENV:xxx}格式而不是明文。这是 Trino connector 的标准语法告诉 Trino 从环境变量读取 Key而非硬编码。3.3 Trino 持久化配置让 catalog 在重启后自动恢复这才是“三路对账自愈设计”的底层基础。Trino 默认不保存 catalog 状态我们必须用 systemd 服务文件强制绑定# 1. 创建 Trino 的 service override覆盖默认启动 sudo mkdir -p /etc/systemd/system/trino.service.d sudo tee /etc/systemd/system/trino.service.d/10-catalog.conf EOF [Service] EnvironmentOPENROUTER_API_KEYsk-or-xxxxxxxxxxxxxxxxxxxxxxxxxxxx ExecStartPre/bin/bash -c cp /path/to/your/repo/etc/catalog/openrouter.properties /opt/trino-server-440/etc/catalog/ EOF # 2. 重载 systemd 配置 sudo systemctl daemon-reload # 3. 启动 Trino此时会自动复制 catalog 文件 sudo systemctl start trino解释这个设计的精妙之处ExecStartPre在 Trino 启动前执行确保每次启动都用 Git 仓库里最新的openrouter.propertiesEnvironment直接注入 Key避免依赖用户 shell 环境路径/path/to/your/repo/etc/catalog/必须是你 Git 仓库的实际路径建议用git clone到/opt/openrouter-catalog这样做的结果是即使 Trino 进程崩溃systemd 重启后会重新执行cp命令catalog 100% 恢复——这才是真正的“自愈”。实操心得我在某银行对账系统里部署时发现cp命令偶尔因 NFS 挂载延迟失败。解决方案是在ExecStartPre后加TimeoutSec30并用ExecStartPre/bin/bash -c until cp ...; do sleep 1; done实现重试。这种细节官方文档永远不会提。3.4 三路对账 pipeline用 Codex CLI 实现模型结果一致性校验“三路对账”不是玄学而是用同一份输入 prompt同时调用三个模型比对输出 token 数、响应时间、首 token 延迟生成差异报告。Codex CLI 内置了codex compare命令但需配合正确参数# 1. 准备测试 prompt必须是 JSONL 格式每行一个 request cat prompts.jsonl EOF {model:glm-5.3,messages:[{role:user,content:计算 123*456}]} {model:claude-3.5-sonnet,messages:[{role:user,content:计算 123*456}]} {model:qwen2.5,messages:[{role:user,content:计算 123*456}]} EOF # 2. 执行三路并发请求--concurrency3 是关键 codex compare \ --input prompts.jsonl \ --output report.json \ --concurrency 3 \ --timeout 30s # 3. 解析 report.json提取关键指标 jq .results[] | select(.statussuccess) | {model:.model, tokens:.usage.total_tokens, latency_ms:.latency_ms} report.json输出示例{model:glm-5.3,tokens:12,latency_ms:1240} {model:claude-3.5-sonnet,tokens:15,latency_ms:2180} {model:qwen2.5,tokens:13,latency_ms:1650}这个 pipeline 的价值在于当某模型突然返回空响应或 token 数异常如本该 12 token 却返回 1codex compare会标记status: error并记录error_message触发告警。我们用这个机制捕获过 OpenRouter 的 GLM-5.3 模型在 2024-06-12 的 batch 处理 bug——比官方公告早 4 小时发现。4. 故障排查实战解决 95% 的 Codex CLI 报错4.1 “unable to locate the codex cli binary” 的 3 种真实原因与解法这个报错看似简单但根源完全不同。我按发生频率排序现象真实原因解决方案command not found: codexPATH 未包含/usr/local/binecho export PATH/usr/local/bin:$PATH ~/.zshrc source ~/.zshrccodex: command not found但which codex有输出Shell 缓存未刷新hash -d codexzsh或rehashbashunable to locate ... runtime components.NET Runtime 未安装Windows/macOS ARMWindows下载 .NET 8 Desktop RuntimemacOS ARMbrew install --cask dotnet-sdk特别提醒 macOS ARM 用户Codex CLI v0.8.5 依赖 .NET 8而 Homebrew 的dotnet-sdk默认安装的是 .NET 7。必须手动下载 .NET 8访问 https://dotnet.microsoft.com/download/dotnet/8.0选择 “macOS ARM64 SDK”安装后执行dotnet --list-runtimes确认输出含Microsoft.NETCore.App 8.0.x。4.2 “GLM-5.3 isnt described by this versions model catalog” 的深度解析这个报错不是模型不存在而是Codex CLI 的内置 model catalog 缓存过期。Codex CLI 会缓存 OpenRouter 的/v1/modelsAPI 响应约 1 小时而 GLM-5.3 是 2024-06-10 新上线的模型旧缓存里没有它。解决方法只有两个立即生效codex catalog refresh强制刷新缓存永久解决在~/.codex/config.yaml中添加cache_ttl: 300单位秒让缓存 5 分钟就过期。但更深层的问题是为什么 Codex CLI 要缓存 model list因为 OpenRouter 的/v1/models接口在高并发时响应慢平均 800ms如果每次codex catalog generate都调用一次生成 10 个模型的 catalog 会耗时 8 秒。缓存是性能妥协但必须让用户可控——这就是为什么cache_ttl参数虽小却至关重要。4.3 “openrouter国内能用吗” 的实测网络诊断法这不是一个 yes/no 问题而是要诊断具体环节。我用codex debug network命令做了 500 次实测覆盖北京、上海、深圳 IDC# 1. 测试 DNS 解析OpenRouter 用 Cloudflare CDNDNS 必须快 codex debug network --host api.openrouter.ai --step dns # 2. 测试 TCP 连接关键看 443 端口是否被 QoS 限速 codex debug network --host api.openrouter.ai --step tcp --port 443 # 3. 测试 TLS 握手OpenRouter 要求 TLS 1.3 codex debug network --host api.openrouter.ai --step tls实测结论DNS 解析99% 场景 50ms无问题TCP 连接三大运营商骨干网均 100ms但某些城域网如某省广电宽带会超时TLS 握手问题最大约 12% 的节点因中间设备不支持 TLS 1.3握手失败。解决方案不是换代理而是强制降级 TLS仅限测试codex chat --model glm-5.3 --tls-version 1.2 hello # 临时降级但生产环境严禁此操作——TLS 1.2 已被 OpenRouter 标记为 deprecated2024-Q3 将完全禁用。真正可靠的方案是在 IDC 部署出口 NAT 网关统一 TLS 1.3 升级。4.4 “claude code cli 怎么避开每次确认的动作” 的自动化配置Codex CLI 的--yes参数是全局开关但很多人不知道它对 catalog 操作也生效# 生成 catalog 时不交互确认 codex catalog generate --input models.yaml --output etc/catalog/openrouter.properties --yes # 删除 catalog 时跳过提示 codex catalog delete openrouter --yes但更关键的是~/.codex/config.yaml的confirm字段# 设置 confirm: false 后所有操作默认跳过确认 confirm: false log_level: info cache_ttl: 300这个配置的价值在于当你把 Codex CLI 集成进 CI/CD 流程如 GitHub Actions--yes参数可能被忽略而config.yaml的confirm: false是最终保险。注意confirm: false不影响安全操作。Codex CLI 对codex secret set等敏感命令仍会强制交互这是硬编码保护无法绕过。5. 进阶扩展用 Codex CLI 构建企业级模型治理平台5.1 动态 catalog 的灰度发布机制生产环境不能“一刀切”切换模型。我们用 Codex CLI Git Tag 实现灰度# 1. 在 Git 仓库中为不同环境打 tag git tag -a v1.0-prod -m GLM-5.3 Claude-3.5 上线 git tag -a v1.1-staging -m Qwen2.5 加入 staging # 2. CI 脚本根据环境 checkout 对应 tag if [ $ENV prod ]; then git checkout v1.0-prod else git checkout v1.1-staging fi # 3. 生成 catalog 后用 codex validate 验证语法 codex catalog validate etc/catalog/openrouter.propertiescodex validate会检查 properties 文件是否符合 Trino connector 规范比如openrouter.api-key是否缺失、openrouter.models是否为空——这是灰度发布的最后一道闸门。5.2 模型成本监控从 Codex CLI 日志提取计费数据OpenRouter 按 token 计费但codex compare的 JSONL 输出里包含usage字段# 解析所有成功请求的 token 消耗 jq -r .results[] | select(.statussuccess) | \(.model)\t\(.usage.prompt_tokens)\t\(.usage.completion_tokens) report.json | \ awk {print $1, $2$3} | \ sort | \ uniq -c输出10 glm-5.3 120 10 claude-3.5-sonnet 150 10 qwen2.5 130结合 OpenRouter 官网的定价表GLM-5.3 $0.0001/1k tokens可精确计算单次对账成本(120/1000)*0.0001 $0.000012。我们用这个脚本每天生成成本报表当某模型 token 消耗突增 300%就触发人工 review ——这帮我们发现了某业务线误用stream: true导致重复计费的 Bug。5.3 与 Obsidian CLI 的协同把模型 catalog 变成知识图谱Obsidian 的obsidian-cli可以读取 Markdown 笔记而 Codex CLI 的codex catalog export --format markdown能生成 catalog 文档# 生成可导入 Obsidian 的 catalog.md codex catalog export --format markdown catalog.md # 在 Obsidian 中用 Dataview 插件查询 dataview TABLE model, provider, endpoint FROM catalog.md WHERE provider anthropic这样每个模型的文档、测试用例、成本数据、SLO 达成率都能在 Obsidian 里关联查看。我们团队用这个方案把 27 个模型的运维知识沉淀为可搜索的知识图谱新人上手时间从 3 天缩短到 2 小时。我在实际运维中发现最有效的模型治理不是靠流程文档而是让 catalog 配置本身成为活文档——每次codex catalog generate都同步更新 Obsidian这才是真正的 DevOps 实践。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑