{"version":3,"file":"tools.cjs","names":["convertToGenerativeAITools","removeAdditionalProperties","FunctionCallingMode"],"sources":["../../src/utils/tools.ts"],"sourcesContent":["import {\n  Tool as GenerativeAITool,\n  ToolConfig,\n  FunctionCallingMode,\n  FunctionDeclaration,\n  FunctionDeclarationsTool,\n  FunctionDeclarationSchema,\n} from \"@google/generative-ai\";\nimport { ToolChoice } from \"@langchain/core/language_models/chat_models\";\nimport { StructuredToolInterface } from \"@langchain/core/tools\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport {\n  isOpenAITool,\n  ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport { convertToGenerativeAITools } from \"./common.js\";\nimport { GoogleGenerativeAIToolType } from \"../types.js\";\nimport { removeAdditionalProperties } from \"./zod_to_genai_parameters.js\";\n\nexport function convertToolsToGenAI(\n  tools: GoogleGenerativeAIToolType[],\n  extra?: {\n    toolChoice?: ToolChoice;\n    allowedFunctionNames?: string[];\n  }\n): {\n  tools: GenerativeAITool[];\n  toolConfig?: ToolConfig;\n} {\n  // Extract function declaration processing to a separate function\n  const genAITools = processTools(tools);\n\n  // Simplify tool config creation\n  const toolConfig = createToolConfig(genAITools, extra);\n\n  return { tools: genAITools, toolConfig };\n}\n\nfunction processTools(tools: GoogleGenerativeAIToolType[]): GenerativeAITool[] {\n  let functionDeclarationTools: FunctionDeclaration[] = [];\n  const genAITools: GenerativeAITool[] = [];\n\n  tools.forEach((tool) => {\n    if (isLangChainTool(tool)) {\n      const [convertedTool] = convertToGenerativeAITools([\n        tool as StructuredToolInterface,\n      ]);\n      if (convertedTool.functionDeclarations) {\n        functionDeclarationTools.push(...convertedTool.functionDeclarations);\n      }\n    } else if (isOpenAITool(tool)) {\n      const { functionDeclarations } = convertOpenAIToolToGenAI(tool);\n      if (functionDeclarations) {\n        functionDeclarationTools.push(...functionDeclarations);\n      } else {\n        throw new Error(\n          \"Failed to convert OpenAI structured tool to GenerativeAI tool\"\n        );\n      }\n    } else {\n      genAITools.push(tool as GenerativeAITool);\n    }\n  });\n\n  const genAIFunctionDeclaration = genAITools.find(\n    (t) => \"functionDeclarations\" in t\n  );\n  if (genAIFunctionDeclaration) {\n    return genAITools.map((tool) => {\n      if (\n        functionDeclarationTools?.length > 0 &&\n        \"functionDeclarations\" in tool\n      ) {\n        const newTool = {\n          functionDeclarations: [\n            ...(tool.functionDeclarations || []),\n            ...functionDeclarationTools,\n          ],\n        };\n        // Clear the functionDeclarationTools array so it is not passed again\n        functionDeclarationTools = [];\n        return newTool;\n      }\n      return tool;\n    });\n  }\n\n  return [\n    ...genAITools,\n    ...(functionDeclarationTools.length > 0\n      ? [\n          {\n            functionDeclarations: functionDeclarationTools,\n          },\n        ]\n      : []),\n  ];\n}\n\nfunction convertOpenAIToolToGenAI(\n  tool: ToolDefinition\n): FunctionDeclarationsTool {\n  return {\n    functionDeclarations: [\n      {\n        name: tool.function.name,\n        description: tool.function.description,\n        parameters: removeAdditionalProperties(\n          tool.function.parameters\n        ) as FunctionDeclarationSchema,\n      },\n    ],\n  };\n}\n\nfunction createToolConfig(\n  genAITools: GenerativeAITool[],\n  extra?: {\n    toolChoice?: ToolChoice;\n    allowedFunctionNames?: string[];\n  }\n): ToolConfig | undefined {\n  if (!genAITools.length || !extra) return undefined;\n\n  const { toolChoice, allowedFunctionNames } = extra;\n\n  const modeMap: Record<string, FunctionCallingMode> = {\n    any: FunctionCallingMode.ANY,\n    auto: FunctionCallingMode.AUTO,\n    none: FunctionCallingMode.NONE,\n  };\n\n  if (toolChoice && [\"any\", \"auto\", \"none\"].includes(toolChoice as string)) {\n    return {\n      functionCallingConfig: {\n        mode: modeMap[toolChoice as keyof typeof modeMap] ?? \"MODE_UNSPECIFIED\",\n        allowedFunctionNames,\n      },\n    };\n  }\n\n  if (typeof toolChoice === \"string\" || allowedFunctionNames) {\n    return {\n      functionCallingConfig: {\n        mode: FunctionCallingMode.ANY,\n        allowedFunctionNames: [\n          ...(allowedFunctionNames ?? []),\n          ...(toolChoice && typeof toolChoice === \"string\" ? [toolChoice] : []),\n        ],\n      },\n    };\n  }\n\n  return undefined;\n}\n"],"mappings":";;;;;;AAmBA,SAAgB,oBACd,OACA,OAOA;CAEA,MAAM,aAAa,aAAa,MAAM;AAKtC,QAAO;EAAE,OAAO;EAAY,YAFT,iBAAiB,YAAY,MAAM;EAEd;;AAG1C,SAAS,aAAa,OAAyD;CAC7E,IAAI,2BAAkD,EAAE;CACxD,MAAM,aAAiC,EAAE;AAEzC,OAAM,SAAS,SAAS;AACtB,OAAA,GAAA,uCAAA,iBAAoB,KAAK,EAAE;GACzB,MAAM,CAAC,iBAAiBA,eAAAA,2BAA2B,CACjD,KACD,CAAC;AACF,OAAI,cAAc,qBAChB,0BAAyB,KAAK,GAAG,cAAc,qBAAqB;oEAEhD,KAAK,EAAE;GAC7B,MAAM,EAAE,yBAAyB,yBAAyB,KAAK;AAC/D,OAAI,qBACF,0BAAyB,KAAK,GAAG,qBAAqB;OAEtD,OAAM,IAAI,MACR,gEACD;QAGH,YAAW,KAAK,KAAyB;GAE3C;AAKF,KAHiC,WAAW,MACzC,MAAM,0BAA0B,EAClC,CAEC,QAAO,WAAW,KAAK,SAAS;AAC9B,MACE,0BAA0B,SAAS,KACnC,0BAA0B,MAC1B;GACA,MAAM,UAAU,EACd,sBAAsB,CACpB,GAAI,KAAK,wBAAwB,EAAE,EACnC,GAAG,yBACJ,EACF;AAED,8BAA2B,EAAE;AAC7B,UAAO;;AAET,SAAO;GACP;AAGJ,QAAO,CACL,GAAG,YACH,GAAI,yBAAyB,SAAS,IAClC,CACE,EACE,sBAAsB,0BACvB,CACF,GACD,EAAE,CACP;;AAGH,SAAS,yBACP,MAC0B;AAC1B,QAAO,EACL,sBAAsB,CACpB;EACE,MAAM,KAAK,SAAS;EACpB,aAAa,KAAK,SAAS;EAC3B,YAAYC,gCAAAA,2BACV,KAAK,SAAS,WACf;EACF,CACF,EACF;;AAGH,SAAS,iBACP,YACA,OAIwB;AACxB,KAAI,CAAC,WAAW,UAAU,CAAC,MAAO,QAAO,KAAA;CAEzC,MAAM,EAAE,YAAY,yBAAyB;CAE7C,MAAM,UAA+C;EACnD,KAAKC,sBAAAA,oBAAoB;EACzB,MAAMA,sBAAAA,oBAAoB;EAC1B,MAAMA,sBAAAA,oBAAoB;EAC3B;AAED,KAAI,cAAc;EAAC;EAAO;EAAQ;EAAO,CAAC,SAAS,WAAqB,CACtE,QAAO,EACL,uBAAuB;EACrB,MAAM,QAAQ,eAAuC;EACrD;EACD,EACF;AAGH,KAAI,OAAO,eAAe,YAAY,qBACpC,QAAO,EACL,uBAAuB;EACrB,MAAMA,sBAAAA,oBAAoB;EAC1B,sBAAsB,CACpB,GAAI,wBAAwB,EAAE,EAC9B,GAAI,cAAc,OAAO,eAAe,WAAW,CAAC,WAAW,GAAG,EAAE,CACrE;EACF,EACF"}