# Pipeline 并行化 Plan ## 当前问题 ``` hermes chat (单进程,300s timeout) ├─ 查询微信消息 → 发现 N 篇文章 ├─ check-summaries → 发现 M 篇未缓存 ├─ 对第 1 篇: curl POST /summarize → 等 60s ├─ 对第 2 篇: curl POST /summarize → 等 60s ├─ ... (串行!) ├─ 对第 M 篇: curl POST /summarize → 等 60s └─ 编撰日报 ``` **瓶颈**: M 篇未缓存文章 → 串行等待 M×60s → 超过 300s timeout → 部分文章丢失或超时 ## 改进方案:两阶段流水线 ``` Phase 1: 并行摘要 (Flask 编排) hermes chat (collector) └─ 查询消息 → 返回文章列表 ↓ Flask: 对每篇未缓存文章并行 POST /summarize ├─ hermes job: 文章 1 摘要 ─┐ ├─ hermes job: 文章 2 摘要 ─┤ 并行! └─ hermes job: 文章 M 摘要 ─┘ ↓ 所有完成 Phase 2: 日报编撰 (单个 hermes) hermes chat (compiler) └─ 读取所有缓存摘要 → 编撰日报 ``` **改进点**: - M 篇文章摘要并行执行,总耗时 ≈ max(单篇耗时) 而非 sum - Phase 1 collector 不需要处理摘要,只收集 URL → 快速完成 - Phase 2 compiler 只读缓存 → 不需要网络抓取 → 快速完成 - 每阶段独立追踪(任务监控可见) ## 实现步骤 ### Step 1: app.py 新增 /api/reports/generate-v2 - 接收 chatroom_id + date - Phase 1a: spawn collector job → 返回文章列表 - Phase 1b: 并行 spawn summarize jobs - Phase 1c: 轮询等待全部完成 - Phase 2: spawn compiler job → 生成日报 ### Step 2: 前端 reports.html 使用新 API - "生成日报"按钮改为调用 generate-v2 - 显示流水线进度(X/Y 篇文章摘要完成) ### Step 3: 任务监控可见 - 每个子任务独立显示在 /jobs - 可看到 collector / summarizer×N / compiler 的完整链路 ## 涉及文件 - app.py: 新增 /api/reports/generate-v2 + 并行编排逻辑 - wechat-group-digest skill: 拆分为 collector / compiler 两个子 prompt - templates/reports.html: 进度展示 - test_jobs_integration.py: 新增流水线测试 ## 风险 - 并行摘要受限于 hermes 并发数(同一用户可同时跑多个 hermes chat?) - Phase 1c 轮询需要非阻塞实现(用 threading + sleep poll)