| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- "use strict";
- /**
- * 书籍生成工作流引擎
- * 参考 LangGraph 思路:状态机 + 条件边 + 节点执行
- */
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.workflowEngine = void 0;
- const book_generator_service_1 = require("./book-generator.service");
- // ============ 工作流引擎 ============
- class BookWorkflowEngine {
- workflows = new Map();
- /**
- * 启动工作流
- */
- startWorkflow(bookId, totalChapters) {
- const state = {
- bookId,
- currentNode: 'idle',
- currentChapter: 0,
- totalChapters,
- completedChapters: 0,
- pendingChapters: Array.from({ length: totalChapters }, (_, i) => i + 1),
- failedChapters: [],
- phase: 'planning',
- startedAt: new Date(),
- updatedAt: new Date(),
- };
- this.workflows.set(bookId, state);
- return state;
- }
- /**
- * 获取工作流状态
- */
- getState(bookId) {
- return this.workflows.get(bookId);
- }
- /**
- * 更新工作流状态
- */
- updateState(bookId, updates) {
- const state = this.workflows.get(bookId);
- if (!state)
- return undefined;
- Object.assign(state, updates, { updatedAt: new Date() });
- return state;
- }
- /**
- * 执行规划阶段
- */
- async executePlanningPhase(bookId) {
- const state = this.workflows.get(bookId);
- if (!state)
- return { success: false, error: '工作流不存在' };
- this.updateState(bookId, { currentNode: 'planning', phase: 'planning' });
- try {
- const outline = await book_generator_service_1.bookGeneratorService.generateOutline(bookId);
- // 更新工作流状态
- this.updateState(bookId, {
- currentNode: 'idle',
- phase: 'writing',
- pendingChapters: outline.chapters.map(c => c.number),
- });
- return { success: true, outline };
- }
- catch (error) {
- const errorMessage = error instanceof Error ? error.message : '规划失败';
- this.updateState(bookId, { currentNode: 'failed', error: errorMessage });
- return { success: false, error: errorMessage };
- }
- }
- /**
- * 执行章节生成 - 单步
- * 返回下一步应该执行什么
- */
- async executeNextChapter(bookId) {
- const state = this.workflows.get(bookId);
- if (!state)
- return { done: false, error: '工作流不存在' };
- if (state.pendingChapters.length === 0) {
- return { done: true };
- }
- // 取下一个待生成的章节
- const nextChapterNum = state.pendingChapters[0];
- this.updateState(bookId, {
- currentNode: 'writing_chapter',
- currentChapter: nextChapterNum,
- });
- try {
- const chapter = await book_generator_service_1.bookGeneratorService.generateChapter(bookId, nextChapterNum);
- // 更新工作流状态
- const newPending = state.pendingChapters.filter(n => n !== nextChapterNum);
- this.updateState(bookId, {
- currentNode: 'idle',
- completedChapters: state.completedChapters + 1,
- pendingChapters: newPending,
- });
- if (newPending.length === 0) {
- // 全部章节完成
- this.updateState(bookId, { phase: 'supplement' });
- return { done: true, chapter };
- }
- return { done: false, chapter, nextChapter: newPending[0] };
- }
- catch (error) {
- const errorMessage = error instanceof Error ? error.message : '生成失败';
- // 标记本章失败,继续下一章
- const newPending = state.pendingChapters.filter(n => n !== nextChapterNum);
- const newFailed = [...state.failedChapters, nextChapterNum];
- this.updateState(bookId, {
- currentNode: 'idle',
- pendingChapters: newPending,
- failedChapters: newFailed,
- });
- if (newPending.length === 0) {
- return { done: true, error: `第${nextChapterNum}章失败` };
- }
- return { done: false, error: `第${nextChapterNum}章失败: ${errorMessage}` };
- }
- }
- /**
- * 执行全部章节生成(自动循环)
- */
- async executeAllChapters(bookId, onProgress) {
- const state = this.workflows.get(bookId);
- if (!state)
- return { success: false, completedCount: 0, failedCount: 0, errors: ['工作流不存在'] };
- const errors = [];
- while (true) {
- const currentState = this.workflows.get(bookId);
- if (!currentState || currentState.pendingChapters.length === 0) {
- break;
- }
- const nextChapter = currentState.pendingChapters[0];
- if (onProgress) {
- const progress = Math.round((currentState.completedChapters / currentState.totalChapters) * 100);
- onProgress(progress, nextChapter);
- }
- try {
- await book_generator_service_1.bookGeneratorService.generateChapter(bookId, nextChapter);
- const updated = this.workflows.get(bookId);
- if (updated) {
- this.updateState(bookId, {
- completedChapters: updated.completedChapters + 1,
- pendingChapters: updated.pendingChapters.filter(n => n !== nextChapter),
- });
- }
- }
- catch (error) {
- const errorMessage = error instanceof Error ? error.message : '生成失败';
- errors.push(`第${nextChapter}章: ${errorMessage}`);
- const updated = this.workflows.get(bookId);
- if (updated) {
- this.updateState(bookId, {
- pendingChapters: updated.pendingChapters.filter(n => n !== nextChapter),
- failedChapters: [...updated.failedChapters, nextChapter],
- });
- }
- }
- }
- this.updateState(bookId, { phase: 'supplement' });
- const finalState = this.workflows.get(bookId);
- return {
- success: errors.length === 0,
- completedCount: finalState?.completedChapters || 0,
- failedCount: finalState?.failedChapters?.length || 0,
- errors,
- };
- }
- /**
- * 生成前言
- */
- async executeForeword(bookId) {
- this.updateState(bookId, { currentNode: 'writing_foreword' });
- try {
- const foreword = await book_generator_service_1.bookGeneratorService.generateForeword(bookId);
- this.updateState(bookId, { currentNode: 'idle' });
- return { success: true, foreword };
- }
- catch (error) {
- const errorMessage = error instanceof Error ? error.message : '生成前言失败';
- return { success: false, error: errorMessage };
- }
- }
- /**
- * 生成后记
- */
- async executeAfterword(bookId) {
- this.updateState(bookId, { currentNode: 'writing_afterword' });
- try {
- const afterword = await book_generator_service_1.bookGeneratorService.generateAfterword(bookId);
- this.updateState(bookId, { currentNode: 'idle' });
- return { success: true, afterword };
- }
- catch (error) {
- const errorMessage = error instanceof Error ? error.message : '生成后记失败';
- return { success: false, error: errorMessage };
- }
- }
- /**
- * 完成工作流
- */
- finishWorkflow(bookId) {
- const state = this.workflows.get(bookId);
- if (!state)
- return undefined;
- this.updateState(bookId, { currentNode: 'finished', phase: 'done' });
- return this.workflows.get(bookId);
- }
- /**
- * 获取工作流进度
- */
- getProgress(bookId) {
- const state = this.workflows.get(bookId);
- if (!state)
- return null;
- return {
- phase: state.phase,
- currentNode: state.currentNode,
- currentChapter: state.currentChapter,
- completedChapters: state.completedChapters,
- totalChapters: state.totalChapters,
- pendingChapters: state.pendingChapters,
- failedChapters: state.failedChapters,
- progress: Math.round((state.completedChapters / state.totalChapters) * 100),
- };
- }
- /**
- * 取消工作流
- */
- cancelWorkflow(bookId) {
- return this.workflows.delete(bookId);
- }
- }
- // 导出单例
- exports.workflowEngine = new BookWorkflowEngine();
|