# llm-gateway
**Repository Path**: orionis/llm-gateway
## Basic Information
- **Project Name**: llm-gateway
- **Description**: Squirrel LLM Gateway is a high-performance, enterprise-grade proxy service designed to unify and manage access to Large Language Model (LLM) providers like OpenAI and Anthropic. It provides intelligent routing, robust failover strategies, comprehensive logging, and a modern management dashboard.
- **Primary Language**: Python
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-27
- **Last Updated**: 2026-04-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

Squirrel
企业级 LLM 网关
面向 OpenAI、Anthropic 及兼容 API 的统一代理服务
English ·
中文
## 概述
**Squirrel** 是一个高性能、生产就绪的代理服务,用于统一管理和访问多个大语言模型(LLM)供应商。它作为应用程序与 LLM 服务之间的智能网关,提供无缝的故障转移、负载均衡、全面的可观测性以及现代化的管理面板——现已原生支持 OpenAI Responses,并可在 OpenAI Chat、OpenAI Responses 与 Anthropic Messages 之间平滑转换。
### 为什么选择 Squirrel?
- **单一集成点**:一次接入,通过统一 API 访问多个 LLM 供应商
- **零代码改动**:完全兼容 OpenAI 和 Anthropic SDK,即插即用
- **成本优化**:基于规则、优先级或成本智能路由请求
- **生产就绪**:内置重试逻辑、故障转移机制和详细的请求日志
- **全面可见**:追踪每个请求的 Token 用量、延迟指标和成本分析
---
## 核心特性
### 统一 API 接口
- **兼容 OpenAI**:全面支持 `/v1/chat/completions`、`/v1/completions`、`/v1/embeddings`、`/v1/audio/*`、`/v1/images/*`
- **兼容 OpenAI Responses**:支持 `/v1/responses`,含流式与工具调用
- **兼容 Anthropic**:原生支持 `/v1/messages` 端点
- **协议转换**:基于内置 `llm_api_converter`,实现 OpenAI Chat ↔ OpenAI Responses ↔ Anthropic Messages 的请求、响应与流式互转
- **流式支持**:完整的 Server-Sent Events (SSE) 支持,实现实时响应
### 智能路由
- **规则路由**:基于模型名称、请求头、消息内容或 Token 数量路由请求
- **负载均衡策略**:
- **轮询(Round-Robin)**:在供应商之间均匀分配请求
- **优先级(Priority)**:优先使用首选供应商,失败时回退到其他
- **权重(Weight)**:按自定义权重比例分配请求
- **最优成本(Cost-Based)**:根据 API 价格,自动选择价格最低的模型
- **模型映射**:将虚拟模型名称映射到多个后端供应商
### 高可用
- **自动重试**:针对服务器错误(HTTP 500+)可配置重试次数
- **供应商故障转移**:失败时无缝切换到备用供应商
- **超时管理**:可配置的请求超时,支持长时间流式响应(默认:30 分钟)
### 全面可观测性
- **日志分层存储**:摘要字段保存在 `request_logs`,大体积的请求/响应载荷保存在 `request_log_details`,降低存储压力并提升日志列表查询性能
- **明细独立保留期**:请求/响应详情可以比摘要日志更早过期,在保留统计与审计能力的同时减少大字段长期占用
- **全量日志记录**:完整记录请求体和响应体(包括流式响应),便于问题追溯、调试及 AI 系统效果优化
- **Token 统计**:使用 [tiktoken](https://github.com/openai/tiktoken) 自动计算 Token 用量
- **延迟指标**:首字节延迟和总响应时间
- **成本分析**:按时间、模型、供应商和 API Key 聚合统计
- **数据脱敏**:日志中自动对敏感信息进行脱敏处理
### 现代化管理面板
基于 **Next.js 16** + **TypeScript** + **shadcn/ui** 构建:
- 供应商管理,支持连接测试
- 模型映射配置,内置规则编辑器
- API Key 生成和生命周期管理
- 高级日志查看器,支持多维度筛选
- 成本统计和用量分析
---
## 快速开始
### Docker Compose(推荐)
使用 PostgreSQL 的最快启动方式:
```bash
# 克隆仓库
git clone https://github.com/mylxsw/llm-gateway.git
cd llm-gateway
# 启动服务
docker compose -f docker-compose.prod.yml up -d
```
访问管理面板:**http://localhost:8000**
### Docker(单容器)
使用 SQLite 进行简单部署:
```bash
docker run -d \
-p 8000:8000 \
-v $(pwd)/data:/data \
--name llm-gateway \
ghcr.io/mylxsw/llm-gateway:latest
```
### 手动安装
#### 环境要求
- Python 3.12+
- Node.js 18+
- npm(用于前端)
#### 后端设置
```bash
cd backend
# 安装依赖(选择一种方式)
uv sync # 推荐:使用 uv
pip install -r requirements.txt # 或使用 pip
# 初始化数据库
alembic upgrade head
# 启动服务
uvicorn app.main:app --host 0.0.0.0 --port 8000
```
#### 前端设置
```bash
cd frontend
# 安装依赖
npm install
# 开发模式
npm run dev
# 生产构建
npm run build && npm run start
```
---
## 使用方法
### 基本配置
1. **添加供应商**:进入供应商页面,添加您的 LLM 供应商(如 OpenAI)
- 设置基础 URL(如 `https://api.openai.com/v1`)
- 添加您的 API Key
- 选择协议类型(OpenAI、OpenAI Responses 或 Anthropic)
2. **创建模型映射**:进入模型页面创建映射
- 定义模型名称(如 `gpt-4`)
- 关联一个或多个供应商
- 设置路由优先级/权重
3. **生成 API Key**:在 API Keys 页面创建网关 API Key
4. **连接您的应用**:
```python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="lgw-your-gateway-api-key"
)
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "你好!"}]
)
```
#### OpenAI Responses 示例
```python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="lgw-your-gateway-api-key"
)
response = client.responses.create(
model="gpt-4.1-mini",
input="请用一句话概括。"
)
```
### API 端点
#### 代理端点(OpenAI 兼容)
| 方法 | 端点 | 描述 |
|------|------|------|
| GET | `/v1/models` | 获取可用模型列表 |
| POST | `/v1/chat/completions` | 对话补全 |
| POST | `/v1/completions` | 文本补全 |
| POST | `/v1/embeddings` | 生成向量嵌入 |
| POST | `/v1/audio/speech` | 文字转语音 |
| POST | `/v1/audio/transcriptions` | 语音转文字 |
| POST | `/v1/audio/translations` | 语音转文字(翻译) |
| POST | `/v1/images/generations` | 图像生成 |
| POST | `/v1/responses` | Responses API |
#### 代理端点(Anthropic 兼容)
| 方法 | 端点 | 描述 |
|------|------|------|
| POST | `/v1/messages` | Messages API |
#### 管理端点
| 资源 | 端点 |
|------|------|
| 供应商 | `GET/POST /api/admin/providers`,`GET/PUT/DELETE /api/admin/providers/{id}` |
| 模型 | `GET/POST /api/admin/models`,`GET/PUT/DELETE /api/admin/models/{model}` |
| API Keys | `GET/POST /api/admin/api-keys`,`GET/PUT/DELETE /api/admin/api-keys/{id}` |
| 日志 | `GET /api/admin/logs`,`GET /api/admin/logs/stats` |
完整 API 文档请参阅 [docs/api.md](docs/api.md)。
---
## 配置说明
### 环境变量
| 变量 | 默认值 | 描述 |
|------|--------|------|
| `APP_NAME` | LLM Gateway | 应用名称 |
| `DEBUG` | false | 启用调试模式 |
| `DATABASE_TYPE` | sqlite | 数据库类型:`sqlite` 或 `postgresql` |
| `DATABASE_URL` | sqlite+aiosqlite:///./llm_gateway.db | 数据库连接字符串 |
| `RETRY_MAX_ATTEMPTS` | 3 | 500+ 错误的最大重试次数 |
| `RETRY_DELAY_MS` | 1000 | 重试间隔(毫秒) |
| `HTTP_TIMEOUT` | 1800 | 上游请求超时(秒) |
| `API_KEY_PREFIX` | lgw- | 生成的 API Key 前缀 |
| `API_KEY_LENGTH` | 32 | 生成的 API Key 长度 |
| `ENCRYPTION_KEY` | - | 用于加密存储敏感字段的 32 字节 Base64 密钥(重启后必须保持不变) |
| `ENABLE_VIEW_API_KEYS` | false | 是否允许在 API Keys 页面再次查看/复制完整 API Key |
| `RATE_LIMIT_ENABLED` | false | 启用/禁用内置限流中间件 |
| `ADMIN_USERNAME` | - | 管理员登录用户名(可选) |
| `ADMIN_PASSWORD` | - | 管理员登录密码(可选) |
| `ADMIN_TOKEN_TTL_SECONDS` | 86400 | 管理员会话有效期(24 小时) |
| `LOG_RETENTION_DAYS` | 7 | 日志保留天数 |
| `LOG_DETAIL_RETENTION_DAYS` | 7 | 请求/响应大字段明细的保留天数,必须小于或等于 `LOG_RETENTION_DAYS` |
| `LOG_CLEANUP_INTERVAL_HOURS` | 24 | 定时日志清理的执行间隔(小时) |
| `LLM_GATEWAY_PORT` | 8000 | Docker Compose 主机端口 |
| `KV_STORE_TYPE` | database | KV 存储后端:`database` 或 `redis` |
| `REDIS_URL` | - | Redis 连接 URL(使用 Redis KV 存储时) |
### 日志保留行为
- `LOG_RETENTION_DAYS` 控制摘要日志保留多久。
- `LOG_DETAIL_RETENTION_DAYS` 控制请求/响应大字段明细保留多久。
- 明细过期后,日志列表和统计仍然可用,但请求体、请求头、上游载荷,以及基于这些数据的重试与 Playground 调试能力将不可用。
- 定时清理按照 `LOG_CLEANUP_INTERVAL_HOURS` 周期执行。
生成加密密钥:
```bash
python -c "import secrets, base64; print(base64.urlsafe_b64encode(secrets.token_bytes(32)).decode())"
```
在 `.env` 中设置(生产环境必填):
```env
ENCRYPTION_KEY=your-generated-key
```
### 数据库配置
**SQLite**(默认,简单部署):
```env
DATABASE_TYPE=sqlite
DATABASE_URL=sqlite+aiosqlite:///./llm_gateway.db
```
**PostgreSQL**(推荐用于生产环境):
```env
DATABASE_TYPE=postgresql
DATABASE_URL=postgresql+asyncpg://user:password@localhost:5432/llm_gateway
```
---
## 支持的供应商
Squirrel 可以代理任何 OpenAI 或 Anthropic 兼容的 API:
| 供应商 | 协议 | 说明 |
|--------|------|------|
| OpenAI | OpenAI | 全面支持 GPT-4、GPT-3.5、嵌入、语音、图像 |
| OpenAI | OpenAI Responses | 通过 `/v1/responses` 提供 Responses API |
| Anthropic | Anthropic | 通过 Messages API 支持 Claude 模型 |
| Azure OpenAI | OpenAI | 使用 Azure 端点 URL |
| 本地模型 | OpenAI | Ollama、vLLM、LocalAI 等 |
| 其他供应商 | OpenAI/Anthropic | 任何兼容的 API 端点 |
---
## 开发指南
### 项目结构
```
llm-gateway/
├── backend/
│ ├── app/
│ │ ├── api/ # API 路由(代理、管理)
│ │ ├── services/ # 业务逻辑
│ │ ├── providers/ # 协议适配器
│ │ ├── repositories/ # 数据访问层
│ │ ├── db/ # 数据库模型
│ │ ├── domain/ # DTO 和领域模型
│ │ ├── rules/ # 规则评估引擎
│ │ └── common/ # 工具类
│ ├── migrations/ # Alembic 数据库迁移
│ └── tests/ # 测试套件
├── llm_api_converter/ # 协议转换 SDK(OpenAI/Responses/Anthropic)
├── frontend/
│ └── src/
│ ├── app/ # Next.js App Router 页面
│ ├── components/ # React 组件
│ └── lib/ # 工具类和 API 客户端
├── docker-compose.yml
└── Dockerfile
```
### 运行测试
```bash
cd backend
pytest
```
### 数据库迁移
```bash
cd backend
# 创建新的迁移
alembic revision --autogenerate -m "description"
# 应用迁移
alembic upgrade head
```
---
## 文档
- [架构设计](docs/architecture.md)
- [API 参考](docs/api.md)
- [模块详情](docs/modules.md)
- [协议转换](docs/protocol_conversion.md)
- [需求文档](docs/req.md)
---
## 许可证
[MIT](LICENSE)
---
为 LLM 社区用心打造