Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions packages/typescript/ai/src/activities/chat/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ interface AssistantSegment {
id: string
type: 'function'
function: { name: string; arguments: string }
providerMetadata?: Record<string, unknown>
}>
}

Expand Down Expand Up @@ -205,6 +206,9 @@ function buildAssistantMessages(uiMessage: UIMessage): Array<ModelMessage> {
name: part.name,
arguments: part.arguments,
},
...(part.providerMetadata && {
providerMetadata: part.providerMetadata,
}),
})
}
break
Expand Down Expand Up @@ -340,6 +344,9 @@ export function modelMessageToUIMessage(
name: toolCall.function.name,
arguments: toolCall.function.arguments,
state: 'input-complete', // Model messages have complete arguments
...(toolCall.providerMetadata && {
providerMetadata: toolCall.providerMetadata,
}),
})
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export function updateToolCallPart(
name: string
arguments: string
state: ToolCallState
providerMetadata?: Record<string, unknown>
},
): Array<UIMessage> {
return messages.map((msg) => {
Expand All @@ -67,6 +68,10 @@ export function updateToolCallPart(
(p): p is ToolCallPart => p.type === 'tool-call' && p.id === toolCall.id,
)

// Carry forward providerMetadata from either the new toolCall or the existing part
const providerMetadata =
toolCall.providerMetadata ?? existing?.providerMetadata

const toolCallPart: ToolCallPart = {
type: 'tool-call',
id: toolCall.id,
Expand All @@ -76,6 +81,7 @@ export function updateToolCallPart(
// Carry forward approval and output from the existing part
...(existing?.approval && { approval: { ...existing.approval } }),
...(existing?.output !== undefined && { output: existing.output }),
...(providerMetadata && { providerMetadata }),
}

if (existing) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -856,6 +856,9 @@ export class StreamProcessor {
state: initialState,
parsedArguments: undefined,
index: chunk.index ?? state.toolCalls.size,
...(chunk.providerMetadata && {
providerMetadata: chunk.providerMetadata,
}),
}

state.toolCalls.set(toolCallId, newToolCall)
Expand All @@ -870,6 +873,9 @@ export class StreamProcessor {
name: chunk.toolName,
arguments: '',
state: initialState,
...(chunk.providerMetadata && {
providerMetadata: chunk.providerMetadata,
}),
})
this.emitMessagesChange()

Expand Down Expand Up @@ -1367,6 +1373,9 @@ export class StreamProcessor {
name: tc.name,
arguments: tc.arguments,
},
...(tc.providerMetadata && {
providerMetadata: tc.providerMetadata,
}),
})
}
}
Expand Down
2 changes: 2 additions & 0 deletions packages/typescript/ai/src/activities/chat/stream/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ export interface InternalToolCallState {
state: ToolCallState
parsedArguments?: any
index: number
/** Provider-specific metadata (e.g. Gemini thoughtSignature) */
providerMetadata?: Record<string, unknown>
}

/**
Expand Down
2 changes: 2 additions & 0 deletions packages/typescript/ai/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,8 @@ export interface ToolCallPart {
}
/** Tool execution output (for client tools or after approval) */
output?: any
/** Provider-specific metadata carried through the tool call lifecycle (e.g. Gemini thoughtSignature) */
providerMetadata?: Record<string, unknown>
}

export interface ToolResultPart {
Expand Down