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 端点,任何支持 OpenAI API 格式的工具——无论是自研脚本、测试工具、CLI 工具、第三方应用还是开发框架——都可以通过统一的 Base URL、API Key 与模型命名规则接入。本文以 9Router 的 OpenAI 兼容端点为骨架,结合仓库源码中真实的模型路由实现,讲解从环境准备、基础调用到批处理、流式、多模型对比、错误处理与故障排查的完整接入方案,帮助你快速把 9Router 的能力接入到自己的技术栈中。
概述:OpenAI 兼容端点的适用范围
9Router 的核心设计目标之一,是为各类工具提供一个统一的、与 OpenAI API 格式兼容的接入层。只要你的工具支持 OpenAI 格式,就能连接 9Router,包括:
- 自定义脚本与应用程序(Python、Node.js 等)
- API 客户端与测试工具(Postman、Insomnia、cURL 等)
- CLI 工具与命令行工具
- 第三方集成
- 开发框架(LangChain、LlamaIndex 等)
这套通用接入模式与仓库中针对特定工具(如 cursor.md、continue.md、claude-code.md)的专属指南互补:专属指南针对特定工具的配置细节,而本指南覆盖所有未列出的工具与自定义应用。
通用接入模式
任何 OpenAI 兼容工具都可以通过以下三个设置连接到 9Router。
本地部署的 9Router:
Base URL: http://localhost:20128/v1 API Key: your-api-key-from-dashboard Model: any 9Router model (cc/*, cx/*, glm/*, etc.)云端 9Router:
Base URL: https://9router.com/v1 API Key: your-api-key-from-dashboard Model: any 9Router model (cc/*, cx/*, glm/*, etc.)从仓库源码看,/v1前缀下的路由是 9Router 对外暴露的 OpenAI 兼容 API 根路径(参见 src/app/api/v1 目录结构):其中 chat/completions/route.js 处理POST /v1/chat/completions聊天补全请求,models/route.js 处理GET /v1/models模型列表请求,route.js 则将根路径的GET/OPTIONS委托给 models 路由。所有路由都配置了Access-Control-Allow-Origin: *的 CORS 响应头,方便浏览器端与跨域场景直接调用。
模型命名规范:alias/model-id
9Router 的模型名遵循alias/model-id格式,其中 alias 是提供商前缀。例如:
cc/前缀对应 Claude Code 提供商(注册表见 open-sse/providers/registry/claude.js,alias: "cc")cx/前缀对应 Codex 提供商(open-sse/providers/registry/codex.js,alias: "cx")glm/前缀对应 GLM Coding 提供商(open-sse/providers/registry/glm.js,alias: "glm")
实际可用的模型列表由 9Router 根据你的账户连接动态生成:在 models/route.js 的buildModelsList实现中,会合并你已启用的提供商连接(getProviderConnections)、自定义模型(getCustomModels)、模型别名(getModelAliases)与 Combo 组合,最终拼装成 OpenAI 格式的{ id, object, owned_by }模型对象列表。因此,接入时请通过GET /v1/models查询你账户下真实可用的模型名(见下文"模型不存在(404)"的排查方法)。
可用模型示例
文档给出的典型模型名示例如下(以接入时GET /v1/models实际返回为准):
Claude 模型(Anthropic,cc/前缀)
cc/claude-opus-4-5-20251101cc/claude-sonnet-4-20250514cc/claude-haiku-4-20250514
DeepSeek 模型(cx/前缀)
cx/deepseek-chatcx/deepseek-reasoner
GLM 模型(智谱 AI,glm/前缀)
glm/glm-4-plusglm/glm-4-flash
需要说明的是,模型目录随仓库迭代持续更新,上述名称应视为"接入时的示例";代码注册表中的模型清单可能与文档略有出入。例如 claude.js 当前登记的模型为claude-opus-5、claude-fable-5、claude-sonnet-5、claude-haiku-4-5-20251001,glm.js 当前登记了glm-5.2、glm-5.1、glm-5、glm-4.7、glm-4.6v等。接入任何工具前,都应先通过/v1/models确认实际可用模型。
集成示例:Python 与 Node.js
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 与 HTTP 客户端
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)
请求:
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 }这些请求都会进入 chat/completions/route.js 的POST处理器,随后委托给 src/sse/handlers/chat.js 的handleChat完成鉴权、模型解析与上游转发。从源码看,handleChat会从Authorization请求头提取 API Key 进行校验(chat.js),因此鉴权头必须严格采用Bearer <your-api-key>格式。
集成示例:LangChain 与 LlamaIndex
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)LangChain 的ChatOpenAI与 LlamaIndex 的OpenAI底层都是 OpenAI 兼容客户端,只需把openai_api_base/api_base指向 9Router 的/v1端点、model_name/model填 9Router 模型名即可,无需额外适配层。
自定义脚本示例
批处理脚本
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))流式响应处理
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");将stream: true传入chat.completions.create即可获得 SSE 流式输出。9Router 的/v1/chat/completions路由对流式与非流式请求统一交给 handleChat 处理,客户端无需关心上游模型是否原生支持流式。
多模型对比
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)同一 prompt 轮询多个模型,可用于质量对比或作为 fallback 候选。9Router 的自动回退(auto-fallback)能力与配额跟踪(quota-tracking)可在此场景下进一步组合使用,相关机制可参考 features/combos.md。
通用集成模式
环境变量
将凭证放入.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") )错误处理
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}")重试逻辑
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: raise故障排查
连接问题
现象:无法连接到 9Router
# 检查 9Router 是否运行 curl http://localhost:20128/health # 预期响应: {"status": "ok"}注意:当前仓库中健康检查端点 src/app/api/health/route.js 返回的是
{ ok: true }(而非文档示例中的{"status": "ok"})。判断 9Router 是否存活,以实际返回的 HTTP 200 为准。
解决方案:
- 确认 9Router 进程已启动
- 检查 20128 端口未被占用或防火墙拦截
- 确保 Base URL 完整(必须包含
/v1后缀)
鉴权错误(401 Unauthorized)
现象:
Error: Invalid API key解决方案:
- 从 dashboard 核实 API Key 是否正确
- 检查 Authorization 头格式是否为
Bearer your-api-key - 确保 API Key 前后没有多余空格或换行符
模型不存在(404)
现象:
Error: Model 'cc/claude-opus' not found解决方案:
- 使用精确的模型名(区分大小写)
- 查询可用模型:
curl http://localhost:20128/v1/models - 确认该模型在你的套餐/连接中已启用
/v1/models返回的列表由buildModelsList实时聚合你的活跃连接、Combo 与自定义模型生成(models/route.js),并以 OpenAI 标准格式{ object: "list", data: [...] }返回,可直接被 OpenAI SDK 的模型枚举功能消费。
超时问题
现象:
Error: Request timed out after 30s解决方案:
- 增大客户端配置中的 timeout
- 对时间敏感的任务改用更快的模型
- 检查到 9Router 的网络连通性
限流(429 Too Many Requests)
现象:
Error: Rate limit exceeded解决方案:
- 实现指数退避重试
- 降低请求频率
- 在 dashboard 中查看限流额度
- 必要时考虑升级套餐
最佳实践
安全
- 将 API Key 存放在环境变量中
- 切勿把 API Key 提交到版本控制
- 云端部署使用 HTTPS
- 定期轮换 API Key
性能
- 根据任务复杂度选择合适的模型
- 对重复查询实现缓存
- 长响应使用流式输出
- 尽可能批量请求
错误处理
- 始终编写 try-catch 代码块
- 添加带指数退避的重试逻辑
- 记录错误日志便于调试
- 提供 fallback 机制
成本优化
- 简单任务选择性价比更高的模型
- 合适场景下缓存响应
- 在 dashboard 中监控用量
- 在代码中设置请求上限
下一步
- 配置 Cursor 进行 IDE 集成
- 设置 Continue 用于 VSCode
- 探索 CLI 用法
- 了解模型选择
- 查看 API Reference
【免费下载链接】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),仅供参考