705 lines
15 KiB
Markdown
705 lines
15 KiB
Markdown
# AI Agent Manager API 文档
|
||
|
||
## 概述
|
||
|
||
AI Agent Manager 是一个基于 FastAPI 构建的 Kubernetes AI Agent 管理服务。该服务提供 RESTful API 接口,用于在 Kubernetes 集群中创建、删除、查询和管理 AI Agent Pod。
|
||
|
||
### 基本信息
|
||
|
||
| 项目 | 值 |
|
||
|------|-----|
|
||
| 服务名称 | AI Agent Manager |
|
||
| 版本 | 1.0.0 |
|
||
| 基础URL | `http://<host>:<port>` |
|
||
| 默认端口 | 8000 |
|
||
| 内容类型 | `application/json` |
|
||
|
||
### 环境变量配置
|
||
|
||
| 变量名 | 默认值 | 说明 |
|
||
|--------|--------|------|
|
||
| `NAMESPACE` | `ai-agents` | AI Agent 部署的 Kubernetes 命名空间 |
|
||
| `KUBECONFIG_PATH` | `None` | kubeconfig 文件路径(可选) |
|
||
| `SERVICE_HOST` | `0.0.0.0` | 服务监听地址 |
|
||
| `SERVICE_PORT` | `8000` | 服务监听端口 |
|
||
|
||
---
|
||
|
||
## API 端点
|
||
|
||
### 1. 健康检查
|
||
|
||
检查服务运行状态。
|
||
|
||
**请求**
|
||
|
||
```
|
||
GET /
|
||
```
|
||
|
||
**响应**
|
||
|
||
```json
|
||
{
|
||
"service": "AI Agent Manager",
|
||
"status": "running",
|
||
"namespace": "ai-agents"
|
||
}
|
||
```
|
||
|
||
**cURL 示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8000/"
|
||
```
|
||
|
||
---
|
||
|
||
### 2. 列出所有模板
|
||
|
||
获取所有可用的 Agent 模板及其所需参数。
|
||
|
||
**请求**
|
||
|
||
```
|
||
GET /templates
|
||
```
|
||
|
||
**成功响应 (200)**
|
||
|
||
```json
|
||
{
|
||
"templates": [
|
||
{
|
||
"template": "echo_agent",
|
||
"port": null,
|
||
"env_info": {}
|
||
},
|
||
{
|
||
"template": "jina_search_agent",
|
||
"port": 8080,
|
||
"env_info": {
|
||
"required": {
|
||
"JINA_API_KEY": "Jina API密钥,从 https://jina.ai/ 获取"
|
||
},
|
||
"optional": {
|
||
"SERVICE_PORT": "HTTP服务端口,默认8080",
|
||
"SERVICE_HOST": "HTTP服务监听地址,默认0.0.0.0"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"template": "mysql_agent",
|
||
"port": null,
|
||
"env_info": {
|
||
"required": {
|
||
"MYSQL_HOST": "MySQL数据库主机地址",
|
||
"MYSQL_USER": "MySQL用户名",
|
||
"MYSQL_PASSWORD": "MySQL密码",
|
||
"MYSQL_DATABASE": "MySQL数据库名",
|
||
"OPENAI_API_KEY": "OpenAI API密钥"
|
||
},
|
||
"optional": {
|
||
"MYSQL_PORT": "MySQL端口,默认3306"
|
||
}
|
||
}
|
||
}
|
||
],
|
||
"count": 7
|
||
}
|
||
```
|
||
|
||
**cURL 示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8000/templates"
|
||
```
|
||
|
||
---
|
||
|
||
### 3. 获取模板详情
|
||
|
||
获取指定模板的详细信息,包括所需环境变量。
|
||
|
||
**请求**
|
||
|
||
```
|
||
GET /templates/{template_name}
|
||
```
|
||
|
||
**路径参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| `template_name` | string | 是 | 模板名称 |
|
||
|
||
**成功响应 (200)**
|
||
|
||
```json
|
||
{
|
||
"template": "jina_search_agent",
|
||
"port": 8080,
|
||
"env_info": {
|
||
"required": {
|
||
"JINA_API_KEY": "Jina API密钥,从 https://jina.ai/ 获取"
|
||
},
|
||
"optional": {
|
||
"SERVICE_PORT": "HTTP服务端口,默认8080",
|
||
"SERVICE_HOST": "HTTP服务监听地址,默认0.0.0.0"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**错误响应**
|
||
|
||
| 状态码 | 说明 |
|
||
|--------|------|
|
||
| 404 | 模板不存在 |
|
||
|
||
**cURL 示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8000/templates/jina_search_agent"
|
||
```
|
||
|
||
---
|
||
|
||
### 4. 创建 Agent
|
||
|
||
创建一个新的 AI Agent Pod。
|
||
|
||
**请求**
|
||
|
||
```
|
||
POST /agents
|
||
```
|
||
|
||
**请求头**
|
||
|
||
```
|
||
Content-Type: application/json
|
||
```
|
||
|
||
**请求体参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| `name` | string | 是 | Agent 名称,长度 1-63 字符 |
|
||
| `template` | string | 是 | 模板类型(见模板列表) |
|
||
| `config` | object | 否 | 配置信息(见下表) |
|
||
|
||
**config 配置参数**
|
||
|
||
| 参数 | 类型 | 默认值 | 说明 |
|
||
|------|------|--------|------|
|
||
| `replicas` | integer | 1 | 副本数量 |
|
||
| `cpu_request` | string | `100m` | CPU 请求量 |
|
||
| `cpu_limit` | string | `500m` | CPU 限制量 |
|
||
| `memory_request` | string | `128Mi` | 内存请求量 |
|
||
| `memory_limit` | string | `512Mi` | 内存限制量 |
|
||
| `env` | object | `{}` | 自定义环境变量 |
|
||
|
||
**请求体示例(带环境变量)**
|
||
|
||
```json
|
||
{
|
||
"name": "my-jina-agent",
|
||
"template": "jina_search_agent",
|
||
"config": {
|
||
"cpu_request": "100m",
|
||
"cpu_limit": "500m",
|
||
"memory_request": "128Mi",
|
||
"memory_limit": "512Mi",
|
||
"env": {
|
||
"JINA_API_KEY": "your-jina-api-key"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**成功响应 (200) - HTTP服务类型Agent**
|
||
|
||
```json
|
||
{
|
||
"name": "my-jina-agent",
|
||
"namespace": "ai-agents",
|
||
"status": "Pending",
|
||
"created_at": "2025-12-31T01:00:00.000000+00:00",
|
||
"template": "jina_search_agent",
|
||
"service_port": 8080,
|
||
"access_info": {
|
||
"note": "Pod IP将在Pod运行后可用,请通过 /agents/{name}/status 获取",
|
||
"port": 8080,
|
||
"endpoints": {
|
||
"root": "http://<pod_ip>:8080/",
|
||
"health": "http://<pod_ip>:8080/health"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**成功响应 (200) - 普通Agent**
|
||
|
||
```json
|
||
{
|
||
"name": "my-echo-agent",
|
||
"namespace": "ai-agents",
|
||
"status": "Pending",
|
||
"created_at": "2025-12-31T01:00:00.000000+00:00",
|
||
"template": "echo_agent"
|
||
}
|
||
```
|
||
|
||
**错误响应**
|
||
|
||
| 状态码 | 说明 |
|
||
|--------|------|
|
||
| 400 | 无效的模板类型 |
|
||
| 500 | 服务器内部错误 |
|
||
|
||
**cURL 示例**
|
||
|
||
```bash
|
||
# 创建 Jina Search Agent(带环境变量)
|
||
curl -X POST "http://localhost:8000/agents" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"name": "my-jina-agent",
|
||
"template": "jina_search_agent",
|
||
"config": {
|
||
"env": {
|
||
"JINA_API_KEY": "your-jina-api-key"
|
||
}
|
||
}
|
||
}'
|
||
|
||
# 创建 MySQL Agent
|
||
curl -X POST "http://localhost:8000/agents" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"name": "my-mysql-agent",
|
||
"template": "mysql_agent",
|
||
"config": {
|
||
"env": {
|
||
"MYSQL_HOST": "mysql.example.com",
|
||
"MYSQL_USER": "root",
|
||
"MYSQL_PASSWORD": "password",
|
||
"MYSQL_DATABASE": "mydb",
|
||
"OPENAI_API_KEY": "sk-xxx"
|
||
}
|
||
}
|
||
}'
|
||
```
|
||
|
||
---
|
||
|
||
### 5. 删除 Agent
|
||
|
||
删除指定的 AI Agent Pod。
|
||
|
||
**请求**
|
||
|
||
```
|
||
DELETE /agents/{agent_name}
|
||
```
|
||
|
||
**路径参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| `agent_name` | string | 是 | 要删除的 Agent 名称 |
|
||
|
||
**成功响应 (200)**
|
||
|
||
```json
|
||
{
|
||
"status": "success",
|
||
"message": "Pod my-jina-agent 已删除"
|
||
}
|
||
```
|
||
|
||
**cURL 示例**
|
||
|
||
```bash
|
||
curl -X DELETE "http://localhost:8000/agents/my-jina-agent"
|
||
```
|
||
|
||
---
|
||
|
||
### 6. 获取 Agent 状态
|
||
|
||
获取指定 Agent 的详细状态信息,包括访问URL和资源使用情况(CPU、内存)。
|
||
|
||
**请求**
|
||
|
||
```
|
||
GET /agents/{agent_name}/status
|
||
```
|
||
|
||
**路径参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| `agent_name` | string | 是 | Agent 名称 |
|
||
|
||
**成功响应 (200) - HTTP服务类型Agent(运行中)**
|
||
|
||
```json
|
||
{
|
||
"name": "my-jina-agent",
|
||
"namespace": "ai-agents",
|
||
"status": "Running",
|
||
"template": "jina_search_agent",
|
||
"created_at": "2025-12-31T01:00:00.000000+00:00",
|
||
"node": "aks-nodepool1-12345678-vmss000000",
|
||
"pod_ip": "10.244.0.15",
|
||
"resources": {
|
||
"requests": {
|
||
"cpu": "100m",
|
||
"memory": "128Mi"
|
||
},
|
||
"limits": {
|
||
"cpu": "500m",
|
||
"memory": "512Mi"
|
||
},
|
||
"usage": {
|
||
"cpu": "50m",
|
||
"memory": "64Mi",
|
||
"available": true
|
||
}
|
||
},
|
||
"service_port": 8080,
|
||
"access_url": "http://10.244.0.15:8080",
|
||
"endpoints": {
|
||
"root": "http://10.244.0.15:8080/",
|
||
"health": "http://10.244.0.15:8080/health"
|
||
},
|
||
"conditions": [
|
||
{
|
||
"type": "Ready",
|
||
"status": "True",
|
||
"reason": null
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**resources 字段说明**
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `requests` | 资源请求配额(Pod 启动时保证的资源) |
|
||
| `limits` | 资源限制配额(Pod 可使用的最大资源) |
|
||
| `usage` | 实际资源使用情况(需要集群安装 metrics-server) |
|
||
|
||
**usage 字段说明**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `cpu` | string | 当前 CPU 使用量(如 "50m" 表示 50 毫核) |
|
||
| `memory` | string | 当前内存使用量(如 "64Mi" 表示 64 MiB) |
|
||
| `available` | boolean | 资源使用数据是否可用 |
|
||
| `reason` | string | 如果 `available` 为 false,说明原因 |
|
||
|
||
**注意**: 实际资源使用量(`usage`)需要 Kubernetes 集群安装 [metrics-server](https://github.com/kubernetes-sigs/metrics-server)。如果未安装,`usage.available` 为 `false`,并在 `usage.reason` 中说明原因。
|
||
|
||
**状态值说明**
|
||
|
||
| 状态 | 说明 |
|
||
|------|------|
|
||
| `Pending` | Pod 已被接受,但容器尚未创建 |
|
||
| `Running` | Pod 已绑定到节点,所有容器已创建 |
|
||
| `Succeeded` | Pod 中所有容器已成功终止 |
|
||
| `Failed` | Pod 中所有容器已终止,至少一个容器失败 |
|
||
| `Unknown` | 无法获取 Pod 状态 |
|
||
|
||
**cURL 示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8000/agents/my-jina-agent/status"
|
||
```
|
||
|
||
---
|
||
|
||
### 7. 获取 Agent 资源使用情况
|
||
|
||
获取指定 Agent 的 CPU 和内存资源配置信息。
|
||
|
||
**请求**
|
||
|
||
```
|
||
GET /agents/{agent_name}/metrics
|
||
```
|
||
|
||
**成功响应 (200)**
|
||
|
||
```json
|
||
{
|
||
"name": "my-jina-agent",
|
||
"requests": {
|
||
"cpu": "100m",
|
||
"memory": "128Mi"
|
||
},
|
||
"limits": {
|
||
"cpu": "500m",
|
||
"memory": "512Mi"
|
||
}
|
||
}
|
||
```
|
||
|
||
**cURL 示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8000/agents/my-jina-agent/metrics"
|
||
```
|
||
|
||
---
|
||
|
||
### 8. 列出所有 Agent
|
||
|
||
获取所有 AI Agent 的列表,支持按模板类型过滤。
|
||
|
||
**请求**
|
||
|
||
```
|
||
GET /agents
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| `template` | string | 否 | 按模板类型过滤 |
|
||
|
||
**成功响应 (200)**
|
||
|
||
```json
|
||
{
|
||
"agents": [
|
||
{
|
||
"name": "my-jina-agent",
|
||
"status": "Running",
|
||
"template": "jina_search_agent",
|
||
"created_at": "2025-12-31T01:00:00.000000+00:00",
|
||
"pod_ip": "10.244.0.15"
|
||
}
|
||
],
|
||
"count": 1
|
||
}
|
||
```
|
||
|
||
**cURL 示例**
|
||
|
||
```bash
|
||
# 列出所有 Agent
|
||
curl -X GET "http://localhost:8000/agents"
|
||
|
||
# 按模板类型过滤
|
||
curl -X GET "http://localhost:8000/agents?template=jina_search_agent"
|
||
```
|
||
|
||
---
|
||
|
||
## 模板类型说明
|
||
|
||
### echo_agent
|
||
|
||
简单的回显 Agent,用于测试和演示。
|
||
|
||
- **镜像**: `agnettaiji.azurecr.io/ai-agents/echo-agent:latest`
|
||
- **用途**: 测试、演示、健康检查
|
||
- **所需环境变量**: 无
|
||
|
||
### chat_agent
|
||
|
||
聊天对话 Agent,支持对话交互。
|
||
|
||
- **镜像**: `agnettaiji.azurecr.io/ai-agents/chat-agent:latest`
|
||
- **用途**: 对话系统、客服机器人
|
||
- **所需环境变量**: 无
|
||
|
||
### code_agent
|
||
|
||
代码生成 Agent,支持代码相关任务。
|
||
|
||
- **镜像**: `agnettaiji.azurecr.io/ai-agents/code-agent:latest`
|
||
- **用途**: 代码生成、代码审查、代码解释
|
||
- **所需环境变量**: 无
|
||
|
||
### search_agent
|
||
|
||
搜索 Agent。
|
||
|
||
- **镜像**: `agnettaiji.azurecr.io/ai-agents/search-agent:latest`
|
||
- **用途**: 搜索功能
|
||
- **所需环境变量**: 无
|
||
|
||
### jina_search_agent
|
||
|
||
使用 Jina Reader API 获取网站内容的 HTTP 服务 Agent。
|
||
|
||
- **镜像**: `agnettaiji.azurecr.io/ai-agents/jina-search-agent:latest`
|
||
- **服务端口**: 8080
|
||
- **用途**: 网站内容抓取、网页转文本
|
||
- **所需环境变量**:
|
||
| 变量名 | 必填 | 说明 |
|
||
|--------|------|------|
|
||
| `JINA_API_KEY` | 是 | Jina API密钥 |
|
||
| `SERVICE_PORT` | 否 | HTTP服务端口,默认8080 |
|
||
| `SERVICE_HOST` | 否 | HTTP服务监听地址,默认0.0.0.0 |
|
||
|
||
- **Agent API端点**:
|
||
- `GET /` - 服务信息和所需参数
|
||
- `GET /health` - 健康检查
|
||
- `POST /search` - 搜索网站内容
|
||
- `GET /fetch?url=<url>` - 快速获取网站内容
|
||
|
||
### mysql_agent
|
||
|
||
MySQL 数据库查询 Agent,使用 LangChain 实现。
|
||
|
||
- **镜像**: `agnettaiji.azurecr.io/ai-agents/mysql-agent:latest`
|
||
- **用途**: MySQL 数据库自然语言查询
|
||
- **所需环境变量**:
|
||
| 变量名 | 必填 | 说明 |
|
||
|--------|------|------|
|
||
| `MYSQL_HOST` | 是 | MySQL数据库主机地址 |
|
||
| `MYSQL_USER` | 是 | MySQL用户名 |
|
||
| `MYSQL_PASSWORD` | 是 | MySQL密码 |
|
||
| `MYSQL_DATABASE` | 是 | MySQL数据库名 |
|
||
| `OPENAI_API_KEY` | 是 | OpenAI API密钥 |
|
||
| `MYSQL_PORT` | 否 | MySQL端口,默认3306 |
|
||
|
||
### postgresql_agent
|
||
|
||
PostgreSQL 数据库查询 Agent,使用 LangChain 实现。
|
||
|
||
- **镜像**: `agnettaiji.azurecr.io/ai-agents/postgresql-agent:latest`
|
||
- **用途**: PostgreSQL 数据库自然语言查询
|
||
- **所需环境变量**:
|
||
| 变量名 | 必填 | 说明 |
|
||
|--------|------|------|
|
||
| `POSTGRES_HOST` | 是 | PostgreSQL数据库主机地址 |
|
||
| `POSTGRES_USER` | 是 | PostgreSQL用户名 |
|
||
| `POSTGRES_PASSWORD` | 是 | PostgreSQL密码 |
|
||
| `POSTGRES_DATABASE` | 是 | PostgreSQL数据库名 |
|
||
| `OPENAI_API_KEY` | 是 | OpenAI API密钥 |
|
||
| `POSTGRES_PORT` | 否 | PostgreSQL端口,默认5432 |
|
||
|
||
---
|
||
|
||
## 完整使用流程示例
|
||
|
||
### 场景:创建并使用 Jina Search Agent
|
||
|
||
```python
|
||
import requests
|
||
import time
|
||
|
||
BASE_URL = "http://localhost:8000"
|
||
|
||
# 1. 查看模板所需参数
|
||
print("=== 查看模板信息 ===")
|
||
response = requests.get(f"{BASE_URL}/templates/jina_search_agent")
|
||
template_info = response.json()
|
||
print(f"所需环境变量: {template_info['env_info']}")
|
||
|
||
# 2. 创建 Agent
|
||
print("\n=== 创建 Agent ===")
|
||
response = requests.post(
|
||
f"{BASE_URL}/agents",
|
||
json={
|
||
"name": "my-jina-agent",
|
||
"template": "jina_search_agent",
|
||
"config": {
|
||
"env": {
|
||
"JINA_API_KEY": "your-jina-api-key"
|
||
}
|
||
}
|
||
}
|
||
)
|
||
create_result = response.json()
|
||
print(f"创建结果: {create_result}")
|
||
|
||
# 3. 等待 Agent 运行
|
||
print("\n=== 等待 Agent 启动 ===")
|
||
for i in range(30):
|
||
response = requests.get(f"{BASE_URL}/agents/my-jina-agent/status")
|
||
status = response.json()
|
||
if status.get("status") == "Running":
|
||
print(f"Agent 已启动!")
|
||
print(f"访问地址: {status.get('access_url')}")
|
||
break
|
||
print(f"当前状态: {status.get('status')}, 等待中...")
|
||
time.sleep(2)
|
||
|
||
# 4. 调用 Agent 服务
|
||
if status.get("access_url"):
|
||
agent_url = status["access_url"]
|
||
|
||
# 查看 Agent 信息
|
||
print("\n=== Agent 服务信息 ===")
|
||
response = requests.get(f"{agent_url}/")
|
||
print(response.json())
|
||
|
||
# 搜索网站内容
|
||
print("\n=== 搜索网站内容 ===")
|
||
response = requests.post(
|
||
f"{agent_url}/search",
|
||
json={"url": "https://www.example.com"}
|
||
)
|
||
print(response.json())
|
||
|
||
# 5. 删除 Agent
|
||
print("\n=== 删除 Agent ===")
|
||
response = requests.delete(f"{BASE_URL}/agents/my-jina-agent")
|
||
print(response.json())
|
||
```
|
||
|
||
---
|
||
|
||
## 错误处理
|
||
|
||
### 通用错误响应格式
|
||
|
||
```json
|
||
{
|
||
"detail": "错误描述信息"
|
||
}
|
||
```
|
||
|
||
### HTTP 状态码
|
||
|
||
| 状态码 | 说明 |
|
||
|--------|------|
|
||
| 200 | 请求成功 |
|
||
| 400 | 请求参数错误 |
|
||
| 404 | 资源不存在 |
|
||
| 500 | 服务器内部错误 |
|
||
|
||
---
|
||
|
||
## OpenAPI/Swagger 文档
|
||
|
||
FastAPI 自动生成交互式 API 文档:
|
||
|
||
- **Swagger UI**: `http://localhost:8000/docs`
|
||
- **ReDoc**: `http://localhost:8000/redoc`
|
||
- **OpenAPI JSON**: `http://localhost:8000/openapi.json`
|
||
|
||
---
|
||
|
||
## 注意事项
|
||
|
||
1. **Agent 名称规范**: 名称必须符合 Kubernetes 命名规范(小写字母、数字、连字符,长度 1-63)
|
||
2. **资源配额**: 请根据实际需求配置 CPU 和内存,避免资源浪费或不足
|
||
3. **命名空间**: 所有 Agent 默认部署在 `ai-agents` 命名空间
|
||
4. **镜像拉取**: 需要配置 ACR 密钥(`acr-secret`)才能拉取私有镜像
|
||
5. **网络访问**: 服务默认监听所有网络接口(0.0.0.0),生产环境请注意安全配置
|
||
6. **环境变量安全**: 敏感信息(如 API 密钥)应通过安全方式传递,避免在日志中暴露
|
||
7. **资源监控**: 获取 Agent 实际 CPU/内存使用量需要集群安装 [metrics-server](https://github.com/kubernetes-sigs/metrics-server)。安装命令:
|
||
```bash
|
||
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
|
||
```
|