From bf5e69017fdefa7abe10355df45aa082976123cf Mon Sep 17 00:00:00 2001 From: Yarchik Date: Thu, 2 Jul 2026 12:54:38 +0100 Subject: [PATCH] fix(assistants): place array delta entries by index instead of appending --- src/lib/AssistantStream.ts | 2 +- tests/streaming/assistants/assistant.test.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/lib/AssistantStream.ts b/src/lib/AssistantStream.ts index f3002582cd..d8a665c000 100644 --- a/src/lib/AssistantStream.ts +++ b/src/lib/AssistantStream.ts @@ -686,7 +686,7 @@ export class AssistantStream const accEntry = accValue[index]; if (accEntry == null) { - accValue.push(deltaEntry); + accValue[index] = deltaEntry; } else { accValue[index] = this.accumulateDelta(accEntry, deltaEntry); } diff --git a/tests/streaming/assistants/assistant.test.ts b/tests/streaming/assistants/assistant.test.ts index e8db3d5852..5e3547e610 100644 --- a/tests/streaming/assistants/assistant.test.ts +++ b/tests/streaming/assistants/assistant.test.ts @@ -29,4 +29,19 @@ describe('assistant tests', () => { expect(AssistantStream.accumulateDelta({ a: null }, { a: 'apple' })).toEqual({ a: 'apple' }); expect(AssistantStream.accumulateDelta({ a: null }, { a: null })).toEqual({ a: null }); }); + + test('array delta accumulation uses the entry index', () => { + const acc: any = { + tool_calls: [{ index: 0, id: 'call_0', type: 'function', function: { name: 'f0', arguments: '{' } }], + }; + AssistantStream.accumulateDelta(acc, { + tool_calls: [{ index: 2, id: 'call_2', type: 'function', function: { name: 'f2', arguments: '{' } }], + }); + AssistantStream.accumulateDelta(acc, { + tool_calls: [{ index: 2, function: { arguments: '"x":1}' } }], + }); + const atIndex2 = acc.tool_calls.filter((t: any) => t.index === 2); + expect(atIndex2).toHaveLength(1); + expect(atIndex2[0].function.arguments).toBe('{"x":1}'); + }); });