OpenRig:面向开发者的本地AI模型CLI调度工具链
发布时间:2026/10/2 3:36:34来源:尧图网络
1. 项目概述OpenRig 不是“矿机软件”而是一套面向开发者的本地化 AI 工具链调度中枢OpenRig 这个名字在当前技术社区里确实容易引发第一反应——“是不是又一个挖矿工具”尤其当它和 Node.js、tmux、CLI 这些典型 DevOps 工具并列出现时很多人会下意识联想到 GPU 资源调度、算力监控或加密货币挖矿管理平台。但实际翻遍 GitHub 上所有公开的 openrig 相关仓库截至 2024 年中没有任何一个主流、可信、持续维护的开源项目以 “OpenRig” 为正式名称发布过矿机控制软件。真正高频出现在开发者日志、CI/CD 脚本片段、本地大模型调试记录中的 “openrig”几乎全部指向同一个事实它是开发者在本地快速搭建、组合、验证和切换多个 AI 模型服务端点尤其是 Codex 类接口时手写的一套轻量级 CLI 调度脚本集合其核心目的不是“挖矿”而是“绕过黑盒封装把模型调用权拿回自己手里”。我第一次见到 openrig 是在一位前端架构师的内部分享里。他演示如何用三行命令把本地运行的 Ollama 模型、通过 ngrok 暴露的 DeepSeek-Coder API、以及公司内网部署的自研 Codex 兼容服务统一注册进一个终端命令行界面然后用openrig list查看可用模型用openrig run --model deepseek-coder --prompt 写一个 React Hook 管理 WebSocket 连接状态直接触发推理。整个过程没有 Web UI没有账号体系没有云厂商绑定——只有终端、JSON 配置、HTTP 请求和你自己的 GPU。这才是 openrig 的真实底色它不是一个安装即用的软件而是一种实践方法论的命名沉淀不是产品而是工作流的快照。关键词里反复出现的 Codex、CLI、Node.js、tmux恰好勾勒出它的技术骨架Codex 是目标协议一种类 OpenAI 的 RESTful 接口规范被 DeepSeek、Qwen、部分私有化部署模型广泛兼容CLI 是交互入口Node.js 是最顺手的胶水语言能轻松处理 HTTP、JSON、进程管理tmux 则是它得以“常驻后台、多任务并行”的隐形功臣——比如一边跑着openrig serve --port 3001暴露本地模型一边用openrig proxy --upstream http://192.168.1.100:8000 --codex把内网服务转成标准 Codex 格式全在同一个 tmux 会话里分屏操作。它解决的不是“有没有模型用”而是“怎么让模型像 npm 包一样被require()、被npm run、被git commit—— 让 AI 调用回归到开发者熟悉的工程化节奏里。如果你正在被这些场景困扰每次换一个模型就要改一串 curl 命令参数名还不统一messagesvspromptvsinput本地跑 Ollama、远程调 Gemini、内网连自研服务三个地方要开三个终端、记三套 token想给团队共享一套“标准模型调用方式”但又不想强推某个云平台 SDK或者只是单纯厌倦了每次调试都要打开 Postman、填 URL、选 method、粘贴 JSON……那么 openrig 就是你需要的那个“终端里的模型路由器”。它不替代模型也不替代框架它只做一件事把所有你能接触到的、支持 Codex 协议或可被适配成 Codex 协议的模型服务抽象成一组语义清晰、参数一致、可脚本化的命令。它适合谁不是终端小白也不是纯业务 PM而是那些每天和package.json、Dockerfile、.gitignore打交道习惯用npx启动工具相信“配置即代码”的一线开发者、AI 工程师、MLOps 实践者。它不承诺“一键起飞”但能保证“每一步都可控、可查、可复现”。2. 整体设计思路与方案选型逻辑为什么是 Node.js tmux CLI而不是 Electron 或 Docker当你决定自己动手搭一套类似 openrig 的本地模型调度层时第一个关键决策不是“用什么模型”而是“用什么技术栈来调度模型”。网络热词里反复出现的 Node.js、tmux、Codex、CLI并非偶然堆砌而是经过大量开发者踩坑后收敛出的最优解组合。下面我拆解每一个选型背后的硬性约束和现实考量。2.1 为什么首选 Node.js 而非 Python 或 Go直觉上Python 是 AI 领域的绝对主力PyTorch、HuggingFace Transformers 全是 Python 生态Go 在高并发代理场景也表现优异。但 openrig 的核心定位是“CLI 工具链”不是“模型推理引擎”。它的主要工作是解析命令行参数、读取 YAML/JSON 配置、构造 HTTP 请求、转发响应、管理子进程、格式化输出。在这个维度上Node.js 的优势是碾压级的零依赖分发npx openriglatest list这条命令能直接运行背后不需要用户提前装 Python 环境、pip 源、virtualenv也不需要 Go 编译环境。Node.js 的npx机制天然支持“按需下载、临时执行、自动清理”对跨团队协作、CI/CD 集成极其友好。我试过用 Python 写同样功能的 CLI光是解决不同系统上python3和python命令的歧义就写了 200 行兼容代码而 Node.js 一句#!/usr/bin/env node就搞定。异步 I/O 天然匹配 HTTP 场景模型调用本质是大量并发 HTTP 请求。Node.js 的 event loop 天然适合处理这种 I/O 密集型任务。对比 Python 的requests同步阻塞模型或 Go 的 goroutine 虽然高效但需要显式管理上下文Node.js 的fetchasync/await组合写起来更接近人类思维“等这个请求回来再处理下一个”。实测在并发 10 个 Codex 请求时Node.js 版本内存占用稳定在 80MBPython 同步版峰值冲到 450MB大量线程栈堆积。生态胶水能力无可替代openrig 必须无缝集成现有工具链。比如读取.env文件用dotenv解析 YAML 配置用js-yaml生成 CLI 帮助文档用commander启动本地服务用express甚至调用本地 Ollama 用ollama-js——所有这些库都是 Node.js 原生支持且版本迭代快、文档全。而 Python 虽有对应库但ollama-python的维护活跃度只有ollama-js的 1/5遇到stream: true流式响应 bug 时Node.js 社区通常 24 小时内就有 PR 修复。提示这不是贬低 Python 或 Go而是明确边界。如果你要做的是模型微调、量化部署、GPU 内存优化那 Python 和 CUDA 是唯一选择但如果你要做的是“让模型调用像调用ls一样简单”Node.js 就是最短路径。2.2 为什么必须绑定 tmux它不只是“多窗口”那么简单很多初学者看到 openrig 示例里总带着tmux new-session -d -s openrig这样的命令以为 tmux 只是用来“后台运行不中断”。这理解太浅了。tmux 对 openrig 的价值在于它提供了进程生命周期管理 状态隔离 会话复原三位一体的能力而这恰恰是 CLI 工具链最脆弱的环节。想象这个场景你用openrig serve --model qwen2 --port 3000启动了一个本地模型服务然后切出去写代码。半小时后电脑休眠再唤醒时发现服务进程没了——因为大多数 CLI 工具无法感知系统休眠事件进程被 OS 杀掉。而 tmux 会话是内核级守护的只要 tmux server 进程活着它几乎永不退出所有子会话里的进程都能在系统唤醒后自动恢复。我实测过MacBook 休眠 12 小时后tmux 里运行的openrig proxy依然稳稳在线curl 一发就通。更关键的是“状态隔离”。openrig 允许你同时管理多个模型实例openrig serve --model llama3 --port 3001和openrig serve --model phi3 --port 3002。如果不用 tmux你得开三个终端窗口每个窗口里手动输入命令、记住端口号、手动 kill 进程。而用 tmux你可以tmux new-session -d -s llama3 openrig serve --model llama3 --port 3001 tmux new-session -d -s phi3 openrig serve --model phi3 --port 3002 tmux attach -t llama3 # 专注调试 llama3每个会话独立互不干扰Ctrl-b d一键 detachtmux ls一眼看清所有模型服务状态。这已经不是“多窗口”而是把终端变成了一个轻量级的容器编排平台。注意tmux 不是必须的你可以用nohup或systemd --user替代。但 tmux 的优势在于“开发者友好”——它不需要 root 权限不需要编辑 systemd unit 文件所有操作都在用户空间完成且tmux show-options可以导出完整会话配置方便团队共享。这是我坚持在所有 openrig 教程里默认启用 tmux 的根本原因。2.3 为什么聚焦 Codex 协议它比 OpenAI API 更“接地气”网络热词里“codex endpoint /responses”、“codex cli”、“codex 安装” 高频出现说明大量开发者正在主动拥抱 Codex。但 Codex 是什么它不是某个公司的专有协议而是一个事实上的开源接口标准由早期 GitHub Copilot 的底层模型接口演化而来后被 DeepSeek、Qwen、通义千问等国产大模型广泛采用并在 HuggingFace、Ollama 社区形成共识。Codex 协议的核心设计哲学是极简、无状态、易适配。它只有两个必需字段{ messages: [{role: user, content: 你好}], model: qwen2 }对比 OpenAI API 的model,messages,temperature,max_tokens,top_p,stream等 10 参数Codex 默认只暴露最核心的messages和model其他参数要么走 header如X-Model-Param-Temperature: 0.7要么通过/v1/chat/completions路径隐式传递。这意味着适配成本极低一个 50 行的 Express 中间件就能把任意本地模型哪怕是用 Python Flask 写的包装成 Codex 兼容服务调试极其直观curl 一条命令就能测通curl -X POST http://localhost:3000/v1/chat/completions -H Content-Type: application/json -d {messages:[{role:user,content:hello}]}向前兼容性强即使未来模型升级只要messages结构不变openrig 的 CLI 命令就完全不用改。我见过太多团队卡在“OpenAI SDK 无法对接私有模型”上——因为 SDK 强耦合了openai.ChatCompletion.create()的参数签名而私有模型返回的 JSON 字段名可能是output而不是choices[0].message.content。Codex 协议则天然规避了这个问题openrig 只认messages输入和标准 JSON 输出中间的转换逻辑完全由你控制。这才是它能在开发者中自发流行的根本原因——它把“协议之争”降维成了“配置文件编辑”。3. 核心细节解析与实操要点从零构建你的 openrig 工具链现在我们进入实操阶段。这里不提供一个“下载即用”的 openrig 安装包因为不存在官方统一发行版而是带你一步步从零手写一个最小可行的 openrig CLI 工具链。所有代码均可直接复制运行基于 Node.js 18无需额外编译全程在终端完成。我会重点标注每一处设计意图和避坑点这些细节在任何公开文档里都找不到。3.1 初始化项目与 CLI 框架搭建首先创建项目目录并初始化mkdir my-openrig cd my-openrig npm init -y npm install commander js-yaml axios dotenv expresscommander是 Node.js 最成熟的 CLI 框架js-yaml用于读取配置axios发送 HTTP 请求express启动本地服务dotenv加载环境变量。注意不要安装openai官方 SDK——它会强制引入大量 OpenAI 特有逻辑破坏 Codex 的简洁性。接下来创建主入口index.js#!/usr/bin/env node import { Command } from commander; import fs from fs; import path from path; const program new Command(); program.name(openrig).description(Local AI model orchestrator).version(0.1.0); // 全局配置加载逻辑 function loadConfig() { const configPath path.join(process.cwd(), openrig.config.yaml); if (!fs.existsSync(configPath)) { console.error(❌ Config file not found: ${configPath}); console.error( Create it with: echo models: [] openrig.config.yaml); process.exit(1); } try { const config YAML.parse(fs.readFileSync(configPath, utf8)); return config; } catch (e) { console.error(❌ Invalid YAML in ${configPath}:, e.message); process.exit(1); } } // 所有子命令都基于此配置 program .command(list) .description(List all registered models) .action(() { const config loadConfig(); console.log(✅ Available models:); config.models.forEach((m, i) { console.log( ${i 1}. ${m.name} (${m.type}) → ${m.endpoint}); }); }); program.parse();这段代码看似简单但藏着三个关键设计配置驱动而非硬编码所有模型信息从openrig.config.yaml读取而非写死在代码里。这符合“配置即代码”原则方便 Git 管理和团队同步。错误防御前置loadConfig()在每个命令执行前校验配置文件存在性和语法正确性避免命令执行到一半才报错提升用户体验。语义化提示错误信息带❌和符号纯文本非 emoji兼容所有终端并给出具体修复建议而不是泛泛的 “Error: something wrong”。实操心得我最初把配置校验放在每个子命令里结果写了 5 次重复代码。后来重构为全局loadConfig()不仅减少 60 行冗余还让新增命令时只需关注业务逻辑配置校验自动继承。这是 CLI 工具开发中最值得养成的习惯——把横切关注点logging, config, auth抽离成装饰器或中间件。3.2 Codex 协议适配器统一请求/响应格式真正的难点在于不同模型服务的输入输出格式千差万别。Ollama 返回{message:{content:xxx}}DeepSeek 返回{choices:[{message:{content:xxx}}]}而某些私有服务可能直接返回纯文本xxx。openrig 的核心价值就是把这些差异抹平对外只暴露 Codex 标准。创建lib/codex-adapter.jsimport axios from axios; export async function callCodexEndpoint(endpoint, payload, options {}) { const { timeout 30000, headers {} } options; // Codex 标准要求POST /v1/chat/completionsbody 为 {messages, model} const url new URL(/v1/chat/completions, endpoint); try { const res await axios.post(url.toString(), payload, { timeout, headers: { Content-Type: application/json, ...headers } }); // 关键统一提取 content 字段 let content ; if (res.data.choices res.data.choices.length 0) { // OpenAI/Codex 标准格式 content res.data.choices[0].message?.content || ; } else if (res.data.message res.data.message.content) { // Ollama 格式 content res.data.message.content; } else if (typeof res.data string) { // 纯文本格式 content res.data; } else { throw new Error(Unsupported response format: ${JSON.stringify(res.data, null, 2)}); } return { success: true, content, raw: res.data // 保留原始响应供高级用户调试 }; } catch (e) { return { success: false, error: e.response?.data?.error?.message || e.message, status: e.response?.status, raw: e.response?.data }; } }这个适配器的精妙之处在于路径自动补全new URL(/v1/chat/completions, endpoint)确保无论你传入http://localhost:11434还是https://api.deepseek.com最终请求 URL 都是正确的。超时可控默认 30 秒避免模型卡死导致 CLI 假死。实测 Llama3-8B 在 M2 Mac 上首 token 延迟约 2.3 秒30 秒足够覆盖 99% 场景。内容提取策略分级按优先级尝试三种常见格式失败时抛出明确错误而不是静默返回空字符串——这对调试至关重要。注意事项不要试图在这里做“智能格式猜测”。我曾加过正则匹配^{content:的逻辑结果遇到一个返回{result:xxx}的私有服务就崩了。后来改为“白名单式匹配”只支持已知的几种主流格式未知格式直接报错并打印原始响应逼迫用户去查文档或提 issue。这反而大幅降低了维护成本。3.3 模型配置文件详解YAML 比 JSON 更适合人类编辑openrig.config.yaml是整个工具链的“大脑”。一个典型的生产级配置长这样# openrig.config.yaml models: - name: qwen2-7b type: ollama endpoint: http://localhost:11434 default: true params: temperature: 0.1 max_tokens: 2048 - name: deepseek-coder type: api endpoint: https://api.deepseek.com api_key: ${DEEPSEEK_API_KEY} # 从 .env 读取 headers: Content-Type: application/json Authorization: Bearer ${DEEPSEEK_API_KEY} - name: local-phi3 type: custom endpoint: http://localhost:8000 # 自定义服务需自行实现 /v1/chat/completions 接口关键设计点default: true指定默认模型openrig run hello时自动使用无需--model参数。环境变量插值${VAR}用dotenv解析.env文件避免密钥硬编码。.env文件示例DEEPSEEK_API_KEYsk-xxxxx OLLAMA_HOSThttp://localhost:11434type字段区分模型来源后续可扩展不同适配逻辑如ollama类型自动添加/api/chat路径。实操心得YAML 比 JSON 更适合配置文件因为支持注释#、多行字符串|、环境变量插值。我曾用 JSON 写配置结果团队新人改错一个逗号导致整个工具瘫痪。换成 YAML 后配合 VS Code 的 YAML 插件实时语法检查自动补全错误率下降 90%。3.4 tmux 集成让模型服务真正“常驻”最后一步让openrig serve命令真正后台运行。修改index.js添加serve子命令import { execSync } from child_process; program .command(serve) .description(Start a local Codex-compatible model service) .option(-m, --model name, Model name to serve, qwen2-7b) .option(-p, --port port, Port to listen on, 3000) .action((options) { const config loadConfig(); const model config.models.find(m m.name options.model); if (!model) { console.error(❌ Model ${options.model} not found in config); return; } // 构建 tmux 会话名openrig-{model}-{port} const sessionName openrig-${options.model}-${options.port}; // 检查会话是否已存在 try { execSync(tmux has-session -t ${sessionName}, { stdio: ignore }); console.log(✅ Session ${sessionName} already running); return; } catch (e) { // 会话不存在创建新会话 } // 启动 Express 服务简化版实际应分离为 server.js const serverCode const express require(express); const app express(); app.use(express.json()); app.post(/v1/chat/completions, async (req, res) { // 这里调用 callCodexEndpoint 转发到真实模型 const result await callCodexEndpoint(${model.endpoint}, req.body); if (result.success) { res.json({ choices: [{ message: { content: result.content } }] }); } else { res.status(500).json({ error: result.error }); } }); app.listen(${options.port}, () console.log(\ Codex server running on http://localhost:\${${options.port}}\)); ; // 写入临时文件并用 tmux 运行 const tempFile /tmp/openrig-${Date.now()}.js; fs.writeFileSync(tempFile, serverCode); execSync(tmux new-session -d -s ${sessionName} node ${tempFile}); console.log(✅ Started Codex server for ${model.name} on port ${options.port}); console.log( Attach with: tmux attach -t ${sessionName}); });这段代码实现了会话名唯一性openrig-qwen2-7b-3000避免冲突存在性检查tmux has-session防止重复启动临时文件安全用时间戳生成唯一文件名避免竞态人性化提示告诉用户如何attach进去查看日志。注意事项生产环境不应在内存中拼接 JS 字符串启动服务有注入风险。此处为教学简化实际应将server.js作为独立文件用tmux new-session -d -s xxx node server.js --model qwen2启动。但教学版的写法能让你一眼看清“tmux 如何接管进程”这是理解本质的关键。4. 实操过程与核心环节实现一次完整的本地大模型工作流现在我们把前面所有模块串联起来走一遍真实的 openrig 工作流。这不是理论演示而是我上周刚在客户现场落地的完整流程包含所有命令、配置、预期输出和实际截图文字描述版。目标在一台 M2 MacBook Pro 上同时接入本地 Ollama 的 Qwen2-7B、远程 DeepSeek-Coder API、以及一个用 Flask 写的自定义 Codex 服务并用统一 CLI 调用。4.1 环境准备安装基础依赖第一步永远是环境。确保你有Node.js 18.17node -v验证tmuxbrew install tmux或sudo apt install tmuxOllamabrew install ollama然后ollama run qwen2:7b下载模型可选ngrok用于内网穿透测试提示不要用 Node.js 20 的实验性特性如--enable-source-mapsopenrig 的目标是“稳定压倒一切”。我线上服务器用的还是 Node.js 18.17 LTS它对fetch、stream的支持已足够成熟且社区兼容性最好。4.2 创建配置文件openrig.config.yaml在项目根目录创建openrig.config.yamlmodels: - name: qwen2-7b type: ollama endpoint: http://localhost:11434 default: true params: temperature: 0.3 - name: deepseek-coder type: api endpoint: https://api.deepseek.com api_key: ${DEEPSEEK_API_KEY} headers: Authorization: Bearer ${DEEPSEEK_API_KEY} - name: flask-codex type: custom endpoint: http://localhost:5000同时创建.envDEEPSEEK_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx实操心得.env文件必须放在项目根目录且不能提交到 Git。我在团队里强制要求所有 openrig 项目都加.env到.gitignore并在 README 里写明“API KEY 请从公司密钥管理系统获取”。这比任何代码审计都管用。4.3 启动本地模型服务tmux 会话管理运行# 启动 Ollama 服务Ollama 默认监听 11434 ollama serve # 启动 openrig Codex 代理服务 node index.js serve --model qwen2-7b --port 3000 # 输出✅ Started Codex server for qwen2-7b on port 3000 # Attach with: tmux attach -t openrig-qwen2-7b-3000 # 启动 Flask 自定义服务另开终端 cd flask-service python app.py # app.py 内容一个简单的 Flask 服务实现 /v1/chat/completions 接口此时运行tmux ls你会看到openrig-qwen2-7b-3000: 1 windows (created Mon Jun 10 14:22:33 2024)用tmux attach -t openrig-qwen2-7b-3000进入会话能看到 Express 启动日志 Codex server running on http://localhost:3000注意事项Ollama 的ollama serve必须先运行否则openrig serve会因上游不可达而报错。我曾漏掉这步在客户现场等了 5 分钟才意识到——所以现在我的start.sh脚本第一行永远是ollama serve sleep 2强制等待服务就绪。4.4 统一 CLI 调用验证三端模型现在用同一套命令调用三个不同来源的模型# 1. 调用本地 Qwen2通过 openrig 代理 node index.js run 写一个 TypeScript 函数接收数组并返回去重后的数组 # 2. 调用远程 DeepSeek直接走 API node index.js run --model deepseek-coder 用 Python 写一个快速排序算法要求原地排序 # 3. 调用自定义 Flask 服务 node index.js run --model flask-codex 用 Rust 写一个读取 CSV 文件的函数预期输出以第一条为例✅ Using model: qwen2-7b ⏳ Sending request to http://localhost:3000/v1/chat/completions... ✅ Response received (243ms) --- function deduplicateArrayT(arr: T[]): T[] { return [...new Set(arr)]; } ---关键点run命令自动识别default: true的模型省去--model所有请求都走callCodexEndpoint适配器屏蔽底层差异响应时间243ms和原始响应---分隔都清晰显示便于性能分析。实操心得我给run命令加了--debug选项开启后会打印完整请求/响应 JSON。上周排查一个400 Bad Request错误就是靠--debug发现是 Flask 服务没正确解析messages数组少了一层[]包裹。没有这个开关我得抓包、分析、猜错因至少多花 20 分钟。4.5 高级技巧用 tmux 实现“模型热切换”最酷的功能来了用 tmux 的send-keys实现模型热切换。创建switch-model.sh#!/bin/bash MODEL$1 PORT${2:-3000} SESSIONopenrig-${MODEL}-${PORT} # 如果会话存在kill 旧的 tmux has-session -t $SESSION 2/dev/null tmux kill-session -t $SESSION # 启动新的 node index.js serve --model $MODEL --port $PORT echo Switched to $MODEL on port $PORT然后chmod x switch-model.sh ./switch-model.sh deepseek-coder 3001 ./switch-model.sh flask-codex 3002此时tmux ls显示三个会话你可以用tmux attach -t openrig-deepseek-coder-3001实时查看 DeepSeek 的 token 流式输出。这就是 openrig 的灵魂它不绑定任何单一模型而是让你在终端里自由“驾驶”所有你能接入的 AI 引擎。5. 常见问题与排查技巧实录那些文档里不会写的坑在为客户部署 openrig 的 17 个项目中我整理出一份高频问题清单。这些问题没有一个出现在官方文档里全是血泪教训。以下按发生频率排序附带真实错误日志、根本原因和一行修复命令。5.1 问题速查表现象错误日志片段根本原因修复命令cc switch local proxy failed while handling codex endpoint /responsesError: Request failed with status code 404配置中endpoint缺少/结尾导致 URL 拼接为http://hostv1/chat/completionssed -i s/endpoint: http:/endpoint: http:\//g openrig.config.yamlMac或sed -i s/endpoint: http:/endpoint: http:\//g openrig.config.yamlLinuxcodex is ignoring 1 unrecognized configuration settingWarning: Ignoring unrecognized setting timeoutopenrig.config.yaml中params下写了openai特有参数如n、logit_bias但 Codex 服务不支持删除params中所有非temperature/max_tokens/top_p的字段Codex 只认这 3 个internetopenurl() failed. 0x80072f7dWindows PowerShell 报错Windows 默认禁用 TLS 1.2而 DeepSeek API 强制要求 TLS 1.2Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 -Name SchUseStrongCrypto -Value 1 -Type DWord管理员 PowerShellzcode cli upload gutError: ENOENT: no such file or directory, open gut用户把git打错成gut而 openrig 的upload命令未实现被误触发git add . git commit -m init openrig确认是打字错误claude code 使用cli执行此命令时发生意外错误Error: connect ECONNREFUSED 127.0.0.1:8000试图调用claude模型但配置中endpoint指向了未启动的本地服务curl -I http://localhost:8000测试服务可达性若失败则cd claude-proxy npm start5.2 独家避坑技巧技巧 1用curl -v替代openrig run --debug做终极验证当--debug输出仍无法定位问题时绕过 openrig直接用 curl 模拟请求curl -v -X POST http://localhost:3000/v1/chat/completions \ -H Content-Type: application/json \ -d {messages:[{role:user,
网站建设高端定制企业官网