# llm-gateway
**Repository Path**: gu-beichen-starlight/llm-gateway
## Basic Information
- **Project Name**: llm-gateway
- **Description**: 本项目是一个**企业级 LLM 统一网关**,为多厂商大模型服务提供统一的接入入口。网关层统一处理**认证鉴权、流量控制、计费统计、请求转发**等通用能力,上层业务无需关心底层 LLM 厂商的差异,实现模型的无缝切换与统一管理。
- **Primary Language**: Go
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-05-08
- **Last Updated**: 2026-05-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# LLM Gateway · StarGate
**企业级 LLM 统一接入网关**
一个基于 Go 语言开发的生产级大语言模型 API 网关,为多厂商 LLM 提供统一的接入入口,统一处理认证鉴权、流量控制、精准计费与全链路可观测性。
[](https://golang.org/)
[](LICENSE)
[](https://www.postgresql.org/)
[](https://redis.io/)
---
## 功能特性
- **多厂商统一接入**:OpenAI、硅基流动、豆包、Ollama、vLLM,一套 API 无缝切换
- **完整身份体系**:管理员后台 Token + 用户 API Key 双鉴权,SHA-256 哈希存储,明文不落库
- **精准 Token 计费**:tiktoken 本地预估 + 厂商实际用量结算,Redis Lua 原子操作保证一致性
- **灵活流量控制**:API Key 级别 RPM(每分钟请求数)+ TPD(每日 Token 配额)双维度限速
- **多种响应模式**:同步 HTTP、SSE 流式、WebSocket 全双工,满足不同场景需求
- **故障自动转移**:多厂商按优先级 Failover,上游 5xx/超时自动切换,全部失败返回 503
- **异步高性能写入**:BillingWorker + Channel 批量落库,不阻塞响应链路
- **全链路可观测性**:Prometheus 指标埋点 + 结构化日志,内置 `/metrics` 端点
## 界面预览
### 数据总览

### 用量流水

### 聊天测试

## 系统架构
```
客户端请求
↓
[Gin HTTP 层] — 路由分发、协议解析
↓
[中间件层] — 认证 / 限速 / 日志 / 追踪 / Metrics / Panic 恢复
↓
[Service 层] — 业务逻辑编排、核心转发流程
↓
[Mapper 层] — 数据库 CRUD 抽象(GORM)
↓
[数据存储层] — PostgreSQL(持久化)+ Redis(缓存 / 限速 / 计费)
↓(转发请求)
[LLM Provider 层] — 各厂商 API 适配、格式转换
↓
OpenAI / 硅基流动 / 豆包 / Ollama / vLLM
```
## 技术栈
| 技术 | 版本 | 用途 |
| :--- | :--- | :--- |
| **Go** | 1.24+ | 核心开发语言,高并发网关流量处理 |
| **Gin** | 最新 | Web 框架,HTTP 路由与中间件 |
| **GORM** | 最新 | ORM,操作 PostgreSQL |
| **PostgreSQL** | 16+ | 关系型数据库,存储用户、厂商、模型、账单等核心数据 |
| **Redis** | 7.0+ | 会话存储、余额缓存、限速计数、分布式原子操作 |
| **tiktoken-go** | 最新 | 本地 Token 估算,用于请求前余额预检 |
| **Prometheus** | 最新 | Metrics 指标监控,支持 Grafana 可视化 |
| **MinIO** | 最新 | 对象存储(预留接口,当前版本不使用) |
## 快速开始
### 环境要求
- Go 1.24+
- PostgreSQL 16+
- Redis 7.0+
### 配置说明
编辑 `config.yaml`:
```yaml
server:
port: 4300
mode: debug # debug | release
database:
host: localhost
port: 5432
user: postgres
password: "your_password"
db_name: llm_gateway
schema: public
max_idle_conns: 10
max_open_conns: 100
conn_max_lifetime: 3600
redis:
host: localhost
port: 6379
password: ""
db: 0
billing:
flush_interval: 5s # 后台 Worker 批量写 DB 间隔
channel_buffer: 10000 # Worker Channel 缓冲大小
websocket:
idle_timeout: 5m # 空闲连接超时
max_message_size: 1048576 # 单帧最大消息体(1 MiB)
```
### 编译运行
```bash
# 克隆项目
git clone https://gitee.com/gu-beichen-starlight/llm-gateway.git
cd llm-gateway
# 整理依赖
go mod tidy
# 编译
go build -o llm-gateway
# 运行
./llm-gateway -config config.yaml
```
服务启动后默认监听 `http://0.0.0.0:4300`
## API 接口
### 认证接口
| 方法 | 路径 | 说明 |
| :--- | :--- | :--- |
| POST | /api/auth/login | 用户 / 管理员登录 |
| POST | /api/auth/logout | 登出 |
### 网关接口(OpenAI 兼容格式)
| 方法 | 路径 | 说明 |
| :--- | :--- | :--- |
| POST | /v1/chat/completions | 聊天完成(HTTP 同步 / SSE 流式,由 `stream` 字段决定) |
| GET | /v1/chat/ws | WebSocket 全双工流式聊天 |
| POST | /v1/embeddings | 文本嵌入向量 |
| GET | /v1/models | 查询可用模型列表 |
### 用户自服务接口
| 方法 | 路径 | 说明 |
| :--- | :--- | :--- |
| GET | /api/user/balance | 查询账户余额 |
| GET | /api/user/usage/stats | 查询个人用量统计 |
| POST/GET | /api/user/apikeys | 创建 / 查看 API Key |
| POST | /api/user/apikeys/delete | 删除 API Key |
### 管理接口(需 Admin 权限)
| 方法 | 路径 | 说明 |
| :--- | :--- | :--- |
| POST/GET | /api/admin/users | 用户管理 |
| POST/GET | /api/admin/vendors | LLM 厂商管理 |
| POST/GET | /api/admin/models | 模型配置管理 |
| POST/GET | /api/admin/apikeys | API Key 管理 |
| POST | /api/admin/billing/recharge | 用户充值 |
| GET | /api/admin/billing/records | 充值记录 |
| GET | /api/admin/billing/usage | 全量用量流水 |
| GET | /api/admin/billing/usage/stats | 用量聚合统计 |
| GET | /api/admin/users/stats | 用户统计报表 |
### 监控
| 方法 | 路径 | 说明 |
| :--- | :--- | :--- |
| GET | /metrics | Prometheus 指标端点(无需鉴权) |
## 使用示例
### cURL 调用聊天接口
```bash
# 非流式
curl -X POST http://localhost:4300/v1/chat/completions \
-H "Authorization: Bearer sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "你好,请介绍一下自己"}],
"stream": false
}'
# SSE 流式
curl -X POST http://localhost:4300/v1/chat/completions \
-H "Authorization: Bearer sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "你好"}],
"stream": true
}'
```
### Python 调用示例
```python
from openai import OpenAI
client = OpenAI(
api_key="sk-your-api-key",
base_url="http://localhost:4300/v1"
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "你好,请介绍一下自己"}]
)
print(response.choices[0].message.content)
```
## 限流说明
限流基于 API Key 级别,支持两种策略:
- **RPM**:每分钟请求数限制(Redis ZSet 滑动窗口)
- **TPD**:每日 Token 消耗限制(Redis 原子累加,次日零点重置)
`rate_limit_rpm = 0` 或 `rate_limit_tpd = 0` 表示不限制。超出限制返回 HTTP 429。
## 计费说明
- 余额单位为**微分**(1 元 = 100 分 = 100,000 微分)
- 请求前:tiktoken 本地估算 Prompt Token 数,Lua 脚本原子检查余额并预扣
- 请求后:以厂商返回的 `usage` 字段为准多退少补;厂商不返回时以本地计算值兜底
- 异步写入:BillingWorker 批量 INSERT 使用流水,BalanceSyncWorker 定时同步 Redis 余额到 DB
## Metrics 监控
内置 Prometheus 指标,通过 `/metrics` 端点暴露:
| 指标名 | 类型 | 说明 |
| :--- | :--- | :--- |
| `llmgw_requests_total` | Counter | HTTP 请求总数 |
| `llmgw_request_duration_seconds` | Histogram | 请求耗时分布 |
| `llmgw_tokens_total` | Counter | Token 消耗总量(区分 input/output) |
| `llmgw_billing_total_ufen` | Counter | 累计扣费金额(微分) |
| `llmgw_active_streams` | Gauge | 当前活跃流式连接数 |
| `llmgw_rate_limit_hits_total` | Counter | 限流命中次数 |
## 项目结构
```
llm-gateway/
├── main.go # 程序入口,启动 Gin + 后台 Worker
├── config.yaml # 配置文件
├── pkg/ # 可复用基础包(无业务依赖)
│ ├── config/ # 配置加载、DB/Redis/MinIO 初始化
│ ├── result/result.go # 统一响应结构 Result[T]
│ ├── page/page.go # 统一分页结构 Page[T]
│ ├── util/id_util.go # 带前缀的 ULID 生成(u_ / m_ / ak_ ...)
│ ├── middleware/ # Gin 中间件(认证 / 限速 / 日志 / Metrics)
│ ├── llm/ # LLM Provider 接口 + 各厂商适配
│ ├── billing/ # 计费引擎(Lua 脚本 / Worker / 余额同步)
│ ├── ratelimit/ # Redis 滑动窗口限速实现
│ └── metrics/ # Prometheus 指标定义
├── src/
│ ├── admin/ # 管理后台业务模块
│ │ ├── domain/ # DO / DTO / VO 数据对象
│ │ ├── mapper/ # 数据库 CRUD(GORM)
│ │ └── service/ # 业务逻辑层
│ ├── gateway/service/ # 网关核心:路由服务 + 转发服务
│ └── router/ # 路由注册
│ ├── api/ # 管理后台接口(/api/admin/* 和 /api/user/*)
│ └── v1/ # 网关标准接口(/v1/*,OpenAI 兼容格式)
└── web/ # 前端管理面板
```
## 许可证
[MIT License](LICENSE)
## 贡献指南
欢迎提交 Issue 和 Pull Request!