|
|
@@ -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';
|