{"version":3,"file":"utils/stream-utils.mjs","sources":["webpack://@multimodal/agent/./src/utils/stream-utils.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n  ChatCompletion,\n  ChatCompletionChunk,\n  ChatCompletionMessageToolCall,\n} from '@multimodal/agent-interface';\n\n/**\n * Reconstruct a ChatCompletion object from an array of chunks\n * This provides a compatible object for the onLLMResponse hook\n */\nexport function reconstructCompletion(chunks: ChatCompletionChunk[]): ChatCompletion {\n  if (chunks.length === 0) {\n    // Return minimal valid structure if no chunks\n    return {\n      id: '',\n      choices: [],\n      created: Date.now(),\n      model: '',\n      object: 'chat.completion',\n    };\n  }\n\n  // Take basic info from the last chunk\n  const lastChunk = chunks[chunks.length - 1];\n\n  // Build the content by combining all chunks\n  let content = '';\n  let reasoningContent = '';\n  const toolCalls: ChatCompletionMessageToolCall[] = [];\n\n  // Track tool calls by index\n  const toolCallsMap = new Map<number, Partial<ChatCompletionMessageToolCall>>();\n\n  // Process all chunks to reconstruct the complete response\n  for (const chunk of chunks) {\n    const delta = chunk.choices[0]?.delta;\n\n    // Accumulate content\n    if (delta?.content) {\n      content += delta.content;\n    }\n\n    // Accumulate reasoning content\n    // @ts-expect-error Not in OpenAI types\n    if (delta?.reasoning_content) {\n      // @ts-expect-error\n      reasoningContent += delta.reasoning_content;\n    }\n\n    // Process tool calls\n    if (delta?.tool_calls) {\n      for (const tc of delta.tool_calls) {\n        const index = tc.index;\n\n        // Initialize tool call if needed\n        if (!toolCallsMap.has(index)) {\n          toolCallsMap.set(index, {\n            id: tc.id,\n            type: tc.type,\n            function: { name: '', arguments: '' },\n          });\n        }\n\n        // Update existing tool call\n        const currentTc = toolCallsMap.get(index)!;\n\n        if (tc.function?.name) {\n          currentTc.function!.name = tc.function.name;\n        }\n\n        if (tc.function?.arguments) {\n          currentTc.function!.arguments =\n            (currentTc.function!.arguments || '') + tc.function.arguments;\n        }\n      }\n    }\n  }\n\n  // Convert map to array\n  toolCallsMap.forEach((tc) => toolCalls.push(tc as ChatCompletionMessageToolCall));\n\n  // Build the reconstructed completion\n  return {\n    id: lastChunk.id,\n    choices: [\n      {\n        index: 0,\n        message: {\n          role: 'assistant',\n          content,\n          // @ts-expect-error Not in OpenAI types\n          reasoning_content: reasoningContent || undefined,\n          tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n        },\n        finish_reason: lastChunk.choices[0]?.finish_reason || 'stop',\n      },\n    ],\n    created: lastChunk.created,\n    model: lastChunk.model,\n    object: 'chat.completion',\n  };\n}\n"],"names":["reconstructCompletion","chunks","_lastChunk_choices_","Date","lastChunk","content","reasoningContent","toolCalls","toolCallsMap","Map","chunk","_chunk_choices_","delta","tc","_tc_function","_tc_function1","index","currentTc","undefined"],"mappings":";;;;AAcO,SAASA,sBAAsBC,MAA6B;QAoF5CC;IAnFrB,IAAID,AAAkB,MAAlBA,OAAO,MAAM,EAEf,OAAO;QACL,IAAI;QACJ,SAAS,EAAE;QACX,SAASE,KAAK,GAAG;QACjB,OAAO;QACP,QAAQ;IACV;IAIF,MAAMC,YAAYH,MAAM,CAACA,OAAO,MAAM,GAAG,EAAE;IAG3C,IAAII,UAAU;IACd,IAAIC,mBAAmB;IACvB,MAAMC,YAA6C,EAAE;IAGrD,MAAMC,eAAe,IAAIC;IAGzB,KAAK,MAAMC,SAAST,OAAQ;YACZU;QAAd,MAAMC,QAAQ,QAAAD,CAAAA,kBAAAA,MAAM,OAAO,CAAC,EAAE,AAAD,IAAfA,KAAAA,IAAAA,gBAAkB,KAAK;QAGrC,IAAIC,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,OAAO,EAChBP,WAAWO,MAAM,OAAO;QAK1B,IAAIA,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,iBAAiB,EAE1BN,oBAAoBM,MAAM,iBAAiB;QAI7C,IAAIA,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,UAAU,EACnB,KAAK,MAAMC,MAAMD,MAAM,UAAU,CAAE;gBAe7BE,cAIAC;YAlBJ,MAAMC,QAAQH,GAAG,KAAK;YAGtB,IAAI,CAACL,aAAa,GAAG,CAACQ,QACpBR,aAAa,GAAG,CAACQ,OAAO;gBACtB,IAAIH,GAAG,EAAE;gBACT,MAAMA,GAAG,IAAI;gBACb,UAAU;oBAAE,MAAM;oBAAI,WAAW;gBAAG;YACtC;YAIF,MAAMI,YAAYT,aAAa,GAAG,CAACQ;YAEnC,IAAI,QAAAF,CAAAA,eAAAA,GAAG,QAAQ,AAAD,IAAVA,KAAAA,IAAAA,aAAa,IAAI,EACnBG,UAAU,QAAQ,CAAE,IAAI,GAAGJ,GAAG,QAAQ,CAAC,IAAI;YAG7C,IAAI,QAAAE,CAAAA,gBAAAA,GAAG,QAAQ,AAAD,IAAVA,KAAAA,IAAAA,cAAa,SAAS,EACxBE,UAAU,QAAQ,CAAE,SAAS,GAC1BA,AAAAA,CAAAA,UAAU,QAAQ,CAAE,SAAS,IAAI,EAAC,IAAKJ,GAAG,QAAQ,CAAC,SAAS;QAEnE;IAEJ;IAGAL,aAAa,OAAO,CAAC,CAACK,KAAON,UAAU,IAAI,CAACM;IAG5C,OAAO;QACL,IAAIT,UAAU,EAAE;QAChB,SAAS;YACP;gBACE,OAAO;gBACP,SAAS;oBACP,MAAM;oBACNC;oBAEA,mBAAmBC,oBAAoBY;oBACvC,YAAYX,UAAU,MAAM,GAAG,IAAIA,YAAYW;gBACjD;gBACA,eAAehB,AAAAA,SAAAA,CAAAA,sBAAAA,UAAU,OAAO,CAAC,EAAE,AAAD,IAAnBA,KAAAA,IAAAA,oBAAsB,aAAa,AAAD,KAAK;YACxD;SACD;QACD,SAASE,UAAU,OAAO;QAC1B,OAAOA,UAAU,KAAK;QACtB,QAAQ;IACV;AACF"}