|
| 1 | +# MaxKB Skill — 智能体路由与调用 |
| 2 | + |
| 3 | +> 基于 MaxKB 平台的 Skill,供宿主智能体(LLM)查询已发布智能体列表并按名称发起对话,实现多智能体路由分发。 |
| 4 | +
|
| 5 | +--- |
| 6 | + |
| 7 | +## 目录 |
| 8 | + |
| 9 | +- [功能概述](#功能概述) |
| 10 | +- [目录结构](#目录结构) |
| 11 | +- [环境要求](#环境要求) |
| 12 | +- [快速开始](#快速开始) |
| 13 | +- [环境变量](#环境变量) |
| 14 | +- [工具函数说明](#工具函数说明) |
| 15 | + - [list\_agents](#list-agents) |
| 16 | + - [chat\_to\_agent](#chat-to-agent) |
| 17 | +- [推荐调用流程](#推荐调用流程) |
| 18 | +- [API 接口说明](#api-接口说明) |
| 19 | +- [错误处理](#错误处理) |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## 功能概述 |
| 24 | + |
| 25 | +本 Skill 提供两个工具函数,配合宿主智能体的 LLM 完成智能路由与调用: |
| 26 | + |
| 27 | +| 函数 | 说明 | |
| 28 | +|-------------------|---------------------------------------------------------------| |
| 29 | +| `list_agents` | 返回当前工作空间所有**已发布**智能体的名称与描述,供 LLM 选择 | |
| 30 | +| `chat_to_agent` | 按 LLM 指定的智能体名称发起对话,返回该智能体的回答 | |
| 31 | + |
| 32 | +--- |
| 33 | + |
| 34 | +## 目录结构 |
| 35 | + |
| 36 | +``` |
| 37 | +MaxKB-skills/ |
| 38 | +├── .env.example # 环境变量示例(复制为 .env 并填写实际值) |
| 39 | +├── .gitignore |
| 40 | +├── SKILL.md # Skill 快速参考文档 |
| 41 | +└── scripts/ |
| 42 | + └── main.py # Skill 核心实现 |
| 43 | +``` |
| 44 | + |
| 45 | +--- |
| 46 | + |
| 47 | +## 环境要求 |
| 48 | + |
| 49 | +- Python 3.7+ |
| 50 | +- 可访问的 MaxKB 实例(v1.x) |
| 51 | +- (可选)`python-dotenv`:用于自动加载 `.env` 文件 |
| 52 | + |
| 53 | + ```bash |
| 54 | + pip install python-dotenv |
| 55 | + ``` |
| 56 | + |
| 57 | + 若未安装,脚本内置了简单的 `.env` 解析,无需额外安装。 |
| 58 | + |
| 59 | +--- |
| 60 | + |
| 61 | +## 快速开始 |
| 62 | + |
| 63 | +### 1. 配置环境变量 |
| 64 | + |
| 65 | +复制示例文件并填写实际值: |
| 66 | + |
| 67 | +```bash |
| 68 | +cp .env.example .env |
| 69 | +``` |
| 70 | + |
| 71 | +编辑 `.env`: |
| 72 | + |
| 73 | +```env |
| 74 | +MAXKB_DOMAIN=http://127.0.0.1:8080 |
| 75 | +MAXKB_USERNAME=admin |
| 76 | +MAXKB_PASSWORD=admin123 |
| 77 | +MAXKB_WORKSPACE_ID=default |
| 78 | +``` |
| 79 | + |
| 80 | +> **提示**:用户名/密码与 Token 可同时配置,用户名/密码优先级更高。 |
| 81 | +
|
| 82 | +### 2. 列出已发布智能体 |
| 83 | + |
| 84 | +```bash |
| 85 | +python3 scripts/main.py |
| 86 | +``` |
| 87 | + |
| 88 | +输出示例: |
| 89 | + |
| 90 | +```json |
| 91 | +[ |
| 92 | + {"name": "客服助手", "desc": "处理用户常见问题"}, |
| 93 | + {"name": "代码助手", "desc": "辅助编写和审查代码"} |
| 94 | +] |
| 95 | +``` |
| 96 | + |
| 97 | +### 3. 向指定智能体提问 |
| 98 | + |
| 99 | +```bash |
| 100 | +python3 scripts/main.py "Python 里如何读取文件?" "代码助手" |
| 101 | +``` |
| 102 | + |
| 103 | +输出示例: |
| 104 | + |
| 105 | +```json |
| 106 | +{ |
| 107 | + "agent_name": "代码助手", |
| 108 | + "answer": "可以使用内置的 open() 函数来读取文件..." |
| 109 | +} |
| 110 | +``` |
| 111 | + |
| 112 | +--- |
| 113 | + |
| 114 | +## 环境变量 |
| 115 | + |
| 116 | +| 变量 | 说明 | 默认值 | |
| 117 | +|----------------------|-----------------------------------|---------------------------| |
| 118 | +| `MAXKB_DOMAIN` | MaxKB 服务地址 | `http://127.0.0.1:8080` | |
| 119 | +| `MAXKB_TOKEN` | Bearer Token(管理员 API Key) | — | |
| 120 | +| `MAXKB_WORKSPACE_ID` | 工作空间 ID | `default` | |
| 121 | +| `MAXKB_USERNAME` | 登录用户名(优先于 `MAXKB_TOKEN`)| — | |
| 122 | +| `MAXKB_PASSWORD` | 登录密码(优先于 `MAXKB_TOKEN`) | — | |
| 123 | + |
| 124 | +**认证优先级**:若同时配置了 `MAXKB_USERNAME` + `MAXKB_PASSWORD` 和 `MAXKB_TOKEN`,系统将使用用户名/密码登录获取 Token,忽略 `MAXKB_TOKEN`。 |
| 125 | + |
| 126 | +--- |
| 127 | + |
| 128 | +## 工具函数说明 |
| 129 | + |
| 130 | +### list_agents |
| 131 | + |
| 132 | +返回当前工作空间所有已发布智能体的列表,供 LLM 判断选择合适的智能体。 |
| 133 | + |
| 134 | +**函数签名** |
| 135 | + |
| 136 | +```python |
| 137 | +list_agents() -> str |
| 138 | +``` |
| 139 | + |
| 140 | +**返回值**:JSON 字符串,数组中每个元素包含: |
| 141 | + |
| 142 | +| 字段 | 类型 | 说明 | |
| 143 | +|--------|--------|--------------| |
| 144 | +| `name` | string | 智能体名称 | |
| 145 | +| `desc` | string | 智能体描述 | |
| 146 | + |
| 147 | +**返回示例** |
| 148 | + |
| 149 | +```json |
| 150 | +[ |
| 151 | + {"name": "客服助手", "desc": "处理用户常见问题"}, |
| 152 | + {"name": "代码助手", "desc": "辅助编写和审查代码"} |
| 153 | +] |
| 154 | +``` |
| 155 | + |
| 156 | +--- |
| 157 | + |
| 158 | +### chat_to_agent |
| 159 | + |
| 160 | +向指定智能体发起一次对话,返回智能体的回答。 |
| 161 | + |
| 162 | +**函数签名** |
| 163 | + |
| 164 | +```python |
| 165 | +chat_to_agent(question: str, agent_name: str) -> str |
| 166 | +``` |
| 167 | + |
| 168 | +**参数** |
| 169 | + |
| 170 | +| 参数 | 类型 | 说明 | |
| 171 | +|--------------|--------|--------------------------------------------| |
| 172 | +| `question` | string | 用户的问题文本 | |
| 173 | +| `agent_name` | string | 由 LLM 从 `list_agents` 结果中选定的名称 | |
| 174 | + |
| 175 | +**返回值**:JSON 字符串,包含: |
| 176 | + |
| 177 | +| 字段 | 类型 | 说明 | |
| 178 | +|--------------|--------|--------------------| |
| 179 | +| `agent_name` | string | 实际调用的智能体名称 | |
| 180 | +| `answer` | string | 智能体的回答内容 | |
| 181 | + |
| 182 | +**返回示例** |
| 183 | + |
| 184 | +```json |
| 185 | +{ |
| 186 | + "agent_name": "客服助手", |
| 187 | + "answer": "您好,有什么可以帮助您的?" |
| 188 | +} |
| 189 | +``` |
| 190 | + |
| 191 | +--- |
| 192 | + |
| 193 | +## 推荐调用流程 |
| 194 | + |
| 195 | +``` |
| 196 | +用户提问 |
| 197 | + │ |
| 198 | + ▼ |
| 199 | +LLM 调用 list_agents() ← 获取已发布智能体列表 |
| 200 | + │ 返回 [{"name":..., "desc":...}, ...] |
| 201 | + ▼ |
| 202 | +LLM 根据问题内容选出最合适的 agent_name |
| 203 | + │ |
| 204 | + ▼ |
| 205 | +LLM 调用 chat_to_agent(question, agent_name) ← 发起对话 |
| 206 | + │ 返回 {"agent_name":..., "answer":...} |
| 207 | + ▼ |
| 208 | +将 answer 返回给用户 |
| 209 | +``` |
| 210 | + |
| 211 | +--- |
| 212 | + |
| 213 | +## API 接口说明 |
| 214 | + |
| 215 | +脚本内部依次调用以下 MaxKB API: |
| 216 | + |
| 217 | +| 步骤 | 方法 | 路径 | 说明 | |
| 218 | +|------|------|------|------| |
| 219 | +| 1 | POST | `/admin/api/user/login` | 用户名/密码登录,获取 Token | |
| 220 | +| 2 | GET | `/admin/api/workspace/{workspace_id}/application/1/100` | 获取智能体列表 | |
| 221 | +| 3 | GET | `/admin/api/workspace/{workspace_id}/application/{agent_id}/access_token` | 获取匿名访问 Token | |
| 222 | +| 4 | POST | `/chat/api/auth/anonymous` | 创建匿名会话 | |
| 223 | +| 5 | GET | `/chat/api/open` | 初始化对话,获取 chat_id | |
| 224 | +| 6 | POST | `/chat/api/chat_message/{chat_id}` | 发送消息(SSE 流式响应)| |
| 225 | + |
| 226 | +--- |
| 227 | + |
| 228 | +## 错误处理 |
| 229 | + |
| 230 | +| 错误场景 | 行为 | |
| 231 | +|----------------------------|--------------------------------------------| |
| 232 | +| 无已发布智能体 | 抛出 `RuntimeError`,提示工作空间无可用智能体 | |
| 233 | +| 智能体名称不存在 | 抛出 `RuntimeError`,列出所有可用智能体名称 | |
| 234 | +| HTTP 请求失败(4xx/5xx) | 抛出 `RuntimeError`,包含状态码和响应体 | |
| 235 | +| 网络连接失败 | 抛出 `RuntimeError`,包含连接错误信息 | |
| 236 | +| 登录失败 | 抛出 `RuntimeError`,包含登录响应内容 | |
0 commit comments