2
0
Просмотр исходного кода

fix(json-render): 统一系统提示格式,默认使用 inline 模式

- 修改 catalog.ts getCatalogPrompt() 添加 mode 参数,默认 'inline'
- 移除 conversation_manager.py 中冗余的 ```json 格式指令
- 解决三向格式冲突问题(api-client vs component-registry vs backend)

问题:component-registry.ts 调用 getCatalogPrompt() 使用默认 standalone 模式,
而后端 BASE_SYSTEM_PROMPT 要求 LLM 用 ```json 代码块包裹组件,
两者与 api-client.ts 的 inline 模式冲突。

解决:统一使用 inline 模式,移除冲突的格式指令。

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Claude AI 2 дней назад
Родитель
Сommit
7d0c9fbe25
2 измененных файлов с 8 добавлено и 50 удалено
  1. 2 48
      backend/conversation_manager.py
  2. 6 2
      frontend-v2/lib/catalog/catalog.ts

+ 2 - 48
backend/conversation_manager.py

@@ -10,23 +10,6 @@ from tool_converter import ToolConverter
 from tool_handler import ToolCallHandler
 
 
-# ========== 默认组件提示(降级方案) ==========
-# 当前端未发送组件列表时使用的默认提示
-DEFAULT_COMPONENTS_PROMPT = """### 可用的 json-render 组件
-
-你可以使用基础组件来展示结构化数据:
-- `card`: 卡片容器
-- `stack`: 布局容器
-- `heading`: 标题 (h1-h6)
-- `text`: 文本内容
-- `button`: 按钮
-- `badge`: 徽章标签
-- `code-block`: 代码块
-- `data-table`: 数据表格
-
-将组件 JSON 包含在 markdown 代码块中返回。
-"""
-
 
 # ========== 基础 System Prompt ==========
 # 不包含组件列表和 MCP 工具说明,由 _build_system_prompt 动态构建
@@ -36,35 +19,6 @@ BASE_SYSTEM_PROMPT = """你是一个 AI 助手,可以通过调用 MCP 工具
 
 {MCP_STATUS}
 
-## 重要:你可以返回 UI 组件
-
-除了普通文本,你还可以返回 **json-render 组件 spec** 来展示更丰富的 UI。组件 spec 是一个 JSON 对象,前端会自动渲染成 UI 组件。
-
-### 组件格式
-
-返回组件时,使用以下 JSON 格式(在你的回复中包裹在 ```json 中):
-
-```json
-{
-  "type": "组件类型",
-  "其他属性": "..."
-}
-```
-
-### 使用指南
-
-1. **调用工具后,优先使用对应组件展示结果**
-   - 根据工具返回的数据类型选择合适的组件
-   - 组件必须放在代码块中返回
-
-2. **你可以混合文本和组件**
-   - 先用文本解释结果
-   - 然后用组件展示数据
-
-3. **给出操作建议时使用按钮组件**
-   - 用户查看列表后,建议"下一页"、"筛选"等操作
-   - 使用 `button` 或 `suggestion-buttons` 组件
-
 {MCP_TOOLS_GUIDE}
 """
 
@@ -141,7 +95,7 @@ class ConversationManager:
         self.enabled_mcp_list = enabled_mcp_list  # 前端传递的已启用 MCP 列表
 
         # 组件提示词(由前端动态提供)
-        self.components_prompt = components_prompt or DEFAULT_COMPONENTS_PROMPT
+        self.components_prompt = components_prompt  # 前端必须提供,无 fallback
 
         # 构建完整的系统提示词
         self.system_prompt = self._build_system_prompt()
@@ -149,7 +103,7 @@ class ConversationManager:
         # DEBUG: 打印接收到的 token 和启用列表
         print(f"[DEBUG ConversationManager.__init__] mcp_tokens keys: {list(self.mcp_tokens.keys())}")
         print(f"[DEBUG ConversationManager.__init__] enabled_mcp_list: {self.enabled_mcp_list}")
-        print(f"[DEBUG ConversationManager.__init__] Using dynamic components: {components_prompt is not None}")
+        print(f"[DEBUG ConversationManager.__init__] components_prompt length: {len(components_prompt) if components_prompt else 0} chars")
         for k, v in self.mcp_tokens.items():
             print(f"[DEBUG ConversationManager.__init__]   {k}: {v[:30] if v else 'None'}...")
 

+ 6 - 2
frontend-v2/lib/catalog/catalog.ts

@@ -232,6 +232,10 @@ export default catalog;
 export { schema };
 
 // 兼容旧的导出
-export function getCatalogPrompt(): string {
-  return catalog.prompt();
+export interface GetCatalogPromptOptions {
+  mode?: 'standalone' | 'inline';
+}
+
+export function getCatalogPrompt(options?: GetCatalogPromptOptions): string {
+  return catalog.prompt({ mode: options?.mode ?? 'inline' });
 }