From 4e37ce06e0cd4b0b36c77d331ad380280d222a4e Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Fri, 5 Jun 2026 22:54:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E5=86=85=E7=BD=AE=20?= =?UTF-8?q?MySQL=20=E6=8A=A5=E8=A1=A8=20Skill?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yuxi/agents/skills/buildin/__init__.py | 15 ++--- .../skills/buildin/deep-reporter/SKILL.md | 62 ------------------- .../{reporter => mysql-reporter}/SKILL.md | 9 +-- .../test/unit/services/test_skill_service.py | 28 +++++---- docs/develop-guides/roadmap.md | 1 + 5 files changed, 26 insertions(+), 89 deletions(-) delete mode 100644 backend/package/yuxi/agents/skills/buildin/deep-reporter/SKILL.md rename backend/package/yuxi/agents/skills/buildin/{reporter => mysql-reporter}/SKILL.md (61%) diff --git a/backend/package/yuxi/agents/skills/buildin/__init__.py b/backend/package/yuxi/agents/skills/buildin/__init__.py index e05a69a1..a0d5b838 100644 --- a/backend/package/yuxi/agents/skills/buildin/__init__.py +++ b/backend/package/yuxi/agents/skills/buildin/__init__.py @@ -28,13 +28,6 @@ BUILTIN_SKILLS: list[BuiltinSkillSpec] = [ version="2026.06.02", tool_dependencies=("present_artifacts",), ), - BuiltinSkillSpec( - slug="deep-reporter", - source_dir=_SKILLS_ROOT / "deep-reporter", - description="指导生成科研报告、行业调研和其他需要深度分析的结构化长报告。", - version="2026.03.28", - tool_dependencies=["tavily_search"], - ), BuiltinSkillSpec( slug="deep-research", source_dir=_SKILLS_ROOT / "deep-research", @@ -43,10 +36,10 @@ BUILTIN_SKILLS: list[BuiltinSkillSpec] = [ tool_dependencies=("tavily_search",), ), BuiltinSkillSpec( - slug="reporter", - source_dir=_SKILLS_ROOT / "reporter", - description="生成 SQL 查询报表并生成可视化图表。", - version="2026.03.28", + slug="mysql-reporter", + source_dir=_SKILLS_ROOT / "mysql-reporter", + description="生成 MySQL 查询报表并生成可视化图表。", + version="2026.06.05", tool_dependencies=[t["name"] for t in get_tool_info(get_mysql_tools())], mcp_dependencies=("mcp-server-chart",), ), diff --git a/backend/package/yuxi/agents/skills/buildin/deep-reporter/SKILL.md b/backend/package/yuxi/agents/skills/buildin/deep-reporter/SKILL.md deleted file mode 100644 index 1c991ee6..00000000 --- a/backend/package/yuxi/agents/skills/buildin/deep-reporter/SKILL.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -name: deep-reporter -description: "指导生成科研报告、行业调研、技术分析等需要深度研究的长篇报告。当任务目标是形成结构化、可引用、具有分析深度的正式报告时使用此技能。" ---- - -# 深度报告技能 - -当用户要求产出科研报告、课题综述、行业研究、技术选型分析、竞争对比、专题调研或其他正式长报告时,使用此技能组织研究与写作过程。 - -## 适用场景 - -- 科研论文综述、研究进展梳理、方法比较 -- 技术报告、方案评估、架构选型分析 -- 行业研究、竞品分析、政策与市场调研 -- 基于用户附件、知识库、网页资料整理深度报告 - -## 操作流程 - -1. 明确报告目标、读者对象、范围边界、输出语言与交付形式 -2. 若问题仍然模糊,先向用户补充确认关键范围,再开始研究 -3. 优先从用户提供的材料、知识库、可用工具检索结果中收集证据,必要时再补充外部资料 -4. 先整理报告提纲,再分章节归纳事实、方法、数据、观点与局限 -5. 在正式写作前检查证据是否足够支撑结论,避免只堆砌材料 -6. 输出完整报告,包含清晰章节、分析结论、引用来源,必要时附表格或图片 - -## 报告要求 - -- 报告语言必须与用户提问语言一致 -- 优先使用正式、克制、可复核的书面表达,不要口语化 -- 必须围绕“问题定义 -> 证据整理 -> 分析比较 -> 结论建议”组织内容 -- 章节要完整,避免只有结论没有论证,或只有资料堆积没有分析 -- 当信息不足时,应明确指出证据缺口与不确定性,不要臆断 -- 当用户要求“科研报告”时,应重点覆盖研究背景、问题定义、相关工作/现状、方法或方案比较、实验或案例证据、局限性、结论与后续方向 -- 当用户要求“深度报告”但未限定类型时,应根据主题自适应组织章节,不必强行套科研论文结构 - -## 推荐结构 - -可根据任务类型调整,但通常应包含以下内容中的大部分: - -1. 标题与摘要 -2. 背景与问题定义 -3. 研究范围、对象与评估维度 -4. 关键事实、数据与资料整理 -5. 方法、方案、产品或观点的分项分析 -6. 横向比较与优劣权衡 -7. 风险、限制与不确定性 -8. 结论 -9. 建议或下一步行动 -10. 来源 - -## 引用规范 - -- 报告中的关键结论、数据、图表、观点应绑定来源 -- 使用 `[标题](URL)` 或清晰可追溯的文件路径引用材料 -- 在文末单独列出“来源”章节,汇总所有实际引用过的资料 -- 若引用用户附件或知识库文件,应标明对应文件名或路径 - -## 输出约束 - -- 最终结果应直接是一份可交付的报告,而不是“我准备怎么写” -- 不要暴露中间推理过程,不要把待办列表原样输出成正文 -- 除非用户明确要求,一般不要输出原始检索日志、原始笔记或未经整理的大段摘录 diff --git a/backend/package/yuxi/agents/skills/buildin/reporter/SKILL.md b/backend/package/yuxi/agents/skills/buildin/mysql-reporter/SKILL.md similarity index 61% rename from backend/package/yuxi/agents/skills/buildin/reporter/SKILL.md rename to backend/package/yuxi/agents/skills/buildin/mysql-reporter/SKILL.md index 9606faa1..1980af96 100644 --- a/backend/package/yuxi/agents/skills/buildin/reporter/SKILL.md +++ b/backend/package/yuxi/agents/skills/buildin/mysql-reporter/SKILL.md @@ -1,11 +1,12 @@ --- -name: reporter -description: "生成 SQL 查询报表并生成可视化图表。当用户需要查询数据库并以报表形式展示结果时使用此技能,包括:统计销售数据、分析用户行为、生成业务报表、查询业务指标等。" +name: mysql reporter +slug: mysql-reporter +description: "生成 MySQL 查询报表并生成可视化图表。当用户需要查询 MySQL 数据库并以报表形式展示结果时使用此技能,包括:统计销售数据、分析用户行为、生成业务报表、查询业务指标等。" --- -# SQL 报表技能 +# MySQL 报表技能 -根据用户的指令,使用数据库工具和图表绘制工具,构建 SQL 查询报告。 +根据用户的指令,使用 MySQL 数据库工具和图表绘制工具,构建 SQL 查询报告。 ## 操作流程 diff --git a/backend/test/unit/services/test_skill_service.py b/backend/test/unit/services/test_skill_service.py index 875c56e4..8fd1a863 100644 --- a/backend/test/unit/services/test_skill_service.py +++ b/backend/test/unit/services/test_skill_service.py @@ -165,9 +165,7 @@ async def test_runtime_access_still_excludes_disabled_shared_skill(monkeypatch: @pytest.mark.asyncio -async def test_normal_user_skill_upload_draft_defaults_to_user_share( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -): +async def test_normal_user_skill_upload_draft_defaults_to_user_share(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): monkeypatch.setattr(svc.sys_config, "save_dir", str(tmp_path)) class FakeRepo: @@ -280,6 +278,18 @@ def test_image_gen_builtin_skill_spec(): assert (image_gen["source_dir"] / "SKILL.md").exists() +def test_mysql_reporter_builtin_skill_spec_replaces_reporter_and_deep_reporter(): + specs = {spec["slug"]: spec for spec in svc.list_builtin_skill_specs()} + + assert "reporter" not in specs + assert "deep-reporter" not in specs + assert "mysql-reporter" in specs + mysql_reporter = specs["mysql-reporter"] + assert mysql_reporter["name"] == "mysql reporter" + assert mysql_reporter["mcp_dependencies"] == ["mcp-server-chart"] + assert (mysql_reporter["source_dir"] / "SKILL.md").exists() + + def test_is_valid_skill_slug(): # Test valid slugs assert svc.is_valid_skill_slug("demo-skill") is True @@ -412,9 +422,7 @@ async def test_skill_upload_prepare_confirm_rewrites_conflicting_name(tmp_path: @pytest.mark.asyncio -async def test_skill_zip_import_uses_skill_md_name_not_zip_or_root_dir( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -): +async def test_skill_zip_import_uses_skill_md_name_not_zip_or_root_dir(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): monkeypatch.setattr(svc.sys_config, "save_dir", str(tmp_path)) class FakeRepo: @@ -435,9 +443,7 @@ async def test_skill_zip_import_uses_skill_md_name_not_zip_or_root_dir( zip_bytes = _build_zip( { - "Bad--Archive-Name/SKILL.md": ( - "---\nname: valid-skill\ndescription: this is valid\n---\n# Valid\n" - ), + "Bad--Archive-Name/SKILL.md": ("---\nname: valid-skill\ndescription: this is valid\n---\n# Valid\n"), "Bad--Archive-Name/prompts/system.md": "Use valid skill metadata.", } ) @@ -481,9 +487,7 @@ async def test_skill_zip_import_validates_skill_md_name_not_zip_filename( zip_bytes = _build_zip( { - "valid-archive/SKILL.md": ( - "---\nname: invalid--skill\ndescription: invalid name\n---\n# Invalid\n" - ), + "valid-archive/SKILL.md": ("---\nname: invalid--skill\ndescription: invalid name\n---\n# Invalid\n"), } ) diff --git a/docs/develop-guides/roadmap.md b/docs/develop-guides/roadmap.md index 3d0ec286..ab1ff217 100644 --- a/docs/develop-guides/roadmap.md +++ b/docs/develop-guides/roadmap.md @@ -41,6 +41,7 @@ - 收敛 MCP 创建与编辑入口:前端移除整段配置文本入口和模式切换器,仅保留表单字段提交;后端 MCP 创建/更新请求拒绝额外配置字段,避免绕过表单约束。 - 调整内置 MCP 默认项:移除 `sequentialthinking` 的系统内置同步,启动同步时清理历史系统内置记录,保留用户手动创建的同名 MCP。 - 图片生成能力迁移为 Skill:Qwen-Image 从内置 Python 生成工具迁移到内置 Skill `image-gen`,模型调用与图片下载在 Agent 沙盒中完成,生成结果保存到 outputs 并通过 `present_artifacts` 展示,为多图片生成模型接入复用同一产物展示链路。 +- 调整内置 Skills:`reporter` 改名为 `mysql-reporter`(展示名 `mysql reporter`),并移除内置 `deep-reporter`。 - 降低知识库路由与工具模块复杂度:示例问题生成迁移到知识库 utils,文件上传统一 100 MB 限制,URL 预处理入库路径与旧 `content_type=url` 行为收敛,并修复 uid、导出 MIME 与异常透传等路由问题。 - 重构智能体配置语义:用户可见的 `AgentConfig` 收敛为数据库持久化的一级 `Agent`,内置 Python Agent 改为智能体后端;新增 `/api/agent` 管理与运行接口,聊天、运行任务、恢复审批和文件预览均从线程绑定的 Agent 解析运行时上下文,前端只提交 `agent_id`,并在模型配置页新增“智能体”管理页签。 - 删除 Upload 与 LightRAG 图谱/知识库能力:知识库类型收敛为 Milvus 与 Dify,只保留 Milvus 知识库内图谱构建/展示/检索,移除独立 `/graph` 页面和默认上传图谱工具。