import { ConfigurableWorkflowAgent } from './factory'; import { DEFAULT_MULTI_AGENT_WORKFLOW, MultiAgentStageConfig } from '../config'; export class AgentWorkflowManager { /** * 리팩토링된 고성능 에이전트 엔진을 통해 워크플로우를 실행합니다. */ public static async runStrictWorkflow( prompt: string, modelName: string, brainContext: string, signal: AbortSignal, onProgress: (step: string, message: string) => void, workflow: MultiAgentStageConfig[] = DEFAULT_MULTI_AGENT_WORKFLOW ): Promise { const stages = workflow.length > 0 ? workflow : DEFAULT_MULTI_AGENT_WORKFLOW; const stageOutputs: string[] = []; try { for (const [index, stage] of stages.entries()) { if (signal.aborted) throw new Error('AbortError'); const agent = new ConfigurableWorkflowAgent(modelName, stage); const stepName = stage.name || `Stage ${index + 1}`; onProgress(stepName, `Running ${index + 1}/${stages.length}`); const stageInput = this.buildStageInput(stage, prompt, stageOutputs); const result = await agent.execute(stageInput, brainContext, signal); this.validateResult(result, stepName); stageOutputs.push(result); onProgress(stepName, `Completed ${index + 1}/${stages.length}`); } return stageOutputs[stageOutputs.length - 1]; } catch (error: any) { if (error.name === 'AbortError' || error.message.includes('cancelled')) { throw error; } throw new Error(`[Workflow Manager] ${error.message}`); } } private static buildStageInput(stage: MultiAgentStageConfig, originalPrompt: string, stageOutputs: string[]): string { const previous = stageOutputs[stageOutputs.length - 1] || ''; if (stage.input === 'original') { return originalPrompt; } if (stage.input === 'previous') { return previous || originalPrompt; } return [ '## Original User Request', originalPrompt, '', '## Previous Stage Output', previous || 'No previous stage output.' ].join('\n'); } private static validateResult(data: string, step: string) { if (!data || data.trim().length < 10) { throw new Error(`${step} agent did not return a usable response.`); } } }