@@ -288,6 +288,11 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
288288 toolCallId : toolCall . id ?? generateId ( ) ,
289289 toolName : toolCall . function . name ,
290290 input : toolCall . function . arguments ! ,
291+ ...toolCallExtraContentMetadata (
292+ toolCall . extra_content ,
293+ this . providerOptionsName ,
294+ this . modelId ,
295+ ) ,
291296 } )
292297 }
293298 }
@@ -376,6 +381,7 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
376381 name : string
377382 arguments : string
378383 }
384+ extraContent ?: unknown
379385 hasFinished : boolean
380386 } > = [ ]
381387
@@ -606,6 +612,7 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
606612 name : toolCallDelta . function . name ,
607613 arguments : toolCallDelta . function . arguments ?? '' ,
608614 } ,
615+ extraContent : toolCallDelta . extra_content ?? undefined ,
609616 hasFinished : false ,
610617 }
611618
@@ -637,6 +644,11 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
637644 toolCallId : toolCall . id ?? generateId ( ) ,
638645 toolName : toolCall . function . name ,
639646 input : toolCall . function . arguments ,
647+ ...toolCallExtraContentMetadata (
648+ toolCall . extraContent ,
649+ providerOptionsName ,
650+ modelId ,
651+ ) ,
640652 } )
641653 toolCall . hasFinished = true
642654 }
@@ -652,6 +664,10 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
652664 continue
653665 }
654666
667+ if ( toolCallDelta . extra_content != null ) {
668+ toolCall . extraContent = toolCallDelta . extra_content
669+ }
670+
655671 if ( toolCallDelta . function ?. arguments != null ) {
656672 toolCall . function ! . arguments +=
657673 toolCallDelta . function ?. arguments ?? ''
@@ -680,6 +696,11 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
680696 toolCallId : toolCall . id ?? generateId ( ) ,
681697 toolName : toolCall . function . name ,
682698 input : toolCall . function . arguments ,
699+ ...toolCallExtraContentMetadata (
700+ toolCall . extraContent ,
701+ providerOptionsName ,
702+ modelId ,
703+ ) ,
683704 } )
684705 toolCall . hasFinished = true
685706 }
@@ -730,6 +751,11 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
730751 toolCallId : toolCall . id ?? generateId ( ) ,
731752 toolName : toolCall . function . name ,
732753 input : toolCall . function . arguments ,
754+ ...toolCallExtraContentMetadata (
755+ toolCall . extraContent ,
756+ providerOptionsName ,
757+ modelId ,
758+ ) ,
733759 } )
734760 }
735761
@@ -773,6 +799,32 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 {
773799 }
774800}
775801
802+ /**
803+ * A tool call's `extra_content`, kept so the next request can send it back.
804+ * Gemini 3's OpenAI-compatible endpoint puts the call's thought signature at
805+ * `extra_content.google.thought_signature` and refuses (HTTP 400) a follow-up
806+ * whose replayed call lacks it. Like `reasoning_details`, it is tagged with
807+ * the model that produced it and only replayed to that model.
808+ */
809+ function toolCallExtraContentMetadata (
810+ extraContent : unknown ,
811+ providerOptionsName : string ,
812+ modelId : string ,
813+ ) : { providerMetadata ?: SharedV2ProviderMetadata } {
814+ if (
815+ extraContent == null ||
816+ typeof extraContent !== 'object' ||
817+ Array . isArray ( extraContent )
818+ ) {
819+ return { }
820+ }
821+ return {
822+ providerMetadata : {
823+ [ providerOptionsName ] : { extra_content : extraContent , model : modelId } ,
824+ } as SharedV2ProviderMetadata ,
825+ }
826+ }
827+
776828/**
777829 * The slot of a streamed tool-call delta that carries no `index`. OpenAI
778830 * always sends one, but several OpenAI-compatible servers and proxies do not
@@ -848,6 +900,7 @@ const OpenAICompatibleChatResponseSchema = z.object({
848900 name : z . string ( ) ,
849901 arguments : z . string ( ) ,
850902 } ) ,
903+ extra_content : z . unknown ( ) . nullish ( ) ,
851904 } ) ,
852905 )
853906 . nullish ( ) ,
@@ -908,6 +961,7 @@ const createOpenAICompatibleChatChunkSchema = <
908961 name : z . string ( ) . nullish ( ) ,
909962 arguments : z . string ( ) . nullish ( ) ,
910963 } ) ,
964+ extra_content : z . unknown ( ) . nullish ( ) ,
911965 } ) ,
912966 )
913967 . nullish ( ) ,
0 commit comments