9Router:开源AI路由网关的架构设计与技术实现深度解析

9Router:开源AI路由网关的架构设计与技术实现深度解析

摘要:9Router是一款基于Next.js和Cloudflare Workers构建的开源AI路由网关,支持40+AI服务提供商的统一接入。本文将深入剖析其核心架构、翻译引擎、流式处理机制等关键技术点,为开发者提供构建AI网关的实战经验。


目录

  1. 项目概述与核心痛点
  2. 整体架构设计
  3. 核心模块深度解析
  4. AI服务提供商生态
  5. 多语言国际化方案
  6. MITM代理与流量拦截
  7. 流式响应处理机制
  8. 技术亮点总结
  9. 实战应用场景
  10. 总结与展望

一、项目概述与核心痛点

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代理拦截,主要用于:

  1. 拦截CLI工具请求:Claude Code、Codex等硬编码API端点的工具
  2. 请求/响应修改:注入自定义头、修改请求体
  3. 本地调试:查看明文请求内容

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 核心优势

  1. 统一接入:40+提供商,一种API格式
  2. 智能路由:3层回退,永不中断
  3. 成本优化:免费额度最大化利用
  4. 灵活部署:本地/Docker/边缘节点
  5. 开源透明:MIT协议,社区驱动

10.2 适用人群

  • AI应用开发者:需要多模型对比/ fallback
  • CLI工具用户:Claude Code、Cursor、Codex用户
  • 技术团队:需要统一AI网关管理
  • 开源贡献者:对AI基础设施感兴趣

10.3 学习价值

技术点 学习价值
翻译器模式 协议转换的经典实现
流式处理 Web Streams API实战
错误恢复 熔断、退避、状态机
OAuth集成 多提供商认证流程
MITM代理 HTTPS拦截技术

10.4 项目资源


附录:快速开始

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博客

分类: 后端开发 / 人工智能 / 开源项目分析

相关推荐
新缸中之脑3 小时前
在GCP上运行autoresearch
人工智能
Fleshy数模3 小时前
OpenCV 实时人脸检测实战:从视频文件到人脸框标注
人工智能·opencv·计算机视觉
Timer@3 小时前
LangChain 教程 04|Agent 详解:让 AI 学会“自己干活“
javascript·人工智能·langchain
青稞社区.3 小时前
ICLR‘26 Oral | 当 LLM Agent 在多轮推理中迷失时:T3 如何让强化学习重新学会主动推理
人工智能·算法·agi
环黄金线HHJX.4 小时前
Tuan符号系统重塑智能开发
开发语言·人工智能·算法·编辑器
代码搬运媛4 小时前
AI 大模型 + RAG + 智能体 + 工程落地面试题
人工智能
摸鱼仙人~4 小时前
Agent & RAG 底层核心难点
人工智能
小手指动起来4 小时前
保姆级提示词工程学习总结(含实操示例+工具推荐)
人工智能·学习·自然语言处理
龙文浩_4 小时前
AI人工神经网络核心原理与深度学习机制解析
人工智能·深度学习·神经网络