# All files / modules/book-generator/strategies one-step-outline.strategy.ts

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

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

     /**
     * 策略2 - One-Step Outline（一步大纲 + 并行内容）
     *
     * 工作流：
     *   plan_book → generate_full_outline → write_chapters
     *
     * 特点：
     *   一次 AI 调用生成完整的树形大纲（章+节+小节）
     *   然后将 chapter 分组并行写内容
     *   调用量：~1(规划) + 1(大纲) + N(内容) 次 AI
     */

    import { StateGraph, END } from '@langchain/langgraph';
    import { GraphState } from '../graph';
    import { planBookNode } from '../nodes/plan.node';
    import { generateFullOutlineNode } from '../nodes/full-outline.node';
    import { writeChaptersNode } from '../nodes/content.node';
    import { runGraphWorkflow } from './base';
    import { GenerationStrategy } from './types';

    export class OneStepOutlineStrategy implements GenerationStrategy {
      readonly name = 'one-step-outline' as const;
      readonly description = '一步大纲+并行内容：一次AI生成完整树形大纲，然后批量写内容';

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

        const workflow = new StateGraph(GraphState)
          .addNode('plan_book', planBookNode)
          .addNode('generate_full_outline', generateFullOutlineNode)
          .addNode('write_chapters', writeChaptersNode)
          .setEntryPoint('plan_book')
          .addEdge('plan_book', 'generate_full_outline')
          .addEdge('generate_full_outline', 'write_chapters')
          .addEdge('write_chapters', 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);
      }
    }