1+ import { randomUUID } from "node:crypto" ;
2+
13interface GeminiFunctionCallPart {
24 functionCall ?: {
5+ id ?: string ;
36 name : string ;
47 args ?: Record < string , unknown > ;
58 [ key : string ] : unknown ;
@@ -23,6 +26,10 @@ interface OpenAIMessage {
2326 [ key : string ] : unknown ;
2427}
2528
29+ function makeFunctionCallId ( name : string ) : string {
30+ return `${ name } __${ randomUUID ( ) } ` ;
31+ }
32+
2633/**
2734 * Transforms OpenAI `tool_calls` to Gemini `functionCall` parts.
2835 */
@@ -60,10 +67,12 @@ export function transformOpenAIToolCalls(requestPayload: Record<string, unknown>
6067
6168 const name = fn . name ;
6269 const args = parseJsonObject ( fn . arguments ) ;
70+ const resolvedName = name ?? "" ;
6371 parts . push ( {
6472 functionCall : {
65- name : name ?? "" ,
73+ name : resolvedName ,
6674 args,
75+ id : makeFunctionCallId ( resolvedName ) ,
6776 } ,
6877 thoughtSignature : "skip_thought_signature_validator" ,
6978 } ) ;
@@ -99,8 +108,14 @@ export function addThoughtSignaturesToFunctionCalls(requestPayload: Record<strin
99108 continue ;
100109 }
101110 const partObj = part as Record < string , unknown > ;
102- if ( partObj . functionCall && ! partObj . thoughtSignature ) {
103- partObj . thoughtSignature = "skip_thought_signature_validator" ;
111+ if ( partObj . functionCall ) {
112+ if ( ! partObj . thoughtSignature ) {
113+ partObj . thoughtSignature = "skip_thought_signature_validator" ;
114+ }
115+ const fc = partObj . functionCall as Record < string , unknown > ;
116+ if ( ! fc . id ) {
117+ fc . id = makeFunctionCallId ( ( fc . name as string ) || "" ) ;
118+ }
104119 }
105120 }
106121 }
0 commit comments