# All files / modules/book-generator/strategies deep-plan-parallel.strategy.ts

0% Statements 0/59
0% Branches 0/1
0% Functions 0/1
0% Lines 0/59

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105

     /**
     * 策略4 - DeepPlan + RichOutline + ParallelContent + QualityCheck + Rewrite + ContinuityEdit（推荐策略）
     *
     * 工作流：
     *   deep_plan → rich_outline → parallel_content → quality_check
     *                                                      ↓
     *                                          ┌── 通过 ──→ continuity_edit → END
     *                                          ↓ 不通过
     *                                        rewrite → quality_check (循环，最多3次)
     *
     * 特点：
     *   1. DeepPlan: AI深度分析书籍需求，规划goldenThread/narrativeArc/toneProfile/audienceCalibration
     *   2. RichOutline: 生成带writingInstructions的富信息大纲（每节点含opening/structure/mustCover等）
     *   3. ParallelContent: 并发8路生成所有叶节点内容
     *   4. QualityCheck: 四维质量校验（通顺/逻辑/跑题/达标）【新增】
     *   5. Rewrite: 不合格章节自动改写优化，形成质量闭环【新增】
     *   6. ContinuityEdit: 全局连贯性编辑，检查过渡/重复/术语/风格一致性
     *
     * 修复的问题：
     *   - issue #2: 内容生成纯串行 → 并发生成
     *   - issue #3: 基于正则的需求分析 → AI深度规划
     *   - issue #4: 暴力截断 → 智能段落边界截断
     *   - issue #5: 思考文本清理不彻底 → 多模式清洗
     *   - issue #6: 大纲空壳未填充 → writingInstructions引导
     *   - issue #7: 章节创建竞态 → upsert去重
     *   - issue #10: 无大纲质量评估 → 内置评分
     *   - issue #11: 正文无质量校验 → 四维评估 + 自动改写闭环【本次新增】
     */

    import { StateGraph, END } from '@langchain/langgraph';
    import { GraphState } from '../graph';
    import { deepPlanBookNode } from '../nodes/deep-plan.node';
    import { richOutlineNode } from '../nodes/rich-outline.node';
    import { writeChaptersParallelNode } from '../nodes/content.node';
    import { qualityCheckNode } from '../nodes/quality-check.node';
    import { rewriteNode } from '../nodes/rewrite.node';
    import { continuityEditNode } from '../nodes/continuity-edit.node';
    import { runGraphWorkflow } from './base';
    import { GenerationStrategy } from './types';

    export class DeepPlanParallelStrategy implements GenerationStrategy {
      readonly name = 'deep-plan-parallel' as const;
      readonly description = 'DeepPlan+RichOutline+Concurrent+QualityCheck+Rewrite+Edit（推荐）：完整质量闭环';

      async generate(
        bookId: string,
        topic: string,
        bookScale: string,
        genLevel: number,
        userSpecifiedGenLevel?: number
      ): Promise<void> {
        console.log(`[Strategy-deep-plan-parallel] 开始, bookId=${bookId}, scale=${bookScale}, genLevel=${genLevel}, userSpecified=${userSpecifiedGenLevel}`);

        const workflow = new StateGraph(GraphState)
          .addNode('deep_plan', deepPlanBookNode)
          .addNode('rich_outline', richOutlineNode)
          .addNode('parallel_content', writeChaptersParallelNode)
          .addNode('quality_check', qualityCheckNode)
          .addNode('rewrite', rewriteNode)
          .addNode('continuity_edit', continuityEditNode)
          .setEntryPoint('deep_plan')
          .addEdge('deep_plan', 'rich_outline')
          .addEdge('rich_outline', 'parallel_content')
          .addEdge('parallel_content', 'quality_check')
          // 条件路由：质量校验通过 → 连续性编辑；不通过 → 改写优化
          .addConditionalEdges('quality_check', (state: typeof GraphState.State) => {
            if (!state.qualityPassed && state.rewriteCount < state.maxRewriteCount) {
              console.log(`[Strategy] 质量校验不通过 → 改写优化 (第${state.rewriteCount + 1}/${state.maxRewriteCount}轮)`);
              return 'rewrite';
            }
            if (!state.qualityPassed) {
              console.log(`[Strategy] 质量校验不通过，已达最大重写次数(${state.maxRewriteCount}) → 跳过改写`);
            }
            console.log('[Strategy] 质量校验通过 → 连贯性编辑');
            return 'continuity_edit';
          })
          // rewrite 完成后回到 quality_check 重新校验
          .addEdge('rewrite', 'quality_check')
          .addEdge('continuity_edit', END);

        const initialState: typeof GraphState.State = {
          bookId,
          topic,
          bookScale,
          genLevel,
          userSpecifiedGenLevel,
          userId: '',
          description: undefined,
          bookPlan: undefined,
          currentChapter: 0,
          completedChapters: [],
          finished: false,
          error: undefined,
          progress: 0,
          failedChapters: [],
          qualityPassed: true,
          rewriteCount: 0,
          maxRewriteCount: 3,
          qualityResult: undefined,
        };

        await runGraphWorkflow(bookId, initialState, workflow);
      }
    }