9Router 其他工具集成指南:用 OpenAI 兼容 API 连接任何脚本、框架与自定义应用
2026/9/12 9:41:57 网站建设 项目流程

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,还提供了embeddingsimages/generationsaudio/speechaudio/transcriptionsresponsesmessages/count_tokensvideos/generationssearchweb/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.exampleREQUIRE_API_KEY=false表示可以按需关闭 API Key 校验(生产环境建议开启),Key 的用途是标识调用方与绑定配额/模型权限。
  • Model 使用 9Router 的别名体系(详见下一节),而不是上游 Provider 的原始模型 ID。

可用模型与命名规则:cc/cx/glm/前缀背后的别名机制

文档给出了三类常用模型的接入示例:

Claude 模型(Anthropic)

  • cc/claude-opus-4-5-20251101
  • cc/claude-sonnet-4-20250514
  • cc/claude-haiku-4-20250514

DeepSeek 模型

  • cx/deepseek-chat
  • cx/deepseek-reasoner

GLM 模型(Zhipu AI)

  • glm/glm-4-plus
  • glm/glm-4-flash

从源码看,cc/cx/glm/这类前缀并非硬编码字符串,而是 9Router 的Provider 别名(alias)机制。在 src/shared/constants/providers.js 中,ALIAS_TO_IDID_TO_ALIAS建立了别名与 Provider ID 的双向映射,resolveProviderId(aliasOrId)负责把cc这样的别名解析为实际 Provider。模型路由 src/app/api/v1/models/route.js 会聚合注册表中的PROVIDER_MODELS、已连接的 Provider(Kiro、Qoder、Kimchi、Copilot、Cursor 等通过resolveKiroModelsresolveCursorModels等实时解析器拉取动态模型列表),并叠加用户自定义模型与别名,最终对外输出/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/completions

Headers:

Content-Type: application/json Authorization: Bearer your-api-key-from-dashboard

Body:

{ "model": "cc/claude-sonnet-4-20250514", "messages": [ {"role": "user", "content": "Hello, how are you?"} ], "temperature": 0.7, "max_tokens": 1000 }

其中temperaturemax_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-20250514
import os from openai import OpenAI client = OpenAI( api_key=os.getenv("ROUTER_API_KEY"), base_url=os.getenv("ROUTER_BASE_URL") )

这一模式与 9Router 自身的环境变量约定保持一致:仓库根目录的 .env.example 同样以环境变量承载运行配置(PORTBASE_URLAPI_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: raise

2 ** 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-chatglm/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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询