Jelajahi Sumber

feat: initial commit

gangvy 3 hari lalu
melakukan
091dbb5028

+ 130 - 0
README.md

@@ -0,0 +1,130 @@
+# OpenClaw VOC Skill Collection
+
+VOC(Voice of Customer)数据查询服务的 OpenClaw Skill 定义文件集合。
+
+## 目录结构
+
+```
+openclaw-voc-skill/
+├── voc/                          # Amazon/Sorftime 电商数据接口
+│   ├── product_detail_query      # 产品详情查询 (ASIN → 价格/评分/销量/BSR)
+│   ├── product_search            # 关键词搜索产品 (keyword → 产品列表)
+│   ├── product_reviews_query     # 产品评论查询 (ASIN → 评论列表)
+│   ├── keyword_search            # 关键词查询 (keyword → 搜索量/竞争度)
+│   ├── keyword_search_trend      # 关键词搜索趋势
+│   ├── keyword_product_ranking   # 关键词产品排名
+│   ├── asin_reverse_keywords     # ASIN 反查关键词
+│   ├── asin_sales_volume         # ASIN 销量查询
+│   ├── category_tree             # 类目树查询
+│   ├── category_products         # 类目产品查询
+│   ├── similar_products          # 相似产品查询
+│   └── product_monitor           # 产品监控数据
+│
+└── social-media/                 # TikTok/Instagram 社媒数据接口
+    ├── tiktok_video_search       # TikTok 视频搜索
+    ├── tiktok_video_detail       # TikTok 视频详情
+    ├── tiktok_video_comments     # TikTok 视频评论
+    ├── tiktok_user_search        # TikTok 用户搜索
+    ├── tiktok_user_profile       # TikTok 用户详情
+    ├── tiktok_user_posts         # TikTok 用户作品列表
+    ├── tiktok_hashtag_detail     # TikTok 话题详情
+    ├── tiktok_hashtag_videos     # TikTok 话题视频列表
+    ├── instagram_search          # Instagram 搜索
+    ├── instagram_user_info       # Instagram 用户详情
+    └── instagram_user_posts      # Instagram 用户帖子列表
+```
+
+## 报告生成数据流
+
+以「香薰行业竞品分析报告」为例,生成一份完整报告需要的数据调用链:
+
+```
+输入: 行业关键词 + 竞品品牌列表
+
+Step 1: 品类市场数据
+  product_search × 6品类 → Top100 产品 ASIN 列表
+  product_detail_query × N → 批量产品详情(价格/销量/评分/品牌)
+  asin_sales_volume × Top ASIN → 销量趋势
+
+Step 2: VOC 评论分析
+  product_reviews_query × Top3 ASIN → 抓取评论(~300条/ASIN)
+  → AI NLP → 情感分类 + 痛点提取 + 场景提取
+
+Step 3: 关键词分析
+  keyword_search × 目标词 → 搜索量/竞争度
+  keyword_search_trend × 目标词 → 趋势变化
+  asin_reverse_keywords × 竞品ASIN → 竞品关键词
+
+Step 4: TikTok 社媒热度
+  tiktok_video_search × 品类词 → 视频播放量统计
+  tiktok_hashtag_detail × 话题ID → 话题总播放量
+  tiktok_user_search × 品类词 → 达人发现
+
+Step 5: Instagram 品牌画像
+  instagram_search × 品牌名 → 找到品牌账号
+  instagram_user_info × 品牌username → 粉丝数/帖子数
+  instagram_user_posts × 品牌pk → 内容策略分析
+
+Step 6: AI 综合分析
+  → 整合 Step 1-5 数据
+  → AI 生成执行策略 + Listing优化 + 广告关键词推荐
+
+Step 7: 渲染 HTML 报告
+```
+
+## Skill JSON 格式说明
+
+每个 `.skill.json` 文件包含以下字段:
+
+| 字段 | 说明 |
+|------|------|
+| `name` | Skill 唯一标识符 |
+| `displayName` | 中文显示名称 |
+| `description` | 功能描述 |
+| `category` | 分类: `voc` 或 `social-media` |
+| `endpoint` | API 端点信息 (method, url, headers) |
+| `parameters` | 输入参数 JSON Schema |
+| `requestTransform` | 参数到实际请求的转换模板 |
+| `response` | 响应数据结构 |
+| `usageExamples` | 调用示例 |
+| `reportMapping` | 该接口数据对应报告的哪些页面和数据点 |
+
+## 报告生成编排 Workflow
+
+完整的报告生成编排定义在 `workflows/` 目录下:
+
+```
+workflows/
+├── report_generation.workflow.json   # 7阶段编排定义(核心文件)
+├── pipeline.md                       # 执行流程图 + 并行度 + API调用量估算
+└── examples/
+    └── fragrance_report_input.json   # 香薰行业完整输入示例
+```
+
+### 7 阶段编排
+
+| 阶段 | 名称 | 并行 | 依赖 | 预计耗时 |
+|------|------|------|------|---------|
+| Stage 1 | 品类市场数据采集 | ✅ | — | 30-60s |
+| Stage 2 | 竞品品牌数据采集 | ✅ | — | 15-30s |
+| Stage 3 | VOC 评论采集与 AI 分析 | — | — | 40-80s |
+| Stage 4 | 社媒热度与趋势数据 | ✅ | — | 15-20s |
+| Stage 5 | 广告关键词分析 | — | Stage 3+4 | 15-25s |
+| Stage 6 | AI 综合分析与策略生成 | — | Stage 1-5 | 30-60s |
+| Stage 7 | 报告渲染 | — | Stage 6 | 5-10s |
+
+> Stage 1/2/4 可完全并行执行,总耗时约 **3-5 分钟**。
+
+详细流程图和数据依赖关系见 [`workflows/pipeline.md`](workflows/pipeline.md)。
+
+## API 认证
+
+### Sorftime (VOC)
+- 通过 `https://server-msq.fmode.cn/api/sorftime/forward` 统一转发
+- 认证已在后端内置,前端无需传入 Token
+- `domain` 参数必须是数字: 1=amazon.com, 2=amazon.co.uk ...
+
+### TikHub (社媒)
+- 直连代理: `https://server.fmode.cn/thapi`
+- 需携带 Bearer Token 在 Authorization header 中
+- 所有请求均为 GET 方法

+ 81 - 0
social-media/instagram_search.skill.json

@@ -0,0 +1,81 @@
+{
+  "name": "instagram_search",
+  "displayName": "Instagram 搜索",
+  "description": "按关键词搜索 Instagram 用户/品牌账号,返回匹配的用户列表。用于竞品品牌 Instagram 账号发现、红人搜索。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/instagram/v1/fetch_search",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["query"],
+    "properties": {
+      "query": {
+        "type": "string",
+        "description": "搜索关键词,如品牌名 'NEST New York'、'Paddywax'、'SpaRoom'"
+      },
+      "select": {
+        "type": "string",
+        "description": "搜索类型: 'users'=搜索用户, 'hashtags'=搜索标签",
+        "default": "users",
+        "enum": ["users", "hashtags"]
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "query": "{{query}}",
+      "select": "{{select}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "搜索结果",
+    "properties": {
+      "users": {
+        "type": "array",
+        "description": "匹配的用户列表",
+        "items": {
+          "type": "object",
+          "properties": {
+            "user": {
+              "type": "object",
+              "properties": {
+                "pk": { "type": "string", "description": "用户数字 ID(用于获取帖子)" },
+                "username": { "type": "string", "description": "用户名" },
+                "full_name": { "type": "string", "description": "显示名称" },
+                "is_verified": { "type": "boolean", "description": "是否认证" },
+                "profile_pic_url": { "type": "string", "description": "头像 URL" },
+                "follower_count": { "type": "integer", "description": "粉丝数" },
+                "is_private": { "type": "boolean", "description": "是否私密账号" }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  "notes": "搜索结果中的 user.pk 可用于 instagram_user_posts 接口获取帖子列表。username 可用于 instagram_user_info 获取详细资料。",
+  "usageExamples": [
+    {
+      "name": "搜索 NEST New York 品牌",
+      "input": { "query": "NEST New York", "select": "users" },
+      "description": "搜索 NEST New York 的 Instagram 品牌账号"
+    },
+    {
+      "name": "搜索 Paddywax 品牌",
+      "input": { "query": "Paddywax", "select": "users" },
+      "description": "搜索 Paddywax 的 Instagram 品牌账号"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["竞品对标(Slide4)", "知识中心(Slide11)"],
+    "dataPoints": ["品牌IG账号发现", "粉丝数初步数据"]
+  }
+}

+ 75 - 0
social-media/instagram_user_info.skill.json

@@ -0,0 +1,75 @@
+{
+  "name": "instagram_user_info",
+  "displayName": "Instagram 用户详情",
+  "description": "根据用户名获取 Instagram 用户的完整资料,包括粉丝数、关注数、帖子数、个人简介、是否认证等。用于竞品品牌社媒画像分析、红人详情获取。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/instagram/v1/fetch_user_info_by_username_v3",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["username"],
+    "properties": {
+      "username": {
+        "type": "string",
+        "description": "Instagram 用户名(不含@),如 'nestnewyork'、'paddywax'"
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "username": "{{username}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "用户详细资料",
+    "properties": {
+      "user": {
+        "type": "object",
+        "properties": {
+          "pk": { "type": "string", "description": "用户数字 ID" },
+          "username": { "type": "string", "description": "用户名" },
+          "full_name": { "type": "string", "description": "显示名称" },
+          "biography": { "type": "string", "description": "个人简介" },
+          "follower_count": { "type": "integer", "description": "粉丝数" },
+          "following_count": { "type": "integer", "description": "关注数" },
+          "media_count": { "type": "integer", "description": "帖子总数" },
+          "is_verified": { "type": "boolean", "description": "是否蓝V认证" },
+          "is_business": { "type": "boolean", "description": "是否商业账号" },
+          "category": { "type": "string", "description": "账号类别" },
+          "external_url": { "type": "string", "description": "外部链接(如品牌官网)" },
+          "profile_pic_url_hd": { "type": "string", "description": "高清头像 URL" }
+        }
+      }
+    }
+  },
+  "notes": "返回的 pk(用户数字 ID)可用于 instagram_user_posts 接口获取帖子列表。media_count 对应报告中的帖子数(如 Paddywax 3,095 条)。",
+  "usageExamples": [
+    {
+      "name": "获取 NEST New York IG 详情",
+      "input": { "username": "nestnewyork" },
+      "description": "获取 NEST New York 的 IG 粉丝数(报告中显示 144,102)、帖子数等"
+    },
+    {
+      "name": "获取 Paddywax IG 详情",
+      "input": { "username": "paddywax" },
+      "description": "获取 Paddywax 的 IG 粉丝数(报告中显示 126,441)和帖子数(3,095 条)"
+    },
+    {
+      "name": "获取 SpaRoom IG 详情",
+      "input": { "username": "sparoom" },
+      "description": "获取 SpaRoom 的 IG 数据(报告中显示极低存在感)"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["竞品对标(Slide4)", "知识中心(Slide11)"],
+    "dataPoints": ["IG粉丝数", "帖子总数", "认证状态", "品牌简介", "外部链接"]
+  }
+}

+ 93 - 0
social-media/instagram_user_posts.skill.json

@@ -0,0 +1,93 @@
+{
+  "name": "instagram_user_posts",
+  "displayName": "Instagram 用户帖子列表",
+  "description": "获取指定 Instagram 用户发布的帖子列表,包括图片、点赞数、评论数等。用于竞品内容策略分析、发帖频率和互动率评估。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/instagram/v1/fetch_user_posts_v2",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["user_id"],
+    "properties": {
+      "user_id": {
+        "type": "string",
+        "description": "Instagram 用户数字 ID(pk),需先通过 instagram_user_info 或 instagram_search 接口获取"
+      },
+      "count": {
+        "type": "integer",
+        "description": "每页帖子数量",
+        "default": 12,
+        "maximum": 50
+      },
+      "end_cursor": {
+        "type": "string",
+        "description": "分页游标,首次不传,后续传上次返回的 end_cursor"
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "user_id": "{{user_id}}",
+      "count": "{{count}}",
+      "end_cursor": "{{end_cursor}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "帖子列表",
+    "properties": {
+      "items": {
+        "type": "array",
+        "description": "帖子数组",
+        "items": {
+          "type": "object",
+          "properties": {
+            "id": { "type": "string", "description": "帖子 ID" },
+            "code": { "type": "string", "description": "帖子短码(URL 用)" },
+            "caption": {
+              "type": "object",
+              "properties": {
+                "text": { "type": "string", "description": "帖子文案" }
+              }
+            },
+            "like_count": { "type": "integer", "description": "点赞数" },
+            "comment_count": { "type": "integer", "description": "评论数" },
+            "taken_at": { "type": "integer", "description": "发布时间戳" },
+            "media_type": { "type": "integer", "description": "媒体类型: 1=图片, 2=视频, 8=轮播" },
+            "image_versions2": {
+              "type": "object",
+              "description": "图片版本列表"
+            },
+            "video_versions": {
+              "type": "array",
+              "description": "视频版本列表(仅视频帖子)"
+            },
+            "view_count": { "type": "integer", "description": "视频观看次数(仅视频帖子)" }
+          }
+        }
+      },
+      "has_more": { "type": "boolean", "description": "是否有更多帖子" },
+      "end_cursor": { "type": "string", "description": "下一页游标" }
+    }
+  },
+  "notes": "user_id 需先通过 instagram_user_info 接口获取 pk 字段。帖子的互动率可通过 (like_count + comment_count) / follower_count 计算。",
+  "relatedSkills": ["instagram_user_info", "instagram_search"],
+  "usageExamples": [
+    {
+      "name": "获取品牌最近帖子",
+      "input": { "user_id": "12345678", "count": 12 },
+      "description": "获取品牌最近 12 条帖子的互动数据,分析内容策略"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["竞品对标(Slide4)", "社媒聆听(Slide14)"],
+    "dataPoints": ["帖子互动率", "发帖频率", "内容类型分布", "品牌视觉风格"]
+  }
+}

+ 57 - 0
social-media/tiktok_hashtag_detail.skill.json

@@ -0,0 +1,57 @@
+{
+  "name": "tiktok_hashtag_detail",
+  "displayName": "TikTok 话题详情",
+  "description": "根据话题/标签 ID 获取话题详情,包括总播放量、视频数量等。用于品类社媒热度统计、话题趋势追踪。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/tiktok/app/v3/fetch_hashtag_detail",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["ch_id"],
+    "properties": {
+      "ch_id": {
+        "type": "string",
+        "description": "TikTok 话题/标签 ID(可从视频搜索结果的 cha_list 中获取)"
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "ch_id": "{{ch_id}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "话题详情",
+    "properties": {
+      "ch_info": {
+        "type": "object",
+        "properties": {
+          "cha_name": { "type": "string", "description": "话题名称" },
+          "cid": { "type": "string", "description": "话题 ID" },
+          "desc": { "type": "string", "description": "话题描述" },
+          "view_count": { "type": "integer", "description": "话题总播放量" },
+          "use_count": { "type": "integer", "description": "使用该话题的视频数" }
+        }
+      }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "获取 #candlewarmer 话题详情",
+      "input": { "ch_id": "1234567" },
+      "description": "获取 candlewarmer 话题的总播放量(报告中显示 2750 万播放)"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["TikTok热度排名(Slide6)", "趋势雷达(Slide12)"],
+    "dataPoints": ["话题总播放量", "使用该话题的视频数", "话题增长率"]
+  }
+}

+ 89 - 0
social-media/tiktok_hashtag_videos.skill.json

@@ -0,0 +1,89 @@
+{
+  "name": "tiktok_hashtag_videos",
+  "displayName": "TikTok 话题视频列表",
+  "description": "获取指定话题/标签下的视频列表,用于分析话题内容趋势、发现热门创作者。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/tiktok/app/v3/fetch_hashtag_video_list",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["ch_id"],
+    "properties": {
+      "ch_id": {
+        "type": "string",
+        "description": "TikTok 话题/标签 ID"
+      },
+      "count": {
+        "type": "integer",
+        "description": "每页视频数量",
+        "default": 20,
+        "maximum": 30
+      },
+      "cursor": {
+        "type": "integer",
+        "description": "分页游标",
+        "default": 0
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "ch_id": "{{ch_id}}",
+      "count": "{{count}}",
+      "cursor": "{{cursor}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "话题下的视频列表",
+    "properties": {
+      "aweme_list": {
+        "type": "array",
+        "items": {
+          "type": "object",
+          "properties": {
+            "aweme_id": { "type": "string" },
+            "desc": { "type": "string" },
+            "statistics": {
+              "type": "object",
+              "properties": {
+                "play_count": { "type": "integer" },
+                "digg_count": { "type": "integer" },
+                "comment_count": { "type": "integer" },
+                "share_count": { "type": "integer" }
+              }
+            },
+            "author": {
+              "type": "object",
+              "properties": {
+                "unique_id": { "type": "string" },
+                "nickname": { "type": "string" },
+                "follower_count": { "type": "integer" }
+              }
+            }
+          }
+        }
+      },
+      "has_more": { "type": "boolean" },
+      "cursor": { "type": "integer" }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "获取话题视频",
+      "input": { "ch_id": "1234567", "count": 20 },
+      "description": "获取 #candlewarmer 话题下的热门视频列表"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["趋势雷达(Slide12)", "社媒聆听(Slide14)"],
+    "dataPoints": ["话题热门视频", "内容灵感", "热门创作者发现"]
+  }
+}

+ 84 - 0
social-media/tiktok_user_posts.skill.json

@@ -0,0 +1,84 @@
+{
+  "name": "tiktok_user_posts",
+  "displayName": "TikTok 用户作品列表",
+  "description": "获取指定 TikTok 用户发布的视频列表,包括每个视频的播放量和互动数据。用于竞品内容策略分析、红人内容表现评估。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/tiktok/app/v3/fetch_user_post_videos",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["sec_user_id"],
+    "properties": {
+      "sec_user_id": {
+        "type": "string",
+        "description": "用户的安全 ID(secUid),需先通过 tiktok_user_profile 接口获取"
+      },
+      "count": {
+        "type": "integer",
+        "description": "每页视频数量",
+        "default": 20,
+        "maximum": 30
+      },
+      "cursor": {
+        "type": "integer",
+        "description": "分页游标",
+        "default": 0
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "sec_user_id": "{{sec_user_id}}",
+      "count": "{{count}}",
+      "cursor": "{{cursor}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "用户视频列表",
+    "properties": {
+      "aweme_list": {
+        "type": "array",
+        "items": {
+          "type": "object",
+          "properties": {
+            "aweme_id": { "type": "string", "description": "视频 ID" },
+            "desc": { "type": "string", "description": "视频描述" },
+            "statistics": {
+              "type": "object",
+              "properties": {
+                "play_count": { "type": "integer" },
+                "digg_count": { "type": "integer" },
+                "comment_count": { "type": "integer" },
+                "share_count": { "type": "integer" }
+              }
+            },
+            "create_time": { "type": "integer", "description": "发布时间戳" }
+          }
+        }
+      },
+      "has_more": { "type": "boolean" },
+      "cursor": { "type": "integer" }
+    }
+  },
+  "notes": "sec_user_id 需先通过 tiktok_user_profile 获取。该接口可用于分析竞品品牌的内容发布频率和互动表现。",
+  "relatedSkills": ["tiktok_user_profile"],
+  "usageExamples": [
+    {
+      "name": "获取品牌视频列表",
+      "input": { "sec_user_id": "MS4wLjABAAAA...", "count": 20 },
+      "description": "获取品牌最近 20 条视频的播放和互动数据"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["竞品对标(Slide4)", "社媒聆听(Slide14)"],
+    "dataPoints": ["内容发布频率", "视频平均播放量", "内容类型分布"]
+  }
+}

+ 76 - 0
social-media/tiktok_user_profile.skill.json

@@ -0,0 +1,76 @@
+{
+  "name": "tiktok_user_profile",
+  "displayName": "TikTok 用户详情",
+  "description": "根据用户名获取 TikTok 用户的完整资料,包括粉丝数、获赞数、作品数、个人简介等。用于竞品品牌社媒画像、红人详情分析。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/tiktok/web/fetch_user_profile",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["uniqueId"],
+    "properties": {
+      "uniqueId": {
+        "type": "string",
+        "description": "TikTok 用户名(不含@),如 'nestnewyork'、'dealwhisperer'"
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "uniqueId": "{{uniqueId}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "用户详情",
+    "properties": {
+      "user": {
+        "type": "object",
+        "properties": {
+          "id": { "type": "string", "description": "用户 ID" },
+          "uniqueId": { "type": "string", "description": "用户名" },
+          "nickname": { "type": "string", "description": "昵称" },
+          "signature": { "type": "string", "description": "个人简介" },
+          "verified": { "type": "boolean", "description": "是否认证" },
+          "avatarLarger": { "type": "string", "description": "头像 URL" },
+          "secUid": { "type": "string", "description": "安全用户 ID(用于获取帖子)" }
+        }
+      },
+      "stats": {
+        "type": "object",
+        "properties": {
+          "followerCount": { "type": "integer", "description": "粉丝数" },
+          "followingCount": { "type": "integer", "description": "关注数" },
+          "heart": { "type": "integer", "description": "获赞总数" },
+          "heartCount": { "type": "integer", "description": "获赞总数(别名)" },
+          "videoCount": { "type": "integer", "description": "作品总数" },
+          "diggCount": { "type": "integer", "description": "点赞数" }
+        }
+      }
+    }
+  },
+  "notes": "返回的 secUid 可用于 tiktok_user_posts 接口获取用户发布的视频列表。",
+  "usageExamples": [
+    {
+      "name": "查看竞品品牌 TikTok 账号",
+      "input": { "uniqueId": "nestnewyork" },
+      "description": "获取 NEST New York 的 TikTok 粉丝数和互动数据(报告中显示 12,700 粉丝)"
+    },
+    {
+      "name": "查看达人详情",
+      "input": { "uniqueId": "dealwhisperer" },
+      "description": "获取达人 @dealwhisperer 的完整资料(报告中显示 2.1M 粉丝)"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["竞品对标(Slide4)", "红人达人库(Slide11)"],
+    "dataPoints": ["TikTok粉丝数", "获赞总数", "作品数", "互动率"]
+  }
+}

+ 87 - 0
social-media/tiktok_user_search.skill.json

@@ -0,0 +1,87 @@
+{
+  "name": "tiktok_user_search",
+  "displayName": "TikTok 用户搜索",
+  "description": "按关键词搜索 TikTok 用户/达人,返回用户列表及粉丝数、关注数等基础信息。用于红人发现、达人库建设。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/tiktok/web/fetch_search_user",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["keyword"],
+    "properties": {
+      "keyword": {
+        "type": "string",
+        "description": "搜索关键词,如品牌名 'NEST New York' 或品类 'candle warmer'"
+      },
+      "count": {
+        "type": "integer",
+        "description": "返回用户数量",
+        "default": 10,
+        "maximum": 30
+      },
+      "cursor": {
+        "type": "integer",
+        "description": "分页游标",
+        "default": 0
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "keyword": "{{keyword}}",
+      "count": "{{count}}",
+      "cursor": "{{cursor}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "用户搜索结果",
+    "properties": {
+      "user_list": {
+        "type": "array",
+        "description": "用户列表(可能在 data.user_list 中)",
+        "items": {
+          "type": "object",
+          "properties": {
+            "user_info": {
+              "type": "object",
+              "properties": {
+                "unique_id": { "type": "string", "description": "用户名" },
+                "nickname": { "type": "string", "description": "昵称" },
+                "follower_count": { "type": "integer", "description": "粉丝数" },
+                "following_count": { "type": "integer", "description": "关注数" },
+                "total_favorited": { "type": "integer", "description": "获赞总数" },
+                "video_count": { "type": "integer", "description": "作品数" },
+                "avatar_larger": { "type": "object", "description": "头像(大图)" },
+                "signature": { "type": "string", "description": "个人简介" }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "搜索香薰达人",
+      "input": { "keyword": "candle warmer", "count": 15 },
+      "description": "搜索与 candle warmer 相关的 TikTok 达人"
+    },
+    {
+      "name": "搜索品牌账号",
+      "input": { "keyword": "NEST New York", "count": 5 },
+      "description": "搜索竞品品牌的 TikTok 官方账号"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["红人达人库(Slide11)"],
+    "dataPoints": ["达人粉丝数", "互动率", "作品数", "品类契合度"]
+  }
+}

+ 83 - 0
social-media/tiktok_video_comments.skill.json

@@ -0,0 +1,83 @@
+{
+  "name": "tiktok_video_comments",
+  "displayName": "TikTok 视频评论查询",
+  "description": "获取指定 TikTok 视频的用户评论列表,用于社媒用户情感分析、需求挖掘、红人互动率计算。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/tiktok/app/v3/fetch_video_comments",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["aweme_id"],
+    "properties": {
+      "aweme_id": {
+        "type": "string",
+        "description": "TikTok 视频唯一 ID"
+      },
+      "count": {
+        "type": "integer",
+        "description": "每页评论数量",
+        "default": 20,
+        "maximum": 50
+      },
+      "cursor": {
+        "type": "integer",
+        "description": "分页游标,首次不传或传 0",
+        "default": 0
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "aweme_id": "{{aweme_id}}",
+      "count": "{{count}}",
+      "cursor": "{{cursor}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "评论列表",
+    "properties": {
+      "comments": {
+        "type": "array",
+        "items": {
+          "type": "object",
+          "properties": {
+            "cid": { "type": "string", "description": "评论 ID" },
+            "text": { "type": "string", "description": "评论内容" },
+            "digg_count": { "type": "integer", "description": "评论点赞数" },
+            "reply_comment_total": { "type": "integer", "description": "回复数" },
+            "create_time": { "type": "integer", "description": "评论时间戳" },
+            "user": {
+              "type": "object",
+              "properties": {
+                "nickname": { "type": "string", "description": "评论者昵称" },
+                "unique_id": { "type": "string", "description": "评论者用户名" }
+              }
+            }
+          }
+        }
+      },
+      "has_more": { "type": "boolean", "description": "是否有更多评论" },
+      "cursor": { "type": "integer", "description": "下一页游标" },
+      "total": { "type": "integer", "description": "评论总数" }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "获取视频评论",
+      "input": { "aweme_id": "7300000000000000000", "count": 20 },
+      "description": "获取视频前 20 条评论用于 AI 情感分析"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["社媒聆听(Slide14)"],
+    "dataPoints": ["视频评论内容", "用户情感倾向", "需求关键词提取"]
+  }
+}

+ 75 - 0
social-media/tiktok_video_detail.skill.json

@@ -0,0 +1,75 @@
+{
+  "name": "tiktok_video_detail",
+  "displayName": "TikTok 视频详情",
+  "description": "根据视频 ID 获取单条 TikTok 视频的完整信息,包括播放量、互动数据、作者信息、话题标签等。用于爆款视频深度分析。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/tiktok/app/v3/fetch_one_video",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["aweme_id"],
+    "properties": {
+      "aweme_id": {
+        "type": "string",
+        "description": "TikTok 视频唯一 ID(从视频搜索结果中获取)"
+      }
+    }
+  },
+  "requestTransform": {
+    "queryParams": {
+      "aweme_id": "{{aweme_id}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "视频详情对象",
+    "properties": {
+      "aweme_id": { "type": "string", "description": "视频 ID" },
+      "desc": { "type": "string", "description": "视频描述" },
+      "statistics": {
+        "type": "object",
+        "properties": {
+          "play_count": { "type": "integer", "description": "播放量" },
+          "digg_count": { "type": "integer", "description": "点赞数" },
+          "comment_count": { "type": "integer", "description": "评论数" },
+          "share_count": { "type": "integer", "description": "分享数" }
+        }
+      },
+      "author": {
+        "type": "object",
+        "properties": {
+          "nickname": { "type": "string" },
+          "unique_id": { "type": "string" },
+          "follower_count": { "type": "integer" }
+        }
+      },
+      "create_time": { "type": "integer", "description": "视频创建时间戳" },
+      "cha_list": { "type": "array", "description": "关联话题列表" },
+      "video": {
+        "type": "object",
+        "properties": {
+          "cover": { "type": "object", "description": "封面图信息" },
+          "duration": { "type": "integer", "description": "视频时长(ms)" }
+        }
+      }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "获取视频详情",
+      "input": { "aweme_id": "7300000000000000000" },
+      "description": "获取指定视频的完整播放和互动数据"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["社媒聆听(Slide14)"],
+    "dataPoints": ["视频播放量", "互动数据", "作者信息"]
+  }
+}

+ 113 - 0
social-media/tiktok_video_search.skill.json

@@ -0,0 +1,113 @@
+{
+  "name": "tiktok_video_search",
+  "displayName": "TikTok 视频搜索",
+  "description": "按关键词搜索 TikTok 视频,返回视频列表及播放量、点赞、评论、分享等互动数据。用于社媒热度分析、爆款视频发现、品类 TikTok 播放量统计。",
+  "category": "social-media",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "GET",
+    "url": "https://server.fmode.cn/thapi/v1/tiktok/app/v3/fetch_video_search_result",
+    "headers": {
+      "Authorization": "Bearer tKIbAsEM8X+GmE2vHqGW7D/ICwK1Q5V4viKFrWiPB6HholGdLFqZJmmyNw==",
+      "Accept": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["keyword"],
+    "properties": {
+      "keyword": {
+        "type": "string",
+        "description": "搜索关键词,如 'reed diffuser'、'candle warmer'、'aroma diffuser'"
+      },
+      "count": {
+        "type": "integer",
+        "description": "返回视频数量,最大 30",
+        "default": 10,
+        "minimum": 1,
+        "maximum": 30
+      },
+      "cursor": {
+        "type": "integer",
+        "description": "分页游标,首次请求不传或传 0,后续传上次返回的 cursor 值",
+        "default": 0
+      }
+    }
+  },
+  "requestTransform": {
+    "description": "直接作为 GET 查询参数传递",
+    "queryParams": {
+      "keyword": "{{keyword}}",
+      "count": "{{count}}",
+      "cursor": "{{cursor}}"
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "视频搜索结果",
+    "properties": {
+      "aweme_list": {
+        "type": "array",
+        "description": "视频列表(可能为空,数据也可能在 search_item_list[].aweme_info 中)",
+        "items": {
+          "type": "object",
+          "properties": {
+            "aweme_id": { "type": "string", "description": "视频唯一 ID" },
+            "desc": { "type": "string", "description": "视频描述/标题" },
+            "statistics": {
+              "type": "object",
+              "properties": {
+                "play_count": { "type": "integer", "description": "播放量" },
+                "digg_count": { "type": "integer", "description": "点赞数" },
+                "comment_count": { "type": "integer", "description": "评论数" },
+                "share_count": { "type": "integer", "description": "分享数" }
+              }
+            },
+            "author": {
+              "type": "object",
+              "properties": {
+                "nickname": { "type": "string", "description": "作者昵称" },
+                "unique_id": { "type": "string", "description": "作者用户名" },
+                "follower_count": { "type": "integer", "description": "作者粉丝数" }
+              }
+            },
+            "cha_list": {
+              "type": "array",
+              "description": "关联话题/标签列表",
+              "items": {
+                "type": "object",
+                "properties": {
+                  "cha_name": { "type": "string", "description": "话题名称" },
+                  "cha_id": { "type": "string", "description": "话题 ID" }
+                }
+              }
+            }
+          }
+        }
+      },
+      "search_item_list": {
+        "type": "array",
+        "description": "备选数据路径(当 aweme_list 为空时从此取 aweme_info)"
+      },
+      "has_more": { "type": "boolean", "description": "是否有更多数据" },
+      "cursor": { "type": "integer", "description": "下一页游标" }
+    }
+  },
+  "notes": "响应数据可能在 aweme_list 或 search_item_list[].aweme_info 中,需做兼容处理。前端已封装 searchVideosV2 方法自动处理两种结构。",
+  "usageExamples": [
+    {
+      "name": "搜索 candle warmer 视频",
+      "input": { "keyword": "candle warmer", "count": 20 },
+      "description": "搜索 candle warmer 相关视频,获取播放量和互动数据(报告中显示 2750 万播放)"
+    },
+    {
+      "name": "搜索 reed diffuser 视频",
+      "input": { "keyword": "reed diffuser", "count": 20 },
+      "description": "搜索 reed diffuser 相关视频用于社媒聆听分析"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["TikTok热度排名(Slide6)", "社媒聆听(Slide14)"],
+    "dataPoints": ["品类TikTok总播放量", "视频互动率", "爆款视频列表", "相关话题标签"]
+  }
+}

+ 64 - 0
voc/asin_reverse_keywords.skill.json

@@ -0,0 +1,64 @@
+{
+  "name": "asin_reverse_keywords",
+  "displayName": "ASIN 反查关键词",
+  "description": "根据 ASIN 反向查询该产品关联的搜索关键词列表,包括搜索排名、搜索量等。用于竞品关键词策略分析、广告关键词挖掘。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["ASIN"],
+    "properties": {
+      "ASIN": {
+        "type": "string",
+        "description": "Amazon 产品 ASIN(10位大写字母数字)",
+        "pattern": "^[A-Z0-9]{10}$"
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/ASINRequestKeyword",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "ASIN": "{{ASIN}}"
+      }
+    }
+  },
+  "response": {
+    "type": "array",
+    "description": "关键词列表",
+    "items": {
+      "type": "object",
+      "properties": {
+        "Keyword": { "type": "string", "description": "关键词" },
+        "SearchVolume": { "type": "integer", "description": "月搜索量" },
+        "Rank": { "type": "integer", "description": "该ASIN在此关键词下的排名" },
+        "CompetitorCount": { "type": "integer", "description": "竞争产品数" }
+      }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "反查竞品关键词",
+      "input": { "ASIN": "B0B24QJ217", "domain": 1 },
+      "description": "查看 COCORRÍNA Reed Diffuser 排名靠前的搜索关键词"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["广告关键词引擎(Slide15)"],
+    "dataPoints": ["竞品关键词列表", "搜索排名", "搜索量"]
+  }
+}

+ 62 - 0
voc/asin_sales_volume.skill.json

@@ -0,0 +1,62 @@
+{
+  "name": "asin_sales_volume",
+  "displayName": "ASIN 销量查询",
+  "description": "查询指定 ASIN 的销量数据,包括日销量、周销量、月销量趋势。用于市场规模估算、品类销售额计算。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["ASIN"],
+    "properties": {
+      "ASIN": {
+        "type": "string",
+        "description": "Amazon 产品 ASIN(10位大写字母数字)",
+        "pattern": "^[A-Z0-9]{10}$"
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/AsinSalesVolume",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "ASIN": "{{ASIN}}"
+      }
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "销量数据",
+    "properties": {
+      "DailySales": { "type": "integer", "description": "日均销量" },
+      "WeeklySales": { "type": "integer", "description": "周均销量" },
+      "MonthlySales": { "type": "integer", "description": "月均销量" },
+      "Revenue": { "type": "number", "description": "估算收入(美元)" },
+      "SalesTrend": { "type": "array", "description": "销量趋势数据点" }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "查询产品销量",
+      "input": { "ASIN": "B0CSVRWJ1H", "domain": 1 },
+      "description": "查询该产品的日/周/月销量和收入估算"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["市场全景(Slide3)", "品类矩阵(Slide6)"],
+    "dataPoints": ["周均销量", "周均销售额", "销量趋势"]
+  }
+}

+ 67 - 0
voc/category_products.skill.json

@@ -0,0 +1,67 @@
+{
+  "name": "category_products",
+  "displayName": "Amazon 类目产品查询",
+  "description": "根据类目 ID 获取该类目下的产品列表。用于获取品类 Top 产品、分析品类竞争格局、统计品牌分布和中国卖家占比。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["NodeId"],
+    "properties": {
+      "NodeId": {
+        "type": "string",
+        "description": "Amazon 类目节点 ID,可通过 category_tree 接口获取"
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/CategoryProducts",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "NodeId": "{{NodeId}}"
+      }
+    }
+  },
+  "response": {
+    "type": "array",
+    "description": "类目下的产品列表",
+    "items": {
+      "type": "object",
+      "properties": {
+        "Asin": { "type": "string", "description": "产品 ASIN" },
+        "Title": { "type": "string", "description": "产品标题" },
+        "Price": { "type": "number", "description": "售价" },
+        "Rating": { "type": "number", "description": "评分" },
+        "RatingsCount": { "type": "integer", "description": "评论数" },
+        "BSR": { "type": "integer", "description": "BSR 排名" },
+        "Brand": { "type": "string", "description": "品牌" }
+      }
+    }
+  },
+  "relatedSkills": ["category_tree"],
+  "usageExamples": [
+    {
+      "name": "获取类目产品列表",
+      "input": { "NodeId": "3734931", "domain": 1 },
+      "description": "获取指定类目下的产品列表"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["市场全景(Slide3)"],
+    "dataPoints": ["品类产品列表", "品牌分布", "价格带分析"]
+  }
+}

+ 56 - 0
voc/category_tree.skill.json

@@ -0,0 +1,56 @@
+{
+  "name": "category_tree",
+  "displayName": "Amazon 类目树查询",
+  "description": "获取 Amazon 类目层级树结构,用于定位目标品类的类目 ID,再通过 category_products 获取该类目下的产品列表。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "properties": {
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/CategoryTree",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {}
+    }
+  },
+  "response": {
+    "type": "array",
+    "description": "类目树节点数组",
+    "items": {
+      "type": "object",
+      "properties": {
+        "NodeId": { "type": "string", "description": "类目节点 ID" },
+        "Name": { "type": "string", "description": "类目名称" },
+        "Children": { "type": "array", "description": "子类目列表" }
+      }
+    }
+  },
+  "relatedSkills": ["category_products"],
+  "usageExamples": [
+    {
+      "name": "获取美国站类目树",
+      "input": { "domain": 1 },
+      "description": "获取 amazon.com 的完整类目层级结构"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["市场全景(Slide3)"],
+    "dataPoints": ["品类类目定位"]
+  }
+}

+ 66 - 0
voc/keyword_product_ranking.skill.json

@@ -0,0 +1,66 @@
+{
+  "name": "keyword_product_ranking",
+  "displayName": "关键词产品排名查询",
+  "description": "查询指定关键词下的产品排名列表,获取该关键词搜索结果中的产品排序。用于竞品在关键词下的位置分析、广告优化。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["Keyword"],
+    "properties": {
+      "Keyword": {
+        "type": "string",
+        "description": "要查询排名的关键词,如 'reed diffuser'"
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/KeywordProductRanking",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "Keyword": "{{Keyword}}"
+      }
+    }
+  },
+  "response": {
+    "type": "array",
+    "description": "关键词下的产品排名列表",
+    "items": {
+      "type": "object",
+      "properties": {
+        "Asin": { "type": "string", "description": "产品 ASIN" },
+        "Title": { "type": "string", "description": "产品标题" },
+        "Rank": { "type": "integer", "description": "在该关键词下的排名" },
+        "Price": { "type": "number", "description": "售价" },
+        "Rating": { "type": "number", "description": "评分" },
+        "RatingsCount": { "type": "integer", "description": "评论数" },
+        "IsSponsored": { "type": "boolean", "description": "是否为广告产品" }
+      }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "查询关键词产品排名",
+      "input": { "Keyword": "reed diffuser", "domain": 1 },
+      "description": "获取 'reed diffuser' 搜索结果页产品排名"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["趋势雷达(Slide12)", "广告关键词引擎(Slide15)"],
+    "dataPoints": ["关键词排名", "竞品在关键词下的位置"]
+  }
+}

+ 62 - 0
voc/keyword_search.skill.json

@@ -0,0 +1,62 @@
+{
+  "name": "keyword_search",
+  "displayName": "Amazon 关键词查询",
+  "description": "查询 Amazon 关键词的搜索量、搜索趋势、竞争度等数据。用于广告关键词推荐、趋势雷达、飙升卖点词分析。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["Keyword"],
+    "properties": {
+      "Keyword": {
+        "type": "string",
+        "description": "要查询的关键词,如 'reed diffuser'、'natural reed diffuser'、'candle warmer lamp aesthetic'"
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/KeywordQuery",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "Keyword": "{{Keyword}}"
+      }
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "关键词查询结果",
+    "properties": {
+      "SearchVolume": { "type": "integer", "description": "月搜索量" },
+      "SearchVolumeGrowth": { "type": "number", "description": "搜索量增长率 (%)" },
+      "CompetitionLevel": { "type": "string", "description": "竞争度: 低/中/高/极高" },
+      "CPC": { "type": "number", "description": "建议广告出价 (美元)" },
+      "ConversionRate": { "type": "number", "description": "转化率 (%)" },
+      "RelatedKeywords": { "type": "array", "description": "相关关键词列表" }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "查询关键词搜索量",
+      "input": { "Keyword": "natural reed diffuser", "domain": 1 },
+      "description": "查询 'natural reed diffuser' 在美国站的搜索量和竞争度"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["趋势雷达(Slide12)", "广告关键词引擎(Slide15)"],
+    "dataPoints": ["关键词搜索量", "增长率", "竞争度", "建议出价", "VOC匹配度"]
+  }
+}

+ 68 - 0
voc/keyword_search_trend.skill.json

@@ -0,0 +1,68 @@
+{
+  "name": "keyword_search_trend",
+  "displayName": "关键词搜索趋势查询",
+  "description": "查询指定关键词的搜索结果趋势变化,包括搜索量随时间的变化。用于发现飙升关键词、季节性趋势分析。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["Keyword"],
+    "properties": {
+      "Keyword": {
+        "type": "string",
+        "description": "要查询趋势的关键词"
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/KeywordSearchResultTrend",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "Keyword": "{{Keyword}}"
+      }
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "关键词趋势数据",
+    "properties": {
+      "TrendData": {
+        "type": "array",
+        "description": "趋势数据点列表",
+        "items": {
+          "type": "object",
+          "properties": {
+            "Date": { "type": "string", "description": "日期" },
+            "SearchVolume": { "type": "integer", "description": "搜索量" },
+            "ProductCount": { "type": "integer", "description": "搜索结果产品数" }
+          }
+        }
+      }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "查询关键词搜索趋势",
+      "input": { "Keyword": "candle warmer lamp aesthetic", "domain": 1 },
+      "description": "查看 'candle warmer lamp aesthetic' 的搜索量变化趋势"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["趋势雷达(Slide12)"],
+    "dataPoints": ["关键词搜索趋势", "飙升卖点词增幅"]
+  }
+}

+ 104 - 0
voc/product_detail_query.skill.json

@@ -0,0 +1,104 @@
+{
+  "name": "product_detail_query",
+  "displayName": "Amazon 产品详情查询",
+  "description": "根据 ASIN 获取 Amazon 产品详情,包括标题、价格、评分、销量、BSR、品牌、类目、变体、趋势等完整信息。用于竞品分析、市场全景、定价策略。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["ASIN"],
+    "properties": {
+      "ASIN": {
+        "type": "string",
+        "description": "Amazon 产品唯一标识符(10位字母数字),必须大写。例:B0CSVRWJ1H",
+        "pattern": "^[A-Z0-9]{10}$"
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com, 2=amazon.co.uk, 3=amazon.de, 4=amazon.co.jp, 5=amazon.fr, 6=amazon.it, 7=amazon.es, 8=amazon.ca",
+        "default": 1,
+        "enum": [1, 2, 3, 4, 5, 6, 7, 8]
+      },
+      "Trend": {
+        "type": "integer",
+        "description": "是否返回趋势数据: 1=是, 0=否",
+        "default": 1,
+        "enum": [0, 1]
+      },
+      "QueryTrendStartDt": {
+        "type": "string",
+        "description": "趋势数据起始日期,格式 YYYYMMDD,留空则使用默认范围",
+        "default": ""
+      },
+      "QueryTrendEndDt": {
+        "type": "string",
+        "description": "趋势数据结束日期,格式 YYYYMMDD,留空则使用默认范围",
+        "default": ""
+      }
+    }
+  },
+  "requestTransform": {
+    "description": "将参数转换为 Sorftime forward 格式",
+    "template": {
+      "path": "/api/ProductRequest",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "ASIN": "{{ASIN}}",
+        "Trend": "{{Trend}}",
+        "QueryTrendStartDt": "{{QueryTrendStartDt}}",
+        "QueryTrendEndDt": "{{QueryTrendEndDt}}"
+      }
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "产品详情对象",
+    "properties": {
+      "Title": { "type": "string", "description": "产品标题" },
+      "Price": { "type": "number", "description": "当前售价(美元)" },
+      "SalesPrice": { "type": "number", "description": "促销价(美元)" },
+      "Brand": { "type": "string", "description": "品牌名称" },
+      "StoreName": { "type": "string", "description": "店铺名称" },
+      "Rating": { "type": "number", "description": "平均评分 (0-5)" },
+      "RatingsCount": { "type": "integer", "description": "评论总数" },
+      "fiveStartRatings": { "type": "number", "description": "5星评分百分比" },
+      "fourStartRatings": { "type": "number", "description": "4星评分百分比" },
+      "threeStartRatings": { "type": "number", "description": "3星评分百分比" },
+      "twoStartRatings": { "type": "number", "description": "2星评分百分比" },
+      "oneStartRatings": { "type": "number", "description": "1星评分百分比" },
+      "MonthlySales": { "type": "integer", "description": "月销量估算" },
+      "BSR": { "type": "integer", "description": "Best Sellers Rank 大类排名" },
+      "Category": { "type": "array", "description": "类目层级" },
+      "BsrCategory": { "type": "array", "description": "BSR 类目层级" },
+      "Photo": { "type": "array", "description": "产品图片 URL 列表" },
+      "Feature": { "type": "object", "description": "产品 Bullet Points 卖点" },
+      "Description": { "type": "string", "description": "产品描述" },
+      "Property": { "type": "string", "description": "产品属性(JSON 字符串)" },
+      "VariationASIN": { "type": "array", "description": "变体 ASIN 列表" },
+      "Size": { "type": "array", "description": "尺寸选项" },
+      "ShipsFrom": { "type": "string", "description": "发货地" },
+      "ProductType": { "type": "string", "description": "配送类型 (FBA/FBM)" },
+      "DealType": { "type": "string", "description": "促销类型" },
+      "UpdateDate": { "type": "string", "description": "数据更新日期" }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "查询单个产品详情",
+      "input": { "ASIN": "B0CSVRWJ1H", "domain": 1, "Trend": 1 },
+      "description": "获取美国站产品 B0CSVRWJ1H 的完整信息和趋势数据"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["市场全景(Slide3)", "竞品对标(Slide4)", "品类矩阵(Slide6)"],
+    "dataPoints": ["价格", "评分", "月销量", "BSR", "品牌", "类目"]
+  }
+}

+ 61 - 0
voc/product_monitor.skill.json

@@ -0,0 +1,61 @@
+{
+  "name": "product_monitor",
+  "displayName": "产品监控数据查询",
+  "description": "获取产品的监控追踪数据,包括价格变化、排名变化、评分变化等历史数据。用于竞品动态追踪、价格监控、新品上架预警。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["ASIN"],
+    "properties": {
+      "ASIN": {
+        "type": "string",
+        "description": "Amazon 产品 ASIN(10位大写字母数字)",
+        "pattern": "^[A-Z0-9]{10}$"
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/MonitorQuery",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "ASIN": "{{ASIN}}"
+      }
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "监控数据",
+    "properties": {
+      "PriceHistory": { "type": "array", "description": "价格历史数据" },
+      "RankHistory": { "type": "array", "description": "排名历史数据" },
+      "RatingHistory": { "type": "array", "description": "评分历史数据" },
+      "ReviewCountHistory": { "type": "array", "description": "评论数历史数据" }
+    }
+  },
+  "usageExamples": [
+    {
+      "name": "监控竞品价格变化",
+      "input": { "ASIN": "B0B24QJ217", "domain": 1 },
+      "description": "获取 COCORRÍNA Reed Diffuser 的价格和排名变化历史"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["竞品对标(Slide4)", "智能仪表盘(Slide10)"],
+    "dataPoints": ["价格变化", "BSR排名变化", "评分变化", "竞品动态预警"]
+  }
+}

+ 120 - 0
voc/product_reviews_query.skill.json

@@ -0,0 +1,120 @@
+{
+  "name": "product_reviews_query",
+  "displayName": "Amazon 产品评论查询",
+  "description": "根据 ASIN 抓取 Amazon 产品用户评论,支持按星级、日期、是否验证购买筛选。用于 VOC 用户洞察、痛点提取、喜爱点分析、使用场景挖掘。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["ASIN"],
+    "properties": {
+      "ASIN": {
+        "type": "string",
+        "description": "Amazon 产品 ASIN(10位大写字母数字)",
+        "pattern": "^[A-Z0-9]{10}$"
+      },
+      "Star": {
+        "type": "string",
+        "description": "筛选星级: 空=全部, '1'=1星, '2'=2星, '3'=3星, '4'=4星, '5'=5星",
+        "default": "",
+        "enum": ["", "1", "2", "3", "4", "5"]
+      },
+      "PageIndex": {
+        "type": "integer",
+        "description": "分页页码,从 1 开始",
+        "default": 1
+      },
+      "OnlyPurchase": {
+        "type": "integer",
+        "description": "仅显示验证购买评论: 0=全部, 1=仅验证购买",
+        "default": 0,
+        "enum": [0, 1]
+      },
+      "QueryStartDt": {
+        "type": "string",
+        "description": "评论起始日期,格式 YYYYMMDD,如 '20250101'",
+        "default": ""
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/ProductReviewsQuery",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "ASIN": "{{ASIN}}",
+        "Star": "{{Star}}",
+        "PageIndex": "{{PageIndex}}",
+        "OnlyPurchase": "{{OnlyPurchase}}",
+        "QueryStartDt": "{{QueryStartDt}}"
+      }
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "评论查询结果",
+    "properties": {
+      "TotalCount": { "type": "integer", "description": "评论总数" },
+      "Reviews": {
+        "type": "array",
+        "description": "评论列表",
+        "items": {
+          "type": "object",
+          "properties": {
+            "Star": { "type": "integer", "description": "评论星级 (1-5)" },
+            "Title": { "type": "string", "description": "评论标题" },
+            "Content": { "type": "string", "description": "评论正文" },
+            "ConsumerName": { "type": "string", "description": "评论者名称" },
+            "ReviewsDate": { "type": "string", "description": "评论日期,格式 '20260204'" },
+            "ReviewedCountry": { "type": "string", "description": "评论者国家,如 'United States'" },
+            "IsVP": { "type": "boolean", "description": "是否验证购买" },
+            "Helpful": { "type": "integer", "description": "有用数" },
+            "Asin": { "type": "string", "description": "关联产品 ASIN" },
+            "AsinProperty": { "type": "string", "description": "变体属性" },
+            "Resource": { "type": "array", "description": "评论附图 URL" },
+            "Videos": { "type": "array", "description": "评论视频 URL" },
+            "ConsumerURL": { "type": "string", "description": "评论者主页链接" },
+            "ReviewsLink": { "type": "string", "description": "评论详情链接" },
+            "ConsumerBadge": { "type": "string", "description": "评论者徽章" },
+            "UpdateTime": { "type": "string", "description": "数据更新时间,格式 '2026-02-06 17:39'" }
+          }
+        }
+      }
+    }
+  },
+  "notes": "注意字段名使用 PascalCase: ReviewsDate(非 ReviewDate)、ReviewedCountry(非 ReviewsCountry)、IsVP(非 Ivp)、ConsumerURL(非 ConsumerUrl)、ReviewsLink(非 ReviewLink)。每页约返回 10 条评论,需多次分页获取完整评论。建议搭配 AI 分析进行情感分类和痛点提取。",
+  "usageExamples": [
+    {
+      "name": "获取全部评论(第一页)",
+      "input": { "ASIN": "B0B24QJ217", "domain": 1 },
+      "description": "获取 COCORRÍNA Reed Diffuser 的全部评论第一页"
+    },
+    {
+      "name": "获取差评(1-2星)",
+      "input": { "ASIN": "B0B24QJ217", "Star": "1", "PageIndex": 1, "domain": 1 },
+      "description": "仅获取1星差评,用于痛点分析"
+    },
+    {
+      "name": "获取近期验证购买评论",
+      "input": { "ASIN": "B0B24QJ217", "OnlyPurchase": 1, "QueryStartDt": "20250101", "domain": 1 },
+      "description": "获取2025年以来的验证购买评论"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["VOC用户洞察(Slide5)", "AI深度洞察(Slide13)"],
+    "dataPoints": ["评论总量", "好评率", "差评率", "痛点标签及占比", "喜爱点标签及占比", "使用场景分布"]
+  }
+}

+ 82 - 0
voc/product_search.skill.json

@@ -0,0 +1,82 @@
+{
+  "name": "product_search",
+  "displayName": "Amazon 关键词搜索产品",
+  "description": "按关键词搜索 Amazon 产品列表,返回多个产品的标题、价格、评分、销量等信息。用于品类市场全景分析、Top100 产品列表获取。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["Pattern"],
+    "properties": {
+      "Pattern": {
+        "type": "string",
+        "description": "搜索关键词,如 'reed diffuser'、'aroma diffuser'、'scented candle'"
+      },
+      "Page": {
+        "type": "integer",
+        "description": "分页页码,从 1 开始",
+        "default": 1
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com, 2=amazon.co.uk, 3=amazon.de, 4=amazon.co.jp",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/ProductQuery",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "Page": "{{Page}}",
+        "Query": "1",
+        "QueryType": "7",
+        "Pattern": "{{Pattern}}"
+      }
+    }
+  },
+  "response": {
+    "type": "array",
+    "description": "产品列表数组",
+    "items": {
+      "type": "object",
+      "properties": {
+        "Asin": { "type": "string", "description": "产品 ASIN" },
+        "Title": { "type": "string", "description": "产品标题" },
+        "Price": { "type": "number", "description": "售价(美元)" },
+        "Rating": { "type": "number", "description": "平均评分" },
+        "RatingsCount": { "type": "integer", "description": "评论总数" },
+        "MonthlySales": { "type": "integer", "description": "月销量估算" },
+        "Brand": { "type": "string", "description": "品牌" },
+        "BSR": { "type": "integer", "description": "BSR 排名" },
+        "Photo": { "type": "array", "description": "图片列表" }
+      }
+    }
+  },
+  "notes": "QueryType=7 表示按标题搜索。如果被验证码拦截(code=-10),返回空数组,需回退到批量 ProductRequest。",
+  "usageExamples": [
+    {
+      "name": "搜索香薰扩散器产品",
+      "input": { "Pattern": "aroma diffuser", "Page": 1, "domain": 1 },
+      "description": "在美国站搜索 aroma diffuser 关键词的产品列表"
+    },
+    {
+      "name": "搜索蜡烛加热器",
+      "input": { "Pattern": "candle warmer", "Page": 1, "domain": 1 },
+      "description": "在美国站搜索 candle warmer 关键词的产品列表"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["市场全景(Slide3)"],
+    "dataPoints": ["品类Top100产品列表", "周均销量", "周均销售额", "品牌数量", "中国卖家占比"]
+  }
+}

+ 61 - 0
voc/similar_products.skill.json

@@ -0,0 +1,61 @@
+{
+  "name": "similar_products",
+  "displayName": "Amazon 相似产品查询",
+  "description": "根据 ASIN 查询与该产品相似的产品列表,用于竞品发现、关联分析。",
+  "category": "voc",
+  "version": "1.0.0",
+  "endpoint": {
+    "method": "POST",
+    "url": "https://server-msq.fmode.cn/api/sorftime/forward",
+    "headers": {
+      "Content-Type": "application/json"
+    }
+  },
+  "parameters": {
+    "type": "object",
+    "required": ["ASIN"],
+    "properties": {
+      "ASIN": {
+        "type": "string",
+        "description": "Amazon 产品 ASIN(10位大写字母数字)",
+        "pattern": "^[A-Z0-9]{10}$"
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点 ID: 1=amazon.com",
+        "default": 1
+      }
+    }
+  },
+  "requestTransform": {
+    "template": {
+      "path": "/api/SimilarProductRealtimeRequest",
+      "method": "POST",
+      "query": { "domain": "{{domain}}" },
+      "body": {
+        "ASIN": "{{ASIN}}"
+      }
+    }
+  },
+  "response": {
+    "type": "object",
+    "description": "相似产品查询结果(异步任务)",
+    "properties": {
+      "TaskId": { "type": "string", "description": "异步任务 ID,需通过 similar_products_status 查询结果" },
+      "Status": { "type": "string", "description": "任务状态" }
+    }
+  },
+  "notes": "此接口为异步任务,返回 TaskId 后需通过 /api/SimilarProductRealtimeRequestStatusQuery 查询状态,状态完成后通过 /api/SimilarProductRealtimeRequestCollection 获取分页结果。",
+  "relatedSkills": ["product_detail_query"],
+  "usageExamples": [
+    {
+      "name": "查找相似产品",
+      "input": { "ASIN": "B0B24QJ217", "domain": 1 },
+      "description": "查找与 COCORRÍNA Reed Diffuser 相似的产品"
+    }
+  ],
+  "reportMapping": {
+    "slides": ["竞品对标(Slide4)"],
+    "dataPoints": ["相似竞品列表"]
+  }
+}

+ 65 - 0
workflows/examples/fragrance_report_input.json

@@ -0,0 +1,65 @@
+{
+  "workflow": "competitive_analysis_report",
+  "description": "香薰行业竞品分析报告 — 完整输入示例",
+  "input": {
+    "industryName": "香薰",
+    "categoryKeywords": [
+      "scented candle",
+      "aroma diffuser",
+      "candle warmer",
+      "car diffuser",
+      "reed diffuser"
+    ],
+    "competitorBrands": [
+      {
+        "name": "NEST New York",
+        "positioning": "高端标杆",
+        "instagramUsername": "nestnewyork",
+        "tiktokUsername": "nestnewyork",
+        "sampleAsins": ["B07GZXX3Q9", "B07N1JGLYG", "B01N4G3WQE"]
+      },
+      {
+        "name": "Paddywax",
+        "positioning": "可持续标杆",
+        "instagramUsername": "paddywax",
+        "tiktokUsername": "paddywax",
+        "sampleAsins": ["B09MRGV1QY", "B00JFO0UUS"]
+      },
+      {
+        "name": "SpaRoom",
+        "positioning": "待提升",
+        "instagramUsername": "sparoom",
+        "tiktokUsername": "",
+        "sampleAsins": []
+      }
+    ],
+    "vocAsins": [
+      "B0B24QJ217",
+      "B0DJHP1FCS",
+      "B0CSVRWJ1H"
+    ],
+    "trendKeywords": [
+      "candle warmer lamp aesthetic",
+      "reed diffuser natural oil",
+      "aroma diffuser jellyfish",
+      "organic scented candle gift",
+      "car diffuser essential oil USB"
+    ],
+    "domain": 1,
+    "reviewPages": 10
+  },
+  "expectedOutput": {
+    "reportSlides": 17,
+    "estimatedApiCalls": {
+      "sorftime": "~150次 (5品类×20产品详情 + 3ASIN×10页评论 + 5趋势词 + 3ASIN反查)",
+      "tikhub": "~25次 (5品类视频搜索 + 3品牌×2平台 + 3品类达人搜索 + 3IG帖子)",
+      "ai": "~5次大型分析 (VOC/策略/Listing/关键词/矩阵)"
+    },
+    "estimatedDuration": "3-5分钟",
+    "deliverables": [
+      "HTML 幻灯片报告(17页,含 Chart.js 交互图表)",
+      "原始数据 JSON 快照",
+      "执行元数据(API调用统计、错误日志)"
+    ]
+  }
+}

+ 147 - 0
workflows/pipeline.md

@@ -0,0 +1,147 @@
+# 报告生成编排 Pipeline
+
+## 执行流程图
+
+```
+┌─────────────────────────────────────────────────────────────────┐
+│                        输入参数                                  │
+│  industryName + categoryKeywords + competitorBrands + vocAsins  │
+└───────────┬────────────────┬────────────────┬───────────────────┘
+            │                │                │
+            ▼                ▼                ▼
+┌───────────────┐ ┌──────────────────┐ ┌──────────────────┐
+│   Stage 1     │ │    Stage 2       │ │    Stage 4       │
+│ 品类市场数据   │ │  竞品品牌数据     │ │  社媒热度&趋势    │
+│               │ │                  │ │                  │
+│ 1.1 产品搜索  │ │ 2.1 竞品产品详情  │ │ 4.1 TikTok视频   │
+│   ↓           │ │ 2.2 竞品IG画像   │ │ 4.2 关键词趋势    │
+│ 1.2 产品详情  │ │ 2.3 竞品TikTok   │ │ 4.3 关键词搜索量  │
+│ 1.3 销量数据  │ │ 2.4 IG帖子分析   │ │ 4.4 达人搜索     │
+│               │ │                  │ │                  │
+│ → marketOver  │ │ → competitor     │ │ → socialTrends   │
+│    view       │ │    Benchmark     │ │                  │
+└───────┬───────┘ └────────┬─────────┘ └────────┬─────────┘
+        │                  │                     │
+        │     ┌────────────┼─────────────────────┘
+        │     │            │
+        ▼     ▼            │
+┌──────────────────┐       │
+│    Stage 3       │       │
+│  VOC评论采集      │       │
+│                  │       │
+│ 3.1 评论批量抓取  │       │
+│   ↓              │       │
+│ 3.2 AI情感分析   │       │
+│                  │       │
+│ → vocAnalysis    │       │
+└────────┬─────────┘       │
+         │                 │
+         ▼                 │
+┌──────────────────┐       │
+│    Stage 5       │       │
+│  广告关键词分析   │◄──────┘
+│                  │
+│ 5.1 ASIN反查词   │
+│ 5.2 AI关键词推荐  │
+│                  │
+│ → adKeyword      │
+│   Recommendations│
+└────────┬─────────┘
+         │
+         ▼
+┌──────────────────────────────────────┐
+│           Stage 6                    │
+│       AI 综合分析与策略生成            │
+│                                      │
+│  6.1 执行策略生成 (短/中/长期)         │
+│  6.2 Listing 优化建议                 │
+│  6.3 品类机会矩阵评估                 │
+│                                      │
+│  → strategyPlan                      │
+│  → listingOptimization               │
+│  → categoryMatrix                    │
+└──────────────────┬───────────────────┘
+                   │
+                   ▼
+┌──────────────────────────────────────┐
+│           Stage 7                    │
+│          报告渲染                     │
+│                                      │
+│  7.1 组装报告数据 (17个Slide)         │
+│  7.2 渲染 HTML 报告                   │
+│      - Chart.js 图表注入              │
+│      - 数据卡片/表格填充              │
+│      - 进度条/动画配置                │
+│                                      │
+│  → finalReport.html                  │
+└──────────────────────────────────────┘
+```
+
+## 并行度说明
+
+| 阶段 | 并行策略 | 预计耗时 |
+|------|---------|---------|
+| Stage 1 | 品类间并行,每品类内串行 | 30-60s |
+| Stage 2 | 品牌间并行,IG/TikTok并行 | 15-30s |
+| Stage 3 | ASIN间并行,分页串行 | 40-80s |
+| Stage 4 | 品类词/趋势词全并行 | 15-20s |
+| Stage 5 | 依赖Stage3+4,ASIN并行 | 15-25s |
+| Stage 6 | 依赖全部前置Stage,3个AI分析并行 | 30-60s |
+| Stage 7 | 串行组装+渲染 | 5-10s |
+| **总计** | Stage 1/2/4 可并行 | **3-5分钟** |
+
+## 数据依赖关系
+
+```
+Stage 1 (市场数据) ──────────────────────────────────────→ Stage 6
+Stage 2 (竞品数据) ──────────────────────────────────────→ Stage 6
+Stage 3 (VOC分析)  ──→ Stage 5 (广告关键词) ─────────────→ Stage 6
+Stage 4 (社媒趋势) ──→ Stage 5 (广告关键词) ─────────────→ Stage 6
+                                                           ↓
+                                                        Stage 7 (渲染)
+```
+
+## 报告 Slide 与数据源映射
+
+| Slide # | 页面名称 | 数据来源 Stage |
+|---------|---------|---------------|
+| 0 | 封面 | input |
+| 1 | 目录 | 静态 |
+| 2 | 执行摘要 | Stage 1 + 3 + 6 |
+| 3 | 市场全景 | Stage 1 |
+| 4 | 竞品对标 | Stage 2 |
+| 5 | 用户VOC | Stage 3 |
+| 6 | 线索清单 | Stage 4 + 6.3 |
+| 7 | 执行策略 | Stage 6.1 |
+| 8 | 总结展望 | Stage 6 |
+| 9 | VOC系统价值 | 静态 |
+| 10 | 智能仪表盘 | Stage 1 + 3 (实时数据Mock) |
+| 11 | 知识中心 | Stage 2 + 4.4 |
+| 12 | 趋势雷达 | Stage 4 |
+| 13 | AI洞察 | Stage 3 + 5 |
+| 14 | 社媒聆听 | Stage 4 |
+| 15 | Listing优化 | Stage 5 + 6.2 |
+| 16 | 致谢 | 静态 |
+
+## API 调用量估算
+
+以香薰行业(5品类, 3竞品, 3个VOC ASIN, 5个趋势词)为例:
+
+| 接口类型 | 调用明细 | 次数 |
+|---------|---------|------|
+| product_search | 5品类 × 1页 | 5 |
+| product_detail_query | 5品类 × 20产品 | 100 |
+| asin_sales_volume | 5品类 × 10产品 | 50 |
+| product_reviews_query | 3 ASIN × 10页 | 30 |
+| keyword_search | 5趋势词 | 5 |
+| keyword_search_trend | 5趋势词 | 5 |
+| asin_reverse_keywords | 3 ASIN | 3 |
+| **Sorftime 小计** | | **~198** |
+| tiktok_video_search | 5品类 | 5 |
+| tiktok_user_search | 3品类 | 3 |
+| tiktok_user_profile | 2品牌(有TikTok的) | 2 |
+| instagram_user_info | 3品牌 | 3 |
+| instagram_user_posts | 3品牌 | 3 |
+| **TikHub 小计** | | **~16** |
+| AI 分析 | 5次 (VOC/策略/Listing/关键词/矩阵) | 5 |
+| **总计** | | **~219** |

+ 540 - 0
workflows/report_generation.workflow.json

@@ -0,0 +1,540 @@
+{
+  "name": "competitive_analysis_report",
+  "displayName": "竞品分析报告生成",
+  "description": "端到端编排:从输入行业关键词和竞品品牌,到自动采集数据、AI 分析、生成 HTML 幻灯片报告。覆盖市场全景、竞品对标、VOC 用户洞察、社媒热度、趋势雷达、执行策略等完整报告内容。",
+  "version": "1.0.0",
+
+  "input": {
+    "type": "object",
+    "required": ["industryName", "categoryKeywords", "competitorBrands"],
+    "properties": {
+      "industryName": {
+        "type": "string",
+        "description": "行业名称,如 '香薰'、'宠物用品'、'家居收纳'",
+        "example": "香薰"
+      },
+      "categoryKeywords": {
+        "type": "array",
+        "description": "品类搜索关键词列表(每个关键词对应一个子品类)",
+        "items": { "type": "string" },
+        "example": ["scented candle", "aroma diffuser", "candle warmer", "car diffuser", "reed diffuser"]
+      },
+      "competitorBrands": {
+        "type": "array",
+        "description": "竞品品牌列表,每个品牌包含名称和社媒账号",
+        "items": {
+          "type": "object",
+          "properties": {
+            "name": { "type": "string", "description": "品牌名称" },
+            "positioning": { "type": "string", "description": "品牌定位标签,如 '高端标杆'、'可持续标杆'" },
+            "instagramUsername": { "type": "string", "description": "Instagram 用户名" },
+            "tiktokUsername": { "type": "string", "description": "TikTok 用户名" },
+            "sampleAsins": { "type": "array", "items": { "type": "string" }, "description": "品牌代表性 ASIN 列表" }
+          }
+        },
+        "example": [
+          { "name": "NEST New York", "positioning": "高端标杆", "instagramUsername": "nestnewyork", "tiktokUsername": "nestnewyork", "sampleAsins": ["B07GZXX3Q9"] },
+          { "name": "Paddywax", "positioning": "可持续标杆", "instagramUsername": "paddywax", "tiktokUsername": "paddywax", "sampleAsins": ["B09MRGV1QY"] },
+          { "name": "SpaRoom", "positioning": "待提升", "instagramUsername": "sparoom", "tiktokUsername": "", "sampleAsins": [] }
+        ]
+      },
+      "vocAsins": {
+        "type": "array",
+        "description": "用于 VOC 深度分析的 ASIN 列表(通常选品类 Top3 畅销品)",
+        "items": { "type": "string" },
+        "example": ["B0B24QJ217", "B0DJHP1FCS", "B0CSVRWJ1H"]
+      },
+      "trendKeywords": {
+        "type": "array",
+        "description": "趋势雷达追踪的关键词列表",
+        "items": { "type": "string" },
+        "example": ["candle warmer lamp aesthetic", "reed diffuser natural oil", "aroma diffuser jellyfish", "organic scented candle gift", "car diffuser essential oil USB"]
+      },
+      "domain": {
+        "type": "integer",
+        "description": "Amazon 站点: 1=US, 2=UK, 3=DE",
+        "default": 1
+      },
+      "reviewPages": {
+        "type": "integer",
+        "description": "每个 VOC ASIN 抓取的评论页数(每页约10条)",
+        "default": 10
+      }
+    }
+  },
+
+  "stages": [
+    {
+      "id": "stage_1",
+      "name": "品类市场数据采集",
+      "description": "并行搜索各品类关键词,获取 Top 产品列表和基础数据",
+      "parallel": true,
+      "steps": [
+        {
+          "id": "1.1",
+          "name": "品类产品搜索",
+          "skill": "product_search",
+          "iterate": "input.categoryKeywords",
+          "iterateAs": "keyword",
+          "input": {
+            "Pattern": "{{keyword}}",
+            "Page": 1,
+            "domain": "{{input.domain}}"
+          },
+          "output": "categoryProducts[{{keyword}}]",
+          "description": "对每个品类关键词执行产品搜索,获取产品列表"
+        },
+        {
+          "id": "1.2",
+          "name": "品类产品详情补全",
+          "skill": "product_detail_query",
+          "dependsOn": ["1.1"],
+          "iterate": "categoryProducts[*].topAsins[:20]",
+          "iterateAs": "asin",
+          "input": {
+            "ASIN": "{{asin}}",
+            "domain": "{{input.domain}}",
+            "Trend": 1
+          },
+          "output": "productDetails[{{asin}}]",
+          "rateLimit": { "maxConcurrent": 5, "delayMs": 200 },
+          "description": "批量获取 Top20 产品详情(价格/评分/销量/品牌)"
+        },
+        {
+          "id": "1.3",
+          "name": "品类销量数据",
+          "skill": "asin_sales_volume",
+          "dependsOn": ["1.1"],
+          "iterate": "categoryProducts[*].topAsins[:10]",
+          "iterateAs": "asin",
+          "input": {
+            "ASIN": "{{asin}}",
+            "domain": "{{input.domain}}"
+          },
+          "output": "salesData[{{asin}}]",
+          "rateLimit": { "maxConcurrent": 3, "delayMs": 300 },
+          "description": "获取 Top10 产品销量用于计算周均销售额"
+        }
+      ],
+      "aggregation": {
+        "output": "marketOverview",
+        "logic": "对每个品类汇总: 周均销量、周均销售额、均价、品牌数、增长率、中国卖家占比"
+      }
+    },
+
+    {
+      "id": "stage_2",
+      "name": "竞品品牌数据采集",
+      "description": "采集竞品品牌的产品数据和社媒数据",
+      "parallel": true,
+      "steps": [
+        {
+          "id": "2.1",
+          "name": "竞品产品详情",
+          "skill": "product_detail_query",
+          "iterate": "input.competitorBrands[*].sampleAsins",
+          "iterateAs": "asin",
+          "input": {
+            "ASIN": "{{asin}}",
+            "domain": "{{input.domain}}",
+            "Trend": 1
+          },
+          "output": "competitorProducts[{{asin}}]",
+          "description": "获取竞品代表性产品的详情"
+        },
+        {
+          "id": "2.2",
+          "name": "竞品 Instagram 画像",
+          "skill": "instagram_user_info",
+          "iterate": "input.competitorBrands",
+          "iterateAs": "brand",
+          "condition": "brand.instagramUsername != ''",
+          "input": {
+            "username": "{{brand.instagramUsername}}"
+          },
+          "output": "igProfiles[{{brand.name}}]",
+          "description": "获取竞品 IG 粉丝数、帖子数等"
+        },
+        {
+          "id": "2.3",
+          "name": "竞品 TikTok 画像",
+          "skill": "tiktok_user_profile",
+          "iterate": "input.competitorBrands",
+          "iterateAs": "brand",
+          "condition": "brand.tiktokUsername != ''",
+          "input": {
+            "uniqueId": "{{brand.tiktokUsername}}"
+          },
+          "output": "tiktokProfiles[{{brand.name}}]",
+          "description": "获取竞品 TikTok 粉丝数、获赞数"
+        },
+        {
+          "id": "2.4",
+          "name": "竞品 IG 帖子分析",
+          "skill": "instagram_user_posts",
+          "dependsOn": ["2.2"],
+          "iterate": "igProfiles",
+          "iterateAs": "profile",
+          "input": {
+            "user_id": "{{profile.user.pk}}",
+            "count": 12
+          },
+          "output": "igPosts[{{profile.user.username}}]",
+          "description": "获取竞品最近帖子分析内容策略"
+        }
+      ],
+      "aggregation": {
+        "output": "competitorBenchmark",
+        "logic": "整合每个品牌的: 产品数据(价格/评分/SKU数) + IG(粉丝/帖子/互动率) + TikTok(粉丝/获赞)"
+      }
+    },
+
+    {
+      "id": "stage_3",
+      "name": "VOC 评论采集与分析",
+      "description": "抓取目标产品评论并进行 AI 情感分析",
+      "steps": [
+        {
+          "id": "3.1",
+          "name": "评论批量抓取",
+          "skill": "product_reviews_query",
+          "iterate": "input.vocAsins",
+          "iterateAs": "asin",
+          "repeatPages": "input.reviewPages",
+          "input": {
+            "ASIN": "{{asin}}",
+            "PageIndex": "{{pageIndex}}",
+            "domain": "{{input.domain}}"
+          },
+          "output": "rawReviews[{{asin}}]",
+          "rateLimit": { "maxConcurrent": 2, "delayMs": 500 },
+          "description": "逐页抓取每个 ASIN 的评论(每页约10条,默认10页≈100条/ASIN)"
+        },
+        {
+          "id": "3.2",
+          "name": "AI 情感分类与痛点提取",
+          "type": "ai_analysis",
+          "dependsOn": ["3.1"],
+          "input": {
+            "reviews": "{{rawReviews}}",
+            "systemPrompt": "你是一名专业的亚马逊产品评论分析师。请对以下用户评论进行深度分析。",
+            "userPrompt": "请对以下 {{reviewCount}} 条用户评论进行分析,输出 JSON 格式结果:\n\n1. **情感分类**: 每条评论标记为 positive/negative/neutral\n2. **痛点提取**: 列出 Top5 痛点及占比(如 '化学味/人工感 30.5%'),每个痛点附带代表性原文\n3. **喜爱点提取**: 列出 Top5 好评亮点及占比\n4. **使用场景**: 提取用户提到的使用场景及占比(如 '浴室 48.7%')\n5. **关键洞察**: 3-5 条核心商业洞察\n\n评论数据:\n{{reviewsText}}"
+          },
+          "output": "vocAnalysis",
+          "outputSchema": {
+            "totalReviews": "integer",
+            "positiveRate": "number",
+            "negativeRate": "number",
+            "painPoints": [{ "name": "string", "percentage": "number", "quote": "string" }],
+            "highlights": [{ "name": "string", "percentage": "number" }],
+            "usageScenes": [{ "scene": "string", "percentage": "number" }],
+            "insights": ["string"]
+          },
+          "description": "AI 自动提取痛点/喜爱点/场景分布"
+        }
+      ]
+    },
+
+    {
+      "id": "stage_4",
+      "name": "社媒热度与趋势数据",
+      "description": "采集 TikTok 品类热度和关键词趋势",
+      "parallel": true,
+      "steps": [
+        {
+          "id": "4.1",
+          "name": "TikTok 品类视频搜索",
+          "skill": "tiktok_video_search",
+          "iterate": "input.categoryKeywords",
+          "iterateAs": "keyword",
+          "input": {
+            "keyword": "{{keyword}}",
+            "count": 20
+          },
+          "output": "tiktokVideos[{{keyword}}]",
+          "description": "搜索每个品类在 TikTok 的视频,统计总播放量"
+        },
+        {
+          "id": "4.2",
+          "name": "关键词搜索趋势",
+          "skill": "keyword_search_trend",
+          "iterate": "input.trendKeywords",
+          "iterateAs": "keyword",
+          "input": {
+            "keyword": "{{keyword}}",
+            "domain": "{{input.domain}}"
+          },
+          "output": "keywordTrends[{{keyword}}]",
+          "description": "获取飙升关键词的搜索量趋势"
+        },
+        {
+          "id": "4.3",
+          "name": "关键词搜索量查询",
+          "skill": "keyword_search",
+          "iterate": "input.trendKeywords",
+          "iterateAs": "keyword",
+          "input": {
+            "keyword": "{{keyword}}",
+            "domain": "{{input.domain}}"
+          },
+          "output": "keywordData[{{keyword}}]",
+          "description": "获取关键词搜索量和竞争度"
+        },
+        {
+          "id": "4.4",
+          "name": "TikTok 达人搜索",
+          "skill": "tiktok_user_search",
+          "iterate": "input.categoryKeywords[:3]",
+          "iterateAs": "keyword",
+          "input": {
+            "keyword": "{{keyword}}",
+            "count": 10
+          },
+          "output": "tiktokInfluencers[{{keyword}}]",
+          "description": "搜索品类相关达人用于红人推荐"
+        }
+      ],
+      "aggregation": {
+        "output": "socialTrends",
+        "logic": "汇总: 品类TikTok总播放量排名 + 飙升关键词Top5 + 红人推荐列表"
+      }
+    },
+
+    {
+      "id": "stage_5",
+      "name": "广告关键词分析",
+      "description": "基于 VOC 痛点和品类数据生成广告关键词推荐",
+      "dependsOn": ["stage_3", "stage_4"],
+      "steps": [
+        {
+          "id": "5.1",
+          "name": "竞品 ASIN 反查关键词",
+          "skill": "asin_reverse_keywords",
+          "iterate": "input.vocAsins",
+          "iterateAs": "asin",
+          "input": {
+            "ASIN": "{{asin}}",
+            "domain": "{{input.domain}}"
+          },
+          "output": "asinKeywords[{{asin}}]",
+          "description": "反查竞品排名靠前的搜索关键词"
+        },
+        {
+          "id": "5.2",
+          "name": "AI 广告关键词推荐",
+          "type": "ai_analysis",
+          "dependsOn": ["5.1"],
+          "input": {
+            "vocAnalysis": "{{vocAnalysis}}",
+            "asinKeywords": "{{asinKeywords}}",
+            "keywordData": "{{keywordData}}",
+            "systemPrompt": "你是一名亚马逊广告优化专家。",
+            "userPrompt": "基于以下数据,为该品类推荐高转化广告关键词:\n\n## VOC 痛点\n{{vocAnalysis.painPoints}}\n\n## 竞品关键词\n{{asinKeywords}}\n\n## 关键词搜索量\n{{keywordData}}\n\n请输出 JSON 格式,每个关键词包含: keyword, searchVolume, competition, suggestedBid, vocMatchScore(基于痛点匹配度0-100), reason"
+          },
+          "output": "adKeywordRecommendations",
+          "description": "AI 结合 VOC 痛点生成 VOC 匹配度排序的广告关键词"
+        }
+      ]
+    },
+
+    {
+      "id": "stage_6",
+      "name": "AI 综合分析与策略生成",
+      "description": "整合所有数据生成执行策略、Listing 优化、总结",
+      "dependsOn": ["stage_1", "stage_2", "stage_3", "stage_4", "stage_5"],
+      "steps": [
+        {
+          "id": "6.1",
+          "name": "AI 执行策略生成",
+          "type": "ai_analysis",
+          "input": {
+            "marketOverview": "{{marketOverview}}",
+            "competitorBenchmark": "{{competitorBenchmark}}",
+            "vocAnalysis": "{{vocAnalysis}}",
+            "socialTrends": "{{socialTrends}}",
+            "systemPrompt": "你是一名资深跨境电商战略顾问,擅长制定市场进入策略。",
+            "userPrompt": "基于以下{{input.industryName}}行业数据,生成分阶段执行策略(JSON格式):\n\n## 市场全景\n{{marketOverview}}\n\n## 竞品对标\n{{competitorBenchmark}}\n\n## VOC 用户洞察\n{{vocAnalysis}}\n\n## 社媒趋势\n{{socialTrends}}\n\n请输出:\n1. shortTerm (1-3个月): 3条行动项\n2. midTerm (3-6个月): 3条行动项\n3. longTerm (6-12个月): 3条行动项\n4. vocDrivenPriorities: 基于VOC的产品开发优先级\n5. keyConclusions: 3大关键行动总结"
+          },
+          "output": "strategyPlan"
+        },
+        {
+          "id": "6.2",
+          "name": "AI Listing 优化建议",
+          "type": "ai_analysis",
+          "input": {
+            "vocAnalysis": "{{vocAnalysis}}",
+            "competitorProducts": "{{competitorProducts}}",
+            "systemPrompt": "你是亚马逊 Listing 优化专家,精通 A9 算法和消费者心理学。",
+            "userPrompt": "基于 VOC 分析结果,为{{input.industryName}}品类生成 Listing 优化方案(JSON格式):\n\n## VOC 痛点与喜爱点\n{{vocAnalysis}}\n\n## 竞品 Listing 参考\n{{competitorProducts}}\n\n请输出:\n1. currentTitle: 竞品当前标题(举例)\n2. optimizedTitle: AI 优化标题\n3. titleRationale: 优化依据(引用VOC数据)\n4. bulletPoints: 5条优化后的 Bullet Points(每条标注对应的VOC数据支撑)\n5. searchTerms: 建议后台搜索词"
+          },
+          "output": "listingOptimization"
+        },
+        {
+          "id": "6.3",
+          "name": "品类机会矩阵评估",
+          "type": "ai_analysis",
+          "input": {
+            "marketOverview": "{{marketOverview}}",
+            "socialTrends": "{{socialTrends}}",
+            "vocAnalysis": "{{vocAnalysis}}",
+            "systemPrompt": "你是一名电商品类分析专家。",
+            "userPrompt": "基于以下数据,为每个品类生成综合机会评估矩阵(JSON格式):\n\n## 品类市场数据\n{{marketOverview}}\n\n## TikTok 热度\n{{socialTrends.tiktokPlayCounts}}\n\n请输出每个品类的: categoryName, marketSize(1-5星), growth(1-5星), socialHeat(1-5星), competition(低/中/高/极高), chineseSeller(%), recommendation(最优先/高优先/推荐/需谨慎/可考虑), reason"
+          },
+          "output": "categoryMatrix"
+        }
+      ]
+    },
+
+    {
+      "id": "stage_7",
+      "name": "报告渲染",
+      "description": "将所有数据注入 HTML 模板生成最终报告",
+      "dependsOn": ["stage_6"],
+      "steps": [
+        {
+          "id": "7.1",
+          "name": "组装报告数据",
+          "type": "data_transform",
+          "input": {
+            "industryName": "{{input.industryName}}",
+            "marketOverview": "{{marketOverview}}",
+            "competitorBenchmark": "{{competitorBenchmark}}",
+            "vocAnalysis": "{{vocAnalysis}}",
+            "socialTrends": "{{socialTrends}}",
+            "adKeywordRecommendations": "{{adKeywordRecommendations}}",
+            "strategyPlan": "{{strategyPlan}}",
+            "listingOptimization": "{{listingOptimization}}",
+            "categoryMatrix": "{{categoryMatrix}}"
+          },
+          "output": "reportData",
+          "transform": {
+            "slides": [
+              {
+                "id": "cover",
+                "title": "{{industryName}}行业竞品与B端线索分析报告",
+                "subtitle": "基于Amazon电商数据 · TikTok/Instagram社媒数据 · {{vocAnalysis.totalReviews}}条用户评论VOC分析",
+                "date": "{{currentDate}}"
+              },
+              {
+                "id": "toc",
+                "sections": ["核心执行摘要", "品类市场全景分析", "核心竞品深度对标", "全渠道用户VOC与需求洞察", "B端高价值线索与品类矩阵", "市场拓展与落地执行建议", "总结与展望", "AI-VOC 智能系统展示"]
+              },
+              {
+                "id": "executive_summary",
+                "metrics": "从 marketOverview 提取 Top4 核心指标卡片",
+                "coreFindings": "从 vocAnalysis + marketOverview 提取5条核心发现",
+                "coreValues": "从 strategyPlan 提取5条核心价值"
+              },
+              {
+                "id": "market_overview",
+                "revenueChart": "从 marketOverview 生成品类周均销售额柱状图数据",
+                "growthChart": "从 marketOverview 生成品类增长率横向柱状图数据",
+                "dataTable": "品类数据表: 品类/周均销量/周均销售额/均价/品牌数/增长率/中国卖家占比"
+              },
+              {
+                "id": "competitor_benchmark",
+                "brands": "从 competitorBenchmark 生成3个品牌卡片(IG粉丝/TikTok/Amazon SKU/策略)",
+                "radarChart": "从 competitorBenchmark 生成竞品能力雷达图(品牌知名度/社媒粉丝/内容质量/产品线宽度/价格竞争力)"
+              },
+              {
+                "id": "voc_insights",
+                "painPoints": "从 vocAnalysis.painPoints 生成痛点进度条",
+                "highlights": "从 vocAnalysis.highlights 生成好评进度条",
+                "scenesChart": "从 vocAnalysis.usageScenes 生成使用场景饼图"
+              },
+              {
+                "id": "category_matrix",
+                "opportunityTable": "从 categoryMatrix 生成品类机会评估表格",
+                "tiktokChart": "从 socialTrends 生成 TikTok 热度排名柱状图",
+                "seasonality": "从 marketOverview 提取季节性规律"
+              },
+              {
+                "id": "strategy",
+                "shortTerm": "从 strategyPlan.shortTerm 生成1-3月行动项",
+                "midTerm": "从 strategyPlan.midTerm 生成3-6月行动项",
+                "longTerm": "从 strategyPlan.longTerm 生成6-12月行动项",
+                "vocPriorities": "从 strategyPlan.vocDrivenPriorities 生成VOC驱动优先级标签"
+              },
+              {
+                "id": "conclusion",
+                "topCategory": "最优先品类(从 categoryMatrix 取排名第1)",
+                "socialDividend": "最具社媒红利品类",
+                "differentiator": "最大差异化机会(从 vocAnalysis 取最大痛点)",
+                "keyActions": "从 strategyPlan.keyConclusions 取3大关键行动"
+              }
+            ]
+          }
+        },
+        {
+          "id": "7.2",
+          "name": "渲染 HTML 报告",
+          "type": "template_render",
+          "input": {
+            "template": "report_template.html",
+            "data": "{{reportData}}"
+          },
+          "output": "finalReport",
+          "description": "使用 Chart.js 渲染图表,注入数据到 HTML 幻灯片模板"
+        }
+      ]
+    }
+  ],
+
+  "errorHandling": {
+    "retryPolicy": {
+      "maxRetries": 3,
+      "backoffMs": [1000, 3000, 10000],
+      "retryableErrors": ["TIMEOUT", "RATE_LIMIT", "CAPTCHA_BLOCKED"]
+    },
+    "fallbacks": {
+      "product_search": "当 ProductQuery 被验证码拦截(code=-10)时,回退到批量 product_detail_query",
+      "tiktok_*": "TikHub 接口失败时,跳过该数据点,在报告中标注 '社媒数据暂不可用'",
+      "instagram_*": "IG 接口失败时,跳过该品牌的社媒数据"
+    },
+    "timeout": {
+      "perStep": 30000,
+      "perStage": 120000,
+      "total": 600000
+    }
+  },
+
+  "output": {
+    "type": "object",
+    "properties": {
+      "report": {
+        "type": "string",
+        "format": "html",
+        "description": "完整的 HTML 幻灯片报告文件"
+      },
+      "rawData": {
+        "type": "object",
+        "description": "所有中间数据的 JSON 快照(可用于二次分析)"
+      },
+      "metadata": {
+        "type": "object",
+        "properties": {
+          "generatedAt": { "type": "string", "format": "datetime" },
+          "totalApiCalls": { "type": "integer" },
+          "totalReviewsAnalyzed": { "type": "integer" },
+          "dataFreshness": { "type": "string" },
+          "errors": { "type": "array", "description": "执行过程中的错误/警告列表" }
+        }
+      }
+    }
+  },
+
+  "billing": {
+    "description": "计费逻辑",
+    "items": [
+      { "type": "sorftime_api_call", "unit": "次", "description": "每次 Sorftime API 调用计1次" },
+      { "type": "tikhub_api_call", "unit": "次", "description": "每次 TikHub API 调用计1次" },
+      { "type": "ai_analysis_token", "unit": "千token", "description": "AI 分析消耗的 token 数" },
+      { "type": "report_generation", "unit": "份", "description": "每生成1份报告计1次" }
+    ],
+    "estimatedCalls": {
+      "sorftime": "品类数×20(产品详情) + vocAsins×reviewPages(评论) + trendKeywords(关键词) ≈ 130-200次",
+      "tikhub": "品类数(视频搜索) + 品牌数×2(IG+TikTok) + 品类数(达人搜索) ≈ 20-30次",
+      "ai": "3次大型分析(VOC/策略/Listing) + 2次中型(关键词/矩阵) ≈ 50K-100K tokens"
+    }
+  }
+}

+ 930 - 0
workflows/templates/report_template.html

@@ -0,0 +1,930 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width,initial-scale=1.0">
+<title>{{industryName}}行业竞品与B端线索分析报告</title>
+<!-- ===== Chart.js CDN ===== -->
+<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
+<style>
+/* ============================================================
+   全局变量 & 色彩体系 — 轻奢深棕 + 暖金莫兰迪
+   ============================================================ */
+:root{
+  --bg-deep:#1A110B;
+  --bg-dark:#2D1810;
+  --bg-mid:#3E2518;
+  --brown:#5C3D2E;
+  --brown-light:#8B6F47;
+  --gold:#C5A55A;
+  --gold-light:#D4B978;
+  --cream:#FFF8F0;
+  --cream-dim:#F5E6D3;
+  --accent-rose:#C4868B;
+  --accent-sage:#8FA68A;
+  --accent-blue:#7E9BB5;
+  --glass:rgba(255,248,240,0.06);
+  --glass-border:rgba(197,165,90,0.18);
+  --glass-hover:rgba(255,248,240,0.12);
+  --shadow:0 8px 32px rgba(0,0,0,0.35);
+  --radius:16px;
+  --transition:all .4s cubic-bezier(.4,0,.2,1);
+  --font:'Segoe UI','PingFang SC','Microsoft YaHei','Helvetica Neue',system-ui,sans-serif;
+}
+/* ============================================================
+   Reset & 基础排版
+   ============================================================ */
+*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
+html{font-size:16px;scroll-behavior:smooth;overflow:hidden}
+body{font-family:var(--font);background:var(--bg-deep);color:var(--cream);line-height:1.7;overflow:hidden;-webkit-font-smoothing:antialiased}
+h1{font-size:clamp(2rem,5vw,3.6rem);font-weight:800;letter-spacing:-.02em;line-height:1.15}
+h2{font-size:clamp(1.5rem,3.5vw,2.4rem);font-weight:700;letter-spacing:-.01em}
+h3{font-size:clamp(1.1rem,2vw,1.5rem);font-weight:600}
+a{color:var(--gold);text-decoration:none}
+/* ============================================================
+   幻灯片容器
+   ============================================================ */
+#slides-wrapper{position:relative;width:100vw;height:100vh;overflow:hidden}
+.slide{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:clamp(24px,4vw,60px);opacity:0;visibility:hidden;transform:translateY(30px);transition:opacity .7s ease,transform .7s ease,visibility 0s .7s;z-index:0;overflow-y:auto}
+.slide.active{opacity:1;visibility:visible;transform:translateY(0);transition:opacity .7s ease,transform .7s ease,visibility 0s 0s;z-index:1}
+.slide-inner{width:100%;max-width:1200px;position:relative}
+/* ============================================================
+   页眉 & 页脚
+   ============================================================ */
+.slide-header{position:absolute;top:0;left:0;right:0;display:flex;justify-content:space-between;align-items:center;padding:18px clamp(24px,4vw,60px);font-size:.8rem;color:var(--brown-light);letter-spacing:.05em;z-index:10;pointer-events:none}
+.slide-footer{position:absolute;bottom:0;left:0;right:0;display:flex;justify-content:space-between;align-items:center;padding:14px clamp(24px,4vw,60px);font-size:.75rem;color:rgba(139,111,71,.6);z-index:10;pointer-events:none}
+.page-num{font-weight:600;color:var(--gold)}
+/* ============================================================
+   毛玻璃卡片(Glassmorphism)
+   ============================================================ */
+.glass-card{background:var(--glass);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--glass-border);border-radius:var(--radius);padding:clamp(18px,2.5vw,32px);transition:var(--transition);position:relative;overflow:hidden}
+.glass-card::before{content:'';position:absolute;inset:0;background:linear-gradient(135deg,rgba(197,165,90,.08) 0%,transparent 60%);pointer-events:none;border-radius:inherit}
+.glass-card:hover{background:var(--glass-hover);border-color:rgba(197,165,90,.35);transform:translateY(-2px);box-shadow:var(--shadow)}
+/* ============================================================
+   数据指标卡片
+   ============================================================ */
+.metric-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:clamp(12px,2vw,24px);width:100%}
+.metric-card{text-align:center;padding:clamp(16px,2vw,28px)}
+.metric-value{font-size:clamp(1.8rem,4vw,2.8rem);font-weight:800;color:var(--gold);margin-bottom:4px}
+.metric-label{font-size:.85rem;color:var(--cream-dim);font-weight:400}
+.metric-sub{font-size:.75rem;color:var(--brown-light);margin-top:2px}
+/* ============================================================
+   数据表格
+   ============================================================ */
+.data-table{width:100%;border-collapse:separate;border-spacing:0;font-size:clamp(.75rem,1.4vw,.9rem)}
+.data-table thead th{background:rgba(197,165,90,.15);color:var(--gold-light);font-weight:600;padding:12px 14px;text-align:left;border-bottom:2px solid var(--gold);white-space:nowrap}
+.data-table thead th:first-child{border-radius:var(--radius) 0 0 0}
+.data-table thead th:last-child{border-radius:0 var(--radius) 0 0}
+.data-table tbody td{padding:10px 14px;border-bottom:1px solid rgba(139,111,71,.15);transition:background .3s}
+.data-table tbody tr:hover td{background:rgba(197,165,90,.06)}
+.data-table tbody tr:last-child td:first-child{border-radius:0 0 0 var(--radius)}
+.data-table tbody tr:last-child td:last-child{border-radius:0 0 var(--radius) 0}
+/* ============================================================
+   标签 / 徽章
+   ============================================================ */
+.badge{display:inline-block;padding:3px 10px;border-radius:20px;font-size:.72rem;font-weight:600;letter-spacing:.03em}
+.badge-gold{background:rgba(197,165,90,.2);color:var(--gold-light);border:1px solid rgba(197,165,90,.3)}
+.badge-rose{background:rgba(196,134,139,.15);color:var(--accent-rose);border:1px solid rgba(196,134,139,.25)}
+.badge-sage{background:rgba(143,166,138,.15);color:var(--accent-sage);border:1px solid rgba(143,166,138,.25)}
+.badge-blue{background:rgba(126,155,181,.15);color:var(--accent-blue);border:1px solid rgba(126,155,181,.25)}
+/* ============================================================
+   进度条 / 比例条
+   ============================================================ */
+.bar-row{display:flex;align-items:center;gap:12px;margin-bottom:10px}
+.bar-label{min-width:140px;font-size:.82rem;text-align:right;color:var(--cream-dim)}
+.bar-track{flex:1;height:22px;background:rgba(255,248,240,.06);border-radius:11px;overflow:hidden;position:relative}
+.bar-fill{height:100%;border-radius:11px;transition:width 1.5s cubic-bezier(.4,0,.2,1);position:relative}
+.bar-fill::after{content:attr(data-value);position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:.7rem;font-weight:700;color:var(--bg-dark)}
+/* ============================================================
+   侧边导航
+   ============================================================ */
+#side-nav{position:fixed;right:clamp(10px,2vw,24px);top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:12px;z-index:1000}
+.nav-dot{width:12px;height:12px;border-radius:50%;border:2px solid var(--brown-light);background:transparent;cursor:pointer;transition:var(--transition);position:relative}
+.nav-dot.active{background:var(--gold);border-color:var(--gold);box-shadow:0 0 12px rgba(197,165,90,.5)}
+.nav-dot::after{content:attr(data-tip);position:absolute;right:22px;top:50%;transform:translateY(-50%);background:var(--bg-mid);color:var(--cream);padding:4px 12px;border-radius:8px;font-size:.72rem;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .3s}
+.nav-dot:hover::after{opacity:1}
+/* ============================================================
+   全屏按钮
+   ============================================================ */
+#fs-btn{position:fixed;top:18px;right:clamp(10px,2vw,24px);z-index:1001;background:var(--glass);backdrop-filter:blur(10px);border:1px solid var(--glass-border);color:var(--gold);padding:6px 14px;border-radius:8px;cursor:pointer;font-size:.78rem;transition:var(--transition)}
+#fs-btn:hover{background:var(--glass-hover);border-color:var(--gold)}
+/* ============================================================
+   封面粒子画布
+   ============================================================ */
+#particles-canvas{position:absolute;inset:0;z-index:0;pointer-events:none}
+/* ============================================================
+   图表容器
+   ============================================================ */
+.chart-wrap{position:relative;width:100%;max-height:320px;margin:12px 0}
+.chart-wrap canvas{max-height:320px}
+/* ============================================================
+   两栏/三栏布局
+   ============================================================ */
+.cols-2{display:grid;grid-template-columns:1fr 1fr;gap:clamp(14px,2vw,28px)}
+.cols-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:clamp(14px,2vw,24px)}
+/* ============================================================
+   分隔线 & 间距工具
+   ============================================================ */
+.divider{width:60px;height:3px;background:linear-gradient(90deg,var(--gold),transparent);border-radius:2px;margin:16px 0}
+.mt-sm{margin-top:12px}.mt-md{margin-top:24px}.mt-lg{margin-top:36px}
+.mb-sm{margin-bottom:12px}.mb-md{margin-bottom:24px}
+.text-gold{color:var(--gold)}.text-rose{color:var(--accent-rose)}.text-sage{color:var(--accent-sage)}.text-blue{color:var(--accent-blue)}
+.text-dim{color:var(--brown-light)}.text-sm{font-size:.82rem}.text-xs{font-size:.72rem}
+.fw-700{font-weight:700}.fw-600{font-weight:600}
+/* ============================================================
+   封面页特殊样式
+   ============================================================ */
+.cover-content{position:relative;z-index:1;text-align:center}
+.cover-brand{font-size:clamp(.9rem,1.8vw,1.2rem);color:var(--gold);letter-spacing:.3em;text-transform:uppercase;margin-bottom:16px;font-weight:600}
+.cover-title{background:linear-gradient(135deg,var(--cream) 0%,var(--gold-light) 50%,var(--gold) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin-bottom:20px}
+.cover-sub{font-size:clamp(.9rem,1.6vw,1.15rem);color:var(--cream-dim);max-width:640px;margin:0 auto 32px}
+.cover-date{font-size:.85rem;color:var(--brown-light);letter-spacing:.1em}
+.cover-line{width:80px;height:1px;background:var(--gold);margin:24px auto}
+/* ============================================================
+   目录页
+   ============================================================ */
+.toc-list{list-style:none;counter-reset:toc}
+.toc-item{counter-increment:toc;padding:14px 20px;border-bottom:1px solid rgba(139,111,71,.12);cursor:pointer;display:flex;align-items:center;gap:16px;transition:var(--transition);border-radius:8px}
+.toc-item:hover{background:var(--glass-hover);padding-left:28px}
+.toc-item::before{content:counter(toc,decimal-leading-zero);font-size:1.6rem;font-weight:800;color:var(--gold);min-width:40px}
+.toc-item .toc-title{font-size:1.05rem;font-weight:600;color:var(--cream)}
+.toc-item .toc-desc{font-size:.78rem;color:var(--brown-light);margin-top:2px}
+/* ============================================================
+   竞品卡片
+   ============================================================ */
+.competitor-card{padding:clamp(18px,2vw,28px)}
+.competitor-card h3{color:var(--gold-light);margin-bottom:8px}
+.comp-stat{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid rgba(139,111,71,.1);font-size:.85rem}
+/* ============================================================
+   时间轴
+   ============================================================ */
+.timeline{position:relative;padding-left:28px}
+.timeline::before{content:'';position:absolute;left:8px;top:0;bottom:0;width:2px;background:linear-gradient(180deg,var(--gold),var(--brown-light),transparent)}
+.timeline-item{position:relative;margin-bottom:24px;padding-left:20px}
+.timeline-item::before{content:'';position:absolute;left:-24px;top:6px;width:12px;height:12px;border-radius:50%;background:var(--gold);border:2px solid var(--bg-dark);box-shadow:0 0 8px rgba(197,165,90,.4)}
+.timeline-item h4{color:var(--gold-light);font-size:.95rem;margin-bottom:4px}
+.timeline-item p{font-size:.82rem;color:var(--cream-dim)}
+/* ============================================================
+   VOC 痛点条
+   ============================================================ */
+.pain-bar{display:flex;align-items:center;gap:12px;margin-bottom:14px}
+.pain-icon{font-size:1.1rem;min-width:24px;text-align:center}
+.pain-info{flex:1}
+.pain-name{font-size:.85rem;font-weight:600;color:var(--cream);margin-bottom:3px}
+.pain-pct{font-size:.75rem;color:var(--brown-light)}
+.pain-track{width:100%;height:8px;background:rgba(255,248,240,.06);border-radius:4px;overflow:hidden}
+.pain-fill{height:100%;border-radius:4px;transition:width 1.5s ease}
+/* ============================================================
+   动画关键帧
+   ============================================================ */
+@keyframes fadeInUp{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}
+@keyframes fadeIn{from{opacity:0}to{opacity:1}}
+@keyframes shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}
+@keyframes pulse{0%,100%{opacity:1}50%{opacity:.6}}
+.anim-up{animation:fadeInUp .8s ease both}
+.anim-delay-1{animation-delay:.15s}.anim-delay-2{animation-delay:.3s}.anim-delay-3{animation-delay:.45s}.anim-delay-4{animation-delay:.6s}
+/* 入场动画 */
+.anim-enter{opacity:0;transform:translateY(24px);transition:opacity .7s ease,transform .7s ease}
+.slide.active .anim-enter{opacity:1;transform:translateY(0)}
+.slide.active .anim-enter.d1{transition-delay:.1s}
+.slide.active .anim-enter.d2{transition-delay:.2s}
+.slide.active .anim-enter.d3{transition-delay:.3s}
+.slide.active .anim-enter.d4{transition-delay:.4s}
+.slide.active .anim-enter.d5{transition-delay:.5s}
+.slide.active .anim-enter.d6{transition-delay:.6s}
+/* ============================================================
+   Modal弹窗
+   ============================================================ */
+.modal-overlay{position:fixed;inset:0;background:rgba(10,6,3,.85);backdrop-filter:blur(12px);z-index:2000;display:none;align-items:center;justify-content:center;opacity:0;transition:opacity .4s ease}
+.modal-overlay.show{display:flex;opacity:1}
+.modal-box{background:linear-gradient(135deg,#1a110b,#0d0a08);border:1px solid rgba(197,165,90,.25);border-radius:16px;width:92vw;max-width:960px;max-height:88vh;overflow-y:auto;box-shadow:0 8px 48px rgba(0,0,0,.7);position:relative;animation:modalIn .4s ease}
+@keyframes modalIn{from{opacity:0;transform:translateY(30px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}
+.modal-close{position:absolute;top:12px;right:16px;background:none;border:none;color:var(--cream-dim);font-size:1.4rem;cursor:pointer;z-index:10;transition:color .3s}
+.modal-close:hover{color:var(--gold)}
+.modal-header{padding:24px 28px 16px;border-bottom:1px solid rgba(197,165,90,.15)}
+.modal-header h2{font-size:1.15rem;color:var(--gold);margin:0 0 6px}
+.modal-header p{font-size:.8rem;color:var(--cream-dim);margin:0}
+.modal-body{padding:20px 28px 28px}
+/* ============================================================
+   响应式
+   ============================================================ */
+@media(max-width:900px){
+  .cols-2,.cols-3{grid-template-columns:1fr}
+  .metric-grid{grid-template-columns:repeat(2,1fr)}
+  #side-nav{right:6px;gap:8px}
+  .nav-dot{width:9px;height:9px}
+  .bar-label{min-width:100px;font-size:.75rem}
+}
+@media(max-width:600px){
+  .metric-grid{grid-template-columns:1fr}
+  .slide{padding:16px}
+}
+</style>
+</head>
+<body>
+
+<!-- ===== 全屏按钮 ===== -->
+<button id="fs-btn" title="全屏切换">⛶ 全屏</button>
+
+<!-- ===== 侧边导航(由 JS 自动生成) ===== -->
+<nav id="side-nav"></nav>
+
+<!-- ===== 幻灯片容器 ===== -->
+<div id="slides-wrapper">
+
+<!-- ════════════════════════════════════════════
+     SLIDE 0 — 封面
+     ════════════════════════════════════════════ -->
+<section class="slide active" id="slide-0">
+  <canvas id="particles-canvas"></canvas>
+  <div class="cover-content">
+    <p class="cover-brand">{{coverBrandEnglish}}</p>
+    <h1 class="cover-title">{{industryName}}行业竞品与<br>B端线索分析报告</h1>
+    <div class="cover-line"></div>
+    <p class="cover-sub">基于Amazon电商数据 · TikTok/Instagram社媒数据 · {{totalReviews}}条用户评论VOC分析<br>覆盖{{categoryCount}}大核心品类 · {{competitorCount}}大竞品品牌深度对标</p>
+    <p class="cover-date">{{reportDate}} · AI Data Intelligence</p>
+  </div>
+  <div class="slide-footer"><span></span><span class="text-xs" style="opacity:.4">按 → 或滚轮翻页</span></div>
+</section>
+
+<!-- ════════════════════════════════════════════
+     SLIDE 1 — 目录
+     ════════════════════════════════════════════ -->
+<section class="slide" id="slide-1">
+  <div class="slide-header"><span>{{industryName}}行业竞品分析报告</span><span>目录</span></div>
+  <div class="slide-inner" style="max-width:720px">
+    <h2 class="text-gold mb-md" style="text-align:center">报告目录</h2>
+    <div class="divider" style="margin:0 auto 28px"></div>
+    <ul class="toc-list">
+      <li class="toc-item" onclick="goSlide(2)"><div><div class="toc-title">核心执行摘要</div><div class="toc-desc">关键数据 · 核心结论 · 核心价值</div></div></li>
+      <li class="toc-item" onclick="goSlide(3)"><div><div class="toc-title">{{industryName}}品类市场全景分析</div><div class="toc-desc">{{categoryCount}}大品类规模 · 增长趋势 · 价格带 · 品牌分布</div></div></li>
+      <li class="toc-item" onclick="goSlide(4)"><div><div class="toc-title">核心竞品深度对标分析</div><div class="toc-desc">{{competitorNames}} 品牌拆解</div></div></li>
+      <li class="toc-item" onclick="goSlide(5)"><div><div class="toc-title">全渠道用户VOC与需求洞察</div><div class="toc-desc">{{totalReviews}}条评论 · 痛点 · 喜爱点 · 使用场景</div></div></li>
+      <li class="toc-item" onclick="goSlide(6)"><div><div class="toc-title">B端高价值线索与品类矩阵</div><div class="toc-desc">品类机会评估 · 社媒热度 · 优先级排序</div></div></li>
+      <li class="toc-item" onclick="goSlide(7)"><div><div class="toc-title">市场拓展与落地执行建议</div><div class="toc-desc">短期·中期·长期分阶段策略</div></div></li>
+      <li class="toc-item" onclick="goSlide(8)"><div><div class="toc-title">总结与展望</div><div class="toc-desc">核心机会点 · 行动优先级</div></div></li>
+    </ul>
+  </div>
+  <div class="slide-footer"><span>{{industryName}}行业竞品分析报告</span><span class="page-num">01</span></div>
+</section>
+
+<!-- ════════════════════════════════════════════
+     SLIDE 2 — 执行摘要
+     ════════════════════════════════════════════ -->
+<section class="slide" id="slide-2">
+  <div class="slide-header"><span>{{industryName}}行业竞品分析报告</span><span>执行摘要</span></div>
+  <div class="slide-inner">
+    <h2 class="text-gold mb-sm">核心执行摘要</h2>
+    <div class="divider"></div>
+    <!-- 核心数据指标卡片 — 由 REPORT_DATA.metrics 注入 -->
+    <div class="metric-grid mt-md mb-md" id="exec-metrics"></div>
+    <!-- 核心结论 — 由 REPORT_DATA.coreFindings / coreValues 注入 -->
+    <div class="cols-2">
+      <div class="glass-card">
+        <h3 class="text-gold mb-sm">📊 核心发现</h3>
+        <ul id="core-findings" style="list-style:none;font-size:.85rem;color:var(--cream-dim)"></ul>
+      </div>
+      <div class="glass-card">
+        <h3 class="text-gold mb-sm">💡 核心价值</h3>
+        <ul id="core-values" style="list-style:none;font-size:.85rem;color:var(--cream-dim)"></ul>
+      </div>
+    </div>
+  </div>
+  <div class="slide-footer"><span>{{industryName}}行业竞品分析报告</span><span class="page-num">02</span></div>
+</section>
+
+<!-- ════════════════════════════════════════════
+     SLIDE 3 — 市场全景
+     ════════════════════════════════════════════ -->
+<section class="slide" id="slide-3">
+  <div class="slide-header"><span>{{industryName}}行业竞品分析报告</span><span>市场全景</span></div>
+  <div class="slide-inner">
+    <h2 class="text-gold mb-sm">{{industryName}}品类市场全景分析</h2>
+    <div class="divider mb-md"></div>
+    <div class="cols-2">
+      <div class="glass-card">
+        <h3 class="text-sm fw-600 mb-sm">Top100 周均销售额(美元)</h3>
+        <div class="chart-wrap"><canvas id="chart-revenue"></canvas></div>
+      </div>
+      <div class="glass-card">
+        <h3 class="text-sm fw-600 mb-sm">品类增长率(同比)</h3>
+        <div class="chart-wrap"><canvas id="chart-growth"></canvas></div>
+      </div>
+    </div>
+    <!-- 数据表格 — 由 REPORT_DATA.categoryTable 注入 -->
+    <div class="glass-card mt-md" style="overflow-x:auto">
+      <table class="data-table">
+        <thead><tr>
+          <th>品类</th><th>周均销量</th><th>周均销售额</th><th>均价</th><th>品牌数</th><th>增长率</th><th>中国卖家</th>
+        </tr></thead>
+        <tbody id="market-table-body"></tbody>
+      </table>
+    </div>
+  </div>
+  <div class="slide-footer"><span>{{industryName}}行业竞品分析报告</span><span class="page-num">03</span></div>
+</section>
+
+<!-- ════════════════════════════════════════════
+     SLIDE 4 — 竞品对标
+     ════════════════════════════════════════════ -->
+<section class="slide" id="slide-4">
+  <div class="slide-header"><span>{{industryName}}行业竞品分析报告</span><span>竞品对标</span></div>
+  <div class="slide-inner">
+    <h2 class="text-gold mb-sm">核心竞品深度对标分析</h2>
+    <div class="divider mb-md"></div>
+    <!-- 竞品卡片 — 由 REPORT_DATA.competitors 注入 -->
+    <div class="cols-3" id="competitor-cards"></div>
+    <!-- 雷达图 -->
+    <div class="glass-card mt-md" style="max-width:480px;margin-left:auto;margin-right:auto">
+      <h3 class="text-sm fw-600 mb-sm" style="text-align:center">竞品综合能力雷达图</h3>
+      <div class="chart-wrap" style="max-height:260px"><canvas id="chart-radar"></canvas></div>
+    </div>
+  </div>
+  <div class="slide-footer"><span>{{industryName}}行业竞品分析报告</span><span class="page-num">04</span></div>
+</section>
+
+<!-- ════════════════════════════════════════════
+     SLIDE 5 — VOC 用户洞察
+     ════════════════════════════════════════════ -->
+<section class="slide" id="slide-5">
+  <div class="slide-header"><span>{{industryName}}行业竞品分析报告</span><span>用户VOC</span></div>
+  <div class="slide-inner">
+    <h2 class="text-gold mb-sm">全渠道用户VOC与需求洞察</h2>
+    <p class="text-dim text-sm mb-md">基于品类 Top 畅销产品 <strong class="text-gold" id="voc-review-count">0</strong> 条真实用户评论深度分析</p>
+    <div class="cols-2">
+      <!-- 左:痛点分析 -->
+      <div class="glass-card">
+        <h3 class="text-rose text-sm fw-600 mb-sm">🔴 用户核心痛点(差评Top5)</h3>
+        <div id="pain-points-container"></div>
+      </div>
+      <!-- 右:喜爱点 + 场景 -->
+      <div>
+        <div class="glass-card mb-sm">
+          <h3 class="text-sage text-sm fw-600 mb-sm">🟢 用户最爱亮点(好评Top5)</h3>
+          <div id="highlights-container"></div>
+        </div>
+        <div class="glass-card">
+          <h3 class="text-sm fw-600 mb-sm">📍 使用场景分布</h3>
+          <div class="chart-wrap" style="max-height:180px"><canvas id="chart-scenes"></canvas></div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div class="slide-footer"><span>{{industryName}}行业竞品分析报告</span><span class="page-num">05</span></div>
+</section>
+
+<!-- ════════════════════════════════════════════
+     SLIDE 6 — B端线索 & 品类矩阵
+     ════════════════════════════════════════════ -->
+<section class="slide" id="slide-6">
+  <div class="slide-header"><span>{{industryName}}行业竞品分析报告</span><span>线索清单</span></div>
+  <div class="slide-inner">
+    <h2 class="text-gold mb-sm">B端高价值线索与品类机会矩阵</h2>
+    <div class="divider mb-md"></div>
+    <!-- 品类机会矩阵 — 由 REPORT_DATA.categoryMatrix 注入 -->
+    <div class="glass-card mb-md" style="overflow-x:auto">
+      <h3 class="text-sm fw-600 mb-sm">品类综合机会评估</h3>
+      <table class="data-table">
+        <thead><tr><th>品类</th><th>市场规模</th><th>增长性</th><th>社媒热度</th><th>竞争强度</th><th>中国卖家</th><th>综合推荐</th></tr></thead>
+        <tbody id="matrix-table-body"></tbody>
+      </table>
+    </div>
+    <div class="cols-2">
+      <div class="glass-card">
+        <h3 class="text-sm fw-600 mb-sm">TikTok 社媒热度排名</h3>
+        <div class="chart-wrap"><canvas id="chart-tiktok"></canvas></div>
+      </div>
+      <div class="glass-card">
+        <h3 class="text-sm fw-600 mb-sm">季节性与要点</h3>
+        <div id="seasonality-notes" style="font-size:.85rem;color:var(--cream-dim)"></div>
+      </div>
+    </div>
+  </div>
+  <div class="slide-footer"><span>{{industryName}}行业竞品分析报告</span><span class="page-num">06</span></div>
+</section>
+
+<!-- ════════════════════════════════════════════
+     SLIDE 7 — 执行策略
+     ════════════════════════════════════════════ -->
+<section class="slide" id="slide-7">
+  <div class="slide-header"><span>{{industryName}}行业竞品分析报告</span><span>执行策略</span></div>
+  <div class="slide-inner">
+    <h2 class="text-gold mb-sm">市场拓展与落地执行建议</h2>
+    <div class="divider mb-md"></div>
+    <!-- 短中长期策略 — 由 REPORT_DATA.strategy 注入 -->
+    <div class="cols-3" id="strategy-columns"></div>
+    <!-- VOC驱动的产品策略 -->
+    <div class="glass-card mt-md">
+      <h3 class="text-sm fw-600 mb-sm">🔬 VOC驱动的产品开发优先级</h3>
+      <div id="voc-priorities" style="display:flex;flex-wrap:wrap;gap:12px;font-size:.82rem"></div>
+    </div>
+  </div>
+  <div class="slide-footer"><span>{{industryName}}行业竞品分析报告</span><span class="page-num">07</span></div>
+</section>
+
+<!-- ════════════════════════════════════════════
+     SLIDE 8 — 总结与展望
+     ════════════════════════════════════════════ -->
+<section class="slide" id="slide-8">
+  <div class="slide-header"><span>{{industryName}}行业竞品分析报告</span><span>总结展望</span></div>
+  <div class="slide-inner" style="max-width:900px">
+    <h2 class="text-gold mb-sm" style="text-align:center">总结与展望</h2>
+    <div class="divider" style="margin:0 auto 32px"></div>
+    <!-- 由 REPORT_DATA.conclusion 注入 -->
+    <div class="cols-2 mb-md" id="conclusion-top-cards"></div>
+    <div class="glass-card mb-md" id="conclusion-differentiator" style="text-align:center;padding:28px"></div>
+    <div class="glass-card" id="conclusion-actions" style="background:linear-gradient(135deg,rgba(197,165,90,.1),rgba(143,166,138,.08));border-color:rgba(197,165,90,.25)"></div>
+  </div>
+  <div class="slide-footer"><span>{{industryName}}行业竞品分析报告</span><span class="page-num">08</span></div>
+</section>
+
+<!-- ════════════════════════════════════════════
+     SLIDE 9 — 致谢
+     ════════════════════════════════════════════ -->
+<section class="slide" id="slide-9">
+  <div class="cover-content">
+    <div class="cover-line" style="margin-bottom:32px"></div>
+    <h2 style="font-size:clamp(1.6rem,3.5vw,2.6rem);background:linear-gradient(135deg,var(--cream),var(--gold-light));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin-bottom:16px">感谢您的关注</h2>
+    <p class="text-dim" style="font-size:1rem;max-width:520px;margin:0 auto 28px">期待与您携手,用AI-VOC系统共同开拓{{industryName}}市场新蓝海</p>
+    <div class="cover-line"></div>
+    <div style="margin-top:32px;font-size:.85rem;color:var(--brown-light)">
+      <p>报告编制:AI-VOC 智能数据分析系统</p>
+      <p>数据来源:Amazon Sorftime API · TikHub (TikTok & Instagram) · AI-VOC Engine</p>
+      <p>数据时效:截至 {{reportDate}}</p>
+      <p style="margin-top:16px;font-size:.82rem;color:var(--gold)">📧 联系我们,获取专属VOC系统试用</p>
+      <p style="margin-top:12px;font-size:.75rem;opacity:.6">本报告数据来自第三方API,仅供商业决策参考</p>
+    </div>
+  </div>
+  <div class="slide-footer"><span>{{industryName}}行业竞品分析报告</span><span class="page-num">09</span></div>
+</section>
+
+</div><!-- /slides-wrapper -->
+
+<!-- ===== Modal弹窗容器 ===== -->
+<div class="modal-overlay" id="modal-overlay">
+  <div class="modal-box">
+    <button class="modal-close" id="modal-close">&times;</button>
+    <div class="modal-header" id="modal-header"></div>
+    <div class="modal-body" id="modal-body"></div>
+  </div>
+</div>
+
+<!-- ============================================================
+     REPORT DATA — 由编排引擎注入
+     ============================================================ -->
+<script>
+/**
+ * REPORT_DATA: 所有报告数据由 workflow Stage 7 组装后注入到此对象。
+ * 模板中所有 DOM 操作均基于此数据驱动渲染。
+ *
+ * 结构说明:
+ * - meta: 报告元信息
+ * - metrics: 执行摘要指标卡片 [{value, prefix, suffix, label, sub}]
+ * - coreFindings: 核心发现列表 [{text, highlight, highlightClass}]
+ * - coreValues: 核心价值列表 [string]
+ * - categories: 品类市场数据 [{name, weeklySales, weeklyRevenue, avgPrice, brands, growth, chinaRatio, highlight, revenueNum, growthNum}]
+ * - competitors: 竞品数据 [{name, positioning, positionBadge, priceRange, igFollowers, tiktokFollowers, skuNote, strategyNote, pros, cons, radarData:[5]}]
+ * - vocAnalysis: VOC分析 {totalReviews, painPoints:[{icon, name, pct, gradient, quote}], highlights:[{name, pct, color}], scenes:[{name, pct}]}
+ * - categoryMatrix: 品类机会矩阵 [{name, marketSize, growth, socialHeat, competition, chinaRatio, recommendation, badgeClass}]
+ * - tiktokHeat: TikTok热度 [{name, plays}]
+ * - seasonalNotes: 季节性要点 [{icon, title, desc}]
+ * - strategy: 执行策略 {shortTerm:[{title, desc}], midTerm:[{title, desc}], longTerm:[{title, desc}]}
+ * - vocPriorities: VOC驱动优先级 [{text, badgeClass}]
+ * - conclusion: 总结 {topCategory:{emoji, title, name, desc}, socialDividend:{emoji, title, name, desc}, differentiator:{title, subtitle, desc}, keyActions:[{emoji, title, desc}]}
+ * - trendData: 趋势数据 {weeks:[], datasets:[{label, data, borderColor}]}
+ */
+const REPORT_DATA = /*{{REPORT_DATA_JSON}}*/ {};
+</script>
+
+<!-- ============================================================
+     JavaScript — 导航 · 动画 · 数据驱动渲染 · 图表
+     ============================================================ -->
+<script>
+/* ===== 全局状态 ===== */
+let currentSlide = 0;
+const totalSlides = document.querySelectorAll('.slide').length;
+let isTransitioning = false;
+
+/* ===== 自动生成侧边导航 ===== */
+(function buildNav(){
+  const tips = ['封面','目录','执行摘要','市场全景','竞品对标','用户VOC','线索清单','执行策略','总结展望','致谢'];
+  const nav = document.getElementById('side-nav');
+  tips.forEach((tip,i) => {
+    const d = document.createElement('div');
+    d.className = 'nav-dot' + (i===0?' active':'');
+    d.dataset.tip = tip;
+    d.dataset.slide = i;
+    d.addEventListener('click', () => goSlide(i));
+    nav.appendChild(d);
+  });
+})();
+const dots = document.querySelectorAll('.nav-dot');
+
+/* ===== 幻灯片切换 ===== */
+function goSlide(n) {
+  if (isTransitioning || n === currentSlide || n < 0 || n >= totalSlides) return;
+  isTransitioning = true;
+  const slides = document.querySelectorAll('.slide');
+  slides[currentSlide].classList.remove('active');
+  slides[n].classList.add('active');
+  dots.forEach((d, i) => d.classList.toggle('active', i === n));
+  currentSlide = n;
+  triggerSlideAnimations(n);
+  setTimeout(() => { isTransitioning = false; }, 750);
+}
+function nextSlide() { goSlide(currentSlide + 1); }
+function prevSlide() { goSlide(currentSlide - 1); }
+
+/* ===== 弹窗检测 ===== */
+function isModalOpen() { return document.getElementById('modal-overlay').classList.contains('show'); }
+
+/* ===== 键盘事件 ===== */
+document.addEventListener('keydown', e => {
+  if (isModalOpen()) return;
+  if (e.key === 'ArrowRight' || e.key === ' ' || e.key === 'PageDown') { e.preventDefault(); nextSlide(); }
+  else if (e.key === 'ArrowLeft' || e.key === 'PageUp') { e.preventDefault(); prevSlide(); }
+  else if (e.key === 'Home') { e.preventDefault(); goSlide(0); }
+  else if (e.key === 'End') { e.preventDefault(); goSlide(totalSlides - 1); }
+});
+
+/* ===== 鼠标滚轮 ===== */
+let wheelTimeout = 0;
+document.addEventListener('wheel', e => {
+  if (isModalOpen()) return;
+  e.preventDefault();
+  const now = Date.now();
+  if (now - wheelTimeout < 800) return;
+  wheelTimeout = now;
+  e.deltaY > 0 ? nextSlide() : prevSlide();
+}, { passive: false });
+
+/* ===== 触屏滑动 ===== */
+let touchStartY = 0, touchStartX = 0;
+document.addEventListener('touchstart', e => { touchStartY = e.touches[0].clientY; touchStartX = e.touches[0].clientX; });
+document.addEventListener('touchend', e => {
+  if (isModalOpen()) return;
+  const dy = e.changedTouches[0].clientY - touchStartY;
+  const dx = e.changedTouches[0].clientX - touchStartX;
+  if (Math.abs(dy) > Math.abs(dx) && Math.abs(dy) > 50) { dy < 0 ? nextSlide() : prevSlide(); }
+  else if (Math.abs(dx) > 50) { dx < 0 ? nextSlide() : prevSlide(); }
+});
+
+/* ===== 全屏 ===== */
+document.getElementById('fs-btn').addEventListener('click', () => {
+  if (!document.fullscreenElement) document.documentElement.requestFullscreen().catch(() => {});
+  else document.exitFullscreen();
+});
+
+/* ===== 数字递增动画 ===== */
+function animateCounters(slideEl) {
+  slideEl.querySelectorAll('.metric-value[data-count]').forEach(el => {
+    const target = +el.dataset.count;
+    const prefix = el.dataset.prefix || '';
+    const suffix = el.dataset.suffix || '';
+    const duration = 1800;
+    const start = performance.now();
+    const format = n => {
+      if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';
+      if (n >= 1e3) return (n / 1e3).toFixed(n >= 1e4 ? 0 : 1) + 'K';
+      return n.toLocaleString();
+    };
+    function step(now) {
+      const p = Math.min((now - start) / duration, 1);
+      const ease = 1 - Math.pow(1 - p, 3);
+      el.textContent = prefix + format(Math.round(target * ease)) + suffix;
+      if (p < 1) requestAnimationFrame(step);
+    }
+    requestAnimationFrame(step);
+  });
+}
+
+/* ===== 进度条动画 ===== */
+function animateBars(slideEl) {
+  slideEl.querySelectorAll('.bar-fill[data-target]').forEach(el => {
+    setTimeout(() => { el.style.width = el.dataset.target + '%'; }, 200);
+  });
+  slideEl.querySelectorAll('.pain-fill[data-target]').forEach(el => {
+    setTimeout(() => {
+      el.style.width = (el.dataset.target / 35 * 100) + '%';
+      if (el.dataset.bg) el.style.background = el.dataset.bg;
+    }, 200);
+  });
+}
+
+/* ===== 页面动画触发器 ===== */
+const animatedSlides = new Set();
+function triggerSlideAnimations(n) {
+  const slideEl = document.getElementById('slide-' + n);
+  if (!slideEl) return;
+  if (!animatedSlides.has(n)) {
+    animatedSlides.add(n);
+    animateCounters(slideEl);
+    animateBars(slideEl);
+    initChartsForSlide(n);
+  }
+}
+
+/* ============================================================
+   Chart.js 全局配置
+   ============================================================ */
+const chartInstances = {};
+const chartFontColor = '#F5E6D3';
+const chartGridColor = 'rgba(139,111,71,0.15)';
+const PALETTE = ['rgba(197,165,90,0.7)','rgba(143,166,138,0.65)','rgba(196,134,139,0.6)','rgba(126,155,181,0.55)','rgba(212,185,120,0.5)','rgba(139,111,71,0.4)'];
+const PALETTE_BORDER = ['#C5A55A','#8FA68A','#C4868B','#7E9BB5','#D4B978','#8B6F47'];
+
+Chart.defaults.color = chartFontColor;
+Chart.defaults.font.family = "'Segoe UI','PingFang SC','Microsoft YaHei',sans-serif";
+Chart.defaults.font.size = 12;
+
+function initChartsForSlide(n) {
+  if (n === 3) initMarketCharts();
+  if (n === 4) initRadarChart();
+  if (n === 5) initScenesChart();
+  if (n === 6) initTiktokChart();
+}
+
+/* --- 市场全景图表 --- */
+function initMarketCharts() {
+  if (chartInstances.revenue || !REPORT_DATA.categories) return;
+  const cats = REPORT_DATA.categories;
+  const labels = cats.map(c => c.name);
+  const revenueData = cats.map(c => c.revenueNum);
+  chartInstances.revenue = new Chart(document.getElementById('chart-revenue'), {
+    type: 'bar',
+    data: { labels, datasets: [{ data: revenueData, backgroundColor: PALETTE.slice(0, cats.length), borderColor: PALETTE_BORDER.slice(0, cats.length), borderWidth: 1, borderRadius: 6, maxBarThickness: 52 }] },
+    options: {
+      responsive: true, maintainAspectRatio: false,
+      plugins: { legend: { display: false }, tooltip: { callbacks: { label: ctx => '$' + (ctx.raw / 1e6).toFixed(1) + 'M / 周' } } },
+      scales: { y: { ticks: { callback: v => '$' + (v/1e6).toFixed(0) + 'M' }, grid: { color: chartGridColor } }, x: { grid: { display: false } } },
+      animation: { duration: 1200, easing: 'easeOutQuart' }
+    }
+  });
+
+  const growthSorted = [...cats].sort((a,b) => b.growthNum - a.growthNum);
+  chartInstances.growth = new Chart(document.getElementById('chart-growth'), {
+    type: 'bar',
+    data: {
+      labels: growthSorted.map(c => c.name),
+      datasets: [{ data: growthSorted.map(c => c.growthNum),
+        backgroundColor: growthSorted.map(c => c.growthNum > 50 ? 'rgba(143,166,138,0.7)' : c.growthNum > 0 ? 'rgba(197,165,90,0.6)' : 'rgba(196,134,139,0.5)'),
+        borderColor: growthSorted.map(c => c.growthNum > 50 ? '#8FA68A' : c.growthNum > 0 ? '#C5A55A' : '#C4868B'),
+        borderWidth: 1, borderRadius: 6, maxBarThickness: 52 }]
+    },
+    options: {
+      indexAxis: 'y', responsive: true, maintainAspectRatio: false,
+      plugins: { legend: { display: false }, tooltip: { callbacks: { label: ctx => (ctx.raw > 0 ? '+' : '') + ctx.raw + '%' } } },
+      scales: { x: { ticks: { callback: v => (v > 0 ? '+' : '') + v + '%' }, grid: { color: chartGridColor } }, y: { grid: { display: false } } },
+      animation: { duration: 1200, easing: 'easeOutQuart' }
+    }
+  });
+}
+
+/* --- 竞品雷达图 --- */
+function initRadarChart() {
+  if (chartInstances.radar || !REPORT_DATA.competitors) return;
+  const comps = REPORT_DATA.competitors;
+  const radarLabels = ['品牌知名度','社媒粉丝','内容质量','产品线宽度','价格竞争力'];
+  const colors = ['#C5A55A','#8FA68A','#C4868B','#7E9BB5','#D4B978'];
+  const bgColors = ['rgba(197,165,90,0.15)','rgba(143,166,138,0.12)','rgba(196,134,139,0.1)','rgba(126,155,181,0.1)','rgba(212,185,120,0.1)'];
+  chartInstances.radar = new Chart(document.getElementById('chart-radar'), {
+    type: 'radar',
+    data: {
+      labels: radarLabels,
+      datasets: comps.map((c,i) => ({
+        label: c.name, data: c.radarData || [50,50,50,50,50],
+        borderColor: colors[i%colors.length], backgroundColor: bgColors[i%bgColors.length],
+        pointBackgroundColor: colors[i%colors.length], borderWidth: 2
+      }))
+    },
+    options: {
+      responsive: true, maintainAspectRatio: false,
+      scales: { r: { min: 0, max: 100, ticks: { stepSize: 25, display: false }, grid: { color: chartGridColor }, pointLabels: { font: { size: 11 } }, angleLines: { color: chartGridColor } } },
+      plugins: { legend: { position: 'bottom', labels: { boxWidth: 12, padding: 14, font: { size: 11 } } } },
+      animation: { duration: 1200 }
+    }
+  });
+}
+
+/* --- 使用场景饼图 --- */
+function initScenesChart() {
+  if (chartInstances.scenes || !REPORT_DATA.vocAnalysis) return;
+  const scenes = REPORT_DATA.vocAnalysis.scenes;
+  chartInstances.scenes = new Chart(document.getElementById('chart-scenes'), {
+    type: 'doughnut',
+    data: {
+      labels: scenes.map(s => s.name + ' ' + s.pct + '%'),
+      datasets: [{ data: scenes.map(s => s.pct), backgroundColor: PALETTE.slice(0, scenes.length), borderColor: 'rgba(26,17,11,0.6)', borderWidth: 2 }]
+    },
+    options: {
+      responsive: true, maintainAspectRatio: false, cutout: '55%',
+      plugins: { legend: { position: 'right', labels: { boxWidth: 10, padding: 8, font: { size: 10 } } } },
+      animation: { duration: 1200 }
+    }
+  });
+}
+
+/* --- TikTok热度图表 --- */
+function initTiktokChart() {
+  if (chartInstances.tiktok || !REPORT_DATA.tiktokHeat) return;
+  const tt = REPORT_DATA.tiktokHeat;
+  chartInstances.tiktok = new Chart(document.getElementById('chart-tiktok'), {
+    type: 'bar',
+    data: {
+      labels: tt.map(t => t.name),
+      datasets: [{ label: '播放量', data: tt.map(t => t.plays),
+        backgroundColor: PALETTE.slice(0, tt.length), borderColor: PALETTE_BORDER.slice(0, tt.length),
+        borderWidth: 1, borderRadius: 6, maxBarThickness: 48 }]
+    },
+    options: {
+      responsive: true, maintainAspectRatio: false,
+      plugins: { legend: { display: false }, tooltip: { callbacks: { label: ctx => (ctx.raw / 1e6).toFixed(1) + 'M 播放' } } },
+      scales: { y: { ticks: { callback: v => (v/1e6).toFixed(0) + 'M' }, grid: { color: chartGridColor } }, x: { grid: { display: false } } },
+      animation: { duration: 1200, easing: 'easeOutQuart' }
+    }
+  });
+}
+
+/* ============================================================
+   数据驱动 DOM 渲染
+   ============================================================ */
+function renderReport() {
+  const D = REPORT_DATA;
+  if (!D || !D.categories) { console.warn('REPORT_DATA 未注入'); return; }
+
+  // --- Slide 2: 执行摘要 ---
+  if (D.metrics) {
+    document.getElementById('exec-metrics').innerHTML = D.metrics.map(m =>
+      `<div class="glass-card metric-card"><div class="metric-value" data-count="${m.value}" data-prefix="${m.prefix||''}" data-suffix="${m.suffix||''}">${m.prefix||''}0${m.suffix||''}</div><div class="metric-label">${m.label}</div><div class="metric-sub">${m.sub}</div></div>`
+    ).join('');
+  }
+  if (D.coreFindings) {
+    document.getElementById('core-findings').innerHTML = D.coreFindings.map(f =>
+      `<li style="margin-bottom:8px">• <strong class="${f.highlightClass||'text-gold'}">${f.highlight||''}</strong> ${f.text}</li>`
+    ).join('');
+  }
+  if (D.coreValues) {
+    document.getElementById('core-values').innerHTML = D.coreValues.map(v =>
+      `<li style="margin-bottom:8px">• ${v}</li>`
+    ).join('');
+  }
+
+  // --- Slide 3: 市场全景表格 ---
+  if (D.categories) {
+    document.getElementById('market-table-body').innerHTML = D.categories.map(c => {
+      const growthClass = c.growthNum > 30 ? 'text-sage fw-700' : c.growthNum > 0 ? 'text-sage' : 'text-rose';
+      const chinaClass = c.chinaRatioNum > 70 ? 'text-rose fw-600' : '';
+      return `<tr><td class="fw-600 ${c.highlight?'text-gold':''}">${c.name}${c.highlight?' ⭐':''}</td><td>${c.weeklySales}</td><td>${c.weeklyRevenue}</td><td>${c.avgPrice}</td><td>${c.brands}</td><td class="${growthClass}">${c.growth}</td><td class="${chinaClass}">${c.chinaRatio}</td></tr>`;
+    }).join('');
+  }
+
+  // --- Slide 4: 竞品卡片 ---
+  if (D.competitors) {
+    document.getElementById('competitor-cards').innerHTML = D.competitors.map(c => `
+      <div class="glass-card competitor-card">
+        <span class="badge ${c.positionBadge||'badge-gold'} mb-sm" style="display:inline-block">${c.positioning}</span>
+        <h3>${c.name}</h3>
+        <p class="text-xs text-dim mb-sm">${c.priceRange||''}</p>
+        <div class="comp-stat"><span>Instagram</span><span class="fw-700 text-gold">${c.igFollowers||'—'}</span></div>
+        <div class="comp-stat"><span>TikTok</span><span class="fw-600">${c.tiktokFollowers||'—'}</span></div>
+        <div class="comp-stat"><span>Amazon SKU</span><span>${c.skuNote||'—'}</span></div>
+        <div class="comp-stat"><span>策略</span><span class="text-xs">${c.strategyNote||'—'}</span></div>
+        <p class="text-xs mt-sm text-dim">${c.pros||''}<br>${c.cons||''}</p>
+      </div>
+    `).join('');
+  }
+
+  // --- Slide 5: VOC ---
+  if (D.vocAnalysis) {
+    const voc = D.vocAnalysis;
+    document.getElementById('voc-review-count').textContent = voc.totalReviews + '条';
+    document.getElementById('pain-points-container').innerHTML = voc.painPoints.map(p =>
+      `<div class="pain-bar"><div class="pain-icon">${p.icon}</div><div class="pain-info"><div class="pain-name">${p.name} <span class="badge badge-rose">${p.pct}%</span></div><div class="pain-track"><div class="pain-fill" style="width:0%" data-target="${p.pct}" data-bg="${p.gradient}"></div></div>${p.quote?`<div class="pain-pct">"${p.quote}"</div>`:''}</div></div>`
+    ).join('');
+    document.getElementById('highlights-container').innerHTML = voc.highlights.map(h =>
+      `<div class="bar-row"><span class="bar-label">${h.name}</span><div class="bar-track"><div class="bar-fill" style="width:0%;background:${h.color}" data-target="${h.pct}" data-value="${h.pct}%"></div></div></div>`
+    ).join('');
+  }
+
+  // --- Slide 6: 品类矩阵 ---
+  if (D.categoryMatrix) {
+    document.getElementById('matrix-table-body').innerHTML = D.categoryMatrix.map(c =>
+      `<tr><td class="fw-600 ${c.highlight?'text-gold':''}">${c.name}</td><td>${c.marketSize}</td><td>${c.growth}</td><td>${c.socialHeat}</td><td>${c.competition}</td><td>${c.chinaRatio}</td><td><span class="badge ${c.badgeClass||'badge-gold'}">${c.recommendation}</span></td></tr>`
+    ).join('');
+  }
+  if (D.seasonalNotes) {
+    document.getElementById('seasonality-notes').innerHTML = D.seasonalNotes.map(s =>
+      `<div style="display:flex;align-items:center;gap:8px;margin-bottom:10px"><span style="font-size:1.4rem">${s.icon}</span><div><strong class="text-gold">${s.title}</strong><br>${s.desc}</div></div>`
+    ).join('');
+  }
+
+  // --- Slide 7: 执行策略 ---
+  if (D.strategy) {
+    const phases = [
+      { key: 'shortTerm', label: '短期 1-3个月', badge: 'badge-sage' },
+      { key: 'midTerm', label: '中期 3-6个月', badge: 'badge-gold' },
+      { key: 'longTerm', label: '长期 6-12个月', badge: 'badge-blue' }
+    ];
+    document.getElementById('strategy-columns').innerHTML = phases.map(p => `
+      <div class="glass-card">
+        <span class="badge ${p.badge} mb-sm" style="display:inline-block">${p.label}</span>
+        <div class="timeline mt-sm">
+          ${(D.strategy[p.key]||[]).map(item => `<div class="timeline-item"><h4>${item.title}</h4><p>${item.desc}</p></div>`).join('')}
+        </div>
+      </div>
+    `).join('');
+  }
+  if (D.vocPriorities) {
+    document.getElementById('voc-priorities').innerHTML = D.vocPriorities.map(p =>
+      `<span class="badge ${p.badgeClass||'badge-rose'}">${p.text}</span>`
+    ).join('');
+  }
+
+  // --- Slide 8: 总结 ---
+  if (D.conclusion) {
+    const con = D.conclusion;
+    document.getElementById('conclusion-top-cards').innerHTML = `
+      <div class="glass-card" style="text-align:center;padding:32px 24px"><div style="font-size:2.4rem;margin-bottom:8px">${con.topCategory.emoji}</div><h3 class="text-gold mb-sm">${con.topCategory.title}</h3><p class="text-sm"><strong>${con.topCategory.name}</strong></p><p class="text-xs text-dim mt-sm">${con.topCategory.desc}</p></div>
+      <div class="glass-card" style="text-align:center;padding:32px 24px"><div style="font-size:2.4rem;margin-bottom:8px">${con.socialDividend.emoji}</div><h3 class="text-gold mb-sm">${con.socialDividend.title}</h3><p class="text-sm"><strong>${con.socialDividend.name}</strong></p><p class="text-xs text-dim mt-sm">${con.socialDividend.desc}</p></div>`;
+    document.getElementById('conclusion-differentiator').innerHTML =
+      `<h3 class="text-gold mb-sm">${con.differentiator.title}</h3><p style="font-size:1.15rem;font-weight:600;color:var(--cream)">${con.differentiator.subtitle}</p><p class="text-sm text-dim mt-sm">${con.differentiator.desc}</p>`;
+    document.getElementById('conclusion-actions').innerHTML =
+      `<h3 class="text-sm fw-600 mb-sm" style="text-align:center">✅ 三大关键行动</h3><div style="display:grid;grid-template-columns:repeat(3,1fr);gap:16px;text-align:center;font-size:.85rem">${con.keyActions.map(a => `<div><div style="font-size:1.6rem;margin-bottom:4px">${a.emoji}</div><strong>${a.title}</strong><br><span class="text-xs text-dim">${a.desc}</span></div>`).join('')}</div>`;
+  }
+}
+
+/* ============================================================
+   封面粒子效果
+   ============================================================ */
+function initParticles() {
+  const canvas = document.getElementById('particles-canvas');
+  if (!canvas) return;
+  const ctx = canvas.getContext('2d');
+  let w, h, particles = [];
+  function resize() { w = canvas.width = window.innerWidth; h = canvas.height = window.innerHeight; }
+  resize();
+  window.addEventListener('resize', resize);
+  for (let i = 0; i < 60; i++) {
+    particles.push({
+      x: Math.random() * w, y: Math.random() * h,
+      r: Math.random() * 2 + 0.5,
+      dx: (Math.random() - 0.5) * 0.3, dy: (Math.random() - 0.5) * 0.2,
+      alpha: Math.random() * 0.4 + 0.1,
+      color: Math.random() > 0.5 ? '197,165,90' : '212,185,120'
+    });
+  }
+  function draw() {
+    ctx.clearRect(0, 0, w, h);
+    const grd = ctx.createRadialGradient(w*.5, h*.4, 0, w*.5, h*.4, w*.6);
+    grd.addColorStop(0, 'rgba(92,61,46,0.12)');
+    grd.addColorStop(0.5, 'rgba(45,24,16,0.06)');
+    grd.addColorStop(1, 'transparent');
+    ctx.fillStyle = grd; ctx.fillRect(0, 0, w, h);
+    particles.forEach(p => {
+      ctx.beginPath(); ctx.arc(p.x, p.y, p.r, 0, Math.PI*2);
+      ctx.fillStyle = `rgba(${p.color},${p.alpha})`; ctx.fill();
+      p.x += p.dx; p.y += p.dy;
+      if (p.x<0||p.x>w) p.dx *= -1;
+      if (p.y<0||p.y>h) p.dy *= -1;
+      p.alpha += (Math.random()-.5)*.01;
+      p.alpha = Math.max(.05, Math.min(.5, p.alpha));
+    });
+    for (let i=0; i<particles.length; i++) {
+      for (let j=i+1; j<particles.length; j++) {
+        const dx=particles[i].x-particles[j].x, dy=particles[i].y-particles[j].y;
+        const dist = Math.sqrt(dx*dx+dy*dy);
+        if (dist<150) { ctx.beginPath(); ctx.moveTo(particles[i].x,particles[i].y); ctx.lineTo(particles[j].x,particles[j].y); ctx.strokeStyle=`rgba(197,165,90,${.06*(1-dist/150)})`; ctx.lineWidth=.5; ctx.stroke(); }
+      }
+    }
+    requestAnimationFrame(draw);
+  }
+  draw();
+}
+
+/* ============================================================
+   Modal 弹窗系统
+   ============================================================ */
+const modalOverlay = document.getElementById('modal-overlay');
+const modalHeader  = document.getElementById('modal-header');
+const modalBody    = document.getElementById('modal-body');
+function openModal(headerHTML, bodyHTML) {
+  modalHeader.innerHTML = headerHTML;
+  modalBody.innerHTML = bodyHTML;
+  modalOverlay.style.display = 'flex';
+  requestAnimationFrame(() => modalOverlay.classList.add('show'));
+}
+function closeModal() {
+  modalOverlay.classList.remove('show');
+  setTimeout(() => { modalOverlay.style.display = 'none'; }, 350);
+}
+document.getElementById('modal-close').addEventListener('click', closeModal);
+modalOverlay.addEventListener('click', e => { if(e.target===modalOverlay) closeModal(); });
+document.addEventListener('keydown', e => { if(e.key==='Escape' && modalOverlay.classList.contains('show')) closeModal(); });
+
+/* ===== 初始化 ===== */
+renderReport();
+initParticles();
+triggerSlideAnimations(0);
+</script>
+</body>
+</html>