qwen_agent/.features/skill/changelog/2026-Q2.md
github-actions[bot] 2205d830e1
chore(.features): sync feature memory (auto) (#43)
Generated by sparticle-toolkit feature-memory-sync

Co-authored-by: Denya0529 <217564326+Denya0529@users.noreply.github.com>
2026-05-29 17:13:19 +00:00

400 lines
19 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-Q2 Skill Changelog
按时间倒序记录本季度的重要变更。
---
## 2026-05-26: skill `category` 字段全面接入
**类型**:新功能
**背景**skill 数量越来越多common / developing / onprem / support / linggan / autoload 各路径下数十个),列表 API 需要前端能按类别分组展示,元数据层面缺少 `category` 字段。
**改动**
- `routes/skill_manager.py`
- `SkillItem` model 新增 `category: str = "other"`
- `SkillValidationResult` dataclass 新增可选 `category: Optional[str]`
- `parse_plugin_json` 解析 `plugin_config.get('category')``parse_skill_frontmatter` 解析 frontmatter 的 `metadata.get('category')`
- `get_official_skills` 中 fallback 为 `"other"``get_user_skills` 中 fallback 为 `"custom"`
- `get_skill_metadata_legacy``category` 非空时写入返回 dict保持向后兼容
- 批量给 common / developing / onprem / support 多个 skill 的 `.claude-plugin/plugin.json``SKILL.md` frontmatter 添加 `category` 字段。
- `data-dashboard``mcp-ui``category``"Data & Retrieval"` 修正为 `"Interactive UI"`(更贴切 MCP App 的渲染语义)。
**根因**N/A新功能
**影响**
- `GET /api/v1/skill/list` 返回项现在包含 `category` 字段;前端可按 category 维度做分组/筛选。
- skill 元数据约定扩展——新 skill 应在 plugin.json 或 SKILL.md frontmatter 中写明 `category`,否则会落到 `"other"` / `"custom"` 兜底。
- `plugin.json.category``SKILL.md.category` 同时存在时以前者为准(`get_skill_metadata` 优先 plugin.json
**相关文件**
- `routes/skill_manager.py`
- `skills/common/data-dashboard/.claude-plugin/plugin.json`
- `skills/common/mcp-ui/.claude-plugin/plugin.json`
- 以及一批 `skills/{common,developing,onprem,support}/*/SKILL.md``.claude-plugin/plugin.json`
**Commit/PR**`203dcf4`, `3ada55a`, `9658588`
---
## 2026-05-26: developing 分支批量新增多类 skill
**类型**:新功能
**背景**[待补充]——经 developing→staging 合并集中落地一批新 skill 与 linggan 系列 skill 回归。
**改动**
- 新增 `skills/developing/ai-ppt-generator/`:调用百度 AI 生成 PPT按 topic 自动选模板(商务/科技/教育/创意/中国风等);`category: Document Processing`。
- 新增 `skills/developing/nfc-medicine-lookup/`:通过 NFC 芯片 ID 或药品名称查询药品信息,面向老年用户的语音助手交互口径;`category: Developer Tools`。
- 新增 `skills/developing/ppt-outline/`PPT 大纲与独立 HTML 演示文稿生成dark/light/tech/minimal 四种风格);`category: Document Processing`。
- 新增 `skills/developing/z-card-image/`:生成配图、封面图、卡片图、社媒帖子分享图等;依赖 `python3` + `google-chrome`
- `skills/developing/static-hosting/SKILL.md` 由 1 行说明扩展为完整 80 行 skill同时一批已有 SKILL.md / plugin.json 补 `category`
- `skills/linggan/*` 系列 skillbaidu-search / bot-self-modifier / caiyun-weather / competitor-news-intel / contract-document-generator / financial-report-generator / market-academic-insight / ragflow-loader / sales-decision-report / seedream / static-hosting / static-site-deploy / voice-notification / weather-china经合并回归 staging。
**根因**N/A
**影响**
- developing skill 池扩张约 5 个新业务 skilllinggan 系列重新出现在 staging。
- 新 skill 多为 SKILL.md 型业务 skill符合"workflow + 模板"的纯 markdown 模式;其中 `ai-ppt-generator`、`z-card-image` 依赖外部 `BAIDU_API_KEY``google-chrome` 二进制。
**相关文件**
- `skills/developing/ai-ppt-generator/SKILL.md`
- `skills/developing/nfc-medicine-lookup/SKILL.md`
- `skills/developing/ppt-outline/SKILL.md`
- `skills/developing/z-card-image/SKILL.md`
- `skills/developing/static-hosting/SKILL.md`
- `skills/linggan/**`(回归)
**Commit/PR**`3ada55a`
---
## 2026-05-23: 新增 ecommerce-storefront skillMCP App 型)+ MCP App 培训文档
**类型**:新功能
**背景**MCP App 模式host 加载静态 HTML + postMessage 传数据)已经在 `mcp-ui`、`data-dashboard` 上跑通,需要一个面向电商场景的样例 skill演示产品浏览 / 选购 / 下单确认这类多步交互的 App 渲染;同时沉淀一份 MCP App 开发指南。
**改动**
- 新增 `skills/developing/ecommerce-storefront/`
- `apps/product-list.html`288 行)与 `apps/order-confirm.html`233 行)两个静态 App。
- `ecommerce_server.py`213 行)作为自带 MCP server`ecommerce_tools.json` 定义工具 schema。
- `hooks/ecommerce_guide.md` + `hooks/pre_prompt.py` 注入 skill 使用指引到 system prompt。
- `mcp_common.py`252 行)复用 MCP 通用工具基类。
- `.claude-plugin/plugin.json` 配置 PrePrompt hook 与 stdio MCP server`category: Developer Tools`。
- 新增 `docs/mcp-app-training.md`(约 1063 行MCP App 模式的开发培训材料。
**根因**N/A
**影响**
- developing skill 池新增一个 MCP App 型 skill体例对齐 `mcp-ui` / `data-dashboard`
- MCP App 开发者有完整培训材料可参考。
**相关文件**
- `skills/developing/ecommerce-storefront/**`
- `docs/mcp-app-training.md`
**Commit/PR**`9d001c8`
---
## 2026-05-21: Daytona 沙箱注入 shell_env 到 BASH_ENV
**类型**:新功能
**背景**Daytona 沙箱内的 skill 脚本需要能读取 `ASSISTANT_ID` / `USER_IDENTIFIER` / `TRACE_ID` 等运行时上下文,但宿主 process env 无法直接透传到沙箱里。
**改动**
- `agent/deep_assistant.py` `init_agent`:当 `sandbox is not None and sandbox_type == "daytona"` 时,组装 `_shell_env` 字典(`ASSISTANT_ID` / `USER_IDENTIFIER` / `TRACE_ID` / `ENABLE_SELF_KNOWLEDGE` 加上 `config.shell_env`),构造 `cd {REMOTE_WORKSPACE_ROOT}\n` + `export VAR="..."` 行,通过 `sandbox.execute("cat > $REMOTE_BASH_ENV_PATH << 'ENVEOF' ... ENVEOF")` 写入沙箱内。
- `utils/daytona_sync.py` 提供常量 `REMOTE_BASH_ENV_PATH` / `REMOTE_WORKSPACE_ROOT`
- `AgentConfig` 增加 `shell_env: Optional[Dict[str, str]]`(调用方可追加自定义 env
**根因**N/A
**影响**
- 沙箱内通过 bash 启动的 skill 脚本可以 `os.environ.get("ASSISTANT_ID")` 等读到运行时上下文。
- 仅 daytona 沙箱模式生效;本地或非 bash 启动的进程不会收到 `BASH_ENV` 注入的变量。
- 扩展注入项(新增固定环境变量)需要直接改 `init_agent` 里的 `_shell_env` 字典。
**相关文件**
- `agent/deep_assistant.py`
- `utils/daytona_sync.py`
**Commit/PR**`776acc2`
---
## 2026-05-12: 批量精修 retrieval policy 文案
**类型**:内容调整
**背景**[待补充]
**改动**
- `be96f24`: 跨 6 个 skill 变体调整 `retrieval-policy-forbidden-self-knowledge.md` 的措辞onprem / support / autoload-onprem / autoload-onprem-rag-only / autoload-support-rag-only 路径下的版本及一份 `retrieval-policy.md`)。
- `7b4f03d`: 在更广的 10 个文件范围内同步更新 `retrieval-policy.md``retrieval-policy-forbidden-self-knowledge.md` 两套 policy使各 skill 变体的策略口径保持一致。
**根因**N/A非 Bug
**影响**:所有使用 `rag-retrieve` / `rag-retrieve-only` 这两个 hook 的 skill 在策略行为上保持一致;同时影响 onprem 与 support 两个发布分支的部署。
**相关文件**
- `skills/onprem/rag-retrieve/hooks/retrieval-policy*.md`
- `skills/support/rag-retrieve/hooks/retrieval-policy*.md`
- `skills/autoload/onprem/rag-retrieve/hooks/retrieval-policy*.md`
- `skills/autoload/onprem/rag-retrieve-only/hooks/retrieval-policy*.md`
- `skills/autoload/support/rag-retrieve-only/hooks/retrieval-policy*.md`
**Commit/PR**`be96f24`, `7b4f03d`
---
## 2026-05-11: 子 agent (SubAgent) 支持 + pmda-drug-info skill
**类型**:新功能
**背景**:需要让单个 skill 在主 agent 之外承载多个专用子 agent按用途隔离上下文与工具集如 pmda 药品信息场景下的 single-drug / interaction / adverse-event / patient-specific 四个专用 agent
**改动**
- 新增 `agent/subagent_loader.py`:扫描 skill 目录下的 `agents/*.md`,按 YAML frontmatter 的 `name` / `description` / `tools` 字段解析为 `SubAgent` 字典;按 `name` 去重,**后扫描的覆盖先扫描的**last-wins
- `agent/deep_assistant.py``init_agent` 调用 `load_subagents()`,存在则将 `SubAgentMiddleware`(来自 `deepagents.middleware.subagents`)插在 `CustomFilesystemMiddleware` 之后、`AnthropicPromptCachingMiddleware` 之前,顺序匹配 `create_deep_agent`
- 新增 `skills/developing/pmda-drug-info/`:完整 skill 包,包含 `.claude-plugin/plugin.json`、`hooks/pre_prompt.py` + `hooks/pmda-instructions.md`、四个 `agents/*.md`、自带 `pmda_server.py` MCP server + `pmda_tools.json`、`mcp_common.py` 工具基础类。
**根因**N/A
**影响**
- skill 包结构新增约定:`agents/*.md` 目录下的 markdown 文件会被加载为子 agent。
- skill 加载流程在 `init_agent` 内增加一次目录扫描;对没有 `agents/` 的 skill 无影响。
- skill 跨 bot 共享时存在 sub-agent 同名冲突的风险——同名 sub-agent 不会报错,而是被后扫描到的覆盖。
**相关文件**
- `agent/subagent_loader.py`(新)
- `agent/deep_assistant.py`(接线)
- `skills/developing/pmda-drug-info/`(新 skill
**Commit/PR**`5b634bc`
---
## 2026-05-11: pmda-drug-info MCP server 重写为 mock 实现
**类型**:内部改造
**背景**[待补充]
**改动**`skills/developing/pmda-drug-info/pmda_server.py` 大幅替换(+322 / -385保留接口面向 agent 的契约,内部替换为 mock 数据实现。
**根因**N/A
**影响**pmda-drug-info skill 当前不再依赖外部真实 PMDA 数据源,便于开发期联调。
**相关文件**
- `skills/developing/pmda-drug-info/pmda_server.py`
**Commit/PR**`a92096a`
---
## 2026-05-11: retrieval-policy.md 内容更新
**类型**:内容调整
**背景**[待补充]
**改动**:在 onprem / support / autoload-onprem-rag-only / autoload-support-rag-only 四个版本的 `retrieval-policy.md` 上做了同步内容更新。
**根因**N/A
**影响**:与同月 12 日的 policy 批量精修配套,使 rag-retrieve hook 策略保持一致。
**相关文件**
- `skills/onprem/rag-retrieve/hooks/retrieval-policy.md`
- `skills/support/rag-retrieve/hooks/retrieval-policy.md`
- `skills/autoload/onprem/rag-retrieve-only/hooks/retrieval-policy.md`
- `skills/autoload/support/rag-retrieve-only/hooks/retrieval-policy.md`
**Commit/PR**`e6d1698`
---
## 2026-05-08: 通过 MCP `_meta` 透传 trace_id 给 RAG 工具
**类型**:新功能
**背景**:需要把 catalog-agent 的 trace_id 透传给 MCP 端的 `rag_retrieve` / `table_rag_retrieve` 服务,便于跨进程追踪。
**改动**
- 新增 `agent/mcp_trace_meta.py`:通过 `patch_mcp_client_session_trace_meta()``mcp.ClientSession.call_tool` 做一次幂等 monkey-patch调用时若工具名在 `{"rag_retrieve", "table_rag_retrieve"}` 集合内且当前请求上下文有 `trace_id`,则注入到 `kwargs["meta"]["trace_id"]`;并提供 `_call_tool_with_meta_compat` 以兼容旧版 MCP SDK不接受 `meta=` 关键字时退化为手动构造 `CallToolRequestParams._meta`)。
- `agent/deep_assistant.py`:在 `get_tools_from_mcp()` 入口处调用一次补丁安装。
- 同步调整 `skills/onprem/rag-retrieve/rag_retrieve_server.py``skills/support/rag-retrieve/rag_retrieve_server.py`,接收并使用 `_meta.trace_id`
**根因**N/A
**影响**
- `rag_retrieve` / `table_rag_retrieve` 现在在 MCP `_meta` 上必带 `trace_id`(若上下文存在)。
- 全局 monkey-patch 风格 - 只要 `get_tools_from_mcp()` 被调用过一次后,所有 `ClientSession.call_tool` 都会被包装。
**相关文件**
- `agent/mcp_trace_meta.py`(新)
- `agent/deep_assistant.py`
- `skills/onprem/rag-retrieve/rag_retrieve_server.py`
- `skills/support/rag-retrieve/rag_retrieve_server.py`
**Commit/PR**`1f06450`
---
## 2026-05-06: 新增 kfs-answer skill (support 分支)
**类型**:新功能
**背景**[待补充] - 为 support 分支补齐 kfs-answer 能力onprem 分支此前已有同名 skill
**改动**:新增 `skills/support/kfs-answer/`,包括 `SKILL.md``scripts/` 下的 `query.py` / `search.py` / `detail.py` / `query_db.py` / `format_answer.py` / `merge_citations.py` / `_session.py` 共 7 个脚本(约 1809 行)。
**根因**N/A
**影响**support 部署版本获得 kfs-answer 能力。
**相关文件**
- `skills/support/kfs-answer/**`
**Commit/PR**`a9227b8`
---
## 2026-05-06: Daytona 沙箱增量同步漏掉符号链接
**类型**Bug 修复
**背景**dataset 通过符号链接挂载,但增量同步用 `find -type f` 只匹配普通文件,导致 dataset 符号链接没被检测到也没被打包同步到 Daytona 沙箱;并且 `tar.add()` 默认不 dereference打进去的是指向宿主机路径的悬空软链。
**改动**
- `utils/daytona_sync._list_local_changed_files`:同时匹配 file 和 symlink (`-type f -o -type l`)。
- `utils/daytona_sync._tar_workspace_entries``tar.add(dereference=True)`,把软链解引用为实际内容打包。
- `skills/onprem/kfs-answer/SKILL.md``prompt/system_prompt_deep_agent.md`:统一数据集路径用复数形式 `datasets/`
**根因**`find -type f` 与 `tar.add()` 默认行为对符号链接不友好。
**影响**Daytona 模式下 kfs-answer 等依赖 dataset 软链的 skill 可以正常使用沙箱内的数据;提示词与 SKILL.md 内的路径口径统一。
**相关文件**
- `utils/daytona_sync.py`
- `skills/onprem/kfs-answer/SKILL.md`
- `prompt/system_prompt_deep_agent.md`
**Commit/PR**`3c0fa49`
---
## 2026-04-24: PostAgent hooks 非阻塞执行 + 临时停用 ToolOutputLengthMiddleware
**类型**:性能优化 / 临时调整
**背景**:非流式响应路径上 `_execute_post_agent_hooks` 是同步等待,阻塞了响应返回。
**改动**
- `routes/chat.py`:非流式分支将 `await _execute_post_agent_hooks(...)` 改为 `asyncio.create_task(_execute_post_agent_hooks(...))`hook 在后台执行,不阻塞响应。
- `agent/deep_assistant.py`:将 `ToolOutputLengthMiddleware` 整段注释掉(未删除,可恢复)。
- `utils/settings.py`:切换 `DAYTONA_API_KEY` / `DAYTONA_SERVER_URL` 注释行(启用自托管 Daytona注释掉 SaaS 行)。
**根因**N/A性能优化为主
**影响**
- 非流式接口响应不再等待 PostAgent hooks 完成 → hook 中失败/异常**只会被 task 内部的 logger 捕获**,调用方收不到错误反馈。
- 工具输出长度暂时不再被截断,存在超长输出冲爆上下文的风险(中间件已被注释,并未拆除)。
**相关文件**
- `routes/chat.py`
- `agent/deep_assistant.py`
- `utils/settings.py`
**Commit/PR**`45a9494`
---
## 2026-04-23: PrePrompt hook 内容改为模板占位符注入
**类型**:重构
**背景**:原先 PrePrompt hook 的产出文本是在 `system_prompt_default.format(...)` 之后追加在 prompt 末尾hook 内容在 prompt 中的位置固定且偏后,模板对它的可见性差。
**改动**`agent/prompt_loader.load_system_prompt_async`:先执行 `execute_hooks('PrePrompt', config)` 拿到 `hook_content`,然后通过新增的 `{hook_content}` 占位符传入 `system_prompt_default.format(...)`;模板侧 `prompt/system_prompt.md` 增加对应占位符。
**根因**N/A结构化注入更可控
**影响**:编写 PrePrompt hook 的 skill 必须依赖模板里 `{hook_content}` 占位符的位置若使用了未升级的旧模板hook 内容将不再出现在最终 system prompt 中。
**相关文件**
- `agent/prompt_loader.py`
- `prompt/system_prompt.md`
**Commit/PR**`51fbf01`
---
## 2026-04-23: Daytona 沙箱接入
**类型**:新功能
**背景**技能脚本需要在隔离沙箱中执行Daytona避免直接污染宿主机。
**改动**
- `agent/deep_assistant.py`
-`init_agent` 中读取 `DAYTONA_ENABLED` / `DAYTONA_API_KEY` / `DAYTONA_SERVER_URL`,启用时创建 `DaytonaSandbox`;并将 `sandbox` / `sandbox_type` 传到 `create_custom_cli_agent` / `agent.invoke_config`
- 重构为并行加载:`load_system_prompt_async` 与 `load_mcp_settings_async``asyncio.gather` 并行;`get_tools_from_mcp` 与 `asyncio.to_thread(init_daytona_sandbox, ...)` 并行;`init_agent` 现在返回 `(agent, checkpointer, sandbox)`(多了 sandbox
- `enable_skills``skills_sources``"/skills"` 改为 `"/workspace/skills"`(指向沙箱内的路径)。
- `agent/prompt_loader.py``agent_dir_path` 在 `DAYTONA_ENABLED=True` 时改为 `/workspace`,否则保持本地路径。
- `utils/daytona_sync.py` 新增204 行):沙箱与本地 workspace 双向同步。
- `pyproject.toml` / `poetry.lock` / `requirements.txt`:新增 `daytona`、`langchain_daytona` 依赖。
- `utils/settings.py`:新增 `DAYTONA_API_KEY` / `DAYTONA_SERVER_URL` / `DAYTONA_ENABLED` 配置。
**根因**N/A
**影响**
- `init_agent` 返回元组从 2 元素变为 3 元素 (`agent, checkpointer, sandbox`)——**调用方必须同步更新解构**。
- skill 在沙箱模式下的根路径与本地模式不同,所有写死路径的 hook / 脚本需要兼容两种环境。
**相关文件**
- `agent/deep_assistant.py`
- `agent/prompt_loader.py`
- `utils/daytona_sync.py`(新)
- `utils/settings.py`
- `pyproject.toml`, `poetry.lock`, `requirements.txt`
**Commit/PR**`c9e0789`, `8446dab`
---
## 2026-04-22: 新增 rag-retrieve-no-citation 与 novare-context 两个开发中 skill
**类型**:新功能
**背景**[待补充]
**改动**
- `skills/developing/rag-retrieve-no-citation/`:完整 skill 包,含 `.claude-plugin/plugin.json`、`README.md`、`hooks/pre_prompt.py`、`hooks/retrieval-policy.md` 与 `hooks/retrieval-policy-forbidden-self-knowledge.md`、独立 `rag_retrieve_server.py` + `rag_retrieve_tools.json` + `mcp_common.py`
- `skills/developing/novare-context/`:包含 `.claude-plugin/plugin.json`、`README.md`、`hooks/pre_prompt.py`。
**根因**N/A
**影响**:开发中 skill 集合扩张,可作为后续正式版本的母版。
**相关文件**
- `skills/developing/rag-retrieve-no-citation/**`
- `skills/developing/novare-context/**`
**Commit/PR**`7a30e52`
---
### 2026-05-20
- **变更**: `mcp-ui``data-dashboard` 从自定义 `uri + data` 工具协议改为 MCP Apps 模式
- **说明**: 静态 HTML App 放在各 skill 的 `apps/` 目录host 通过 resource URI 加载 iframe再用 postMessage 传递工具数据
- **修复**: 前端 MCP App resource 请求改为由 `ChatView``ChatMessage` 传入当前 botId避免子组件重新创建 bot manager 导致 bot_id 为空
- **作者**: Claude
### 2026-04-20
- **新增**: `skills/autoload/onprem/rag-retrieve/hooks/retrieval-policy-forbidden-self-knowledge.md`
- **说明**: 基于现有 `retrieval-policy.md` 衍生出更严格的检索策略,明确禁止在知识问答场景中使用模型自身知识补全答案,要求回答只能来自检索证据
- **作者**: Claude