pipeline-runner.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. * Top-level pipeline orchestration.
  3. * Creates sessions and runs the full generation pipeline.
  4. */
  5. import { nanoid } from 'nanoid';
  6. import type { UserRequirements, GenerationSession } from '@/lib/types/generation';
  7. import type { StageStore } from '@/lib/api/stage-api';
  8. import { generateSceneOutlinesFromRequirements } from './outline-generator';
  9. import { generateFullScenes } from './scene-generator';
  10. import type { AICallFn, GenerationResult, GenerationCallbacks } from './pipeline-types';
  11. export function createGenerationSession(requirements: UserRequirements): GenerationSession {
  12. return {
  13. id: nanoid(),
  14. requirements,
  15. progress: {
  16. currentStage: 1,
  17. overallProgress: 0,
  18. stageProgress: 0,
  19. statusMessage: '初始化中...',
  20. scenesGenerated: 0,
  21. totalScenes: 0,
  22. },
  23. startedAt: new Date(),
  24. };
  25. }
  26. // For full testing
  27. export async function runGenerationPipeline(
  28. session: GenerationSession,
  29. store: StageStore,
  30. aiCall: AICallFn,
  31. callbacks?: GenerationCallbacks,
  32. ): Promise<GenerationResult<GenerationSession>> {
  33. try {
  34. // Stage 1: Generate Scene Outlines from Requirements
  35. callbacks?.onProgress?.({
  36. ...session.progress,
  37. currentStage: 1,
  38. overallProgress: 5,
  39. statusMessage: '正在分析需求,生成场景大纲...',
  40. });
  41. const outlinesResult = await generateSceneOutlinesFromRequirements(
  42. session.requirements,
  43. undefined, // No PDF text in this flow
  44. undefined, // No PDF images in this flow
  45. aiCall,
  46. callbacks,
  47. );
  48. if (!outlinesResult.success || !outlinesResult.data) {
  49. throw new Error(outlinesResult.error || 'Failed to generate scene outlines');
  50. }
  51. session.sceneOutlines = outlinesResult.data;
  52. callbacks?.onStageComplete?.(1, session.sceneOutlines);
  53. // Stage 2: Generate Full Scenes
  54. callbacks?.onProgress?.({
  55. ...session.progress,
  56. currentStage: 2,
  57. overallProgress: 50,
  58. statusMessage: '正在生成场景内容...',
  59. totalScenes: session.sceneOutlines.length,
  60. });
  61. const scenesResult = await generateFullScenes(session.sceneOutlines, store, aiCall, callbacks);
  62. if (!scenesResult.success) {
  63. throw new Error(scenesResult.error || 'Failed to generate scenes');
  64. }
  65. callbacks?.onStageComplete?.(2, scenesResult.data);
  66. // Complete
  67. session.completedAt = new Date();
  68. session.progress = {
  69. currentStage: 2,
  70. overallProgress: 100,
  71. stageProgress: 100,
  72. statusMessage: '生成完成!',
  73. scenesGenerated: scenesResult.data?.length || 0,
  74. totalScenes: session.sceneOutlines.length,
  75. };
  76. return { success: true, data: session };
  77. } catch (error) {
  78. const errorMessage = error instanceof Error ? error.message : String(error);
  79. callbacks?.onError?.(errorMessage);
  80. session.progress.errors = [...(session.progress.errors || []), errorMessage];
  81. return { success: false, error: errorMessage };
  82. }
  83. }