forked from xiaohei/taiji-AI-PAD
更新litemll
This commit is contained in:
@@ -0,0 +1,263 @@
|
||||
# Agent-Manager 接口变动需求文档
|
||||
|
||||
> **版本**: v1.0.0
|
||||
> **创建时间**: 2026-01-07
|
||||
> **关联设计**: 模型供应商与租户模型使用设计方案 v5.0
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景
|
||||
|
||||
根据「模型供应商与租户模型使用设计方案」,mcp-server 需要在创建 Agent 时注入 LiteLLM 相关的环境变量,使 Agent 能够通过 LiteLLM 网关访问模型。
|
||||
|
||||
**核心变更**:
|
||||
- Agent 创建时需要支持注入额外的环境变量
|
||||
- 环境变量包含敏感信息(API Key),需要安全处理
|
||||
|
||||
---
|
||||
|
||||
## 2. 接口变动清单
|
||||
|
||||
### 2.1 创建 Agent 接口
|
||||
|
||||
**接口路径**: `POST /agents`
|
||||
|
||||
**变更内容**: 请求体中的 `env_vars` 字段需要支持以下新的环境变量
|
||||
|
||||
| 环境变量 | 类型 | 必填 | 说明 |
|
||||
|----------|------|------|------|
|
||||
| `OPENAI_API_BASE` | string | 否 | LiteLLM 网关地址,如 `http://4.144.175.186` |
|
||||
| `OPENAI_API_KEY` | string | 否 | 租户的 LiteLLM API Key(敏感信息) |
|
||||
| `MODEL_NAME` | string | 否 | 模型名称,如 `azure/gpt-4` |
|
||||
| `LITELLM_MODEL` | string | 否 | 同 MODEL_NAME,兼容不同框架 |
|
||||
|
||||
**请求示例**:
|
||||
```json
|
||||
{
|
||||
"name": "my-custom-agent",
|
||||
"template": "langchain-agent",
|
||||
"config": {
|
||||
"user_id": "user-uuid",
|
||||
"cpu_request": "100m",
|
||||
"cpu_limit": "500m",
|
||||
"memory_request": "128Mi",
|
||||
"memory_limit": "512Mi"
|
||||
},
|
||||
"env_vars": {
|
||||
"OPENAI_API_BASE": "http://4.144.175.186",
|
||||
"OPENAI_API_KEY": "sk-xxxxxxxxxxxxxxxx",
|
||||
"MODEL_NAME": "azure/gpt-4",
|
||||
"LITELLM_MODEL": "azure/gpt-4",
|
||||
"CUSTOM_VAR": "custom_value"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**安全要求**:
|
||||
1. `OPENAI_API_KEY` 等敏感环境变量应作为 Kubernetes Secret 存储,而非明文写入 Pod spec
|
||||
2. 建议使用 `secretKeyRef` 引用 Secret 中的值
|
||||
3. 日志中不应打印敏感环境变量的值
|
||||
|
||||
---
|
||||
|
||||
### 2.2 创建平台 Agent 接口
|
||||
|
||||
**接口路径**: `POST /platform-agents`
|
||||
|
||||
**变更内容**: 同上,支持注入 LiteLLM 环境变量
|
||||
|
||||
---
|
||||
|
||||
### 2.3 创建自定义 Agent 接口
|
||||
|
||||
**接口路径**: `POST /custom-agents`
|
||||
|
||||
**变更内容**: 同上,支持注入 LiteLLM 环境变量
|
||||
|
||||
---
|
||||
|
||||
## 3. 实现建议
|
||||
|
||||
### 3.1 环境变量注入方式
|
||||
|
||||
**方式一:直接注入(简单但不够安全)**
|
||||
```yaml
|
||||
spec:
|
||||
containers:
|
||||
- name: agent
|
||||
env:
|
||||
- name: OPENAI_API_BASE
|
||||
value: "http://4.144.175.186"
|
||||
- name: OPENAI_API_KEY
|
||||
value: "sk-xxxxxxxx" # 不推荐
|
||||
```
|
||||
|
||||
**方式二:使用 Secret(推荐)**
|
||||
```yaml
|
||||
spec:
|
||||
containers:
|
||||
- name: agent
|
||||
env:
|
||||
- name: OPENAI_API_BASE
|
||||
value: "http://4.144.175.186"
|
||||
- name: OPENAI_API_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: agent-{agent-name}-secrets
|
||||
key: openai-api-key
|
||||
```
|
||||
|
||||
### 3.2 Secret 管理
|
||||
|
||||
Agent-Manager 需要:
|
||||
1. 在创建 Agent 前,先创建对应的 Secret
|
||||
2. Secret 名称建议使用 `agent-{agent-name}-secrets`
|
||||
3. 删除 Agent 时同时删除对应的 Secret
|
||||
|
||||
**创建 Secret 示例**:
|
||||
```python
|
||||
from kubernetes import client
|
||||
|
||||
def create_agent_secret(name: str, namespace: str, env_vars: dict):
|
||||
"""创建 Agent 的 Secret"""
|
||||
# 筛选敏感环境变量
|
||||
sensitive_keys = ["OPENAI_API_KEY", "API_KEY", "SECRET_KEY"]
|
||||
secret_data = {}
|
||||
|
||||
for key, value in env_vars.items():
|
||||
if any(sk in key.upper() for sk in sensitive_keys):
|
||||
secret_data[key.lower().replace("_", "-")] = base64.b64encode(value.encode()).decode()
|
||||
|
||||
if not secret_data:
|
||||
return None
|
||||
|
||||
secret = client.V1Secret(
|
||||
metadata=client.V1ObjectMeta(
|
||||
name=f"agent-{name}-secrets",
|
||||
namespace=namespace,
|
||||
labels={"app": "agent", "agent-name": name}
|
||||
),
|
||||
type="Opaque",
|
||||
data=secret_data
|
||||
)
|
||||
|
||||
core_v1 = client.CoreV1Api()
|
||||
return core_v1.create_namespaced_secret(namespace, secret)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. mcp-server 调用示例
|
||||
|
||||
```python
|
||||
# mcp-server 中创建 Agent 的代码
|
||||
async def create_custom_agent(
|
||||
name: str,
|
||||
template: str,
|
||||
user_id: str,
|
||||
model_name: str,
|
||||
db: AsyncSession
|
||||
):
|
||||
# 1. 查询租户的模型 Key
|
||||
tenant_key = await get_tenant_model_key(user_id, model_name, db)
|
||||
|
||||
if not tenant_key:
|
||||
raise HTTPException(403, f"您没有使用模型 {model_name} 的权限")
|
||||
|
||||
# 2. 解密 Key
|
||||
decrypted_key = litellm_client.decrypt_key(tenant_key.litellm_key_hash)
|
||||
|
||||
# 3. 构建环境变量
|
||||
env_vars = {
|
||||
"OPENAI_API_BASE": settings.litellm_url,
|
||||
"OPENAI_API_KEY": decrypted_key,
|
||||
"MODEL_NAME": model_name,
|
||||
"LITELLM_MODEL": model_name,
|
||||
}
|
||||
|
||||
# 4. 调用 Agent Manager
|
||||
result = await agent_manager_client.create_custom_agent(
|
||||
name=name,
|
||||
template=template,
|
||||
user_id=user_id,
|
||||
env_vars=env_vars,
|
||||
config=agent_config
|
||||
)
|
||||
|
||||
return result
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 测试要点
|
||||
|
||||
### 5.1 功能测试
|
||||
|
||||
| 测试项 | 预期结果 |
|
||||
|--------|----------|
|
||||
| 创建 Agent 时传入 LiteLLM 环境变量 | Agent Pod 中能读取到这些环境变量 |
|
||||
| Agent 使用注入的 Key 调用 LiteLLM | 请求成功,返回模型响应 |
|
||||
| 不传入 LiteLLM 环境变量 | Agent 正常创建,但无法调用模型 |
|
||||
|
||||
### 5.2 安全测试
|
||||
|
||||
| 测试项 | 预期结果 |
|
||||
|--------|----------|
|
||||
| 查看 Pod spec | 敏感环境变量通过 secretKeyRef 引用 |
|
||||
| 查看 Agent Manager 日志 | 不包含 API Key 明文 |
|
||||
| 删除 Agent | 对应的 Secret 也被删除 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 时间线
|
||||
|
||||
| 阶段 | 时间 | 内容 |
|
||||
|------|------|------|
|
||||
| 需求确认 | 2026-01-07 | 确认接口变动范围 |
|
||||
| 开发实现 | 2026-01-08 ~ 2026-01-10 | Agent Manager 支持 Secret 管理 |
|
||||
| 联调测试 | 2026-01-11 ~ 2026-01-12 | mcp-server 与 Agent Manager 联调 |
|
||||
| 上线部署 | 2026-01-13 | 生产环境部署 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 联系人
|
||||
|
||||
- **mcp-server 负责人**: [待填写]
|
||||
- **Agent Manager 负责人**: [待填写]
|
||||
|
||||
---
|
||||
|
||||
## 附录 A: 现有 Agent Manager 接口参考
|
||||
|
||||
根据 `plans/agent-manager接口文档.md`,现有接口已支持 `env_vars` 参数,本次变更主要是:
|
||||
|
||||
1. **明确 LiteLLM 相关环境变量的命名规范**
|
||||
2. **增加敏感环境变量的安全处理要求**
|
||||
3. **确保 mcp-server 和 Agent Manager 的对接一致性**
|
||||
|
||||
---
|
||||
|
||||
## 附录 B: LiteLLM 环境变量说明
|
||||
|
||||
| 环境变量 | 用途 | 示例值 |
|
||||
|----------|------|--------|
|
||||
| `OPENAI_API_BASE` | LiteLLM 网关地址 | `http://4.144.175.186` |
|
||||
| `OPENAI_API_KEY` | 租户的 LiteLLM API Key | `sk-xxxxxxxx` |
|
||||
| `MODEL_NAME` | 要使用的模型名称 | `azure/gpt-4` |
|
||||
| `LITELLM_MODEL` | 同 MODEL_NAME | `azure/gpt-4` |
|
||||
|
||||
**Agent 代码中使用示例**:
|
||||
```python
|
||||
import os
|
||||
from openai import OpenAI
|
||||
|
||||
client = OpenAI(
|
||||
base_url=os.getenv("OPENAI_API_BASE"),
|
||||
api_key=os.getenv("OPENAI_API_KEY"),
|
||||
)
|
||||
|
||||
response = client.chat.completions.create(
|
||||
model=os.getenv("MODEL_NAME", "gpt-4"),
|
||||
messages=[{"role": "user", "content": "Hello!"}]
|
||||
)
|
||||
```
|
||||
@@ -0,0 +1,261 @@
|
||||
# LiteLLM 集成实现总结
|
||||
|
||||
> **版本**: v1.0.0
|
||||
> **完成时间**: 2026-01-07
|
||||
> **状态**: ✅ 已完成
|
||||
|
||||
---
|
||||
|
||||
## 1. 实现概述
|
||||
|
||||
根据「模型供应商与租户模型使用设计方案 v5.0」,已完成 mcp-server 与 LiteLLM 的集成。
|
||||
|
||||
### 1.1 核心功能
|
||||
|
||||
| 功能 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| 创建渠道时同步创建 LiteLLM team | ✅ 已完成 | 渠道 = LiteLLM team |
|
||||
| 删除渠道时同步删除 LiteLLM team | ✅ 已完成 | 级联删除 |
|
||||
| 分配模型给租户时创建 LiteLLM key | ✅ 已完成 | 包含 RPM/TPM/Budget 配额 |
|
||||
| 取消模型分配时删除 LiteLLM key | ✅ 已完成 | 清理资源 |
|
||||
| 更新租户配额时更新 LiteLLM key | ✅ 已完成 | 实时生效 |
|
||||
| 租户查看可用模型 | ✅ 已完成 | 从 tenant_model_keys 表查询 |
|
||||
| Agent 创建时注入 LiteLLM key | ✅ 已完成 | 环境变量注入 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 新增/修改的文件
|
||||
|
||||
### 2.1 新增文件
|
||||
|
||||
| 文件路径 | 说明 |
|
||||
|----------|------|
|
||||
| `services/mcp-server/app/litellm_client.py` | LiteLLM Admin API 客户端(525行) |
|
||||
| `services/mcp-server/migrations/011_add_litellm_integration.sql` | 数据库迁移脚本 |
|
||||
| `services/mcp-server/migrations/run_011_migration.py` | 迁移执行脚本 |
|
||||
| `plans/Agent-Manager接口变动需求文档.md` | Agent Manager 对接需求 |
|
||||
|
||||
### 2.2 修改文件
|
||||
|
||||
| 文件路径 | 修改内容 |
|
||||
|----------|----------|
|
||||
| `services/mcp-server/models.py` | 新增 `TenantModelKey` 模型,`Channel` 增加 `litellm_team_id` 字段 |
|
||||
| `services/mcp-server/config.py` | 更新 LiteLLM master key 配置 |
|
||||
| `services/mcp-server/app/routes/admin.py` | 渠道创建/删除时同步 LiteLLM team |
|
||||
| `services/mcp-server/app/routes/channel.py` | 新增模型分配接口(4个端点) |
|
||||
| `services/mcp-server/app/routes/user.py` | 新增租户模型查询接口,Agent 创建时注入 key |
|
||||
| `docker-compose.yml` | 添加 LITELLM_URL 和 LITELLM_MASTER_KEY 环境变量 |
|
||||
| `.env` | 更新 LiteLLM 配置 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 数据库变更
|
||||
|
||||
### 3.1 新增表:tenant_model_keys
|
||||
|
||||
```sql
|
||||
CREATE TABLE tenant_model_keys (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL REFERENCES users(id),
|
||||
channel_id UUID REFERENCES channels(id),
|
||||
model_name VARCHAR(100) NOT NULL,
|
||||
litellm_key_id VARCHAR(255) NOT NULL,
|
||||
litellm_key_hash TEXT NOT NULL, -- 加密存储
|
||||
rpm_limit INTEGER DEFAULT 0,
|
||||
tpm_limit INTEGER DEFAULT 0,
|
||||
max_budget NUMERIC(12, 2),
|
||||
budget_duration VARCHAR(20) DEFAULT 'monthly',
|
||||
status VARCHAR(20) DEFAULT 'active',
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW(),
|
||||
CONSTRAINT uq_tenant_model UNIQUE(tenant_id, model_name)
|
||||
);
|
||||
```
|
||||
|
||||
### 3.2 修改表:channels
|
||||
|
||||
```sql
|
||||
ALTER TABLE channels ADD COLUMN litellm_team_id VARCHAR(100);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. API 接口清单
|
||||
|
||||
### 4.1 渠道管理(admin.py)
|
||||
|
||||
| 接口 | 方法 | 功能 | LiteLLM 操作 |
|
||||
|------|------|------|-------------|
|
||||
| `/api/admin/channels/create` | POST | 创建渠道 | 创建 team |
|
||||
| `/api/admin/channels/{id}` | DELETE | 删除渠道 | 删除 team |
|
||||
|
||||
### 4.2 模型分配(channel.py)
|
||||
|
||||
| 接口 | 方法 | 功能 | LiteLLM 操作 |
|
||||
|------|------|------|-------------|
|
||||
| `/api/channel/tenants/{id}/models` | PUT | 分配模型给租户 | 创建 key |
|
||||
| `/api/channel/tenants/{id}/models` | GET | 获取租户模型列表 | - |
|
||||
| `/api/channel/tenants/{id}/models/{model}` | DELETE | 取消模型分配 | 删除 key |
|
||||
| `/api/channel/tenants/{id}/models/{model}/quota` | PUT | 更新配额 | 更新 key |
|
||||
|
||||
### 4.3 租户接口(user.py)
|
||||
|
||||
| 接口 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| `/api/user/models/available` | GET | 获取可用模型列表 |
|
||||
| `/api/user/models/usage/stats` | GET | 获取用量统计 |
|
||||
| `/api/user/custom-agents` | POST | 创建 Agent(注入 key) |
|
||||
|
||||
---
|
||||
|
||||
## 5. 配置说明
|
||||
|
||||
### 5.1 环境变量
|
||||
|
||||
| 变量名 | 说明 | 示例值 |
|
||||
|--------|------|--------|
|
||||
| `LITELLM_URL` | LiteLLM 网关地址 | `http://4.144.175.186` |
|
||||
| `LITELLM_MASTER_KEY` | LiteLLM 管理密钥 | `sk-1f06b8f0d2e34c9b8a9f3d75a1c4e9b7-7e3a2c6bd9f441d8` |
|
||||
| `LITELLM_KEY_ENCRYPTION_KEY` | Key 加密密钥 | Base64 编码的 32 字节密钥 |
|
||||
|
||||
### 5.2 .env 配置
|
||||
|
||||
```bash
|
||||
# LiteLLM网关配置
|
||||
LITELLM_MASTER_KEY=sk-1f06b8f0d2e34c9b8a9f3d75a1c4e9b7-7e3a2c6bd9f441d8
|
||||
LITELLM_URL=http://4.144.175.186
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 测试验证
|
||||
|
||||
### 6.1 测试流程
|
||||
|
||||
```
|
||||
1. 超级管理员登录 ✅
|
||||
2. 创建渠道 → LiteLLM team 创建成功 ✅
|
||||
3. 分配模型给渠道 ✅
|
||||
4. 渠道管理员登录 ✅
|
||||
5. 创建租户 ✅
|
||||
6. 分配模型给租户 → LiteLLM key 创建成功 ✅
|
||||
7. 租户登录 ✅
|
||||
8. 租户查看可用模型 ✅
|
||||
```
|
||||
|
||||
### 6.2 测试结果
|
||||
|
||||
**创建渠道响应**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": "6e147f61-e2a8-422a-ab86-17ebbf3eff7b",
|
||||
"name": "LiteLLM集成测试渠道",
|
||||
"litellmTeamId": "4fe022d7-f484-4cf7-ac91-de1ed06aa99c"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**分配模型响应**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"tenantId": "7363295d-2a22-4f60-9298-ef65d2715731",
|
||||
"modelName": "gpt-3.5-turbo",
|
||||
"rpmLimit": 60,
|
||||
"tpmLimit": 10000,
|
||||
"maxBudget": 100.0,
|
||||
"status": "active"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**LiteLLM 中的 Key 信息**:
|
||||
```json
|
||||
{
|
||||
"models": ["gpt-3.5-turbo"],
|
||||
"rpm_limit": 60,
|
||||
"tpm_limit": 10000,
|
||||
"max_budget": 100.0,
|
||||
"budget_duration": "monthly",
|
||||
"metadata": {
|
||||
"tenant_id": "7363295d-2a22-4f60-9298-ef65d2715731",
|
||||
"channel_id": "6e147f61-e2a8-422a-ab86-17ebbf3eff7b",
|
||||
"tenant_name": "测试租户",
|
||||
"channel_name": "LiteLLM集成测试渠道"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 待完成事项
|
||||
|
||||
### 7.1 Agent Manager 对接
|
||||
|
||||
需要 Agent Manager 支持:
|
||||
1. 接收 `env_vars` 参数中的 LiteLLM 环境变量
|
||||
2. 将敏感环境变量(如 `OPENAI_API_KEY`)存储为 Kubernetes Secret
|
||||
3. 在 Pod spec 中通过 `secretKeyRef` 引用
|
||||
|
||||
详见:`plans/Agent-Manager接口变动需求文档.md`
|
||||
|
||||
### 7.2 充值功能
|
||||
|
||||
充值接口 `/api/user/billing/recharge` 需要:
|
||||
1. 更新 `tenant_model_keys.max_budget`
|
||||
2. 调用 LiteLLM `/key/update` 更新 budget
|
||||
|
||||
### 7.3 用量统计
|
||||
|
||||
用量统计接口需要:
|
||||
1. 调用 LiteLLM `/spend/logs` 获取实际用量
|
||||
2. 与本地记录对比
|
||||
|
||||
---
|
||||
|
||||
## 8. 架构图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ mcp-server │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
|
||||
│ │ admin.py │ │ channel.py │ │ user.py │ │
|
||||
│ │ 创建/删除渠道│ │ 分配模型给租户│ │ 查询可用模型/创建Agent │ │
|
||||
│ └──────┬──────┘ └──────┬──────┘ └───────────┬─────────────┘ │
|
||||
│ │ │ │ │
|
||||
│ └────────────────┼──────────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌───────▼───────┐ │
|
||||
│ │ litellm_client│ │
|
||||
│ │ (Admin API) │ │
|
||||
│ └───────┬───────┘ │
|
||||
└──────────────────────────┼───────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────────────────────────────────────────────────┐
|
||||
│ LiteLLM Gateway │
|
||||
│ http://4.144.175.186 │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
|
||||
│ │ /team/new │ │/key/generate│ │ /chat/completions │ │
|
||||
│ │ /team/delete│ │ /key/update │ │ (Agent 调用) │ │
|
||||
│ └─────────────┘ │ /key/delete │ └─────────────────────────┘ │
|
||||
│ └─────────────┘ │
|
||||
└──────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 总结
|
||||
|
||||
LiteLLM 集成已完成核心功能:
|
||||
|
||||
1. ✅ **渠道 = LiteLLM team**:创建渠道时自动创建 team
|
||||
2. ✅ **租户模型 = LiteLLM key**:分配模型时创建带配额的 key
|
||||
3. ✅ **配额管理**:RPM/TPM/Budget 由 LiteLLM 执行
|
||||
4. ✅ **Key 加密存储**:使用 Fernet 加密存储 API Key
|
||||
5. ✅ **实时生效**:配额更新后立即生效,无需重启
|
||||
|
||||
下一步:与 Agent Manager 联调,确保 Agent 能正确使用注入的 LiteLLM key 调用模型。
|
||||
@@ -0,0 +1,406 @@
|
||||
# LiteLLM 集成接口变动清单
|
||||
|
||||
> **版本**: v1.0.0
|
||||
> **创建时间**: 2026-01-07
|
||||
> **状态**: 已实现
|
||||
|
||||
---
|
||||
|
||||
## 1. 超级管理员端接口变动 (admin.py)
|
||||
|
||||
### 1.1 已修改接口
|
||||
|
||||
#### POST /api/admin/channels/create - 创建渠道
|
||||
|
||||
**变动说明**: 创建渠道时同步在 LiteLLM 中创建对应的 team
|
||||
|
||||
**请求参数**: 无变化
|
||||
|
||||
**响应变动**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": "渠道ID",
|
||||
"name": "渠道名称",
|
||||
"email": "渠道邮箱",
|
||||
"litellmTeamId": "LiteLLM team ID (新增)",
|
||||
"litellmWarning": "LiteLLM 创建失败时的警告信息 (可选)"
|
||||
},
|
||||
"message": "渠道创建成功"
|
||||
}
|
||||
```
|
||||
|
||||
**新增响应字段**:
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `litellmTeamId` | string | LiteLLM 中创建的 team ID |
|
||||
| `litellmWarning` | string | 可选,LiteLLM 操作失败时的警告信息 |
|
||||
|
||||
---
|
||||
|
||||
#### DELETE /api/admin/channels/{channel_id} - 删除渠道
|
||||
|
||||
**变动说明**: 删除渠道时同步删除 LiteLLM 中对应的 team
|
||||
|
||||
**请求参数**: 无变化
|
||||
|
||||
**响应变动**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": "渠道ID",
|
||||
"litellmWarning": "LiteLLM 删除失败时的警告信息 (可选)"
|
||||
},
|
||||
"message": "渠道已删除"
|
||||
}
|
||||
```
|
||||
|
||||
**新增响应字段**:
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `litellmWarning` | string | 可选,LiteLLM 操作失败时的警告信息 |
|
||||
|
||||
---
|
||||
|
||||
### 1.2 数据库变动
|
||||
|
||||
#### Channel 表新增字段
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `litellm_team_id` | VARCHAR(100) | LiteLLM 中对应的 team ID |
|
||||
|
||||
---
|
||||
|
||||
## 2. 渠道端接口变动 (channel.py)
|
||||
|
||||
### 2.1 新增接口
|
||||
|
||||
#### PUT /api/channel/tenants/{tenant_id}/models - 分配模型给租户
|
||||
|
||||
**功能**: 为租户创建 LiteLLM API Key,绑定指定的模型和配额
|
||||
|
||||
**请求参数** (Query):
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `model_name` | string | 是 | 模型名称,如 `azure/gpt-4` |
|
||||
| `rpm_limit` | int | 否 | 每分钟请求数限制,默认 60 |
|
||||
| `tpm_limit` | int | 否 | 每分钟 Token 数限制,默认 10000 |
|
||||
| `max_budget` | float | 否 | 最大预算,默认 100.0 |
|
||||
| `budget_duration` | string | 否 | 预算周期,`monthly` 或 `total`,默认 `monthly` |
|
||||
| `channel_id` | string | 否 | 渠道ID(超级管理员必填) |
|
||||
|
||||
**响应**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"tenantId": "租户ID",
|
||||
"tenantName": "租户名称",
|
||||
"modelName": "模型名称",
|
||||
"rpmLimit": 60,
|
||||
"tpmLimit": 10000,
|
||||
"maxBudget": 100.0,
|
||||
"budgetDuration": "monthly",
|
||||
"status": "active"
|
||||
},
|
||||
"message": "模型 'xxx' 分配成功"
|
||||
}
|
||||
```
|
||||
|
||||
**权限**: `manage:resources` (channel_admin, billing_admin, super_admin)
|
||||
|
||||
---
|
||||
|
||||
#### GET /api/channel/tenants/{tenant_id}/models - 获取租户的模型分配列表
|
||||
|
||||
**功能**: 返回租户已分配的所有模型及其配额信息
|
||||
|
||||
**请求参数** (Query):
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `channel_id` | string | 否 | 渠道ID(超级管理员必填) |
|
||||
|
||||
**响应**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"tenantId": "租户ID",
|
||||
"tenantName": "租户名称",
|
||||
"models": [
|
||||
{
|
||||
"modelName": "azure/gpt-4",
|
||||
"rpmLimit": 60,
|
||||
"tpmLimit": 10000,
|
||||
"maxBudget": 100.0,
|
||||
"budgetDuration": "monthly",
|
||||
"status": "active",
|
||||
"createdAt": "2026-01-07T12:00:00",
|
||||
"updatedAt": "2026-01-07T12:00:00"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**权限**: `view:resources` (channel_admin, billing_admin, operations_admin, super_admin)
|
||||
|
||||
---
|
||||
|
||||
#### DELETE /api/channel/tenants/{tenant_id}/models/{model_name} - 取消租户的模型分配
|
||||
|
||||
**功能**: 删除租户在 LiteLLM 中的 API Key,租户将无法再使用该模型
|
||||
|
||||
**请求参数** (Query):
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `channel_id` | string | 否 | 渠道ID(超级管理员必填) |
|
||||
|
||||
**响应**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"tenantId": "租户ID",
|
||||
"tenantName": "租户名称",
|
||||
"modelName": "模型名称",
|
||||
"litellmWarning": "LiteLLM Key 删除失败时的警告信息 (可选)"
|
||||
},
|
||||
"message": "模型 'xxx' 分配已取消"
|
||||
}
|
||||
```
|
||||
|
||||
**权限**: `manage:resources` (channel_admin, billing_admin, super_admin)
|
||||
|
||||
---
|
||||
|
||||
#### PUT /api/channel/tenants/{tenant_id}/models/{model_name}/quota - 更新租户的模型配额
|
||||
|
||||
**功能**: 更新租户在 LiteLLM 中的 API Key 配额,更新后立即生效
|
||||
|
||||
**请求参数** (Query):
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `rpm_limit` | int | 否 | 每分钟请求数限制 |
|
||||
| `tpm_limit` | int | 否 | 每分钟 Token 数限制 |
|
||||
| `max_budget` | float | 否 | 最大预算 |
|
||||
| `budget_duration` | string | 否 | 预算周期,`monthly` 或 `total` |
|
||||
| `channel_id` | string | 否 | 渠道ID(超级管理员必填) |
|
||||
|
||||
**响应**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"tenantId": "租户ID",
|
||||
"tenantName": "租户名称",
|
||||
"modelName": "模型名称",
|
||||
"rpmLimit": 120,
|
||||
"tpmLimit": 20000,
|
||||
"maxBudget": 200.0,
|
||||
"budgetDuration": "monthly",
|
||||
"status": "active"
|
||||
},
|
||||
"message": "模型配额更新成功,立即生效"
|
||||
}
|
||||
```
|
||||
|
||||
**权限**: `manage:resources` (channel_admin, billing_admin, super_admin)
|
||||
|
||||
---
|
||||
|
||||
### 2.2 数据库变动
|
||||
|
||||
#### 新增表: tenant_model_keys
|
||||
|
||||
```sql
|
||||
CREATE TABLE tenant_model_keys (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL REFERENCES users(id),
|
||||
channel_id UUID REFERENCES channels(id),
|
||||
|
||||
-- 模型信息
|
||||
model_name VARCHAR(100) NOT NULL,
|
||||
|
||||
-- LiteLLM Key 信息
|
||||
litellm_key_id VARCHAR(255) NOT NULL, -- LiteLLM 返回的完整 key
|
||||
litellm_key_hash TEXT NOT NULL, -- 加密存储
|
||||
|
||||
-- 配额配置(与 LiteLLM 同步)
|
||||
rpm_limit INTEGER DEFAULT 0,
|
||||
tpm_limit INTEGER DEFAULT 0,
|
||||
max_budget NUMERIC(12, 2),
|
||||
budget_duration VARCHAR(20) DEFAULT 'monthly',
|
||||
|
||||
-- 状态
|
||||
status VARCHAR(20) DEFAULT 'active',
|
||||
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW(),
|
||||
|
||||
UNIQUE(tenant_id, model_name)
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 用户端接口变动 (user.py)
|
||||
|
||||
### 3.1 新增接口
|
||||
|
||||
#### GET /api/user/models/available - 获取可用模型列表
|
||||
|
||||
**功能**: 返回当前租户已分配的所有模型
|
||||
|
||||
**响应**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"models": [
|
||||
{
|
||||
"modelName": "azure/gpt-4",
|
||||
"rpmLimit": 60,
|
||||
"tpmLimit": 10000,
|
||||
"maxBudget": 100.0,
|
||||
"budgetDuration": "monthly",
|
||||
"status": "active"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**权限**: 已认证用户
|
||||
|
||||
---
|
||||
|
||||
#### GET /api/user/models/usage/stats - 获取模型用量统计
|
||||
|
||||
**功能**: 从 LiteLLM 获取当前租户的模型用量统计
|
||||
|
||||
**响应**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"models": [
|
||||
{
|
||||
"modelName": "azure/gpt-4",
|
||||
"rpmLimit": 60,
|
||||
"tpmLimit": 10000,
|
||||
"maxBudget": 100.0,
|
||||
"budgetDuration": "monthly",
|
||||
"spend": 25.50,
|
||||
"budgetRemaining": 74.50,
|
||||
"status": "active"
|
||||
}
|
||||
],
|
||||
"totalSpend": 25.50,
|
||||
"totalBudget": 100.0
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**权限**: 已认证用户
|
||||
|
||||
---
|
||||
|
||||
### 3.2 已修改接口
|
||||
|
||||
#### POST /api/user/custom-agents - 创建自定义 Agent
|
||||
|
||||
**变动说明**: 创建 Agent 时自动注入 LiteLLM Key 环境变量
|
||||
|
||||
**新增逻辑**:
|
||||
1. 查询租户的模型 Key
|
||||
2. 如果租户有可用的模型 Key,自动注入以下环境变量:
|
||||
- `OPENAI_API_BASE`: LiteLLM 网关地址
|
||||
- `OPENAI_API_KEY`: 租户的 LiteLLM Key
|
||||
- `MODEL_NAME`: 模型名称
|
||||
|
||||
---
|
||||
|
||||
## 4. 接口变动汇总
|
||||
|
||||
### 4.1 超级管理员端 (admin.py)
|
||||
|
||||
| 接口 | 方法 | 变动类型 | 说明 |
|
||||
|------|------|----------|------|
|
||||
| `/api/admin/channels/create` | POST | 修改 | 响应新增 `litellmTeamId` 字段 |
|
||||
| `/api/admin/channels/{id}` | DELETE | 修改 | 同步删除 LiteLLM team |
|
||||
|
||||
### 4.2 渠道端 (channel.py)
|
||||
|
||||
| 接口 | 方法 | 变动类型 | 说明 |
|
||||
|------|------|----------|------|
|
||||
| `/api/channel/tenants/{id}/models` | PUT | **新增** | 分配模型给租户 |
|
||||
| `/api/channel/tenants/{id}/models` | GET | **新增** | 获取租户的模型列表 |
|
||||
| `/api/channel/tenants/{id}/models/{model}` | DELETE | **新增** | 取消模型分配 |
|
||||
| `/api/channel/tenants/{id}/models/{model}/quota` | PUT | **新增** | 更新模型配额 |
|
||||
|
||||
### 4.3 用户端 (user.py)
|
||||
|
||||
| 接口 | 方法 | 变动类型 | 说明 |
|
||||
|------|------|----------|------|
|
||||
| `/api/user/models/available` | GET | **新增** | 获取可用模型列表 |
|
||||
| `/api/user/models/usage/stats` | GET | **新增** | 获取模型用量统计 |
|
||||
| `/api/user/custom-agents` | POST | 修改 | 自动注入 LiteLLM Key |
|
||||
|
||||
---
|
||||
|
||||
## 5. 前端对接注意事项
|
||||
|
||||
### 5.1 渠道管理员界面
|
||||
|
||||
1. **租户详情页** 需要新增"模型管理"标签页,包含:
|
||||
- 模型列表展示
|
||||
- 分配模型按钮
|
||||
- 配额编辑功能
|
||||
- 取消分配功能
|
||||
|
||||
2. **分配模型表单** 需要包含:
|
||||
- 模型选择(下拉框,从渠道已有模型中选择)
|
||||
- RPM 限制输入
|
||||
- TPM 限制输入
|
||||
- 预算限制输入
|
||||
- 预算周期选择(月度/总计)
|
||||
|
||||
### 5.2 租户用户界面
|
||||
|
||||
1. **仪表板** 可以展示:
|
||||
- 可用模型列表
|
||||
- 各模型的配额使用情况
|
||||
- 预算剩余
|
||||
|
||||
2. **创建 Agent** 时:
|
||||
- 如果租户有可用模型,Agent 会自动获得访问权限
|
||||
- 无需用户手动配置 API Key
|
||||
|
||||
### 5.3 超级管理员界面
|
||||
|
||||
1. **渠道列表** 可以展示 `litellmTeamId`(可选)
|
||||
2. **创建渠道** 后检查响应中的 `litellmWarning` 字段
|
||||
|
||||
---
|
||||
|
||||
## 6. 错误处理
|
||||
|
||||
### 6.1 常见错误码
|
||||
|
||||
| 错误码 | 说明 |
|
||||
|--------|------|
|
||||
| 400 | 参数错误(如无效的渠道ID格式) |
|
||||
| 403 | 权限不足(如渠道没有该模型的权限) |
|
||||
| 404 | 资源不存在(如租户不存在、模型分配记录不存在) |
|
||||
| 500 | LiteLLM 操作失败 |
|
||||
|
||||
### 6.2 LiteLLM 操作失败处理
|
||||
|
||||
- 创建渠道时 LiteLLM team 创建失败:渠道仍会创建成功,响应中包含 `litellmWarning`
|
||||
- 删除渠道时 LiteLLM team 删除失败:渠道仍会删除成功,响应中包含 `litellmWarning`
|
||||
- 分配模型时 LiteLLM Key 创建失败:返回 500 错误,分配失败
|
||||
- 更新配额时 LiteLLM Key 更新失败:返回 500 错误,更新失败
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user