diff --git a/src/fable5/dynamic-workflows.test.ts b/src/fable5/dynamic-workflows.test.ts index 1bda773..1c516e1 100644 --- a/src/fable5/dynamic-workflows.test.ts +++ b/src/fable5/dynamic-workflows.test.ts @@ -47,6 +47,7 @@ describe("DynamicWorkflows fan-out routing", () => { expect(result.routeContexts[1]?.flow).toBe("planning"); expect(result.routeContexts[2]?.flow).toBe("review"); expect(result.iterations).toHaveLength(3); + expect(result.mixtureOfAgents).toEqual({ provider: "fable-fan-out", workers: 3, synthesizer: "caller-provided", maxConcurrency: 3 }); expect(result.synthesisVerdict).toBeDefined(); }); }); diff --git a/src/fable5/dynamic-workflows.ts b/src/fable5/dynamic-workflows.ts index 5d622c5..6591f62 100644 --- a/src/fable5/dynamic-workflows.ts +++ b/src/fable5/dynamic-workflows.ts @@ -45,11 +45,19 @@ export interface WorkflowDefinition { maxConcurrency?: number; } +export interface MixtureOfAgentsMetadata { + provider: "fable-fan-out"; + workers: number; + synthesizer: "caller-provided"; + maxConcurrency: number; +} + export interface FanOutResult { iterations: LoopIteration[]; routeContexts: FanOutSubtaskRouteContext[]; synthesized: LoopIteration; synthesisVerdict: VerificationResult; + mixtureOfAgents: MixtureOfAgentsMetadata; } export interface AdversarialResult { @@ -136,7 +144,18 @@ export class DynamicWorkflows { // Phase 3: Verify the synthesis const synthesisVerdict = this.verifier.verify(synthesized, task); - return { iterations, routeContexts, synthesized, synthesisVerdict }; + return { + iterations, + routeContexts, + synthesized, + synthesisVerdict, + mixtureOfAgents: { + provider: "fable-fan-out", + workers: subTasks.length, + synthesizer: "caller-provided", + maxConcurrency, + }, + }; } /**