news 2026/9/11 23:57:38

9Router 通用工具接入指南:用 OpenAI 兼容 API 连接任意自定义应用与框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
9Router 通用工具接入指南:用 OpenAI 兼容 API 连接任意自定义应用与框架

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-20251101
  • cc/claude-sonnet-4-20250514
  • cc/claude-haiku-4-20250514

DeepSeek 模型(cx/前缀)

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

GLM 模型(智谱 AI,glm/前缀)

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

需要说明的是,模型目录随仓库迭代持续更新,上述名称应视为"接入时的示例";代码注册表中的模型清单可能与文档略有出入。例如 claude.js 当前登记的模型为claude-opus-5claude-fable-5claude-sonnet-5claude-haiku-4-5-20251001,glm.js 当前登记了glm-5.2glm-5.1glm-5glm-4.7glm-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/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 }

这些请求都会进入 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-20250514
import 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 23:55:24

TradingAgents-CN 周末/节假日交易数据获取失败问题修复实战:分析日期传递、最近交易日回退与多数据源降级

TradingAgents-CN 周末/节假日交易数据获取失败问题修复实战&#xff1a;分析日期传递、最近交易日回退与多数据源降级 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/T…

作者头像 李华
网站建设 2026/9/11 23:54:01

PCSX2实用手册:从BIOS准备到图形问题排查的完整流程

PCSX2实用手册&#xff1a;从BIOS准备到图形问题排查的完整流程 【免费下载链接】pcsx2 PCSX2 - The Playstation 2 Emulator 项目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2 PCSX2 是一个开源的 PlayStation 2 模拟器&#xff0c;通过 MIPS 解释器、动态重编…

作者头像 李华
网站建设 2026/9/11 23:50:44

SSM超市订单系统实战:从配置对齐到Tomcat部署全解析

简介&#xff1a;这是一套面向Java Web初学者与课程设计者的完整超市订单管理系统实战项目&#xff0c;基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架、MySQL数据库与JSP动态页面技术构建&#xff0c;解决中小型超市日常订单、供应商及用户统一管理的业务需求。资…

作者头像 李华
网站建设 2026/9/11 23:48:17

基于大数据的上海租房数据分析与可视化系统实战指南

每年带毕设学生的时候&#xff0c;被问得最多的问题就是&#xff1a;老师&#xff0c;大数据方向到底做什么题目比较好&#xff1f;说实话&#xff0c;大数据毕业设计最大的坑&#xff0c;不是代码写不出来&#xff0c;而是很多同学把一个用Excel就能解决的事情&#xff0c;硬套…

作者头像 李华