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);
  }
}