diff --git a/packages/agent-core-v2/src/agent/loop/machine/requester.ts b/packages/agent-core-v2/src/agent/loop/machine/requester.ts index 3f60b90922d..1103330f777 100644 --- a/packages/agent-core-v2/src/agent/loop/machine/requester.ts +++ b/packages/agent-core-v2/src/agent/loop/machine/requester.ts @@ -3,6 +3,7 @@ import type { AgentLLMRequestSource, IAgentLLMRequesterService, } from '#/agent/llmRequester/llmRequester'; +import { ToolCallIdResponseNormalizer } from '#/agent/llmRequester/toolCallIdNormalizer'; import { unwrapErrorCause } from '#/errors'; import { llmMessageFromError } from '#/llm-adapter/contract/errors'; import type { LLMRequestTrace } from '#/llm-adapter/contract/request-trace'; @@ -80,9 +81,17 @@ export function createMachineRequester( baseSource?.type === 'turn' && decision.step !== undefined ? { ...baseSource, step: decision.step } : baseSource; + const toolCallIds = new ToolCallIdResponseNormalizer(new Set()); const task = service.start( { source }, - (part) => control.onEvent?.({ type: 'llm.delta', part }), + (part) => { + if (part.type !== 'function') { + control.onEvent?.({ type: 'llm.delta', part }); + return; + } + const id = toolCallIds.remapStreamedId(part.id, part._streamIndex); + control.onEvent?.({ type: 'llm.delta', part: id === part.id ? part : { ...part, id } }); + }, signal, ); options?.onTrace?.(task.trace);