Spaces:
Sleeping
Sleeping
| {"version":3,"file":"common.cjs","names":["ChatMessage","AIMessage","ChatGenerationChunk","AIMessageChunk","schemaToGenerativeAIParameters","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\";\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 or error, return empty generations with reason in filters\n if (\n !response.candidates ||\n response.candidates.length === 0 ||\n !response.candidates[0]\n ) {\n return {\n generations: [],\n llmOutput: {\n filters: response.promptFeedback,\n },\n };\n }\n const [candidate] = response.candidates;\n const { content: candidateContent, ...generationInfo } = candidate;\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 // no content returned - likely due to abnormal stop reason, e.g. malformed function call\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 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 // no content returned - likely due to abnormal stop reason, e.g. malformed function call\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 ? undefined : 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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"} |