# 数据工具与自定义Agent - 接口文档 > **版本**: 2026-01-13 v4 > **基础路径**: `/api/user` > **认证方式**: Bearer Token(在请求头添加 `Authorization: Bearer `) > **状态**: ✅ 已修复 --- ## 📊 业务流程 ``` ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ 业务流程 │ ├─────────────────────────────────────────────────────────────────────────────────────┤ │ │ │ ① 获取模板列表 ② 创建工具(基于模板) ③ 创建Agent(选择工具) │ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ │ │ GET │ │ POST │ │ POST │ │ │ │ /templates │────→│ /tools/create │───────────→│ /custom-agents│ │ │ └───────────────┘ └───────────────┘ └───────────────┘ │ │ │ │ │ │ │ ↓ ↓ ↓ │ │ 返回 dataTemplates 保存到 Tool 表 从工具获取 template │ │ [mysql_agent, - template: mysql_agent 和 envConfig, │ │ postgresql_agent] - env_config: {...} 传递给 Agent Manager │ │ │ │ 含 env_info: │ │ - required │ │ - optional │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ ``` ### 核心概念 | 概念 | 说明 | |------|------| | **模板 (dataTemplates)** | Agent 镜像类型,来自 Agent Manager,如 `mysql_agent`,包含 `env_info` 定义所需配置 | | **工具 (Tool)** | 用户基于模板创建的配置实例,包含 **`template` + `env_config`** | | **自定义 Agent** | 根据工具的模板类型和配置创建的 K8s Pod | --- ## 🔐 通用请求头 ```http Content-Type: application/json Authorization: Bearer ``` --- ## 📑 接口列表 | 序号 | 接口 | 方法 | 说明 | |:---:|------|------|------| | 1 | `/api/user/custom-agents/templates` | GET | 获取自定义Agent模板 | | 2 | `/api/user/tools/create` | POST | 创建工具 | | 3 | `/api/user/tools` | GET | 获取用户工具列表 | | 4 | `/api/user/tools/{tool_id}` | PUT | 更新工具 | | 5 | `/api/user/tools/{tool_id}` | DELETE | 删除工具 | | 6 | `/api/user/custom-agents` | POST | 创建自定义Agent | | 7 | `/api/user/custom-agents` | GET | 获取用户自定义Agent列表 | | 8 | `/api/user/custom-agents/{name}` | DELETE | 删除自定义Agent | --- ## 1️⃣ 获取自定义Agent模板 ### 接口 ``` GET /api/user/custom-agents/templates ``` ### 请求参数 无 ### 响应参数 | 字段 | 类型 | 说明 | |------|------|------| | `success` | boolean | 请求是否成功 | | `data.frameworkTemplates` | string[] | 框架类型列表 | | `data.dataTemplates` | array | 数据存储模板列表 | | `data.dataTemplates[].template` | string | 模板名称 | | `data.dataTemplates[].port` | number \| null | 服务端口 | | `data.dataTemplates[].env_info.required` | object | 必需的环境变量 | | `data.dataTemplates[].env_info.optional` | object | 可选的环境变量 | | `data.dataTemplates[].description` | string | 模板描述 | ### 响应示例 ```json { "success": true, "data": { "frameworkTemplates": ["A2A", "langchain", "MCP"], "dataTemplates": [ { "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" } }, "description": "MySQL 数据库 Agent,支持 SQL 查询和数据操作" }, { "template": "postgresql_agent", "port": null, "env_info": { "required": { "POSTGRES_HOST": "PostgreSQL数据库主机地址", "POSTGRES_USER": "PostgreSQL用户名", "POSTGRES_PASSWORD": "PostgreSQL密码", "POSTGRES_DATABASE": "PostgreSQL数据库名", "OPENAI_API_KEY": "OpenAI API密钥" }, "optional": { "POSTGRES_PORT": "PostgreSQL端口,默认5432" } }, "description": "PostgreSQL 数据库 Agent,支持 SQL 查询和数据操作" } ] } } ``` > **注意**:`OPENAI_API_KEY` 虽然在模板 `env_info.required` 中列出,但**用户无需填写**。系统会在创建 Agent 时自动注入用户的 LiteLLM 密钥。 --- ## 2️⃣ 创建工具(基于模板) ### 接口 ``` POST /api/user/tools/create ``` ### 请求参数 | 参数 | 类型 | 必填 | 说明 | |-----|------|:---:|------| | `name` | string | ✅ | 工具名称 | | `description` | string | ❌ | 工具描述 | | `template` | string | ✅ | 模板名称(来自 `dataTemplates[].template`) | | `envConfig` | object | ✅ | 环境变量配置(根据模板 `env_info` 填写) | ### 请求示例(MySQL 工具) ```json { "name": "my-mysql-tool", "description": "我的MySQL数据库连接工具", "template": "mysql_agent", "envConfig": { "MYSQL_HOST": "mysql.example.com", "MYSQL_USER": "root", "MYSQL_PASSWORD": "password123", "MYSQL_DATABASE": "mydb", "MYSQL_PORT": "3306" } } ``` ### 请求示例(PostgreSQL 工具) ```json { "name": "my-pgsql-tool", "description": "我的PostgreSQL数据库连接工具", "template": "postgresql_agent", "envConfig": { "POSTGRES_HOST": "postgres.example.com", "POSTGRES_USER": "postgres", "POSTGRES_PASSWORD": "password123", "POSTGRES_DATABASE": "mydb", "POSTGRES_PORT": "5432" } } ``` > **注意**:`OPENAI_API_KEY` 无需填写,系统会自动注入用户的 LiteLLM 密钥。 ### 响应参数 | 字段 | 类型 | 说明 | |------|------|------| | `success` | boolean | 请求是否成功 | | `data.id` | string | 工具ID(UUID) | | `data.name` | string | 工具名称 | | `data.template` | string | 模板名称 | | `data.type` | string | 工具类型(database) | | `message` | string | 响应消息 | ### 响应示例 ```json { "success": true, "data": { "id": "d14cd898-e2cf-4150-a7f9-53b962c1c9a2", "name": "my-mysql-tool", "template": "mysql_agent", "type": "database" }, "message": "工具创建成功" } ``` --- ## 3️⃣ 获取用户工具列表 ### 接口 ``` GET /api/user/tools ``` ### 请求参数 无 ### 响应参数 | 字段 | 类型 | 说明 | |------|------|------| | `success` | boolean | 请求是否成功 | | `data.tools` | array | 工具列表 | | `data.tools[].id` | string | 工具ID(UUID) | | `data.tools[].name` | string | 工具名称 | | `data.tools[].description` | string | 工具描述 | | `data.tools[].template` | string | 模板名称 | | `data.tools[].category` | string | 工具分类 | | `data.tools[].envConfig` | object | 环境变量配置(敏感信息已脱敏) | | `data.tools[].created_at` | string | 创建时间(ISO 8601) | | `data.tools[].updated_at` | string | 更新时间(ISO 8601) | | `data.tools[].is_active` | boolean | 是否激活 | | `data.tools[].is_public` | boolean | 是否公开 | ### 响应示例 ```json { "success": true, "data": { "tools": [ { "id": "d14cd898-e2cf-4150-a7f9-53b962c1c9a2", "name": "my-mysql-tool", "description": "我的MySQL数据库连接工具", "template": "mysql_agent", "category": "database", "envConfig": { "MYSQL_HOST": "mysql.example.com", "MYSQL_USER": "root", "MYSQL_PASSWORD": "pa******23", "MYSQL_DATABASE": "mydb", "MYSQL_PORT": "3306", "OPENAI_API_KEY": "sk******xx" }, "type": "database", "endpoint": null, "method": null, "created_at": "2026-01-13T08:00:00Z", "updated_at": "2026-01-13T08:00:00Z", "is_active": true, "is_public": false } ] } } ``` > **注意**:响应中的 `envConfig` 会对敏感字段(密码、API密钥等)进行脱敏处理。 --- ## 4️⃣ 更新工具 ### 接口 ``` PUT /api/user/tools/{tool_id} ``` ### 路径参数 | 参数 | 类型 | 说明 | |-----|------|------| | `tool_id` | string | 工具ID(UUID) | ### 请求参数 | 参数 | 类型 | 必填 | 说明 | |-----|------|:---:|------| | `description` | string | ❌ | 工具描述 | | `is_active` | boolean | ❌ | 是否激活 | | `envConfig` | object | ❌ | 更新环境变量配置 | > **注意**:`template` 字段创建后不可修改。 ### 请求示例 ```json { "description": "更新后的MySQL数据库工具", "envConfig": { "MYSQL_HOST": "mysql-new.example.com", "MYSQL_USER": "admin", "MYSQL_PASSWORD": "newpassword123", "MYSQL_DATABASE": "mydb", "MYSQL_PORT": "3306", "OPENAI_API_KEY": "sk-newkey" } } ``` ### 响应示例 ```json { "success": true, "data": { "id": "d14cd898-e2cf-4150-a7f9-53b962c1c9a2", "name": "my-mysql-tool", "template": "mysql_agent", "updated_at": "2026-01-13T10:00:00Z" }, "message": "工具更新成功" } ``` --- ## 5️⃣ 删除工具 ### 接口 ``` DELETE /api/user/tools/{tool_id} ``` ### 路径参数 | 参数 | 类型 | 说明 | |-----|------|------| | `tool_id` | string | 工具ID(UUID) | ### 响应示例 ```json { "success": true, "data": { "id": "d14cd898-e2cf-4150-a7f9-53b962c1c9a2" }, "message": "工具删除成功" } ``` --- ## 6️⃣ 创建自定义Agent > **核心逻辑**:创建 Agent 时选择已创建的工具,系统自动从工具获取 `template` 和 `envConfig`,调用 Agent Manager 创建对应类型的 Agent。 ### 接口 ``` POST /api/user/custom-agents ``` ### 请求参数 | 参数 | 类型 | 必填 | 默认值 | 说明 | |-----|------|:---:|:---:|------| | `name` | string | ✅ | - | Agent名称(小写字母、数字、连字符,1-63字符) | | `tools` | string[] | ✅ | - | **工具ID列表(第一个工具决定Agent类型和配置)** | | `template` | string | ❌ | 从工具获取 | 模板名称(可选,未指定时从工具获取) | | `frameworkTemplate` | string | ❌ | "MCP" | 框架类型("MCP" \| "A2A" \| "langchain") | | `description` | string | ❌ | - | Agent描述 | | `cpuRequest` | string | ❌ | "100m" | CPU请求量 | | `cpuLimit` | string | ❌ | =cpuRequest | CPU限制量 | | `memoryRequest` | string | ❌ | "128Mi" | 内存请求量 | | `memoryLimit` | string | ❌ | =memoryRequest | 内存限制量 | | `model` | string | ❌ | - | 模型名称(用于注入 LiteLLM 密钥) | | `envConfig` | object | ❌ | {} | 额外环境变量(与工具配置合并,请求中的优先) | | `agentRole` | string | ❌ | - | A2A框架:Agent角色 | | `agentCapabilities` | string[] | ❌ | - | A2A框架:Agent能力列表 | ### 环境变量优先级 环境变量从以下来源合并,后者覆盖前者: 1. 工具的 `env_config` 2. 请求中的 `envConfig` ### 请求示例(基于已创建的工具) ```json { "name": "my-mysql-agent", "tools": ["d14cd898-e2cf-4150-a7f9-53b962c1c9a2"], "description": "我的MySQL数据库Agent", "cpuRequest": "500m", "cpuLimit": "1000m", "memoryRequest": "1Gi", "memoryLimit": "2Gi", "model": "gpt-4" } ``` > 系统自动从工具获取 `template: "mysql_agent"` 和 `envConfig: {MYSQL_HOST, ...}` ### 请求示例(A2A框架) ```json { "name": "my-pgsql-agent", "tools": ["e25de999-f3dg-5261-b8ga-64c073d2d0b3"], "frameworkTemplate": "A2A", "description": "我的PostgreSQL数据分析Agent", "cpuRequest": "1000m", "memoryRequest": "2Gi", "model": "gpt-4", "agentRole": "data_analyzer", "agentCapabilities": ["sql_query", "data_analysis", "report_generation"] } ``` ### 响应参数 | 字段 | 类型 | 说明 | |------|------|------| | `success` | boolean | 请求是否成功 | | `data.name` | string | Agent 名称 | | `data.namespace` | string | Kubernetes 命名空间 | | `data.status` | string | Agent 状态 | | `data.servicePort` | number \| null | 服务端口 | | `data.accessInfo` | object \| null | 访问信息 | | `data.modelInjected` | boolean | 是否注入了模型配置 | | `data.quotaRemaining.cpu` | number | 剩余 CPU(核) | | `data.quotaRemaining.memory` | number | 剩余内存(GB) | | `message` | string | 响应消息 | ### 响应示例 ```json { "success": true, "data": { "name": "my-mysql-agent", "namespace": "ai-agents", "status": "Pending", "servicePort": 8080, "accessInfo": { "endpoints": { "http": "http://my-mysql-agent.ai-agents.svc.cluster.local:8080" } }, "modelInjected": true, "quotaRemaining": { "cpu": 3.5, "memory": 7.0 } }, "message": "自定义 Agent my-mysql-agent 创建成功" } ``` --- ## 7️⃣ 获取用户自定义Agent列表 ### 接口 ``` GET /api/user/custom-agents ``` ### 请求参数 无 ### 响应参数 | 字段 | 类型 | 说明 | |------|------|------| | `success` | boolean | 请求是否成功 | | `data.agents` | array | Agent列表 | | `data.agents[].name` | string | Agent名称 | | `data.agents[].template` | string | 模板名称 | | `data.agents[].status` | string | 状态 | | `data.agents[].cpu` | string | CPU请求量 | | `data.agents[].memory` | string | 内存请求量 | | `data.agents[].startTime` | string \| null | 启动时间 | | `data.agents[].runningSeconds` | number | 运行时长(秒) | ### 响应示例 ```json { "success": true, "data": { "agents": [ { "name": "my-mysql-agent", "template": "mysql_agent", "status": "Running", "cpu": "500m", "memory": "1Gi", "startTime": "2026-01-13T08:00:00Z", "runningSeconds": 3600 } ] } } ``` --- ## 8️⃣ 删除自定义Agent ### 接口 ``` DELETE /api/user/custom-agents/{name} ``` ### 路径参数 | 参数 | 类型 | 说明 | |-----|------|------| | `name` | string | Agent名称 | ### 响应参数 | 字段 | 类型 | 说明 | |------|------|------| | `success` | boolean | 请求是否成功 | | `data.name` | string | 已删除的Agent名称 | | `data.quotaReleased.cpu` | number | 释放的CPU(核) | | `data.quotaReleased.memory` | number | 释放的内存(GB) | | `data.cost` | number | 产生的费用 | | `data.duration` | number | 运行时长(秒) | | `message` | string | 响应消息 | ### 响应示例 ```json { "success": true, "data": { "name": "my-mysql-agent", "quotaReleased": { "cpu": 0.5, "memory": 1.0 }, "cost": 0.05, "duration": 3600 }, "message": "自定义 Agent my-mysql-agent 删除成功,已释放配额" } ``` --- ## ❌ 错误响应 ### 通用格式 ```json { "detail": { "error": "错误代码", "message": "错误信息", "detail": "详细信息(可选)" } } ``` ### 常见错误码 | HTTP状态码 | 错误代码 | 说明 | |-----------|---------|------| | 400 | `invalid_template` | 无效的模板名称 | | 400 | `quota_insufficient` | CPU/内存配额不足 | | 400 | `invalid_tool_id` | 无效的工具ID格式 | | 400 | `missing_template` | 必须指定 template 参数或选择包含模板配置的工具 | | 403 | `no_quota` | 用户没有自定义Agent配额 | | 403 | `no_model_permission` | 没有指定模型的使用权限 | | 404 | `agent_not_found` | Agent不存在或不属于当前用户 | | 404 | `tool_not_found` | 工具不存在 | | 409 | `name_exists` | 工具/Agent名称已存在 | | 500 | `create_agent_failed` | Agent Manager创建失败 | ### 错误示例 ```json { "detail": { "error": "quota_insufficient", "message": "CPU 配额不足。剩余: 0.50 核,请求: 1.00 核" } } ``` --- ## 📊 后端服务调用关系 ``` ┌─────────┐ ┌─────────────┐ ┌───────────────┐ ┌─────────┐ │ 前端 │ ←──→ │ MCP-Server │ ←──→ │ Agent Manager │ ←──→ │ K8s │ └─────────┘ └─────────────┘ └───────────────┘ └─────────┘ │ ↓ ┌─────────┐ │ 数据库 │ │PostgreSQL│ └─────────┘ ``` ### MCP-Server 转发到 Agent Manager 的接口 | 前端接口 | Agent Manager 接口 | |---------|-------------------| | `GET /custom-agents/templates` | `GET /templates/custom` | | `POST /custom-agents` | `POST /agents` | | `GET /custom-agents` | `GET /agents/{name}/status` | | `DELETE /custom-agents/{name}` | `DELETE /agents/{name}` | ### MCP-Server 本地处理的接口 | 接口 | 说明 | |------|------| | `POST /tools/create` | 保存到 Tool 表 | | `GET /tools` | 从 Tool 表查询 | | `PUT /tools/{tool_id}` | 更新 Tool 表 | | `DELETE /tools/{tool_id}` | 从 Tool 表删除 | --- **如有问题,请联系大智开发团队。**