68 lines
2.5 KiB
TypeScript
68 lines
2.5 KiB
TypeScript
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<string> {
|
|
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.`);
|
|
}
|
|
}
|
|
}
|