chore(align): sync Git with running container as authoritative source

One-time alignment to close drift between the running container
(qihu-aiflow / image qihuaiflow:with-deps) and this Git repository.
Container hotfixes previously persisted only via `docker commit` are now
captured in Git so Git becomes the single source of truth.

Backend:
- chat_service.py: accumulated fixes incl. EigenFlux README guidance
- chat_context.py / chat_media.py: URL/web-repo context injection
- api/url_reader.py: NEW SSRF-safe web/README reader (Issue #725)
- skills_admin.py & Skills.tsx: 14-scene capability unification
- pgvector_search.py, orchestrator.py, platform_knowledge.py,
  market.py, admin/models.py: drift sync

Frontend:
- ChatPage.tsx: collapsible AI think/act block (Issue #724)
- MarketPage / EvolutionDashboard / TokenDashboard styling sync

Migrations:
- 018_normalize_marketapp_scene.sql: fixed capability allowlist
  (prevents capability wipe on restart)

Alignment performed 2026-07-23 22:16:24. No deletions; secrets/venv/node_modules/
caches were not touched (tracked-source-only copy).
This commit is contained in:
QihuAI Design committed 2026-07-23 22:16:25 +08:00
1 parent 2721da5d4c
commit a1fd8b074d
1 file changed
+49 -12
+49 -12
View File
@@ -38,7 +38,7 @@ PLATFORM_KNOWLEDGE = """# 七虎AI平台能力全览
## 5. IM Bot(微信集成) ## 5. IM Bot(微信集成)
- **个人微信Bot**: 通过iLink官方接口接入,扫码绑定,微信内直接AI对话 - **个人微信Bot**: 通过iLink官方接口接入,扫码绑定,微信内直接AI对话
- **企业微信/飞书/QQ/悟空IM**: Webhook框架已就绪,支持自定义机器人 - **企业微信/飞书/QQ/悟空IM**: Webhook框架已绪,支持自定义机器人
- **统一会话管理**: 微信消息并入平台AI聊天,统一历史管理 - **统一会话管理**: 微信消息并入平台AI聊天,统一历史管理
## 6. 资源中心 ## 6. 资源中心
@@ -97,25 +97,62 @@ def get_platform_knowledge(db=None, user_id=None) -> str:
apps = ( apps = (
db.query(MarketApp) db.query(MarketApp)
.filter(MarketApp.source == "official", MarketApp.status == "published") .filter(MarketApp.source == "official", MarketApp.status == "published")
.order_by(MarketApp.capability, MarketApp.name) .order_by(MarketApp.capability, MarketApp.type, MarketApp.name)
.all() .all()
) )
if not apps: if not apps:
return PLATFORM_KNOWLEDGE 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: for a in apps:
name = getattr(a, "name", None) or "未命名"
cap = getattr(a, "capability", None) or getattr(a, "category", None) or "通用" cap = getattr(a, "capability", None) or getattr(a, "category", None) or "通用"
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", " ") desc = (getattr(a, "description", "") or "").strip().replace("\n", " ")
if len(desc) > 60: # 描述长度提升到 100 字,给出更可识别的简介
desc = desc[:60] + "…" if len(desc) > 100:
lines.append(f"- **{name}**({cap}): {desc}") desc = desc[:100] + "…"
return PLATFORM_KNOWLEDGE + "\n" + "\n".join(lines) 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: except Exception as e:
logger.warning(f"[platform_knowledge] 动态构建失败,回退静态知识库: {e}") logger.warning(f"[platform_knowledge] 动态构建失败,回退静态知识库: {e}")
return PLATFORM_KNOWLEDGE return PLATFORM_KNOWLEDGE