llm-router

LLM-Router 整体架构

生成时间: 2026-05-11 基于 Go 参考项目规格适配 TypeScript/Express 实现

系统架构概览

┌─────────────────────────────────────────────────────────┐
│                     客户端 (各类 AI 工具等)                    │
│  配置: LLM-Router URL 为 OpenAI Base URL                  │
│  配置: LLM-Router API Key 为 OpenAI API Key               │
└──────────────────────────┬──────────────────────────────┘
                           │ HTTP/HTTPS
                           ▼
┌─────────────────────────────────────────────────────────┐
│                LLM-Router (Express, Port 11411)           │
│                                                           │
│  ┌─────────────┐   ┌──────────────┐   ┌──────────────┐  │
│  │  app.ts      │──▶│ config/      │   │  logger/      │  │
│  │  (入口)      │   │ (配置加载)    │   │  (Winston)    │  │
│  └─────────────┘   └──────────────┘   └──────────────┘  │
│         │                                                  │
│         ▼                                                  │
│  ┌─────────────────────────────────────────────────────┐ │
│  │              Express 中间件链                          │ │
│  │                                                       │ │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────────┐      │ │
│  │  │ CORS处理  │  │ 认证检查  │  │ 请求预处理    │      │ │
│  │  │ (cors.ts) │  │(auth.ts)  │  │(preprocess)  │      │ │
│  │  └──────────┘  └──────────┘  └──────────────┘      │ │
│  └─────────────────────┬───────────────────────────────┘ │
│                        │                                  │
│                        ▼                                  │
│  ┌─────────────────────────────────────────────────────┐ │
│  │              handler/ (请求处理)                       │ │
│  │                                                       │ │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────────┐         │ │
│  │  │ 模型别名  │ │ 前缀路由  │ │ 流式检测      │         │ │
│  │  └──────────┘ └──────────┘ └──────────────┘         │ │
│  └─────────────────────┬───────────────────────────────┘ │
│                        │                                  │
│                        ▼                                  │
│  ┌─────────────────────────────────────────────────────┐ │
│  │           proxy/ (反向代理层)                          │ │
│  │                                                       │ │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────────┐         │ │
│  │  │ Proxy Map │ │ Director  │ │  事件钩子     │         │ │
│  │  │ 前缀→代理  │ │ 请求改写  │ │  日志/调试   │         │ │
│  │  └──────────┘ └──────────┘ └──────────────┘         │ │
│  └─────────────────────┬───────────────────────────────┘ │
│                        │                                  │
│         ┌──────────────┼──────────────┐                  │
│         ▼              ▼              ▼                   │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐         │
│  │ OpenAI 后端  │ │ Ollama 后端  │ │  Groq 后端   │         │
│  │ (需要 API Key)│ │ (本地无 Key) │ │ (需要 API Key)│         │
│  └─────────────┘ └─────────────┘ └─────────────┘         │
└───────────────────────────────────────────────────────────┘

核心模块交互

┌──────────┐     ┌──────────────┐     ┌──────────────┐
│  app.ts   │────▶│  config/     │────▶│   types/     │
│  (启动)   │     │  (加载配置)  │     │ (Zod Schema) │
└────┬─────┘     └──────────────┘     └──────────────┘
     │
     │ 注册中间件与路由
     ▼
┌──────────────────────────────────────┐
│          Express 中间件链               │
│                                      │
│  cors → auth → body-parser → routes  │
└──────────────┬───────────────────────┘
               │
     ┌─────────┼─────────┐
     ▼                   ▼
┌───────────┐     ┌───────────────────┐
│ routes/    │     │ middleware/       │
│ (路由)     │────▶│ (预处理: 别名,    │
│            │     │  重写, 过滤)      │
└─────┬─────┘     └───────────────────┘
      │
      ▼
┌───────────┐     ┌───────────────────┐
│ handler/   │────▶│   proxy/          │
│ (处理)     │     │ (转发到后端)       │
└───────────┘     └───────────────────┘

请求处理流水线

客户端请求
  │
  ▼
Express 服务器接收
  │
  ├── OPTIONS 请求? ──▶ CORS 中间件返回 204
  │
  ├── Bearer Token 认证 ──▶ 401 Unauthorized (无效)
  │
  ├── POST /chat/completions?
  │     │
  │     ├── 1. 解析请求体 (JSON)
  │     ├── 2. 检测流式标记 (stream: true)
  │     ├── 3. 应用模型别名 (aliases 映射)
  │     ├── 4. 匹配后端前缀 → 选择代理
  │     ├── 5. 移除前缀 (openai/gpt-4o → gpt-4o)
  │     ├── 6. 应用角色重写 (role_rewrites)
  │     ├── 7. 移除不支持参数 (unsupported_params)
  │     └── 8. 代理转发 → 后端 API
  │
  └── 其他路径 ──▶ DefaultProxy 转发
                     └── 无默认后端 → 502

配置加载流程

1. 解析命令行参数 (commander/yargs)
   ↓
2. 初始化 Winston 日志器 (createLogger)
   ↓
3. 加载 .env 文件 (dotenv)
   ↓
4. 加载配置文件 (JSON/YAML, 支持 JSONC)
   ↓ 文件不存在?
   → 使用硬编码默认配置
   ↓
5. Zod Schema 验证配置 (validateConfig)
   ↓ 验证失败?
   → 输出详细错误信息并退出进程
   ↓
6. 应用命令行参数覆盖 (port, apiKeyEnv, apiKey)
   ↓
7. 确定 LLM_ROUTER_API_KEY (命令行 > 环境变量 > 自动生成)
   ↓
8. 初始化反向代理 (initializeProxies)
   ↓
9. 注册 Express 中间件与路由
   ↓
10. 启动 HTTP 服务 (app.listen)

与 Go 版本架构对比

组件 Go 版本 TypeScript 版本
HTTP 入口 cmd/main.go src/app.ts
配置加载 config/config.go + flag src/config/ + Zod + dotenv
中间件 内嵌在 handler src/middleware/ (Express 中间件链)
路由 handler/handler.go ServeMux src/routes/ Express Router
反向代理 httputil.ReverseProxy http-proxy-middleware
数据模型 model/model.go struct src/types/ Zod + TypeScript
日志 logging/logging.go Zap src/logger/ Winston
工具函数 utils/utils.go src/utils/
请求预处理 handler 内联逻辑 src/middleware/request-preprocessor.ts