forked from xiaohei/taiji-AI-PAD
更新租户对接文档
This commit is contained in:
@@ -1,640 +0,0 @@
|
||||
# Taiji-AI-PAD 项目 API 接口完整清单
|
||||
|
||||
本文档列出了项目中所有的 API 接口,包括接口路径、HTTP 方法、功能描述和权限要求。
|
||||
|
||||
---
|
||||
|
||||
## 目录
|
||||
|
||||
1. [MCP-Server 服务接口](#mcp-server-服务接口)
|
||||
- [认证模块 (auth.py)](#1-认证模块-authpy)
|
||||
- [超级管理员 API (admin.py)](#2-超级管理员-api-adminpy)
|
||||
- [用户侧平台 API (user.py)](#3-用户侧平台-api-userpy)
|
||||
- [渠道合作伙伴 API (channel.py)](#4-渠道合作伙伴-api-channelpy)
|
||||
- [Agent 管理 (agents.py)](#5-agent-管理-agentspy)
|
||||
- [供应商管理 (providers.py)](#6-供应商管理-providerspy)
|
||||
- [会话管理 (sessions.py)](#7-会话管理-sessionspy)
|
||||
- [工具管理 (tools.py)](#8-工具管理-toolspy)
|
||||
- [WebSocket (websocket.py)](#9-websocket-websocketpy)
|
||||
- [计费与资源管理 (billing_admin.py)](#10-计费与资源管理-billing_adminpy)
|
||||
- [配额管理 (quota_management.py)](#11-配额管理-quota_managementpy)
|
||||
- [平台 Agent 配额 (platform_agent_quota.py)](#12-平台-agent-配额-platform_agent_quotapy)
|
||||
- [审计日志管理 (audit_management.py)](#13-审计日志管理-audit_managementpy)
|
||||
- [事件管理 (event_management.py)](#14-事件管理-event_managementpy)
|
||||
- [追踪管理 (trace_management.py)](#15-追踪管理-trace_managementpy)
|
||||
- [定价管理 (pricing_management.py)](#16-定价管理-pricing_managementpy)
|
||||
- [供应商健康检查 (provider_health_management.py)](#17-供应商健康检查-provider_health_managementpy)
|
||||
- [资源监控 (resource_monitoring.py)](#18-资源监控-resource_monitoringpy)
|
||||
- [前端集成 (frontend_integration.py)](#19-前端集成-frontend_integrationpy)
|
||||
- [监控 (monitoring.py)](#20-监控-monitoringpy)
|
||||
- [健康检查 (health.py)](#21-健康检查-healthpy)
|
||||
- [Prometheus 指标 (metrics.py)](#22-prometheus-指标-metricspy)
|
||||
2. [Data-Ingestion 服务接口](#data-ingestion-服务接口)
|
||||
|
||||
---
|
||||
|
||||
## MCP-Server 服务接口
|
||||
|
||||
### 1. 认证模块 (auth.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/api/auth/login` | 统一登录接口,支持用户/渠道/管理员/供应商登录 | 无 |
|
||||
| POST | `/api/auth/logout` | 用户登出,将 token 加入黑名单 | 已认证用户 |
|
||||
| POST | `/api/auth/refresh` | 刷新访问令牌 | 已认证用户 |
|
||||
| PUT | `/api/auth/password` | 修改密码 | 已认证用户 |
|
||||
| GET | `/api/auth/keys/info` | 获取当前用户的 API 密钥信息 | 已认证用户 |
|
||||
| POST | `/api/auth/keys/regenerate` | 重新生成 API 密钥 | 已认证用户 |
|
||||
|
||||
---
|
||||
|
||||
### 2. 超级管理员 API (admin.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/admin/admins` | 获取管理员列表 | super_admin |
|
||||
| POST | `/api/admin/admins/create` | 创建管理员 | super_admin |
|
||||
| DELETE | `/api/admin/admins/{admin_id}` | 删除管理员 | super_admin |
|
||||
| GET | `/api/admin/dashboard/recent-logins` | 获取最近登录的租户列表 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/admin/dashboard/stats` | 获取平台全局统计数据 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/admin/tenants` | 获取所有租户列表 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/admin/channels` | 获取渠道列表 | super_admin, billing_admin, operations_admin |
|
||||
| POST | `/api/admin/channels/create` | 创建渠道 | super_admin, billing_admin |
|
||||
| PUT | `/api/admin/channels/{channel_id}` | 更新渠道信息 | super_admin, billing_admin |
|
||||
| DELETE | `/api/admin/channels/{channel_id}` | 删除渠道 | super_admin |
|
||||
| GET | `/api/admin/channels/{channel_id}/resources` | 获取渠道资源配置 | super_admin, billing_admin, operations_admin |
|
||||
| PUT | `/api/admin/channels/{channel_id}/resources` | 分配渠道资源 | super_admin, billing_admin |
|
||||
| PUT | `/api/admin/channels/{channel_id}/commission` | 更新渠道佣金比例 | super_admin, billing_admin |
|
||||
| GET | `/api/admin/resources/allocation-stats` | 获取资源分配统计 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/admin/channels/applications` | 获取渠道资源申请列表 | super_admin, billing_admin |
|
||||
| PUT | `/api/admin/channels/applications/{application_id}/review` | 审批渠道资源申请 | super_admin, billing_admin |
|
||||
| GET | `/api/admin/resources/models` | 获取模型供应商列表 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/admin/resources/agents` | 获取所有 Agent 资源 | super_admin, billing_admin, operations_admin |
|
||||
| DELETE | `/api/admin/resources/agents/{agent_id}` | 删除 Agent 资源 | super_admin |
|
||||
| PUT | `/api/admin/resources/agents/{agent_id}/config` | 更新 Agent 配置 | super_admin, billing_admin |
|
||||
| GET | `/api/admin/monitoring/agents` | 监控 Agent 健康状态 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/admin/billing/overview` | 获取三维度计费统计 | super_admin, billing_admin |
|
||||
| GET | `/api/admin/providers/applications` | 获取供应商申请列表 | super_admin, billing_admin |
|
||||
| PUT | `/api/admin/providers/applications/{application_id}/review` | 审批供应商申请 | super_admin, billing_admin |
|
||||
| GET | `/api/admin/providers/access` | 获取渠道供应商授权列表 | super_admin, billing_admin, operations_admin |
|
||||
| PUT | `/api/admin/providers/access/{access_id}` | 更新供应商授权 | super_admin, billing_admin |
|
||||
| DELETE | `/api/admin/providers/access/{access_id}` | 撤销供应商授权 | super_admin |
|
||||
| GET | `/api/admin/channels/{channel_id}/admins` | 获取渠道管理员列表 | super_admin, billing_admin |
|
||||
| GET | `/api/admin/roles` | 获取可用角色列表 | super_admin |
|
||||
| GET | `/api/admin/platform-agents/templates` | 获取平台 Agent 模板列表 | super_admin, billing_admin |
|
||||
| GET | `/api/admin/applications/platform-agents` | 获取平台 Agent 申请列表 | super_admin, billing_admin |
|
||||
| PUT | `/api/admin/applications/platform-agents/{application_id}/review` | 审批平台 Agent 申请 | super_admin, billing_admin |
|
||||
| GET | `/api/admin/platform-agents/allocations` | 查看平台 Agent 分配情况 | super_admin, billing_admin, operations_admin |
|
||||
| POST | `/api/admin/platform-agents/allocate` | 直接分配平台 Agent 配额 | super_admin, billing_admin |
|
||||
| DELETE | `/api/admin/platform-agents/allocate` | 撤销平台 Agent 配额 | super_admin |
|
||||
| GET | `/api/admin/platform-agents/status` | 查看平台 Agent 运行状态 | super_admin, billing_admin, operations_admin |
|
||||
|
||||
---
|
||||
|
||||
### 3. 用户侧平台 API (user.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/user/dashboard/stats` | 获取用户仪表板统计数据 | 已认证用户 |
|
||||
| GET | `/api/user/agents/activity` | 获取 Agent 活动数据 | 已认证用户 |
|
||||
| POST | `/api/user/gateway/select` | 选择网关类型 (MCP/A2A/API) | 已认证用户 |
|
||||
| POST | `/api/user/gateway/api/create` | 创建网关 API | 已认证用户 |
|
||||
| GET | `/api/user/gateway/apis` | 获取网关 API 列表 | 已认证用户 |
|
||||
| GET | `/api/user/gateway/monitoring` | 获取网关监控数据 | 已认证用户 |
|
||||
| GET | `/api/user/custom-agent-quota` | 获取自定义 Agent 配额 | 已认证用户 |
|
||||
| POST | `/api/user/tools/generate` | 生成工具(创建自定义 Agent) | 已认证用户 |
|
||||
| POST | `/api/user/data-templates/create` | 创建数据模板 | 已认证用户 |
|
||||
| GET | `/api/user/agents/platform` | 获取平台 Agent 列表 | 已认证用户 |
|
||||
| POST | `/api/user/agents/deploy` | 部署 Agent 到 K8s | 已认证用户 |
|
||||
| POST | `/api/user/workflows/create` | 创建工作流 | 已认证用户 |
|
||||
| GET | `/api/user/billing/balance` | 获取余额信息 | 已认证用户 |
|
||||
| POST | `/api/user/billing/recharge` | 充值余额 | 已认证用户 |
|
||||
| GET | `/api/user/billing/history` | 获取计费历史 | 已认证用户 |
|
||||
| GET | `/api/user/platform-agents/available` | 获取可用平台 Agent | 已认证用户 |
|
||||
| POST | `/api/user/platform-agents/use` | 使用平台 Agent | 已认证用户 |
|
||||
| DELETE | `/api/user/platform-agents/{instance_name}` | 停止平台 Agent | 已认证用户 |
|
||||
| GET | `/api/user/platform-agents/instances` | 获取平台 Agent 实例列表 | 已认证用户 |
|
||||
| GET | `/api/user/custom-agents/templates` | 获取自定义 Agent 模板 | 已认证用户 |
|
||||
| POST | `/api/user/custom-agents` | 创建自定义 Agent | 已认证用户 |
|
||||
| DELETE | `/api/user/custom-agents/{name}` | 删除自定义 Agent | 已认证用户 |
|
||||
| PUT | `/api/user/custom-agents/{name}/scale` | 扩缩容自定义 Agent | 已认证用户 |
|
||||
| GET | `/api/user/custom-agents` | 获取自定义 Agent 列表 | 已认证用户 |
|
||||
| GET | `/api/user/custom-agents/{name}/logs` | 获取 Agent 日志 | 已认证用户 |
|
||||
| POST | `/api/user/custom-agents/{name}/restart` | 重启 Agent | 已认证用户 |
|
||||
| GET | `/api/user/agent-billing/stats` | 获取 Agent 计费统计 | 已认证用户 |
|
||||
| GET | `/api/user/agent-billing/history` | 获取 Agent 计费历史 | 已认证用户 |
|
||||
|
||||
---
|
||||
|
||||
### 4. 渠道合作伙伴 API (channel.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/channel/tenants` | 获取渠道下租户列表 | channel_admin |
|
||||
| POST | `/api/channel/tenants/create` | 创建租户 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/resources` | 分配租户资源 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/billing` | 更新租户计费设置 | channel_admin |
|
||||
| POST | `/api/channel/tenants/{tenant_id}/recharge` | 为租户充值 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/credit` | 设置租户授信额度 | channel_admin |
|
||||
| DELETE | `/api/channel/tenants/{tenant_id}` | 删除租户 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/status` | 更新租户状态 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/permissions` | 更新租户权限 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/password` | 重置租户密码 | channel_admin |
|
||||
| GET | `/api/channel/tenants/{tenant_id}/custom-agent-quota` | 获取租户自定义 Agent 配额 | channel_admin |
|
||||
| POST | `/api/channel/admins/create` | 创建渠道管理员 | channel_admin |
|
||||
| GET | `/api/channel/admins` | 获取渠道管理员列表 | channel_admin |
|
||||
| POST | `/api/channel/resources/apply` | 申请资源 | channel_admin |
|
||||
| GET | `/api/channel/billing/stats` | 获取渠道计费统计 | channel_admin |
|
||||
| GET | `/api/channel/providers` | 获取可用供应商列表 | channel_admin |
|
||||
| POST | `/api/channel/providers/apply` | 申请使用供应商 | channel_admin |
|
||||
| GET | `/api/channel/providers/applications` | 获取供应商申请列表 | channel_admin |
|
||||
| GET | `/api/channel/providers/access` | 获取已授权供应商列表 | channel_admin |
|
||||
| GET | `/api/channel/available-platform-agents` | 查看可用平台 Agent 模板 | channel_admin |
|
||||
| POST | `/api/channel/applications/platform-agents` | 申请平台 Agent | channel_admin |
|
||||
| GET | `/api/channel/applications/platform-agents` | 查看平台 Agent 申请列表 | channel_admin |
|
||||
| GET | `/api/channel/platform-agents` | 查看渠道平台 Agent 配额 | channel_admin |
|
||||
| POST | `/api/channel/tenants/{tenant_id}/platform-agents` | 分配平台 Agent 给租户 | channel_admin |
|
||||
| GET | `/api/channel/tenants/{tenant_id}/platform-agents/usage` | 查看租户平台 Agent 使用情况 | channel_admin |
|
||||
| GET | `/api/channel/agent-billing/stats` | 获取渠道 Agent 计费统计 | channel_admin |
|
||||
| GET | `/api/channel/agent-billing/history` | 获取渠道 Agent 计费历史 | channel_admin |
|
||||
| GET | `/api/channel/agent-billing/tenant-summary` | 获取租户 Agent 计费汇总 | channel_admin |
|
||||
|
||||
---
|
||||
|
||||
### 5. Agent 管理 (agents.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/agents/templates` | 获取所有 Agent 模板 | 已认证用户 |
|
||||
| GET | `/agents/templates/platform` | 获取平台 Agent 模板 | 已认证用户 |
|
||||
| GET | `/agents/templates/custom` | 获取自定义 Agent 模板 | 已认证用户 |
|
||||
| GET | `/agents/templates/{template_name}` | 获取模板详情 | 已认证用户 |
|
||||
| POST | `/agents` | 创建 Agent | 已认证用户 |
|
||||
| GET | `/agents` | 获取 Agent 列表 | 已认证用户 |
|
||||
| GET | `/agents/{agent_id}` | 获取 Agent 详情 | 已认证用户 |
|
||||
| DELETE | `/agents/{agent_id}` | 删除 Agent | 已认证用户 |
|
||||
| GET | `/agents/{agent_id}/status` | 获取 Agent 实时状态 | 已认证用户 |
|
||||
| GET | `/agents/{agent_id}/metrics` | 获取 Agent 资源使用 | 已认证用户 |
|
||||
| POST | `/agents/{agent_id}/execute` | 执行 Agent 任务 | 已认证用户 |
|
||||
|
||||
---
|
||||
|
||||
### 6. 供应商管理 (providers.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/providers/models` | 获取所有模型供应商 | 已认证用户 |
|
||||
| POST | `/api/providers/models/create` | 创建模型供应商 | super_admin, billing_admin |
|
||||
| GET | `/api/providers/models/{provider_id}` | 获取供应商详情 | 已认证用户 |
|
||||
| PUT | `/api/providers/models/{provider_id}` | 更新供应商配置 | super_admin, billing_admin |
|
||||
| DELETE | `/api/providers/models/{provider_id}` | 删除供应商 | super_admin |
|
||||
| POST | `/api/providers/models/{provider_id}/test` | 测试供应商连接 | super_admin, billing_admin |
|
||||
|
||||
---
|
||||
|
||||
### 7. 会话管理 (sessions.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/sessions` | 创建会话 | 已认证用户 |
|
||||
| GET | `/sessions` | 获取会话列表 | 已认证用户 |
|
||||
| GET | `/sessions/{session_id}` | 获取会话详情 | 已认证用户 |
|
||||
| PUT | `/sessions/{session_id}/complete` | 完成会话 | 已认证用户 |
|
||||
| DELETE | `/sessions/{session_id}` | 删除会话 | 已认证用户 |
|
||||
| POST | `/sessions/cleanup` | 清理旧会话 | 已认证用户 |
|
||||
|
||||
---
|
||||
|
||||
### 8. 工具管理 (tools.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/tools` | 获取工具列表 | 已认证用户 |
|
||||
| GET | `/tools/{tool_id}` | 获取工具详情 | 已认证用户 |
|
||||
| POST | `/tools` | 创建工具 | 已认证用户 |
|
||||
| PUT | `/tools/{tool_id}` | 更新工具 | 已认证用户 |
|
||||
| DELETE | `/tools/{tool_id}` | 删除工具 | 已认证用户 |
|
||||
| GET | `/tools/categories/list` | 获取工具分类列表 | 已认证用户 |
|
||||
|
||||
---
|
||||
|
||||
### 9. WebSocket (websocket.py)
|
||||
|
||||
| 协议 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| WS | `/ws/{agent_name_or_id}` | WebSocket 实时 MCP 交互 | 已认证用户 |
|
||||
|
||||
**功能说明**:
|
||||
- 支持连接池管理(最大 1000 连接)
|
||||
- 心跳机制(每 30 秒)
|
||||
- 消息队列
|
||||
- 自动清理超时连接(90 秒无心跳)
|
||||
|
||||
---
|
||||
|
||||
### 10. 计费与资源管理 (billing_admin.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/billing-admin/quota/user/{user_id}` | 获取用户配额信息 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/quota/channel/{channel_id}` | 获取渠道配额信息 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/quota/alerts` | 获取配额预警列表 | super_admin, billing_admin, operations_admin |
|
||||
| PUT | `/api/billing-admin/quota/alerts/{alert_id}/acknowledge` | 确认配额预警 | super_admin, billing_admin, operations_admin |
|
||||
| PUT | `/api/billing-admin/quota/alerts/{alert_id}/resolve` | 解决配额预警 | super_admin, billing_admin |
|
||||
| GET | `/api/billing-admin/resources/overview` | 获取平台资源概览 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/resources/user/{user_id}` | 获取用户资源使用汇总 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/resources/trends` | 获取资源使用趋势 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/resources/agent/{agent_id}` | 获取 Agent 资源统计 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/events/pending` | 获取待处理事件 | super_admin, billing_admin, operations_admin |
|
||||
| POST | `/api/billing-admin/events/retry-failed` | 重试失败事件 | super_admin, billing_admin |
|
||||
| GET | `/api/billing-admin/events/stats` | 获取事件统计 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/traces/execution/{execution_id}` | 获取执行追踪详情 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/traces` | 查询追踪记录 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/traces/stats` | 获取追踪统计 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/audit/logs` | 查询审计日志 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/audit/summary` | 获取审计日志汇总 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/audit/user/{user_id}/activity` | 获取用户活动历史 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/providers/health` | 获取所有供应商健康状态 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/providers/{provider_id}/health` | 获取单个供应商健康详情 | super_admin, billing_admin, operations_admin |
|
||||
| POST | `/api/billing-admin/providers/health-check` | 执行所有供应商健康检查 | super_admin, billing_admin |
|
||||
| GET | `/api/billing-admin/pricing/models` | 获取模型定价列表 | super_admin, billing_admin, operations_admin |
|
||||
| POST | `/api/billing-admin/pricing/models` | 创建或更新模型定价 | super_admin, billing_admin |
|
||||
| POST | `/api/billing-admin/pricing/calculate` | 计算模型调用成本 | super_admin, billing_admin, operations_admin |
|
||||
|
||||
---
|
||||
|
||||
### 11. 配额管理 (quota_management.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/billing-admin/quota/user/{user_id}` | 获取用户配额汇总信息 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/quota/channel/{channel_id}` | 获取渠道配额汇总信息 | super_admin, billing_admin |
|
||||
| GET | `/api/billing-admin/quota/alerts` | 获取配额预警列表 | super_admin, billing_admin, operations_admin |
|
||||
| PUT | `/api/billing-admin/quota/alerts/{alert_id}/acknowledge` | 确认配额预警 | super_admin, billing_admin |
|
||||
| PUT | `/api/billing-admin/quota/alerts/{alert_id}/resolve` | 解决配额预警 | super_admin, billing_admin |
|
||||
|
||||
---
|
||||
|
||||
### 12. 平台 Agent 配额 (platform_agent_quota.py)
|
||||
|
||||
#### 渠道路由 (channel_router)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/channel/available-platform-agents` | 获取可用平台 Agent 模板 | channel_admin |
|
||||
| POST | `/api/channel/applications/platform-agents` | 申请平台 Agent 配额 | channel_admin |
|
||||
| GET | `/api/channel/applications/platform-agents` | 查看渠道平台 Agent 申请列表 | channel_admin |
|
||||
| GET | `/api/channel/platform-agents` | 查看渠道已分配的平台 Agent 配额 | channel_admin |
|
||||
| POST | `/api/channel/tenants/{tenant_id}/platform-agents` | 分配平台 Agent 给租户 | channel_admin |
|
||||
|
||||
#### 管理员路由 (admin_router)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/admin/applications/platform-agents` | 查看所有平台 Agent 申请 | admin, super_admin |
|
||||
| PUT | `/api/admin/applications/platform-agents/{application_id}/review` | 审批平台 Agent 申请 | admin, super_admin |
|
||||
| GET | `/api/admin/platform-agents/templates` | 获取平台 Agent 模板列表 | admin, super_admin |
|
||||
| PUT | `/api/admin/platform-agents/templates/{template_name}/config` | 配置平台 Agent 模板 | admin, super_admin |
|
||||
| GET | `/api/admin/platform-agents/templates/{template_name}/config` | 获取平台 Agent 模板配置 | admin, super_admin |
|
||||
|
||||
#### 用户路由 (user_router)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/user/platform-agents` | 查看用户可用的平台 Agent 配额 | 已认证用户 |
|
||||
| GET | `/api/user/platform-agents/{template}/instances` | 查看用户的平台 Agent 实例 | 已认证用户 |
|
||||
| DELETE | `/api/user/platform-agents/{agent_name}` | 停止平台 Agent 实例 | 已认证用户 |
|
||||
| GET | `/api/user/platform-agents/quota` | 查看用户平台 Agent 配额使用情况 | 已认证用户 |
|
||||
| GET | `/api/user/platform-agents/{agent_name}/status` | 查看平台 Agent 实例状态 | 已认证用户 |
|
||||
|
||||
---
|
||||
|
||||
### 13. 审计日志管理 (audit_management.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/billing-admin/audit/logs` | 查询审计日志(分页) | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/audit/summary` | 获取审计日志汇总 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/audit/user/{user_id}/activity` | 获取用户活动历史 | super_admin, billing_admin, operations_admin |
|
||||
|
||||
---
|
||||
|
||||
### 14. 事件管理 (event_management.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/billing-admin/events/pending` | 获取待处理的计费事件列表 | super_admin, billing_admin |
|
||||
| POST | `/api/billing-admin/events/retry-failed` | 重试失败的计费事件 | super_admin, billing_admin |
|
||||
| GET | `/api/billing-admin/events/stats` | 获取计费事件统计 | super_admin, billing_admin, operations_admin |
|
||||
|
||||
---
|
||||
|
||||
### 15. 追踪管理 (trace_management.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/billing-admin/traces/execution/{execution_id}` | 获取执行追踪详情 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/traces` | 查询追踪记录(分页) | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/traces/stats` | 获取追踪统计 | super_admin, billing_admin, operations_admin |
|
||||
|
||||
---
|
||||
|
||||
### 16. 定价管理 (pricing_management.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/billing-admin/pricing/models` | 获取模型定价列表 | super_admin, billing_admin, operations_admin |
|
||||
| POST | `/api/billing-admin/pricing/models` | 创建或更新模型定价 | super_admin, billing_admin |
|
||||
| POST | `/api/billing-admin/pricing/calculate` | 计算模型调用成本 | super_admin, billing_admin, operations_admin |
|
||||
|
||||
---
|
||||
|
||||
### 17. 供应商健康检查 (provider_health_management.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/billing-admin/providers/health` | 获取所有供应商健康状态 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/providers/{provider_id}/health` | 获取供应商健康详情 | super_admin, billing_admin, operations_admin |
|
||||
| POST | `/api/billing-admin/providers/health-check` | 执行供应商健康检查 | super_admin, billing_admin |
|
||||
|
||||
---
|
||||
|
||||
### 18. 资源监控 (resource_monitoring.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/billing-admin/resources/overview` | 获取平台资源概览 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/resources/user/{user_id}` | 获取用户资源使用汇总 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/resources/trends` | 获取资源使用趋势 | super_admin, billing_admin, operations_admin |
|
||||
| GET | `/api/billing-admin/resources/agent/{agent_id}` | 获取 Agent 资源统计 | super_admin, billing_admin, operations_admin |
|
||||
|
||||
---
|
||||
|
||||
### 19. 前端集成 (frontend_integration.py)
|
||||
|
||||
#### 用户仪表板
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/user/dashboard/stats` | 获取用户仪表板统计 | 已认证用户 |
|
||||
| GET | `/api/user/agents/activity` | 获取 Agent 活动数据 | 已认证用户 |
|
||||
| GET | `/api/user/resources/usage` | 获取用户资源使用情况 | 已认证用户 |
|
||||
|
||||
#### 服务网关
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/api/gateway/select` | 选择网关类型 | 已认证用户 |
|
||||
| POST | `/api/gateway/api/create` | 创建网关 API | 已认证用户 |
|
||||
| GET | `/api/gateway/apis` | 获取网关 API 列表 | 已认证用户 |
|
||||
| GET | `/api/gateway/monitoring` | 获取网关监控数据 | 已认证用户 |
|
||||
|
||||
#### 数据与工具
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/api/tools/generate` | 生成工具 | 已认证用户 |
|
||||
| GET | `/api/tools/list` | 获取工具列表 | 已认证用户 |
|
||||
| POST | `/api/data-templates/create` | 创建数据模板 | 已认证用户 |
|
||||
|
||||
#### Agent 工厂
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/agents/platform` | 获取平台 Agent 列表 | 已认证用户 |
|
||||
| POST | `/api/agents/deploy` | 部署 Agent | 已认证用户 |
|
||||
| GET | `/api/agents/deployed` | 获取已部署 Agent 列表 | 已认证用户 |
|
||||
|
||||
#### 工作流
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/api/workflows/create` | 创建工作流 | 已认证用户 |
|
||||
| GET | `/api/workflows/list` | 获取工作流列表 | 已认证用户 |
|
||||
| PUT | `/api/workflows/{workflow_id}` | 更新工作流 | 已认证用户 |
|
||||
| DELETE | `/api/workflows/{workflow_id}` | 删除工作流 | 已认证用户 |
|
||||
|
||||
#### 计费与资源
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/billing/balance` | 获取余额 | 已认证用户 |
|
||||
| GET | `/api/billing/history` | 获取计费历史 | 已认证用户 |
|
||||
| POST | `/api/billing/recharge` | 充值 | 已认证用户 |
|
||||
|
||||
#### 渠道合作伙伴
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/api/channel/auth/login` | 渠道登录 | 无 |
|
||||
| GET | `/api/channel/dashboard/stats` | 渠道仪表板统计 | channel_admin |
|
||||
| GET | `/api/channel/agents/available` | 获取可用 Agent | channel_admin |
|
||||
| GET | `/api/channel/tenants` | 获取租户列表 | channel_admin |
|
||||
| POST | `/api/channel/tenants/create` | 创建租户 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/resources` | 更新租户资源 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/billing` | 更新租户计费 | channel_admin |
|
||||
| DELETE | `/api/channel/tenants/{tenant_id}` | 删除租户 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/status` | 更新租户状态 | channel_admin |
|
||||
| PUT | `/api/channel/tenants/{tenant_id}/permissions` | 更新租户权限 | channel_admin |
|
||||
| GET | `/api/channel/resources/agents` | 获取渠道 Agent 资源 | channel_admin |
|
||||
| GET | `/api/channel/resources/models` | 获取渠道模型资源 | channel_admin |
|
||||
| POST | `/api/channel/resources/apply` | 申请资源 | channel_admin |
|
||||
| GET | `/api/channel/billing/stats` | 获取渠道计费统计 | channel_admin |
|
||||
| GET | `/api/channel/admins` | 获取渠道管理员列表 | channel_admin |
|
||||
| POST | `/api/channel/admins/create` | 创建渠道管理员 | channel_admin |
|
||||
| PUT | `/api/channel/admins/{admin_id}/permissions` | 更新管理员权限 | channel_admin |
|
||||
|
||||
#### 超级管理员
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/api/admin/auth/login` | 管理员登录 | 无 |
|
||||
| GET | `/api/admin/dashboard/stats` | 管理员仪表板统计 | super_admin |
|
||||
| GET | `/api/admin/channels` | 获取渠道列表 | super_admin |
|
||||
| POST | `/api/admin/channels/create` | 创建渠道 | super_admin |
|
||||
| PUT | `/api/admin/channels/{channel_id}/commission` | 更新渠道佣金 | super_admin |
|
||||
| GET | `/api/admin/channels/{channel_id}/resources` | 获取渠道资源 | super_admin |
|
||||
| PUT | `/api/admin/channels/{channel_id}/resources` | 更新渠道资源 | super_admin |
|
||||
| GET | `/api/admin/channels/applications` | 获取渠道申请列表 | super_admin |
|
||||
| PUT | `/api/admin/channels/applications/{request_id}/approve` | 审批渠道申请 | super_admin |
|
||||
| GET | `/api/admin/resources/models` | 获取模型资源 | super_admin |
|
||||
| POST | `/api/admin/resources/models/add` | 添加模型资源 | super_admin |
|
||||
| GET | `/api/admin/resources/agents` | 获取 Agent 资源 | super_admin |
|
||||
| PUT | `/api/admin/resources/agents/{agent_id}` | 更新 Agent 资源 | super_admin |
|
||||
| GET | `/api/admin/monitoring/agents` | 监控 Agent | super_admin |
|
||||
| GET | `/api/admin/billing/overview` | 计费概览 | super_admin |
|
||||
| GET | `/api/admin/roles` | 获取角色列表 | super_admin |
|
||||
| GET | `/api/admin/channels/{channel_id}/admins` | 获取渠道管理员 | super_admin |
|
||||
| POST | `/api/admin/admins/create` | 创建管理员 | super_admin |
|
||||
| GET | `/api/admin/providers/stats` | 获取供应商统计 | super_admin |
|
||||
| GET | `/api/admin/channels/backend/stats` | 获取后端统计 | super_admin |
|
||||
|
||||
#### 供应商管理
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/api/providers/auth/login` | 供应商登录 | 无 |
|
||||
| GET | `/api/providers/models` | 获取供应商模型 | provider_admin |
|
||||
| POST | `/api/providers/models/add` | 添加供应商模型 | provider_admin |
|
||||
| GET | `/api/providers/data` | 获取供应商数据 | provider_admin |
|
||||
|
||||
---
|
||||
|
||||
### 20. 监控 (monitoring.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/api/v1/monitoring/metrics` | 获取系统指标 | 无 |
|
||||
| GET | `/api/v1/monitoring/stats` | 获取服务统计 | 无 |
|
||||
| GET | `/api/v1/monitoring/trends` | 获取性能趋势 | 无 |
|
||||
| GET | `/api/v1/monitoring/alerts` | 获取系统告警 | 无 |
|
||||
| GET | `/api/v1/monitoring/dashboard` | 获取监控仪表板 | 无 |
|
||||
|
||||
---
|
||||
|
||||
### 21. 健康检查 (health.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/health` | 系统健康检查 | 无 |
|
||||
|
||||
---
|
||||
|
||||
### 22. Prometheus 指标 (metrics.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/metrics` | 暴露 Prometheus 指标 | 无 |
|
||||
|
||||
---
|
||||
|
||||
## Data-Ingestion 服务接口
|
||||
|
||||
### 1. APILLAMA 处理 (apillama.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/apillama/process` | 将 API 文档转换为结构化 schema | 无 |
|
||||
|
||||
---
|
||||
|
||||
### 2. 健康检查 (health.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/health` | 服务健康检查 | 无 |
|
||||
|
||||
---
|
||||
|
||||
### 3. Prometheus 指标 (metrics.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/metrics` | 暴露 Prometheus 指标 | 无 |
|
||||
|
||||
---
|
||||
|
||||
### 4. OpenAPI 解析 (openapi.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/openapi/parse` | 下载并解析 OpenAPI 文档 | 无 |
|
||||
|
||||
---
|
||||
|
||||
### 5. RapidAPI 集成 (rapidapi.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/rapidapi/sync` | 触发 RapidAPI 端点同步 | 无 |
|
||||
| POST | `/rapidapi/test` | 测试 RapidAPI 端点 | 无 |
|
||||
|
||||
---
|
||||
|
||||
### 6. 统计与缓存 (stats.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| GET | `/stats` | 获取工具和缓存统计 | 无 |
|
||||
| POST | `/cache/clear` | 清理缓存 | 无 |
|
||||
|
||||
---
|
||||
|
||||
### 7. 工具注册 (tools.py)
|
||||
|
||||
| 方法 | 路径 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| POST | `/tools/generate` | 为 API 端点生成工具 | 无 |
|
||||
| GET | `/tools` | 获取工具列表 | 无 |
|
||||
| GET | `/tools/{tool_name}` | 获取工具详情 | 无 |
|
||||
| DELETE | `/tools/{tool_name}` | 删除工具 | 无 |
|
||||
|
||||
---
|
||||
|
||||
## 接口统计
|
||||
|
||||
### MCP-Server 服务
|
||||
|
||||
| 模块 | 接口数量 |
|
||||
|------|----------|
|
||||
| 认证模块 | 6 |
|
||||
| 超级管理员 API | 35 |
|
||||
| 用户侧平台 API | 28 |
|
||||
| 渠道合作伙伴 API | 27 |
|
||||
| Agent 管理 | 11 |
|
||||
| 供应商管理 | 6 |
|
||||
| 会话管理 | 6 |
|
||||
| 工具管理 | 6 |
|
||||
| WebSocket | 1 |
|
||||
| 计费与资源管理 | 24 |
|
||||
| 配额管理 | 5 |
|
||||
| 平台 Agent 配额 | 15 |
|
||||
| 审计日志管理 | 3 |
|
||||
| 事件管理 | 3 |
|
||||
| 追踪管理 | 3 |
|
||||
| 定价管理 | 3 |
|
||||
| 供应商健康检查 | 3 |
|
||||
| 资源监控 | 4 |
|
||||
| 前端集成 | 50+ |
|
||||
| 监控 | 5 |
|
||||
| 健康检查 | 1 |
|
||||
| Prometheus 指标 | 1 |
|
||||
|
||||
### Data-Ingestion 服务
|
||||
|
||||
| 模块 | 接口数量 |
|
||||
|------|----------|
|
||||
| APILLAMA 处理 | 1 |
|
||||
| 健康检查 | 1 |
|
||||
| Prometheus 指标 | 1 |
|
||||
| OpenAPI 解析 | 1 |
|
||||
| RapidAPI 集成 | 2 |
|
||||
| 统计与缓存 | 2 |
|
||||
| 工具注册 | 4 |
|
||||
|
||||
---
|
||||
|
||||
## 角色权限说明
|
||||
|
||||
| 角色 | 说明 |
|
||||
|------|------|
|
||||
| `super_admin` | 超级管理员,拥有系统所有权限 |
|
||||
| `billing_admin` | 计费管理员,完整写入权限,可创建渠道、管理租户、计费操作 |
|
||||
| `operations_admin` | 运维管理员,只读权限,仅查看和监控 |
|
||||
| `channel_admin` | 渠道管理员,渠道内部管理权限 |
|
||||
| `provider_admin` | 供应商管理员,管理供应商模型 |
|
||||
| `user` | 普通用户,标准用户权限 |
|
||||
|
||||
---
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **Web 框架**: FastAPI
|
||||
- **ORM**: SQLAlchemy (异步)
|
||||
- **认证**: JWT (JSON Web Token)
|
||||
- **权限系统**: RBAC (基于角色的访问控制)
|
||||
- **Kubernetes 集成**: Agent Manager 客户端
|
||||
- **实时通信**: WebSocket
|
||||
- **监控**: Prometheus
|
||||
- **消息队列**: NATS
|
||||
- **缓存**: Redis
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,527 +0,0 @@
|
||||
# 模型供应商与租户模型使用设计方案(最终版 v5.0)
|
||||
|
||||
> **版本**: v5.0.0
|
||||
> **创建时间**: 2026-01-07
|
||||
> **状态**: 待评审
|
||||
|
||||
---
|
||||
|
||||
## 1. 核心职责分工
|
||||
|
||||
### 1.1 职责划分表
|
||||
|
||||
| 职责 | 负责方 | 说明 |
|
||||
|------|--------|------|
|
||||
| 决定租户能用哪些模型 | **mcp-server** | 业务规则制定者 |
|
||||
| 决定 RPM/TPM/Budget 数值 | **mcp-server** | 配额分配 |
|
||||
| 真正拦截超额请求 | **litellm-gateway** | 规则执行者 |
|
||||
| 管理 Agent 生命周期 | **mcp-server + Agent Manager** | 与 litellm 解耦 |
|
||||
| 用量统计和计费 | **litellm-gateway** | 原生能力 |
|
||||
|
||||
### 1.2 概念映射
|
||||
|
||||
| 平台概念 | LiteLLM 对应 | 说明 |
|
||||
|----------|-------------|------|
|
||||
| 渠道 | team | 一个渠道 = 一个 team |
|
||||
| 租户 | team 下的 key 或子 team | 租户归属于渠道 |
|
||||
| 模型供应商 | model/provider | litellm 配置 |
|
||||
| 平台 Agent | 不进 LiteLLM | mcp-server 自己管理 |
|
||||
|
||||
### 1.3 LiteLLM 不关心的事情
|
||||
|
||||
- ❌ Agent 是什么
|
||||
- ❌ Agent 从哪来
|
||||
- ❌ Agent 跑在 AKS 还是别的地方
|
||||
- ❌ Agent 生命周期
|
||||
|
||||
**LiteLLM 只看请求里的**:
|
||||
- ✅ api_key
|
||||
- ✅ team
|
||||
- ✅ model
|
||||
|
||||
---
|
||||
|
||||
## 2. 整体架构
|
||||
|
||||
### 2.1 架构图
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph mcp-server[mcp-server 业务规则制定者]
|
||||
A1[管理员创建渠道]
|
||||
A2[分配模型供应商给渠道]
|
||||
A3[渠道分配模型给租户]
|
||||
A4[设置 RPM/TPM/Budget]
|
||||
A5[用户充值更新额度]
|
||||
end
|
||||
|
||||
subgraph litellm[litellm-gateway 规则执行者]
|
||||
B1[team 管理]
|
||||
B2[key 管理]
|
||||
B3[rate_limit 检查]
|
||||
B4[budget 检查]
|
||||
B5[用量统计]
|
||||
end
|
||||
|
||||
subgraph agent[Agent 运行层 - 与 litellm 解耦]
|
||||
C1[Agent Manager]
|
||||
C2[AKS Pod]
|
||||
C3[调用模型]
|
||||
end
|
||||
|
||||
A1 --> |创建 team| B1
|
||||
A3 --> |创建 key + 配额| B2
|
||||
A4 --> |设置 rate_limit| B3
|
||||
A5 --> |更新 budget| B4
|
||||
|
||||
C2 --> |带 api_key 请求| litellm
|
||||
litellm --> |检查配额| B3
|
||||
litellm --> |检查余额| B4
|
||||
litellm --> |转发| Provider[Azure/Gemini]
|
||||
```
|
||||
|
||||
### 2.2 核心流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Admin as 管理员
|
||||
participant MCP as mcp-server
|
||||
participant LiteLLM as litellm-gateway
|
||||
participant Agent as Agent Pod
|
||||
participant Azure as Azure/Gemini
|
||||
|
||||
Note over Admin,Azure: 1️⃣ 创建渠道
|
||||
Admin->>MCP: 创建渠道
|
||||
MCP->>LiteLLM: POST /team/new
|
||||
Note over MCP,LiteLLM: team_alias: channel-xxx
|
||||
|
||||
Note over Admin,Azure: 2️⃣ 分配模型给渠道
|
||||
Admin->>MCP: 分配模型 azure/gpt-4
|
||||
MCP->>MCP: 记录到 ResourceAllocation
|
||||
|
||||
Note over Admin,Azure: 3️⃣ 渠道分配模型给租户
|
||||
MCP->>LiteLLM: POST /key/generate
|
||||
Note over MCP,LiteLLM: team_id, models, rpm_limit, tpm_limit, max_budget
|
||||
LiteLLM-->>MCP: 返回 api_key
|
||||
MCP->>MCP: 保存 key 到数据库
|
||||
|
||||
Note over Admin,Azure: 4️⃣ 租户创建 Agent
|
||||
MCP->>MCP: 查询租户的 api_key
|
||||
MCP->>Agent: 启动 Pod,注入 api_key
|
||||
|
||||
Note over Admin,Azure: 5️⃣ Agent 调用模型
|
||||
Agent->>LiteLLM: POST /chat/completions
|
||||
Note over Agent,LiteLLM: Authorization: Bearer api_key
|
||||
LiteLLM->>LiteLLM: 检查 RPM/TPM
|
||||
LiteLLM->>LiteLLM: 检查 Budget
|
||||
|
||||
alt 配额/余额不足
|
||||
LiteLLM-->>Agent: 429/403 拒绝
|
||||
else 配额充足
|
||||
LiteLLM->>Azure: 转发请求
|
||||
Azure-->>LiteLLM: 返回结果
|
||||
LiteLLM->>LiteLLM: 记录用量
|
||||
LiteLLM-->>Agent: 返回结果
|
||||
end
|
||||
|
||||
Note over Admin,Azure: 6️⃣ 用户充值
|
||||
MCP->>LiteLLM: POST /key/update
|
||||
Note over MCP,LiteLLM: 更新 max_budget
|
||||
Note over MCP,LiteLLM: 下一次请求立刻放行,无需重启
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 详细设计
|
||||
|
||||
### 3.1 创建渠道(对应 LiteLLM team)
|
||||
|
||||
**mcp-server 操作**:
|
||||
```python
|
||||
async def create_channel(channel_name: str, db: AsyncSession):
|
||||
# 1. 在 mcp-server 创建渠道记录
|
||||
channel = Channel(name=channel_name, ...)
|
||||
db.add(channel)
|
||||
|
||||
# 2. 在 litellm 创建对应的 team
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.post(
|
||||
f"{settings.litellm_url}/team/new",
|
||||
json={
|
||||
"team_alias": f"channel-{channel.id}",
|
||||
"metadata": {
|
||||
"channel_id": str(channel.id),
|
||||
"channel_name": channel_name
|
||||
}
|
||||
},
|
||||
headers={"Authorization": f"Bearer {settings.litellm_master_key}"}
|
||||
)
|
||||
data = response.json()
|
||||
|
||||
# 保存 litellm team_id
|
||||
channel.litellm_team_id = data["team_id"]
|
||||
|
||||
await db.commit()
|
||||
return channel
|
||||
```
|
||||
|
||||
### 3.2 分配模型给渠道
|
||||
|
||||
**mcp-server 操作**:
|
||||
```python
|
||||
async def allocate_models_to_channel(
|
||||
channel_id: str,
|
||||
models: list[str], # ["azure/gpt-4", "gemini/gemini-pro"]
|
||||
db: AsyncSession
|
||||
):
|
||||
# 只在 mcp-server 记录,不需要同步到 litellm
|
||||
# litellm 的 team 不限制模型,模型限制在 key 级别
|
||||
for model in models:
|
||||
allocation = ResourceAllocation(
|
||||
target_id=channel_id,
|
||||
target_type="channel",
|
||||
resource_type="model",
|
||||
resource_id=model
|
||||
)
|
||||
db.add(allocation)
|
||||
|
||||
await db.commit()
|
||||
```
|
||||
|
||||
### 3.3 渠道分配模型给租户(核心)
|
||||
|
||||
**mcp-server 操作**:
|
||||
```python
|
||||
async def allocate_model_to_tenant(
|
||||
tenant_id: str,
|
||||
channel_id: str,
|
||||
model_name: str,
|
||||
rpm_limit: int,
|
||||
tpm_limit: int,
|
||||
max_budget: float,
|
||||
db: AsyncSession
|
||||
):
|
||||
# 1. 验证渠道是否有该模型
|
||||
channel_has_model = await check_channel_has_model(channel_id, model_name, db)
|
||||
if not channel_has_model:
|
||||
raise HTTPException(status_code=403, detail="渠道没有该模型的权限")
|
||||
|
||||
# 2. 获取渠道的 litellm team_id
|
||||
channel = await get_channel(channel_id, db)
|
||||
|
||||
# 3. 在 litellm 创建 key(绑定 team + model + 配额)
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.post(
|
||||
f"{settings.litellm_url}/key/generate",
|
||||
json={
|
||||
"team_id": channel.litellm_team_id,
|
||||
"models": [model_name],
|
||||
"rpm_limit": rpm_limit,
|
||||
"tpm_limit": tpm_limit,
|
||||
"max_budget": max_budget,
|
||||
"budget_duration": "monthly", # 或 "total"
|
||||
"metadata": {
|
||||
"tenant_id": str(tenant_id),
|
||||
"channel_id": str(channel_id),
|
||||
"model": model_name
|
||||
}
|
||||
},
|
||||
headers={"Authorization": f"Bearer {settings.litellm_master_key}"}
|
||||
)
|
||||
data = response.json()
|
||||
|
||||
# 4. 保存到数据库
|
||||
tenant_key = TenantModelKey(
|
||||
tenant_id=tenant_id,
|
||||
channel_id=channel_id,
|
||||
model_name=model_name,
|
||||
litellm_key_id=data["key"],
|
||||
litellm_key_hash=encrypt(data["key"]), # 加密存储
|
||||
rpm_limit=rpm_limit,
|
||||
tpm_limit=tpm_limit,
|
||||
max_budget=max_budget
|
||||
)
|
||||
db.add(tenant_key)
|
||||
|
||||
# 5. 同时记录到 ResourceAllocation
|
||||
allocation = ResourceAllocation(
|
||||
target_id=tenant_id,
|
||||
target_type="tenant",
|
||||
resource_type="model",
|
||||
resource_id=model_name,
|
||||
rpm=rpm_limit,
|
||||
tpm=tpm_limit
|
||||
)
|
||||
db.add(allocation)
|
||||
|
||||
await db.commit()
|
||||
return tenant_key
|
||||
```
|
||||
|
||||
### 3.4 租户创建 Agent
|
||||
|
||||
**mcp-server 操作**:
|
||||
```python
|
||||
async def create_custom_agent(
|
||||
tenant_id: str,
|
||||
agent_name: str,
|
||||
model_name: str,
|
||||
cpu_request: str,
|
||||
memory_request: str,
|
||||
db: AsyncSession
|
||||
):
|
||||
# 1. 查询租户的模型 key
|
||||
tenant_key = await db.execute(
|
||||
select(TenantModelKey).where(
|
||||
and_(
|
||||
TenantModelKey.tenant_id == tenant_id,
|
||||
TenantModelKey.model_name == model_name,
|
||||
TenantModelKey.status == "active"
|
||||
)
|
||||
)
|
||||
)
|
||||
tenant_key = tenant_key.scalar_one_or_none()
|
||||
|
||||
if not tenant_key:
|
||||
raise HTTPException(
|
||||
status_code=403,
|
||||
detail=f"您没有使用模型 {model_name} 的权限"
|
||||
)
|
||||
|
||||
# 2. 调用 Agent Manager 创建 Pod
|
||||
# Agent Manager 不需要知道 litellm 的任何细节
|
||||
# 只需要注入环境变量
|
||||
result = await agent_manager.create_agent(
|
||||
name=agent_name,
|
||||
cpu_request=cpu_request,
|
||||
memory_request=memory_request,
|
||||
env_vars={
|
||||
"OPENAI_API_BASE": settings.litellm_url,
|
||||
"OPENAI_API_KEY": decrypt(tenant_key.litellm_key_hash),
|
||||
"MODEL_NAME": model_name
|
||||
}
|
||||
)
|
||||
|
||||
return result
|
||||
```
|
||||
|
||||
### 3.5 用户充值更新额度
|
||||
|
||||
**mcp-server 操作**:
|
||||
```python
|
||||
async def recharge_tenant_budget(
|
||||
tenant_id: str,
|
||||
model_name: str,
|
||||
additional_budget: float,
|
||||
db: AsyncSession
|
||||
):
|
||||
# 1. 获取租户的 key
|
||||
tenant_key = await get_tenant_model_key(tenant_id, model_name, db)
|
||||
|
||||
# 2. 计算新的 budget
|
||||
new_budget = float(tenant_key.max_budget or 0) + additional_budget
|
||||
|
||||
# 3. 更新 litellm key 的 budget
|
||||
async with httpx.AsyncClient() as client:
|
||||
await client.post(
|
||||
f"{settings.litellm_url}/key/update",
|
||||
json={
|
||||
"key": tenant_key.litellm_key_id,
|
||||
"max_budget": new_budget
|
||||
},
|
||||
headers={"Authorization": f"Bearer {settings.litellm_master_key}"}
|
||||
)
|
||||
|
||||
# 4. 更新数据库
|
||||
tenant_key.max_budget = new_budget
|
||||
await db.commit()
|
||||
|
||||
# ✅ 下一次请求立刻放行,无需重启任何服务
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 数据模型
|
||||
|
||||
### 4.1 新增表:TenantModelKey
|
||||
|
||||
```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)
|
||||
);
|
||||
```
|
||||
|
||||
### 4.2 Channel 表增加字段
|
||||
|
||||
```sql
|
||||
ALTER TABLE channels ADD COLUMN litellm_team_id VARCHAR(100);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. LiteLLM 配置
|
||||
|
||||
### 5.1 litellm_config.yaml
|
||||
|
||||
```yaml
|
||||
general_settings:
|
||||
master_key: "sk-taiji-master-key"
|
||||
database_url: "postgresql://..." # 可选,用于持久化
|
||||
|
||||
model_list:
|
||||
# Azure GPT-4
|
||||
- model_name: "azure/gpt-4"
|
||||
litellm_params:
|
||||
model: "azure/gpt-4"
|
||||
api_base: "https://taiji-azure.openai.azure.com"
|
||||
api_key: "os.environ/AZURE_API_KEY"
|
||||
api_version: "2024-02-15-preview"
|
||||
|
||||
# Azure GPT-3.5
|
||||
- model_name: "azure/gpt-35-turbo"
|
||||
litellm_params:
|
||||
model: "azure/gpt-35-turbo"
|
||||
api_base: "https://taiji-azure.openai.azure.com"
|
||||
api_key: "os.environ/AZURE_API_KEY"
|
||||
api_version: "2024-02-15-preview"
|
||||
|
||||
# Google Gemini
|
||||
- model_name: "gemini/gemini-pro"
|
||||
litellm_params:
|
||||
model: "gemini/gemini-pro"
|
||||
api_key: "os.environ/GOOGLE_API_KEY"
|
||||
|
||||
# 启用用量追踪
|
||||
litellm_settings:
|
||||
success_callback: ["prometheus"]
|
||||
track_cost_callback: true
|
||||
```
|
||||
|
||||
### 5.2 LiteLLM Admin API 使用
|
||||
|
||||
| API | 用途 | 调用时机 |
|
||||
|-----|------|----------|
|
||||
| `POST /team/new` | 创建 team | 创建渠道时 |
|
||||
| `POST /key/generate` | 创建 key | 分配模型给租户时 |
|
||||
| `POST /key/update` | 更新 key 配额 | 修改配额/充值时 |
|
||||
| `POST /key/delete` | 删除 key | 取消分配时 |
|
||||
| `GET /spend/logs` | 查询用量 | 统计报表时 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 接口设计
|
||||
|
||||
### 6.1 渠道管理接口
|
||||
|
||||
| 接口 | 方法 | 功能 | 变更 |
|
||||
|------|------|------|------|
|
||||
| `POST /api/admin/channels/create` | POST | 创建渠道 | 同步创建 litellm team |
|
||||
| `DELETE /api/admin/channels/{id}` | DELETE | 删除渠道 | 同步删除 litellm team |
|
||||
|
||||
### 6.2 模型分配接口
|
||||
|
||||
| 接口 | 方法 | 功能 | 变更 |
|
||||
|------|------|------|------|
|
||||
| `PUT /api/channel/tenants/{id}/models` | PUT | 分配模型给租户 | 创建 litellm key |
|
||||
| `DELETE /api/channel/tenants/{id}/models/{model}` | DELETE | 取消分配 | 删除 litellm key |
|
||||
| `PUT /api/channel/tenants/{id}/models/{model}/quota` | PUT | 更新配额 | 更新 litellm key |
|
||||
|
||||
### 6.3 租户接口
|
||||
|
||||
| 接口 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| `GET /api/user/models/available` | GET | 获取可用模型列表 |
|
||||
| `POST /api/user/custom-agents` | POST | 创建 Agent(注入 key) |
|
||||
| `GET /api/user/models/usage/stats` | GET | 查询用量统计 |
|
||||
| `POST /api/user/billing/recharge` | POST | 充值(更新 litellm budget) |
|
||||
|
||||
---
|
||||
|
||||
## 7. 实现计划
|
||||
|
||||
### 7.1 任务清单
|
||||
|
||||
- [ ] **数据库迁移**
|
||||
- [ ] 创建 `tenant_model_keys` 表
|
||||
- [ ] Channel 表增加 `litellm_team_id` 字段
|
||||
|
||||
- [ ] **litellm 集成**
|
||||
- [ ] 实现 litellm Admin API 客户端
|
||||
- [ ] 创建渠道时同步创建 team
|
||||
- [ ] 分配模型时创建 key
|
||||
- [ ] 充值时更新 budget
|
||||
|
||||
- [ ] **接口调整**
|
||||
- [ ] 更新渠道创建接口
|
||||
- [ ] 实现模型分配接口
|
||||
- [ ] 更新 Agent 创建接口
|
||||
- [ ] 实现充值接口
|
||||
|
||||
- [ ] **Agent Manager**
|
||||
- [ ] 支持注入 litellm key 环境变量
|
||||
|
||||
---
|
||||
|
||||
## 8. 关键行为说明
|
||||
|
||||
### 8.1 配额超限行为
|
||||
|
||||
| 状态 | LiteLLM 行为 | 说明 |
|
||||
|------|-------------|------|
|
||||
| RPM 超限 | 返回 429 | 等待下一分钟自动恢复 |
|
||||
| TPM 超限 | 返回 429 | 等待下一分钟自动恢复 |
|
||||
| Budget 用完 | 返回 403 | 需要充值才能恢复 |
|
||||
|
||||
### 8.2 充值后恢复
|
||||
|
||||
```
|
||||
用户充值 → mcp-server 调用 litellm API 更新 budget → 下一次请求立刻放行
|
||||
```
|
||||
|
||||
- ✅ 不需要重启任何服务
|
||||
- ✅ 不需要重新创建 key
|
||||
- ✅ 实时生效
|
||||
|
||||
---
|
||||
|
||||
## 9. 总结
|
||||
|
||||
### 9.1 核心设计原则
|
||||
|
||||
1. **mcp-server 是业务规则制定者**:决定谁能用什么、用多少
|
||||
2. **litellm-gateway 是规则执行者**:真正拦截超额请求
|
||||
3. **Agent 与 litellm 解耦**:Agent 只需要带正确的 api_key 调用
|
||||
4. **实时生效**:配额更新、充值后立刻生效,无需重启
|
||||
|
||||
### 9.2 架构优势
|
||||
|
||||
| 优势 | 说明 |
|
||||
|------|------|
|
||||
| 职责清晰 | mcp-server 管业务,litellm 管执行 |
|
||||
| 延迟低 | Agent 直接调用 litellm,无需代理 |
|
||||
| 原生能力 | 充分利用 litellm 的配额和计费能力 |
|
||||
| 易扩展 | 新增模型只需配置 litellm |
|
||||
| 实时生效 | 配额更新无需重启 |
|
||||
@@ -1,621 +0,0 @@
|
||||
# 渠道资源分配接口整合方案
|
||||
|
||||
> **版本**: v1.1.0
|
||||
> **创建时间**: 2026-01-07
|
||||
> **更新时间**: 2026-01-08
|
||||
> **状态**: ✅ 已实施
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景分析
|
||||
|
||||
### 1.1 现有接口
|
||||
|
||||
**`PUT /api/channel/tenants/{tenantId}/resources`** ([`channel.py:244`](services/mcp-server/app/routes/channel.py:244))
|
||||
|
||||
现有请求参数 ([`schemas.py:303`](services/mcp-server/app/schemas.py:303)):
|
||||
```python
|
||||
class AllocateResourcesRequest(BaseModel):
|
||||
agents: List[ResourceAgentAllocation] # 平台端 Agent 分配
|
||||
models: List[ResourceModelAllocation] # 模型资源分配
|
||||
customAgentResources: Optional[CustomAgentResources] # 已废弃
|
||||
customAgentQuota: Optional[CustomAgentQuotaConfig] # 自定义 Agent 配额
|
||||
```
|
||||
|
||||
现有模型分配参数 ([`schemas.py:269`](services/mcp-server/app/schemas.py:269)):
|
||||
```python
|
||||
class ResourceModelAllocation(BaseModel):
|
||||
modelName: str
|
||||
rpm: int
|
||||
tpm: int
|
||||
```
|
||||
|
||||
**注意**:老接口不包含 `maxBudget`(配额)和 `max_budget`(余额)等参数。
|
||||
|
||||
### 1.2 LiteLLM 新增接口
|
||||
|
||||
**`PUT /api/channel/tenants/{id}/models`** ([`channel.py:1126`](services/mcp-server/app/routes/channel.py:1126))
|
||||
|
||||
新增参数:
|
||||
- `max_budget`: 最大预算
|
||||
- `budget_duration`: 预算周期(monthly/total)
|
||||
|
||||
### 1.3 权限验证流程
|
||||
|
||||
模型分配必须遵循以下权限链:
|
||||
|
||||
```
|
||||
供应商 (ModelProvider)
|
||||
↓ 管理员创建
|
||||
渠道供应商授权 (ChannelProviderAccess)
|
||||
↓ 管理员审批
|
||||
渠道资源分配 (ResourceAllocation: target_type="channel")
|
||||
↓ 渠道管理员分配
|
||||
租户资源分配 (ResourceAllocation: target_type="tenant")
|
||||
```
|
||||
|
||||
**关键规则**:渠道只能分配自己有权限的模型给租户,其余一律拒绝。
|
||||
|
||||
### 1.4 问题
|
||||
|
||||
1. **功能重叠**:两个接口都可以分配模型给租户
|
||||
2. **参数不一致**:新接口有 `max_budget`、`budget_duration`,旧接口没有
|
||||
3. **计费逻辑不清晰**:配额(quota)与余额(balance)的关系需要明确
|
||||
4. **权限验证缺失**:老接口未验证渠道是否有该模型的权限
|
||||
|
||||
---
|
||||
|
||||
## 2. 整合方案
|
||||
|
||||
### 2.1 方案概述
|
||||
|
||||
**继续使用现有接口** `PUT /api/channel/tenants/{tenantId}/resources`,**不修改 Schema**,后端代码在调用 LiteLLM 时对配额和余额使用默认值。
|
||||
|
||||
### 2.2 Schema 保持不变
|
||||
|
||||
老接口的 [`ResourceModelAllocation`](services/mcp-server/app/schemas.py:269) **不做修改**,继续使用现有参数:
|
||||
|
||||
```python
|
||||
class ResourceModelAllocation(BaseModel):
|
||||
"""模型资源分配"""
|
||||
modelName: str
|
||||
rpm: int
|
||||
tpm: int
|
||||
```
|
||||
|
||||
**说明**:老接口不包含 `maxBudget`(配额)和 `max_budget`(余额)等参数,这些参数由后端代码使用默认值。
|
||||
|
||||
### 2.3 后端默认值策略
|
||||
|
||||
| 参数 | 来源 | 默认值 | 说明 |
|
||||
|------|------|--------|------|
|
||||
| `rpm` | 前端传递 | - | 每分钟请求数限制(必填) |
|
||||
| `tpm` | 前端传递 | - | 每分钟 Token 数限制(必填) |
|
||||
| `max_budget` | 后端默认 | **500** | 最大预算金额(美元),除非前端明确传递 |
|
||||
| `budget_duration` | 后端默认 | `"monthly"` | 预算周期 |
|
||||
|
||||
### 2.4 接口行为修改
|
||||
|
||||
#### 修改 `allocate_tenant_resources` ([`channel.py:244`](services/mcp-server/app/routes/channel.py:244))
|
||||
|
||||
**当前行为**(第 334-350 行):
|
||||
```python
|
||||
for model_alloc in req.models:
|
||||
# 查找模型供应商
|
||||
result = await db.execute(
|
||||
select(ModelProvider).where(ModelProvider.name == model_alloc.modelName)
|
||||
)
|
||||
model_provider = result.scalar_one_or_none()
|
||||
|
||||
if model_provider:
|
||||
allocation = ResourceAllocation(
|
||||
target_id=tenant_id,
|
||||
target_type="tenant",
|
||||
resource_type="model",
|
||||
resource_id=str(model_provider.id),
|
||||
rpm=model_alloc.rpm,
|
||||
tpm=model_alloc.tpm,
|
||||
)
|
||||
db.add(allocation)
|
||||
```
|
||||
|
||||
**修改后行为**:
|
||||
```python
|
||||
# 默认配额和余额值
|
||||
DEFAULT_MAX_BUDGET = 500 # 默认最大预算 $500
|
||||
DEFAULT_BUDGET_DURATION = "monthly" # 默认月度预算
|
||||
|
||||
for model_alloc in req.models:
|
||||
# 1. 验证渠道是否有该模型的权限
|
||||
model_allocation_result = await db.execute(
|
||||
select(ResourceAllocation).where(
|
||||
and_(
|
||||
ResourceAllocation.target_id == channel_id,
|
||||
ResourceAllocation.target_type == "channel",
|
||||
ResourceAllocation.resource_type == "model",
|
||||
ResourceAllocation.resource_id == model_alloc.modelName
|
||||
)
|
||||
)
|
||||
)
|
||||
if not model_allocation_result.scalar_one_or_none():
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
detail=f"渠道没有模型 '{model_alloc.modelName}' 的权限"
|
||||
)
|
||||
|
||||
# 2. 获取配额和余额参数(使用默认值 500)
|
||||
max_budget = getattr(model_alloc, 'maxBudget', None) or DEFAULT_MAX_BUDGET
|
||||
budget_duration = getattr(model_alloc, 'budgetDuration', None) or DEFAULT_BUDGET_DURATION
|
||||
|
||||
# 3. 检查租户是否已有该模型的 Key
|
||||
existing_key_result = await db.execute(
|
||||
select(TenantModelKey).where(
|
||||
and_(
|
||||
TenantModelKey.tenant_id == tenant_id,
|
||||
TenantModelKey.model_name == model_alloc.modelName
|
||||
)
|
||||
)
|
||||
)
|
||||
existing_key = existing_key_result.scalar_one_or_none()
|
||||
|
||||
if existing_key:
|
||||
# 4a. 更新现有 Key 的配额
|
||||
await _update_tenant_model_quota(
|
||||
db=db,
|
||||
tenant_key=existing_key,
|
||||
rpm_limit=model_alloc.rpm,
|
||||
tpm_limit=model_alloc.tpm,
|
||||
max_budget=max_budget, # 使用默认值 500
|
||||
budget_duration=budget_duration,
|
||||
)
|
||||
else:
|
||||
# 4b. 创建新的 LiteLLM Key
|
||||
await _create_tenant_model_key(
|
||||
db=db,
|
||||
tenant=tenant,
|
||||
channel=channel,
|
||||
model_name=model_alloc.modelName,
|
||||
rpm_limit=model_alloc.rpm,
|
||||
tpm_limit=model_alloc.tpm,
|
||||
max_budget=max_budget, # 使用默认值 500
|
||||
budget_duration=budget_duration,
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 计费逻辑说明
|
||||
|
||||
### 3.1 配额(Quota)vs 余额(Balance)
|
||||
|
||||
| 概念 | 说明 | 控制方式 | 用途 |
|
||||
|------|------|---------|------|
|
||||
| **余额 (Balance)** | 租户账户中的实际金额 | `POST /api/channel/tenants/{id}/recharge` | 实际扣费来源 |
|
||||
| **授信额度 (Credit Limit)** | 允许透支的金额 | `PUT /api/channel/tenants/{id}/credit` | 余额不足时的缓冲 |
|
||||
| **模型配额 (Model Quota)** | 速率限制和预算上限 | `PUT /api/channel/tenants/{id}/resources` | 防止单个模型过度消费 |
|
||||
|
||||
### 3.2 计费流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[租户调用模型] --> B{检查模型配额}
|
||||
B -->|超过 RPM/TPM| C[拒绝请求 - 429]
|
||||
B -->|超过 maxBudget| D[拒绝请求 - 预算超限]
|
||||
B -->|配额内| E{检查余额}
|
||||
E -->|余额 + 授信 >= 费用| F[扣费并执行]
|
||||
E -->|余额 + 授信 < 费用| G[拒绝请求 - 余额不足]
|
||||
F --> H[更新余额]
|
||||
H --> I[记录计费]
|
||||
```
|
||||
|
||||
### 3.3 配额与余额的关系
|
||||
|
||||
1. **配额是上限控制**:即使租户有 $10000 余额,如果模型配额设置为 `maxBudget=$500/月`,该模型每月最多消费 $500
|
||||
2. **余额是实际扣费来源**:所有模型消费都从租户余额中扣除
|
||||
3. **配额不影响余额**:配额只是限制,不会预扣余额
|
||||
|
||||
### 3.4 示例场景
|
||||
|
||||
**场景**:租户 A 的配置
|
||||
- 余额:$1000
|
||||
- 授信额度:$500
|
||||
- 模型配额:
|
||||
- gpt-4: maxBudget=$300/月, rpm=100
|
||||
- gpt-3.5: maxBudget=$200/月, rpm=200
|
||||
|
||||
**结果**:
|
||||
- 租户可用总额:$1000 + $500 = $1500
|
||||
- gpt-4 每月最多消费 $300(即使余额充足)
|
||||
- gpt-3.5 每月最多消费 $200
|
||||
- 两个模型合计每月最多消费 $500
|
||||
|
||||
---
|
||||
|
||||
## 4. 实施步骤
|
||||
|
||||
### 4.1 Schema 保持不变
|
||||
|
||||
**文件**: [`services/mcp-server/app/schemas.py`](services/mcp-server/app/schemas.py)
|
||||
|
||||
**无需修改**,继续使用现有的 [`ResourceModelAllocation`](services/mcp-server/app/schemas.py:269):
|
||||
|
||||
```python
|
||||
class ResourceModelAllocation(BaseModel):
|
||||
"""模型资源分配"""
|
||||
modelName: str
|
||||
rpm: int
|
||||
tpm: int
|
||||
```
|
||||
|
||||
### 4.2 接口逻辑修改
|
||||
|
||||
**文件**: [`services/mcp-server/app/routes/channel.py`](services/mcp-server/app/routes/channel.py)
|
||||
|
||||
1. **添加默认值常量和辅助函数**(在文件顶部导入区域后):
|
||||
|
||||
```python
|
||||
# ============= 默认值常量 =============
|
||||
# 配额和余额默认值,除非前端明确传递
|
||||
DEFAULT_MAX_BUDGET = 500 # 默认最大预算 $500
|
||||
DEFAULT_BUDGET_DURATION = "monthly" # 默认月度预算
|
||||
|
||||
|
||||
async def _create_tenant_model_key(
|
||||
db: AsyncSession,
|
||||
tenant: User,
|
||||
channel: Channel,
|
||||
model_name: str,
|
||||
rpm_limit: int,
|
||||
tpm_limit: int,
|
||||
max_budget: float = DEFAULT_MAX_BUDGET, # 默认 500
|
||||
budget_duration: str = DEFAULT_BUDGET_DURATION, # 默认 monthly
|
||||
) -> TenantModelKey:
|
||||
"""创建租户的 LiteLLM Key
|
||||
|
||||
Args:
|
||||
max_budget: 最大预算金额,默认 500 美元
|
||||
budget_duration: 预算周期,默认 monthly
|
||||
"""
|
||||
from app.litellm_client import get_litellm_client, LiteLLMClientError
|
||||
|
||||
if not channel.litellm_team_id:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="渠道尚未关联 LiteLLM team,请联系管理员"
|
||||
)
|
||||
|
||||
litellm_client = get_litellm_client()
|
||||
|
||||
key = await litellm_client.generate_key(
|
||||
team_id=channel.litellm_team_id,
|
||||
models=[model_name],
|
||||
rpm_limit=rpm_limit,
|
||||
tpm_limit=tpm_limit,
|
||||
max_budget=max_budget, # 使用默认值 500
|
||||
budget_duration=budget_duration,
|
||||
key_name=f"tenant-{tenant.id}-{model_name}",
|
||||
metadata={
|
||||
"tenant_id": str(tenant.id),
|
||||
"tenant_name": tenant.name,
|
||||
"channel_id": str(channel.id),
|
||||
"channel_name": channel.name,
|
||||
"model": model_name,
|
||||
}
|
||||
)
|
||||
|
||||
encrypted_key = litellm_client.encrypt_key(key.key)
|
||||
|
||||
tenant_key = TenantModelKey(
|
||||
tenant_id=str(tenant.id),
|
||||
channel_id=str(channel.id),
|
||||
model_name=model_name,
|
||||
litellm_key_id=key.key,
|
||||
litellm_key_hash=encrypted_key,
|
||||
rpm_limit=rpm_limit,
|
||||
tpm_limit=tpm_limit,
|
||||
max_budget=max_budget,
|
||||
budget_duration=budget_duration,
|
||||
status="active",
|
||||
)
|
||||
db.add(tenant_key)
|
||||
|
||||
return tenant_key
|
||||
|
||||
|
||||
async def _update_tenant_model_quota(
|
||||
db: AsyncSession,
|
||||
tenant_key: TenantModelKey,
|
||||
rpm_limit: Optional[int],
|
||||
tpm_limit: Optional[int],
|
||||
max_budget: float = DEFAULT_MAX_BUDGET, # 默认 500
|
||||
budget_duration: str = DEFAULT_BUDGET_DURATION, # 默认 monthly
|
||||
) -> None:
|
||||
"""更新租户的 LiteLLM Key 配额
|
||||
|
||||
Args:
|
||||
max_budget: 最大预算金额,默认 500 美元
|
||||
budget_duration: 预算周期,默认 monthly
|
||||
"""
|
||||
from app.litellm_client import get_litellm_client, LiteLLMClientError
|
||||
|
||||
litellm_client = get_litellm_client()
|
||||
|
||||
await litellm_client.update_key(
|
||||
key=tenant_key.litellm_key_id,
|
||||
rpm_limit=rpm_limit,
|
||||
tpm_limit=tpm_limit,
|
||||
max_budget=max_budget, # 使用默认值 500
|
||||
budget_duration=budget_duration,
|
||||
)
|
||||
|
||||
# 更新数据库记录
|
||||
if rpm_limit is not None:
|
||||
tenant_key.rpm_limit = rpm_limit
|
||||
if tpm_limit is not None:
|
||||
tenant_key.tpm_limit = tpm_limit
|
||||
tenant_key.max_budget = max_budget
|
||||
tenant_key.budget_duration = budget_duration
|
||||
```
|
||||
|
||||
2. **修改 `allocate_tenant_resources` 函数**(第 334-350 行):
|
||||
|
||||
```python
|
||||
# 分配模型资源(集成 LiteLLM)
|
||||
# 配额和余额使用默认值 500,除非前端明确传递
|
||||
for model_alloc in req.models:
|
||||
# 验证渠道是否有该模型的权限
|
||||
model_allocation_result = await db.execute(
|
||||
select(ResourceAllocation).where(
|
||||
and_(
|
||||
ResourceAllocation.target_id == str(channel_id),
|
||||
ResourceAllocation.target_type == "channel",
|
||||
ResourceAllocation.resource_type == "model",
|
||||
ResourceAllocation.resource_id == model_alloc.modelName
|
||||
)
|
||||
)
|
||||
)
|
||||
if not model_allocation_result.scalar_one_or_none():
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
detail=f"渠道没有模型 '{model_alloc.modelName}' 的权限"
|
||||
)
|
||||
|
||||
# 检查租户是否已有该模型的 Key
|
||||
existing_key_result = await db.execute(
|
||||
select(TenantModelKey).where(
|
||||
and_(
|
||||
TenantModelKey.tenant_id == tenant_id,
|
||||
TenantModelKey.model_name == model_alloc.modelName
|
||||
)
|
||||
)
|
||||
)
|
||||
existing_key = existing_key_result.scalar_one_or_none()
|
||||
|
||||
try:
|
||||
if existing_key:
|
||||
# 更新现有 Key 的配额(使用默认值 500)
|
||||
await _update_tenant_model_quota(
|
||||
db=db,
|
||||
tenant_key=existing_key,
|
||||
rpm_limit=model_alloc.rpm,
|
||||
tpm_limit=model_alloc.tpm,
|
||||
# max_budget 和 budget_duration 使用函数默认值 500 和 monthly
|
||||
)
|
||||
logger.info(f"更新租户 {tenant.name} 的模型 {model_alloc.modelName} 配额")
|
||||
else:
|
||||
# 获取渠道信息
|
||||
channel_result = await db.execute(
|
||||
select(Channel).where(Channel.id == channel_id)
|
||||
)
|
||||
channel = channel_result.scalar_one_or_none()
|
||||
|
||||
if channel and channel.litellm_team_id:
|
||||
# 创建新的 LiteLLM Key(使用默认值 500)
|
||||
await _create_tenant_model_key(
|
||||
db=db,
|
||||
tenant=tenant,
|
||||
channel=channel,
|
||||
model_name=model_alloc.modelName,
|
||||
rpm_limit=model_alloc.rpm,
|
||||
tpm_limit=model_alloc.tpm,
|
||||
# max_budget 和 budget_duration 使用函数默认值 500 和 monthly
|
||||
)
|
||||
logger.info(f"为租户 {tenant.name} 创建模型 {model_alloc.modelName} 的 LiteLLM Key(默认预算 $500/月)")
|
||||
else:
|
||||
# 渠道未配置 LiteLLM,仅记录 ResourceAllocation
|
||||
logger.warning(f"渠道 {channel_id} 未配置 LiteLLM team,仅记录资源分配")
|
||||
|
||||
# 同时记录到 ResourceAllocation(兼容旧逻辑)
|
||||
allocation = ResourceAllocation(
|
||||
target_id=tenant_id,
|
||||
target_type="tenant",
|
||||
resource_type="model",
|
||||
resource_id=model_alloc.modelName,
|
||||
rpm=model_alloc.rpm,
|
||||
tpm=model_alloc.tpm,
|
||||
)
|
||||
db.add(allocation)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"模型分配失败: {e}")
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=f"模型 '{model_alloc.modelName}' 分配失败: {str(e)}"
|
||||
)
|
||||
```
|
||||
|
||||
### 4.3 保留独立接口
|
||||
|
||||
保留以下独立接口用于精细化管理:
|
||||
|
||||
| 接口 | 用途 | 说明 |
|
||||
|------|------|------|
|
||||
| `GET /api/channel/tenants/{id}/models` | 获取租户模型列表 | 查看已分配的模型及配额 |
|
||||
| `DELETE /api/channel/tenants/{id}/models/{model}` | 取消单个模型分配 | 精细化管理 |
|
||||
| `PUT /api/channel/tenants/{id}/models/{model}/quota` | 更新单个模型配额 | 精细化管理 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 前端对接说明
|
||||
|
||||
### 5.1 接口保持不变
|
||||
|
||||
前端调用 `PUT /api/channel/tenants/{tenantId}/resources` 时,**无需修改**,继续使用现有参数:
|
||||
|
||||
**请求示例**(与现有接口完全一致):
|
||||
```json
|
||||
{
|
||||
"agents": [
|
||||
{"agentId": "echo_agent", "quantity": 3}
|
||||
],
|
||||
"models": [
|
||||
{
|
||||
"modelName": "azure/gpt-4",
|
||||
"rpm": 100,
|
||||
"tpm": 50000
|
||||
},
|
||||
{
|
||||
"modelName": "azure/gpt-3.5-turbo",
|
||||
"rpm": 200,
|
||||
"tpm": 100000
|
||||
}
|
||||
],
|
||||
"customAgentQuota": {
|
||||
"cpuQuota": 2.0,
|
||||
"memoryQuota": 4.0
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 后端默认行为
|
||||
|
||||
| 参数 | 前端传递 | 后端默认值 | 说明 |
|
||||
|------|----------|-----------|------|
|
||||
| `modelName` | ✅ 必填 | - | 模型名称 |
|
||||
| `rpm` | ✅ 必填 | - | 每分钟请求数限制 |
|
||||
| `tpm` | ✅ 必填 | - | 每分钟 Token 数限制 |
|
||||
| `max_budget` | ❌ 不传 | **500** | 后端默认传 500 给 LiteLLM |
|
||||
| `budget_duration` | ❌ 不传 | **monthly** | 后端默认传 monthly 给 LiteLLM |
|
||||
|
||||
### 5.3 完全向后兼容
|
||||
|
||||
- **前端无需任何修改**
|
||||
- 后端自动为 LiteLLM 配置默认的配额($500/月)
|
||||
- 如果未来前端需要自定义配额,可以扩展接口参数
|
||||
|
||||
---
|
||||
|
||||
## 6. 测试用例
|
||||
|
||||
### 6.1 基本功能测试
|
||||
|
||||
```bash
|
||||
# 1. 分配模型(后端自动使用默认配额 $500/月)
|
||||
curl -X PUT "http://localhost:8002/api/channel/tenants/{tenant_id}/resources" \
|
||||
-H "Authorization: Bearer {token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"models": [
|
||||
{"modelName": "azure/gpt-4", "rpm": 100, "tpm": 50000}
|
||||
]
|
||||
}'
|
||||
# 后端会自动传递 max_budget=500, budget_duration="monthly" 给 LiteLLM
|
||||
|
||||
# 2. 查看租户模型列表(验证默认配额)
|
||||
curl -X GET "http://localhost:8002/api/channel/tenants/{tenant_id}/models" \
|
||||
-H "Authorization: Bearer {token}"
|
||||
# 响应应包含 max_budget: 500, budget_duration: "monthly"
|
||||
|
||||
# 3. 更新单个模型配额(可自定义配额)
|
||||
curl -X PUT "http://localhost:8002/api/channel/tenants/{tenant_id}/models/azure%2Fgpt-4/quota?rpm_limit=200&max_budget=1000" \
|
||||
-H "Authorization: Bearer {token}"
|
||||
|
||||
# 4. 取消模型分配
|
||||
curl -X DELETE "http://localhost:8002/api/channel/tenants/{tenant_id}/models/azure%2Fgpt-4" \
|
||||
-H "Authorization: Bearer {token}"
|
||||
```
|
||||
|
||||
### 6.2 边界条件测试
|
||||
|
||||
1. **渠道无模型权限**:应返回 403 错误
|
||||
2. **重复分配同一模型**:应更新配额而非创建新记录
|
||||
3. **渠道未配置 LiteLLM**:应记录 ResourceAllocation 但跳过 LiteLLM Key 创建
|
||||
4. **预算超限**:LiteLLM 应拒绝请求(默认 $500/月)
|
||||
|
||||
### 6.3 默认值验证测试
|
||||
|
||||
```bash
|
||||
# 验证默认配额值
|
||||
# 1. 分配模型后,检查 TenantModelKey 表
|
||||
SELECT tenant_id, model_name, rpm_limit, tpm_limit, max_budget, budget_duration
|
||||
FROM tenant_model_keys
|
||||
WHERE tenant_id = '{tenant_id}';
|
||||
|
||||
# 预期结果:
|
||||
# max_budget = 500
|
||||
# budget_duration = 'monthly'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 文档更新
|
||||
|
||||
### 7.1 需要更新的文档
|
||||
|
||||
1. [`Docs/渠道合作伙伴平台-接口对接文档.md`](Docs/渠道合作伙伴平台-接口对接文档.md) - 说明后端默认配额行为
|
||||
2. [`plans/LiteLLM集成接口变动清单.md`](plans/LiteLLM集成接口变动清单.md) - 标注接口整合情况
|
||||
|
||||
### 7.2 接口文档说明
|
||||
|
||||
**`PUT /api/channel/tenants/{tenantId}/resources`**
|
||||
|
||||
请求参数(保持不变):
|
||||
|
||||
| 参数路径 | 类型 | 必填 | 说明 |
|
||||
|----------|------|------|------|
|
||||
| `models[].modelName` | string | 是 | 模型名称 |
|
||||
| `models[].rpm` | int | 是 | 每分钟请求数限制 |
|
||||
| `models[].tpm` | int | 是 | 每分钟 Token 数限制 |
|
||||
|
||||
后端默认行为:
|
||||
|
||||
| LiteLLM 参数 | 默认值 | 说明 |
|
||||
|--------------|--------|------|
|
||||
| `max_budget` | **500** | 最大预算金额(美元) |
|
||||
| `budget_duration` | **monthly** | 预算周期(月度) |
|
||||
|
||||
---
|
||||
|
||||
## 8. 总结
|
||||
|
||||
### 8.1 修改范围
|
||||
|
||||
| 文件 | 修改内容 |
|
||||
|------|----------|
|
||||
| `schemas.py` | **无修改**(保持现有 `ResourceModelAllocation` 类) |
|
||||
| `channel.py` | 修改 `allocate_tenant_resources` 函数,添加辅助函数和默认值常量 |
|
||||
|
||||
### 8.2 影响评估
|
||||
|
||||
- **前端影响**:**无**(接口参数完全不变)
|
||||
- **Schema 影响**:**无**(不修改 Schema)
|
||||
- **数据库影响**:无(使用现有 `TenantModelKey` 表)
|
||||
- **LiteLLM 影响**:无(使用现有 LiteLLM 客户端,传递默认配额 500)
|
||||
|
||||
### 8.3 默认值说明
|
||||
|
||||
| 参数 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `max_budget` | **500** | 每个租户每个模型的默认最大预算为 $500 |
|
||||
| `budget_duration` | **monthly** | 预算周期为月度,每月重置 |
|
||||
|
||||
### 8.4 待确认事项
|
||||
|
||||
1. **默认值 500 是否合适**:是否需要调整默认配额金额?
|
||||
2. **预算超限时的行为**:是否需要通知渠道管理员?
|
||||
3. **预算重置时间**:月度预算是每月 1 日重置还是从分配日期开始计算?
|
||||
|
||||
---
|
||||
|
||||
*文档创建时间: 2026-01-07*
|
||||
*文档更新时间: 2026-01-08*
|
||||
Reference in New Issue
Block a user