{"version":3,"file":"common.cjs","names":["ChatMessage","isAIMessage","parseBase64DataUrl","isDataContentBlock","convertToProviderContentBlock","isToolMessage","isBaseMessage","EmptyContentError","uuidv4","AIMessage","ChatGenerationChunk","AIMessageChunk","isLangChainTool","schemaToGenerativeAIParameters","isOpenAITool","jsonSchemaToGeminiParameters"],"sources":["../../src/utils/common.ts"],"sourcesContent":["import {\n  EnhancedGenerateContentResponse,\n  Content,\n  Part,\n  type FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool,\n  type FunctionDeclaration as GenerativeAIFunctionDeclaration,\n  POSSIBLE_ROLES,\n  FunctionCallPart,\n  TextPart,\n  FileDataPart,\n  InlineDataPart,\n  type GenerateContentResponse,\n} from \"@google/generative-ai\";\nimport {\n  AIMessage,\n  AIMessageChunk,\n  BaseMessage,\n  ChatMessage,\n  ContentBlock,\n  ToolMessage,\n  ToolMessageChunk,\n  MessageContent,\n  MessageContentComplex,\n  UsageMetadata,\n  isAIMessage,\n  isBaseMessage,\n  isToolMessage,\n  StandardContentBlockConverter,\n  parseBase64DataUrl,\n  convertToProviderContentBlock,\n  isDataContentBlock,\n  InputTokenDetails,\n} from \"@langchain/core/messages\";\nimport {\n  ChatGeneration,\n  ChatGenerationChunk,\n  ChatResult,\n} from \"@langchain/core/outputs\";\nimport { isLangChainTool } from \"@langchain/core/utils/function_calling\";\nimport { isOpenAITool } from \"@langchain/core/language_models/base\";\nimport { ToolCallChunk } from \"@langchain/core/messages/tool\";\nimport { v4 as uuidv4 } from \"@langchain/core/utils/uuid\";\nimport {\n  jsonSchemaToGeminiParameters,\n  schemaToGenerativeAIParameters,\n} from \"./zod_to_genai_parameters.js\";\nimport {\n  GoogleGenerativeAIPart,\n  GoogleGenerativeAIToolType,\n} from \"../types.js\";\nimport { assertNoEmptyStringEnums } from \"./validate_schema.js\";\nimport { EmptyContentError } from \"./errors.js\";\n\nexport const _FUNCTION_CALL_THOUGHT_SIGNATURES_MAP_KEY =\n  \"__gemini_function_call_thought_signatures__\";\nconst DUMMY_SIGNATURE =\n  \"ErYCCrMCAdHtim9kOoOkrPiCNVsmlpMIKd7ZMxgiFbVQOkgp7nlLcDMzVsZwIzvuT7nQROivoXA72ccC2lSDvR0Gh7dkWaGuj7ctv6t7ZceHnecx0QYa+ix8tYpRfjhyWozQ49lWiws6+YGjCt10KRTyWsZ2h6O7iHTYJwKIRwGUHRKy/qK/6kFxJm5ML00gLq4D8s5Z6DBpp2ZlR+uF4G8jJgeWQgyHWVdx2wGYElaceVAc66tZdPQRdOHpWtgYSI1YdaXgVI8KHY3/EfNc2YqqMIulvkDBAnuMhkAjV9xmBa54Tq+ih3Im4+r3DzqhGqYdsSkhS0kZMwte4Hjs65dZzCw9lANxIqYi1DJ639WNPYihp/DCJCos7o+/EeSPJaio5sgWDyUnMGkY1atsJZ+m7pj7DD5tvQ==\";\n\nconst iife = (fn: () => string) => fn();\n\nexport function getMessageAuthor(message: BaseMessage) {\n  if (ChatMessage.isInstance(message)) {\n    return message.role;\n  }\n  return message.type;\n}\n\n/**\n * Maps a message type to a Google Generative AI chat author.\n * @param message The message to map.\n * @param model The model to use for mapping.\n * @returns The message type mapped to a Google Generative AI chat author.\n */\nexport function convertAuthorToRole(\n  author: string\n): (typeof POSSIBLE_ROLES)[number] {\n  switch (author) {\n    /**\n     *  Note: Gemini currently is not supporting system messages\n     *  we will convert them to human messages and merge with following\n     * */\n    case \"supervisor\":\n    case \"ai\":\n    case \"model\":\n      return \"model\";\n    case \"system\":\n      return \"system\";\n    case \"human\":\n      return \"user\";\n    case \"tool\":\n    case \"function\":\n      return \"function\";\n    default:\n      throw new Error(`Unknown / unsupported author: ${author}`);\n  }\n}\n\nfunction messageContentMedia(content: MessageContentComplex): Part {\n  if (\"mimeType\" in content && \"data\" in content) {\n    return {\n      inlineData: {\n        mimeType: content.mimeType,\n        data: content.data,\n      },\n    };\n  }\n  if (\"mimeType\" in content && \"fileUri\" in content) {\n    return {\n      fileData: {\n        mimeType: content.mimeType,\n        fileUri: content.fileUri,\n      },\n    };\n  }\n\n  throw new Error(\"Invalid media content\");\n}\n\nfunction inferToolNameFromPreviousMessages(\n  message: ToolMessage | ToolMessageChunk,\n  previousMessages: BaseMessage[]\n): string | undefined {\n  return previousMessages\n    .map((msg) => {\n      if (isAIMessage(msg)) {\n        return msg.tool_calls ?? [];\n      }\n      return [];\n    })\n    .flat()\n    .find((toolCall) => {\n      return toolCall.id === message.tool_call_id;\n    })?.name;\n}\n\n/**\n * Converts a ContentBlock.Multimodal block (image, video, audio, file)\n * to the appropriate Google Generative AI Part format.\n *\n * Handles three data record variants:\n *  - DataRecordBase64: has `data` property → InlineDataPart\n *  - DataRecordUrl: has `url` property → FileDataPart (or InlineDataPart for data: URLs)\n *  - DataRecordFileId: has `fileId` property → not directly supported, throws\n */\nfunction _multimodalContentBlockToPart(\n  block: ContentBlock.Multimodal.Data,\n  defaultMimeType: string\n): InlineDataPart | FileDataPart {\n  if (\"data\" in block && block.data !== undefined) {\n    // DataRecordBase64: inline base64 data\n    const data =\n      // oxlint-disable-next-line no-instanceof/no-instanceof\n      block.data instanceof Uint8Array\n        ? btoa(String.fromCharCode(...block.data))\n        : block.data;\n    return {\n      inlineData: {\n        mimeType: block.mimeType || defaultMimeType,\n        data,\n      },\n    };\n  }\n\n  if (\"url\" in block && block.url !== undefined) {\n    // DataRecordUrl: check if it's a data: URL first\n    const parsed = parseBase64DataUrl({ dataUrl: block.url });\n    if (parsed) {\n      return {\n        inlineData: {\n          mimeType: parsed.mime_type,\n          data: parsed.data,\n        },\n      };\n    }\n    // Regular URL → fileData\n    return {\n      fileData: {\n        mimeType: block.mimeType || defaultMimeType,\n        fileUri: block.url,\n      },\n    };\n  }\n\n  if (\"fileId\" in block && block.fileId !== undefined) {\n    throw new Error(\n      `ContentBlock.Multimodal fileId is not supported by Google Generative AI. ` +\n        `Use a URL or base64 data instead.`\n    );\n  }\n\n  throw new Error(\n    `Invalid multimodal content block: must have \"data\", \"url\", or \"fileId\" property. ` +\n      `Received: ${JSON.stringify(block)}`\n  );\n}\n\nfunction _getStandardContentBlockConverter(isMultimodalModel: boolean) {\n  const standardContentBlockConverter: StandardContentBlockConverter<{\n    text: TextPart;\n    image: FileDataPart | InlineDataPart;\n    audio: FileDataPart | InlineDataPart;\n    file: FileDataPart | InlineDataPart | TextPart;\n  }> = {\n    providerName: \"Google Gemini\",\n\n    fromStandardTextBlock(block) {\n      return {\n        text: block.text,\n      };\n    },\n\n    fromStandardImageBlock(block): FileDataPart | InlineDataPart {\n      if (!isMultimodalModel) {\n        throw new Error(\"This model does not support images\");\n      }\n      if (block.source_type === \"url\") {\n        const data = parseBase64DataUrl({ dataUrl: block.url });\n        if (data) {\n          return {\n            inlineData: {\n              mimeType: data.mime_type,\n              data: data.data,\n            },\n          };\n        } else {\n          return {\n            fileData: {\n              mimeType: block.mime_type ?? \"\",\n              fileUri: block.url,\n            },\n          };\n        }\n      }\n\n      if (block.source_type === \"base64\") {\n        return {\n          inlineData: {\n            mimeType: block.mime_type ?? \"\",\n            data: block.data,\n          },\n        };\n      }\n\n      throw new Error(`Unsupported source type: ${block.source_type}`);\n    },\n\n    fromStandardAudioBlock(block): FileDataPart | InlineDataPart {\n      if (!isMultimodalModel) {\n        throw new Error(\"This model does not support audio\");\n      }\n      if (block.source_type === \"url\") {\n        const data = parseBase64DataUrl({ dataUrl: block.url });\n        if (data) {\n          return {\n            inlineData: {\n              mimeType: data.mime_type,\n              data: data.data,\n            },\n          };\n        } else {\n          return {\n            fileData: {\n              mimeType: block.mime_type ?? \"\",\n              fileUri: block.url,\n            },\n          };\n        }\n      }\n\n      if (block.source_type === \"base64\") {\n        return {\n          inlineData: {\n            mimeType: block.mime_type ?? \"\",\n            data: block.data,\n          },\n        };\n      }\n\n      throw new Error(`Unsupported source type: ${block.source_type}`);\n    },\n\n    fromStandardFileBlock(block): FileDataPart | InlineDataPart | TextPart {\n      if (!isMultimodalModel) {\n        throw new Error(\"This model does not support files\");\n      }\n      if (block.source_type === \"text\") {\n        return {\n          text: block.text,\n        };\n      }\n      if (block.source_type === \"url\") {\n        const data = parseBase64DataUrl({ dataUrl: block.url });\n        if (data) {\n          return {\n            inlineData: {\n              mimeType: data.mime_type,\n              data: data.data,\n            },\n          };\n        } else {\n          return {\n            fileData: {\n              mimeType: block.mime_type ?? \"\",\n              fileUri: block.url,\n            },\n          };\n        }\n      }\n\n      if (block.source_type === \"base64\") {\n        return {\n          inlineData: {\n            mimeType: block.mime_type ?? \"\",\n            data: block.data,\n          },\n        };\n      }\n      throw new Error(`Unsupported source type: ${block.source_type}`);\n    },\n  };\n  return standardContentBlockConverter;\n}\n\nfunction _convertLangChainContentToPart(\n  content: MessageContentComplex,\n  isMultimodalModel: boolean\n): Part | undefined {\n  if (isDataContentBlock(content)) {\n    return convertToProviderContentBlock(\n      content,\n      _getStandardContentBlockConverter(isMultimodalModel)\n    );\n  }\n\n  if (content.type === \"text\") {\n    return { text: content.text };\n  } else if (content.type === \"executableCode\") {\n    return { executableCode: content.executableCode };\n  } else if (content.type === \"codeExecutionResult\") {\n    return { codeExecutionResult: content.codeExecutionResult };\n  } else if (content.type === \"image_url\") {\n    if (!isMultimodalModel) {\n      throw new Error(`This model does not support images`);\n    }\n    let source;\n    if (typeof content.image_url === \"string\") {\n      source = content.image_url;\n    } else if (\n      typeof content.image_url === \"object\" &&\n      \"url\" in content.image_url\n    ) {\n      source = content.image_url.url;\n    } else {\n      throw new Error(\"Please provide image as base64 encoded data URL\");\n    }\n    const [dm, data] = source.split(\",\");\n    if (!dm.startsWith(\"data:\")) {\n      throw new Error(\"Please provide image as base64 encoded data URL\");\n    }\n\n    const [mimeType, encoding] = dm.replace(/^data:/, \"\").split(\";\");\n    if (encoding !== \"base64\") {\n      throw new Error(\"Please provide image as base64 encoded data URL\");\n    }\n\n    return {\n      inlineData: {\n        data,\n        mimeType,\n      },\n    };\n  } else if (content.type === \"media\") {\n    return messageContentMedia(content);\n  } else if (content.type === \"image\") {\n    return _multimodalContentBlockToPart(\n      content as ContentBlock.Multimodal.Image,\n      \"image/png\"\n    );\n  } else if (content.type === \"video\") {\n    return _multimodalContentBlockToPart(\n      content as ContentBlock.Multimodal.Video,\n      \"video/mp4\"\n    );\n  } else if (content.type === \"audio\") {\n    return _multimodalContentBlockToPart(\n      content as ContentBlock.Multimodal.Audio,\n      \"audio/mpeg\"\n    );\n  } else if (content.type === \"file\") {\n    return _multimodalContentBlockToPart(\n      content as ContentBlock.Multimodal.File,\n      \"application/octet-stream\"\n    );\n  } else if (content.type === \"text-plain\") {\n    // text-plain blocks can have an inline text property\n    if (\n      \"text\" in content &&\n      typeof (content as ContentBlock.Multimodal.PlainText).text === \"string\"\n    ) {\n      return { text: (content as ContentBlock.Multimodal.PlainText).text! };\n    }\n    return _multimodalContentBlockToPart(\n      content as ContentBlock.Multimodal.PlainText,\n      \"text/plain\"\n    );\n  } else if (content.type === \"tool_use\") {\n    return {\n      functionCall: {\n        name: content.name,\n        args: content.input,\n      },\n    };\n  } else if (content.type === \"tool_call\") {\n    return {\n      functionCall: {\n        name: content.name,\n        args: content.args,\n      },\n    };\n  } else if (\n    content.type?.includes(\"/\") &&\n    // Ensure it's a single slash.\n    content.type.split(\"/\").length === 2 &&\n    \"data\" in content &&\n    typeof content.data === \"string\"\n  ) {\n    return {\n      inlineData: {\n        mimeType: content.type,\n        data: content.data,\n      },\n    };\n  } else if (content.type === \"thinking\") {\n    const thinkingContent = content as {\n      type: \"thinking\";\n      thinking: string;\n      signature?: string;\n    };\n    return {\n      text: thinkingContent.thinking,\n      thought: true,\n      ...(thinkingContent.signature\n        ? { thoughtSignature: thinkingContent.signature }\n        : {}),\n    } as Part;\n  } else if (\"functionCall\" in content) {\n    // No action needed here — function calls will be added later from message.tool_calls\n    return undefined;\n  } else {\n    if (\"type\" in content) {\n      throw new Error(`Unknown content type ${content.type}`);\n    } else {\n      throw new Error(`Unknown content ${JSON.stringify(content)}`);\n    }\n  }\n}\n\nexport function convertMessageContentToParts(\n  message: BaseMessage,\n  isMultimodalModel: boolean,\n  previousMessages: BaseMessage[],\n  model?: string\n): Part[] {\n  if (isToolMessage(message)) {\n    const messageName =\n      message.name ??\n      inferToolNameFromPreviousMessages(message, previousMessages);\n    if (messageName === undefined) {\n      throw new Error(\n        `Google requires a tool name for each tool call response, and we could not infer a called tool name for ToolMessage \"${message.id}\" from your passed messages. Please populate a \"name\" field on that ToolMessage explicitly.`\n      );\n    }\n\n    const result = Array.isArray(message.content)\n      ? (message.content\n          .map((c) => _convertLangChainContentToPart(c, isMultimodalModel))\n          .filter((p) => p !== undefined) as Part[])\n      : message.content;\n\n    if (message.status === \"error\") {\n      return [\n        {\n          functionResponse: {\n            name: messageName,\n            // The API expects an object with an `error` field if the function call fails.\n            // `error` must be a valid object (not a string or array), so we wrap `message.content` here\n            response: { error: { details: result } },\n          },\n        },\n      ];\n    }\n\n    return [\n      {\n        functionResponse: {\n          name: messageName,\n          // again, can't have a string or array value for `response`, so we wrap it as an object here\n          response: { result },\n        },\n      },\n    ];\n  }\n\n  let functionCalls: FunctionCallPart[] = [];\n  const messageParts: Part[] = [];\n\n  if (typeof message.content === \"string\" && message.content) {\n    messageParts.push({ text: message.content });\n  }\n\n  if (Array.isArray(message.content)) {\n    messageParts.push(\n      ...(message.content\n        .map((c) => _convertLangChainContentToPart(c, isMultimodalModel))\n        .filter((p) => p !== undefined) as Part[])\n    );\n  }\n\n  const functionThoughtSignatures = message.additional_kwargs?.[\n    _FUNCTION_CALL_THOUGHT_SIGNATURES_MAP_KEY\n  ] as Record<string, string>;\n\n  if (isAIMessage(message) && message.tool_calls?.length) {\n    functionCalls = message.tool_calls.map((tc) => {\n      const thoughtSignature = iife(() => {\n        if (tc.id) {\n          const signature = functionThoughtSignatures?.[tc.id];\n          if (signature) {\n            return signature;\n          }\n        }\n        if (model?.includes(\"gemini-3\")) {\n          return DUMMY_SIGNATURE;\n        }\n        return \"\";\n      });\n      return {\n        functionCall: {\n          name: tc.name,\n          args: tc.args,\n        },\n        ...(thoughtSignature ? { thoughtSignature } : {}),\n      };\n    });\n  }\n\n  return [...messageParts, ...functionCalls];\n}\n\nexport function convertBaseMessagesToContent(\n  messages: BaseMessage[],\n  isMultimodalModel: boolean,\n  convertSystemMessageToHumanContent: boolean = false,\n  model: string\n) {\n  return messages.reduce<{\n    content: Content[];\n    mergeWithPreviousContent: boolean;\n  }>(\n    (acc, message, index) => {\n      if (!isBaseMessage(message)) {\n        throw new Error(\"Unsupported message input\");\n      }\n      const author = getMessageAuthor(message);\n      if (author === \"system\" && index !== 0) {\n        throw new Error(\"System message should be the first one\");\n      }\n      const role = convertAuthorToRole(author);\n\n      const prevContent = acc.content[acc.content.length];\n      if (\n        !acc.mergeWithPreviousContent &&\n        prevContent &&\n        prevContent.role === role\n      ) {\n        throw new Error(\n          \"Google Generative AI requires alternate messages between authors\"\n        );\n      }\n\n      const parts = convertMessageContentToParts(\n        message,\n        isMultimodalModel,\n        messages.slice(0, index),\n        model\n      );\n\n      if (acc.mergeWithPreviousContent) {\n        const prevContent = acc.content[acc.content.length - 1];\n        if (!prevContent) {\n          throw new Error(\n            \"There was a problem parsing your system message. Please try a prompt without one.\"\n          );\n        }\n        prevContent.parts.push(...parts);\n\n        return {\n          mergeWithPreviousContent: false,\n          content: acc.content,\n        };\n      }\n      let actualRole = role;\n      if (\n        actualRole === \"function\" ||\n        (actualRole === \"system\" && !convertSystemMessageToHumanContent)\n      ) {\n        // GenerativeAI API will throw an error if the role is not \"user\" or \"model.\"\n        actualRole = \"user\";\n      }\n      const content: Content = {\n        role: actualRole,\n        parts,\n      };\n      return {\n        mergeWithPreviousContent:\n          author === \"system\" && !convertSystemMessageToHumanContent,\n        content: [...acc.content, content],\n      };\n    },\n    { content: [], mergeWithPreviousContent: false }\n  ).content;\n}\n\nexport function mapGenerateContentResultToChatResult(\n  response: EnhancedGenerateContentResponse,\n  extra?: {\n    usageMetadata: UsageMetadata | undefined;\n  }\n): ChatResult {\n  // if rejected before any candidate was generated, surface why\n  if (\n    !response.candidates ||\n    response.candidates.length === 0 ||\n    !response.candidates[0]\n  ) {\n    throw new EmptyContentError({\n      blockReason: response.promptFeedback?.blockReason,\n    });\n  }\n  const [candidate] = response.candidates;\n  const { content: candidateContent, ...generationInfo } = candidate;\n  if (!candidateContent) {\n    throw new EmptyContentError({\n      finishReason: generationInfo.finishReason,\n    });\n  }\n  const functionCalls = candidateContent.parts?.reduce(\n    (acc, p) => {\n      if (\"functionCall\" in p && p.functionCall) {\n        acc.push({\n          ...p,\n          id:\n            \"id\" in p.functionCall && typeof p.functionCall.id === \"string\"\n              ? p.functionCall.id\n              : uuidv4(),\n        });\n      }\n      return acc;\n    },\n    [] as (FunctionCallPart & { id: string })[]\n  );\n  let content: MessageContent | undefined;\n\n  const parts = candidateContent.parts as GoogleGenerativeAIPart[] | undefined;\n\n  if (\n    Array.isArray(parts) &&\n    parts.length === 1 &&\n    \"text\" in parts[0] &&\n    parts[0].text &&\n    !parts[0].thought\n  ) {\n    content = parts[0].text;\n  } else if (Array.isArray(parts) && parts.length > 0) {\n    content = parts.map((p) => {\n      if (p.thought && \"text\" in p && p.text) {\n        return {\n          type: \"thinking\",\n          thinking: p.text,\n          ...(p.thoughtSignature ? { signature: p.thoughtSignature } : {}),\n        };\n      } else if (\"text\" in p) {\n        return {\n          type: \"text\",\n          text: p.text,\n        };\n      } else if (\"inlineData\" in p) {\n        return {\n          type: \"inlineData\",\n          inlineData: p.inlineData,\n        };\n      } else if (\"functionCall\" in p) {\n        return {\n          type: \"functionCall\",\n          functionCall: p.functionCall,\n        };\n      } else if (\"functionResponse\" in p) {\n        return {\n          type: \"functionResponse\",\n          functionResponse: p.functionResponse,\n        };\n      } else if (\"fileData\" in p) {\n        return {\n          type: \"fileData\",\n          fileData: p.fileData,\n        };\n      } else if (\"executableCode\" in p) {\n        return {\n          type: \"executableCode\",\n          executableCode: p.executableCode,\n        };\n      } else if (\"codeExecutionResult\" in p) {\n        return {\n          type: \"codeExecutionResult\",\n          codeExecutionResult: p.codeExecutionResult,\n        };\n      }\n      return p;\n    });\n  } else {\n    // candidateContent is present but has no parts\n    content = [];\n  }\n\n  const functionThoughtSignatures = functionCalls?.reduce(\n    (acc, fc) => {\n      if (\"thoughtSignature\" in fc && typeof fc.thoughtSignature === \"string\") {\n        acc[fc.id] = fc.thoughtSignature;\n      }\n      return acc;\n    },\n    {} as Record<string, string>\n  );\n\n  let text = \"\";\n  if (typeof content === \"string\") {\n    text = content;\n  } else if (Array.isArray(content) && content.length > 0) {\n    const block = content.find((b) => \"text\" in b) as\n      | { text: string }\n      | undefined;\n    text = block?.text ?? text;\n  }\n\n  const generation: ChatGeneration = {\n    text,\n    message: new AIMessage({\n      content: content ?? \"\",\n      tool_calls: functionCalls?.map((fc) => ({\n        type: \"tool_call\",\n        id: fc.id,\n        name: fc.functionCall.name,\n        args: fc.functionCall.args,\n      })),\n      additional_kwargs: {\n        ...generationInfo,\n        [_FUNCTION_CALL_THOUGHT_SIGNATURES_MAP_KEY]: functionThoughtSignatures,\n      },\n      usage_metadata: extra?.usageMetadata,\n    }),\n    generationInfo,\n  };\n\n  return {\n    generations: [generation],\n    llmOutput: {\n      tokenUsage: {\n        promptTokens: extra?.usageMetadata?.input_tokens,\n        completionTokens: extra?.usageMetadata?.output_tokens,\n        totalTokens: extra?.usageMetadata?.total_tokens,\n      },\n    },\n  };\n}\n\nexport function convertResponseContentToChatGenerationChunk(\n  response: EnhancedGenerateContentResponse,\n  extra: {\n    usageMetadata?: UsageMetadata | undefined;\n    index: number;\n  }\n): ChatGenerationChunk | null {\n  if (!response.candidates || response.candidates.length === 0) {\n    return null;\n  }\n  const [candidate] = response.candidates;\n  const { content: candidateContent, ...generationInfo } = candidate;\n  if (!candidateContent) {\n    // No content on the candidate (e.g. safety/recitation filter triggered\n    // mid-stream, or finishReason is SAFETY/RECITATION/OTHER). Skip this\n    // chunk rather than throwing on candidateContent.parts.\n    return null;\n  }\n  const functionCalls = candidateContent.parts?.reduce(\n    (acc, p) => {\n      if (\"functionCall\" in p && p.functionCall) {\n        acc.push({\n          ...p,\n          id:\n            \"id\" in p.functionCall && typeof p.functionCall.id === \"string\"\n              ? p.functionCall.id\n              : uuidv4(),\n        });\n      }\n      return acc;\n    },\n    [] as (FunctionCallPart & { id: string })[]\n  );\n  let content: MessageContent | undefined;\n  const streamParts = candidateContent.parts as\n    | GoogleGenerativeAIPart[]\n    | undefined;\n\n  // Checks if all parts are plain text (no thought flags). If so, join as string.\n  if (\n    Array.isArray(streamParts) &&\n    streamParts.every((p) => \"text\" in p && !p.thought)\n  ) {\n    content = streamParts.map((p) => p.text).join(\"\");\n  } else if (Array.isArray(streamParts)) {\n    content = streamParts.map((p) => {\n      if (p.thought && \"text\" in p && p.text) {\n        return {\n          type: \"thinking\",\n          thinking: p.text,\n          ...(p.thoughtSignature ? { signature: p.thoughtSignature } : {}),\n        };\n      } else if (\"text\" in p) {\n        return {\n          type: \"text\",\n          text: p.text,\n        };\n      } else if (\"inlineData\" in p) {\n        return {\n          type: \"inlineData\",\n          inlineData: p.inlineData,\n        };\n      } else if (\"functionCall\" in p) {\n        return {\n          type: \"functionCall\",\n          functionCall: p.functionCall,\n        };\n      } else if (\"functionResponse\" in p) {\n        return {\n          type: \"functionResponse\",\n          functionResponse: p.functionResponse,\n        };\n      } else if (\"fileData\" in p) {\n        return {\n          type: \"fileData\",\n          fileData: p.fileData,\n        };\n      } else if (\"executableCode\" in p) {\n        return {\n          type: \"executableCode\",\n          executableCode: p.executableCode,\n        };\n      } else if (\"codeExecutionResult\" in p) {\n        return {\n          type: \"codeExecutionResult\",\n          codeExecutionResult: p.codeExecutionResult,\n        };\n      }\n      return p;\n    });\n  } else {\n    // candidateContent is present but has no parts\n    content = [];\n  }\n\n  let text = \"\";\n  if (content && typeof content === \"string\") {\n    text = content;\n  } else if (Array.isArray(content)) {\n    const block = content.find((b) => \"text\" in b) as\n      | { text: string }\n      | undefined;\n    text = block?.text ?? \"\";\n  }\n\n  const toolCallChunks: ToolCallChunk[] = [];\n  if (functionCalls) {\n    toolCallChunks.push(\n      ...functionCalls.map((fc) => ({\n        type: \"tool_call_chunk\" as const,\n        id: fc.id,\n        name: fc.functionCall.name,\n        args: JSON.stringify(fc.functionCall.args),\n      }))\n    );\n  }\n\n  const functionThoughtSignatures = functionCalls?.reduce(\n    (acc, fc) => {\n      if (\"thoughtSignature\" in fc && typeof fc.thoughtSignature === \"string\") {\n        acc[fc.id] = fc.thoughtSignature;\n      }\n      return acc;\n    },\n    {} as Record<string, string>\n  );\n\n  return new ChatGenerationChunk({\n    text,\n    message: new AIMessageChunk({\n      content: content || \"\",\n      name: candidateContent.role,\n      tool_call_chunks: toolCallChunks,\n      // Each chunk can have unique \"generationInfo\", and merging strategy is unclear,\n      // so leave blank for now.\n      additional_kwargs: {\n        [_FUNCTION_CALL_THOUGHT_SIGNATURES_MAP_KEY]: functionThoughtSignatures,\n      },\n      response_metadata: {\n        model_provider: \"google-genai\",\n      },\n      usage_metadata: extra.usageMetadata,\n    }),\n    generationInfo,\n  });\n}\n\nexport function convertToGenerativeAITools(\n  tools: GoogleGenerativeAIToolType[]\n): GoogleGenerativeAIFunctionDeclarationsTool[] {\n  if (\n    tools.every(\n      (tool) =>\n        \"functionDeclarations\" in tool &&\n        Array.isArray(tool.functionDeclarations)\n    )\n  ) {\n    return tools as GoogleGenerativeAIFunctionDeclarationsTool[];\n  }\n  return [\n    {\n      functionDeclarations: tools.map(\n        (tool): GenerativeAIFunctionDeclaration => {\n          if (isLangChainTool(tool)) {\n            const jsonSchema = schemaToGenerativeAIParameters(tool.schema);\n            if (\n              jsonSchema.type === \"object\" &&\n              \"properties\" in jsonSchema &&\n              Object.keys(jsonSchema.properties).length === 0\n            ) {\n              return {\n                name: tool.name,\n                description: tool.description,\n              };\n            }\n            assertNoEmptyStringEnums(jsonSchema, tool.name);\n            return {\n              name: tool.name,\n              description: tool.description,\n              parameters: jsonSchema,\n            };\n          }\n          if (isOpenAITool(tool)) {\n            const params = jsonSchemaToGeminiParameters(\n              tool.function.parameters\n            );\n            assertNoEmptyStringEnums(params, tool.function.name);\n            return {\n              name: tool.function.name,\n              description:\n                tool.function.description ?? `A function available to call.`,\n              parameters: params,\n            };\n          }\n          return tool as unknown as GenerativeAIFunctionDeclaration;\n        }\n      ),\n    },\n  ];\n}\n\nexport function convertUsageMetadata(\n  usageMetadata: GenerateContentResponse[\"usageMetadata\"],\n  model: string\n): UsageMetadata {\n  const output: UsageMetadata = {\n    input_tokens: usageMetadata?.promptTokenCount ?? 0,\n    output_tokens: usageMetadata?.candidatesTokenCount ?? 0,\n    total_tokens: usageMetadata?.totalTokenCount ?? 0,\n  };\n  if (usageMetadata?.cachedContentTokenCount) {\n    output.input_token_details ??= {};\n    output.input_token_details.cache_read =\n      usageMetadata.cachedContentTokenCount;\n  }\n  // gemini-3-pro-preview has bracket based tracking of tokens per request\n  // FIXME(hntrl): move this usageMetadata calculation elsewhere\n  if (model === \"gemini-3-pro-preview\") {\n    const over200k = Math.max(0, usageMetadata?.promptTokenCount ?? 0 - 200000);\n    const cachedOver200k = Math.max(\n      0,\n      usageMetadata?.cachedContentTokenCount ?? 0 - 200000\n    );\n    if (over200k) {\n      output.input_token_details = {\n        ...output.input_token_details,\n        over_200k: over200k,\n      } as InputTokenDetails;\n    }\n    if (cachedOver200k) {\n      output.input_token_details = {\n        ...output.input_token_details,\n        cache_read_over_200k: cachedOver200k,\n      } as InputTokenDetails;\n    }\n  }\n  return output;\n}\n"],"mappings":"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"}