Files
taiji-AI-PAD/Docs/项目文档/用户资源信息查询接口文档.md
T

475 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 用户资源信息查询接口文档
> **版本**: 2026-01-14 v3
> **认证方式**: Bearer Token(JWT)
> **更新说明**: 新增域名访问支持(externalIp、domain、domainUrl、accessUrl 字段)
---
## 📋 接口概述
本文档包含两个接口:
| 接口路径 | 描述 |
|---------|------|
| `GET /api/user/resources/info` | 获取用户的 LiteLLM 密钥信息 |
| `GET /api/user/resources/agents` | 获取用户已部署的 Agent 列表 |
---
# 接口一:LiteLLM 密钥查询
## 📋 接口概述
| 项目 | 值 |
|------|-----|
| **接口路径** | `GET /api/user/resources/info` |
| **接口描述** | 获取用户的 LiteLLM 密钥信息 |
| **认证方式** | Bearer Token(JWT) |
| **Content-Type** | application/json |
### 功能说明
该接口用于获取当前用户的 LiteLLM 密钥信息:
- **LiteLLM 密钥**:解密后的完整 API Key,可直接用于调用 AI 模型
---
## 📥 请求参数
### 请求头(Headers)
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|:----:|------|
| `Authorization` | string | ✅ | Bearer Token,格式:`Bearer <JWT Token>` |
### 请求体(Body)
无
### 查询参数(Query)
无
---
## 📤 请求示例
```http
GET /api/user/resources/info HTTP/1.1
Host: api.taiji-ai.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json
```
---
## 📊 响应参数
### 响应结构
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | boolean | 请求是否成功 |
| `message` | string | 响应消息 |
| `data` | object | 响应数据 |
### data 对象
| 字段 | 类型 | 说明 |
|------|------|------|
| `litellmKeys` | array | LiteLLM 密钥列表 |
| `litellmApiBase` | string | LiteLLM 网关地址(全局) |
| `summary` | object | 汇总统计信息 |
---
### litellmKeys 数组元素
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `modelName` | string | 模型名称 | `"taiji/gpt-4o-mini"` |
| `apiKey` | string | **解密后的完整 API Key**(用于调用模型) | `"sk-cqlSIMr1v4H3PC1LiOuXKg"` |
| `apiBase` | string | LiteLLM 网关地址 | `"https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io"` |
| `rpmLimit` | integer | 每分钟请求数限制 | `10` |
| `tpmLimit` | integer | 每分钟 Token 数限制 | `10` |
| `maxBudget` | number \| null | 最大预算(美元) | `500.0` |
| `budgetDuration` | string | 预算周期 | `"monthly"` |
| `status` | string | 密钥状态 | `"active"` |
| `createdAt` | string | 创建时间(ISO 8601) | `"2026-01-09T06:20:12.334386"` |
| `error` | string | 错误信息(仅解密失败时返回) | `"密钥解密失败"` |
---
### summary 对象
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `totalLitellmKeys` | integer | LiteLLM 密钥总数 | `2` |
---
## 📝 响应示例
### 成功响应
```json
{
"success": true,
"data": {
"litellmKeys": [
{
"modelName": "taiji/gpt-4o-mini",
"apiKey": "sk-cqlSIMr1v4H3PC1LiOuXKg",
"apiBase": "https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io",
"rpmLimit": 10,
"tpmLimit": 10,
"maxBudget": 500.0,
"budgetDuration": "monthly",
"status": "active",
"createdAt": "2026-01-09T06:20:12.334386"
},
{
"modelName": "taiji/gpt-5",
"apiKey": "sk-Cjw3WZ7w3XMH5LjXnYw2ZA",
"apiBase": "https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io",
"rpmLimit": 100,
"tpmLimit": 100,
"maxBudget": 500.0,
"budgetDuration": "monthly",
"status": "active",
"createdAt": "2026-01-09T08:35:09.780817"
}
],
"litellmApiBase": "https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io",
"summary": {
"totalLitellmKeys": 2
}
},
"message": "LiteLLM 密钥信息获取成功"
}
```
### 无密钥时的响应
```json
{
"success": true,
"data": {
"litellmKeys": [],
"litellmApiBase": "https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io",
"summary": {
"totalLitellmKeys": 0
}
},
"message": "LiteLLM 密钥信息获取成功"
}
```
### 认证失败响应
**HTTP Status Code**: `401 Unauthorized`
```json
{
"detail": "Not authenticated"
}
```
---
## 🔧 使用说明
### LiteLLM 密钥使用方式
获取到的 `apiKey` 可以直接用于调用 AI 模型(OpenAI 兼容格式):
```python
import openai
# 从接口返回的数据中获取
api_key = response["data"]["litellmKeys"][0]["apiKey"]
api_base = response["data"]["litellmKeys"][0]["apiBase"]
client = openai.OpenAI(
api_key=api_key,
base_url=api_base
)
response = client.chat.completions.create(
model="taiji/gpt-4o-mini",
messages=[{"role": "user", "content": "Hello!"}]
)
```
---
# 接口二:Agent 列表查询
## 📋 接口概述
| 项目 | 值 |
|------|-----|
| **接口路径** | `GET /api/user/resources/agents` |
| **接口描述** | 获取用户已部署的平台 Agent 和自定义 Agent 列表 |
| **认证方式** | Bearer Token(JWT) |
| **Content-Type** | application/json |
### 功能说明
该接口用于获取当前用户的 Agent 资源信息:
1. **平台 Agent**:已部署的平台 Agent 列表,包含域名、外网IP和访问地址
2. **自定义 Agent**:已部署的自定义 Agent 列表,包含域名、外网IP和访问地址
> 💡 **新特性**:每个 Agent 现在会自动分配域名和外网 IP,推荐使用域名访问 Agent 服务。
---
## 📥 请求参数
### 请求头(Headers)
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|:----:|------|
| `Authorization` | string | ✅ | Bearer Token,格式:`Bearer <JWT Token>` |
### 请求体(Body)
无
### 查询参数(Query)
无
---
## 📤 请求示例
```http
GET /api/user/resources/agents HTTP/1.1
Host: api.taiji-ai.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json
```
---
## 📊 响应参数
### 响应结构
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | boolean | 请求是否成功 |
| `message` | string | 响应消息 |
| `data` | object | 响应数据 |
### data 对象
| 字段 | 类型 | 说明 |
|------|------|------|
| `platformAgents` | array | 已部署的平台 Agent 列表 |
| `customAgents` | array | 已部署的自定义 Agent 列表 |
| `summary` | object | 汇总统计信息 |
---
### platformAgents / customAgents 数组元素
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `name` | string | Agent 实例名称 | `"echo-agent-b00a7b8e-5507d7"` |
| `template` | string | Agent 类型/模板 | `"echo_agent"` |
| `templateName` | string | 模板名称 | `"echo_agent"` |
| `status` | string | 运行状态 | `"Running"` / `"Pending"` / `"Failed"` / `"unknown"` |
| `healthStatus` | string | 健康状态 | `"healthy"` / `"degraded"` / `"unhealthy"` / `"unknown"` |
| `podIp` | string \| null | Pod 内部 IP 地址 | `"10.244.3.5"` |
| `externalIp` | string \| null | **🆕 外网 IP 地址** | `"20.195.113.211"` |
| `domain` | string \| null | **🆕 域名**(推荐访问方式) | `"echo-agent-b00a7b8e-5507d7.taijiagnet.com"` |
| `domainUrl` | string \| null | **🆕 域名访问地址** | `"http://echo-agent-b00a7b8e-5507d7.taijiagnet.com"` |
| `accessUrl` | string \| null | **🆕 推荐访问地址**(域名优先) | `"http://echo-agent-b00a7b8e-5507d7.taijiagnet.com"` |
| `servicePort` | integer \| null | 服务端口 | `8000` |
| `namespace` | string | K8s 命名空间 | `"agent-echo-agent-b00a7b8e-5507d7"` |
| `hostIp` | string \| null | 宿主机 IP | `"10.224.0.7"` |
| `nodeName` | string \| null | K8s 节点名称 | `"aks-taijipod-34569487-vmss00000b"` |
| `cpu` | string | CPU 配置 | `"100m"` |
| `memory` | string | 内存配置 | `"256Mi"` |
| `replicas` | integer | 副本数量 | `1` |
| `startTime` | string | 启动时间(ISO 8601) | `"2026-01-14T13:36:22.443568"` |
| `runningSeconds` | integer | 已运行秒数 | `3600` |
| `endpoints` | array \| undefined | 端点 URL 列表 | `["http://10.244.3.5:8000"]` |
---
### summary 对象
| 字段 | 类型 | 说明 | 示例 |
|------|------|------|------|
| `totalPlatformAgents` | integer | 已部署的平台 Agent 数量 | `2` |
| `totalCustomAgents` | integer | 已部署的自定义 Agent 数量 | `4` |
---
## 📝 响应示例
### 成功响应
```json
{
"success": true,
"data": {
"platformAgents": [
{
"name": "echo-agent-b00a7b8e-5507d7",
"template": "echo_agent",
"templateName": "echo_agent",
"status": "Running",
"healthStatus": "healthy",
"podIp": "10.244.3.5",
"externalIp": "20.195.113.211",
"domain": "echo-agent-b00a7b8e-5507d7.taijiagnet.com",
"domainUrl": "http://echo-agent-b00a7b8e-5507d7.taijiagnet.com",
"accessUrl": "http://echo-agent-b00a7b8e-5507d7.taijiagnet.com",
"servicePort": 8000,
"namespace": "agent-echo-agent-b00a7b8e-5507d7",
"hostIp": "10.224.0.7",
"nodeName": "aks-taijipod-34569487-vmss00000b",
"cpu": "100m",
"memory": "256Mi",
"replicas": 1,
"startTime": "2026-01-14T13:36:22.443568",
"runningSeconds": 3600
}
],
"customAgents": [
{
"name": "my-mysql-agent",
"template": "mysql_agent",
"templateName": "MCP",
"status": "Running",
"healthStatus": "healthy",
"podIp": "10.244.1.61",
"externalIp": "20.6.66.41",
"domain": "my-mysql-agent.taijiagnet.com",
"domainUrl": "http://my-mysql-agent.taijiagnet.com",
"accessUrl": "http://my-mysql-agent.taijiagnet.com",
"servicePort": 8000,
"namespace": "agent-my-mysql-agent",
"hostIp": "10.224.0.5",
"nodeName": "aks-taijipod-34569487-vmss00000a",
"cpu": "500m",
"memory": "1Gi",
"replicas": 1,
"startTime": "2026-01-14T10:00:00.000000",
"runningSeconds": 14400
}
],
"summary": {
"totalPlatformAgents": 1,
"totalCustomAgents": 1
}
},
"message": "Agent 列表获取成功"
}
```
### 无 Agent 时的响应
```json
{
"success": true,
"data": {
"platformAgents": [],
"customAgents": [],
"summary": {
"totalPlatformAgents": 0,
"totalCustomAgents": 0
}
},
"message": "Agent 列表获取成功"
}
```
### 认证失败响应
**HTTP Status Code**: `401 Unauthorized`
```json
{
"detail": "Not authenticated"
}
```
---
## 🔧 使用说明
### Agent 访问方式
#### 🌐 推荐:使用域名访问(稳定)
通过 `domain` 或 `accessUrl` 访问 Agent 服务,域名不会因 Pod 重启而变化:
```bash
# 使用域名访问(推荐)
curl http://echo-agent-b00a7b8e-5507d7.taijiagnet.com/api/chat
# 或使用 accessUrl 字段的值
curl http://echo-agent-b00a7b8e-5507d7.taijiagnet.com/health
```
#### 🔗 使用外网 IP 访问
```bash
# 使用外网 IP 访问
curl http://20.195.113.211/api/chat
```
#### 📍 集群内部访问(仅限 K8s 集群内)
```bash
# 使用 Pod IP 访问(仅集群内部)
curl http://10.244.3.5:8000/api/chat
```
### 访问方式优先级
| 优先级 | 访问方式 | 字段 | 稳定性 | 说明 |
|:---:|---------|------|:---:|------|
| 1 | 域名 | `domain` / `accessUrl` | ⭐⭐⭐ | **推荐**,Pod 重启后不变 |
| 2 | 外网 IP | `externalIp` | ⭐⭐ | LoadBalancer IP,较稳定 |
| 3 | Pod IP | `podIp` | ⭐ | Pod 重启后会变化 |
---
## 📌 数据来源说明
| 数据类型 | 来源 | 实时性 |
|---------|------|--------|
| LiteLLM 密钥 | PostgreSQL 数据库 | 静态(创建时存储) |
| Agent 基本信息(名称、模板、CPU/内存) | PostgreSQL 数据库 | 静态(创建时存储) |
| Agent 访问信息(domain、externalIp) | PostgreSQL 数据库 | 静态(创建时存储) |
| Agent 状态(status, healthStatus) | AKS 集群(通过 Agent Manager) | **实时查询** |
| Agent Pod 信息(podIp、hostIp) | AKS 集群(通过 Agent Manager) | **实时查询** |
### 调用链路
```
前端 → mcp-server → Agent Manager → AKS (Kubernetes API)
↓
查询 Pod/Service 真实状态
```
---
## ⚠️ 注意事项
1. **密钥安全**:返回的 `apiKey` 是完整的解密密钥,请妥善保管,不要泄露
2. **推荐域名访问**:使用 `domain` 或 `accessUrl` 访问 Agent,比 Pod IP 更稳定
3. **DNS 生效时间**:新创建的 Agent 域名可能需要 1-5 分钟 DNS 传播时间
4. **实时性**:`status`、`podIp` 等信息是实时从 AKS 查询的,可能有轻微延迟
5. **服务可用性**:如果 Agent Manager 服务不可用,实时信息将显示为 `null` 或 `unknown`
6. **旧 Agent 兼容**:在 2026-01-14 之前创建的 Agent,`domain`、`externalIp` 等字段可能为 `null`