forked from xiaohei/taiji-AI-PAD
19 KiB
19 KiB
超级管理员查看渠道资源分配接口文档
版本: v1.0.0 更新时间: 2026-01-13 说明: 超级管理员查看渠道已分配的资源详情,包括自定义Agent、平台Agent、模型供应商、模型等
目录
接口概述
| 接口 | 路径 | 方法 | 权限 | 说明 |
|---|---|---|---|---|
| 查看渠道资源分配详情 | /api/admin/channels/{channel_id}/allocated-resources |
GET | super_admin, billing_admin, operations_admin | 查看指定渠道被分配的所有资源详情 |
权限说明
- super_admin: 可查看所有渠道的资源分配
- billing_admin / operations_admin: 可查看所有渠道的资源分配
接口详情
基本信息
| 属性 | 值 |
|---|---|
| 接口路径 | GET /api/admin/channels/{channel_id}/allocated-resources |
| 后端文件 | services/mcp-server/app/routes/admin.py |
| 后端状态 | ✅ 已实现 |
| 权限要求 | super_admin, billing_admin, operations_admin |
请求参数
路径参数 (Path Parameters)
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| channel_id | string (UUID) | 是 | 渠道ID | 6e6fc470-76f8-4bb1-8ea4-625dc5b12bc6 |
请求头 (Headers)
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| Authorization | string | 是 | Bearer Token | Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... |
请求示例
curl -X GET "http://localhost:8002/api/admin/channels/6e6fc470-76f8-4bb1-8ea4-625dc5b12bc6/allocated-resources" \
-H "Authorization: Bearer $SUPER_ADMIN_TOKEN"
响应参数
成功响应 (200 OK)
{
"success": true,
"data": {
"channelId": "string (UUID)",
"channelName": "string",
"channelEmail": "string",
"channelStatus": "string",
"createdAt": "string (ISO 8601)",
"channelCredit": "number",
"commissionRate": "number",
"customAgentQuota": {
"cpuQuota": "number",
"memoryQuota": "number",
"cpuAllocatedToTenants": "number",
"memoryAllocatedToTenants": "number",
"cpuAvailable": "number",
"memoryAvailable": "number"
} | null,
"platformAgents": [
{
"templateName": "string",
"templateDisplayName": "string",
"podQuota": "integer",
"podUsed": "integer",
"podAllocatedToTenants": "integer",
"podAvailable": "integer",
"cpuPerPod": "string",
"memoryPerPod": "string",
"allocatedAt": "string (ISO 8601)"
}
],
"modelProviders": [
{
"providerId": "string (UUID)",
"providerName": "string",
"providerType": "string",
"status": "string",
"models": [
{
"modelName": "string",
"rpmLimit": "integer",
"tpmLimit": "integer",
"maxBudget": "number | null",
"budgetDuration": "string"
}
]
}
],
"models": [
{
"modelName": "string",
"providerName": "string | null",
"rpmLimit": "integer",
"tpmLimit": "integer",
"maxBudget": "number | null",
"budgetDuration": "string",
"allocatedToTenants": "integer"
}
],
"summary": {
"totalCustomAgentCpuQuota": "number",
"totalCustomAgentMemoryQuota": "number",
"totalPlatformAgentPodQuota": "integer",
"totalPlatformAgentPodUsed": "integer",
"totalModelProviders": "integer",
"totalModels": "integer",
"totalTenantsWithResources": "integer"
}
},
"message": "获取渠道资源分配详情成功"
}
响应字段说明
| 字段路径 | 类型 | 说明 |
|---|---|---|
data.channelId |
string | 渠道ID |
data.channelName |
string | 渠道名称 |
data.channelEmail |
string | 渠道邮箱 |
data.channelStatus |
string | 渠道状态 (active/inactive/suspended) |
data.createdAt |
string | 渠道创建时间 (ISO 8601格式) |
data.channelCredit |
number | 渠道信用额度 |
data.commissionRate |
number | 渠道佣金比例 |
自定义Agent配额 (customAgentQuota)
| 字段路径 | 类型 | 说明 |
|---|---|---|
cpuQuota |
number | CPU配额上限(核心数) |
memoryQuota |
number | 内存配额上限(GB) |
cpuAllocatedToTenants |
number | 已分配给租户的CPU(核心数) |
memoryAllocatedToTenants |
number | 已分配给租户的内存(GB) |
cpuAvailable |
number | 剩余可分配CPU(核心数) |
memoryAvailable |
number | 剩余可分配内存(GB) |
平台Agent配额 (platformAgents)
| 字段路径 | 类型 | 说明 |
|---|---|---|
templateName |
string | 模板技术名称 (如 echo_agent) |
templateDisplayName |
string | 模板显示名称 (如 Echo测试服务) |
podQuota |
integer | 该模板的Pod配额数量 |
podUsed |
integer | 已使用的Pod数量(运行中) |
podAllocatedToTenants |
integer | 已分配给租户的Pod数量 |
podAvailable |
integer | 剩余可分配Pod数量 |
cpuPerPod |
string | 每个Pod的CPU配置 (如 100m) |
memoryPerPod |
string | 每个Pod的内存配置 (如 256Mi) |
allocatedAt |
string | 分配时间 (ISO 8601格式) |
模型供应商 (modelProviders)
| 字段路径 | 类型 | 说明 |
|---|---|---|
providerId |
string | 供应商ID |
providerName |
string | 供应商名称 (如 OpenAI、Anthropic) |
providerType |
string | 供应商类型 (如 openai、anthropic) |
status |
string | 供应商状态 (active/inactive) |
models |
array | 该供应商下的模型列表 |
模型配额 (models)
| 字段路径 | 类型 | 说明 |
|---|---|---|
modelName |
string | 模型全名 (如 taiji/gpt-4o) |
providerName |
string/null | 所属供应商名称 |
rpmLimit |
integer | RPM限制(每分钟请求数) |
tpmLimit |
integer | TPM限制(每分钟Token数) |
maxBudget |
number/null | 最大预算限额 |
budgetDuration |
string | 预算周期 (monthly/daily) |
allocatedToTenants |
integer | 已分配给租户的数量 |
汇总统计 (summary)
| 字段路径 | 类型 | 说明 |
|---|---|---|
totalCustomAgentCpuQuota |
number | 自定义Agent总CPU配额 |
totalCustomAgentMemoryQuota |
number | 自定义Agent总内存配额 |
totalPlatformAgentPodQuota |
integer | 平台Agent总Pod配额 |
totalPlatformAgentPodUsed |
integer | 平台Agent已使用Pod数 |
totalModelProviders |
integer | 模型供应商数量 |
totalModels |
integer | 模型总数 |
totalTenantsWithResources |
integer | 有资源分配的租户数 |
实际响应示例
{
"success": true,
"data": {
"channelId": "6e6fc470-76f8-4bb1-8ea4-625dc5b12bc6",
"channelName": "示例渠道",
"channelEmail": "channel@example.com",
"channelStatus": "active",
"createdAt": "2026-01-01T00:00:00.000000",
"channelCredit": 100000.0,
"commissionRate": 0.15,
"customAgentQuota": {
"cpuQuota": 20.0,
"memoryQuota": 40.0,
"cpuAllocatedToTenants": 12.0,
"memoryAllocatedToTenants": 24.0,
"cpuAvailable": 8.0,
"memoryAvailable": 16.0
},
"platformAgents": [
{
"templateName": "echo_agent",
"templateDisplayName": "Echo 测试服务",
"podQuota": 10,
"podUsed": 3,
"podAllocatedToTenants": 6,
"podAvailable": 4,
"cpuPerPod": "100m",
"memoryPerPod": "256Mi",
"allocatedAt": "2026-01-05T10:30:00.000000"
},
{
"templateName": "code_agent",
"templateDisplayName": "代码执行服务",
"podQuota": 5,
"podUsed": 2,
"podAllocatedToTenants": 3,
"podAvailable": 2,
"cpuPerPod": "200m",
"memoryPerPod": "512Mi",
"allocatedAt": "2026-01-06T14:20:00.000000"
}
],
"modelProviders": [
{
"providerId": "550e8400-e29b-41d4-a716-446655440000",
"providerName": "OpenAI",
"providerType": "openai",
"status": "active",
"models": [
{
"modelName": "taiji/gpt-4o",
"rpmLimit": 1000,
"tpmLimit": 100000,
"maxBudget": 5000.0,
"budgetDuration": "monthly"
},
{
"modelName": "taiji/gpt-4o-mini",
"rpmLimit": 2000,
"tpmLimit": 200000,
"maxBudget": 2000.0,
"budgetDuration": "monthly"
}
]
},
{
"providerId": "660e8400-e29b-41d4-a716-446655440001",
"providerName": "Anthropic",
"providerType": "anthropic",
"status": "active",
"models": [
{
"modelName": "taiji/claude-3-opus",
"rpmLimit": 500,
"tpmLimit": 50000,
"maxBudget": 10000.0,
"budgetDuration": "monthly"
}
]
}
],
"models": [
{
"modelName": "taiji/gpt-4o",
"providerName": "OpenAI",
"rpmLimit": 1000,
"tpmLimit": 100000,
"maxBudget": 5000.0,
"budgetDuration": "monthly",
"allocatedToTenants": 3
},
{
"modelName": "taiji/gpt-4o-mini",
"providerName": "OpenAI",
"rpmLimit": 2000,
"tpmLimit": 200000,
"maxBudget": 2000.0,
"budgetDuration": "monthly",
"allocatedToTenants": 5
},
{
"modelName": "taiji/claude-3-opus",
"providerName": "Anthropic",
"rpmLimit": 500,
"tpmLimit": 50000,
"maxBudget": 10000.0,
"budgetDuration": "monthly",
"allocatedToTenants": 2
}
],
"summary": {
"totalCustomAgentCpuQuota": 20.0,
"totalCustomAgentMemoryQuota": 40.0,
"totalPlatformAgentPodQuota": 15,
"totalPlatformAgentPodUsed": 5,
"totalModelProviders": 2,
"totalModels": 3,
"totalTenantsWithResources": 5
}
},
"message": "获取渠道资源分配详情成功"
}
错误响应
| HTTP状态码 | 错误说明 | 响应示例 |
|---|---|---|
| 400 | 无效的渠道ID格式 | {"success": false, "detail": "无效的渠道ID格式"} |
| 403 | 权限不足 | {"success": false, "detail": "权限不足,无法查看渠道资源"} |
| 404 | 渠道不存在 | {"success": false, "detail": "渠道不存在"} |
数据结构说明
渠道状态 (channelStatus)
| 值 | 说明 |
|---|---|
active |
活跃状态 |
inactive |
已停用 |
suspended |
已暂停 |
供应商状态 (status)
| 值 | 说明 |
|---|---|
active |
正常可用 |
inactive |
已停用 |
error |
连接异常 |
预算周期 (budgetDuration)
| 值 | 说明 |
|---|---|
monthly |
月度预算 |
daily |
每日预算 |
CPU/内存格式
| 格式 | 说明 | 示例 |
|---|---|---|
| CPU (millicores) | Kubernetes CPU格式 | 100m = 0.1核, 500m = 0.5核 |
| Memory (MiB/GiB) | Kubernetes 内存格式 | 256Mi = 256MB, 2Gi = 2GB |
使用场景
场景1: 超级管理员审查渠道资源配置
超级管理员需要全面了解某个渠道被分配了哪些资源,以及这些资源的使用情况。
# 查看渠道 "示例渠道" 的所有资源分配
curl -X GET "http://localhost:8002/api/admin/channels/6e6fc470-76f8-4bb1-8ea4-625dc5b12bc6/allocated-resources" \
-H "Authorization: Bearer $SUPER_ADMIN_TOKEN"
场景2: 资源规划与调配
通过查看各渠道的资源分配和使用情况,进行合理的资源规划:
- 查看自定义Agent配额使用率:
cpuAllocatedToTenants / cpuQuota - 查看平台Agent使用率:
podUsed / podQuota - 了解模型分配情况: 通过
allocatedToTenants了解每个模型被多少租户使用
场景3: 计费审计
计费管理员可以通过此接口了解渠道的资源配置和信用额度,辅助计费审计工作。
前端调用示例
JavaScript/TypeScript
interface CustomAgentQuota {
cpuQuota: number;
memoryQuota: number;
cpuAllocatedToTenants: number;
memoryAllocatedToTenants: number;
cpuAvailable: number;
memoryAvailable: number;
}
interface PlatformAgentQuota {
templateName: string;
templateDisplayName: string;
podQuota: number;
podUsed: number;
podAllocatedToTenants: number;
podAvailable: number;
cpuPerPod: string;
memoryPerPod: string;
allocatedAt: string;
}
interface ModelInfo {
modelName: string;
rpmLimit: number;
tpmLimit: number;
maxBudget: number | null;
budgetDuration: string;
}
interface ModelProviderInfo {
providerId: string;
providerName: string;
providerType: string;
status: string;
models: ModelInfo[];
}
interface ChannelModelInfo extends ModelInfo {
providerName: string | null;
allocatedToTenants: number;
}
interface ResourceSummary {
totalCustomAgentCpuQuota: number;
totalCustomAgentMemoryQuota: number;
totalPlatformAgentPodQuota: number;
totalPlatformAgentPodUsed: number;
totalModelProviders: number;
totalModels: number;
totalTenantsWithResources: number;
}
interface ChannelAllocatedResources {
channelId: string;
channelName: string;
channelEmail: string;
channelStatus: string;
createdAt: string;
channelCredit: number;
commissionRate: number;
customAgentQuota: CustomAgentQuota | null;
platformAgents: PlatformAgentQuota[];
modelProviders: ModelProviderInfo[];
models: ChannelModelInfo[];
summary: ResourceSummary;
}
interface ChannelAllocatedResourcesResponse {
success: boolean;
data: ChannelAllocatedResources;
message: string;
}
// API 调用函数
async function getChannelAllocatedResources(channelId: string): Promise<ChannelAllocatedResourcesResponse> {
const response = await fetch(
`${API_BASE_URL}/api/admin/channels/${channelId}/allocated-resources`,
{
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
}
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
}
// 使用示例
async function displayChannelResources(channelId: string) {
try {
const result = await getChannelAllocatedResources(channelId);
if (result.success) {
const { data } = result;
console.log(`渠道: ${data.channelName}`);
console.log(`状态: ${data.channelStatus}`);
console.log(`信用额度: ¥${data.channelCredit}`);
// 自定义Agent配额
if (data.customAgentQuota) {
const { cpuQuota, cpuAllocatedToTenants, memoryQuota, memoryAllocatedToTenants } = data.customAgentQuota;
console.log(`自定义Agent CPU: ${cpuAllocatedToTenants}/${cpuQuota} 核`);
console.log(`自定义Agent 内存: ${memoryAllocatedToTenants}/${memoryQuota} GB`);
}
// 平台Agent配额
console.log(`平台Agent模板数: ${data.platformAgents.length}`);
data.platformAgents.forEach(agent => {
console.log(` - ${agent.templateDisplayName}: ${agent.podUsed}/${agent.podQuota} Pods`);
});
// 模型统计
console.log(`模型供应商数: ${data.summary.totalModelProviders}`);
console.log(`模型总数: ${data.summary.totalModels}`);
}
} catch (error) {
console.error('获取渠道资源失败:', error);
}
}
React Hook 示例
import { useState, useEffect } from 'react';
function useChannelAllocatedResources(channelId: string | null) {
const [data, setData] = useState<ChannelAllocatedResources | null>(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<Error | null>(null);
useEffect(() => {
if (!channelId) return;
const fetchData = async () => {
setLoading(true);
setError(null);
try {
const result = await getChannelAllocatedResources(channelId);
if (result.success) {
setData(result.data);
} else {
throw new Error(result.message);
}
} catch (err) {
setError(err instanceof Error ? err : new Error('Unknown error'));
} finally {
setLoading(false);
}
};
fetchData();
}, [channelId]);
return { data, loading, error };
}
// 组件使用
function ChannelResourcesPanel({ channelId }: { channelId: string }) {
const { data, loading, error } = useChannelAllocatedResources(channelId);
if (loading) return <div>加载中...</div>;
if (error) return <div>错误: {error.message}</div>;
if (!data) return null;
return (
<div className="channel-resources">
<h2>{data.channelName} - 资源分配详情</h2>
{/* 自定义Agent配额卡片 */}
{data.customAgentQuota && (
<ResourceCard title="自定义Agent配额">
<ProgressBar
label="CPU"
used={data.customAgentQuota.cpuAllocatedToTenants}
total={data.customAgentQuota.cpuQuota}
unit="核"
/>
<ProgressBar
label="内存"
used={data.customAgentQuota.memoryAllocatedToTenants}
total={data.customAgentQuota.memoryQuota}
unit="GB"
/>
</ResourceCard>
)}
{/* 平台Agent配额列表 */}
<ResourceCard title="平台Agent配额">
{data.platformAgents.map(agent => (
<div key={agent.templateName}>
<span>{agent.templateDisplayName}</span>
<ProgressBar
label="Pods"
used={agent.podUsed}
total={agent.podQuota}
/>
</div>
))}
</ResourceCard>
{/* 模型列表 */}
<ResourceCard title="模型配额">
<table>
<thead>
<tr>
<th>模型</th>
<th>供应商</th>
<th>RPM</th>
<th>TPM</th>
<th>已分配租户</th>
</tr>
</thead>
<tbody>
{data.models.map(model => (
<tr key={model.modelName}>
<td>{model.modelName}</td>
<td>{model.providerName || '-'}</td>
<td>{model.rpmLimit}</td>
<td>{model.tpmLimit}</td>
<td>{model.allocatedToTenants}</td>
</tr>
))}
</tbody>
</table>
</ResourceCard>
</div>
);
}
与现有接口的对比
| 特性 | 现有接口 /api/admin/channels/{channel_id}/resources |
新接口 /api/admin/channels/{channel_id}/allocated-resources |
|---|---|---|
| 自定义Agent配额 | 只有配额总量 | 配额+已分配+可用量 |
| 平台Agent | 只有Agent列表 | 每个模板的配额详情+使用情况 |
| 模型信息 | 只有模型名称列表 | 供应商+模型+RPM/TPM限制+分配情况 |
| 渠道信息 | 无 | 包含渠道基本信息 |
| 汇总统计 | 无 | 完整的资源汇总统计 |
更新日志
v1.0.0 (2026-01-13)
- 初始版本
- 实现超级管理员查看渠道资源分配详情接口
- 支持自定义Agent、平台Agent、模型供应商、模型的完整资源查看
- 包含资源使用率和分配统计