Initial: LiteLLM Gateway 项目骨架

- config.yaml: MiniMax M2.7/M2.5/Lightning 三层路由 + fallback
- run.sh: 启动脚本
- .env.example: 环境变量模板
- TODO.md: 完整项目规划与待办
- docs/: 部署指南、配置说明、Skill 接入文档
main
bigemon 2026-04-10 09:43:33 +08:00
commit a35ce7cc93
7 changed files with 684 additions and 0 deletions

21
.env.example Normal file
View File

@ -0,0 +1,21 @@
# ============================
# LiteLLM Gateway — 环境变量
# ============================
# 复制本文件为 .env然后填入真实值
# MiniMax API Key真实 key仅保存在网关侧不暴露给 agent
MINIMAX_API_KEY=sk-your-minimax-api-key
# LiteLLM Master Key管理员 key用于管理接口
# 必须以 sk- 开头
LITELLM_MASTER_KEY=sk-litellm-admin-key-change-this
# 数据库(可选,默认 SQLite
# DATABASE_URL=postgresql://user:password@host:5432/litellm
# 日志级别
# LITELLM_LOG_LEVEL=INFO
# 其他可选
# LITELLM_DROP_PARAMS=true
# LITELLM_MAX_PARALLEL_REQUESTS=100

47
README.md Normal file
View File

@ -0,0 +1,47 @@
# LiteLLM Gateway
## 定位
MiniMax 模型 API 网关,为整个 agent 集群提供:
- 🔐 **安全代理** — 真实 API Key 不暴露给 agent
- 🛡️ **额度管控** — per-key RPM/TPM 限制,防止滥用
- 🔄 **智能回落** — M2.7 → M2.5 → M2.5-Lightning 自动切换
- 📊 **用量追踪** — 实时 API 调用日志与消费统计
- 🔥 **热更新** — key 管理/模型添加完全热生效Sileya 的 key 配置不受影响
## 架构
```
OpenClaw Agent (Sileya / 李狗蛋 / 妮可 ...)
→ sk-agent-key (LiteLLM Virtual Key)
→ LiteLLM Proxy (:4000)
├── 额度检查 / 用量记录
├── 智能路由 + fallback
└── MINIMAX_API_KEY (仅此处持有)
→ api.minimax.io
```
## 部署
### 环境要求
- Python 3.9+
- 独立服务器或轻量容器(不强制 Docker
- 推荐OMV (Nas) / Proxmox 容器 / 任意 VPS
### 快速启动
```bash
pip install litellm
# 配置环境变量
export MINIMAX_API_KEY="sk-xxx"
export LITELLM_MASTER_KEY="sk-litellm-admin-key"
# 启动
uvicorn litellm_proxy:app --host 0.0.0.0 --port 4000
```
## 文档
- [TODO](./TODO.md) — 项目规划与待办
- [CONFIG_GUIDE](./docs/CONFIG_GUIDE.md) — 配置说明
- [DEPLOYMENT](./docs/DEPLOYMENT.md) — 部署指南
- [SKILL_INTEGRATION](./docs/SKILL_INTEGRATION.md) — Sileya Skill 接入

168
TODO.md Normal file
View File

@ -0,0 +1,168 @@
# TODO — LiteLLM Gateway
> 建立时间2026-04-10
> 负责人:西莉雅 (Sileya)
---
## 背景
### 问题
- MiniMax M2.7 频繁返回 529服务过载导致 session 被 terminate
- Agent 的 API Key 存在泄漏风险(直接写在配置里)
- 没有额度管控agent 滥用无法控制
- 缺少统一日志,无法追踪用量
### 目标
在 OMVNas/Proxmox节点上部署 LiteLLM Gateway实现
1. MiniMax API 安全代理key 集中管理)
2. 模型自动回落M2.7 → M2.5 → M2.5-Lightning
3. per-key 额度管控
4. 完整 API 管理接口用量查询、key 生成/封禁)
5. Sileya Skill 化(通过 API 动态管理)
---
## 部署规划
### 部署节点
- **OMV (Open Media Vault)** — 运行在 NAS 上的 Proxmox 容器
- 或者直接跑在 Nas 本身(推荐,更简单)
### 模型路由策略
```
优先: MiniMax-M2.7
↓ 529 / 超时 / 500
备用: MiniMax-M2.5
↓ 529 / 超时 / 500
兜底: MiniMax-M2.5-Lightning
```
### 双 Key 隔离
- `sk-sileya-fixed` — 西莉雅的专属 key指向固定 model group**不动 config.yaml 就永远不受影响**
- `sk-admin-*` — 管理员 key可动态管理其他 key
### 热更新策略
| 操作 | 是否需要重启 |
|------|------------|
| `/key/generate` 生成新 key | ❌ 不需要 |
| `/key/block` 封禁 key | ❌ 不需要 |
| `/model/new` 动态加模型 | ❌ 不需要 |
| 改 fallback 策略 / 模型顺序 | ⚠️ 需要(但不频繁,重启 < 5s|
---
## 待办事项
### P0 — 必须完成(网关可用)
- [ ] **DEPLOY-01**: 在 OMV/Nas 上安装 Python 环境 + pip install litellm
- [ ] **DEPLOY-02**: 配置 `config.yaml`MiniMax provider + fallback 路由 + virtual key
- [ ] **DEPLOY-03**: 配置 `.env`MINIMAX_API_KEY + LITELLM_MASTER_KEY
- [ ] **DEPLOY-04**: 启动验证 — curl 测试 `/health`
- [ ] **DEPLOY-05**: OpenClaw 接入 — 修改 `openclaw.json` 的 model provider 指向 LiteLLM
### P1 — 管控能力
- [ ] **MGMT-01**: 生成各 agent 的专属 key`sk-sileya-fixed`、`sk-ligoudan`、`sk-nico`
- [ ] **MGMT-02**: 配置 per-key RPM 限制(各 agent 独立额度)
- [ ] **MGMT-03**: Sileya Skill — `lite-llm-admin`用量查询、key 管理接口)
- [ ] **MGMT-04**: 验证 hot reload — 测试 `/key/generate` 不影响 Sileya session
### P2 — 安全加固
- [ ] **SEC-01**: 网络隔离 — LiteLLM 仅内网可访问Tailscale/ZeroTier 组网
- [ ] **SEC-02**: 确认 Sileya 的 key 配置在 `config.yaml` 固定区域,不参与动态更新
- [ ] **SEC-03**: 审计日志 — 确认所有请求记录到数据库
### P3 — 可选优化
- [ ] **OPT-01**: LiteLLM Dashboard`:4000/ui`启用Web UI 管理
- [ ] **OPT-02**: Prometheus metrics 接入Grafana 监控)
- [ ] **OPT-03**: 多 provider 预留 — 对接其他 LLMClaude/GPT时网关层无需修改
---
## 关键配置
### config.yaml 核心结构
```yaml
model_list:
- model_name: MiniMax-M2.7
litellm_params:
model: minimax/MiniMax-M2.7
api_key: os.environ/MINIMAX_API_KEY
api_base: https://api.minimax.io/v1
rpm: 60
- model_name: MiniMax-M2.5
litellm_params:
model: minimax/MiniMax-M2.5
api_key: os.environ/MINIMAX_API_KEY
api_base: https://api.minimax.io/v1
rpm: 60
- model_name: MiniMax-M2.5-Lightning
litellm_params:
model: minimax/MiniMax-M2.5-Lightning
api_key: os.environ/MINIMAX_API_KEY
api_base: https://api.minimax.io/v1
rpm: 120
router_settings:
fallback_params: [{"model": ["MiniMax-M2.7", "MiniMax-M2.5", "MiniMax-M2.5-Lightning"]}]
num_retries: 3
retry_after: 5
timeout: 30
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
```
### Sileya Key 专属配置(不参与动态更新)
```yaml
# config.yaml 中的 sileya 专属区
# 此区域修改需要重启,但这种情况极低频
```
---
## API 接口
### 管理 APIadmin key
```
POST /key/generate — 生成新 key
GET /key/info?key=sk-xxx — 查询 key 用量
GET /spend — 查询总用量
POST /key/block — 封禁 key
POST /key/unblock — 解封 key
POST /model/new — 动态添加模型(热生效)
```
### 对外 APIagent 使用)
```
POST /v1/chat/completions — 标准 OpenAI 兼容接口
GET /health — 健康检查
```
---
## 目录结构
```
litellm-gateway/
├── README.md
├── TODO.md
├── config.yaml # 主配置
├── .env.example # 环境变量模板
├── requirements.txt # Python 依赖
├── run.sh # 启动脚本
└── docs/
├── CONFIG_GUIDE.md
├── DEPLOYMENT.md
└── SKILL_INTEGRATION.md
```
---
## 里程碑
- [ ] **M1**: LiteLLM 在 OMV 上跑通health check 通过
- [ ] **M2**: Sileya 通过 LiteLLM 代理访问 MiniMaxfallback 验证通过
- [ ] **M3**: 所有 agent 迁移到独立 key 体系
- [ ] **M4**: Sileya Skill `lite-llm-admin` 可用,日常管理无需手动操作

71
config.yaml Normal file
View File

@ -0,0 +1,71 @@
# ============================================
# LiteLLM Gateway — config.yaml
# ============================================
# MiniMax 模型路由配置
# 完整文档: https://docs.litellm.ai/docs/proxy/configs
model_list:
# ── MiniMax M2.7 (优先) ──────────────────────
- model_name: MiniMax-M2.7
litellm_params:
model: minimax/MiniMax-M2.7
api_key: os.environ/MINIMAX_API_KEY
api_base: https://api.minimax.io/v1
rpm: 60
model_info:
mode: chat
supports_function_calling: true
# ── MiniMax M2.5 (备用) ──────────────────────
- model_name: MiniMax-M2.5
litellm_params:
model: minimax/MiniMax-M2.5
api_key: os.environ/MINIMAX_API_KEY
api_base: https://api.minimax.io/v1
rpm: 60
model_info:
mode: chat
supports_function_calling: true
# ── MiniMax M2.5-Lightning (兜底) ───────────
- model_name: MiniMax-M2.5-Lightning
litellm_params:
model: minimax/MiniMax-M2.5-Lightning
api_key: os.environ/MINIMAX_API_KEY
api_base: https://api.minimax.io/v1
rpm: 120
model_info:
mode: chat
# ── 路由设置 ───────────────────────────────────
router_settings:
# 失败后按顺序回落
fallback_params:
- model:
- MiniMax-M2.7
- MiniMax-M2.5
- MiniMax-M2.5-Lightning
# 每个模型重试次数
num_retries: 3
# 重试前等待秒数
retry_after: 5
# 单次请求超时(秒)
timeout: 30
# 路由策略:优先用最好的模型
routing_strategy: latency-based-routing
# ── 全局设置 ───────────────────────────────────
litellm_settings:
drop_params: true
set_verbose: false
# 每次请求记录到数据库
success_callback: ["database"]
# ── 服务器设置 ─────────────────────────────────
general_settings:
# 管理员 master key必须以 sk- 开头)
master_key: os.environ/LITELLM_MASTER_KEY
# 数据库SQLite 轻量版,生产推荐 PostgreSQL
database_url: "sqlite:///./litellm.db"
# UI 管理界面
ui_access_mode: "admin"

163
docs/DEPLOYMENT.md Normal file
View File

@ -0,0 +1,163 @@
# 部署指南
## 目标节点
**OMV (Open Media Vault) on NAS / Proxmox**
推荐直接跑在 Nas 上,不强制 Docker直接 Python 运行。
---
## 步骤 1 — 环境准备
### 检查 Python 版本
```bash
python3 --version # 需要 >= 3.9
```
### 创建用户(可选,推荐)
```bash
useradd -m -s /bin/bash litellm
su - litellm
mkdir -p ~/litellm-gateway
```
---
## 步骤 2 — 安装依赖
```bash
pip install litellm
```
可选:
```bash
pip install uvicorn[standard] # ASGI 服务器(生产推荐)
```
---
## 步骤 3 — 配置
```bash
cd ~/litellm-gateway
# 复制环境变量模板
cp .env.example .env
# 编辑 .env填入真实值
nano .env
```
**必须设置的值:**
- `MINIMAX_API_KEY` — MiniMax 真实 API Key
- `LITELLM_MASTER_KEY` — 管理员 key`sk-` 开头)
---
## 步骤 4 — 启动
```bash
chmod +x run.sh
./run.sh
```
**后台运行(生产):**
```bash
# nohup
nohup ./run.sh > logs/litellm.log 2>&1 &
# 或用 systemd见下方
```
---
## 步骤 5 — 验证
```bash
# 健康检查
curl http://localhost:4000/health
# 测试 chat completions
curl -X POST http://localhost:4000/v1/chat/completions \
-H "Authorization: Bearer sk-your-master-key" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-M2.7",
"messages": [{"role": "user", "content": "Hello"}]
}'
```
---
## 步骤 6 — OpenClaw 接入
`~/.openclaw/openclaw.json` 中修改 MiniMax provider
```json
{
"providers": {
"minimax": {
"apiKey": "sk-your-minimax-api-key"
},
"minimax-portal": {
"apiKey": "sk-your-litellm-key",
"baseURL": "http://<your-server>:4000/v1"
}
}
}
```
> ⚠️ 注意LiteLLM 使用 OpenAI 兼容接口,所以 OpenClaw 的 `minimax-portal` provider 可以直接指向 LiteLLM 的 `/v1` 端点。
---
## systemd 服务OMV 持久化)
```ini
# /etc/systemd/system/litellm.service
[Unit]
Description=LiteLLM Gateway
After=network.target
[Service]
Type=simple
User=litellm
WorkingDirectory=/home/litellm/litellm-gateway
ExecStart=/home/litellm/litellm-gateway/run.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
```bash
sudo systemctl daemon-reload
sudo systemctl enable litellm
sudo systemctl start litellm
```
---
## 网络访问控制
### 仅内网访问(推荐)
确保 LiteLLM 的端口 `:4000` 不暴露到公网。
### Tailscale / ZeroTier 组网(推荐)
```bash
# 在服务器上安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up --accept-routes
# OpenClaw 节点也加入同一网络
# 然后 LiteLLM 只监听 Tailscale IP如 100.64.x.x:4000
```
### 防火墙规则OMV
```bash
# 只允许内网段访问 4000
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 4000 -j ACCEPT
iptables -A INPUT -p tcp --dport 4000 -j DROP
```

180
docs/SKILL_INTEGRATION.md Normal file
View File

@ -0,0 +1,180 @@
# Sileya Skill 接入 — lite-llm-admin
## 目标
Sileya 持有 admin key可以通过 API 管理 LiteLLM Gateway
- 查询各 agent 用量
- 生成/封禁 key
- 动态调整 fallback 策略
- 监控网关健康状态
---
## Skill 核心接口
### 基础信息
```
Base URL: http://<your-server>:4000
Admin Key: sk-litellm-admin-key西莉雅持有
Header: Authorization: Bearer <admin_key>
```
### API 列表
#### 1. 生成新 agent key
```http
POST /key/generate
Content-Type: application/json
Authorization: Bearer <admin_key>
{
"models": ["MiniMax-M2.7", "MiniMax-M2.5", "MiniMax-M2.5-Lightning"],
"metadata": {
"agent": "李狗蛋",
"owner": "sileya"
}
}
Response:
{
"key": "sk-litellm-xxxxx",
"expires": null,
"models": ["MiniMax-M2.7", "MiniMax-M2.5", "MiniMax-M2.5-Lightning"]
}
```
#### 2. 查询 key 用量
```http
GET /key/info?key=sk-litellm-xxxxx
Authorization: Bearer <admin_key>
Response:
{
"key": "sk-litellm-xxxxx",
"spend": 0.0001065,
"models": [...],
"expires": null
}
```
#### 3. 查询总用量
```http
GET /spend
Authorization: Bearer <admin_key>
Response:
{
"total_spend": 12.345,
"key_spends": [
{"key": "sk-litellm-xxxxx", "spend": 5.123, "agent": "李狗蛋"},
{"key": "sk-litellm-yyyyy", "spend": 7.222, "agent": "妮可"}
]
}
```
#### 4. 封禁 key
```http
POST /key/block
Content-Type: application/json
Authorization: Bearer <admin_key>
{
"key": "sk-litellm-xxxxx"
}
```
#### 5. 解封 key
```http
POST /key/unblock
Content-Type: application/json
Authorization: Bearer <admin_key>
{
"key": "sk-litellm-xxxxx"
}
```
#### 6. 动态添加模型(热生效)
```http
POST /model/new
Content-Type: application/json
Authorization: Bearer <admin_key>
{
"model_name": "gpt-4o",
"litellm_params": {
"model": "openai/gpt-4o",
"api_key": "sk-openai-xxx",
"rpm": 60
}
}
```
---
## Sileya Skill 实现
```python
# SKILL.md 核心逻辑
import requests
import os
LITELLM_BASE = os.environ["LITELLM_BASE_URL"] # http://<server>:4000
ADMIN_KEY = os.environ["LITELLM_ADMIN_KEY"]
def _headers():
return {"Authorization": f"Bearer {ADMIN_KEY}", "Content-Type": "application/json"}
def generate_agent_key(agent_name: str, models: list[str]):
"""给新 agent 分配独立 key"""
resp = requests.post(
f"{LITELLM_BASE}/key/generate",
headers=_headers(),
json={"models": models, "metadata": {"agent": agent_name}}
)
resp.raise_for_status()
return resp.json()["key"]
def get_all_spend():
"""查询总用量"""
resp = requests.get(f"{LITELLM_BASE}/spend", headers=_headers())
resp.raise_for_status()
return resp.json()
def block_agent_key(key: str):
"""封禁某 agent 的 key"""
resp = requests.post(
f"{LITELLM_BASE}/key/block",
headers=_headers(),
json={"key": key}
)
resp.raise_for_status()
def get_key_info(key: str):
"""查询单个 key 详情"""
resp = requests.get(
f"{LITELLM_BASE}/key/info",
headers=_headers(),
params={"key": key}
)
resp.raise_for_status()
return resp.json()
```
---
## 热更新保障
Sileya 的 key 配置(`sk-sileya-fixed`)在 `config.yaml` 中固定。管理员通过 API 修改其他 key 时Sileya 的 key 完全不受影响。
只有修改 `config.yaml` 本身的模型路由策略时需要重启网关,但这种情况极低频(可能一个月一次),且重启 < 5 秒。
---
## 使用场景
1. **新 agent 上线** → Sileya 调用 `/key/generate` 生成专属 key
2. **发现异常用量** → Sileya 调用 `/key/info` 查询,必要时 `/key/block`
3. **月初对账** → Sileya 调用 `/spend` 汇总所有 agent 消费
4. **529 高峰期** → Sileya 监控 fallback 情况,确认回落正常

34
run.sh Normal file
View File

@ -0,0 +1,34 @@
#!/bin/bash
# LiteLLM Gateway 启动脚本
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# 加载环境变量
if [ -f ".env" ]; then
export $(grep -v '^#' .env | xargs)
else
echo "ERROR: .env 文件不存在,请复制 .env.example 为 .env 并填写"
exit 1
fi
# 检查必要变量
if [ -z "$MINIMAX_API_KEY" ]; then
echo "ERROR: MINIMAX_API_KEY 未设置"
exit 1
fi
if [ -z "$LITELLM_MASTER_KEY" ]; then
echo "ERROR: LITELLM_MASTER_KEY 未设置"
exit 1
fi
echo "=== LiteLLM Gateway 启动中 ==="
echo "端口: 4000"
echo "模型: MiniMax-M2.7 / M2.5 / M2.5-Lightning"
echo ""
# 启动
uvicorn litellm_proxy:app --host 0.0.0.0 --port 4000 --log-level info