Files
llm-proxy/README.md
T
hz4th_coder d387d5ba09 v2.1.1: Auto配置改为模型粒度拖动排序 + 历史缓存复用 + 对话生图
- Auto配置编辑: 粒度从提供商改为具体模型, 原生HTML5拖动排序, 修复已保存模型不显示勾选(字符串/对象混拼bug)
- 历史缓存: 带历史上下文的auto请求按首条消息识别会话, 优先复用上次模型命中上游前缀缓存
  (可配置: prefer_cache_model + cache_ttl_seconds, 系统配置页开关 + /api/admin/routing)
- 对话生图: chat页选 auto-image/Qwen-Image 直接调生图接口并在对话内展示图片
- 修复: Flask模板缓存导致改模板不生效 -> TEMPLATES_AUTO_RELOAD
- 修复: 自动回退/显式有序模型列表路由, 空列表回退提供商能力选择
2026-08-28 12:16:25 +08:00

222 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 大模型API中转系统 (LLM Proxy)
> 兼容OpenAI API格式的多提供商代理系统,支持能力(Capability)路由、优先级自动切换
**版本:v2.1.1**
## 功能特点
### 🔄 多提供商支持
- 支持配置多个上游大模型提供商
- 按优先级自动选择可用提供商
- 故障自动切换到备用提供商
### 🎯 能力路由(v2.1.0 新增)
每个模型可标记**能力标签**,AUTO配置**固定绑定一个功能类型**并自动筛选具备该能力的模型:
| 能力 | 说明 | 端点 |
|------|------|------|
| `text` 文本推理 | 纯文本对话 | `/v1/chat/completions` |
| `vision` 视觉能力 | 多模态图像理解 | `/v1/chat/completions`(消息含图片自动路由) |
| `audio_out` 语音输出 | TTS 语音合成 | `/v1/audio/speech` |
| `audio_in` 语音输入 | ASR 语音识别 | `/v1/audio/transcriptions` |
| `image_gen` 图片生成 | 文生图 | `/v1/images/generations` |
| `video_gen` 视频生成 | 文生视频 | `/v1/video/generations` |
### 📡 OpenAI API 兼容
- 完全兼容 OpenAI API 格式(Chat / Embeddings / Images / Audio
- 支持流式和非流式响应
- 支持模型别名映射
### 🛡️ 高可用
- 自动健康检查
- 错误计数与熔断(连续失败3次熔断,**冷却期后自动恢复**)
- 自动重试(失败切换到下一个托管同一模型的提供商,**不改变用户请求的模型**)
## 快速开始
### 安装依赖
```bash
pip install -r requirements.txt
```
### 启动服务
```bash
./start.sh # 后台启动(PID 管理)
./start.sh stop # 停止
./start.sh status # 状态
# 或前台运行
python app.py
```
### 访问地址
```
前台API: http://localhost:16003/v1/chat/completions
后台管理: http://localhost:16003/admin
```
## API 使用
### Chat Completions
```bash
curl http://localhost:16003/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ***" \
-d '{
"model": "auto",
"messages": [{"role": "user", "content": "Hello!"}],
"stream": false
}'
```
后台「对话」页选择 `auto-image``Qwen-Image` 可直接在对话中生成并展示图片。
### 列出模型(含能力标签)
```bash
curl http://localhost:16003/v1/models
```
### 流式响应
```bash
curl http://localhost:16003/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "auto-text",
"messages": [{"role": "user", "content": "讲个笑话"}],
"stream": true
}'
```
### 图片生成
```bash
curl http://localhost:16003/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"model": "auto-image",
"prompt": "a cute cat, cartoon style",
"size": "1024x1024"
}'
```
## Auto 配置(按能力固定功能 + 具体模型排序)
每个 Auto 配置固定一个**功能类型**,内部是一个**有序的具体模型列表**(可在后台拖动排序),请求时按序选择第一个可用模型。调用时 `model="配置名称"`
| 配置名称 | 功能 | 说明 |
|----------|------|------|
| `auto` | 文本推理 | 默认,按模型列表顺序自动选择 |
| `auto-text` | 文本推理 | 纯文本模型 |
| `auto-vision` | 视觉能力 | 多模态视觉模型 |
| `auto-image` | 图片生成 | 生图模型 |
| `auto-voice-out` | 语音输出 | TTS 模型 |
| `auto-voice-in` | 语音输入 | ASR 模型 |
| `auto-video` | 视频生成 | 视频模型 |
在后台「Auto配置」页可**拖动具体模型**调整优先级(粒度是模型,不是提供商),勾选参与自动选择。
## 历史上下文缓存(可配置)
带历史上下文的 `auto` 请求会**优先复用上次使用的模型**(按首条消息识别会话),命中上游前缀缓存、节省成本。可在「系统配置」页开关:
- `prefer_cache_model`:是否启用(默认开)
- `cache_ttl_seconds`:记忆有效期(默认 3600 秒)
## 模型管理
后台「模型管理」页:
- 每个模型可配置能力标签(文本/视觉/语音/生图/生视频)
- 支持添加/编辑/删除模型、设置默认模型
- 支持模型别名管理(`qwen``unsloth/Qwen3.8-27B-Q6_K` 等)
## 配置说明
默认配置在 `config/settings.py`,运行时配置存于 `data/config.json`(可在后台修改):
```python
UPSTREAM_PROVIDERS = [
{
"name": "provider-name",
"priority": 1, # 优先级,数字越小越高
"base_url": "https://api.example.com/v1",
"api_key": "sk-xxx",
"capabilities": ["text", "vision"], # 提供商能力(新模型默认继承)
"models": [
{"name": "model-1", "capabilities": ["text"]},
{"name": "model-2", "capabilities": ["text", "vision"]},
],
"default_model": "model-1",
"timeout": 180,
"enabled": True,
},
]
```
### 内置提供商
| 提供商 | 能力 | 模型 |
|--------|------|------|
| Local Qwen | 文本+视觉 | `unsloth/Qwen3.8-27B-Q6_K`, `unsloth/Qwen3.8-27B-Q4_K_M` |
| SiliconFlow LLM | 文本 | `deepseek-ai/DeepSeek-V4-Flash`, `meituan-longcat/LongCat-2.0` |
| Autodl | 文本+视觉 | `qwen3.6-plus`, `GLM-5.3-flash` |
| Autodl Image | 图片生成 | `Qwen-Image` |
### 模型别名
```python
MODEL_ALIASES = {
"auto": "auto",
"qwen": "unsloth/Qwen3.8-27B-Q6_K",
"deepseek": "deepseek-ai/DeepSeek-V4-Flash",
...
}
```
## 端点
| 端点 | 方法 | 说明 |
|------|------|------|
| `/` | GET | 服务信息 |
| `/v1/chat/completions` | POST | 聊天完成 |
| `/v1/embeddings` | POST | 文本嵌入 |
| `/v1/images/generations` | POST | 图片生成 |
| `/v1/audio/speech` | POST | 语音合成 |
| `/v1/audio/transcriptions` | POST | 语音识别 |
| `/v1/video/generations` | POST | 视频生成 |
| `/v1/models` | GET | 模型列表 |
| `/health` | GET | 健康检查 |
| `/status` | GET | 详细状态 |
| `/admin` | GET | 后台管理 |
## 优先级与熔断机制
当使用 `model="auto"` 系列时:
1. 按配置的优先级顺序选择提供商
2. 跳过不可用/不具备对应能力的提供商
3. 请求失败自动切换到下一个托管同一模型的提供商(保持请求模型不变)
4. 连续失败3次的提供商被熔断,冷却期(默认60秒)后自动半开恢复
## 项目结构
```
llm-proxy/
├── app.py # 主程序(前台API + 后台管理,单端口)
├── start.sh # 启动/停止脚本
├── requirements.txt # 依赖
├── config/
│ └── settings.py # 默认配置(提供商/能力/别名/auto)
├── data/ # 运行时配置与数据(config.json/stats.json/chats.json
├── logs/ # 日志目录
└── templates/ # 后台管理页面
```
## License
MIT