Initial: LiteLLM Gateway 项目骨架
- config.yaml: MiniMax M2.7/M2.5/Lightning 三层路由 + fallback - run.sh: 启动脚本 - .env.example: 环境变量模板 - TODO.md: 完整项目规划与待办 - docs/: 部署指南、配置说明、Skill 接入文档main
commit
a35ce7cc93
|
|
@ -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
|
||||||
|
|
@ -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 接入
|
||||||
|
|
@ -0,0 +1,168 @@
|
||||||
|
# TODO — LiteLLM Gateway
|
||||||
|
|
||||||
|
> 建立时间:2026-04-10
|
||||||
|
> 负责人:西莉雅 (Sileya)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 背景
|
||||||
|
|
||||||
|
### 问题
|
||||||
|
- MiniMax M2.7 频繁返回 529(服务过载),导致 session 被 terminate
|
||||||
|
- Agent 的 API Key 存在泄漏风险(直接写在配置里)
|
||||||
|
- 没有额度管控,agent 滥用无法控制
|
||||||
|
- 缺少统一日志,无法追踪用量
|
||||||
|
|
||||||
|
### 目标
|
||||||
|
在 OMV(Nas/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 预留 — 对接其他 LLM(Claude/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 接口
|
||||||
|
|
||||||
|
### 管理 API(admin 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 — 动态添加模型(热生效)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 对外 API(agent 使用)
|
||||||
|
```
|
||||||
|
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 代理访问 MiniMax,fallback 验证通过
|
||||||
|
- [ ] **M3**: 所有 agent 迁移到独立 key 体系
|
||||||
|
- [ ] **M4**: Sileya Skill `lite-llm-admin` 可用,日常管理无需手动操作
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -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
|
||||||
|
```
|
||||||
|
|
@ -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 情况,确认回落正常
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue