@langchain/google-common 2.1.31 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +2 -7
  3. package/dist/auth.cjs.map +1 -1
  4. package/dist/auth.js.map +1 -1
  5. package/dist/chat_models.cjs +15 -1
  6. package/dist/chat_models.cjs.map +1 -1
  7. package/dist/chat_models.d.cts +2 -0
  8. package/dist/chat_models.d.cts.map +1 -1
  9. package/dist/chat_models.d.ts +2 -0
  10. package/dist/chat_models.d.ts.map +1 -1
  11. package/dist/chat_models.js +15 -1
  12. package/dist/chat_models.js.map +1 -1
  13. package/dist/connection.cjs.map +1 -1
  14. package/dist/connection.js.map +1 -1
  15. package/dist/embeddings.cjs.map +1 -1
  16. package/dist/embeddings.js.map +1 -1
  17. package/dist/experimental/media.cjs.map +1 -1
  18. package/dist/experimental/media.js.map +1 -1
  19. package/dist/experimental/utils/media_core.cjs.map +1 -1
  20. package/dist/experimental/utils/media_core.js.map +1 -1
  21. package/dist/index.cjs +2 -0
  22. package/dist/index.d.cts +2 -1
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.js +2 -1
  25. package/dist/llms.cjs +1 -1
  26. package/dist/llms.cjs.map +1 -1
  27. package/dist/llms.js +1 -1
  28. package/dist/llms.js.map +1 -1
  29. package/dist/output_parsers.cjs.map +1 -1
  30. package/dist/output_parsers.js.map +1 -1
  31. package/dist/types.cjs.map +1 -1
  32. package/dist/types.d.cts +9 -2
  33. package/dist/types.d.cts.map +1 -1
  34. package/dist/types.d.ts +9 -2
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/types.js.map +1 -1
  37. package/dist/utils/anthropic.cjs.map +1 -1
  38. package/dist/utils/anthropic.js.map +1 -1
  39. package/dist/utils/common.cjs.map +1 -1
  40. package/dist/utils/common.js.map +1 -1
  41. package/dist/utils/gemini.cjs +31 -8
  42. package/dist/utils/gemini.cjs.map +1 -1
  43. package/dist/utils/gemini.d.cts.map +1 -1
  44. package/dist/utils/gemini.d.ts.map +1 -1
  45. package/dist/utils/gemini.js +31 -8
  46. package/dist/utils/gemini.js.map +1 -1
  47. package/dist/utils/stream.cjs.map +1 -1
  48. package/dist/utils/stream.js.map +1 -1
  49. package/dist/utils/stream_events.cjs +173 -0
  50. package/dist/utils/stream_events.cjs.map +1 -0
  51. package/dist/utils/stream_events.d.cts +11 -0
  52. package/dist/utils/stream_events.d.cts.map +1 -0
  53. package/dist/utils/stream_events.d.ts +11 -0
  54. package/dist/utils/stream_events.d.ts.map +1 -0
  55. package/dist/utils/stream_events.js +173 -0
  56. package/dist/utils/stream_events.js.map +1 -0
  57. package/dist/utils/zod_to_gemini_parameters.cjs.map +1 -1
  58. package/dist/utils/zod_to_gemini_parameters.js.map +1 -1
  59. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"common.cjs","names":["GeminiToolAttributes","schemaToGeminiParameters","jsonSchemaToGeminiParameters","normalizeSpeechConfig","isModelGemini","isModelGemma","isModelClaude","validateGeminiParams"],"sources":["../../src/utils/common.ts"],"sourcesContent":["import { isOpenAITool } from \"@langchain/core/language_models/base\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport {\n isModelGemini,\n isModelGemma,\n normalizeSpeechConfig,\n validateGeminiParams,\n} from \"./gemini.js\";\nimport {\n GeminiFunctionDeclaration,\n GeminiFunctionSchema,\n GeminiTool,\n GeminiToolAttributes,\n GoogleAIBaseLanguageModelCallOptions,\n GoogleAIModelParams,\n GoogleAIModelRequestParams,\n GoogleAIToolType,\n VertexModelFamily,\n} from \"../types.js\";\nimport {\n jsonSchemaToGeminiParameters,\n schemaToGeminiParameters,\n} from \"./zod_to_gemini_parameters.js\";\nimport { isModelClaude, validateClaudeParams } from \"./anthropic.js\";\n\nexport function copyAIModelParams(\n params: GoogleAIModelParams | undefined,\n options: GoogleAIBaseLanguageModelCallOptions | undefined\n): GoogleAIModelRequestParams {\n return copyAIModelParamsInto(params, options, {});\n}\n\nfunction processToolChoice(\n toolChoice: GoogleAIBaseLanguageModelCallOptions[\"tool_choice\"],\n allowedFunctionNames: GoogleAIBaseLanguageModelCallOptions[\"allowed_function_names\"]\n):\n | {\n tool_choice: \"any\" | \"auto\" | \"none\";\n allowed_function_names?: string[];\n }\n | undefined {\n if (!toolChoice) {\n if (allowedFunctionNames) {\n // Allowed func names is passed, return 'any' so it forces the model to use a tool.\n return {\n tool_choice: \"any\",\n allowed_function_names: allowedFunctionNames,\n };\n }\n return undefined;\n }\n\n if (toolChoice === \"any\" || toolChoice === \"auto\" || toolChoice === \"none\") {\n return {\n tool_choice: toolChoice,\n allowed_function_names: allowedFunctionNames,\n };\n }\n if (typeof toolChoice === \"string\") {\n // String representing the function name.\n // Return any to force the model to predict the specified function call.\n return {\n tool_choice: \"any\",\n allowed_function_names: [...(allowedFunctionNames ?? []), toolChoice],\n };\n }\n throw new Error(\"Object inputs for tool_choice not supported.\");\n}\n\nfunction isGeminiTool(tool: GoogleAIToolType): tool is GeminiTool {\n for (const toolAttribute of GeminiToolAttributes) {\n if (toolAttribute in tool) {\n return true;\n }\n }\n return false;\n}\n\nfunction isGeminiNonFunctionTool(tool: GoogleAIToolType): tool is GeminiTool {\n return isGeminiTool(tool) && !(\"functionDeclaration\" in tool);\n}\n\nexport function convertToGeminiTools(tools: GoogleAIToolType[]): GeminiTool[] {\n const geminiTools: GeminiTool[] = [];\n let functionDeclarationsIndex = -1;\n tools.forEach((tool) => {\n if (isGeminiNonFunctionTool(tool)) {\n geminiTools.push(tool);\n } else {\n if (functionDeclarationsIndex === -1) {\n geminiTools.push({\n functionDeclarations: [],\n });\n functionDeclarationsIndex = geminiTools.length - 1;\n }\n if (\n \"functionDeclarations\" in tool &&\n Array.isArray(tool.functionDeclarations)\n ) {\n const funcs: GeminiFunctionDeclaration[] = tool.functionDeclarations;\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push(\n ...funcs\n );\n } else if (isLangChainTool(tool)) {\n try {\n const jsonSchema = schemaToGeminiParameters(tool.schema);\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push({\n name: tool.name,\n description: tool.description ?? `A function available to call.`,\n parameters: jsonSchema as GeminiFunctionSchema,\n });\n } catch (error) {\n const errorMessage =\n error && typeof error === \"object\" && \"message\" in error\n ? String(error.message)\n : String(error);\n throw new Error(\n `Failed to convert tool '${tool.name}' schema for Gemini: ${errorMessage}. `\n );\n }\n } else if (isOpenAITool(tool)) {\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push({\n name: tool.function.name,\n description:\n tool.function.description ?? `A function available to call.`,\n parameters: jsonSchemaToGeminiParameters(tool.function.parameters),\n });\n } else {\n throw new Error(`Received invalid tool: ${JSON.stringify(tool)}`);\n }\n }\n });\n return geminiTools;\n}\n\nfunction reasoningEffortToReasoningTokens(\n _modelName?: string,\n effort?: string\n): number | undefined {\n if (effort === undefined) {\n return undefined;\n }\n const maxEffort = 24 * 1024; // Max for Gemini 2.5 Flash\n switch (effort) {\n case \"low\":\n // Defined as 1k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 1024;\n case \"medium\":\n // Defined as 8k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 8 * 1024;\n case \"high\":\n return maxEffort;\n default:\n return undefined;\n }\n}\n\nexport function copyAIModelParamsInto(\n params: GoogleAIModelParams | undefined,\n options: GoogleAIBaseLanguageModelCallOptions | undefined,\n target: GoogleAIModelParams\n): GoogleAIModelRequestParams {\n const ret: GoogleAIModelRequestParams = target || {};\n const model = options?.model ?? params?.model ?? target.model;\n ret.modelName =\n model ?? options?.modelName ?? params?.modelName ?? target.modelName;\n ret.model = model;\n ret.temperature =\n options?.temperature ?? params?.temperature ?? target.temperature;\n ret.maxOutputTokens =\n options?.maxOutputTokens ??\n params?.maxOutputTokens ??\n target.maxOutputTokens;\n ret.maxReasoningTokens =\n options?.maxReasoningTokens ??\n params?.maxReasoningTokens ??\n target?.maxReasoningTokens ??\n options?.thinkingBudget ??\n params?.thinkingBudget ??\n target?.thinkingBudget ??\n reasoningEffortToReasoningTokens(ret.modelName, params?.reasoningEffort) ??\n reasoningEffortToReasoningTokens(ret.modelName, target?.reasoningEffort) ??\n reasoningEffortToReasoningTokens(ret.modelName, options?.reasoningEffort);\n ret.topP = options?.topP ?? params?.topP ?? target.topP;\n ret.topK = options?.topK ?? params?.topK ?? target.topK;\n ret.seed = options?.seed ?? params?.seed ?? target.seed;\n ret.presencePenalty =\n options?.presencePenalty ??\n params?.presencePenalty ??\n target.presencePenalty;\n ret.frequencyPenalty =\n options?.frequencyPenalty ??\n params?.frequencyPenalty ??\n target.frequencyPenalty;\n ret.stopSequences =\n options?.stopSequences ?? params?.stopSequences ?? target.stopSequences;\n ret.safetySettings =\n options?.safetySettings ?? params?.safetySettings ?? target.safetySettings;\n ret.logprobs = options?.logprobs ?? params?.logprobs ?? target.logprobs;\n ret.topLogprobs =\n options?.topLogprobs ?? params?.topLogprobs ?? target.topLogprobs;\n ret.thinkingLevel =\n options?.thinkingLevel ?? params?.thinkingLevel ?? target?.thinkingLevel;\n ret.reasoningLevel =\n options?.reasoningLevel ?? params?.reasoningLevel ?? target?.reasoningLevel;\n ret.convertSystemMessageToHumanContent =\n options?.convertSystemMessageToHumanContent ??\n params?.convertSystemMessageToHumanContent ??\n target?.convertSystemMessageToHumanContent;\n ret.responseMimeType =\n options?.responseMimeType ??\n params?.responseMimeType ??\n target?.responseMimeType;\n ret.responseSchema =\n options?.responseSchema ?? params?.responseSchema ?? target?.responseSchema;\n ret.responseModalities =\n options?.responseModalities ??\n params?.responseModalities ??\n target?.responseModalities;\n ret.speechConfig = normalizeSpeechConfig(\n options?.speechConfig ?? params?.speechConfig ?? target?.speechConfig\n );\n ret.streaming = options?.streaming ?? params?.streaming ?? target?.streaming;\n const toolChoice = processToolChoice(\n options?.tool_choice,\n options?.allowed_function_names\n );\n if (toolChoice) {\n ret.tool_choice = toolChoice.tool_choice;\n ret.allowed_function_names = toolChoice.allowed_function_names;\n }\n\n const tools = options?.tools;\n if (tools) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n ret.tools = convertToGeminiTools(tools as Record<string, any>[]);\n }\n\n if (options?.cachedContent) {\n ret.cachedContent = options.cachedContent;\n }\n\n ret.labels = options?.labels ?? params?.labels ?? target?.labels;\n\n return ret;\n}\n\nexport function modelToFamily(\n modelName: string | undefined\n): VertexModelFamily {\n if (!modelName) {\n return null;\n } else if (isModelGemini(modelName)) {\n return \"gemini\";\n } else if (isModelGemma(modelName)) {\n return \"gemma\";\n } else if (isModelClaude(modelName)) {\n return \"claude\";\n } else {\n return null;\n }\n}\n\nexport function modelToPublisher(modelName: string | undefined): string {\n const family = modelToFamily(modelName);\n switch (family) {\n case \"gemini\":\n case \"gemma\":\n case \"palm\":\n return \"google\";\n\n case \"claude\":\n return \"anthropic\";\n\n default:\n return \"unknown\";\n }\n}\n\nexport function validateModelParams(\n params: GoogleAIModelParams | undefined\n): void {\n const testParams: GoogleAIModelParams = params ?? {};\n const model = testParams.model ?? testParams.modelName;\n switch (modelToFamily(model)) {\n case \"gemini\":\n case \"gemma\": // TODO: Are we sure?\n return validateGeminiParams(testParams);\n\n case \"claude\":\n return validateClaudeParams(testParams);\n\n default:\n throw new Error(\n `Unable to verify model params: ${JSON.stringify(params)}`\n );\n }\n}\n\nexport function copyAndValidateModelParamsInto(\n params: GoogleAIModelParams | undefined,\n target: GoogleAIModelParams\n): GoogleAIModelParams {\n copyAIModelParamsInto(params, undefined, target);\n validateModelParams(target);\n return target;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"common.cjs","names":["GeminiToolAttributes","schemaToGeminiParameters","jsonSchemaToGeminiParameters","normalizeSpeechConfig","isModelGemini","isModelGemma","isModelClaude","validateGeminiParams"],"sources":["../../src/utils/common.ts"],"sourcesContent":["import { isOpenAITool } from \"@langchain/core/language_models/base\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport {\n isModelGemini,\n isModelGemma,\n normalizeSpeechConfig,\n validateGeminiParams,\n} from \"./gemini.js\";\nimport {\n GeminiFunctionDeclaration,\n GeminiFunctionSchema,\n GeminiTool,\n GeminiToolAttributes,\n GoogleAIBaseLanguageModelCallOptions,\n GoogleAIModelParams,\n GoogleAIModelRequestParams,\n GoogleAIToolType,\n VertexModelFamily,\n} from \"../types.js\";\nimport {\n jsonSchemaToGeminiParameters,\n schemaToGeminiParameters,\n} from \"./zod_to_gemini_parameters.js\";\nimport { isModelClaude, validateClaudeParams } from \"./anthropic.js\";\n\nexport function copyAIModelParams(\n params: GoogleAIModelParams | undefined,\n options: GoogleAIBaseLanguageModelCallOptions | undefined\n): GoogleAIModelRequestParams {\n return copyAIModelParamsInto(params, options, {});\n}\n\nfunction processToolChoice(\n toolChoice: GoogleAIBaseLanguageModelCallOptions[\"tool_choice\"],\n allowedFunctionNames: GoogleAIBaseLanguageModelCallOptions[\"allowed_function_names\"]\n):\n | {\n tool_choice: \"any\" | \"auto\" | \"none\";\n allowed_function_names?: string[];\n }\n | undefined {\n if (!toolChoice) {\n if (allowedFunctionNames) {\n // Allowed func names is passed, return 'any' so it forces the model to use a tool.\n return {\n tool_choice: \"any\",\n allowed_function_names: allowedFunctionNames,\n };\n }\n return undefined;\n }\n\n if (toolChoice === \"any\" || toolChoice === \"auto\" || toolChoice === \"none\") {\n return {\n tool_choice: toolChoice,\n allowed_function_names: allowedFunctionNames,\n };\n }\n if (typeof toolChoice === \"string\") {\n // String representing the function name.\n // Return any to force the model to predict the specified function call.\n return {\n tool_choice: \"any\",\n allowed_function_names: [...(allowedFunctionNames ?? []), toolChoice],\n };\n }\n throw new Error(\"Object inputs for tool_choice not supported.\");\n}\n\nfunction isGeminiTool(tool: GoogleAIToolType): tool is GeminiTool {\n for (const toolAttribute of GeminiToolAttributes) {\n if (toolAttribute in tool) {\n return true;\n }\n }\n return false;\n}\n\nfunction isGeminiNonFunctionTool(tool: GoogleAIToolType): tool is GeminiTool {\n return isGeminiTool(tool) && !(\"functionDeclaration\" in tool);\n}\n\nexport function convertToGeminiTools(tools: GoogleAIToolType[]): GeminiTool[] {\n const geminiTools: GeminiTool[] = [];\n let functionDeclarationsIndex = -1;\n tools.forEach((tool) => {\n if (isGeminiNonFunctionTool(tool)) {\n geminiTools.push(tool);\n } else {\n if (functionDeclarationsIndex === -1) {\n geminiTools.push({\n functionDeclarations: [],\n });\n functionDeclarationsIndex = geminiTools.length - 1;\n }\n if (\n \"functionDeclarations\" in tool &&\n Array.isArray(tool.functionDeclarations)\n ) {\n const funcs: GeminiFunctionDeclaration[] = tool.functionDeclarations;\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push(\n ...funcs\n );\n } else if (isLangChainTool(tool)) {\n try {\n const jsonSchema = schemaToGeminiParameters(tool.schema);\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push({\n name: tool.name,\n description: tool.description ?? `A function available to call.`,\n parameters: jsonSchema as GeminiFunctionSchema,\n });\n } catch (error) {\n const errorMessage =\n error && typeof error === \"object\" && \"message\" in error\n ? String(error.message)\n : String(error);\n throw new Error(\n `Failed to convert tool '${tool.name}' schema for Gemini: ${errorMessage}. `\n );\n }\n } else if (isOpenAITool(tool)) {\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push({\n name: tool.function.name,\n description:\n tool.function.description ?? `A function available to call.`,\n parameters: jsonSchemaToGeminiParameters(tool.function.parameters),\n });\n } else {\n throw new Error(`Received invalid tool: ${JSON.stringify(tool)}`);\n }\n }\n });\n return geminiTools;\n}\n\nfunction reasoningEffortToReasoningTokens(\n _modelName?: string,\n effort?: string\n): number | undefined {\n if (effort === undefined) {\n return undefined;\n }\n const maxEffort = 24 * 1024; // Max for Gemini 2.5 Flash\n switch (effort) {\n case \"low\":\n // Defined as 1k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 1024;\n case \"medium\":\n // Defined as 8k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 8 * 1024;\n case \"high\":\n return maxEffort;\n default:\n return undefined;\n }\n}\n\nexport function copyAIModelParamsInto(\n params: GoogleAIModelParams | undefined,\n options: GoogleAIBaseLanguageModelCallOptions | undefined,\n target: GoogleAIModelParams\n): GoogleAIModelRequestParams {\n const ret: GoogleAIModelRequestParams = target || {};\n const model = options?.model ?? params?.model ?? target.model;\n ret.modelName =\n model ?? options?.modelName ?? params?.modelName ?? target.modelName;\n ret.model = model;\n ret.temperature =\n options?.temperature ?? params?.temperature ?? target.temperature;\n ret.maxOutputTokens =\n options?.maxOutputTokens ??\n params?.maxOutputTokens ??\n target.maxOutputTokens;\n ret.maxReasoningTokens =\n options?.maxReasoningTokens ??\n params?.maxReasoningTokens ??\n target?.maxReasoningTokens ??\n options?.thinkingBudget ??\n params?.thinkingBudget ??\n target?.thinkingBudget ??\n reasoningEffortToReasoningTokens(ret.modelName, params?.reasoningEffort) ??\n reasoningEffortToReasoningTokens(ret.modelName, target?.reasoningEffort) ??\n reasoningEffortToReasoningTokens(ret.modelName, options?.reasoningEffort);\n ret.topP = options?.topP ?? params?.topP ?? target.topP;\n ret.topK = options?.topK ?? params?.topK ?? target.topK;\n ret.seed = options?.seed ?? params?.seed ?? target.seed;\n ret.presencePenalty =\n options?.presencePenalty ??\n params?.presencePenalty ??\n target.presencePenalty;\n ret.frequencyPenalty =\n options?.frequencyPenalty ??\n params?.frequencyPenalty ??\n target.frequencyPenalty;\n ret.stopSequences =\n options?.stopSequences ?? params?.stopSequences ?? target.stopSequences;\n ret.safetySettings =\n options?.safetySettings ?? params?.safetySettings ?? target.safetySettings;\n ret.logprobs = options?.logprobs ?? params?.logprobs ?? target.logprobs;\n ret.topLogprobs =\n options?.topLogprobs ?? params?.topLogprobs ?? target.topLogprobs;\n ret.thinkingLevel =\n options?.thinkingLevel ?? params?.thinkingLevel ?? target?.thinkingLevel;\n ret.reasoningLevel =\n options?.reasoningLevel ?? params?.reasoningLevel ?? target?.reasoningLevel;\n ret.convertSystemMessageToHumanContent =\n options?.convertSystemMessageToHumanContent ??\n params?.convertSystemMessageToHumanContent ??\n target?.convertSystemMessageToHumanContent;\n ret.responseMimeType =\n options?.responseMimeType ??\n params?.responseMimeType ??\n target?.responseMimeType;\n ret.responseSchema =\n options?.responseSchema ?? params?.responseSchema ?? target?.responseSchema;\n ret.responseModalities =\n options?.responseModalities ??\n params?.responseModalities ??\n target?.responseModalities;\n ret.speechConfig = normalizeSpeechConfig(\n options?.speechConfig ?? params?.speechConfig ?? target?.speechConfig\n );\n ret.streaming = options?.streaming ?? params?.streaming ?? target?.streaming;\n const toolChoice = processToolChoice(\n options?.tool_choice,\n options?.allowed_function_names\n );\n if (toolChoice) {\n ret.tool_choice = toolChoice.tool_choice;\n ret.allowed_function_names = toolChoice.allowed_function_names;\n }\n\n const tools = options?.tools;\n if (tools) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n ret.tools = convertToGeminiTools(tools as Record<string, any>[]);\n }\n\n if (options?.cachedContent) {\n ret.cachedContent = options.cachedContent;\n }\n\n ret.labels = options?.labels ?? params?.labels ?? target?.labels;\n\n return ret;\n}\n\nexport function modelToFamily(\n modelName: string | undefined\n): VertexModelFamily {\n if (!modelName) {\n return null;\n } else if (isModelGemini(modelName)) {\n return \"gemini\";\n } else if (isModelGemma(modelName)) {\n return \"gemma\";\n } else if (isModelClaude(modelName)) {\n return \"claude\";\n } else {\n return null;\n }\n}\n\nexport function modelToPublisher(modelName: string | undefined): string {\n const family = modelToFamily(modelName);\n switch (family) {\n case \"gemini\":\n case \"gemma\":\n case \"palm\":\n return \"google\";\n\n case \"claude\":\n return \"anthropic\";\n\n default:\n return \"unknown\";\n }\n}\n\nexport function validateModelParams(\n params: GoogleAIModelParams | undefined\n): void {\n const testParams: GoogleAIModelParams = params ?? {};\n const model = testParams.model ?? testParams.modelName;\n switch (modelToFamily(model)) {\n case \"gemini\":\n case \"gemma\": // TODO: Are we sure?\n return validateGeminiParams(testParams);\n\n case \"claude\":\n return validateClaudeParams(testParams);\n\n default:\n throw new Error(\n `Unable to verify model params: ${JSON.stringify(params)}`\n );\n }\n}\n\nexport function copyAndValidateModelParamsInto(\n params: GoogleAIModelParams | undefined,\n target: GoogleAIModelParams\n): GoogleAIModelParams {\n copyAIModelParamsInto(params, undefined, target);\n validateModelParams(target);\n return target;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":[],"sources":["../../src/utils/common.ts"],"sourcesContent":["import { isOpenAITool } from \"@langchain/core/language_models/base\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport {\n isModelGemini,\n isModelGemma,\n normalizeSpeechConfig,\n validateGeminiParams,\n} from \"./gemini.js\";\nimport {\n GeminiFunctionDeclaration,\n GeminiFunctionSchema,\n GeminiTool,\n GeminiToolAttributes,\n GoogleAIBaseLanguageModelCallOptions,\n GoogleAIModelParams,\n GoogleAIModelRequestParams,\n GoogleAIToolType,\n VertexModelFamily,\n} from \"../types.js\";\nimport {\n jsonSchemaToGeminiParameters,\n schemaToGeminiParameters,\n} from \"./zod_to_gemini_parameters.js\";\nimport { isModelClaude, validateClaudeParams } from \"./anthropic.js\";\n\nexport function copyAIModelParams(\n params: GoogleAIModelParams | undefined,\n options: GoogleAIBaseLanguageModelCallOptions | undefined\n): GoogleAIModelRequestParams {\n return copyAIModelParamsInto(params, options, {});\n}\n\nfunction processToolChoice(\n toolChoice: GoogleAIBaseLanguageModelCallOptions[\"tool_choice\"],\n allowedFunctionNames: GoogleAIBaseLanguageModelCallOptions[\"allowed_function_names\"]\n):\n | {\n tool_choice: \"any\" | \"auto\" | \"none\";\n allowed_function_names?: string[];\n }\n | undefined {\n if (!toolChoice) {\n if (allowedFunctionNames) {\n // Allowed func names is passed, return 'any' so it forces the model to use a tool.\n return {\n tool_choice: \"any\",\n allowed_function_names: allowedFunctionNames,\n };\n }\n return undefined;\n }\n\n if (toolChoice === \"any\" || toolChoice === \"auto\" || toolChoice === \"none\") {\n return {\n tool_choice: toolChoice,\n allowed_function_names: allowedFunctionNames,\n };\n }\n if (typeof toolChoice === \"string\") {\n // String representing the function name.\n // Return any to force the model to predict the specified function call.\n return {\n tool_choice: \"any\",\n allowed_function_names: [...(allowedFunctionNames ?? []), toolChoice],\n };\n }\n throw new Error(\"Object inputs for tool_choice not supported.\");\n}\n\nfunction isGeminiTool(tool: GoogleAIToolType): tool is GeminiTool {\n for (const toolAttribute of GeminiToolAttributes) {\n if (toolAttribute in tool) {\n return true;\n }\n }\n return false;\n}\n\nfunction isGeminiNonFunctionTool(tool: GoogleAIToolType): tool is GeminiTool {\n return isGeminiTool(tool) && !(\"functionDeclaration\" in tool);\n}\n\nexport function convertToGeminiTools(tools: GoogleAIToolType[]): GeminiTool[] {\n const geminiTools: GeminiTool[] = [];\n let functionDeclarationsIndex = -1;\n tools.forEach((tool) => {\n if (isGeminiNonFunctionTool(tool)) {\n geminiTools.push(tool);\n } else {\n if (functionDeclarationsIndex === -1) {\n geminiTools.push({\n functionDeclarations: [],\n });\n functionDeclarationsIndex = geminiTools.length - 1;\n }\n if (\n \"functionDeclarations\" in tool &&\n Array.isArray(tool.functionDeclarations)\n ) {\n const funcs: GeminiFunctionDeclaration[] = tool.functionDeclarations;\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push(\n ...funcs\n );\n } else if (isLangChainTool(tool)) {\n try {\n const jsonSchema = schemaToGeminiParameters(tool.schema);\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push({\n name: tool.name,\n description: tool.description ?? `A function available to call.`,\n parameters: jsonSchema as GeminiFunctionSchema,\n });\n } catch (error) {\n const errorMessage =\n error && typeof error === \"object\" && \"message\" in error\n ? String(error.message)\n : String(error);\n throw new Error(\n `Failed to convert tool '${tool.name}' schema for Gemini: ${errorMessage}. `\n );\n }\n } else if (isOpenAITool(tool)) {\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push({\n name: tool.function.name,\n description:\n tool.function.description ?? `A function available to call.`,\n parameters: jsonSchemaToGeminiParameters(tool.function.parameters),\n });\n } else {\n throw new Error(`Received invalid tool: ${JSON.stringify(tool)}`);\n }\n }\n });\n return geminiTools;\n}\n\nfunction reasoningEffortToReasoningTokens(\n _modelName?: string,\n effort?: string\n): number | undefined {\n if (effort === undefined) {\n return undefined;\n }\n const maxEffort = 24 * 1024; // Max for Gemini 2.5 Flash\n switch (effort) {\n case \"low\":\n // Defined as 1k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 1024;\n case \"medium\":\n // Defined as 8k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 8 * 1024;\n case \"high\":\n return maxEffort;\n default:\n return undefined;\n }\n}\n\nexport function copyAIModelParamsInto(\n params: GoogleAIModelParams | undefined,\n options: GoogleAIBaseLanguageModelCallOptions | undefined,\n target: GoogleAIModelParams\n): GoogleAIModelRequestParams {\n const ret: GoogleAIModelRequestParams = target || {};\n const model = options?.model ?? params?.model ?? target.model;\n ret.modelName =\n model ?? options?.modelName ?? params?.modelName ?? target.modelName;\n ret.model = model;\n ret.temperature =\n options?.temperature ?? params?.temperature ?? target.temperature;\n ret.maxOutputTokens =\n options?.maxOutputTokens ??\n params?.maxOutputTokens ??\n target.maxOutputTokens;\n ret.maxReasoningTokens =\n options?.maxReasoningTokens ??\n params?.maxReasoningTokens ??\n target?.maxReasoningTokens ??\n options?.thinkingBudget ??\n params?.thinkingBudget ??\n target?.thinkingBudget ??\n reasoningEffortToReasoningTokens(ret.modelName, params?.reasoningEffort) ??\n reasoningEffortToReasoningTokens(ret.modelName, target?.reasoningEffort) ??\n reasoningEffortToReasoningTokens(ret.modelName, options?.reasoningEffort);\n ret.topP = options?.topP ?? params?.topP ?? target.topP;\n ret.topK = options?.topK ?? params?.topK ?? target.topK;\n ret.seed = options?.seed ?? params?.seed ?? target.seed;\n ret.presencePenalty =\n options?.presencePenalty ??\n params?.presencePenalty ??\n target.presencePenalty;\n ret.frequencyPenalty =\n options?.frequencyPenalty ??\n params?.frequencyPenalty ??\n target.frequencyPenalty;\n ret.stopSequences =\n options?.stopSequences ?? params?.stopSequences ?? target.stopSequences;\n ret.safetySettings =\n options?.safetySettings ?? params?.safetySettings ?? target.safetySettings;\n ret.logprobs = options?.logprobs ?? params?.logprobs ?? target.logprobs;\n ret.topLogprobs =\n options?.topLogprobs ?? params?.topLogprobs ?? target.topLogprobs;\n ret.thinkingLevel =\n options?.thinkingLevel ?? params?.thinkingLevel ?? target?.thinkingLevel;\n ret.reasoningLevel =\n options?.reasoningLevel ?? params?.reasoningLevel ?? target?.reasoningLevel;\n ret.convertSystemMessageToHumanContent =\n options?.convertSystemMessageToHumanContent ??\n params?.convertSystemMessageToHumanContent ??\n target?.convertSystemMessageToHumanContent;\n ret.responseMimeType =\n options?.responseMimeType ??\n params?.responseMimeType ??\n target?.responseMimeType;\n ret.responseSchema =\n options?.responseSchema ?? params?.responseSchema ?? target?.responseSchema;\n ret.responseModalities =\n options?.responseModalities ??\n params?.responseModalities ??\n target?.responseModalities;\n ret.speechConfig = normalizeSpeechConfig(\n options?.speechConfig ?? params?.speechConfig ?? target?.speechConfig\n );\n ret.streaming = options?.streaming ?? params?.streaming ?? target?.streaming;\n const toolChoice = processToolChoice(\n options?.tool_choice,\n options?.allowed_function_names\n );\n if (toolChoice) {\n ret.tool_choice = toolChoice.tool_choice;\n ret.allowed_function_names = toolChoice.allowed_function_names;\n }\n\n const tools = options?.tools;\n if (tools) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n ret.tools = convertToGeminiTools(tools as Record<string, any>[]);\n }\n\n if (options?.cachedContent) {\n ret.cachedContent = options.cachedContent;\n }\n\n ret.labels = options?.labels ?? params?.labels ?? target?.labels;\n\n return ret;\n}\n\nexport function modelToFamily(\n modelName: string | undefined\n): VertexModelFamily {\n if (!modelName) {\n return null;\n } else if (isModelGemini(modelName)) {\n return \"gemini\";\n } else if (isModelGemma(modelName)) {\n return \"gemma\";\n } else if (isModelClaude(modelName)) {\n return \"claude\";\n } else {\n return null;\n }\n}\n\nexport function modelToPublisher(modelName: string | undefined): string {\n const family = modelToFamily(modelName);\n switch (family) {\n case \"gemini\":\n case \"gemma\":\n case \"palm\":\n return \"google\";\n\n case \"claude\":\n return \"anthropic\";\n\n default:\n return \"unknown\";\n }\n}\n\nexport function validateModelParams(\n params: GoogleAIModelParams | undefined\n): void {\n const testParams: GoogleAIModelParams = params ?? {};\n const model = testParams.model ?? testParams.modelName;\n switch (modelToFamily(model)) {\n case \"gemini\":\n case \"gemma\": // TODO: Are we sure?\n return validateGeminiParams(testParams);\n\n case \"claude\":\n return validateClaudeParams(testParams);\n\n default:\n throw new Error(\n `Unable to verify model params: ${JSON.stringify(params)}`\n );\n }\n}\n\nexport function copyAndValidateModelParamsInto(\n params: GoogleAIModelParams | undefined,\n target: GoogleAIModelParams\n): GoogleAIModelParams {\n copyAIModelParamsInto(params, undefined, target);\n validateModelParams(target);\n return target;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"common.js","names":[],"sources":["../../src/utils/common.ts"],"sourcesContent":["import { isOpenAITool } from \"@langchain/core/language_models/base\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport {\n isModelGemini,\n isModelGemma,\n normalizeSpeechConfig,\n validateGeminiParams,\n} from \"./gemini.js\";\nimport {\n GeminiFunctionDeclaration,\n GeminiFunctionSchema,\n GeminiTool,\n GeminiToolAttributes,\n GoogleAIBaseLanguageModelCallOptions,\n GoogleAIModelParams,\n GoogleAIModelRequestParams,\n GoogleAIToolType,\n VertexModelFamily,\n} from \"../types.js\";\nimport {\n jsonSchemaToGeminiParameters,\n schemaToGeminiParameters,\n} from \"./zod_to_gemini_parameters.js\";\nimport { isModelClaude, validateClaudeParams } from \"./anthropic.js\";\n\nexport function copyAIModelParams(\n params: GoogleAIModelParams | undefined,\n options: GoogleAIBaseLanguageModelCallOptions | undefined\n): GoogleAIModelRequestParams {\n return copyAIModelParamsInto(params, options, {});\n}\n\nfunction processToolChoice(\n toolChoice: GoogleAIBaseLanguageModelCallOptions[\"tool_choice\"],\n allowedFunctionNames: GoogleAIBaseLanguageModelCallOptions[\"allowed_function_names\"]\n):\n | {\n tool_choice: \"any\" | \"auto\" | \"none\";\n allowed_function_names?: string[];\n }\n | undefined {\n if (!toolChoice) {\n if (allowedFunctionNames) {\n // Allowed func names is passed, return 'any' so it forces the model to use a tool.\n return {\n tool_choice: \"any\",\n allowed_function_names: allowedFunctionNames,\n };\n }\n return undefined;\n }\n\n if (toolChoice === \"any\" || toolChoice === \"auto\" || toolChoice === \"none\") {\n return {\n tool_choice: toolChoice,\n allowed_function_names: allowedFunctionNames,\n };\n }\n if (typeof toolChoice === \"string\") {\n // String representing the function name.\n // Return any to force the model to predict the specified function call.\n return {\n tool_choice: \"any\",\n allowed_function_names: [...(allowedFunctionNames ?? []), toolChoice],\n };\n }\n throw new Error(\"Object inputs for tool_choice not supported.\");\n}\n\nfunction isGeminiTool(tool: GoogleAIToolType): tool is GeminiTool {\n for (const toolAttribute of GeminiToolAttributes) {\n if (toolAttribute in tool) {\n return true;\n }\n }\n return false;\n}\n\nfunction isGeminiNonFunctionTool(tool: GoogleAIToolType): tool is GeminiTool {\n return isGeminiTool(tool) && !(\"functionDeclaration\" in tool);\n}\n\nexport function convertToGeminiTools(tools: GoogleAIToolType[]): GeminiTool[] {\n const geminiTools: GeminiTool[] = [];\n let functionDeclarationsIndex = -1;\n tools.forEach((tool) => {\n if (isGeminiNonFunctionTool(tool)) {\n geminiTools.push(tool);\n } else {\n if (functionDeclarationsIndex === -1) {\n geminiTools.push({\n functionDeclarations: [],\n });\n functionDeclarationsIndex = geminiTools.length - 1;\n }\n if (\n \"functionDeclarations\" in tool &&\n Array.isArray(tool.functionDeclarations)\n ) {\n const funcs: GeminiFunctionDeclaration[] = tool.functionDeclarations;\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push(\n ...funcs\n );\n } else if (isLangChainTool(tool)) {\n try {\n const jsonSchema = schemaToGeminiParameters(tool.schema);\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push({\n name: tool.name,\n description: tool.description ?? `A function available to call.`,\n parameters: jsonSchema as GeminiFunctionSchema,\n });\n } catch (error) {\n const errorMessage =\n error && typeof error === \"object\" && \"message\" in error\n ? String(error.message)\n : String(error);\n throw new Error(\n `Failed to convert tool '${tool.name}' schema for Gemini: ${errorMessage}. `\n );\n }\n } else if (isOpenAITool(tool)) {\n geminiTools[functionDeclarationsIndex].functionDeclarations!.push({\n name: tool.function.name,\n description:\n tool.function.description ?? `A function available to call.`,\n parameters: jsonSchemaToGeminiParameters(tool.function.parameters),\n });\n } else {\n throw new Error(`Received invalid tool: ${JSON.stringify(tool)}`);\n }\n }\n });\n return geminiTools;\n}\n\nfunction reasoningEffortToReasoningTokens(\n _modelName?: string,\n effort?: string\n): number | undefined {\n if (effort === undefined) {\n return undefined;\n }\n const maxEffort = 24 * 1024; // Max for Gemini 2.5 Flash\n switch (effort) {\n case \"low\":\n // Defined as 1k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 1024;\n case \"medium\":\n // Defined as 8k by https://ai.google.dev/gemini-api/docs/openai#thinking\n return 8 * 1024;\n case \"high\":\n return maxEffort;\n default:\n return undefined;\n }\n}\n\nexport function copyAIModelParamsInto(\n params: GoogleAIModelParams | undefined,\n options: GoogleAIBaseLanguageModelCallOptions | undefined,\n target: GoogleAIModelParams\n): GoogleAIModelRequestParams {\n const ret: GoogleAIModelRequestParams = target || {};\n const model = options?.model ?? params?.model ?? target.model;\n ret.modelName =\n model ?? options?.modelName ?? params?.modelName ?? target.modelName;\n ret.model = model;\n ret.temperature =\n options?.temperature ?? params?.temperature ?? target.temperature;\n ret.maxOutputTokens =\n options?.maxOutputTokens ??\n params?.maxOutputTokens ??\n target.maxOutputTokens;\n ret.maxReasoningTokens =\n options?.maxReasoningTokens ??\n params?.maxReasoningTokens ??\n target?.maxReasoningTokens ??\n options?.thinkingBudget ??\n params?.thinkingBudget ??\n target?.thinkingBudget ??\n reasoningEffortToReasoningTokens(ret.modelName, params?.reasoningEffort) ??\n reasoningEffortToReasoningTokens(ret.modelName, target?.reasoningEffort) ??\n reasoningEffortToReasoningTokens(ret.modelName, options?.reasoningEffort);\n ret.topP = options?.topP ?? params?.topP ?? target.topP;\n ret.topK = options?.topK ?? params?.topK ?? target.topK;\n ret.seed = options?.seed ?? params?.seed ?? target.seed;\n ret.presencePenalty =\n options?.presencePenalty ??\n params?.presencePenalty ??\n target.presencePenalty;\n ret.frequencyPenalty =\n options?.frequencyPenalty ??\n params?.frequencyPenalty ??\n target.frequencyPenalty;\n ret.stopSequences =\n options?.stopSequences ?? params?.stopSequences ?? target.stopSequences;\n ret.safetySettings =\n options?.safetySettings ?? params?.safetySettings ?? target.safetySettings;\n ret.logprobs = options?.logprobs ?? params?.logprobs ?? target.logprobs;\n ret.topLogprobs =\n options?.topLogprobs ?? params?.topLogprobs ?? target.topLogprobs;\n ret.thinkingLevel =\n options?.thinkingLevel ?? params?.thinkingLevel ?? target?.thinkingLevel;\n ret.reasoningLevel =\n options?.reasoningLevel ?? params?.reasoningLevel ?? target?.reasoningLevel;\n ret.convertSystemMessageToHumanContent =\n options?.convertSystemMessageToHumanContent ??\n params?.convertSystemMessageToHumanContent ??\n target?.convertSystemMessageToHumanContent;\n ret.responseMimeType =\n options?.responseMimeType ??\n params?.responseMimeType ??\n target?.responseMimeType;\n ret.responseSchema =\n options?.responseSchema ?? params?.responseSchema ?? target?.responseSchema;\n ret.responseModalities =\n options?.responseModalities ??\n params?.responseModalities ??\n target?.responseModalities;\n ret.speechConfig = normalizeSpeechConfig(\n options?.speechConfig ?? params?.speechConfig ?? target?.speechConfig\n );\n ret.streaming = options?.streaming ?? params?.streaming ?? target?.streaming;\n const toolChoice = processToolChoice(\n options?.tool_choice,\n options?.allowed_function_names\n );\n if (toolChoice) {\n ret.tool_choice = toolChoice.tool_choice;\n ret.allowed_function_names = toolChoice.allowed_function_names;\n }\n\n const tools = options?.tools;\n if (tools) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n ret.tools = convertToGeminiTools(tools as Record<string, any>[]);\n }\n\n if (options?.cachedContent) {\n ret.cachedContent = options.cachedContent;\n }\n\n ret.labels = options?.labels ?? params?.labels ?? target?.labels;\n\n return ret;\n}\n\nexport function modelToFamily(\n modelName: string | undefined\n): VertexModelFamily {\n if (!modelName) {\n return null;\n } else if (isModelGemini(modelName)) {\n return \"gemini\";\n } else if (isModelGemma(modelName)) {\n return \"gemma\";\n } else if (isModelClaude(modelName)) {\n return \"claude\";\n } else {\n return null;\n }\n}\n\nexport function modelToPublisher(modelName: string | undefined): string {\n const family = modelToFamily(modelName);\n switch (family) {\n case \"gemini\":\n case \"gemma\":\n case \"palm\":\n return \"google\";\n\n case \"claude\":\n return \"anthropic\";\n\n default:\n return \"unknown\";\n }\n}\n\nexport function validateModelParams(\n params: GoogleAIModelParams | undefined\n): void {\n const testParams: GoogleAIModelParams = params ?? {};\n const model = testParams.model ?? testParams.modelName;\n switch (modelToFamily(model)) {\n case \"gemini\":\n case \"gemma\": // TODO: Are we sure?\n return validateGeminiParams(testParams);\n\n case \"claude\":\n return validateClaudeParams(testParams);\n\n default:\n throw new Error(\n `Unable to verify model params: ${JSON.stringify(params)}`\n );\n }\n}\n\nexport function copyAndValidateModelParamsInto(\n params: GoogleAIModelParams | undefined,\n target: GoogleAIModelParams\n): GoogleAIModelParams {\n copyAIModelParamsInto(params, undefined, target);\n validateModelParams(target);\n return target;\n}\n"],"mappings":"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"}
@@ -386,10 +386,10 @@ function getGeminiAPI(config) {
386
386
  return config?.useSystemInstruction ? roleMessageToContent("system", message) : [...await roleMessageToContent("user", message), ...await roleMessageToContent("model", new _langchain_core_messages.AIMessage("Ok"))];
387
387
  }
388
388
  function toolMessageToContent(message, prevMessage) {
389
- const contentStr = typeof message.content === "string" ? message.content : message.content.reduce((acc, content) => {
389
+ const contentStr = typeof message.content === "string" ? message.content : Array.isArray(message.content) ? message.content.reduce((acc, content) => {
390
390
  if (content.type === "text") return acc + content.text;
391
391
  else return acc;
392
- }, "");
392
+ }, "") : JSON.stringify(message.content);
393
393
  const responseName = ((0, _langchain_core_messages.isAIMessage)(prevMessage) && !!prevMessage.tool_calls?.length ? prevMessage.tool_calls[0].name : prevMessage.name) ?? message.tool_call_id;
394
394
  try {
395
395
  return [{
@@ -961,27 +961,50 @@ function getGeminiAPI(config) {
961
961
  if (langChainTools.length > 0) result.push({ functionDeclarations: langChainTools.map(structuredToolToFunctionDeclaration) });
962
962
  return result;
963
963
  }
964
- function formatToolConfig(parameters) {
965
- if (!parameters.tool_choice || typeof parameters.tool_choice !== "string") return;
966
- if ([
964
+ /**
965
+ * Checks whether the tools array contains a mix of server-side built-in
966
+ * tools (e.g. googleSearch, codeExecution) and function declarations.
967
+ * The Gemini API requires `toolConfig.includeServerSideToolInvocations`
968
+ * in that case, otherwise it returns HTTP 400.
969
+ * See https://ai.google.dev/gemini-api/docs/tool-combination
970
+ */
971
+ function mixesBuiltinAndFunctionTools(tools) {
972
+ let hasBuiltin = false;
973
+ let hasFunctionDeclarations = false;
974
+ for (const tool of tools) {
975
+ if (tool.functionDeclarations && tool.functionDeclarations.length > 0) hasFunctionDeclarations = true;
976
+ else hasBuiltin = true;
977
+ if (hasBuiltin && hasFunctionDeclarations) return true;
978
+ }
979
+ return false;
980
+ }
981
+ function formatToolConfig(parameters, tools) {
982
+ const needsServerSideToolInvocations = tools && tools.length > 1 && mixesBuiltinAndFunctionTools(tools);
983
+ let config;
984
+ if (parameters.tool_choice && typeof parameters.tool_choice === "string") if ([
967
985
  "auto",
968
986
  "any",
969
987
  "none"
970
- ].includes(parameters.tool_choice)) return { functionCallingConfig: {
988
+ ].includes(parameters.tool_choice)) config = { functionCallingConfig: {
971
989
  mode: parameters.tool_choice,
972
990
  allowedFunctionNames: parameters.allowed_function_names
973
991
  } };
974
- return { functionCallingConfig: {
992
+ else config = { functionCallingConfig: {
975
993
  mode: "any",
976
994
  allowedFunctionNames: [parameters.tool_choice]
977
995
  } };
996
+ if (needsServerSideToolInvocations) {
997
+ config = config ?? {};
998
+ config.includeServerSideToolInvocations = true;
999
+ }
1000
+ return config;
978
1001
  }
979
1002
  async function formatData(input, parameters) {
980
1003
  const typedInput = input;
981
1004
  const contents = await formatContents(typedInput, parameters);
982
1005
  const generationConfig = formatGenerationConfig(parameters);
983
1006
  const tools = formatTools(parameters);
984
- const toolConfig = formatToolConfig(parameters);
1007
+ const toolConfig = formatToolConfig(parameters, tools);
985
1008
  const safetySettings = formatSafetySettings(parameters);
986
1009
  const systemInstruction = await formatSystemInstruction(typedInput);
987
1010
  const ret = {