diff --git a/src/trace/trace.model.ts b/src/trace/trace.model.ts index 0b3c37a..372a296 100644 --- a/src/trace/trace.model.ts +++ b/src/trace/trace.model.ts @@ -48,7 +48,14 @@ export function isNodeTrace(config: NodeTrace | NodeData | unknown): config is P } export function isNodeExecutionTrace(config: NodeExecutionTraceExtractor): config is NodeExecutionTraceExtractor { - return 'inputs' in config || 'outputs' in config || 'errors' in config || 'startTime' in config || 'endTime' in config; + return ( + 'inputs' in config || + 'outputs' in config || + 'errors' in config || + 'startTime' in config || + 'endTime' in config || + 'narratives' in config + ); } export interface NodeData extends NodeTrace, NodeExecutionTrace {} diff --git a/src/trace/traceableExecution.spec.ts b/src/trace/traceableExecution.spec.ts index c41f76b..b8cf4dc 100644 --- a/src/trace/traceableExecution.spec.ts +++ b/src/trace/traceableExecution.spec.ts @@ -149,8 +149,22 @@ describe('TraceableExecution', () => { // Run the sample function using the run method and create nodes in the trace const nodeId = 'sampleFunction_custom_id_1'; - traceableExecution.run(sampleFunction, ['InputParam'], { trace: { id: nodeId, narratives: ['Narrative 0'] } }); - traceableExecution.run(sampleFunction, ['InputParam2'], { trace: { id: 'sampleFunction_custom_id_2' } }); + traceableExecution.run(sampleFunction, ['InputParam'], { + trace: { id: nodeId, narratives: ['Narrative 0'] }, + config: { + traceExecution: { + narratives: (res) => { + return [`Narrative 0 with ${res.outputs}`]; + } + } + } + }); + traceableExecution.run(sampleFunction, ['InputParam2'], { + trace: { + id: 'sampleFunction_custom_id_2', + narratives: ['Narrative 0 for function 2'] + } + }); // Get the initial trace and assert its length const initialTrace = traceableExecution.getTrace(); @@ -161,18 +175,31 @@ describe('TraceableExecution', () => { // Check if the narrative was added successfully const nodeWithNarrative = traceableExecution.getTraceNodes().find((node) => node.data.id === nodeId); - expect(nodeWithNarrative?.data.narratives).toEqual(['Narrative 0', 'Narrative 1']); + expect(nodeWithNarrative?.data.narratives).toEqual(['Narrative 0', 'Narrative 0 with Result: InputParam', 'Narrative 1']); // Use appendNarratives to add an array of narratives to the same node traceableExecution.appendNarratives(nodeId, ['Narrative 2', 'Narrative 3']); // Check if the narratives were appended successfully const nodeWithAppendedNarratives = traceableExecution.getTraceNodes().find((node) => node.data.id === nodeId); - expect(nodeWithAppendedNarratives?.data.narratives).toEqual(['Narrative 0', 'Narrative 1', 'Narrative 2', 'Narrative 3']); + expect(nodeWithAppendedNarratives?.data.narratives).toEqual([ + 'Narrative 0', + 'Narrative 0 with Result: InputParam', + 'Narrative 1', + 'Narrative 2', + 'Narrative 3' + ]); // Get the ordered narratives and verify their content const orderedNarratives = traceableExecution.getOrderedNarratives(); - expect(orderedNarratives).toEqual(['Narrative 0', 'Narrative 1', 'Narrative 2', 'Narrative 3']); + expect(orderedNarratives).toEqual([ + 'Narrative 0', + 'Narrative 0 with Result: InputParam', + 'Narrative 1', + 'Narrative 2', + 'Narrative 3', + 'Narrative 0 for function 2' + ]); // Get the final trace and assert its updated length const finalTrace = traceableExecution.getTrace(); diff --git a/src/trace/traceableExecution.ts b/src/trace/traceableExecution.ts index 91367b3..62f1b22 100644 --- a/src/trace/traceableExecution.ts +++ b/src/trace/traceableExecution.ts @@ -383,8 +383,8 @@ export class TraceableExecution { data: { ...this.nodes[existingNodeIndex]?.data, ...filterExecutionTrace, - narratives: this.narratives?.[nodeTrace?.id], ...nodeTrace, + narratives: (nodeTrace.narratives ?? []).concat(this.narratives?.[nodeTrace?.id] ?? []), parallel: options?.parallel, abstract: isAutoCreated, updateTime: new Date() @@ -395,8 +395,8 @@ export class TraceableExecution { this.nodes?.push({ data: { ...filterExecutionTrace, - narratives: this.narratives?.[nodeTrace?.id], ...nodeTrace, + narratives: (nodeTrace.narratives ?? []).concat(this.narratives?.[nodeTrace?.id] ?? []), parallel: options?.parallel, abstract: isAutoCreated, createTime: new Date()