2026-07-04 记录
触发问题:https://book.rrbrr.com/#/pages/book-generator/detail?id=43显示"生成中"实际无任何进度,3 天未推进。
POST /interactive/outline),但前端没引导也没暴露"开始生成内容"按钮,导致 POST /interactive/generate 从未被调用,book 永远停在 genStage='outline_ready'(不在前端合法枚举里)content_completed,但 BookChapter 仍是 outline_completed,computeBookGenStage 推断前端还是"大纲阶段"nodes/rich-outline.node.ts — rich_outline 100% 兜底catch 块包内层 try-catch,跑三级 fallback:
[RichOutline] 富信息大纲生成失败 → 进入 100% 成功兜底
├─ fallback 1: 复用已有 outlineJson(之前生成过、没丢就用)
├─ fallback 2: 调 generateOutline 简版 LLM(prompt 小、稳)
└─ fallback 3: buildSkeletonOutline() 本地骨架大纲(0 LLM 调用,100% 必成功)
│
└─ 无论如何:outlineJson + 章节记录必落库
强压力测试通过:mock 让所有 LLM 调用必失败 10 次,rich_outline 仍能兜底成功(outlineJson 长度 3791 字节,10 章骨架正常入库)。
book-recovery-scanner.ts — book 级别自愈扫描器outline_ready 超 30min 未动content_generating 超 60min 无章节推进fillMissingChapters,3 worker pool)failed,不出现永远卡住的状态audio-scanner.ts — 章节级状态不一致修复新增 step 3c:每 30s 扫所有 genStage=outline_completed 但 content/audioUrl 实际已就绪的章节,自动推进到正确状态。
langgraph-controller.ts — fill-missing 接口POST /api/book-generator/langgraph/books/:id/fill-missing
前端按钮可手动触发;book-recovery-scanner 也用同一函数。找不到缺失章节返回 missingCount=0。
detail.vue — 前端兜底BookGenStage 枚举补 outline_generating / outline_ready / outline_failed / generating_contentoutline_ready 状态显示橙色 "📋 大纲已生成" + 🚀 按钮调 /interactive/generatestalledTip 块加 "⚡ 补全缺失章节" 按钮hasMissingChapters)就显示蓝色 "🩹 检测到 N 个章节未生成内容" + 调 /fill-missingoutlineReadyPolling 30s 降频轮询,检测到后端自愈推进自动切回正常轮询poll.ts — 测试超时放宽180s → 300s(生产 LangGraph 跑 1000 字实测 3 分 48 秒 + 1 分钟余量)。
| 场景 | 实测 |
|---|---|
| book 43 真实状态 | audio_completed + 100% + 72/25 章 + 0 缺失 |
| fill-missing 接口 | {"code":0,"message":"书籍已完整","missingCount":0} |
| rich_outline 强压力测试 | LLM mock 必失败 → 兜底3 成功,outlineJson 必落库 |
| 新建书 1000 字 LangGraph 全链路 | 3 分 48 秒从创建到 content_completed + 100% |
# 1. 登录拿 token
curl -X POST https://bookapi.rrbrr.com/api/auth/login \
-H "Content-Type: application/json" \
-d '{"phone":"13xxx","code":"123456"}'
# 2. 创建书触发 fast-path
curl -X POST https://bookapi.rrbrr.com/api/book-generator/langgraph/books \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"title":"测试","description":"...","bookScale":"1000","autoGenerateContent":true,"autoGenerateAudio":true}'
# 3. 手动补全缺失章节(任何时候)
curl -X POST https://bookapi.rrbrr.com/api/book-generator/langgraph/books/<id>/fill-missing \
-H "Authorization: Bearer <token>"
genStage 枚举要包含 outline_ready 等 intermediate 值,否则用户看到的永远是"中间状态"。computeBookGenStage 用 chapter 推断时,要确保 BookChapter 状态被同步推进;否则写一个 audio-scanner 兜底修复。