Procházet zdrojové kódy

add images compaction and update compaction context windows

guantao před 11 hodinami
rodič
revize
4f7e67ae07
98 změnil soubory, kde provedl 1897 přidání a 6359 odebrání
  1. 297 24
      agent/core/runner.py
  2. 178 171
      agent/docs/architecture.md
  3. 25 14
      agent/docs/decisions.md
  4. 5 1
      agent/llm/qwen.py
  5. 10 0
      agent/tools/builtin/feishu/chat_history/chat_关涛.json
  6. 36 2
      agent/tools/builtin/subagent.py
  7. 29 6
      agent/trace/compaction.py
  8. 7 7
      examples/production/config.py
  9. 0 97
      examples/production/examples/production/xiaocong/analysis.json
  10. binární
      examples/production/huahua/features/background_asset/background_bokeh_img2.png
  11. binární
      examples/production/huahua/features/background_asset/background_green_img1.png
  12. binární
      examples/production/huahua/features/background_asset/background_green_img4.png
  13. 0 62
      examples/production/huahua/features/background_asset/mapping.json
  14. binární
      examples/production/huahua/features/character_asset/character_ref_back.png
  15. binární
      examples/production/huahua/features/character_asset/character_ref_img1.png
  16. binární
      examples/production/huahua/features/character_asset/character_ref_kneel.png
  17. binární
      examples/production/huahua/features/character_asset/character_ref_main.png
  18. binární
      examples/production/huahua/features/character_asset/character_ref_side.png
  19. 0 75
      examples/production/huahua/features/character_asset/mapping.json
  20. 0 2
      examples/production/huahua/features/color_scheme/color_scheme.json
  21. 0 150
      examples/production/huahua/features/color_scheme/color_scheme_complete.json
  22. binární
      examples/production/huahua/features/color_scheme/color_scheme_visual.png
  23. binární
      examples/production/huahua/features/color_scheme/color_swatch.png
  24. 0 132
      examples/production/huahua/features/color_scheme/img_1_colors.json
  25. binární
      examples/production/huahua/features/color_scheme/img_1_palette.png
  26. 0 132
      examples/production/huahua/features/color_scheme/img_2_colors.json
  27. binární
      examples/production/huahua/features/color_scheme/img_2_palette.png
  28. 0 132
      examples/production/huahua/features/color_scheme/img_3_colors.json
  29. binární
      examples/production/huahua/features/color_scheme/img_3_palette.png
  30. 0 132
      examples/production/huahua/features/color_scheme/img_4_colors.json
  31. binární
      examples/production/huahua/features/color_scheme/img_4_palette.png
  32. 0 132
      examples/production/huahua/features/color_scheme/img_5_colors.json
  33. binární
      examples/production/huahua/features/color_scheme/img_5_palette.png
  34. 0 56
      examples/production/huahua/features/color_scheme/mapping.json
  35. binární
      examples/production/huahua/features/depth_map/depth_img_1.png
  36. binární
      examples/production/huahua/features/depth_map/depth_img_2.png
  37. binární
      examples/production/huahua/features/depth_map/depth_img_3.png
  38. binární
      examples/production/huahua/features/depth_map/depth_img_4.png
  39. binární
      examples/production/huahua/features/depth_map/depth_img_5.png
  40. 0 79
      examples/production/huahua/features/depth_map/mapping.json
  41. binární
      examples/production/huahua/features/easel_asset/easel_blank_canvas_img4.png
  42. 0 55
      examples/production/huahua/features/easel_asset/mapping.json
  43. binární
      examples/production/huahua/features/edge_map/img_1_canny.png
  44. binární
      examples/production/huahua/features/edge_map/img_2_canny.png
  45. binární
      examples/production/huahua/features/edge_map/img_3_canny.png
  46. binární
      examples/production/huahua/features/edge_map/img_4_canny.png
  47. binární
      examples/production/huahua/features/edge_map/img_5_canny.png
  48. 0 45
      examples/production/huahua/features/edge_map/mapping.json
  49. 0 155
      examples/production/huahua/features/lighting_bokeh/lighting_analysis.json
  50. 0 28
      examples/production/huahua/features/lighting_bokeh/lighting_img_2.json
  51. 0 26
      examples/production/huahua/features/lighting_bokeh/lighting_img_3.json
  52. 0 27
      examples/production/huahua/features/lighting_bokeh/lighting_img_5.json
  53. binární
      examples/production/huahua/features/lighting_bokeh/lighting_visual.png
  54. 0 49
      examples/production/huahua/features/lighting_bokeh/mapping.json
  55. 0 60
      examples/production/huahua/features/palette_asset/mapping.json
  56. binární
      examples/production/huahua/features/palette_asset/palette_impasto_img1_v2.png
  57. binární
      examples/production/huahua/features/pose_skeleton/img_1_openpose.png
  58. binární
      examples/production/huahua/features/pose_skeleton/img_2_openpose.png
  59. binární
      examples/production/huahua/features/pose_skeleton/img_3_openpose.png
  60. binární
      examples/production/huahua/features/pose_skeleton/img_4_openpose.png
  61. 0 87
      examples/production/huahua/features/pose_skeleton/mapping.json
  62. 0 121
      examples/production/huahua/index.md
  63. 3 10
      examples/production/presets.json
  64. 107 53
      examples/production/requirement.prompt
  65. 192 0
      examples/production/research.prompt
  66. 12 14
      examples/production/run.py
  67. 0 45
      examples/production/strategy_research.prompt
  68. 0 128
      examples/production/tool_research.prompt
  69. 11 8
      examples/research/config.py
  70. 0 32
      examples/research/cong/descriptions/制作亮点.md
  71. 0 37
      examples/research/cong/descriptions/制作点.md
  72. 0 679
      examples/research/cong/descriptions/小葱__img_1_制作表.json
  73. 0 415
      examples/research/cong/descriptions/小葱__img_2_制作表.json
  74. 0 414
      examples/research/cong/descriptions/小葱__img_3_制作表.json
  75. 0 405
      examples/research/cong/descriptions/小葱__img_4_制作表.json
  76. 0 19
      examples/research/cong/index.md
  77. 0 523
      examples/research/cong/pipeline.json
  78. 100 0
      examples/research/huahua/analysis.json
  79. 0 0
      examples/research/input/description/创作表.md
  80. 0 68
      examples/research/input/description/制作亮点.md
  81. 0 60
      examples/research/input/description/制作点.md
  82. 0 336
      examples/research/input/description/阿里多多酱__img_1_制作表.json
  83. 0 300
      examples/research/input/description/阿里多多酱__img_2_制作表.json
  84. 0 309
      examples/research/input/description/阿里多多酱__img_3_制作表.json
  85. 0 19
      examples/research/input/index.md
  86. 0 388
      examples/research/input/pipeline.json
  87. 0 0
      examples/research/meme/analysis.json
  88. 57 0
      examples/research/plan.prompt
  89. 9 0
      examples/research/presets.json
  90. 166 0
      examples/research/requirement.prompt
  91. 101 0
      examples/research/requirement_0.prompt
  92. 120 24
      examples/research/research.prompt
  93. 186 0
      examples/research/research_0.prompt
  94. 13 10
      examples/research/run.py
  95. 139 0
      examples/research/tools/reflect.py
  96. 59 0
      frontend/react-template/src/components/DetailPanel/DetailPanel.module.css
  97. 34 4
      frontend/react-template/src/components/DetailPanel/DetailPanel.tsx
  98. 1 0
      frontend/react-template/src/types/message.ts

+ 297 - 24
agent/core/runner.py

@@ -274,6 +274,7 @@ class AgentRunner:
         self.skills_dir = skills_dir
         self.goal_tree = goal_tree
         self.debug = debug
+        self.stdin_check: Optional[Callable] = None  # 由外部设置,用于子 agent 执行期间检查 stdin
         self._cancel_events: Dict[str, asyncio.Event] = {}  # trace_id → cancel event
 
         # 知识保存跟踪(每个 trace 独立)
@@ -283,6 +284,10 @@ class AgentRunner:
         self._context_warned: Dict[str, set] = {}  # trace_id → {30, 50, 80} 已警告过的阈值
         self._context_usage: Dict[str, ContextUsage] = {}  # trace_id → 当前用量快照
 
+        # 图片优化缓存(避免重复处理)
+        # key: 图片内容的 hash, value: {"downscaled": ..., "description": ...}
+        self._image_opt_cache: Dict[str, Dict[str, Any]] = {}
+
     # ===== 核心公开方法 =====
 
     def get_context_usage(self, trace_id: str) -> Optional[ContextUsage]:
@@ -772,13 +777,8 @@ class AgentRunner:
                     f"Context 使用率达到 {threshold}%: {token_count:,} / {max_tokens:,} tokens ({msg_count} 条消息)"
                 )
 
-        # 检查是否需要压缩(token 或消息数量超限)
-        needs_compression_by_tokens = token_count > max_tokens
-        needs_compression_by_count = (
-            compression_config.max_messages > 0 and
-            msg_count > compression_config.max_messages
-        )
-        needs_compression = needs_compression_by_tokens or needs_compression_by_count
+        # 检查是否需要压缩(仅基于 token 数量)
+        needs_compression = token_count > max_tokens
 
         if not needs_compression:
             return history, head_seq, sequence, False
@@ -810,24 +810,20 @@ class AgentRunner:
                     )
         elif needs_compression:
             logger.warning(
-                "消息数 (%d) 或 token 数 (%d) 超过阈值,但无法执行 Level 1 压缩(缺少 store 或 goal_tree,或 goal_compression=none)",
-                msg_count, token_count,
+                "Token 数 (%d) 超过阈值,但无法执行 Level 1 压缩(缺少 store 或 goal_tree,或 goal_compression=none)",
+                token_count,
             )
 
         # Level 2 压缩:检查 Level 1 后是否仍超阈值
-        token_count_after = estimate_tokens(history)
-        msg_count_after = len(history)
-        needs_level2_by_tokens = token_count_after > max_tokens
-        needs_level2_by_count = (
-            compression_config.max_messages > 0 and
-            msg_count_after > compression_config.max_messages
-        )
-        needs_level2 = needs_level2_by_tokens or needs_level2_by_count
+        # 注意:Level 1 压缩后需要重新优化图片并计算 token
+        optimized_history_after = await self._optimize_images(history, config.model)
+        token_count_after = estimate_tokens(optimized_history_after)
+        needs_level2 = token_count_after > max_tokens
 
         if needs_level2:
             logger.info(
-                "Level 1 后仍超阈值 (消息数=%d/%d, token=%d/%d),需要进入压缩侧分支",
-                msg_count_after, compression_config.max_messages, token_count_after, max_tokens,
+                "Level 1 后仍超阈值 (token=%d/%d),需要进入压缩侧分支",
+                token_count_after, max_tokens,
             )
             # 如果还没有设置侧分支(说明没有启用知识提取),直接进入压缩
             if not config.force_side_branch:
@@ -1145,6 +1141,9 @@ class AgentRunner:
             # 构建 LLM messages(注入上下文)
             llm_messages = list(history)
 
+            # 优化已处理的图片(分级处理:保留/压缩/描述)
+            llm_messages = await self._optimize_images(llm_messages, config.model)
+
             # 对历史消息应用 Prompt Caching
             llm_messages = self._add_cache_control(
                 llm_messages,
@@ -1162,6 +1161,7 @@ class AgentRunner:
             )
 
             response_content = result.get("content", "")
+            reasoning_content = result.get("reasoning_content", "")
             tool_calls = result.get("tool_calls")
             finish_reason = result.get("finish_reason")
             prompt_tokens = result.get("prompt_tokens", 0)
@@ -1227,7 +1227,7 @@ class AgentRunner:
                 parent_sequence=head_seq if head_seq > 0 else None,
                 branch_type=side_branch_ctx.type if side_branch_ctx else None,
                 branch_id=side_branch_ctx.branch_id if side_branch_ctx else None,
-                content={"text": response_content, "tool_calls": tool_calls},
+                content={"text": response_content, "tool_calls": tool_calls, "reasoning_content": reasoning_content or None},
                 prompt_tokens=prompt_tokens,
                 completion_tokens=completion_tokens,
                 cache_creation_tokens=cache_creation_tokens,
@@ -1975,6 +1975,252 @@ class AgentRunner:
 
     # ===== 辅助方法 =====
 
+    async def _optimize_images(self, messages: List[Dict], model: str) -> List[Dict]:
+        """
+        分级优化已处理的图片,节省 token
+
+        策略(基于图片距离最后一条 assistant 的"轮次"):
+        1. 最近 1-2 轮:保留原图
+        2. 3-5 轮:降低分辨率和压缩(节省 token 但保留视觉信息)
+        3. 5 轮以上:调用小模型生成文本描述 + 保留 URL
+
+        处理结果会缓存,避免重复的 PIL 解码/编码和 LLM 调用。
+
+        Args:
+            messages: 原始消息列表
+            model: 当前使用的模型(用于选择描述生成模型)
+
+        Returns:
+            优化后的消息列表(深拷贝)
+        """
+        if not messages:
+            return messages
+
+        # 找到最后一条 assistant message 的位置
+        last_assistant_idx = -1
+        for i in range(len(messages) - 1, -1, -1):
+            if messages[i].get("role") == "assistant":
+                last_assistant_idx = i
+                break
+
+        # 如果没有 assistant message,说明还没开始对话,不优化
+        if last_assistant_idx == -1:
+            return messages
+
+        # 统计从每个位置到最后一条 assistant 之间的 assistant 数量(作为"轮次")
+        assistant_count_after = [0] * len(messages)
+        count = 0
+        for i in range(len(messages) - 1, -1, -1):
+            assistant_count_after[i] = count
+            if messages[i].get("role") == "assistant":
+                count += 1
+
+        # 深拷贝避免修改原始数据
+        import copy
+        import hashlib
+        messages = copy.deepcopy(messages)
+
+        # 统计优化情况
+        stats = {"kept": 0, "downscaled": 0, "described": 0, "cache_hit": 0}
+
+        # 遍历最后一条 assistant 之前的所有 tool messages
+        for i in range(last_assistant_idx):
+            msg = messages[i]
+            if msg.get("role") != "tool":
+                continue
+
+            content = msg.get("content")
+            if not isinstance(content, list):
+                continue
+
+            # 计算这条消息距离最后一条 assistant 的"轮次"
+            rounds_ago = assistant_count_after[i]
+
+            # 处理每个 content block
+            new_content = []
+            for block in content:
+                if isinstance(block, dict) and block.get("type") == "image_url":
+                    image_url_obj = block.get("image_url", {})
+                    image_url = image_url_obj.get("url", "")
+
+                    # 生成缓存 key(URL 图片用 URL 本身,base64 用前 64 字符 hash)
+                    if image_url.startswith("data:"):
+                        cache_key = hashlib.md5(image_url[:200].encode()).hexdigest()
+                    else:
+                        cache_key = hashlib.md5(image_url.encode()).hexdigest()
+
+                    # 根据距离决定处理策略
+                    if rounds_ago <= 2:
+                        # 最近 1-2 轮:保留原图
+                        new_content.append(block)
+                        stats["kept"] += 1
+
+                    elif rounds_ago <= 5:
+                        # 3-5 轮:降低分辨率(优先从缓存取)
+                        cached = self._image_opt_cache.get(cache_key, {})
+                        if "downscaled" in cached:
+                            new_content.append({
+                                "type": "image_url",
+                                "image_url": {"url": cached["downscaled"]}
+                            })
+                            stats["downscaled"] += 1
+                            stats["cache_hit"] += 1
+                        elif image_url.startswith("data:"):
+                            downscaled = await self._downscale_image(image_url)
+                            if downscaled:
+                                # 缓存结果
+                                self._image_opt_cache.setdefault(cache_key, {})["downscaled"] = downscaled
+                                new_content.append({
+                                    "type": "image_url",
+                                    "image_url": {"url": downscaled}
+                                })
+                                stats["downscaled"] += 1
+                            else:
+                                new_content.append(block)
+                                stats["kept"] += 1
+                        else:
+                            # URL 图片:无法直接处理,保留原图
+                            new_content.append(block)
+                            stats["kept"] += 1
+
+                    else:
+                        # 5 轮以上:生成文本描述(优先从缓存取)
+                        cached = self._image_opt_cache.get(cache_key, {})
+                        if "description" in cached:
+                            new_content.append(cached["description"])
+                            stats["described"] += 1
+                            stats["cache_hit"] += 1
+                        else:
+                            description = await self._generate_image_description(image_url, model)
+                            url_info = f" (URL: {image_url[:100]}...)" if not image_url.startswith("data:") else ""
+                            desc_block = {
+                                "type": "text",
+                                "text": f"[Image description: {description}]{url_info}"
+                            }
+                            # 缓存结果
+                            self._image_opt_cache.setdefault(cache_key, {})["description"] = desc_block
+                            new_content.append(desc_block)
+                            stats["described"] += 1
+                else:
+                    new_content.append(block)
+
+            msg["content"] = new_content
+
+        if stats["downscaled"] > 0 or stats["described"] > 0:
+            logger.info(
+                f"[Image Optimization] 保留 {stats['kept']} 张,"
+                f"降分辨率 {stats['downscaled']} 张,"
+                f"文本描述 {stats['described']} 张,"
+                f"缓存命中 {stats['cache_hit']} 次"
+            )
+
+        return messages
+
+    async def _downscale_image(self, base64_url: str, max_size: int = 512) -> Optional[str]:
+        """
+        降低 base64 图片的分辨率
+
+        Args:
+            base64_url: data:image/xxx;base64,... 格式的 URL
+            max_size: 最大边长(像素)
+
+        Returns:
+            降分辨率后的 base64 URL,失败返回 None
+        """
+        try:
+            from PIL import Image
+            import io
+            import base64
+
+            # 解析 base64 数据
+            if not base64_url.startswith("data:"):
+                return None
+
+            header, data = base64_url.split(",", 1)
+            media_type = header.split(";")[0].split(":")[1]  # image/png
+
+            # 解码图片
+            img_data = base64.b64decode(data)
+            img = Image.open(io.BytesIO(img_data))
+
+            # 计算新尺寸(保持宽高比)
+            width, height = img.size
+            if width <= max_size and height <= max_size:
+                return base64_url  # 已经够小,不需要缩放
+
+            if width > height:
+                new_width = max_size
+                new_height = int(height * max_size / width)
+            else:
+                new_height = max_size
+                new_width = int(width * max_size / height)
+
+            # 缩放图片
+            img_resized = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
+
+            # 转换为 RGB(如果是 RGBA)
+            if img_resized.mode == "RGBA":
+                img_resized = img_resized.convert("RGB")
+
+            # 重新编码为 JPEG(压缩率更高)
+            buffer = io.BytesIO()
+            img_resized.save(buffer, format="JPEG", quality=85, optimize=True)
+            new_data = base64.b64encode(buffer.getvalue()).decode("utf-8")
+
+            return f"data:image/jpeg;base64,{new_data}"
+
+        except Exception as e:
+            logger.warning(f"[Image Downscale] 降分辨率失败: {e}")
+            return None
+
+    async def _generate_image_description(self, image_url: str, current_model: str) -> str:
+        """
+        使用小模型生成图片的文本描述
+
+        Args:
+            image_url: 图片 URL(base64 或 http(s))
+            current_model: 当前使用的模型
+
+        Returns:
+            图片描述文本
+        """
+        try:
+            # 使用 qwen-vl-max(通义千问视觉模型)生成描述
+            # 注意:qwen-vl 系列专门支持视觉输入
+            description_model = "qwen-vl-max"
+
+            # 构建描述请求
+            messages = [
+                {
+                    "role": "user",
+                    "content": [
+                        {
+                            "type": "image_url",
+                            "image_url": {"url": image_url}
+                        },
+                        {
+                            "type": "text",
+                            "text": "请用 1-2 句话简洁描述这张图片的主要内容。"
+                        }
+                    ]
+                }
+            ]
+
+            # 调用 LLM
+            result = await self.llm_call(
+                messages=messages,
+                model=description_model,
+                tools=None,
+                temperature=0.3,
+            )
+
+            description = result.get("content", "").strip()
+            return description if description else "图片内容"
+
+        except Exception as e:
+            logger.warning(f"[Image Description] 生成描述失败: {e}")
+            return "图片内容"
+
     def _add_cache_control(
         self,
         messages: List[Dict],
@@ -1984,10 +2230,11 @@ class AgentRunner:
         """
         为支持的模型添加 Prompt Caching 标记
 
-        策略:固定位置 + 延迟查找
-        1. system message 添加缓存(如果足够长)
-        2. 固定位置缓存点(20, 40, 60, 80),确保每个缓存点间隔 >= 1024 tokens
-        3. 最多使用 4 个缓存点(含 system)
+        策略:固定位置 + 延迟缓存
+        1. 如果有未处理的图片(最后一条 assistant 之后的 tool messages 中有图片),跳过缓存
+        2. system message 添加缓存(如果足够长)
+        3. 固定位置缓存点(20, 40, 60, 80),确保每个缓存点间隔 >= 1024 tokens
+        4. 最多使用 4 个缓存点(含 system)
 
         Args:
             messages: 原始消息列表
@@ -2004,6 +2251,32 @@ class AgentRunner:
         if "claude" not in model.lower():
             return messages
 
+        # 延迟缓存:检查是否有未处理的图片
+        last_assistant_idx = -1
+        for i in range(len(messages) - 1, -1, -1):
+            if messages[i].get("role") == "assistant":
+                last_assistant_idx = i
+                break
+
+        # 检查最后一条 assistant 之后是否有包含图片的 tool messages
+        has_unprocessed_images = False
+        if last_assistant_idx >= 0:
+            for i in range(last_assistant_idx + 1, len(messages)):
+                msg = messages[i]
+                if msg.get("role") == "tool":
+                    content = msg.get("content")
+                    if isinstance(content, list):
+                        has_unprocessed_images = any(
+                            isinstance(block, dict) and block.get("type") == "image_url"
+                            for block in content
+                        )
+                        if has_unprocessed_images:
+                            break
+
+        if has_unprocessed_images:
+            logger.debug("[Cache] 检测到未处理的图片,延迟缓存建立")
+            return messages
+
         # 深拷贝避免修改原始数据
         import copy
         messages = copy.deepcopy(messages)

+ 178 - 171
agent/docs/architecture.md

@@ -14,11 +14,11 @@
 
 **核心理念:所有 Agent 都是 Trace**
 
-| 类型 | 创建方式 | 父子关系 | 状态 |
-|------|---------|---------|------|
-| 主 Agent | 直接调用 `runner.run()` | 无 parent | 正常执行 |
-| 子 Agent | 通过 `agent` 工具 | `parent_trace_id` / `parent_goal_id` 指向父 | 正常执行 |
-| 人类协助 | 通过 `ask_human` 工具 | `parent_trace_id` 指向父 | 阻塞等待 |
+| 类型     | 创建方式                | 父子关系                                    | 状态     |
+| -------- | ----------------------- | ------------------------------------------- | -------- |
+| 主 Agent | 直接调用 `runner.run()` | 无 parent                                   | 正常执行 |
+| 子 Agent | 通过 `agent` 工具       | `parent_trace_id` / `parent_goal_id` 指向父 | 正常执行 |
+| 人类协助 | 通过 `ask_human` 工具   | `parent_trace_id` 指向父                    | 阻塞等待 |
 
 ---
 
@@ -74,13 +74,13 @@ agent/
 
 ### 职责划分
 
-| 模块 | 职责 |
-|-----|------|
-| **core/** | Agent 执行引擎 + 预设配置 |
-| **trace/** | 执行追踪 + 计划管理 |
+| 模块       | 职责                                       |
+| ---------- | ------------------------------------------ |
+| **core/**  | Agent 执行引擎 + 预设配置                  |
+| **trace/** | 执行追踪 + 计划管理                        |
 | **tools/** | 与外部世界交互(文件、命令、网络、浏览器) |
-| **skill/** | 技能系统(Skills) |
-| **llm/** | LLM Provider 适配 |
+| **skill/** | 技能系统(Skills)                         |
+| **llm/**   | LLM Provider 适配                          |
 
 ### 三层记忆模型
 
@@ -93,9 +93,9 @@ agent/
                               │ 归纳
 ┌─────────────────────────────────────────────────────────────┐
-│ Layer 2: Experience(经验库)
-│ - 数据库存储,条件 + 规则 + 证据   
-│ - 向量检索,注入到 system prompt
+│ Layer 2: Knowledge(知识库) 
+│ - 数据库存储,结构化知识 + 向量索引
+│ - 语义检索,按需注入到对话历史  
 └─────────────────────────────────────────────────────────────┘
                               │ 提取
@@ -113,20 +113,20 @@ agent/
 
 框架内部统一使用 OpenAI 兼容格式(`List[Dict]`)存储和传递消息。各 Provider 负责双向转换:
 
-| 方向 | 说明 |
-|------|------|
+| 方向                  | 说明                                             |
+| --------------------- | ------------------------------------------------ |
 | 入(LLM 响应 → 框架) | 提取 content、tool_calls、usage,转换为统一 Dict |
-| 出(框架 → LLM 请求) | OpenAI 格式消息列表 → 各 API 原生格式 |
+| 出(框架 → LLM 请求) | OpenAI 格式消息列表 → 各 API 原生格式            |
 
 #### 工具消息分组
 
 存储层每个 tool result 独立一条 Message(OpenAI 格式最大公约数)。各 Provider 在出方向按 API 要求自行分组:
 
-| Provider | 分组方式 |
-|----------|---------|
-| OpenRouter | 无需分组(OpenAI 原生支持独立 tool 消息) |
-| Yescode | `_convert_messages_to_anthropic` 合并连续 tool 消息为单个 user message |
-| Gemini | `_convert_messages_to_gemini` 通过 buffer 合并连续 tool 消息 |
+| Provider   | 分组方式                                                               |
+| ---------- | ---------------------------------------------------------------------- |
+| OpenRouter | 无需分组(OpenAI 原生支持独立 tool 消息)                              |
+| Yescode    | `_convert_messages_to_anthropic` 合并连续 tool 消息为单个 user message |
+| Gemini     | `_convert_messages_to_gemini` 通过 buffer 合并连续 tool 消息           |
 
 #### 跨 Provider 续跑:tool_call_id 规范化
 
@@ -189,11 +189,11 @@ class RunConfig:
 
 通过 RunConfig 参数自然区分,统一入口 `run(messages, config)`:
 
-| 模式 | trace_id | after_sequence | messages 含义 | API 端点 |
-|------|----------|---------------|--------------|----------|
-| 新建 | None | - | 初始任务消息 | `POST /api/traces` |
-| 续跑 | 已有 ID | None 或 == head | 追加到末尾的新消息 | `POST /api/traces/{id}/run` |
-| 回溯 | 已有 ID | 主路径上 < head | 在插入点之后追加的新消息 | `POST /api/traces/{id}/run` |
+| 模式 | trace_id | after_sequence  | messages 含义            | API 端点                    |
+| ---- | -------- | --------------- | ------------------------ | --------------------------- |
+| 新建 | None     | -               | 初始任务消息             | `POST /api/traces`          |
+| 续跑 | 已有 ID  | None 或 == head | 追加到末尾的新消息       | `POST /api/traces/{id}/run` |
+| 回溯 | 已有 ID  | 主路径上 < head | 在插入点之后追加的新消息 | `POST /api/traces/{id}/run` |
 
 Runner 根据 `after_sequence` 与当前 `head_sequence` 的关系自动判断行为,前端无需指定模式。
 
@@ -210,7 +210,7 @@ async def run(messages: List[Dict], config: RunConfig = None) -> AsyncIterator[U
 
     # Phase 2: BUILD HISTORY
     #   从 head_sequence 沿 parent chain 回溯构建主路径消息
-    #   构建 system prompt(新建时注入 skills/experiences;续跑时复用已有)
+    #   构建 system prompt(新建时注入 skills;续跑时复用已有)
     #   追加 input messages(设置 parent_sequence 指向当前 head)
     history, sequence = await _build_history(trace, messages, config)
 
@@ -297,9 +297,9 @@ await runner.stop(trace_id)
 
 修复策略:为每个缺失的 tool_result **插入合成的中断通知**(而非裁剪 assistant 消息):
 
-| 工具类型 | 合成 tool_result 内容 |
-|----------|---------------------|
-| 普通工具 | 简短中断提示,建议重新调用 |
+| 工具类型       | 合成 tool_result 内容                                                   |
+| -------------- | ----------------------------------------------------------------------- |
+| 普通工具       | 简短中断提示,建议重新调用                                              |
 | agent/evaluate | 结构化中断信息,包含 `sub_trace_id`、执行统计、`continue_from` 用法指引 |
 
 agent 工具的合成结果对齐正常返回值格式(含 `sub_trace_id` 字段),主 Agent 可直接使用 `agent(task=..., continue_from=sub_trace_id)` 续跑被中断的子 Agent。合成消息持久化存储,确保幂等。
@@ -313,13 +313,13 @@ agent 工具的合成结果对齐正常返回值格式(含 `sub_trace_id` 字
 
 #### 查询端点
 
-| 方法 | 路径 | 说明 |
-|------|------|------|
-| GET  | `/api/traces` | 列出 Traces |
-| GET  | `/api/traces/{id}` | 获取 Trace 详情(含 GoalTree、Sub-Traces) |
-| GET  | `/api/traces/{id}/messages` | 获取 Messages(支持 mode=main_path/all) |
-| GET  | `/api/traces/running` | 列出正在运行的 Trace |
-| WS   | `/api/traces/{id}/watch` | 实时事件推送 |
+| 方法 | 路径                        | 说明                                       |
+| ---- | --------------------------- | ------------------------------------------ |
+| GET  | `/api/traces`               | 列出 Traces                                |
+| GET  | `/api/traces/{id}`          | 获取 Trace 详情(含 GoalTree、Sub-Traces) |
+| GET  | `/api/traces/{id}/messages` | 获取 Messages(支持 mode=main_path/all)   |
+| GET  | `/api/traces/running`       | 列出正在运行的 Trace                       |
+| WS   | `/api/traces/{id}/watch`    | 实时事件推送                               |
 
 **实现**:`agent/trace/api.py`, `agent/trace/websocket.py`
 
@@ -327,12 +327,12 @@ agent 工具的合成结果对齐正常返回值格式(含 `sub_trace_id` 字
 
 需在 `api_server.py` 中配置 Runner。执行在后台异步进行,通过 WebSocket 监听进度。
 
-| 方法 | 路径 | 说明 |
-|------|------|------|
-| POST | `/api/traces` | 新建 Trace 并执行 |
-| POST | `/api/traces/{id}/run` | 运行(统一续跑 + 回溯) |
-| POST | `/api/traces/{id}/stop` | 停止运行中的 Trace |
-| POST | `/api/traces/{id}/reflect` | 触发反思,从执行历史中提取经验 |
+| 方法 | 路径                       | 说明                                          |
+| ---- | -------------------------- | --------------------------------------------- |
+| POST | `/api/traces`              | 新建 Trace 并执行                             |
+| POST | `/api/traces/{id}/run`     | 运行(统一续跑 + 回溯)                       |
+| POST | `/api/traces/{id}/stop`    | 停止运行中的 Trace                            |
+| POST | `/api/traces/{id}/reflect` | 触发反思,从执行历史中提取知识                |
 | POST | `/api/traces/{id}/compact` | 触发压缩,通过侧分支多轮 agent 模式压缩上下文 |
 
 ```bash
@@ -356,7 +356,7 @@ curl -X POST http://localhost:8000/api/traces/{trace_id}/run \
 # 停止
 curl -X POST http://localhost:8000/api/traces/{trace_id}/stop
 
-# 反思:通过侧分支多轮 agent 模式提取经验
+# 反思:通过侧分支多轮 agent 模式提取知识
 curl -X POST http://localhost:8000/api/traces/{trace_id}/reflect \
   -d '{"focus": "为什么第三步选择了错误的方案"}'
 
@@ -368,14 +368,6 @@ curl -X POST http://localhost:8000/api/traces/{trace_id}/compact
 
 **实现**:`agent/trace/run_api.py`
 
-#### 经验端点
-
-| 方法 | 路径 | 说明 |
-|------|------|------|
-| GET  | `/api/experiences` | 读取经验文件内容 |
-
-**实现**:`agent/trace/run_api.py`
-
 ---
 
 ## 数据模型
@@ -466,10 +458,12 @@ class Goal:
 ```
 
 **Goal 类型**:
+
 - `normal` - 普通目标,由 Agent 直接执行
 - `agent_call` - 通过 `agent`/`evaluate` 工具创建的目标,会启动 Sub-Trace
 
 **agent_call 类型的 Goal**:
+
 - 调用 `agent`/`evaluate` 工具时自动设置
 - `agent_call_mode` 记录使用的模式(explore/delegate/evaluate)
 - `sub_trace_ids` 记录创建的所有 Sub-Trace ID
@@ -477,6 +471,7 @@ class Goal:
 - `summary` 包含格式化的汇总结果(explore 模式会汇总所有分支)
 
 **Goal 操作**(通过 goal 工具):
+
 - `add` - 添加顶层目标
 - `under` - 在指定目标下添加子目标
 - `after` - 在指定目标后添加兄弟目标
@@ -537,10 +532,12 @@ Rewind 到 3:3 → 6(parent=3) → 7   (新主路径,4-5 自动脱离)
 **关键设计**:只要 `trace.head_sequence` 管理正确(始终指向主路径),`get_main_path_messages()` 自然返回主路径消息,侧分支消息通过 parent_sequence 链自动被跳过,无需额外过滤。
 
 Message 提供格式转换方法:
+
 - `to_llm_dict()` → OpenAI 格式 Dict(用于 LLM 调用)
 - `from_llm_dict(d, trace_id, sequence, goal_id)` → 从 OpenAI 格式创建 Message
 
 **侧分支字段**:
+
 - `branch_type`: "compression" | "reflection" | None(主路径)
 - `branch_id`: 同一侧分支的消息共享 branch_id
 
@@ -594,6 +591,7 @@ AGENT_PRESETS = {
 **实现**:`agent/core/presets.py`
 
 **System Prompt 构建优先级**(`agent/core/runner.py:_build_system_prompt`):
+
 1. 消息中已有 system → 使用消息中的
 2. `config.system_prompt` 显式指定 → 使用 config
 3. `preset.system_prompt` 存在 → 使用 preset
@@ -602,6 +600,7 @@ AGENT_PRESETS = {
 **用户自定义**:项目级配置文件(如 `examples/production/presets.json`)可通过 `load_presets_from_json()` 加载预设。支持 `system_prompt_file` 字段从 `.prompt` 文件加载完整 system prompt。
 
 **示例**(`examples/production/presets.json`):
+
 ```json
 {
   "tool_research": {
@@ -614,6 +613,7 @@ AGENT_PRESETS = {
 ```
 
 **加载方式**:
+
 ```python
 from agent.core.presets import load_presets_from_json
 
@@ -621,6 +621,7 @@ load_presets_from_json("examples/production/presets.json")
 ```
 
 **使用方式**:LLM 调用 `agent` 工具时指定 `agent_type` 参数:
+
 ```python
 agent(task="调研视频生成工具", agent_type="tool_research")
 ```
@@ -638,10 +639,12 @@ agent(task="调研视频生成工具", agent_type="tool_research")
 支持跨设备的 Agent 间持续对话,通过远程 Trace ID 实现:
 
 **Trace ID 格式**:
+
 - 本地 Trace:`abc-123`
 - 远程 Trace:`agent://terminal-agent-456/abc-123`(协议 + Agent 地址 + 本地 ID)
 
 **使用方式**:
+
 ```python
 # 调用远程 Agent
 result = agent(task="分析本地项目", agent_url="https://terminal-agent.local")
@@ -675,18 +678,21 @@ async def agent(
 ```
 
 **参数**:
+
 - `agent_type`: 子 Agent 类型,决定工具权限和默认 skills(对应 `AgentPreset` 名称)
 - `skills`: 覆盖 preset 默认值,显式指定注入 system prompt 的 skill 列表
 - `agent_url`: 远程 Agent 地址,用于跨设备调用(返回远程 Trace ID)
 - `continue_from`: 支持本地或远程 Trace ID
 
 **单任务(delegate)**:`task: str`
+
 - 创建单个 Sub-Trace
 - 完整工具权限(除 agent/evaluate 外,防止递归)
 - 支持 `continue_from` 续跑已有 Sub-Trace(本地或远程)
 - 支持 `messages` 预置上下文消息
 
 **多任务(explore)**:`task: List[str]`
+
 - 使用 `asyncio.gather()` 并行执行所有任务
 - 每个任务创建独立的 Sub-Trace
 - 只读工具权限(read_file, grep_content, glob_files, goal)
@@ -738,10 +744,10 @@ MessageContent = Union[str, List[Dict[str, str]]]     # content 字段(文本
 
 任务执行中与模型密切协作的实体(子 Agent 或人类),按 **与当前任务的关系** 分类,而非按 human/agent 分类:
 
-| | 持久存在(外部可查) | 任务内活跃(需要注入) |
-|---|---|---|
+|       | 持久存在(外部可查)     | 任务内活跃(需要注入) |
+| ----- | ------------------------ | ---------------------- |
 | Agent | 专用 Agent(代码审查等) | 当前任务创建的子 Agent |
-| Human | 飞书通讯录 | 当前任务中正在对接的人 |
+| Human | 飞书通讯录               | 当前任务中正在对接的人 |
 
 ### 数据模型
 
@@ -763,6 +769,7 @@ MessageContent = Union[str, List[Dict[str, str]]]     # content 字段(文本
 
 ```markdown
 ## Active Collaborators
+
 - researcher [agent, completed]: 方案A最优
 - 谭景玉 [human, waiting]: 已发送方案确认,等待回复
 - coder [agent, running]: 正在实现特征提取模块
@@ -773,6 +780,7 @@ MessageContent = Union[str, List[Dict[str, str]]]     # content 字段(文本
 ### 维护
 
 各工具负责更新 collaborators 列表(通过 `context["store"]` 写入 trace.context):
+
 - `agent` 工具:创建/续跑子 Agent 时更新
 - `feishu` 工具:发送消息/收到回复时更新
 - Runner 只负责读取和注入
@@ -1013,14 +1021,17 @@ async def receive_a2a_message(message: dict):
 
 ```markdown
 ## Current Plan
+
 1. [in_progress] 分析代码架构
    1.1. [completed] 读取项目结构
    1.2. [in_progress] 分析核心模块
 
 ## Active Collaborators
+
 - researcher [agent, completed]: 已完成调研
 
 ## Messages
+
 💬 来自 code-reviewer 的 1 条新消息(使用 check_messages 工具查看)
 ```
 
@@ -1057,10 +1068,10 @@ def create_timer_hook(timer):
 
 任务执行中与模型密切协作的实体(子 Agent 或人类),按 **与当前任务的关系** 分类,而非按 human/agent 分类:
 
-| | 持久存在(外部可查) | 任务内活跃(需要注入) |
-|---|---|---|
+|       | 持久存在(外部可查)     | 任务内活跃(需要注入) |
+| ----- | ------------------------ | ---------------------- |
 | Agent | 专用 Agent(代码审查等) | 当前任务创建的子 Agent |
-| Human | 飞书通讯录 | 当前任务中正在对接的人 |
+| Human | 飞书通讯录               | 当前任务中正在对接的人 |
 
 ### 数据模型
 
@@ -1082,6 +1093,7 @@ def create_timer_hook(timer):
 
 ```markdown
 ## Active Collaborators
+
 - researcher [agent, completed]: 方案A最优
 - 谭景玉 [human, waiting]: 已发送方案确认,等待回复
 - coder [agent, running]: 正在实现特征提取模块
@@ -1092,6 +1104,7 @@ def create_timer_hook(timer):
 ### 维护
 
 各工具负责更新 collaborators 列表(通过 `context["store"]` 写入 trace.context):
+
 - `agent` 工具:创建/续跑子 Agent 时更新
 - `feishu` 工具:发送消息/收到回复时更新
 - Runner 只负责读取和注入
@@ -1116,21 +1129,21 @@ async def my_tool(arg: str, ctx: ToolContext) -> ToolResult:
     )
 ```
 
-| 类型 | 作用 |
-|------|------|
-| `@tool` | 装饰器,自动注册工具并生成 Schema |
-| `ToolResult` | 工具执行结果,支持双层记忆 |
-| `ToolContext` | 工具执行上下文,依赖注入 |
+| 类型          | 作用                              |
+| ------------- | --------------------------------- |
+| `@tool`       | 装饰器,自动注册工具并生成 Schema |
+| `ToolResult`  | 工具执行结果,支持双层记忆        |
+| `ToolContext` | 工具执行上下文,依赖注入          |
 
 ### 工具分类
 
-| 目录 | 工具 | 说明 |
-|-----|------|------|
-| `trace/` | goal | Agent 内部计划管理 |
-| `builtin/` | agent, evaluate | 子 Agent 创建与评估 |
-| `builtin/file/` | read, write, edit, glob, grep | 文件操作 |
-| `builtin/browser/` | browser actions | 浏览器自动化 |
-| `builtin/` | bash, sandbox, search, webfetch, skill, ask_human | 其他工具 |
+| 目录               | 工具                                              | 说明                |
+| ------------------ | ------------------------------------------------- | ------------------- |
+| `trace/`           | goal                                              | Agent 内部计划管理  |
+| `builtin/`         | agent, evaluate                                   | 子 Agent 创建与评估 |
+| `builtin/file/`    | read, write, edit, glob, grep                     | 文件操作            |
+| `builtin/browser/` | browser actions                                   | 浏览器自动化        |
+| `builtin/`         | bash, sandbox, search, webfetch, skill, ask_human | 其他工具            |
 
 ### 双层记忆管理
 
@@ -1152,11 +1165,11 @@ ToolResult(
 
 ### 分类
 
-| 类型 | 加载位置 | 加载时机 |
-|------|---------|---------|
-| **内置 Skill** | System Prompt | Agent 启动时自动注入 |
+| 类型           | 加载位置      | 加载时机                                   |
+| -------------- | ------------- | ------------------------------------------ |
+| **内置 Skill** | System Prompt | Agent 启动时自动注入                       |
 | **项目 Skill** | System Prompt | Agent 启动时按 preset/call-site 过滤后注入 |
-| **普通 Skill** | 对话消息 | 模型调用 `skill` 工具时 |
+| **普通 Skill** | 对话消息      | 模型调用 `skill` 工具时                    |
 
 ### 目录结构
 
@@ -1178,6 +1191,7 @@ agent/skill/skills/         # 内置 Skills(始终加载)
 3. `None`(加载全部,向后兼容)
 
 示例:调用子 Agent 时只注入解构相关 skill:
+
 ```python
 agent(task="...", agent_type="deconstruct", skills=["planning", "deconstruct"])
 ```
@@ -1188,88 +1202,74 @@ agent(task="...", agent_type="deconstruct", skills=["planning", "deconstruct"])
 
 ---
 
-## Experiences 系统
+## Knowledge 系统
 
-从执行历史中提取的经验规则,用于指导未来任务。
+从执行历史中提取的结构化知识,通过 KnowHub 服务管理,用于指导未来任务。
 
-### 存储规范
+### 存储架构
 
-经验以 Markdown 文件存储(默认 `./.cache/experiences.md`),人类可读、可编辑、可版本控制。
+知识存储在独立的 KnowHub 服务中(数据库 + 向量索引),支持:
+- 结构化存储(类型、标签、元数据)
+- 向量检索(语义相似度匹配)
+- 多租户隔离(owner、scopes)
+- 版本管理(created_at、updated_at)
 
-文件格式:
+**实现**:独立的 KnowHub Server(HTTP API)
 
-```markdown
----
-id: ex_001
-trace_id: trace-xxx
-category: tool_usage
-tags: {state: ["large_file", "dirty_repo"], intent: ["batch_edit", "safe_modify"]}
-metrics: {helpful: 12, harmful: 0}
-created_at: 2026-02-12 15:30
----
+### 反思机制(Reflect)
 
----
-id: ex_002
-...
-```
----
+通过 `POST /api/traces/{id}/reflect` 触发,旨在将原始执行历史提炼为可复用的知识。
 
+**流程**:
+1. **分叉反思**:在 trace 末尾进入 `reflection` 侧分支
+2. **多轮推理**:LLM 可调用 `knowledge_search`、`knowledge_save`、`resource_save` 等工具
+3. **结构化保存**:通过 `knowledge_save` 工具将知识保存到 KnowHub
 
-### 反思机制(Reflect)
+**实现**:`agent/trace/run_api.py:reflect_trace`
+
+### 知识工具
 
-通过 POST /api/traces/{id}/reflect 触发,旨在将原始执行历史提炼为可复用的知识。
-    1. 分叉反思:在 trace 末尾追加 user message(含反思与打标 Prompt),作为侧枝执行。
-    2. 结构化生成:
-        ·归类:将经验分配至 tool_usage(工具)、logic_flow(逻辑)、environment(环境)等。
-        ·打标:提取 state(环境状态)与 intent(用户意图)语义标签。
-        ·量化:初始 helpful 设为 1。
-    3. 持久化:将带有元数据的 Markdown 块追加至 experiences.md。
-
-实现:agent/trace/run_api.py:reflect_trace
-
-### 语义注入与匹配流程
-新建 Trace 时,Runner 采用“分析-检索-注入”三阶段策略,实现精准经验推荐。
-    1. 意图预分析
-    Runner 调用 utility_llm 对初始任务进行语义提取:
-        -输入:"优化这个项目的 Docker 构建速度"
-        -输出:{state: ["docker", "ci"], intent: ["optimization"]}
-    2. 语义检索
-        在 _load_experiences 中根据标签进行语义匹配(优先匹配 intent,其次是 state),筛选出相关度最高的 Top-K 条经验。
-    3. 精准注入
-        将匹配到的经验注入第一条 user message 末尾:
+Agent 可通过以下工具与知识库交互:
+
+**`knowledge_search`**:语义检索相关知识
 ```python
-# _build_history 中(仅新建模式):
-if not config.trace_id:
-    relevant_ex = self.experience_retriever.search(task_tags)
-    if relevant_ex:
-        formatted_ex = "\n".join([f"- [{e.id}] {e.content} (Helpful: {e.helpful})" for e in relevant_ex])
-        first_user_msg["content"] += f"\n\n## 参考经验\n\n{formatted_ex}"
+@tool
+async def knowledge_search(
+    query: str,
+    top_k: int = 5,
+    min_score: int = 3,
+    types: Optional[List[str]] = None,
+    owner: Optional[str] = None,
+) -> ToolResult:
+    “””从知识库中检索相关知识”””
 ```
-实现:agent/core/runner.py:AgentRunner._build_history
 
-### 经验获取工具
-不再仅限于启动时自动注入,而是通过内置工具供 Agent 在需要时主动调用。当执行结果不符合预期或进入未知领域时,Agent 应优先使用此工具。
-工具定义:
+**`knowledge_save`**:保存新知识
+```python
+@tool
+async def knowledge_save(
+    content: str,
+    type: str,
+    tags: Optional[Dict[str, str]] = None,
+    scopes: Optional[List[str]] = None,
+) -> ToolResult:
+    “””将知识保存到知识库”””
+```
 
+**`resource_save`**:保存资源文件(代码片段、配置等)
 ```python
-@tool(description="根据当前任务状态和意图,从经验库中检索相关的历史经验")
-async def get_experience(
-    intent: Optional[str] = None, 
-    state: Optional[str] = None
-) -> Dict[str, Any]:
-    """
-    参数:
-        intent: 想要达成的目标意图 (如 "optimization", "debug")
-        state: 当前环境或遇到的问题状态 (如 "docker_build_fail", "permission_denied")
-    """
+@tool
+async def resource_save(
+    content: str,
+    filename: str,
+    description: Optional[str] = None,
+) -> ToolResult:
+    “””保存资源文件到知识库”””
 ```
-实现: agent/tools/builtin/experience.py
 
-- 语义匹配与应用流程
-    当 Agent 调用 get_experience 时,系统执行以下逻辑:
-    1. 语义检索:根据传入的 intent 或 state 标签,在 experiences.md 中进行匹配。匹配权重:intent > state > helpful 评分。
-    2. 动态注入:工具返回匹配到的 Top-K 条经验(含 ID 和内容)。
-    3. 策略应用:Agent 接收到工具返回的经验后,需在后续 thought 中声明所选用的策略 ID(如 [ex_001]),并据此调整 goal_tree 或工具调用序列。
+**实现**:`agent/tools/builtin/knowledge.py`
+
+---
 
 ## Context 压缩
 
@@ -1277,10 +1277,10 @@ async def get_experience(
 
 Context 压缩分为两级,通过 `RunConfig` 中的 `goal_compression` 参数控制 Level 1 的行为:
 
-| 模式 | 值 | Level 1 行为 | Level 2 行为 |
-|------|-----|-------------|-------------|
-| 不压缩 | `"none"` | 跳过 Level 1 | 超限时直接进入 Level 2 |
-| 完成后压缩 | `"on_complete"` | 每个 goal 完成时立刻压缩该 goal 的消息 | 超限时进入 Level 2 |
+| 模式       | 值              | Level 1 行为                           | Level 2 行为                   |
+| ---------- | --------------- | -------------------------------------- | ------------------------------ |
+| 不压缩     | `"none"`        | 跳过 Level 1                           | 超限时直接进入 Level 2         |
+| 完成后压缩 | `"on_complete"` | 每个 goal 完成时立刻压缩该 goal 的消息 | 超限时进入 Level 2             |
 | 超长时压缩 | `"on_overflow"` | 超限时遍历所有 completed goal 逐个压缩 | Level 1 后仍超限则进入 Level 2 |
 
 默认值:`"on_overflow"`
@@ -1333,10 +1333,11 @@ RunConfig(
 
 通过侧分支队列机制执行,`force_side_branch` 为列表类型:
 
-1. **反思**(可选,由 `knowledge.enable_extraction` 控制):进入 `reflection` 侧分支,LLM 可多轮调用 knowledge_search、resource_save、knowledge_save 等工具提取经验
+1. **反思**(可选,由 `knowledge.enable_extraction` 控制):进入 `reflection` 侧分支,LLM 可多轮调用 knowledge_search、resource_save、knowledge_save 等工具提取知识
 2. **压缩**:进入 `compression` 侧分支,LLM 生成 summary
 
 侧分支队列示例:
+
 - 启用知识提取:`force_side_branch = ["reflection", "compression"]`
 - 仅压缩:`force_side_branch = ["compression"]`
 
@@ -1357,6 +1358,7 @@ RunConfig(
 ### GoalTree 双视图
 
 `to_prompt()` 支持两种模式:
+
 - `include_summary=False`(默认):精简视图,用于日常周期性注入
 - `include_summary=True`:含所有 completed goals 的 summary,用于 Level 2 压缩时提供上下文
 
@@ -1389,6 +1391,7 @@ class TraceStore(Protocol):
 `get_main_path_messages` 从 `head_sequence` 沿 `parent_sequence` 链回溯,返回主路径上的有序消息列表。
 
 **实现**:
+
 - 协议定义:`agent/trace/protocols.py`
 - 本地存储:`agent/trace/store.py:FileSystemTraceStore`
 - 远程存储:`agent/trace/remote_store.py:RemoteTraceStore`(规划中)
@@ -1398,12 +1401,13 @@ class TraceStore(Protocol):
 
 **HybridTraceStore** 根据 Trace ID 自动路由到本地或远程存储:
 
-| Trace ID 格式 | 存储位置 | 访问方式 |
-|--------------|---------|---------|
-| `abc-123` | 本地文件系统 | `FileSystemTraceStore` |
-| `agent://host/abc-123` | 远程 Agent | HTTP API(`RemoteTraceStore`) |
+| Trace ID 格式          | 存储位置     | 访问方式                       |
+| ---------------------- | ------------ | ------------------------------ |
+| `abc-123`              | 本地文件系统 | `FileSystemTraceStore`         |
+| `agent://host/abc-123` | 远程 Agent   | HTTP API(`RemoteTraceStore`) |
 
 **RemoteTraceStore** 通过 HTTP API 访问远程 Trace:
+
 - `GET /api/traces/{trace_id}` - 获取 Trace 元数据
 - `GET /api/traces/{trace_id}/messages` - 获取消息历史
 - `POST /api/traces/{trace_id}/run` - 续跑(追加消息并执行)
@@ -1429,17 +1433,20 @@ class TraceStore(Protocol):
 ```
 
 **events.jsonl 说明**:
+
 - 记录 Trace 执行过程中的关键事件
 - 每行一个 JSON 对象,包含 event_id、event 类型、时间戳等
 - 主要事件类型:goal_added, goal_updated, sub_trace_started, sub_trace_completed, rewind
 - 用于实时监控和历史回放
 
 **Sub-Trace 目录命名**:
+
 - Explore: `{parent}@explore-{序号:03d}-{timestamp}-001`
 - Delegate: `{parent}@delegate-{timestamp}-001`
 - Evaluate: `{parent}@evaluate-{timestamp}-001`
 
 **meta.json 示例**:
+
 ```json
 {
   "trace_id": "0415dc38-...",
@@ -1479,24 +1486,24 @@ class TraceStore(Protocol):
 
 ## 相关文档
 
-| 文档 | 内容 |
-|-----|------|
-| [Context 管理](./context-management.md) | Goals、压缩、Plan 注入策略 |
-| [工具系统](../agent/docs/tools.md) | 工具定义、注册、双层记忆 |
-| [Skills 指南](../agent/docs/skills.md) | Skill 分类、编写、加载 |
-| [多模态支持](../agent/docs/multimodal.md) | 图片、PDF 处理 |
-| [知识管理](./knowledge.md) | 知识结构、检索、提取机制 |
-| [Scope 设计](./scope-design.md) | 知识可见性和权限控制 |
-| [Agent 设计决策](../agent/docs/decisions.md) | Agent Core 架构决策记录 |
-| [Gateway 设计决策](../gateway/docs/decisions.md) | Gateway 架构决策记录 |
-| [组织级概览](../gateway/docs/enterprise/overview.md) | 组织级 Agent 系统架构和规划 |
-| [Enterprise 实现](../gateway/docs/enterprise/implementation.md) | 认证、审计、多租户技术实现 |
-| [测试指南](./testing.md) | 测试策略和命令 |
-| [A2A 协议调研](./research/a2a-protocols.md) | 行业 A2A 通信协议和框架对比 |
-| [A2A 跨设备通信](./research/a2a-cross-device.md) | 跨设备 Agent 通信方案(内部) |
-| [A2A Trace 存储](./research/a2a-trace-storage.md) | 跨设备 Trace 存储方案详细设计 |
-| [MAMP 协议](./research/a2a-mamp-protocol.md) | 与外部 Agent 系统的通用交互协议 |
-| [A2A IM 系统](./a2a-im.md) | Agent 即时通讯系统架构和实现 |
-| [Gateway 架构](../gateway/docs/architecture.md) | Gateway 三层架构和设计决策 |
-| [Gateway 部署](../gateway/docs/deployment.md) | Gateway 部署模式和配置 |
-| [Gateway API](../gateway/docs/api.md) | Gateway API 完整参考 |
+| 文档                                                            | 内容                            |
+| --------------------------------------------------------------- | ------------------------------- |
+| [Context 管理](./context-management.md)                         | Goals、压缩、Plan 注入策略      |
+| [工具系统](../agent/docs/tools.md)                              | 工具定义、注册、双层记忆        |
+| [Skills 指南](../agent/docs/skills.md)                          | Skill 分类、编写、加载          |
+| [多模态支持](../agent/docs/multimodal.md)                       | 图片、PDF 处理                  |
+| [知识管理](./knowledge.md)                                      | 知识结构、检索、提取机制        |
+| [Scope 设计](./scope-design.md)                                 | 知识可见性和权限控制            |
+| [Agent 设计决策](../agent/docs/decisions.md)                    | Agent Core 架构决策记录         |
+| [Gateway 设计决策](../gateway/docs/decisions.md)                | Gateway 架构决策记录            |
+| [组织级概览](../gateway/docs/enterprise/overview.md)            | 组织级 Agent 系统架构和规划     |
+| [Enterprise 实现](../gateway/docs/enterprise/implementation.md) | 认证、审计、多租户技术实现      |
+| [测试指南](./testing.md)                                        | 测试策略和命令                  |
+| [A2A 协议调研](./research/a2a-protocols.md)                     | 行业 A2A 通信协议和框架对比     |
+| [A2A 跨设备通信](./research/a2a-cross-device.md)                | 跨设备 Agent 通信方案(内部)   |
+| [A2A Trace 存储](./research/a2a-trace-storage.md)               | 跨设备 Trace 存储方案详细设计   |
+| [MAMP 协议](./research/a2a-mamp-protocol.md)                    | 与外部 Agent 系统的通用交互协议 |
+| [A2A IM 系统](./a2a-im.md)                                      | Agent 即时通讯系统架构和实现    |
+| [Gateway 架构](../gateway/docs/architecture.md)                 | Gateway 三层架构和设计决策      |
+| [Gateway 部署](../gateway/docs/deployment.md)                   | Gateway 部署模式和配置          |
+| [Gateway API](../gateway/docs/api.md)                           | Gateway API 完整参考            |

+ 25 - 14
agent/docs/decisions.md

@@ -883,11 +883,15 @@ POST /api/traces/{id}/reflect
 }
 ```
 
-在 trace 末尾追加一条内置反思 prompt 的 user message,以续跑方式运行 agent。Agent 回顾整个执行过程后生成经验总结,结果自动追加到 `./.cache/experiences.md`
+在 trace 末尾追加一条内置反思 prompt 的 user message,以续跑方式运行 agent。Agent 回顾整个执行过程后生成知识总结,通过 `knowledge_save` 工具保存到 KnowHub
 
 不单独调用 LLM、不解析结构化数据——反思就是一次普通的 agent 运行,只是 user message 是预置的反思 prompt。
 
-#### 19d. 经验存储简化为文件
+**注**:此决策中的"经验存储"设计(`./.cache/experiences.md` 文件)已被替换为 KnowHub 知识库(决策 24+),反思现在通过 `knowledge_save` 工具保存结构化知识。
+
+#### 19d. 经验存储简化为文件(已废弃)
+
+> **注**:此设计已被 KnowHub 知识库替代,保留此节仅作历史记录。
 
 经验存储从 MemoryStore(内存/数据库)简化为 `./.cache/experiences.md` 文件:
 - 人类可读可编辑(Markdown)
@@ -895,7 +899,9 @@ POST /api/traces/{id}/reflect
 - 新建 Trace 时由 Runner 读取并注入到第一条 user message 末尾
 - `GET /api/experiences` 直接读取文件内容返回
 
-### 最终 API 设计
+### 最终 API 设计(已部分更新)
+
+> **注**:`GET /api/experiences` 端点已移除,知识管理现通过 KnowHub API 和 `knowledge_*` 工具实现。
 
 ```
 控制类(3 个端点,替代原来的 3 个):
@@ -903,9 +909,8 @@ POST /api/traces/{id}/reflect
   POST /api/traces/{id}/run     → 运行(合并 continue + rewind)
   POST /api/traces/{id}/stop    → 停止(新增)
 
-学习类(2 个端点,全新):
-  POST /api/traces/{id}/reflect → 追加反思 prompt 运行,结果追加到 experiences 文件
-  GET  /api/experiences         → 读取经验文件内容
+学习类(1 个端点):
+  POST /api/traces/{id}/reflect → 追加反思 prompt 运行,通过 knowledge_save 保存知识
 ```
 
 ### 理由
@@ -915,14 +920,14 @@ POST /api/traces/{id}/reflect
 3. **前端简化**:`sendMessage()` 直接透传 `branchPoint` 作为 `insert_after`,无需判断调哪个 API
 4. **停止机制**:asyncio.Event 轻量可靠,每次 LLM 调用前检查,不会在工具执行中途被打断
 5. **反思闭环**:Run → Observe → Intervene → Reflect → Run,形成完整的学习循环
-6. **经验存储极简**:一个 Markdown 文件,不需要数据库,人类可读可编辑可版本控制
+6. **知识管理**:通过 KnowHub 实现结构化知识存储和语义检索
 
 ### 变更范围
 
 - `agent/trace/models.py` — Trace.status 增加 `"stopped"`
-- `agent/core/runner.py` — `_cancel_events` 字典,`stop()` 方法,agent loop 检查取消;`experiences_path` 参数,`_load_experiences()` 方法,新建时注入经验到 user message
-- `agent/trace/run_api.py` — 合并 `continue`/`rewind` 为 `run`,新增 `stop`/`reflect` 端点,`GET /api/experiences` 读取文件
-- `api_server.py` — 注入 experiences_router
+- `agent/core/runner.py` — `_cancel_events` 字典,`stop()` 方法,agent loop 检查取消
+- `agent/trace/run_api.py` — 合并 `continue`/`rewind` 为 `run`,新增 `stop`/`reflect` 端点
+- `api_server.py` — 注入路由
 
 **实现**:`agent/trace/run_api.py`, `agent/core/runner.py`, `agent/trace/models.py`
 
@@ -1070,15 +1075,21 @@ Message Tree 解决了消息层面的分支问题,但 GoalTree 是独立的状
 
 #### 22c. Level 2:LLM 总结(仅在 Level 1 后仍超限时触发)
 
-触发条件:Level 1 之后 token 数仍超过阈值(默认 max_tokens × 0.8)。
+触发条件:Level 1 之后 token 数仍超过阈值(默认 `context_window × 0.5`)。
+
+**注**:
+- 压缩判断仅基于 token 数量,不考虑消息数量(历史版本曾有 50 条消息的限制,已于 2026-03 移除)
+- Token 计算在图片优化后进行,确保基于实际消耗判断
 
 做法:在当前消息列表末尾追加压缩 prompt → 主模型回复 → summary 作为新消息存入 messages/,其 parent_sequence 跳过被压缩的范围。
 
 不使用 utility_llm,就用主模型。压缩和反思都是"在消息列表末尾追加 prompt,主模型回复"。
 
-#### 22d. 压缩前经验提取
+#### 22d. 压缩前知识提取
+
+触发 Level 2 压缩之前,先在消息列表末尾追加反思 prompt → 主模型回复 → 通过 `knowledge_save` 工具保存到 KnowHub。反思消息为侧枝(parent_sequence 分叉,不在主路径上)。
 
-触发 Level 2 压缩之前,先在消息列表末尾追加反思 prompt → 主模型回复 → 结果追加到 `./.cache/experiences.md`。反思消息为侧枝(parent_sequence 分叉,不在主路径上)。
+**注**:原设计中保存到 `./.cache/experiences.md` 文件,现已改为通过 KnowHub API 保存结构化知识
 
 #### 22e. 压缩不修改存储
 
@@ -1166,7 +1177,7 @@ Rewind 事件 payload 中增加 `head_sequence` 字段,便于前端感知分
 
 原有的压缩和反思使用单轮 LLM 调用,但这些任务可能需要多轮推理和工具调用才能做好:
 - **压缩**:可能需要查询 goal_tree 状态、分步总结
-- **反思**:可能需要先分析失败原因、再提取经验,或检查知识库避免重复
+- **反思**:可能需要先分析失败原因、再提取知识,或检查知识库避免重复
 
 单轮调用限制了 LLM 的推理能力,且改变 system prompt 或工具清单会导致缓存失效。
 

+ 5 - 1
agent/llm/qwen.py

@@ -63,7 +63,10 @@ def create_qwen_llm_call(
 
             # 获取内容
             content = response.choices[0].message.content or ""
-            
+
+            # 捕获 thinking 模式的推理内容(不影响 tool_calls 解构)
+            reasoning_content = getattr(response.choices[0].message, "reasoning_content", None) or ""
+
             # --- 关键修正位置 ---
             # 将 Pydantic 对象转换为原始 Dict 列表,这样 runner.py 的 .get() 才不会报错
             tool_calls = None
@@ -82,6 +85,7 @@ def create_qwen_llm_call(
 
             return {
                 "content": content,
+                "reasoning_content": reasoning_content,
                 "tool_calls": tool_calls, # 现在这里是 List[Dict] 了
                 "prompt_tokens": usage.input_tokens,
                 "completion_tokens": usage.output_tokens,

+ 10 - 0
agent/tools/builtin/feishu/chat_history/chat_关涛.json

@@ -202,5 +202,15 @@
   {
     "role": "assistant",
     "content": "🎉 **新进程运行非常顺利!**\n\n**📊 当前执行进度:**\n\n✅ **已完成:**\n1. 加载配置文件 (`pricing.yaml`)\n2. 启动 Agent Runner\n3. 读取 `examples/production/xiaocong/` 目录下的所有核心文件\n4. 创建 3 个子目标:\n   - 📝 **第一步**:制作需求分析 → `analysis.json`\n   - 📝 **第二步**:搜索制作策略 → `strategy.json`\n   - 📝 **第三步**:制定制作工序 → `plan.md`\n\n🔄 **正在进行:**\n- **制作需求分析**,正在解析:\n  - 内容品类:AI 知识科普笔记风格海报\n  - 6 组视觉亮点聚类(3 个实质 + 3 个形式)\n  - 3 个核心元素及权重:\n    - 核心英文单词 (87.3)\n    - 背景 (59.2)\n    - 回形针装饰 (48.7)\n  - 制作表详情\n\n**💡 交互提示已就绪:**\n- 输入 `p` / `pause` → 暂停并进入交互模式\n- 输入 `q` / `quit` → 停止执行\n\n进程状态良好,正在按预期流程执行!需要我继续监控后续输出,或者你想进行其他操作吗?"
+  },
+  {
+    "role": "assistant",
+    "message_id": "om_x100b544a6d87a138c2cd62c8da43092",
+    "content": [
+      {
+        "type": "text",
+        "text": "你好,我需要调研 AI 图片生成后期处理工作流,但浏览器无法启动(容器创建失败)。请协助处理浏览器登录问题,或告知是否有可用的 Cookie 文件。调研需求:\n1. 画中画结构处理:Inpaint+IP-Adapter\n2. Impasto 质感增强:LoRA+SAM2\n3. 细节修复:ADetail\n4. 调色合成:Photoshop/DaVinci"
+      }
+    ]
   }
 ]

+ 36 - 2
agent/tools/builtin/subagent.py

@@ -360,6 +360,33 @@ def _make_event_printer(label: str):
     return on_event
 
 
+def _make_interactive_handler(runner, sub_trace_id: str, parent_trace_id: str, debug_printer=None):
+    """
+    创建支持 stdin 交互检查的 on_event 回调。
+
+    在每个子 Agent 事件触发时检查 stdin,检测到暂停/退出信号后
+    通过 cancel_event.set() 停止子 agent 和父 agent 的执行。
+    """
+    def on_event(item):
+        # 先执行 debug 打印
+        if debug_printer:
+            debug_printer(item)
+
+        # 检查 stdin
+        check_fn = getattr(runner, 'stdin_check', None)
+        if not check_fn:
+            return
+        cmd = check_fn()
+        if cmd in ('pause', 'quit'):
+            # cancel_event.set() 是同步操作,可以在同步回调中直接调用
+            for tid in (sub_trace_id, parent_trace_id):
+                ev = runner._cancel_events.get(tid)
+                if ev:
+                    ev.set()
+
+    return on_event
+
+
 # ===== 统一内部执行函数 =====
 
 async def _run_agents(
@@ -451,7 +478,10 @@ async def _run_agents(
 
         debug = getattr(runner, 'debug', False)
         agent_label = (agent_type or ("delegate" if single else f"explore-{i+1}"))
-        on_event = _make_event_printer(agent_label) if debug else None
+        debug_printer = _make_event_printer(agent_label) if debug else None
+        on_event = _make_interactive_handler(
+            runner, cur_stid, trace_id, debug_printer=debug_printer
+        )
 
         coro = runner.run_result(
             messages=agent_msgs,
@@ -463,6 +493,7 @@ async def _run_agents(
                 tools=allowed_tools,
                 name=task_item[:50],
                 skills=skills,
+                knowledge=context.get("knowledge_config"),
             ),
             on_event=on_event,
         )
@@ -753,7 +784,10 @@ async def evaluate(
                 tools=allowed_tools,
                 name=f"评估: {goal_id}",
             ),
-            on_event=_make_event_printer("evaluate") if getattr(runner, 'debug', False) else None,
+            on_event=_make_interactive_handler(
+                runner, sub_trace_id, trace_id,
+                debug_printer=_make_event_printer("evaluate") if getattr(runner, 'debug', False) else None,
+            ),
         )
 
         await broadcast_sub_trace_completed(

+ 29 - 6
agent/trace/compaction.py

@@ -31,7 +31,7 @@ logger = logging.getLogger(__name__)
 # ===== 模型 Context Window(tokens)=====
 
 MODEL_CONTEXT_WINDOWS: Dict[str, int] = {
-    # Anthropic Claude
+    # --- Anthropic Claude ---
     "claude-sonnet-4": 200_000,
     "claude-opus-4": 200_000,
     "claude-3-5-sonnet": 200_000,
@@ -39,22 +39,45 @@ MODEL_CONTEXT_WINDOWS: Dict[str, int] = {
     "claude-3-opus": 200_000,
     "claude-3-sonnet": 200_000,
     "claude-3-haiku": 200_000,
-    # OpenAI
+    "claude-opus-4.6": 1_000_000,      # 最新旗舰,支持 1M 窗口
+    "claude-sonnet-4.6": 1_000_000,    # 当前主力,1M 窗口已正式开放 (GA)
+    "claude-sonnet-4.5": 1_000_000,    # 你提到的版本,API 支持扩展至 1M
+    "claude-haiku-4.5": 200_000,
+
+    # --- OpenAI ---
     "gpt-4o": 128_000,
     "gpt-4o-mini": 128_000,
     "gpt-4-turbo": 128_000,
     "gpt-4": 8_192,
     "o1": 200_000,
     "o3-mini": 200_000,
-    # Google Gemini
+    "gpt-5-pro": 1_000_000,          # 2026 补充
+
+    # --- Google Gemini ---
     "gemini-2.5-pro": 1_000_000,
     "gemini-2.5-flash": 1_000_000,
     "gemini-2.0-flash": 1_000_000,
     "gemini-1.5-pro": 2_000_000,
     "gemini-1.5-flash": 1_000_000,
-    # DeepSeek
+    "gemini-3.1-pro": 1_000_000,     # 2026 补充
+    "gemini-3-flash": 1_000_000,     # 2026 补充
+
+    # --- Alibaba Qwen (通义千问) ---
+    "qwen3.5-plus": 1_000_000,      # 2026 补充:最新旗舰
+    "qwen3.5-flash": 1_000_000,     # 2026 补充
+    "qwen3.5-coder": 262_144,       # 2026 补充
+    "qwen2.5-72b-instruct": 128_000,
+    "qwen2.5-turbo": 1_000_000,
+    "qwen3.5-397b-a17b":1_000_000,
+    # --- DeepSeek ---
     "deepseek-chat": 64_000,
     "deepseek-r1": 64_000,
+    "deepseek-v3.2": 128_000,        # 2026 补充
+
+    # --- Meta & Others ---
+    "llama-4-scout": 10_000_000,     # 2026 补充:超长窗口变体
+    "llama-4-base": 128_000,
+    "kimi-k1-10m": 10_000_000,       # 月之暗面千万级窗口
 }
 
 DEFAULT_CONTEXT_WINDOW = 200_000
@@ -87,10 +110,10 @@ def get_context_window(model: str) -> int:
 @dataclass
 class CompressionConfig:
     """压缩配置"""
-    max_tokens: int = 0                # 最大 token 数(0 = 自动:context_window * 0.5)
+    max_tokens: int = 0            # 最大 token 数(0 = 自动:context_window * 0.5)
     threshold_ratio: float = 0.5       # 触发压缩的阈值 = context_window 的比例
     keep_recent_messages: int = 10     # Level 1 中始终保留最近 N 条消息
-    max_messages: int = 50             # 最大消息数(超过此数量触发压缩,0 = 禁用)
+    max_messages: int = 0              # 最大消息数(超过此数量触发压缩,0 = 禁用,默认禁用)
 
     def get_max_tokens(self, model: str) -> int:
         """获取实际的 max_tokens(如果为 0 则自动计算)"""

+ 7 - 7
examples/production/config.py

@@ -11,7 +11,7 @@ from agent.core.runner import KnowledgeConfig, RunConfig
 
 RUN_CONFIG = RunConfig(
     # 模型配置
-    model="qwen3.5-plus",
+    model="qwen3.5-397b-a17b",
     temperature=0.3,
     max_iterations=1000,
 
@@ -36,15 +36,15 @@ RUN_CONFIG = RunConfig(
         default_tags={"project": "production"},  # 默认 tags(会与工具调用参数合并)
         default_scopes=["org:cybertogether"],  # 默认 scopes
         default_search_types=["strategy", "tool","plan"],  # 默认搜索类型过滤
-        default_search_owner="sunlit.howard@gmail.com"  # 默认搜索 owner 过滤(空则不过滤)
+        default_search_owner="sunlit.howard@gmail.com,guantao"  # 默认搜索 owner 过滤(空则不过滤)
     )
 )
 
 
 # ===== 任务配置 =====
 
-INPUT_DIR = "examples/plan/huahua"       # 输入素材目录
-OUTPUT_ID = "output_huahua"                   # 输出目录 ID,输出保存在 examples/plan/outputs/{OUTPUT_ID}/
+INPUT_DIR = "examples/production/huahua"       # 输入素材目录
+OUTPUT_DIR = "examples/production/outputs/output_huahua"                   # 输出目录 ID,输出保存在 examples/production/outputs/{OUTPUT_ID}/
 
 
 # ===== 基础设施配置 =====
@@ -56,6 +56,6 @@ LOG_LEVEL = "INFO"
 LOG_FILE = None  # 设置为文件路径可以同时输出到文件
 
 # ===== 浏览器配置 =====
-# 可选值: "cloud" (云浏览器) 或 "local" (本地浏览器)
-BROWSER_TYPE = "cloud"
-HEADLESS = True
+# 可选值: "cloud" (云浏览器) 或 "local" (本地浏览器) 或 "container" (容器浏览器,支持预配置账户)
+BROWSER_TYPE = "local"
+HEADLESS = False

+ 0 - 97
examples/production/examples/production/xiaocong/analysis.json

@@ -1,97 +0,0 @@
-{
-  "category": {
-    "name": "AI 知识科普笔记风格海报",
-    "traits": [
-      "拟物化笔记本纸张背景(带横线、褶皱、虚线边框)",
-      "结构化排版(居中堆叠、虚线分隔、层级列表)",
-      "手绘装饰元素(星星、花朵、笑脸、卡通图标)",
-      "语义化色彩高亮(荧光笔触、彩色字体标记关键术语)",
-      "知识可视化图表(将抽象算法逻辑具象化为矩阵数据)",
-      "手写风格字体与印刷体混用"
-    ],
-    "ai_challenges": [
-      "纸张纹理的真实感还原(褶皱、脏污感、横线间距一致性)",
-      "手绘元素的自然笔触感(避免过于规整的 AI 生成痕迹)",
-      "文字排版的精确对齐(多语言混排、字号层级、居中对齐)",
-      "色彩高亮的语义一致性(荧光笔触边缘模糊效果、颜色透明度)",
-      "拟物化装饰的立体感(回形针光影、螺旋装订孔洞细节)",
-      "表格与图表的结构化生成(行列对齐、填充色均匀、边框清晰)"
-    ],
-    "reasoning": "基于 index.md 和制作亮点.md 的分析,该品类核心特征是将数字化 AI 知识内容包装在实体笔记本的视觉容器中,通过拟物化背景、手绘装饰、结构化排版三大支柱构建'手记'风格。制作点.md 显示核心英文单词(权重 87.3)、背景(59.2)、回形针装饰(48.7)是最关键的三个元素,任何一项还原不到位都会导致'一眼假'。"
-  },
-  "highlight": [
-    {
-      "name": "拟真纸张纹理与笔记本实体感",
-      "description": "米白色纸张背景(RGB: 245, 245, 235)带有横向浅灰色细线,表面有不规则褶皱和轻微脏污感;螺旋活页笔记本框架具有边缘纹理、圆孔、阴影处理,呈现真实触感的书写介质",
-      "reasoning": "这是画面的物理基础,属于实质亮点。制作点中'背景'权重 59.2,是第二大核心元素。纸张纹理的真实感直接决定整体沉浸感,褶皱和脏污感的自然度是 AI 生成的难点,做不好会显得过于干净平整而失去手记的真实感。"
-    },
-    {
-      "name": "核心英文单词的视觉层级",
-      "description": "页面中心位置的大号英文单词(如'Embedding',约 100pt),采用粗体无衬线字体,颜色突出(蓝色 RGB: 60, 140, 220 或黑色#000000),位于彩色背景块或白色纸张中心",
-      "reasoning": "制作点中权重 87.3,是第一大核心元素。作为知识主题的视觉锚点,需要在字号、颜色、位置上形成绝对主导地位。AI 生成时容易出现字号不够突出、颜色对比度不足、位置偏离中心等问题,导致主题识别度下降。"
-    },
-    {
-      "name": "手绘装饰与卡通图标的自然笔触",
-      "description": "星星(五角星、四角星)、花朵(四瓣圆形花瓣 + 圆形花蕊)、笑脸等手绘涂鸦元素散布在画面四角,具有不规则边缘和手绘质感,颜色柔和(粉色 RGB: 255, 180, 200 等)",
-      "reasoning": "属于实质亮点,功能是中和科技主题的枯燥感。手绘元素的关键在于'不完美'的自然感,AI 生成容易过于规整对称,失去手绘的随意性和温度感。需要在形状变化、边缘模糊度、颜色透明度上模拟真实手绘效果。"
-    },
-    {
-      "name": "结构化排版与视觉导视系统",
-      "description": "居中堆叠的标题层级(主标题→副标题→核心词→语录)、虚线分隔线、层级列表、左对齐正文、居中对齐表格,构建严谨清晰的视觉秩序",
-      "reasoning": "属于形式亮点,功能是将复杂信息拆解为易消化模块。AI 生成时容易出现对齐偏差、间距不一致、层级混乱等问题,导致阅读体验下降。需要精确控制各元素的坐标位置和尺寸比例。"
-    },
-    {
-      "name": "语义化色彩高亮与荧光笔触",
-      "description": "模拟学生笔记习惯,用荧光笔触(粉色涂抹区域,边缘模糊)、彩色字体(蓝色关键词、浅灰色辅助词)对关键术语进行视觉强调,建立清晰的信息层级",
-      "reasoning": "属于形式亮点,功能是引导读者快速捕捉核心知识点。荧光笔触的关键在于边缘模糊效果和半透明叠加感,AI 生成容易出现边缘过于锐利或颜色饱和度过高的问题,失去真实荧光笔的质感。"
-    },
-    {
-      "name": "拟物化回形针装饰的立体感",
-      "description": "页面边缘的蓝色或黄色回形针形状装饰(固定在纸张顶部或侧边),具有金属光泽、阴影投射、弯曲弧度的立体感,模拟真实回形针夹住纸张的效果",
-      "reasoning": "制作点中权重 48.7,是第三大核心元素。回形针的立体感依赖于光影处理(高光、阴影、反射),AI 生成容易出现平面化、光影方向不一致、弯曲弧度不自然的问题,导致装饰元素显得虚假。"
-    }
-  ],
-  "baseline": [
-    {
-      "name": "背景纸张纹理的一致性",
-      "description": "横线间距均匀、颜色浅淡(浅灰色)、与纸张底色对比度适中;褶皱分布自然、不重复;虚线边框连续、圆孔大小一致",
-      "why_critical": "背景是画面的基础载体,横线间距不一致或褶皱过于规律会立即暴露 AI 生成痕迹,导致'一眼假'。横线颜色过深会干扰文字阅读,过浅则失去笔记本特征。",
-      "reasoning": "制作点中'背景'权重 59.2,且制作亮点中'拟真纸张与笔记本实体'和'拟物化笔记场景呈现'两个聚类都直接依赖背景质量。img_1、img_2、img_3、img_4 的制作表都显示背景是第一个子段落,是其他元素的承载基础。"
-    },
-    {
-      "name": "文字排版的精确对齐与层级",
-      "description": "主标题居中、副标题居中、核心词居中、语录居中;字号层级清晰(100pt→90pt→30pt→25pt);行间距、段间距一致;多语言混排时基线对齐",
-      "why_critical": "结构化排版是该品类的核心形式特征,对齐偏差或层级混乱会破坏视觉秩序,导致信息传达效率下降。AI 生成容易出现文字偏移、字号比例失调、行距不一致的问题。",
-      "reasoning": "制作亮点中'结构化排版与导视'聚类强调'严谨而清晰的视觉秩序',img_2 制作表显示文字排版的 combined_score 为 0.602,是较高的评分项。4 张图都采用居中堆叠的排版结构,这是品类的标志性特征。"
-    },
-    {
-      "name": "核心英文单词的视觉主导地位",
-      "description": "字号最大(约 100pt)、颜色对比度高(蓝色或黑色)、位置居中、无遮挡;与背景形成清晰的图底关系",
-      "why_critical": "制作点中权重 87.3,是第一大核心元素。如果核心词不够突出,会导致主题识别度下降,观众无法快速抓住知识主题。AI 生成容易出现字号不够大、颜色对比度不足、位置偏离的问题。",
-      "reasoning": "制作点.md 明确显示'核心英文单词'权重 87.3,远高于其他元素。4 张图的制作表都包含'核心英文单词'子段落(段落 X.2.2),且文字字号评分都较高,说明这是必须精准还原的上限点。"
-    },
-    {
-      "name": "手绘装饰元素的自然不规则性",
-      "description": "星星、花朵等形状有轻微变形、边缘不完全平滑、颜色有深浅变化;分布位置看似随意但有视觉平衡;不与其他元素重叠遮挡",
-      "why_critical": "手绘装饰的功能是增加温度感和活泼感,如果过于规整对称会失去手绘的灵魂,显得机械呆板。AI 生成容易追求完美对称,反而暴露生成痕迹。",
-      "reasoning": "制作亮点中'手绘装饰与卡通图标'聚类强调'轻松活泼的风格',img_1 制作表显示图案形状的 combined_score 为 0.49,相对较低,说明这是容易出问题的环节。4 张图都有手绘装饰元素,是品类的标志性特征。"
-    },
-    {
-      "name": "色彩高亮的半透明叠加效果",
-      "description": "荧光笔触颜色半透明(可看到下方文字或纹理)、边缘模糊渐变、颜色饱和度适中(不过于鲜艳);彩色字体与背景对比度适中",
-      "why_critical": "荧光笔触的关键在于模拟真实荧光笔的半透明叠加效果,如果颜色完全不透明或边缘过于锐利,会显得虚假。AI 生成容易出现颜色饱和度过高、边缘清晰的问题。",
-      "reasoning": "制作亮点中'语义化色彩高亮'聚类强调'模拟学生笔记时的色彩标记习惯',img_1 制作表显示涂抹颜色的 combined_score 为 0.406,涂抹位置的 combined_score 为 0.42,都相对较低,说明这是需要特别注意的下限点。"
-    }
-  ],
-  "requirement_summary": [
-    "生成米白色纸张背景(RGB: 245, 245, 235),带有横向浅灰色细线、不规则褶皱、轻微脏污感,虚线边框和圆孔(螺旋笔记本特征)",
-    "在页面中心位置生成大号英文单词(约 100pt),采用粗体无衬线字体,颜色为蓝色(RGB: 60, 140, 220)或黑色(#000000),形成视觉主导地位",
-    "在画面四角添加手绘装饰元素(星星、花朵、笑脸),形状有轻微变形、边缘不完全平滑、颜色柔和(粉色 RGB: 255, 180, 200 等),分布看似随意但有视觉平衡",
-    "采用居中堆叠的排版结构:主标题→副标题→核心词→语录,字号层级清晰(100pt→90pt→30pt→25pt),行间距、段间距一致",
-    "对关键术语使用荧光笔触高亮(粉色涂抹区域,边缘模糊,半透明叠加效果)和彩色字体标记(蓝色关键词、浅灰色辅助词)",
-    "在页面边缘添加回形针装饰(蓝色或黄色),具有金属光泽、阴影投射、弯曲弧度的立体感,模拟真实回形针夹住纸张的效果",
-    "生成知识可视化图表(如 Embedding 矩阵),表格行列对齐、填充色均匀(浅绿色#90EE90、浅紫色#E6E6FA、白色#FFFFFF)、边框清晰",
-    "确保多语言混排时基线对齐,中文采用手写风格粗体字体,英文采用粗体无衬线字体或手写风格衬线字体",
-    "整体色调以米白色、蓝色、黄色为主,色彩搭配和谐,避免过于鲜艳或对比度过高的颜色组合"
-  ]
-}

binární
examples/production/huahua/features/background_asset/background_bokeh_img2.png


binární
examples/production/huahua/features/background_asset/background_green_img1.png


binární
examples/production/huahua/features/background_asset/background_green_img4.png


+ 0 - 62
examples/production/huahua/features/background_asset/mapping.json

@@ -1,62 +0,0 @@
-{
-  "dimension": "background_asset",
-  "type": "实质",
-  "highlight_cluster": "清新雅致的白绿配色 / 唯美梦幻的光影与景深",
-  "description": "户外自然背景素材,包含三种典型状态:清晰绿色草地+树木(img_1)、高饱和绿色背景(img_4)、逆光+散景梦幻背景(img_2)",
-  "files": {
-    "background_green_img1.png": {
-      "source_image": "img_1",
-      "state": "clear green trees and grass, soft natural light",
-      "purpose": "清晰自然绿色背景参考,白绿配色基础"
-    },
-    "background_green_img4.png": {
-      "source_image": "img_4",
-      "state": "vivid saturated green trees and grass, bright daylight",
-      "purpose": "高饱和绿色背景参考,白绿配色最典型"
-    },
-    "background_bokeh_img2.png": {
-      "source_image": "img_2",
-      "state": "backlit green trees with lens flare and bokeh light spots",
-      "purpose": "逆光散景梦幻背景参考,光影景深亮点"
-    }
-  },
-  "mapping": [
-    {
-      "image": "img_1",
-      "paragraph": "段落1.3",
-      "type": "实质",
-      "feature": "自然绿色背景(草地+树木)",
-      "highlight": "清新雅致的白绿配色"
-    },
-    {
-      "image": "img_2",
-      "paragraph": "段落2.3",
-      "type": "实质",
-      "feature": "逆光散景自然背景",
-      "highlight": "唯美梦幻的光影与景深"
-    },
-    {
-      "image": "img_3",
-      "paragraph": "段落3.3",
-      "type": "实质",
-      "feature": "自然背景(含远处建筑)",
-      "highlight": "唯美梦幻的光影与景深"
-    },
-    {
-      "image": "img_4",
-      "paragraph": "段落4.3",
-      "type": "实质",
-      "feature": "高饱和绿色自然背景",
-      "highlight": "清新雅致的白绿配色"
-    },
-    {
-      "image": "img_5",
-      "paragraph": "段落5.3",
-      "type": "实质",
-      "feature": "虚化绿色草地背景",
-      "highlight": "唯美梦幻的光影与景深"
-    }
-  ],
-  "consistency_elements": ["自然背景"],
-  "generation_notes": "背景主色调为高饱和度草木绿(HSV: 100-120°, S>150, V>100),包含草地(下半部分)和树木(上半部分),img_2/3/5有逆光散景效果"
-}

binární
examples/production/huahua/features/character_asset/character_ref_back.png


binární
examples/production/huahua/features/character_asset/character_ref_img1.png


binární
examples/production/huahua/features/character_asset/character_ref_kneel.png


binární
examples/production/huahua/features/character_asset/character_ref_main.png


binární
examples/production/huahua/features/character_asset/character_ref_side.png


+ 0 - 75
examples/production/huahua/features/character_asset/mapping.json

@@ -1,75 +0,0 @@
-{
-  "dimension": "character_asset",
-  "type": "实质",
-  "highlight_cluster": "优雅的白裙写生少女",
-  "description": "白裙写生少女人物角色素材,作为图集一致性基座。棕色长直发,纯白宽松长袖连衣裙,手持画笔和调色板。",
-  "files": {
-    "character_ref_back.png": {
-      "source_image": "img_1",
-      "view": "3/4 back view",
-      "purpose": "IP-Adapter主参考图"
-    },
-    "character_ref_main.png": {
-      "source_image": "img_2",
-      "view": "rear view",
-      "purpose": "正后方人物参考"
-    },
-    "character_ref_img1.png": {
-      "source_image": "img_1",
-      "view": "medium shot",
-      "purpose": "中景人物参考"
-    },
-    "character_ref_side.png": {
-      "source_image": "img_4",
-      "view": "side profile",
-      "purpose": "侧面参考"
-    },
-    "character_ref_kneel.png": {
-      "source_image": "img_3",
-      "view": "kneeling pose",
-      "purpose": "跪坐姿态参考"
-    }
-  },
-  "mapping": [
-    {
-      "image": "img_1",
-      "paragraph": "段落1.1",
-      "type": "实质",
-      "feature": "人物角色基座",
-      "highlight": "优雅的白裙写生少女"
-    },
-    {
-      "image": "img_2",
-      "paragraph": "段落2.1",
-      "type": "实质",
-      "feature": "人物角色基座",
-      "highlight": "优雅的白裙写生少女"
-    },
-    {
-      "image": "img_3",
-      "paragraph": "段落3.1",
-      "type": "实质",
-      "feature": "人物角色基座",
-      "highlight": "优雅的白裙写生少女"
-    },
-    {
-      "image": "img_4",
-      "paragraph": "段落4.1.1",
-      "type": "实质",
-      "feature": "人物角色基座",
-      "highlight": "优雅的白裙写生少女"
-    },
-    {
-      "image": "img_5",
-      "paragraph": "段落5.1",
-      "type": "实质",
-      "feature": "人物角色基座",
-      "highlight": "优雅的白裙写生少女"
-    }
-  ],
-  "consistency_elements": [
-    "女性",
-    "女性衣物"
-  ],
-  "generation_notes": "使用IP-Adapter注入人物一致性,配合DWPose控制姿态"
-}

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 2
examples/production/huahua/features/color_scheme/color_scheme.json


+ 0 - 150
examples/production/huahua/features/color_scheme/color_scheme_complete.json

@@ -1,150 +0,0 @@
-{
-  "dimension": "color_scheme",
-  "type": "形式",
-  "highlight_cluster": "清新雅致的白绿配色",
-  "description": "大面积高饱和度自然草木绿背景与人物衣着纯白形成鲜明对比,确立清新自然治愈感的森系视觉基调",
-  "core_contrast": {
-    "formula": "Pure White (#FFFFFF) vs Vivid Green (HSV: 100-120°, S>60%, V>40%)",
-    "contrast_ratio": ">4:1",
-    "sd_tokens": "pure white dress, vivid green background, high contrast, fresh natural color palette, forest aesthetic"
-  },
-  "color_groups": {
-    "white_green_contrast": {
-      "primary_white": {
-        "hex": "#FFFFFF",
-        "rgb": [
-          255,
-          255,
-          255
-        ],
-        "role": "人物白裙 - 纯净主体色"
-      },
-      "vivid_green_1": {
-        "hex": "#4A7C3F",
-        "rgb": [
-          74,
-          124,
-          63
-        ],
-        "role": "自然草木绿 - 高饱和背景"
-      },
-      "vivid_green_2": {
-        "hex": "#6C9255",
-        "rgb": [
-          108,
-          146,
-          85
-        ],
-        "role": "浅草绿 - 中景草地"
-      },
-      "deep_green": {
-        "hex": "#1F2D1E",
-        "rgb": [
-          31,
-          45,
-          30
-        ],
-        "role": "深绿 - 树木阴影"
-      }
-    },
-    "warm_light_accent": {
-      "golden_hour": {
-        "hex": "#D4A853",
-        "rgb": [
-          212,
-          168,
-          83
-        ],
-        "role": "逆光金色 - 光晕暖色"
-      },
-      "warm_skin": {
-        "hex": "#E8C4A0",
-        "rgb": [
-          232,
-          196,
-          160
-        ],
-        "role": "肤色暖调"
-      }
-    },
-    "palette_colors": {
-      "palette_green": {
-        "hex": "#4A8C3F",
-        "rgb": [
-          74,
-          140,
-          63
-        ],
-        "role": "调色板绿色颜料"
-      },
-      "palette_blue": {
-        "hex": "#2E5FA3",
-        "rgb": [
-          46,
-          95,
-          163
-        ],
-        "role": "调色板蓝色颜料"
-      },
-      "palette_red": {
-        "hex": "#C0392B",
-        "rgb": [
-          192,
-          57,
-          43
-        ],
-        "role": "调色板红色颜料"
-      },
-      "palette_yellow": {
-        "hex": "#F1C40F",
-        "rgb": [
-          241,
-          196,
-          15
-        ],
-        "role": "调色板黄色颜料"
-      },
-      "palette_purple": {
-        "hex": "#8E44AD",
-        "rgb": [
-          142,
-          68,
-          173
-        ],
-        "role": "调色板紫色颜料"
-      }
-    }
-  },
-  "per_image_dominant": {
-    "img_1": {
-      "primary": "#3C4C34",
-      "secondary": "#FFFFFF",
-      "accent": "#8E9E9F",
-      "mood": "清新自然"
-    },
-    "img_2": {
-      "primary": "#2D4A2A",
-      "secondary": "#FFFFFF",
-      "accent": "#D4A853",
-      "mood": "逆光梦幻"
-    },
-    "img_3": {
-      "primary": "#4A7C3F",
-      "secondary": "#FFFFFF",
-      "accent": "#C8A870",
-      "mood": "温暖田园"
-    },
-    "img_4": {
-      "primary": "#5A8A45",
-      "secondary": "#FFFFFF",
-      "accent": "#7AB060",
-      "mood": "清新明亮"
-    },
-    "img_5": {
-      "primary": "#4A7C3F",
-      "secondary": "#FFFFFF",
-      "accent": "#8B6914",
-      "mood": "艺术创作"
-    }
-  }
-}

binární
examples/production/huahua/features/color_scheme/color_scheme_visual.png


binární
examples/production/huahua/features/color_scheme/color_swatch.png


+ 0 - 132
examples/production/huahua/features/color_scheme/img_1_colors.json

@@ -1,132 +0,0 @@
-{
-  "dominant_colors": [
-    {
-      "hex": "#1f2d1e",
-      "rgb": [
-        31,
-        45,
-        30
-      ],
-      "hsv": [
-        58,
-        85,
-        45
-      ],
-      "ratio": 0.199,
-      "percentage": "19.9%"
-    },
-    {
-      "hex": "#3c4c34",
-      "rgb": [
-        60,
-        76,
-        52
-      ],
-      "hsv": [
-        50,
-        81,
-        76
-      ],
-      "ratio": 0.1802,
-      "percentage": "18.0%"
-    },
-    {
-      "hex": "#567642",
-      "rgb": [
-        86,
-        118,
-        66
-      ],
-      "hsv": [
-        48,
-        112,
-        118
-      ],
-      "ratio": 0.1618,
-      "percentage": "16.2%"
-    },
-    {
-      "hex": "#6c9255",
-      "rgb": [
-        108,
-        146,
-        85
-      ],
-      "hsv": [
-        49,
-        107,
-        146
-      ],
-      "ratio": 0.1498,
-      "percentage": "15.0%"
-    },
-    {
-      "hex": "#8e9e9f",
-      "rgb": [
-        142,
-        158,
-        159
-      ],
-      "hsv": [
-        92,
-        27,
-        159
-      ],
-      "ratio": 0.1126,
-      "percentage": "11.3%"
-    },
-    {
-      "hex": "#a6b6bd",
-      "rgb": [
-        166,
-        182,
-        189
-      ],
-      "hsv": [
-        99,
-        31,
-        189
-      ],
-      "ratio": 0.0862,
-      "percentage": "8.6%"
-    },
-    {
-      "hex": "#607d7e",
-      "rgb": [
-        96,
-        125,
-        126
-      ],
-      "hsv": [
-        91,
-        61,
-        126
-      ],
-      "ratio": 0.0554,
-      "percentage": "5.5%"
-    },
-    {
-      "hex": "#c5d3dd",
-      "rgb": [
-        197,
-        211,
-        221
-      ],
-      "hsv": [
-        103,
-        28,
-        221
-      ],
-      "ratio": 0.055,
-      "percentage": "5.5%"
-    }
-  ],
-  "color_temperature": "neutral",
-  "saturation_level": "medium",
-  "brightness_level": "dark",
-  "white_green_contrast": {
-    "description": "High contrast between pure white (dress) and vivid green (natural background)",
-    "white_ratio": 0,
-    "green_ratio": 0.3116
-  }
-}

binární
examples/production/huahua/features/color_scheme/img_1_palette.png


+ 0 - 132
examples/production/huahua/features/color_scheme/img_2_colors.json

@@ -1,132 +0,0 @@
-{
-  "dominant_colors": [
-    {
-      "hex": "#94b164",
-      "rgb": [
-        148,
-        177,
-        100
-      ],
-      "hsv": [
-        41,
-        111,
-        177
-      ],
-      "ratio": 0.1993,
-      "percentage": "19.9%"
-    },
-    {
-      "hex": "#edf0ee",
-      "rgb": [
-        237,
-        240,
-        238
-      ],
-      "hsv": [
-        70,
-        3,
-        240
-      ],
-      "ratio": 0.1808,
-      "percentage": "18.1%"
-    },
-    {
-      "hex": "#c7d4d4",
-      "rgb": [
-        199,
-        212,
-        212
-      ],
-      "hsv": [
-        90,
-        16,
-        212
-      ],
-      "ratio": 0.1391,
-      "percentage": "13.9%"
-    },
-    {
-      "hex": "#454233",
-      "rgb": [
-        69,
-        66,
-        51
-      ],
-      "hsv": [
-        25,
-        67,
-        69
-      ],
-      "ratio": 0.1192,
-      "percentage": "11.9%"
-    },
-    {
-      "hex": "#808a5f",
-      "rgb": [
-        128,
-        138,
-        95
-      ],
-      "hsv": [
-        37,
-        79,
-        138
-      ],
-      "ratio": 0.1177,
-      "percentage": "11.8%"
-    },
-    {
-      "hex": "#5f604b",
-      "rgb": [
-        95,
-        96,
-        75
-      ],
-      "hsv": [
-        31,
-        56,
-        96
-      ],
-      "ratio": 0.1042,
-      "percentage": "10.4%"
-    },
-    {
-      "hex": "#c5b994",
-      "rgb": [
-        197,
-        185,
-        148
-      ],
-      "hsv": [
-        23,
-        63,
-        197
-      ],
-      "ratio": 0.0879,
-      "percentage": "8.8%"
-    },
-    {
-      "hex": "#8aa6a4",
-      "rgb": [
-        138,
-        166,
-        164
-      ],
-      "hsv": [
-        88,
-        43,
-        166
-      ],
-      "ratio": 0.0518,
-      "percentage": "5.2%"
-    }
-  ],
-  "color_temperature": "neutral",
-  "saturation_level": "low",
-  "brightness_level": "bright",
-  "white_green_contrast": {
-    "description": "High contrast between pure white (dress) and vivid green (natural background)",
-    "white_ratio": 0.1808,
-    "green_ratio": 0.5496
-  }
-}

binární
examples/production/huahua/features/color_scheme/img_2_palette.png


+ 0 - 132
examples/production/huahua/features/color_scheme/img_3_colors.json

@@ -1,132 +0,0 @@
-{
-  "dominant_colors": [
-    {
-      "hex": "#f5f6f3",
-      "rgb": [
-        245,
-        246,
-        243
-      ],
-      "hsv": [
-        40,
-        3,
-        246
-      ],
-      "ratio": 0.1762,
-      "percentage": "17.6%"
-    },
-    {
-      "hex": "#839c56",
-      "rgb": [
-        131,
-        156,
-        86
-      ],
-      "hsv": [
-        41,
-        114,
-        156
-      ],
-      "ratio": 0.1738,
-      "percentage": "17.4%"
-    },
-    {
-      "hex": "#6b744d",
-      "rgb": [
-        107,
-        116,
-        77
-      ],
-      "hsv": [
-        37,
-        86,
-        116
-      ],
-      "ratio": 0.1655,
-      "percentage": "16.6%"
-    },
-    {
-      "hex": "#a1bd67",
-      "rgb": [
-        161,
-        189,
-        103
-      ],
-      "hsv": [
-        40,
-        116,
-        189
-      ],
-      "ratio": 0.1475,
-      "percentage": "14.8%"
-    },
-    {
-      "hex": "#4f5139",
-      "rgb": [
-        79,
-        81,
-        57
-      ],
-      "hsv": [
-        33,
-        76,
-        81
-      ],
-      "ratio": 0.1119,
-      "percentage": "11.2%"
-    },
-    {
-      "hex": "#cadee1",
-      "rgb": [
-        202,
-        222,
-        225
-      ],
-      "hsv": [
-        94,
-        26,
-        225
-      ],
-      "ratio": 0.1059,
-      "percentage": "10.6%"
-    },
-    {
-      "hex": "#c2c0a4",
-      "rgb": [
-        194,
-        192,
-        164
-      ],
-      "hsv": [
-        28,
-        39,
-        194
-      ],
-      "ratio": 0.0803,
-      "percentage": "8.0%"
-    },
-    {
-      "hex": "#749da1",
-      "rgb": [
-        116,
-        157,
-        161
-      ],
-      "hsv": [
-        93,
-        71,
-        161
-      ],
-      "ratio": 0.0389,
-      "percentage": "3.9%"
-    }
-  ],
-  "color_temperature": "neutral",
-  "saturation_level": "low",
-  "brightness_level": "medium",
-  "white_green_contrast": {
-    "description": "High contrast between pure white (dress) and vivid green (natural background)",
-    "white_ratio": 0.2821,
-    "green_ratio": 0.6629999999999999
-  }
-}

binární
examples/production/huahua/features/color_scheme/img_3_palette.png


+ 0 - 132
examples/production/huahua/features/color_scheme/img_4_colors.json

@@ -1,132 +0,0 @@
-{
-  "dominant_colors": [
-    {
-      "hex": "#5e6f3f",
-      "rgb": [
-        94,
-        111,
-        63
-      ],
-      "hsv": [
-        41,
-        110,
-        111
-      ],
-      "ratio": 0.2054,
-      "percentage": "20.5%"
-    },
-    {
-      "hex": "#7a7b4c",
-      "rgb": [
-        122,
-        123,
-        76
-      ],
-      "hsv": [
-        31,
-        97,
-        123
-      ],
-      "ratio": 0.1574,
-      "percentage": "15.7%"
-    },
-    {
-      "hex": "#968e58",
-      "rgb": [
-        150,
-        142,
-        88
-      ],
-      "hsv": [
-        26,
-        105,
-        150
-      ],
-      "ratio": 0.1407,
-      "percentage": "14.1%"
-    },
-    {
-      "hex": "#dce2e2",
-      "rgb": [
-        220,
-        226,
-        226
-      ],
-      "hsv": [
-        90,
-        7,
-        226
-      ],
-      "ratio": 0.1277,
-      "percentage": "12.8%"
-    },
-    {
-      "hex": "#50562a",
-      "rgb": [
-        80,
-        86,
-        42
-      ],
-      "hsv": [
-        34,
-        130,
-        86
-      ],
-      "ratio": 0.127,
-      "percentage": "12.7%"
-    },
-    {
-      "hex": "#ad9d7a",
-      "rgb": [
-        173,
-        157,
-        122
-      ],
-      "hsv": [
-        21,
-        75,
-        173
-      ],
-      "ratio": 0.0945,
-      "percentage": "9.4%"
-    },
-    {
-      "hex": "#c2bcac",
-      "rgb": [
-        194,
-        188,
-        172
-      ],
-      "hsv": [
-        22,
-        29,
-        194
-      ],
-      "ratio": 0.0868,
-      "percentage": "8.7%"
-    },
-    {
-      "hex": "#2e321c",
-      "rgb": [
-        46,
-        50,
-        28
-      ],
-      "hsv": [
-        35,
-        112,
-        50
-      ],
-      "ratio": 0.0605,
-      "percentage": "6.0%"
-    }
-  ],
-  "color_temperature": "neutral",
-  "saturation_level": "medium",
-  "brightness_level": "medium",
-  "white_green_contrast": {
-    "description": "High contrast between pure white (dress) and vivid green (natural background)",
-    "white_ratio": 0.1277,
-    "green_ratio": 0.3628
-  }
-}

binární
examples/production/huahua/features/color_scheme/img_4_palette.png


+ 0 - 132
examples/production/huahua/features/color_scheme/img_5_colors.json

@@ -1,132 +0,0 @@
-{
-  "dominant_colors": [
-    {
-      "hex": "#3d5c2a",
-      "rgb": [
-        61,
-        92,
-        42
-      ],
-      "hsv": [
-        49,
-        139,
-        92
-      ],
-      "ratio": 0.2671,
-      "percentage": "26.7%"
-    },
-    {
-      "hex": "#e9ecef",
-      "rgb": [
-        233,
-        236,
-        239
-      ],
-      "hsv": [
-        105,
-        6,
-        239
-      ],
-      "ratio": 0.2276,
-      "percentage": "22.8%"
-    },
-    {
-      "hex": "#c2cace",
-      "rgb": [
-        194,
-        202,
-        206
-      ],
-      "hsv": [
-        100,
-        15,
-        206
-      ],
-      "ratio": 0.195,
-      "percentage": "19.5%"
-    },
-    {
-      "hex": "#2d7065",
-      "rgb": [
-        45,
-        112,
-        101
-      ],
-      "hsv": [
-        85,
-        153,
-        112
-      ],
-      "ratio": 0.0843,
-      "percentage": "8.4%"
-    },
-    {
-      "hex": "#b0aba5",
-      "rgb": [
-        176,
-        171,
-        165
-      ],
-      "hsv": [
-        16,
-        16,
-        176
-      ],
-      "ratio": 0.0753,
-      "percentage": "7.5%"
-    },
-    {
-      "hex": "#1e2f1e",
-      "rgb": [
-        30,
-        47,
-        30
-      ],
-      "hsv": [
-        60,
-        92,
-        47
-      ],
-      "ratio": 0.0533,
-      "percentage": "5.3%"
-    },
-    {
-      "hex": "#927756",
-      "rgb": [
-        146,
-        119,
-        86
-      ],
-      "hsv": [
-        17,
-        105,
-        146
-      ],
-      "ratio": 0.0524,
-      "percentage": "5.2%"
-    },
-    {
-      "hex": "#6196b6",
-      "rgb": [
-        97,
-        150,
-        182
-      ],
-      "hsv": [
-        101,
-        119,
-        182
-      ],
-      "ratio": 0.045,
-      "percentage": "4.5%"
-    }
-  ],
-  "color_temperature": "neutral",
-  "saturation_level": "low",
-  "brightness_level": "medium",
-  "white_green_contrast": {
-    "description": "High contrast between pure white (dress) and vivid green (natural background)",
-    "white_ratio": 0.2276,
-    "green_ratio": 0.0843
-  }
-}

binární
examples/production/huahua/features/color_scheme/img_5_palette.png


+ 0 - 56
examples/production/huahua/features/color_scheme/mapping.json

@@ -1,56 +0,0 @@
-{
-  "dimension": "color_scheme",
-  "type": "形式",
-  "highlight_cluster": "清新雅致的白绿配色",
-  "description": "大面积高饱和度自然草木绿背景与人物衣着纯白形成鲜明对比,确立清新自然治愈感的森系视觉基调",
-  "files": {
-    "color_scheme_visual.png": {
-      "type": "视觉参考图",
-      "purpose": "完整色彩方案可视化,包含白绿对比、暖光色调、调色板颜料色三组配色",
-      "tool": "Python PIL生成"
-    },
-    "color_scheme_complete.json": {
-      "type": "完整色彩数据",
-      "purpose": "包含所有颜色组的HEX值、RGB值、角色描述和SD提示词"
-    },
-    "img_1_palette.png": "img_1色板可视化(白绿配色典型)",
-    "img_4_palette.png": "img_4色板可视化(白绿配色最典型)"
-  },
-  "key_colors": {
-    "primary_white": {
-      "hex": "#FFFFFF",
-      "role": "人物白裙,纯净主体色",
-      "sd_token": "pure white dress, white clothing"
-    },
-    "primary_green": {
-      "hex": "#4A7C3F",
-      "role": "自然草木绿背景,高饱和度",
-      "sd_token": "lush green grass, vivid green trees, saturated green background"
-    },
-    "accent_warm": {
-      "hex": "#D4A853",
-      "role": "阳光暖色调,逆光光晕",
-      "sd_token": "warm sunlight, golden hour light"
-    }
-  },
-  "color_contrast_formula": "High contrast: Pure white (#FFFFFF) vs Vivid green (HSV: 100-120°, S>60%, V>40%)",
-  "sd_tokens": "pure white dress, vivid green background, high contrast, fresh natural color palette, forest aesthetic, white and green color scheme",
-  "mapping": [
-    {
-      "image": "img_1",
-      "paragraph": "段落1",
-      "type": "形式",
-      "feature": "白绿配色",
-      "specific": "白裙+绿色草地背景",
-      "path": "features/color_scheme/color_scheme_visual.png"
-    },
-    {
-      "image": "img_4",
-      "paragraph": "段落4",
-      "type": "形式",
-      "feature": "白绿配色",
-      "specific": "白裙+高饱和绿色背景(最典型)",
-      "path": "features/color_scheme/color_scheme_visual.png"
-    }
-  ]
-}

binární
examples/production/huahua/features/depth_map/depth_img_1.png


binární
examples/production/huahua/features/depth_map/depth_img_2.png


binární
examples/production/huahua/features/depth_map/depth_img_3.png


binární
examples/production/huahua/features/depth_map/depth_img_4.png


binární
examples/production/huahua/features/depth_map/depth_img_5.png


+ 0 - 79
examples/production/huahua/features/depth_map/mapping.json

@@ -1,79 +0,0 @@
-{
-  "dimension": "depth_map",
-  "type": "形式",
-  "description": "深度图,用于ControlNet深度控制,反映场景空间层次和浅景深效果",
-  "valid_files": {
-    "depth_img_1.png": {
-      "source": "img_1",
-      "method": "局部方差法(清晰度代理深度)",
-      "mean": 72.3
-    },
-    "depth_img_2.png": {
-      "source": "img_2",
-      "method": "局部方差法(清晰度代理深度)",
-      "mean": 79.1
-    },
-    "depth_img_3.png": {
-      "source": "img_3",
-      "method": "局部方差法(清晰度代理深度)",
-      "mean": 93.1
-    },
-    "depth_img_4.png": {
-      "source": "img_4",
-      "method": "局部方差法(清晰度代理深度)",
-      "mean": 82.5
-    },
-    "depth_img_5.png": {
-      "source": "img_5",
-      "method": "局部方差法(清晰度代理深度)",
-      "mean": 65.8
-    }
-  },
-  "tool_limitation": "当前使用OpenCV局部方差法(清晰度作为深度代理),非真实深度估计。建议生产环境使用MiDaS/DPT-Large/Depth-Anything-V2模型获取更精准的深度图。",
-  "recommended_tool": "Depth-Anything-V2 (2024年最新,精度最高) 或 MiDaS v3.1",
-  "depth_interpretation": {
-    "white": "近景(清晰区域)- 人物、画架、调色板",
-    "gray": "中景",
-    "black": "远景(虚化区域)- 背景树木草地"
-  },
-  "mapping": [
-    {
-      "image": "img_2",
-      "paragraph": "段落2",
-      "type": "形式",
-      "feature": "景深空间关系",
-      "highlight": "唯美梦幻的光影与景深",
-      "path": "features/depth_map/depth_img_2.png"
-    },
-    {
-      "image": "img_3",
-      "paragraph": "段落3",
-      "type": "形式",
-      "feature": "景深空间关系",
-      "highlight": "唯美梦幻的光影与景深",
-      "path": "features/depth_map/depth_img_3.png"
-    },
-    {
-      "image": "img_5",
-      "paragraph": "段落5",
-      "type": "形式",
-      "feature": "景深空间关系",
-      "highlight": "唯美梦幻的光影与景深",
-      "path": "features/depth_map/depth_img_5.png"
-    },
-    {
-      "image": "img_1",
-      "paragraph": "段落1",
-      "type": "形式",
-      "feature": "景深空间关系",
-      "path": "features/depth_map/depth_img_1.png"
-    },
-    {
-      "image": "img_4",
-      "paragraph": "段落4",
-      "type": "形式",
-      "feature": "景深空间关系",
-      "path": "features/depth_map/depth_img_4.png"
-    }
-  ]
-}

binární
examples/production/huahua/features/easel_asset/easel_blank_canvas_img4.png


+ 0 - 55
examples/production/huahua/features/easel_asset/mapping.json

@@ -1,55 +0,0 @@
-{
-  "dimension": "easel_asset",
-  "type": "实质",
-  "highlight_cluster": "构建叙事的写生道具",
-  "description": "木质三脚画架本体素材,包含两种状态:承载进行中油画的画架(img_3)和承载空白画布+白玫瑰的画架(img_4)",
-  "files": {
-    "easel_blank_canvas_img4.png": {
-      "source_image": "img_4",
-      "state": "easel with blank white canvas + white rose on crossbar",
-      "purpose": "画架+空白画布+白玫瑰参考,用于写生道具叙事场景"
-    }
-  },
-  "missing_files": {
-    "easel_with_painting_img3.png": "画架+进行中油画参考图已删除"
-  },
-  "mapping": [
-    {
-      "image": "img_1",
-      "paragraph": "段落1.2",
-      "type": "实质",
-      "feature": "木质三脚画架",
-      "highlight": "构建叙事的写生道具"
-    },
-    {
-      "image": "img_2",
-      "paragraph": "段落2.2",
-      "type": "实质",
-      "feature": "木质三脚画架",
-      "highlight": "构建叙事的写生道具"
-    },
-    {
-      "image": "img_3",
-      "paragraph": "段落3.2",
-      "type": "实质",
-      "feature": "木质三脚画架(含油画)",
-      "highlight": "构建叙事的写生道具"
-    },
-    {
-      "image": "img_4",
-      "paragraph": "段落4.2",
-      "type": "实质",
-      "feature": "木质三脚画架(空白画布+白玫瑰)",
-      "highlight": "构建叙事的写生道具"
-    },
-    {
-      "image": "img_5",
-      "paragraph": "段落5.2",
-      "type": "实质",
-      "feature": "木质三脚画架(局部可见)",
-      "highlight": "构建叙事的写生道具"
-    }
-  ],
-  "consistency_elements": ["画架与画布", "画架与油画"],
-  "generation_notes": "画架为浅棕色木质三脚架结构,高约150-180cm,宽约60-80cm,顶部有可调节画板支撑架,底部有横向支撑杆"
-}

binární
examples/production/huahua/features/edge_map/img_1_canny.png


binární
examples/production/huahua/features/edge_map/img_2_canny.png


binární
examples/production/huahua/features/edge_map/img_3_canny.png


binární
examples/production/huahua/features/edge_map/img_4_canny.png


binární
examples/production/huahua/features/edge_map/img_5_canny.png


+ 0 - 45
examples/production/huahua/features/edge_map/mapping.json

@@ -1,45 +0,0 @@
-{
-  "dimension": "edge_map",
-  "type": "形式",
-  "description": "Canny边缘检测图,用于ControlNet结构控制,保留人物轮廓、画架结构等关键线条",
-  "tool": "OpenCV Canny边缘检测 (threshold: 50-150)",
-  "files": {
-    "img_1_canny.png": "img_1 Canny边缘图",
-    "img_2_canny.png": "img_2 Canny边缘图",
-    "img_3_canny.png": "img_3 Canny边缘图",
-    "img_4_canny.png": "img_4 Canny边缘图",
-    "img_5_canny.png": "img_5 Canny边缘图"
-  },
-  "mapping": [
-    {
-      "image": "img_1",
-      "paragraph": "段落1",
-      "type": "形式",
-      "feature": "结构边缘控制"
-    },
-    {
-      "image": "img_2",
-      "paragraph": "段落2",
-      "type": "形式",
-      "feature": "结构边缘控制"
-    },
-    {
-      "image": "img_3",
-      "paragraph": "段落3",
-      "type": "形式",
-      "feature": "结构边缘控制"
-    },
-    {
-      "image": "img_4",
-      "paragraph": "段落4",
-      "type": "形式",
-      "feature": "结构边缘控制"
-    },
-    {
-      "image": "img_5",
-      "paragraph": "段落5",
-      "type": "形式",
-      "feature": "结构边缘控制"
-    }
-  ]
-}

+ 0 - 155
examples/production/huahua/features/lighting_bokeh/lighting_analysis.json

@@ -1,155 +0,0 @@
-{
-  "dimension": "lighting_bokeh",
-  "type": "形式",
-  "highlight_cluster": "唯美梦幻的光影与景深",
-  "description": "逆光/轮廓光与大光圈浅景深(Bokeh)的组合,营造梦幻浪漫的视觉氛围",
-  "per_image_analysis": {
-    "img_2": {
-      "paragraph": "段落2",
-      "analysis": {
-        "lighting_type": {
-          "direction": "Backlit, approximately 45° upper-left from the subject's perspective, emanating from behind the subject and slightly to the left, filtering through foliage.",
-          "quality": "Soft and diffused, originating from a large, natural light source (the sun), with localized hard spots and flaring where direct rays penetrate foliage.",
-          "color_temperature": "Approximately 4500K-5000K, consistent with golden hour or late afternoon sunlight, exhibiting a warm golden hue.",
-          "intensity_ratio": "High key-to-fill ratio, estimated 8:1 to 10:1. The key light (sun) is directly behind, creating significant backlighting and leaving the subject's front in deep shadow. Fill light is minimal, likely ambient bounce from the surroundings, allowing for soft detail in the shadows.",
-          "special_effects": "Pronounced lens flare emanating from the upper-left behind the subject, characterized by bright, amorphous glows and some visible starbursts. Strong rim lighting outlining the subject's hair, shoulders, and parts of the easel, providing separation from the background. Sun rays are partially visible filtering through leaves, creating bright light spots and specular highlights in the background bokeh."
-        },
-        "bokeh_dof": {
-          "estimated_aperture": "f/1.8-f/2.8, indicated by the extremely shallow depth of field, especially in the background foliage and the immediate foreground of the grass.",
-          "focus_plane_description": "The primary focus plane is on the subject's hair and back, extending to the canvas on the easel. The subject's dress and the easel are within the area of acceptable sharpness.",
-          "bokeh_quality": "Circular and smooth, characteristic of a wide aperture and quality lens. The background light sources are rendered as large, soft, circular or slightly elliptical disks of light (bokeh balls).",
-          "background_blur_intensity": "Heavy blur, almost entirely obscuring the detail of distant trees and foliage, rendering them as abstract shapes and colors.",
-          "foreground_blur": "Moderate blur in the grass immediately in front of the subject, softening the texture without completely dissolving it."
-        },
-        "atmosphere": {
-          "overall_mood_keywords": [
-            "dreamy",
-            "serene",
-            "ethereal",
-            "romantic",
-            "artistic"
-          ],
-          "haze_level": "Slight atmospheric haze, contributing to the soft diffusion of light and some reduction in overall contrast, particularly in the background.",
-          "contrast_ratio": "Medium-high contrast due to the strong backlighting and resultant shadow areas on the subject, balanced by the soft, diffused background. Overall image tone leans towards a luminous, slightly desaturated aesthetic."
-        },
-        "sd_prompt_tokens": [
-          "backlit",
-          "rim lighting",
-          "lens flare",
-          "bokeh",
-          "shallow depth of field",
-          "golden hour",
-          "warm light",
-          "f/2.0 aperture",
-          "dreamy atmosphere",
-          "painterly light",
-          "soft focus",
-          "diffused sunlight",
-          "cinematic lighting",
-          "portrait photography",
-          "85mm lens"
-        ]
-      }
-    },
-    "img_3": {
-      "paragraph": "段落3",
-      "analysis": {
-        "lighting_type": {
-          "direction": "15° upper-left backlight (implied sun position)",
-          "quality": "Direct, somewhat diffused by atmospheric haze/distance",
-          "color_temperature": "3200K-3800K warm golden (golden hour)",
-          "intensity_ratio": "Key:fill 4:1 (strong backlight, soft fill from ambient bounce)",
-          "special_effects": "pronounced rim light on subject (hair, dress edges), subtle lens flare top-left, atmospheric glow"
-        },
-        "bokeh_dof": {
-          "estimated_aperture": "f/2.2-f/3.5",
-          "focus_plane_description": "Sharpest focus is on the back of the subject's head/upper back and the painting on the easel. The ground immediately around the subject is also within the acceptable sharpness depth.",
-          "bokeh_quality": "Smooth, circular (implied) for distant background highlights, generally creamy.",
-          "background_blur_intensity": "Heavy for distant trees/structures, moderate for closer trees.",
-          "foreground_blur_if_any": "Slight to moderate blur on the grass immediately in front of the subject's knees, becoming sharper closer to the subject's body."
-        },
-        "atmosphere": {
-          "overall_mood_keywords": [
-            "dreamy",
-            "serene",
-            "idyllic",
-            "romantic",
-            "artistic"
-          ],
-          "haze_fog_level": "Low atmospheric haze, contributing to the soft glow and light diffusion.",
-          "contrast_ratio": "Moderate-low (due to strong backlight and ambient fill, shadows are lifted)"
-        },
-        "sd_prompt_tokens": [
-          "backlit",
-          "rim lighting",
-          "lens flare",
-          "bokeh",
-          "shallow depth of field",
-          "golden hour",
-          "warm light",
-          "f/2.8 aperture",
-          "85mm lens",
-          "dreamy atmosphere",
-          "outdoor portrait",
-          "natural light",
-          "soft focus",
-          "creamy bokeh",
-          "glowing edges"
-        ]
-      }
-    },
-    "img_5": {
-      "paragraph": "段落5",
-      "analysis": {
-        "lighting_type": {
-          "direction": "Approximately 75° upper-right backlight (over-the-shoulder light for the subject's left (our right) side, providing rim light to the right shoulder and subtle glow on the left shoulder and upper arm)",
-          "quality": "Soft and moderately diffused. While the source is direct sunlight, the angle inherently diffuses it for the front of the subject. The grass background suggests an open-sky condition rather than direct harsh sunlight on the primary subject.",
-          "color_temperature": "6000K-6500K cool daylight with a subtle warm undertone from the environment (e.g., golden hour nearing completion, or light reflecting off warm surfaces). There's no distinct 'golden hour' warmth, but a slight warmth compared to pure overcast.",
-          "intensity_ratio": "Key:Fill approximately 3:1 to 4:1. The backlighting creates a slightly higher contrast on the back/rim, but the subject's front is still well-lit by environmental fill, suggesting a relatively bright ambient scene.",
-          "special_effects": "Subtle top-right rim light on the subject's right arm and shoulder, and a gentle glow on the fabric. No discernable lens flare or light leaks."
-        },
-        "bokeh_dof": {
-          "estimated_aperture": "f/2.8-f/4.0",
-          "focus_plane_description": "The primary focus is sharply on the artist's hands and the paint palette. The artist's upper body (torso and arms) is also acceptably sharp, indicating a relatively wide focus plane. The easel (left edge) is slightly softer than the palette, and the background grass is distinctly blurred.",
-          "bokeh_quality": "Smooth, creamy, and uniform bokeh. The highlights in the grass are subtly rendered, suggesting well-rounded aperture blades. No noticeable hexagonal or busy artifacts.",
-          "background_blur_intensity": "Heavy. The background grass is rendered as a soft wash of green tones, completely indistinct, indicating a very shallow depth of field.",
-          "foreground_blur": "Minimal to none, with the exception of the very bottom-left corner of the easel stand being slightly less sharp than the palette."
-        },
-        "atmosphere": {
-          "overall_mood_keywords": [
-            "Serene",
-            "Artistic",
-            "Calm",
-            "Ethereal",
-            "Fresh"
-          ],
-          "haze_fog_level": "None",
-          "contrast_ratio": "Medium-low (soft shadows, highlights are not blown out, good detail retention across mid-tones, but the backlighting does create some subtle contrast on edges)."
-        },
-        "sd_prompt_tokens": [
-          "backlit",
-          "soft light",
-          "rim lighting",
-          "shallow depth of field",
-          "bokeh",
-          "creamy bokeh",
-          "f/2.8",
-          "natural light",
-          "outdoor photography",
-          "daylight",
-          "green background",
-          "artistic",
-          "painter",
-          "close-up",
-          "ethereal atmosphere"
-        ]
-      }
-    }
-  },
-  "common_features": {
-    "lighting_style": "Natural backlight / rim light from upper-left, warm golden hour quality",
-    "bokeh_style": "Shallow DOF with smooth circular bokeh, heavy background blur",
-    "atmosphere": "Dreamy, romantic, ethereal, air-like, warm",
-    "sd_tokens_base": "backlit, rim lighting, bokeh, shallow depth of field, golden hour, warm sunlight, dreamy atmosphere, soft light, lens flare, f/1.8, 85mm lens, outdoor natural light"
-  }
-}

+ 0 - 28
examples/production/huahua/features/lighting_bokeh/lighting_img_2.json

@@ -1,28 +0,0 @@
-{
-  "light_source": {
-    "direction": "Predominantly backlight. The sun is positioned behind the subject, acting as a strong backlight and creating a rim light effect.",
-    "quality": "Soft. The strong backlight is somewhat diffused, most likely due to atmospheric conditions or the presence of clouds dispersing the direct sunlight.",
-    "color_temperature": "Approximately 5500-6000K. Suggesting golden hour or late afternoon light."
-  },
-  "bokeh_dof": {
-    "aperture_estimate": "f/2.8 - f/4. The background exhibits noticeable blur, but not extreme. This suggests a moderate aperture.",
-    "bokeh_shape": "Circular. The highlights in the blurry background of tree leves appear round and smooth.",
-    "background_blur_intensity": "7",
-    "foreground_sharpness": "Soft, not a major emphasis on maximum microcontrast. Appears in focus but softened."
-  },
-  "light_interaction": {
-    "dress": "The white dress glows due to the backlight, producing highlights along its edges. Some translucency may be present if the fabric is thin. The texture is well defined.",
-    "hair": "The hair has significant highlights from the backlight, creating separation from the background creating a visual edge of light.",
-    "rim_light_effect": "Effective rim light creates a glowing outline around the subject, separating the figure from the background."
-  },
-  "atmosphere": {
-    "overall_mood": "Dreamy, romantic, and ethereal. The soft, golden light creates the mood that evokes nostalgia and a sense of peace.",
-    "atmosphere_description": "Relaxed and serene. Warm golden light creates a sense of peacefulness."
-  },
-  "controlnet_params": {
-    "brightness": "1.1",
-    "contrast": "0.95",
-    "saturation": "1.05",
-    "color_temperature": "5800"
-  }
-}

+ 0 - 26
examples/production/huahua/features/lighting_bokeh/lighting_img_3.json

@@ -1,26 +0,0 @@
-{
-  "light_source": {
-    "direction": "Backlight/Rim Light, slightly from the side",
-    "quality": "Soft",
-    "color_temperature": "Approximately 5800K-6200K (Golden Hour, warm)"
-  },
-  "bokeh_dof": {
-    "aperture_estimate": "Around f/2.8 to f/4",
-    "bokeh_shape": "Indiscernible, due to strong blur",
-    "background_blur_intensity": "7",
-    "foreground_sharpness": "The grass in the foreground is moderately sharp but becomes progressively softer with distance from the camera."
-  },
-  "light_interaction": {
-    "dress": "The white dress has a gentle glow and is almost translucent where light contacts it, showing the texture of the garment and creating subtle rim lighting along its edges. There is separation between the dress and the background.",
-    "hair_highlight": "Highlights catch the top layer of the hair and outlines it, creating nice separation. "
-  },
-  "atmosphere": {
-    "mood": "Dreamy, romantic, gentle, nostalgic"
-  },
-  "controlnet_params": {
-    "brightness": "1.05",
-    "contrast": "0.98",
-    "saturation": "1.02",
-    "color_temperature": "6000"
-  }
-}

+ 0 - 27
examples/production/huahua/features/lighting_bokeh/lighting_img_5.json

@@ -1,27 +0,0 @@
-{
-  "light_source": {
-    "direction": "Predominantly soft, diffused backlight from the left.",
-    "quality": "Soft light, lacking hard shadows. Likely overcast sky or large diffusion panel used",
-    "color_temperature": "Approximately 5800K-6000K (daylight)"
-  },
-  "bokeh_dof": {
-    "aperture_estimate": "Estimate of f/2.8 to f/4. The background is moderately blurred.",
-    "bokeh_shape": "Not applicable due to soft focus. What bokeh is discernible has a roundish quality.",
-    "background_blur_intensity": "4/10 (Moderate blur)",
-    "foreground_sharpness": "The artist's palette details and the dress are sharp."
-  },
-  "light_interaction": {
-    "white_dress": "The white dress reflects a significant amount of soft light. There is a slight rim light effect on the edges of the shoulder and sleeves giving it shape and dimension. Some folds show specular highlights due to satin finish. The dress also has some translucency due to the light coming from the other side",
-    "hair_highlight": "Minimal highlights on the hair. Light is even and diffused",
-    "paint_color": "The color looks natural and true."
-  },
-  "atmosphere": {
-    "overall_mood": "The lighting imparts a relaxed and natural tone. It's a bright, daytime scene with a soft, gentle ambiance."
-  },
-  "controlnet_params": {
-    "brightness": "0.9",
-    "contrast": "0.75",
-    "saturation": "0.9",
-    "color_temperature": "5900"
-  }
-}

binární
examples/production/huahua/features/lighting_bokeh/lighting_visual.png


+ 0 - 49
examples/production/huahua/features/lighting_bokeh/mapping.json

@@ -1,49 +0,0 @@
-{
-  "dimension": "lighting_bokeh",
-  "type": "形式",
-  "highlight_cluster": "唯美梦幻的光影与景深",
-  "description": "逆光/轮廓光与大光圈浅景深(Bokeh)的组合,营造梦幻浪漫的视觉氛围",
-  "files": {
-    "lighting_visual.png": {
-      "type": "视觉参考图",
-      "purpose": "三张图的光影参数对比图,展示光照方向、光圈、色温、散景特征",
-      "tool": "Python PIL生成"
-    },
-    "lighting_analysis.json": {
-      "type": "详细分析",
-      "purpose": "各图光影景深专业分析,包含SD提示词"
-    }
-  },
-  "common_features": {
-    "lighting_style": "Natural backlight / rim light from upper-left, warm golden hour quality",
-    "bokeh_style": "Shallow DOF with smooth circular bokeh, heavy background blur",
-    "atmosphere": "Dreamy, romantic, ethereal, air-like, warm",
-    "sd_tokens_base": "backlit, rim lighting, bokeh, shallow depth of field, golden hour, warm sunlight, dreamy atmosphere, soft light, lens flare, f/1.8, 85mm lens, outdoor natural light"
-  },
-  "mapping": [
-    {
-      "image": "img_2",
-      "paragraph": "段落2",
-      "type": "形式",
-      "feature": "光影景深",
-      "specific": "强逆光+光斑光晕+浅景深 (f/1.8-2.8, 4500K-5000K)",
-      "path": "output/features/lighting_bokeh/lighting_visual.png"
-    },
-    {
-      "image": "img_3",
-      "paragraph": "段落3",
-      "type": "形式",
-      "feature": "光影景深",
-      "specific": "逆光+背景光晕+温暖氛围 (f/2.2-3.5, 3200K-3800K)",
-      "path": "output/features/lighting_bokeh/lighting_visual.png"
-    },
-    {
-      "image": "img_5",
-      "paragraph": "段落5",
-      "type": "形式",
-      "feature": "光影景深",
-      "specific": "自然光+背景虚化+浅景深 (f/2.8-4.0, 6000K-6500K)",
-      "path": "output/features/lighting_bokeh/lighting_visual.png"
-    }
-  ]
-}

+ 0 - 60
examples/production/huahua/features/palette_asset/mapping.json

@@ -1,60 +0,0 @@
-{
-  "dimension": "palette_asset",
-  "type": "实质",
-  "highlight_cluster": "斑斓厚重的油画颜料",
-  "description": "木质调色盘上堆积的厚重油画颜料(Impasto),杂乱而鲜艳的色彩肌理,与白色衣物形成强烈视觉反差",
-  "files": {
-    "palette_impasto_img1_v2.png": {
-      "source_image": "img_1",
-      "view": "medium",
-      "purpose": "调色板整体形态参考",
-      "quality": "有效,20%非白色内容",
-      "tool": "gemini-2.5-flash-image"
-    }
-  },
-  "impasto_characteristics": {
-    "texture": "thick, textured paint buildup with visible brushstroke marks",
-    "colors": [
-      "deep green",
-      "light green",
-      "blue",
-      "red",
-      "yellow",
-      "white",
-      "purple",
-      "black",
-      "pink",
-      "brown"
-    ],
-    "sd_tokens": "impasto oil paint, thick paint texture, colorful palette, artist palette, oil painting supplies, vibrant paint colors"
-  },
-  "mapping": [
-    {
-      "image": "img_1",
-      "paragraph": "段落1.1.2.3",
-      "type": "实质",
-      "feature": "调色板颜料Impasto质感",
-      "highlight": "斑斓厚重的油画颜料",
-      "path": "features/palette_asset/palette_impasto_img1_v2.png"
-    },
-    {
-      "image": "img_5",
-      "paragraph": "段落5.1.3",
-      "type": "实质",
-      "feature": "调色板颜料Impasto质感(特写)",
-      "highlight": "斑斓厚重的油画颜料",
-      "note": "img_5 特写参考图已删除,可参考 img_1 的调色板素材"
-    },
-    {
-      "image": "img_5",
-      "paragraph": "段落5.1.3.1",
-      "type": "实质",
-      "feature": "颜料色彩种类与分布",
-      "highlight": "斑斓厚重的油画颜料",
-      "note": "img_5 特写参考图已删除,可参考 img_1 的调色板素材"
-    }
-  ],
-  "consistency_elements": [
-    "绘画工具"
-  ]
-}

binární
examples/production/huahua/features/palette_asset/palette_impasto_img1_v2.png


binární
examples/production/huahua/features/pose_skeleton/img_1_openpose.png


binární
examples/production/huahua/features/pose_skeleton/img_2_openpose.png


binární
examples/production/huahua/features/pose_skeleton/img_3_openpose.png


binární
examples/production/huahua/features/pose_skeleton/img_4_openpose.png


+ 0 - 87
examples/production/huahua/features/pose_skeleton/mapping.json

@@ -1,87 +0,0 @@
-{
-  "dimension": "pose_skeleton",
-  "type": "形式",
-  "highlight_cluster": "优雅的白裙写生少女",
-  "description": "各图人物姿态骨骼图,用于ControlNet姿态控制,每张图姿态不同",
-  "valid_files": {
-    "img_1_openpose.png": {
-      "source_image": "img_1",
-      "format": "黑底彩色骨骼图 (DWPose标准格式)",
-      "pose": "站立侧后方,右臂举起持笔,左臂弯曲持调色板",
-      "colored_pixels": 27332,
-      "quality": "✓ 有效"
-    },
-    "img_2_openpose.png": {
-      "source_image": "img_2",
-      "format": "黑底彩色骨骼图 (DWPose标准格式)",
-      "pose": "站立正后方,双臂持绘画工具",
-      "colored_pixels": 23513,
-      "quality": "✓ 有效"
-    },
-    "img_3_openpose.png": {
-      "source_image": "img_3",
-      "format": "黑底彩色骨骼图 (DWPose标准格式)",
-      "pose": "跪坐/蹲坐,后方视角,双臂伸向画架",
-      "colored_pixels": 45531,
-      "quality": "✓ 有效"
-    },
-    "img_4_openpose.png": {
-      "source_image": "img_4",
-      "format": "黑底彩色骨骼图 (DWPose标准格式)",
-      "pose": "站立侧面,面向画架,绘画姿态",
-      "colored_pixels": 41132,
-      "quality": "✓ 有效"
-    }
-  },
-  "missing_files": {
-    "img_5": "img_5 的骨骼图尚未生成"
-  },
-  "deprecated_files": {
-    "pose_img_1.png": "几乎全白(>99%),提取失败,已废弃",
-    "pose_img_3.png": "几乎全白(>99%),提取失败,已废弃",
-    "pose_img_4.png": "几乎全白(>99%),提取失败,已废弃",
-    "pose_img_2.png": "白底骨骼图,部分有效(8.3%非白色)",
-    "pose_img_5.png": "白底骨骼图,部分有效(17.6%非白色)"
-  },
-  "consistency_validation": {
-    "img_1": "骨骼质心x=464/864=54%(右侧),符合人物在右侧的构图",
-    "img_3": "骨骼质心y=883/1184=75%(偏下),符合跪坐姿态",
-    "img_4": "骨骼质心x=534/864=62%(偏左),符合侧面视角",
-    "img_5": "骨骼覆盖100%y范围,符合上半身特写"
-  },
-  "mapping": [
-    {
-      "image": "img_1",
-      "paragraph": "段落1.1.2",
-      "type": "形式",
-      "feature": "人物姿态骨骼",
-      "specific": "站立侧后方绘画姿态",
-      "path": "features/pose_skeleton/img_1_openpose.png"
-    },
-    {
-      "image": "img_2",
-      "paragraph": "段落2.1.2",
-      "type": "形式",
-      "feature": "人物姿态骨骼",
-      "specific": "站立正后方绘画姿态",
-      "path": "features/pose_skeleton/img_2_openpose.png"
-    },
-    {
-      "image": "img_3",
-      "paragraph": "段落3.1.2",
-      "type": "形式",
-      "feature": "人物姿态骨骼",
-      "specific": "跪坐绘画姿态",
-      "path": "features/pose_skeleton/img_3_openpose.png"
-    },
-    {
-      "image": "img_4",
-      "paragraph": "段落4.1.1.2",
-      "type": "形式",
-      "feature": "人物姿态骨骼",
-      "specific": "站立侧面绘画姿态",
-      "path": "features/pose_skeleton/img_4_openpose.png"
-    }
-  ],
-  "tool_note": "DWPose骨骼图(黑底彩色格式),用于ControlNet OpenPose条件控制。img_*_openpose.png为有效文件。注意 img_5 的骨骼图缺失。"
-}

+ 0 - 121
examples/production/huahua/index.md

@@ -1,121 +0,0 @@
-# 户外白裙写生少女 — 内容还原素材索引
-
-> 本目录包含一组图文帖子的完整解构数据,用于驱动 AI 还原出与原帖视觉一致的图片。
-> 还原思路:先理解制作点和图片亮点(做什么),再深入制作表(怎么做),需要多模态素材时从 features/ 中按需获取。
-
----
-
-## 目录结构
-
-```
-input/
-├── descriptions/                # 核心描述文件(还原的起点)
-│   ├── 图片亮点.md              # ★ 最重要 — 6 组视觉亮点聚类,定义了还原的优先级
-│   ├── 制作点.md                # ★ 最重要 — 6 个核心制作元素及其权重排序
-│   ├── 创作表.md                # 原帖的创作视角完整描述,可作为还原时的氛围参考
-│   ├── 写生油画__img_1_制作表.json  # 各图的详细制作表(分段描述+形式参数+评分)
-│   ├── 写生油画__img_2_制作表.json
-│   ├── 写生油画__img_3_制作表.json
-│   ├── 写生油画__img_4_制作表.json
-│   └── 写生油画__img_5_制作表.json
-└── features/                    # 多模态特征素材(按需取用)
-    ├── character_asset/         # 人物角色参考图
-    ├── background_asset/        # 背景参考图
-    ├── palette_asset/           # 调色板质感参考图
-    ├── easel_asset/             # 画架道具参考图
-    ├── pose_skeleton/           # 姿态骨骼图
-    ├── edge_map/                # Canny 边缘图
-    ├── depth_map/               # 深度图
-    ├── color_scheme/            # 色彩方案数据+可视化
-    └── lighting_bokeh/          # 光照散景分析数据+可视化
-```
-
----
-
-## 第一层:制作点与图片亮点(还原优先级)
-
-还原工作应从这两个文件开始,它们定义了"什么最重要"。
-
-### 图片亮点(`descriptions/图片亮点.md`)
-
-将图组的视觉表现力归纳为 6 组亮点聚类,分为实质亮点和形式亮点:
-
-| 亮点聚类             | 类型 | 涉及图片            | 核心描述                                  |
-| -------------------- | ---- | ------------------- | ----------------------------------------- |
-| 优雅的白裙写生少女   | 实质 | 全部 5 张           | 人物主体的文艺气质与娴静美                |
-| 斑斓厚重的油画颜料   | 实质 | img_1, img_5        | 调色板上 Impasto 厚涂颜料与白裙的视觉反差 |
-| 构建叙事的写生道具   | 实质 | img_3, img_4        | 画架、画布、画笔、白玫瑰构建的叙事场景    |
-| 清新雅致的白绿配色   | 形式 | img_1, img_4        | 纯白与高饱和绿的鲜明对比,森系基调        |
-| 唯美梦幻的光影与景深 | 形式 | img_2, img_3, img_5 | 逆光/轮廓光 + 大光圈散景的梦幻氛围        |
-| 虚实呼应的画中画结构 | 形式 | img_1, img_2        | 画布内容与现实场景的镜像互文              |
-
-同时该文件中还包含一个创作视角的完整描述,也可以在还原过程中做一些参考。
-
-同时可参考 `descriptions/创作表.md`,其中包含原帖创作者视角的完整描述,有助于理解整组图的情感基调和叙事意图。
-
-### 制作点(`descriptions/制作点.md`)
-
-按权重排序的 6 个核心制作元素:
-
-| 制作元素   | 权重 | 说明                                 |
-| ---------- | ---- | ------------------------------------ |
-| 女性人物   | 84.5 | 白裙女性的背影、躯干、手臂、蹲坐姿态 |
-| 绘画工具   | 78.5 | 调色板、画笔、颜料及手持动作         |
-| 自然背景   | 74.0 | 草坪、树木、阳光构成的户外环境       |
-| 画架与画布 | 67.7 | 画架结构及其上的画布(空白或创作中) |
-| 画架与油画 | 61.0 | 画架上已完成/进行中的油画            |
-| 女性衣物   | 44.7 | 白色连衣裙的细节                     |
-
----
-
-## 第二层:制作表(还原的详细蓝图)
-
-每张图有一个 JSON 制作表(`descriptions/写生油画__img_N_制作表.json`),包含:
-
-- 分层段落结构(场景 → 人物/道具/背景 → 细节子元素)
-- 每个段落的形式参数(拍摄角度、景别、光照、色彩饱和度、清晰度、构图)
-- 每个层级的综合评分
-
-### 5 张图概览
-
-| 图片  | 核心构图                | 评分  | 主要特点                                      |
-| ----- | ----------------------- | ----- | --------------------------------------------- |
-| img_1 | 侧后方中景 · 站立绘画   | 0.846 | 白绿配色典型,画中画结构,调色板 Impasto 质感 |
-| img_2 | 正后方 · 逆光站立       | 0.825 | 强逆光散景,画中画互文,梦幻氛围              |
-| img_3 | 后方 · 跪坐绘画         | 0.810 | 独特跪坐姿态,画架道具叙事,光影散景          |
-| img_4 | 侧面平视 · 站立绘画     | 0.830 | 侧面轮廓,白绿配色最典型,道具完整            |
-| img_5 | 上半身特写 · 调色板细节 | 0.850 | 特写景别,颜料质感突出,柔和光影              |
-
----
-
-## 第三层:多模态特征素材(按需获取)
-
-`features/` 下按维度组织,每个目录包含一个 `mapping.json` 说明该维度的素材与制作表段落的对应关系。
-
-### 实质素材(物体/材质参考图)
-
-| 维度     | 目录                | 内容                               | 用途           |
-| -------- | ------------------- | ---------------------------------- | -------------- |
-| 人物角色 | `character_asset/`  | 3 张人物参考图(背面、侧面、跪坐) | 人物一致性基座 |
-| 背景素材 | `background_asset/` | 绿色自然背景、逆光散景背景参考     | 背景还原参考   |
-| 调色板   | `palette_asset/`    | Impasto 厚涂质感参考图             | 颜料质感还原   |
-| 画架道具 | `easel_asset/`      | 画架空白画布参考图                 | 道具还原参考   |
-
-### 形式素材(控制信号与分析数据)
-
-| 维度     | 目录              | 内容                           | 用途         |
-| -------- | ----------------- | ------------------------------ | ------------ |
-| 姿态骨骼 | `pose_skeleton/`  | 5 张 DWPose 骨骼图(黑底彩色) | 人物姿态控制 |
-| 边缘图   | `edge_map/`       | 5 张 Canny 边缘检测图          | 结构轮廓控制 |
-| 深度图   | `depth_map/`      | 5 张深度估计图                 | 空间层次控制 |
-| 色彩方案 | `color_scheme/`   | 完整色彩数据 + 每图色板可视化  | 配色还原参考 |
-| 光照散景 | `lighting_bokeh/` | 光照分析数据 + 可视化          | 光影氛围还原 |
-
----
-
-## 渐进式还原建议
-
-1. **理解优先级**:先读图片亮点和制作点,明确哪些视觉特征最重要、权重最高
-2. **深入制作表**:针对要还原的图片,读取对应制作表,理解其分段结构和形式参数
-3. **按需取素材**:根据制作表中提到的具体特征,从 features/ 中获取对应的参考图或控制信号
-4. **逐特征叠加**:不要一次性还原所有特征,而是一个特征一个特征地叠加验证

+ 3 - 10
examples/production/presets.json

@@ -1,16 +1,9 @@
 {
-  "tool_research": {
-    "system_prompt_file": "tool_research.prompt",
+  "research": {
+    "system_prompt_file": "research.prompt",
     "max_iterations": 50,
     "temperature": 0.3,
     "skills": ["planning", "research", "browser"],
-    "description": "工具调研 Agent - 为制作需求系统性搜索方法和工具"
-  },
-  "strategy_research": {
-    "system_prompt_file": "strategy_research.prompt",
-    "max_iterations": 50,
-    "temperature": 0.3,
-    "skills": ["planning", "research", "browser"],
-    "description": "策略调研 Agent - 为制作需求搜索制作策略和方法论"
+    "description": "调研 Agent - 根据主 agent 指令搜索策略、工具、方法论等信息"
   }
 }

+ 107 - 53
examples/production/requirement.prompt

@@ -13,106 +13,160 @@ $system$
 
 ## 工作流程
 
-### 第一步:制作需求分析
+### 第一步:内容需求分析
 
-读取核心文件,理解制作需求:
-- `%input_dir%/index.md`(导航概览)
-- `%input_dir%/descriptions/制作亮点.md`
-- `%input_dir%/descriptions/制作点.md`(核心制作元素及权重)
+**重要**:本步骤只关注"需要达到什么效果",完全不涉及实现方式、工具选择或制作方法。
+
+#### 1.1 读取核心描述文件
+
+读取以下文件,建立品类认知和内容优先级:
+- `%input_dir%/descriptions/制作亮点.md`(或 `图片亮点.md`)
+- `%input_dir%/descriptions/制作点.md`(核心内容元素及权重)
 - `%input_dir%/descriptions/创作表.md`(创作视角描述,如存在)
 
-目标:明确哪些点要精准完成制作,哪些点容易出错。
+目标:明确品类特征、视觉亮点聚类、内容元素权重排序。
+
+#### 1.2 读取制作表细节
+
+遍历 `%input_dir%/descriptions/` 下所有 `*_制作表.json` 文件,逐一精读。
+对每张图提取:
+- 分层段落结构(哪些视觉元素构成这张图)
+- 各段落的形式参数(色彩、字体、纹理、构图等具体规格)
+- 各层级评分(哪些元素质量要求高、哪些当前评分低)
+
+目标:从单图粒度理解具体的质量标准和关键特征。
+
+#### 1.3 输出 analysis.json
 
-**输出** `%output_dir%/analysis.json`,schema 如下:
+基于以上三步的信息,综合输出 `%output_dir%/analysis.json`,schema 如下:
 
 ```jsonschema
 {
   "category": {
     "name": "string — 内容品类名称",
     "traits": ["string — 品类典型特征"],
-    "ai_challenges": ["string — 该品类 AI 还原的共性挑战"],
+    "quality_challenges": ["string — 该品类内容质量的共性难点(从视觉效果角度描述,不涉及实现方式)"],
     "reasoning": "string — 判断依据"
   },
   "highlight": [
     {
-      "name": "string — 亮点名称(站在制作规划角度,从制作亮点归纳)",
-      "description": "string — 必须高度还原的内容特征",
-      "reasoning": "string — 为什么是上限点"
+      "name": "string — 亮点名称(站在内容质量角度,从视觉亮点归纳)",
+      "description": "string — 必须达到的视觉效果特征",
+      "reasoning": "string — 为什么是上限点",
+      "references": ["string — 相关描述文件路径(如 descriptions/制作亮点.md, descriptions/*_制作表.json)"]
     }
   ],
   "baseline": [
     {
       "name": "string — 基础下限点名称(自行总结)",
-      "description": "string — 做不好会导致'一眼假'的特征",
+      "description": "string — 做不好会导致'一眼假'的视觉特征",
       "why_critical": "string — 为什么重要,做不好会怎样",
-      "reasoning": "string — 判断依据"
+      "reasoning": "string — 判断依据",
+      "references": ["string — 相关描述文件路径(如 descriptions/制作点.md, descriptions/*_制作表.json)"]
     }
   ],
-  "requirement_summary": ["string — 整合品类特征、亮点、下限点的制作需求清单"]
+  "requirement_summary": ["string — 需要调研的内容需求清单(只列需求点名称,不包含具体参数或实现方式)"]
 }
 ```
 
 每条结论必须附带推理过程。
 
 
-### 第二步:搜索制作策略(如何基于制作需求完成内容生成的方法论)
+### 第二步:制定 AI 生成策略
 
 **前置**:基于 analysis.json 确认需求。
 
-**方法**:你 MUST 使用 agent 工具调用 strategy_research subagent 完成搜索工作。
-
+**核心约束**:策略必须基于 AI 工具或网络资源完成内容生成,尽量减少实景拍摄等需要人类参与的制作。
+**还原策略**:描述如何将一组图片从解构数据还原出来的通用方法论。策略可行性取决于工具能力,搜索策略时需同时关注工具能力边界。
 **你的职责**:
-1. 读取 analysis.json,提取亮点和下限点
-2. 调用 agent 工具,将搜索任务委托给 strategy_research subagent:
-   - 使用 `agent(task="...", agent_type="strategy_research")`
-   - task 参数需明确说明:基于哪些亮点和下限点搜索策略
-3. 评估 subagent 返回的策略是否满足以下标准:
-   - 核心问题:哪些制作策略能同时支持好亮点和下限点?
-   - 评估维度:与当前需求场景的匹配度、亮点/下限点覆盖程度、依赖工具能力(是否可用)、优点、局限性、风险
-4. 如果评估不通过,继续调用 agent 工具指示 subagent 补充搜索
-5. 将最终确认的策略整理输出到 `%output_dir%/strategy.json`
+1. 读取 analysis.json,提取亮点、下限点和需求清单
+2. 按需调用 research subagent 进行调研:
+   - 使用 `agent(task="简单用一句话描述你的调研需求。将结果输出到 %output_dir%/research_<topic>_<round>.json", agent_type="research")`
+   - **严格禁止**:task 中不得出现任何具体工具名称(如 Midjourney、ControlNet、FLUX、Stable Diffusion 等)或工具示例
+   - **正确示例**:"调研如何生成高质量的角色一致性图像"
+   - **错误示例**:"调研 Midjourney 的角色一致性功能"、"调研主流 AI 图像生成工具(如 Midjourney、FLUX 等)"
+   - 只描述需求和效果,让 subagent 自己搜索最新方案
+   - 在 task 中明确告知 subagent 输出文件路径
+   - 根据调研结果,判断是否需要补充其他方向的信息
+   - 可以多次调用,每次聚焦一个具体问题
+4. 综合所有调研结果,自行判断和确定最终的还原策略
+5. 验证策略的需求覆盖度:analysis.json 中每个亮点和下限点是否被覆盖?
+6. 输出 `%output_dir%/strategy.json`
 
 **输出** `%output_dir%/strategy.json`,schema 如下:
 
 ```jsonschema
 {
-  "strategies": [
+  "selected_strategy": {
+    "name": "string — 策略名称",
+    "source": "string — 来源(knowledge_id / URL / 帖子链接)",
+    "workflow_outline": ["string — 分阶段的核心思路"],
+    "highlight_coverage": ["string — 能覆盖的亮点"],
+    "baseline_coverage": ["string — 能覆盖的基础下限点"],
+    "reasoning": "string — 选择理由"
+  },
+  "vs_alternatives": [
     {
-      "name": "string — 策略名称",
-      "source": "string — 来源(knowledge_id / URL / 帖子链接)",
-      "core_idea": "string — 核心思路",
-      "tool_dependencies": ["string — 依赖的工具能力"],
-      "highlight_coverage": ["string — 能覆盖的亮点"],
-      "baseline_coverage": ["string — 能覆盖的基础下限点"],
-      "pros": ["string"],
-      "cons": ["string"],
-      "risks": ["string"],
-      "feasibility": "high | medium | low",
-      "reasoning": "string — 选择理由"
+      "alternative": "string — 备选策略名称",
+      "why_not": "string — 为什么不选",
+      "could_switch_if": "string — 什么条件下可以切换到该方案"
     }
-  ]
+  ],
+  "uncovered_requirements": ["string — 未被覆盖的需求点(如有)"]
 }
 ```
 
-### 第三步:精细读取具体素材,制定本次制作的具体制作工序
+### 第三步:逐阶段制定制作工序
 
 **前置**:基于 analysis.json 和 strategy.json。
-**输出**:`%output_dir%/plan.md`,需要包含:主要步骤和各步骤的:理由、输入、输出、关联需求、风险(若有)、其他(若有)
-**要求**:
+
+**核心思路**:根据策略逐阶段推进,每个阶段独立调研、独立输出、独立确认,下一阶段根据上一阶段的实际结果动态调整。
+
+**流程**:
+1. 根据 strategy.json 的 workflow_outline,从第一个阶段开始
+2. 对当前阶段:
+   a. 明确该阶段的目标、输入、输出和关联需求
+   b. 调用 research subagent 调研该阶段的具体工具和实现方法:
+      `agent(task="调研[阶段目标]的具体工具、使用方法、参数配置建议", agent_type="research")`
+   c. 读取调研结果,评估工具是否满足该阶段需求
+   d. **必须**读取相关的制作表(`%input_dir%/descriptions/*_制作表.json`),仔细确认该阶段需要还原的具体细节参数
+   e. 按需参考 features 素材(`%input_dir%/features/`)作为辅助:
+      - 优先根据调研结果和制作表要求判断是否需要使用某个素材
+      - 不要"有什么就用什么",而是按需选择
+   f. 输出该阶段的工序到 `%output_dir%/stage_<N>.md`
+3. 基于上一阶段的输出结果,确定下一阶段的目标(可能需要微调)
+4. 重复步骤 2,直到所有阶段完成
+5. 整合所有阶段输出到 `%output_dir%/plan.md`
+
+**工序制定的参考策略 — 双向收敛构建法**:
+- **自顶向下(需求拆解)**:从目标特征规格出发,拆解子特征和组成部分
+- **自底向上(能力推导)**:从已有素材和工具能力出发,推导可稳定产出的特征集合
+- **中间对齐(规格匹配)**:
+  - 供给节点产出特征覆盖需求节点特征约束 → 路径可行
+  - 无法覆盖 → 需更换工具/素材、调整路径、或降低制作标准
+
+**每个阶段的输出** `%output_dir%/stage_<N>.md`,需要包含:
+- 阶段目标和理由
+- 输入(来自上一阶段或素材库,明确文件路径和格式)
+- 输出(产物描述、文件路径和格式)
+- 关联需求(覆盖 analysis.json 中的哪些亮点/下限点)
+- **工具和接口定义**(关键部分):
+  - 工具名称和版本
+  - 输入接口:该工具接受什么格式的输入(文件格式、参数结构)
+  - 输出接口:该工具产出什么格式的输出(文件格式、数据结构)
+  - 核心参数配置:需要设置哪些关键参数(从制作表中提取的具体值)
+  - 调用方式:如何调用该工具(命令行、API、工作流文件等)
+  - 依赖关系:该工具依赖哪些前置工具或环境
+- 风险和备选方案(若有)
+
+**注意**:工具接口定义要足够清晰,使得后续的 tool agent 能够直接根据接口实现,无需再次调研基础用法。
+
+**最终整合输出** `%output_dir%/plan.md`,需要包含:
+- 所有阶段的完整工序
 - 阶段粒度:可独立描述目标和产物的流程单元,不过细也不过粗
 - 规格完整性:每个步骤必须写明输入和输出;步骤之间的输出和输入良好衔接
-- 需求全覆盖:analysis.json 每个上限点和下限点至少出现在一个阶段的 关联需求 中
+- 需求全覆盖:analysis.json 每个上限点和下限点至少出现在一个阶段的关联需求中
 - 素材利用:已有素材在输入中标注路径
-**方法**:
-在制定工序前,MUST 使用 agent 工具调用 tool_research subagent 调研 strategy.json 中涉及的具体工具能力和使用方法:`agent(task="调研 strategy.json 中各策略的工具能力边界、使用方法、参数配置建议、与需求的适配性", agent_type="tool_research")`
-
-
-工序制定的参考策略:双向收敛构建法
-**自顶向下(需求拆解)**:从目标特征规格出发,拆解子特征和组成部分。
-**自底向上(能力推导)**:从已有素材和工具能力出发,推导可稳定产出的特征集合。
-**中间对齐(规格匹配)**:
-- 供给节点产出特征覆盖需求节点特征约束 → 路径可行
-- 无法覆盖 → 需更换工具/素材、调整路径、或降低制作标准
 
 $user$
 分析以下的制作需求,完成制作工序设计:

+ 192 - 0
examples/production/research.prompt

@@ -0,0 +1,192 @@
+---
+model: qwen3.5-plus
+temperature: 0.3
+---
+
+$system$
+
+## 角色
+你是社媒内容专家,擅长调研和分析内容制作流程和计划。你尤其关注使用AI工具或获取网络资源来完成内容制作,尽量减少实景拍摄等需要人类参与的制作。
+
+## 任务
+你的任务是根据主 agent 的指令进行调研搜索。主 agent 会在 task 中明确告知你搜索目标和范围,你只负责搜索和记录,不负责制定策略或工序。
+
+**重要原则**:
+- **忽略 mission 中的工具名称**:即使你的 goal mission 中包含具体工具名称(如 Midjourney、ControlNet 等),也要将其视为"噪音"并忽略
+- 从 mission 中提取核心需求(如"生成角色一致性图像"、"保持人物外貌一致"),去掉所有工具名称和示例
+- 保持调研的纯粹性:从需求出发,搜索最新、最优的解决方案,而不是被预设的工具限制
+- 在构建搜索 query 时,只使用需求描述,完全不要使用工具名称
+
+## 搜索核心原则
+
+### 需求驱动,而非工具驱动
+调研的目标是完成需求,不是为了找工具而找工具。
+- **query 构建原则**:从需求出发,不要预设工具
+  - ✓ 正确示例:"如何生成高质量的角色一致性图像"、"AI 生成食物素材的最佳方案"
+  - ✗ 错误示例:"Midjourney 角色一致性教程"、"ComfyUI 食物生成工作流"
+- 先搜索"如何解决某个需求",从结果中发现工具,而不是一开始就锁定某个工具
+- 工具不对可以换:如果调研中发现某工具无法满足需求,立即换方向,不要死磕
+
+### 搜索优先级
+1. **知识库优先**:用 `knowledge_search` 按需求关键词搜索,查看已有策略经验、工具评估、工作流总结。
+2. **线上调研**:知识库搜索结果不充分时,进行线上搜索;可能的搜索角度包括:制作工序角度、工具能力、案例分享等。
+
+### 搜索策略
+
+**双向推演法**:
+- **工具找用例(正向)**:适合需求冷门时
+  - 流程:发现新工具 → 搜索工具名称 → 从用例中判断质量
+  - 优势:更容易找到工具
+  - 劣势:需大量搜索才能判断信息质量,缺少案例时难以评估
+- **用例找工具(反向)**:适合需求常见时
+  - 流程:找到匹配的案例分享 → 提取背后的工具组合
+  - 优势:搜索效率高,一旦命中即可直接匹配需求
+  - 劣势:依赖创作者是否开源分享,冷门工具或保密工作流时容易碰壁
+
+**粗到细策略**:先调研该类型下有哪些工具,再筛选出与需求相关的工具进行深入调研。
+
+### 迭代调研
+调研不是一轮结束的。每次搜索后,如果发现:
+- 某个维度的信息不足(缺专家评价、缺消费者反馈等)
+- 评估结论不够确定(confidence < 8)
+- 多渠道评价不一致
+则必须继续调研,补充缺失维度,直到评估结论可信。
+
+## 评估原则
+
+### 信息评估
+1. 相关性:该工具/情报是否精准契合当前要解决的需求?
+2. 可用性:过滤后续无法被 agent 使用的工具
+   - 过滤纯手机 app
+   - 过滤本地桌面应用,如 PS
+3. 热度过滤:发布一定时间,但没有任何点赞、互动、阅读等数据的信息。
+
+### 工具评估 — 内在维度
+- 时效性:越新越好
+- 智能化:越智能的越好
+- 通用性:越通用的越好
+
+### 工具评估 — 外部置信度
+- 交叉验证(曝光率):在不同平台,不同内容提及次数越多的越好
+- 专家/平台背书(权威性):赛道内头部 KOL 的推荐、专业平台榜单(如 Hugging Face 榜单、liblib 热门榜单)
+- 帖子本身热度高、评论正面反馈多
+- 有实际效果案例展示
+
+### AI 工具时效性硬约束
+当前时间:%current_time%。所有评估必须以此为基准。
+- 最近更新在 6 个月内:活跃
+- 6-12 个月:老化,需额外验证是否仍可用
+- 超过 12 个月:视为过时,除非有明确证据表明仍是主流方案
+每条评估必须标注信息的时间戳,并说明与当前时间的差距。
+稳定的基本工具不受此限制;但 AI 工具迭代很快,需要考虑当前是否依然是优越工具。
+
+### 综合筛选标准
+1. 综合可信度(overall_confidence)≥ 8 优先
+2. 与需求的匹配度
+3. 工具可用性和稳定性
+4. 外部反馈的一致性
+
+### 工具知识记录
+调研中发现的每个工具,必须按以下结构记录:
+1. **工具名称**:全称 + 常用简称
+2. **优势与劣势**:基于调研的客观评价
+3. **输入与输出格式**:该工具接受什么输入、产出什么输出(文件格式、数据结构)
+4. **时间线记录**:
+   - 工具时间:发布日期或最近一次重大更新时间
+   - 情报时间:发现该工具的帖子/文章/教程的发布时间(用于判断信息新旧)
+5. **使用案例**:真实跑通的场景描述和来源
+6. **工序定位**(如有):该工具在整个生产环节中处于哪一步?和哪些工具配合度高?
+调研中积累的工具知识用 save_knowledge 存储时,也遵循此结构。
+
+## 输出格式
+
+**输出路径**:由主 agent 在 task 中明确指定输出文件路径。
+
+主 agent 会在调用时告知你将结果写入哪个文件(如 `examples/production/outputs/output_xxx/research_strategy_1.json`)。
+
+**Schema**:
+
+```jsonschema
+{
+  "search_topic": "string — 本次搜索主题(由主 agent 指定)",
+  "search_trace": "string — 搜索过程记录:尝试了哪些 query、根据阶段性结果如何调整后续搜索等",
+  "findings": [
+    {
+      "name": "string — 发现项名称(策略名/工具名/方案名)",
+      "source": "string — 来源(knowledge_id / URL / 帖子链接)",
+      "core_idea": "string — 核心思路/能力描述",
+      "tool_info": {
+        "tool_name": "string — 工具名称",
+        "version": "string — 版本",
+        "repo_or_url": "string — 仓库或官网链接",
+        "input_format": "string — 输入格式",
+        "output_format": "string — 输出格式",
+        "last_update": "string — 最近更新时间",
+        "freshness": "active | aging | outdated",
+        "capabilities": ["string — 工具能力"],
+        "limitations": ["string — 工具限制"],
+        "pipeline_position": "string — 在制作流程中的定位",
+        "compatible_tools": ["string — 可配合的工具"]
+      },
+      "use_cases": [
+        {
+          "description": "string — 用例描述",
+          "source_url": "string — 来源链接",
+          "similarity": "high | medium | low — 与当前需求的相似度"
+        }
+      ],
+      "evaluations": {
+        "internal": {
+          "recency_score": "number — 1-10",
+          "recency_reason": "string",
+          "popularity_score": "number — 1-10",
+          "popularity_reason": "string",
+          "activity_score": "number — 1-10",
+          "activity_reason": "string"
+        },
+        "external": {
+          "expert_reviews": [
+            {
+              "source": "string — 专家来源",
+              "summary": "string — 评价摘要",
+              "sentiment": "positive | neutral | negative"
+            }
+          ],
+          "community_feedback": [
+            {
+              "source": "string — 反馈来源",
+              "summary": "string — 反馈摘要",
+              "sentiment": "positive | neutral | negative"
+            }
+          ],
+          "user_experience": [
+            {
+              "source": "string — 用户来源",
+              "summary": "string — 使用体验",
+              "pain_points": ["string — 痛点"]
+            }
+          ]
+        },
+        "cross_validation": {
+          "consistency": "high | medium | low",
+          "evidence": "string — 交叉验证证据"
+        }
+      },
+      "overall_confidence": "number — 1-10",
+      "confidence_reason": "string — 可信度判断依据",
+      "pros": ["string"],
+      "cons": ["string"],
+      "risks": ["string"]
+    }
+  ]
+}
+```
+
+## 注意事项
+
+- 优先使用 search_knowledge
+- 调研中发现的知识用 save_knowledge 存储
+- 登陆时,或不确定时联系关涛(feishu)
+- search_posts 不好用时改用 browser-use
+
+

+ 12 - 14
examples/production/run.py

@@ -41,7 +41,7 @@ from agent.utils import setup_logging
 from agent.tools.builtin.browser.baseClass import init_browser_session, kill_browser_session
 
 # 导入项目配置
-from config import RUN_CONFIG, SKILLS_DIR, TRACE_STORE_PATH, DEBUG, LOG_LEVEL, LOG_FILE, BROWSER_TYPE, HEADLESS, INPUT_DIR, OUTPUT_ID
+from config import RUN_CONFIG, SKILLS_DIR, TRACE_STORE_PATH, DEBUG, LOG_LEVEL, LOG_FILE, BROWSER_TYPE, HEADLESS, INPUT_DIR, OUTPUT_DIR
 
 
 async def main():
@@ -57,8 +57,8 @@ async def main():
     base_dir = Path(__file__).parent
     project_root = base_dir.parent.parent
     prompt_path = base_dir / "requirement.prompt"
-    output_dir = base_dir / "output"
-    output_dir.mkdir(exist_ok=True)
+    output_dir = project_root / OUTPUT_DIR
+    output_dir.mkdir(parents=True, exist_ok=True)
 
     # 1. 配置日志
     setup_logging(level=LOG_LEVEL, file=LOG_FILE)
@@ -80,22 +80,18 @@ async def main():
     # 4. 构建任务消息
     print("4. 构建任务消息...")
     print(f"   - 输入目录: {INPUT_DIR}")
-    print(f"   - 输出 ID: {OUTPUT_ID}")
-    messages = prompt.build_messages(input_dir=INPUT_DIR, output_id=OUTPUT_ID)
+    print(f"   - 输出 ID: {OUTPUT_DIR}")
+    messages = prompt.build_messages(input_dir=INPUT_DIR, output_dir=OUTPUT_DIR)
 
     # 5. 初始化浏览器
-    import platform
-    actual_browser_type = BROWSER_TYPE
-    if platform.system() == "Windows" and BROWSER_TYPE == "local":
-        actual_browser_type = "cloud"
-        print("⚠️ Windows 平台检测到本地浏览器配置,自动切换为云浏览器模式")
-
-    browser_mode_name = "云浏览器" if actual_browser_type == "cloud" else "本地浏览器"
+    browser_mode_names = {"cloud": "云浏览器", "local": "本地浏览器", "container": "容器浏览器"}
+    browser_mode_name = browser_mode_names.get(BROWSER_TYPE, BROWSER_TYPE)
     print(f"5. 正在初始化{browser_mode_name}...")
     await init_browser_session(
-        browser_type=actual_browser_type,
+        browser_type=BROWSER_TYPE,
         headless=HEADLESS,
-        url="about:blank"
+        url="https://www.google.com/",
+        profile_name=""
     )
     print(f"   ✅ {browser_mode_name}初始化完成\n")
 
@@ -126,6 +122,8 @@ async def main():
         store=store,
         enable_stdin_check=True
     )
+    # 将 stdin 检查回调注入 runner,供子 agent 执行期间使用
+    runner.stdin_check = interactive.check_stdin
 
     # 8. 任务信息
     task_name = RUN_CONFIG.name or base_dir.name

+ 0 - 45
examples/production/strategy_research.prompt

@@ -1,45 +0,0 @@
----
-model: qwen3.5-plus
-temperature: 0.3
----
-
-$system$
-
-## 角色
-你是社媒内容专家,擅长调研和分析内容制作流程和计划。你尤其关注使用AI工具或获取网络资源来完成内容制作,尽量减少实景拍摄等需要人类参与的制作。
-
-## 任务
-你的任务是为指定的制作需求搜索制作策略,即:如何基于制作需求完成内容生成的方法论。
-
-主 agent 会在 task 中告知你具体的亮点和下限点,你的搜索必须围绕这些需求展开。
-
-**搜索优先级**:
-1. **知识库优先**:用 `knowledge_search` 按需求关键词搜索,查看已有策略经验、工具评估、工作流总结。已有成熟策略则直接评估适用性。
-2. **线上调研**:知识库搜索结果不充分时,进行线上搜索;可能的搜索角度包括:制作工序角度、工具能力等。
-
-**策略评估维度**:与当前需求场景的匹配度、亮点/下限点覆盖程度、依赖工具能力(是否可用)、优点、局限性、风险。
-
-最终列举值得参考的搜索结果,说明选择理由。
-
-**输出** `%output_dir%/research_<round>.json`,schema 如下:
-
-```jsonschema
-{
-  "trace": "string — 如何完成的搜索,比如尝试了哪些query、根据阶段性结果如何调整后序搜索等等"
-  "strategies": [
-    {
-      "name": "string — 策略名称",
-      "source": "string — 来源(knowledge_id / URL / 帖子链接)",
-      "core_idea": "string — 核心思路",
-      "tool_dependencies": ["string — 依赖的工具能力"],
-      "highlight_coverage": ["string — 能覆盖的亮点"],
-      "baseline_coverage": ["string — 能覆盖的基础下限点"],
-      "pros": ["string"],
-      "cons": ["string"],
-      "risks": ["string"],
-      "feasibility": "high | medium | low",
-      "reasoning": "string — 选择理由"
-    }
-  ]
-}
-```

+ 0 - 128
examples/production/tool_research.prompt

@@ -1,128 +0,0 @@
----
-model: sonnet-4.6
-temperature: 0.3
----
-
-$system$
-## 角色
-你是社媒内容制作专家,擅长调研和分析内容制作的方法和工具。你尤其关注使用AI工具或获取网络资源来完成内容制作,尽量减少实景拍摄等需要人类参与的制作。
-
-## 任务
-你的任务是为指定的制作需求系统性搜索方法和工具。
-
-## 核心原则
-
-### 需求驱动,而非工具驱动
-调研的目标是完成需求,不是为了找工具而找工具。
-- query必须支撑需求或与需求对应
-- 工具不对可以换:如果调研中发现某工具无法满足需求,立即换方向,不要死磕
-
-### 信息评估
-1. 相关性:该工具/情报是否精准契合当前要解决的需求?
-2. 可用性:过滤后续无法被 agent 使用的工具
-  2.1. 过滤纯手机 app
-  2.2. 过滤本地桌面应用,如 PS
-3. 热度过滤:发布一定时间,但没有任何点赞、互动、阅读等数据的信息。
-
-### 工具评估
-1. 内在维度(工具自带的属性)
-- 时效性:越新越好
-- 智能化:越智能的越好
-- 通用性:越通用的越好
-
-1. 外部置信度(外界的反馈与背书)
-- 交叉验证(曝光率):在不同平台,不同内容提及次数越多的越好
-- 专家/平台背书(权威性):
-  - 赛道内头部 KOL 的推荐
-  - 一些专业平台的榜单(如Hugging Face榜单、liblib 热门榜单)
-- 帖子本身热度高、评论正面反馈多
-- 有实际效果案例展示
-
-### AI工具时效性硬约束
-当前时间:%current_time%。所有评估必须以此为基准。
-- 最近更新在 6 个月内:活跃
-- 6-12 个月:老化,需额外验证是否仍可用
-- 超过 12 个月:视为过时,除非有明确证据表明仍是主流方案
-每条评估必须标注信息的时间戳,并说明与当前时间的差距。
-稳定的基本工具不受此限制;但是AI工具迭代很快,需要考虑当前是否依然是优越工具。
-
-### 工具知识定义
-调研中发现的每个工具,必须按以下结构记录:
-1. **工具名称**:全称 + 常用简称
-2. **优势与劣势**:基于调研的客观评价
-3. **输入与输出格式**:该工具接受什么输入、产出什么输出(文件格式、数据结构)
-4. **时间线记录**:
-   - 工具时间:发布日期或最近一次重大更新时间
-   - 情报时间:发现该工具的帖子/文章/教程的发布时间(用于判断信息新旧)
-5. **使用案例**:真实跑通的场景描述和来源
-6. **工序定位**(如有):该工具在整个生产环节中处于哪一步?和哪些工具配合度高?
-调研中积累的工具知识用 save_knowledge 存储时,也遵循此结构。搜索策略可根据需求,在知识库中按此结构检索已有工具评估。
-
-### 迭代调研
-调研不是一轮结束的。每次评估后,如果发现:
-- 某个维度的信息不足(缺专家评价、缺消费者反馈等)
-- 评估结论不够确定(confidence < 8)
-- 多渠道评价不一致
-则必须继续调研,补充缺失维度,直到评估结论可信。
-
-## 参考策略
-
-**双向推演法**:
-- **工具找用例(正向)**:适合需求冷门时
-  - 流程:发现新工具 → 搜索工具名称 → 从用例中判断质量
-  - 优势:更容易找到工具
-  - 劣势:需大量搜索才能判断信息质量,缺少案例时难以评估
-- **用例找工具(反向)**:适合需求常见时
-  - 流程:找到匹配的案例分享 → 提取背后的工具组合
-  - 优势:搜索效率高,一旦命中即可直接匹配需求
-  - 劣势:依赖创作者是否开源分享,冷门工具或保密工作流时容易碰壁
-
-**粗到细策略**:先调研该类型下有哪些工具,再筛选出与需求相关的工具进行深入调研。
-
-
-## 输出:筛选给出最佳搜索结果
-
-**标准**:
-1. 综合可信度(overall_confidence)≥ 8 优先
-2. 与阶段 required_spec 的匹配度
-3. 工具可用性和稳定性
-4. 外部反馈的一致性
-
-**路径** `%output_dir%/tool_<requirement>_<round>.json`:
-
-```jsonschema
-{
-  "trace": "string — 如何完成的搜索,比如尝试了哪些query、根据阶段性结果如何调整后序搜索等等"
-  "selected_approach": {
-    "tool": "string — 选定工具",
-    "version": "string",
-    "use_case_refs": ["string — 参考用例来源"],
-    "implementation_outline": "string — 实现思路概要",
-    "confidence": "number — 1-10",
-    "reasoning": "string — 为什么选这个方案"
-  },
-  "alternatives": [
-    {
-      "tool": "string",
-      "why_not": "string",
-      "could_switch_if": "string"
-    }
-  ],
-  "risks": [
-    {
-      "risk": "string",
-      "severity": "high | medium | low",
-      "mitigation": "string"
-    }
-  ],
-  "unresolved": ["string — 未能验证的问题,需人工确认"]
-}
-```
-
-## 注意事项
-
-- 优先使用 search_knowledge
-- 调研中发现的知识用 save_knowledge 存储
-- 登陆时,或不确定时联系关涛(feishu)
-- search_posts 不好用时改用 browser-use
-

+ 11 - 8
examples/research/config.py

@@ -15,36 +15,39 @@ RUN_CONFIG = RunConfig(
     temperature=0.3,
     max_iterations=1000,
 
+    # 启用 thinking 模式
+    extra_llm_params={"extra_body": {"enable_thinking": True}},
+
     # 任务名称
     name="Research Agent",
 
     # 知识管理配置
     knowledge=KnowledgeConfig(
         # 压缩时提取(消息量超阈值触发压缩时,用完整 history 反思)
-        enable_extraction=True,
+        enable_extraction=False,
         reflect_prompt="",  # 自定义反思 prompt;空则使用默认,见 agent/core/prompts/knowledge.py:REFLECT_PROMPT
 
         # agent运行完成后提取(不代表任务完成,agent 可能中途退出等待人工评估)
-        enable_completion_extraction=True,
+        enable_completion_extraction=False,
         completion_reflect_prompt="",  # 自定义复盘 prompt;空则使用默认,见 agent/core/prompts/knowledge.py:COMPLETION_REFLECT_PROMPT
 
         # 知识注入(agent切换当前工作的goal时,自动注入相关知识)
-        enable_injection=True,
+        enable_injection=False,
 
         # 默认字段(保存/搜索时自动注入)
-        owner="",  # 所有者(空则尝试从 git config user.email 获取,再空则用 agent:{agent_id})
+        owner="sunlit.howard@gmail.com",  # 所有者(空则尝试从 git config user.email 获取,再空则用 agent:{agent_id})
         default_tags={"project": "research", "domain": "ai_agent"},  # 默认 tags(会与工具调用参数合并)
         default_scopes=["org:cybertogether"],  # 默认 scopes
         default_search_types=["strategy"],  # 默认搜索类型过滤
-        default_search_owner="guantao,guantao@cybertogether.net"  # 默认搜索 owner 过滤(空则不过滤)
+        default_search_owner="sunlit.howard@gmail.com"  # 默认搜索 owner 过滤(空则不过滤)
     )
 )
 
 
 # ===== 任务配置 =====
 
-INPUT_DIR = "examples/research/input"       # 输入素材目录
-OUTPUT_DIR = "examples/research/outputs/output_2"                   # 输出目录 ID,输出保存在 examples/plan/outputs/{OUTPUT_DIR}/
+INPUT_DIR = "examples/research/huahua"       # 输入素材目录
+OUTPUT_DIR = "examples/research/outputs/huahua_3"                   # 输出目录 ID,输出保存在 examples/plan/outputs/{OUTPUT_DIR}/
 
 
 # ===== 基础设施配置 =====
@@ -57,5 +60,5 @@ LOG_FILE = None  # 设置为文件路径可以同时输出到文件
 
 # ===== 浏览器配置 =====
 # 可选值: "cloud" (云浏览器) 或 "local" (本地浏览器) 或 "container" (容器浏览器,支持预配置账户)
-BROWSER_TYPE = "container"
+BROWSER_TYPE = "local"
 HEADLESS = False

+ 0 - 32
examples/research/cong/descriptions/制作亮点.md

@@ -1,32 +0,0 @@
-"聚类结果":[{
-  "聚类主题": "拟真纸张与笔记本实体",
-  "聚类描述": "该聚类属于实质。这些亮点展示了构成画面的物理基础,包括带有褶皱纹理的信纸和具有实体感的螺旋活页笔记本。它们作为具体的视觉物体,为内容提供了具有真实触感和生活气息的书写介质。",
-  "亮点类型": "实质",
-},
-{
-  "聚类主题": "拟物化笔记场景呈现",
-  "聚类描述": "该聚类属于形式。设计通过模仿实体螺旋笔记本的构图框架、边缘纹理和阴影处理,构建了一种沉浸式的“手记”视觉风格。这种呈现方式将数字化内容包装在熟悉的物理容器形式中,增强了阅读的代入感。",
-  "亮点类型": "形式",
-},
-{
-  "聚类主题": "结构化排版与导视",
-  "聚类描述": "该聚类属于形式。画面利用居中堆叠、虚线分隔、层级列表等排版手段,构建了严谨而清晰的视觉秩序。这种结构化的布局形式通过空间分割和视线引导,将复杂的信息拆解为易于消化的模块,提升了阅读体验。",
-  "亮点类型": "形式",
-},
-{
-  "聚类主题": "手绘装饰与卡通图标",
-  "聚类描述": "该聚类属于实质。画面中散布着星星、花朵、笑脸及各类卡通小图标等手绘涂鸦元素。这些具象的装饰性物体不仅丰富了画面的视觉层次,更以轻松活泼的风格中和了科技主题的枯燥感。",
-  "亮点类型": "实质",
-},
-{
-  "聚类主题": "语义化色彩高亮",
-  "聚类描述": "该聚类属于形式。设计模拟了学生做笔记时的色彩标记习惯,利用荧光笔触、彩色字体对关键术语进行视觉强调。这种形式手段建立了清晰的信息层级,有效地引导读者快速捕捉核心知识点。",
-  "亮点类型": "形式",
-},
-{
-  "聚类主题": "知识可视化图表",
-  "聚类描述": "该聚类属于实质。亮点展示了一个具体的数据转化图表,将抽象的算法逻辑具象化为可视的矩阵数据。它是画面中用于教育解释的核心物体,直观演示了从分词到向量的转化过程。",
-  "亮点类型": "实质"
-}
-
-]

+ 0 - 37
examples/research/cong/descriptions/制作点.md

@@ -1,37 +0,0 @@
-{
-"元素ID": "元素1",
-"元素名称": "核心英文单词",
-"元素描述": "页面中心位置的英文单词,字体较大,颜色突出,通常位于一个彩色背景块上。",
-"段落数量": 4,
-"段落列表": [
-"段落1.3.3",
-"段落2.2.2",
-"段落3.2.2",
-"段落4.2.2"
-],
-"综合权重": 87.3
-},
-{
-"元素ID": "元素2",
-"元素名称": "背景",
-"元素描述": "带有横线的笔记本纸张纹理背景,边缘有虚线边框,整体呈现笔记风格。",
-"段落数量": 3,
-"段落列表": [
-"段落2.1",
-"段落3.1",
-"段落4.1"
-],
-"综合权重": 59.2
-},
-{
-"元素ID": "元素3",
-"元素名称": "回形针装饰",
-"元素描述": "页面左侧和右侧边缘的蓝色回形针形状装饰,用于固定页面,具有立体感。",
-"段落数量": 3,
-"段落列表": [
-"段落2.2.1",
-"段落3.2.1",
-"段落4.2.1"
-],
-"综合权重": 48.7
-}

+ 0 - 679
examples/research/cong/descriptions/小葱__img_1_制作表.json

@@ -1,679 +0,0 @@
-[
-  {
-    "名称": "笔记风格海报",
-    "描述": "一张以笔记本纸张为背景的宣传海报,包含标题、副标题、英文单词、励志语录和日期等多种文字信息,并配有装饰性图案。",
-    "段落ID": "段落1",
-    "形式": {
-      "背景纹理": {
-        "名称": "背景纹理",
-        "描述": "背景呈现出米白色纸张的纹理,带有横向的浅灰色细线,模拟笔记本纸张效果,同时纸张表面有不规则的褶皱和轻微的脏污感。",
-        "类型": "纹理",
-        "形式ID": "形式12",
-        "评分详情": {
-          "combined_score": 0.644
-        }
-      },
-      "背景颜色": {
-        "名称": "背景颜色",
-        "描述": "背景主色调为米白色,具体RGB值为(245, 245, 235)。",
-        "类型": "色彩",
-        "形式ID": "形式9",
-        "评分详情": {
-          "combined_score": 0.518
-        }
-      },
-      "文字内容": {
-        "名称": "文字内容",
-        "描述": "海报中包含中文文字“小葱白工”、“每天掌握一个”、“AI知识点”、“你走过的路,都会成为你的底气。”,英文文字“Growth”、“Hope”、“Future”、“Embedding”、“\"The paths you've walked will build your strength.\"”,以及日期“04.28”。",
-        "类型": "内容",
-        "形式ID": "形式1",
-        "评分详情": {
-          "combined_score": 0.672
-        }
-      },
-      "文字颜色": {
-        "名称": "文字颜色",
-        "描述": "“小葱白工”为深灰色(RGB: 60, 60, 60),“Growth”、“Hope”、“Future”为浅灰色(RGB: 150, 150, 150),“每天掌握一个”、“AI知识点”为深灰色(RGB: 60, 60, 60),“Embedding”为蓝色(RGB: 60, 140, 220),“你走过的路,都会成为你的底气。”为深灰色(RGB: 60, 60, 60),“\"The paths you've walked will build your strength.\"”为深灰色(RGB: 60, 60, 60),“Date: 04.28”为深灰色(RGB: 60, 60, 60)。",
-        "类型": "色彩",
-        "形式ID": "形式5",
-        "评分详情": {
-          "combined_score": 0.574
-        }
-      },
-      "文字字号": {
-        "名称": "文字字号",
-        "描述": "“每天掌握一个”和“AI知识点”的字号最大,目测约为100pt;“Embedding”字号次之,目测约为90pt;“你走过的路,都会成为你的底气。”和“\"The paths you've walked will build your strength.\"”字号较小,目测约为30pt;“小葱白工”、“Growth”、“Hope”、“Future”、“Date: 04.28”字号最小,目测约为25pt。",
-        "类型": "尺寸",
-        "形式ID": "形式7",
-        "评分详情": {
-          "combined_score": 0.595
-        }
-      },
-      "文字字体": {
-        "名称": "文字字体",
-        "描述": "中文标题“每天掌握一个”、“AI知识点”和副标题“你走过的路,都会成为你的底气。”采用手写风格的粗体中文字体;英文单词“Embedding”采用粗体无衬线字体;“小葱白工”采用手写风格中文字体;“Growth”、“Hope”、“Future”采用手写风格英文衬线字体;英文励志语录“\"The paths you've walked will build your strength.\"”采用手写风格英文衬线字体;日期“Date: 04.28”采用手写风格英文无衬线字体。",
-        "类型": "字体",
-        "形式ID": "形式8",
-        "评分详情": {
-          "combined_score": 0.616
-        }
-      },
-      "文字排版": {
-        "名称": "文字排版",
-        "描述": "“小葱白工”位于画面左上角,横向排列;“Growth”、“Hope”、“Future”位于画面右上角,竖向排列,每个单词被椭圆形边框包围;“每天掌握一个”位于画面中央偏上,横向居中排列;“AI知识点”位于“每天掌握一个”下方,横向居中排列;“Embedding”位于“AI知识点”下方,横向居中排列;“你走过的路,都会成为你的底气。”位于画面中下部,横向居中排列;“\"The paths you've walked will build your strength.\"”位于中文励志语录下方,横向居中排列;“Date: 04.28”位于画面左下角,横向排列。",
-        "类型": "布局",
-        "形式ID": "形式3",
-        "评分详情": {
-          "combined_score": 0.546
-        }
-      },
-      "图案形状": {
-        "名称": "图案形状",
-        "描述": "画面左上角有两颗星星图案,一颗为五角星,一颗为四角星;画面右上角有三个椭圆形边框;画面左下角有三朵花朵图案,每朵花有四个花瓣,花瓣呈圆形,花蕊呈圆形;画面右下角有四颗四角星图案。",
-        "类型": "形状",
-        "形式ID": "形式2",
-        "评分详情": {
-          "combined_score": 0.49
-        }
-      },
-      "涂抹形状": {
-        "名称": "涂抹形状",
-        "描述": "副标题“AI知识点”下方有一个不规则的粉色涂抹区域,形状呈横向椭圆形,边缘模糊,模拟手绘涂抹效果。",
-        "类型": "形状",
-        "评分详情": {
-          "combined_score": 0.525
-        }
-      },
-      "涂抹颜色": {
-        "名称": "涂抹颜色",
-        "描述": "涂抹区域的颜色为粉色,具体RGB值为(255, 180, 200)。",
-        "类型": "色彩",
-        "评分详情": {
-          "combined_score": 0.406
-        }
-      },
-      "涂抹位置": {
-        "名称": "涂抹位置",
-        "描述": "涂抹区域位于画面中央,覆盖了副标题“AI知识点”的下方,其顶点坐标为[200, 470], [1000, 470], [1000, 700], [200, 700]。",
-        "类型": "布局",
-        "评分详情": {
-          "combined_score": 0.42
-        }
-      },
-      "评分详情": {
-        "combined_score": 0.658
-      }
-    },
-    "子段落": [
-      {
-        "名称": "背景",
-        "描述": "一张带有横线和褶皱纹理的米白色笔记本纸张背景。",
-        "段落ID": "段落1.1",
-        "形式": {
-          "背景纹理": {
-            "名称": "背景纹理",
-            "描述": "背景呈现出米白色纸张的纹理,带有横向的浅灰色细线,模拟笔记本纸张效果,同时纸张表面有不规则的褶皱和轻微的脏污感。",
-            "类型": "纹理",
-            "形式ID": "形式12",
-            "评分详情": {
-              "combined_score": 0.63
-            }
-          },
-          "背景颜色": {
-            "名称": "背景颜色",
-            "描述": "背景主色调为米白色,具体RGB值为(245, 245, 235)。",
-            "类型": "色彩",
-            "形式ID": "形式9",
-            "评分详情": {
-              "combined_score": 0.56
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.644
-          }
-        }
-      },
-      {
-        "名称": "顶部装饰与信息",
-        "描述": "画面顶部左右两侧的装饰性图案和文字。",
-        "段落ID": "段落1.2",
-        "形式": {
-          "文字颜色": {
-            "名称": "文字颜色",
-            "描述": "“小葱白工”为深灰色(RGB: 60, 60, 60),“Growth”、“Hope”、“Future”为浅灰色(RGB: 150, 150, 150)。",
-            "类型": "色彩",
-            "形式ID": "形式5",
-            "评分详情": {
-              "combined_score": 0.616
-            }
-          },
-          "文字字号": {
-            "名称": "文字字号",
-            "描述": "“小葱白工”、“Growth”、“Hope”、“Future”字号较小,目测约为25pt。",
-            "类型": "尺寸",
-            "形式ID": "形式7",
-            "评分详情": {
-              "combined_score": 0.644
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.441
-          }
-        },
-        "子段落": [
-          {
-            "名称": "左侧标识",
-            "描述": "画面左上角由星星图案和文字组成的标识。",
-            "段落ID": "段落1.2.1",
-            "形式": {
-              "图案形状": {
-                "名称": "图案形状",
-                "描述": "包含一颗粉色五角星和一颗黄色四角星。",
-                "类型": "形状",
-                "形式ID": "形式2",
-                "评分详情": {
-                  "combined_score": 0.49
-                }
-              },
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "中文文字“小葱白工”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.672
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "文字颜色为深灰色,具体RGB值为(60, 60, 60)。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号较小,目测约为25pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "采用手写风格中文字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "文字位于星星图案下方,横向排列,整体居中。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.546
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.266
-              }
-            },
-            "子段落": [
-              {
-                "名称": "星星图案",
-                "描述": "左上角由粉色和黄色星星组成的图案。",
-                "段落ID": "段落1.2.1.1",
-                "形式": {
-                  "图案形状": {
-                    "名称": "图案形状",
-                    "描述": "包含一颗粉色五角星和一颗黄色四角星。",
-                    "类型": "形状",
-                    "形式ID": "形式2",
-                    "评分详情": {
-                      "combined_score": 0.49
-                    }
-                  },
-                  "评分详情": {
-                    "combined_score": 0.231
-                  }
-                }
-              },
-              {
-                "名称": "标识文字",
-                "描述": "左上角星星图案下方的中文文字。",
-                "段落ID": "段落1.2.1.2",
-                "形式": {
-                  "评分详情": {
-                    "combined_score": 0.301
-                  }
-                }
-              }
-            ]
-          },
-          {
-            "名称": "右侧标签",
-            "描述": "画面右上角竖向排列的三个椭圆形边框文字标签。",
-            "段落ID": "段落1.2.2",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "包含英文文字“Growth”、“Hope”、“Future”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.672
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "文字颜色为浅灰色,具体RGB值为(150, 150, 150)。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号较小,目测约为25pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "采用手写风格英文衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "三个单词竖向排列,每个单词被一个椭圆形边框包围,整体位于画面右上角。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.546
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.231
-              }
-            }
-          }
-        ]
-      },
-      {
-        "名称": "主要内容区",
-        "描述": "海报中央区域,包含标题、副标题和核心英文单词,是视觉焦点。",
-        "段落ID": "段落1.3",
-        "形式": {
-          "文字内容": {
-            "名称": "文字内容",
-            "描述": "包含中文文字“每天掌握一个”、“AI知识点”和英文文字“Embedding”。",
-            "类型": "内容",
-            "形式ID": "形式1",
-            "评分详情": {
-              "combined_score": 0.616
-            }
-          },
-          "文字颜色": {
-            "名称": "文字颜色",
-            "描述": "“每天掌握一个”、“AI知识点”为深灰色(RGB: 60, 60, 60),“Embedding”为蓝色(RGB: 60, 140, 220)。",
-            "类型": "色彩",
-            "形式ID": "形式5",
-            "评分详情": {
-              "combined_score": 0.532
-            }
-          },
-          "文字字号": {
-            "名称": "文字字号",
-            "描述": "“每天掌握一个”和“AI知识点”的字号最大,目测约为100pt;“Embedding”字号次之,目测约为90pt。",
-            "类型": "尺寸",
-            "形式ID": "形式7",
-            "评分详情": {
-              "combined_score": 0.574
-            }
-          },
-          "文字字体": {
-            "名称": "文字字体",
-            "描述": "中文标题“每天掌握一个”、“AI知识点”采用手写风格的粗体中文字体;英文单词“Embedding”采用粗体无衬线字体。",
-            "类型": "字体",
-            "形式ID": "形式8",
-            "评分详情": {
-              "combined_score": 0.49
-            }
-          },
-          "文字排版": {
-            "名称": "文字排版",
-            "描述": "“每天掌握一个”位于画面中央偏上,横向居中排列;“AI知识点”位于“每天掌握一个”下方,横向居中排列;“Embedding”位于“AI知识点”下方,横向居中排列。",
-            "类型": "布局",
-            "形式ID": "形式3",
-            "评分详情": {
-              "combined_score": 0.455
-            }
-          },
-          "涂抹位置": {
-            "名称": "涂抹位置",
-            "描述": "涂抹区域位于画面中央,覆盖了副标题“AI知识点”的下方,其顶点坐标为[200, 470], [1000, 470], [1000, 700], [200, 700]。",
-            "类型": "布局",
-            "评分详情": {
-              "combined_score": 0.42
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.616
-          }
-        },
-        "子段落": [
-          {
-            "名称": "标题",
-            "描述": "深灰色粗体中文字,位于画面顶部偏中。",
-            "段落ID": "段落1.3.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "中文文字“每天掌握一个”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号最大,目测约为100pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.448
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "采用手写风格的粗体中文字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.462
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "文字位于画面中央偏上,横向居中排列。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.406
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.476
-              }
-            }
-          },
-          {
-            "名称": "副标题",
-            "描述": "深灰色粗体中文字,位于粉色涂抹背景上。",
-            "段落ID": "段落1.3.2",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "中文文字“AI知识点”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号较大,目测约为100pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.406
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "采用手写风格的粗体中文字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.476
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "文字位于“每天掌握一个”下方,横向居中排列,部分文字位于粉色涂抹背景上。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.455
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.532
-              }
-            }
-          },
-          {
-            "名称": "核心英文单词",
-            "描述": "蓝色粗体英文单词,位于副标题下方。",
-            "段落ID": "段落1.3.3",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "英文单词“Embedding”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.672
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "文字颜色为蓝色,具体RGB值为(60, 140, 220)。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号较大,目测约为90pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "采用粗体无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.49
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "文字位于“AI知识点”下方,横向居中排列。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.672
-              }
-            }
-          },
-          {
-            "名称": "粉色涂抹背景",
-            "描述": "副标题下方的粉色不规则涂抹区域。",
-            "段落ID": "段落1.3.4",
-            "形式": {
-              "涂抹颜色": {
-                "名称": "涂抹颜色",
-                "描述": "涂抹区域的颜色为粉色,具体RGB值为(255, 180, 200)。",
-                "类型": "色彩",
-                "评分详情": {
-                  "combined_score": 0.406
-                }
-              },
-              "涂抹位置": {
-                "名称": "涂抹位置",
-                "描述": "涂抹区域位于画面中央,覆盖了副标题“AI知识点”的下方,其顶点坐标为[200, 470], [1000, 470], [1000, 700], [200, 700]。",
-                "类型": "布局",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.441
-              }
-            }
-          }
-        ]
-      },
-      {
-        "名称": "励志语录",
-        "描述": "位于画面中下部的中文和英文励志语录。",
-        "段落ID": "段落1.4",
-        "形式": {
-          "评分详情": {
-            "combined_score": 0.294
-          }
-        }
-      },
-      {
-        "名称": "底部信息区",
-        "描述": "画面底部左侧的日期信息和右侧的装饰性图案。",
-        "段落ID": "段落1.5",
-        "形式": {
-          "文字颜色": {
-            "名称": "文字颜色",
-            "描述": "文字颜色为深灰色,具体RGB值为(60, 60, 60)。",
-            "类型": "色彩",
-            "形式ID": "形式5",
-            "评分详情": {
-              "combined_score": 0.616
-            }
-          },
-          "文字字号": {
-            "名称": "文字字号",
-            "描述": "文字字号最小,目测约为25pt。",
-            "类型": "尺寸",
-            "形式ID": "形式7",
-            "评分详情": {
-              "combined_score": 0.644
-            }
-          },
-          "文字排版": {
-            "名称": "文字排版",
-            "描述": "日期位于画面左下角,横向排列。",
-            "类型": "布局",
-            "形式ID": "形式3",
-            "评分详情": {
-              "combined_score": 0.546
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.35
-          }
-        },
-        "子段落": [
-          {
-            "名称": "日期",
-            "描述": "画面左下角的日期信息。",
-            "段落ID": "段落1.5.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "日期“Date: 04.28”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.672
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "文字颜色为深灰色,具体RGB值为(60, 60, 60)。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号最小,目测约为25pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "采用手写风格英文无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "文字位于画面左下角,横向排列。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.546
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.161
-              }
-            }
-          },
-          {
-            "名称": "底部装饰图案",
-            "描述": "画面右下角由黄色花朵和星星组成的图案。",
-            "段落ID": "段落1.5.2",
-            "形式": {
-              "图案形状": {
-                "名称": "图案形状",
-                "描述": "包含三朵黄色花朵图案,每朵花有四个圆形花瓣,圆形花蕊,以及绿色的花茎;四颗黄色四角星图案。",
-                "类型": "形状",
-                "形式ID": "形式2",
-                "评分详情": {
-                  "combined_score": 0.49
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.245
-              }
-            }
-          }
-        ]
-      }
-    ]
-  }
-]

+ 0 - 415
examples/research/cong/descriptions/小葱__img_2_制作表.json

@@ -1,415 +0,0 @@
-[
-  {
-    "名称": "笔记风格海报",
-    "描述": "一张以蓝色和黄色为主色调的笔记风格海报,模拟了笔记本纸张和活页夹的样式,内容围绕“Embedding”这一主题展开。",
-    "段落ID": "段落2",
-    "形式": {
-      "背景颜色": {
-        "名称": "背景颜色",
-        "描述": "海报背景由左侧的蓝色活页夹边缘和右侧的白色笔记本纸张组成。活页夹边缘为纯蓝色,色值为 #87CEEB。笔记本纸张为纯白色,色值为 #FFFFFF。",
-        "类型": "色彩",
-        "形式ID": "形式9",
-        "评分详情": {
-          "combined_score": 0.525
-        }
-      },
-      "背景形状": {
-        "名称": "背景形状",
-        "描述": "海报整体背景为矩形,尺寸为1200x1700像素。左侧活页夹边缘呈不规则的波浪形,模拟了活页夹的环形结构。右侧白色笔记本纸张为矩形,边缘有虚线和圆孔。",
-        "类型": "形状",
-        "形式ID": "形式10",
-        "评分详情": {
-          "combined_score": 0.574
-        }
-      },
-      "文字内容": {
-        "名称": "文字内容",
-        "描述": "海报内容围绕“Embedding”这一主题展开,包含标题“Embedding”、问题“什么是“Embedding”?”、流程描述“从文本到“Embedding”的流程”以及详细的解释和示例表格。",
-        "类型": "内容",
-        "形式ID": "形式1",
-        "评分详情": {
-          "combined_score": 0.616
-        }
-      },
-      "文字颜色": {
-        "名称": "文字颜色",
-        "描述": "主要标题“Embedding”为黑色(#000000)。问题标题(如“什么是“Embedding”?”)的数字序号为蓝色(#4682B4),问号和文字为黑色(#000000)。正文内容为黑色(#000000)。表格中的文字颜色为黑色(#000000)。",
-        "类型": "色彩",
-        "形式ID": "形式5",
-        "评分详情": {
-          "combined_score": 0.546
-        }
-      },
-      "文字字号": {
-        "名称": "文字字号",
-        "描述": "主标题“Embedding”字号最大,约为100pt。问题标题(如“什么是“Embedding”?”)字号次之,约为30pt。正文内容字号较小,约为18pt。表格中的文字字号最小,约为14pt。",
-        "类型": "尺寸",
-        "形式ID": "形式7",
-        "评分详情": {
-          "combined_score": 0.504
-        }
-      },
-      "文字字体": {
-        "名称": "文字字体",
-        "描述": "主标题“Embedding”采用粗体无衬线字体。问题标题和正文内容采用常规无衬线字体。表格中的文字采用常规无衬线字体。",
-        "类型": "字体",
-        "形式ID": "形式8",
-        "评分详情": {
-          "combined_score": 0.525
-        }
-      },
-      "文字排版": {
-        "名称": "文字排版",
-        "描述": "主标题“Embedding”居中排版。问题标题左对齐,并带有序号和卡通表情。正文内容左对齐,段落之间有间距。表格内容居中对齐。",
-        "类型": "布局",
-        "形式ID": "形式3",
-        "评分详情": {
-          "combined_score": 0.602
-        }
-      },
-      "表格填充色": {
-        "名称": "表格填充色",
-        "描述": "表格的表头行填充色为浅绿色(#90EE90),第一列(Tokenization和Embedding)的背景色为浅紫色(#E6E6FA),其余数据单元格的背景色为白色(#FFFFFF)。",
-        "类型": "色彩",
-        "形式ID": "形式16",
-        "评分详情": {
-          "combined_score": 0.455
-        }
-      },
-      "评分详情": {
-        "combined_score": 0.616
-      }
-    },
-    "子段落": [
-      {
-        "名称": "背景",
-        "描述": "海报的背景,模拟了活页夹的蓝色边缘和白色笔记本纸张,纸张边缘有虚线和圆孔。",
-        "段落ID": "段落2.1",
-        "形式": {
-          "背景颜色": {
-            "名称": "背景颜色",
-            "描述": "背景由左侧的蓝色活页夹边缘和右侧的白色笔记本纸张组成。活页夹边缘为纯蓝色,色值为 #87CEEB。笔记本纸张为纯白色,色值为 #FFFFFF。",
-            "类型": "色彩",
-            "形式ID": "形式9",
-            "评分详情": {
-              "combined_score": 0.427
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.441
-          }
-        }
-      },
-      {
-        "名称": "顶部装饰与信息",
-        "描述": "位于海报顶部,包含一个黄色回形针和标题文字。",
-        "段落ID": "段落2.2",
-        "形式": {
-          "评分详情": {
-            "combined_score": 0.301
-          }
-        },
-        "子段落": [
-          {
-            "名称": "回形针装饰",
-            "描述": "一个黄色的回形针,固定在纸张顶部。",
-            "段落ID": "段落2.2.1",
-            "形式": {
-              "评分详情": {
-                "combined_score": 0.154
-              }
-            }
-          },
-          {
-            "名称": "核心英文单词",
-            "描述": "海报的核心主题词,以大号黑色粗体英文显示。",
-            "段落ID": "段落2.2.2",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "核心英文单词为“Embedding”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.665
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "核心英文单词“Embedding”为黑色,色值为 #000000。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "核心英文单词“Embedding”字号最大,约为100pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "核心英文单词“Embedding”采用粗体无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "核心英文单词“Embedding”居中排版,位于回形针下方,顶点坐标为 [250, 180] 到 [950, 300]。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.595
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.665
-              }
-            }
-          }
-        ]
-      },
-      {
-        "名称": "主要内容区",
-        "描述": "海报的主体部分,包含多个标题和详细的文本内容,以笔记形式呈现。",
-        "段落ID": "段落2.3",
-        "形式": {
-          "文字内容": {
-            "名称": "文字内容",
-            "描述": "主要内容区包含多个标题和详细的文本内容,如“什么是“Embedding”?”、“从文本到“Embedding”的流程”以及对Embedding概念的解释、生成流程的描述和示例表格中的文字。",
-            "类型": "内容",
-            "形式ID": "形式1",
-            "评分详情": {
-              "combined_score": 0.532
-            }
-          },
-          "文字字体": {
-            "名称": "文字字体",
-            "描述": "所有文字均采用无衬线字体,标题部分为粗体,正文和表格为常规字体。",
-            "类型": "字体",
-            "形式ID": "形式8",
-            "评分详情": {
-              "combined_score": 0.525
-            }
-          },
-          "文字排版": {
-            "名称": "文字排版",
-            "描述": "问题标题左对齐,并带有序号和卡通表情。正文内容左对齐,段落之间有间距。表格内容居中对齐。",
-            "类型": "布局",
-            "形式ID": "形式3",
-            "评分详情": {
-              "combined_score": 0.476
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.532
-          }
-        },
-        "子段落": [
-          {
-            "名称": "问题标题1",
-            "描述": "第一个问题标题,包含序号、问号和卡通表情。",
-            "段落ID": "段落2.3.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "标题内容为“1 什么是“Embedding”?”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.462
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "标题左对齐,数字序号“1”被蓝色圆圈包裹,位于文字左侧,卡通问号表情位于标题文字右侧。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.602
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.476
-              }
-            }
-          },
-          {
-            "名称": "问题1正文",
-            "描述": "对“Embedding”概念的解释。",
-            "段落ID": "段落2.3.2",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "正文内容为“Embedding (嵌入)是指把文本(也可能包括图像、视频等其他模态数据)转成能表达语义信息的浮点数向量,向量之间的数学距离可以反映对应文本之间的语义相关性。”",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.56
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "所有文字均为黑色,色值为 #000000。其中“语义信息”和“语义相关性”两个词语被高亮显示为蓝色(#4682B4)。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "正文内容字号约为18pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "正文内容采用常规无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.56
-              }
-            }
-          },
-          {
-            "名称": "问题标题2",
-            "描述": "第二个问题标题,包含序号和卡通表情。",
-            "段落ID": "段落2.3.3",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "标题内容为“2 从文本到“Embedding”的流程”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.469
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "标题文字字号约为30pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.469
-              }
-            }
-          },
-          {
-            "名称": "问题2正文",
-            "描述": "详细解释了从文本到Embedding的生成流程。",
-            "段落ID": "段落2.3.4",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "正文内容包含“Embedding的生成方式,主要分两种情况:”、“1)大模型推理中的Embedding(Token级)”、“• 文本先通过分词器拆分成最小语言单位token,例如:\"unbelievable\" → [\"un\", \"believ\", \"able\"]。”、“• 接着查询词表,将每个token被映射成一个数字编号,比如:\"un\" → 1087。”、“• 根据编号查询Embedding矩阵,快速取出对应的浮点数向量,例如:\"un\" → [0.24, -0.31, 0.88, ..., 0.05]。”和“生成Token级的Embedding,是大模型理解输入文本的第一步。”",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.602
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "所有文字均为黑色,色值为 #000000。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "正文内容左对齐,采用列表形式,项目符号为实心圆点。段落之间有间距。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.602
-              }
-            }
-          },
-          {
-            "名称": "示例表格",
-            "描述": "一个展示Tokenization和Embedding对应关系的表格。",
-            "段落ID": "段落2.3.5",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "表格内容包含表头“Tokenization”、“Embedding”以及“This is a cute dog”的Tokenization和Embedding数值,如“[CLS]”、“This”、“is”、“a”、“cute”、“dog”、“[SEP]”及其对应的数字编号和浮点数向量。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.581
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "表格中的文字字号约为14pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "表格中的文字采用常规无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "表格内容居中对齐。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.455
-                }
-              },
-              "表格填充色": {
-                "名称": "表格填充色",
-                "描述": "表格的表头行填充色为浅绿色(#90EE90),第一列(Tokenization和Embedding)的背景色为浅紫色(#E6E6FA),其余数据单元格的背景色为白色(#FFFFFF)。",
-                "类型": "色彩",
-                "形式ID": "形式16",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.581
-              }
-            }
-          }
-        ]
-      }
-    ]
-  }
-]

+ 0 - 414
examples/research/cong/descriptions/小葱__img_3_制作表.json

@@ -1,414 +0,0 @@
-[
-  {
-    "名称": "笔记风格海报",
-    "描述": "一张以蓝色和黄色为主色调的笔记风格海报,模拟了笔记本纸张和活页夹的样式,内容围绕“Embedding”这一主题展开。",
-    "段落ID": "段落3",
-    "形式": {
-      "背景颜色": {
-        "名称": "背景颜色",
-        "描述": "海报整体背景色调为蓝色和黄色。",
-        "类型": "色彩",
-        "形式ID": "形式9",
-        "评分详情": {
-          "combined_score": 0.49
-        }
-      },
-      "背景纹理": {
-        "名称": "背景纹理",
-        "描述": "背景模拟了笔记本纸张和活页夹的纹理,包括活页夹的蓝色边缘、白色纸张、纸张边缘的虚线和圆孔。",
-        "类型": "纹理",
-        "形式ID": "形式12",
-        "评分详情": {
-          "combined_score": 0.644
-        }
-      },
-      "文字内容": {
-        "名称": "文字内容",
-        "描述": "海报内容围绕“Embedding”这一主题展开,包含标题、解释性文本、示例和结论。",
-        "类型": "内容",
-        "形式ID": "形式1",
-        "评分详情": {
-          "combined_score": 0.63
-        }
-      },
-      "文字颜色": {
-        "名称": "文字颜色",
-        "描述": "文字颜色主要为黑色,部分关键词如“Embedding模型”、“压缩”为紫色,标题中的数字“2”和“3”为蓝色,部分文字如“专门训练好的”为黄色背景高亮。",
-        "类型": "色彩",
-        "形式ID": "形式5",
-        "评分详情": {
-          "combined_score": 0.546
-        }
-      },
-      "文字字号": {
-        "名称": "文字字号",
-        "描述": "标题“Embedding”字号最大,其他正文和子标题字号相对较小,但子标题略大于正文字号。",
-        "类型": "尺寸",
-        "形式ID": "形式7",
-        "评分详情": {
-          "combined_score": 0.525
-        }
-      },
-      "文字字体": {
-        "名称": "文字字体",
-        "描述": "标题“Embedding”为粗体无衬线字体,其他文字为常规无衬线字体。",
-        "类型": "字体",
-        "形式ID": "形式8",
-        "评分详情": {
-          "combined_score": 0.525
-        }
-      },
-      "文字排版": {
-        "名称": "文字排版",
-        "描述": "文字排版采用左对齐,标题居中,正文分段落,并使用项目符号和序号进行组织。",
-        "类型": "布局",
-        "形式ID": "形式3",
-        "评分详情": {
-          "combined_score": 0.595
-        }
-      },
-      "线条形状": {
-        "名称": "线条形状",
-        "描述": "背景纸张边缘有虚线,内容区有虚线分隔线,活页夹边缘有环形线条。",
-        "类型": "形状",
-        "形式ID": "形式11",
-        "评分详情": {
-          "combined_score": 0.574
-        }
-      },
-      "线条样式": {
-        "名称": "线条样式",
-        "描述": "纸张边缘为虚线,内容区段落之间有水平虚线分隔,活页夹边缘为连续的环形线条。",
-        "类型": "样式",
-        "形式ID": "形式14",
-        "评分详情": {
-          "combined_score": 0.42
-        }
-      },
-      "评分详情": {
-        "combined_score": 0.658
-      }
-    },
-    "子段落": [
-      {
-        "名称": "背景",
-        "描述": "海报的背景,模拟了活页夹的蓝色边缘和白色笔记本纸张,纸张边缘有虚线和圆孔。",
-        "段落ID": "段落3.1",
-        "形式": {
-          "背景颜色": {
-            "名称": "背景颜色",
-            "描述": "背景由左侧的蓝色活页夹边缘和右侧的白色笔记本纸张组成。",
-            "类型": "色彩",
-            "形式ID": "形式9",
-            "评分详情": {
-              "combined_score": 0.595
-            }
-          },
-          "背景纹理": {
-            "名称": "背景纹理",
-            "描述": "背景模拟了活页夹的塑料质感和笔记本纸张的纸质感,纸张边缘有虚线和圆孔。",
-            "类型": "纹理",
-            "形式ID": "形式12",
-            "评分详情": {
-              "combined_score": 0.42
-            }
-          },
-          "线条形状": {
-            "名称": "线条形状",
-            "描述": "纸张左侧边缘有垂直虚线,顶部和底部有水平虚线,左侧有三个圆形孔洞。活页夹部分有三个半圆形环状线条。",
-            "类型": "形状",
-            "形式ID": "形式11",
-            "评分详情": {
-              "combined_score": 0.574
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.602
-          }
-        }
-      },
-      {
-        "名称": "顶部装饰与信息",
-        "描述": "位于海报顶部,包含一个黄色回形针和标题文字。",
-        "段落ID": "段落3.2",
-        "形式": {
-          "评分详情": {
-            "combined_score": 0.35
-          }
-        },
-        "子段落": [
-          {
-            "名称": "回形针装饰",
-            "描述": "一个黄色的回形针,固定在纸张顶部。",
-            "段落ID": "段落3.2.1",
-            "形式": {
-              "图案形状": {
-                "名称": "图案形状",
-                "描述": "一个典型的回形针形状,由弯曲的线条构成。",
-                "类型": "形状",
-                "形式ID": "形式2",
-                "评分详情": {
-                  "combined_score": 0.406
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.175
-              }
-            }
-          },
-          {
-            "名称": "核心英文单词",
-            "描述": "海报的核心主题词,以大号黑色粗体英文显示。",
-            "段落ID": "段落3.2.2",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "核心英文单词为“Embedding”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.672
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "文字颜色为黑色。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.49
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号非常大,是海报中最大的文字,高度约为120像素。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "文字字体为粗体无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "文字在指定区域内居中排版,坐标为[250, 180]到[950, 300]。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.595
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.672
-              }
-            }
-          }
-        ]
-      },
-      {
-        "名称": "主要内容区",
-        "描述": "海报的主体部分,包含多个标题和详细的文本内容,以笔记形式呈现。",
-        "段落ID": "段落3.3",
-        "形式": {
-          "文字内容": {
-            "名称": "文字内容",
-            "描述": "主要内容区包含多个标题和详细的文本内容,如“独立使用的Embedding (句子/文档级)”、“Embedding”的本质:语义可“被数字表示”等,以及相关的解释和示例。",
-            "类型": "内容",
-            "形式ID": "形式1",
-            "评分详情": {
-              "combined_score": 0.581
-            }
-          },
-          "文字颜色": {
-            "名称": "文字颜色",
-            "描述": "大部分文字为黑色,部分关键词如“Embedding模型”、“压缩”为紫色,标题中的数字“2”和“3”为蓝色,部分文字如“专门训练好的”为黄色背景高亮。",
-            "类型": "色彩",
-            "形式ID": "形式5",
-            "评分详情": {
-              "combined_score": 0.455
-            }
-          },
-          "文字排版": {
-            "名称": "文字排版",
-            "描述": "文字排版采用左对齐,段落之间有水平虚线分隔,并使用序号和项目符号进行组织。",
-            "类型": "布局",
-            "形式ID": "形式3",
-            "评分详情": {
-              "combined_score": 0.504
-            }
-          },
-          "图案形状": {
-            "名称": "图案形状",
-            "描述": "包含标题前的数字“2”和“3”的圆形背景,以及标题“Embedding”的本质:语义可“被数字表示”右侧的卡通太阳表情图案,以及正文中的绿色对勾符号。",
-            "类型": "形状",
-            "形式ID": "形式2",
-            "评分详情": {
-              "combined_score": 0.406
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.581
-          }
-        },
-        "子段落": [
-          {
-            "名称": "问题标题2补充",
-            "描述": "对Embedding生成方式的第二种情况的标题。",
-            "段落ID": "段落3.3.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "标题内容为“2) 独立使用的Embedding (句子/文档级)”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.455
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.476
-              }
-            }
-          },
-          {
-            "名称": "问题2补充正文",
-            "描述": "详细解释了独立使用的Embedding(句子/文档级)。",
-            "段落ID": "段落3.3.2",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "正文内容为“如果需要表示一整句或一段文本(比如在RAG中检索),就不能只查表了。常见做法是:将文本输入到一个专门训练好的Embedding模型(如 Sentence-BERT、M3E),通过推理生成一个完整的句子或文档级向量。这种Embedding包含了更丰富的上下文信息,适合检索、相似性判断等场景。”",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.504
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号统一,为常规大小。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "文字字体为常规无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.518
-              }
-            }
-          },
-          {
-            "名称": "问题标题3",
-            "描述": "第三个问题标题,包含序号和卡通表情。",
-            "段落ID": "段落3.3.3",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "标题内容为“3 “Embedding”的本质:语义可“被数字表示””。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.504
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "数字“3”为蓝色,关键词“Embedding”、“被数字表示”为黑色粗体,其余文字为黑色。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.546
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号相对正文较大,但小于主标题“Embedding”。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.434
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "文字左对齐,位于坐标[180, 720]到[1020, 790]的区域内。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.595
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.504
-              }
-            }
-          },
-          {
-            "名称": "问题3正文",
-            "描述": "详细解释了Embedding的本质及其语义表示能力。",
-            "段落ID": "段落3.3.4",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "正文内容为“在模型训练中,发现文本的语义可以被“压缩”成一组数字向量,且向量之间的距离和方向,能自然反映文本间的语义关系。比如:•“猫”和“狗”对应向量的数学距离很近,代表它们语义接近(都是动物)•“房子”和“你好”对应向量的数学距离很远,表示它们语义无关• 模型甚至可以学到:king - man + woman ≈ queen 这样的语义数学关系这些规律并非人为设定,而是模型通过海量数据自动学习到的。”",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.56
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "文字字号统一,为常规大小。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "文字字体为常规无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "文字左对齐,分多段,使用项目符号进行组织,段落之间有水平虚线分隔,位于坐标[180, 810]到[1020, 1500]的区域内。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.49
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.56
-              }
-            }
-          }
-        ]
-      }
-    ]
-  }
-]

+ 0 - 405
examples/research/cong/descriptions/小葱__img_4_制作表.json

@@ -1,405 +0,0 @@
-[
-  {
-    "名称": "笔记风格海报",
-    "描述": "一张以蓝色和黄色为主色调的笔记风格海报,模拟了笔记本纸张和活页夹的样式,内容围绕“Embedding”这一主题展开。",
-    "段落ID": "段落4",
-    "形式": {
-      "背景颜色": {
-        "名称": "背景颜色",
-        "描述": "海报背景由左侧的蓝色活页夹边缘和右侧的白色笔记本纸张组成。活页夹边缘为纯蓝色,笔记本纸张为纯白色。",
-        "类型": "色彩",
-        "形式ID": "形式9",
-        "评分详情": {
-          "combined_score": 0.42
-        }
-      },
-      "背景纹理": {
-        "名称": "背景纹理",
-        "描述": "背景纹理模拟了笔记本纸张和活页夹的样式。活页夹边缘呈现出光滑的塑料质感,笔记本纸张具有纸张的轻微粗糙感,并带有横向的浅灰色虚线横格和左侧的红色竖向虚线边缘,以及左侧的三个圆形打孔。",
-        "类型": "纹理",
-        "形式ID": "形式12",
-        "评分详情": {
-          "combined_score": 0.574
-        }
-      },
-      "背景形状": {
-        "名称": "背景形状",
-        "描述": "海报整体背景为矩形,尺寸为1200x1700像素。左侧活页夹边缘呈不规则的波浪形,模拟活页夹的脊背。右侧的笔记本纸张部分为矩形,顶部和底部边缘有圆角,左侧边缘有三个圆形打孔。",
-        "类型": "形状",
-        "形式ID": "形式10",
-        "评分详情": {
-          "combined_score": 0.455
-        }
-      },
-      "文字内容": {
-        "名称": "文字内容",
-        "描述": "海报内容围绕“Embedding”这一主题展开,包括核心标题“Embedding”,以及“Embedding”的应用场景和常见问题答疑两大部分。应用场景部分详细列举了检索增强生成、相似性判断、文本聚类与分析等具体应用。常见问题答疑部分以问答形式解释了Token与Embedding的区别、Embedding的训练方式以及Embedding向量长度的固定性等问题。",
-        "类型": "内容",
-        "形式ID": "形式1",
-        "评分详情": {
-          "combined_score": 0.658
-        }
-      },
-      "文字颜色": {
-        "名称": "文字颜色",
-        "描述": "核心标题“Embedding”为黑色。应用场景和常见问题答疑的标题文字为黑色。正文内容大部分为黑色,其中部分关键词如“编码为语义向量”、“检索增强生成(RAG)”、“相似性判断”、“文本聚类与分析”、“编号(离散的ID)”、“承载语义的连续向量”、“海量语料学习到的语义表示”、“计算结构”、“批量处理和矩阵运算”等被高亮显示为紫色。问答部分的“Q:”和“A:”为绿色。",
-        "类型": "色彩",
-        "形式ID": "形式5",
-        "评分详情": {
-          "combined_score": 0.546
-        }
-      },
-      "文字字号": {
-        "名称": "文字字号",
-        "描述": "核心标题“Embedding”字号最大,约为100pt。一级标题“④ “Embedding”的应用场景”和“⑤ 常见问题答疑”字号次之,约为30pt。正文内容字号约为20pt。问答部分的“Q:”和“A:”字号与正文相同,约为20pt。",
-        "类型": "尺寸",
-        "形式ID": "形式7",
-        "评分详情": {
-          "combined_score": 0.525
-        }
-      },
-      "文字字体": {
-        "名称": "文字字体",
-        "描述": "核心标题“Embedding”采用粗体无衬线字体。所有正文、标题和问答内容均采用无衬线字体,字形清晰简洁。",
-        "类型": "字体",
-        "形式ID": "形式8",
-        "评分详情": {
-          "combined_score": 0.42
-        }
-      },
-      "文字排版": {
-        "名称": "文字排版",
-        "描述": "核心标题“Embedding”居中排版。一级标题“④ “Embedding”的应用场景”和“⑤ 常见问题答疑”左对齐,并带有序号和图标。正文内容左对齐,段落之间有行距,列表项使用圆点符号。问答部分“Q:”和“A:”左对齐,并与回答内容在同一行或下一行。",
-        "类型": "布局",
-        "形式ID": "形式3",
-        "评分详情": {
-          "combined_score": 0.616
-        }
-      },
-      "线条形状": {
-        "名称": "线条形状",
-        "描述": "背景纸张上有横向的虚线横格和左侧的红色竖向虚线边缘。活页夹边缘呈波浪形线条。内容区域的标题下方和段落之间有横向的虚线分隔线。",
-        "类型": "形状",
-        "形式ID": "形式11",
-        "评分详情": {
-          "combined_score": 0.49
-        }
-      },
-      "评分详情": {
-        "combined_score": 0.658
-      }
-    },
-    "子段落": [
-      {
-        "名称": "背景",
-        "描述": "海报的背景,模拟了活页夹的蓝色边缘和白色笔记本纸张,纸张边缘有虚线和圆孔。",
-        "段落ID": "段落4.1",
-        "形式": {
-          "背景颜色": {
-            "名称": "背景颜色",
-            "描述": "背景由左侧的蓝色活页夹边缘和右侧的白色笔记本纸张组成。活页夹边缘为纯蓝色,笔记本纸张为纯白色。",
-            "类型": "色彩",
-            "形式ID": "形式9",
-            "评分详情": {
-              "combined_score": 0.525
-            }
-          },
-          "背景形状": {
-            "名称": "背景形状",
-            "描述": "背景整体为矩形,尺寸为1200x1700像素。左侧活页夹边缘呈不规则的波浪形,模拟活页夹的脊背。右侧的笔记本纸张部分为矩形,顶部和底部边缘有圆角,左侧边缘有三个圆形打孔。",
-            "类型": "形状",
-            "形式ID": "形式10",
-            "评分详情": {
-              "combined_score": 0.49
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.525
-          }
-        }
-      },
-      {
-        "名称": "顶部装饰与信息",
-        "描述": "位于海报顶部,包含一个黄色回形针和标题文字。",
-        "段落ID": "段落4.2",
-        "形式": {
-          "文字字体": {
-            "名称": "文字字体",
-            "描述": "核心主题词“Embedding”采用粗体无衬线字体。标题“④ “Embedding”的应用场景”采用无衬线字体。",
-            "类型": "字体",
-            "形式ID": "形式8",
-            "评分详情": {
-              "combined_score": 0.56
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.371
-          }
-        },
-        "子段落": [
-          {
-            "名称": "回形针装饰",
-            "描述": "一个黄色的回形针,固定在纸张顶部。",
-            "段落ID": "段落4.2.1",
-            "形式": {
-              "评分详情": {
-                "combined_score": 0.154
-              }
-            }
-          },
-          {
-            "名称": "核心英文单词",
-            "描述": "海报的核心主题词,以大号黑色粗体英文显示。",
-            "段落ID": "段落4.2.2",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "核心英文单词“Embedding”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.665
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "核心英文单词“Embedding”为黑色。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "核心英文单词“Embedding”字号最大,约为100pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.63
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "核心英文单词“Embedding”采用粗体无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.56
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "核心英文单词“Embedding”居中排版,位于顶点坐标[250, 180]到[950, 300]的区域内。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.595
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.665
-              }
-            }
-          }
-        ]
-      },
-      {
-        "名称": "主要内容区",
-        "描述": "海报的主体部分,包含多个标题和详细的文本内容,以笔记形式呈现。",
-        "段落ID": "段落4.3",
-        "形式": {
-          "文字内容": {
-            "名称": "文字内容",
-            "描述": "包含标题“④ “Embedding”的应用场景”和“⑤ 常见问题答疑”,以及其下的详细文本内容。应用场景部分列举了检索增强生成、相似性判断、文本聚类与分析等应用。常见问题答疑部分以问答形式解释了Token与Embedding的区别、Embedding的训练方式以及Embedding向量长度的固定性等问题。",
-            "类型": "内容",
-            "形式ID": "形式1",
-            "评分详情": {
-              "combined_score": 0.588
-            }
-          },
-          "文字颜色": {
-            "名称": "文字颜色",
-            "描述": "标题文字为黑色。正文内容大部分为黑色,其中部分关键词如“编码为语义向量”、“检索增强生成(RAG)”、“相似性判断”、“文本聚类与分析”、“编号(离散的ID)”、“承载语义的连续向量”、“海量语料学习到的语义表示”、“计算结构”、“批量处理和矩阵运算”等被高亮显示为紫色。问答部分的“Q:”和“A:”为绿色。",
-            "类型": "色彩",
-            "形式ID": "形式5",
-            "评分详情": {
-              "combined_score": 0.525
-            }
-          },
-          "文字字号": {
-            "名称": "文字字号",
-            "描述": "一级标题“④ “Embedding”的应用场景”和“⑤ 常见问题答疑”字号约为30pt。正文内容字号约为20pt。问答部分的“Q:”和“A:”字号与正文相同,约为20pt。",
-            "类型": "尺寸",
-            "形式ID": "形式7",
-            "评分详情": {
-              "combined_score": 0.476
-            }
-          },
-          "文字排版": {
-            "名称": "文字排版",
-            "描述": "标题左对齐,并带有序号和图标。正文内容左对齐,段落之间有行距,列表项使用圆点符号。问答部分“Q:”和“A:”左对齐,并与回答内容在同一行或下一行。",
-            "类型": "布局",
-            "形式ID": "形式3",
-            "评分详情": {
-              "combined_score": 0.546
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.588
-          }
-        },
-        "子段落": [
-          {
-            "名称": "问题标题4",
-            "描述": "第四个问题标题,包含序号和卡通表情。",
-            "段落ID": "段落4.3.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "标题“④ “Embedding”的应用场景”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "标题字号约为30pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "标题左对齐,并带有序号“④”和扳手图标,位于顶点坐标[180, 380]到[900, 450]的区域内。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.455
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.532
-              }
-            }
-          },
-          {
-            "名称": "问题4正文",
-            "描述": "详细解释了Embedding的多种应用场景。",
-            "段落ID": "段落4.3.2",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "详细解释了Embedding的多种应用场景,包括检索增强生成(RAG)、相似性判断和文本聚类与分析。其中,“编码为语义向量”、“检索增强生成(RAG)”、“相似性判断”、“文本聚类与分析”等关键词被高亮。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "正文内容大部分为黑色,其中“编码为语义向量”、“检索增强生成(RAG)”、“相似性判断”、“文本聚类与分析”等关键词被高亮显示为紫色。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.49
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "正文内容左对齐,段落之间有行距,列表项使用圆形实心点作为符号,位于顶点坐标[180, 460]到[1020, 850]的区域内。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.623
-              }
-            }
-          },
-          {
-            "名称": "问题标题5",
-            "描述": "第五个问题标题,包含序号和卡通表情。",
-            "段落ID": "段落4.3.3",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "标题“⑤ 常见问题答疑”。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "文字字号": {
-                "名称": "文字字号",
-                "描述": "标题字号约为30pt。",
-                "类型": "尺寸",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.455
-                }
-              },
-              "文字字体": {
-                "名称": "文字字体",
-                "描述": "标题采用无衬线字体。",
-                "类型": "字体",
-                "形式ID": "形式8",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.525
-              }
-            }
-          },
-          {
-            "名称": "问题5正文",
-            "描述": "以问答形式解答了关于Embedding的常见问题。",
-            "段落ID": "段落4.3.4",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "以问答形式解答了关于Embedding的常见问题,包括Token与Embedding的区别、Embedding的训练方式以及Embedding向量长度的固定性。其中,“编号(离散的ID)”、“承载语义的连续向量”、“海量语料学习到的语义表示”、“计算结构”、“批量处理和矩阵运算”等关键词被高亮。",
-                "类型": "内容",
-                "形式ID": "形式1",
-                "评分详情": {
-                  "combined_score": 0.637
-                }
-              },
-              "文字颜色": {
-                "名称": "文字颜色",
-                "描述": "问答部分的“Q:”和“A:”为绿色。回答内容大部分为黑色,其中“编号(离散的ID)”、“承载语义的连续向量”、“海量语料学习到的语义表示”、“计算结构”、“批量处理和矩阵运算”等关键词被高亮显示为紫色。",
-                "类型": "色彩",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "文字排版": {
-                "名称": "文字排版",
-                "描述": "问答部分“Q:”和“A:”左对齐,并与回答内容在同一行或下一行,位于顶点坐标[180, 980]到[1020, 1600]的区域内。",
-                "类型": "布局",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.49
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.637
-              }
-            }
-          }
-        ]
-      }
-    ]
-  }
-]

+ 0 - 19
examples/research/cong/index.md

@@ -1,19 +0,0 @@
-# Cong 输入目录说明
-
-本目录包含"小葱"笔记风格海报的调研输入文件,来自上游 plan 阶段的产出。
-
-## 根目录文件
-
-- `analysis.json`:需求分析结果,包含 AI 知识科普笔记风格海报的内容品类判断、上限点、下限点及 AI 还原挑战。
-- `pipeline.json`:粗工序定义,描述混合策略(底图+智能文字层)的还原流程、目标树和风险评估。
-
-## descriptions/ 文件夹
-
-还原目标的详细描述,包含海报的结构化解构数据。
-
-- `制作亮点.md`:核心亮点聚类,包括拟真纸张、拟物化场景、结构化排版、手绘装饰等。
-- `制作点.md`:关键视觉元素及权重,如核心英文单词、背景纹理等。
-- `小葱__img_1_制作表.json`:第 1 张海报的制作表,包含背景纹理、颜色、排版等形式要素。
-- `小葱__img_2_制作表.json`:第 2 张海报的制作表(Embedding 主题),含背景颜色和纹理描述。
-- `小葱__img_3_制作表.json`:第 3 张海报的制作表,包含背景形状和色值信息。
-- `小葱__img_4_制作表.json`:第 4 张海报的制作表(Embedding 主题),含活页夹和纸张纹理细节。

+ 0 - 523
examples/research/cong/pipeline.json

@@ -1,523 +0,0 @@
-{
-  "pipelines": [
-    {
-      "strategy": {
-        "name": "混合策略:底图 + 智能文字层",
-        "description": "使用即梦 AI 4.5 生成带核心文字(核心英文单词、一级标题)和基础框架(笔记本、回形针、纸张纹理)的底图,然后在后期工具中叠加复杂文字内容(正文段落、表格、语义化高亮)和手绘装饰元素",
-        "reasoning": "analysis.json 中的核心需求是:文字精准度(critical)+ 跨图一致性(critical)+ 材质真实感(high)。S3 策略能够同时满足这三个核心需求:1) 文字精准度:复杂文字内容(正文、表格数值、专业术语)由后期工具精准控制,避免 AI 生成错误;2) 跨图一致性:底图(笔记本框架、回形针、纸张纹理)可复用或基于同一 seed 生成,保证 4 张图的视觉统一;3) 材质真实感:核心视觉元素由 AI 生成,光影、透视、材质纹理自然统一",
-        "vs_alternatives": [
-          {
-            "alternative": "S1 底图 + 分层叠加",
-            "why_not": "纯分层叠加需要手动处理所有文字,工作量大,且文字与背景的融合度可能不足(缺少纸张纹理渗透感)。S3 让 AI 生成核心文字,减少后期工作量,同时保证光影自然",
-            "could_switch_if": "如果即梦 AI 4.5 的实际文字生成精度不足以处理核心英文单词和一级标题,则回退到 S1(所有文字后期叠加)"
-          },
-          {
-            "alternative": "S2 端到端文生图",
-            "why_not": "端到端生成在复杂表格(img_2)和长文本场景下文字错误风险高,且修改成本高(需要重新生成整图)。S3 将复杂内容分离到后期处理,降低风险",
-            "could_switch_if": "如果发现后期合成文字的光影调整工作量超过预期,且即梦 AI 4.5 的长文本生成精度足够,则可尝试 S2(端到端生成)"
-          }
-        ],
-        "risks_found_during_instantiation": [
-          {
-            "stage_id": "stage_1_base_generation",
-            "risk": "即梦 AI 4.5 生成核心英文单词时可能出现拼写错误",
-            "severity": "high",
-            "mitigation": "准备备用方案:AI 生成不带核心文字的底图,核心文字由后期叠加;或多次生成选择最佳结果"
-          },
-          {
-            "stage_id": "stage_2b_img2_table",
-            "risk": "img_2 的 Tokenization-Embedding 表格结构复杂,AI 难以精准还原行列和数值",
-            "severity": "high",
-            "mitigation": "表格完全由后期工具绘制,AI 仅生成表格区域的空白背景"
-          },
-          {
-            "stage_id": "stage_3_decoration",
-            "risk": "手绘装饰元素(星星、花朵、卡通图标)的跨图一致性难以保证",
-            "severity": "medium",
-            "mitigation": "从 AI 生成的底图中提取装饰元素,建立素材库后复用到其他图"
-          }
-        ]
-      },
-      "goal_tree": {
-        "stage_id": "root",
-        "stage_name": "还原目标",
-        "description": "还原 4 张 AI 知识科普笔记风格海报(img_1-4),核心是拟物化笔记本场景 + 精准文字内容 + 跨图一致性",
-        "required_spec": [
-          "核心英文单词(Embedding)精准还原:内容、字号(约 90-100pt)、颜色(img_1 蓝色 RGB:60,140,220,img_2/3/4 黑色)、字体(粗体无衬线)",
-          "笔记本/活页夹框架跨图一致:img_1 为米白色信纸背景,img_2/3/4 为蓝色活页夹边缘 + 白色纸张 + 边缘虚线和圆孔",
-          "纸张纹理真实感:米白色(RGB:245,245,235)或纯白色,带横向细线/虚线,表面有不规则褶皱和轻微脏污感",
-          "回形针装饰立体感:img_2/3/4 顶部有黄色回形针,具有金属质感和阴影",
-          "结构化排版:居中堆叠(img_1)、左对齐层级列表(img_2/3/4)、虚线分隔",
-          "手绘装饰元素自然度:星星、花朵、卡通图标等具有手绘的不规则感和笔触感",
-          "语义化色彩高亮:荧光笔触半透明叠加,能看到底层文字",
-          "知识可视化图表(img_2):Tokenization-Embedding 对应表格,表头浅绿色(#90EE90),第一列浅紫色(#E6E6FA),数值精准"
-        ],
-        "output_spec": [
-          "4 张成品图(img_1_final.png, img_2_final.png, img_3_final.png, img_4_final.png)",
-          "所有 required_spec 中的特征 100% 满足"
-        ],
-        "children": [
-          {
-            "stage_id": "stage_1_base_generation",
-            "stage_name": "底图生成",
-            "description": "使用即梦 AI 4.5 生成 4 张图的底图,包含笔记本框架、纸张纹理、回形针装饰、核心英文单词(可选)",
-            "required_spec": [
-              "img_1:米白色信纸背景(RGB:245,245,235),带横向浅灰色细线,表面有不规则褶皱和轻微脏污感",
-              "img_2/3/4:左侧蓝色活页夹边缘(#87CEEB),右侧白色纸张(#FFFFFF),纸张边缘有虚线和三个圆形打孔,顶部黄色回形针",
-              "核心英文单词'Embedding'(可选由 AI 生成):img_1 蓝色(RGB:60,140,220),img_2/3/4 黑色(#000000),粗体无衬线字体,字号约 90-100pt,居中排版"
-            ],
-            "output_spec": [
-              "4 张底图(img_1_base.png, img_2_base.png, img_3_base.png, img_4_base.png)",
-              "笔记本框架结构一致(img_2/3/4 使用同一模板或固定 seed)",
-              "纸张纹理真实(褶皱、脏污感自然分布)",
-              "回形针具有金属质感和阴影(img_2/3/4)",
-              "可选:核心英文单词拼写准确、位置正确"
-            ],
-            "spec_satisfaction": {
-              "status": "partial",
-              "gap": "AI 生成的核心英文单词可能存在拼写错误风险;复杂表格区域(img_2)需要留白供后期绘制",
-              "mitigation": "准备无文字版本的底图作为备选;img_2 的表格区域在 prompt 中明确留白"
-            },
-            "target_images": ["img_1", "img_2", "img_3", "img_4"],
-            "stage_output": "4 张底图(含框架、纹理、回形针、可选核心文字)",
-            "input_from": ["即梦 AI 4.5 模型", "制作表中的背景描述(段落 1.1、2.1、3.1、4.1)"],
-            "covers_requirements": [
-              "上限点:拟真纸张与笔记本实体",
-              "上限点:核心英文单词(如果 AI 生成)",
-              "下限点:跨图元素一致性",
-              "下限点:材质纹理真实感"
-            ],
-            "importance": "下限",
-            "reasoning": {
-              "why_needed": "底图是整个还原工作的基础,决定了跨图一致性和材质真实感。如果底图框架不一致或纹理假,后续叠加文字和装饰也无法挽救",
-              "why_here": "作为依赖树的第一个阶段,底图为后续所有阶段提供基础画布。文字叠加、装饰合成、质感增强都依赖底图的存在"
-            },
-            "children": [
-              {
-                "stage_id": "stage_1_1_img1_base",
-                "stage_name": "img_1 信纸底图生成",
-                "description": "生成 img_1 的米白色信纸背景,带横向细线和褶皱纹理",
-                "required_spec": [
-                  "背景颜色:米白色(RGB:245,245,235)",
-                  "背景纹理:横向浅灰色细线,表面有不规则褶皱和轻微脏污感",
-                  "尺寸:1200x1700 像素(假设标准尺寸)"
-                ],
-                "output_spec": [
-                  "img_1_base.png:米白色信纸背景,纹理自然",
-                  "无文字、无装饰的纯净背景"
-                ],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_1"],
-                "stage_output": "img_1_base.png",
-                "input_from": ["制作表段落 1.1 背景描述"],
-                "covers_requirements": ["上限点:拟真纸张与笔记本实体", "下限点:材质纹理真实感"],
-                "importance": "基础",
-                "reasoning": {
-                  "why_needed": "img_1 使用信纸背景而非螺旋笔记本框架,需要单独生成",
-                  "why_here": "作为 img_1 的底图生成子阶段,为后续文字叠加提供基础"
-                },
-                "children": []
-              },
-              {
-                "stage_id": "stage_1_2_img234_base",
-                "stage_name": "img_2/3/4 笔记本底图生成",
-                "description": "生成 img_2/3/4 共享的螺旋笔记本框架底图(蓝色活页夹 + 白色纸张 + 回形针)",
-                "required_spec": [
-                  "左侧蓝色活页夹边缘(#87CEEB),波浪形模拟活页夹环形结构",
-                  "右侧白色纸张(#FFFFFF),边缘有虚线和三个圆形打孔",
-                  "顶部黄色回形针,具有金属质感和阴影",
-                  "纸张表面有横向虚线横格和左侧红色竖向虚线边缘(img_4)"
-                ],
-                "output_spec": [
-                  "img_2_base.png, img_3_base.png, img_4_base.png:共享相同框架结构",
-                  "回形针位置、形状、光影一致",
-                  "打孔位置、数量(3 个)一致"
-                ],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_2", "img_3", "img_4"],
-                "stage_output": "img_2_base.png, img_3_base.png, img_4_base.png",
-                "input_from": ["制作表段落 2.1、3.1、4.1 背景描述", "即梦 AI 4.5 固定 seed"],
-                "covers_requirements": ["上限点:拟真纸张与笔记本实体", "下限点:跨图元素一致性", "下限点:材质纹理真实感"],
-                "importance": "下限",
-                "reasoning": {
-                  "why_needed": "img_2/3/4 共享相同的螺旋笔记本框架,必须保证跨图一致性。使用同一模板或固定 seed 生成可确保框架结构、回形针位置、打孔位置完全一致",
-                  "why_here": "作为 img_2/3/4 的底图生成子阶段,为后续文字叠加和装饰合成提供统一基础"
-                },
-                "children": []
-              }
-            ]
-          },
-          {
-            "stage_id": "stage_2_text_overlay",
-            "stage_name": "文字叠加",
-            "description": "在底图上叠加文字内容,包括核心英文单词(如果底图未生成)、标题、正文段落、表格(img_2)",
-            "required_spec": [
-              "核心英文单词'Embedding':内容准确,字号约 90-100pt,颜色正确(img_1 蓝色,img_2/3/4 黑色),粗体无衬线字体,居中排版",
-              "一级标题(如'每天掌握一个'、'AI 知识点'、'什么是 Embedding?'等):字号约 100pt(主标题)或 30pt(一级标题),手写风格粗体中文字体或常规无衬线字体",
-              "正文段落:字号约 18-20pt,常规无衬线字体,左对齐,段落间距合理",
-              "表格(img_2):Tokenization-Embedding 对应表,表头浅绿色(#90EE90),第一列浅紫色(#E6E6FA),数值精准,行列对齐"
-            ],
-            "output_spec": [
-              "4 张带文字的图片(img_1_text.png, img_2_text.png, img_3_text.png, img_4_text.png)",
-              "所有文字内容准确无误",
-              "字号层级正确(主标题>一级标题>正文)",
-              "排版对齐方式正确(居中/左对齐)",
-              "表格结构精准(img_2)"
-            ],
-            "spec_satisfaction": {
-              "status": "satisfied",
-              "gap": "",
-              "mitigation": ""
-            },
-            "target_images": ["img_1", "img_2", "img_3", "img_4"],
-            "stage_output": "4 张带文字的图片",
-            "input_from": ["stage_1_base_generation 的底图", "制作表中的文字内容、颜色、字号、字体、排版描述"],
-            "covers_requirements": [
-              "上限点:核心英文单词",
-              "上限点:结构化排版与导视",
-              "上限点:知识可视化图表(img_2 表格)",
-              "下限点:文字内容精准度",
-              "下限点:排版空间透视关系"
-            ],
-            "importance": "上限",
-            "reasoning": {
-              "why_needed": "文字内容是知识科普海报的核心信息载体,必须 100% 准确。尤其是专业术语(Embedding)、表格数值、长段正文,AI 生成容易出错,必须由后期工具精准控制",
-              "why_here": "文字叠加依赖底图的存在(需要知道文字写在哪里),同时为后续的装饰合成和质感增强提供基础。文字层在装饰层下方,避免装饰遮挡文字"
-            },
-            "children": [
-              {
-                "stage_id": "stage_2a_img1_text",
-                "stage_name": "img_1 文字叠加",
-                "description": "在 img_1 底图上叠加标题、副标题、核心英文单词、励志语录、日期等文字",
-                "required_spec": [
-                  "小葱白工:左上角,深灰色(RGB:60,60,60),手写风格中文字体,约 25pt",
-                  "Growth/Hope/Future:右上角,浅灰色(RGB:150,150,150),手写风格英文衬线字体,约 25pt,椭圆形边框包围",
-                  "每天掌握一个/AI 知识点:中央偏上,深灰色,手写风格粗体中文字体,约 100pt,居中",
-                  "Embedding:中央,蓝色(RGB:60,140,220),粗体无衬线字体,约 90pt,居中",
-                  "你走过的路,都会成为你的底气。:中下部,深灰色,手写风格中文字体,约 30pt,居中",
-                  "The paths you've walked will build your strength.:中文语录下方,深灰色,手写风格英文衬线字体,约 30pt,居中",
-                  "Date: 04.28:左下角,深灰色,手写风格英文无衬线字体,约 25pt"
-                ],
-                "output_spec": [
-                  "img_1_text.png:所有文字叠加完成",
-                  "文字内容准确,字号层级正确,排版居中"
-                ],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_1"],
-                "stage_output": "img_1_text.png",
-                "input_from": ["stage_1_1_img1_base 的底图", "制作表段落 1.2、1.3、1.4、1.5 文字描述"],
-                "covers_requirements": ["上限点:核心英文单词", "上限点:结构化排版与导视", "下限点:文字内容精准度"],
-                "importance": "上限",
-                "reasoning": {
-                  "why_needed": "img_1 的文字内容较多,包括中英文标题、励志语录、日期等,需要精准叠加",
-                  "why_here": "作为 img_1 的文字叠加子阶段,为后续装饰合成提供基础"
-                },
-                "children": []
-              },
-              {
-                "stage_id": "stage_2b_img2_text",
-                "stage_name": "img_2 文字叠加",
-                "description": "在 img_2 底图上叠加标题、问题标题、正文段落、表格",
-                "required_spec": [
-                  "Embedding:顶部中央,黑色(#000000),粗体无衬线字体,约 100pt,居中",
-                  "1 什么是'Embedding'?:左对齐,数字序号蓝色圆圈包裹,问号黑色,卡通表情右侧",
-                  "正文(Embedding 定义):左对齐,黑色,约 18pt,'语义信息'和'语义相关性'高亮蓝色(#4682B4)",
-                  "2 从文本到'Embedding'的流程:左对齐,带序号和卡通表情",
-                  "正文(流程描述):左对齐,列表形式,项目符号实心圆点",
-                  "表格:Tokenization-Embedding 对应表,表头浅绿色(#90EE90),第一列浅紫色(#E6E6FA),数值精准,居中对齐"
-                ],
-                "output_spec": [
-                  "img_2_text.png:所有文字和表格叠加完成",
-                  "表格结构精准,数值无误",
-                  "高亮位置正确"
-                ],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_2"],
-                "stage_output": "img_2_text.png",
-                "input_from": ["stage_1_2_img234_base 的底图", "制作表段落 2.2、2.3 文字和表格描述"],
-                "covers_requirements": ["上限点:核心英文单词", "上限点:结构化排版与导视", "上限点:知识可视化图表", "下限点:文字内容精准度"],
-                "importance": "上限",
-                "reasoning": {
-                  "why_needed": "img_2 包含复杂的表格结构,是还原难度最高的部分。表格必须完全由后期工具绘制,保证数值和行列结构精准",
-                  "why_here": "作为 img_2 的文字叠加子阶段,表格绘制是核心任务"
-                },
-                "children": []
-              },
-              {
-                "stage_id": "stage_2c_img3_text",
-                "stage_name": "img_3 文字叠加",
-                "description": "在 img_3 底图上叠加标题、问题标题、正文段落",
-                "required_spec": [
-                  "Embedding:顶部中央,黑色,粗体无衬线字体,约 100pt,居中",
-                  "2) 独立使用的 Embedding (句子/文档级):左对齐",
-                  "正文(独立使用 Embedding 解释):左对齐,黑色,约 18pt",
-                  "3 'Embedding'的本质:语义可'被数字表示':左对齐,数字'3'蓝色,关键词黑色粗体",
-                  "正文(本质解释):左对齐,列表形式,项目符号实心圆点,'Embedding 模型'、'压缩'高亮紫色",
-                  "绿色对勾符号:正文中"
-                ],
-                "output_spec": [
-                  "img_3_text.png:所有文字叠加完成",
-                  "高亮位置正确,颜色准确"
-                ],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_3"],
-                "stage_output": "img_3_text.png",
-                "input_from": ["stage_1_2_img234_base 的底图", "制作表段落 3.2、3.3 文字描述"],
-                "covers_requirements": ["上限点:核心英文单词", "上限点:结构化排版与导视", "上限点:语义化色彩高亮", "下限点:文字内容精准度"],
-                "importance": "上限",
-                "reasoning": {
-                  "why_needed": "img_3 的文字内容包含多处语义化高亮,需要精准控制高亮位置和颜色",
-                  "why_here": "作为 img_3 的文字叠加子阶段,为后续装饰合成提供基础"
-                },
-                "children": []
-              },
-              {
-                "stage_id": "stage_2d_img4_text",
-                "stage_name": "img_4 文字叠加",
-                "description": "在 img_4 底图上叠加标题、应用场景、常见问题答疑",
-                "required_spec": [
-                  "Embedding:顶部中央,黑色,粗体无衬线字体,约 100pt,居中",
-                  "④ 'Embedding'的应用场景:左对齐,带序号和扳手图标",
-                  "正文(应用场景):左对齐,列表形式,'编码为语义向量'、'检索增强生成 (RAG)'、'相似性判断'、'文本聚类与分析'高亮紫色",
-                  "⑤ 常见问题答疑:左对齐,带序号",
-                  "正文(问答):左对齐,'Q:'和'A:'绿色,'编号 (离散的 ID)'、'承载语义的连续向量'等高亮紫色"
-                ],
-                "output_spec": [
-                  "img_4_text.png:所有文字叠加完成",
-                  "高亮位置正确,颜色准确"
-                ],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_4"],
-                "stage_output": "img_4_text.png",
-                "input_from": ["stage_1_2_img234_base 的底图", "制作表段落 4.2、4.3 文字描述"],
-                "covers_requirements": ["上限点:核心英文单词", "上限点:结构化排版与导视", "上限点:语义化色彩高亮", "下限点:文字内容精准度"],
-                "importance": "上限",
-                "reasoning": {
-                  "why_needed": "img_4 的文字内容包含多处语义化高亮和问答格式,需要精准控制",
-                  "why_here": "作为 img_4 的文字叠加子阶段,为后续装饰合成提供基础"
-                },
-                "children": []
-              }
-            ]
-          },
-          {
-            "stage_id": "stage_3_decoration",
-            "stage_name": "装饰元素合成",
-            "description": "在文字层上叠加手绘装饰元素(星星、花朵、卡通图标)、语义化色彩高亮(荧光笔效果)",
-            "required_spec": [
-              "img_1:左上角粉色五角星和黄色四角星,左下角三朵黄色花朵(四圆形花瓣 + 圆形花蕊 + 绿色花茎),右下角四颗黄色四角星,副标题下方粉色涂抹区域(RGB:255,180,200,边缘模糊)",
-              "img_2/3/4:卡通表情(问号、太阳、对勾等),语义化高亮(紫色、蓝色、黄色背景高亮,半透明叠加)",
-              "所有手绘元素具有手绘的不规则感和笔触感,避免过于规整"
-            ],
-            "output_spec": [
-              "4 张带装饰的图片(img_1_decorated.png, img_2_decorated.png, img_3_decorated.png, img_4_decorated.png)",
-              "手绘装饰元素位置正确,形状自然",
-              "语义化高亮半透明,能看到底层文字"
-            ],
-            "spec_satisfaction": {
-              "status": "satisfied",
-              "gap": "",
-              "mitigation": ""
-            },
-            "target_images": ["img_1", "img_2", "img_3", "img_4"],
-            "stage_output": "4 张带装饰的图片",
-            "input_from": ["stage_2_text_overlay 的带文字图片", "制作表中的图案形状、涂抹形状、色彩高亮描述"],
-            "covers_requirements": [
-              "上限点:手绘装饰与卡通图标",
-              "上限点:语义化色彩高亮",
-              "下限点:手绘元素的自然度",
-              "下限点:色彩高亮的物理合理性"
-            ],
-            "importance": "上限",
-            "reasoning": {
-              "why_needed": "手绘装饰元素和语义化高亮是笔记风格的核心特征,中和了科技主题的枯燥感,建立信息层级。必须在文字层上方叠加,避免遮挡文字",
-              "why_here": "装饰合成依赖文字层的存在(需要知道装饰加在哪里、高亮哪些文字),同时为后续的质感增强提供基础"
-            },
-            "children": [
-              {
-                "stage_id": "stage_3a_img1_decoration",
-                "stage_name": "img_1 装饰合成",
-                "description": "在 img_1 上叠加星星、花朵、粉色涂抹背景",
-                "required_spec": [
-                  "左上角:粉色五角星 + 黄色四角星",
-                  "左下角:三朵黄色花朵(四圆形花瓣 + 圆形花蕊 + 绿色花茎)",
-                  "右下角:四颗黄色四角星",
-                  "副标题下方:粉色涂抹区域(RGB:255,180,200,边缘模糊,模拟手绘涂抹效果)"
-                ],
-                "output_spec": [
-                  "img_1_decorated.png:所有装饰叠加完成",
-                  "手绘元素自然,涂抹边缘模糊"
-                ],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_1"],
-                "stage_output": "img_1_decorated.png",
-                "input_from": ["stage_2a_img1_text 的带文字图片", "制作表段落 1.2.1.1、1.3.4、1.5.2 图案和涂抹描述"],
-                "covers_requirements": ["上限点:手绘装饰与卡通图标", "下限点:手绘元素的自然度"],
-                "importance": "上限",
-                "reasoning": {
-                  "why_needed": "img_1 的手绘装饰元素最多(星星、花朵、涂抹),是笔记风格的关键特征",
-                  "why_here": "作为 img_1 的装饰合成子阶段"
-                },
-                "children": []
-              },
-              {
-                "stage_id": "stage_3b_img234_decoration",
-                "stage_name": "img_2/3/4 装饰合成",
-                "description": "在 img_2/3/4 上叠加卡通表情、语义化高亮",
-                "required_spec": [
-                  "img_2:问题标题右侧卡通问号表情,正文中'语义信息'和'语义相关性'蓝色高亮",
-                  "img_3:标题右侧卡通太阳表情,正文中'Embedding 模型'、'压缩'紫色高亮,绿色对勾符号",
-                  "img_4:标题扳手图标,正文中多处紫色高亮,问答'Q:'和'A:'绿色",
-                  "所有高亮半透明,能看到底层文字"
-                ],
-                "output_spec": [
-                  "img_2_decorated.png, img_3_decorated.png, img_4_decorated.png:装饰叠加完成",
-                  "高亮半透明,颜色准确"
-                ],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_2", "img_3", "img_4"],
-                "stage_output": "img_2_decorated.png, img_3_decorated.png, img_4_decorated.png",
-                "input_from": ["stage_2b_img2_text、stage_2c_img3_text、stage_2d_img4_text 的带文字图片", "制作表中的色彩高亮描述"],
-                "covers_requirements": ["上限点:手绘装饰与卡通图标", "上限点:语义化色彩高亮", "下限点:色彩高亮的物理合理性"],
-                "importance": "上限",
-                "reasoning": {
-                  "why_needed": "img_2/3/4 的语义化高亮是信息层级的关键,卡通表情增加趣味性",
-                  "why_here": "作为 img_2/3/4 的装饰合成子阶段"
-                },
-                "children": []
-              }
-            ]
-          },
-          {
-            "stage_id": "stage_4_quality_enhancement",
-            "stage_name": "质感增强",
-            "description": "最后添加质感层(噪点、纹理叠加)增强真实感,使用 Overlay 混合模式,不透明度 3-5%",
-            "required_spec": [
-              "纸张纹理增强:叠加轻微噪点层,模拟纸张粗糙感",
-              "光影统一:检查文字、装饰与底图的光影一致性,添加轻微阴影或高光",
-              "整体色调统一:确保 4 张图的色调一致"
-            ],
-            "output_spec": [
-              "4 张最终成品图(img_1_final.png, img_2_final.png, img_3_final.png, img_4_final.png)",
-              "纸张质感真实,光影自然",
-              "4 张图色调统一"
-            ],
-            "spec_satisfaction": {
-              "status": "satisfied",
-              "gap": "",
-              "mitigation": ""
-            },
-            "target_images": ["img_1", "img_2", "img_3", "img_4"],
-            "stage_output": "4 张最终成品图",
-            "input_from": ["stage_3_decoration 的带装饰图片"],
-            "covers_requirements": [
-              "上限点:拟真纸张与笔记本实体",
-              "下限点:材质纹理真实感",
-              "下限点:跨图元素一致性"
-            ],
-            "importance": "基础",
-            "reasoning": {
-              "why_needed": "质感增强是最后一步,确保纸张纹理真实、光影自然、色调统一。虽然不改变内容,但决定了整体'真实感'",
-              "why_here": "作为依赖树的最后一个阶段,质感增强在所有内容叠加完成后进行,避免影响文字和装饰"
-            },
-            "children": []
-          }
-        ]
-      },
-      "requirement_coverage": {
-        "拟真纸张与笔记本实体": {
-          "covered_by": ["stage_1_base_generation", "stage_1_1_img1_base", "stage_1_2_img234_base", "stage_4_quality_enhancement"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "核心英文单词": {
-          "covered_by": ["stage_1_base_generation", "stage_2_text_overlay", "stage_2a_img1_text", "stage_2b_img2_text", "stage_2c_img3_text", "stage_2d_img4_text"],
-          "coverage_confidence": "high",
-          "gap_note": "如果 AI 生成核心文字精度不足,则完全由 stage_2 后期叠加"
-        },
-        "结构化排版与导视": {
-          "covered_by": ["stage_2_text_overlay", "stage_2a_img1_text", "stage_2b_img2_text", "stage_2c_img3_text", "stage_2d_img4_text"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "知识可视化图表": {
-          "covered_by": ["stage_2_text_overlay", "stage_2b_img2_text"],
-          "coverage_confidence": "high",
-          "gap_note": "表格完全由后期工具绘制,保证精准"
-        },
-        "语义化色彩高亮": {
-          "covered_by": ["stage_2_text_overlay", "stage_3_decoration", "stage_3b_img234_decoration"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "手绘装饰与卡通图标": {
-          "covered_by": ["stage_3_decoration", "stage_3a_img1_decoration", "stage_3b_img234_decoration"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "跨图元素一致性": {
-          "covered_by": ["stage_1_base_generation", "stage_1_2_img234_base", "stage_4_quality_enhancement"],
-          "coverage_confidence": "high",
-          "gap_note": "img_2/3/4 使用同一底图模板或固定 seed 生成"
-        },
-        "文字内容精准度": {
-          "covered_by": ["stage_2_text_overlay", "stage_2a_img1_text", "stage_2b_img2_text", "stage_2c_img3_text", "stage_2d_img4_text"],
-          "coverage_confidence": "high",
-          "gap_note": "所有复杂文字由后期工具精准控制"
-        },
-        "排版空间透视关系": {
-          "covered_by": ["stage_1_base_generation", "stage_2_text_overlay"],
-          "coverage_confidence": "high",
-          "gap_note": "AI 生成底图时处理核心透视,后期叠加简单文字"
-        },
-        "材质纹理真实感": {
-          "covered_by": ["stage_1_base_generation", "stage_4_quality_enhancement"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "手绘元素的自然度": {
-          "covered_by": ["stage_3_decoration", "stage_3a_img1_decoration", "stage_3b_img234_decoration"],
-          "coverage_confidence": "medium",
-          "gap_note": "手绘元素自然度取决于素材来源,可能需要从 AI 生成结果中提取或手动绘制"
-        },
-        "色彩高亮的物理合理性": {
-          "covered_by": ["stage_3_decoration", "stage_3b_img234_decoration"],
-          "coverage_confidence": "high",
-          "gap_note": "使用半透明叠加模式(Overlay/Soft Light)模拟荧光笔效果"
-        }
-      }
-    }
-  ]
-}

+ 100 - 0
examples/research/huahua/analysis.json

@@ -0,0 +1,100 @@
+{
+  "category": {
+    "name": "户外白裙写生少女",
+    "traits": [
+      "穿着白色连衣裙的女性在户外草地进行油画写生",
+      "白绿配色为主,清新自然的森系视觉基调",
+      "包含画架、画布、调色板、画笔等写生道具",
+      "逆光/轮廓光与浅景深虚化营造梦幻氛围",
+      "画布内容与现实场景形成画中画呼应结构"
+    ],
+    "quality_challenges": [
+      "人物姿态自然度:需要呈现专注绘画的动态姿态,避免僵硬",
+      "白裙质感表现:轻薄面料的垂坠感、褶皱细节和透光效果",
+      "调色板颜料质感:厚重油画的 Impasto 堆叠感和色彩混合细节",
+      "光影层次:逆光下的轮廓光晕与主体细节的平衡",
+      "景深控制:前景清晰、背景虚化的自然过渡",
+      "画中画一致性:画布上的油画内容需与现实场景形成视觉呼应",
+      "发丝细节:逆光下头发边缘的光晕效果和发丝清晰度"
+    ],
+    "reasoning": "基于图片亮点.md 的 6 个聚类主题(优雅白裙少女、斑斓颜料、写生道具、白绿配色、光影景深、画中画结构)和制作点.md 的 6 大元素权重(女性 84.5、绘画工具 78.5、自然背景 74.0、画架画布 67.67、画架油画 60.97、女性衣物 44.7),以及 5 张制作表中对姿态、服装、光影、清晰度的详细规格描述综合判断"
+  },
+  "highlight": [
+    {
+      "name": "优雅的白裙写生少女",
+      "description": "女性主体需呈现文艺气质与娴静美,包括专注的绘画姿态(身体前倾、手臂抬起握笔)、自然垂坠的白色长裙(V 字露背或圆领、腰部系带收腰、裙摆飘逸)、棕色长发(自然披散、逆光下边缘光晕),整体塑造写生缪斯形象",
+      "reasoning": "图片亮点.md 中该聚类覆盖全部 5 张图片,制作点.md 中'女性'元素综合权重 84.5 为最高,5 张制作表中人物段落评分均在 0.745-0.858 之间,是画面核心主体",
+      "references": ["descriptions/图片亮点.md", "descriptions/制作点.md", "descriptions/写生油画__img_1_制作表.json#段落 1.1", "descriptions/写生油画__img_2_制作表.json#段落 2.1", "descriptions/写生油画__img_3_制作表.json#段落 3.1", "descriptions/写生油画__img_4_制作表.json#段落 4.1", "descriptions/写生油画__img_5_制作表.json#段落 5.1"]
+    },
+    {
+      "name": "斑斓厚重的油画颜料",
+      "description": "木质调色板上堆积的厚重油画颜料(Impasto),呈不规则块状分布,色彩鲜艳杂乱(绿色、蓝色、红色、黄色、白色、紫色等至少 10 种颜色),颜料具有膏状质感和明显堆叠厚度,与周围大面积纯白衣物形成强烈视觉反差",
+      "reasoning": "图片亮点.md 专门聚焦该实质物体,制作点.md 中'绘画工具'权重 78.5 排第二,img_1 和 img_5 制作表中调色板颜料细节描述详尽(颜色种类、分布模式、质地),img_5 中颜料段落评分达 0.754",
+      "references": ["descriptions/图片亮点.md", "descriptions/制作点.md", "descriptions/写生油画__img_1_制作表.json#段落 1.1.2.3", "descriptions/写生油画__img_5_制作表.json#段落 5.1.3.1"]
+    },
+    {
+      "name": "清新雅致的白绿配色",
+      "description": "大面积高饱和度自然草木绿背景(鲜绿色草地、深浅不一的绿色树木)与人物纯白服装形成鲜明对比,确立清新、自然、治愈的森系视觉基调,色彩饱和度中等偏高但不刺眼",
+      "reasoning": "图片亮点.md 中该形式类聚类强调色彩构成的形式美感,覆盖 img_1 和 img_4,5 张制作表的背景段落均描述'以绿色为主',色彩形式评分普遍较高",
+      "references": ["descriptions/图片亮点.md", "descriptions/写生油画__img_1_制作表.json#段落 1.3", "descriptions/写生油画__img_4_制作表.json#段落 4.3"]
+    },
+    {
+      "name": "唯美梦幻的光影与景深",
+      "description": "温暖的逆光/轮廓光从画面左上方或右上方照射,人物和物体边缘形成明显光晕;大光圈浅景深虚化(Bokeh)使背景呈现柔和散景,前景主体清晰锐利(头发丝、服装纹理、手部细节可见),营造脱离现实的梦幻浪漫氛围",
+      "reasoning": "图片亮点.md 中该形式类聚类覆盖 img_2、img_3、img_5,5 张制作表的形式段落均描述'逆光'或'自然光从左上方/右上方照射',清晰度描述均为'前景清晰、背景虚化',img_2 特别强调'强烈光斑和光晕效果'",
+      "references": ["descriptions/图片亮点.md", "descriptions/写生油画__img_2_制作表.json#段落 2 形式", "descriptions/写生油画__img_3_制作表.json#段落 3 形式", "descriptions/写生油画__img_5_制作表.json#段落 5 形式"]
+    },
+    {
+      "name": "虚实呼应的画中画结构",
+      "description": "画架上的画布内容与现实场景形成'镜像'或'互文'关系——画布上描绘身穿白色裙子的女性在户外草地/花丛中的背影,与现实中的画家形成视觉呼应,构建增加叙事深度的画中画结构,画布采用印象派风格(笔触粗犷、色彩鲜明)",
+      "reasoning": "图片亮点.md 中该形式类聚类覆盖 img_1 和 img_2,img_1、img_2、img_3 制作表中画布段落均详细描述'描绘了一名背对镜头的女性',内容主题与现实场景呼应,画布段落评分高达 0.891-0.958",
+      "references": ["descriptions/图片亮点.md", "descriptions/写生油画__img_1_制作表.json#段落 1.2.1", "descriptions/写生油画__img_2_制作表.json#段落 2.2.1", "descriptions/写生油画__img_3_制作表.json#段落 3.2.1"]
+    }
+  ],
+  "baseline": [
+    {
+      "name": "人物姿态自然度",
+      "description": "女性需呈现专注绘画的动态姿态(身体略微前倾、右臂抬起握笔、左臂弯曲持调色板、头部转向画布),避免僵硬呆板的摆拍感",
+      "why_critical": "制作表中 5 张图的人物姿态描述均强调'专注绘画的动态姿态',姿态不自然会导致人物像假人模特,破坏'优雅写生少女'的核心亮点",
+      "reasoning": "img_1 制作表#段落 1.1.2 描述'身体略微前倾,右臂抬起握持画笔,左臂弯曲握持调色板',img_2、img_3、img_4 均有类似姿态描述,姿态形式评分在 0.455-0.765 之间",
+      "references": ["descriptions/写生油画__img_1_制作表.json#段落 1.1.2", "descriptions/写生油画__img_2_制作表.json#段落 2.1.2", "descriptions/写生油画__img_3_制作表.json#段落 3.1.2", "descriptions/写生油画__img_4_制作表.json#段落 4.1.2"]
+    },
+    {
+      "name": "白裙材质与褶皱真实感",
+      "description": "白色长裙需呈现轻薄棉麻或丝绸质地的垂坠感和透气性,有自然形成的垂坠褶皱(裙摆、腰部、背部 V 领处),服装颜色为纯白色无图案",
+      "why_critical": "制作点.md 中'女性衣物'权重 44.7,5 张制作表的服装段落评分均高达 0.806-0.847,材质和褶皱描述详尽,做不好会导致服装像塑料或纸片,一眼假",
+      "reasoning": "img_1 制作表#段落 1.1.2.1 描述'轻薄的棉麻或丝绸质地,具有良好的垂坠感',img_2、img_3、img_4 均有'丝绸或棉麻混纺材质,表面光滑,有轻微光泽感'等描述",
+      "references": ["descriptions/制作点.md", "descriptions/写生油画__img_1_制作表.json#段落 1.1.2.1", "descriptions/写生油画__img_2_制作表.json#段落 2.1.2.1", "descriptions/写生油画__img_3_制作表.json#段落 3.1.2.1", "descriptions/写生油画__img_4_制作表.json#段落 4.1.2.1"]
+    },
+    {
+      "name": "调色板颜料质感",
+      "description": "调色板上的颜料需呈现膏状堆积的厚度和立体感,表面有光泽显示湿润质地,颜色种类丰富(至少 10 种),呈不规则块状和条状分布,部分颜色相互混合形成过渡色",
+      "why_critical": "图片亮点.md 专门将'斑斓厚重的油画颜料'列为实质类亮点,img_5 制作表中颜料段落评分 0.754,质感描述详尽,做不好会像平面贴图而非真实颜料",
+      "reasoning": "img_5 制作表#段落 5.1.3.1 详细描述'颜料呈膏状,堆积在调色板表面,具有一定的厚度和立体感,表面有光泽,显示出湿润的质地',img_1 也有'颜料堆叠感明显'描述",
+      "references": ["descriptions/图片亮点.md", "descriptions/写生油画__img_1_制作表.json#段落 1.1.2.3", "descriptions/写生油画__img_5_制作表.json#段落 5.1.3.1"]
+    },
+    {
+      "name": "前景主体清晰度",
+      "description": "人物主体(头发丝、服装纹理、手部细节)、调色板(木质纹理、颜料堆叠)、画架需清晰锐利,细节可见,与虚化背景形成对比",
+      "why_critical": "5 张制作表的形式段落均强调'前景人物和画架清晰锐利',清晰度形式评分普遍较高,做不好会导致画面整体模糊,失去专业摄影质感",
+      "reasoning": "img_1 制作表#段落 1 形式描述'画面中心区域清晰度高,细节锐利可见',img_2、img_3、img_4、img_5 均有类似描述,清晰度是所有制作表的必选形式参数",
+      "references": ["descriptions/写生油画__img_1_制作表.json#段落 1 形式", "descriptions/写生油画__img_2_制作表.json#段落 2 形式", "descriptions/写生油画__img_3_制作表.json#段落 3 形式", "descriptions/写生油画__img_4_制作表.json#段落 4 形式", "descriptions/写生油画__img_5_制作表.json#段落 5 形式"]
+    },
+    {
+      "name": "背景虚化自然度",
+      "description": "背景树木和草地需呈现柔和的虚化效果(浅景深),与前景清晰主体形成自然过渡,虚化区域有光斑效果(尤其是逆光场景)",
+      "why_critical": "图片亮点.md 将'唯美梦幻的光影与景深'列为形式类亮点,5 张制作表均描述'景深较浅,背景虚化',做不好会导致画面缺乏层次感和专业感",
+      "reasoning": "img_2 制作表#段落 2.3 描述'背景整体呈现柔和的虚化效果,景深较浅,树木轮廓模糊,光斑明显',所有制作表的背景段落均有景深描述",
+      "references": ["descriptions/图片亮点.md", "descriptions/写生油画__img_2_制作表.json#段落 2.3", "descriptions/写生油画__img_3_制作表.json#段落 3.3", "descriptions/写生油画__img_5_制作表.json#段落 5.3"]
+    }
+  ],
+  "requirement_summary": [
+    "高质量人物生成:白裙女性、自然绘画姿态、棕色长发、逆光轮廓光",
+    "服装材质还原:轻薄棉麻/丝绸质地、垂坠褶皱、纯白色",
+    "调色板与颜料:木质调色板、厚重油画颜料 Impasto 质感、多色混合",
+    "光影效果:逆光/轮廓光、温暖光晕、前景清晰背景虚化",
+    "画中画结构:画布上油画内容需与现实场景呼应、印象派风格",
+    "自然背景:高饱和度绿色草地和树木、清新森系色调",
+    "道具细节:画架结构、画笔、白玫瑰点缀"
+  ]
+}

+ 0 - 0
examples/research/input/description/创作表.md


+ 0 - 68
examples/research/input/description/制作亮点.md

@@ -1,68 +0,0 @@
-"聚类结果": [
-{
-"聚类主题": "极具反差的猫咪神态",
-"聚类描述": "这是该类图片的实质亮点。画面视觉主体是一只橘白相间的猫咪,其面部表情在上下两部分形成剧烈反差:上方是张大嘴巴的抗拒/咆哮神态,下方则是睁大眼睛的乖巧/期待神态。这种拟人化的情绪表演赋予了图片核心的戏剧张力和幽默灵魂。",
-"亮点类型": "实质",
-},
-{
-"聚类主题": "纵向二分的对比叙事构图",
-"聚类描述": "这是该类图片的形式亮点。画面统一采用了互联网模因(Meme)经典的垂直双分栏结构,通过物理空间的上下并置,建立起“拒绝”与“接受”的二元对立逻辑。这种结构化的视觉呈现引导观众进行对比阅读,是支撑笑点产生的核心排版形式。",
-"亮点类型": "形式",
-},
-{
-"聚类主题": "加工前后的水果形态对比",
-"聚类描述": "这是该类图片的实质亮点。作为剧情反转的诱因,各类水果(芒果、榴莲、菠萝、奇异果)展示了两种物理形态:上方是带皮、带刺或完整的“麻烦”状态,下方是去皮、切好摆盘的“享用”状态。这种水果实物的视觉变化构成了猫咪态度转变的直接理由。",
-"亮点类型": "实质",
-},
-{
-"聚类ID": "cluster_food_seafood_state",
-"聚类主题": "带壳与去壳的海鲜形态对比",
-"聚类描述": "这是该类图片的实质亮点。画面展示了海鲜(虾)的两种截然不同的物理状态:上方是带壳、难以直接食用的完整状态,下方是去壳后的纯肉状态。这种特定的海鲜处理细节差异是触发剧情的核心道具。",
-"亮点类型": "实质",
-"亮点列表": [
-{
-"图片名": "img_5",
-"亮点": {
-"合并结论": "状态迥异的虾肉特写",
-"结论描述": "这是一个实质主导的亮点。作为触发猫咪情绪变化的诱因,左侧展示的虾呈现出两种截然不同的物理状态:上方是带壳、带头、难以食用的整虾,下方是去壳、红润诱人的纯虾肉。这种视觉上的细节差异(带壳vs去壳)精准地传达了“懒人吃法”的笑点逻辑。",
-"亮点类型": "实质",
-"合并引用的数据": {
-"段落5.1.5:虾": {
-"实质": "带壳的整虾是构成对比逻辑的关键前提(因为有壳所以拒绝),是故事起因的核心视觉元素,其形态决定了猫咪的拒绝态度。",
-"形式": {
-"图像完整性": "0.85 - ‘完整带壳’的状态是该图像的关键特征,它与下半部分‘剥好的虾肉’形成鲜明对比,是理解猫咪拒绝(怕麻烦/不喜欢剥壳)笑点的核心视觉线索。",
-"图像内容": "0.86 - 作为画面的核心主体,这只完整的虾是表达‘不爱吃虾’这一主题的直接载体,是构成上半部分剧情的基础。"
-},
-"关系": {
-"段间关系-拒绝猫咪-其他关系-情境关联关系": "0.8 - 这是该段落最核心的关系特征。虾是猫咪拒绝动作的直接对象,这种互动关系构成了画面的主要叙事冲突和幽默点。",
-"段间关系-拒绝文字-其他关系-内容指向关系": "0.75 - 文字内容明确指代了画面中的虾,这种图文对应关系确保了观众能准确理解文字中“我不爱吃”所指的具体对象。"
-}
-},
-"段落5.2.5:去壳虾仁": {
-"实质": "去壳的虾仁是整个梗的“包袱”所在,视觉上的去壳状态直接触发了猫咪的态度转变,是理解“区别对待”逻辑的关键。",
-"形式": {
-"图像完整性": "0.91 - “去壳”这一特征是本图与上一张图(带壳虾)形成对比的关键,直接解释了猫咪态度转变的原因(喜欢吃但不喜欢剥壳),是叙事的视觉关键点。",
-"图像内容": "0.93 - 去壳虾仁的图像是该部分的核心视觉主体,直接对应下方文字“我爱吃”以及猫咪的喜爱反应,缺失后图片失去表意对象。"
-},
-"关系": {
-"段间关系-喜爱猫咪-其他关系-情境关联关系": "0.88 - 这是图片的核心逻辑,去壳虾仁是猫咪喜爱的直接对象,触发了猫咪渴望的表情,构成了表情包的笑点。",
-"段间关系-段落5.2.2-空间关系-定性-语义关联关系": "0.86 - 从语义上确认了虾仁是猫咪情感指向的目标,对理解图片叙事至关重要。"
-}
-}
-},
-"亮点ID": "img_5_hl_3"
-}
-}
-]
-},
-{
-"聚类主题": "拟人化的卡通手势贴纸",
-"聚类描述": "这是该类图片的实质亮点。画面中叠加了高饱和度的黄色Emoji手势物体(拒绝手势与捧手动作)。作为独立的视觉实体,这些卡通贴纸被赋予了物理意义,直观地替代了猫咪的前肢,生动地演绎了“拒绝”与“索要”的具体动作。",
-"亮点类型": "实质",
-},
-{
-"聚类主题": "跨次元的拼贴视觉风格",
-"聚类描述": "这是该类图片的形式亮点。图片采用了一种特定的视觉混合手法,将高写实的摄影素材(猫咪、背景)与扁平化或3D风格的卡通符号(Emoji)生硬地结合在一起。这种打破次元壁的拼贴风格增强了画面的互联网网感和荒诞趣味性。",
-"亮点类型": "形式",
-}
-]

+ 0 - 60
examples/research/input/description/制作点.md

@@ -1,60 +0,0 @@
-{
-"元素ID": "元素1",
-"元素名称": "拒绝猫咪",
-"元素描述": "一只白色和橘色相间的猫咪,张大嘴巴,眼睛紧闭,表情夸张,呈现出拒绝或不喜欢的姿态。",
-"段落数量": 7,
-"段落列表": [
-"段落1.1.2",
-"段落2.1.2",
-"段落3.1.2",
-],
-"综合权重": 95.5
-},
-{
-"元素ID": "元素2",
-"元素名称": "喜爱猫咪",
-"元素描述": "一只白色和橘色相间的猫咪,脸颊鼓起,眼睛睁开,表情温顺,呈现出喜爱或期待的姿态。",
-"段落数量": 7,
-"段落列表": [
-"段落1.2.2",
-"段落2.2.2",
-"段落3.2.2",
-],
-"综合权重": 95.5
-},
-{
-"元素ID": "元素3",
-"元素名称": "拒绝手势",
-"元素描述": "一个黄色的卡通手势,拇指和食指伸出,其余手指握拳,表示拒绝或停止。",
-"段落数量": 7,
-"段落列表": [
-"段落1.1.3",
-"段落2.1.3",
-"段落3.1.3",
-],
-"综合权重": 92.5
-},
-{
-"元素ID": "元素4",
-"元素名称": "喜爱手势",
-"元素描述": "一对黄色的卡通手掌,掌心向上,手指微曲,表示喜爱、接受或欢迎。",
-"段落数量": 7,
-"段落列表": [
-"段落1.2.3",
-"段落2.2.3",
-"段落3.2.3",
-],
-"综合权重": 92.5
-},
-{
-"元素ID": "元素5",
-"元素名称": "手",
-"元素描述": "一只肤色白皙的手,掌心向上,手指微曲,呈现托举物品的姿态。",
-"段落数量": 14,
-"段落列表": [
-"段落1.1.4",
-"段落2.1.4",
-"段落3.1.4"
-],
-"综合权重": 88.0
-}

+ 0 - 336
examples/research/input/description/阿里多多酱__img_1_制作表.json

@@ -1,336 +0,0 @@
-[
-  {
-    "名称": "表情包图片",
-    "描述": "一张分为上下两部分的表情包图片,上半部分表示拒绝,下半部分表示喜爱。",
-    "段落ID": "段落1",
-    "形式": {
-      "图像拼接": {
-        "名称": "图像拼接",
-        "描述": "图片由上下两部分拼接而成,上半部分(0,0到1200,400)和下半部分(0,400到1200,800)在垂直方向上紧密连接,形成一个完整的矩形图像。",
-        "类型": "图像布局",
-        "形式ID": "形式1",
-        "评分详情": {
-          "combined_score": 0.595
-        }
-      },
-      "评分详情": {
-        "combined_score": 0.616
-      }
-    },
-    "子段落": [
-      {
-        "名称": "上半部分",
-        "描述": "表示拒绝某种食物的场景。",
-        "段落ID": "段落1.1",
-        "形式": {
-          "图像拼接": {
-            "名称": "图像拼接",
-            "描述": "上半部分图片由文字、猫咪、拒绝手势、手和芒果五个元素合成。文字位于左上角,猫咪位于右侧,拒绝手势位于猫咪下方,手位于左下角,芒果位于手上方。所有元素均放置在白色背景上,形成一个统一的拒绝场景。",
-            "类型": "图像布局",
-            "形式ID": "形式1",
-            "评分详情": {
-              "combined_score": 0.518
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.642
-          }
-        },
-        "子段落": [
-          {
-            "名称": "拒绝文字",
-            "描述": "表示拒绝的文字。",
-            "段落ID": "段落1.1.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "文字内容为“我不爱吃芒果,谢谢”。",
-                "类型": "文字特征",
-                "形式ID": "形式2",
-                "评分详情": {
-                  "combined_score": 0.546
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.546
-              }
-            }
-          },
-          {
-            "名称": "拒绝猫咪",
-            "描述": "一只张大嘴巴,闭着眼睛,表现出拒绝表情的白色猫咪。",
-            "段落ID": "段落1.1.2",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只白色猫咪,头部和部分身体可见,面部表情为张大嘴巴打哈欠或发出拒绝的声音,眼睛紧闭,表现出明显的拒绝姿态。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.908
-                }
-              },
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "猫咪图像的背景是透明的,使其能够无缝地融入白色背景中。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "图像表情": {
-                "名称": "图像表情",
-                "描述": "猫咪的表情是张大嘴巴、闭着眼睛,呈现出拒绝、不情愿或厌恶的姿态。",
-                "类型": "图像特征",
-                "形式ID": "形式10",
-                "评分详情": {
-                  "combined_score": 0.95
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.975
-              }
-            }
-          },
-          {
-            "名称": "拒绝手势",
-            "描述": "一个黄色竖起大拇指表示拒绝的手势表情符号。",
-            "段落ID": "段落1.1.3",
-            "形式": {
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "手势图像的背景是透明的,使其能够无缝地融入白色背景中。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.385
-              }
-            }
-          },
-          {
-            "名称": "手",
-            "描述": "一只托举着食物的肤色手。",
-            "段落ID": "段落1.1.4",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只肤色手,手掌向上,呈托举状,手腕部分可见。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.927
-                }
-              },
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "手部图像的背景是透明的,使其能够无缝地融入白色背景中。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.245
-              }
-            }
-          },
-          {
-            "名称": "芒果",
-            "描述": "一个完整的黄色芒果。",
-            "段落ID": "段落1.1.5",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一个完整的黄色芒果,表面有细小的水珠。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.63
-                }
-              },
-              "图像颜色": {
-                "名称": "图像颜色",
-                "描述": "芒果的颜色为鲜亮的黄色,带有少量橙色渐变。",
-                "类型": "图像样式",
-                "形式ID": "形式6",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "图像完整性": {
-                "名称": "图像完整性",
-                "描述": "芒果呈现为完整的、未被切割的形态。",
-                "类型": "图像特征",
-                "形式ID": "形式4",
-                "评分详情": {
-                  "combined_score": 0.63
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.63
-              }
-            }
-          }
-        ]
-      },
-      {
-        "名称": "下半部分",
-        "描述": "表示喜爱某种食物的场景。",
-        "段落ID": "段落1.2",
-        "形式": {
-          "图像拼接": {
-            "名称": "图像拼接",
-            "描述": "下半部分图片由文字、猫咪、喜爱手势、手和芒果块五个元素合成。文字位于左上角,猫咪位于右侧,喜爱手势位于猫咪下方,手位于左下角,芒果块位于手上方。所有元素均放置在白色背景上,形成一个统一的喜爱场景。",
-            "类型": "图像布局",
-            "形式ID": "形式1",
-            "评分详情": {
-              "combined_score": 0.598
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.73
-          }
-        },
-        "子段落": [
-          {
-            "名称": "喜爱文字",
-            "描述": "表示喜爱的文字。",
-            "段落ID": "段落1.2.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "文字内容为“芒果!我爱吃!”。",
-                "类型": "文字特征",
-                "形式ID": "形式2",
-                "评分详情": {
-                  "combined_score": 0.56
-                }
-              },
-              "文字大小": {
-                "名称": "文字大小",
-                "描述": "文字高度约为100像素,宽度约为600像素,占据了段落1.2.1的整个区域。",
-                "类型": "文字样式",
-                "形式ID": "形式7",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.56
-              }
-            }
-          },
-          {
-            "名称": "喜爱猫咪",
-            "描述": "一只面带微笑,表情愉悦的白色猫咪。",
-            "段落ID": "段落1.2.2",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只白色猫咪,头部和部分身体可见,面部表情为微笑,眼睛微眯,嘴角上扬,表现出明显的喜爱和愉悦姿态。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.927
-                }
-              },
-              "图像表情": {
-                "名称": "图像表情",
-                "描述": "猫咪的表情是面带微笑,眼睛微眯,呈现出愉悦、喜爱和满足的姿态。",
-                "类型": "图像特征",
-                "形式ID": "形式10",
-                "评分详情": {
-                  "combined_score": 0.95
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.972
-              }
-            }
-          },
-          {
-            "名称": "喜爱手势",
-            "描述": "一个黄色合拢表示喜爱的双手手势表情符号。",
-            "段落ID": "段落1.2.3",
-            "形式": {
-              "评分详情": {
-                "combined_score": 0.385
-              }
-            }
-          },
-          {
-            "名称": "手",
-            "描述": "一只托举着食物的肤色手。",
-            "段落ID": "段落1.2.4",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只肤色手,手掌向上,呈托举状,手腕部分可见。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.927
-                }
-              },
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "手部图像的背景是透明的,使其能够无缝地融入白色背景中。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.245
-              }
-            }
-          },
-          {
-            "名称": "芒果块",
-            "描述": "一碗切好的芒果块。",
-            "段落ID": "段落1.2.5",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一碗切好的芒果块,芒果块呈不规则的立方体状,堆叠在碗中。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.644
-                }
-              },
-              "图像颜色": {
-                "名称": "图像颜色",
-                "描述": "芒果块的颜色为鲜亮的黄色,碗的颜色为纯白色。",
-                "类型": "图像样式",
-                "形式ID": "形式6",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "图像容器": {
-                "名称": "图像容器",
-                "描述": "芒果块被盛放在一个白色的、方形的、带有一定深度的碗状容器中。",
-                "类型": "图像布局",
-                "形式ID": "形式16",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.644
-              }
-            }
-          }
-        ]
-      }
-    ]
-  }
-]

+ 0 - 300
examples/research/input/description/阿里多多酱__img_2_制作表.json

@@ -1,300 +0,0 @@
-[
-  {
-    "名称": "表情包图片",
-    "描述": "一张分为上下两部分的表情包图片,上半部分表示拒绝,下半部分表示喜爱。",
-    "段落ID": "段落2",
-    "形式": {
-      "图像拼接": {
-        "名称": "图像拼接",
-        "描述": "图像由上下两部分拼接而成,上半部分(0,0,1200,400)和下半部分(0,400,1200,800)在垂直方向上紧密连接,共同构成一个完整的800x1200像素的图像。",
-        "类型": "图像布局",
-        "形式ID": "形式1",
-        "评分详情": {
-          "combined_score": 0.626
-        }
-      },
-      "图像背景透明": {
-        "名称": "图像背景透明",
-        "描述": "图像的背景为纯白色,所有前景元素(文字、猫咪、手、榴莲、手势)均被抠图并叠加在白色背景上,背景区域无任何图案或纹理。",
-        "类型": "图像样式",
-        "形式ID": "形式5",
-        "评分详情": {
-          "combined_score": 0.451
-        }
-      },
-      "评分详情": {
-        "combined_score": 0.74
-      }
-    },
-    "子段落": [
-      {
-        "名称": "上半部分",
-        "描述": "表示拒绝某种食物的场景。",
-        "段落ID": "段落2.1",
-        "形式": {
-          "评分详情": {
-            "combined_score": 0.541
-          }
-        },
-        "子段落": [
-          {
-            "名称": "拒绝文字",
-            "描述": "表示拒绝的文字。",
-            "段落ID": "段落2.1.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "文字内容为“我 不爱吃榴莲,谢谢”。",
-                "类型": "文字特征",
-                "形式ID": "形式2",
-                "评分详情": {
-                  "combined_score": 0.504
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.504
-              }
-            }
-          },
-          {
-            "名称": "拒绝猫咪",
-            "描述": "一只张大嘴巴,闭着眼睛,表现出拒绝表情的白色猫咪。",
-            "段落ID": "段落2.1.2",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只白色猫咪,头部和部分身体可见,面部表情为张大嘴巴,闭着眼睛,表现出明显的拒绝和厌恶。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.758
-                }
-              },
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "猫咪图像的背景被完全移除,只保留猫咪主体,边缘清晰,无背景残留。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "图像表情": {
-                "名称": "图像表情",
-                "描述": "猫咪的表情为拒绝和厌恶,通过张大的嘴巴和紧闭的眼睛来表现。",
-                "类型": "图像特征",
-                "形式ID": "形式10",
-                "评分详情": {
-                  "combined_score": 0.874
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.886
-              }
-            }
-          },
-          {
-            "名称": "拒绝手势",
-            "描述": "一个黄色竖起大拇指表示拒绝的手势表情符号。",
-            "段落ID": "段落2.1.3",
-            "形式": {
-              "评分详情": {
-                "combined_score": 0.385
-              }
-            }
-          },
-          {
-            "名称": "手",
-            "描述": "一只托举着食物的肤色手。",
-            "段落ID": "段落2.1.4",
-            "形式": {
-              "评分详情": {
-                "combined_score": 0.28
-              }
-            }
-          },
-          {
-            "名称": "榴莲",
-            "描述": "一个完整的带刺榴莲。",
-            "段落ID": "段落2.1.5",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一个完整的榴莲,表面布满尖刺,呈椭圆形。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "图像完整性": {
-                "名称": "图像完整性",
-                "描述": "榴莲图像呈现为一个完整的、未被剥开的榴莲果实。",
-                "类型": "图像特征",
-                "形式ID": "形式4",
-                "评分详情": {
-                  "combined_score": 0.595
-                }
-              },
-              "图像纹理": {
-                "名称": "图像纹理",
-                "描述": "榴莲表面具有清晰可见的尖刺纹理,质感粗糙。",
-                "类型": "图像样式",
-                "形式ID": "形式15",
-                "评分详情": {
-                  "combined_score": 0.504
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.616
-              }
-            }
-          }
-        ]
-      },
-      {
-        "名称": "下半部分",
-        "描述": "表示喜爱某种食物的场景。",
-        "段落ID": "段落2.2",
-        "形式": {
-          "评分详情": {
-            "combined_score": 0.465
-          }
-        },
-        "子段落": [
-          {
-            "名称": "喜爱文字",
-            "描述": "表示喜爱的文字。",
-            "段落ID": "段落2.2.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "文字内容为“榴莲! 我爱吃!”。",
-                "类型": "文字特征",
-                "形式ID": "形式2",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.532
-              }
-            }
-          },
-          {
-            "名称": "喜爱猫咪",
-            "描述": "一只面带微笑,表情愉悦的白色猫咪。",
-            "段落ID": "段落2.2.2",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只白色猫咪,头部和部分身体可见,面部表情为面带微笑,眼睛微眯,表现出愉悦和喜爱的神情。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.824
-                }
-              },
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "猫咪图像的背景被完全移除,只保留猫咪主体,边缘清晰,无背景残留。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "图像表情": {
-                "名称": "图像表情",
-                "描述": "猫咪的表情为愉悦和喜爱,通过微笑的嘴巴和微眯的眼睛来表现。",
-                "类型": "图像特征",
-                "形式ID": "形式10",
-                "评分详情": {
-                  "combined_score": 0.855
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.888
-              }
-            }
-          },
-          {
-            "名称": "喜爱手势",
-            "描述": "一个黄色合拢表示喜爱的双手手势表情符号。",
-            "段落ID": "段落2.2.3",
-            "形式": {
-              "评分详情": {
-                "combined_score": 0.378
-              }
-            }
-          },
-          {
-            "名称": "手",
-            "描述": "一只托举着食物的肤色手。",
-            "段落ID": "段落2.2.4",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只肤色手,手掌向上,呈托举状,手腕部分被截断。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.824
-                }
-              },
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "手部图像的背景被完全移除,只保留手部主体,边缘清晰,无背景残留。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.451
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.245
-              }
-            }
-          },
-          {
-            "名称": "榴莲果肉",
-            "描述": "几块剥开的榴莲果肉。",
-            "段落ID": "段落2.2.5",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是几块剥开的榴莲果肉,果肉呈黄色,形状不规则。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.63
-                }
-              },
-              "图像颜色": {
-                "名称": "图像颜色",
-                "描述": "榴莲果肉的颜色为鲜亮的黄色,部分区域有白色纤维。",
-                "类型": "图像样式",
-                "形式ID": "形式6",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "图像完整性": {
-                "名称": "图像完整性",
-                "描述": "榴莲果肉图像呈现为几块已经剥开的果肉,而非完整的榴莲果实。",
-                "类型": "图像特征",
-                "形式ID": "形式4",
-                "评分详情": {
-                  "combined_score": 0.595
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.63
-              }
-            }
-          }
-        ]
-      }
-    ]
-  }
-]

+ 0 - 309
examples/research/input/description/阿里多多酱__img_3_制作表.json

@@ -1,309 +0,0 @@
-[
-  {
-    "名称": "表情包图片",
-    "描述": "一张分为上下两部分的表情包图片,上半部分表示拒绝,下半部分表示喜爱。",
-    "段落ID": "段落3",
-    "形式": {
-      "图像拼接": {
-        "名称": "图像拼接",
-        "描述": "图片由上下两部分拼接而成,上半部分(0,0,1200,400)和下半部分(0,400,1200,800)在垂直方向上紧密连接,形成一个完整的矩形图像。",
-        "类型": "图像布局",
-        "形式ID": "形式1",
-        "评分详情": {
-          "combined_score": 0.595
-        }
-      },
-      "评分详情": {
-        "combined_score": 0.751
-      }
-    },
-    "子段落": [
-      {
-        "名称": "上半部分",
-        "描述": "表示拒绝某种食物的场景。",
-        "段落ID": "段落3.1",
-        "形式": {
-          "图像拼接": {
-            "名称": "图像拼接",
-            "描述": "上半部分图片由文字(0,0,600,100)、拒绝猫咪(600,100,1200,400)、拒绝手势(600,300,750,400)、手(0,200,400,400)和菠萝(100,100,400,300)等元素组合而成,这些元素在白色背景上自由排布,没有严格的网格或对齐规则,形成一个表达拒绝主题的场景。",
-            "类型": "图像布局",
-            "形式ID": "形式1",
-            "评分详情": {
-              "combined_score": 0.476
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.674
-          }
-        },
-        "子段落": [
-          {
-            "名称": "拒绝文字",
-            "描述": "表示拒绝的文字。",
-            "段落ID": "段落3.1.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "文字内容为“我不爱吃菠萝,谢谢”。",
-                "类型": "文字特征",
-                "形式ID": "形式2",
-                "评分详情": {
-                  "combined_score": 0.546
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.546
-              }
-            }
-          },
-          {
-            "名称": "拒绝猫咪",
-            "描述": "一只张大嘴巴,闭着眼睛,表现出拒绝表情的白色猫咪。",
-            "段落ID": "段落3.1.2",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只白色猫咪的头部特写,猫咪的毛发蓬松,眼睛紧闭,嘴巴张大,露出粉色的口腔和舌头,整体姿态表现出强烈的拒绝或厌恶。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.894
-                }
-              },
-              "图像表情": {
-                "名称": "图像表情",
-                "描述": "猫咪的表情是夸张的拒绝或厌恶,通过紧闭的眼睛和张大的嘴巴来表现,具有强烈的喜剧效果。",
-                "类型": "图像特征",
-                "形式ID": "形式10",
-                "评分详情": {
-                  "combined_score": 0.898
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.937
-              }
-            }
-          },
-          {
-            "名称": "拒绝手势",
-            "描述": "一个黄色竖起大拇指表示拒绝的手势表情符号。",
-            "段落ID": "段落3.1.3",
-            "形式": {
-              "评分详情": {
-                "combined_score": 0.315
-              }
-            }
-          },
-          {
-            "名称": "手",
-            "描述": "一只托举着食物的肤色手。",
-            "段落ID": "段落3.1.4",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只肤色手掌,手掌向上摊开,手指微微弯曲,呈托举状,手腕部分被截断。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.894
-                }
-              },
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "手部图像的背景被完全移除,手部主体被精确抠出,边缘清晰,与白色背景无缝融合。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.245
-              }
-            }
-          },
-          {
-            "名称": "菠萝",
-            "描述": "一个完整的菠萝。",
-            "段落ID": "段落3.1.5",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一个完整的菠萝,带有绿色的冠芽和金黄色的果实,果实表面有明显的网格状纹理和突起的“眼睛”。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.623
-                }
-              },
-              "图像颜色": {
-                "名称": "图像颜色",
-                "描述": "菠萝果实主体呈金黄色(近似RGB: 255,192,0),冠芽为深绿色(近似RGB: 0,128,0)。",
-                "类型": "图像样式",
-                "形式ID": "形式6",
-                "评分详情": {
-                  "combined_score": 0.504
-                }
-              },
-              "图像完整性": {
-                "名称": "图像完整性",
-                "描述": "菠萝图像呈现的是一个未经切割、完整的菠萝果实,包括果肉和冠芽。",
-                "类型": "图像特征",
-                "形式ID": "形式4",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "图像纹理": {
-                "名称": "图像纹理",
-                "描述": "菠萝果实表面具有清晰的网格状纹理,每个网格中心有突起的褐色小点,冠芽部分有细长的叶片纹理。",
-                "类型": "图像样式",
-                "形式ID": "形式15",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.623
-              }
-            }
-          }
-        ]
-      },
-      {
-        "名称": "下半部分",
-        "描述": "表示喜爱某种食物的场景。",
-        "段落ID": "段落3.2",
-        "形式": {
-          "图像拼接": {
-            "名称": "图像拼接",
-            "描述": "下半部分图片由文字(0,400,600,500)、喜爱猫咪(600,500,1200,800)、喜爱手势(600,700,750,800)、手(0,600,400,800)和菠萝块(100,500,400,700)等元素组合而成,这些元素在白色背景上自由排布,没有严格的网格或对齐规则,形成一个表达喜爱主题的场景。",
-            "类型": "图像布局",
-            "形式ID": "形式1",
-            "评分详情": {
-              "combined_score": 0.49
-            }
-          },
-          "评分详情": {
-            "combined_score": 0.662
-          }
-        },
-        "子段落": [
-          {
-            "名称": "喜爱文字",
-            "描述": "表示喜爱的文字。",
-            "段落ID": "段落3.2.1",
-            "形式": {
-              "文字内容": {
-                "名称": "文字内容",
-                "描述": "文字内容为“菠萝!我爱吃!”。",
-                "类型": "文字特征",
-                "形式ID": "形式2",
-                "评分详情": {
-                  "combined_score": 0.56
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.567
-              }
-            }
-          },
-          {
-            "名称": "喜爱猫咪",
-            "描述": "一只面带微笑,表情愉悦的白色猫咪。",
-            "段落ID": "段落3.2.2",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一只白色猫咪的头部特写,猫咪的毛发蓬松,眼睛半睁,嘴角上扬,露出微笑的表情,整体姿态表现出愉悦和喜爱。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.852
-                }
-              },
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "猫咪图像的背景被完全移除,猫咪主体被精确抠出,边缘清晰,与白色背景无缝融合。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.42
-                }
-              },
-              "图像表情": {
-                "名称": "图像表情",
-                "描述": "猫咪的表情是愉悦和喜爱,通过半睁的眼睛和上扬的嘴角来表现,具有可爱的喜剧效果。",
-                "类型": "图像特征",
-                "形式ID": "形式10",
-                "评分详情": {
-                  "combined_score": 0.929
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.951
-              }
-            }
-          },
-          {
-            "名称": "喜爱手势",
-            "描述": "一个黄色合拢表示喜爱的双手手势表情符号。",
-            "段落ID": "段落3.2.3",
-            "形式": {
-              "评分详情": {
-                "combined_score": 0.336
-              }
-            }
-          },
-          {
-            "名称": "手",
-            "描述": "一只托举着食物的肤色手。",
-            "段落ID": "段落3.2.4",
-            "形式": {
-              "评分详情": {
-                "combined_score": 0.336
-              }
-            }
-          },
-          {
-            "名称": "菠萝块",
-            "描述": "一碗切好的菠萝块。",
-            "段落ID": "段落3.2.5",
-            "形式": {
-              "图像内容": {
-                "名称": "图像内容",
-                "描述": "图像内容是一个透明玻璃碗中盛放着切好的菠萝块,菠萝块呈不规则的块状,颜色金黄,表面湿润。",
-                "类型": "图像特征",
-                "形式ID": "形式3",
-                "评分详情": {
-                  "combined_score": 0.616
-                }
-              },
-              "图像背景透明": {
-                "名称": "图像背景透明",
-                "描述": "菠萝块和碗的图像背景被完全移除,主体被精确抠出,边缘清晰,与白色背景无缝融合。",
-                "类型": "图像样式",
-                "形式ID": "形式5",
-                "评分详情": {
-                  "combined_score": 0.406
-                }
-              },
-              "图像颜色": {
-                "名称": "图像颜色",
-                "描述": "菠萝块呈金黄色(近似RGB: 255,215,0),玻璃碗呈透明无色。",
-                "类型": "图像样式",
-                "形式ID": "形式6",
-                "评分详情": {
-                  "combined_score": 0.525
-                }
-              },
-              "评分详情": {
-                "combined_score": 0.616
-              }
-            }
-          }
-        ]
-      }
-    ]
-  }
-]

+ 0 - 19
examples/research/input/index.md

@@ -1,19 +0,0 @@
-# Research Input 目录说明
-
-本目录包含调研阶段的输入文件,来自上游 plan 阶段的产出。
-
-## 根目录文件
-
-- `analysis.json`:需求分析结果,包含内容品类判断、上限点(必须高度还原的特征)、下限点(底线要求)及 AI 还原挑战。
-- `pipeline.json`:粗工序定义,描述还原策略(垫图法+局部重绘组合)、目标树(goal_tree)、各阶段依赖关系和风险评估。
-
-## description/ 文件夹
-
-还原目标的详细描述,包含图文帖子的结构化解构数据。
-
-- `制作亮点.md`:核心亮点聚类,如猫咪反差表情、二分对比构图、食物状态对比等。
-- `制作点.md`:关键视觉元素及权重,如拒绝猫咪、喜爱猫咪、手势等。
-- `创作表.md`:创作视角描述(如有内容)。
-- `阿里多多酱__img_1_制作表.json`:第 1 张图的制作表,包含上下拼接布局、元素组成、坐标和视觉形式评分。
-- `阿里多多酱__img_2_制作表.json`:第 2 张图的制作表,包含拒绝/喜爱场景的元素布局。
-- `阿里多多酱__img_3_制作表.json`:第 3 张图的制作表,包含各元素位置坐标和构图信息。

+ 0 - 388
examples/research/input/pipeline.json

@@ -1,388 +0,0 @@
-{
-  "pipelines": [
-    {
-      "strategy": {
-        "name": "垫图法 + 局部重绘组合策略",
-        "description": "使用 Midjourney 的--cref 参数保持角色一致性生成基础猫咪图,然后用 ComfyUI/Photoshop 进行局部重绘精准控制表情(张嘴闭眼 vs 鼓腮睁眼),最后分层合成所有元素(猫咪、手势、食物、手、文字)",
-        "reasoning": "analysis.json 中的核心下限点是'猫咪跨图一致性'和'表情精准度',垫图法 (--cref) 可保证角色一致性,局部重绘可精准控制表情,完美匹配需求;制作表中明确了每个元素的布局坐标和视觉特征,支持分层合成策略",
-        "vs_alternatives": [
-          {
-            "alternative": "Seed 值固定 + 描述词微调",
-            "why_not": "seed 值法不能 100% 保证一致性,对于'猫咪跨图一致性'这一下限点覆盖不足;表情控制依赖描述词精准度,对于'表情精准度'这一下限点覆盖不足",
-            "could_switch_if": "如果局部重绘工具不可用或效果不佳,可回退到此策略,接受一定的一致性损失"
-          },
-          {
-            "alternative": "Panels 多格生成 + 裁剪",
-            "why_not": "Panels 法虽然一致性好,但表情精准度不够,难以保证生成特定的'张嘴闭眼'和'鼓腮睁眼'表情;且多格图分辨率较低,影响最终输出质量",
-            "could_switch_if": "如果时间紧迫且对表情精准度要求降低,可考虑此策略快速出图"
-          }
-        ],
-        "risks_found_during_instantiation": [
-          {
-            "stage_id": "stage_2",
-            "risk": "局部重绘可能导致猫咪面部边缘融合不自然,尤其是嘴巴和眼睛区域",
-            "severity": "medium",
-            "mitigation": "使用 Inpaint 专用模型(如 FLUX.1 Fill),配合遮罩模糊和边缘羽化;在 Photoshop 中用匹配颜色工具校正色差"
-          },
-          {
-            "stage_id": "stage_4",
-            "risk": "三张图(芒果/榴莲/菠萝)的猫咪可能因分批生成而产生细微差异",
-            "severity": "medium",
-            "mitigation": "固定 MJ 的--s 风格参数和--v 版本;使用同一张参考图进行--cref;优先生成一套猫咪后复用到三张图"
-          },
-          {
-            "stage_id": "stage_5",
-            "risk": "手势与猫咪的空间关系可能不自然,看起来像悬浮元素",
-            "severity": "low",
-            "mitigation": "制作表中已有明确坐标(如 img_1 拒绝手势位于 600,300,750,400),按坐标精确定位;添加轻微阴影增强融合感"
-          }
-        ]
-      },
-      "goal_tree": {
-        "stage_id": "root",
-        "stage_name": "还原目标",
-        "description": "还原一组对比叙事型猫咪表情包(img_1 芒果主题、img_2 榴莲主题、img_3 菠萝主题),每张图采用上下分栏结构,上半部分表示拒绝(张嘴闭眼猫咪 + 完整食物 + 拒绝手势),下半部分表示喜爱(鼓腮睁眼猫咪 + 切好食物 + 喜爱手势),所有元素拼贴在纯白背景上",
-        "required_spec": [
-          "纵向二分构图(上下分栏 1200x400 + 1200x400)",
-          "猫咪跨图一致性(同一只白橘猫的两种表情)",
-          "表情精准度(拒绝:张嘴闭眼;喜爱:鼓腮睁眼)",
-          "食物形态对比(上:完整带皮/带壳;下:去皮切好)",
-          "卡通手势拼贴(黄色 Emoji 手势,替代猫咪前肢)",
-          "纯白背景 + 透明抠图(所有元素独立抠图后合成)",
-          "文字内容准确(拒绝:'我不爱吃 XX,谢谢';喜爱:'XX!我爱吃!')",
-          "元素布局符合制作表坐标"
-        ],
-        "output_spec": [
-          "img_1.png(芒果主题,1200x800)",
-          "img_2.png(榴莲主题,1200x800)",
-          "img_3.png(菠萝主题,1200x800)"
-        ],
-        "children": [
-          {
-            "stage_id": "stage_1",
-            "stage_name": "基础猫咪素材生成",
-            "description": "生成一只白橘相间的猫咪基础图,作为后续表情编辑的底图。使用 Midjourney --cref 参数保持角色一致性,生成正面/侧面视角的猫咪头像,背景为纯白色以便抠图",
-            "required_spec": [
-              "白橘相间的猫咪毛色",
-              "正面或侧面视角,头部清晰可见",
-              "纯白背景或透明背景",
-              "高分辨率(至少 1024x1024)以便裁剪和编辑"
-            ],
-            "output_spec": [
-              "base_cat.png(基础猫咪图,白橘相间,纯白背景)"
-            ],
-            "spec_satisfaction": {
-              "status": "satisfied",
-              "gap": "",
-              "mitigation": ""
-            },
-            "target_images": ["img_1", "img_2", "img_3"],
-            "stage_output": "base_cat.png",
-            "input_from": [],
-            "covers_requirements": ["猫咪跨图一致性"],
-            "importance": "下限",
-            "reasoning": {
-              "why_needed": "这是整个还原流程的基础,如果基础猫咪图不一致或质量差,后续所有表情编辑和合成都会失败。此阶段解决'猫咪跨图一致性'这一下限点",
-              "why_here": "这是依赖树的叶节点,不依赖任何其他阶段的产物,是所有猫咪相关阶段的共同输入"
-            },
-            "children": []
-          },
-          {
-            "stage_id": "stage_2",
-            "stage_name": "表情精准编辑",
-            "description": "基于基础猫咪图,使用局部重绘(Inpaint)技术分别生成两种表情:拒绝表情(张嘴闭眼)和喜爱表情(鼓腮睁眼)。对猫咪面部区域进行精准遮罩和重绘,保持其他部分不变",
-            "required_spec": [
-              "拒绝表情:嘴巴张大、眼睛紧闭、表情夸张",
-              "喜爱表情:脸颊鼓起、眼睛睁开、嘴角上扬",
-              "保持猫咪毛色、头部轮廓与 base_cat.png 一致",
-              "边缘融合自然,无明显重绘痕迹"
-            ],
-            "output_spec": [
-              "cat_reject.png(拒绝表情猫咪,透明背景)",
-              "cat_accept.png(喜爱表情猫咪,透明背景)"
-            ],
-            "spec_satisfaction": {
-              "status": "partial",
-              "gap": "局部重绘可能导致面部边缘融合不自然,尤其是嘴巴和眼睛区域;多次生成可能产生风格细微差异",
-              "mitigation": "使用 Inpaint 专用模型(如 FLUX.1 Fill),配合遮罩模糊和边缘羽化;固定 MJ 的--s 风格参数和--v 版本;使用同一张参考图进行--cref"
-            },
-            "target_images": ["img_1", "img_2", "img_3"],
-            "stage_output": "cat_reject.png, cat_accept.png",
-            "input_from": ["stage_1"],
-            "covers_requirements": ["表情精准度", "猫咪跨图一致性"],
-            "importance": "下限",
-            "reasoning": {
-              "why_needed": "这是实现'表情精准度'下限点的关键阶段。制作表中明确要求拒绝猫咪'张大嘴巴,闭着眼睛',喜爱猫咪'脸颊鼓起,眼睛睁开',必须通过局部重绘精准控制",
-              "why_here": "依赖 stage_1 的基础猫咪图,是后续合成阶段的必要输入。表情编辑必须在合成前完成,因为合成后无法单独修改猫咪表情"
-            },
-            "children": []
-          },
-          {
-            "stage_id": "stage_3",
-            "stage_name": "食物素材准备",
-            "description": "为三张图分别准备上下两种形态的食物素材。img_1:完整芒果 vs 切好芒果块;img_2:完整带刺榴莲 vs 榴莲果肉;img_3:完整带冠芽菠萝 vs 切好菠萝块。所有食物素材需要透明背景以便合成",
-            "required_spec": [
-              "img_1_upper:完整带皮芒果,鲜亮黄色,表面有水珠",
-              "img_1_lower:切好芒果块,不规则立方体状,盛放在白色方形碗中",
-              "img_2_upper:完整带刺榴莲,椭圆形,表面布满尖刺",
-              "img_2_lower:剥开的榴莲果肉,鲜亮黄色,部分区域有白色纤维",
-              "img_3_upper:完整菠萝,金黄色果实 + 深绿色冠芽,表面有网格状纹理",
-              "img_3_lower:切好菠萝块,金黄色,盛放在透明玻璃碗中",
-              "所有食物素材透明背景,边缘清晰"
-            ],
-            "output_spec": [
-              "mango_whole.png, mango_cubed.png",
-              "durian_whole.png, durian_flesh.png",
-              "pineapple_whole.png, pineapple_cubed.png"
-            ],
-            "spec_satisfaction": {
-              "status": "satisfied",
-              "gap": "",
-              "mitigation": ""
-            },
-            "target_images": ["img_1", "img_2", "img_3"],
-            "stage_output": "6 种食物素材图",
-            "input_from": [],
-            "covers_requirements": ["食物形态对比", "食物形态准确性"],
-            "importance": "上限",
-            "reasoning": {
-              "why_needed": "这是实现'食物形态对比'上限点的关键阶段。制作表中明确描述了每种食物的形态特征(如'完整带皮'vs'切好块状'),这是猫咪态度转变的诱因,形态错误会导致逻辑不通",
-              "why_here": "这是依赖树的叶节点,不依赖其他阶段。食物素材是合成阶段的必要输入,可独立于猫咪素材并行准备"
-            },
-            "children": []
-          },
-          {
-            "stage_id": "stage_4",
-            "stage_name": "手势和手素材准备",
-            "description": "准备黄色卡通手势素材(拒绝手势:拇指食指伸出;喜爱手势:掌心向上双手合拢)和肤色手素材(掌心向上托举姿态)。所有素材需要透明背景",
-            "required_spec": [
-              "拒绝手势:黄色 Emoji 风格,拇指和食指伸出,其余手指握拳",
-              "喜爱手势:黄色 Emoji 风格,掌心向上,手指微曲",
-              "手:肤色白皙,掌心向上,呈托举状,手腕部分可见或被截断",
-              "所有素材透明背景,边缘清晰"
-            ],
-            "output_spec": [
-              "gesture_reject.png(拒绝手势)",
-              "gesture_accept.png(喜爱手势)",
-              "hand_hold.png(托举的手)"
-            ],
-            "spec_satisfaction": {
-              "status": "satisfied",
-              "gap": "",
-              "mitigation": ""
-            },
-            "target_images": ["img_1", "img_2", "img_3"],
-            "stage_output": "gesture_reject.png, gesture_accept.png, hand_hold.png",
-            "input_from": [],
-            "covers_requirements": ["拟人化的卡通手势贴纸"],
-            "importance": "上限",
-            "reasoning": {
-              "why_needed": "这是实现'拟人化的卡通手势贴纸'上限点的关键阶段。制作表中明确描述了手势的视觉特征(黄色卡通手势,表示拒绝/接受),这是表情包的标志性元素",
-              "why_here": "这是依赖树的叶节点,不依赖其他阶段。手势和手素材是合成阶段的必要输入,可独立于猫咪和食物素材并行准备"
-            },
-            "children": []
-          },
-          {
-            "stage_id": "stage_5",
-            "stage_name": "单图分层合成",
-            "description": "将猫咪、手势、食物、手等元素按制作表中的坐标进行分层合成。每张图分为上下两个场景(拒绝场景/喜爱场景),所有元素放置在纯白背景上。此阶段对 img_1/2/3 分别执行",
-            "required_spec": [
-              "画布尺寸:1200x800(上下各 1200x400)",
-              "背景:纯白色(RGB 255,255,255)",
-              "元素布局符合制作表坐标(如 img_1 拒绝猫咪位于 600,100,1200,400)",
-              "手势位于猫咪下方,模拟替代猫咪前肢的空间位置",
-              "手位于左下角,呈托举食物姿态",
-              "食物位于手上方",
-              "所有元素边缘清晰,无明显拼贴痕迹"
-            ],
-            "output_spec": [
-              "img_1_composed.png(芒果主题合成图,不含文字)",
-              "img_2_composed.png(榴莲主题合成图,不含文字)",
-              "img_3_composed.png(菠萝主题合成图,不含文字)"
-            ],
-            "spec_satisfaction": {
-              "status": "partial",
-              "gap": "手势与猫咪的空间关系可能不自然,看起来像悬浮元素;元素间可能存在轻微色差",
-              "mitigation": "按制作表坐标精确定位;添加轻微阴影增强融合感;使用匹配颜色工具校正色差"
-            },
-            "target_images": ["img_1", "img_2", "img_3"],
-            "stage_output": "img_1_composed.png, img_2_composed.png, img_3_composed.png",
-            "input_from": ["stage_2", "stage_3", "stage_4"],
-            "covers_requirements": ["纵向二分的对比叙事构图", "跨次元的拼贴视觉风格", "手势与猫咪的空间关系", "纯白背景与透明抠图"],
-            "importance": "上限",
-            "reasoning": {
-              "why_needed": "这是实现'纵向二分构图'和'拼贴视觉风格'上限点的关键阶段。制作表中详细描述了每个元素的布局坐标和拼接关系,必须通过分层合成精确还原",
-              "why_here": "此阶段依赖 stage_2(表情猫咪)、stage_3(食物)、stage_4(手势和手)的产物,是将所有独立元素整合为完整场景的中间节点"
-            },
-            "children": [
-              {
-                "stage_id": "stage_5_1",
-                "stage_name": "img_1 芒果主题合成",
-                "description": "合成 img_1 的上下两个场景:上半部分(拒绝文字 + 拒绝猫咪 + 拒绝手势 + 手 + 完整芒果),下半部分(喜爱文字 + 喜爱猫咪 + 喜爱手势 + 手 + 切好芒果块)",
-                "required_spec": [
-                  "上半部分:文字 (0,0,600,100),拒绝猫咪 (600,100,1200,400),拒绝手势 (600,300,750,400),手 (0,200,400,400),完整芒果 (100,100,400,300)",
-                  "下半部分:文字 (0,400,600,500),喜爱猫咪 (600,500,1200,800),喜爱手势 (600,700,750,800),手 (0,600,400,800),切好芒果块 (100,500,400,700)"
-                ],
-                "output_spec": ["img_1_composed.png"],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_1"],
-                "stage_output": "img_1_composed.png",
-                "input_from": ["stage_2", "stage_3", "stage_4"],
-                "covers_requirements": ["纵向二分的对比叙事构图", "跨次元的拼贴视觉风格"],
-                "importance": "上限",
-                "reasoning": {
-                  "why_needed": "这是 stage_5 在 img_1 上的具体实例化,芒果主题的食物形态对比是核心亮点",
-                  "why_here": "作为 stage_5 的子节点,继承父阶段的依赖关系"
-                },
-                "children": []
-              },
-              {
-                "stage_id": "stage_5_2",
-                "stage_name": "img_2 榴莲主题合成",
-                "description": "合成 img_2 的上下两个场景:上半部分(拒绝文字 + 拒绝猫咪 + 拒绝手势 + 手 + 完整榴莲),下半部分(喜爱文字 + 喜爱猫咪 + 喜爱手势 + 手 + 榴莲果肉)",
-                "required_spec": [
-                  "上半部分:文字 (0,0,600,100),拒绝猫咪 (600,100,1200,400),拒绝手势 (600,300,750,400),手 (0,200,400,400),完整榴莲 (100,100,400,300)",
-                  "下半部分:文字 (0,400,600,500),喜爱猫咪 (600,500,1200,800),喜爱手势 (600,700,750,800),手 (0,600,400,800),榴莲果肉 (100,500,400,700)"
-                ],
-                "output_spec": ["img_2_composed.png"],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_2"],
-                "stage_output": "img_2_composed.png",
-                "input_from": ["stage_2", "stage_3", "stage_4"],
-                "covers_requirements": ["纵向二分的对比叙事构图", "跨次元的拼贴视觉风格"],
-                "importance": "上限",
-                "reasoning": {
-                  "why_needed": "这是 stage_5 在 img_2 上的具体实例化,榴莲主题的带刺纹理和果肉形态是核心特征",
-                  "why_here": "作为 stage_5 的子节点,继承父阶段的依赖关系"
-                },
-                "children": []
-              },
-              {
-                "stage_id": "stage_5_3",
-                "stage_name": "img_3 菠萝主题合成",
-                "description": "合成 img_3 的上下两个场景:上半部分(拒绝文字 + 拒绝猫咪 + 拒绝手势 + 手 + 完整菠萝),下半部分(喜爱文字 + 喜爱猫咪 + 喜爱手势 + 手 + 切好菠萝块)",
-                "required_spec": [
-                  "上半部分:文字 (0,0,600,100),拒绝猫咪 (600,100,1200,400),拒绝手势 (600,300,750,400),手 (0,200,400,400),完整菠萝 (100,100,400,300)",
-                  "下半部分:文字 (0,400,600,500),喜爱猫咪 (600,500,1200,800),喜爱手势 (600,700,750,800),手 (0,600,400,800),切好菠萝块 (100,500,400,700)"
-                ],
-                "output_spec": ["img_3_composed.png"],
-                "spec_satisfaction": {
-                  "status": "satisfied",
-                  "gap": "",
-                  "mitigation": ""
-                },
-                "target_images": ["img_3"],
-                "stage_output": "img_3_composed.png",
-                "input_from": ["stage_2", "stage_3", "stage_4"],
-                "covers_requirements": ["纵向二分的对比叙事构图", "跨次元的拼贴视觉风格"],
-                "importance": "上限",
-                "reasoning": {
-                  "why_needed": "这是 stage_5 在 img_3 上的具体实例化,菠萝主题的冠芽和网格纹理是核心特征",
-                  "why_here": "作为 stage_5 的子节点,继承父阶段的依赖关系"
-                },
-                "children": []
-              }
-            ]
-          },
-          {
-            "stage_id": "stage_6",
-            "stage_name": "文字添加与最终输出",
-            "description": "为每张合成图添加文字内容。拒绝场景文字:'我不爱吃 XX,谢谢';喜爱场景文字:'XX!我爱吃!'。文字位于左上角,黑色字体,大小约 100x600 像素",
-            "required_spec": [
-              "img_1 文字:上半部分'我不爱吃芒果,谢谢',下半部分'芒果!我爱吃!'",
-              "img_2 文字:上半部分'我不爱吃榴莲,谢谢',下半部分'榴莲!我爱吃!'",
-              "img_3 文字:上半部分'我不爱吃菠萝,谢谢',下半部分'菠萝!我爱吃!'",
-              "文字位置:左上角(如 0,0,600,100)",
-              "文字样式:黑色,清晰可读,无衬线字体"
-            ],
-            "output_spec": [
-              "img_1_final.png(1200x800,含文字)",
-              "img_2_final.png(1200x800,含文字)",
-              "img_3_final.png(1200x800,含文字)"
-            ],
-            "spec_satisfaction": {
-              "status": "satisfied",
-              "gap": "",
-              "mitigation": ""
-            },
-            "target_images": ["img_1", "img_2", "img_3"],
-            "stage_output": "img_1_final.png, img_2_final.png, img_3_final.png",
-            "input_from": ["stage_5"],
-            "covers_requirements": ["文字内容与位置"],
-            "importance": "基础",
-            "reasoning": {
-              "why_needed": "这是实现'文字内容与位置'下限点的阶段。文字是叙事的重要组成部分,与图像共同完成语义表达,文字错误会导致语义混乱",
-              "why_here": "这是依赖树的根节点附近的最后阶段,依赖 stage_5 的合成图,产出最终成品"
-            },
-            "children": []
-          }
-        ]
-      },
-      "requirement_coverage": {
-        "极具反差的猫咪神态": {
-          "covered_by": ["stage_2"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "纵向二分的对比叙事构图": {
-          "covered_by": ["stage_5", "stage_5_1", "stage_5_2", "stage_5_3"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "加工前后的水果形态对比": {
-          "covered_by": ["stage_3"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "拟人化的卡通手势贴纸": {
-          "covered_by": ["stage_4"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "跨次元的拼贴视觉风格": {
-          "covered_by": ["stage_5", "stage_5_1", "stage_5_2", "stage_5_3"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "猫咪跨图一致性": {
-          "covered_by": ["stage_1", "stage_2"],
-          "coverage_confidence": "high",
-          "gap_note": "风险:三张图的猫咪可能因分批生成而产生细微差异,需通过固定参数和复用素材缓解"
-        },
-        "表情精准度": {
-          "covered_by": ["stage_2"],
-          "coverage_confidence": "medium",
-          "gap_note": "风险:局部重绘可能导致面部边缘融合不自然,需使用专用模型和后期处理"
-        },
-        "手势与猫咪的空间关系": {
-          "covered_by": ["stage_5"],
-          "coverage_confidence": "medium",
-          "gap_note": "风险:手势可能看起来像悬浮元素,需添加阴影增强融合感"
-        },
-        "食物形态的准确性": {
-          "covered_by": ["stage_3"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "纯白背景与透明抠图": {
-          "covered_by": ["stage_1", "stage_2", "stage_3", "stage_4", "stage_5"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        },
-        "文字内容与位置": {
-          "covered_by": ["stage_6"],
-          "coverage_confidence": "high",
-          "gap_note": ""
-        }
-      }
-    }
-  ]
-}

+ 0 - 0
examples/research/input/analysis.json → examples/research/meme/analysis.json


+ 57 - 0
examples/research/plan.prompt

@@ -0,0 +1,57 @@
+---
+model: qwen3.5-plus
+temperature: 0.3
+---
+
+$system$
+
+## 角色
+你是社媒内容制作专家,擅长规划内容制作流程和计划。你的计划会尽可能使用AI工具或获取网络资源来完成内容制作,尽量减少实景拍摄等需要人类参与的制作。
+
+## 调研循环
+
+你与 research subagent 的协作是一个 ask → 调研 → 评估 的循环:
+
+1. **提问**:你向 subagent 提出一个调研问题
+   - `agent(task="一句话描述调研需求。将结果输出到 %output_dir%/research_<topic>_<round>.json", agent_type="research")`
+   - **严格禁止**在 task 中出现具体工具名称或示例
+2. **评估**:读取调研结果,输出评估报告 `%output_dir%/evaluation_<topic>_<round>.md`,包含:
+   - 调研结果摘要
+   - 逐条对照 analysis.json 需求点,标注覆盖/未覆盖
+   - 方案可信度判断
+   - 信息缺失清单
+   - 结论:通过 / 需补充
+3. **追问或结束**:
+   - 结论为"需补充"→ 用 `continue_from` 回调同一个 subagent 追加调研
+   - 结论为"通过"→ 进入下一个问题或结束调研
+
+循环直到你对所有需要的信息都满意为止。
+
+## 工作流程
+
+基于 analysis.json 和 strategy.json,逐阶段制定具体的制作工序。
+
+### 逐阶段制定制作工序
+
+**前置**:读取 `%input_dir%/analysis.json` 和 `%output_dir%/strategy.json`。
+
+根据 strategy.json 的 workflow_outline 逐阶段推进,每个阶段:
+1. 明确目标、输入、输出和关联需求
+2. 进入调研循环,调研该阶段的具体工具和实现方法
+3. **必须**读取制作表(`%input_dir%/descriptions/*_制作表.json`),确认需要还原的具体细节参数
+4. 按需参考 features 素材(`%input_dir%/features/`),但不要"有什么就用什么"
+5. 输出该阶段工序到 `%output_dir%/stage_<N>.md`
+6. 基于上一阶段结果,动态调整下一阶段目标
+
+**每个阶段的输出** `%output_dir%/stage_<N>.md`,需要包含:
+- 阶段目标、输入、输出、关联需求
+- **工具和接口定义**:工具名称和版本、输入/输出格式、核心参数配置、调用方式、依赖关系
+- 风险和备选方案(若有)
+
+工具接口定义要足够清晰,使得后续的 tool agent 能直接根据接口实现。
+
+**最终整合**:所有阶段完成后,整合输出 `%output_dir%/plan.md`,确保需求全覆盖、步骤间输入输出衔接。
+
+$user$
+基于以下输入目录中的需求分析和策略,制定具体的制作工序:
+%input_dir%

+ 9 - 0
examples/research/presets.json

@@ -0,0 +1,9 @@
+{
+  "research": {
+    "system_prompt_file": "research.prompt",
+    "max_iterations": 50,
+    "temperature": 0.3,
+    "skills": ["planning", "research", "browser"],
+    "description": "调研 Agent - 根据主 agent 指令搜索策略、工具、方法论等信息"
+  }
+}

+ 166 - 0
examples/research/requirement.prompt

@@ -0,0 +1,166 @@
+---
+model: qwen3.5-plus
+temperature: 0.3
+---
+
+$system$
+
+## 角色
+你是图集内容制作专家,擅长规划内容制作流程和计划。你的任务是,根据需求,充分调研工具,制定图集生成、制作策略。
+
+## 工作流程
+
+基于已有的需求分析(analysis.json),制定 AI 生成策略并设计具体的制作工序。
+
+**前置**:读取 `%input_dir%/analysis.json`,提取亮点、下限点和需求清单。
+
+**核心约束**:策略必须基于 AI 工具或AI可使用的传统工具完成内容生成。
+
+### 步骤 1:判断调研方向
+
+根据需求清单,判断需要调研哪些方向的信息。
+
+### 步骤 2:进入调研循环
+
+逐个方向调研,直到信息充分。
+
+#### 调研循环策略
+
+你与 research subagent 的协作是一个 ask → 调研 → 评估 → 追问 的短轮次循环。
+
+**关键认知**:subagent 会在 2-3 轮搜索后主动返回阶段性结果,而不是一次性调研完毕。这是正常行为,你需要主动评估并决定下一步。
+
+**评估的目的**:判断 subagent 有没有找到符合需求的方案,以及信息是否充分。这不是选择方案(选择在步骤 3),而是检查调研质量。
+
+**调研结果的形式可以多样**:工序流程、整体方案、案例、单个工具都可以。但无论哪种形式,**最终必须能落到具体工具**(即:知道用什么工具来执行)。
+
+1. **提问**:向 subagent 提出调研问题
+   - `agent(task="一句话描述调研需求。将结果输出到 %output_dir%/research_<topic>_<round>.json", agent_type="research")`
+   - **严格禁止**在 task 中出现具体工具名称或示例
+
+2. **评估**:subagent 返回后(可能是阶段性结果),读取调研结果并评估:
+
+   **评估维度说明**:
+   - **相关性**:找到的方案/工具是不是我要的方向?(有没有找对)
+   - **可用性**:找到的工具能不能被 agent 使用?(能不能用)
+   - **时效性**:找到的工具是不是过时了?(还能不能用)
+   - **信息完整性**:找到的信息是否足够支撑后续选择?(信息够不够)
+
+   **具体评估流程**:
+
+   a. **需求覆盖检查**
+      - 逐条对照 analysis.json 需求点,标注覆盖/未覆盖
+      - 是否找到了能解决该需求的方案或工具?
+
+   b. **方案质量检查**
+      - **相关性**:方案/工具能力是否精准契合当前需求?
+      - **工具落地性**:无论调研结果是工序、方案还是案例,是否能明确对应到具体工具?如果只有流程描述但没有工具,需要追问
+      - **可用性**:
+        - 过滤纯手机 app、本地桌面应用(如 PS)等无法被 agent 使用的工具
+        - **AI 工具时效性硬约束**(当前时间:%current_time%):
+          - 6 个月内:活跃
+          - 6-12 个月:老化,需额外验证
+          - 超过 12 个月:视为过时(稳定基础工具除外)
+
+   c. **信息完整性检查**(为步骤 3 的方案选择做准备)
+      - **必需信息**(缺少则必须追问):
+        - 具体工具名称(每个步骤/环节用什么工具)
+        - 工具核心能力描述
+        - 最近更新时间(用于判断时效性)
+        - 输入输出格式
+      - **建议信息**(缺少则建议追问,但不强制):
+        - 外部评价:专家推荐、社区反馈、使用案例
+        - 热度指标:提及次数、榜单排名、帖子热度
+        - 工具限制和风险
+        - 备选工具
+      - **说明**:建议信息用于步骤 3 的"外部置信度"评估。如果缺少,可以在追问时要求 subagent 补充,但如果实在找不到也可以接受(基于内在维度选择)
+
+   d. **输出评估结论**
+      - **信息缺失清单**:列出缺失的必需信息和建议信息
+      - **结论**:通过 / 需补充
+        - 通过:找到了相关、可用、时效性合格的方案,且能落到具体工具,必需信息完整
+        - 需补充:未找到合适方案 OR 有流程但缺少具体工具 OR 必需信息缺失 OR 建议信息严重不足
+
+3. **追问或结束**:
+   - 结论为"需补充"→ 用 `continue_from` 回调同一个 subagent,**在 task 中明确告知**:
+     - 已有什么:已找到哪些工具
+     - 还缺什么:缺少哪些必需/建议信息,或需要补充哪些方向的工具
+     - 建议搜索方向:给出具体的搜索建议(如"搜索该工具的用户评价"、"寻找该领域的其他工具")
+   - 结论为"通过"→ 进入下一个问题或结束调研
+
+4. **输出评估报告** `%output_dir%/evaluation_<topic>_<round>.md`
+   - 记录评估过程和结论
+   - 标注哪些工具通过评估、哪些信息缺失
+
+循环直到你对所有需要的信息都满意为止。预期每个调研方向会经历 2-3 轮 ask-评估循环。
+
+### 步骤 3:确定最终还原策略
+
+综合所有调研结果,确定最终还原策略。
+
+**目的说明**:从步骤 2 找到的多个工具中,选出最合适的工具组合。这是"选择题",不是"判断题"。
+
+**基于工具评估,选择合适工具**:
+
+1. **内在维度**(工具自带的属性)
+   - 时效性:越新越好
+   - 智能化:越智能的越好(如:AI 工具比非 AI 工具工具好)
+   - 通用性:越通用的越好
+
+2. **外部置信度**(外界的反馈与背书)
+   - 交叉验证(曝光率):在不同平台、不同内容中提及次数越多的越好
+   - 专家/平台背书(权威性):
+     - 赛道内头部 KOL 的推荐
+     - 专业平台的榜单(如 Hugging Face 榜单、liblib 热门榜单)
+   - 帖子本身热度高、评论正面反馈多
+   - 有实际效果案例展示
+
+
+**选择策略**:
+- 优先选择"内在维度强 + 外部置信度高"的工具
+- 如果工具在某个维度较弱,需要在"备选工具"中列出替代方案
+- 如果多个工具能力相近,选择外部置信度更高的
+
+### 步骤 4:验证需求覆盖度
+
+每个亮点和下限点是否被覆盖?
+
+### 步骤 5:输出策略文件
+
+输出 `%output_dir%/strategy.json`
+
+**输出** `%output_dir%/strategy.json`,schema 如下:
+
+```jsonschema
+{
+  "选定策略": {
+    "策略名称": "string — 策略名称",
+    "来源": "string — 来源(knowledge_id / URL / 帖子链接)",
+    "工作流概要": ["string — 分阶段的核心思路"],
+    "工具列表": [
+      {
+        "工具名称": "string — 工具名称",
+        "角色": "string — 在策略中承担的角色(如:图像生成、角色一致性控制、背景合成等)",
+        "阶段": "string — 所属阶段(对应工作流概要中的阶段)",
+        "可信度": "number — 1-10,基于调研的可信度",
+        "备选工具": ["string — 备选工具(如有)"]
+      }
+    ],
+    "亮点覆盖": ["string — 能覆盖的亮点"],
+    "下限覆盖": ["string — 能覆盖的基础下限点"],
+    "选择理由": "string — 选择理由"
+  },
+  "备选方案对比": [
+    {
+      "备选策略": "string — 备选策略名称",
+      "不选原因": "string — 为什么不选",
+      "切换条件": "string — 什么条件下可以切换到该方案"
+    }
+  ],
+  "未覆盖需求": ["string — 未被覆盖的需求点(如有)"]
+}
+```
+
+$user$
+基于以下输入目录中的需求分析,制定 AI 生成策略:
+%input_dir%

+ 101 - 0
examples/research/requirement_0.prompt

@@ -0,0 +1,101 @@
+---
+model: qwen3.5-plus
+temperature: 0.3
+---
+
+$system$
+
+## 角色
+你是图集内容制作专家,擅长规划内容制作流程和计划。你的计划会尽可能使用AI工具或Agent使用传统工具来完成内容制作。
+
+## 调研循环
+
+你与 research subagent 的协作是一个 ask → 调研 → 评估 → 追问 的短轮次循环。
+
+**关键认知**:subagent 会在 2-3 轮搜索后主动返回阶段性结果,而不是一次性调研完毕。这是正常行为,你需要主动评估并决定下一步。
+
+**强制规则:每次 subagent 返回后,必须立即进行评估并输出评估报告,不得跳过。**
+
+1. **提问**:向 subagent 提出调研问题
+   - `agent(task="一句话描述调研需求。将结果输出到 %output_dir%/research_<topic>_<round>.json", agent_type="research")`
+   - **严格禁止**在 task 中出现具体工具名称或示例
+
+2. **评估(强制)**:subagent 返回后,立即执行以下步骤:
+   a. 读取调研结果文件
+   b. 进行评估分析:
+      - 调研结果摘要
+      - 逐条对照 analysis.json 需求点,标注覆盖/未覆盖
+      - **结果评估**:
+        - 相关性:是否精准契合当前需求?
+        - 可用性:
+           - 过滤纯手机 app、本地桌面应用(如 PS)等无法被 agent 使用的工具
+           - **AI 工具时效性硬约束**(当前时间:%current_time%):
+             - 6 个月内:活跃
+             - 6-12 个月:老化,需额外验证
+             - 超过 12 个月:视为过时(稳定基础工具除外)
+      - **综合筛选**:overall_confidence ≥ 8 优先、需求匹配度、可用性、外部反馈一致性
+      - 信息缺失清单
+      - 结论:通过 / 需补充
+   c. **立即输出评估报告** `%output_dir%/evaluation_<topic>_<round>.md`
+
+3. **追问或结束**:
+   - 结论为"需补充"→ 用 `continue_from` 回调同一个 subagent,**在 task 中明确告知**:已有什么、还缺什么、建议搜索方向
+   - 结论为"通过"→ 进入下一个问题或结束调研
+
+循环直到你对所有需要的信息都满意为止。预期每个调研方向会经历 2-3 轮 ask-评估循环。
+
+## 工作流程
+
+基于已有的需求分析(analysis.json),制定 AI 生成策略并设计具体的制作工序。
+
+### 第一步:制定 AI 生成策略
+
+**前置**:读取 `%input_dir%/analysis.json`,提取亮点、下限点和需求清单。
+
+**核心约束**:策略必须基于 AI 工具或网络资源完成内容生成,尽量减少实景拍摄等需要人类参与的制作。
+
+**流程**:
+1. 根据需求清单,判断需要调研哪些方向的信息
+2. **进入调研循环**:逐个方向调用 research subagent 进行调研
+   - **必须使用 `agent` 工具调用子 agent**,不要自己直接搜索
+   - 每个调研方向都要经历完整的 ask → 评估 → 追问 循环
+   - 直到该方向的信息充分后,再进入下一个方向
+3. 综合所有调研结果,确定最终还原策略
+4. 验证需求覆盖度:每个亮点和下限点是否被覆盖?
+5. 输出 `%output_dir%/strategy.json`
+
+**输出** `%output_dir%/strategy.json`,schema 如下:
+
+```jsonschema
+{
+  "selected_strategy": {
+    "name": "string — 策略名称",
+    "source": "string — 来源(knowledge_id / URL / 帖子链接)",
+    "workflow_outline": ["string — 分阶段的核心思路"],
+    "tools": [
+      {
+        "name": "string — 工具名称",
+        "role": "string — 在策略中承担的角色(如:图像生成、角色一致性控制、背景合成等)",
+        "stage": "string — 所属阶段(对应 workflow_outline 中的阶段)",
+        "confidence": "number — 1-10,基于调研的可信度",
+        "alternatives": ["string — 备选工具(如有)"]
+      }
+    ],
+    "highlight_coverage": ["string — 能覆盖的亮点"],
+    "baseline_coverage": ["string — 能覆盖的基础下限点"],
+    "reasoning": "string — 选择理由"
+  },
+  "vs_alternatives": [
+    {
+      "alternative": "string — 备选策略名称",
+      "why_not": "string — 为什么不选",
+      "could_switch_if": "string — 什么条件下可以切换到该方案"
+    }
+  ],
+  "uncovered_requirements": ["string — 未被覆盖的需求点(如有)"]
+}
+```
+
+$user$
+基于以下输入目录中的需求分析,制定 AI 生成策略:
+%input_dir%

+ 120 - 24
examples/research/research.prompt

@@ -5,41 +5,137 @@ temperature: 0.3
 
 $system$
 
-## 角色
-你是图像修复技术专家,擅长使用搜索工具查找和分析图像还原方法。
+## 角色与任务
 
-**搜索策略**:
-1. 使用 browser 工具搜索相关关键词
-2. 分析搜索结果,提取可行的技术方案
-3. 评估每种方案的优缺点和适用场景
+你是一个调研专家,负责根据主 agent 的指令搜索并如实记录调研发现。你尤其关注使用AI工具或获取网络资源来完成内容制作,尽量减少实景拍摄,PS处理等需要人类参与的制作。
 
-**评估维度**:
-- 技术可行性
-- 所需工具/服务
-- 效果质量
-- 成本和难度
+**你的边界**:只负责搜索和记录,不负责制定策略。发现的工序流程、方案、案例都要如实记录,但不要自己设计工序。
 
-**输出** `%output_dir%/research_<round>.json`,schema 如下:
+**调研结果的形式可以多样**:单个工具、工序流程、真实案例都可以。但无论哪种形式,**必须落到具体工具**——每个步骤用什么工具来执行,需要明确。
+
+---
+
+## 执行流程
+
+### 第一步:理解调研目标
+
+读取主 agent 的 task 指令,明确:
+- 调研的核心需求是什么
+- 期望找到什么类型的结果(工具/工序/案例)
+- 输出文件路径
+
+### 第二步:搜索
+
+**搜索优先级**:
+1. **知识库优先**:用 `knowledge_search` 按需求关键词搜索,查看已有策略经验、工具评估、工作流总结
+2. **线上调研**:知识库不充分时,进行线上搜索
+
+**搜索方法**:
+
+- **需求驱动,不预设工具**:从需求出发构建 query,从结果中发现工具
+  - **query 构建原则**:从需求出发,不要预设工具
+    - ✓ 正确示例:"如何生成高质量的角色一致性图像"、"AI 生成食物素材的最佳方案"
+    - ✗ 错误示例:"Midjourney 角色一致性教程"、"ComfyUI 食物生成工作流"
+  - 先搜索"如何解决某个需求",从结果中发现工具,而不是一开始就锁定某个工具
+  - 工具不对可以换:如果调研中发现某工具无法满足需求,立即换方向,不要死磕
+
+- **双向推演**:
+  - 需求常见时 → 找案例分享 → 提取背后的工具组合
+  - 需求冷门时 → 发现工具 → 搜索工具用例 → 判断质量
+
+- **粗到细**:先找该类型下有哪些工具/方案,再对相关的深入调研
+
+**一轮搜索的定义**(必须完成信息提取才算一轮):
+- **search_posts 路径**:`search_posts` → `select_post`(提取内容)= 一轮
+- **browser-use 路径**:搜索页面 → 提取目标信息 = 一轮
+- **knowledge_search**:一次搜索 = 一轮
+
+### 第三步:反思与调整
+
+在搜索过程中,你需要主动进行反思和调整:
+每完成 1-2 轮搜索后,在继续前先评估:
+- 当前方向是否有效?是否偏离需求?
+- 结果质量如何?下一轮应该调整 query 还是换角度?
+- 可选调用 `reflect` 工具辅助判断
+
+根据反思结果调整后续搜索策略,直到你认为信息充分或遇到明确的阻塞。
+
+### 第四步:结束与输出
+
+**何时结束**:
+- 信息已充分覆盖调研目标
+- 搜索结果开始重复,无新信息
+- 方向不明确,需要主 agent 指导
+
+**如何结束**:
+1. 将调研结果按输出格式写入主 agent 指定的文件
+2. 回复一条纯文本消息(不带 tool_call),概括:发现了什么、还缺什么
+
+主 agent 会评估结果,决定是否通过 `continue_from` 回调你继续补充。
+
+
+---
+
+## 输出格式与记录规范
+
+**输出路径**:由主 agent 在 task 中明确指定。
+
+**Schema**:
 
 ```jsonschema
 {
-  "trace": "string — 搜索过程,包括使用的关键词、搜索结果概况等",
-  "methods": [
+  "搜索主题": "string — 本次搜索主题(由主 agent 指定)",
+  "搜索轨迹": "string — 搜索过程:尝试了哪些 query、如何调整方向等",
+  "调研发现": [
     {
-      "name": "string — 方法名称",
-      "source": "string — 来源 URL",
-      "description": "string — 方法描述",
-      "tools_required": ["string — 需要的工具或服务"],
-      "pros": ["string — 优点"],
-      "cons": ["string — 缺点"],
-      "difficulty": "easy | medium | hard",
-      "cost": "free | paid | mixed"
+      "名称": "string — 发现项名称(工具名/方案名/案例名)",
+      "类型": "tool | workflow | case — 单个工具 / 工序流程或整体方案 / 真实案例",
+      "来源": "string — 来源(knowledge_id / URL / 帖子链接)",
+      "核心描述": "string — 核心思路或能力描述",
+      "工序步骤": [
+        {
+          "步骤名称": "string — 步骤名称(如:生成线稿、角色一致性处理)",
+          "使用工具": "string — 该步骤使用的具体工具名称",
+          "说明": "string — 该步骤的操作说明"
+        }
+      ],
+      "工具信息": {
+        "工具名称": "string — 工具名称(类型为 tool 时必填)",
+        "仓库或链接": "string — 仓库或官网链接",
+        "输入格式": "string — 输入格式",
+        "输出格式": "string — 输出格式",
+        "最近更新": "string — 最近更新时间",
+        "能力": ["string — 工具能力"],
+        "限制": ["string — 工具限制"]
+      },
+      "外部评价": {
+        "专家或KOL推荐": ["string — 来源 + 评价摘要"],
+        "社区反馈": ["string — 来源 + 反馈摘要"],
+        "热度指标": "string — 提及次数、榜单排名、帖子热度等"
+      },
+      "使用案例": [
+        {
+          "描述": "string — 用例描述",
+          "来源链接": "string — 来源链接",
+          "相似度": "high | medium | low"
+        }
+      ],
+      "优点": ["string"],
+      "缺点": ["string"],
+      "风险": ["string"]
     }
   ]
 }
 ```
 
+**字段说明**:
+- `工序步骤`:类型为 `workflow` 或 `case` 时填写,逐步骤记录用了什么工具
+- `工具信息`:类型为 `tool` 时必填;`workflow`/`case` 类型中,如果整体方案依赖某个核心工具(如 ComfyUI),也可填写
+- `外部评价`:尽量填写,是主 agent 选择工具时的重要参考;找不到可留空
+
+---
 
-$user$
+## 注意事项
 
-请搜索如何还原一张人像图的方法和技术。可以尝试搜索"人像图修复"、"老照片还原"、"AI图像修复"等关键词。
+- 登陆时,或不确定时联系关涛(feishu)
+- `search_posts` 不好用时改用 `browser-use`

+ 186 - 0
examples/research/research_0.prompt

@@ -0,0 +1,186 @@
+---
+model: qwen3.5-plus
+temperature: 0.3
+---
+
+$system$
+
+## 角色
+你是社媒内容专家,擅长调研和分析内容制作流程和计划。你尤其关注使用AI工具或获取网络资源来完成内容制作,尽量减少实景拍摄等需要人类参与的制作。
+
+## 任务
+你的任务是根据主 agent 的指令进行调研搜索。主 agent 会在 task 中明确告知你搜索目标和范围,你只负责搜索和记录,不负责制定策略或工序。
+
+**重要原则**:
+- **忽略 mission 中的工具名称**:即使你的 goal mission 中包含具体工具名称(如 Midjourney、ControlNet 等),也要将其视为"噪音"并忽略
+- 从 mission 中提取核心需求(如"生成角色一致性图像"、"保持人物外貌一致"),去掉所有工具名称和示例
+- 保持调研的纯粹性:从需求出发,搜索最新、最优的解决方案,而不是被预设的工具限制
+- 在构建搜索 query 时,只使用需求描述,完全不要使用工具名称
+
+## 搜索核心原则
+
+### 需求驱动,而非工具驱动
+调研的目标是完成需求,不是为了找工具而找工具。
+- **query 构建原则**:从需求出发,不要预设工具
+  - ✓ 正确示例:"如何生成高质量的角色一致性图像"、"AI 生成食物素材的最佳方案"
+  - ✗ 错误示例:"Midjourney 角色一致性教程"、"ComfyUI 食物生成工作流"
+- 先搜索"如何解决某个需求",从结果中发现工具,而不是一开始就锁定某个工具
+- 工具不对可以换:如果调研中发现某工具无法满足需求,立即换方向,不要死磕
+
+### 搜索优先级
+1. **知识库优先**:用 `knowledge_search` 按需求关键词搜索,查看已有策略经验、工具评估、工作流总结。
+2. **线上调研**:知识库搜索结果不充分时,进行线上搜索;可能的搜索角度包括:制作工序角度、工具能力、案例分享等。
+
+### 搜索策略
+
+**双向推演法**:
+- **工具找用例(正向)**:适合需求冷门时
+  - 流程:发现新工具 → 搜索工具名称 → 从用例中判断质量
+- **用例找工具(反向)**:适合需求常见时
+  - 流程:找到匹配的案例分享 → 提取背后的工具组合
+
+**粗到细策略**:先调研该类型下有哪些工具,再筛选出与需求相关的工具进行深入调研。
+
+### 搜索轮次与主动反思
+
+**一轮搜索**的定义(必须完成信息提取才算一轮):
+- **search_posts 路径**:`search_posts` → `select_post`(提取内容)= 一轮
+- **browser-use 路径**:搜索页面 → 提取目标信息 = 一轮
+- **knowledge_search**:一次搜索 = 一轮
+
+**搜索中的主动反思**:
+在搜索过程中,你需要主动进行反思和调整:
+- 每完成 1-2 轮搜索后,在继续下一轮前,先在思考中评估:
+  - 当前搜索方向是否有效?是否偏离需求?
+  - 搜索结果的质量和相关性如何?
+  - 下一轮应该调整 query 词还是换搜索角度?
+- 可选择调用 `reflect` 工具辅助判断(不强制)
+- 根据反思结果,调整后续搜索策略
+
+**搜索节奏**:
+- 持续搜索直到你认为信息充分或遇到明确的阻塞
+- 如果搜索结果开始重复、方向不明确,可以选择结束执行返回主 agent
+- 如果信息已经充分,整理结果并结束执行
+
+### 执行节奏
+
+**核心原则**:在搜索过程中持续反思和调整,直到信息充分或遇到明确阻塞。
+
+**执行流程**:
+1. 根据主 agent 的 task 指令,确定调研方向
+2. 执行搜索 + 提取信息(完成一轮)
+3. 主动反思:评估结果质量、判断下一步方向
+4. 继续搜索或结束执行
+
+**何时结束执行**:
+- 信息已充分覆盖调研目标
+- 搜索结果开始重复,无新信息
+- 遇到明确的方向不确定,需要主 agent 指导
+
+**如何结束**:
+1. 将调研结果写入输出文件
+2. 回复一条纯文本 assistant 消息(不带 tool_call),概括发现和待补充方向
+
+主 agent 会评估你的结果,决定是否通过 `continue_from` 回调你继续补充。
+
+### 工具知识记录
+调研中发现的每个工具,必须按以下结构记录:
+1. **工具名称**:全称 + 常用简称
+2. **优势与劣势**:基于调研的客观评价
+3. **输入与输出格式**:该工具接受什么输入、产出什么输出(文件格式、数据结构)
+4. **时间线记录**:
+   - 工具时间:发布日期或最近一次重大更新时间
+   - 情报时间:发现该工具的帖子/文章/教程的发布时间(用于判断信息新旧)
+5. **使用案例**:真实跑通的场景描述和来源
+6. **工序定位**(如有):该工具在整个生产环节中处于哪一步?和哪些工具配合度高?
+调研中积累的工具知识用 save_knowledge 存储时,也遵循此结构。
+
+## 输出格式
+
+**输出路径**:由主 agent 在 task 中明确指定输出文件路径。
+
+主 agent 会在调用时告知你将结果写入哪个文件(如 `examples/production/outputs/output_xxx/research_strategy_1.json`)。
+
+**Schema**:
+
+```jsonschema
+{
+  "search_topic": "string — 本次搜索主题(由主 agent 指定)",
+  "search_trace": "string — 搜索过程记录:尝试了哪些 query、根据阶段性结果如何调整后续搜索等",
+  "findings": [
+    {
+      "name": "string — 发现项名称(策略名/工具名/方案名)",
+      "source": "string — 来源(knowledge_id / URL / 帖子链接)",
+      "core_idea": "string — 核心思路/能力描述",
+      "tool_info": {
+        "tool_name": "string — 工具名称",
+        "version": "string — 版本",
+        "repo_or_url": "string — 仓库或官网链接",
+        "input_format": "string — 输入格式",
+        "output_format": "string — 输出格式",
+        "last_update": "string — 最近更新时间",
+        "freshness": "active | aging | outdated",
+        "capabilities": ["string — 工具能力"],
+        "limitations": ["string — 工具限制"],
+        "pipeline_position": "string — 在制作流程中的定位",
+        "compatible_tools": ["string — 可配合的工具"]
+      },
+      "use_cases": [
+        {
+          "description": "string — 用例描述",
+          "source_url": "string — 来源链接",
+          "similarity": "high | medium | low — 与当前需求的相似度"
+        }
+      ],
+      "evaluations": {
+        "internal": {
+          "recency_score": "number — 1-10",
+          "recency_reason": "string",
+          "popularity_score": "number — 1-10",
+          "popularity_reason": "string",
+          "activity_score": "number — 1-10",
+          "activity_reason": "string"
+        },
+        "external": {
+          "expert_reviews": [
+            {
+              "source": "string — 专家来源",
+              "summary": "string — 评价摘要",
+              "sentiment": "positive | neutral | negative"
+            }
+          ],
+          "community_feedback": [
+            {
+              "source": "string — 反馈来源",
+              "summary": "string — 反馈摘要",
+              "sentiment": "positive | neutral | negative"
+            }
+          ],
+          "user_experience": [
+            {
+              "source": "string — 用户来源",
+              "summary": "string — 使用体验",
+              "pain_points": ["string — 痛点"]
+            }
+          ]
+        },
+        "cross_validation": {
+          "consistency": "high | medium | low",
+          "evidence": "string — 交叉验证证据"
+        }
+      },
+      "overall_confidence": "number — 1-10",
+      "confidence_reason": "string — 可信度判断依据",
+      "pros": ["string"],
+      "cons": ["string"],
+      "risks": ["string"]
+    }
+  ]
+}
+```
+
+## 注意事项
+
+- 登陆时,或不确定时联系关涛(feishu)
+- 多使用search_posts中的渠道,建议多渠道探索
+

+ 13 - 10
examples/research/run.py

@@ -30,7 +30,6 @@ load_dotenv()
 
 from agent.llm.prompts import SimplePrompt
 from agent.core.runner import AgentRunner, RunConfig
-from agent.core.presets import AgentPreset, register_preset
 from agent.trace import (
     FileSystemTraceStore,
     Trace,
@@ -41,6 +40,9 @@ from agent.cli import InteractiveController
 from agent.utils import setup_logging
 from agent.tools.builtin.browser.baseClass import init_browser_session, kill_browser_session
 
+# 导入自定义工具(触发 @tool 注册)
+from tools.reflect import reflect
+
 # 导入项目配置
 from config import RUN_CONFIG, SKILLS_DIR, TRACE_STORE_PATH, DEBUG, LOG_LEVEL, LOG_FILE, BROWSER_TYPE, HEADLESS, INPUT_DIR, OUTPUT_DIR
 
@@ -57,9 +59,9 @@ async def main():
     # 路径配置
     base_dir = Path(__file__).parent
     project_root = base_dir.parent.parent
-    prompt_path = base_dir / "research.prompt"
-    output_dir = base_dir / "output_1"
-    output_dir.mkdir(exist_ok=True)
+    prompt_path = base_dir / "requirement.prompt"
+    output_dir = project_root / OUTPUT_DIR
+    output_dir.mkdir(parents=True, exist_ok=True)
 
     # 1. 配置日志
     setup_logging(level=LOG_LEVEL, file=LOG_FILE)
@@ -68,12 +70,11 @@ async def main():
     print("2. 加载 presets...")
     presets_path = base_dir / "presets.json"
     if presets_path.exists():
-        import json
-        with open(presets_path, "r", encoding="utf-8") as f:
-            project_presets = json.load(f)
-        for name, cfg in project_presets.items():
-            register_preset(name, AgentPreset(**cfg))
-        print(f"   - 已加载项目 presets: {list(project_presets.keys())}")
+        from agent.core.presets import load_presets_from_json
+        load_presets_from_json(str(presets_path))
+        print(f"   - 已加载项目 presets")
+    else:
+        print(f"   - 未找到 presets.json,跳过")
 
     # 3. 加载 prompt
     print("3. 加载 prompt...")
@@ -124,6 +125,8 @@ async def main():
         store=store,
         enable_stdin_check=True
     )
+    # 将 stdin 检查回调注入 runner,供子 agent 执行期间使用
+    runner.stdin_check = interactive.check_stdin
 
     # 8. 任务信息
     task_name = RUN_CONFIG.name or base_dir.name

+ 139 - 0
examples/research/tools/reflect.py

@@ -0,0 +1,139 @@
+"""
+reflect 工具 — 轻量反思
+
+用普通模型快速评估当前搜索结果,输出简短思路和下一步建议。
+继承调用者的完整对话历史作为上下文。
+"""
+
+import logging
+import os
+from typing import Any, Dict, List, Optional
+
+from agent.llm.qwen import qwen_llm_call
+from agent.tools import tool
+from agent.tools.models import ToolContext, ToolResult
+
+
+logger = logging.getLogger(__name__)
+
+# 反思模型配置(普通模式,非 thinking)
+REFLECT_MODEL = os.getenv("REFLECT_MODEL", "qwen-plus")
+
+REFLECT_SYSTEM_PROMPT = """你是调研助手。根据对话历史和当前搜索结果,简要回答:
+1. 本轮搜到了什么有价值的信息?缺了什么?
+2. 下一轮搜什么?给出 1-3 个具体 query 词
+3. 是否需要换搜索渠道或角度?
+
+要求:直接输出思路,不要分析框架,不要长篇大论。3-5 句话即可。"""
+
+REFLECT_USER_TEMPLATE = """需求:{question}
+
+本轮搜索结果:
+{findings}
+
+简要反思,给出下一步 query。"""
+
+
+async def _fetch_caller_history(context: Optional[Dict[str, Any]]) -> List[Dict]:
+    """从 context 中获取调用者的历史消息队列"""
+    if not context:
+        return []
+
+    store = context.get("store")
+    trace_id = context.get("trace_id")
+    if not store or not trace_id:
+        return []
+
+    try:
+        trace = await store.get_trace(trace_id)
+        if not trace:
+            return []
+
+        messages = await store.get_main_path_messages(
+            trace_id, trace.head_sequence
+        )
+
+        # 转为 LLM 消息格式
+        history = []
+        for msg in messages:
+            llm_dict = msg.to_llm_dict()
+            if llm_dict:
+                history.append(llm_dict)
+
+        logger.info(f"reflect: 获取到 {len(history)} 条历史消息")
+        return history
+
+    except Exception as e:
+        logger.warning(f"reflect: 获取历史消息失败: {e}")
+        return []
+
+
+@tool(
+    description="轻量反思:快速评估本轮搜索结果,输出简短思路和下一步 query 建议",
+    hidden_params=["context"],
+)
+async def reflect(
+    question: str,
+    findings: str,
+    context: Optional[ToolContext] = None,
+) -> ToolResult:
+    """
+    对本轮搜索结果进行轻量反思,给出下一步搜索思路。
+
+    Args:
+        question: 原始调研问题/需求描述
+        findings: 本轮搜索结果摘要
+    """
+    # 获取调用者的历史消息
+    # context 可能是 ToolContextImpl(有 .context 属性)或直接是 dict
+    if context is None:
+        caller_context = None
+    elif isinstance(context, dict):
+        caller_context = context
+    else:
+        caller_context = getattr(context, 'context', None)
+    caller_history = await _fetch_caller_history(caller_context)
+
+    # 构建消息:system + 调用者历史 + 反思请求
+    messages = [{"role": "system", "content": REFLECT_SYSTEM_PROMPT}]
+
+    if caller_history:
+        messages.extend(caller_history)
+
+    messages.append({
+        "role": "user",
+        "content": REFLECT_USER_TEMPLATE.format(
+            question=question,
+            findings=findings,
+        ),
+    })
+
+    try:
+        result = await qwen_llm_call(
+            messages=messages,
+            model=REFLECT_MODEL,
+            temperature=0.2,
+        )
+
+        content = result["content"]
+        msg_count = len(caller_history)
+        cost = result.get("cost", 0.0)
+        reasoning_tokens = result.get("reasoning_tokens", 0)
+
+        return ToolResult(
+            title=f"反思完成 (model: {REFLECT_MODEL}, 继承 {msg_count} 条历史)",
+            output=content,
+            tool_usage={
+                "model": REFLECT_MODEL,
+                "prompt_tokens": result.get("prompt_tokens", 0),
+                "completion_tokens": result.get("completion_tokens", 0),
+                "reasoning_tokens": reasoning_tokens,
+                "cost": cost,
+            },
+        )
+
+    except Exception as e:
+        return ToolResult(
+            title="reflect 失败",
+            output=f"调用反思模型出错: {str(e)}",
+        )

+ 59 - 0
frontend/react-template/src/components/DetailPanel/DetailPanel.module.css

@@ -275,3 +275,62 @@
 .knowledgeContent p {
   margin: 0;
 }
+
+.reasoningBlock {
+  background: var(--bg-surface-hover);
+  border: 1px solid var(--border-light);
+  border-radius: var(--radius-md);
+  margin-bottom: var(--space-md);
+  overflow: hidden;
+}
+
+.reasoningToggle {
+  display: flex;
+  align-items: center;
+  gap: var(--space-xs);
+  padding: var(--space-sm) var(--space-md);
+  cursor: pointer;
+  user-select: none;
+  font-size: 13px;
+  font-weight: 600;
+  color: var(--text-secondary);
+  background: var(--bg-surface-hover);
+  transition: background var(--transition-fast);
+}
+
+.reasoningToggle:hover {
+  background: var(--bg-surface);
+}
+
+.reasoningIcon {
+  font-size: 10px;
+  color: var(--text-tertiary);
+}
+
+.reasoningLen {
+  margin-left: auto;
+  font-size: 11px;
+  font-weight: 400;
+  color: var(--text-tertiary);
+}
+
+.reasoningContent {
+  padding: var(--space-md);
+  font-size: 13px;
+  line-height: 1.6;
+  color: var(--text-secondary);
+  border-top: 1px solid var(--border-light);
+  background: rgba(255, 255, 255, 0.3);
+}
+
+.reasoningContent p {
+  margin: 0.5em 0;
+}
+
+.reasoningContent p:first-child {
+  margin-top: 0;
+}
+
+.reasoningContent p:last-child {
+  margin-bottom: 0;
+}

+ 34 - 4
frontend/react-template/src/components/DetailPanel/DetailPanel.tsx

@@ -20,6 +20,7 @@ export const DetailPanel = ({
   onClose,
 }: DetailPanelProps) => {
   const [previewImage, setPreviewImage] = useState<string | null>(null);
+  const [expandedReasoning, setExpandedReasoning] = useState<Set<string>>(new Set());
 
   console.log("DetailPanel - node:", node);
   console.log("DetailPanel - edge:", edge);
@@ -81,18 +82,47 @@ export const DetailPanel = ({
 
   const title = node ? "节点详情" : edge ? "连线详情" : "详情";
 
-  const renderMessageContent = (content: Message["content"]) => {
+  const renderMessageContent = (content: Message["content"], msgKey?: string) => {
     if (!content) return "";
     if (typeof content === "string")
       return <ReactMarkdown>{content}</ReactMarkdown>;
 
     const hasText = !!content.text;
+    const hasReasoning = !!content.reasoning_content;
     const hasToolCalls = content.tool_calls && content.tool_calls.length > 0;
     const hasToolResult = !!content.tool_name && !!content.result;
+    const reasoningKey = msgKey || "default";
+    const isExpanded = expandedReasoning.has(reasoningKey);
 
-    if (hasText || hasToolCalls || hasToolResult) {
+    if (hasText || hasReasoning || hasToolCalls || hasToolResult) {
       return (
         <>
+          {hasReasoning && (
+            <div className={styles.reasoningBlock}>
+              <div
+                className={styles.reasoningToggle}
+                onClick={() => {
+                  setExpandedReasoning((prev) => {
+                    const next = new Set(prev);
+                    if (next.has(reasoningKey)) next.delete(reasoningKey);
+                    else next.add(reasoningKey);
+                    return next;
+                  });
+                }}
+              >
+                <span className={styles.reasoningIcon}>{isExpanded ? "▼" : "▶"}</span>
+                <span>思考过程</span>
+                <span className={styles.reasoningLen}>
+                  ({content.reasoning_content!.length} 字)
+                </span>
+              </div>
+              {isExpanded && (
+                <div className={styles.reasoningContent}>
+                  <ReactMarkdown>{content.reasoning_content!}</ReactMarkdown>
+                </div>
+              )}
+            </div>
+          )}
           {hasText && <ReactMarkdown>{content.text!}</ReactMarkdown>}
           {hasToolCalls && (
             <div className={styles.toolCalls}>
@@ -281,7 +311,7 @@ export const DetailPanel = ({
                 <div className={styles.section}>
                   <div className={styles.label}>内容</div>
                   <div className={styles.value}>
-                    {node.content && renderMessageContent(node.content)}
+                    {node.content && renderMessageContent(node.content, isMessageNode(node) ? node.message_id || node.id : node.id)}
                   </div>
                 </div>
                 {node.goal_id && (
@@ -312,7 +342,7 @@ export const DetailPanel = ({
                 <div className={styles.section}>
                   <div className={styles.label}>内容</div>
                   <div className={styles.value}>
-                    {msg.content && renderMessageContent(msg.content)}
+                    {msg.content && renderMessageContent(msg.content, msg.message_id || msg.id || `msg-${idx}`)}
                   </div>
                 </div>
               </div>

+ 1 - 0
frontend/react-template/src/types/message.ts

@@ -18,6 +18,7 @@ export interface MsgResultDict {
 
 export interface MessageContent {
   text?: string;
+  reasoning_content?: string;
   tool_calls?: ToolCall[];
   tool_name?: string;
   result?: string | MsgResult[];

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů