qwen_agent/.features/skill/MEMORY.md
2026-05-20 14:54:07 +08:00

154 lines
6.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# Skill 功能
> 负责范围:技能包管理服务 - 核心实现
<<<<<<< Updated upstream
> 最后更新2026-04-20
=======
> 最后更新2026-05-20
>>>>>>> Stashed changes
## 当前状态
Skill 系统支持两种来源:官方 skills (`./skills/`) 和用户 skills (`projects/uploads/{bot_id}/skills/`)。支持 Hook 系统和 MCP 服务器配置,通过 SKILL.md 或 plugin.json 定义元数据。
<<<<<<< Updated upstream
=======
MCP UI skill 已按 MCP Apps 模式改造工具返回数据静态 HTML App host 加载后通过 postMessage 接收数据渲染
目前已新增一批** `SKILL.md` 型业务 skill MVP**用于研究摘要报告和情报编排底层文件处理与外部检索能力继续复用既有 skill
>>>>>>> Stashed changes
## 核心文件
- `routes/skill_manager.py` - Skill 上传/删除/列表 API
- `agent/plugin_hook_loader.py` - Hook 系统实现
- `agent/deep_assistant.py` - `CustomSkillsMiddleware`
- `agent/prompt_loader.py` - PrePrompt hooks + MCP 配置合并
- `routes/mcp_resources.py` - MCP App 静态 HTML resource REST 入口
- `skills/` - 官方 skills 目录
- `skills_developing/` - 开发中 skills
## 最近重要事项
- 2026-05-20: `mcp-ui``data-dashboard` 改为 MCP Apps 标准模式App HTML 放在 skill 的 `apps/` 目录,由 host 加载后 postMessage 数据
- 2026-04-20: 为 `rag-retrieve` 新增 `retrieval-policy-forbidden-self-knowledge.md`,禁止知识问答场景使用模型自身知识补全答案,要求严格基于检索证据作答
- 2026-04-19: 环境变量 `SKILLS_SUBDIR` 重命名为 `PROJECT_NAME`,用于选择 `skills/{PROJECT_NAME}``skills/autoload/{PROJECT_NAME}` 目录
- 2026-04-19: `create_robot_project` 的 autoload 去重和 stale 清理补强autoload 目录也纳入 managed 清理,避免 `rag-retrieve-only` 场景下旧的 `rag-retrieve` 残留
- 2026-04-18: `/api/v1/skill/list` 的官方库改为同时读取 `skills/common``skills/{PROJECT_NAME}`,并按目录顺序去重
- 2026-04-18: `_extract_skills_to_robot` 改为通过环境变量 `PROJECT_NAME` 选择官方 skills 子目录,默认使用 `skills/common`
- 2025-02-11: 初始化 skill 功能 memory
## Gotchas开发必读
<<<<<<< Updated upstream
=======
- MCP App resource REST 读取路径是 `projects/robot/{bot_id}/skills/{server_name}/apps/{resource_name}.html`前端 bot_id 应由 `ChatView` 从当前 bot 传给 `ChatMessage`不要在子组件里重新调用 `useBotManager()`
- `langchain-mcp-adapters` 会丢失 `EmbeddedResource` uri/_metaMCP App payload 需作为 text JSON 传递给前端识别
- `SKILL.md` 型业务 skill 适合先承载 workflow输入模板输出模板需要稳定文件产出或自动化时再补 `scripts/`
- 新业务 skill 应复用既有基础能力 skill `baidu-search`、`xlsx`、`docx`、`pdf`、`schedule-job`、`imap-smtp-email`避免重复定义底层工具能力
- 新增脚本优先采用 `Python + argparse + JSON stdout` `argv[1] JSON` 更适合自动化链路
- `auto-daily-summary` 需要特别注意中文分句action 边界截断risk 窗口裁剪否则容易把整句/整段吞进去
- `competitor-news-intel` payload 校验应按命令拆分collect/analyze/run不要共用一套最小校验
- `competitor-news-intel` `collect/run` 依赖 `BAIDU_API_KEY`无该环境变量时应返回稳定错误 JSON不要静默降级
>>>>>>> Stashed changes
- ⚠️ `create_robot_project` 的 autoload 去重是“包含匹配”,只要传入的 skill 字符串里包含 autoload skill 名,就不会重复自动加载
- ⚠️ `_extract_skills_to_robot` 只会从 `skills/{PROJECT_NAME}` 读取官方 skills默认是 `common`
- ⚠️ 执行脚本必须使用绝对路径
- ⚠️ MCP 配置优先级Skill MCP > 默认 MCP > 用户参数
- ⚠️ 上传大小限制50MBZIP解压后最大 500MB
- ⚠️ 压缩比例检查:最大 100:1防止 zip 炸弹)
- ⚠️ 符号链接检查:禁止解压包含符号链接的文件
## Skill 目录结构
```
skill-name/
├── SKILL.md # 核心指令文档(必需)
├── skill.yaml # 元数据配置(可选)
├── .claude-plugin/
│ └── plugin.json # Hook 和 MCP 配置(可选)
└── scripts/ # 可执行脚本(可选)
└── script.py
```
## Hook 系统
| Hook 类型 | 执行时机 | 用途 |
|-----------|---------|------|
| `PrePrompt` | system_prompt 加载时 | 动态注入用户上下文 |
| `PostAgent` | agent 执行后 | 处理响应结果 |
| `PreSave` | 保存消息前 | 内容过滤/修改 |
## API 接口
| 端点 | 方法 | 功能 |
|------|------|------|
| `GET /api/v1/skill/list` | - | 返回官方 + 用户 skills |
| `POST /api/v1/skill/upload` | - | ZIP 上传,解压到用户目录 |
| `DELETE /api/v1/skill/remove` | - | 删除用户 skill |
## 内置 Skills
| Skill 名称 | 功能描述 |
|-----------|---------|
| `excel-analysis` | Excel 数据分析、透视表、图表 |
| `managing-scripts` | 管理可复用脚本库 |
| `rag-retrieve` | RAG 知识库检索 |
| `jina-ai` | Jina AI Reader/Search |
| `user-context-loader` | Hook 机制示例 |
## plugin.json 格式
```json
{
"name": "skill-name",
"description": "描述",
"hooks": {
"PrePrompt": [{"type": "command", "command": "python hooks/pre_prompt.py"}],
"PostAgent": [...],
"PreSave": [...]
},
"mcpServers": {
"server-name": {
"command": "...",
"args": [...]
}
}
}
```
## Skill 加载优先级
1. Skill MCP 配置
2. 用户传入参数(覆盖已有同名配置)
## 安全措施
- ZipSlip 防护:检查解压路径
- 路径遍历防护:验证 `bot_id``skill_name` 格式
- 大小限制:上传 50MB解压后 500MB
- 压缩比限制:最大 100:1
## 设计原则
- **渐进式加载**:按需加载,避免一次性读取所有
- **绝对路径优先**:执行脚本必须使用绝对路径
- **通用化设计**:脚本应参数化,解决一类问题
- **安全优先**:完整的上传验证链
## 配置项
```bash
SKILLS_DIR=./skills # 官方 skills 目录
BACKEND_HOST=xxx # RAG API 主机
MASTERKEY=xxx # 认证密钥
```
## 索引
- 设计决策:`decisions/`
- 变更历史:`changelog/`
- 相关文档:`docs/`