Browse Source

refactor: 创建主入口文件 - index.ts组装所有模块

MyFramework User 4 months ago
parent
commit
6e9801a0ae
1 changed files with 73 additions and 8 deletions
  1. 73 8
      server/src/modules/book-generator/index.ts

+ 73 - 8
server/src/modules/book-generator/index.ts

@@ -1,11 +1,76 @@
 /**
 /**
- * 书籍生成模块 - 入口文件
- * 只保留 LangGraph 功能
+ * LangGraph 书籍生成器 - 主入口
+ * 使用 @langchain/langgraph v1.2.8 API
+ * 状态通过数据库传递,LangGraph 只负责流程控制
+ * 支持生成过程中额度监控和中断保存
  */
  */
 
 
-export * from './book-generator.types';
-export * from './langgraph-types';
-export { langGraphGenerator } from './langgraph-generator';
-export { default as langGraphRouter } from './langgraph-controller';
-export { default as aiGenerateRouter } from './ai-generate-controller';
-export { default as albumRouter } from './album-controller';
+import { GraphState } from './graph';
+import { StateGraph, END } from '@langchain/langgraph';
+import { generateOutlineNode } from './nodes/outline.node';
+import { generateSectionsNode, generateSubsectionsNode } from './nodes/sections.node';
+import { writeChaptersNode } from './nodes/content.node';
+import { writeForewordNode, writeAfterwordNode } from './nodes/foreword.node';
+import { bookStore } from './book-generator.store';
+
+// ============ 创建工作流 ============
+
+function createGraph() {
+  const workflow = new StateGraph(GraphState)
+    .addNode('generate_outline', generateOutlineNode)
+    .addNode('generate_sections', generateSectionsNode)
+    .addNode('generate_subsections', generateSubsectionsNode)
+    .addNode('write_chapters', writeChaptersNode)
+    .addNode('write_foreword', writeForewordNode)
+    .addNode('write_afterword', writeAfterwordNode)
+    .setEntryPoint('generate_outline')
+    // 流程:章大纲 → 节大纲 → 小节大纲 → 内容生成 → 前言 → 后记
+    .addEdge('generate_outline', 'generate_sections')
+    .addEdge('generate_sections', 'generate_subsections')
+    .addEdge('generate_subsections', 'write_chapters')
+    .addEdge('write_chapters', 'write_foreword')
+    .addEdge('write_foreword', 'write_afterword')
+    .addEdge('write_afterword', END);
+
+  return workflow.compile();
+}
+
+// ============ 主类 ============
+
+export class LangGraphBookGenerator {
+  private graph = createGraph();
+
+  async generate(bookId: string, topic: string, bookScale: string = '标准教程'): Promise<void> {
+    const initialState = { 
+      bookId, 
+      topic, 
+      bookScale, 
+      currentChapter: 0, 
+      finished: false, 
+      error: undefined, 
+      progress: 0 
+    };
+    await bookStore.update(bookId, { status: 'generating', progress: 0 });
+
+    try {
+      const stream = await this.graph.stream(initialState);
+      for await (const step of stream) {
+        console.log('[LangGraph] Step:', Object.keys(step));
+      }
+      await bookStore.update(bookId, { status: 'completed', progress: 100 });
+      await bookStore.publishAlbum(bookId);
+      console.log('[LangGraph] 书籍生成完成');
+    } catch (error) {
+      console.error('[LangGraph] 生成失败:', error);
+      await bookStore.update(bookId, { 
+        status: 'failed', 
+        errorMsg: error instanceof Error ? error.message : '生成失败' 
+      });
+    }
+  }
+}
+
+export const langGraphGenerator = new LangGraphBookGenerator();
+
+// 重新导出 book-type-config 中的函数供外部使用
+export { getScaleConfig } from './book-type-config';