@librechat/agents 2.4.56 → 2.4.58

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.
@@ -1 +1 @@
1
- {"version":3,"file":"common.cjs","sources":["../../../../../src/llm/google/utils/common.ts"],"sourcesContent":["import {\n POSSIBLE_ROLES,\n type Part,\n type Content,\n type TextPart,\n type FileDataPart,\n type InlineDataPart,\n type FunctionCallPart,\n type GenerateContentCandidate,\n type EnhancedGenerateContentResponse,\n type FunctionDeclaration as GenerativeAIFunctionDeclaration,\n type FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool,\n} from '@google/generative-ai';\nimport {\n AIMessageChunk,\n BaseMessage,\n ChatMessage,\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} from '@langchain/core/messages';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport type { ChatGeneration } 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 'uuid';\nimport {\n jsonSchemaToGeminiParameters,\n schemaToGenerativeAIParameters,\n} from './zod_to_genai_parameters';\nimport { GoogleGenerativeAIToolType } from '../types';\n\nexport function getMessageAuthor(message: BaseMessage): string {\n const type = message._getType();\n if (ChatMessage.isInstance(message)) {\n return message.role;\n }\n if (type === 'tool') {\n return type;\n }\n return message.name ?? 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': // getMessageAuthor returns message.name. code ex.: return message.name ?? type;\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\nfunction _getStandardContentBlockConverter(\n isMultimodalModel: boolean\n): StandardContentBlockConverter<{\n text: TextPart;\n image: FileDataPart | InlineDataPart;\n audio: FileDataPart | InlineDataPart;\n file: FileDataPart | InlineDataPart | TextPart;\n}> {\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: string;\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 === 'tool_use') {\n return {\n functionCall: {\n name: content.name,\n args: content.input,\n },\n };\n } else if (\n content.type?.includes('/') === true &&\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 ('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): 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 if (isAIMessage(message) && message.tool_calls?.length != null) {\n functionCalls = message.tool_calls.map((tc) => {\n return {\n functionCall: {\n name: tc.name,\n args: tc.args,\n },\n };\n });\n }\n\n return [...messageParts, ...functionCalls];\n}\n\nexport function convertBaseMessagesToContent(\n messages: BaseMessage[],\n isMultimodalModel: boolean,\n convertSystemMessageToHumanContent: boolean = false\n): Content[] | undefined {\n return messages.reduce<{\n content: Content[] | undefined;\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 );\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 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 functionCalls = response.functionCalls();\n const [candidate] = response.candidates as [\n Partial<GenerateContentCandidate> | undefined,\n ];\n const { content: candidateContent, ...generationInfo } = candidate ?? {};\n let content: MessageContent | undefined;\n // Checks if some parts do not have text. If false, it means that the content is a string.\n const reasoningParts: string[] = [];\n if (\n candidateContent != null &&\n Array.isArray(candidateContent.parts) &&\n candidateContent.parts.every((p) => 'text' in p)\n ) {\n // content = candidateContent.parts.map((p) => p.text).join('');\n const textParts: string[] = [];\n for (const part of candidateContent.parts) {\n if ('thought' in part && part.thought === true) {\n reasoningParts.push(part.text ?? '');\n continue;\n }\n textParts.push(part.text ?? '');\n }\n content = textParts.join('');\n } else if (candidateContent && Array.isArray(candidateContent.parts)) {\n content = candidateContent.parts.map((p) => {\n if ('text' in p && 'thought' in p && p.thought === true) {\n reasoningParts.push(p.text ?? '');\n } else if ('text' in p) {\n return {\n type: 'text',\n text: p.text,\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 (typeof content === 'string' && content) {\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 ...fc,\n args: JSON.stringify(fc.args),\n index: extra.index,\n type: 'tool_call_chunk' as const,\n id: 'id' in fc && typeof fc.id === 'string' ? fc.id : uuidv4(),\n }))\n );\n }\n\n const additional_kwargs: ChatGeneration['message']['additional_kwargs'] = {};\n if (reasoningParts.length > 0) {\n additional_kwargs.reasoning = reasoningParts.join('');\n }\n\n if (candidate?.groundingMetadata) {\n additional_kwargs.groundingMetadata = candidate.groundingMetadata;\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 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 return {\n name: tool.name,\n description: tool.description,\n parameters: jsonSchema,\n };\n }\n if (isOpenAITool(tool)) {\n return {\n name: tool.function.name,\n description:\n tool.function.description ?? 'A function available to call.',\n parameters: jsonSchemaToGeminiParameters(\n tool.function.parameters\n ),\n };\n }\n return tool as unknown as GenerativeAIFunctionDeclaration;\n }\n ),\n },\n ];\n}\n"],"names":["ChatMessage","isAIMessage","parseBase64DataUrl","isDataContentBlock","convertToProviderContentBlock","isToolMessage","messages","isBaseMessage","uuidv4","ChatGenerationChunk","AIMessageChunk"],"mappings":"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"}
1
+ {"version":3,"file":"common.cjs","sources":["../../../../../src/llm/google/utils/common.ts"],"sourcesContent":["import {\n POSSIBLE_ROLES,\n type Part,\n type Content,\n type TextPart,\n type FileDataPart,\n type InlineDataPart,\n type FunctionCallPart,\n type GenerateContentCandidate,\n type EnhancedGenerateContentResponse,\n type FunctionDeclaration as GenerativeAIFunctionDeclaration,\n type FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool,\n} from '@google/generative-ai';\nimport {\n AIMessageChunk,\n BaseMessage,\n ChatMessage,\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} from '@langchain/core/messages';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport type { ChatGeneration } 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 'uuid';\nimport {\n jsonSchemaToGeminiParameters,\n schemaToGenerativeAIParameters,\n} from './zod_to_genai_parameters';\nimport { GoogleGenerativeAIToolType } from '../types';\n\nexport function getMessageAuthor(message: BaseMessage): string {\n const type = message._getType();\n if (ChatMessage.isInstance(message)) {\n return message.role;\n }\n if (type === 'tool') {\n return type;\n }\n return message.name ?? 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': // getMessageAuthor returns message.name. code ex.: return message.name ?? type;\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\nfunction _getStandardContentBlockConverter(\n isMultimodalModel: boolean\n): StandardContentBlockConverter<{\n text: TextPart;\n image: FileDataPart | InlineDataPart;\n audio: FileDataPart | InlineDataPart;\n file: FileDataPart | InlineDataPart | TextPart;\n}> {\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: string;\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 === 'tool_use') {\n return {\n functionCall: {\n name: content.name,\n args: content.input,\n },\n };\n } else if (\n content.type?.includes('/') === true &&\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 ('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): 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 if (isAIMessage(message) && message.tool_calls?.length != null) {\n functionCalls = message.tool_calls.map((tc) => {\n return {\n functionCall: {\n name: tc.name,\n args: tc.args,\n },\n };\n });\n }\n\n return [...messageParts, ...functionCalls];\n}\n\nexport function convertBaseMessagesToContent(\n messages: BaseMessage[],\n isMultimodalModel: boolean,\n convertSystemMessageToHumanContent: boolean = false\n): Content[] | undefined {\n return messages.reduce<{\n content: Content[] | undefined;\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 );\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 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 functionCalls = response.functionCalls();\n const [candidate] = response.candidates as [\n Partial<GenerateContentCandidate> | undefined,\n ];\n const { content: candidateContent, ...generationInfo } = candidate ?? {};\n let content: MessageContent | undefined;\n // Checks if some parts do not have text. If false, it means that the content is a string.\n const reasoningParts: string[] = [];\n if (\n candidateContent != null &&\n Array.isArray(candidateContent.parts) &&\n candidateContent.parts.every((p) => 'text' in p)\n ) {\n // content = candidateContent.parts.map((p) => p.text).join('');\n const textParts: string[] = [];\n for (const part of candidateContent.parts) {\n if ('thought' in part && part.thought === true) {\n reasoningParts.push(part.text ?? '');\n continue;\n }\n textParts.push(part.text ?? '');\n }\n content = textParts.join('');\n } else if (candidateContent && Array.isArray(candidateContent.parts)) {\n content = candidateContent.parts.map((p) => {\n if ('text' in p && 'thought' in p && p.thought === true) {\n reasoningParts.push(p.text ?? '');\n } else if ('text' in p) {\n return {\n type: 'text',\n text: p.text,\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 (typeof content === 'string' && content) {\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 ...fc,\n args: JSON.stringify(fc.args),\n index: extra.index,\n type: 'tool_call_chunk' as const,\n id: 'id' in fc && typeof fc.id === 'string' ? fc.id : uuidv4(),\n }))\n );\n }\n\n const additional_kwargs: ChatGeneration['message']['additional_kwargs'] = {};\n if (reasoningParts.length > 0) {\n additional_kwargs.reasoning = reasoningParts.join('');\n }\n\n if (candidate?.groundingMetadata) {\n additional_kwargs.groundingMetadata = candidate.groundingMetadata;\n }\n\n const isFinalChunk =\n response.candidates[0]?.finishReason === 'STOP' ||\n response.candidates[0]?.finishReason === 'MAX_TOKENS' ||\n response.candidates[0]?.finishReason === 'SAFETY';\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 usage_metadata: isFinalChunk ? extra.usageMetadata : undefined,\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 return {\n name: tool.name,\n description: tool.description,\n parameters: jsonSchema,\n };\n }\n if (isOpenAITool(tool)) {\n return {\n name: tool.function.name,\n description:\n tool.function.description ?? 'A function available to call.',\n parameters: jsonSchemaToGeminiParameters(\n tool.function.parameters\n ),\n };\n }\n return tool as unknown as GenerativeAIFunctionDeclaration;\n }\n ),\n },\n ];\n}\n"],"names":["ChatMessage","isAIMessage","parseBase64DataUrl","isDataContentBlock","convertToProviderContentBlock","isToolMessage","messages","isBaseMessage","uuidv4","ChatGenerationChunk","AIMessageChunk"],"mappings":"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"}
@@ -42,8 +42,10 @@ class ModelEndHandler {
42
42
  }
43
43
  class ToolEndHandler {
44
44
  callback;
45
- constructor(callback) {
45
+ omitOutput;
46
+ constructor(callback, omitOutput) {
46
47
  this.callback = callback;
48
+ this.omitOutput = omitOutput;
47
49
  }
48
50
  handle(event, data, metadata, graph) {
49
51
  if (!graph || !metadata) {
@@ -56,7 +58,7 @@ class ToolEndHandler {
56
58
  return;
57
59
  }
58
60
  this.callback?.(toolEndData, metadata);
59
- graph.handleToolCallCompleted({ input: toolEndData.input, output: toolEndData.output }, metadata);
61
+ graph.handleToolCallCompleted({ input: toolEndData.input, output: toolEndData.output }, metadata, this.omitOutput?.(toolEndData.output.name));
60
62
  }
61
63
  }
62
64
  class TestLLMStreamHandler {
@@ -1 +1 @@
1
- {"version":3,"file":"events.mjs","sources":["../../src/events.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/events.ts\nimport type {\n UsageMetadata,\n BaseMessageFields,\n} from '@langchain/core/messages';\nimport type { Graph } from '@/graphs';\nimport type * as t from '@/types';\nimport { handleToolCalls } from '@/tools/handlers';\nimport { Providers } from '@/common';\n\nexport class HandlerRegistry {\n private handlers: Map<string, t.EventHandler> = new Map();\n\n register(eventType: string, handler: t.EventHandler): void {\n this.handlers.set(eventType, handler);\n }\n\n getHandler(eventType: string): t.EventHandler | undefined {\n return this.handlers.get(eventType);\n }\n}\n\nexport class ModelEndHandler implements t.EventHandler {\n collectedUsage?: UsageMetadata[];\n constructor(collectedUsage?: UsageMetadata[]) {\n if (collectedUsage && !Array.isArray(collectedUsage)) {\n throw new Error('collectedUsage must be an array');\n }\n this.collectedUsage = collectedUsage;\n }\n\n handle(\n event: string,\n data: t.ModelEndData,\n metadata?: Record<string, unknown>,\n graph?: Graph\n ): void {\n if (!graph || !metadata) {\n console.warn(`Graph or metadata not found in ${event} event`);\n return;\n }\n\n const usage = data?.output?.usage_metadata;\n if (usage != null && this.collectedUsage != null) {\n this.collectedUsage.push(usage);\n }\n\n if (metadata.ls_provider === 'FakeListChatModel') {\n return handleToolCalls(data?.output?.tool_calls, metadata, graph);\n }\n\n console.log(`====== ${event.toUpperCase()} ======`);\n console.dir(\n {\n usage,\n },\n { depth: null }\n );\n\n if (metadata.provider !== Providers.GOOGLE) {\n return;\n }\n\n handleToolCalls(data?.output?.tool_calls, metadata, graph);\n }\n}\n\nexport class ToolEndHandler implements t.EventHandler {\n private callback?: t.ToolEndCallback;\n constructor(callback?: t.ToolEndCallback) {\n this.callback = callback;\n }\n handle(\n event: string,\n data: t.StreamEventData | undefined,\n metadata?: Record<string, unknown>,\n graph?: Graph\n ): void {\n if (!graph || !metadata) {\n console.warn(`Graph or metadata not found in ${event} event`);\n return;\n }\n\n const toolEndData = data as t.ToolEndData | undefined;\n if (!toolEndData?.output) {\n console.warn('No output found in tool_end event');\n return;\n }\n\n this.callback?.(toolEndData, metadata);\n\n graph.handleToolCallCompleted(\n { input: toolEndData.input, output: toolEndData.output },\n metadata\n );\n }\n}\n\nexport class TestLLMStreamHandler implements t.EventHandler {\n handle(event: string, data: t.StreamEventData | undefined): void {\n const chunk = data?.chunk;\n const isMessageChunk = !!(chunk && 'message' in chunk);\n const msg = isMessageChunk ? chunk.message : undefined;\n if (msg && msg.tool_call_chunks && msg.tool_call_chunks.length > 0) {\n console.log(msg.tool_call_chunks);\n } else if (msg && msg.content) {\n if (typeof msg.content === 'string') {\n process.stdout.write(msg.content);\n }\n }\n }\n}\n\nexport class TestChatStreamHandler implements t.EventHandler {\n handle(event: string, data: t.StreamEventData | undefined): void {\n const chunk = data?.chunk;\n const isContentChunk = !!(chunk && 'content' in chunk);\n const content = isContentChunk && chunk.content;\n\n if (!content || !isContentChunk) {\n return;\n }\n\n if (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) {\n console.dir(chunk.tool_call_chunks, { depth: null });\n }\n\n if (typeof content === 'string') {\n process.stdout.write(content);\n } else {\n console.dir(content, { depth: null });\n }\n }\n}\n\nexport class LLMStreamHandler implements t.EventHandler {\n handle(\n event: string,\n data: t.StreamEventData | undefined,\n metadata?: Record<string, unknown>\n ): void {\n const chunk = data?.chunk;\n const isMessageChunk = !!(chunk && 'message' in chunk);\n const msg = isMessageChunk && chunk.message;\n if (metadata) {\n console.log(metadata);\n }\n if (msg && msg.tool_call_chunks && msg.tool_call_chunks.length > 0) {\n console.log(msg.tool_call_chunks);\n } else if (msg && msg.content) {\n if (typeof msg.content === 'string') {\n // const text_delta = msg.content;\n // dispatchCustomEvent(GraphEvents.CHAT_MODEL_STREAM, { chunk }, config);\n process.stdout.write(msg.content);\n }\n }\n }\n}\n\nexport const createMetadataAggregator = (\n _collected?: Record<\n string,\n NonNullable<BaseMessageFields['response_metadata']>\n >[]\n): t.MetadataAggregatorResult => {\n const collected = _collected || [];\n\n const handleLLMEnd: t.HandleLLMEnd = (output) => {\n const { generations } = output;\n const lastMessageOutput = (\n generations[generations.length - 1] as\n | (t.StreamGeneration | undefined)[]\n | undefined\n )?.[0];\n if (!lastMessageOutput) {\n return;\n }\n const { message } = lastMessageOutput;\n if (message?.response_metadata) {\n collected.push(message.response_metadata);\n }\n };\n\n return { handleLLMEnd, collected };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.mjs","sources":["../../src/events.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/events.ts\nimport type {\n UsageMetadata,\n BaseMessageFields,\n} from '@langchain/core/messages';\nimport type { Graph } from '@/graphs';\nimport type * as t from '@/types';\nimport { handleToolCalls } from '@/tools/handlers';\nimport { Providers } from '@/common';\n\nexport class HandlerRegistry {\n private handlers: Map<string, t.EventHandler> = new Map();\n\n register(eventType: string, handler: t.EventHandler): void {\n this.handlers.set(eventType, handler);\n }\n\n getHandler(eventType: string): t.EventHandler | undefined {\n return this.handlers.get(eventType);\n }\n}\n\nexport class ModelEndHandler implements t.EventHandler {\n collectedUsage?: UsageMetadata[];\n constructor(collectedUsage?: UsageMetadata[]) {\n if (collectedUsage && !Array.isArray(collectedUsage)) {\n throw new Error('collectedUsage must be an array');\n }\n this.collectedUsage = collectedUsage;\n }\n\n handle(\n event: string,\n data: t.ModelEndData,\n metadata?: Record<string, unknown>,\n graph?: Graph\n ): void {\n if (!graph || !metadata) {\n console.warn(`Graph or metadata not found in ${event} event`);\n return;\n }\n\n const usage = data?.output?.usage_metadata;\n if (usage != null && this.collectedUsage != null) {\n this.collectedUsage.push(usage);\n }\n\n if (metadata.ls_provider === 'FakeListChatModel') {\n return handleToolCalls(data?.output?.tool_calls, metadata, graph);\n }\n\n console.log(`====== ${event.toUpperCase()} ======`);\n console.dir(\n {\n usage,\n },\n { depth: null }\n );\n\n if (metadata.provider !== Providers.GOOGLE) {\n return;\n }\n\n handleToolCalls(data?.output?.tool_calls, metadata, graph);\n }\n}\n\nexport class ToolEndHandler implements t.EventHandler {\n private callback?: t.ToolEndCallback;\n private omitOutput?: (name?: string) => boolean;\n constructor(\n callback?: t.ToolEndCallback,\n omitOutput?: (name?: string) => boolean\n ) {\n this.callback = callback;\n this.omitOutput = omitOutput;\n }\n handle(\n event: string,\n data: t.StreamEventData | undefined,\n metadata?: Record<string, unknown>,\n graph?: Graph\n ): void {\n if (!graph || !metadata) {\n console.warn(`Graph or metadata not found in ${event} event`);\n return;\n }\n\n const toolEndData = data as t.ToolEndData | undefined;\n if (!toolEndData?.output) {\n console.warn('No output found in tool_end event');\n return;\n }\n\n this.callback?.(toolEndData, metadata);\n graph.handleToolCallCompleted(\n { input: toolEndData.input, output: toolEndData.output },\n metadata,\n this.omitOutput?.(toolEndData.output.name)\n );\n }\n}\n\nexport class TestLLMStreamHandler implements t.EventHandler {\n handle(event: string, data: t.StreamEventData | undefined): void {\n const chunk = data?.chunk;\n const isMessageChunk = !!(chunk && 'message' in chunk);\n const msg = isMessageChunk ? chunk.message : undefined;\n if (msg && msg.tool_call_chunks && msg.tool_call_chunks.length > 0) {\n console.log(msg.tool_call_chunks);\n } else if (msg && msg.content) {\n if (typeof msg.content === 'string') {\n process.stdout.write(msg.content);\n }\n }\n }\n}\n\nexport class TestChatStreamHandler implements t.EventHandler {\n handle(event: string, data: t.StreamEventData | undefined): void {\n const chunk = data?.chunk;\n const isContentChunk = !!(chunk && 'content' in chunk);\n const content = isContentChunk && chunk.content;\n\n if (!content || !isContentChunk) {\n return;\n }\n\n if (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) {\n console.dir(chunk.tool_call_chunks, { depth: null });\n }\n\n if (typeof content === 'string') {\n process.stdout.write(content);\n } else {\n console.dir(content, { depth: null });\n }\n }\n}\n\nexport class LLMStreamHandler implements t.EventHandler {\n handle(\n event: string,\n data: t.StreamEventData | undefined,\n metadata?: Record<string, unknown>\n ): void {\n const chunk = data?.chunk;\n const isMessageChunk = !!(chunk && 'message' in chunk);\n const msg = isMessageChunk && chunk.message;\n if (metadata) {\n console.log(metadata);\n }\n if (msg && msg.tool_call_chunks && msg.tool_call_chunks.length > 0) {\n console.log(msg.tool_call_chunks);\n } else if (msg && msg.content) {\n if (typeof msg.content === 'string') {\n // const text_delta = msg.content;\n // dispatchCustomEvent(GraphEvents.CHAT_MODEL_STREAM, { chunk }, config);\n process.stdout.write(msg.content);\n }\n }\n }\n}\n\nexport const createMetadataAggregator = (\n _collected?: Record<\n string,\n NonNullable<BaseMessageFields['response_metadata']>\n >[]\n): t.MetadataAggregatorResult => {\n const collected = _collected || [];\n\n const handleLLMEnd: t.HandleLLMEnd = (output) => {\n const { generations } = output;\n const lastMessageOutput = (\n generations[generations.length - 1] as\n | (t.StreamGeneration | undefined)[]\n | undefined\n )?.[0];\n if (!lastMessageOutput) {\n return;\n }\n const { message } = lastMessageOutput;\n if (message?.response_metadata) {\n collected.push(message.response_metadata);\n }\n };\n\n return { handleLLMEnd, collected };\n};\n"],"names":[],"mappings":"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"}
@@ -450,7 +450,7 @@ class StandardGraph extends Graph {
450
450
  dispatchCustomEvent(GraphEvents.ON_RUN_STEP, runStep, this.config);
451
451
  return stepId;
452
452
  }
453
- handleToolCallCompleted(data, metadata) {
453
+ handleToolCallCompleted(data, metadata, omitOutput) {
454
454
  if (!this.config) {
455
455
  throw new Error('No config provided');
456
456
  }
@@ -467,14 +467,15 @@ class StandardGraph extends Graph {
467
467
  if (!runStep) {
468
468
  throw new Error(`No run step found for stepId ${stepId}`);
469
469
  }
470
+ const dispatchedOutput = typeof output.content === 'string'
471
+ ? output.content
472
+ : JSON.stringify(output.content);
470
473
  const args = typeof input === 'string' ? input : input.input;
471
474
  const tool_call = {
472
475
  args: typeof args === 'string' ? args : JSON.stringify(args),
473
476
  name: output.name ?? '',
474
477
  id: output.tool_call_id,
475
- output: typeof output.content === 'string'
476
- ? output.content
477
- : JSON.stringify(output.content),
478
+ output: omitOutput === true ? '' : dispatchedOutput,
478
479
  progress: 1,
479
480
  };
480
481
  this.handlerRegistry?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)?.handle(GraphEvents.ON_RUN_STEP_COMPLETED, {
@@ -1 +1 @@
1
- {"version":3,"file":"Graph.mjs","sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/graphs/Graph.ts\nimport { nanoid } from 'nanoid';\nimport { concat } from '@langchain/core/utils/stream';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { ChatVertexAI } from '@langchain/google-vertexai';\nimport { START, END, StateGraph } from '@langchain/langgraph';\nimport { Runnable, RunnableConfig } from '@langchain/core/runnables';\nimport { dispatchCustomEvent } from '@langchain/core/callbacks/dispatch';\nimport {\n AIMessageChunk,\n ToolMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type {\n BaseMessage,\n BaseMessageFields,\n UsageMetadata,\n} from '@langchain/core/messages';\nimport type * as t from '@/types';\nimport {\n Providers,\n GraphEvents,\n GraphNodeKeys,\n StepTypes,\n Callback,\n ContentTypes,\n} from '@/common';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport { getChatModelClass, manualToolStreamProviders } from '@/llm/providers';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport {\n createPruneMessages,\n modifyDeltaProperties,\n formatArtifactPayload,\n convertMessagesToContent,\n formatAnthropicArtifactContent,\n} from '@/messages';\nimport {\n resetIfNotEmpty,\n isOpenAILike,\n isGoogleLike,\n joinKeys,\n sleep,\n} from '@/utils';\nimport { ChatOpenAI, AzureChatOpenAI } from '@/llm/openai';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { HandlerRegistry } from '@/events';\n\nconst { AGENT, TOOLS } = GraphNodeKeys;\nexport type GraphNode = GraphNodeKeys | typeof START;\nexport type ClientCallback<T extends unknown[]> = (\n graph: StandardGraph,\n ...args: T\n) => void;\nexport type ClientCallbacks = {\n [Callback.TOOL_ERROR]?: ClientCallback<[Error, string]>;\n [Callback.TOOL_START]?: ClientCallback<unknown[]>;\n [Callback.TOOL_END]?: ClientCallback<unknown[]>;\n};\nexport type SystemCallbacks = {\n [K in keyof ClientCallbacks]: ClientCallbacks[K] extends ClientCallback<\n infer Args\n >\n ? (...args: Args) => void\n : never;\n};\n\nexport abstract class Graph<\n T extends t.BaseGraphState = t.BaseGraphState,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n TNodeName extends string = string,\n> {\n abstract resetValues(): void;\n abstract createGraphState(): t.GraphStateChannels<T>;\n abstract initializeTools(): CustomToolNode<T> | ToolNode<T>;\n abstract initializeModel(): Runnable;\n abstract getRunMessages(): BaseMessage[] | undefined;\n abstract getContentParts(): t.MessageContentComplex[] | undefined;\n abstract generateStepId(stepKey: string): [string, number];\n abstract getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[];\n abstract getStepKey(metadata: Record<string, unknown> | undefined): string;\n abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;\n abstract getStepIdByKey(stepKey: string, index?: number): string;\n abstract getRunStep(stepId: string): t.RunStep | undefined;\n abstract dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): string;\n abstract dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void;\n abstract dispatchMessageDelta(id: string, delta: t.MessageDelta): void;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta\n ): void;\n abstract handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>\n ): void;\n\n abstract createCallModel(): (\n state: T,\n config?: RunnableConfig\n ) => Promise<Partial<T>>;\n abstract createWorkflow(): t.CompiledWorkflow<T>;\n lastToken?: string;\n tokenTypeSwitch?: 'reasoning' | 'content';\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n currentTokenType: ContentTypes.TEXT | ContentTypes.THINK | 'think_and_text' =\n ContentTypes.TEXT;\n messageStepHasToolCalls: Map<string, boolean> = new Map();\n messageIdsByStepKey: Map<string, string> = new Map();\n prelimMessageIdsByStepKey: Map<string, string> = new Map();\n config: RunnableConfig | undefined;\n contentData: t.RunStep[] = [];\n stepKeyIds: Map<string, string[]> = new Map<string, string[]>();\n contentIndexMap: Map<string, number> = new Map();\n toolCallStepIds: Map<string, string> = new Map();\n currentUsage: Partial<UsageMetadata> | undefined;\n indexTokenCountMap: Record<string, number | undefined> = {};\n maxContextTokens: number | undefined;\n pruneMessages?: ReturnType<typeof createPruneMessages>;\n /** The amount of time that should pass before another consecutive API call */\n streamBuffer: number | undefined;\n tokenCounter?: t.TokenCounter;\n signal?: AbortSignal;\n /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */\n invokedToolIds?: Set<string>;\n handlerRegistry: HandlerRegistry | undefined;\n}\n\nexport class StandardGraph extends Graph<t.BaseGraphState, GraphNode> {\n private graphState: t.GraphStateChannels<t.BaseGraphState>;\n clientOptions: t.ClientOptions;\n boundModel?: Runnable;\n /** The last recorded timestamp that a stream API call was invoked */\n lastStreamCall: number | undefined;\n systemMessage: SystemMessage | undefined;\n messages: BaseMessage[] = [];\n runId: string | undefined;\n tools?: t.GraphTools;\n toolMap?: t.ToolMap;\n startIndex: number = 0;\n provider: Providers;\n toolEnd: boolean;\n signal?: AbortSignal;\n\n constructor({\n runId,\n tools,\n signal,\n toolMap,\n provider,\n streamBuffer,\n instructions,\n reasoningKey,\n clientOptions,\n toolEnd = false,\n additional_instructions = '',\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.tools = tools;\n this.signal = signal;\n this.toolEnd = toolEnd;\n this.toolMap = toolMap;\n this.provider = provider;\n this.streamBuffer = streamBuffer;\n this.clientOptions = clientOptions;\n this.graphState = this.createGraphState();\n this.boundModel = this.initializeModel();\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n\n let finalInstructions: string | BaseMessageFields | undefined =\n instructions;\n if (additional_instructions) {\n finalInstructions =\n finalInstructions != null && finalInstructions\n ? `${finalInstructions}\\n\\n${additional_instructions}`\n : additional_instructions;\n }\n\n if (\n finalInstructions != null &&\n finalInstructions &&\n provider === Providers.ANTHROPIC &&\n ((\n (clientOptions as t.AnthropicClientOptions).clientOptions\n ?.defaultHeaders as Record<string, string> | undefined\n )?.['anthropic-beta']?.includes('prompt-caching') ??\n false)\n ) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructions,\n cache_control: { type: 'ephemeral' },\n },\n ],\n };\n }\n\n if (finalInstructions != null && finalInstructions !== '') {\n this.systemMessage = new SystemMessage(finalInstructions);\n }\n }\n\n /* Init */\n\n resetValues(keepContent?: boolean): void {\n this.messages = [];\n this.config = resetIfNotEmpty(this.config, undefined);\n if (keepContent !== true) {\n this.contentData = resetIfNotEmpty(this.contentData, []);\n this.contentIndexMap = resetIfNotEmpty(this.contentIndexMap, new Map());\n }\n this.stepKeyIds = resetIfNotEmpty(this.stepKeyIds, new Map());\n this.toolCallStepIds = resetIfNotEmpty(this.toolCallStepIds, new Map());\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.prelimMessageIdsByStepKey = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.currentTokenType = resetIfNotEmpty(\n this.currentTokenType,\n ContentTypes.TEXT\n );\n this.lastToken = resetIfNotEmpty(this.lastToken, undefined);\n this.tokenTypeSwitch = resetIfNotEmpty(this.tokenTypeSwitch, undefined);\n this.indexTokenCountMap = resetIfNotEmpty(this.indexTokenCountMap, {});\n this.currentUsage = resetIfNotEmpty(this.currentUsage, undefined);\n this.tokenCounter = resetIfNotEmpty(this.tokenCounter, undefined);\n this.maxContextTokens = resetIfNotEmpty(this.maxContextTokens, undefined);\n this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);\n }\n\n /* Run Step Processing */\n\n getRunStep(stepId: string): t.RunStep | undefined {\n const index = this.contentIndexMap.get(stepId);\n if (index !== undefined) {\n return this.contentData[index];\n }\n return undefined;\n }\n\n getStepKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepIdByKey(stepKey: string, index?: number): string {\n const stepIds = this.stepKeyIds.get(stepKey);\n if (!stepIds) {\n throw new Error(`No step IDs found for stepKey ${stepKey}`);\n }\n\n if (index === undefined) {\n return stepIds[stepIds.length - 1];\n }\n\n return stepIds[index];\n }\n\n generateStepId(stepKey: string): [string, number] {\n const stepIds = this.stepKeyIds.get(stepKey);\n let newStepId: string | undefined;\n let stepIndex = 0;\n if (stepIds) {\n stepIndex = stepIds.length;\n newStepId = `step_${nanoid()}`;\n stepIds.push(newStepId);\n this.stepKeyIds.set(stepKey, stepIds);\n } else {\n newStepId = `step_${nanoid()}`;\n this.stepKeyIds.set(stepKey, [newStepId]);\n }\n\n return [newStepId, stepIndex];\n }\n\n getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[] {\n if (!metadata) return [];\n\n const keyList = [\n metadata.run_id as string,\n metadata.thread_id as string,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n metadata.checkpoint_ns as string,\n ];\n if (\n this.currentTokenType === ContentTypes.THINK ||\n this.currentTokenType === 'think_and_text'\n ) {\n keyList.push('reasoning');\n }\n\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\n }\n\n return keyList;\n }\n\n checkKeyList(keyList: (string | number | undefined)[]): boolean {\n return keyList.some((key) => key === undefined);\n }\n\n /* Misc.*/\n\n getRunMessages(): BaseMessage[] | undefined {\n return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\n }\n\n /* Graph */\n\n createGraphState(): t.GraphStateChannels<t.BaseGraphState> {\n return {\n messages: {\n value: (x: BaseMessage[], y: BaseMessage[]): BaseMessage[] => {\n if (!x.length) {\n if (this.systemMessage) {\n x.push(this.systemMessage);\n }\n\n this.startIndex = x.length + y.length;\n }\n const current = x.concat(y);\n this.messages = current;\n return current;\n },\n default: () => [],\n },\n };\n }\n\n initializeTools():\n | CustomToolNode<t.BaseGraphState>\n | ToolNode<t.BaseGraphState> {\n // return new ToolNode<t.BaseGraphState>(this.tools);\n return new CustomToolNode<t.BaseGraphState>({\n tools: (this.tools as t.GenericTool[] | undefined) || [],\n toolMap: this.toolMap,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n });\n }\n\n initializeModel(): Runnable {\n const ChatModelClass = getChatModelClass(this.provider);\n const model = new ChatModelClass(this.clientOptions);\n\n if (\n isOpenAILike(this.provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (this.clientOptions as t.OpenAIClientOptions)\n .temperature as number;\n model.topP = (this.clientOptions as t.OpenAIClientOptions).topP as number;\n model.frequencyPenalty = (this.clientOptions as t.OpenAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (this.clientOptions as t.OpenAIClientOptions)\n .presencePenalty as number;\n model.n = (this.clientOptions as t.OpenAIClientOptions).n as number;\n } else if (\n this.provider === Providers.VERTEXAI &&\n model instanceof ChatVertexAI\n ) {\n model.temperature = (this.clientOptions as t.VertexAIClientOptions)\n .temperature as number;\n model.topP = (this.clientOptions as t.VertexAIClientOptions)\n .topP as number;\n model.topK = (this.clientOptions as t.VertexAIClientOptions)\n .topK as number;\n model.topLogprobs = (this.clientOptions as t.VertexAIClientOptions)\n .topLogprobs as number;\n model.frequencyPenalty = (this.clientOptions as t.VertexAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (this.clientOptions as t.VertexAIClientOptions)\n .presencePenalty as number;\n model.maxOutputTokens = (this.clientOptions as t.VertexAIClientOptions)\n .maxOutputTokens as number;\n }\n\n if (!this.tools || this.tools.length === 0) {\n return model as unknown as Runnable;\n }\n\n return (model as t.ModelWithTools).bindTools(this.tools);\n }\n overrideTestModel(\n responses: string[],\n sleep?: number,\n toolCalls?: ToolCall[]\n ): void {\n this.boundModel = createFakeStreamingLLM({\n responses,\n sleep,\n toolCalls,\n });\n }\n\n getNewModel({\n provider,\n clientOptions,\n omitOptions,\n }: {\n provider: Providers;\n clientOptions?: t.ClientOptions;\n omitOptions?: Set<string>;\n }): t.ChatModelInstance {\n const ChatModelClass = getChatModelClass(provider);\n const options =\n omitOptions && clientOptions == null\n ? Object.assign(\n Object.fromEntries(\n Object.entries(this.clientOptions).filter(\n ([key]) => !omitOptions.has(key)\n )\n ),\n clientOptions\n )\n : (clientOptions ?? this.clientOptions);\n return new ChatModelClass(options);\n }\n\n storeUsageMetadata(finalMessage?: BaseMessage): void {\n if (\n finalMessage &&\n 'usage_metadata' in finalMessage &&\n finalMessage.usage_metadata != null\n ) {\n this.currentUsage = finalMessage.usage_metadata as Partial<UsageMetadata>;\n }\n }\n\n cleanupSignalListener(): void {\n if (!this.signal) {\n return;\n }\n if (!this.boundModel) {\n return;\n }\n const client = (this.boundModel as ChatOpenAI | undefined)?.exposedClient;\n if (!client?.abortHandler) {\n return;\n }\n this.signal.removeEventListener('abort', client.abortHandler);\n client.abortHandler = undefined;\n }\n\n createCallModel() {\n return async (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> => {\n const { provider = '' } =\n (config?.configurable as t.GraphConfig | undefined) ?? {};\n if (this.boundModel == null) {\n throw new Error('No Graph model found');\n }\n if (!config || !provider) {\n throw new Error(`No ${config ? 'provider' : 'config'} provided`);\n }\n if (!config.signal) {\n config.signal = this.signal;\n }\n this.config = config;\n const { messages } = state;\n\n let messagesToUse = messages;\n if (\n !this.pruneMessages &&\n this.tokenCounter &&\n this.maxContextTokens != null &&\n this.indexTokenCountMap[0] != null\n ) {\n const isAnthropicWithThinking =\n (this.provider === Providers.ANTHROPIC &&\n (this.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (this.provider === Providers.BEDROCK &&\n (this.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null);\n\n this.pruneMessages = createPruneMessages({\n provider: this.provider,\n indexTokenCountMap: this.indexTokenCountMap,\n maxTokens: this.maxContextTokens,\n tokenCounter: this.tokenCounter,\n startIndex: this.startIndex,\n thinkingEnabled: isAnthropicWithThinking,\n });\n }\n if (this.pruneMessages) {\n const { context, indexTokenCountMap } = this.pruneMessages({\n messages,\n usageMetadata: this.currentUsage,\n // startOnMessageType: 'human',\n });\n this.indexTokenCountMap = indexTokenCountMap;\n messagesToUse = context;\n }\n\n const finalMessages = messagesToUse;\n const lastMessageX =\n finalMessages.length >= 2\n ? finalMessages[finalMessages.length - 2]\n : null;\n const lastMessageY =\n finalMessages.length >= 1\n ? finalMessages[finalMessages.length - 1]\n : null;\n\n if (\n provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY instanceof ToolMessage &&\n typeof lastMessageX.content === 'string'\n ) {\n finalMessages[finalMessages.length - 2].content = '';\n }\n\n const isLatestToolMessage = lastMessageY instanceof ToolMessage;\n\n if (isLatestToolMessage && provider === Providers.ANTHROPIC) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n isLatestToolMessage &&\n (isOpenAILike(provider) || isGoogleLike(provider))\n ) {\n formatArtifactPayload(finalMessages);\n }\n\n if (this.lastStreamCall != null && this.streamBuffer != null) {\n const timeSinceLastCall = Date.now() - this.lastStreamCall;\n if (timeSinceLastCall < this.streamBuffer) {\n const timeToWait =\n Math.ceil((this.streamBuffer - timeSinceLastCall) / 1000) * 1000;\n await sleep(timeToWait);\n }\n }\n\n this.lastStreamCall = Date.now();\n\n let result: Partial<t.BaseGraphState>;\n if (\n (this.tools?.length ?? 0) > 0 &&\n manualToolStreamProviders.has(provider)\n ) {\n const stream = await this.boundModel.stream(finalMessages, config);\n let finalChunk: AIMessageChunk | undefined;\n for await (const chunk of stream) {\n dispatchCustomEvent(GraphEvents.CHAT_MODEL_STREAM, { chunk }, config);\n if (!finalChunk) {\n finalChunk = chunk;\n } else {\n finalChunk = concat(finalChunk, chunk);\n }\n }\n\n finalChunk = modifyDeltaProperties(this.provider, finalChunk);\n result = { messages: [finalChunk as AIMessageChunk] };\n } else {\n const finalMessage = (await this.boundModel.invoke(\n finalMessages,\n config\n )) as AIMessageChunk;\n if ((finalMessage.tool_calls?.length ?? 0) > 0) {\n finalMessage.tool_calls = finalMessage.tool_calls?.filter(\n (tool_call) => {\n if (!tool_call.name) {\n return false;\n }\n return true;\n }\n );\n }\n result = { messages: [finalMessage] };\n }\n\n this.storeUsageMetadata(result.messages?.[0]);\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createWorkflow(): t.CompiledWorkflow<t.BaseGraphState> {\n const routeMessage = (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n return toolsCondition(state, this.invokedToolIds);\n };\n\n const workflow = new StateGraph<t.BaseGraphState>({\n channels: this.graphState,\n })\n .addNode(AGENT, this.createCallModel())\n .addNode(TOOLS, this.initializeTools())\n .addEdge(START, AGENT)\n .addConditionalEdges(AGENT, routeMessage)\n .addEdge(TOOLS, this.toolEnd ? END : AGENT);\n\n return workflow.compile();\n }\n\n /* Dispatchers */\n\n /**\n * Dispatches a run step to the client, returns the step ID\n */\n dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): string {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n const [stepId, stepIndex] = this.generateStepId(stepKey);\n if (stepDetails.type === StepTypes.TOOL_CALLS && stepDetails.tool_calls) {\n for (const tool_call of stepDetails.tool_calls) {\n const toolCallId = tool_call.id ?? '';\n if (!toolCallId || this.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n this.toolCallStepIds.set(toolCallId, stepId);\n }\n }\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: stepDetails.type,\n index: this.contentData.length,\n stepDetails,\n usage: null,\n };\n\n const runId = this.runId ?? '';\n if (runId) {\n runStep.runId = runId;\n }\n\n this.contentData.push(runStep);\n this.contentIndexMap.set(stepId, runStep.index);\n dispatchCustomEvent(GraphEvents.ON_RUN_STEP, runStep, this.config);\n return stepId;\n }\n\n handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>\n ): void {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n if (!data.output) {\n return;\n }\n\n const { input, output } = data;\n const { tool_call_id } = output;\n const stepId = this.toolCallStepIds.get(tool_call_id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${tool_call_id}`);\n }\n\n const runStep = this.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const args = typeof input === 'string' ? input : input.input;\n const tool_call = {\n args: typeof args === 'string' ? args : JSON.stringify(args),\n name: output.name ?? '',\n id: output.tool_call_id,\n output:\n typeof output.content === 'string'\n ? output.content\n : JSON.stringify(output.content),\n progress: 1,\n };\n\n this.handlerRegistry?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n this\n );\n }\n /**\n * Static version of handleToolCallError to avoid creating strong references\n * that prevent garbage collection\n */\n static handleToolCallErrorStatic(\n graph: StandardGraph,\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): void {\n if (!graph.config) {\n throw new Error('No config provided');\n }\n\n if (!data.id) {\n console.warn('No Tool ID provided for Tool Error');\n return;\n }\n\n const stepId = graph.toolCallStepIds.get(data.id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${data.id}`);\n }\n\n const { name, input: args, error } = data;\n\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const tool_call: t.ProcessedToolCall = {\n id: data.id,\n name: name || '',\n args: typeof args === 'string' ? args : JSON.stringify(args),\n output: `Error processing tool${error?.message != null ? `: ${error.message}` : ''}`,\n progress: 1,\n };\n\n graph.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n graph\n );\n }\n\n /**\n * Instance method that delegates to the static method\n * Kept for backward compatibility\n */\n handleToolCallError(\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): void {\n StandardGraph.handleToolCallErrorStatic(this, data, metadata);\n }\n\n dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void {\n if (!this.config) {\n throw new Error('No config provided');\n } else if (!id) {\n throw new Error('No step ID found');\n }\n const runStepDelta: t.RunStepDeltaEvent = {\n id,\n delta,\n };\n dispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n }\n\n dispatchMessageDelta(id: string, delta: t.MessageDelta): void {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const messageDelta: t.MessageDeltaEvent = {\n id,\n delta,\n };\n dispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n }\n\n dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n dispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n };\n}\n"],"names":["CustomToolNode"],"mappings":"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"}
1
+ {"version":3,"file":"Graph.mjs","sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/graphs/Graph.ts\nimport { nanoid } from 'nanoid';\nimport { concat } from '@langchain/core/utils/stream';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { ChatVertexAI } from '@langchain/google-vertexai';\nimport { START, END, StateGraph } from '@langchain/langgraph';\nimport { Runnable, RunnableConfig } from '@langchain/core/runnables';\nimport { dispatchCustomEvent } from '@langchain/core/callbacks/dispatch';\nimport {\n AIMessageChunk,\n ToolMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type {\n BaseMessage,\n BaseMessageFields,\n UsageMetadata,\n} from '@langchain/core/messages';\nimport type * as t from '@/types';\nimport {\n Providers,\n GraphEvents,\n GraphNodeKeys,\n StepTypes,\n Callback,\n ContentTypes,\n} from '@/common';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport { getChatModelClass, manualToolStreamProviders } from '@/llm/providers';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport {\n createPruneMessages,\n modifyDeltaProperties,\n formatArtifactPayload,\n convertMessagesToContent,\n formatAnthropicArtifactContent,\n} from '@/messages';\nimport {\n resetIfNotEmpty,\n isOpenAILike,\n isGoogleLike,\n joinKeys,\n sleep,\n} from '@/utils';\nimport { ChatOpenAI, AzureChatOpenAI } from '@/llm/openai';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { HandlerRegistry } from '@/events';\n\nconst { AGENT, TOOLS } = GraphNodeKeys;\nexport type GraphNode = GraphNodeKeys | typeof START;\nexport type ClientCallback<T extends unknown[]> = (\n graph: StandardGraph,\n ...args: T\n) => void;\nexport type ClientCallbacks = {\n [Callback.TOOL_ERROR]?: ClientCallback<[Error, string]>;\n [Callback.TOOL_START]?: ClientCallback<unknown[]>;\n [Callback.TOOL_END]?: ClientCallback<unknown[]>;\n};\nexport type SystemCallbacks = {\n [K in keyof ClientCallbacks]: ClientCallbacks[K] extends ClientCallback<\n infer Args\n >\n ? (...args: Args) => void\n : never;\n};\n\nexport abstract class Graph<\n T extends t.BaseGraphState = t.BaseGraphState,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n TNodeName extends string = string,\n> {\n abstract resetValues(): void;\n abstract createGraphState(): t.GraphStateChannels<T>;\n abstract initializeTools(): CustomToolNode<T> | ToolNode<T>;\n abstract initializeModel(): Runnable;\n abstract getRunMessages(): BaseMessage[] | undefined;\n abstract getContentParts(): t.MessageContentComplex[] | undefined;\n abstract generateStepId(stepKey: string): [string, number];\n abstract getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[];\n abstract getStepKey(metadata: Record<string, unknown> | undefined): string;\n abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;\n abstract getStepIdByKey(stepKey: string, index?: number): string;\n abstract getRunStep(stepId: string): t.RunStep | undefined;\n abstract dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): string;\n abstract dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void;\n abstract dispatchMessageDelta(id: string, delta: t.MessageDelta): void;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta\n ): void;\n abstract handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): void;\n\n abstract createCallModel(): (\n state: T,\n config?: RunnableConfig\n ) => Promise<Partial<T>>;\n abstract createWorkflow(): t.CompiledWorkflow<T>;\n lastToken?: string;\n tokenTypeSwitch?: 'reasoning' | 'content';\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n currentTokenType: ContentTypes.TEXT | ContentTypes.THINK | 'think_and_text' =\n ContentTypes.TEXT;\n messageStepHasToolCalls: Map<string, boolean> = new Map();\n messageIdsByStepKey: Map<string, string> = new Map();\n prelimMessageIdsByStepKey: Map<string, string> = new Map();\n config: RunnableConfig | undefined;\n contentData: t.RunStep[] = [];\n stepKeyIds: Map<string, string[]> = new Map<string, string[]>();\n contentIndexMap: Map<string, number> = new Map();\n toolCallStepIds: Map<string, string> = new Map();\n currentUsage: Partial<UsageMetadata> | undefined;\n indexTokenCountMap: Record<string, number | undefined> = {};\n maxContextTokens: number | undefined;\n pruneMessages?: ReturnType<typeof createPruneMessages>;\n /** The amount of time that should pass before another consecutive API call */\n streamBuffer: number | undefined;\n tokenCounter?: t.TokenCounter;\n signal?: AbortSignal;\n /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */\n invokedToolIds?: Set<string>;\n handlerRegistry: HandlerRegistry | undefined;\n}\n\nexport class StandardGraph extends Graph<t.BaseGraphState, GraphNode> {\n private graphState: t.GraphStateChannels<t.BaseGraphState>;\n clientOptions: t.ClientOptions;\n boundModel?: Runnable;\n /** The last recorded timestamp that a stream API call was invoked */\n lastStreamCall: number | undefined;\n systemMessage: SystemMessage | undefined;\n messages: BaseMessage[] = [];\n runId: string | undefined;\n tools?: t.GraphTools;\n toolMap?: t.ToolMap;\n startIndex: number = 0;\n provider: Providers;\n toolEnd: boolean;\n signal?: AbortSignal;\n\n constructor({\n runId,\n tools,\n signal,\n toolMap,\n provider,\n streamBuffer,\n instructions,\n reasoningKey,\n clientOptions,\n toolEnd = false,\n additional_instructions = '',\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.tools = tools;\n this.signal = signal;\n this.toolEnd = toolEnd;\n this.toolMap = toolMap;\n this.provider = provider;\n this.streamBuffer = streamBuffer;\n this.clientOptions = clientOptions;\n this.graphState = this.createGraphState();\n this.boundModel = this.initializeModel();\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n\n let finalInstructions: string | BaseMessageFields | undefined =\n instructions;\n if (additional_instructions) {\n finalInstructions =\n finalInstructions != null && finalInstructions\n ? `${finalInstructions}\\n\\n${additional_instructions}`\n : additional_instructions;\n }\n\n if (\n finalInstructions != null &&\n finalInstructions &&\n provider === Providers.ANTHROPIC &&\n ((\n (clientOptions as t.AnthropicClientOptions).clientOptions\n ?.defaultHeaders as Record<string, string> | undefined\n )?.['anthropic-beta']?.includes('prompt-caching') ??\n false)\n ) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructions,\n cache_control: { type: 'ephemeral' },\n },\n ],\n };\n }\n\n if (finalInstructions != null && finalInstructions !== '') {\n this.systemMessage = new SystemMessage(finalInstructions);\n }\n }\n\n /* Init */\n\n resetValues(keepContent?: boolean): void {\n this.messages = [];\n this.config = resetIfNotEmpty(this.config, undefined);\n if (keepContent !== true) {\n this.contentData = resetIfNotEmpty(this.contentData, []);\n this.contentIndexMap = resetIfNotEmpty(this.contentIndexMap, new Map());\n }\n this.stepKeyIds = resetIfNotEmpty(this.stepKeyIds, new Map());\n this.toolCallStepIds = resetIfNotEmpty(this.toolCallStepIds, new Map());\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.prelimMessageIdsByStepKey = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.currentTokenType = resetIfNotEmpty(\n this.currentTokenType,\n ContentTypes.TEXT\n );\n this.lastToken = resetIfNotEmpty(this.lastToken, undefined);\n this.tokenTypeSwitch = resetIfNotEmpty(this.tokenTypeSwitch, undefined);\n this.indexTokenCountMap = resetIfNotEmpty(this.indexTokenCountMap, {});\n this.currentUsage = resetIfNotEmpty(this.currentUsage, undefined);\n this.tokenCounter = resetIfNotEmpty(this.tokenCounter, undefined);\n this.maxContextTokens = resetIfNotEmpty(this.maxContextTokens, undefined);\n this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);\n }\n\n /* Run Step Processing */\n\n getRunStep(stepId: string): t.RunStep | undefined {\n const index = this.contentIndexMap.get(stepId);\n if (index !== undefined) {\n return this.contentData[index];\n }\n return undefined;\n }\n\n getStepKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepIdByKey(stepKey: string, index?: number): string {\n const stepIds = this.stepKeyIds.get(stepKey);\n if (!stepIds) {\n throw new Error(`No step IDs found for stepKey ${stepKey}`);\n }\n\n if (index === undefined) {\n return stepIds[stepIds.length - 1];\n }\n\n return stepIds[index];\n }\n\n generateStepId(stepKey: string): [string, number] {\n const stepIds = this.stepKeyIds.get(stepKey);\n let newStepId: string | undefined;\n let stepIndex = 0;\n if (stepIds) {\n stepIndex = stepIds.length;\n newStepId = `step_${nanoid()}`;\n stepIds.push(newStepId);\n this.stepKeyIds.set(stepKey, stepIds);\n } else {\n newStepId = `step_${nanoid()}`;\n this.stepKeyIds.set(stepKey, [newStepId]);\n }\n\n return [newStepId, stepIndex];\n }\n\n getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[] {\n if (!metadata) return [];\n\n const keyList = [\n metadata.run_id as string,\n metadata.thread_id as string,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n metadata.checkpoint_ns as string,\n ];\n if (\n this.currentTokenType === ContentTypes.THINK ||\n this.currentTokenType === 'think_and_text'\n ) {\n keyList.push('reasoning');\n }\n\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\n }\n\n return keyList;\n }\n\n checkKeyList(keyList: (string | number | undefined)[]): boolean {\n return keyList.some((key) => key === undefined);\n }\n\n /* Misc.*/\n\n getRunMessages(): BaseMessage[] | undefined {\n return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\n }\n\n /* Graph */\n\n createGraphState(): t.GraphStateChannels<t.BaseGraphState> {\n return {\n messages: {\n value: (x: BaseMessage[], y: BaseMessage[]): BaseMessage[] => {\n if (!x.length) {\n if (this.systemMessage) {\n x.push(this.systemMessage);\n }\n\n this.startIndex = x.length + y.length;\n }\n const current = x.concat(y);\n this.messages = current;\n return current;\n },\n default: () => [],\n },\n };\n }\n\n initializeTools():\n | CustomToolNode<t.BaseGraphState>\n | ToolNode<t.BaseGraphState> {\n // return new ToolNode<t.BaseGraphState>(this.tools);\n return new CustomToolNode<t.BaseGraphState>({\n tools: (this.tools as t.GenericTool[] | undefined) || [],\n toolMap: this.toolMap,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n });\n }\n\n initializeModel(): Runnable {\n const ChatModelClass = getChatModelClass(this.provider);\n const model = new ChatModelClass(this.clientOptions);\n\n if (\n isOpenAILike(this.provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (this.clientOptions as t.OpenAIClientOptions)\n .temperature as number;\n model.topP = (this.clientOptions as t.OpenAIClientOptions).topP as number;\n model.frequencyPenalty = (this.clientOptions as t.OpenAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (this.clientOptions as t.OpenAIClientOptions)\n .presencePenalty as number;\n model.n = (this.clientOptions as t.OpenAIClientOptions).n as number;\n } else if (\n this.provider === Providers.VERTEXAI &&\n model instanceof ChatVertexAI\n ) {\n model.temperature = (this.clientOptions as t.VertexAIClientOptions)\n .temperature as number;\n model.topP = (this.clientOptions as t.VertexAIClientOptions)\n .topP as number;\n model.topK = (this.clientOptions as t.VertexAIClientOptions)\n .topK as number;\n model.topLogprobs = (this.clientOptions as t.VertexAIClientOptions)\n .topLogprobs as number;\n model.frequencyPenalty = (this.clientOptions as t.VertexAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (this.clientOptions as t.VertexAIClientOptions)\n .presencePenalty as number;\n model.maxOutputTokens = (this.clientOptions as t.VertexAIClientOptions)\n .maxOutputTokens as number;\n }\n\n if (!this.tools || this.tools.length === 0) {\n return model as unknown as Runnable;\n }\n\n return (model as t.ModelWithTools).bindTools(this.tools);\n }\n overrideTestModel(\n responses: string[],\n sleep?: number,\n toolCalls?: ToolCall[]\n ): void {\n this.boundModel = createFakeStreamingLLM({\n responses,\n sleep,\n toolCalls,\n });\n }\n\n getNewModel({\n provider,\n clientOptions,\n omitOptions,\n }: {\n provider: Providers;\n clientOptions?: t.ClientOptions;\n omitOptions?: Set<string>;\n }): t.ChatModelInstance {\n const ChatModelClass = getChatModelClass(provider);\n const options =\n omitOptions && clientOptions == null\n ? Object.assign(\n Object.fromEntries(\n Object.entries(this.clientOptions).filter(\n ([key]) => !omitOptions.has(key)\n )\n ),\n clientOptions\n )\n : (clientOptions ?? this.clientOptions);\n return new ChatModelClass(options);\n }\n\n storeUsageMetadata(finalMessage?: BaseMessage): void {\n if (\n finalMessage &&\n 'usage_metadata' in finalMessage &&\n finalMessage.usage_metadata != null\n ) {\n this.currentUsage = finalMessage.usage_metadata as Partial<UsageMetadata>;\n }\n }\n\n cleanupSignalListener(): void {\n if (!this.signal) {\n return;\n }\n if (!this.boundModel) {\n return;\n }\n const client = (this.boundModel as ChatOpenAI | undefined)?.exposedClient;\n if (!client?.abortHandler) {\n return;\n }\n this.signal.removeEventListener('abort', client.abortHandler);\n client.abortHandler = undefined;\n }\n\n createCallModel() {\n return async (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> => {\n const { provider = '' } =\n (config?.configurable as t.GraphConfig | undefined) ?? {};\n if (this.boundModel == null) {\n throw new Error('No Graph model found');\n }\n if (!config || !provider) {\n throw new Error(`No ${config ? 'provider' : 'config'} provided`);\n }\n if (!config.signal) {\n config.signal = this.signal;\n }\n this.config = config;\n const { messages } = state;\n\n let messagesToUse = messages;\n if (\n !this.pruneMessages &&\n this.tokenCounter &&\n this.maxContextTokens != null &&\n this.indexTokenCountMap[0] != null\n ) {\n const isAnthropicWithThinking =\n (this.provider === Providers.ANTHROPIC &&\n (this.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (this.provider === Providers.BEDROCK &&\n (this.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null);\n\n this.pruneMessages = createPruneMessages({\n provider: this.provider,\n indexTokenCountMap: this.indexTokenCountMap,\n maxTokens: this.maxContextTokens,\n tokenCounter: this.tokenCounter,\n startIndex: this.startIndex,\n thinkingEnabled: isAnthropicWithThinking,\n });\n }\n if (this.pruneMessages) {\n const { context, indexTokenCountMap } = this.pruneMessages({\n messages,\n usageMetadata: this.currentUsage,\n // startOnMessageType: 'human',\n });\n this.indexTokenCountMap = indexTokenCountMap;\n messagesToUse = context;\n }\n\n const finalMessages = messagesToUse;\n const lastMessageX =\n finalMessages.length >= 2\n ? finalMessages[finalMessages.length - 2]\n : null;\n const lastMessageY =\n finalMessages.length >= 1\n ? finalMessages[finalMessages.length - 1]\n : null;\n\n if (\n provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY instanceof ToolMessage &&\n typeof lastMessageX.content === 'string'\n ) {\n finalMessages[finalMessages.length - 2].content = '';\n }\n\n const isLatestToolMessage = lastMessageY instanceof ToolMessage;\n\n if (isLatestToolMessage && provider === Providers.ANTHROPIC) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n isLatestToolMessage &&\n (isOpenAILike(provider) || isGoogleLike(provider))\n ) {\n formatArtifactPayload(finalMessages);\n }\n\n if (this.lastStreamCall != null && this.streamBuffer != null) {\n const timeSinceLastCall = Date.now() - this.lastStreamCall;\n if (timeSinceLastCall < this.streamBuffer) {\n const timeToWait =\n Math.ceil((this.streamBuffer - timeSinceLastCall) / 1000) * 1000;\n await sleep(timeToWait);\n }\n }\n\n this.lastStreamCall = Date.now();\n\n let result: Partial<t.BaseGraphState>;\n if (\n (this.tools?.length ?? 0) > 0 &&\n manualToolStreamProviders.has(provider)\n ) {\n const stream = await this.boundModel.stream(finalMessages, config);\n let finalChunk: AIMessageChunk | undefined;\n for await (const chunk of stream) {\n dispatchCustomEvent(GraphEvents.CHAT_MODEL_STREAM, { chunk }, config);\n if (!finalChunk) {\n finalChunk = chunk;\n } else {\n finalChunk = concat(finalChunk, chunk);\n }\n }\n\n finalChunk = modifyDeltaProperties(this.provider, finalChunk);\n result = { messages: [finalChunk as AIMessageChunk] };\n } else {\n const finalMessage = (await this.boundModel.invoke(\n finalMessages,\n config\n )) as AIMessageChunk;\n if ((finalMessage.tool_calls?.length ?? 0) > 0) {\n finalMessage.tool_calls = finalMessage.tool_calls?.filter(\n (tool_call) => {\n if (!tool_call.name) {\n return false;\n }\n return true;\n }\n );\n }\n result = { messages: [finalMessage] };\n }\n\n this.storeUsageMetadata(result.messages?.[0]);\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createWorkflow(): t.CompiledWorkflow<t.BaseGraphState> {\n const routeMessage = (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n return toolsCondition(state, this.invokedToolIds);\n };\n\n const workflow = new StateGraph<t.BaseGraphState>({\n channels: this.graphState,\n })\n .addNode(AGENT, this.createCallModel())\n .addNode(TOOLS, this.initializeTools())\n .addEdge(START, AGENT)\n .addConditionalEdges(AGENT, routeMessage)\n .addEdge(TOOLS, this.toolEnd ? END : AGENT);\n\n return workflow.compile();\n }\n\n /* Dispatchers */\n\n /**\n * Dispatches a run step to the client, returns the step ID\n */\n dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): string {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n const [stepId, stepIndex] = this.generateStepId(stepKey);\n if (stepDetails.type === StepTypes.TOOL_CALLS && stepDetails.tool_calls) {\n for (const tool_call of stepDetails.tool_calls) {\n const toolCallId = tool_call.id ?? '';\n if (!toolCallId || this.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n this.toolCallStepIds.set(toolCallId, stepId);\n }\n }\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: stepDetails.type,\n index: this.contentData.length,\n stepDetails,\n usage: null,\n };\n\n const runId = this.runId ?? '';\n if (runId) {\n runStep.runId = runId;\n }\n\n this.contentData.push(runStep);\n this.contentIndexMap.set(stepId, runStep.index);\n dispatchCustomEvent(GraphEvents.ON_RUN_STEP, runStep, this.config);\n return stepId;\n }\n\n handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): void {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n if (!data.output) {\n return;\n }\n\n const { input, output } = data;\n const { tool_call_id } = output;\n const stepId = this.toolCallStepIds.get(tool_call_id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${tool_call_id}`);\n }\n\n const runStep = this.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const dispatchedOutput =\n typeof output.content === 'string'\n ? output.content\n : JSON.stringify(output.content);\n\n const args = typeof input === 'string' ? input : input.input;\n const tool_call = {\n args: typeof args === 'string' ? args : JSON.stringify(args),\n name: output.name ?? '',\n id: output.tool_call_id,\n output: omitOutput === true ? '' : dispatchedOutput,\n progress: 1,\n };\n\n this.handlerRegistry?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n this\n );\n }\n /**\n * Static version of handleToolCallError to avoid creating strong references\n * that prevent garbage collection\n */\n static handleToolCallErrorStatic(\n graph: StandardGraph,\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): void {\n if (!graph.config) {\n throw new Error('No config provided');\n }\n\n if (!data.id) {\n console.warn('No Tool ID provided for Tool Error');\n return;\n }\n\n const stepId = graph.toolCallStepIds.get(data.id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${data.id}`);\n }\n\n const { name, input: args, error } = data;\n\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const tool_call: t.ProcessedToolCall = {\n id: data.id,\n name: name || '',\n args: typeof args === 'string' ? args : JSON.stringify(args),\n output: `Error processing tool${error?.message != null ? `: ${error.message}` : ''}`,\n progress: 1,\n };\n\n graph.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n graph\n );\n }\n\n /**\n * Instance method that delegates to the static method\n * Kept for backward compatibility\n */\n handleToolCallError(\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): void {\n StandardGraph.handleToolCallErrorStatic(this, data, metadata);\n }\n\n dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void {\n if (!this.config) {\n throw new Error('No config provided');\n } else if (!id) {\n throw new Error('No step ID found');\n }\n const runStepDelta: t.RunStepDeltaEvent = {\n id,\n delta,\n };\n dispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n }\n\n dispatchMessageDelta(id: string, delta: t.MessageDelta): void {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const messageDelta: t.MessageDeltaEvent = {\n id,\n delta,\n };\n dispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n }\n\n dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n dispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n };\n}\n"],"names":["CustomToolNode"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { AIMessageChunk } from '@langchain/core/messages';
2
+ import { ChatGenerationChunk } from '@langchain/core/outputs';
1
3
  import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
2
4
  import { getEnvironmentVariable } from '@langchain/core/utils/env';
3
5
  import { GoogleGenerativeAI } from '@google/generative-ai';
@@ -100,8 +102,8 @@ class CustomChatGoogleGenerativeAI extends ChatGoogleGenerativeAI {
100
102
  const { stream } = await this.client.generateContentStream(request);
101
103
  return stream;
102
104
  });
103
- let usageMetadata;
104
105
  let index = 0;
106
+ let lastUsageMetadata;
105
107
  for await (const response of stream) {
106
108
  if ('usageMetadata' in response &&
107
109
  this.streamUsage !== false &&
@@ -109,26 +111,14 @@ class CustomChatGoogleGenerativeAI extends ChatGoogleGenerativeAI {
109
111
  const genAIUsageMetadata = response.usageMetadata;
110
112
  const output_tokens = (genAIUsageMetadata?.candidatesTokenCount ?? 0) +
111
113
  (genAIUsageMetadata?.thoughtsTokenCount ?? 0);
112
- if (!usageMetadata) {
113
- usageMetadata = {
114
- input_tokens: genAIUsageMetadata?.promptTokenCount ?? 0,
115
- output_tokens,
116
- total_tokens: genAIUsageMetadata?.totalTokenCount ?? 0,
117
- };
118
- }
119
- else {
120
- // Under the hood, LangChain combines the prompt tokens. Google returns the updated
121
- // total each time, so we need to find the difference between the tokens.
122
- const outputTokenDiff = output_tokens - usageMetadata.output_tokens;
123
- usageMetadata = {
124
- input_tokens: 0,
125
- output_tokens: outputTokenDiff,
126
- total_tokens: outputTokenDiff,
127
- };
128
- }
114
+ lastUsageMetadata = {
115
+ input_tokens: genAIUsageMetadata?.promptTokenCount ?? 0,
116
+ output_tokens,
117
+ total_tokens: genAIUsageMetadata?.totalTokenCount ?? 0,
118
+ };
129
119
  }
130
120
  const chunk = convertResponseContentToChatGenerationChunk(response, {
131
- usageMetadata,
121
+ usageMetadata: undefined,
132
122
  index,
133
123
  });
134
124
  index += 1;
@@ -138,6 +128,17 @@ class CustomChatGoogleGenerativeAI extends ChatGoogleGenerativeAI {
138
128
  yield chunk;
139
129
  await runManager?.handleLLMNewToken(chunk.text || '', undefined, undefined, undefined, undefined, { chunk });
140
130
  }
131
+ if (lastUsageMetadata) {
132
+ const finalChunk = new ChatGenerationChunk({
133
+ text: '',
134
+ message: new AIMessageChunk({
135
+ content: '',
136
+ usage_metadata: lastUsageMetadata,
137
+ }),
138
+ });
139
+ yield finalChunk;
140
+ await runManager?.handleLLMNewToken(finalChunk.text || '', undefined, undefined, undefined, undefined, { chunk: finalChunk });
141
+ }
141
142
  }
142
143
  }
143
144
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../src/llm/google/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { ChatGoogleGenerativeAI } from '@langchain/google-genai';\nimport { getEnvironmentVariable } from '@langchain/core/utils/env';\nimport { GoogleGenerativeAI as GenerativeAI } from '@google/generative-ai';\nimport type {\n GenerateContentRequest,\n SafetySetting,\n} from '@google/generative-ai';\nimport type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type { BaseMessage, UsageMetadata } from '@langchain/core/messages';\nimport type { GeminiGenerationConfig } from '@langchain/google-common';\nimport type { ChatGenerationChunk } from '@langchain/core/outputs';\nimport type { GeminiApiUsageMetadata } from './types';\nimport type { GoogleClientOptions } from '@/types';\nimport {\n convertResponseContentToChatGenerationChunk,\n convertBaseMessagesToContent,\n} from './utils/common';\n\nexport class CustomChatGoogleGenerativeAI extends ChatGoogleGenerativeAI {\n thinkingConfig?: GeminiGenerationConfig['thinkingConfig'];\n constructor(fields: GoogleClientOptions) {\n super(fields);\n\n this.model = fields.model.replace(/^models\\//, '');\n\n this.maxOutputTokens = fields.maxOutputTokens ?? this.maxOutputTokens;\n\n if (this.maxOutputTokens != null && this.maxOutputTokens < 0) {\n throw new Error('`maxOutputTokens` must be a positive integer');\n }\n\n this.temperature = fields.temperature ?? this.temperature;\n if (\n this.temperature != null &&\n (this.temperature < 0 || this.temperature > 2)\n ) {\n throw new Error('`temperature` must be in the range of [0.0,2.0]');\n }\n\n this.topP = fields.topP ?? this.topP;\n if (this.topP != null && this.topP < 0) {\n throw new Error('`topP` must be a positive integer');\n }\n\n if (this.topP != null && this.topP > 1) {\n throw new Error('`topP` must be below 1.');\n }\n\n this.topK = fields.topK ?? this.topK;\n if (this.topK != null && this.topK < 0) {\n throw new Error('`topK` must be a positive integer');\n }\n\n this.stopSequences = fields.stopSequences ?? this.stopSequences;\n\n this.apiKey = fields.apiKey ?? getEnvironmentVariable('GOOGLE_API_KEY');\n if (this.apiKey == null || this.apiKey === '') {\n throw new Error(\n 'Please set an API key for Google GenerativeAI ' +\n 'in the environment variable GOOGLE_API_KEY ' +\n 'or in the `apiKey` field of the ' +\n 'ChatGoogleGenerativeAI constructor'\n );\n }\n\n this.safetySettings = fields.safetySettings ?? this.safetySettings;\n if (this.safetySettings && this.safetySettings.length > 0) {\n const safetySettingsSet = new Set(\n this.safetySettings.map((s) => s.category)\n );\n if (safetySettingsSet.size !== this.safetySettings.length) {\n throw new Error(\n 'The categories in `safetySettings` array must be unique'\n );\n }\n }\n\n this.thinkingConfig = fields.thinkingConfig ?? this.thinkingConfig;\n\n this.streaming = fields.streaming ?? this.streaming;\n this.json = fields.json;\n\n // @ts-ignore - Accessing private property from parent class\n this.client = new GenerativeAI(this.apiKey).getGenerativeModel(\n {\n model: this.model,\n safetySettings: this.safetySettings as SafetySetting[],\n generationConfig: {\n stopSequences: this.stopSequences,\n maxOutputTokens: this.maxOutputTokens,\n temperature: this.temperature,\n topP: this.topP,\n topK: this.topK,\n ...(this.json != null\n ? { responseMimeType: 'application/json' }\n : {}),\n },\n },\n {\n apiVersion: fields.apiVersion,\n baseUrl: fields.baseUrl,\n customHeaders: fields.customHeaders,\n }\n );\n this.streamUsage = fields.streamUsage ?? this.streamUsage;\n }\n\n invocationParams(\n options?: this['ParsedCallOptions']\n ): Omit<GenerateContentRequest, 'contents'> {\n const params = super.invocationParams(options);\n if (this.thinkingConfig) {\n /** @ts-ignore */\n this.client.generationConfig = {\n /** @ts-ignore */\n ...this.client.generationConfig,\n /** @ts-ignore */\n thinkingConfig: this.thinkingConfig,\n };\n }\n return params;\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const prompt = convertBaseMessagesToContent(\n messages,\n this._isMultimodalModel,\n this.useSystemInstruction\n );\n let actualPrompt = prompt;\n if (prompt?.[0].role === 'system') {\n const [systemInstruction] = prompt;\n /** @ts-ignore */\n this.client.systemInstruction = systemInstruction;\n actualPrompt = prompt.slice(1);\n }\n const parameters = this.invocationParams(options);\n const request = {\n ...parameters,\n contents: actualPrompt,\n };\n const stream = await this.caller.callWithOptions(\n { signal: options.signal },\n async () => {\n /** @ts-ignore */\n const { stream } = await this.client.generateContentStream(request);\n return stream;\n }\n );\n\n let usageMetadata: UsageMetadata | undefined;\n let index = 0;\n for await (const response of stream) {\n if (\n 'usageMetadata' in response &&\n this.streamUsage !== false &&\n options.streamUsage !== false\n ) {\n const genAIUsageMetadata = response.usageMetadata as\n | GeminiApiUsageMetadata\n | undefined;\n const output_tokens =\n (genAIUsageMetadata?.candidatesTokenCount ?? 0) +\n (genAIUsageMetadata?.thoughtsTokenCount ?? 0);\n if (!usageMetadata) {\n usageMetadata = {\n input_tokens: genAIUsageMetadata?.promptTokenCount ?? 0,\n output_tokens,\n total_tokens: genAIUsageMetadata?.totalTokenCount ?? 0,\n };\n } else {\n // Under the hood, LangChain combines the prompt tokens. Google returns the updated\n // total each time, so we need to find the difference between the tokens.\n const outputTokenDiff = output_tokens - usageMetadata.output_tokens;\n usageMetadata = {\n input_tokens: 0,\n output_tokens: outputTokenDiff,\n total_tokens: outputTokenDiff,\n };\n }\n }\n\n const chunk = convertResponseContentToChatGenerationChunk(response, {\n usageMetadata,\n index,\n });\n index += 1;\n if (!chunk) {\n continue;\n }\n\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || '',\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n}\n"],"names":["GenerativeAI"],"mappings":";;;;;AAAA;AAmBM,MAAO,4BAA6B,SAAQ,sBAAsB,CAAA;AACtE,IAAA,cAAc;AACd,IAAA,WAAA,CAAY,MAA2B,EAAA;QACrC,KAAK,CAAC,MAAM,CAAC;AAEb,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAElD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe;AAErE,QAAA,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE;AAC5D,YAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;;QAGjE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW;AACzD,QAAA,IACE,IAAI,CAAC,WAAW,IAAI,IAAI;AACxB,aAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAC9C;AACA,YAAA,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC;;QAGpE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;AACpC,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;AACtC,YAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;;AAGtD,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;AACtC,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;;QAG5C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;AACpC,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;AACtC,YAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;;QAGtD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa;QAE/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,sBAAsB,CAAC,gBAAgB,CAAC;AACvE,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE;YAC7C,MAAM,IAAI,KAAK,CACb,gDAAgD;gBAC9C,6CAA6C;gBAC7C,kCAAkC;AAClC,gBAAA,oCAAoC,CACvC;;QAGH,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc;AAClE,QAAA,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YACzD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAC3C;YACD,IAAI,iBAAiB,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;AACzD,gBAAA,MAAM,IAAI,KAAK,CACb,yDAAyD,CAC1D;;;QAIL,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc;QAElE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;AACnD,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;;AAGvB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAIA,kBAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAC5D;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,cAAc,EAAE,IAAI,CAAC,cAAiC;AACtD,YAAA,gBAAgB,EAAE;gBAChB,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,IAAI,IAAI,CAAC,IAAI,IAAI;AACf,sBAAE,EAAE,gBAAgB,EAAE,kBAAkB;sBACtC,EAAE,CAAC;AACR,aAAA;SACF,EACD;YACE,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,aAAa,EAAE,MAAM,CAAC,aAAa;AACpC,SAAA,CACF;QACD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW;;AAG3D,IAAA,gBAAgB,CACd,OAAmC,EAAA;QAEnC,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAC9C,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;;AAEvB,YAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG;;AAE7B,gBAAA,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB;;gBAE/B,cAAc,EAAE,IAAI,CAAC,cAAc;aACpC;;AAEH,QAAA,OAAO,MAAM;;IAGf,OAAO,qBAAqB,CAC1B,QAAuB,EACvB,OAAkC,EAClC,UAAqC,EAAA;AAErC,QAAA,MAAM,MAAM,GAAG,4BAA4B,CACzC,QAAQ,EACR,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,oBAAoB,CAC1B;QACD,IAAI,YAAY,GAAG,MAAM;QACzB,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;AACjC,YAAA,MAAM,CAAC,iBAAiB,CAAC,GAAG,MAAM;;AAElC,YAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,iBAAiB;AACjD,YAAA,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;;QAEhC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;AACjD,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,GAAG,UAAU;AACb,YAAA,QAAQ,EAAE,YAAY;SACvB;AACD,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAC9C,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAC1B,YAAW;;AAET,YAAA,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC;AACnE,YAAA,OAAO,MAAM;AACf,SAAC,CACF;AAED,QAAA,IAAI,aAAwC;QAC5C,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,WAAW,MAAM,QAAQ,IAAI,MAAM,EAAE;YACnC,IACE,eAAe,IAAI,QAAQ;gBAC3B,IAAI,CAAC,WAAW,KAAK,KAAK;AAC1B,gBAAA,OAAO,CAAC,WAAW,KAAK,KAAK,EAC7B;AACA,gBAAA,MAAM,kBAAkB,GAAG,QAAQ,CAAC,aAEvB;gBACb,MAAM,aAAa,GACjB,CAAC,kBAAkB,EAAE,oBAAoB,IAAI,CAAC;AAC9C,qBAAC,kBAAkB,EAAE,kBAAkB,IAAI,CAAC,CAAC;gBAC/C,IAAI,CAAC,aAAa,EAAE;AAClB,oBAAA,aAAa,GAAG;AACd,wBAAA,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;wBACvD,aAAa;AACb,wBAAA,YAAY,EAAE,kBAAkB,EAAE,eAAe,IAAI,CAAC;qBACvD;;qBACI;;;AAGL,oBAAA,MAAM,eAAe,GAAG,aAAa,GAAG,aAAa,CAAC,aAAa;AACnE,oBAAA,aAAa,GAAG;AACd,wBAAA,YAAY,EAAE,CAAC;AACf,wBAAA,aAAa,EAAE,eAAe;AAC9B,wBAAA,YAAY,EAAE,eAAe;qBAC9B;;;AAIL,YAAA,MAAM,KAAK,GAAG,2CAA2C,CAAC,QAAQ,EAAE;gBAClE,aAAa;gBACb,KAAK;AACN,aAAA,CAAC;YACF,KAAK,IAAI,CAAC;YACV,IAAI,CAAC,KAAK,EAAE;gBACV;;AAGF,YAAA,MAAM,KAAK;YACX,MAAM,UAAU,EAAE,iBAAiB,CACjC,KAAK,CAAC,IAAI,IAAI,EAAE,EAChB,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,EAAE,KAAK,EAAE,CACV;;;AAGN;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/llm/google/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { AIMessageChunk } from '@langchain/core/messages';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport { ChatGoogleGenerativeAI } from '@langchain/google-genai';\nimport { getEnvironmentVariable } from '@langchain/core/utils/env';\nimport { GoogleGenerativeAI as GenerativeAI } from '@google/generative-ai';\nimport type {\n GenerateContentRequest,\n SafetySetting,\n} from '@google/generative-ai';\nimport type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type { BaseMessage, UsageMetadata } from '@langchain/core/messages';\nimport type { GeminiGenerationConfig } from '@langchain/google-common';\nimport type { GeminiApiUsageMetadata } from './types';\nimport type { GoogleClientOptions } from '@/types';\nimport {\n convertResponseContentToChatGenerationChunk,\n convertBaseMessagesToContent,\n} from './utils/common';\n\nexport class CustomChatGoogleGenerativeAI extends ChatGoogleGenerativeAI {\n thinkingConfig?: GeminiGenerationConfig['thinkingConfig'];\n constructor(fields: GoogleClientOptions) {\n super(fields);\n\n this.model = fields.model.replace(/^models\\//, '');\n\n this.maxOutputTokens = fields.maxOutputTokens ?? this.maxOutputTokens;\n\n if (this.maxOutputTokens != null && this.maxOutputTokens < 0) {\n throw new Error('`maxOutputTokens` must be a positive integer');\n }\n\n this.temperature = fields.temperature ?? this.temperature;\n if (\n this.temperature != null &&\n (this.temperature < 0 || this.temperature > 2)\n ) {\n throw new Error('`temperature` must be in the range of [0.0,2.0]');\n }\n\n this.topP = fields.topP ?? this.topP;\n if (this.topP != null && this.topP < 0) {\n throw new Error('`topP` must be a positive integer');\n }\n\n if (this.topP != null && this.topP > 1) {\n throw new Error('`topP` must be below 1.');\n }\n\n this.topK = fields.topK ?? this.topK;\n if (this.topK != null && this.topK < 0) {\n throw new Error('`topK` must be a positive integer');\n }\n\n this.stopSequences = fields.stopSequences ?? this.stopSequences;\n\n this.apiKey = fields.apiKey ?? getEnvironmentVariable('GOOGLE_API_KEY');\n if (this.apiKey == null || this.apiKey === '') {\n throw new Error(\n 'Please set an API key for Google GenerativeAI ' +\n 'in the environment variable GOOGLE_API_KEY ' +\n 'or in the `apiKey` field of the ' +\n 'ChatGoogleGenerativeAI constructor'\n );\n }\n\n this.safetySettings = fields.safetySettings ?? this.safetySettings;\n if (this.safetySettings && this.safetySettings.length > 0) {\n const safetySettingsSet = new Set(\n this.safetySettings.map((s) => s.category)\n );\n if (safetySettingsSet.size !== this.safetySettings.length) {\n throw new Error(\n 'The categories in `safetySettings` array must be unique'\n );\n }\n }\n\n this.thinkingConfig = fields.thinkingConfig ?? this.thinkingConfig;\n\n this.streaming = fields.streaming ?? this.streaming;\n this.json = fields.json;\n\n // @ts-ignore - Accessing private property from parent class\n this.client = new GenerativeAI(this.apiKey).getGenerativeModel(\n {\n model: this.model,\n safetySettings: this.safetySettings as SafetySetting[],\n generationConfig: {\n stopSequences: this.stopSequences,\n maxOutputTokens: this.maxOutputTokens,\n temperature: this.temperature,\n topP: this.topP,\n topK: this.topK,\n ...(this.json != null\n ? { responseMimeType: 'application/json' }\n : {}),\n },\n },\n {\n apiVersion: fields.apiVersion,\n baseUrl: fields.baseUrl,\n customHeaders: fields.customHeaders,\n }\n );\n this.streamUsage = fields.streamUsage ?? this.streamUsage;\n }\n\n invocationParams(\n options?: this['ParsedCallOptions']\n ): Omit<GenerateContentRequest, 'contents'> {\n const params = super.invocationParams(options);\n if (this.thinkingConfig) {\n /** @ts-ignore */\n this.client.generationConfig = {\n /** @ts-ignore */\n ...this.client.generationConfig,\n /** @ts-ignore */\n thinkingConfig: this.thinkingConfig,\n };\n }\n return params;\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const prompt = convertBaseMessagesToContent(\n messages,\n this._isMultimodalModel,\n this.useSystemInstruction\n );\n let actualPrompt = prompt;\n if (prompt?.[0].role === 'system') {\n const [systemInstruction] = prompt;\n /** @ts-ignore */\n this.client.systemInstruction = systemInstruction;\n actualPrompt = prompt.slice(1);\n }\n const parameters = this.invocationParams(options);\n const request = {\n ...parameters,\n contents: actualPrompt,\n };\n const stream = await this.caller.callWithOptions(\n { signal: options.signal },\n async () => {\n /** @ts-ignore */\n const { stream } = await this.client.generateContentStream(request);\n return stream;\n }\n );\n\n let index = 0;\n let lastUsageMetadata: UsageMetadata | undefined;\n for await (const response of stream) {\n if (\n 'usageMetadata' in response &&\n this.streamUsage !== false &&\n options.streamUsage !== false\n ) {\n const genAIUsageMetadata = response.usageMetadata as\n | GeminiApiUsageMetadata\n | undefined;\n\n const output_tokens =\n (genAIUsageMetadata?.candidatesTokenCount ?? 0) +\n (genAIUsageMetadata?.thoughtsTokenCount ?? 0);\n lastUsageMetadata = {\n input_tokens: genAIUsageMetadata?.promptTokenCount ?? 0,\n output_tokens,\n total_tokens: genAIUsageMetadata?.totalTokenCount ?? 0,\n };\n }\n\n const chunk = convertResponseContentToChatGenerationChunk(response, {\n usageMetadata: undefined,\n index,\n });\n index += 1;\n if (!chunk) {\n continue;\n }\n\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text || '',\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n\n if (lastUsageMetadata) {\n const finalChunk = new ChatGenerationChunk({\n text: '',\n message: new AIMessageChunk({\n content: '',\n usage_metadata: lastUsageMetadata,\n }),\n });\n yield finalChunk;\n await runManager?.handleLLMNewToken(\n finalChunk.text || '',\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: finalChunk }\n );\n }\n }\n}\n"],"names":["GenerativeAI"],"mappings":"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"}