diff --git a/backend/python/app/platform_knowledge.py b/backend/python/app/platform_knowledge.py index 3ec588b..25df381 100644 --- a/backend/python/app/platform_knowledge.py +++ b/backend/python/app/platform_knowledge.py @@ -38,7 +38,7 @@ PLATFORM_KNOWLEDGE = """# 七虎AI平台能力全览 ## 5. IM Bot(微信集成) - **个人微信Bot**: 通过iLink官方接口接入,扫码绑定,微信内直接AI对话 -- **企业微信/飞书/QQ/悟空IM**: Webhook框架已就绪,支持自定义机器人 +- **企业微信/飞书/QQ/悟空IM**: Webhook框架已绪,支持自定义机器人 - **统一会话管理**: 微信消息并入平台AI聊天,统一历史管理 ## 6. 资源中心 @@ -97,25 +97,62 @@ def get_platform_knowledge(db=None, user_id=None) -> str: apps = ( db.query(MarketApp) .filter(MarketApp.source == "official", MarketApp.status == "published") - .order_by(MarketApp.capability, MarketApp.name) + .order_by(MarketApp.capability, MarketApp.type, MarketApp.name) .all() ) if not apps: return PLATFORM_KNOWLEDGE - lines = [ - "", - "## 平台已上线技能(官方,优先推荐)", - "以下为平台当前已发布上线的技能/应用,回答用户相关问题时**优先推荐使用**这些平台能力:", - ] + # 按类型分组统计 + type_count = {} + for a in apps: + t = getattr(a, "type", None) or "skill" + type_count[t] = type_count.get(t, 0) + 1 + type_brief = ", ".join([f"{({'skill':'技能','agent':'Agent','mcp':'MCP应用','mcp_tool':'MCP工具'}.get(k,k))} {v}" for k, v in sorted(type_count.items())]) + + # 按能力(capability)分组 + from collections import OrderedDict + by_cap = OrderedDict() for a in apps: - name = getattr(a, "name", None) or "未命名" cap = getattr(a, "capability", None) or getattr(a, "category", None) or "通用" - desc = (getattr(a, "description", "") or "").strip().replace("\n", " ") - if len(desc) > 60: - desc = desc[:60] + "…" - lines.append(f"- **{name}**({cap}): {desc}") - return PLATFORM_KNOWLEDGE + "\n" + "\n".join(lines) + by_cap.setdefault(cap, []).append(a) + + # 强制完整性说明(关键变更) + lines = [ + "# 📦 平台已上线能力清单(实时同步自数据库,可放心信任此清单)", + "", + f"**总数:{len(apps)} 个已上线能力**({type_brief})", + "", + "## ⚠️ 强制完整性指令", + "当用户询问以下任何一类问题时,**必须输出下方全部内容**:", + '- "平台有哪些技能/应用/MCP"', + '- "全部技能" / "列一下技能" / "技能清单"', + '- "有什么 Skills" / "支持哪些 Skills"', + '- "列举所有" / "每个都列出来"', + "", + "**绝对不允许**精简、抽样、挑代表性的几个、或改写为综述类叙述。**逐条输出下方每一项**,可以按类别分组展示,但不可省略任何一条。", + "", + ] + + # 按能力分组渲染 + type_emoji = {"skill": "🛠", "agent": "🤖", "mcp": "🔌", "mcp_tool": "🔧"} + for cap in by_cap.keys(): + cap_apps = by_cap[cap] + lines.append(f"## 【{cap}】- {len(cap_apps)} 个") + for a in cap_apps: + name = getattr(a, "name", None) or "未命名" + desc = (getattr(a, "description", "") or "").strip().replace("\n", " ") + # 描述长度提升到 100 字,给出更可识别的简介 + if len(desc) > 100: + desc = desc[:100] + "…" + emoji = type_emoji.get(getattr(a, "type", "skill"), "📦") + lines.append(f"- {emoji} **{name}**: {desc}") + lines.append("") + + dynamic_section = "\n".join(lines) + + # 关键:动态能力清单放在最前面,让 AI 优先处理 + return dynamic_section + "\n\n---\n\n# 平台静态文档\n\n" + PLATFORM_KNOWLEDGE except Exception as e: logger.warning(f"[platform_knowledge] 动态构建失败,回退静态知识库: {e}") return PLATFORM_KNOWLEDGE