9Router 其他工具集成指南:用 OpenAI 兼容 API 连接任何脚本、框架与自定义应用
【免费下载链接】9routerUnlimited FREE AI coding. Connect Claude Code, Codex, Cursor, Cline, Copilot, Antigravity to FREE Claude/GPT/Gemini via 40+ providers. Auto-fallback, RTK -40% tokens, never hit limits.项目地址: https://gitcode.com/GitHub_Trending/9r/9router
9Router 的核心能力之一,是向外部世界暴露一个完全 OpenAI 兼容的 API endpoint(本地默认http://localhost:20128/v1,云端为https://9router.com/v1)。这意味着凡是支持 OpenAI API 格式的工具——从 Python/Node.js SDK、cURL、Postman 到 LangChain、LlamaIndex,再到你自己写的批处理脚本——都可以零改造地接入 9Router,并通过模型别名(如cc/*、cx/*、glm/*)直接调用其背后 40+ 上游 Provider 的模型能力。读完本文,你将掌握通用的接入参数、六种语言/工具的完整集成示例、生产级的环境变量与重试模式,以及一套可落地的排障清单。
概览:为什么“OpenAI 兼容”是接入一切工具的钥匙
9Router 的对外 API 采用 OpenAI 的请求/响应协议,因此兼容面极广。官方文档将其适用场景归纳为五类:
- 自定义脚本与应用(Python/Node.js 批处理、流式对话、模型对比)
- API 客户端与测试工具(cURL、Postman、Insomnia)
- CLI 工具与实用程序
- 第三方集成(LangChain、LlamaIndex 等开发框架)
- 其他任何遵守 OpenAI Chat Completions 协议的工具
从源码结构看,这套兼容层是真实存在的完整实现,而不仅仅是一个入口:在 src/app/api/v1 目录下,除了文档中演示的chat/completions,还提供了embeddings、images/generations、audio/speech、audio/transcriptions、responses、messages/count_tokens、videos/generations、search、web/fetch等一系列/v1端点。也就是说,任何支持 OpenAI 生态(对话、Embedding、图像、音频)的工具,原则上都能与 9Router 对接。
其中聊天端点 src/app/api/v1/chat/completions/route.js 的实现非常简洁:POST请求直接交由handleChat(定义于 src/sse/handlers/chat.js)处理,并在首次请求时惰性初始化open-sse/translator的格式翻译器——这正是 9Router 能把 OpenAI 格式请求翻译为上游 Claude、Codex、GLM 等不同协议的关键机制。同时该路由自带 CORS 预检(OPTIONS)支持,方便浏览器端应用直接调用。
通用设置模式:只需三个参数
任何 OpenAI 兼容工具,都通过以下三个参数接入 9Router:
本地 9Router:
Base URL: http://localhost:20128/v1 API Key: your-api-key-from-dashboard Model: 任意 9Router 模型(cc/*, cx/*, glm/*, 等)云端 9Router:
Base URL: https://9router.com/v1 API Key: your-api-key-from-dashboard Model: 任意 9Router 模型(cc/*, cx/*, glm/*, 等)几点值得注意的细节:
- 端口 20128 是仓库的默认运行时约定,在 .env.example(
PORT=20128)、Dockerfile(ENV PORT=20128/EXPOSE 20128)以及 CLAUDE.md 中均有明确记录;npm run start生产模式下同样默认监听该端口。 - Base URL 必须带
/v1后缀,因为 OpenAI 客户端的请求路径是在 Base URL 后拼接/chat/completions、/models等资源路径。 - API Key 从仪表盘(Dashboard)获取。本地默认配置下,
.env.example中REQUIRE_API_KEY=false表示可以按需关闭 API Key 校验(生产环境建议开启),Key 的用途是标识调用方与绑定配额/模型权限。 - Model 使用 9Router 的别名体系(详见下一节),而不是上游 Provider 的原始模型 ID。
可用模型与命名规则:cc/、cx/、glm/前缀背后的别名机制
文档给出了三类常用模型的接入示例:
Claude 模型(Anthropic)
cc/claude-opus-4-5-20251101cc/claude-sonnet-4-20250514cc/claude-haiku-4-20250514
DeepSeek 模型
cx/deepseek-chatcx/deepseek-reasoner
GLM 模型(Zhipu AI)
glm/glm-4-plusglm/glm-4-flash
从源码看,cc/、cx/、glm/这类前缀并非硬编码字符串,而是 9Router 的Provider 别名(alias)机制。在 src/shared/constants/providers.js 中,ALIAS_TO_ID与ID_TO_ALIAS建立了别名与 Provider ID 的双向映射,resolveProviderId(aliasOrId)负责把cc这样的别名解析为实际 Provider。模型路由 src/app/api/v1/models/route.js 会聚合注册表中的PROVIDER_MODELS、已连接的 Provider(Kiro、Qoder、Kimchi、Copilot、Cursor 等通过resolveKiroModels、resolveCursorModels等实时解析器拉取动态模型列表),并叠加用户自定义模型与别名,最终对外输出/v1/models目录。因此:
- 模型名大小写敏感,必须使用精确 ID(如
cc/claude-sonnet-4-20250514); - 实际可用的模型集合取决于你在仪表盘已连接并启用的 Provider;
- 同一模型前缀(如
cc/*)下通常包含多个历史版本与系列,可在 Dashboard 或通过/v1/models查询完整列表。
集成示例:六种主流接入方式
Python 使用 OpenAI SDK
from openai import OpenAI client = OpenAI( api_key="your-api-key-from-dashboard", base_url="http://localhost:20128/v1" ) response = client.chat.completions.create( model="cc/claude-sonnet-4-20250514", messages=[ {"role": "user", "content": "Hello, how are you?"} ] ) print(response.choices[0].message.content)Node.js 使用 OpenAI SDK
import OpenAI from "openai"; const client = new OpenAI({ apiKey: "your-api-key-from-dashboard", baseURL: "http://localhost:20128/v1" }); const response = await client.chat.completions.create({ model: "cc/claude-sonnet-4-20250514", messages: [ { role: "user", content: "Hello, how are you?" } ] }); console.log(response.choices[0].message.content);cURL 命令
curl http://localhost:20128/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your-api-key-from-dashboard" \ -d '{ "model": "cc/claude-sonnet-4-20250514", "messages": [ {"role": "user", "content": "Hello, how are you?"} ] }'HTTP 客户端(Postman、Insomnia)
Request:
POST http://localhost:20128/v1/chat/completionsHeaders:
Content-Type: application/json Authorization: Bearer your-api-key-from-dashboardBody:
{ "model": "cc/claude-sonnet-4-20250514", "messages": [ {"role": "user", "content": "Hello, how are you?"} ], "temperature": 0.7, "max_tokens": 1000 }其中temperature与max_tokens是标准 OpenAI 采样参数:temperature控制随机性(0~2,值越低越确定),max_tokens限制单次生成的最大 token 数。9Router 会把它们一并翻译并转发给上游模型。
LangChain 集成
from langchain.chat_models import ChatOpenAI from langchain.schema import HumanMessage llm = ChatOpenAI( model_name="cc/claude-sonnet-4-20250514", openai_api_key="your-api-key-from-dashboard", openai_api_base="http://localhost:20128/v1", temperature=0.7 ) messages = [HumanMessage(content="Explain quantum computing")] response = llm(messages) print(response.content)LlamaIndex 集成
from llama_index.llms import OpenAI llm = OpenAI( model="cc/claude-sonnet-4-20250514", api_key="your-api-key-from-dashboard", api_base="http://localhost:20128/v1" ) response = llm.complete("What is machine learning?") print(response.text)自定义脚本示例:把 9Router 变成你的程序内 LLM 后端
批处理脚本
下面的脚本把多个 prompt 批量提交给cx/deepseek-chat,并结构化输出结果——适合内容生成、批量摘要等场景:
import openai import json openai.api_key = "your-api-key-from-dashboard" openai.api_base = "http://localhost:20128/v1" def process_batch(prompts, model="cx/deepseek-chat"): results = [] for prompt in prompts: response = openai.ChatCompletion.create( model=model, messages=[{"role": "user", "content": prompt}] ) results.append({ "prompt": prompt, "response": response.choices[0].message.content }) return results prompts = [ "Explain AI in one sentence", "What is machine learning?", "Define neural networks" ] results = process_batch(prompts) print(json.dumps(results, indent=2))注意:示例使用openai.api_base属于 OpenAI Python SDK 旧版(openai<1.0)的全局配置写法;若使用新版 SDK(>=1.0),等价写法是client = OpenAI(base_url="..."),即本文 Python 集成示例中的形式。
流式响应处理
流式输出能显著降低首 token 延迟,对长回答场景尤为合适。9Router 的/v1/chat/completions完整支持stream: true,服务端按 OpenAI 协议逐块推送delta内容:
import OpenAI from "openai"; const client = new OpenAI({ apiKey: "your-api-key-from-dashboard", baseURL: "http://localhost:20128/v1" }); async function streamResponse(prompt) { const stream = await client.chat.completions.create({ model: "cc/claude-sonnet-4-20250514", messages: [{ role: "user", content: prompt }], stream: true }); for await (const chunk of stream) { const content = chunk.choices[0]?.delta?.content || ""; process.stdout.write(content); } } streamResponse("Write a short story about AI");多模型对比
一个客户端同时轮询多个模型的输出,用于快速横向对比 Claude、DeepSeek、GLM 三家模型的回答风格与质量:
from openai import OpenAI client = OpenAI( api_key="your-api-key-from-dashboard", base_url="http://localhost:20128/v1" ) models = [ "cc/claude-sonnet-4-20250514", "cx/deepseek-chat", "glm/glm-4-plus" ] prompt = "Explain quantum computing in simple terms" for model in models: response = client.chat.completions.create( model=model, messages=[{"role": "user", "content": prompt}] ) print(f"\n=== {model} ===") print(response.choices[0].message.content)常见集成模式:环境变量、错误处理与重试
环境变量:安全存储凭据
把 API Key、Base URL、默认模型放进.env文件,避免在代码中硬编码凭据:
# .env file ROUTER_API_KEY=your-api-key-from-dashboard ROUTER_BASE_URL=http://localhost:20128/v1 ROUTER_MODEL=cc/claude-sonnet-4-20250514import os from openai import OpenAI client = OpenAI( api_key=os.getenv("ROUTER_API_KEY"), base_url=os.getenv("ROUTER_BASE_URL") )这一模式与 9Router 自身的环境变量约定保持一致:仓库根目录的 .env.example 同样以环境变量承载运行配置(PORT、BASE_URL、API_KEY_SECRET等),说明“配置环境变量化”是整个项目的一贯做法。
错误处理
from openai import OpenAI, OpenAIError client = OpenAI( api_key="your-api-key", base_url="http://localhost:20128/v1" ) try: response = client.chat.completions.create( model="cc/claude-sonnet-4-20250514", messages=[{"role": "user", "content": "Hello"}] ) print(response.choices[0].message.content) except OpenAIError as e: print(f"Error: {e}")重试逻辑:指数退避
对 429 限流、瞬时网络抖动,使用带指数退避的重试是标准解法:
import time from openai import OpenAI, RateLimitError client = OpenAI( api_key="your-api-key", base_url="http://localhost:20128/v1" ) def chat_with_retry(prompt, max_retries=3): for attempt in range(max_retries): try: response = client.chat.completions.create( model="cc/claude-sonnet-4-20250514", messages=[{"role": "user", "content": prompt}] ) return response.choices[0].message.content except RateLimitError: if attempt < max_retries - 1: time.sleep(2 ** attempt) # Exponential backoff else: raise2 ** attempt让重试间隔按 1s → 2s → 4s 递增,既避免打爆限流窗口,又能在短时故障后快速恢复。
故障排除:五类高频问题的定位与修复
连接问题
问题:无法连接到 9Router
# 检查 9Router 是否运行 curl http://localhost:20128/health关于健康检查的返回值,需要以当前仓库源码为准修正文档表述:src/app/api/health/route.js 实际返回的是{"ok": true}(而非文档中写到的{"status": "ok"}),并且带有Access-Control-Allow-Origin: *的 CORS 头。因此判定服务存活应以 HTTP 200 与{"ok": true}为准。
方案:
- 确认 9Router 正在运行(Dashboard 能打开即说明服务正常)
- 检查 20128 端口未被防火墙/代理阻止
- 确保 base URL 正确(包含
/v1)
认证错误
问题:401 Unauthorized
Error: Invalid API key方案:
- 在仪表盘中确认 API key 正确且已复制完整
- 检查 Authorization 头格式:
Bearer your-api-key - 确保 API key 中没有多余的空格或换行
模型未找到
问题:404 Model not found
Error: Model 'cc/claude-opus' not found方案:
- 使用精确的模型名(大小写敏感,如
cc/claude-sonnet-4-20250514,而不是缩写cc/claude-opus) - 查看可用模型:
curl http://localhost:20128/v1/models - 确认套餐/仪表盘中已启用该模型(
/v1/models只会返回当前可用集合,其实现见 src/app/api/v1/models/route.js)
超时问题
问题:请求超时
Error: Request timed out after 30s方案:
- 在客户端配置中增大超时(如 Python SDK 的
timeout参数、cURL 的--max-time) - 时间敏感任务使用更快的模型(如
cx/deepseek-chat、glm/glm-4-flash) - 检查到 9Router 的网络连接(本地回环、跨主机、跨云场景网络路径不同)
速率限制
问题:429 Too Many Requests
Error: Rate limit exceeded方案:
- 实现指数退避(见上文重试逻辑示例)
- 降低请求频率
- 在仪表盘中查看速率限制与配额使用情况
- 考虑升级套餐或接入更多 Provider 以扩展容量
最佳实践
安全
- 将 API key 存储在环境变量中
- 绝不将 API key 提交到版本控制(务必把
.env加入.gitignore) - 云端部署使用 HTTPS(自建部署建议置于反代之后)
- 定期轮换 API keys
性能
- 根据任务复杂度选择合适的模型(简单任务用快模型,复杂推理用强模型)
- 对重复查询实现缓存
- 长响应使用流式输出
- 尽可能批量请求
错误处理
- 始终用 try-catch 块包裹
- 添加带指数退避的重试逻辑
- 记录错误以便调试
- 提供回退机制(如主模型失败时切换到备选模型)
成本优化
- 简单任务选择高性价比的模型
- 适当时缓存响应
- 在仪表盘监控使用与配额
- 在代码中设置请求上限
下一步
- 配置 Cursor 进行 IDE 集成
- 设置 Continue 用于 VSCode
- 了解 Claude Code 集成 与 Codex 集成
- 探索 9Router CLI 工具,用命令行直接发起请求
- 阅读 CLAUDE.md 了解本地开发启动方式(
npm run dev/npm run build && npm run start),自行验证/v1与/health端点行为
【免费下载链接】9routerUnlimited FREE AI coding. Connect Claude Code, Codex, Cursor, Cline, Copilot, Antigravity to FREE Claude/GPT/Gemini via 40+ providers. Auto-fallback, RTK -40% tokens, never hit limits.项目地址: https://gitcode.com/GitHub_Trending/9r/9router
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考