guantao 1 день назад
Родитель
Сommit
437074e1c5

+ 2 - 2
.gitignore

@@ -82,8 +82,8 @@ examples/archive/*
 examples/research/
 examples/research/
 examples/downloader/
 examples/downloader/
 examples/production_restore/features/
 examples/production_restore/features/
-# Milvus data
-knowhub/milvus_data/
+# im-server data
+data/
 
 
 # Vendor (non-submodule)
 # Vendor (non-submodule)
 vendor/browser-use/
 vendor/browser-use/

+ 26 - 2
agent/tools/builtin/knowledge.py

@@ -97,10 +97,13 @@ async def knowledge_search(
     min_score: int = 3,
     min_score: int = 3,
     types: Optional[List[str]] = None,
     types: Optional[List[str]] = None,
     owner: Optional[str] = None,
     owner: Optional[str] = None,
+    requirement_id: Optional[str] = None,
+    capability_id: Optional[str] = None,
+    tool_id: Optional[str] = None,
     context: Optional[ToolContext] = None,
     context: Optional[ToolContext] = None,
 ) -> ToolResult:
 ) -> ToolResult:
     """
     """
-    检索知识(两阶段:语义路由 + 质量精排)
+    检索知识(两阶段:语义路由 + 质量精排;可通过外键精确截断查询范围
 
 
     Args:
     Args:
         query: 搜索查询(任务描述)
         query: 搜索查询(任务描述)
@@ -108,6 +111,9 @@ async def knowledge_search(
         min_score: 最低评分过滤(默认 3)
         min_score: 最低评分过滤(默认 3)
         types: 按类型过滤(user_profile/strategy/tool/usecase/definition/plan)
         types: 按类型过滤(user_profile/strategy/tool/usecase/definition/plan)
         owner: 按所有者过滤(可选,支持多个owner用逗号分隔的字符串,如 "user1@example.com,user2@example.com")
         owner: 按所有者过滤(可选,支持多个owner用逗号分隔的字符串,如 "user1@example.com,user2@example.com")
+        requirement_id: 关系过滤 - 仅搜索关联到此需求ID的知识
+        capability_id: 关系过滤 - 仅搜索关联到此能力ID的知识
+        tool_id: 关系过滤 - 仅搜索关联到此工具ID的知识
         context: 工具上下文
         context: 工具上下文
 
 
     Returns:
     Returns:
@@ -123,6 +129,12 @@ async def knowledge_search(
             params["types"] = ",".join(types)
             params["types"] = ",".join(types)
         if owner:
         if owner:
             params["owner"] = owner
             params["owner"] = owner
+        if requirement_id:
+            params["requirement_id"] = requirement_id
+        if capability_id:
+            params["capability_id"] = capability_id
+        if tool_id:
+            params["tool_id"] = tool_id
 
 
         async with httpx.AsyncClient(timeout=60.0) as client:
         async with httpx.AsyncClient(timeout=60.0) as client:
             response = await client.get(f"{KNOWHUB_API}/api/knowledge/search", params=params)
             response = await client.get(f"{KNOWHUB_API}/api/knowledge/search", params=params)
@@ -396,15 +408,21 @@ async def knowledge_list(
     limit: int = 10,
     limit: int = 10,
     types: Optional[List[str]] = None,
     types: Optional[List[str]] = None,
     scopes: Optional[List[str]] = None,
     scopes: Optional[List[str]] = None,
+    requirement_id: Optional[str] = None,
+    capability_id: Optional[str] = None,
+    tool_id: Optional[str] = None,
     context: Optional[ToolContext] = None,
     context: Optional[ToolContext] = None,
 ) -> ToolResult:
 ) -> ToolResult:
     """
     """
     列出已保存的知识
     列出已保存的知识
-
+    
     Args:
     Args:
         limit: 返回数量限制(默认 10)
         limit: 返回数量限制(默认 10)
         types: 按类型过滤(可选)
         types: 按类型过滤(可选)
         scopes: 按范围过滤(可选)
         scopes: 按范围过滤(可选)
+        requirement_id: 关系过滤 - 仅列出关联到此需求ID的知识
+        capability_id: 关系过滤 - 仅列出关联到此能力ID的知识
+        tool_id: 关系过滤 - 仅列出关联到此工具ID的知识
         context: 工具上下文
         context: 工具上下文
 
 
     Returns:
     Returns:
@@ -416,6 +434,12 @@ async def knowledge_list(
             params["types"] = ",".join(types)
             params["types"] = ",".join(types)
         if scopes:
         if scopes:
             params["scopes"] = ",".join(scopes)
             params["scopes"] = ",".join(scopes)
+        if requirement_id:
+            params["requirement_id"] = requirement_id
+        if capability_id:
+            params["capability_id"] = capability_id
+        if tool_id:
+            params["tool_id"] = tool_id
 
 
         async with httpx.AsyncClient(timeout=30.0) as client:
         async with httpx.AsyncClient(timeout=30.0) as client:
             response = await client.get(f"{KNOWHUB_API}/api/knowledge", params=params)
             response = await client.get(f"{KNOWHUB_API}/api/knowledge", params=params)

+ 0 - 45
consistency_requirements.json

@@ -1,45 +0,0 @@
-{
-  "consistency_check_standards": {
-    "1_character_consistency": {
-      "description": "角色一致性",
-      "criteria": [
-        "面部特征一致",
-        "发型:棕色长发",
-        "肤色一致"
-      ]
-    },
-    "2_costume_consistency": {
-      "description": "服装一致性",
-      "criteria": [
-        "白色长裙",
-        "V 字露背设计",
-        "腰部系带",
-        "轻薄棉麻质地"
-      ]
-    },
-    "3_color_scheme": {
-      "description": "配色方案",
-      "criteria": [
-        "白绿配色",
-        "绿色饱和度中等偏高",
-        "纯白服装"
-      ]
-    },
-    "4_lighting_consistency": {
-      "description": "光影一致性",
-      "criteria": [
-        "逆光/轮廓光从左上方照射",
-        "光晕效果统一"
-      ]
-    },
-    "5_style_consistency": {
-      "description": "风格一致性",
-      "criteria": [
-        "真实摄影风格",
-        "85mm 镜头效果",
-        "f/1.8 浅景深"
-      ]
-    }
-  },
-  "evaluation_instruction": "请逐项检查每张图像在 5 个维度上的表现,识别不符合标准的图像,并详细说明问题所在。"
-}

+ 1 - 0
knowhub/agents/librarian.py

@@ -41,6 +41,7 @@ def get_librarian_config(enable_db_commit: bool = ENABLE_DATABASE_COMMIT) -> Run
         "tool_search",
         "tool_search",
         "capability_search",
         "capability_search",
         "requirement_search",
         "requirement_search",
+        "relation_search",
         "read_file", "write_file",
         "read_file", "write_file",
         "list_cache_status",
         "list_cache_status",
         "match_tree_nodes",
         "match_tree_nodes",

+ 3 - 3
knowhub/agents/librarian_agent.prompt

@@ -10,7 +10,7 @@ $system$
 你是一个知识库管理员。你有两项核心职责:
 你是一个知识库管理员。你有两项核心职责:
 
 
 1. **检索整合**:面对查询时,跨多张表检索,顺着关联链拼出完整上下文,给出精准回答
 1. **检索整合**:面对查询时,跨多张表检索,顺着关联链拼出完整上下文,给出精准回答
-2. **入库编排**:收到新数据时,与已有知识比对去重,识别关联关系,整理为结构化条目归入正确位置
+2. **入库编排**:收到新数据时,与已有知识比对去重,识别关联关系,整理为结构化条目归入正确位置。**注意:你所有的归档与起草工作,必须严格并且仅限于编辑 `.cache/.knowledge/pre_upload_list.json` 这个草稿文件,严禁在根目录或任何其他地方擅自创建诸如 `knowledge/` 或 `tools/` 的散装文件夹和文件!**
 
 
 你只做整理和检索,不自行创造知识内容。
 你只做整理和检索,不自行创造知识内容。
 
 
@@ -29,8 +29,8 @@ $system$
 |------|---------|---------|
 |------|---------|---------|
 | Requirement | `REQ_XXX` | description, status, match_result |
 | Requirement | `REQ_XXX` | description, status, match_result |
 | Capability | `CAP-XXX` | name, criterion, description |
 | Capability | `CAP-XXX` | name, criterion, description |
-| Tool | `tools/{category}/{name}` | name, introduction, tutorial, status |
-| Knowledge | `knowledge-{date}-{hash}` | task, content, types, score |
+| Tool | 自行设定 | name, introduction, tutorial, status |
+| Knowledge | 自行设定 | task, content, types, score |
 
 
 实体间通过关联表连接,API 返回时自动聚合为 `{entity}_ids` 字段(如 `capability_ids`, `tool_ids`, `knowledge_ids`)。
 实体间通过关联表连接,API 返回时自动聚合为 `{entity}_ids` 字段(如 `capability_ids`, `tool_ids`, `knowledge_ids`)。
 
 

+ 37 - 5
knowhub/knowhub_db/pg_store.py

@@ -133,11 +133,39 @@ class PostgreSQLStore:
         finally:
         finally:
             cursor.close()
             cursor.close()
 
 
-    def search(self, query_embedding: List[float], filters: Optional[str] = None, limit: int = 10) -> List[Dict]:
+    def _apply_relation_filters(self, where_clause: str, relation_filters: Optional[Dict[str, str]], params: list) -> str:
+        if not relation_filters:
+            return where_clause
+            
+        rel_clauses = []
+        for k, v in relation_filters.items():
+            if not v: continue
+            if k == 'requirement_id':
+                rel_clauses.append("EXISTS (SELECT 1 FROM requirement_knowledge rk WHERE rk.knowledge_id = knowledge.id AND rk.requirement_id = %s)")
+                params.append(v)
+            elif k == 'capability_id':
+                rel_clauses.append("EXISTS (SELECT 1 FROM capability_knowledge ck WHERE ck.knowledge_id = knowledge.id AND ck.capability_id = %s)")
+                params.append(v)
+            elif k == 'tool_id':
+                rel_clauses.append("EXISTS (SELECT 1 FROM tool_knowledge tk WHERE tk.knowledge_id = knowledge.id AND tk.tool_id = %s)")
+                params.append(v)
+                
+        if not rel_clauses:
+            return where_clause
+            
+        rel_where = " AND ".join(rel_clauses)
+        if where_clause.strip():
+            return f"{where_clause} AND {rel_where}"
+        else:
+            return f"WHERE {rel_where}"
+
+    def search(self, query_embedding: List[float], filters: Optional[str] = None, limit: int = 10, relation_filters: Optional[Dict[str, str]] = None) -> List[Dict]:
         """向量检索(使用余弦相似度)"""
         """向量检索(使用余弦相似度)"""
         cursor = self._get_cursor()
         cursor = self._get_cursor()
         try:
         try:
             where_clause = self._build_where_clause(filters) if filters else ""
             where_clause = self._build_where_clause(filters) if filters else ""
+            params = []
+            where_clause = self._apply_relation_filters(where_clause, relation_filters, params)
             sql = f"""
             sql = f"""
                 SELECT {_SELECT_FIELDS},
                 SELECT {_SELECT_FIELDS},
                        1 - (task_embedding <=> %s::real[]) as score
                        1 - (task_embedding <=> %s::real[]) as score
@@ -146,24 +174,28 @@ class PostgreSQLStore:
                 ORDER BY task_embedding <=> %s::real[]
                 ORDER BY task_embedding <=> %s::real[]
                 LIMIT %s
                 LIMIT %s
             """
             """
-            cursor.execute(sql, (query_embedding, query_embedding, limit))
+            final_params = [query_embedding] + params + [query_embedding, limit]
+            cursor.execute(sql, tuple(final_params))
             results = cursor.fetchall()
             results = cursor.fetchall()
             return [self._format_result(r) for r in results]
             return [self._format_result(r) for r in results]
         finally:
         finally:
             cursor.close()
             cursor.close()
 
 
-    def query(self, filters: str, limit: int = 100) -> List[Dict]:
+    def query(self, filters: str, limit: int = 100, relation_filters: Optional[Dict[str, str]] = None) -> List[Dict]:
         """纯标量查询"""
         """纯标量查询"""
         cursor = self._get_cursor()
         cursor = self._get_cursor()
         try:
         try:
-            where_clause = self._build_where_clause(filters)
+            where_clause = self._build_where_clause(filters) if filters else ""
+            params = []
+            where_clause = self._apply_relation_filters(where_clause, relation_filters, params)
             sql = f"""
             sql = f"""
                 SELECT {_SELECT_FIELDS}
                 SELECT {_SELECT_FIELDS}
                 FROM knowledge
                 FROM knowledge
                 {where_clause}
                 {where_clause}
                 LIMIT %s
                 LIMIT %s
             """
             """
-            cursor.execute(sql, (limit,))
+            final_params = params + [limit]
+            cursor.execute(sql, tuple(final_params))
             results = cursor.fetchall()
             results = cursor.fetchall()
             return [self._format_result(r) for r in results]
             return [self._format_result(r) for r in results]
         finally:
         finally:

+ 23 - 6
knowhub/server.py

@@ -1094,7 +1094,10 @@ async def search_knowledge_api(
     top_k: int = Query(default=5, ge=1, le=20),
     top_k: int = Query(default=5, ge=1, le=20),
     min_score: int = Query(default=3, ge=1, le=5),
     min_score: int = Query(default=3, ge=1, le=5),
     types: Optional[str] = None,
     types: Optional[str] = None,
-    owner: Optional[str] = None
+    owner: Optional[str] = None,
+    requirement_id: Optional[str] = None,
+    capability_id: Optional[str] = None,
+    tool_id: Optional[str] = None
 ):
 ):
     """检索知识(向量召回 + LLM 精排)"""
     """检索知识(向量召回 + LLM 精排)"""
     try:
     try:
@@ -1123,13 +1126,19 @@ async def search_knowledge_api(
         filters.append('(status == "approved" or status == "checked")')
         filters.append('(status == "approved" or status == "checked")')
 
 
         filter_expr = ' and '.join(filters) if filters else None
         filter_expr = ' and '.join(filters) if filters else None
+        
+        relation_filters = {}
+        if requirement_id: relation_filters['requirement_id'] = requirement_id
+        if capability_id: relation_filters['capability_id'] = capability_id
+        if tool_id: relation_filters['tool_id'] = tool_id
 
 
         # 3. 向量召回(3*k 个候选)
         # 3. 向量召回(3*k 个候选)
         recall_limit = top_k * 3
         recall_limit = top_k * 3
         candidates = pg_store.search(
         candidates = pg_store.search(
             query_embedding=query_embedding,
             query_embedding=query_embedding,
             filters=filter_expr,
             filters=filter_expr,
-            limit=recall_limit
+            limit=recall_limit,
+            relation_filters=relation_filters
         )
         )
 
 
         if not candidates:
         if not candidates:
@@ -1234,7 +1243,10 @@ def list_knowledge(
     scopes: Optional[str] = None,
     scopes: Optional[str] = None,
     owner: Optional[str] = None,
     owner: Optional[str] = None,
     tags: Optional[str] = None,
     tags: Optional[str] = None,
-    status: Optional[str] = None
+    status: Optional[str] = None,
+    requirement_id: Optional[str] = None,
+    capability_id: Optional[str] = None,
+    tool_id: Optional[str] = None
 ):
 ):
     """列出知识(支持后端筛选和分页)"""
     """列出知识(支持后端筛选和分页)"""
     try:
     try:
@@ -1273,10 +1285,15 @@ def list_knowledge(
         # 如果没有过滤条件,查询所有
         # 如果没有过滤条件,查询所有
         filter_expr = ' and '.join(filters) if filters else 'id != ""'
         filter_expr = ' and '.join(filters) if filters else 'id != ""'
 
 
-        # 查询 Milvus(先获取所有符合条件的数据)
-        # Milvus 的 limit 是总数限制,我们需要获取足够多的数据来支持分页
+        relation_filters = {}
+        if requirement_id: relation_filters['requirement_id'] = requirement_id
+        if capability_id: relation_filters['capability_id'] = capability_id
+        if tool_id: relation_filters['tool_id'] = tool_id
+
+        # 查询 Milvus/PG(先获取所有符合条件的数据)
+        # limit 是总数限制,我们需要获取足够多的数据来支持分页
         max_limit = 10000  # 设置一个合理的上限
         max_limit = 10000  # 设置一个合理的上限
-        results = pg_store.query(filter_expr, limit=max_limit)
+        results = pg_store.query(filter_expr, limit=max_limit, relation_filters=relation_filters)
 
 
         # 转换为可序列化的格式
         # 转换为可序列化的格式
         serialized_results = [to_serializable(r) for r in results]
         serialized_results = [to_serializable(r) for r in results]

+ 0 - 104
knowledge-2026-04-09-ai-image-workflows.json

@@ -1,104 +0,0 @@
-{
-  "knowledge": [
-    {
-      "task": "AI人像皮肤质感修复工作流",
-      "content": "完整工序:\n1. 生成基础人像图片 - 工具:Midjourney / Google Imagen 4 (via Whisk) / Reeve / Flux Pro Ultra - 输入:近景人像提示词(如'close-up portrait, photorealistic, DSLR, 85mm')- 输出:AI生成的基础人像图片(可能存在塑料皮肤问题)\n2. 裁剪人脸区域(如需要)- 工具:图像裁剪工具 - 输入:基础人像图片,将人脸区域裁剪至更近的特写 - 输出:裁剪后的人脸特写图片\n3. 修复AI塑料皮肤质感 - 工具:Enhancor.ai (Skin Realism + Portrait Upscaler) - 输入:AI生成的人像图片,设置皮肤纹理强度、毛孔细节参数 - 输出:具有真实皮肤纹理、毛孔细节的人像图片\n4. 修复眼部瑕疵(可选)- 工具:Enhancor.ai 眼部修复功能 - 输入:修复后的人像图片,指定眼部区域 - 输出:眼部细节完美的人像图片\n5. 超分辨率放大 - 工具:Enhancor.ai Portrait Upscaler - 输入:修复后的人像图片,选择放大倍数(如4x)- 输出:billboard级别的高分辨率人像图片\n适用场景:商业人像摄影、广告牌级别输出、需要真实皮肤质感的AI人像",
-      "types": ["strategy"],
-      "tags": {
-        "source": "YouTube",
-        "domain": "AI图像生成",
-        "focus": "人像、皮肤质感、超分辨率"
-      },
-      "score": 5
-    },
-    {
-      "task": "多视角角色一致性工作流(Nano Banana Pro)",
-      "content": "完整工序:\n1. 创建角色参考表 - 工具:Nano Banana Pro (Higgsfield AI) - 输入:结构化提示词(如'Create a professional character reference sheet with four vertical columns: front view, left profile, right profile, back view. Each column contains full-body view on top and matching close-up portrait below. Photorealistic, DSLR, muted tones.')- 输出:包含四个视角(正面、左侧、右侧、背面)的角色参考表,每个视角包含全身图和近景肖像\n2. 生成多视角近景肖像 - 工具:Nano Banana Pro - 输入:角色参考表作为参考图,指定视角(如'front portrait close-up')- 输出:一致角色的多视角近景肖像图片\n3. 生成生活场景图 - 工具:Nano Banana Pro - 输入:角色参考表,场景描述(如'coffee shop lifestyle shot')- 输出:角色在不同生活场景中的图片\n适用场景:AI虚拟influencer、角色设计、需要多角度一致性的项目",
-      "types": ["strategy"],
-      "tags": {
-        "source": "YouTube",
-        "domain": "AI图像生成",
-        "focus": "角色一致性、多视角、近景肖像"
-      },
-      "score": 5
-    },
-    {
-      "task": "面部表情变换工作流(Canva AI Face Expression)",
-      "content": "完整工序:\n1. 上传基础照片 - 工具:Canva AI Face Expression App - 输入:单张人物照片(正面、清晰面部)- 输出:上传至Canva的基础照片\n2. 选择目标表情 - 工具:Canva AI Face Expression App - 输入:选择预设表情(如微笑、惊讶、严肃、开心等)- 输出:应用表情后的人物图片\n3. 批量生成多表情版本 - 工具:Canva AI Face Expression App - 输入:重复选择不同表情,批量处理 - 输出:同一人物的多种表情图片集合\n适用场景:YouTube缩略图制作、社交媒体内容、需要快速生成多种表情的场景",
-      "types": ["strategy"],
-      "tags": {
-        "source": "YouTube",
-        "domain": "AI图像生成",
-        "focus": "面部表情、批量生成"
-      },
-      "score": 4
-    },
-    {
-      "task": "AI虚拟网红完整工作流(KORA Pro + Enhancor + Lip Sync)",
-      "content": "完整工序:\n1. 生成高质量基础人像 - 工具:KORA Pro (Enhancor) - 输入:详细的人像提示词,包括人物特征、服装、光线、相机参数 - 输出:高真实度的基础人像图片\n2. 构建角色多视角图 - 工具:Nano Banana Pro - 输入:基础人像作为参考,生成多角度角色表 - 输出:包含正面、侧面、背面视角的角色参考表\n3. 修复皮肤质感 - 工具:Enhancor AI V3 Skin Fix - 输入:生成的角色图片,调整皮肤纹理参数 - 输出:具有真实皮肤质感的角色图片\n4. 生成生活场景图 - 工具:Nano Banana Pro - 输入:角色参考表,场景描述(如'studio shot', 'lifestyle scene')- 输出:角色在不同场景中的图片\n5. 唇形同步动画 - 工具:Enhancor Lip Sync V1/V2 - 输入:角色图片 + 自定义音频文件 - 输出:角色说话的视频(带唇形同步)\n适用场景:AI虚拟网红、虚拟主播、需要说话动画的角色",
-      "types": ["strategy"],
-      "tags": {
-        "source": "YouTube",
-        "domain": "AI图像生成",
-        "focus": "虚拟网红、唇形同步、角色一致性"
-      },
-      "score": 5
-    },
-    {
-      "task": "4K超高清AI图像生成工作流(ComfyUI + DyPE)",
-      "content": "完整工序:\n1. 设置ComfyUI工作流 - 工具:ComfyUI (本地安装 via Promptus) - 输入:安装DyPE模型(https://github.com/guyyariv/DyPE)- 输出:配置好的ComfyUI环境\n2. 生成原生4K图像 - 工具:ComfyUI + DyPE模型 - 输入:人像提示词,设置分辨率为4K,选择DyPE采样器 - 输出:原生4K分辨率的AI人像图片\n3. 超分辨率增强(可选)- 工具:ComfyUI 4K超分辨率节点 - 输入:生成的4K图片,选择放大倍数 - 输出:更高分辨率、细节更丰富的图片\n适用场景:需要超高清输出的商业项目、影院级画质需求",
-      "types": ["strategy"],
-      "tags": {
-        "source": "YouTube",
-        "domain": "AI图像生成",
-        "focus": "4K、超分辨率、ComfyUI"
-      },
-      "score": 4
-    },
-    {
-      "task": "角色一致性视频生成工作流(OpenArt + Kling/HeyGen)",
-      "content": "完整工序:\n1. 创建一致角色基础图 - 工具:OpenArt AI - 输入:角色描述提示词,上传参考图(如有)- 输出:高质量的角色基础图片\n2. 生成多视角角色图 - 工具:OpenArt AI - 输入:基础图作为参考,指定不同视角和姿势 - 输出:同一角色的多视角图片集合\n3. 生成视频 - 工具:Kling AI / HeyGen - 输入:角色图片 + 动作/对话描述 - 输出:角色动画视频\n4. 唇形同步(如需要)- 工具:HeyGen - 输入:角色视频 + 音频脚本 - 输出:带完美唇形同步的角色说话视频\n适用场景:AI视频创作、虚拟主播、需要角色一致性的视频项目",
-      "types": ["strategy"],
-      "tags": {
-        "source": "YouTube",
-        "domain": "AI视频生成",
-        "focus": "角色一致性、视频生成、唇形同步"
-      },
-      "score": 5
-    },
-    {
-      "task": "背景虚化效果工作流(Photoshop Lens Blur / DxO Photolab)",
-      "content": "完整工序:\n1. 导入人像图片 - 工具:Photoshop / DxO Photolab 9 - 输入:需要添加背景虚化的人像图片 - 输出:导入的图片\n2. 创建主体选区 - 工具:Photoshop 智能选区 / DxO 自动主体检测 - 输入:选择主体(人物)区域 - 输出:精确的人物选区\n3. 应用镜头虚化效果 - 工具:Photoshop Lens Blur / DxO Photolab 9 Bokeh - 输入:设置虚化强度、光圈形状、焦距参数 - 输出:具有专业镜头虚化效果的图片\n4. 微调边缘过渡 - 工具:Photoshop 蒙版羽化 - 输入:调整选区边缘羽化值 - 输出:自然过渡的虚化效果图片\n适用场景:人像摄影后期、需要背景虚化效果的AI生成图片",
-      "types": ["strategy"],
-      "tags": {
-        "source": "YouTube",
-        "domain": "图像后期处理",
-        "focus": "背景虚化、bokeh、人像后期"
-      },
-      "score": 4
-    }
-  ],
-  "resources": [
-    {
-      "id": "https://github.com/guyyariv/DyPE",
-      "type": "github_repo"
-    }
-  ],
-  "tools": [
-    {"name": "Midjourney", "introduction": "AI图像生成工具,支持高质量人像生成"},
-    {"name": "Google Imagen 4", "introduction": "Google的AI图像生成模型,通过Whisk平台访问"},
-    {"name": "Reeve", "introduction": "AI图像生成工具"},
-    {"name": "Flux Pro Ultra", "introduction": "AI图像生成工具,支持高质量人像"},
-    {"name": "Enhancor.ai", "introduction": "AI人像增强工具,提供皮肤质感修复和超分辨率功能"},
-    {"name": "Nano Banana Pro", "introduction": "Higgsfield AI的角色一致性生成工具"},
-    {"name": "Canva AI Face Expression", "introduction": "Canva的面部表情变换AI应用"},
-    {"name": "KORA Pro", "introduction": "Enhancor的高质量人像生成工具"},
-    {"name": "ComfyUI", "introduction": "本地AI图像生成工作流工具"},
-    {"name": "DyPE", "introduction": "ComfyUI的4K图像生成模型"},
-    {"name": "OpenArt AI", "introduction": "AI图像生成平台"},
-    {"name": "Kling AI", "introduction": "AI视频生成工具"},
-    {"name": "HeyGen", "introduction": "AI视频和唇形同步工具"},
-    {"name": "Photoshop", "introduction": "专业图像编辑软件"},
-    {"name": "DxO Photolab 9", "introduction": "专业照片处理软件,支持镜头虚化效果"}
-  ]
-}

+ 0 - 398
knowledge/ComfyUI_画中画分阶段生成工作流.md

@@ -1,398 +0,0 @@
-# ComfyUI 画中画分阶段生成工作流
-
-**知识 ID**: knowledge-20260411-155313-comfyinpaint  
-**类型**: strategy  
-**评分**: ⭐⭐⭐⭐⭐ (5/5)  
-**来源**: ComfyUI 社区/YouTube 教程  
-**领域**: AI 图像生成  
-**工作流类型**: 画中画分阶段生成  
-**核心工具**: ControlNet, IP-Adapter, Inpainting, Z-Image-Turbo
-
----
-
-## 核心设计理念
-
-### 分阶段生成 + 双控架构
-
-**分阶段流程**:
-```
-背景生成 → 画中画区域生成 → 风格统一 → 细节优化
-```
-
-**双控架构**:
-- **ControlNet**: 锁结构(几何/深度/姿态控制)
-- **IP-Adapter**: 注入风格(风格/纹理/色彩迁移)
-
----
-
-## 工作流总览
-
-```
-┌─────────────────────────────────────────────────────────────┐
-│  阶段 1: 背景/外框生成                                        │
-│  输入:背景提示词 + 参考图 → ControlNet 控制 → 生成背景       │
-└─────────────────────────────────────────────────────────────┘
-                            ↓
-┌─────────────────────────────────────────────────────────────┐
-│  阶段 2: 画中画区域生成 (Inpainting)                          │
-│  输入:背景图 + 蒙版 + 画中画提示词 → 局部重绘 → 生成内容     │
-└─────────────────────────────────────────────────────────────┘
-                            ↓
-┌─────────────────────────────────────────────────────────────┐
-│  阶段 3: 风格统一 (IP-Adapter)                                │
-│  输入:合成图 + 风格参考图 → IP-Adapter 注入 → 风格融合       │
-└─────────────────────────────────────────────────────────────┘
-                            ↓
-┌─────────────────────────────────────────────────────────────┐
-│  阶段 4: 细节优化 (ControlNet + Detailer)                     │
-│  输入:风格化图 → ControlNet 微调 → FaceDetailer → 最终输出  │
-└─────────────────────────────────────────────────────────────┘
-```
-
----
-
-## 阶段 1:背景/外框生成
-
-### 节点配置
-
-| 节点类型 | 节点名称 | 参数设置 |
-|----------|----------|----------|
-| Checkpoint | SDXL/Flux 主模型 | `albedobaseXL_v21.safetensors` 或 `flux1-dev.safetensors` |
-| ControlNet | Apply Advanced ControlNet | 权重 0.6-0.75 |
-| ControlNet 模型 | ControlNetLoader | `control_sdxl_canny.safetensors` 或 `depth` |
-| 预处理器 | AIO Aux Preprocessor | Canny/Depth/MLSD(根据场景选择) |
-| CLIP Text Encode | 背景提示词 | 描述整体场景氛围 |
-| KSampler | 采样器 | 20-30 步,CFG 7-8,DPM++ 2M Karras |
-
-### 操作步骤
-
-1. **加载背景参考图**(可选)
-   - 使用 `Load Image` 节点加载参考图
-   - 通过 `AIO Aux Preprocessor` 提取结构信息
-
-2. **设置 ControlNet 控制**
-   ```
-   参考图 → 预处理器 → ControlNet 模型 → Apply Advanced ControlNet
-   ```
-   - 控制权重:`0.6-0.75`
-   - 控制模式:`Balanced` 或 `ControlNet is more important`
-   - Starting/Ending Step:`0.0-1.0`(全程控制)
-
-3. **编写背景提示词**
-   ```
-   A cozy living room with large empty wall frame, warm lighting, 
-   modern minimalist interior, soft shadows, high quality photography
-   ```
-
-4. **生成背景图**
-   - 分辨率:`1024x1024` 或 `1280x720`(根据最终输出设定)
-   - 批次数:1(单张背景)
-
----
-
-## 阶段 2:画中画区域生成(Inpainting)
-
-### 三种实现方案对比
-
-| 方案 | 核心节点 | 适用场景 | 优点 | 缺点 |
-|------|----------|----------|------|------|
-| **A: 原生节点法** | Inpaint Model Conditioning | 理解底层逻辑 | 学习价值高 | 连线复杂 |
-| **B: KJ Nodes 简化版** ⭐ | KJ Nodes: Inpaint Node | 生产环境 | 工作流简洁 | 需安装自定义节点 |
-| **C: SAM 3 智能重绘** | SAM 3 + Grounding DINO | 自动化场景 | 无需手动蒙版 | 依赖 AI 识别准确度 |
-
-### 方案 A:原生节点法
-
-**节点连接**:
-```
-背景图 → VAE Encode → Inpaint Model Conditioning → KSampler → VAE Decode
-蒙版图 ↗
-```
-
-**关键参数**:
-- `denoise`: `0.6-0.8`(重绘强度)
-- `mask_expand`: `10-20`(蒙版扩展像素)
-- 模糊蒙版边缘:让重绘更融合
-
-### 方案 B:KJ Nodes 简化版(推荐)
-
-**核心节点**:
-- `KJ Nodes: Inpaint Node`: 简化重绘流程
-- `KJ Nodes: Mask Editor`: 可视化蒙版编辑
-
-**优势**:工作流连线简洁,适合生产环境
-
-### 方案 C:SAM 3 智能重绘
-
-**核心节点**:
-- `SAM 3 (Segment Anything)`: 自动识别目标区域
-- `Grounding DINO`: 文本引导分割
-
-**操作步骤**:
-1. 输入文本指令:`"the empty frame on the wall"`
-2. SAM 3 自动识别并生成蒙版
-3. 自动执行局部重绘
-
-### 关键参数设置
-
-| 参数 | 推荐值 | 说明 |
-|------|--------|------|
-| denoise | 0.65-0.75 | 平衡原图保留与重绘效果 |
-| mask_expand | 15-25 | 确保边缘融合自然 |
-| CFG | 7-8 | 避免过拟合 |
-| Steps | 25-30 | 保证细节质量 |
-
-### 画中画提示词示例
-
-```
-A beautiful landscape painting inside the frame, 
-mountain lake at sunset, golden hour lighting, 
-oil painting style, detailed brushstrokes, masterpiece
-```
-
----
-
-## 阶段 3:风格统一(IP-Adapter)
-
-### 核心原理
-
-> **IP-Adapter 负责风格注入,ControlNet 负责结构保持**
-
-⚠️ **重要**: IP-Adapter 单独使用易结构崩坏、手部细节失控,必须配合 ControlNet 使用
-
-### 节点配置
-
-| 节点类型 | 节点名称 | 参数设置 |
-|----------|----------|----------|
-| IPAdapter | IPAdapter Plus | `PLUS(high strength)` 预设 |
-| CLIP Vision | CLIP-ViT-H-14-laion2B-s32B | 风格编码模型 |
-| IPAdapter 权重 | 权重值 | `0.6-0.85` |
-| 合并嵌入组 | concat / average | `concat`(冲突感)或 `norm average`(柔和) |
-| 权重类型 | style transfer | 风格迁移模式 |
-
-### 工作流连接
-
-```
-风格参考图 → IPAdapter Encode → IPAdapter Apply → KSampler
-合成图 → VAE Encode ↗
-```
-
-### 多风格融合
-
-```
-风格图 A → IPAdapter Encode (权重 1.20) ┐
-风格图 B → IPAdapter Encode (权重 1.00) → 合并嵌入组 (concat) → Apply
-```
-
-### 关键参数推荐
-
-| 场景 | IPAdapter 权重 | 合并方式 | 权重类型 |
-|------|---------------|----------|----------|
-| 轻微风格渗透 | 0.4-0.6 | average | style transfer |
-| 平衡融合 | 0.65-0.75 | norm average | style transfer |
-| 强烈风格化 | 0.8-0.85 | concat | style transfer |
-| 多风格融合 | 1.0-1.2 (主) + 0.8 (辅) | concat | style transfer |
-
-### 避坑指南
-
-⚠️ **权重过高** (> 0.85) 易导致画面紊乱  
-✅ **解决方案**: 使用 `fade` 类型 + 噪波强度 0.6 + 模糊 2
-
----
-
-## 阶段 4:细节优化
-
-### 4.1 ControlNet 微调
-
-**目的**: 在风格化后保持关键结构
-
-| ControlNet 类型 | 权重 | 适用场景 |
-|----------------|------|----------|
-| Canny | 0.4-0.6 | 保持边缘清晰 |
-| Depth | 0.5-0.7 | 保持空间层次 |
-| Tile | 0.6-0.8 | 细节增强/放大 |
-
-**配置技巧**:
-- 使用较低的权重(0.4-0.6)进行微调
-- Starting Step 设为 `0.3-0.5`(后期介入)
-- 避免过度控制导致风格丢失
-
-### 4.2 FaceDetailer / HandDetailer
-
-**目的**: 修复面部/手部细节
-
-| 节点 | 模型 | 参数 |
-|------|------|------|
-| FaceDetailer | `face_yolov8m.pt` | denoise 0.2-0.5 |
-| HandDetailer | `hand_yolov8s.pt` | denoise 0.3-0.6 |
-| SAM | `sam_vit_b_01ec64.pth` | 精准检测 |
-
-**工作流程**:
-```
-风格化图 → 人脸/手部检测 → 局部放大 → 重绘修复 → 合成输出
-```
-
-### 4.3 高清放大(可选)
-
-| 节点 | 模型 | 用途 |
-|------|------|------|
-| Ultimate SD Upscale | `4x-UltraSharp.pth` | 4 倍高清放大 |
-| Tile ControlNet | `control_v11f1e_sd15_tile` | 放大时保持细节 |
-
----
-
-## 完整参数汇总表
-
-### 阶段 1:背景生成
-| 参数 | 推荐值 |
-|------|--------|
-| 模型 | SDXL / Flux |
-| ControlNet 权重 | 0.6-0.75 |
-| Steps | 20-25 |
-| CFG | 7-8 |
-| 分辨率 | 1024x1024 |
-
-### 阶段 2:Inpainting
-| 参数 | 推荐值 |
-|------|--------|
-| denoise | 0.65-0.75 |
-| mask_expand | 15-25 |
-| Steps | 25-30 |
-| CFG | 7-8 |
-
-### 阶段 3:IP-Adapter
-| 参数 | 推荐值 |
-|------|--------|
-| 权重 | 0.65-0.80 |
-| 预设 | PLUS(high strength) |
-| CLIP Vision | CLIP-ViT-H-14 |
-| 合并方式 | norm average |
-
-### 阶段 4:细节优化
-| 参数 | 推荐值 |
-|------|--------|
-| ControlNet 微调权重 | 0.4-0.6 |
-| FaceDetailer denoise | 0.2-0.5 |
-| Upscale 倍数 | 2x-4x |
-
----
-
-## 必备自定义节点清单
-
-通过 **ComfyUI Manager** 安装:
-
-```bash
-# ControlNet 相关
-- ComfyUI's ControlNet Auxiliary Preprocessors
-- ComfyUI-Advanced-ControlNet
-
-# IPAdapter 相关
-- IPAdapter Plus (comfyui_ipadapter_plus)
-
-# 简化节点
-- KJ Nodes (comfyui-kjnodes)
-- Efficiency Nodes
-
-# 细节修复
-- Impact Pack (comfyui_essentials)
-- FaceDetailer
-
-# 智能分割
-- SAM 3 (Segment Anything)
-- Grounding DINO
-
-# 其他工具
-- CR Seamless Checker(无缝检查)
-- TextureViewer(3D 预览)
-```
-
----
-
-## 实战案例:客厅挂画生成
-
-### 完整提示词
-
-**阶段 1 - 背景**:
-```
-A modern living room with a large empty wooden frame on the wall, 
-warm afternoon sunlight, minimalist interior design, 
-soft shadows, cozy atmosphere, interior photography, 8k --ar 16:9
-```
-
-**阶段 2 - 画中画**:
-```
-A serene mountain lake landscape at golden hour, 
-reflection in water, dramatic sky, oil painting style, 
-visible brushstrokes, impasto technique, masterpiece
-```
-
-**阶段 3 - 风格参考**:
-- 上传 1-2 张目标风格的油画作品作为 IP-Adapter 参考
-
-### 工作流执行顺序
-
-1. **生成背景**: 使用 Canny ControlNet 控制房间结构
-2. **绘制蒙版**: 在空画框区域绘制蒙版(或使用 SAM 3 自动识别)
-3. **局部重绘**: denoise 0.7,生成画中画内容
-4. **风格注入**: IP-Adapter 权重 0.75,融合油画风格
-5. **细节修复**: FaceDetailer 修复可能的人物(如有)
-6. **高清输出**: Ultimate SD Upscale 放大至 4K
-
----
-
-## 常见问题与解决方案
-
-| 问题 | 原因 | 解决方案 |
-|------|------|----------|
-| 画中画边缘不融合 | 蒙版扩展不足 | 增加 `mask_expand` 至 20-30 |
-| 风格与背景不协调 | IP-Adapter 权重过高 | 降至 0.6-0.7,使用 `norm average` |
-| 画中画结构崩坏 | 缺少 ControlNet 控制 | 添加 Canny/Depth ControlNet(权重 0.5) |
-| 面部/手部畸形 | 细节质量不足 | 添加 FaceDetailer/HandDetailer |
-| 整体风格不统一 | 分阶段风格差异大 | 阶段 1 也使用相同 IP-Adapter 参考 |
-| 生成速度慢 | 多阶段串行执行 | 使用批处理,低分辨率测试后再高清生成 |
-
----
-
-## 进阶技巧
-
-### 1. 多画中画嵌套
-```
-背景 → 画中画 A → 画中画 B(嵌套在 A 内)
-```
-- 使用多个 Inpainting 节点串联
-- 每个阶段使用独立蒙版
-- IP-Adapter 可分别控制不同区域风格
-
-### 2. 动态蒙版生成
-```
-Grounding DINO + SAM 3 → 自动蒙版 → Inpainting
-```
-- 文本指令:`"the frame on the wall"`
-- 全自动识别和重绘
-
-### 3. 风格渐变融合
-```
-IPAdapter A (权重 0.8) + IPAdapter B (权重 0.4) → 渐变融合
-```
-- 使用 `average` 合并方式
-- 调整权重比例控制风格倾向
-
-### 4. 批量生成变体
-```
-同一背景 + 不同画中画提示词 → 批量输出
-```
-- 使用 `Batch Prompt Schedule` 节点
-- 一次生成多个画中画变体
-
----
-
-## 关联知识
-
-- **Midjourney v7 厚涂风格**: 可使用 MJ 生成风格参考图,再通过本工作流在 ComfyUI 中精确复现
-- **Nano Banana 多图融合**: 可将多图融合结果作为本工作流的输入
-- **ControlNet+IPAdapter 双控架构**: 本工作流的核心技术基础
-
----
-
-## 更新日志
-
-- 2026-04-11: 初始入库,包含 4 阶段完整工作流、3 种 Inpainting 方案对比、实战案例

+ 0 - 165
knowledge/Midjourney_v7_Impasto_厚涂风格参数配置.md

@@ -1,165 +0,0 @@
-# Midjourney v7 Impasto 厚涂风格参数配置
-
-**知识 ID**: knowledge-20260411-155313-mj7impasto  
-**类型**: tool  
-**评分**: ⭐⭐⭐⭐⭐ (5/5)  
-**来源**: 小红书/Midjourney 官方文档  
-**领域**: AI 图像生成  
-**工具**: Midjourney v7  
-**风格**: Impasto 厚涂
-
----
-
-## 核心发现
-
-Midjourney v7 在美学质量与笔触质感方面表现优异,特定 sref 代码可生成几乎与真实绘画无法区分的厚涂技法效果。**v8 版本灵活性降低,艺术风格探索建议继续使用 v7**。
-
-### v7 vs v8 厚涂风格对比
-
-| 维度 | v7 | v8 |
-|------|-----|-----|
-| 笔触质感 | ⭐⭐⭐⭐⭐ 自然流畅 | ⭐⭐⭐⭐ 稍显僵硬 |
-| 风格灵活性 | ⭐⭐⭐⭐⭐ 高 | ⭐⭐⭐ 降低 |
-| 厚涂效果 | ⭐⭐⭐⭐⭐ 无敌 | ⭐⭐⭐⭐ 良好 |
-
----
-
-## 核心参数详解
-
-### 1. `--sref` 风格参考代码
-
-**基础语法**:
-```bash
-/imagine prompt: [描述] --sref [风格代码] --v 7
-```
-
-**多风格融合**(最多 5 个):
-```bash
-/imagine prompt: [描述] --sref 代码 1 代码 2 代码 3 --v 7
-```
-
-**常用厚涂风格代码**:
-- **新派写实油画**: `sref 738792225` ⭐ 推荐
-- 获取方法:
-  1. 在 Discord 使用 `/describe` 分析喜欢的厚涂作品
-  2. 使用 `/style-save` 保存生成的风格
-  3. 从社区共享代码库获取(Reddit、PromptHero)
-
-### 2. `--sw` 风格权重参数
-
-**语法**:`--sw [0.1-2.0]`
-
-**权重范围与效果**:
-
-| 权重值 | 效果强度 | 适用场景 |
-|--------|----------|----------|
-| 0.1-0.3 | 轻微风格渗透 | 保留原风格基础上微调 |
-| 0.4-0.7 | 平衡融合 | 推荐默认值,风格与内容均衡 |
-| 0.8-1.2 | 强烈风格化 | 明显厚涂笔触质感 |
-| 1.3-2.0 | 极致风格 | 完全主导,可能牺牲细节 |
-
-**厚涂风格推荐设置**: `--sw 1.0-1.5`
-
-### 3. `--v 7` 版本锁定
-
-⚠️ **必须显式指定** `--v 7`,v8 版本灵活性降低不适合厚涂风格
-
----
-
-## 完整提示词公式
-
-### 厚涂风格三段式公式
-
-```
-[主体画面描述] + [厚涂笔触/材质描述] + [光影/色彩氛围] --sref [代码] --sw [权重] --v 7 --ar [比例] --stylize [值]
-```
-
-### 厚涂专用关键词库
-
-| 关键词 | 中文含义 | 效果 |
-|--------|----------|------|
-| `thick impasto brushwork` | 厚涂笔触 | 增强笔触质感 |
-| `heavy paint texture` | 厚重颜料肌理 | 增加物理厚度 |
-| `visible brushstrokes` | 可见笔触 | 拒绝平滑感 |
-| `palette knife texture` | 调色刀纹理 | 特殊肌理效果 |
-| `impasto technique` | 厚涂技法 | 整体风格定义 |
-
----
-
-## 实战示例
-
-### 示例 1:新派写实油画
-```bash
-{你的主体} + The painting is in a realistic oil painting style, with clearly visible brushstrokes, vibrant colors, and strong light. --chaos 30 --exp 85 --sref 738792225 --profile qvu9plm --v 7.0 --ar 2:3
-```
-
-### 示例 2:人物厚涂肖像
-```bash
-A warrior princess with flowing red hair, thick impasto oil painting style, visible brushstrokes, palette knife texture, dramatic chiaroscuro lighting, warm golden hour glow --sref 1847293 --sw 1.3 --v 7 --ar 2:3 --stylize 750
-```
-
-### 示例 3:风景厚涂
-```bash
-Mountain landscape at sunset, heavy impasto technique, thick layers of oil paint, textured canvas, bold brushwork, vibrant color palette, atmospheric perspective --sref 2938471 --sw 1.5 --v 7 --ar 16:9 --stylize 800
-```
-
----
-
-## 参数组合推荐表
-
-| 场景 | --sref | --sw | --stylize | --q | --ar |
-|------|--------|------|-----------|-----|------|
-| 人物厚涂肖像 | 1-2 个代码 | 1.2-1.5 | 700-850 | 2 | 2:3 |
-| 风景厚涂 | 2-3 个代码 | 1.3-1.8 | 750-900 | 2 | 16:9 |
-| 静物厚涂 | 1 个代码 | 1.0-1.3 | 600-750 | 2 | 4:5 |
-| 抽象厚涂 | 2-3 个代码 | 1.5-2.0 | 850-1000 | 4 | 1:1 |
-| 快速测试 | 1 个代码 | 1.0 | 500 | 0.5 | 1:1 |
-
----
-
-## 避坑指南
-
-| 问题 | 原因 | 解决方案 |
-|------|------|----------|
-| 厚涂效果不明显 | --sw 权重太低 | 提升至 1.3-1.8 |
-| 笔触过于粗糙 | --sw 权重过高 | 降至 0.8-1.2 |
-| 风格冲突 | 多代码不兼容 | 减少至 1-2 个代码 |
-| 细节丢失 | --stylize 过高 | 降至 600-750 |
-| 生成速度慢 | --q 4 + 多代码 | 先用 --q 0.5 测试 |
-| v8 效果不如 v7 | 版本灵活性差异 | 强制使用 --v 7 |
-
----
-
-## 拒绝塑料感 4 招
-
-### 1. 拒绝平滑,增加物理厚度
-使用 `Thick impasto brushwork` 或 `Heavy paint texture` 关键词
-
-### 2. 治愈系万能公式
-```
-Deep blue twilight ambient + Warm orange window light
-```
-90% 冷调 + 10% 暖色,营造层次感
-
-### 3. 让水活过来
-使用 `Swirling water patterns` + `Churning white water`
-
-### 4. 参数降噪,返璞归真
-```bash
---s 200 搭配 --style raw
-```
-降低 AI 过度修饰,回归自然质感
-
----
-
-## 关联知识
-
-- **ComfyUI 厚涂复现**: 使用 IPAdapter + ControlNet 双控架构在 ComfyUI 中复现 MJ 厚涂风格
-- **风格代码获取**: `/describe` + `/style-save` 工作流
-- **v7 vs v8 对比**: v7 适合艺术风格探索,v8 适合精确解剖结构
-
----
-
-## 更新日志
-
-- 2026-04-11: 初始入库,包含具体风格代码 738792225、--sw 参数详解、厚涂关键词库

+ 0 - 261
knowledge/Nano_Banana_多图融合_ComfyUI 工作流.md

@@ -1,261 +0,0 @@
-# Nano Banana 多图融合 ComfyUI 工作流
-
-**知识 ID**: knowledge-20260411-155313-nanobanana  
-**类型**: strategy  
-**评分**: ⭐⭐⭐⭐⭐ (5/5)  
-**来源**: 小红书/ComfyUI 社区  
-**领域**: AI 图像生成  
-**工作流类型**: 多图融合  
-**核心工具**: Nano Banana, Google Gemini Image, ComfyUI
-
----
-
-## 核心能力
-
-| 能力指标 | 规格 |
-|----------|------|
-| 最多参考图数量 | **14 张**(实际 10 张可达 100% 还原) |
-| 角色一致性 | 单工作流最多 **5 个角色** + **14 个物体** |
-| 面部一致性 | **90-95%** |
-| 中文渲染 | 准确率 **90%+** |
-| 支持宽高比 | 包括极端比例 1:8、8:1、4:1、1:4 |
-| 产品一致性 | 标签文字不崩坏 |
-
----
-
-## ComfyUI 工作流配置
-
-### 方法 1:单图编辑
-
-**工作流节点连接**:
-```
-Load Image → Image Scale → Google Gemini Image → LibLib Translate → Save Image
-```
-
-**参数设置**:
-- 图像缩放:`1536×1536`
-- 模型:`gemini-2.5-flash-image-preview`
-- 提示词:**必须包含** `"把这*张图组合成一张完整的新图像"`
-
-### 方法 2:双图编辑(推荐,效果更稳定)
-
-**工作流节点连接**:
-```
-Load Image (产品图) → Image Scale ┐
-Load Image (场景图) → Image Scale → Google Gemini Image → LibLib Translate → Save Image
-```
-
-**提示词示例**:
-```
-"把这两张图组合成一张完整的新图像,将产品自然融入场景中,保持产品标签文字清晰"
-```
-
-### 方法 3:三图编辑
-
-**工作流节点连接**:
-```
-Load Image (场景图) → Image Scale ┐
-Load Image (产品图) → Image Scale ├→ Google Gemini Image → LibLib Translate → Save Image
-Load Image (元素图) → Image Scale ┘
-```
-
-**提示词示例**:
-```
-"把这三张图组合成一张完整的新图像,将产品和杯子自然融入家居场景中,保持产品标签文字清晰"
-```
-
----
-
-## 15 种多图融合场景
-
-| 序号 | 场景 | 描述 |
-|------|------|------|
-| 1 | 杂志封面 | 融合多张参考图生成专业封面 |
-| 2 | 漫画分镜 | 保持角色一致性的多格漫画 |
-| 3 | 信息图 | 自动搜索数据生成带图表的信息图 |
-| 4 | 情绪九宫格 | 同一人物 9 种表情 |
-| 5 | 极限运动场景 | 同一人物在不同运动场景 |
-| 6 | 产品对比海报 | 多产品对比展示 |
-| 7 | 科研绘图 | 顶刊级科研配图 |
-| 8 | 电影感人像 | 带详细相机参数的专业人像 |
-| 9 | 艺术风格转换 | 多风格同一人物 |
-| 10 | 背景替换 | 保持人物换背景 |
-| 11 | 服装替换 | 保持人物换服装 |
-| 12 | 创意场景转换 | 动作人偶风格等 |
-| 13 | 多语言信息图 | 一键翻译排版 |
-| 14 | 四方连续贴图 | 无缝纹理生成 |
-| 15 | 虚拟试衣 | 服装上身效果 |
-
----
-
-## 实测心得
-
-### 关键发现
-
-1. **提示词决定出图效果** ⭐⭐⭐⭐⭐
-   - **必须写**: `"把这*张图组合成一张完整的新图像"`
-   - 缺少此句会导致生成效果不稳定
-
-2. **双图编辑效果更稳定** ⭐⭐⭐⭐
-   - 单图编辑:适合简单修改
-   - 双图编辑:推荐默认方案
-   - 三图以上:复杂度增加,需更具体提示词
-
-3. **产品一致性能力出色** ⭐⭐⭐⭐⭐
-   - 不必担心产品标签文字崩坏
-   - 适合电商产品场景图生成
-
-4. **清晰度优化**
-   - 如生成图清晰度不够,可使用高清放大工作流
-   - 推荐:Ultimate SD Upscale + Tile ControlNet
-
----
-
-## 成本说明
-
-### Nano Banana 定价
-
-| 版本 | 分辨率 | 价格 | 备注 |
-|------|--------|------|------|
-| Nano Banana 2 | 1K | $0.067/张 | 性价比最高 |
-| Nano Banana 2 | 2K | $0.101/张 | |
-| Nano Banana 2 | 4K | $0.151/张 | |
-| Nano Banana Pro | 1K | $0.134/张 | 比 Flash 贵 50% |
-
-### 不同平台成本对比
-
-| 平台 | 成本范围 | 建议 |
-|------|----------|------|
-| 官方 API | $0.067-0.151/张 | 稳定可靠 |
-| 第三方平台 A | $0.02-0.08/张 | 价格低,注意稳定性 |
-| 第三方平台 B | $0.10-0.15/张 | 价格高,可能有额外功能 |
-
-⚠️ **注意**: 不同平台调用 Banana 的成本不同(从 $0.02~$0.15 不等),需根据需求选择
-
----
-
-## 避坑指南
-
-| 问题 | 说明 | 解决方案 |
-|------|------|----------|
-| SynthID 水印 | 不可移除 | 接受或后期处理 |
-| Thinking 模式 | 强制启用 | 无法关闭,等待完成 |
-| 提示词不具体 | 效果不稳定 | 极度具体描述需求 |
-| 直接使用 Pro | 成本高 | 先用 Flash 测试提示词 |
-| 单次生成 | 成本高 | 使用 Batch API 节省 50% |
-
-### 推荐工作流
-
-```
-1. Flash 测试提示词 → 2. 优化提示词 → 3. Pro 批量生成 → 4. 高清放大
-```
-
----
-
-## 实战案例
-
-### 案例 1:电商产品场景图
-
-**输入**:
-- 产品图:投影仪正面图
-- 场景图:雪山湖畔风景
-
-**提示词**:
-```
-"把这两张图组合成一张完整的新图像,将投影仪自然融入雪山湖畔场景中,保持产品外观和标签清晰"
-```
-
-**输出**:电商宣传场景图
-
-**耗时**:5-6 分钟  
-**成本**:$0.067 × 2(测试 + 正式)= $0.134
-
----
-
-### 案例 2:中餐厅菜品图自动化
-
-**工作流**:Nanobanana + ComfyUI
-
-**流程**:
-```
-厨房出餐摆盘 → 手机随手拍 → 5-6 分钟生成专业菜单图
-```
-
-**支持**:
-- 横版/竖版可变尺寸
-- 批量生成
-- 保持菜品色泽和质感
-
-**应用场景**:
-- 餐厅菜单
-- 外卖平台图片
-- 社交媒体推广
-
----
-
-### 案例 3:小说转短剧分镜
-
-**流程**:
-```
-1. 去 AO3 找短文
-2. 和 Gemini 说将其生成 12 张图
-3. 得到人物一致性非常高的一组图
-4. 配合图片转视频工具制作小说转短剧
-```
-
-**成本**:极低($0.067 × 12 = $0.804)
-
-**优势**:
-- 人物一致性高(90-95%)
-- 快速生成分镜
-- 可批量制作
-
----
-
-## 与 ComfyUI 工作流整合
-
-### 整合方案
-
-```
-Nano Banana 多图融合 → ComfyUI 后处理
-                        ├─ ControlNet 结构微调
-                        ├─ IP-Adapter 风格统一
-                        ├─ FaceDetailer 细节修复
-                        └─ Upscale 高清放大
-```
-
-### 典型应用场景
-
-1. **电商产品图**:
-   - Nano Banana: 产品 + 场景融合
-   - ComfyUI: 细节优化、高清放大
-
-2. **角色一致性漫画**:
-   - Nano Banana: 多格分镜生成
-   - ComfyUI: 风格统一、对话框添加
-
-3. **科研绘图**:
-   - Nano Banana: 图表 + 数据融合
-   - ComfyUI: 标注优化、格式调整
-
----
-
-## 关联知识
-
-- **ComfyUI 画中画工作流**: 可将 Nano Banana 生成结果作为输入进行进一步处理
-- **Midjourney v7 厚涂风格**: 可使用 MJ 生成风格参考图,通过 Nano Banana 融合到目标场景
-- **ControlNet+IPAdapter 双控架构**: ComfyUI 后处理的核心技术
-
----
-
-## 官方资源
-
-- **API 文档**: https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-image-preview
-- **DeepMind 模型页**: https://deepmind.google/models/gemini-image/flash/
-- **AI Studio**: https://aistudio.google.com/models/gemini-3-1-flash-image
-
----
-
-## 更新日志
-
-- 2026-04-11: 初始入库,包含 ComfyUI 工作流配置、3 种编辑方法、15 种场景、3 个实战案例

+ 0 - 20
knowledge/knowledge-20260412-005015-nano-banana-image-urls.json

@@ -1,20 +0,0 @@
-{
-  "id": "knowledge-20260412-005015-nano-banana-image-urls",
-  "task": "在图像生成任务中使用 nano_banana 工具传递参考图",
-  "content": "当使用 nano_banana 工具进行图像生成时,image_urls 参数不支持本地相对路径,必须使用 HTTP/HTTPS CDN URL。\n\n## 错误做法\n\n**直接传本地相对路径**:\n```json\n{\n  \"image_urls\": [\"examples/production_restore/features/character_asset/character_ref_kneel.png\"]\n}\n```\n返回错误:HTTP 503: \"images[].data 看起来是文件路径但文件不存在\"\n\n**另一个错误示例**:\n```json\n{\"image_urls\": [\"examples/production_restore/img_1.png\"]}\n```\n报错:HTTP 503: images[].data 看起来是文件路径但文件不存在\n\n**注意**:虽然角色说明中提到 toolhub.py 内置的 `_preprocess_params` 函数会自动将本地路径上传到 OSS,但实际测试发现这个功能没有生效,需要手动调用 image_uploader 上传。\n\n## 正确做法\n\n1. 先调用 image_uploader 上传本地图片:\n```python\n# 步骤 1:上传图片\ncdn_url = image_uploader(local_path=\"examples/production_restore/img_1.png\")\n# 返回:https://res.cybertogether.net/toolhub_images/img_1.png\n\n# 步骤 2:调用 nano_banana\ntoolhub_call(tool_id=\"nano_banana\", params={\n    \"image_urls\": [cdn_url],\n    \"prompt\": \"...\"\n})\n```\n\n2. 再将 CDN URL 传入 nano_banana:\n```python\ntoolhub_call(tool_id=\"nano_banana\", params={\n  \"image_urls\": [\"https://res.cybertogether.net/toolhub_images/character_ref_kneel.png\"]\n})\n```\n\n## 原因\n\nnano_banana 工具运行在远程环境中,无法直接访问本地文件系统,必须通过 HTTP URL 访问图片。\n\n## 案例\n\nimg_1 生成任务中,最初传入相对路径导致 HTTP 503 错误,错误信息明确指出「请传 HTTP URL 或绝对路径,调用方应先把本地文件上传到 OSS 再传 CDN URL」。改用 image_uploader 上传三张参考图后获得 CDN URL,再次调用 nano_banana 成功生成图像。",
-  "types": ["experience"],
-  "tags": {
-    "intent": "图像生成",
-    "state": "nano_banana",
-    "tool": "image_uploader"
-  },
-  "score": 5,
-  "source": {
-    "category": "research"
-  },
-  "created_at": "2026-04-12T00:50:15Z",
-  "updated_at": "2026-04-12T01:53:12Z",
-  "tool_ids": ["tools/image_gen/nano_banana", "tools/upload/image_uploader"],
-  "capability_ids": ["CAP-003"],
-  "related_knowledge_ids": ["knowledge-20260409-182612-108d", "knowledge-20260412-010725-nano-banana-http503"]
-}

+ 0 - 20
knowledge/knowledge-20260412-010725-nano-banana-http503.json

@@ -1,20 +0,0 @@
-{
-  "id": "knowledge-20260412-010725-nano-banana-http503",
-  "task": "nano_banana 工具图片传递方式:需先上传获取 CDN URL",
-  "content": "当使用 nano_banana 工具进行图像生成时,如果传入本地文件路径会报错 HTTP 503:\"images[].data 看起来是文件路径但文件不存在\"。\n\n**错误做法**:直接传本地相对路径\n```json\n{\n  \"image_urls\": [\"examples/production_restore/features/character_asset/character_ref_kneel.png\"]\n}\n```\n\n**正确做法**:\n1. 先调用 image_uploader 上传本地图片:\n```python\nimage_uploader(local_path=\"examples/production_restore/features/character_asset/character_ref_kneel.png\")\n→ 返回 cdn_url: \"https://res.cybertogether.net/toolhub_images/character_ref_kneel.png\"\n```\n2. 再将 CDN URL 传入 nano_banana:\n```python\ntoolhub_call(tool_id=\"nano_banana\", params={\n  \"image_urls\": [\"https://res.cybertogether.net/toolhub_images/character_ref_kneel.png\"]\n})\n```\n\n**原因**:nano_banana 工具运行在远程环境中,无法直接访问本地文件系统,必须通过 HTTP URL 访问图片。\n\n**案例**:\n- img_1 生成:传入相对路径导致 HTTP 503 错误,改用 image_uploader 上传后成功\n- img_4 生成:最初直接传本地路径 \"examples/production_restore/features/character_asset/character_ref_side.png\" 导致失败,改用 image_uploader 上传 4 张图片获取 CDN URL 后成功生成",
-  "types": ["experience"],
-  "tags": {
-    "intent": "图像生成",
-    "state": "nano_banana",
-    "tool": "image_uploader"
-  },
-  "score": 4,
-  "source": {
-    "category": "research"
-  },
-  "created_at": "2026-04-12T01:07:25Z",
-  "updated_at": "2026-04-12T01:53:12Z",
-  "tool_ids": ["tools/image_gen/nano_banana", "tools/upload/image_uploader"],
-  "capability_ids": ["CAP-001", "CAP-011"],
-  "related_knowledge_ids": ["knowledge-20260409-182612-108d", "knowledge-20260412-005015-nano-banana-image-urls", "knowledge-20260412-010726-nano-banana-multi-fusion"]
-}

Разница между файлами не показана из-за своего большого размера
+ 0 - 3
knowledge/knowledge-20260412-010726-nano-banana-multi-fusion.json


+ 0 - 20
knowledge/knowledge-20260412-014259-3abf.json

@@ -1,20 +0,0 @@
-{
-  "id": "knowledge-20260412-014259-3abf",
-  "task": "在 nano_banana 图生图任务中,参考图需要先上传获取 CDN URL 再传入",
-  "content": "当使用 nano_banana 工具进行多图融合生图时,image_urls 参数不能直接传本地文件路径(如 examples/xxx.png),否则会报错「文件不存在」。正确做法是:先调用 image_uploader 工具将本地图片上传到 OSS 获取 CDN URL,再将 CDN URL 传入 nano_banana 的 image_urls 参数。案例:本次 img_1 生成任务中,先调用 image_uploader 上传 character_ref_img1.png、background_green_img1.png、palette_impasto_img1_v2.png、easel_blank_canvas_img4.png 四张参考图,获取 CDN URL 后传入 nano_banana,生成成功。",
-  "types": ["experience"],
-  "tags": {
-    "intent": "图像生成",
-    "state": "nano_banana",
-    "tool": "image_uploader"
-  },
-  "score": 4,
-  "source": {
-    "category": "research"
-  },
-  "created_time": 1776067979,
-  "tool_ids": ["tools/image_gen/nano_banana", "tools/upload/image_uploader"],
-  "capability_ids": [],
-  "requirement_ids": [],
-  "resource_ids": []
-}

+ 0 - 21
knowledge/strategy/品类分组判断标准.json

@@ -1,21 +0,0 @@
-{
-  "id": "knowledge-20260410-category-grouping",
-  "task": "工作流品类分组的判断标准",
-  "content": "在分析多条工作流进行品类分组时,应基于以下维度判断:\n\n1. **核心主体**:工作流围绕什么核心对象展开(人物/场景/光影/纹理)\n\n2. **技术手段相似性**:是否使用相似的工具链和技术方法\n\n3. **输出目标一致性**:最终产出的内容类型是否相同\n\n4. **粒度把握**:品类名称应品类无关(如'人物肖像'而非'电商人物肖像'),便于跨领域比较\n\n本次分析案例:\n- wf_002(局部特写)+ wf_003(近景肖像)→ 人物肖像类(都是人物主体,都涉及细节修复和身份锁定)\n- wf_001 → 场景构建类(场景 + 人物综合,涉及 3D 建模和场景合成)\n- wf_004 → 光影艺术类(专门的光影控制,使用 ControlNet/IC-Light 等)\n- wf_005 → 纹理风格类(材质纹理效果,涉及颗粒/纸张/复古风格)",
-  "types": ["strategy"],
-  "tags": {
-    "domain": "工作流分析",
-    "method": "品类分组",
-    "key_skill": "语义聚类"
-  },
-  "score": 4,
-  "source": {
-    "category": "execution"
-  },
-  "created_at": "2026-04-10T16:58:05",
-  "status": "active",
-  "related_knowledge": [
-    "knowledge-20260410-variant-analysis-method",
-    "knowledge-20260410-causal-reasoning"
-  ]
-}

+ 0 - 20
knowledge/strategy/粗工序因果推理方法.json

@@ -1,20 +0,0 @@
-{
-  "id": "knowledge-20260410-causal-reasoning",
-  "task": "工作流粗工序提取的因果推理方法",
-  "content": "在总结粗工序时,必须解释'为什么先做 A 再做 B',而不是简单列举频次。核心推理框架包括:\n\n1. **依赖关系原则**:后续步骤依赖前序步骤的输出(如'局部细节修复必须在身份锁定之后进行,否则修复结果无法保持角色一致性')\n\n2. **先整体后局部原则**:先建立基础框架再处理细节(如'首先生成基础人像,因为后续所有细节处理都依赖于一个可用的基础图像')\n\n3. **先生成后修复原则**:先产生可用结果再进行优化(如'放大和精修是最终输出前的必要步骤,放在后期处理')\n\n4. **分离 - 合成策略**:将独立元素分别处理后再合并(如'场景背景和人物图像分别生成后再进行合成,这种分离策略允许对场景和人物独立优化,避免相互干扰')\n\n5. **先规划后执行原则**:先设计蓝图再技术实现(如'整体光照方案是所有后续技术实现的基础蓝图,必须在布局确定后进行配置')\n\n6. **先基础后风格化原则**:先完成基础处理再进行艺术增强(如'色彩调整是光影/纹理处理完成后的最终润色步骤,过早调色会干扰基础效果的准确呈现')",
-  "types": ["strategy"],
-  "tags": {
-    "domain": "工作流分析",
-    "method": "粗工序提取",
-    "key_skill": "因果推理"
-  },
-  "score": 5,
-  "source": {
-    "category": "execution"
-  },
-  "created_at": "2026-04-10T16:58:05",
-  "status": "active",
-  "related_knowledge": [
-    "knowledge-20260410-variant-analysis-method"
-  ]
-}

+ 0 - 17
knowledge/strategy/能力模块变体分析方法.json

@@ -1,17 +0,0 @@
-{
-  "id": "knowledge-20260410-variant-analysis-method",
-  "task": "能力模块实现变体分析方法",
-  "content": "在工作流分析中,为能力模块分析实现变体的方法:\n\n1. **变体聚类依据**:根据工具/方法相似性进行聚类,每个模块聚类为 2-4 个变体\n\n2. **变体命名规范**:「工具/方法」+「方案」,如「LoRA 方案」、「IPAdapter 方案」、「ControlNet 方案」、「Photoshop 后期方案」等\n\n3. **变体结构**:\n   - name:变体名称(符合命名规范)\n   - description:变体描述(一句话说明核心方法)\n   - steps:典型执行步骤(2-4 步,动宾结构)\n   - source_workflows:来源工作流列表(如 [\"wf_001\", \"wf_002\"])\n\n4. **分析要点**:\n   - 忠实于原始工作流数据,不臆造不存在的工具或方法\n   - 变体之间应有明显的方法差异(如 AI 生成 vs 手工绘制 vs 外部素材)\n   - 步骤描述应体现因果性编排思路(为什么先做 A 再做 B)\n   - 注明每个变体来自哪些工作流,便于追溯\n\n5. **常见变体类型**:\n   - AI 生成方案(使用 FLUX/ComfyUI/Midjourney 等)\n   - 控制技术方案(ControlNet/LoRA/PuLID 等)\n   - 后期处理方案(Photoshop/Illustrator 等)\n   - 提示词方案(通过提示词工程实现)\n   - 3D/渲染方案(Blender 等)",
-  "types": ["strategy"],
-  "tags": {
-    "domain": "工作流分析",
-    "method": "变体分析",
-    "output_format": "JSON"
-  },
-  "score": 4,
-  "source": {
-    "category": "execution"
-  },
-  "created_at": "2026-04-10T16:54:50",
-  "status": "active"
-}

Разница между файлами не показана из-за своего большого размера
+ 0 - 9
knowledge_batch_20260409.json


+ 0 - 26
knowledge_batch_20260409_execution.json

@@ -1,26 +0,0 @@
-{
-  "upload_batch": "X 搜索接口稳定性问题",
-  "upload_date": "2026-04-09",
-  "source_type": "execution",
-  "knowledge_count": 1,
-  "knowledge": [
-    {
-      "id": "knowledge-20260409-exec-001",
-      "task": "X 搜索接口稳定性问题及应对策略",
-      "content": "## 问题描述\n在执行 X 渠道调研时,x_search 工具在以下情况出现连续失败:\n- 关键词 1(close-up portrait AI workflow tutorial):成功返回 20 条结果\n- 关键词 2(portrait bokeh background AI workflow):连续 5 次搜索均返回\"X 搜索异常\"或\"搜索失败:未知错误\"\n- 关键词 3(facial expression AI art workflow):连续搜索返回异常\n- 尝试替代关键词(portrait bokeh AI, bokeh background portrait AI):同样失败\n\n## 应对策略\n1. **重试机制**:接口失败时应重试 2 次,若仍失败则标注渠道状态为\"接口失败\"\n2. **降级处理**:当部分关键词失败时,基于已成功获取的数据继续完成调研\n3. **结果标注**:在输出 JSON 中明确标注\"渠道状态\": \"部分接口失败\",并记录实际获取的数据量\n4. **数据利用**:即使部分关键词失败,也要充分利用已成功获取的数据进行工序提取\n\n## 工具使用建议\n- x_search 工具可能存在限流或不稳定性,建议批量搜索时设置间隔\n- 搜索失败时应记录失败关键词,便于后续分析\n- 对于关键调研任务,建议准备备选渠道或搜索策略",
-      "types": ["experience"],
-      "score": 4,
-      "tags": {"intent": "渠道调研", "state": "x_search", "issue": "接口失败", "channel": "X (Twitter)"},
-      "source": {"category": "execution"},
-      "tools": ["x_search"]
-    }
-  ],
-  "tools": [
-    {
-      "name": "x_search",
-      "introduction": "搜索 X (Twitter) 内容的工具,数据已结构化,无需访问详情页",
-      "status": "存在稳定性问题",
-      "tutorial": "批量搜索时建议设置间隔,失败时应重试 2 次"
-    }
-  ]
-}

+ 0 - 34
knowledge_batch_20260410_workflow_analysis.json

@@ -1,34 +0,0 @@
-{
-  "upload_batch": "工作流分析 Pipeline 元知识",
-  "upload_date": "2026-04-10",
-  "source_type": "execution",
-  "knowledge_count": 2,
-  "knowledge": [
-    {
-      "id": "knowledge-20260410-wf-001",
-      "task": "工作流分析 Pipeline 数据源定位方法",
-      "content": "## 工作流数据存储位置\n工作流数据存储在 `tool_research_v2` 的输出目录中,格式为 JSON 文件。\n\n## 数据结构\n```json\n{\n  \"渠道名称\": \"小红书/X (Twitter)/YouTube\",\n  \"工序发现\": [\n    {\n      \"方案名称\": \"...\",\n      \"工序步骤\": [\n        {\n          \"步骤序号\": 1,\n          \"步骤描述\": \"...\",\n          \"使用工具\": \"...\",\n          \"用户输入\": \"...\",\n          \"输出结果\": \"...\"\n        }\n      ],\n      \"帖子链接\": \"...\"\n    }\n  ]\n}\n```\n\n## 工作流分析入口\n**脚本路径**:`examples/workflow_analysis/run.py`\n\n### 功能\n- 从 `tool_research_v2` 输出目录读取 JSON 文件\n- 自动编号为 `wf_001`, `wf_002`, `wf_003`...\n- 输出意图分析结果到 `examples/research/outputs/analysis/`\n\n### 关键代码逻辑\n1. `load_workflows_from_dir()` 扫描输入目录下所有 JSON 文件\n2. 支持两种目录结构:\n   - 单次调研输出:直接含 `*.json` 文件\n   - 批量调研输出:含 `00/`, `01/` 等子目录\n3. 每个工序发现项自动分配 `wf_{index:03d}` 编号",
-      "types": ["strategy"],
-      "score": 4,
-      "tags": {
-        "source": "examples/workflow_analysis/run.py",
-        "domain": "工作流分析",
-        "pipeline": "workflow_analysis"
-      },
-      "source": {"category": "execution"}
-    },
-    {
-      "id": "knowledge-20260410-wf-002",
-      "task": "工作流意图分析输出格式规范",
-      "content": "## 输出格式\n意图分析结果输出为 JSON 数组,每个元素包含:\n\n```json\n{\n  \"intent\": \"意图描述(20 字以内,动宾结构)\",\n  \"source_steps\": [\"来源步骤列表(格式:WF 编号-Step 序号)\"],\n  \"tools\": [\"使用的工具列表\"]\n}\n```\n\n### 字段说明\n- **intent**: 意图描述,20 字以内,动宾结构\n  - 示例:\"生成基础人像\"、\"手部细节修复\"\n- **source_steps**: 来源步骤列表\n  - 格式:`\"WF 编号-Step 序号\"`\n  - 示例:`\"1.1-Step1\"`、`\"6.1-Step2\"`\n- **tools**: 使用的工具列表\n  - 示例:`[\"FLUX.1 Dev\", \"ControlNet Inpaint\", \"InstantID\"]`\n\n## 意图聚类原则\n\n1. **相似步骤合并**:多个工作流的相似步骤合并为同一意图\n   - 示例:多个工作流的\"第一步生成基础图像\" → \"生成基础人像\"\n\n2. **品类无关描述**:意图描述要品类无关,便于跨工作流比较\n\n3. **工具列表合并**:工具列表合并该意图下所有工作流使用的工具\n\n## 输出文件路径\n`examples/research/outputs/analysis/wf_{编号}_intents.json`\n\n### 示例\n- `wf_001_intents.json`\n- `wf_002_intents.json`",
-      "types": ["strategy"],
-      "score": 4,
-      "tags": {
-        "source": "examples/research/outputs/analysis/wf_001_intents.json",
-        "domain": "工作流分析",
-        "output_format": "intent_json"
-      },
-      "source": {"category": "execution"}
-    }
-  ]
-}

+ 0 - 51
knowledge_batch_20260411_toolhub_error_recovery.json

@@ -1,51 +0,0 @@
-{
-  "upload_batch": "ToolHub 错误恢复与图像评估局限性",
-  "upload_date": "2026-04-11",
-  "source_type": "execution",
-  "knowledge_count": 2,
-  "knowledge": [
-    {
-      "id": "knowledge-20260411-exec-001",
-      "task": "在 ToolHub 搜索接口返回 500 错误时直接调用工具",
-      "content": "当 toolhub_search 返回 500 Internal Server Error 但 toolhub_health 检查通过时,可以直接尝试调用 toolhub_call 执行工具。健康检查通过说明服务核心功能可用,搜索接口可能是临时故障。\n\n## 错误恢复策略\n1. **健康检查优先**:遇到 toolhub_search 失败时,先用 toolhub_health 确认服务状态\n2. **区分故障类型**:\n   - toolhub_health 返回 status=ok → 服务核心功能可用,搜索接口可能临时故障\n   - toolhub_health 返回无法连接 → 服务完全不可用,应停止所有依赖 ToolHub 的操作\n3. **绕过搜索直接调用**:健康检查通过时,可直接使用 toolhub_call(tool_id=xxx, params={...}) 执行工具\n\n## 案例\nimg_5 生成任务中:\n- toolhub_health 返回 status=ok\n- toolhub_search 两次返回 500 错误\n- 直接调用 toolhub_call tool_id=nano_banana 成功执行生成任务\n\n## 与已有知识的区别\n- knowledge-20260401-232436-e12e 记录的是服务**完全不可用**时的处理策略(停止操作、记录失败原因)\n- 本知识补充了**部分接口故障**时的错误恢复策略(绕过搜索接口直接调用)",
-      "types": ["experience"],
-      "score": 4,
-      "tags": {"intent": "图像生成", "state": "ToolHub", "issue": "接口故障恢复", "tools": ["toolhub_search", "toolhub_health", "toolhub_call"]},
-      "source": {"category": "execution"},
-      "related_knowledge": ["knowledge-20260401-232436-e12e", "knowledge-20260409-193020-736a"],
-      "related_tools": ["tools/workflow/toolhub"],
-      "related_capabilities": ["CAP-011"]
-    },
-    {
-      "id": "knowledge-20260411-exec-002",
-      "task": "在特写镜头图像评估中姿态维度得分偏低是正常现象",
-      "content": "当生成特写镜头(如手部、道具特写)时,evaluate_image 的姿态维度得分会自然偏低(7/10 左右),因为特写画面不包含完整的人物姿态信息。这是评估工具的局限性,不应视为生成失败。\n\n## 评估维度说明\n- **姿态维度**:评估人物整体姿态、动作、构图的完整性\n- **特写镜头特征**:画面聚焦于局部(手部、道具、面部等),不包含完整人物姿态\n- **得分预期**:特写镜头的姿态维度得分通常在 7/10 左右,属于正常范围\n\n## 判断标准\n不应仅凭姿态维度得分判断生成质量,应综合评估:\n1. **核心目标达成度**:如材质质感、细节清晰度等关键指标\n2. **其他维度得分**:材质、构图、色彩等维度可能得分很高\n3. **整体评分**:整体 8.5/10 以上即表示生成成功\n\n## 案例\nimg_5 调色板 Impasto 特写评估中:\n- 姿态得分:7/10(偏低,但符合特写镜头特征)\n- 材质得分:9/10(核心目标达成)\n- 整体评分:8.5/10(生成成功)\n\n## 与已有知识的关联\n- knowledge-20260409-192122-d730 记录了特写镜头生成的 prompt 优化技巧\n- 本知识补充了特写镜头**评估阶段的注意事项**,帮助区分\"生成失败\"和\"评估工具局限性\"",
-      "types": ["experience"],
-      "score": 3,
-      "tags": {"intent": "图像评估", "state": "evaluate_image", "limitation": "姿态评估局限性", "scenario": "特写镜头"},
-      "source": {"category": "execution"},
-      "related_knowledge": ["knowledge-20260409-192122-d730"],
-      "related_capabilities": ["CAP-002"]
-    }
-  ],
-  "tools": [
-    {
-      "name": "toolhub_search",
-      "introduction": "ToolHub 工具搜索接口",
-      "status": "可能存在临时故障",
-      "tutorial": "返回 500 错误时,先用 toolhub_health 检查服务状态,若健康检查通过可直接调用 toolhub_call"
-    },
-    {
-      "name": "toolhub_health",
-      "introduction": "ToolHub 服务健康检查接口",
-      "status": "正常",
-      "tutorial": "用于确认 ToolHub 服务核心功能是否可用,返回 status=ok 表示服务可用"
-    },
-    {
-      "name": "toolhub_call",
-      "introduction": "ToolHub 工具调用接口",
-      "status": "正常",
-      "tutorial": "传入 tool_id 和 params 执行远程工具,可绕过 toolhub_search 直接调用"
-    }
-  ]
-}

Разница между файлами не показана из-за своего большого размера
+ 0 - 81
pre_upload_list.json


+ 0 - 18
tools/image_gen/nano_banana.json

@@ -1,18 +0,0 @@
-{
-  "id": "tools/image_gen/nano_banana",
-  "name": "nano_banana",
-  "version": null,
-  "introduction": "AI 图像生成工具,支持参考图输入进行图像生成",
-  "tutorial": "图像生成时,image_urls 参数必须使用 HTTP/HTTPS CDN URL,不支持本地相对路径。正确流程:先用 image_uploader 工具将本地图片上传到 OSS 获取 CDN URL,再将 cdn_url 传入 nano_banana 的 image_urls 参数。",
-  "input": {
-    "image_urls": "HTTP/HTTPS CDN URL 列表,不支持本地相对路径"
-  },
-  "output": {
-    "generated_images": "生成的图像 URL 列表"
-  },
-  "updated_time": 1776067846,
-  "status": "已接入",
-  "capability_ids": ["CAP-001", "CAP-003", "CAP-008", "CAP-014", "CAP-016"],
-  "knowledge_ids": ["knowledge-20260412-005015-nano-banana-image-urls", "knowledge-20260412-005446-88f1", "knowledge-20260412-005446-bc40", "knowledge-20260412-014259-3abf"],
-  "provider_ids": []
-}

+ 0 - 18
tools/upload/image_uploader.json

@@ -1,18 +0,0 @@
-{
-  "id": "tools/upload/image_uploader",
-  "name": "image_uploader",
-  "version": null,
-  "introduction": "图片上传工具,将本地图片上传到 OSS 对象存储,返回 CDN URL",
-  "tutorial": "上传本地图片到 OSS,返回 cdn_url 可用于其他工具(如 nano_banana)的 image_urls 参数。支持批量上传多张图片。",
-  "input": {
-    "local_paths": "本地图片路径列表(支持相对路径或绝对路径)"
-  },
-  "output": {
-    "cdn_urls": "上传成功后返回的 CDN URL 列表,格式如 https://res.cybertogether.net/toolhub_images/xxx.png"
-  },
-  "updated_time": 1776067846,
-  "status": "已接入",
-  "capability_ids": [],
-  "knowledge_ids": ["knowledge-20260412-005015-nano-banana-image-urls", "knowledge-20260412-005446-88f1", "knowledge-20260412-014259-3abf"],
-  "provider_ids": []
-}

+ 0 - 199
wf_004_intents.json

@@ -1,199 +0,0 @@
-{
-  "workflow_id": "wf_004",
-  "workflow_name": "AI 光影控制与电影级布光工作流合集",
-  "total_workflows": 9,
-  "total_intents": 25,
-  "intents": [
-    {
-      "intent": "配置多单元 ControlNet 协同控制",
-      "source_steps": "WF1-Step2",
-      "tools": ["ControlNet", "Stable Diffusion"]
-    },
-    {
-      "intent": "生成线稿结构控制图",
-      "source_steps": "WF1-Step2.1",
-      "tools": ["ControlNet Lineart"]
-    },
-    {
-      "intent": "迁移参考图光影风格",
-      "source_steps": "WF1-Step2.2",
-      "tools": ["ControlNet Reference"]
-    },
-    {
-      "intent": "控制色彩分布",
-      "source_steps": "WF1-Step2.3",
-      "tools": ["ControlNet Shuffle"]
-    },
-    {
-      "intent": "生成深度图控制景深",
-      "source_steps": "WF1-Step2.4",
-      "tools": ["ControlNet Depth"]
-    },
-    {
-      "intent": "配置体积光与丁达尔效应关键词",
-      "source_steps": "WF1-Step3",
-      "tools": ["Prompt Engineering"]
-    },
-    {
-      "intent": "设置采样参数与高清修复",
-      "source_steps": "WF1-Step4",
-      "tools": ["KSampler", "Upscale"]
-    },
-    {
-      "intent": "保护面部防止畸变",
-      "source_steps": "WF1-Step5",
-      "tools": ["ADetailer"]
-    },
-    {
-      "intent": "选择 IC-Light 模型变体",
-      "source_steps": "WF2-Step2",
-      "tools": ["IC-Light"]
-    },
-    {
-      "intent": "配置光源位置与大小",
-      "source_steps": "WF2-Step3",
-      "tools": ["IC-Light ComfyUI Nodes"]
-    },
-    {
-      "intent": "选择光照预设或自定义",
-      "source_steps": "WF2-Step4",
-      "tools": ["IC-Light Lighting Preference"]
-    },
-    {
-      "intent": "生成重新照明结果",
-      "source_steps": "WF2-Step6",
-      "tools": ["IC-Light Generation"]
-    },
-    {
-      "intent": "选择电影灯光类型",
-      "source_steps": "WF3-Step1",
-      "tools": ["Prompt Library"]
-    },
-    {
-      "intent": "组合灯光与色温参数",
-      "source_steps": "WF3-Step2",
-      "tools": ["Prompt Engineering"]
-    },
-    {
-      "intent": "添加相机参数与风格修饰",
-      "source_steps": "WF3-Step3",
-      "tools": ["Prompt Engineering"]
-    },
-    {
-      "intent": "选择 Qwen 多角度灯光方向",
-      "source_steps": "WF4-Step2",
-      "tools": ["Qwen Image Edit", "Multi-Angle Lighting LoRA"]
-    },
-    {
-      "intent": "创建选择性重打光蒙版",
-      "source_steps": "WF4-Step3",
-      "tools": ["Affinity Photo"]
-    },
-    {
-      "intent": "配置亮度映射图引导",
-      "source_steps": "WF4-Step5",
-      "tools": ["Luminance Map"]
-    },
-    {
-      "intent": "导出 3D 场景渲染通道",
-      "source_steps": "WF5-Step1",
-      "tools": ["Blender"]
-    },
-    {
-      "intent": "生成风格参考帧",
-      "source_steps": "WF5-Step2",
-      "tools": ["Z-Image Turbo"]
-    },
-    {
-      "intent": "生成一致的视频序列",
-      "source_steps": "WF5-Step3",
-      "tools": ["SkyReels V3 R2V", "Wan VACE"]
-    },
-    {
-      "intent": "合并模型实现物理光影",
-      "source_steps": "WF5-Step5",
-      "tools": ["Inner-Reflections Model Merge"]
-    },
-    {
-      "intent": "配置 Chiaroscuro 明暗对照参数",
-      "source_steps": "WF6-Step5",
-      "tools": ["Google Gemini Pro"]
-    },
-    {
-      "intent": "设置伦勃朗风格光影",
-      "source_steps": "WF6-Step5",
-      "tools": ["Prompt Engineering"]
-    },
-    {
-      "intent": "搭建 ComfyUI 节点工作流",
-      "source_steps": "WF7-Step1",
-      "tools": ["ComfyUI"]
-    }
-  ],
-  "workflows_summary": [
-    {
-      "wf_id": "WF1",
-      "name": "ControlNet 多单元协同光影控制",
-      "step_count": 6,
-      "intent_count": 8,
-      "core_tools": ["ControlNet", "Stable Diffusion", "ADetailer"]
-    },
-    {
-      "wf_id": "WF2",
-      "name": "IC-Light 重新照明",
-      "step_count": 6,
-      "intent_count": 4,
-      "core_tools": ["IC-Light", "ComfyUI"]
-    },
-    {
-      "wf_id": "WF3",
-      "name": "20 种电影灯光提示词",
-      "step_count": 3,
-      "intent_count": 3,
-      "core_tools": ["Prompt Engineering"]
-    },
-    {
-      "wf_id": "WF4",
-      "name": "Qwen 多角度重打光",
-      "step_count": 8,
-      "intent_count": 4,
-      "core_tools": ["Qwen Image Edit", "Multi-Angle Lighting LoRA"]
-    },
-    {
-      "wf_id": "WF5",
-      "name": "AI 渲染引擎 (3D 转 AI)",
-      "step_count": 8,
-      "intent_count": 5,
-      "core_tools": ["Blender", "SkyReels", "Wan VACE"]
-    },
-    {
-      "wf_id": "WF6",
-      "name": "Chiaroscuro 古典光影",
-      "step_count": 7,
-      "intent_count": 2,
-      "core_tools": ["Google Gemini Pro"]
-    },
-    {
-      "wf_id": "WF7",
-      "name": "ComfyUI 电影制作",
-      "step_count": 8,
-      "intent_count": 1,
-      "core_tools": ["ComfyUI"]
-    },
-    {
-      "wf_id": "WF8",
-      "name": "虚拟场景生成",
-      "step_count": "TBD",
-      "intent_count": "TBD",
-      "core_tools": ["TBD"]
-    },
-    {
-      "wf_id": "WF9",
-      "name": "Runway Alep",
-      "step_count": "TBD",
-      "intent_count": "TBD",
-      "core_tools": ["Runway"]
-    }
-  ],
-  "note": "wf_004 raw_markdown 文件不存在,此分析基于任务描述中列出的 9 个工作流名称和知识库中已有的相关工作流数据推断生成。WF8 和 WF9 的详细信息缺失。"
-}

Некоторые файлы не были показаны из-за большого количества измененных файлов