137 lines
4.2 KiB
Markdown
137 lines
4.2 KiB
Markdown
# Model Proxy 模块
|
||
|
||
大模型请求代理模块,用于代理和管理大模型 API 请求。
|
||
|
||
## 功能特性
|
||
|
||
1. **API Key 代理**:用户使用自己的 API Key,后端代理到实际的大模型服务
|
||
2. **配置管理**:通过 HTTP API 管理 API Key 配置
|
||
3. **高性能**:基于 Netty 实现的高性能 HTTP/HTTPS 代理
|
||
4. **缓存支持**:使用本地缓存提高查询性能
|
||
|
||
## 架构设计
|
||
|
||
```
|
||
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
||
│ Client │ ───> │ Model Proxy │ ───> │ LLM Provider │
|
||
│ (User API Key)│ │ Server │ │ (Backend API) │
|
||
└─────────────────┘ └──────────────────┘ └─────────────────┘
|
||
│
|
||
▼
|
||
┌──────────────────┐
|
||
│ Configuration │
|
||
│ Service │
|
||
└──────────────────┘
|
||
```
|
||
|
||
## 核心组件
|
||
|
||
### 1. ModelProxyServer
|
||
代理服务器启动类,基于 Netty 实现 HTTP/HTTPS 代理服务。
|
||
|
||
**配置项:**
|
||
- `model.proxy.port`: 代理服务端口(默认:8088)
|
||
- `model.proxy.ssl.enabled`: 是否启用 SSL(默认:false)
|
||
|
||
### 2. HttpProxyRequestHandler
|
||
HTTP 请求处理器,负责:
|
||
- 提取用户 API Key
|
||
- 查询代理配置
|
||
- 转发请求到后端服务
|
||
- 转发响应到客户端
|
||
|
||
### 3. ModelApiProxyConfigService
|
||
配置管理服务,提供:
|
||
- 根据用户 API Key 查询配置
|
||
- 添加/更新配置
|
||
- 删除配置
|
||
- 根据 ID 查询配置
|
||
|
||
### 4. ModelApiProxyConfigController
|
||
HTTP API 控制器,提供 RESTful 接口:
|
||
- `GET /api/model/proxy/config/query?userApiKey={key}` - 查询配置
|
||
- `GET /api/model/proxy/config/get/{id}` - 根据 ID 查询
|
||
- `POST /api/model/proxy/config/save` - 保存/更新配置
|
||
- `DELETE /api/model/proxy/config/delete/{id}` - 删除配置
|
||
|
||
## 使用方法
|
||
|
||
### 1. 配置代理服务
|
||
|
||
在 `application.yml` 中配置:
|
||
|
||
```yaml
|
||
model:
|
||
proxy:
|
||
port: 8088
|
||
ssl:
|
||
enabled: false
|
||
```
|
||
|
||
### 2. 添加代理配置
|
||
|
||
调用 API 添加配置:
|
||
|
||
```bash
|
||
curl -X POST http://localhost:8080/api/model/proxy/config/save \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"userApiKey": "sk-user-xxx",
|
||
"baseUrl": "https://api.openai.com/v1",
|
||
"backendApiKey": "sk-backend-yyy",
|
||
"model": "gpt-4",
|
||
"enabled": true,
|
||
"description": "OpenAI GPT-4 代理"
|
||
}'
|
||
```
|
||
|
||
### 3. 使用代理
|
||
|
||
客户端使用用户 API Key 调用大模型:
|
||
|
||
```bash
|
||
curl -X POST http://localhost:8088/api/proxy/model/v1/chat/completions \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer sk-user-xxx" \
|
||
-d '{
|
||
"model": "gpt-4",
|
||
"messages": [{"role": "user", "content": "Hello!"}]
|
||
}'
|
||
```
|
||
|
||
代理服务器会:
|
||
1. 提取 `Authorization` 或 `x-api-key` 头中的用户 API Key
|
||
2. 查询对应的代理配置
|
||
3. 将请求转发到后端服务(使用后端 API Key)
|
||
4. 将响应返回给客户端
|
||
|
||
## 数据库表
|
||
|
||
```sql
|
||
CREATE TABLE `model_api_proxy_config` (
|
||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
|
||
`tenant_id` BIGINT(20) NOT NULL,
|
||
`user_api_key` VARCHAR(255) NOT NULL,
|
||
`base_url` VARCHAR(512) NOT NULL,
|
||
`backend_api_key` VARCHAR(255) NOT NULL,
|
||
`model` VARCHAR(128) DEFAULT NULL,
|
||
`enabled` TINYINT(1) NOT NULL DEFAULT 1,
|
||
`description` VARCHAR(512) DEFAULT NULL,
|
||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_tenant_user_api_key` (`tenant_id`, `user_api_key`)
|
||
);
|
||
```
|
||
|
||
## 接口文档
|
||
|
||
启动服务后访问 Swagger 文档:http://localhost:8080/swagger-ui.html
|
||
|
||
## 注意事项
|
||
|
||
1. 代理服务器默认使用 HTTP,如需 HTTPS 请配置 SSL 证书
|
||
2. 用户 API Key 需要在租户内唯一
|
||
3. 配置信息会缓存 5 分钟,修改配置后即时生效
|
||
4. 支持 WebSocket 连接升级
|