9Router:开源AI路由网关的架构设计与技术实现深度解析
摘要:9Router是一款基于Next.js和Cloudflare Workers构建的开源AI路由网关,支持40+AI服务提供商的统一接入。本文将深入剖析其核心架构、翻译引擎、流式处理机制等关键技术点,为开发者提供构建AI网关的实战经验。
目录
一、项目概述与核心痛点
1.1 什么是9Router?
9Router是一个开源AI路由网关 ,它提供了一个统一的OpenAI兼容API端点(/v1/*),将请求智能路由到40多个上游AI服务提供商。项目采用Next.js + React 构建管理界面,核心路由引擎基于Node.js Streams和**SSE(Server-Sent Events)**实现。
1.2 解决的痛点
| 痛点 | 9Router解决方案 |
|---|---|
| AI工具碎片化 | 统一API格式,支持Claude/Gemini/OpenAI等互转 |
| 配额管理困难 | 实时配额跟踪 + 智能回退(订阅→廉价→免费) |
| Token过期频繁 | 自动OAuth刷新,无需手动重新登录 |
| 成本不可控 | 多账户轮询 + 模型组合,最大化免费额度利用 |
| 部署复杂 | 支持本地/Docker/Cloudflare Workers一键部署 |
1.3 项目数据
- GitHub Stars: 持续增长的开源项目
- 支持提供商: 40+(OAuth + API Key)
- 支持模型: 100+
- 翻译格式: 14种格式互转
- 国际化语言: 33种
二、整体架构设计
2.1 系统架构图
┌─────────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │Claude Code│ │ Cursor │ │ Codex CLI│ │ 自定义OpenAI客户端 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────────┬─────────┘ │
│ └─────────────┴─────────────┴────────────────┘ │
│ │ │
│ http://localhost:20128/v1 │
└─────────────────────────┬───────────────────────────────────────┘
│
┌─────────────────────────▼───────────────────────────────────────┐
│ 9Router网关层 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Next.js App Router │ │
│ │ ┌──────────────┐ ┌──────────────────┐ │ │
│ │ │ /v1/* 路由 │ │ Dashboard UI │ │ │
│ │ │ (兼容API) │ │ (React 19) │ │ │
│ │ └──────┬───────┘ └──────────────────┘ │ │
│ │ │ │ │
│ │ ┌──────▼──────────────────────────────────────┐ │ │
│ │ │ SSE Core (open-sse) │ │ │
│ │ │ ┌─────────────┐ ┌──────────────────┐ │ │ │
│ │ │ │Chat Handler │───→│ Format Detection │ │ │ │
│ │ │ └─────────────┘ └────────┬─────────┘ │ │ │
│ │ │ ↓ │ │ │
│ │ │ ┌─────────────┐ ┌──────────────────┐ │ │ │
│ │ │ │Translator │←───│ Executor │ │ │ │
│ │ │ │Engine │ │ Dispatch │ │ │ │
│ │ │ └─────────────┘ └────────┬─────────┘ │ │ │
│ │ │ ↓ │ │ │
│ │ │ ┌─────────────┐ ┌──────────────────┐ │ │ │
│ │ │ │Combo Handler│ │Account Fallback │ │ │ │
│ │ │ └─────────────┘ └──────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────┴───────────────────────────────────┐ │
│ │ 数据持久化层 (LowDB) │ │
│ │ db.json (配置) usage.json (用量) log.txt (日志) │ │
│ └───────────────────────────────────────────────────────────┘ │
└─────────────────────────┬───────────────────────────────────────┘
│
┌─────────────────────────▼───────────────────────────────────────┐
│ 上游提供商层 │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ OAuth提供商: Claude, Codex, Gemini, GitHub, Cursor... │ │
│ │ API Key提供商: OpenAI, Anthropic, OpenRouter, GLM... │ │
│ │ 兼容节点: Ollama, Vertex AI, 自定义OpenAI端点 │ │
│ └───────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
2.2 技术栈选型
| 层级 | 技术选型 | 选型理由 |
|---|---|---|
| 前端框架 | Next.js 16 + React 19 | SSR支持、API路由一体化、生态成熟 |
| 样式方案 | Tailwind CSS 4 | 原子化CSS、快速开发、性能优化 |
| 数据库 | LowDB (JSON文件) | 零配置、适合本地部署、易于备份 |
| 流处理 | Web Streams API | 标准API、支持背压、内存友好 |
| 部署 | Node.js / Cloudflare Workers | 灵活部署、边缘计算支持 |
三、核心模块深度解析
3.1 open-sse目录架构
open-sse是9Router的核心路由引擎,采用模块化设计:
open-sse/
├── config/ # 配置层
│ ├── providers.js # 40+提供商配置
│ ├── providerModels.js # 模型映射表
│ └── runtimeConfig.js # 运行时参数
├── executors/ # 执行器层(12个专用执行器)
│ ├── base.js # 基础执行器抽象类
│ ├── default.js # 通用执行器
│ ├── cursor.js # Cursor Protobuf协议
│ ├── kiro.js # Kiro EventStream
│ ├── antigravity.js # Antigravity反检测
│ └── ...
├── handlers/ # 处理器层
│ ├── chatCore.js # 核心聊天处理器
│ ├── chatCore/ # 子处理器
│ │ ├── streamingHandler.js
│ │ ├── nonStreamingHandler.js
│ │ └── sseToJsonHandler.js
│ └── responsesHandler.js
├── services/ # 服务层
│ ├── provider.js # 提供商配置解析
│ ├── model.js # 模型解析服务
│ ├── accountFallback.js # 账户回退逻辑
│ ├── tokenRefresh.js # Token自动刷新
│ └── combo.js # 模型组合处理
├── translator/ # 翻译引擎
│ ├── index.js # 翻译器注册中心
│ ├── formats.js # 格式定义
│ ├── request/ # 请求翻译器(11个)
│ └── response/ # 响应翻译器(8个)
└── utils/ # 工具层
├── streamHandler.js # 流控制器
├── stream.js # SSE转换
└── proxyFetch.js # 代理支持
3.2 双层翻译架构(核心设计亮点)
9Router采用**"OpenAI作为中间标准"**的翻译策略,避免N×M的复杂度爆炸:
javascript
// open-sse/translator/index.js
export function translateRequest(sourceFormat, targetFormat, model, body, stream, credentials) {
let result = body;
// Step 1: source → openai (如果源不是OpenAI)
if (sourceFormat !== FORMATS.OPENAI) {
const toOpenAI = requestRegistry.get(`${sourceFormat}:${FORMATS.OPENAI}`);
if (toOpenAI) {
result = toOpenAI(model, result, stream, credentials);
}
}
// Step 2: openai → target (如果目标不是OpenAI)
if (targetFormat !== FORMATS.OPENAI) {
const fromOpenAI = requestRegistry.get(`${FORMATS.OPENAI}:${targetFormat}`);
if (fromOpenAI) {
result = fromOpenAI(model, result, stream, credentials);
}
}
// 特殊处理:Antigravity工具伪装(反检测)
if (provider === FORMATS.ANTIGRAVITY) {
const { cloakedBody, toolNameMap } = AntigravityExecutor.cloakTools(result);
result = cloakedBody;
result._toolNameMap = toolNameMap;
}
return result;
}
支持的格式转换:
| 源格式 | 目标格式 | 应用场景 |
|---|---|---|
| OpenAI | Claude | 用Claude Code调用Claude API |
| Claude | OpenAI | 用OpenAI客户端调用Claude |
| OpenAI | Gemini | 统一接入Google模型 |
| OpenAI-Responses | OpenAI | Codex CLI兼容 |
| OpenAI | Kiro | AWS Builder ID认证 |
| OpenAI | Cursor | Protobuf协议转换 |
3.3 执行器模式(Executor Pattern)
每个复杂提供商都有专用执行器处理特殊逻辑:
javascript
// open-sse/executors/index.js
const executors = {
antigravity: new AntigravityExecutor(), // 工具伪装
"gemini-cli": new GeminiCLIExecutor(), // GCP项目ID管理
github: new GithubExecutor(), // Copilot Token刷新
kiro: new KiroExecutor(), // EventStream解析
codex: new CodexExecutor(), // Responses API
cursor: new CursorExecutor(), // Protobuf序列化
vertex: new VertexExecutor("vertex"), // GCP JWT
// ... 其他使用DefaultExecutor
};
export function getExecutor(provider) {
if (executors[provider]) return executors[provider];
if (!defaultCache.has(provider)) {
defaultCache.set(provider, new DefaultExecutor(provider));
}
return defaultCache.get(provider);
}
BaseExecutor核心方法:
javascript
// open-sse/executors/base.js
export class BaseExecutor {
// URL构建(支持多URL回退)
buildUrl(model, stream, urlIndex = 0, credentials = null)
// 请求头构建(支持多种认证方式)
buildHeaders(credentials, stream = true)
// 请求转换(子类可覆盖)
transformRequest(model, body, stream, credentials)
// 执行请求(内置重试逻辑)
async execute({ model, body, stream, credentials, signal, log, proxyOptions })
// Token刷新(OAuth提供商必需)
async refreshCredentials(credentials, log)
}
3.4 智能回退与熔断机制
accountFallback.js实现了精细化的错误处理和账户回退:
javascript
// open-sse/services/accountFallback.js
export function checkFallbackError(status, errorText, backoffLevel = 0) {
// 1. 错误消息模式匹配(优先于状态码)
if (errorText) {
const lowerError = errorText.toLowerCase();
if (lowerError.includes("rate limit") ||
lowerError.includes("quota exceeded")) {
// 指数退避: 1s → 2s → 4s → ... → 最大2分钟
const newLevel = Math.min(backoffLevel + 1, BACKOFF_CONFIG.maxLevel);
return {
shouldFallback: true,
cooldownMs: getQuotaCooldown(backoffLevel), // 2^backoffLevel * base
newBackoffLevel: newLevel
};
}
}
// 2. 状态码处理
if (status === 401) {
return { shouldFallback: true, cooldownMs: COOLDOWN_MS.unauthorized };
}
if (status === 429) {
return { shouldFallback: true, cooldownMs: getQuotaCooldown(backoffLevel) };
}
if (status >= 500) {
return { shouldFallback: true, cooldownMs: COOLDOWN_MS.transient };
}
return { shouldFallback: false };
}
回退策略层级:
用户请求
↓
┌─────────────────┐
│ 1. 模型组合回退 │ ← 用户配置的模型序列(如:Claude → GLM → iFlow)
└────────┬────────┘
↓
┌─────────────────┐
│ 2. 账户级回退 │ ← 同一提供商的多账户轮询
└────────┬────────┘
↓
┌─────────────────┐
│ 3. URL级回退 │ ← 多Base URL切换(如Antigravity多域名)
└────────┬────────┘
↓
返回错误
四、AI服务提供商生态
4.1 提供商分类
javascript
// open-sse/config/providers.js (节选)
export const PROVIDERS = {
// ===== OAuth提供商(自动Token刷新)=====
claude: {
baseUrl: "https://api.anthropic.com/v1/messages",
format: "claude",
clientId: "9d1c250a-e61b-44d9-88ed-5944d1962f5e",
tokenUrl: "https://api.anthropic.com/v1/oauth/token",
headers: { /* Claude CLI模拟头 */ }
},
codex: {
baseUrl: "https://chatgpt.com/backend-api/codex/responses",
format: "openai-responses",
clientId: "app_EMoamEEZ73f0CkXaXp7hrann",
tokenUrl: "https://auth.openai.com/oauth/token"
},
"gemini-cli": {
baseUrl: "https://cloudcode-pa.googleapis.com/v1internal",
format: "gemini-cli",
// 180K/月免费额度
},
iflow: {
baseUrl: "https://apis.iflow.cn/v1/chat/completions",
format: "openai",
// 8+免费模型,无限使用
},
// ===== API Key提供商 =====
openai: {
baseUrl: "https://api.openai.com/v1/chat/completions",
format: "openai"
},
anthropic: {
baseUrl: "https://api.anthropic.com/v1/messages",
format: "claude"
},
openrouter: {
baseUrl: "https://openrouter.ai/api/v1/chat/completions",
format: "openai"
},
glm: {
baseUrl: "https://api.z.ai/api/anthropic/v1/messages",
format: "claude" // GLM使用Claude格式
},
kimi: {
baseUrl: "https://api.kimi.com/coding/v1/messages",
format: "claude"
},
// ===== 本地/兼容节点 =====
ollama: {
baseUrl: "https://ollama.com/api/chat",
format: "ollama"
},
"ollama-local": {
baseUrl: "http://localhost:11434/api/chat",
format: "ollama"
},
vertex: {
baseUrl: "https://aiplatform.googleapis.com",
format: "vertex" // GCP Service Account
}
};
4.2 提供商特性对比
| 提供商 | 认证方式 | 特色功能 | 免费额度 |
|---|---|---|---|
| Claude Code | OAuth | 5h+每周配额、原生Claude格式 | Pro订阅 |
| Codex | OAuth | OpenAI Responses API | Plus/Pro订阅 |
| Gemini CLI | OAuth | 180K/月、Google原生 | 免费 |
| iFlow | OAuth | 8+模型、无限使用 | 免费 |
| Kiro | AWS Builder ID | Claude模型免费 | 免费 |
| GLM | API Key | $0.6/1M、每日重置 | 付费 |
| MiniMax | API Key | $0.2/1M、5h滚动重置 | 付费 |
五、多语言国际化方案
5.1 架构设计
src/i18n/
├── config.js # 33种语言配置
├── runtime.js # 运行时翻译加载
└── RuntimeI18nProvider.js # React Context
public/i18n/literals/ # 翻译文件
├── zh-CN.json (28KB) # 中文(最完整)
├── ja.json # 日语
├── ko.json # 韩语
├── vi.json # 越南语
├── ar.json, he.json # RTL语言
└── ... 共33种
5.2 配置实现
javascript
// src/i18n/config.js
export const LOCALES = [
"en", "vi", "zh-CN", "zh-TW", "ja", "pt-BR", "pt-PT",
"ko", "es", "de", "fr", "he", "ar", "ru", "pl",
// ... 共33种
];
export const DEFAULT_LOCALE = "en";
export const LOCALE_COOKIE = "locale";
export const LOCALE_NAMES = {
"en": "English",
"zh-CN": "简体中文",
"zh-TW": "繁體中文",
"ja": "日本語",
"ko": "한국어",
"vi": "Tiếng Việt",
// ...
};
// 语言归一化(处理简写如"zh"→"zh-CN")
export function normalizeLocale(locale) {
if (locale === "zh" || locale === "zh-CN") return "zh-CN";
if (locale === "en") return "en";
// ...
return DEFAULT_LOCALE;
}
5.3 运行时加载
javascript
// src/i18n/runtime.js
export async function loadLiterals(locale) {
const normalized = normalizeLocale(locale);
try {
const response = await fetch(`/i18n/literals/${normalized}.json`);
return await response.json();
} catch (error) {
console.warn(`Failed to load literals for ${locale}, falling back to en`);
return loadLiterals('en');
}
}
六、MITM代理与流量拦截
6.1 功能概述
MITM(Man-In-The-Middle)模块位于src/mitm/,实现HTTPS代理拦截,主要用于:
- 拦截CLI工具请求:Claude Code、Codex等硬编码API端点的工具
- 请求/响应修改:注入自定义头、修改请求体
- 本地调试:查看明文请求内容
6.2 架构实现
src/mitm/
├── cert/ # 证书管理
│ ├── generate.js # Root CA生成
│ ├── install.js # 系统信任安装
│ └── rootCA.js # 证书验证
├── dns/ # DNS配置
│ └── dnsConfig.js # hosts文件修改
├── handlers/ # 请求处理器
│ ├── requestHandler.js
│ └── responseHandler.js
├── manager.js # MITM生命周期管理
└── server.js # HTTPS代理服务器
6.3 核心代码解析
javascript
// src/mitm/manager.js
const MITM_PORT = 443;
const TOOL_HOSTS = {
claude: ["api.anthropic.com"],
codex: ["api.openai.com"],
gemini: ["generativelanguage.googleapis.com"],
github: ["api.githubcopilot.com"],
cursor: ["api2.cursor.sh"],
// ...
};
// 启动MITM服务器
async function startServer(apiKey, sudoPassword) {
// 1. 生成Root CA(如果不存在或过期)
const rootCACertPath = path.join(MITM_DIR, "rootCA.crt");
if (!fs.existsSync(rootCACertPath) || isCertExpired(rootCACertPath)) {
await generateCert();
}
// 2. 安装证书到系统信任存储
const rootCATrusted = await checkCertInstalled(rootCACertPath);
if (!rootCATrusted) {
await installCert(sudoPassword, rootCACertPath);
}
// 3. 修改hosts文件(DNS劫持)
for (const [tool, hosts] of Object.entries(TOOL_HOSTS)) {
await addDNSEntry(tool, sudoPassword); // 127.0.0.1 api.anthropic.com
}
// 4. 启动HTTPS代理服务器
serverProcess = spawn(process.execPath, [SERVER_PATH], {
env: { ...process.env, ROUTER_API_KEY: apiKey }
});
}
6.4 跨平台支持
| 平台 | 实现方式 | 特殊处理 |
|---|---|---|
| Windows | PowerShell + 直接hosts修改 | 端口8443 + 端口转发(非管理员) |
| macOS | sudo + dscl证书安装 | Keychain信任 |
| Linux | sudo + update-ca-certificates | 多发行版适配 |
七、流式响应处理机制
7.1 流处理架构
Provider Response (SSE/JSON)
↓
┌─────────────────────────────────────┐
│ TransformStream │
│ (Provider格式 → OpenAI格式转换) │
└─────────────┬───────────────────────┘
↓
┌─────────────────────────────────────┐
│ DisconnectAwareStream │
│ • 客户端断开检测 │
│ • 延迟中止上游请求(500ms) │
│ • 资源清理 │
└─────────────┬───────────────────────┘
↓
Client (SSE/JSON)
7.2 流控制器实现
javascript
// open-sse/utils/streamHandler.js
export function createStreamController({ onDisconnect, onError, log, provider, model }) {
const abortController = new AbortController();
let disconnected = false;
let abortTimeout = null;
return {
signal: abortController.signal,
// 客户端断开时调用
handleDisconnect: (reason = "client_closed") => {
if (disconnected) return;
disconnected = true;
// 延迟中止,允许完成当前块
abortTimeout = setTimeout(() => {
abortController.abort();
}, 500);
onDisconnect?.({ reason, duration: Date.now() - startTime });
},
// 正常完成时调用
handleComplete: () => {
if (disconnected) return;
disconnected = true;
if (abortTimeout) {
clearTimeout(abortTimeout);
}
},
// 错误时调用
handleError: (error) => {
if (disconnected) return;
disconnected = true;
onError?.(error);
},
abort: () => abortController.abort()
};
}
7.3 SSE转换流
javascript
// open-sse/utils/stream.js
export function createSSETransformStreamWithLogger(provider, sourceFormat, targetFormat, state, reqLogger) {
return new TransformStream({
transform(chunk, controller) {
// 1. 解析SSE格式
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = line.slice(6);
// 2. [DONE]标记处理
if (data === '[DONE]') {
controller.enqueue('data: [DONE]\n\n');
continue;
}
// 3. JSON解析
const parsed = JSON.parse(data);
// 4. 格式转换
const translated = translateResponse(
targetFormat,
sourceFormat,
parsed,
state
);
// 5. 输出转换后的SSE
for (const item of translated) {
controller.enqueue(`data: ${JSON.stringify(item)}\n\n`);
}
}
}
}
});
}
7.4 特殊场景处理
场景1:强制SSE转JSON(Codex CLI)
javascript
// open-sse/handlers/chatCore/sseToJsonHandler.js
export async function handleForcedSSEToJson({ providerResponse, sourceFormat, ... }) {
// 收集所有SSE块
const chunks = [];
const reader = providerResponse.body.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
}
// 合并并解析
const fullText = chunks.join('');
const lines = fullText.split('\n').filter(l => l.startsWith('data: '));
// 构建完整响应对象
const fullResponse = mergeSSEChunks(lines.map(l => JSON.parse(l.slice(6))));
// 返回JSON响应
return new Response(JSON.stringify(fullResponse), {
headers: { 'Content-Type': 'application/json' }
});
}
场景2:工具调用ID映射
javascript
// 处理Antigravity工具名称伪装后的ID映射
if (toolNameMap?.size > 0) {
// 请求时:原始名称 → 伪装名称
// 响应时:伪装名称 → 原始名称
const originalName = toolNameMap.get(cloakedName);
}
八、技术亮点总结
8.1 架构设计亮点
| 亮点 | 说明 | 价值 |
|---|---|---|
| 双层翻译架构 | Source → OpenAI → Target | 复杂度从O(N×M)降到O(N+M) |
| 执行器模式 | 每个复杂提供商独立Executor | 隔离变化,易于扩展 |
| 三层回退机制 | 组合→账户→URL | 最大化可用性 |
| 指数退避 | 2^n增长冷却时间 | 避免雪崩,自动恢复 |
| 模型级锁定 | 细粒度错误隔离 | 不影响其他模型使用 |
8.2 工程实践亮点
javascript
// 1. 懒加载翻译器(减少启动时间)
function ensureInitialized() {
if (initialized) return;
initialized = true;
// 按需require,避免打包所有翻译器
require("./request/claude-to-openai.js");
require("./request/openai-to-claude.js");
// ...
}
// 2. 默认执行器缓存(避免重复创建)
const defaultCache = new Map();
export function getExecutor(provider) {
if (executors[provider]) return executors[provider];
if (!defaultCache.has(provider)) {
defaultCache.set(provider, new DefaultExecutor(provider));
}
return defaultCache.get(provider);
}
// 3. 流式错误处理(不中断用户体验)
export function createDisconnectAwareStream(transformStream, streamController) {
return new ReadableStream({
async pull(controller) {
try {
const { done, value } = await reader.read();
if (done) {
streamController.handleComplete();
controller.close();
return;
}
controller.enqueue(value);
} catch (error) {
// 优雅降级,记录日志但不抛错
streamController.handleError(error);
reader.cancel().catch(() => {});
controller.error(error);
}
},
cancel(reason) {
streamController.handleDisconnect(reason);
}
});
}
九、实战应用场景
9.1 场景一:零成本AI开发环境
配置方案:
json
{
"combo": "free-dev",
"models": [
"gc/gemini-3-flash-preview", // Google 180K/月免费
"if/kimi-k2-thinking", // iFlow 无限免费
"qw/qwen3-coder-plus" // Qwen 无限免费
]
}
成本:$0/月
9.2 场景二:企业多租户网关
javascript
// 多账户配置示例
const providerConnections = [
{
provider: "openai",
name: "team-a-account",
apiKey: "sk-...",
priority: 1,
rateLimit: { requestsPerMinute: 60 }
},
{
provider: "openai",
name: "team-b-account",
apiKey: "sk-...",
priority: 2
}
];
9.3 场景三:Claude Code免费化
bash
# 1. 连接Kiro(免费Claude)
Dashboard → Providers → Connect Kiro → AWS Builder ID登录
# 2. 配置Claude Code
# ~/.claude/config.json
{
"anthropic_api_base": "http://localhost:20128/v1",
"anthropic_api_key": "your-9router-api-key"
}
# 3. 使用免费Claude模型
# model: kr/claude-sonnet-4.5
十、总结与展望
10.1 核心优势
- 统一接入:40+提供商,一种API格式
- 智能路由:3层回退,永不中断
- 成本优化:免费额度最大化利用
- 灵活部署:本地/Docker/边缘节点
- 开源透明:MIT协议,社区驱动
10.2 适用人群
- AI应用开发者:需要多模型对比/ fallback
- CLI工具用户:Claude Code、Cursor、Codex用户
- 技术团队:需要统一AI网关管理
- 开源贡献者:对AI基础设施感兴趣
10.3 学习价值
| 技术点 | 学习价值 |
|---|---|
| 翻译器模式 | 协议转换的经典实现 |
| 流式处理 | Web Streams API实战 |
| 错误恢复 | 熔断、退避、状态机 |
| OAuth集成 | 多提供商认证流程 |
| MITM代理 | HTTPS拦截技术 |
10.4 项目资源
- GitHub: https://github.com/decolua/9router
- 官网: https://9router.com
- 文档: 项目内 docs/ARCHITECTURE.md
附录:快速开始
bash
# 1. 安装
npm install -g 9router
# 2. 启动
9router
# 3. 打开Dashboard
open http://localhost:20128
# 4. 连接提供商(Dashboard操作)
# Providers → Connect → OAuth登录
# 5. 使用
export OPENAI_BASE_URL="http://localhost:20128/v1"
export OPENAI_API_KEY="your-api-key-from-dashboard"
curl http://localhost:20128/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "if/kimi-k2-thinking",
"messages": [{"role": "user", "content": "Hello!"}]
}'
关于作者:本文基于9Router开源项目架构分析撰写,旨在帮助开发者理解AI网关的设计原理和实现细节。
版权声明:本文采用 CC BY-NC-SA 4.0 协议,转载请注明出处。
标签: #AI网关 #开源项目 #Next.js #Node.js #流式处理 #多模型路由 #CSDN博客
分类: 后端开发 / 人工智能 / 开源项目分析