diff --git a/.gitignore b/.gitignore index 867282cdd58..58766442860 100644 --- a/.gitignore +++ b/.gitignore @@ -114,3 +114,7 @@ extensions/ # Only allow apps/oss-app, ignore all other apps apps/*/ !apps/oss-app/ + +# Claude - session/user specific files +.claude/plans/ +.claude/settings.local.json diff --git a/package.json b/package.json index 0dc2be0826b..2b881fbb94a 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,9 @@ "unset-value": "2.0.1", "webpack-dev-middleware": "7.4.2", "ws": "8.18.3", - "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz", + "uuid": "^10.0.0", + "request>uuid": "^3.4.0" } }, "engines": { @@ -94,12 +96,14 @@ "pnpm": "^10.26.0" }, "resolutions": { + "@anthropic-ai/sdk": "^0.73.0", "@google/generative-ai": "^0.24.0", "@grpc/grpc-js": "^1.10.10", - "@langchain/core": "0.3.61", + "@langchain/core": "1.1.20", "@qdrant/openapi-typescript-fetch": "1.2.6", - "openai": "4.96.0", - "protobufjs": "7.4.0" + "openai": "6.19.0", + "protobufjs": "7.4.0", + "uuid": "^10.0.0" }, "eslintIgnore": [ "**/dist", diff --git a/packages/agentflow/package.json b/packages/agentflow/package.json index cd96960a326..67ceebdc15a 100644 --- a/packages/agentflow/package.json +++ b/packages/agentflow/package.json @@ -71,7 +71,7 @@ "@tabler/icons-react": "^3.7.0", "axios": "^1.7.2", "lodash": "^4.17.21", - "uuid": "^9.0.1" + "uuid": "^10.0.0" }, "devDependencies": { "@testing-library/jest-dom": "^6.6.3", @@ -81,7 +81,6 @@ "@types/lodash": "^4.14.195", "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0", - "@types/uuid": "^9.0.0", "@typescript-eslint/eslint-plugin": "^8.18.2", "@typescript-eslint/parser": "^8.18.2", "@vitejs/plugin-react": "^4.2.0", diff --git a/packages/components/credentials/AzureOpenAIApi.credential.ts b/packages/components/credentials/AzureOpenAIApi.credential.ts index 65f63f379ac..115d46e9d5d 100644 --- a/packages/components/credentials/AzureOpenAIApi.credential.ts +++ b/packages/components/credentials/AzureOpenAIApi.credential.ts @@ -36,9 +36,9 @@ class AzureOpenAIApi implements INodeCredential { label: 'Azure OpenAI Api Version', name: 'azureOpenAIApiVersion', type: 'string', - placeholder: '2023-06-01-preview', + placeholder: '2024-10-21', description: - 'Description of Supported API Versions. Please refer examples' + 'Description of Supported API Versions. Please refer API version lifecycle' } ] } diff --git a/packages/components/jest.config.js b/packages/components/jest.config.js index e17a42ac689..ff1c8ca1d55 100644 --- a/packages/components/jest.config.js +++ b/packages/components/jest.config.js @@ -17,6 +17,10 @@ module.exports = { // use these imports, so stubbing them out is safe. // Note: @langchain/core is NOT stubbed here because it ships CJS builds // (e.g. tools.cjs) that Jest can require() normally. - '^@modelcontextprotocol/sdk/(.*)$': '/test/__mocks__/esm-stub.js' + '^@modelcontextprotocol/sdk/(.*)$': '/test/__mocks__/esm-stub.js', + // multer-azure-blob-storage transitively pulls in azure-storage -> request@2.88.2 -> uuid/v4. + // The uuid/v4 sub-path no longer exists in modern uuid versions, breaking module resolution. + // Tests don't exercise Azure storage, so stubbing it out avoids the chain entirely. + '^multer-azure-blob-storage$': '/test/__mocks__/esm-stub.js' } } diff --git a/packages/components/models.json b/packages/components/models.json index 2e1bed31fbd..574f01b8c4f 100644 --- a/packages/components/models.json +++ b/packages/components/models.json @@ -3,6 +3,20 @@ { "name": "awsChatBedrock", "models": [ + { + "label": "anthropic.claude-opus-4-6-v1", + "name": "anthropic.claude-opus-4-6-v1", + "description": "Claude 4.6 Opus", + "input_cost": 0.000005, + "output_cost": 0.000025 + }, + { + "label": "anthropic.claude-sonnet-4-6", + "name": "anthropic.claude-sonnet-4-6", + "description": "Claude 4.6 Sonnet", + "input_cost": 0.000003, + "output_cost": 0.000015 + }, { "label": "anthropic.claude-opus-4-5-20251101-v1:0", "name": "anthropic.claude-opus-4-5-20251101-v1:0", @@ -382,6 +396,30 @@ "input_cost": 1.1e-6, "output_cost": 4.4e-6 }, + { + "label": "o3", + "name": "o3", + "input_cost": 2e-6, + "output_cost": 8e-6 + }, + { + "label": "o3-pro", + "name": "o3-pro", + "input_cost": 2e-5, + "output_cost": 8e-5 + }, + { + "label": "o4-mini", + "name": "o4-mini", + "input_cost": 1.1e-6, + "output_cost": 4.4e-6 + }, + { + "label": "codex-mini", + "name": "codex-mini", + "input_cost": 1.5e-6, + "output_cost": 6e-6 + }, { "label": "o1", "name": "o1", @@ -454,6 +492,18 @@ "input_cost": 0.0000004, "output_cost": 0.0000016 }, + { + "label": "gpt-4.1-nano", + "name": "gpt-4.1-nano", + "input_cost": 1e-7, + "output_cost": 4e-7 + }, + { + "label": "gpt-5-pro", + "name": "gpt-5-pro", + "input_cost": 2.1e-5, + "output_cost": 1.68e-4 + }, { "label": "gpt-5-chat-latest", "name": "gpt-5-chat-latest", @@ -536,6 +586,20 @@ { "name": "chatAnthropic", "models": [ + { + "label": "claude-opus-4-6", + "name": "claude-opus-4-6", + "description": "Claude 4.6 Opus", + "input_cost": 0.000005, + "output_cost": 0.000025 + }, + { + "label": "claude-sonnet-4-6", + "name": "claude-sonnet-4-6", + "description": "Claude 4.6 Sonnet", + "input_cost": 0.000003, + "output_cost": 0.000015 + }, { "label": "claude-opus-4-5", "name": "claude-opus-4-5", @@ -666,11 +730,23 @@ "name": "chatGoogleGenerativeAI", "models": [ { - "label": "gemini-3-pro-preview", - "name": "gemini-3-pro-preview", + "label": "gemini-3.1-pro-preview", + "name": "gemini-3.1-pro-preview", "input_cost": 0.00002, "output_cost": 0.00012 }, + { + "label": "gemini-3.1-flash-lite-preview", + "name": "gemini-3.1-flash-lite-preview", + "input_cost": 0.00000025, + "output_cost": 0.0000015 + }, + { + "label": "gemini-3.1-flash-image-preview", + "name": "gemini-3.1-flash-image-preview", + "input_cost": 0.00000025, + "output_cost": 0.000067 + }, { "label": "gemini-3-flash-preview", "name": "gemini-3-flash-preview", @@ -754,11 +830,17 @@ "name": "chatGoogleVertexAI", "models": [ { - "label": "gemini-3-pro-preview", - "name": "gemini-3-pro-preview", + "label": "gemini-3.1-pro-preview", + "name": "gemini-3.1-pro-preview", "input_cost": 0.00002, "output_cost": 0.00012 }, + { + "label": "gemini-3.1-flash-lite-preview", + "name": "gemini-3.1-flash-lite-preview", + "input_cost": 0.00000025, + "output_cost": 0.0000015 + }, { "label": "gemini-3-flash-preview", "name": "gemini-3-flash-preview", @@ -831,6 +913,20 @@ "input_cost": 1.25e-7, "output_cost": 3.75e-7 }, + { + "label": "claude-opus-4-6", + "name": "claude-opus-4-6", + "description": "Claude 4.6 Opus", + "input_cost": 0.000005, + "output_cost": 0.000025 + }, + { + "label": "claude-sonnet-4-6", + "name": "claude-sonnet-4-6", + "description": "Claude 4.6 Sonnet", + "input_cost": 0.000003, + "output_cost": 0.000015 + }, { "label": "claude-opus-4-5@20251101", "name": "claude-opus-4-5@20251101", @@ -1137,6 +1233,18 @@ { "name": "chatOpenAI", "models": [ + { + "label": "gpt-5.4", + "name": "gpt-5.4", + "input_cost": 0.0000025, + "output_cost": 0.000015 + }, + { + "label": "gpt-5.4-pro", + "name": "gpt-5.4-pro", + "input_cost": 0.00003, + "output_cost": 0.00018 + }, { "label": "gpt-5.2", "name": "gpt-5.2", @@ -1245,6 +1353,12 @@ "input_cost": 2.5e-6, "output_cost": 0.00001 }, + { + "label": "o4-mini (latest)", + "name": "o4-mini", + "input_cost": 1.5e-7, + "output_cost": 6e-7 + }, { "label": "o3-mini (latest)", "name": "o3-mini", @@ -1376,12 +1490,6 @@ "name": "gpt-3.5-turbo-16k-0613", "input_cost": 0.000003, "output_cost": 0.000004 - }, - { - "label": "o4-mini", - "name": "o4-mini", - "input_cost": 1.5e-7, - "output_cost": 6e-7 } ] }, diff --git a/packages/components/nodes/agentflow/Agent/Agent.ts b/packages/components/nodes/agentflow/Agent/Agent.ts index bb578500c2c..63730c2d15b 100644 --- a/packages/components/nodes/agentflow/Agent/Agent.ts +++ b/packages/components/nodes/agentflow/Agent/Agent.ts @@ -11,10 +11,11 @@ import { IServerSideEventStreamer, IUsedTool } from '../../../src/Interface' -import { AIMessageChunk, BaseMessageLike, MessageContentText } from '@langchain/core/messages' +import { ContentBlock } from 'langchain' +import { AIMessageChunk, BaseMessageLike } from '@langchain/core/messages' import { AnalyticHandler } from '../../../src/handler' import { DEFAULT_SUMMARIZER_TEMPLATE } from '../prompt' -import { ILLMMessage } from '../Interface.Agentflow' +import { ILLMMessage, IResponseMetadata } from '../Interface.Agentflow' import { Tool } from '@langchain/core/tools' import { ARTIFACTS_PREFIX, SOURCE_DOCUMENTS_PREFIX, TOOL_ARGS_PREFIX } from '../../../src/agents' import { flatten } from 'lodash' @@ -28,11 +29,18 @@ import { getPastChatHistoryImageMessages, getUniqueImageMessages, processMessagesWithImages, - replaceBase64ImagesWithFileReferences, + revertBase64ImagesToFileRefs, replaceInlineDataWithFileReferences, updateFlowState } from '../utils' -import { convertMultiOptionsToStringArray, processTemplateVariables, configureStructuredOutput } from '../../../src/utils' +import { + convertMultiOptionsToStringArray, + processTemplateVariables, + configureStructuredOutput, + extractResponseContent +} from '../../../src/utils' +import { sanitizeFileName } from '../../../src/validator' +import { getModelConfigByModelName, MODEL_TYPE } from '../../../src/modelLoader' interface ITool { agentSelectedTool: string @@ -912,7 +920,7 @@ class Agent_Agentflow implements INode { } const llmWithoutToolsBind = (await newLLMNodeInstance.init(newNodeData, '', options)) as BaseChatModel - let llmNodeInstance = llmWithoutToolsBind + let llmNodeInstance = llmWithoutToolsBind // save the original LLM instance for later use in withStructuredOutput, getNumTokens const isStructuredOutput = _agentStructuredOutput && Array.isArray(_agentStructuredOutput) && _agentStructuredOutput.length > 0 @@ -1001,10 +1009,6 @@ class Agent_Agentflow implements INode { // Prepare messages array const messages: BaseMessageLike[] = [] - // Use to store messages with image file references as we do not want to store the base64 data into database - let runtimeImageMessagesWithFileRef: BaseMessageLike[] = [] - // Use to keep track of past messages with image file references - let pastImageMessagesWithFileRef: BaseMessageLike[] = [] // Prepend history ONLY if it is the first node if (prependedChatHistory.length > 0 && !runtimeChatHistory.length) { @@ -1037,15 +1041,13 @@ class Agent_Agentflow implements INode { memoryType, pastChatHistory, runtimeChatHistory, - llmNodeInstance, + llmWithoutToolsBind, nodeData, userMessage, input, abortController, options, - modelConfig, - runtimeImageMessagesWithFileRef, - pastImageMessagesWithFileRef + modelConfig }) } else if (!runtimeChatHistory.length) { /* @@ -1056,9 +1058,7 @@ class Agent_Agentflow implements INode { if (options.uploads) { const imageContents = await getUniqueImageMessages(options, messages, modelConfig) if (imageContents) { - const { imageMessageWithBase64, imageMessageWithFileRef } = imageContents - messages.push(imageMessageWithBase64) - runtimeImageMessagesWithFileRef.push(imageMessageWithFileRef) + messages.push(imageContents.imageMessageWithBase64) } } @@ -1094,14 +1094,16 @@ class Agent_Agentflow implements INode { let fileAnnotations: any[] = [] let additionalTokens = 0 let isWaitingForHumanInput = false + let reasonContent = '' + let thinkingDuration: number | undefined // Store the current messages length to track which messages are added during tool calls const messagesBeforeToolCalls = [...messages] let _toolCallMessages: BaseMessageLike[] = [] /** - * Add image artifacts from previous assistant responses as user messages - * Images are converted from FILE-STORAGE:: to base 64 image_url format + * Add image artifacts from previous assistant responses as user messages. + * Only the inserted temporary messages contain base64 — other messages are untouched. */ await addImageArtifactsToMessages(messages, options) @@ -1144,6 +1146,12 @@ class Agent_Agentflow implements INode { artifacts = result.artifacts additionalTokens = result.totalTokens isWaitingForHumanInput = result.isWaitingForHumanInput || false + if (result.accumulatedReasonContent !== undefined) { + reasonContent = result.accumulatedReasonContent + } + if (result.accumulatedReasoningDuration !== undefined) { + thinkingDuration = result.accumulatedReasoningDuration + } // Calculate which messages were added during tool calls _toolCallMessages = messages.slice(messagesBeforeToolCalls.length) @@ -1170,13 +1178,22 @@ class Agent_Agentflow implements INode { messages, chatId, abortController, - isStructuredOutput + isStructuredOutput, + isLastNode ) } else { response = await llmNodeInstance.invoke(messages, { signal: abortController?.signal }) } } + // Capture reasoning and duration from first LLM response so they can be accumulated across tool-call turns + if (response.additional_kwargs?.reasoning_content) { + reasonContent = (response.additional_kwargs.reasoning_content as string) || '' + } + if (typeof response.additional_kwargs?.reasoning_duration === 'number') { + thinkingDuration = response.additional_kwargs.reasoning_duration + } + // Address built in tools (after artifacts are processed) const builtInUsedTools: IUsedTool[] = await this.extractBuiltInUsedTools(response, []) @@ -1194,7 +1211,9 @@ class Agent_Agentflow implements INode { isStreamable, isLastNode, iterationContext, - isStructuredOutput + isStructuredOutput, + accumulatedReasonContent: reasonContent, + accumulatedReasoningDuration: thinkingDuration }) response = result.response @@ -1203,6 +1222,12 @@ class Agent_Agentflow implements INode { artifacts = result.artifacts additionalTokens = result.totalTokens isWaitingForHumanInput = result.isWaitingForHumanInput || false + if (result.accumulatedReasonContent !== undefined) { + reasonContent = result.accumulatedReasonContent + } + if (result.accumulatedReasoningDuration !== undefined) { + thinkingDuration = result.accumulatedReasoningDuration + } // Calculate which messages were added during tool calls _toolCallMessages = messages.slice(messagesBeforeToolCalls.length) @@ -1224,23 +1249,27 @@ class Agent_Agentflow implements INode { } else if (!humanInput && !isStreamable && isLastNode && sseStreamer && !isStructuredOutput) { // Stream whole response back to UI if not streaming and no tool calls // Skip this if structured output is enabled - it will be streamed after conversion - let finalResponse = '' - if (response.content && Array.isArray(response.content)) { - finalResponse = response.content - .map((item: any) => { - if ((item.text && !item.type) || (item.type === 'text' && item.text)) { - return item.text - } - return '' - }) - .filter((text: string) => text) - .join('\n') - } else if (response.content && typeof response.content === 'string') { - finalResponse = response.content - } else { - finalResponse = JSON.stringify(response, null, 2) + + // Stream thinking content if available + if (response.contentBlocks?.length) { + for (const block of response.contentBlocks) { + if (block.type === 'reasoning' && (block as { reasoning?: string }).reasoning) { + reasonContent += (block as { reasoning: string }).reasoning + } + if ((block as any).type === 'thinking' && block.thinking) { + reasonContent += block.thinking + } + } + + sseStreamer.streamThinkingEvent(chatId, reasonContent) + // Send end of thinking event with duration from token details if available + const reasoningTokens = response.usage_metadata?.output_token_details?.reasoning || 0 + // Estimate duration based on reasoning tokens (rough estimate: ~50 tokens/sec) + thinkingDuration = reasoningTokens > 0 ? Math.round(reasoningTokens / 50) : 2 + sseStreamer.streamThinkingEvent(chatId, '', thinkingDuration) } - sseStreamer.streamTokenEvent(chatId, finalResponse) + + sseStreamer.streamTokenEvent(chatId, extractResponseContent(response)) } // Calculate execution time @@ -1331,7 +1360,7 @@ class Agent_Agentflow implements INode { artifacts: extractedArtifacts, fileAnnotations: extractedFileAnnotations, savedInlineImages - } = await extractArtifactsFromResponse(response.response_metadata, newNodeData, options) + } = await extractArtifactsFromResponse(response.response_metadata as IResponseMetadata, newNodeData, options) if (extractedArtifacts.length > 0) { artifacts = [...artifacts, ...extractedArtifacts] @@ -1363,10 +1392,11 @@ class Agent_Agentflow implements INode { // If is structured output, then invoke LLM again with structured output at the very end after all tool calls if (isStructuredOutput) { - llmNodeInstance = configureStructuredOutput(llmNodeInstance, _agentStructuredOutput) + const structuredllmNodeInstance = configureStructuredOutput(llmWithoutToolsBind, _agentStructuredOutput) const prompt = 'Convert the following response to the structured output format: ' + finalResponse - response = await llmNodeInstance.invoke(prompt, { signal: abortController?.signal }) + response = await structuredllmNodeInstance.invoke(prompt, { signal: abortController?.signal }) + // Prefix the response with ```json and suffix with ``` to render as a code block if (typeof response === 'object') { finalResponse = '```json\n' + JSON.stringify(response, null, 2) + '\n```' } else { @@ -1378,6 +1408,23 @@ class Agent_Agentflow implements INode { } } + // Add reasoning content + if (!reasonContent && response.additional_kwargs?.reasoning_content) { + reasonContent = response.additional_kwargs.reasoning_content as string + } + if (reasonContent && response.additional_kwargs?.reasoning_duration != null) { + thinkingDuration = response.additional_kwargs.reasoning_duration as number + } + const reasonContentObj = + reasonContent !== undefined && reasonContent !== '' ? { thinking: reasonContent, thinkingDuration } : undefined + + const costMetadata = await this.calculateUsageCost( + model, + modelConfig?.modelName as string | undefined, + response.usage_metadata, + additionalTokens + ) + const output = this.prepareOutputObject( response, availableTools, @@ -1391,7 +1438,9 @@ class Agent_Agentflow implements INode { additionalTokens, isWaitingForHumanInput, fileAnnotations, - isStructuredOutput + isStructuredOutput, + reasonContentObj, + costMetadata ) // End analytics tracking @@ -1415,23 +1464,25 @@ class Agent_Agentflow implements INode { newState = processTemplateVariables(newState, outputForStateProcessing) /** - * Remove the temporarily added image artifact messages before storing + * Remove temporary artifact image messages (they were only needed for the model invoke). + * Then revert all remaining tagged base64 image_url items back to stored-file format. * This is to avoid storing the actual base64 data into database */ const messagesToStore = messages.filter((msg: any) => !msg._isTemporaryImageMessage) - - // Replace the actual messages array with one that includes the file references for images instead of base64 data - const messagesWithFileReferences = replaceBase64ImagesWithFileReferences( - messagesToStore, - runtimeImageMessagesWithFileRef, - pastImageMessagesWithFileRef - ) + const messagesWithFileReferences = revertBase64ImagesToFileRefs(messagesToStore) // Only add to runtime chat history if this is the first node const inputMessages = [] if (!runtimeChatHistory.length) { - if (runtimeImageMessagesWithFileRef.length) { - inputMessages.push(...runtimeImageMessagesWithFileRef) + // Include any image file reference messages from uploads in the chat history + const imageInputMessages = messagesWithFileReferences.filter( + (msg: any) => + msg.role === 'user' && + Array.isArray(msg.content) && + msg.content.some((item: any) => item.type === 'stored-file' && item.mime?.startsWith('image/')) + ) + if (imageInputMessages.length) { + inputMessages.push(...imageInputMessages) } if (input && typeof input === 'string') { if (!enableMemory) { @@ -1509,7 +1560,12 @@ class Agent_Agentflow implements INode { return builtInUsedTools } - const { output, tools, groundingMetadata, urlContextMetadata } = response.response_metadata + const { output, tools, groundingMetadata, urlContextMetadata } = response.response_metadata as { + output?: any[] + tools?: any[] + groundingMetadata?: { webSearchQueries?: string[] } + urlContextMetadata?: { urlMetadata?: any[] } + } // Handle OpenAI built-in tools if (output && Array.isArray(output) && output.length > 0 && tools && Array.isArray(tools) && tools.length > 0) { @@ -1602,8 +1658,9 @@ class Agent_Agentflow implements INode { const item = response.content[i] if (item.type === 'executableCode' && item.executableCode) { - const language = item.executableCode.language || 'PYTHON' - const code = item.executableCode.code || '' + const executableCode = item.executableCode as { language?: string; code?: string } + const language = executableCode.language || 'PYTHON' + const code = executableCode.code || '' let toolOutput = '' // Check for duplicates @@ -1622,8 +1679,9 @@ class Agent_Agentflow implements INode { if (nextItem) { if (nextItem.type === 'codeExecutionResult' && nextItem.codeExecutionResult) { - const outcome = nextItem.codeExecutionResult.outcome - const output = nextItem.codeExecutionResult.output || '' + const codeExecutionResult = nextItem.codeExecutionResult as { outcome?: string; output?: string } + const outcome = codeExecutionResult.outcome + const output = codeExecutionResult.output || '' toolOutput = outcome === 'OUTCOME_OK' ? output : `Error: ${output}` } else if (nextItem.type === 'inlineData') { toolOutput = 'Generated image data' @@ -1653,33 +1711,28 @@ class Agent_Agentflow implements INode { memoryType, pastChatHistory, runtimeChatHistory, - llmNodeInstance, + llmWithoutToolsBind, nodeData, userMessage, input, abortController, options, - modelConfig, - runtimeImageMessagesWithFileRef, - pastImageMessagesWithFileRef + modelConfig }: { messages: BaseMessageLike[] memoryType: string pastChatHistory: BaseMessageLike[] runtimeChatHistory: BaseMessageLike[] - llmNodeInstance: BaseChatModel + llmWithoutToolsBind: BaseChatModel nodeData: INodeData userMessage: string input: string | Record abortController: AbortController options: ICommonObject modelConfig: ICommonObject - runtimeImageMessagesWithFileRef: BaseMessageLike[] - pastImageMessagesWithFileRef: BaseMessageLike[] }): Promise { - const { updatedPastMessages, transformedPastMessages } = await getPastChatHistoryImageMessages(pastChatHistory, options) + const { updatedPastMessages } = await getPastChatHistoryImageMessages(pastChatHistory, options) pastChatHistory = updatedPastMessages - pastImageMessagesWithFileRef.push(...transformedPastMessages) let pastMessages = [...pastChatHistory, ...runtimeChatHistory] if (!runtimeChatHistory.length && input && typeof input === 'string') { @@ -1691,9 +1744,7 @@ class Agent_Agentflow implements INode { if (options.uploads) { const imageContents = await getUniqueImageMessages(options, messages, modelConfig) if (imageContents) { - const { imageMessageWithBase64, imageMessageWithFileRef } = imageContents - pastMessages.push(imageMessageWithBase64) - runtimeImageMessagesWithFileRef.push(imageMessageWithFileRef) + pastMessages.push(imageContents.imageMessageWithBase64) } } pastMessages.push({ @@ -1701,9 +1752,8 @@ class Agent_Agentflow implements INode { content: input }) } - const { updatedMessages, transformedMessages } = await processMessagesWithImages(pastMessages, options) + const { updatedMessages } = await processMessagesWithImages(pastMessages, options) pastMessages = updatedMessages - pastImageMessagesWithFileRef.push(...transformedMessages) if (pastMessages.length > 0) { if (memoryType === 'windowSize') { @@ -1713,7 +1763,7 @@ class Agent_Agentflow implements INode { messages.push(...windowedMessages) } else if (memoryType === 'conversationSummary') { // Summary memory: Summarize all past messages - const summary = await llmNodeInstance.invoke( + const summary = await llmWithoutToolsBind.invoke( [ { role: 'user', @@ -1725,10 +1775,16 @@ class Agent_Agentflow implements INode { ], { signal: abortController?.signal } ) - messages.push({ role: 'assistant', content: summary.content as string }) + messages.push({ role: 'assistant', content: extractResponseContent(summary) }) + if (!userMessage && input && typeof input === 'string') { + messages.push({ + role: 'user', + content: input + }) + } } else if (memoryType === 'conversationSummaryBuffer') { // Summary buffer: Summarize messages that exceed token limit - await this.handleSummaryBuffer(messages, pastMessages, llmNodeInstance, nodeData, abortController) + await this.handleSummaryBuffer(messages, pastMessages, llmWithoutToolsBind, nodeData, abortController) } else { // Default: Use all messages messages.push(...pastMessages) @@ -1750,7 +1806,7 @@ class Agent_Agentflow implements INode { private async handleSummaryBuffer( messages: BaseMessageLike[], pastMessages: BaseMessageLike[], - llmNodeInstance: BaseChatModel, + llmWithoutToolsBind: BaseChatModel, nodeData: INodeData, abortController: AbortController ): Promise { @@ -1758,7 +1814,7 @@ class Agent_Agentflow implements INode { // Convert past messages to a format suitable for token counting const messagesString = pastMessages.map((msg: any) => `${msg.role}: ${msg.content}`).join('\n') - const tokenCount = await llmNodeInstance.getNumTokens(messagesString) + const tokenCount = await llmWithoutToolsBind.getNumTokens(messagesString) if (tokenCount > maxTokenLimit) { // Calculate how many messages to summarize (messages that exceed the token limit) @@ -1773,14 +1829,14 @@ class Agent_Agentflow implements INode { messagesToSummarize.push(poppedMessage) // Recalculate token count for remaining messages const remainingMessagesString = remainingMessages.map((msg: any) => `${msg.role}: ${msg.content}`).join('\n') - currBufferLength = await llmNodeInstance.getNumTokens(remainingMessagesString) + currBufferLength = await llmWithoutToolsBind.getNumTokens(remainingMessagesString) } } // Summarize the messages that were removed const messagesToSummarizeString = messagesToSummarize.map((msg: any) => `${msg.role}: ${msg.content}`).join('\n') - const summary = await llmNodeInstance.invoke( + const summary = await llmWithoutToolsBind.invoke( [ { role: 'user', @@ -1791,7 +1847,11 @@ class Agent_Agentflow implements INode { ) // Add summary as a system message at the beginning, then add remaining messages - messages.push({ role: 'system', content: `Previous conversation summary: ${summary.content}` }) + let summaryRole = 'system' + if (messages.some((msg) => typeof msg === 'object' && !Array.isArray(msg) && 'role' in msg && msg.role === 'system')) { + summaryRole = 'user' // some model doesn't allow multiple system messages + } + messages.push({ role: summaryRole, content: `Previous conversation summary: ${extractResponseContent(summary)}` }) messages.push(...remainingMessages) } else { // If under token limit, use all messages @@ -1808,15 +1868,43 @@ class Agent_Agentflow implements INode { messages: BaseMessageLike[], chatId: string, abortController: AbortController, - isStructuredOutput: boolean = false + isStructuredOutput: boolean = false, + isLastNode: boolean = false ): Promise { let response = new AIMessageChunk('') + let reasonContent = '' + let thinkingDuration: number | undefined + let thinkingStartTime: number | null = null + let wasThinking = false + let sentLastThinkingEvent = false try { for await (const chunk of await llmNodeInstance.stream(messages, { signal: abortController?.signal })) { if (sseStreamer && !isStructuredOutput) { let content = '' + if (chunk.contentBlocks?.length) { + for (const block of chunk.contentBlocks) { + if (isLastNode) { + // As soon as we see the first non-reasoning block, send last thinking event with duration + if (block.type !== 'reasoning' && wasThinking && !sentLastThinkingEvent && thinkingStartTime != null) { + thinkingDuration = Math.round((Date.now() - thinkingStartTime) / 1000) + sseStreamer.streamThinkingEvent(chatId, '', thinkingDuration) + sentLastThinkingEvent = true + } + if (block.type === 'reasoning' && (block as { reasoning?: string }).reasoning) { + if (!thinkingStartTime) { + thinkingStartTime = Date.now() + } + wasThinking = true + const reasoningContent = (block as { reasoning: string }).reasoning + sseStreamer.streamThinkingEvent(chatId, reasoningContent) + reasonContent += reasoningContent + } + } + } + } + if (typeof chunk === 'string') { content = chunk } else if (Array.isArray(chunk.content) && chunk.content.length > 0) { @@ -1860,13 +1948,65 @@ class Agent_Agentflow implements INode { (item: any) => item.type === 'inlineData' || item.type === 'executableCode' || item.type === 'codeExecutionResult' ) if (!hasNonTextContent) { - const responseContents = response.content as MessageContentText[] + const responseContents = response.content as ContentBlock.Text[] response.content = responseContents.map((item) => item.text).join('') } } + + if (reasonContent.length > 0) { + response.additional_kwargs = { + ...response.additional_kwargs, + reasoning_content: reasonContent, + reasoning_duration: thinkingDuration + } + } + return response } + /** + * Calculates input/output and total cost from usage metadata using model pricing from models.json. + * Also returns the model's base (per-token) input and output costs. + */ + private async calculateUsageCost( + provider: string | undefined, + modelName: string | undefined, + usageMetadata: Record | undefined, + additionalTokens: number = 0 + ): Promise< + | { + input_cost: number + output_cost: number + total_cost: number + base_input_cost: number + base_output_cost: number + } + | undefined + > { + if (!provider || !modelName) return undefined + const inputTokens = (usageMetadata?.input_tokens ?? 0) as number + const outputTokens = ((usageMetadata?.output_tokens ?? 0) as number) + additionalTokens + try { + const modelConfig = await getModelConfigByModelName(MODEL_TYPE.CHAT, provider, modelName) + if (!modelConfig) return undefined + const baseInputCost = Number(modelConfig.input_cost) || 0 + const baseOutputCost = Number(modelConfig.output_cost) || 0 + const inputCost = inputTokens * baseInputCost + const outputCost = outputTokens * baseOutputCost + const totalCost = inputCost + outputCost + if (inputCost === 0 && outputCost === 0) return undefined + return { + input_cost: inputCost, + output_cost: outputCost, + total_cost: totalCost, + base_input_cost: baseInputCost, + base_output_cost: baseOutputCost + } + } catch { + return undefined + } + } + /** * Prepares the output object with response and metadata */ @@ -1883,7 +2023,15 @@ class Agent_Agentflow implements INode { additionalTokens: number = 0, isWaitingForHumanInput: boolean = false, fileAnnotations: any[] = [], - isStructuredOutput: boolean = false + isStructuredOutput: boolean = false, + reasonContent?: { thinking: string; thinkingDuration?: number }, + costMetadata?: { + input_cost: number + output_cost: number + total_cost: number + base_input_cost: number + base_output_cost: number + } ): any { const output: any = { content: finalResponse, @@ -1914,6 +2062,14 @@ class Agent_Agentflow implements INode { } } + if (costMetadata && output.usageMetadata) { + output.usageMetadata.input_cost = costMetadata.input_cost + output.usageMetadata.output_cost = costMetadata.output_cost + output.usageMetadata.total_cost = costMetadata.total_cost + output.usageMetadata.base_input_cost = costMetadata.base_input_cost + output.usageMetadata.base_output_cost = costMetadata.base_output_cost + } + if (response.response_metadata) { output.responseMetadata = response.response_metadata } @@ -1952,6 +2108,10 @@ class Agent_Agentflow implements INode { output.fileAnnotations = fileAnnotations } + if (reasonContent) { + output.reasonContent = reasonContent + } + return output } @@ -1993,7 +2153,9 @@ class Agent_Agentflow implements INode { isStreamable, isLastNode, iterationContext, - isStructuredOutput = false + isStructuredOutput = false, + accumulatedReasonContent: initialAccumulatedReasonContent, + accumulatedReasoningDuration: initialAccumulatedReasoningDuration }: { response: AIMessageChunk messages: BaseMessageLike[] @@ -2008,6 +2170,8 @@ class Agent_Agentflow implements INode { isLastNode: boolean iterationContext: ICommonObject isStructuredOutput?: boolean + accumulatedReasonContent?: string + accumulatedReasoningDuration?: number }): Promise<{ response: AIMessageChunk usedTools: IUsedTool[] @@ -2015,6 +2179,8 @@ class Agent_Agentflow implements INode { artifacts: any[] totalTokens: number isWaitingForHumanInput?: boolean + accumulatedReasonContent?: string + accumulatedReasoningDuration?: number }> { // Track total tokens used throughout this process let totalTokens = response.usage_metadata?.total_tokens || 0 @@ -2022,9 +2188,20 @@ class Agent_Agentflow implements INode { let sourceDocuments: Array = [] let artifacts: any[] = [] let isWaitingForHumanInput: boolean | undefined + // Use reasoning from caller (first turn); subsequent turns are added when we get newResponse + let accumulatedReasonContent = initialAccumulatedReasonContent ?? '' + let accumulatedReasoningDuration = initialAccumulatedReasoningDuration ?? 0 if (!response.tool_calls || response.tool_calls.length === 0) { - return { response, usedTools: [], sourceDocuments: [], artifacts: [], totalTokens } + return { + response, + usedTools: [], + sourceDocuments: [], + artifacts: [], + totalTokens, + accumulatedReasonContent: accumulatedReasonContent || undefined, + accumulatedReasoningDuration: accumulatedReasoningDuration || undefined + } } // Stream tool calls if available @@ -2090,7 +2267,16 @@ class Agent_Agentflow implements INode { if (!isStructuredOutput) { sseStreamer?.streamTokenEvent(chatId, responseContent) } - return { response, usedTools, sourceDocuments, artifacts, totalTokens, isWaitingForHumanInput: true } + return { + response, + usedTools, + sourceDocuments, + artifacts, + totalTokens, + isWaitingForHumanInput: true, + accumulatedReasonContent: accumulatedReasonContent || undefined, + accumulatedReasoningDuration: accumulatedReasoningDuration || undefined + } } let toolIds: ICommonObject | undefined @@ -2204,19 +2390,23 @@ class Agent_Agentflow implements INode { usedTools, sourceDocuments, artifacts, - totalTokens + totalTokens, + accumulatedReasonContent: accumulatedReasonContent || undefined, + accumulatedReasoningDuration: accumulatedReasoningDuration || undefined } } } if (response.tool_calls.length === 0) { - const responseContent = typeof response.content === 'string' ? response.content : JSON.stringify(response.content, null, 2) + const responseContent = extractResponseContent(response) return { response: new AIMessageChunk(responseContent), usedTools, sourceDocuments, artifacts, - totalTokens + totalTokens, + accumulatedReasonContent: accumulatedReasonContent || undefined, + accumulatedReasoningDuration: accumulatedReasoningDuration || undefined } } @@ -2230,18 +2420,15 @@ class Agent_Agentflow implements INode { messages, chatId, abortController, - isStructuredOutput + isStructuredOutput, + isLastNode ) } else { newResponse = await llmNodeInstance.invoke(messages, { signal: abortController?.signal }) // Stream non-streaming response if this is the last node if (isLastNode && sseStreamer && !isStructuredOutput) { - let responseContent = JSON.stringify(newResponse, null, 2) - if (typeof newResponse.content === 'string') { - responseContent = newResponse.content - } - sseStreamer.streamTokenEvent(chatId, responseContent) + sseStreamer.streamTokenEvent(chatId, extractResponseContent(newResponse)) } } @@ -2250,6 +2437,15 @@ class Agent_Agentflow implements INode { totalTokens += newResponse.usage_metadata.total_tokens } + // Accumulate this turn's reasoning content and duration + if (newResponse.additional_kwargs?.reasoning_content) { + const chunkReason = newResponse.additional_kwargs.reasoning_content as string + accumulatedReasonContent += (accumulatedReasonContent ? '\n\n' : '') + chunkReason + } + if (typeof newResponse.additional_kwargs?.reasoning_duration === 'number') { + accumulatedReasoningDuration += newResponse.additional_kwargs.reasoning_duration + } + // Check for recursive tool calls and handle them if (newResponse.tool_calls && newResponse.tool_calls.length > 0) { const { @@ -2258,7 +2454,9 @@ class Agent_Agentflow implements INode { sourceDocuments: recursiveSourceDocuments, artifacts: recursiveArtifacts, totalTokens: recursiveTokens, - isWaitingForHumanInput: recursiveIsWaitingForHumanInput + isWaitingForHumanInput: recursiveIsWaitingForHumanInput, + accumulatedReasonContent: recursiveAccumulatedReasonContent, + accumulatedReasoningDuration: recursiveAccumulatedReasoningDuration } = await this.handleToolCalls({ response: newResponse, messages, @@ -2272,7 +2470,9 @@ class Agent_Agentflow implements INode { isStreamable, isLastNode, iterationContext, - isStructuredOutput + isStructuredOutput, + accumulatedReasonContent, + accumulatedReasoningDuration }) // Merge results from recursive tool calls @@ -2282,9 +2482,24 @@ class Agent_Agentflow implements INode { artifacts = [...artifacts, ...recursiveArtifacts] totalTokens += recursiveTokens isWaitingForHumanInput = recursiveIsWaitingForHumanInput + if (recursiveAccumulatedReasonContent !== undefined) { + accumulatedReasonContent = recursiveAccumulatedReasonContent + } + if (recursiveAccumulatedReasoningDuration !== undefined) { + accumulatedReasoningDuration = recursiveAccumulatedReasoningDuration + } } - return { response: newResponse, usedTools, sourceDocuments, artifacts, totalTokens, isWaitingForHumanInput } + return { + response: newResponse, + usedTools, + sourceDocuments, + artifacts, + totalTokens, + isWaitingForHumanInput, + accumulatedReasonContent: accumulatedReasonContent || undefined, + accumulatedReasoningDuration: accumulatedReasoningDuration || undefined + } } /** @@ -2327,6 +2542,8 @@ class Agent_Agentflow implements INode { artifacts: any[] totalTokens: number isWaitingForHumanInput?: boolean + accumulatedReasonContent?: string + accumulatedReasoningDuration?: number }> { let llmNodeInstance = llmWithoutToolsBind const usedTools: IUsedTool[] = [] @@ -2336,7 +2553,15 @@ class Agent_Agentflow implements INode { const lastCheckpointMessages = humanInputAction?.data?.input?.messages ?? [] if (!lastCheckpointMessages.length) { - return { response: new AIMessageChunk(''), usedTools: [], sourceDocuments: [], artifacts: [], totalTokens: 0 } + return { + response: new AIMessageChunk(''), + usedTools: [], + sourceDocuments: [], + artifacts: [], + totalTokens: 0, + accumulatedReasonContent: undefined, + accumulatedReasoningDuration: undefined + } } // Use the last message as the response @@ -2350,7 +2575,20 @@ class Agent_Agentflow implements INode { let totalTokens = response.usage_metadata?.total_tokens || 0 if (!response.tool_calls || response.tool_calls.length === 0) { - return { response, usedTools: [], sourceDocuments: [], artifacts: [], totalTokens } + const acc = (response.additional_kwargs?.reasoning_content as string) || undefined + const dur = + typeof response.additional_kwargs?.reasoning_duration === 'number' + ? response.additional_kwargs.reasoning_duration + : undefined + return { + response, + usedTools: [], + sourceDocuments: [], + artifacts: [], + totalTokens, + accumulatedReasonContent: acc, + accumulatedReasoningDuration: dur + } } // Stream tool calls if available @@ -2526,12 +2764,19 @@ class Agent_Agentflow implements INode { sseStreamer.streamTokenEvent(chatId, lastToolOutputString) } + const acc = (response.additional_kwargs?.reasoning_content as string) || undefined + const dur = + typeof response.additional_kwargs?.reasoning_duration === 'number' + ? response.additional_kwargs.reasoning_duration + : undefined return { response: new AIMessageChunk(lastToolOutputString), usedTools, sourceDocuments, artifacts, - totalTokens + totalTokens, + accumulatedReasonContent: acc, + accumulatedReasoningDuration: dur } } } @@ -2559,18 +2804,15 @@ class Agent_Agentflow implements INode { messages, chatId, abortController, - isStructuredOutput + isStructuredOutput, + isLastNode ) } else { newResponse = await llmNodeInstance.invoke(messages, { signal: abortController?.signal }) // Stream non-streaming response if this is the last node if (isLastNode && sseStreamer && !isStructuredOutput) { - let responseContent = JSON.stringify(newResponse, null, 2) - if (typeof newResponse.content === 'string') { - responseContent = newResponse.content - } - sseStreamer.streamTokenEvent(chatId, responseContent) + sseStreamer.streamTokenEvent(chatId, extractResponseContent(newResponse)) } } @@ -2579,6 +2821,16 @@ class Agent_Agentflow implements INode { totalTokens += newResponse.usage_metadata.total_tokens } + // Accumulate reasoning and duration from checkpoint response and this turn + let accumulatedReasonContent = (response.additional_kwargs?.reasoning_content as string) || '' + if (newResponse.additional_kwargs?.reasoning_content) { + accumulatedReasonContent += + (accumulatedReasonContent ? '\n\n' : '') + (newResponse.additional_kwargs.reasoning_content as string) + } + let accumulatedReasoningDuration = + (typeof response.additional_kwargs?.reasoning_duration === 'number' ? response.additional_kwargs.reasoning_duration : 0) + + (typeof newResponse.additional_kwargs?.reasoning_duration === 'number' ? newResponse.additional_kwargs.reasoning_duration : 0) + // Check for recursive tool calls and handle them if (newResponse.tool_calls && newResponse.tool_calls.length > 0) { const { @@ -2587,7 +2839,9 @@ class Agent_Agentflow implements INode { sourceDocuments: recursiveSourceDocuments, artifacts: recursiveArtifacts, totalTokens: recursiveTokens, - isWaitingForHumanInput: recursiveIsWaitingForHumanInput + isWaitingForHumanInput: recursiveIsWaitingForHumanInput, + accumulatedReasonContent: recursiveAccumulatedReasonContent, + accumulatedReasoningDuration: recursiveAccumulatedReasoningDuration } = await this.handleToolCalls({ response: newResponse, messages, @@ -2601,7 +2855,9 @@ class Agent_Agentflow implements INode { isStreamable, isLastNode, iterationContext, - isStructuredOutput + isStructuredOutput, + accumulatedReasonContent, + accumulatedReasoningDuration }) // Merge results from recursive tool calls @@ -2611,9 +2867,24 @@ class Agent_Agentflow implements INode { artifacts = [...artifacts, ...recursiveArtifacts] totalTokens += recursiveTokens isWaitingForHumanInput = recursiveIsWaitingForHumanInput + if (recursiveAccumulatedReasonContent !== undefined) { + accumulatedReasonContent = recursiveAccumulatedReasonContent + } + if (recursiveAccumulatedReasoningDuration !== undefined) { + accumulatedReasoningDuration = recursiveAccumulatedReasoningDuration + } } - return { response: newResponse, usedTools, sourceDocuments, artifacts, totalTokens, isWaitingForHumanInput } + return { + response: newResponse, + usedTools, + sourceDocuments, + artifacts, + totalTokens, + isWaitingForHumanInput, + accumulatedReasonContent: accumulatedReasonContent || undefined, + accumulatedReasoningDuration: accumulatedReasoningDuration || undefined + } } /** @@ -2632,8 +2903,8 @@ class Agent_Agentflow implements INode { const filePath = match[2] try { - // Extract filename from the file path - const fileName = filePath.split('/').pop() || filePath + // Extract and sanitize filename from the file path (LLM-generated, untrusted) + const fileName = sanitizeFileName(filePath) // Replace sandbox link with proper download URL const downloadUrl = `${baseURL}/api/v1/get-upload-file?chatflowId=${chatflowId}&chatId=${chatId}&fileName=${fileName}&download=true` diff --git a/packages/components/nodes/agentflow/ConditionAgent/ConditionAgent.ts b/packages/components/nodes/agentflow/ConditionAgent/ConditionAgent.ts index 12eb5f3ec7a..35761b0827f 100644 --- a/packages/components/nodes/agentflow/ConditionAgent/ConditionAgent.ts +++ b/packages/components/nodes/agentflow/ConditionAgent/ConditionAgent.ts @@ -1,15 +1,13 @@ import { AnalyticHandler } from '../../../src/handler' -import { ICommonObject, INode, INodeData, INodeOptionsValue, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ICommonObject, IMessage, INode, INodeData, INodeOptionsValue, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { AIMessageChunk, BaseMessageLike } from '@langchain/core/messages' -import { - getPastChatHistoryImageMessages, - getUniqueImageMessages, - processMessagesWithImages, - replaceBase64ImagesWithFileReferences -} from '../utils' +import { getPastChatHistoryImageMessages, getUniqueImageMessages, processMessagesWithImages, revertBase64ImagesToFileRefs } from '../utils' import { CONDITION_AGENT_SYSTEM_PROMPT, DEFAULT_SUMMARIZER_TEMPLATE } from '../prompt' import { BaseChatModel } from '@langchain/core/language_models/chat_models' import { findBestScenarioIndex } from './matchScenario' +import { extractResponseContent } from '../../../src/utils' +import { getModelConfigByModelName, MODEL_TYPE } from '../../../src/modelLoader' +import { NodeHtmlMarkdown } from 'node-html-markdown' class ConditionAgent_Agentflow implements INode { label: string @@ -28,7 +26,7 @@ class ConditionAgent_Agentflow implements INode { constructor() { this.label = 'Condition Agent' this.name = 'conditionAgentAgentflow' - this.version = 1.1 + this.version = 2.0 this.type = 'ConditionAgent' this.category = 'Agent Flows' this.description = `Utilize an agent to split flows based on dynamic conditions` @@ -84,26 +82,6 @@ class ConditionAgent_Agentflow implements INode { ] }, { - label: 'Override System Prompt', - name: 'conditionAgentOverrideSystemPrompt', - type: 'boolean', - description: 'Override initial system prompt for Condition Agent', - optional: true - }, - { - label: 'Node System Prompt', - name: 'conditionAgentSystemPrompt', - type: 'string', - rows: 4, - optional: true, - acceptVariable: true, - default: CONDITION_AGENT_SYSTEM_PROMPT, - description: 'Expert use only. Modifying this can significantly alter agent behavior. Leave default if unsure', - show: { - conditionAgentOverrideSystemPrompt: true - } - } - /*{ label: 'Enable Memory', name: 'conditionAgentEnableMemory', type: 'boolean', @@ -162,7 +140,27 @@ class ConditionAgent_Agentflow implements INode { show: { conditionAgentMemoryType: 'conversationSummaryBuffer' } - }*/ + }, + { + label: 'Override System Prompt', + name: 'conditionAgentOverrideSystemPrompt', + type: 'boolean', + description: 'Override initial system prompt for Condition Agent', + optional: true + }, + { + label: 'Condition Agent System Prompt', + name: 'conditionAgentSystemPrompt', + type: 'string', + rows: 4, + optional: true, + acceptVariable: true, + default: CONDITION_AGENT_SYSTEM_PROMPT, + description: 'Expert use only. Modifying this can significantly alter agent behavior. Leave default if unsure', + show: { + conditionAgentOverrideSystemPrompt: true + } + } ] this.outputs = [ { @@ -268,7 +266,7 @@ class ConditionAgent_Agentflow implements INode { const conditionAgentInstructions = nodeData.inputs?.conditionAgentInstructions as string const conditionAgentSystemPrompt = nodeData.inputs?.conditionAgentSystemPrompt as string const conditionAgentOverrideSystemPrompt = nodeData.inputs?.conditionAgentOverrideSystemPrompt as boolean - let systemPrompt = CONDITION_AGENT_SYSTEM_PROMPT + let systemPrompt = NodeHtmlMarkdown.translate(CONDITION_AGENT_SYSTEM_PROMPT) if (conditionAgentSystemPrompt && conditionAgentOverrideSystemPrompt) { systemPrompt = conditionAgentSystemPrompt } @@ -282,6 +280,7 @@ class ConditionAgent_Agentflow implements INode { const state = options.agentflowRuntime?.state as ICommonObject const pastChatHistory = (options.pastChatHistory as BaseMessageLike[]) ?? [] const runtimeChatHistory = (options.agentflowRuntime?.chatHistory as BaseMessageLike[]) ?? [] + const prependedChatHistory = options.prependedChatHistory as IMessage[] // Initialize the LLM model instance const nodeInstanceFilePath = options.componentNodes[model].filePath as string @@ -303,8 +302,8 @@ class ConditionAgent_Agentflow implements INode { throw new Error('Scenarios are required') } - // Prepare messages array - const messages: BaseMessageLike[] = [ + // Prepare prefix messages (system prompt + few-shot examples) - needed for model invocation only + const prefixMessages: BaseMessageLike[] = [ { role: 'system', content: systemPrompt @@ -318,10 +317,24 @@ class ConditionAgent_Agentflow implements INode { content: `\`\`\`json\n{"output": "user is not asking about AI"}\n\`\`\`` } ] - // Use to store messages with image file references as we do not want to store the base64 data into database - let runtimeImageMessagesWithFileRef: BaseMessageLike[] = [] - // Use to keep track of past messages with image file references - let pastImageMessagesWithFileRef: BaseMessageLike[] = [] + + // Prepare messages array (these get stored in output) + const messages: BaseMessageLike[] = [] + + // Prepend history ONLY if it is the first node + if (prependedChatHistory.length > 0 && !runtimeChatHistory.length) { + for (const msg of prependedChatHistory) { + const role: string = msg.role === 'apiMessage' ? 'assistant' : 'user' + const content: string = msg.content ?? '' + messages.push({ + role, + content + }) + } + } + + const scenariosList = _conditionAgentScenarios.map((scenario, index) => `${index + 1}. ${scenario.scenario}`).join('\n') + const prettyInput = `### Input\n${input}\n\n### Scenarios\n${scenariosList}\n\n### Instruction\n${conditionAgentInstructions}` input = `{"input": ${input}, "scenarios": ${JSON.stringify( _conditionAgentScenarios.map((scenario) => scenario.scenario) @@ -339,9 +352,7 @@ class ConditionAgent_Agentflow implements INode { input, abortController, options, - modelConfig, - runtimeImageMessagesWithFileRef, - pastImageMessagesWithFileRef + modelConfig }) } else { /* @@ -351,9 +362,7 @@ class ConditionAgent_Agentflow implements INode { if (!runtimeChatHistory.length && options.uploads) { const imageContents = await getUniqueImageMessages(options, messages, modelConfig) if (imageContents) { - const { imageMessageWithBase64, imageMessageWithFileRef } = imageContents - messages.push(imageMessageWithBase64) - runtimeImageMessagesWithFileRef.push(imageMessageWithFileRef) + messages.push(imageContents.imageMessageWithBase64) } } messages.push({ @@ -365,16 +374,19 @@ class ConditionAgent_Agentflow implements INode { // Initialize response and determine if streaming is possible let response: AIMessageChunk = new AIMessageChunk('') + // Combine prefix messages with regular messages for model invocation + const allMessages = [...prefixMessages, ...messages] + // Start analytics if (analyticHandlers && options.parentTraceIds) { const llmLabel = options?.componentNodes?.[model]?.label || model - llmIds = await analyticHandlers.onLLMStart(llmLabel, messages, options.parentTraceIds) + llmIds = await analyticHandlers.onLLMStart(llmLabel, allMessages, options.parentTraceIds) } // Track execution time const startTime = Date.now() - response = await llmNodeInstance.invoke(messages, { signal: abortController?.signal }) + response = await llmNodeInstance.invoke(allMessages, { signal: abortController?.signal }) // Calculate execution time const endTime = Date.now() @@ -383,7 +395,7 @@ class ConditionAgent_Agentflow implements INode { // End analytics tracking (pass structured output with usage metadata) if (analyticHandlers && llmIds) { const analyticsOutput: any = { - content: typeof response.content === 'string' ? response.content : JSON.stringify(response.content) + content: extractResponseContent(response) } // Include usage metadata if available if (response.usage_metadata) { @@ -427,37 +439,68 @@ class ConditionAgent_Agentflow implements INode { } }) - // Replace the actual messages array with one that includes the file references for images instead of base64 data - const messagesWithFileReferences = replaceBase64ImagesWithFileReferences( - messages, - runtimeImageMessagesWithFileRef, - pastImageMessagesWithFileRef - ) + // Revert all tagged base64 image_url items back to stored-file format + const messagesWithFileReferences = revertBase64ImagesToFileRefs(messages) + + // Replace the user input with prettified input for display purposes + for (let i = messagesWithFileReferences.length - 1; i >= 0; i--) { + const msg = messagesWithFileReferences[i] as any + if (msg.role === 'user' && msg.content === input) { + msg.content = prettyInput + break + } + } // Only add to runtime chat history if this is the first node const inputMessages = [] if (!runtimeChatHistory.length) { - if (runtimeImageMessagesWithFileRef.length) { - inputMessages.push(...runtimeImageMessagesWithFileRef) + const imageInputMessages = messagesWithFileReferences.filter( + (msg: any) => + msg.role === 'user' && + Array.isArray(msg.content) && + msg.content.some((item: any) => item.type === 'stored-file' && item.mime?.startsWith('image/')) + ) + if (imageInputMessages.length) { + inputMessages.push(...imageInputMessages) } if (input && typeof input === 'string') { inputMessages.push({ role: 'user', content: question }) } } + const costMetadata = await this.calculateUsageCost(model, modelConfig?.modelName as string | undefined, response.usage_metadata) + + const output: any = { + conditions, + content: extractResponseContent(response), + timeMetadata: { + start: startTime, + end: endTime, + delta: timeDelta + } + } + + if (response.usage_metadata) { + output.usageMetadata = { ...response.usage_metadata } + } + + if (costMetadata && output.usageMetadata) { + output.usageMetadata.input_cost = costMetadata.input_cost + output.usageMetadata.output_cost = costMetadata.output_cost + output.usageMetadata.total_cost = costMetadata.total_cost + output.usageMetadata.base_input_cost = costMetadata.base_input_cost + output.usageMetadata.base_output_cost = costMetadata.base_output_cost + } + + if (response.response_metadata) { + output.responseMetadata = response.response_metadata + } + const returnOutput = { id: nodeData.id, name: this.name, input: { messages: messagesWithFileReferences }, - output: { - conditions, - content: typeof response.content === 'string' ? response.content : JSON.stringify(response.content), - timeMetadata: { - start: startTime, - end: endTime, - delta: timeDelta - } - }, + output, state, chatHistory: [...inputMessages] } @@ -488,9 +531,7 @@ class ConditionAgent_Agentflow implements INode { input, abortController, options, - modelConfig, - runtimeImageMessagesWithFileRef, - pastImageMessagesWithFileRef + modelConfig }: { messages: BaseMessageLike[] memoryType: string @@ -502,12 +543,9 @@ class ConditionAgent_Agentflow implements INode { abortController: AbortController options: ICommonObject modelConfig: ICommonObject - runtimeImageMessagesWithFileRef: BaseMessageLike[] - pastImageMessagesWithFileRef: BaseMessageLike[] }): Promise { - const { updatedPastMessages, transformedPastMessages } = await getPastChatHistoryImageMessages(pastChatHistory, options) + const { updatedPastMessages } = await getPastChatHistoryImageMessages(pastChatHistory, options) pastChatHistory = updatedPastMessages - pastImageMessagesWithFileRef.push(...transformedPastMessages) let pastMessages = [...pastChatHistory, ...runtimeChatHistory] if (!runtimeChatHistory.length) { @@ -518,15 +556,12 @@ class ConditionAgent_Agentflow implements INode { if (options.uploads) { const imageContents = await getUniqueImageMessages(options, messages, modelConfig) if (imageContents) { - const { imageMessageWithBase64, imageMessageWithFileRef } = imageContents - pastMessages.push(imageMessageWithBase64) - runtimeImageMessagesWithFileRef.push(imageMessageWithFileRef) + pastMessages.push(imageContents.imageMessageWithBase64) } } } - const { updatedMessages, transformedMessages } = await processMessagesWithImages(pastMessages, options) + const { updatedMessages } = await processMessagesWithImages(pastMessages, options) pastMessages = updatedMessages - pastImageMessagesWithFileRef.push(...transformedMessages) if (pastMessages.length > 0) { if (memoryType === 'windowSize') { @@ -548,7 +583,7 @@ class ConditionAgent_Agentflow implements INode { ], { signal: abortController?.signal } ) - messages.push({ role: 'assistant', content: summary.content as string }) + messages.push({ role: 'assistant', content: extractResponseContent(summary) }) } else if (memoryType === 'conversationSummaryBuffer') { // Summary buffer: Summarize messages that exceed token limit await this.handleSummaryBuffer(messages, pastMessages, llmNodeInstance, nodeData, abortController) @@ -611,13 +646,58 @@ class ConditionAgent_Agentflow implements INode { ) // Add summary as a system message at the beginning, then add remaining messages - messages.push({ role: 'system', content: `Previous conversation summary: ${summary.content}` }) + let summaryRole = 'system' + if (messages.some((msg) => typeof msg === 'object' && !Array.isArray(msg) && 'role' in msg && msg.role === 'system')) { + summaryRole = 'user' // some model doesn't allow multiple system messages + } + messages.push({ role: summaryRole, content: `Previous conversation summary: ${extractResponseContent(summary)}` }) messages.push(...remainingMessages) } else { // If under token limit, use all messages messages.push(...pastMessages) } } + + /** + * Calculates input/output and total cost from usage metadata using model pricing from models.json. + */ + private async calculateUsageCost( + provider: string | undefined, + modelName: string | undefined, + usageMetadata: Record | undefined + ): Promise< + | { + input_cost: number + output_cost: number + total_cost: number + base_input_cost: number + base_output_cost: number + } + | undefined + > { + if (!provider || !modelName) return undefined + const inputTokens = (usageMetadata?.input_tokens ?? 0) as number + const outputTokens = (usageMetadata?.output_tokens ?? 0) as number + try { + const modelConfig = await getModelConfigByModelName(MODEL_TYPE.CHAT, provider, modelName) + if (!modelConfig) return undefined + const baseInputCost = Number(modelConfig.input_cost) || 0 + const baseOutputCost = Number(modelConfig.output_cost) || 0 + const inputCost = inputTokens * baseInputCost + const outputCost = outputTokens * baseOutputCost + const totalCost = inputCost + outputCost + if (inputCost === 0 && outputCost === 0) return undefined + return { + input_cost: inputCost, + output_cost: outputCost, + total_cost: totalCost, + base_input_cost: baseInputCost, + base_output_cost: baseOutputCost + } + } catch { + return undefined + } + } } module.exports = { nodeClass: ConditionAgent_Agentflow } diff --git a/packages/components/nodes/agentflow/HumanInput/HumanInput.ts b/packages/components/nodes/agentflow/HumanInput/HumanInput.ts index 2f3588513a5..ecb14cdc2e2 100644 --- a/packages/components/nodes/agentflow/HumanInput/HumanInput.ts +++ b/packages/components/nodes/agentflow/HumanInput/HumanInput.ts @@ -12,6 +12,7 @@ import { } from '../../../src/Interface' import { AIMessageChunk, BaseMessageLike } from '@langchain/core/messages' import { DEFAULT_HUMAN_INPUT_DESCRIPTION, DEFAULT_HUMAN_INPUT_DESCRIPTION_HTML } from '../prompt' +import { extractResponseContent } from '../../../src/utils' class HumanInput_Agentflow implements INode { label: string @@ -250,7 +251,7 @@ class HumanInput_Agentflow implements INode { humanInputDescription = response.content as string } else { const response = await llmNodeInstance.invoke(messages) - humanInputDescription = response.content as string + humanInputDescription = extractResponseContent(response) } } } diff --git a/packages/components/nodes/agentflow/Interface.Agentflow.ts b/packages/components/nodes/agentflow/Interface.Agentflow.ts index 33984784a65..3fc76066b31 100644 --- a/packages/components/nodes/agentflow/Interface.Agentflow.ts +++ b/packages/components/nodes/agentflow/Interface.Agentflow.ts @@ -1,3 +1,6 @@ +import { MessageContent } from '@langchain/core/messages' +import { IFileUpload } from '../../src/Interface' + export interface ILLMMessage { role: 'system' | 'assistant' | 'user' | 'tool' | 'developer' content: string @@ -15,3 +18,135 @@ export interface IFlowState { key: string value: string } + +// ─── Image & artifact interfaces ───────────────────────────────────────────── + +/** Tracks which content-array indices map back to stored files. */ +export interface IImageFileRef { + index: number + fileName: string + mime: string +} + +/** An artifact produced by a model (image, file, etc.). */ +export interface IArtifact { + type: string + data: string +} + +/** A file annotation from container file citations. */ +export interface IFileAnnotation { + filePath: string + fileName: string +} + +/** Result of saving an image to storage. */ +export interface ISavedImageResult { + filePath: string + fileName: string + totalSize: number +} + +/** Info about a saved inline image (for replacing base64 in content). */ +export interface ISavedInlineImage { + filePath: string + fileName: string + mimeType: string +} + +// ─── Response metadata interfaces (LLM provider outputs) ───────────────────── + +/** OpenAI image generation output item. */ +export interface IImageGenerationOutput { + type: 'image_generation_call' + id?: string + result: string + output_format?: string +} + +/** Gemini inline data item (image generation). */ +export interface IGeminiInlineData { + type: 'gemini_inline_data' + data: string + mimeType: string +} + +/** OpenAI container file citation annotation. */ +export interface IContainerFileCitation { + type: 'container_file_citation' + container_id: string + file_id: string + filename: string +} + +/** A single content item within a response metadata output. */ +export interface IResponseOutputContent { + annotations?: IContainerFileCitation[] +} + +/** A single output item from response metadata. */ +export interface IResponseMetadataOutput { + type: string + content?: IResponseOutputContent[] + result?: string + id?: string + output_format?: string +} + +/** Top-level response metadata shape from LLM providers. */ +export interface IResponseMetadata { + output?: IResponseMetadataOutput[] + inlineData?: IGeminiInlineData[] +} + +// ─── Message interfaces ────────────────────────────────────────────────────── + +/** Stored-file content item within a message content array. */ +export interface IStoredFileContent { + type: 'stored-file' + name: string + mime: string + path?: string +} + +/** + * Additional kwargs attached to messages in agentflow. + * Extends LangChain's `Record` with known keys. + */ +export interface IMessageAdditionalKwargs { + artifacts?: IArtifact[] + fileAnnotations?: IFileAnnotation[] + usedTools?: unknown[] + fileUploads?: string | IFileUpload[] + _imageFileRefs?: IImageFileRef[] + [key: string]: unknown +} + +/** + * Plain chat message as used in agentflow utils. + * Compatible with LangChain's `MessageFieldWithRole` (which is `{role, content, name?} & Record`). + * The index signature ensures assignability to `BaseMessageLike`. + */ +export interface IChatMessage { + role: string + content: MessageContent + additional_kwargs?: IMessageAdditionalKwargs + _isTemporaryImageMessage?: boolean + [key: string]: unknown +} + +/** Image artifact extracted from an assistant message. */ +export interface IImageArtifact { + name: string + mime: string +} + +/** Content item in a multimodal message (superset of stored-file and image_url). */ +export interface IMultimodalContentItem { + type: string + name?: string + mime?: string + data?: string + image_url?: { url: string; detail?: string } + [key: string]: unknown +} diff --git a/packages/components/nodes/agentflow/LLM/LLM.ts b/packages/components/nodes/agentflow/LLM/LLM.ts index 8ff1b08fc0b..ccb5d88f594 100644 --- a/packages/components/nodes/agentflow/LLM/LLM.ts +++ b/packages/components/nodes/agentflow/LLM/LLM.ts @@ -1,20 +1,22 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models' import { ICommonObject, IMessage, INode, INodeData, INodeOptionsValue, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' -import { AIMessageChunk, BaseMessageLike, MessageContentText } from '@langchain/core/messages' +import { ContentBlock } from 'langchain' +import { AIMessageChunk, BaseMessageLike } from '@langchain/core/messages' import { DEFAULT_SUMMARIZER_TEMPLATE } from '../prompt' import { AnalyticHandler } from '../../../src/handler' -import { ILLMMessage } from '../Interface.Agentflow' +import { ILLMMessage, IResponseMetadata } from '../Interface.Agentflow' import { addImageArtifactsToMessages, extractArtifactsFromResponse, getPastChatHistoryImageMessages, getUniqueImageMessages, processMessagesWithImages, - replaceBase64ImagesWithFileReferences, + revertBase64ImagesToFileRefs, replaceInlineDataWithFileReferences, updateFlowState } from '../utils' -import { processTemplateVariables, configureStructuredOutput } from '../../../src/utils' +import { processTemplateVariables, configureStructuredOutput, extractResponseContent } from '../../../src/utils' +import { getModelConfigByModelName, MODEL_TYPE } from '../../../src/modelLoader' import { flatten } from 'lodash' class LLM_Agentflow implements INode { @@ -381,10 +383,6 @@ class LLM_Agentflow implements INode { // Prepare messages array const messages: BaseMessageLike[] = [] - // Use to store messages with image file references as we do not want to store the base64 data into database - let runtimeImageMessagesWithFileRef: BaseMessageLike[] = [] - // Use to keep track of past messages with image file references - let pastImageMessagesWithFileRef: BaseMessageLike[] = [] // Prepend history ONLY if it is the first node if (prependedChatHistory.length > 0 && !runtimeChatHistory.length) { @@ -423,9 +421,7 @@ class LLM_Agentflow implements INode { input, abortController, options, - modelConfig, - runtimeImageMessagesWithFileRef, - pastImageMessagesWithFileRef + modelConfig }) } else if (!runtimeChatHistory.length) { /* @@ -436,9 +432,7 @@ class LLM_Agentflow implements INode { if (options.uploads) { const imageContents = await getUniqueImageMessages(options, messages, modelConfig) if (imageContents) { - const { imageMessageWithBase64, imageMessageWithFileRef } = imageContents - messages.push(imageMessageWithBase64) - runtimeImageMessagesWithFileRef.push(imageMessageWithFileRef) + messages.push(imageContents.imageMessageWithBase64) } } @@ -452,8 +446,8 @@ class LLM_Agentflow implements INode { delete nodeData.inputs?.llmMessages /** - * Add image artifacts from previous assistant responses as user messages - * Images are converted from FILE-STORAGE:: to base 64 image_url format + * Add image artifacts from previous assistant responses as user messages. + * Only the inserted temporary messages contain base64 — other messages are untouched. */ await addImageArtifactsToMessages(messages, options) @@ -487,21 +481,22 @@ class LLM_Agentflow implements INode { * Invoke LLM */ if (isStreamable) { - response = await this.handleStreamingResponse(sseStreamer, llmNodeInstance, messages, chatId, abortController) + response = await this.handleStreamingResponse( + sseStreamer, + llmNodeInstance, + messages, + chatId, + abortController, + isStructuredOutput, + isLastNode + ) } else { response = await llmNodeInstance.invoke(messages, { signal: abortController?.signal }) // Stream whole response back to UI if this is the last node if (isLastNode && options.sseStreamer) { const sseStreamer: IServerSideEventStreamer = options.sseStreamer as IServerSideEventStreamer - let finalResponse = '' - if (response.content && Array.isArray(response.content)) { - finalResponse = response.content.map((item: any) => item.text).join('\n') - } else if (response.content && typeof response.content === 'string') { - finalResponse = response.content - } else { - finalResponse = JSON.stringify(response, null, 2) - } + const finalResponse = extractResponseContent(response) sseStreamer.streamTokenEvent(chatId, finalResponse) } } @@ -518,7 +513,7 @@ class LLM_Agentflow implements INode { artifacts: extractedArtifacts, fileAnnotations: extractedFileAnnotations, savedInlineImages - } = await extractArtifactsFromResponse(response.response_metadata, newNodeData, options) + } = await extractArtifactsFromResponse(response.response_metadata as IResponseMetadata, newNodeData, options) if (extractedArtifacts.length > 0) { artifacts = extractedArtifacts @@ -557,18 +552,36 @@ class LLM_Agentflow implements INode { } } - // Prepare final response and output object - let finalResponse = '' - if (response.content && Array.isArray(response.content)) { - finalResponse = response.content.map((item: any) => item.text).join('\n') - } else if (response.content && typeof response.content === 'string') { - finalResponse = response.content - } else if (response.content === '') { - // Empty response content, this could happen when there is only image data - finalResponse = '' - } else { - finalResponse = JSON.stringify(response, null, 2) + // Extract reason content from response (reasoning_content/reasoning_duration or contentBlocks) + let reasonContent = (response.additional_kwargs?.reasoning_content as string) || '' + let thinkingDuration: number | undefined = + typeof response.additional_kwargs?.reasoning_duration === 'number' + ? response.additional_kwargs.reasoning_duration + : undefined + if (!reasonContent && response.contentBlocks?.length && isLastNode && sseStreamer && !isStructuredOutput) { + for (const block of response.contentBlocks) { + if (block.type === 'reasoning' && (block as { reasoning?: string }).reasoning) { + reasonContent += (block as { reasoning: string }).reasoning + } + if ((block as any).type === 'thinking' && (block as any).thinking) { + reasonContent += (block as any).thinking + } + } + if (reasonContent) { + sseStreamer.streamThinkingEvent(chatId, reasonContent) + const reasoningTokens = response.usage_metadata?.output_token_details?.reasoning || 0 + thinkingDuration = reasoningTokens > 0 ? Math.round(reasoningTokens / 50) : 2 + sseStreamer.streamThinkingEvent(chatId, '', thinkingDuration) + } } + const reasonContentObj = + reasonContent !== undefined && reasonContent !== '' ? { thinking: reasonContent, thinkingDuration } : undefined + + // Prepare final response and output object + const finalResponse = extractResponseContent(response) + + const costMetadata = await this.calculateUsageCost(model, modelConfig?.modelName as string | undefined, response.usage_metadata) + const output = this.prepareOutputObject( response, finalResponse, @@ -577,7 +590,9 @@ class LLM_Agentflow implements INode { timeDelta, isStructuredOutput, artifacts, - fileAnnotations + fileAnnotations, + reasonContentObj, + costMetadata ) // End analytics tracking @@ -599,23 +614,24 @@ class LLM_Agentflow implements INode { newState = processTemplateVariables(newState, finalResponse) /** - * Remove the temporarily added image artifact messages before storing + * Remove temporary artifact image messages (only needed for model invoke). + * Then revert all remaining tagged base64 image_url items back to stored-file format. * This is to avoid storing the actual base64 data into database */ const messagesToStore = messages.filter((msg: any) => !msg._isTemporaryImageMessage) - - // Replace the actual messages array with one that includes the file references for images instead of base64 data - const messagesWithFileReferences = replaceBase64ImagesWithFileReferences( - messagesToStore, - runtimeImageMessagesWithFileRef, - pastImageMessagesWithFileRef - ) + const messagesWithFileReferences = revertBase64ImagesToFileRefs(messagesToStore) // Only add to runtime chat history if this is the first node const inputMessages = [] if (!runtimeChatHistory.length) { - if (runtimeImageMessagesWithFileRef.length) { - inputMessages.push(...runtimeImageMessagesWithFileRef) + const imageInputMessages = messagesWithFileReferences.filter( + (msg: any) => + msg.role === 'user' && + Array.isArray(msg.content) && + msg.content.some((item: any) => item.type === 'stored-file' && item.mime?.startsWith('image/')) + ) + if (imageInputMessages.length) { + inputMessages.push(...imageInputMessages) } if (input && typeof input === 'string') { if (!enableMemory) { @@ -693,9 +709,7 @@ class LLM_Agentflow implements INode { input, abortController, options, - modelConfig, - runtimeImageMessagesWithFileRef, - pastImageMessagesWithFileRef + modelConfig }: { messages: BaseMessageLike[] memoryType: string @@ -708,12 +722,9 @@ class LLM_Agentflow implements INode { abortController: AbortController options: ICommonObject modelConfig: ICommonObject - runtimeImageMessagesWithFileRef: BaseMessageLike[] - pastImageMessagesWithFileRef: BaseMessageLike[] }): Promise { - const { updatedPastMessages, transformedPastMessages } = await getPastChatHistoryImageMessages(pastChatHistory, options) + const { updatedPastMessages } = await getPastChatHistoryImageMessages(pastChatHistory, options) pastChatHistory = updatedPastMessages - pastImageMessagesWithFileRef.push(...transformedPastMessages) let pastMessages = [...pastChatHistory, ...runtimeChatHistory] if (!runtimeChatHistory.length && input && typeof input === 'string') { @@ -725,9 +736,7 @@ class LLM_Agentflow implements INode { if (options.uploads) { const imageContents = await getUniqueImageMessages(options, messages, modelConfig) if (imageContents) { - const { imageMessageWithBase64, imageMessageWithFileRef } = imageContents - pastMessages.push(imageMessageWithBase64) - runtimeImageMessagesWithFileRef.push(imageMessageWithFileRef) + pastMessages.push(imageContents.imageMessageWithBase64) } } pastMessages.push({ @@ -735,9 +744,8 @@ class LLM_Agentflow implements INode { content: input }) } - const { updatedMessages, transformedMessages } = await processMessagesWithImages(pastMessages, options) + const { updatedMessages } = await processMessagesWithImages(pastMessages, options) pastMessages = updatedMessages - pastImageMessagesWithFileRef.push(...transformedMessages) if (pastMessages.length > 0) { if (memoryType === 'windowSize') { @@ -759,7 +767,7 @@ class LLM_Agentflow implements INode { ], { signal: abortController?.signal } ) - messages.push({ role: 'assistant', content: summary.content as string }) + messages.push({ role: 'assistant', content: extractResponseContent(summary) }) } else if (memoryType === 'conversationSummaryBuffer') { // Summary buffer: Summarize messages that exceed token limit await this.handleSummaryBuffer(messages, pastMessages, llmNodeInstance, nodeData, abortController) @@ -825,7 +833,11 @@ class LLM_Agentflow implements INode { ) // Add summary as a system message at the beginning, then add remaining messages - messages.push({ role: 'system', content: `Previous conversation summary: ${summary.content}` }) + let summaryRole = 'system' + if (messages.some((msg) => typeof msg === 'object' && !Array.isArray(msg) && 'role' in msg && msg.role === 'system')) { + summaryRole = 'user' // some model doesn't allow multiple system messages + } + messages.push({ role: summaryRole, content: `Previous conversation summary: ${extractResponseContent(summary)}` }) messages.push(...remainingMessages) } else { // If under token limit, use all messages @@ -841,19 +853,48 @@ class LLM_Agentflow implements INode { llmNodeInstance: BaseChatModel, messages: BaseMessageLike[], chatId: string, - abortController: AbortController + abortController: AbortController, + isStructuredOutput: boolean = false, + isLastNode: boolean = false ): Promise { let response = new AIMessageChunk('') + let reasonContent = '' + let thinkingDuration: number | undefined + let thinkingStartTime: number | null = null + let wasThinking = false + let sentLastThinkingEvent = false try { for await (const chunk of await llmNodeInstance.stream(messages, { signal: abortController?.signal })) { - if (sseStreamer) { + if (sseStreamer && !isStructuredOutput) { let content = '' + if (chunk.contentBlocks?.length) { + for (const block of chunk.contentBlocks) { + if (isLastNode) { + // As soon as we see the first non-reasoning block, send last thinking event with duration (only when isLastNode) + if (block.type !== 'reasoning' && wasThinking && !sentLastThinkingEvent && thinkingStartTime != null) { + thinkingDuration = Math.round((Date.now() - thinkingStartTime) / 1000) + sseStreamer.streamThinkingEvent(chatId, '', thinkingDuration) + sentLastThinkingEvent = true + } + if (block.type === 'reasoning' && (block as { reasoning?: string }).reasoning) { + if (!thinkingStartTime) { + thinkingStartTime = Date.now() + } + wasThinking = true + const reasoningContent = (block as { reasoning: string }).reasoning + sseStreamer.streamThinkingEvent(chatId, reasoningContent) + reasonContent += reasoningContent + } + } + } + } + if (typeof chunk === 'string') { content = chunk } else if (Array.isArray(chunk.content) && chunk.content.length > 0) { - const contents = chunk.content as MessageContentText[] + const contents = chunk.content as ContentBlock.Text[] content = contents.map((item) => item.text).join('') } else if (chunk.content) { content = chunk.content.toString() @@ -868,13 +909,71 @@ class LLM_Agentflow implements INode { console.error('Error during streaming:', error) throw error } + + // Only convert to string if all content items are text (no inlineData or other special types) if (Array.isArray(response.content) && response.content.length > 0) { - const responseContents = response.content as MessageContentText[] - response.content = responseContents.map((item) => item.text).join('') + const hasNonTextContent = response.content.some( + (item: any) => item.type === 'inlineData' || item.type === 'executableCode' || item.type === 'codeExecutionResult' + ) + if (!hasNonTextContent) { + const responseContents = response.content as ContentBlock.Text[] + response.content = responseContents.map((item) => item.text).join('') + } } + + if (reasonContent.length > 0) { + response.additional_kwargs = { + ...response.additional_kwargs, + reasoning_content: reasonContent, + reasoning_duration: thinkingDuration + } + } + return response } + /** + * Calculates input/output and total cost from usage metadata using model pricing from models.json. + * Also returns the model's base (per-token) input and output costs. + */ + private async calculateUsageCost( + provider: string | undefined, + modelName: string | undefined, + usageMetadata: Record | undefined + ): Promise< + | { + input_cost: number + output_cost: number + total_cost: number + base_input_cost: number + base_output_cost: number + } + | undefined + > { + if (!provider || !modelName) return undefined + const inputTokens = (usageMetadata?.input_tokens ?? 0) as number + const outputTokens = (usageMetadata?.output_tokens ?? 0) as number + try { + const modelConfig = await getModelConfigByModelName(MODEL_TYPE.CHAT, provider, modelName) + if (!modelConfig) return undefined + const baseInputCost = Number(modelConfig.input_cost) || 0 + const baseOutputCost = Number(modelConfig.output_cost) || 0 + const inputCost = inputTokens * baseInputCost + const outputCost = outputTokens * baseOutputCost + const totalCost = inputCost + outputCost + if (inputCost === 0 && outputCost === 0) return undefined + return { + input_cost: inputCost, + output_cost: outputCost, + total_cost: totalCost, + base_input_cost: baseInputCost, + base_output_cost: baseOutputCost + } + } catch { + return undefined + } + } + /** * Prepares the output object with response and metadata */ @@ -886,7 +985,15 @@ class LLM_Agentflow implements INode { timeDelta: number, isStructuredOutput: boolean, artifacts: any[] = [], - fileAnnotations: any[] = [] + fileAnnotations: any[] = [], + reasonContent?: { thinking: string; thinkingDuration?: number }, + costMetadata?: { + input_cost: number + output_cost: number + total_cost: number + base_input_cost: number + base_output_cost: number + } ): any { const output: any = { content: finalResponse, @@ -902,7 +1009,15 @@ class LLM_Agentflow implements INode { } if (response.usage_metadata) { - output.usageMetadata = response.usage_metadata + output.usageMetadata = { ...response.usage_metadata } + } + + if (costMetadata && output.usageMetadata) { + output.usageMetadata.input_cost = costMetadata.input_cost + output.usageMetadata.output_cost = costMetadata.output_cost + output.usageMetadata.total_cost = costMetadata.total_cost + output.usageMetadata.base_input_cost = costMetadata.base_input_cost + output.usageMetadata.base_output_cost = costMetadata.base_output_cost } if (response.response_metadata) { @@ -926,6 +1041,10 @@ class LLM_Agentflow implements INode { output.fileAnnotations = fileAnnotations } + if (reasonContent) { + output.reasonContent = reasonContent + } + return output } diff --git a/packages/components/nodes/agentflow/utils.test.ts b/packages/components/nodes/agentflow/utils.test.ts new file mode 100644 index 00000000000..330631aa207 --- /dev/null +++ b/packages/components/nodes/agentflow/utils.test.ts @@ -0,0 +1,659 @@ +import { revertBase64ImagesToFileRefs, processMessagesWithImages, addImageArtifactsToMessages, getUniqueImageMessages } from './utils' +import { sanitizeFileName } from '../../src/validator' +import { IChatMessage, IMultimodalContentItem } from './Interface.Agentflow' +import { IFileUpload } from '../../src/Interface' + +// Mock storageUtils +jest.mock('../../src/storageUtils', () => ({ + getFileFromStorage: jest.fn().mockResolvedValue(Buffer.from('fake-image-data')), + addSingleFileToStorage: jest.fn().mockResolvedValue({ path: 'mock/path', totalSize: 100 }) +})) + +// Mock multiModalUtils +jest.mock('../../src/multiModalUtils', () => ({ + getImageUploads: jest.fn((uploads: IFileUpload[]) => uploads.filter((u) => u.mime?.startsWith('image/'))) +})) + +// Mock node-fetch +jest.mock('node-fetch', () => jest.fn()) + +// Mock ../../src/utils to avoid pulling in axios (ESM) +jest.mock('../../src/utils', () => { + return { + getCredentialData: jest.fn(), + getCredentialParam: jest.fn(), + handleEscapeCharacters: jest.fn((str: string) => str), + mapMimeTypeToInputField: jest.fn() + } +}) + +describe('revertBase64ImagesToFileRefs', () => { + it('reverts tagged image_url items to stored-file format', () => { + const messages: IChatMessage[] = [ + { + role: 'user', + content: [ + { + type: 'image_url', + image_url: { url: 'data:image/jpeg;base64,abc123' } + } + ], + additional_kwargs: { + _imageFileRefs: [{ index: 0, fileName: 'photo.jpg', mime: 'image/jpeg' }] + } + }, + { role: 'user', content: 'what is this' } + ] + + const result = revertBase64ImagesToFileRefs(messages) as IChatMessage[] + + expect(result[0]).toEqual({ + role: 'user', + content: [{ type: 'stored-file', name: 'photo.jpg', mime: 'image/jpeg' }] + }) + expect(result[1]).toEqual({ role: 'user', content: 'what is this' }) + }) + + it('leaves untagged image_url items (external URLs) untouched', () => { + const messages: IChatMessage[] = [ + { + role: 'user', + content: [ + { + type: 'image_url', + image_url: { url: 'https://example.com/image.png' } + } + ] + } + ] + + const result = revertBase64ImagesToFileRefs(messages) as IChatMessage[] + + expect((result[0].content as IMultimodalContentItem[])[0]).toEqual({ + type: 'image_url', + image_url: { url: 'https://example.com/image.png' } + }) + }) + + it('handles mixed tagged and untagged items in the same message', () => { + const messages: IChatMessage[] = [ + { + role: 'user', + content: [ + { + type: 'image_url', + image_url: { url: 'data:image/png;base64,xyz' } + }, + { + type: 'image_url', + image_url: { url: 'https://example.com/photo.jpg' } + } + ], + additional_kwargs: { + _imageFileRefs: [{ index: 0, fileName: 'screenshot.png', mime: 'image/png' }] + } + } + ] + + const result = revertBase64ImagesToFileRefs(messages) as IChatMessage[] + const content = result[0].content as IMultimodalContentItem[] + + expect(content[0]).toEqual({ type: 'stored-file', name: 'screenshot.png', mime: 'image/png' }) + expect(content[1]).toEqual({ type: 'image_url', image_url: { url: 'https://example.com/photo.jpg' } }) + }) + + it('handles multiple messages with multiple images each', () => { + const messages: IChatMessage[] = [ + { + role: 'user', + content: [ + { type: 'image_url', image_url: { url: 'data:image/jpeg;base64,a' } }, + { type: 'image_url', image_url: { url: 'data:image/png;base64,b' } } + ], + additional_kwargs: { + _imageFileRefs: [ + { index: 0, fileName: 'img1.jpg', mime: 'image/jpeg' }, + { index: 1, fileName: 'img2.png', mime: 'image/png' } + ] + } + }, + { + role: 'user', + content: [{ type: 'image_url', image_url: { url: 'data:image/gif;base64,c' } }], + additional_kwargs: { + _imageFileRefs: [{ index: 0, fileName: 'img3.gif', mime: 'image/gif' }] + } + } + ] + + const result = revertBase64ImagesToFileRefs(messages) as IChatMessage[] + const content0 = result[0].content as IMultimodalContentItem[] + const content1 = result[1].content as IMultimodalContentItem[] + + expect(content0[0]).toEqual({ type: 'stored-file', name: 'img1.jpg', mime: 'image/jpeg' }) + expect(content0[1]).toEqual({ type: 'stored-file', name: 'img2.png', mime: 'image/png' }) + expect(content1[0]).toEqual({ type: 'stored-file', name: 'img3.gif', mime: 'image/gif' }) + }) + + it('does not mutate the original messages', () => { + const original: IChatMessage[] = [ + { + role: 'user', + content: [{ type: 'image_url', image_url: { url: 'data:image/jpeg;base64,abc' } }], + additional_kwargs: { + _imageFileRefs: [{ index: 0, fileName: 'test.jpg', mime: 'image/jpeg' }] + } + } + ] + + const originalJson = JSON.stringify(original) + revertBase64ImagesToFileRefs(original) + + expect(JSON.stringify(original)).toBe(originalJson) + }) + + it('handles messages with string content (no array)', () => { + const messages: IChatMessage[] = [ + { role: 'user', content: 'hello world' }, + { role: 'assistant', content: 'hi there' } + ] + + const result = revertBase64ImagesToFileRefs(messages) as IChatMessage[] + + expect(result).toEqual(messages) + }) + + it('handles empty messages array', () => { + const result = revertBase64ImagesToFileRefs([]) + expect(result).toEqual([]) + }) + + it('skips non-image_url array content items', () => { + const messages: IChatMessage[] = [ + { + role: 'user', + content: [ + { type: 'text', text: 'describe this' }, + { type: 'image_url', image_url: { url: 'data:image/png;base64,x' } } + ], + additional_kwargs: { + _imageFileRefs: [{ index: 1, fileName: 'pic.png', mime: 'image/png' }] + } + } + ] + + const result = revertBase64ImagesToFileRefs(messages) as IChatMessage[] + const content = result[0].content as IMultimodalContentItem[] + + expect(content[0]).toEqual({ type: 'text', text: 'describe this' }) + expect(content[1]).toEqual({ type: 'stored-file', name: 'pic.png', mime: 'image/png' }) + }) + + it('cleans up additional_kwargs when _imageFileRefs is the only key', () => { + const messages: IChatMessage[] = [ + { + role: 'user', + content: [{ type: 'image_url', image_url: { url: 'data:image/png;base64,x' } }], + additional_kwargs: { + _imageFileRefs: [{ index: 0, fileName: 'pic.png', mime: 'image/png' }] + } + } + ] + + const result = revertBase64ImagesToFileRefs(messages) as IChatMessage[] + + expect(result[0].additional_kwargs).toBeUndefined() + }) + + it('preserves other additional_kwargs when removing _imageFileRefs', () => { + const messages: IChatMessage[] = [ + { + role: 'user', + content: [{ type: 'image_url', image_url: { url: 'data:image/png;base64,x' } }], + additional_kwargs: { + _imageFileRefs: [{ index: 0, fileName: 'pic.png', mime: 'image/png' }], + artifacts: [{ type: 'png', data: 'some/path' }] + } + } + ] + + const result = revertBase64ImagesToFileRefs(messages) as IChatMessage[] + + expect(result[0].additional_kwargs?._imageFileRefs).toBeUndefined() + expect(result[0].additional_kwargs?.artifacts).toEqual([{ type: 'png', data: 'some/path' }]) + }) +}) + +describe('processMessagesWithImages', () => { + const options = { chatflowid: 'flow1', chatId: 'chat1', orgId: 'org1' } + + it('converts stored-file refs to base64 with file refs in additional_kwargs', async () => { + const messages: IChatMessage[] = [{ role: 'user', content: [{ type: 'stored-file', name: 'photo.jpg', mime: 'image/jpeg' }] }] + + const { updatedMessages } = await processMessagesWithImages(messages, options) + const msg = updatedMessages[0] as IChatMessage + const content = (msg.content as IMultimodalContentItem[])[0] + + expect(content.type).toBe('image_url') + expect(content.image_url?.url).toMatch(/^data:image\/jpeg;base64,/) + expect(content._fileName).toBeUndefined() + expect(content._mime).toBeUndefined() + expect(msg.additional_kwargs?._imageFileRefs).toEqual([{ index: 0, fileName: 'photo.jpg', mime: 'image/jpeg' }]) + }) + + it('returns original messages when chatflowid or chatId is missing', async () => { + const messages: IChatMessage[] = [{ role: 'user', content: [{ type: 'stored-file', name: 'a.png', mime: 'image/png' }] }] + + const { updatedMessages, transformedMessages } = await processMessagesWithImages(messages, { chatflowid: '', chatId: '' }) + + expect(updatedMessages).toBe(messages) + expect(transformedMessages).toEqual([]) + }) + + it('skips non-user messages', async () => { + const messages: IChatMessage[] = [{ role: 'assistant', content: [{ type: 'stored-file', name: 'a.png', mime: 'image/png' }] }] + + const { updatedMessages } = await processMessagesWithImages(messages, options) + const content = ((updatedMessages[0] as IChatMessage).content as IMultimodalContentItem[])[0] + + expect(content.type).toBe('stored-file') + }) + + it('tracks transformed messages for revert', async () => { + const messages: IChatMessage[] = [{ role: 'user', content: [{ type: 'stored-file', name: 'img.png', mime: 'image/png' }] }] + + const { transformedMessages } = await processMessagesWithImages(messages, options) + + expect(transformedMessages).toHaveLength(1) + expect(transformedMessages[0]).toEqual({ + role: 'user', + content: [{ type: 'stored-file', name: 'img.png', mime: 'image/png' }] + }) + }) + + it('does not mutate the original messages', async () => { + const messages: IChatMessage[] = [{ role: 'user', content: [{ type: 'stored-file', name: 'img.png', mime: 'image/png' }] }] + + await processMessagesWithImages(messages, options) + const content = (messages[0].content as IMultimodalContentItem[])[0] + + expect(content.type).toBe('stored-file') + }) +}) + +describe('addImageArtifactsToMessages', () => { + const options = { chatflowid: 'flow1', chatId: 'chat1', orgId: 'org1' } + + it('inserts temporary base64 user message after assistant message with image artifacts', async () => { + const messages: IChatMessage[] = [ + { + role: 'assistant', + content: 'Here is the image', + additional_kwargs: { + artifacts: [{ type: 'png', data: 'uploads/generated_image.png' }] + } + } + ] + + await addImageArtifactsToMessages(messages, options) + + expect(messages).toHaveLength(2) + const inserted = messages[1] as IChatMessage + expect(inserted.role).toBe('user') + expect(inserted._isTemporaryImageMessage).toBe(true) + const content = (inserted.content as IMultimodalContentItem[])[0] + expect(content.type).toBe('image_url') + expect(content._fileName).toBeUndefined() + expect(inserted.additional_kwargs?._imageFileRefs?.[0].fileName).toBe('generated_image.png') + expect(inserted.additional_kwargs?._imageFileRefs?.[0].mime).toBe('image/png') + }) + + it('does not insert duplicate if next message already has the image', async () => { + const messages: IChatMessage[] = [ + { + role: 'assistant', + content: 'Image generated', + additional_kwargs: { + artifacts: [{ type: 'png', data: 'uploads/generated_image.png' }] + } + }, + { + role: 'user', + content: [{ type: 'stored-file', name: 'generated_image.png', mime: 'image/png' }] + } + ] + + await addImageArtifactsToMessages(messages, options) + + expect(messages).toHaveLength(2) + }) + + it('skips non-image artifacts', async () => { + const messages: IChatMessage[] = [ + { + role: 'assistant', + content: 'Here is a document', + additional_kwargs: { + artifacts: [{ type: 'pdf', data: 'uploads/doc.pdf' }] + } + } + ] + + await addImageArtifactsToMessages(messages, options) + + expect(messages).toHaveLength(1) + }) + + it('does not modify messages without artifacts', async () => { + const messages: IChatMessage[] = [ + { role: 'user', content: 'hello' }, + { role: 'assistant', content: 'hi' } + ] + + await addImageArtifactsToMessages(messages, options) + + expect(messages).toHaveLength(2) + }) + + it('handles multiple assistant messages with image artifacts', async () => { + const messages: IChatMessage[] = [ + { + role: 'assistant', + content: 'First image', + additional_kwargs: { artifacts: [{ type: 'png', data: 'uploads/img1.png' }] } + }, + { role: 'user', content: 'now another' }, + { + role: 'assistant', + content: 'Second image', + additional_kwargs: { artifacts: [{ type: 'jpg', data: 'uploads/img2.jpg' }] } + } + ] + + await addImageArtifactsToMessages(messages, options) + + // Should have 5 messages: assistant, temp_img, user, assistant, temp_img + expect(messages).toHaveLength(5) + const msg1 = messages[1] as IChatMessage + const msg4 = messages[4] as IChatMessage + expect(msg1._isTemporaryImageMessage).toBe(true) + expect(msg1.additional_kwargs?._imageFileRefs?.[0].fileName).toBe('img1.png') + expect(msg4._isTemporaryImageMessage).toBe(true) + expect(msg4.additional_kwargs?._imageFileRefs?.[0].fileName).toBe('img2.jpg') + }) +}) + +describe('getUniqueImageMessages', () => { + it('returns base64 message with file refs in additional_kwargs', async () => { + const options = { + uploads: [{ type: 'stored-file', name: 'photo.jpg', mime: 'image/jpeg', data: '' }], + chatflowid: 'flow1', + chatId: 'chat1', + orgId: 'org1' + } + const modelConfig = { allowImageUploads: true } + + const result = await getUniqueImageMessages(options, [], modelConfig) + + expect(result).toBeDefined() + const msg = result!.imageMessageWithBase64 as IChatMessage + const content = (msg.content as IMultimodalContentItem[])[0] + expect(content.type).toBe('image_url') + expect(content._fileName).toBeUndefined() + expect(msg.additional_kwargs?._imageFileRefs?.[0].fileName).toBe('photo.jpg') + expect(msg.additional_kwargs?._imageFileRefs?.[0].mime).toBe('image/jpeg') + }) + + it('returns undefined when no uploads', async () => { + const result = await getUniqueImageMessages({}, [], {}) + expect(result).toBeUndefined() + }) + + it('filters out images already in messages', async () => { + const existingBase64 = 'data:image/jpeg;base64,' + Buffer.from('fake-image-data').toString('base64') + const options = { + uploads: [{ type: 'stored-file', name: 'photo.jpg', mime: 'image/jpeg', data: '' }], + chatflowid: 'flow1', + chatId: 'chat1', + orgId: 'org1' + } + const messages: IChatMessage[] = [ + { + role: 'user', + content: [ + { + type: 'image_url', + image_url: { url: existingBase64, detail: 'low' } + } + ], + additional_kwargs: { + _imageFileRefs: [{ index: 0, fileName: 'photo.jpg', mime: 'image/jpeg' }] + } + } + ] + const modelConfig = { allowImageUploads: true } + + const result = await getUniqueImageMessages(options, messages, modelConfig) + + expect(result).toBeUndefined() + }) +}) + +describe('end-to-end: base64 tagging and revert', () => { + it('upload image → base64 for invoke → revert to file refs for storage', async () => { + const options = { + uploads: [{ type: 'stored-file', name: 'cat.png', mime: 'image/png', data: '' }], + chatflowid: 'flow1', + chatId: 'chat1', + orgId: 'org1' + } + const modelConfig = { allowImageUploads: true } + + // Step 1: Build messages with base64 (as the node does) + const messages: IChatMessage[] = [] + const imageContents = await getUniqueImageMessages(options, messages, modelConfig) + if (imageContents) { + messages.push(imageContents.imageMessageWithBase64 as IChatMessage) + } + messages.push({ role: 'user', content: 'describe this image' }) + + // Verify messages have base64 for model invoke + const content0 = (messages[0].content as IMultimodalContentItem[])[0] + expect(content0.type).toBe('image_url') + expect(content0.image_url?.url).toMatch(/^data:/) + // No _fileName on content items + expect(content0._fileName).toBeUndefined() + + // Step 2: After invoke, revert to file refs for storage + const reverted = revertBase64ImagesToFileRefs(messages) as IChatMessage[] + + expect(reverted[0]).toEqual({ + role: 'user', + content: [{ type: 'stored-file', name: 'cat.png', mime: 'image/png' }] + }) + expect(reverted[1]).toEqual({ role: 'user', content: 'describe this image' }) + }) + + it('processMessagesWithImages: stored-file → base64 → revert', async () => { + const options = { chatflowid: 'flow1', chatId: 'chat1', orgId: 'org1' } + + const messages: IChatMessage[] = [ + { role: 'user', content: [{ type: 'stored-file', name: 'diagram.png', mime: 'image/png' }] }, + { role: 'user', content: 'explain this diagram' }, + { role: 'assistant', content: 'This is a flowchart...' } + ] + + // Convert stored-file → base64 (as handleMemory does) + const { updatedMessages } = await processMessagesWithImages(messages, options) + const msg0 = updatedMessages[0] as IChatMessage + const content0 = (msg0.content as IMultimodalContentItem[])[0] + + expect(content0.type).toBe('image_url') + // File refs are in additional_kwargs, not on content items + expect(content0._fileName).toBeUndefined() + expect(msg0.additional_kwargs?._imageFileRefs?.[0].fileName).toBe('diagram.png') + + // Revert for storage + const reverted = revertBase64ImagesToFileRefs(updatedMessages) as IChatMessage[] + + expect(reverted[0]).toEqual({ + role: 'user', + content: [{ type: 'stored-file', name: 'diagram.png', mime: 'image/png' }] + }) + expect(reverted[1]).toEqual({ role: 'user', content: 'explain this diagram' }) + expect(reverted[2]).toEqual({ role: 'assistant', content: 'This is a flowchart...' }) + }) + + it('artifact images: insert temp → filter → revert', async () => { + const options = { chatflowid: 'flow1', chatId: 'chat1', orgId: 'org1' } + + const messages: IChatMessage[] = [ + { role: 'user', content: 'generate an image of a cat' }, + { + role: 'assistant', + content: 'Here is your cat image', + additional_kwargs: { artifacts: [{ type: 'png', data: 'uploads/cat_gen.png' }] } + }, + { role: 'user', content: 'make it blue' } + ] + + // Step 1: addImageArtifactsToMessages inserts temp base64 message + await addImageArtifactsToMessages(messages, options) + + expect(messages).toHaveLength(4) + expect((messages[2] as IChatMessage)._isTemporaryImageMessage).toBe(true) + + // Step 2: Filter temp messages (as Agent.ts does after invoke) + const stored = messages.filter((m) => !(m as IChatMessage)._isTemporaryImageMessage) + expect(stored).toHaveLength(3) + + // Step 3: Revert remaining base64 — none should remain since temp was removed + const reverted = revertBase64ImagesToFileRefs(stored) as IChatMessage[] + + expect(reverted[0]).toEqual({ role: 'user', content: 'generate an image of a cat' }) + expect(reverted[2]).toEqual({ role: 'user', content: 'make it blue' }) + }) +}) + +describe('sanitizeFileName', () => { + it('returns a plain filename as-is', () => { + expect(sanitizeFileName('photo.jpg')).toBe('photo.jpg') + }) + + it('strips FILE-STORAGE:: prefix', () => { + expect(sanitizeFileName('FILE-STORAGE::photo.jpg')).toBe('photo.jpg') + }) + + it('strips path traversal sequences', () => { + expect(sanitizeFileName('../../../../etc/passwd')).toBe('passwd') + expect(sanitizeFileName('../../../secret.txt')).toBe('secret.txt') + }) + + it('strips absolute paths', () => { + expect(sanitizeFileName('/etc/passwd')).toBe('passwd') + expect(sanitizeFileName('C:\\Windows\\system32\\config.sys')).toBe('config.sys') + }) + + it('strips FILE-STORAGE:: prefix combined with traversal', () => { + expect(sanitizeFileName('FILE-STORAGE::../../etc/shadow')).toBe('shadow') + }) + + it('throws on empty or dot-only names', () => { + expect(() => sanitizeFileName('')).toThrow() + expect(() => sanitizeFileName('..')).toThrow() + expect(() => sanitizeFileName('FILE-STORAGE::')).toThrow() + }) + + it('handles names with subdirectory components', () => { + expect(sanitizeFileName('uploads/subfolder/image.png')).toBe('image.png') + }) + + it('strips URL-encoded path traversal sequences', () => { + expect(sanitizeFileName('%2e%2e%2fetc%2fpasswd')).toBe('passwd') + }) + + it('rejects double-encoded traversal attempts', () => { + expect(() => sanitizeFileName('%252e%252e%252fpasswd')).toThrow() + }) + + it('strips backslash-based traversal (Windows)', () => { + expect(sanitizeFileName('..\\..\\Windows\\system.ini')).toBe('system.ini') + }) +}) + +describe('path traversal prevention in image processing', () => { + it('_addImagesToMessages sanitizes filenames with traversal', async () => { + const options = { + uploads: [{ type: 'stored-file', name: '../../../../etc/passwd', mime: 'image/jpeg', data: '' }], + chatflowid: 'flow1', + chatId: 'chat1', + orgId: 'org1' + } + const modelConfig = { allowImageUploads: true } + + const result = await getUniqueImageMessages(options, [], modelConfig) + + expect(result).toBeDefined() + const msg = result!.imageMessageWithBase64 as IChatMessage + const fileRef = msg.additional_kwargs?._imageFileRefs?.[0] + expect(fileRef?.fileName).toBe('passwd') + expect(fileRef?.fileName).not.toContain('..') + }) + + it('processMessagesWithImages sanitizes stored-file names', async () => { + const options = { chatflowid: 'flow1', chatId: 'chat1', orgId: 'org1' } + const messages: IChatMessage[] = [ + { role: 'user', content: [{ type: 'stored-file', name: '../../../secret.png', mime: 'image/png' }] } + ] + + const { updatedMessages } = await processMessagesWithImages(messages, options) + const msg = updatedMessages[0] as IChatMessage + const fileRef = msg.additional_kwargs?._imageFileRefs?.[0] + + expect(fileRef?.fileName).toBe('secret.png') + expect(fileRef?.fileName).not.toContain('..') + }) + + it('addImageArtifactsToMessages sanitizes LLM-controlled artifact paths (prompt injection)', async () => { + const options = { chatflowid: 'flow1', chatId: 'chat1', orgId: 'org1' } + const messages: IChatMessage[] = [ + { + role: 'assistant', + content: 'Here is your image', + additional_kwargs: { + artifacts: [{ type: 'png', data: '../../../../etc/shadow' }] + } + } + ] + + await addImageArtifactsToMessages(messages, options) + + expect(messages).toHaveLength(2) + const inserted = messages[1] as IChatMessage + expect(inserted._isTemporaryImageMessage).toBe(true) + const fileRef = inserted.additional_kwargs?._imageFileRefs?.[0] + expect(fileRef?.fileName).toBe('shadow') + expect(fileRef?.fileName).not.toContain('..') + expect(fileRef?.fileName).not.toContain('/') + }) + + it('addImageArtifactsToMessages sanitizes URL-encoded artifact paths', async () => { + const options = { chatflowid: 'flow1', chatId: 'chat1', orgId: 'org1' } + const messages: IChatMessage[] = [ + { + role: 'assistant', + content: 'Image ready', + additional_kwargs: { + artifacts: [{ type: 'png', data: 'uploads%2f..%2f..%2f..%2fetc%2fpasswd' }] + } + } + ] + + await addImageArtifactsToMessages(messages, options) + + expect(messages).toHaveLength(2) + const fileRef = (messages[1] as IChatMessage).additional_kwargs?._imageFileRefs?.[0] + expect(fileRef?.fileName).toBe('passwd') + expect(fileRef?.fileName).not.toContain('..') + }) +}) diff --git a/packages/components/nodes/agentflow/utils.ts b/packages/components/nodes/agentflow/utils.ts index 56bb2fb26d9..59e3fb569df 100644 --- a/packages/components/nodes/agentflow/utils.ts +++ b/packages/components/nodes/agentflow/utils.ts @@ -1,56 +1,97 @@ -import { BaseMessage, MessageContentImageUrl, AIMessageChunk } from '@langchain/core/messages' +import { BaseMessage, MessageContentImageUrl, AIMessageChunk, MessageContentComplex } from '@langchain/core/messages' +import type { ContentBlock } from 'langchain' import { getImageUploads } from '../../src/multiModalUtils' import { addSingleFileToStorage, getFileFromStorage } from '../../src/storageUtils' import { ICommonObject, IFileUpload, INodeData } from '../../src/Interface' import { BaseMessageLike } from '@langchain/core/messages' -import { IFlowState } from './Interface.Agentflow' +import { + IFlowState, + IImageFileRef, + IArtifact, + IFileAnnotation, + ISavedImageResult, + ISavedInlineImage, + IResponseMetadata, + IChatMessage, + IImageArtifact, + IMultimodalContentItem, + IMessageAdditionalKwargs +} from './Interface.Agentflow' import { getCredentialData, getCredentialParam, handleEscapeCharacters, mapMimeTypeToInputField } from '../../src/utils' +import { sanitizeFileName } from '../../src/validator' import fetch from 'node-fetch' -export const addImagesToMessages = async ( - options: ICommonObject, - allowImageUploads: boolean, - imageResolution?: 'auto' | 'low' | 'high' -): Promise => { - const imageContent: MessageContentImageUrl[] = [] +// ─── Constants ─────────────────────────────────────────────────────────────── + +const IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'webp'] + +const MIME_TYPES: Record = { + png: 'image/png', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + gif: 'image/gif', + pdf: 'application/pdf', + txt: 'text/plain', + csv: 'text/csv', + json: 'application/json', + html: 'text/html', + xml: 'application/xml' +} - if (allowImageUploads && options?.uploads && options?.uploads.length > 0) { - const imageUploads = getImageUploads(options.uploads) - for (const upload of imageUploads) { - let bf = upload.data - if (upload.type == 'stored-file') { - const fileName = upload.name.replace(/^FILE-STORAGE::/, '') - const contents = await getFileFromStorage(fileName, options.orgId, options.chatflowid, options.chatId) - // as the image is stored in the server, read the file and convert it to base64 - bf = 'data:' + upload.mime + ';base64,' + contents.toString('base64') - - imageContent.push({ - type: 'image_url', - image_url: { - url: bf, - detail: imageResolution ?? 'low' - } - }) - } else if (upload.type == 'url' && bf) { - imageContent.push({ - type: 'image_url', - image_url: { - url: bf, - detail: imageResolution ?? 'low' - } - }) - } - } - } +const ARTIFACT_TYPES: Record = { + png: 'png', + jpg: 'jpeg', + jpeg: 'jpeg', + html: 'html', + htm: 'html', + md: 'markdown', + markdown: 'markdown', + json: 'json', + js: 'javascript', + javascript: 'javascript', + tex: 'latex', + latex: 'latex', + txt: 'text', + csv: 'text', + pdf: 'text' +} - return imageContent +// ─── Shared helpers (used across multiple functions) ───────────────────────── + +/** Reads a file from storage and returns a base64 data-URL string. */ +const storedFileToBase64 = async (fileName: string, mime: string, options: ICommonObject): Promise => { + const contents = await getFileFromStorage(fileName, options.orgId, options.chatflowid, options.chatId) + return 'data:' + mime + ';base64,' + contents.toString('base64') +} + +/** Saves raw base64 data to storage as a file. Returns the file path, name, and size. */ +const saveImageToStorage = async ( + base64Data: string, + mimeType: string, + fileName: string, + options: ICommonObject +): Promise => { + const imageBuffer = Buffer.from(base64Data, 'base64') + const { path, totalSize } = await addSingleFileToStorage( + mimeType, + imageBuffer, + fileName, + options.orgId, + options.chatflowid, + options.chatId + ) + return { filePath: path, fileName, totalSize } } +// ─── Processing stored-file references into base64 for model invocation ────── + /** - * Process message array to replace stored file references with base64 image data - * @param messages Array of messages that may contain image references - * @param options Common options object containing chatflowid and chatId - * @returns Object containing updated messages array and transformed original messages + * Converts stored-file references in user messages to base64 image_url content + * so LLM providers can process them. Returns both the updated messages and copies + * of the originals that were transformed (for later reverting). + * + * The base64 content is only needed during model invocation — after the call, + * use `revertBase64ImagesToFileRefs` to restore lightweight file references. */ export const processMessagesWithImages = async ( messages: BaseMessageLike[], @@ -67,181 +108,103 @@ export const processMessagesWithImages = async ( } // Create a deep copy of the messages to avoid mutating the original - const updatedMessages = JSON.parse(JSON.stringify(messages)) + const updatedMessages: IChatMessage[] = JSON.parse(JSON.stringify(messages)) // Track which messages were transformed const transformedMessages: BaseMessageLike[] = [] // Scan through all messages looking for stored-file references for (let i = 0; i < updatedMessages.length; i++) { const message = updatedMessages[i] - // Skip non-user messages or messages without content - if (message.role !== 'user' || !message.content) { - continue - } + if (message.role !== 'user' || !Array.isArray(message.content)) continue - // Handle array content (typically containing file references) - if (Array.isArray(message.content)) { - const imageContents: MessageContentImageUrl[] = [] - let hasImageReferences = false - - // Process each content item - for (const item of message.content) { - // Look for stored-file type items - if (item.type === 'stored-file' && item.name && item.mime.startsWith('image/')) { - hasImageReferences = true - try { - const fileName = item.name.replace(/^FILE-STORAGE::/, '') - // Get file contents from storage - const contents = await getFileFromStorage(fileName, options.orgId, options.chatflowid, options.chatId) - - // Create base64 data URL - const base64Data = 'data:' + item.mime + ';base64,' + contents.toString('base64') - - // Add to image content array - imageContents.push({ - type: 'image_url', - image_url: { - url: base64Data, - detail: item.imageResolution ?? 'low' - } - }) - } catch (error) { - console.error(`Failed to load image ${item.name}:`, error) - } + const imageContents: MessageContentImageUrl[] = [] + const fileRefs: IImageFileRef[] = [] + let hasImageReferences = false + + // Find stored-file image items and convert them to base64 image_url items + for (const item of message.content as IMultimodalContentItem[]) { + if (item.type === 'stored-file' && item.name && item.mime?.startsWith('image/')) { + hasImageReferences = true + try { + const fileName = sanitizeFileName(item.name) + const base64Url = await storedFileToBase64(fileName, item.mime, options) + // Track which content index maps to which file, so we can revert later + fileRefs.push({ index: imageContents.length, fileName, mime: item.mime }) + imageContents.push({ + type: 'image_url', + image_url: { + url: base64Url + } + }) + } catch (error) { + console.error(`Failed to load image ${item.name}:`, error) } } + } - // Replace the content with the image content array - if (imageContents.length > 0) { - // Store the original message before modifying - if (hasImageReferences) { - transformedMessages.push(JSON.parse(JSON.stringify(messages[i]))) - } - updatedMessages[i].content = imageContents + if (imageContents.length > 0) { + // Save a copy of the original message before we replace its content + if (hasImageReferences) { + transformedMessages.push(JSON.parse(JSON.stringify(messages[i]))) + } + updatedMessages[i].content = imageContents + // Store file refs in additional_kwargs (not sent to the LLM API) + if (fileRefs.length > 0) { + if (!updatedMessages[i].additional_kwargs) updatedMessages[i].additional_kwargs = {} + updatedMessages[i].additional_kwargs!._imageFileRefs = fileRefs } } } - return { - updatedMessages, - transformedMessages - } + return { updatedMessages, transformedMessages } } +// ─── Reverting base64 back to stored-file references ───────────────────────── + /** - * Replace base64 image data in messages with file references - * @param messages Array of messages that may contain base64 image data - * @param uniqueImageMessages Array of messages with file references for new images - * @param pastImageMessages Array of messages with file references for previous images - * @returns Updated messages array with file references instead of base64 data + * After model invocation, reverts base64 image_url items back to lightweight + * stored-file references using the `_imageFileRefs` metadata in additional_kwargs. + * This keeps chat history storage efficient (no base64 blobs). */ -export const replaceBase64ImagesWithFileReferences = ( - messages: BaseMessageLike[], - uniqueImageMessages: BaseMessageLike[] = [], - pastImageMessages: BaseMessageLike[] = [] -): BaseMessageLike[] => { - // Create a deep copy to avoid mutating the original - const updatedMessages = JSON.parse(JSON.stringify(messages)) - - // Track positions in replacement arrays - let pastMessageIndex = 0 - let pastContentIndex = 0 - let uniqueMessageIndex = 0 - let uniqueContentIndex = 0 - - for (let i = 0; i < updatedMessages.length; i++) { - const message = updatedMessages[i] - if (message.content && Array.isArray(message.content)) { - for (let j = 0; j < message.content.length; j++) { - const item = message.content[j] - if (item.type === 'image_url') { - // Try past images first - let replacement = null - - if (pastMessageIndex < pastImageMessages.length) { - const pastMessage = pastImageMessages[pastMessageIndex] as BaseMessage | undefined - if (pastMessage && Array.isArray(pastMessage.content)) { - if (pastContentIndex < pastMessage.content.length) { - replacement = pastMessage.content[pastContentIndex] - pastContentIndex++ - - // Move to next message if we've used all content in current one - if (pastContentIndex >= pastMessage.content.length) { - pastMessageIndex++ - pastContentIndex = 0 - } - } else { - // Current message has no more content, move to next - pastMessageIndex++ - pastContentIndex = 0 - - // Try again with the next message - if (pastMessageIndex < pastImageMessages.length) { - const nextPastMessage = pastImageMessages[pastMessageIndex] as BaseMessage | undefined - if (nextPastMessage && Array.isArray(nextPastMessage.content) && nextPastMessage.content.length > 0) { - replacement = nextPastMessage.content[0] - pastContentIndex = 1 - } - } - } - } - } - - // Try unique images if no past image replacement found - if (!replacement && uniqueMessageIndex < uniqueImageMessages.length) { - const uniqueMessage = uniqueImageMessages[uniqueMessageIndex] as BaseMessage | undefined - if (uniqueMessage && Array.isArray(uniqueMessage.content)) { - if (uniqueContentIndex < uniqueMessage.content.length) { - replacement = uniqueMessage.content[uniqueContentIndex] - uniqueContentIndex++ - - // Move to next message if we've used all content in current one - if (uniqueContentIndex >= uniqueMessage.content.length) { - uniqueMessageIndex++ - uniqueContentIndex = 0 - } - } else { - // Current message has no more content, move to next - uniqueMessageIndex++ - uniqueContentIndex = 0 - - // Try again with the next message - if (uniqueMessageIndex < uniqueImageMessages.length) { - const nextUniqueMessage = uniqueImageMessages[uniqueMessageIndex] as BaseMessage | undefined - if ( - nextUniqueMessage && - Array.isArray(nextUniqueMessage.content) && - nextUniqueMessage.content.length > 0 - ) { - replacement = nextUniqueMessage.content[0] - uniqueContentIndex = 1 - } - } - } - } - } - - // Apply replacement if found - if (replacement) { - message.content[j] = { - ...replacement - } - } +export const revertBase64ImagesToFileRefs = (messages: BaseMessageLike[]): BaseMessageLike[] => { + const updatedMessages: IChatMessage[] = JSON.parse(JSON.stringify(messages)) + + for (const message of updatedMessages) { + const fileRefs: IImageFileRef[] = message.additional_kwargs?._imageFileRefs || [] + + if (message.content && Array.isArray(message.content) && fileRefs.length > 0) { + const contentArray = message.content as MessageContentComplex[] + // Replace each image_url item with its stored-file equivalent + for (const ref of fileRefs) { + const item = contentArray[ref.index] as IMultimodalContentItem | undefined + if (item && ref.index < contentArray.length && item.type === 'image_url') { + contentArray[ref.index] = { + type: 'stored-file', + name: ref.fileName, + mime: ref.mime + } as ContentBlock } } + // Clean up the temporary tracking metadata + delete message.additional_kwargs!._imageFileRefs + if (message.additional_kwargs && Object.keys(message.additional_kwargs).length === 0) { + delete message.additional_kwargs + } } } return updatedMessages } +// ─── Handling new image uploads ────────────────────────────────────────────── + /** - * Get unique image messages from uploads - * @param options Common options object containing uploads - * @param messages Array of messages to check for existing images - * @param modelConfig Model configuration object containing allowImageUploads and imageResolution - * @returns Object containing imageMessageWithFileRef and imageMessageWithBase64 + * Builds unique image messages from the current upload payload. + * Returns two versions: + * - `imageMessageWithFileRef`: lightweight stored-file references (for chat history) + * - `imageMessageWithBase64`: base64 data URLs (for model invocation) + * Returns undefined if no new unique images are found. */ export const getUniqueImageMessages = async ( options: ICommonObject, @@ -251,44 +214,68 @@ export const getUniqueImageMessages = async ( if (!options.uploads) return undefined // Get images from uploads - const images = await addImagesToMessages(options, modelConfig?.allowImageUploads, modelConfig?.imageResolution) - - // Filter out images that are already in previous messages - const uniqueImages = images.filter((image) => { - // Check if this image is already in any existing message - return !messages.some((msg: any) => { - // For multimodal content (arrays with image objects) - if (Array.isArray(msg.content)) { - return msg.content.some( - (item: any) => - // Compare by image URL/content for image objects - item.type === 'image_url' && image.type === 'image_url' && JSON.stringify(item) === JSON.stringify(image) + const images = await _addImagesToMessages(options, modelConfig?.allowImageUploads ?? false) + const imageUploads = getImageUploads(options.uploads) + + // Collect (fileName, mime) already present in messages via _imageFileRefs + const alreadyPresentRefs = new Set() + for (const msg of messages) { + const refs = (msg as IChatMessage).additional_kwargs?._imageFileRefs + if (refs) { + for (const r of refs) { + alreadyPresentRefs.add(`${sanitizeFileName(r.fileName)}:${r.mime}`) + } + } + } + + // Filter out images already present in previous messages to avoid duplicates; keep (image, upload) pairs so indices stay aligned + const uniquePairs: { image: MessageContentImageUrl; upload: IFileUpload }[] = [] + images.forEach((image, index) => { + const upload = imageUploads[index] + if (upload && alreadyPresentRefs.has(`${sanitizeFileName(upload.name)}:${upload.mime}`)) { + return + } + const alreadyInContent = messages.some((msg) => { + const chatMsg = msg as IChatMessage + if (Array.isArray(chatMsg.content)) { + return chatMsg.content.some( + (item) => + (item as IMultimodalContentItem).type === 'image_url' && + image.type === 'image_url' && + JSON.stringify(item) === JSON.stringify(image) ) } - // For direct comparison of simple content - return JSON.stringify(msg.content) === JSON.stringify(image) + return JSON.stringify(chatMsg.content) === JSON.stringify(image) }) + if (!alreadyInContent) uniquePairs.push({ image, upload }) }) - if (uniqueImages.length === 0) { - return undefined - } + const uniqueImages = uniquePairs.map((p) => p.image) + + if (uniqueImages.length === 0) return undefined - // Create messages with the original file references for storage/display - const imageMessageWithFileRef = { + // File-ref version: lightweight references for storage (only unique uploads) + const imageMessageWithFileRef: IChatMessage = { role: 'user', - content: options.uploads.map((upload: IFileUpload) => ({ + content: uniquePairs.map(({ upload }) => ({ type: upload.type, - name: upload.name, - mime: upload.mime, - imageResolution: modelConfig?.imageResolution - })) + name: sanitizeFileName(upload.name), + mime: upload.mime + })) as ContentBlock[] } - // Create messages with base64 data for the LLM - const imageMessageWithBase64 = { - role: 'user', - content: uniqueImages + // Build _imageFileRefs tracking from uploads (stored-file types only) + const fileRefs: IImageFileRef[] = [] + uniquePairs.forEach(({ upload }, i) => { + if (upload && upload.type === 'stored-file') { + fileRefs.push({ index: i, fileName: sanitizeFileName(upload.name), mime: upload.mime }) + } + }) + + // Base64 version: full image data for model invocation + const imageMessageWithBase64: IChatMessage = { role: 'user', content: uniqueImages } + if (fileRefs.length > 0) { + imageMessageWithBase64.additional_kwargs = { _imageFileRefs: fileRefs } } return { @@ -297,46 +284,60 @@ export const getUniqueImageMessages = async ( } } +// ─── Reconstructing past chat history with images ──────────────────────────── + /** - * Get past chat history image messages - * @param pastChatHistory Array of past chat history messages - * @param options Common options object - * @returns Object containing updatedPastMessages and transformedPastMessages + * Processes past chat history messages, loading file uploads and converting + * stored images to base64 for model consumption. Also preserves additional_kwargs + * metadata (artifacts, file annotations, used tools) on each message. */ export const getPastChatHistoryImageMessages = async ( pastChatHistory: BaseMessageLike[], options: ICommonObject ): Promise<{ updatedPastMessages: BaseMessageLike[]; transformedPastMessages: BaseMessageLike[] }> => { - const chatHistory = [] - const transformedPastMessages = [] + const chatHistory: IChatMessage[] = [] + const transformedPastMessages: IChatMessage[] = [] for (let i = 0; i < pastChatHistory.length; i++) { const message = pastChatHistory[i] as BaseMessage & { role: string } const messageRole = message.role || 'user' + + // Collect non-empty additional_kwargs (artifacts, fileAnnotations, usedTools) + const collectKwargs = (source: Record): IMessageAdditionalKwargs | undefined => { + const result: IMessageAdditionalKwargs = {} + let found = false + for (const key of ['artifacts', 'fileAnnotations', 'usedTools'] as const) { + const val = source[key] + if (val && Array.isArray(val) && val.length > 0) { + result[key] = val + found = true + } + } + return found ? result : undefined + } + if (message.additional_kwargs && message.additional_kwargs.fileUploads) { - // example: [{"type":"stored-file","name":"0_DiXc4ZklSTo3M8J4.jpg","mime":"image/jpeg"}] - const fileUploads = message.additional_kwargs.fileUploads - const artifacts = message.additional_kwargs.artifacts - const fileAnnotations = message.additional_kwargs.fileAnnotations - const usedTools = message.additional_kwargs.usedTools + const { fileUploads, artifacts, fileAnnotations, usedTools } = message.additional_kwargs try { let messageWithFileUploads = '' const uploads: IFileUpload[] = typeof fileUploads === 'string' ? JSON.parse(fileUploads) : fileUploads const imageContents: MessageContentImageUrl[] = [] - for (const upload of uploads) { - if (upload.type === 'stored-file' && upload.mime.startsWith('image/')) { - const fileName = upload.name.replace(/^FILE-STORAGE::/, '') - const fileData = await getFileFromStorage(fileName, options.orgId, options.chatflowid, options.chatId) - // as the image is stored in the server, read the file and convert it to base64 - const bf = 'data:' + upload.mime + ';base64,' + fileData.toString('base64') + const fileRefs: IImageFileRef[] = [] + for (const upload of uploads as IFileUpload[]) { + if (upload.type === 'stored-file' && upload.mime.startsWith('image/')) { + // Convert stored images to base64 for model consumption + const fileName = sanitizeFileName(upload.name) + const base64Url = await storedFileToBase64(fileName, upload.mime, options) + fileRefs.push({ index: imageContents.length, fileName, mime: upload.mime }) imageContents.push({ type: 'image_url', image_url: { - url: bf + url: base64Url } }) } else if (upload.type === 'url' && upload.mime.startsWith('image') && upload.data) { + // URL-based images can be passed through directly imageContents.push({ type: 'image_url', image_url: { @@ -344,256 +345,135 @@ export const getPastChatHistoryImageMessages = async ( } }) } else if (upload.type === 'stored-file:full') { + // Full document uploads: load and inline as XML-wrapped text + const safeFileName = sanitizeFileName(upload.name) const fileLoaderNodeModule = await import('../../nodes/documentloaders/File/File') // @ts-ignore const fileLoaderNodeInstance = new fileLoaderNodeModule.nodeClass() - const nodeOptions = { - retrieveAttachmentChatId: true, - chatflowid: options.chatflowid, - chatId: options.chatId, - orgId: options.orgId - } - let fileInputFieldFromMimeType = 'txtFile' - fileInputFieldFromMimeType = mapMimeTypeToInputField(upload.mime) const nodeData = { inputs: { - [fileInputFieldFromMimeType]: `FILE-STORAGE::${JSON.stringify([upload.name])}` + [mapMimeTypeToInputField(upload.mime)]: `FILE-STORAGE::${JSON.stringify([safeFileName])}` } } - const documents: string = await fileLoaderNodeInstance.init(nodeData, '', nodeOptions) - messageWithFileUploads += `${handleEscapeCharacters(documents, true)}\n\n` + const documents: string = await fileLoaderNodeInstance.init(nodeData, '', { + retrieveAttachmentChatId: true, + chatflowid: options.chatflowid, + chatId: options.chatId, + orgId: options.orgId + }) + messageWithFileUploads += `${handleEscapeCharacters(documents, true)}\n\n` } } - const messageContent = messageWithFileUploads ? `${messageWithFileUploads}\n\n${message.content}` : message.content - const hasArtifacts = artifacts && Array.isArray(artifacts) && artifacts.length > 0 - const hasFileAnnotations = fileAnnotations && Array.isArray(fileAnnotations) && fileAnnotations.length > 0 - const hasUsedTools = usedTools && Array.isArray(usedTools) && usedTools.length > 0 + const extraKwargs = collectKwargs({ artifacts, fileAnnotations, usedTools } as Record) + + // Add image message if we found any images if (imageContents.length > 0) { - const imageMessage: any = { + const imageMsg: IChatMessage = { role: messageRole, content: imageContents } - if (hasArtifacts || hasFileAnnotations || hasUsedTools) { - imageMessage.additional_kwargs = {} - if (hasArtifacts) imageMessage.additional_kwargs.artifacts = artifacts - if (hasFileAnnotations) imageMessage.additional_kwargs.fileAnnotations = fileAnnotations - if (hasUsedTools) imageMessage.additional_kwargs.usedTools = usedTools + if (fileRefs.length > 0) { + imageMsg.additional_kwargs = { _imageFileRefs: fileRefs } + } + if (extraKwargs) { + imageMsg.additional_kwargs = { ...imageMsg.additional_kwargs, ...extraKwargs } } - chatHistory.push(imageMessage) + chatHistory.push(imageMsg) + + // Keep a copy of the original file uploads for potential reverting + const rawFileUploads = (pastChatHistory[i] as BaseMessage).additional_kwargs.fileUploads as string transformedPastMessages.push({ role: messageRole, - content: [...JSON.parse((pastChatHistory[i] as any).additional_kwargs.fileUploads)] + content: [...JSON.parse(rawFileUploads)] as ContentBlock[] }) } - const contentMessage: any = { - role: messageRole, - content: messageContent - } - if (hasArtifacts || hasFileAnnotations || hasUsedTools) { - contentMessage.additional_kwargs = {} - if (hasArtifacts) contentMessage.additional_kwargs.artifacts = artifacts - if (hasFileAnnotations) contentMessage.additional_kwargs.fileAnnotations = fileAnnotations - if (hasUsedTools) contentMessage.additional_kwargs.usedTools = usedTools - } - chatHistory.push(contentMessage) + // Add the text content (with any inlined document uploads prepended) + const messageContent = messageWithFileUploads + ? `${messageWithFileUploads}\n\n${message.content}` + : (message.content as string) + const textMsg: IChatMessage = { role: messageRole, content: messageContent } + if (extraKwargs) textMsg.additional_kwargs = extraKwargs + chatHistory.push(textMsg) } catch (e) { - // failed to parse fileUploads, continue with text only - const hasArtifacts = artifacts && Array.isArray(artifacts) && artifacts.length > 0 - const hasFileAnnotations = fileAnnotations && Array.isArray(fileAnnotations) && fileAnnotations.length > 0 - const hasUsedTools = usedTools && Array.isArray(usedTools) && usedTools.length > 0 - - const errorMessage: any = { - role: messageRole, - content: message.content - } - if (hasArtifacts || hasFileAnnotations || hasUsedTools) { - errorMessage.additional_kwargs = {} - if (hasArtifacts) errorMessage.additional_kwargs.artifacts = artifacts - if (hasFileAnnotations) errorMessage.additional_kwargs.fileAnnotations = fileAnnotations - if (hasUsedTools) errorMessage.additional_kwargs.usedTools = usedTools - } - chatHistory.push(errorMessage) + // Fallback: just use the text content with any available kwargs + const extraKwargs = collectKwargs({ + artifacts: message.additional_kwargs.artifacts, + fileAnnotations: message.additional_kwargs.fileAnnotations, + usedTools: message.additional_kwargs.usedTools + } as Record) + const msg: IChatMessage = { role: messageRole, content: message.content as string } + if (extraKwargs) msg.additional_kwargs = extraKwargs + chatHistory.push(msg) } } else if (message.additional_kwargs) { - const hasArtifacts = - message.additional_kwargs.artifacts && - Array.isArray(message.additional_kwargs.artifacts) && - message.additional_kwargs.artifacts.length > 0 - const hasFileAnnotations = - message.additional_kwargs.fileAnnotations && - Array.isArray(message.additional_kwargs.fileAnnotations) && - message.additional_kwargs.fileAnnotations.length > 0 - const hasUsedTools = - message.additional_kwargs.usedTools && - Array.isArray(message.additional_kwargs.usedTools) && - message.additional_kwargs.usedTools.length > 0 - - if (hasArtifacts || hasFileAnnotations || hasUsedTools) { - const messageAdditionalKwargs: any = {} - if (hasArtifacts) messageAdditionalKwargs.artifacts = message.additional_kwargs.artifacts - if (hasFileAnnotations) messageAdditionalKwargs.fileAnnotations = message.additional_kwargs.fileAnnotations - if (hasUsedTools) messageAdditionalKwargs.usedTools = message.additional_kwargs.usedTools - - chatHistory.push({ - role: messageRole, - content: message.content, - additional_kwargs: messageAdditionalKwargs - }) - } else { - chatHistory.push({ - role: messageRole, - content: message.content - }) - } + const extraKwargs = collectKwargs(message.additional_kwargs as Record) + const msg: IChatMessage = { role: messageRole, content: message.content as string } + if (extraKwargs) msg.additional_kwargs = extraKwargs + chatHistory.push(msg) } else { - chatHistory.push({ - role: messageRole, - content: message.content - }) + chatHistory.push({ role: messageRole, content: message.content as string }) } } - return { - updatedPastMessages: chatHistory, - transformedPastMessages - } + return { updatedPastMessages: chatHistory, transformedPastMessages } } -/** - * Gets MIME type from filename extension - */ +// ─── MIME type and artifact type lookups ────────────────────────────────────── + +/** Returns the MIME type for a filename based on its extension. */ export const getMimeTypeFromFilename = (filename: string): string => { const extension = filename.toLowerCase().split('.').pop() - const mimeTypes: { [key: string]: string } = { - png: 'image/png', - jpg: 'image/jpeg', - jpeg: 'image/jpeg', - gif: 'image/gif', - pdf: 'application/pdf', - txt: 'text/plain', - csv: 'text/csv', - json: 'application/json', - html: 'text/html', - xml: 'application/xml' - } - return mimeTypes[extension || ''] || 'application/octet-stream' + return MIME_TYPES[extension || ''] || 'application/octet-stream' } -/** - * Gets artifact type from filename extension for UI rendering - */ +/** Returns the artifact type (for UI rendering) based on a filename's extension. */ export const getArtifactTypeFromFilename = (filename: string): string => { const extension = filename.toLowerCase().split('.').pop() - const artifactTypes: { [key: string]: string } = { - png: 'png', - jpg: 'jpeg', - jpeg: 'jpeg', - html: 'html', - htm: 'html', - md: 'markdown', - markdown: 'markdown', - json: 'json', - js: 'javascript', - javascript: 'javascript', - tex: 'latex', - latex: 'latex', - txt: 'text', - csv: 'text', - pdf: 'text' - } - return artifactTypes[extension || ''] || 'text' + return ARTIFACT_TYPES[extension || ''] || 'text' } -/** - * Saves base64 image data to storage and returns file information - */ +// ─── Saving generated images to storage ────────────────────────────────────── + +/** Saves base64 image data to storage and returns file information */ export const saveBase64Image = async ( - outputItem: any, + outputItem: { result?: string; id?: string; output_format?: string }, options: ICommonObject -): Promise<{ filePath: string; fileName: string; totalSize: number } | null> => { +): Promise => { try { - if (!outputItem.result) { - return null - } - - // Extract base64 data and create buffer - const base64Data = outputItem.result - const imageBuffer = Buffer.from(base64Data, 'base64') - - // Determine file extension and MIME type + if (!outputItem.result) return null const outputFormat = outputItem.output_format || 'png' const fileName = `generated_image_${outputItem.id || Date.now()}.${outputFormat}` const mimeType = outputFormat === 'png' ? 'image/png' : 'image/jpeg' - - // Save the image using the existing storage utility - const { path, totalSize } = await addSingleFileToStorage( - mimeType, - imageBuffer, - fileName, - options.orgId, - options.chatflowid, - options.chatId - ) - - return { filePath: path, fileName, totalSize } + return await saveImageToStorage(outputItem.result, mimeType, fileName, options) } catch (error) { console.error('Error saving base64 image:', error) return null } } -/** - * Saves Gemini inline image data to storage and returns file information - */ +/** Saves a Gemini inline image to storage. */ export const saveGeminiInlineImage = async ( - inlineItem: any, + inlineItem: { data?: string; mimeType?: string }, options: ICommonObject -): Promise<{ filePath: string; fileName: string; totalSize: number } | null> => { +): Promise => { try { - if (!inlineItem.data || !inlineItem.mimeType) { - return null - } - - // Extract base64 data and create buffer - const base64Data = inlineItem.data - const imageBuffer = Buffer.from(base64Data, 'base64') - - // Determine file extension from MIME type - const mimeType = inlineItem.mimeType - let extension = 'png' - if (mimeType.includes('jpeg') || mimeType.includes('jpg')) { - extension = 'jpg' - } else if (mimeType.includes('png')) { - extension = 'png' - } else if (mimeType.includes('gif')) { - extension = 'gif' - } else if (mimeType.includes('webp')) { - extension = 'webp' - } - + if (!inlineItem.data || !inlineItem.mimeType) return null + // Derive file extension from MIME type + const mime = inlineItem.mimeType + const extension = + mime.includes('jpeg') || mime.includes('jpg') ? 'jpg' : mime.includes('gif') ? 'gif' : mime.includes('webp') ? 'webp' : 'png' const fileName = `gemini_generated_image_${Date.now()}.${extension}` - - // Save the image using the existing storage utility - const { path, totalSize } = await addSingleFileToStorage( - mimeType, - imageBuffer, - fileName, - options.orgId, - options.chatflowid, - options.chatId - ) - - return { filePath: path, fileName, totalSize } + return await saveImageToStorage(inlineItem.data, inlineItem.mimeType, fileName, options) } catch (error) { console.error('Error saving Gemini inline image:', error) return null } } -/** - * Downloads file content from container file citation - */ +// ─── Downloading container files from OpenAI ───────────────────────────────── + +/** Downloads a file from an OpenAI container (used for file citations in responses). */ export const downloadContainerFile = async ( containerId: string, fileId: string, @@ -610,7 +490,6 @@ export const downloadContainerFile = async ( return null } - // Download the file using OpenAI Container API const response = await fetch(`https://api.openai.com/v1/containers/${containerId}/files/${fileId}/content`, { method: 'GET', headers: { @@ -626,12 +505,10 @@ export const downloadContainerFile = async ( return null } - // Extract the binary data from the Response object const data = await response.arrayBuffer() const dataBuffer = Buffer.from(data) const mimeType = getMimeTypeFromFilename(filename) - // Store the file using the same storage utility as OpenAIAssistant const { path, totalSize } = await addSingleFileToStorage( mimeType, dataBuffer, @@ -648,77 +525,72 @@ export const downloadContainerFile = async ( } } +// ─── Replacing inline image data with file references in responses ─────────── + /** - * Replace inlineData base64 with file references in the response content + * Replaces Gemini inlineData content items in a response with stored-file references, + * so the response content doesn't contain raw base64 data. */ -export const replaceInlineDataWithFileReferences = ( - response: AIMessageChunk, - savedInlineImages: Array<{ filePath: string; fileName: string; mimeType: string }> -): void => { - // Check if content is an array - if (!Array.isArray(response.content)) { - return - } +export const replaceInlineDataWithFileReferences = (response: AIMessageChunk, savedInlineImages: ISavedInlineImage[]): void => { + if (!Array.isArray(response.content)) return - // Replace base64 data with file references in response content let savedImageIndex = 0 for (let i = 0; i < response.content.length; i++) { const contentItem = response.content[i] if ( typeof contentItem === 'object' && - contentItem.type === 'inlineData' && - contentItem.inlineData && + (contentItem as IMultimodalContentItem).type === 'inlineData' && + (contentItem as Record).inlineData && savedImageIndex < savedInlineImages.length ) { const savedImage = savedInlineImages[savedImageIndex] - // Replace with file reference response.content[i] = { type: 'stored-file', name: savedImage.fileName, mime: savedImage.mimeType, path: savedImage.filePath - } + } as ContentBlock savedImageIndex++ } } - // Clear the inlineData from response_metadata to avoid duplication if (response.response_metadata?.inlineData) { delete response.response_metadata.inlineData } } +// ─── Extracting artifacts from LLM response metadata ───────────────────────── + /** - * Extracts artifacts from response metadata (both annotations and built-in tools) + * Processes response metadata from LLM providers to extract: + * - Image artifacts (OpenAI image generation, Gemini inline data) + * - File annotations (OpenAI container file citations) + * Saves generated images to storage and returns metadata for the UI. */ export const extractArtifactsFromResponse = async ( - responseMetadata: any, + responseMetadata: IResponseMetadata | undefined, modelNodeData: INodeData, options: ICommonObject ): Promise<{ - artifacts: any[] - fileAnnotations: any[] - savedInlineImages?: Array<{ filePath: string; fileName: string; mimeType: string }> + artifacts: IArtifact[] + fileAnnotations: IFileAnnotation[] + savedInlineImages?: ISavedInlineImage[] }> => { - const artifacts: any[] = [] - const fileAnnotations: any[] = [] - const savedInlineImages: Array<{ filePath: string; fileName: string; mimeType: string }> = [] + const artifacts: IArtifact[] = [] + const fileAnnotations: IFileAnnotation[] = [] + const savedInlineImages: ISavedInlineImage[] = [] - // Handle Gemini inline data (image generation) + // --- Gemini inline data (image generation) --- if (responseMetadata?.inlineData && Array.isArray(responseMetadata.inlineData)) { for (const inlineItem of responseMetadata.inlineData) { if (inlineItem.type === 'gemini_inline_data' && inlineItem.data && inlineItem.mimeType) { try { const savedImageResult = await saveGeminiInlineImage(inlineItem, options) if (savedImageResult) { - // Create artifact in the same format as other image artifacts - const fileType = getArtifactTypeFromFilename(savedImageResult.fileName) artifacts.push({ - type: fileType, + type: getArtifactTypeFromFilename(savedImageResult.fileName), data: savedImageResult.filePath }) - - // Track saved image for replacing base64 data in content savedInlineImages.push({ filePath: savedImageResult.filePath, fileName: savedImageResult.fileName, @@ -737,14 +609,13 @@ export const extractArtifactsFromResponse = async ( } for (const outputItem of responseMetadata.output) { - // Handle container file citations from annotations + // --- Container file citations (OpenAI responses API) --- if (outputItem.type === 'message' && outputItem.content && Array.isArray(outputItem.content)) { for (const contentItem of outputItem.content) { if (contentItem.annotations && Array.isArray(contentItem.annotations)) { for (const annotation of contentItem.annotations) { if (annotation.type === 'container_file_citation' && annotation.file_id && annotation.filename) { try { - // Download and store the file content const downloadResult = await downloadContainerFile( annotation.container_id, annotation.file_id, @@ -757,12 +628,7 @@ export const extractArtifactsFromResponse = async ( const fileType = getArtifactTypeFromFilename(annotation.filename) if (fileType === 'png' || fileType === 'jpeg' || fileType === 'jpg') { - const artifact = { - type: fileType, - data: downloadResult.filePath - } - - artifacts.push(artifact) + artifacts.push({ type: fileType, data: downloadResult.filePath }) } else { fileAnnotations.push({ filePath: downloadResult.filePath, @@ -779,18 +645,14 @@ export const extractArtifactsFromResponse = async ( } } - // Handle built-in tool artifacts (like image generation) + // --- OpenAI built-in tool artifacts (image generation) --- if (outputItem.type === 'image_generation_call' && outputItem.result) { try { const savedImageResult = await saveBase64Image(outputItem, options) if (savedImageResult) { - // Replace the base64 result with the file path in the response metadata outputItem.result = savedImageResult.filePath - - // Create artifact in the same format as other image artifacts - const fileType = getArtifactTypeFromFilename(savedImageResult.fileName) artifacts.push({ - type: fileType, + type: getArtifactTypeFromFilename(savedImageResult.fileName), data: savedImageResult.filePath }) } @@ -803,105 +665,128 @@ export const extractArtifactsFromResponse = async ( return { artifacts, fileAnnotations, savedInlineImages: savedInlineImages.length > 0 ? savedInlineImages : undefined } } +// ─── Injecting image artifacts as temporary messages for model context ──────── + /** - * Add image artifacts from previous assistant messages as user messages - * This allows the LLM to see and reference the generated images in the conversation - * Messages are marked with a special flag for later removal + * Scans assistant messages for image artifacts and inserts temporary user messages + * containing the base64 image data right after each assistant message. This allows + * the model to "see" previously generated images in follow-up turns. + * + * These temporary messages are marked with `_isTemporaryImageMessage: true` so they + * can be stripped out after model invocation (they shouldn't be persisted). */ export const addImageArtifactsToMessages = async (messages: BaseMessageLike[], options: ICommonObject): Promise => { - const imageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'webp'] - const messagesToInsert: Array<{ index: number; message: any }> = [] + const messagesToInsert: Array<{ index: number; base64Message: IChatMessage }> = [] - // Iterate through messages to find assistant messages with image artifacts for (let i = 0; i < messages.length; i++) { - const message = messages[i] as any + const message = messages[i] as IChatMessage - // Check if this is an assistant message with artifacts if ( - (message.role === 'assistant' || message.role === 'ai') && - message.additional_kwargs?.artifacts && - Array.isArray(message.additional_kwargs.artifacts) + (message.role !== 'assistant' && message.role !== 'ai') || + !message.additional_kwargs?.artifacts || + !Array.isArray(message.additional_kwargs.artifacts) ) { - const artifacts = message.additional_kwargs.artifacts - const imageArtifacts: Array<{ type: string; name: string; mime: string }> = [] - - // Extract image artifacts - for (const artifact of artifacts) { - if (artifact.type && artifact.data) { - // Check if this is an image artifact by file type - if (imageExtensions.includes(artifact.type.toLowerCase())) { - // Extract filename from the file path - const fileName = artifact.data.split('/').pop() || artifact.data - const mimeType = `image/${artifact.type.toLowerCase()}` - - imageArtifacts.push({ - type: 'stored-file', - name: fileName, - mime: mimeType - }) - } - } + continue + } + + // Find image-type artifacts in this assistant message + const imageArtifacts: IImageArtifact[] = [] + for (const artifact of message.additional_kwargs.artifacts) { + if (artifact.type && artifact.data && IMAGE_EXTENSIONS.includes(artifact.type.toLowerCase())) { + imageArtifacts.push({ + name: sanitizeFileName(artifact.data), + mime: `image/${artifact.type.toLowerCase()}` + }) } + } - // If we found image artifacts, prepare to insert a user message after this assistant message - if (imageArtifacts.length > 0) { - // Check if the next message already contains these image artifacts to avoid duplicates - const nextMessage = messages[i + 1] as any - const shouldInsert = - !nextMessage || - nextMessage.role !== 'user' || - !Array.isArray(nextMessage.content) || - !nextMessage.content.some( - (item: any) => - (item.type === 'stored-file' || item.type === 'image_url') && - imageArtifacts.some((artifact) => { - // Compare with and without FILE-STORAGE:: prefix - const artifactName = artifact.name.replace('FILE-STORAGE::', '') - const itemName = item.name?.replace('FILE-STORAGE::', '') || '' - return artifactName === itemName - }) - ) - - if (shouldInsert) { - messagesToInsert.push({ - index: i + 1, - message: { - role: 'user', - content: imageArtifacts, - _isTemporaryImageMessage: true // Mark for later removal - } + if (imageArtifacts.length === 0) continue + + // Skip if the next message already contains these image artifacts + const nextMessage = messages[i + 1] as IChatMessage | undefined + const alreadyPresent = + nextMessage && + nextMessage.role === 'user' && + Array.isArray(nextMessage.content) && + (nextMessage.content as IMultimodalContentItem[]).some( + (item) => + (item.type === 'stored-file' || item.type === 'image_url') && + imageArtifacts.some((artifact) => { + const artifactName = artifact.name.replace('FILE-STORAGE::', '') + const itemName = item.name?.replace('FILE-STORAGE::', '') || '' + return artifactName === itemName }) - } + ) + + if (alreadyPresent) continue + + // Build base64 content for each image artifact + const base64Contents: MessageContentImageUrl[] = [] + const fileRefs: IImageFileRef[] = [] + + for (const artifact of imageArtifacts) { + try { + const fileName = sanitizeFileName(artifact.name) + const base64Url = await storedFileToBase64(fileName, artifact.mime, options) + fileRefs.push({ index: base64Contents.length, fileName, mime: artifact.mime }) + base64Contents.push({ + type: 'image_url', + image_url: { url: base64Url } + }) + } catch (error) { + console.error(`Failed to load artifact image ${artifact.name}:`, error) } } - } - // Insert messages in reverse order to maintain correct indices - for (let i = messagesToInsert.length - 1; i >= 0; i--) { - const { index, message } = messagesToInsert[i] - messages.splice(index, 0, message) + if (base64Contents.length > 0) { + const base64Message: IChatMessage = { role: 'user', content: base64Contents, _isTemporaryImageMessage: true } + if (fileRefs.length > 0) { + base64Message.additional_kwargs = { _imageFileRefs: fileRefs } + } + messagesToInsert.push({ index: i + 1, base64Message }) + } } - // Convert stored-file references to base64 image_url format - if (messagesToInsert.length > 0) { - const { updatedMessages } = await processMessagesWithImages(messages, options) - // Replace the messages array content with the updated messages - messages.length = 0 - messages.push(...updatedMessages) + // Insert in reverse order so indices remain valid + for (let i = messagesToInsert.length - 1; i >= 0; i--) { + const { index, base64Message } = messagesToInsert[i] + messages.splice(index, 0, base64Message as unknown as BaseMessageLike) } } -/** - * Updates the flow state with new values - */ +// ─── Flow state management ─────────────────────────────────────────────────── + +/** Merges new key-value pairs into the flow state. */ export const updateFlowState = (state: ICommonObject, updateState: IFlowState[]): ICommonObject => { - let newFlowState: Record = {} - for (const state of updateState) { - newFlowState[state.key] = state.value + const newFlowState: Record = {} + for (const s of updateState) { + newFlowState[s.key] = s.value } + return { ...state, ...newFlowState } +} - return { - ...state, - ...newFlowState +// ─── Private: converting uploads to base64 image content ───────────────────── + +/** Converts image uploads to base64 image_url content items for model consumption. */ +const _addImagesToMessages = async (options: ICommonObject, allowImageUploads: boolean): Promise => { + const imageContent: MessageContentImageUrl[] = [] + + if (!allowImageUploads || !options?.uploads?.length) return imageContent + + const imageUploads = getImageUploads(options.uploads) + for (const upload of imageUploads) { + let url = upload.data + if (upload.type === 'stored-file') { + const fileName = sanitizeFileName(upload.name) + url = await storedFileToBase64(fileName, upload.mime, options) + } + if (url) { + imageContent.push({ + type: 'image_url', + image_url: { url } + }) + } } + + return imageContent } diff --git a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts index 13d7f92db5a..438ee6b2664 100644 --- a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts +++ b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts @@ -1,7 +1,7 @@ import axios from 'axios' import { BaseLanguageModel } from '@langchain/core/language_models/base' -import { AgentExecutor } from 'langchain/agents' -import { LLMChain } from 'langchain/chains' +import { AgentExecutor } from '@langchain/classic/agents' +import { LLMChain } from '@langchain/classic/chains' import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer, PromptTemplate } from '../../../src/Interface' import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' @@ -21,6 +21,8 @@ class Airtable_Agents implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + deprecateMessage: string + badge: string constructor() { this.label = 'Airtable Agent' @@ -30,6 +32,8 @@ class Airtable_Agents implements INode { this.category = 'Agents' this.icon = 'airtable.svg' this.description = 'Agent used to answer queries on Airtable table' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Airtable Agent is deprecated and will be removed in a future release. Use Agent from AgentFlow instead.' this.baseClasses = [this.type, ...getBaseClasses(AgentExecutor)] this.credential = { label: 'Connect Credential', diff --git a/packages/components/nodes/agents/AutoGPT/AutoGPT.ts b/packages/components/nodes/agents/AutoGPT/AutoGPT.ts deleted file mode 100644 index 04fd8e9260d..00000000000 --- a/packages/components/nodes/agents/AutoGPT/AutoGPT.ts +++ /dev/null @@ -1,226 +0,0 @@ -import { flatten } from 'lodash' -import { Tool, StructuredTool } from '@langchain/core/tools' -import { BaseChatModel } from '@langchain/core/language_models/chat_models' -import { AIMessage, HumanMessage, SystemMessage } from '@langchain/core/messages' -import { VectorStoreRetriever } from '@langchain/core/vectorstores' -import { PromptTemplate } from '@langchain/core/prompts' -import { AutoGPT } from 'langchain/experimental/autogpt' -import { LLMChain } from 'langchain/chains' -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { checkInputs, Moderation } from '../../moderation/Moderation' -import { formatResponse } from '../../outputparsers/OutputParserHelpers' - -type ObjectTool = StructuredTool -const FINISH_NAME = 'finish' - -class AutoGPT_Agents implements INode { - label: string - name: string - version: number - description: string - type: string - icon: string - category: string - baseClasses: string[] - inputs: INodeParams[] - badge: string - - constructor() { - this.label = 'AutoGPT' - this.name = 'autoGPT' - this.version = 2.0 - this.type = 'AutoGPT' - this.category = 'Agents' - this.badge = 'DEPRECATING' - this.icon = 'autogpt.svg' - this.description = 'Autonomous agent with chain of thoughts for self-guided task completion' - this.baseClasses = ['AutoGPT'] - this.inputs = [ - { - label: 'Allowed Tools', - name: 'tools', - type: 'Tool', - list: true - }, - { - label: 'Chat Model', - name: 'model', - type: 'BaseChatModel' - }, - { - label: 'Vector Store Retriever', - name: 'vectorStoreRetriever', - type: 'BaseRetriever' - }, - { - label: 'AutoGPT Name', - name: 'aiName', - type: 'string', - placeholder: 'Tom', - optional: true - }, - { - label: 'AutoGPT Role', - name: 'aiRole', - type: 'string', - placeholder: 'Assistant', - optional: true - }, - { - label: 'Maximum Loop', - name: 'maxLoop', - type: 'number', - default: 5, - optional: true - }, - { - label: 'Input Moderation', - description: 'Detect text that could generate harmful output and prevent it from being sent to the language model', - name: 'inputModeration', - type: 'Moderation', - optional: true, - list: true - } - ] - } - - async init(nodeData: INodeData): Promise { - const model = nodeData.inputs?.model as BaseChatModel - const vectorStoreRetriever = nodeData.inputs?.vectorStoreRetriever as VectorStoreRetriever - let tools = nodeData.inputs?.tools as Tool[] - tools = flatten(tools) - const aiName = (nodeData.inputs?.aiName as string) || 'AutoGPT' - const aiRole = (nodeData.inputs?.aiRole as string) || 'Assistant' - const maxLoop = nodeData.inputs?.maxLoop as string - - const autogpt = AutoGPT.fromLLMAndTools(model, tools, { - memory: vectorStoreRetriever, - aiName, - aiRole - }) - - autogpt.maxIterations = parseInt(maxLoop, 10) - - return autogpt - } - - async run(nodeData: INodeData, input: string): Promise { - const executor = nodeData.instance as AutoGPT - const model = nodeData.inputs?.model as BaseChatModel - const moderations = nodeData.inputs?.inputModeration as Moderation[] - - if (moderations && moderations.length > 0) { - try { - // Use the output of the moderation chain as input for the AutoGPT agent - input = await checkInputs(moderations, input) - } catch (e) { - await new Promise((resolve) => setTimeout(resolve, 500)) - // if (options.shouldStreamResponse) { - // streamResponse(options.sseStreamer, options.chatId, e.message) - // } - return formatResponse(e.message) - } - } - - try { - let totalAssistantReply = '' - executor.run = async (goals: string[]): Promise => { - const user_input = 'Determine which next command to use, and respond using the format specified above:' - let loopCount = 0 - while (loopCount < executor.maxIterations) { - loopCount += 1 - - const { text: assistantReply } = await executor.chain.call({ - goals, - user_input, - memory: executor.memory, - messages: executor.fullMessageHistory - }) - - // eslint-disable-next-line no-console - console.log('\x1b[92m\x1b[1m\n*****AutoGPT*****\n\x1b[0m\x1b[0m') - // eslint-disable-next-line no-console - console.log(assistantReply) - totalAssistantReply += assistantReply + '\n' - executor.fullMessageHistory.push(new HumanMessage(user_input)) - executor.fullMessageHistory.push(new AIMessage(assistantReply)) - - const action = await executor.outputParser.parse(assistantReply) - const tools = executor.tools.reduce((acc, tool) => ({ ...acc, [tool.name]: tool }), {} as { [key: string]: ObjectTool }) - if (action.name === FINISH_NAME) { - return action.args.response - } - let result: string - if (action.name in tools) { - const tool = tools[action.name] - let observation - try { - observation = await tool.call(action.args) - } catch (e) { - observation = `Error in args: ${e}` - } - result = `Command ${tool.name} returned: ${observation}` - } else if (action.name === 'ERROR') { - result = `Error: ${action.args}. ` - } else { - result = `Unknown command '${action.name}'. Please refer to the 'COMMANDS' list for available commands and only respond in the specified JSON format.` - } - - let memoryToAdd = `Assistant Reply: ${assistantReply}\nResult: ${result} ` - if (executor.feedbackTool) { - const feedback = `\n${await executor.feedbackTool.call('Input: ')}` - if (feedback === 'q' || feedback === 'stop') { - return 'EXITING' - } - memoryToAdd += feedback - } - - const documents = await executor.textSplitter.createDocuments([memoryToAdd]) - await executor.memory.addDocuments(documents) - executor.fullMessageHistory.push(new SystemMessage(result)) - } - - return undefined - } - - const res = await executor.run([input]) - - if (!res) { - const sentence = `Unfortunately I was not able to complete all the task. Here is the chain of thoughts:` - return `${await rephraseString(sentence, model)}\n\`\`\`javascript\n${totalAssistantReply}\n\`\`\`\n` - } - - const sentence = `I have completed all my tasks. Here is the chain of thoughts:` - let writeFilePath = '' - const writeTool = executor.tools.find((tool) => tool.name === 'write_file') - if (executor.tools.length && writeTool) { - writeFilePath = (writeTool as any).store.basePath - } - return `${await rephraseString( - sentence, - model - )}\n\`\`\`javascript\n${totalAssistantReply}\n\`\`\`\nAnd the final result:\n\`\`\`javascript\n${res}\n\`\`\`\n${ - writeFilePath - ? await rephraseString( - `You can download the final result displayed above, or see if a new file has been successfully written to \`${writeFilePath}\``, - model - ) - : '' - }` - } catch (e) { - throw new Error(e) - } - } -} - -const rephraseString = async (sentence: string, model: BaseChatModel) => { - const promptTemplate = new PromptTemplate({ - template: 'You are a helpful Assistant that rephrase a sentence: {sentence}', - inputVariables: ['sentence'] - }) - const chain = new LLMChain({ llm: model, prompt: promptTemplate }) - const res = await chain.call({ sentence }) - return res?.text -} - -module.exports = { nodeClass: AutoGPT_Agents } diff --git a/packages/components/nodes/agents/AutoGPT/autogpt.svg b/packages/components/nodes/agents/AutoGPT/autogpt.svg deleted file mode 100644 index 99da2d0f1ab..00000000000 --- a/packages/components/nodes/agents/AutoGPT/autogpt.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/packages/components/nodes/agents/BabyAGI/BabyAGI.ts b/packages/components/nodes/agents/BabyAGI/BabyAGI.ts deleted file mode 100644 index d3bad90397c..00000000000 --- a/packages/components/nodes/agents/BabyAGI/BabyAGI.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { BaseChatModel } from '@langchain/core/language_models/chat_models' -import { VectorStore } from '@langchain/core/vectorstores' -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { BabyAGI } from './core' -import { checkInputs, Moderation } from '../../moderation/Moderation' -import { formatResponse } from '../../outputparsers/OutputParserHelpers' - -class BabyAGI_Agents implements INode { - label: string - name: string - version: number - description: string - type: string - icon: string - category: string - baseClasses: string[] - inputs: INodeParams[] - badge: string - - constructor() { - this.label = 'BabyAGI' - this.name = 'babyAGI' - this.version = 2.0 - this.type = 'BabyAGI' - this.category = 'Agents' - this.icon = 'babyagi.svg' - this.badge = 'DEPRECATING' - this.description = 'Task Driven Autonomous Agent which creates new task and reprioritizes task list based on objective' - this.baseClasses = ['BabyAGI'] - this.inputs = [ - { - label: 'Chat Model', - name: 'model', - type: 'BaseChatModel' - }, - { - label: 'Vector Store', - name: 'vectorStore', - type: 'VectorStore' - }, - { - label: 'Task Loop', - name: 'taskLoop', - type: 'number', - default: 3 - }, - { - label: 'Input Moderation', - description: 'Detect text that could generate harmful output and prevent it from being sent to the language model', - name: 'inputModeration', - type: 'Moderation', - optional: true, - list: true - } - ] - } - - async init(nodeData: INodeData): Promise { - const model = nodeData.inputs?.model as BaseChatModel - const vectorStore = nodeData.inputs?.vectorStore as VectorStore - const taskLoop = nodeData.inputs?.taskLoop as string - const k = (vectorStore as any)?.k ?? 4 - - const babyAgi = BabyAGI.fromLLM(model, vectorStore, parseInt(taskLoop, 10), k) - return babyAgi - } - - async run(nodeData: INodeData, input: string): Promise { - const executor = nodeData.instance as BabyAGI - const moderations = nodeData.inputs?.inputModeration as Moderation[] - - if (moderations && moderations.length > 0) { - try { - // Use the output of the moderation chain as input for the BabyAGI agent - input = await checkInputs(moderations, input) - } catch (e) { - await new Promise((resolve) => setTimeout(resolve, 500)) - // if (options.shouldStreamResponse) { - // streamResponse(options.sseStreamer, options.chatId, e.message) - // } - return formatResponse(e.message) - } - } - - const objective = input - - const res = await executor.call({ objective }) - return res - } -} - -module.exports = { nodeClass: BabyAGI_Agents } diff --git a/packages/components/nodes/agents/BabyAGI/babyagi.svg b/packages/components/nodes/agents/BabyAGI/babyagi.svg deleted file mode 100644 index 2fadd1b996e..00000000000 --- a/packages/components/nodes/agents/BabyAGI/babyagi.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/packages/components/nodes/agents/BabyAGI/core.ts b/packages/components/nodes/agents/BabyAGI/core.ts deleted file mode 100644 index 5f7af2ca6a5..00000000000 --- a/packages/components/nodes/agents/BabyAGI/core.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { BaseChatModel } from '@langchain/core/language_models/chat_models' -import { VectorStore } from '@langchain/core/vectorstores' -import { Document } from '@langchain/core/documents' -import { PromptTemplate } from '@langchain/core/prompts' -import { LLMChain } from 'langchain/chains' - -class TaskCreationChain extends LLMChain { - constructor(prompt: PromptTemplate, llm: BaseChatModel) { - super({ prompt, llm }) - } - - static from_llm(llm: BaseChatModel): LLMChain { - const taskCreationTemplate: string = - 'You are a task creation AI that uses the result of an execution agent' + - ' to create new tasks with the following objective: {objective},' + - ' The last completed task has the result: {result}.' + - ' This result was based on this task description: {task_description}.' + - ' These are incomplete tasks list: {incomplete_tasks}.' + - ' Based on the result, create new tasks to be completed' + - ' by the AI system that do not overlap with incomplete tasks.' + - ' Return the tasks as an array.' - - const prompt = new PromptTemplate({ - template: taskCreationTemplate, - inputVariables: ['result', 'task_description', 'incomplete_tasks', 'objective'] - }) - - return new TaskCreationChain(prompt, llm) - } -} - -class TaskPrioritizationChain extends LLMChain { - constructor(prompt: PromptTemplate, llm: BaseChatModel) { - super({ prompt, llm }) - } - - static from_llm(llm: BaseChatModel): TaskPrioritizationChain { - const taskPrioritizationTemplate: string = - 'You are a task prioritization AI tasked with cleaning the formatting of and reprioritizing' + - ' the following task list: {task_names}.' + - ' Consider the ultimate objective of your team: {objective}.' + - ' Do not remove any tasks. Return the result as a numbered list, like:' + - ' #. First task' + - ' #. Second task' + - ' Start the task list with number {next_task_id}.' - const prompt = new PromptTemplate({ - template: taskPrioritizationTemplate, - inputVariables: ['task_names', 'next_task_id', 'objective'] - }) - return new TaskPrioritizationChain(prompt, llm) - } -} - -class ExecutionChain extends LLMChain { - constructor(prompt: PromptTemplate, llm: BaseChatModel) { - super({ prompt, llm }) - } - - static from_llm(llm: BaseChatModel): LLMChain { - const executionTemplate: string = - 'You are an AI who performs one task based on the following objective: {objective}.' + - ' Take into account these previously completed tasks: {context}.' + - ' Your task: {task}.' + - ' Response:' - - const prompt = new PromptTemplate({ - template: executionTemplate, - inputVariables: ['objective', 'context', 'task'] - }) - - return new ExecutionChain(prompt, llm) - } -} - -async function getNextTask( - taskCreationChain: LLMChain, - result: string, - taskDescription: string, - taskList: string[], - objective: string -): Promise { - const incompleteTasks: string = taskList.join(', ') - const response: string = await taskCreationChain.predict({ - result, - task_description: taskDescription, - incomplete_tasks: incompleteTasks, - objective - }) - - const newTasks: string[] = response.split('\n') - - return newTasks.filter((taskName) => taskName.trim()).map((taskName) => ({ task_name: taskName })) -} - -interface Task { - task_id: number - task_name: string -} - -async function prioritizeTasks( - taskPrioritizationChain: LLMChain, - thisTaskId: number, - taskList: Task[], - objective: string -): Promise { - const next_task_id = thisTaskId + 1 - const task_names = taskList.map((t) => t.task_name).join(', ') - const response = await taskPrioritizationChain.predict({ task_names, next_task_id, objective }) - const newTasks = response.split('\n') - const prioritizedTaskList: Task[] = [] - - for (const taskString of newTasks) { - if (!taskString.trim()) { - // eslint-disable-next-line no-continue - continue - } - const taskParts = taskString.trim().split('. ', 2) - if (taskParts.length === 2) { - const task_id = parseInt(taskParts[0].trim(), 10) - const task_name = taskParts[1].trim() - prioritizedTaskList.push({ task_id, task_name }) - } - } - - return prioritizedTaskList -} - -export async function get_top_tasks(vectorStore: VectorStore, query: string, k: number): Promise { - const docs = await vectorStore.similaritySearch(query, k) - let returnDocs: string[] = [] - for (const doc of docs) { - returnDocs.push(doc.metadata.task) - } - return returnDocs -} - -async function executeTask(vectorStore: VectorStore, executionChain: LLMChain, objective: string, task: string, k = 5): Promise { - const context = await get_top_tasks(vectorStore, objective, k) - return executionChain.predict({ objective, context, task }) -} - -export class BabyAGI { - taskList: Array = [] - - taskCreationChain: TaskCreationChain - - taskPrioritizationChain: TaskPrioritizationChain - - executionChain: ExecutionChain - - taskIdCounter = 1 - - vectorStore: VectorStore - - maxIterations = 3 - - topK = 4 - - constructor( - taskCreationChain: TaskCreationChain, - taskPrioritizationChain: TaskPrioritizationChain, - executionChain: ExecutionChain, - vectorStore: VectorStore, - maxIterations: number, - topK: number - ) { - this.taskCreationChain = taskCreationChain - this.taskPrioritizationChain = taskPrioritizationChain - this.executionChain = executionChain - this.vectorStore = vectorStore - this.maxIterations = maxIterations - this.topK = topK - } - - addTask(task: Task) { - this.taskList.push(task) - } - - printTaskList() { - // eslint-disable-next-line no-console - console.log('\x1b[95m\x1b[1m\n*****TASK LIST*****\n\x1b[0m\x1b[0m') - // eslint-disable-next-line no-console - this.taskList.forEach((t) => console.log(`${t.task_id}: ${t.task_name}`)) - } - - printNextTask(task: Task) { - // eslint-disable-next-line no-console - console.log('\x1b[92m\x1b[1m\n*****NEXT TASK*****\n\x1b[0m\x1b[0m') - // eslint-disable-next-line no-console - console.log(`${task.task_id}: ${task.task_name}`) - } - - printTaskResult(result: string) { - // eslint-disable-next-line no-console - console.log('\x1b[93m\x1b[1m\n*****TASK RESULT*****\n\x1b[0m\x1b[0m') - // eslint-disable-next-line no-console - console.log(result) - } - - getInputKeys(): string[] { - return ['objective'] - } - - getOutputKeys(): string[] { - return [] - } - - async call(inputs: Record): Promise { - const { objective } = inputs - const firstTask = inputs.first_task || 'Make a todo list' - this.addTask({ task_id: 1, task_name: firstTask }) - let numIters = 0 - let loop = true - let finalResult = '' - - while (loop) { - if (this.taskList.length) { - this.printTaskList() - - // Step 1: Pull the first task - const task = this.taskList.shift() - if (!task) break - this.printNextTask(task) - - // Step 2: Execute the task - const result = await executeTask(this.vectorStore, this.executionChain, objective, task.task_name, this.topK) - const thisTaskId = task.task_id - finalResult = result - this.printTaskResult(result) - - // Step 3: Store the result in Pinecone - const docs = new Document({ pageContent: result, metadata: { task: task.task_name } }) - this.vectorStore.addDocuments([docs]) - - // Step 4: Create new tasks and reprioritize task list - const newTasks = await getNextTask( - this.taskCreationChain, - result, - task.task_name, - this.taskList.map((t) => t.task_name), - objective - ) - newTasks.forEach((newTask) => { - this.taskIdCounter += 1 - // eslint-disable-next-line no-param-reassign - newTask.task_id = this.taskIdCounter - this.addTask(newTask) - }) - this.taskList = await prioritizeTasks(this.taskPrioritizationChain, thisTaskId, this.taskList, objective) - } - - numIters += 1 - if (this.maxIterations !== null && numIters === this.maxIterations) { - // eslint-disable-next-line no-console - console.log('\x1b[91m\x1b[1m\n*****TASK ENDING*****\n\x1b[0m\x1b[0m') - loop = false - this.taskList = [] - } - } - - return finalResult - } - - static fromLLM(llm: BaseChatModel, vectorstore: VectorStore, maxIterations = 3, topK = 4): BabyAGI { - const taskCreationChain = TaskCreationChain.from_llm(llm) - const taskPrioritizationChain = TaskPrioritizationChain.from_llm(llm) - const executionChain = ExecutionChain.from_llm(llm) - return new BabyAGI(taskCreationChain, taskPrioritizationChain, executionChain, vectorstore, maxIterations, topK) - } -} diff --git a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts index 4ea30f285cc..8a27e628e20 100644 --- a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts +++ b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts @@ -1,6 +1,6 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' -import { AgentExecutor } from 'langchain/agents' -import { LLMChain } from 'langchain/chains' +import { AgentExecutor } from '@langchain/classic/agents' +import { LLMChain } from '@langchain/classic/chains' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer, PromptTemplate } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' diff --git a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts index 8583826da46..f7e2901acb2 100644 --- a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts +++ b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts @@ -1,4 +1,5 @@ import { flatten } from 'lodash' +import type { BaseLanguageModel } from '@langchain/core/language_models/base' import { Tool } from '@langchain/core/tools' import { BaseChatModel } from '@langchain/core/language_models/chat_models' import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages' @@ -6,7 +7,7 @@ import { ChainValues } from '@langchain/core/utils/types' import { AgentStep } from '@langchain/core/agents' import { renderTemplate, MessagesPlaceholder, HumanMessagePromptTemplate, PromptTemplate } from '@langchain/core/prompts' import { RunnableSequence } from '@langchain/core/runnables' -import { ChatConversationalAgent } from 'langchain/agents' +import { ChatConversationalAgent } from '@langchain/classic/agents' import { getBaseClasses, transformBracesWithColon } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { @@ -52,6 +53,8 @@ class ConversationalAgent_Agents implements INode { baseClasses: string[] inputs: INodeParams[] sessionId?: string + deprecateMessage: string + badge: string constructor(fields?: { sessionId?: string }) { this.label = 'Conversational Agent' @@ -61,6 +64,9 @@ class ConversationalAgent_Agents implements INode { this.category = 'Agents' this.icon = 'agent.svg' this.description = 'Conversational agent for a chat model. It will utilize chat specific prompts' + this.badge = 'DEPRECATING' + this.deprecateMessage = + 'Conversational agent is deprecated and will be removed in a future release. Use Agent from AgentFlow instead.' this.baseClasses = [this.type, ...getBaseClasses(AgentExecutor)] this.inputs = [ { @@ -264,7 +270,7 @@ const prepareAgent = async ( } /** Bind a stop token to the model */ - const modelWithStop = model.bind({ + const modelWithStop = (model as BaseLanguageModel).withConfig({ stop: ['\nObservation'] }) diff --git a/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts b/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts index 7a8966e14f9..1883db676e1 100644 --- a/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts +++ b/packages/components/nodes/agents/ConversationalRetrievalToolAgent/ConversationalRetrievalToolAgent.ts @@ -4,9 +4,15 @@ import { ChainValues } from '@langchain/core/utils/types' import { RunnableSequence } from '@langchain/core/runnables' import { BaseChatModel } from '@langchain/core/language_models/chat_models' import { ChatPromptTemplate, MessagesPlaceholder, HumanMessagePromptTemplate, PromptTemplate } from '@langchain/core/prompts' -import { formatToOpenAIToolMessages } from 'langchain/agents/format_scratchpad/openai_tools' -import { getBaseClasses, transformBracesWithColon, convertChatHistoryToText, convertBaseMessagetoIMessage } from '../../../src/utils' -import { type ToolsAgentStep } from 'langchain/agents/openai/output_parser' +import { formatToOpenAIToolMessages } from '@langchain/classic/agents/format_scratchpad/openai_tools' +import { + getBaseClasses, + transformBracesWithColon, + convertChatHistoryToText, + convertBaseMessagetoIMessage, + createTextOnlyOutputParser +} from '../../../src/utils' +import { type ToolsAgentStep } from '@langchain/classic/agents/openai/output_parser' import { FlowiseMemory, ICommonObject, @@ -25,7 +31,6 @@ import type { Document } from '@langchain/core/documents' import { BaseRetriever } from '@langchain/core/retrievers' import { RESPONSE_TEMPLATE, REPHRASE_TEMPLATE } from '../../chains/ConversationalRetrievalQAChain/prompts' import { addImagesToMessages, llmSupportsVision } from '../../../src/multiModalUtils' -import { StringOutputParser } from '@langchain/core/output_parsers' import { Tool } from '@langchain/core/tools' class ConversationalRetrievalToolAgent_Agents implements INode { @@ -323,7 +328,7 @@ const prepareAgent = async ( // Always rephrase to normalize/expand user queries for better retrieval try { const CONDENSE_QUESTION_PROMPT = PromptTemplate.fromTemplate(rephrasePrompt) - const condenseQuestionChain = RunnableSequence.from([CONDENSE_QUESTION_PROMPT, rephraseModel, new StringOutputParser()]) + const condenseQuestionChain = RunnableSequence.from([CONDENSE_QUESTION_PROMPT, rephraseModel, createTextOnlyOutputParser()]) const res = await condenseQuestionChain.invoke({ question: input, chat_history: chatHistoryString diff --git a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts index e8774549279..314b5421f06 100644 --- a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts +++ b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts @@ -33,6 +33,8 @@ class OpenAIAssistant_Agents implements INode { category: string baseClasses: string[] inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'OpenAI Assistant' @@ -42,6 +44,8 @@ class OpenAIAssistant_Agents implements INode { this.category = 'Agents' this.icon = 'assistant.svg' this.description = `An agent that uses OpenAI Assistant API to pick the tool and args to call` + this.badge = 'DEPRECATING' + this.deprecateMessage = 'OpenAI Assistant is deprecated and will be removed in a future release. Use Custom Assistant instead.' this.baseClasses = [this.type] this.inputs = [ { @@ -173,7 +177,7 @@ class OpenAIAssistant_Agents implements INode { options.logger.info(`[${orgId}]: Clearing OpenAI Thread ${sessionId}`) try { if (sessionId && sessionId.startsWith('thread_')) { - await openai.beta.threads.del(sessionId) + await openai.beta.threads.delete(sessionId) options.logger.info(`[${orgId}]: Successfully cleared OpenAI Thread ${sessionId}`) } else { options.logger.error(`[${orgId}]: Error clearing OpenAI Thread ${sessionId}`) @@ -587,7 +591,7 @@ class OpenAIAssistant_Agents implements INode { } try { - await handleToolSubmission({ + const result = await handleToolSubmission({ openai, threadId, runThreadId, @@ -604,9 +608,11 @@ class OpenAIAssistant_Agents implements INode { text, isStreamingStarted }) + text = result.text + isStreamingStarted = result.isStreamingStarted } catch (error) { console.error('Error submitting tool outputs:', error) - await openai.beta.threads.runs.cancel(threadId, runThreadId) + await openai.beta.threads.runs.cancel(runThreadId, { thread_id: threadId }) const errMsg = `Error submitting tool outputs. Thread ID: ${threadId}. Run ID: ${runThreadId}` @@ -631,7 +637,6 @@ class OpenAIAssistant_Agents implements INode { await analyticHandlers.onLLMEnd(llmIds, llmOutput) await analyticHandlers.onChainEnd(parentIds, messageData, true) - return { text, usedTools, @@ -651,7 +656,7 @@ class OpenAIAssistant_Agents implements INode { const timeout = setInterval(async () => { try { - const run = await openai.beta.threads.runs.retrieve(threadId, runId) + const run = await openai.beta.threads.runs.retrieve(runId, { thread_id: threadId }) const state = run.status if (state === 'completed') { @@ -715,17 +720,18 @@ class OpenAIAssistant_Agents implements INode { } } - const newRun = await openai.beta.threads.runs.retrieve(threadId, runId) + const newRun = await openai.beta.threads.runs.retrieve(runId, { thread_id: threadId }) const newStatus = newRun?.status try { if (submitToolOutputs.length && newStatus === 'requires_action') { - await openai.beta.threads.runs.submitToolOutputs(threadId, runId, { - tool_outputs: submitToolOutputs + await openai.beta.threads.runs.submitToolOutputs(runId, { + tool_outputs: submitToolOutputs, + thread_id: threadId }) resolve(state) } else { - await openai.beta.threads.runs.cancel(threadId, runId) + await openai.beta.threads.runs.cancel(runId, { thread_id: threadId }) resolve('requires_action_retry') } } catch (e) { @@ -1033,8 +1039,9 @@ async function handleToolSubmission(params: ToolSubmissionParams): Promise', ''] }) + const llmWithStop = (model as BaseLanguageModel).withConfig({ + stop: ['', ''] + }) const messages = (await memory.getChatMessages(flowObj.sessionId, false, prependMessages)) as IMessage[] let chatHistoryMsgTxt = '' diff --git a/packages/components/nodes/cache/GoogleGenerativeAIContextCache/FlowiseGoogleAICacheManager.ts b/packages/components/nodes/cache/GoogleGenerativeAIContextCache/FlowiseGoogleAICacheManager.ts deleted file mode 100644 index dee5160644b..00000000000 --- a/packages/components/nodes/cache/GoogleGenerativeAIContextCache/FlowiseGoogleAICacheManager.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { CachedContentBase, CachedContent, Content } from '@google/generative-ai' -import { GoogleAICacheManager as GoogleAICacheManagerBase } from '@google/generative-ai/server' -import hash from 'object-hash' - -type CacheContentOptions = Omit & { contents?: Content[] } - -export class GoogleAICacheManager extends GoogleAICacheManagerBase { - private ttlSeconds: number - private cachedContents: Map = new Map() - - setTtlSeconds(ttlSeconds: number) { - this.ttlSeconds = ttlSeconds - } - - async lookup(options: CacheContentOptions): Promise { - const { model, tools, contents } = options - if (!contents?.length) { - return undefined - } - const hashKey = hash({ - model, - tools, - contents - }) - if (this.cachedContents.has(hashKey)) { - return this.cachedContents.get(hashKey) - } - const { cachedContents } = await this.list() - const cachedContent = (cachedContents ?? []).find((cache) => cache.displayName === hashKey) - if (cachedContent) { - this.cachedContents.set(hashKey, cachedContent) - return cachedContent - } - const res = await this.create({ - ...(options as CachedContentBase), - displayName: hashKey, - ttlSeconds: this.ttlSeconds - }) - this.cachedContents.set(hashKey, res) - return res - } -} - -export default GoogleAICacheManager diff --git a/packages/components/nodes/cache/GoogleGenerativeAIContextCache/GoogleGemini.svg b/packages/components/nodes/cache/GoogleGenerativeAIContextCache/GoogleGemini.svg deleted file mode 100644 index 53b497fa1a0..00000000000 --- a/packages/components/nodes/cache/GoogleGenerativeAIContextCache/GoogleGemini.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/components/nodes/cache/GoogleGenerativeAIContextCache/GoogleGenerativeAIContextCache.ts b/packages/components/nodes/cache/GoogleGenerativeAIContextCache/GoogleGenerativeAIContextCache.ts deleted file mode 100644 index 9e6d283176d..00000000000 --- a/packages/components/nodes/cache/GoogleGenerativeAIContextCache/GoogleGenerativeAIContextCache.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { getBaseClasses, getCredentialData, getCredentialParam, ICommonObject, INode, INodeData, INodeParams } from '../../../src' -import FlowiseGoogleAICacheManager from './FlowiseGoogleAICacheManager' - -class GoogleGenerativeAIContextCache implements INode { - label: string - name: string - version: number - description: string - type: string - icon: string - category: string - baseClasses: string[] - inputs: INodeParams[] - credential: INodeParams - - constructor() { - this.label = 'Google GenAI Context Cache' - this.name = 'googleGenerativeAIContextCache' - this.version = 1.0 - this.type = 'GoogleAICacheManager' - this.description = 'Large context cache for Google Gemini large language models' - this.icon = 'GoogleGemini.svg' - this.category = 'Cache' - this.baseClasses = [this.type, ...getBaseClasses(FlowiseGoogleAICacheManager)] - this.inputs = [ - { - label: 'TTL', - name: 'ttl', - type: 'number', - default: 60 * 60 * 24 * 30 - } - ] - this.credential = { - label: 'Connect Credential', - name: 'credential', - type: 'credential', - credentialNames: ['googleGenerativeAI'], - optional: false, - description: 'Google Generative AI credential.' - } - } - - async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { - const ttl = nodeData.inputs?.ttl as number - const credentialData = await getCredentialData(nodeData.credential ?? '', options) - const apiKey = getCredentialParam('googleGenerativeAPIKey', credentialData, nodeData) - const manager = new FlowiseGoogleAICacheManager(apiKey) - manager.setTtlSeconds(ttl) - return manager - } -} - -module.exports = { nodeClass: GoogleGenerativeAIContextCache } diff --git a/packages/components/nodes/cache/InMemoryCache/InMemoryEmbeddingCache.ts b/packages/components/nodes/cache/InMemoryCache/InMemoryEmbeddingCache.ts index d50bc722922..3fbd311398f 100644 --- a/packages/components/nodes/cache/InMemoryCache/InMemoryEmbeddingCache.ts +++ b/packages/components/nodes/cache/InMemoryCache/InMemoryEmbeddingCache.ts @@ -1,6 +1,6 @@ import { Embeddings } from '@langchain/core/embeddings' import { BaseStore } from '@langchain/core/stores' -import { CacheBackedEmbeddings } from 'langchain/embeddings/cache_backed' +import { CacheBackedEmbeddings } from '@langchain/classic/embeddings/cache_backed' import { getBaseClasses, ICommonObject, INode, INodeData, INodeParams } from '../../../src' class InMemoryEmbeddingCache implements INode { diff --git a/packages/components/nodes/cache/RedisCache/RedisEmbeddingsCache.ts b/packages/components/nodes/cache/RedisCache/RedisEmbeddingsCache.ts index c46a9921b79..9afa425f45d 100644 --- a/packages/components/nodes/cache/RedisCache/RedisEmbeddingsCache.ts +++ b/packages/components/nodes/cache/RedisCache/RedisEmbeddingsCache.ts @@ -1,10 +1,10 @@ import { Redis } from 'ioredis' import { RedisByteStore } from '@langchain/community/storage/ioredis' import { Embeddings, EmbeddingsInterface } from '@langchain/core/embeddings' -import { CacheBackedEmbeddingsFields } from 'langchain/embeddings/cache_backed' +import { CacheBackedEmbeddingsFields } from '@langchain/classic/embeddings/cache_backed' import { getBaseClasses, getCredentialData, getCredentialParam, ICommonObject, INode, INodeData, INodeParams } from '../../../src' import { BaseStore } from '@langchain/core/stores' -import { insecureHash } from '@langchain/core/utils/hash' +import { sha256 } from '@langchain/core/utils/hash' import { Document } from '@langchain/core/documents' class RedisEmbeddingsCache implements INode { @@ -168,7 +168,7 @@ class CacheBackedEmbeddings extends Embeddings { const decoder = new TextDecoder() const encoderBackedStore = new EncoderBackedStore({ store: documentEmbeddingStore, - keyEncoder: (key) => (options?.namespace ?? '') + insecureHash(key), + keyEncoder: (key) => (options?.namespace ?? '') + sha256(key), valueSerializer: (value) => encoder.encode(JSON.stringify(value)), valueDeserializer: (serializedValue) => JSON.parse(decoder.decode(serializedValue)) }) diff --git a/packages/components/nodes/chains/ApiChain/GETApiChain.ts b/packages/components/nodes/chains/ApiChain/GETApiChain.ts index ca97e755fe5..cdcbd53a82b 100644 --- a/packages/components/nodes/chains/ApiChain/GETApiChain.ts +++ b/packages/components/nodes/chains/ApiChain/GETApiChain.ts @@ -1,6 +1,6 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { PromptTemplate } from '@langchain/core/prompts' -import { APIChain } from 'langchain/chains' +import { APIChain } from '@langchain/classic/chains' import { getBaseClasses } from '../../../src/utils' import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' diff --git a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts index 48cfd5d09a5..c0749b2fd8c 100644 --- a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts +++ b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts @@ -1,4 +1,4 @@ -import { APIChain, createOpenAPIChain } from 'langchain/chains' +import { APIChain, createOpenAPIChain } from '@langchain/classic/chains' import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' diff --git a/packages/components/nodes/chains/ApiChain/postCore.ts b/packages/components/nodes/chains/ApiChain/postCore.ts index 4f38d3c06a2..78baa7ced51 100644 --- a/packages/components/nodes/chains/ApiChain/postCore.ts +++ b/packages/components/nodes/chains/ApiChain/postCore.ts @@ -2,7 +2,7 @@ import { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { BasePromptTemplate, PromptTemplate } from '@langchain/core/prompts' import { ChainValues } from '@langchain/core/utils/types' -import { BaseChain, ChainInputs, LLMChain, SerializedAPIChain } from 'langchain/chains' +import { BaseChain, ChainInputs, LLMChain, SerializedAPIChain } from '@langchain/classic/chains' import { secureFetch } from '../../../src' export const API_URL_RAW_PROMPT_TEMPLATE = `You are given the below API Documentation: diff --git a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts index 04e36daf31a..bd9db2082e3 100644 --- a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts +++ b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts @@ -1,4 +1,4 @@ -import { ConversationChain } from 'langchain/chains' +import { ConversationChain } from '@langchain/classic/chains' import { ChatPromptTemplate, HumanMessagePromptTemplate, @@ -8,7 +8,6 @@ import { PromptTemplate } from '@langchain/core/prompts' import { RunnableSequence } from '@langchain/core/runnables' -import { StringOutputParser } from '@langchain/core/output_parsers' import { BaseChatModel } from '@langchain/core/language_models/chat_models' import { HumanMessage } from '@langchain/core/messages' import { ConsoleCallbackHandler as LCConsoleCallbackHandler } from '@langchain/core/tracers/console' @@ -27,7 +26,7 @@ import { IServerSideEventStreamer } from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' -import { getBaseClasses, handleEscapeCharacters, transformBracesWithColon } from '../../../src/utils' +import { getBaseClasses, handleEscapeCharacters, transformBracesWithColon, createTextOnlyOutputParser } from '../../../src/utils' let systemMessage = `The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.` const inputKey = 'input' @@ -268,7 +267,7 @@ const prepareChain = async (nodeData: INodeData, options: ICommonObject, session }, prepareChatPrompt(nodeData, messageContent), model, - new StringOutputParser() + createTextOnlyOutputParser() ]) return conversationChain diff --git a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts index 31dfa8b1a90..2166242fd31 100644 --- a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts +++ b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts @@ -8,11 +8,10 @@ import { BaseMessage, HumanMessage, AIMessage } from '@langchain/core/messages' import { ConsoleCallbackHandler as LCConsoleCallbackHandler } from '@langchain/core/tracers/console' import { checkInputs, Moderation, streamResponse } from '../../moderation/Moderation' import { formatResponse } from '../../outputparsers/OutputParserHelpers' -import { StringOutputParser } from '@langchain/core/output_parsers' import type { Document } from '@langchain/core/documents' -import { BufferMemoryInput } from 'langchain/memory' -import { ConversationalRetrievalQAChain } from 'langchain/chains' -import { getBaseClasses, mapChatMessageToBaseMessage } from '../../../src/utils' +import { BufferMemoryInput } from '@langchain/classic/memory' +import { ConversationalRetrievalQAChain } from '@langchain/classic/chains' +import { getBaseClasses, mapChatMessageToBaseMessage, createTextOnlyOutputParser } from '../../../src/utils' import { ConsoleCallbackHandler, additionalCallbacks } from '../../../src/handler' import { FlowiseMemory, @@ -308,7 +307,7 @@ const createRetrieverChain = (llm: BaseLanguageModel, retriever: Runnable, rephr // Small speed/accuracy optimization: no need to rephrase the first question // since there shouldn't be any meta-references to prior chat history const CONDENSE_QUESTION_PROMPT = PromptTemplate.fromTemplate(rephrasePrompt) - const condenseQuestionChain = RunnableSequence.from([CONDENSE_QUESTION_PROMPT, llm, new StringOutputParser()]).withConfig({ + const condenseQuestionChain = RunnableSequence.from([CONDENSE_QUESTION_PROMPT, llm, createTextOnlyOutputParser()]).withConfig({ runName: 'CondenseQuestion' }) @@ -385,7 +384,7 @@ const createChain = ( ['human', `{question}`] ]) - const responseSynthesizerChain = RunnableSequence.from([prompt, llm, new StringOutputParser()]).withConfig({ + const responseSynthesizerChain = RunnableSequence.from([prompt, llm, createTextOnlyOutputParser()]).withConfig({ tags: ['GenerateResponse'] }) diff --git a/packages/components/nodes/chains/LLMChain/LLMChain.ts b/packages/components/nodes/chains/LLMChain/LLMChain.ts index 8013581264a..990887ec7e2 100644 --- a/packages/components/nodes/chains/LLMChain/LLMChain.ts +++ b/packages/components/nodes/chains/LLMChain/LLMChain.ts @@ -2,8 +2,8 @@ import { BaseLanguageModel, BaseLanguageModelCallOptions } from '@langchain/core import { BaseLLMOutputParser, BaseOutputParser } from '@langchain/core/output_parsers' import { HumanMessage } from '@langchain/core/messages' import { ChatPromptTemplate, FewShotPromptTemplate, HumanMessagePromptTemplate, PromptTemplate } from '@langchain/core/prompts' -import { OutputFixingParser } from 'langchain/output_parsers' -import { LLMChain } from 'langchain/chains' +import { OutputFixingParser } from '@langchain/classic/output_parsers' +import { LLMChain } from '@langchain/classic/chains' import { IVisionChatModal, ICommonObject, diff --git a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts index da683400596..386a5d7fc0c 100644 --- a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts +++ b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts @@ -1,5 +1,5 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' -import { MultiPromptChain } from 'langchain/chains' +import { MultiPromptChain } from '@langchain/classic/chains' import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer, PromptRetriever } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' diff --git a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts index bdcd3762189..18bb23b0505 100644 --- a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts +++ b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts @@ -1,5 +1,5 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' -import { MultiRetrievalQAChain } from 'langchain/chains' +import { MultiRetrievalQAChain } from '@langchain/classic/chains' import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer, VectorStoreRetriever } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' diff --git a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts index f82d92e06f9..bb53090e3a3 100644 --- a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts +++ b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts @@ -1,6 +1,6 @@ import { BaseRetriever } from '@langchain/core/retrievers' import { BaseLanguageModel } from '@langchain/core/language_models/base' -import { RetrievalQAChain } from 'langchain/chains' +import { RetrievalQAChain } from '@langchain/classic/chains' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' diff --git a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts index 539e2031d72..10ff1b88df5 100644 --- a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts +++ b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts @@ -2,8 +2,8 @@ import { DataSourceOptions } from 'typeorm/data-source' import { DataSource } from 'typeorm' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { PromptTemplate, PromptTemplateInput } from '@langchain/core/prompts' -import { SqlDatabaseChain, SqlDatabaseChainInput, DEFAULT_SQL_DATABASE_PROMPT } from 'langchain/chains/sql_db' -import { SqlDatabase } from 'langchain/sql_db' +import { SqlDatabaseChain, SqlDatabaseChainInput, DEFAULT_SQL_DATABASE_PROMPT } from '@langchain/classic/chains/sql_db' +import { SqlDatabase } from '@langchain/classic/sql_db' import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { getBaseClasses, getInputVariables, transformBracesWithColon } from '../../../src/utils' diff --git a/packages/components/nodes/chains/VectaraChain/VectaraChain.ts b/packages/components/nodes/chains/VectaraChain/VectaraChain.ts index dc34a166fb4..19ae12df9fe 100644 --- a/packages/components/nodes/chains/VectaraChain/VectaraChain.ts +++ b/packages/components/nodes/chains/VectaraChain/VectaraChain.ts @@ -1,7 +1,7 @@ import fetch from 'node-fetch' import { Document } from '@langchain/core/documents' import { VectaraStore } from '@langchain/community/vectorstores/vectara' -import { VectorDBQAChain } from 'langchain/chains' +import { VectorDBQAChain } from '@langchain/classic/chains' import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { checkInputs, Moderation } from '../../moderation/Moderation' diff --git a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts index f111f652921..6058cc490eb 100644 --- a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts +++ b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts @@ -1,6 +1,6 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { VectorStore } from '@langchain/core/vectorstores' -import { VectorDBQAChain } from 'langchain/chains' +import { VectorDBQAChain } from '@langchain/classic/chains' import { ConsoleCallbackHandler, CustomChainHandler, additionalCallbacks } from '../../../src/handler' import { ICommonObject, INode, INodeData, INodeParams, IServerSideEventStreamer } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' diff --git a/packages/components/nodes/chatmodels/AWSBedrock/AWSChatBedrock.ts b/packages/components/nodes/chatmodels/AWSBedrock/AWSChatBedrock.ts index dd22615613a..216a7ba82e7 100644 --- a/packages/components/nodes/chatmodels/AWSBedrock/AWSChatBedrock.ts +++ b/packages/components/nodes/chatmodels/AWSBedrock/AWSChatBedrock.ts @@ -6,9 +6,6 @@ import { getAWSCredentialConfig } from '../../../src/awsToolsUtils' import { ChatBedrockConverseInput, ChatBedrockConverse } from '@langchain/aws' import { BedrockChat } from './FlowiseAWSChatBedrock' -/** - * @author Michael Connor - */ class AWSChatBedrock_ChatModels implements INode { label: string name: string @@ -22,7 +19,7 @@ class AWSChatBedrock_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'AWS ChatBedrock' + this.label = 'AWS Bedrock' this.name = 'awsChatBedrock' this.version = 6.1 this.type = 'AWSChatBedrock' @@ -80,6 +77,15 @@ class AWSChatBedrock_ChatModels implements INode { optional: true, additionalParams: true }, + { + label: 'Allow Image Uploads', + name: 'allowImageUploads', + type: 'boolean', + description: + 'Allow image input. Refer to the docs for more details.', + default: false, + optional: true + }, { label: 'Temperature', name: 'temperature', @@ -100,15 +106,6 @@ class AWSChatBedrock_ChatModels implements INode { additionalParams: true, default: 200 }, - { - label: 'Allow Image Uploads', - name: 'allowImageUploads', - type: 'boolean', - description: - 'Allow image input. Refer to the docs for more details.', - default: false, - optional: true - }, { label: 'Latency Optimized', name: 'latencyOptimized', diff --git a/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts b/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts index 786a17d49ad..24eb2c3f690 100644 --- a/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts @@ -1,7 +1,7 @@ import { AzureOpenAIInput, AzureChatOpenAI as LangchainAzureChatOpenAI, ChatOpenAIFields } from '@langchain/openai' import { BaseCache } from '@langchain/core/caches' import { ICommonObject, IMultiModalOption, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface' -import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam, isReasoningModelOpenAI } from '../../../src/utils' import { getModels, MODEL_TYPE } from '../../../src/modelLoader' import { AzureChatOpenAI } from './FlowiseAzureChatOpenAI' import { OpenAI as OpenAIClient } from 'openai' @@ -25,7 +25,7 @@ class AzureChatOpenAI_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'Azure ChatOpenAI' + this.label = 'Azure OpenAI' this.name = 'azureChatOpenAI' this.version = 7.1 this.type = 'AzureChatOpenAI' @@ -51,7 +51,8 @@ class AzureChatOpenAI_ChatModels implements INode { label: 'Model Name', name: 'modelName', type: 'asyncOptions', - loadMethod: 'listModels' + loadMethod: 'listModels', + freeSolo: true }, { label: 'Temperature', @@ -77,52 +78,6 @@ class AzureChatOpenAI_ChatModels implements INode { optional: true, additionalParams: true }, - { - label: 'Top Probability', - name: 'topP', - type: 'number', - step: 0.1, - optional: true, - additionalParams: true - }, - { - label: 'Frequency Penalty', - name: 'frequencyPenalty', - type: 'number', - step: 0.1, - optional: true, - additionalParams: true - }, - { - label: 'Presence Penalty', - name: 'presencePenalty', - type: 'number', - step: 0.1, - optional: true, - additionalParams: true - }, - { - label: 'Timeout', - name: 'timeout', - type: 'number', - step: 1, - optional: true, - additionalParams: true - }, - { - label: 'BasePath', - name: 'basepath', - type: 'string', - optional: true, - additionalParams: true - }, - { - label: 'BaseOptions', - name: 'baseOptions', - type: 'json', - optional: true, - additionalParams: true - }, { label: 'Allow Image Uploads', name: 'allowImageUploads', @@ -132,32 +87,9 @@ class AzureChatOpenAI_ChatModels implements INode { default: false, optional: true }, - { - label: 'Image Resolution', - description: 'This parameter controls the resolution in which the model views the image.', - name: 'imageResolution', - type: 'options', - options: [ - { - label: 'Low', - name: 'low' - }, - { - label: 'High', - name: 'high' - }, - { - label: 'Auto', - name: 'auto' - } - ], - default: 'low', - optional: false, - additionalParams: true - }, { label: 'Reasoning', - description: 'Whether the model supports reasoning. Only applicable for reasoning models.', + description: 'Whether the model supports reasoning. Only applicable for reasoning models (gpt-5 and o-series models only)', name: 'reasoning', type: 'boolean', default: false, @@ -166,7 +98,7 @@ class AzureChatOpenAI_ChatModels implements INode { }, { label: 'Reasoning Effort', - description: 'Constrains effort on reasoning for reasoning models. Only applicable for o1 and o3 models.', + description: 'Constrains effort on reasoning. Only applicable for reasoning models (gpt-5 and o-series models only)', name: 'reasoningEffort', type: 'options', options: [ @@ -211,6 +143,54 @@ class AzureChatOpenAI_ChatModels implements INode { show: { reasoning: true } + }, + { + label: 'Top Probability', + name: 'topP', + type: 'number', + step: 0.1, + optional: true, + additionalParams: true + }, + { + label: 'Frequency Penalty', + name: 'frequencyPenalty', + type: 'number', + step: 0.1, + optional: true, + additionalParams: true + }, + { + label: 'Presence Penalty', + name: 'presencePenalty', + type: 'number', + step: 0.1, + optional: true, + additionalParams: true + }, + { + label: 'Timeout', + name: 'timeout', + type: 'number', + step: 1, + optional: true, + additionalParams: true + }, + { + label: 'Base Path', + name: 'basepath', + type: 'string', + optional: true, + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', + additionalParams: true + }, + { + label: 'Base Options', + name: 'baseOptions', + type: 'json', + optional: true, + description: 'Default headers to include with every request to the API.', + additionalParams: true } ] } @@ -244,7 +224,6 @@ class AzureChatOpenAI_ChatModels implements INode { const azureOpenAIApiVersion = getCredentialParam('azureOpenAIApiVersion', credentialData, nodeData) const allowImageUploads = nodeData.inputs?.allowImageUploads as boolean - const imageResolution = nodeData.inputs?.imageResolution as string const obj: ChatOpenAIFields & Partial = { temperature: parseFloat(temperature), @@ -256,7 +235,7 @@ class AzureChatOpenAI_ChatModels implements INode { streaming: streaming ?? true } - if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) + if (maxTokens) obj.maxCompletionTokens = parseInt(maxTokens, 10) if (frequencyPenalty) obj.frequencyPenalty = parseFloat(frequencyPenalty) if (presencePenalty) obj.presencePenalty = parseFloat(presencePenalty) if (timeout) obj.timeout = parseInt(timeout, 10) @@ -273,7 +252,7 @@ class AzureChatOpenAI_ChatModels implements INode { console.error('Error parsing base options', exception) } } - if (modelName.includes('o1') || modelName.includes('o3') || modelName.includes('gpt-5')) { + if (isReasoningModelOpenAI(modelName)) { delete obj.temperature delete obj.stop const reasoning: OpenAIClient.Reasoning = {} @@ -284,17 +263,11 @@ class AzureChatOpenAI_ChatModels implements INode { reasoning.summary = reasoningSummary } obj.reasoning = reasoning - - if (maxTokens) { - delete obj.maxTokens - obj.maxCompletionTokens = parseInt(maxTokens, 10) - } } const multiModalOption: IMultiModalOption = { image: { - allowImageUploads: allowImageUploads ?? false, - imageResolution + allowImageUploads: allowImageUploads ?? false } } diff --git a/packages/components/nodes/chatmodels/AzureChatOpenAI/FlowiseAzureChatOpenAI.ts b/packages/components/nodes/chatmodels/AzureChatOpenAI/FlowiseAzureChatOpenAI.ts index b28f34f1983..45a3398509a 100644 --- a/packages/components/nodes/chatmodels/AzureChatOpenAI/FlowiseAzureChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/AzureChatOpenAI/FlowiseAzureChatOpenAI.ts @@ -1,6 +1,7 @@ -import { AzureChatOpenAI as LangchainAzureChatOpenAI, OpenAIChatInput, AzureOpenAIInput, ClientOptions } from '@langchain/openai' +import { AzureChatOpenAI as LangchainAzureChatOpenAI } from '@langchain/openai' import { IMultiModalOption, IVisionChatModal } from '../../../src' -import { BaseChatModelParams } from '@langchain/core/language_models/chat_models' + +export type AzureChatOpenAIConstructorFields = ConstructorParameters[0] export class AzureChatOpenAI extends LangchainAzureChatOpenAI implements IVisionChatModal { configuredModel: string @@ -9,18 +10,7 @@ export class AzureChatOpenAI extends LangchainAzureChatOpenAI implements IVision builtInTools: Record[] = [] id: string - constructor( - id: string, - fields?: Partial & - Partial & { - openAIApiKey?: string - openAIApiVersion?: string - openAIBasePath?: string - deploymentName?: string - } & BaseChatModelParams & { - configuration?: ClientOptions - } - ) { + constructor(id: string, fields?: AzureChatOpenAIConstructorFields) { super(fields) this.id = id this.configuredModel = fields?.modelName ?? '' diff --git a/packages/components/nodes/chatmodels/ChatAlibabaTongyi/ChatAlibabaTongyi.ts b/packages/components/nodes/chatmodels/ChatAlibabaTongyi/ChatAlibabaTongyi.ts index 92c4b0b71c9..437a1c7596a 100644 --- a/packages/components/nodes/chatmodels/ChatAlibabaTongyi/ChatAlibabaTongyi.ts +++ b/packages/components/nodes/chatmodels/ChatAlibabaTongyi/ChatAlibabaTongyi.ts @@ -17,7 +17,7 @@ class ChatAlibabaTongyi_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatAlibabaTongyi' + this.label = 'Alibaba Tongyi' this.name = 'chatAlibabaTongyi' this.version = 2.0 this.type = 'ChatAlibabaTongyi' diff --git a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts index 27f2c7eb444..21919fba417 100644 --- a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts +++ b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts @@ -19,7 +19,7 @@ class ChatAnthropic_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatAnthropic' + this.label = 'Anthropic Claude' this.name = 'chatAnthropic' this.version = 8.0 this.type = 'ChatAnthropic' @@ -45,7 +45,7 @@ class ChatAnthropic_ChatModels implements INode { name: 'modelName', type: 'asyncOptions', loadMethod: 'listModels', - default: 'claude-3-haiku' + default: 'claude-haiku-4-5' }, { label: 'Temperature', @@ -63,6 +63,87 @@ class ChatAnthropic_ChatModels implements INode { optional: true, additionalParams: true }, + { + label: 'Allow Image Uploads', + name: 'allowImageUploads', + type: 'boolean', + description: + 'Allow image input. Refer to the docs for more details.', + default: false, + optional: true + }, + /* The manual thinking: {type: "enabled", budget_tokens: N} configuration is deprecated on Opus 4.6 and will be removed in a future model release */ + { + label: 'Extended Thinking', + name: 'extendedThinking', + type: 'boolean', + description: 'Enable extended thinking for reasoning model such as Claude Sonnet 3.7 and Claude 4', + optional: true, + additionalParams: true, + hide: { + modelName: ['claude-opus-4-6', 'claude-sonnet-4-6'] + } + }, + { + label: 'Budget Tokens', + name: 'budgetTokens', + type: 'number', + step: 1, + default: '1024', + description: 'Maximum number of tokens Claude is allowed use for its internal reasoning process', + optional: true, + additionalParams: true, + show: { + extendedThinking: true + }, + hide: { + modelName: ['claude-opus-4-6', 'claude-sonnet-4-6'] + } + }, + { + label: 'Adaptive Thinking', + description: + 'Claude evaluates the complexity of each request and determines whether and how much to use extended thinking.', + name: 'adaptiveThinking', + type: 'boolean', + default: false, + optional: true, + additionalParams: true, + show: { + modelName: ['claude-opus-4-6', 'claude-sonnet-4-6'] + } + }, + { + label: 'Thinking Effort', + description: 'Control how eager Claude is about spending tokens when responding to requests', + name: 'thinkingEffort', + type: 'options', + optional: true, + options: [ + { + label: 'Low', + name: 'low' + }, + { + label: 'Medium', + name: 'medium' + }, + { + label: 'High', + name: 'high' + }, + { + label: 'Max', + name: 'max', + description: 'Absolute maximum capability with no constraints on token spending. Opus 4.6 only' + } + ], + additionalParams: true, + show: { + adaptiveThinking: true, + modelName: ['claude-opus-4-6', 'claude-sonnet-4-6'] + } + }, { label: 'Max Tokens', name: 'maxTokensToSample', @@ -86,33 +167,6 @@ class ChatAnthropic_ChatModels implements INode { step: 0.1, optional: true, additionalParams: true - }, - { - label: 'Extended Thinking', - name: 'extendedThinking', - type: 'boolean', - description: 'Enable extended thinking for reasoning model such as Claude Sonnet 3.7 and Claude 4', - optional: true, - additionalParams: true - }, - { - label: 'Budget Tokens', - name: 'budgetTokens', - type: 'number', - step: 1, - default: 1024, - description: 'Maximum number of tokens Claude is allowed use for its internal reasoning process', - optional: true, - additionalParams: true - }, - { - label: 'Allow Image Uploads', - name: 'allowImageUploads', - type: 'boolean', - description: - 'Allow image input. Refer to the docs for more details.', - default: false, - optional: true } ] } @@ -134,6 +188,8 @@ class ChatAnthropic_ChatModels implements INode { const cache = nodeData.inputs?.cache as BaseCache const extendedThinking = nodeData.inputs?.extendedThinking as boolean const budgetTokens = nodeData.inputs?.budgetTokens as string + const adaptiveThinking = nodeData.inputs?.adaptiveThinking as boolean + const thinkingEffort = nodeData.inputs?.thinkingEffort as 'low' | 'medium' | 'high' | 'max' const credentialData = await getCredentialData(nodeData.credential ?? '', options) const anthropicApiKey = getCredentialParam('anthropicApiKey', credentialData, nodeData) @@ -151,11 +207,24 @@ class ChatAnthropic_ChatModels implements INode { if (topP) obj.topP = parseFloat(topP) if (topK) obj.topK = parseFloat(topK) if (cache) obj.cache = cache - if (extendedThinking) { + + if (adaptiveThinking) { + obj.thinking = { + type: 'adaptive' + } + if (thinkingEffort) { + obj.outputConfig = { + effort: thinkingEffort + } + } + + delete obj.temperature + } else if (extendedThinking) { obj.thinking = { type: 'enabled', - budget_tokens: parseInt(budgetTokens, 10) + budget_tokens: parseInt(budgetTokens ?? '1024', 10) } + delete obj.temperature } diff --git a/packages/components/nodes/chatmodels/ChatBaiduWenxin/ChatBaiduWenxin.ts b/packages/components/nodes/chatmodels/ChatBaiduWenxin/ChatBaiduWenxin.ts index 0941bbb695a..01517144d0d 100644 --- a/packages/components/nodes/chatmodels/ChatBaiduWenxin/ChatBaiduWenxin.ts +++ b/packages/components/nodes/chatmodels/ChatBaiduWenxin/ChatBaiduWenxin.ts @@ -16,7 +16,7 @@ class ChatBaiduWenxin_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatBaiduWenxin' + this.label = 'Baidu Wenxin' this.name = 'chatBaiduWenxin' this.version = 2.0 this.type = 'ChatBaiduWenxin' diff --git a/packages/components/nodes/chatmodels/ChatCerebras/ChatCerebras.ts b/packages/components/nodes/chatmodels/ChatCerebras/ChatCerebras.ts index 49c3c9b5bf3..88b8dc7b678 100644 --- a/packages/components/nodes/chatmodels/ChatCerebras/ChatCerebras.ts +++ b/packages/components/nodes/chatmodels/ChatCerebras/ChatCerebras.ts @@ -17,7 +17,7 @@ class ChatCerebras_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatCerebras' + this.label = 'Cerebras' this.name = 'chatCerebras' this.version = 3.0 this.type = 'ChatCerebras' @@ -103,18 +103,20 @@ class ChatCerebras_ChatModels implements INode { additionalParams: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, default: 'https://api.cerebras.ai/v1', + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', additionalParams: true }, { - label: 'BaseOptions', + label: 'Base Options', name: 'baseOptions', type: 'json', optional: true, + description: 'Default headers to include with every request to the API.', additionalParams: true } ] diff --git a/packages/components/nodes/chatmodels/ChatCloudflareWorkersAI/ChatCloudflareWorkersAI.ts b/packages/components/nodes/chatmodels/ChatCloudflareWorkersAI/ChatCloudflareWorkersAI.ts index 5e9305f2d5d..1928d42cef1 100644 --- a/packages/components/nodes/chatmodels/ChatCloudflareWorkersAI/ChatCloudflareWorkersAI.ts +++ b/packages/components/nodes/chatmodels/ChatCloudflareWorkersAI/ChatCloudflareWorkersAI.ts @@ -15,7 +15,7 @@ class ChatCloudflareWorkersAI_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatCloudflareWorkersAI' + this.label = 'Cloudflare Workers AI' this.name = 'chatCloudflareWorkersAI' this.version = 1.0 this.type = 'ChatCloudflareWorkersAI' diff --git a/packages/components/nodes/chatmodels/ChatCohere/ChatCohere.ts b/packages/components/nodes/chatmodels/ChatCohere/ChatCohere.ts index 03d6e8598dd..8a8a00135ea 100644 --- a/packages/components/nodes/chatmodels/ChatCohere/ChatCohere.ts +++ b/packages/components/nodes/chatmodels/ChatCohere/ChatCohere.ts @@ -17,7 +17,7 @@ class ChatCohere_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatCohere' + this.label = 'Cohere' this.name = 'chatCohere' this.version = 3.0 this.type = 'ChatCohere' diff --git a/packages/components/nodes/chatmodels/ChatCometAPI/ChatCometAPI.ts b/packages/components/nodes/chatmodels/ChatCometAPI/ChatCometAPI.ts index 295c5e7ceac..3dc709729b5 100644 --- a/packages/components/nodes/chatmodels/ChatCometAPI/ChatCometAPI.ts +++ b/packages/components/nodes/chatmodels/ChatCometAPI/ChatCometAPI.ts @@ -17,7 +17,7 @@ class ChatCometAPI_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatCometAPI' + this.label = 'Comet' this.name = 'chatCometAPI' this.version = 1.0 this.type = 'ChatCometAPI' diff --git a/packages/components/nodes/chatmodels/ChatFireworks/ChatFireworks.ts b/packages/components/nodes/chatmodels/ChatFireworks/ChatFireworks.ts index b89d1de8cf7..01637bdac8f 100644 --- a/packages/components/nodes/chatmodels/ChatFireworks/ChatFireworks.ts +++ b/packages/components/nodes/chatmodels/ChatFireworks/ChatFireworks.ts @@ -16,7 +16,7 @@ class ChatFireworks_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatFireworks' + this.label = 'Fireworks AI' this.name = 'chatFireworks' this.version = 2.0 this.type = 'ChatFireworks' diff --git a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/ChatGoogleGenerativeAI.ts b/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/ChatGoogleGenerativeAI.ts index d618254c0cf..65573b9fdfe 100644 --- a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/ChatGoogleGenerativeAI.ts +++ b/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/ChatGoogleGenerativeAI.ts @@ -4,7 +4,8 @@ import { BaseCache } from '@langchain/core/caches' import { ICommonObject, IMultiModalOption, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface' import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { getModels, MODEL_TYPE } from '../../../src/modelLoader' -import { ChatGoogleGenerativeAI, GoogleGenerativeAIChatInput } from './FlowiseChatGoogleGenerativeAI' +import { GoogleGenerativeAIChatInput } from '@langchain/google-genai' +import { ChatGoogleGenerativeAI } from './FlowiseChatGoogleGenerativeAI' class GoogleGenerativeAI_ChatModels implements INode { label: string @@ -19,7 +20,7 @@ class GoogleGenerativeAI_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatGoogleGenerativeAI' + this.label = 'Google Gemini' this.name = 'chatGoogleGenerativeAI' this.version = 3.1 this.type = 'ChatGoogleGenerativeAI' @@ -74,6 +75,53 @@ class GoogleGenerativeAI_ChatModels implements INode { optional: true, additionalParams: true }, + { + label: 'Allow Image Uploads', + name: 'allowImageUploads', + type: 'boolean', + description: + 'Allow image input. Refer to the docs for more details.', + default: false, + optional: true + }, + /** The thinkingLevel parameter, recommended for Gemini 3 models and onwards. */ + { + label: 'Thinking Budget', + name: 'thinkingBudget', + type: 'number', + description: 'Guides the number of thinking tokens. -1 for dynamic, 0 to disable, or positive integer (Gemini 2.5 models).', + step: 1, + optional: true, + additionalParams: true, + show: { + modelName: ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.5-flash-lite'] + } + }, + { + label: 'Thinking Level', + name: 'thinkingLevel', + type: 'options', + description: 'Adjust the amount of reasoning effort based on the complexity of the user request', + options: [ + { + label: 'Low', + name: 'LOW' + }, + { + label: 'Medium', + name: 'MEDIUM' + }, + { + label: 'High', + name: 'HIGH' + } + ], + optional: true, + additionalParams: true, + show: { + modelName: ['gemini-3.1-pro-preview', 'gemini-3.1-flash-lite-preview', 'gemini-3-flash-preview'] + } + }, { label: 'Max Output Tokens', name: 'maxOutputTokens', @@ -174,18 +222,6 @@ class GoogleGenerativeAI_ChatModels implements INode { optional: true, additionalParams: true }, - { - label: 'Thinking Budget', - name: 'thinkingBudget', - type: 'number', - description: 'Guides the number of thinking tokens. -1 for dynamic, 0 to disable, or positive integer (Gemini 2.5 models).', - step: 1, - optional: true, - additionalParams: true, - show: { - modelName: ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.5-flash-lite'] - } - }, { label: 'Base URL', name: 'baseUrl', @@ -193,15 +229,6 @@ class GoogleGenerativeAI_ChatModels implements INode { description: 'Base URL for the API. Leave empty to use the default.', optional: true, additionalParams: true - }, - { - label: 'Allow Image Uploads', - name: 'allowImageUploads', - type: 'boolean', - description: - 'Allow image input. Refer to the docs for more details.', - default: false, - optional: true } ] } @@ -229,6 +256,7 @@ class GoogleGenerativeAI_ChatModels implements INode { const streaming = nodeData.inputs?.streaming as boolean const baseUrl = nodeData.inputs?.baseUrl as string | undefined const thinkingBudget = nodeData.inputs?.thinkingBudget as string + const thinkingLevel = nodeData.inputs?.thinkingLevel as 'LOW' | 'MEDIUM' | 'HIGH' const allowImageUploads = nodeData.inputs?.allowImageUploads as boolean @@ -248,7 +276,17 @@ class GoogleGenerativeAI_ChatModels implements INode { if (cache) obj.cache = cache if (temperature) obj.temperature = parseFloat(temperature) if (baseUrl) obj.baseUrl = baseUrl - if (thinkingBudget) obj.thinkingBudget = parseInt(thinkingBudget, 10) + if (thinkingLevel) { + obj.thinkingConfig = { + thinkingLevel: thinkingLevel, + includeThoughts: true + } + } else if (thinkingBudget) { + obj.thinkingConfig = { + thinkingBudget: parseInt(thinkingBudget, 10), + includeThoughts: true + } + } let safetySettings: SafetySetting[] = [] if (_safetySettings) { diff --git a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/FlowiseChatGoogleGenerativeAI.ts b/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/FlowiseChatGoogleGenerativeAI.ts index f4a9ef89a04..27daf688f7a 100644 --- a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/FlowiseChatGoogleGenerativeAI.ts +++ b/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/FlowiseChatGoogleGenerativeAI.ts @@ -1,842 +1,840 @@ -import { - GenerativeModel, - GoogleGenerativeAI as GenerativeAI, - FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool, - FunctionDeclaration as GenerativeAIFunctionDeclaration, - type FunctionDeclarationSchema as GenerativeAIFunctionDeclarationSchema, - GenerateContentRequest, - SafetySetting, - Part as GenerativeAIPart, - ModelParams, - RequestOptions, - type CachedContent, - Schema -} from '@google/generative-ai' +import { IMultiModalOption, IVisionChatModal } from '../../../src/Interface' +import { ChatGoogleGenerativeAI as LangchainChatGoogleGenerativeAI, GoogleGenerativeAIChatInput } from '@langchain/google-genai' import { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager' -import { AIMessageChunk, BaseMessage, UsageMetadata } from '@langchain/core/messages' -import { ChatGenerationChunk, ChatResult } from '@langchain/core/outputs' -import { getEnvironmentVariable } from '@langchain/core/utils/env' +import { ChatResult, ChatGenerationChunk } from '@langchain/core/outputs' import { - BaseChatModel, - type BaseChatModelCallOptions, - type LangSmithParams, - type BaseChatModelParams -} from '@langchain/core/language_models/chat_models' -import { NewTokenIndices } from '@langchain/core/callbacks/base' -import { BaseLanguageModelInput, StructuredOutputMethodOptions } from '@langchain/core/language_models/base' -import { Runnable, RunnablePassthrough, RunnableSequence } from '@langchain/core/runnables' -import { InferInteropZodOutput, InteropZodType, isInteropZodSchema } from '@langchain/core/utils/types' -import { BaseLLMOutputParser, JsonOutputParser } from '@langchain/core/output_parsers' -import { schemaToGenerativeAIParameters, removeAdditionalProperties } from './utils/zod_to_genai_parameters.js' + EnhancedGenerateContentResponse, + Content, + Part, + POSSIBLE_ROLES, + FunctionCallPart, + TextPart, + FileDataPart, + InlineDataPart, + GenerateContentResponse +} from '@google/generative-ai' import { - convertBaseMessagesToContent, - convertResponseContentToChatGenerationChunk, - mapGenerateContentResultToChatResult -} from './utils/common.js' -import { GoogleGenerativeAIToolsOutputParser } from './utils/output_parsers.js' -import { GoogleGenerativeAIToolType } from './utils/types.js' -import { convertToolsToGenAI } from './utils/tools.js' -import { IMultiModalOption, IVisionChatModal } from '../../../src' - -interface TokenUsage { - completionTokens?: number - promptTokens?: number - totalTokens?: number -} - -export type BaseMessageExamplePair = { - input: BaseMessage - output: BaseMessage + AIMessage, + AIMessageChunk, + BaseMessage, + ChatMessage, + MessageContent, + MessageContentComplex, + UsageMetadata, + StandardContentBlockConverter, + parseBase64DataUrl, + convertToProviderContentBlock, + isDataContentBlock, + ToolMessage +} from '@langchain/core/messages' +import { ChatGeneration } from '@langchain/core/outputs' +import { ToolCallChunk } from '@langchain/core/messages/tool' +import { v4 as uuidv4 } from 'uuid' + +// ============================================================================ +// Constants +// ============================================================================ + +export const _FUNCTION_CALL_THOUGHT_SIGNATURES_MAP_KEY = '__gemini_function_call_thought_signatures__' +const DUMMY_SIGNATURE = + 'ErYCCrMCAdHtim9kOoOkrPiCNVsmlpMIKd7ZMxgiFbVQOkgp7nlLcDMzVsZwIzvuT7nQROivoXA72ccC2lSDvR0Gh7dkWaGuj7ctv6t7ZceHnecx0QYa+ix8tYpRfjhyWozQ49lWiws6+YGjCt10KRTyWsZ2h6O7iHTYJwKIRwGUHRKy/qK/6kFxJm5ML00gLq4D8s5Z6DBpp2ZlR+uF4G8jJgeWQgyHWVdx2wGYElaceVAc66tZdPQRdOHpWtgYSI1YdaXgVI8KHY3/EfNc2YqqMIulvkDBAnuMhkAjV9xmBa54Tq+ih3Im4+r3DzqhGqYdsSkhS0kZMwte4Hjs65dZzCw9lANxIqYi1DJ639WNPYihp/DCJCos7o+/EeSPJaio5sgWDyUnMGkY1atsJZ+m7pj7DD5tvQ==' + +// Extended Part type with thinking support +type GoogleGenerativeAIPart = Part & { + thought?: boolean + thoughtSignature?: string } -export interface GoogleGenerativeAIChatCallOptions extends BaseChatModelCallOptions { - tools?: GoogleGenerativeAIToolType[] - /** - * Allowed functions to call when the mode is "any". - * If empty, any one of the provided functions are called. - */ - allowedFunctionNames?: string[] - /** - * Whether or not to include usage data, like token counts - * in the streamed response chunks. - * @default true - */ - streamUsage?: boolean +// ============================================================================ +// Utility Functions for Message Conversion +// ============================================================================ - /** - * JSON schema to be returned by the model. - */ - responseSchema?: Schema +export function getMessageAuthor(message: BaseMessage) { + if (ChatMessage.isInstance(message)) { + return message.role + } + return message.type } /** - * An interface defining the input to the ChatGoogleGenerativeAI class. + * Maps a message type to a Google Generative AI chat author. + * Returns 'user' as default instead of throwing error + * https://github.com/FlowiseAI/Flowise/issues/4743 */ -export interface GoogleGenerativeAIChatInput extends BaseChatModelParams, Pick { - /** - * Model Name to use - * - * Note: The format must follow the pattern - `{model}` - */ - model: string - - /** - * Controls the randomness of the output. - * - * Values can range from [0.0,2.0], inclusive. A value closer to 2.0 - * will produce responses that are more varied and creative, while - * a value closer to 0.0 will typically result in less surprising - * responses from the model. - * - * Note: The default value varies by model - */ - temperature?: number - - /** - * Maximum number of tokens to generate in the completion. - */ - maxOutputTokens?: number - - /** - * Top-p changes how the model selects tokens for output. - * - * Tokens are selected from most probable to least until the sum - * of their probabilities equals the top-p value. - * - * For example, if tokens A, B, and C have a probability of - * .3, .2, and .1 and the top-p value is .5, then the model will - * select either A or B as the next token (using temperature). - * - * Note: The default value varies by model - */ - topP?: number - - /** - * Top-k changes how the model selects tokens for output. - * - * A top-k of 1 means the selected token is the most probable among - * all tokens in the model's vocabulary (also called greedy decoding), - * while a top-k of 3 means that the next token is selected from - * among the 3 most probable tokens (using temperature). - * - * Note: The default value varies by model - */ - topK?: number - - /** - * The set of character sequences (up to 5) that will stop output generation. - * If specified, the API will stop at the first appearance of a stop - * sequence. - * - * Note: The stop sequence will not be included as part of the response. - * Note: stopSequences is only supported for Gemini models - */ - stopSequences?: string[] - - /** - * A list of unique `SafetySetting` instances for blocking unsafe content. The API will block - * any prompts and responses that fail to meet the thresholds set by these settings. If there - * is no `SafetySetting` for a given `SafetyCategory` provided in the list, the API will use - * the default safety setting for that category. - */ - safetySettings?: SafetySetting[] - - /** - * Google API key to use - */ - apiKey?: string +export function convertAuthorToRole(author: string): (typeof POSSIBLE_ROLES)[number] { + switch (author) { + case 'supervisor': + case 'ai': + case 'model': + return 'model' + case 'system': + return 'system' + case 'human': + return 'user' + case 'tool': + case 'function': + return 'function' + default: + return 'user' + } +} - /** - * Google API version to use - */ - apiVersion?: string +function messageContentMedia(content: MessageContentComplex): Part { + if ('mimeType' in content && 'data' in content) { + return { + inlineData: { + mimeType: content.mimeType as string, + data: content.data as string + } + } + } + if ('mimeType' in content && 'fileUri' in content) { + return { + fileData: { + mimeType: content.mimeType as string, + fileUri: content.fileUri as string + } + } + } + throw new Error('Invalid media content') +} - /** - * Google API base URL to use - */ - baseUrl?: string +function inferToolNameFromPreviousMessages(message: any, previousMessages: BaseMessage[]): string | undefined { + return previousMessages + .map((msg) => { + if (AIMessage.isInstance(msg)) { + return msg.tool_calls ?? [] + } + return [] + }) + .flat() + .find((toolCall) => { + return toolCall.id === message.tool_call_id + })?.name +} - /** Whether to stream the results or not */ - streaming?: boolean +function _getStandardContentBlockConverter(isMultimodalModel: boolean) { + const standardContentBlockConverter: StandardContentBlockConverter<{ + text: TextPart + image: FileDataPart | InlineDataPart + audio: FileDataPart | InlineDataPart + file: FileDataPart | InlineDataPart | TextPart + }> = { + providerName: 'Google Gemini', + + fromStandardTextBlock(block) { + return { + text: block.text + } + }, - /** - * Whether or not to force the model to respond with JSON. - * Available for `gemini-1.5` models and later. - * @default false - */ - json?: boolean + fromStandardImageBlock(block): FileDataPart | InlineDataPart { + if (!isMultimodalModel) { + throw new Error('This model does not support images') + } + if (block.source_type === 'url') { + const data = parseBase64DataUrl({ dataUrl: block.url }) + if (data) { + return { + inlineData: { + mimeType: data.mime_type, + data: data.data + } + } + } else { + return { + fileData: { + mimeType: block.mime_type ?? '', + fileUri: block.url + } + } + } + } + if (block.source_type === 'base64') { + return { + inlineData: { + mimeType: block.mime_type ?? '', + data: block.data + } + } + } + throw new Error(`Unsupported source type: ${block.source_type}`) + }, - /** - * Whether or not model supports system instructions. - * The following models support system instructions: - * - All Gemini 1.5 Pro model versions - * - All Gemini 1.5 Flash model versions - * - Gemini 1.0 Pro version gemini-1.0-pro-002 - */ - convertSystemMessageToHumanContent?: boolean | undefined + fromStandardAudioBlock(block): FileDataPart | InlineDataPart { + if (!isMultimodalModel) { + throw new Error('This model does not support audio') + } + if (block.source_type === 'url') { + const data = parseBase64DataUrl({ dataUrl: block.url }) + if (data) { + return { + inlineData: { + mimeType: data.mime_type, + data: data.data + } + } + } else { + return { + fileData: { + mimeType: block.mime_type ?? '', + fileUri: block.url + } + } + } + } + if (block.source_type === 'base64') { + return { + inlineData: { + mimeType: block.mime_type ?? '', + data: block.data + } + } + } + throw new Error(`Unsupported source type: ${block.source_type}`) + }, - /** Thinking budget for Gemini 2.5 thinking models. Supports -1 (dynamic), 0 (off), or positive integers. */ - thinkingBudget?: number + fromStandardFileBlock(block): FileDataPart | InlineDataPart | TextPart { + if (!isMultimodalModel) { + throw new Error('This model does not support files') + } + if (block.source_type === 'text') { + return { + text: block.text + } + } + if (block.source_type === 'url') { + const data = parseBase64DataUrl({ dataUrl: block.url }) + if (data) { + return { + inlineData: { + mimeType: data.mime_type, + data: data.data + } + } + } else { + return { + fileData: { + mimeType: block.mime_type ?? '', + fileUri: block.url + } + } + } + } + if (block.source_type === 'base64') { + return { + inlineData: { + mimeType: block.mime_type ?? '', + data: block.data + } + } + } + throw new Error(`Unsupported source type: ${block.source_type}`) + } + } + return standardContentBlockConverter } -/** - * Google Generative AI chat model integration. - * - * Setup: - * Install `@langchain/google-genai` and set an environment variable named `GOOGLE_API_KEY`. - * - * ```bash - * npm install @langchain/google-genai - * export GOOGLE_API_KEY="your-api-key" - * ``` - * - * ## [Constructor args](https://api.js.langchain.com/classes/langchain_google_genai.ChatGoogleGenerativeAI.html#constructor) - * - * ## [Runtime args](https://api.js.langchain.com/interfaces/langchain_google_genai.GoogleGenerativeAIChatCallOptions.html) - * - * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc. - * They can also be passed via `.withConfig`, or the second arg in `.bindTools`, like shown in the examples below: - * - * ```typescript - * // When calling `.withConfig`, call options should be passed via the first argument - * const llmWithArgsBound = llm.withConfig({ - * stop: ["\n"], - * }); - * - * // When calling `.bindTools`, call options should be passed via the second argument - * const llmWithTools = llm.bindTools( - * [...], - * { - * stop: ["\n"], - * } - * ); - * ``` - * - * ## Examples - * - *
- * Instantiate - * - * ```typescript - * import { ChatGoogleGenerativeAI } from '@langchain/google-genai'; - * - * const llm = new ChatGoogleGenerativeAI({ - * model: "gemini-1.5-flash", - * temperature: 0, - * maxRetries: 2, - * // apiKey: "...", - * // other params... - * }); - * ``` - *
- * - *
- * - *
- * Invoking - * - * ```typescript - * const input = `Translate "I love programming" into French.`; - * - * // Models also accept a list of chat messages or a formatted prompt - * const result = await llm.invoke(input); - * console.log(result); - * ``` - * - * ```txt - * AIMessage { - * "content": "There are a few ways to translate \"I love programming\" into French, depending on the level of formality and nuance you want to convey:\n\n**Formal:**\n\n* **J'aime la programmation.** (This is the most literal and formal translation.)\n\n**Informal:**\n\n* **J'adore programmer.** (This is a more enthusiastic and informal translation.)\n* **J'aime beaucoup programmer.** (This is a slightly less enthusiastic but still informal translation.)\n\n**More specific:**\n\n* **J'aime beaucoup coder.** (This specifically refers to writing code.)\n* **J'aime beaucoup développer des logiciels.** (This specifically refers to developing software.)\n\nThe best translation will depend on the context and your intended audience. \n", - * "response_metadata": { - * "finishReason": "STOP", - * "index": 0, - * "safetyRatings": [ - * { - * "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", - * "probability": "NEGLIGIBLE" - * }, - * { - * "category": "HARM_CATEGORY_HATE_SPEECH", - * "probability": "NEGLIGIBLE" - * }, - * { - * "category": "HARM_CATEGORY_HARASSMENT", - * "probability": "NEGLIGIBLE" - * }, - * { - * "category": "HARM_CATEGORY_DANGEROUS_CONTENT", - * "probability": "NEGLIGIBLE" - * } - * ] - * }, - * "usage_metadata": { - * "input_tokens": 10, - * "output_tokens": 149, - * "total_tokens": 159 - * } - * } - * ``` - *
- * - *
- * - *
- * Streaming Chunks - * - * ```typescript - * for await (const chunk of await llm.stream(input)) { - * console.log(chunk); - * } - * ``` - * - * ```txt - * AIMessageChunk { - * "content": "There", - * "response_metadata": { - * "index": 0 - * } - * "usage_metadata": { - * "input_tokens": 10, - * "output_tokens": 1, - * "total_tokens": 11 - * } - * } - * AIMessageChunk { - * "content": " are a few ways to translate \"I love programming\" into French, depending on", - * } - * AIMessageChunk { - * "content": " the level of formality and nuance you want to convey:\n\n**Formal:**\n\n", - * } - * AIMessageChunk { - * "content": "* **J'aime la programmation.** (This is the most literal and formal translation.)\n\n**Informal:**\n\n* **J'adore programmer.** (This", - * } - * AIMessageChunk { - * "content": " is a more enthusiastic and informal translation.)\n* **J'aime beaucoup programmer.** (This is a slightly less enthusiastic but still informal translation.)\n\n**More", - * } - * AIMessageChunk { - * "content": " specific:**\n\n* **J'aime beaucoup coder.** (This specifically refers to writing code.)\n* **J'aime beaucoup développer des logiciels.** (This specifically refers to developing software.)\n\nThe best translation will depend on the context and", - * } - * AIMessageChunk { - * "content": " your intended audience. \n", - * } - * ``` - *
- * - *
- * - *
- * Aggregate Streamed Chunks - * - * ```typescript - * import { AIMessageChunk } from '@langchain/core/messages'; - * import { concat } from '@langchain/core/utils/stream'; - * - * const stream = await llm.stream(input); - * let full: AIMessageChunk | undefined; - * for await (const chunk of stream) { - * full = !full ? chunk : concat(full, chunk); - * } - * console.log(full); - * ``` - * - * ```txt - * AIMessageChunk { - * "content": "There are a few ways to translate \"I love programming\" into French, depending on the level of formality and nuance you want to convey:\n\n**Formal:**\n\n* **J'aime la programmation.** (This is the most literal and formal translation.)\n\n**Informal:**\n\n* **J'adore programmer.** (This is a more enthusiastic and informal translation.)\n* **J'aime beaucoup programmer.** (This is a slightly less enthusiastic but still informal translation.)\n\n**More specific:**\n\n* **J'aime beaucoup coder.** (This specifically refers to writing code.)\n* **J'aime beaucoup développer des logiciels.** (This specifically refers to developing software.)\n\nThe best translation will depend on the context and your intended audience. \n", - * "usage_metadata": { - * "input_tokens": 10, - * "output_tokens": 277, - * "total_tokens": 287 - * } - * } - * ``` - *
- * - *
- * - *
- * Bind tools - * - * ```typescript - * import { z } from 'zod'; - * - * const GetWeather = { - * name: "GetWeather", - * description: "Get the current weather in a given location", - * schema: z.object({ - * location: z.string().describe("The city and state, e.g. San Francisco, CA") - * }), - * } - * - * const GetPopulation = { - * name: "GetPopulation", - * description: "Get the current population in a given location", - * schema: z.object({ - * location: z.string().describe("The city and state, e.g. San Francisco, CA") - * }), - * } - * - * const llmWithTools = llm.bindTools([GetWeather, GetPopulation]); - * const aiMsg = await llmWithTools.invoke( - * "Which city is hotter today and which is bigger: LA or NY?" - * ); - * console.log(aiMsg.tool_calls); - * ``` - * - * ```txt - * [ - * { - * name: 'GetWeather', - * args: { location: 'Los Angeles, CA' }, - * type: 'tool_call' - * }, - * { - * name: 'GetWeather', - * args: { location: 'New York, NY' }, - * type: 'tool_call' - * }, - * { - * name: 'GetPopulation', - * args: { location: 'Los Angeles, CA' }, - * type: 'tool_call' - * }, - * { - * name: 'GetPopulation', - * args: { location: 'New York, NY' }, - * type: 'tool_call' - * } - * ] - * ``` - *
- * - *
- * - *
- * Structured Output - * - * ```typescript - * const Joke = z.object({ - * setup: z.string().describe("The setup of the joke"), - * punchline: z.string().describe("The punchline to the joke"), - * rating: z.number().optional().describe("How funny the joke is, from 1 to 10") - * }).describe('Joke to tell user.'); - * - * const structuredLlm = llm.withStructuredOutput(Joke, { name: "Joke" }); - * const jokeResult = await structuredLlm.invoke("Tell me a joke about cats"); - * console.log(jokeResult); - * ``` - * - * ```txt - * { - * setup: "Why don\\'t cats play poker?", - * punchline: "Why don\\'t cats play poker? Because they always have an ace up their sleeve!" - * } - * ``` - *
- * - *
- * - *
- * Multimodal - * - * ```typescript - * import { HumanMessage } from '@langchain/core/messages'; - * - * const imageUrl = "https://example.com/image.jpg"; - * const imageData = await fetch(imageUrl).then(res => res.arrayBuffer()); - * const base64Image = Buffer.from(imageData).toString('base64'); - * - * const message = new HumanMessage({ - * content: [ - * { type: "text", text: "describe the weather in this image" }, - * { - * type: "image_url", - * image_url: { url: `data:image/jpeg;base64,${base64Image}` }, - * }, - * ] - * }); - * - * const imageDescriptionAiMsg = await llm.invoke([message]); - * console.log(imageDescriptionAiMsg.content); - * ``` - * - * ```txt - * The weather in the image appears to be clear and sunny. The sky is mostly blue with a few scattered white clouds, indicating fair weather. The bright sunlight is casting shadows on the green, grassy hill, suggesting it is a pleasant day with good visibility. There are no signs of rain or stormy conditions. - * ``` - *
- * - *
- * - *
- * Usage Metadata - * - * ```typescript - * const aiMsgForMetadata = await llm.invoke(input); - * console.log(aiMsgForMetadata.usage_metadata); - * ``` - * - * ```txt - * { input_tokens: 10, output_tokens: 149, total_tokens: 159 } - * ``` - *
- * - *
- * - *
- * Response Metadata - * - * ```typescript - * const aiMsgForResponseMetadata = await llm.invoke(input); - * console.log(aiMsgForResponseMetadata.response_metadata); - * ``` - * - * ```txt - * { - * finishReason: 'STOP', - * index: 0, - * safetyRatings: [ - * { - * category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT', - * probability: 'NEGLIGIBLE' - * }, - * { - * category: 'HARM_CATEGORY_HATE_SPEECH', - * probability: 'NEGLIGIBLE' - * }, - * { category: 'HARM_CATEGORY_HARASSMENT', probability: 'NEGLIGIBLE' }, - * { - * category: 'HARM_CATEGORY_DANGEROUS_CONTENT', - * probability: 'NEGLIGIBLE' - * } - * ] - * } - * ``` - *
- * - *
- * - *
- * Document Messages - * - * This example will show you how to pass documents such as PDFs to Google - * Generative AI through messages. - * - * ```typescript - * const pdfPath = "/Users/my_user/Downloads/invoice.pdf"; - * const pdfBase64 = await fs.readFile(pdfPath, "base64"); - * - * const response = await llm.invoke([ - * ["system", "Use the provided documents to answer the question"], - * [ - * "user", - * [ - * { - * type: "application/pdf", // If the `type` field includes a single slash (`/`), it will be treated as inline data. - * data: pdfBase64, - * }, - * { - * type: "text", - * text: "Summarize the contents of this PDF", - * }, - * ], - * ], - * ]); - * - * console.log(response.content); - * ``` - * - * ```txt - * This is a billing invoice from Twitter Developers for X API Basic Access. The transaction date is January 7, 2025, - * and the amount is $194.34, which has been paid. The subscription period is from January 7, 2025 21:02 to February 7, 2025 00:00 (UTC). - * The tax is $0.00, with a tax rate of 0%. The total amount is $194.34. The payment was made using a Visa card ending in 7022, - * expiring in 12/2026. The billing address is Brace Sproul, 1234 Main Street, San Francisco, CA, US 94103. The company being billed is - * X Corp, located at 865 FM 1209 Building 2, Bastrop, TX, US 78602. Terms and conditions apply. - * ``` - *
- * - *
- */ -export class LangchainChatGoogleGenerativeAI - extends BaseChatModel - implements GoogleGenerativeAIChatInput -{ - static lc_name() { - return 'ChatGoogleGenerativeAI' +function _convertLangChainContentToPart(content: MessageContentComplex, isMultimodalModel: boolean): Part | undefined { + if (isDataContentBlock(content)) { + return convertToProviderContentBlock(content, _getStandardContentBlockConverter(isMultimodalModel)) } - lc_serializable = true - - get lc_secrets(): { [key: string]: string } | undefined { + if (content.type === 'text') { + return { text: content.text } + } else if (content.type === 'executableCode') { + return { executableCode: (content as any).executableCode } + } else if (content.type === 'codeExecutionResult') { + return { codeExecutionResult: (content as any).codeExecutionResult } + } else if (content.type === 'image_url') { + if (!isMultimodalModel) { + throw new Error(`This model does not support images`) + } + let source + if (typeof content.image_url === 'string') { + source = content.image_url + } else if (typeof content.image_url === 'object' && 'url' in content.image_url) { + source = content.image_url.url + } else { + throw new Error('Please provide image as base64 encoded data URL') + } + const [dm, data] = source.split(',') + if (!dm.startsWith('data:')) { + throw new Error('Please provide image as base64 encoded data URL') + } + const [mimeType, encoding] = dm.replace(/^data:/, '').split(';') + if (encoding !== 'base64') { + throw new Error('Please provide image as base64 encoded data URL') + } return { - apiKey: 'GOOGLE_API_KEY' + inlineData: { + data, + mimeType + } } - } - - lc_namespace = ['langchain', 'chat_models', 'google_genai'] - - get lc_aliases() { + } else if (content.type === 'media') { + return messageContentMedia(content) + } else if (content.type === 'tool_use') { return { - apiKey: 'google_api_key' + functionCall: { + name: (content as any).name, + args: (content as any).input + } + } + } else if (content.type === 'tool_call') { + return { + functionCall: { + name: (content as any).name, + args: (content as any).args + } + } + } else if ( + content.type?.includes('/') && + content.type.split('/').length === 2 && + 'data' in content && + typeof content.data === 'string' + ) { + return { + inlineData: { + mimeType: content.type, + data: content.data + } + } + } else if ('functionCall' in content) { + return undefined + } else { + if ('type' in content) { + throw new Error(`Unknown content type ${content.type}`) + } else { + throw new Error(`Unknown content ${JSON.stringify(content)}`) } } +} - model: string +export function convertMessageContentToParts( + message: BaseMessage, + isMultimodalModel: boolean, + previousMessages: BaseMessage[], + model?: string +): Part[] { + if (ToolMessage.isInstance(message)) { + const messageName = message.name ?? inferToolNameFromPreviousMessages(message, previousMessages) + if (messageName === undefined) { + throw new Error( + `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.` + ) + } - temperature?: number // default value chosen based on model + const result = Array.isArray(message.content) + ? (message.content + .map((c) => _convertLangChainContentToPart(c as MessageContentComplex, isMultimodalModel)) + .filter((p) => p !== undefined) as Part[]) + : message.content + + if (message.status === 'error') { + return [ + { + functionResponse: { + name: messageName, + response: { error: { details: result } } + } + } + ] + } - maxOutputTokens?: number + return [ + { + functionResponse: { + name: messageName, + response: { result } + } + } + ] + } - topP?: number // default value chosen based on model + let functionCalls: FunctionCallPart[] = [] + const messageParts: Part[] = [] - topK?: number // default value chosen based on model + if (typeof message.content === 'string' && message.content) { + messageParts.push({ text: message.content }) + } - stopSequences: string[] = [] + if (Array.isArray(message.content)) { + messageParts.push( + ...(message.content + .map((c) => _convertLangChainContentToPart(c as MessageContentComplex, isMultimodalModel)) + .filter((p) => p !== undefined) as Part[]) + ) + } - safetySettings?: SafetySetting[] + const functionThoughtSignatures = message.additional_kwargs?.[_FUNCTION_CALL_THOUGHT_SIGNATURES_MAP_KEY] as + | Record + | undefined + + if (AIMessage.isInstance(message) && message.tool_calls?.length) { + functionCalls = message.tool_calls.map((tc) => { + const thoughtSignature = (() => { + if (tc.id) { + const signature = functionThoughtSignatures?.[tc.id] + if (signature) { + return signature + } + } + if (model?.includes('gemini-3')) { + return DUMMY_SIGNATURE + } + return '' + })() + return { + functionCall: { + name: tc.name, + args: tc.args + }, + ...(thoughtSignature ? { thoughtSignature } : {}) + } as FunctionCallPart + }) + } - apiKey?: string + return [...messageParts, ...functionCalls] +} - streaming = false +export function convertBaseMessagesToContent( + messages: BaseMessage[], + isMultimodalModel: boolean, + convertSystemMessageToHumanContent: boolean = false, + model?: string +) { + return messages.reduce<{ + content: Content[] + mergeWithPreviousContent: boolean + }>( + (acc, message, index) => { + if (!BaseMessage.isInstance(message)) { + throw new Error('Unsupported message input') + } + const author = getMessageAuthor(message) + if (author === 'system' && index !== 0) { + throw new Error('System message should be the first one') + } + const role = convertAuthorToRole(author) - json?: boolean + const prevContent = acc.content[acc.content.length] + if (!acc.mergeWithPreviousContent && prevContent && prevContent.role === role) { + throw new Error('Google Generative AI requires alternate messages between authors') + } - streamUsage = true + const parts = convertMessageContentToParts(message, isMultimodalModel, messages.slice(0, index), model) - convertSystemMessageToHumanContent: boolean | undefined + if (acc.mergeWithPreviousContent) { + const prevContent = acc.content[acc.content.length - 1] + if (!prevContent) { + throw new Error('There was a problem parsing your system message. Please try a prompt without one.') + } + prevContent.parts.push(...parts) - thinkingBudget?: number + return { + mergeWithPreviousContent: false, + content: acc.content + } + } + let actualRole = role + if (actualRole === 'function' || (actualRole === 'system' && !convertSystemMessageToHumanContent)) { + actualRole = 'user' + } + const content: Content = { + role: actualRole, + parts + } + return { + mergeWithPreviousContent: author === 'system' && !convertSystemMessageToHumanContent, + content: [...acc.content, content] + } + }, + { content: [], mergeWithPreviousContent: false } + ).content +} - private client: GenerativeModel +// ============================================================================ +// Usage Metadata Conversion +// ============================================================================ - get _isMultimodalModel() { - return ( - this.model.includes('vision') || - this.model.startsWith('gemini-1.5') || - this.model.startsWith('gemini-2') || - this.model.startsWith('gemini-3') - ) +export function convertUsageMetadata(usageMetadata: GenerateContentResponse['usageMetadata']): UsageMetadata { + const output: UsageMetadata = { + input_tokens: usageMetadata?.promptTokenCount ?? 0, + output_tokens: usageMetadata?.candidatesTokenCount ?? 0, + total_tokens: usageMetadata?.totalTokenCount ?? 0 } + if (usageMetadata?.cachedContentTokenCount) { + output.input_token_details ??= {} + output.input_token_details.cache_read = usageMetadata.cachedContentTokenCount + } + return output +} - constructor(fields: GoogleGenerativeAIChatInput) { - super(fields) - - this.model = fields.model.replace(/^models\//, '') - - this.maxOutputTokens = fields.maxOutputTokens ?? this.maxOutputTokens - - if (this.maxOutputTokens && this.maxOutputTokens < 0) { - throw new Error('`maxOutputTokens` must be a positive integer') - } +// ============================================================================ +// Response Mapping Functions (with inlineData extraction) +// ============================================================================ - this.temperature = fields.temperature ?? this.temperature - if (this.temperature && (this.temperature < 0 || this.temperature > 2)) { - throw new Error('`temperature` must be in the range of [0.0,2.0]') +export function mapGenerateContentResultToChatResult( + response: EnhancedGenerateContentResponse, + extra?: { + usageMetadata: UsageMetadata | undefined + } +): ChatResult { + // if rejected or error, return empty generations with reason in filters + if (!response.candidates || response.candidates.length === 0 || !response.candidates[0]) { + return { + generations: [], + llmOutput: { + filters: response.promptFeedback + } } + } - this.topP = fields.topP ?? this.topP - if (this.topP && this.topP < 0) { - throw new Error('`topP` must be a positive integer') - } + const [candidate] = response.candidates + const { content: candidateContent, ...generationInfo } = candidate - if (this.topP && this.topP > 1) { - throw new Error('`topP` must be below 1.') + // Extract function calls with IDs + const functionCalls = candidateContent.parts?.reduce((acc, p) => { + if ('functionCall' in p && p.functionCall) { + acc.push({ + ...p, + id: 'id' in p.functionCall && typeof (p.functionCall as any).id === 'string' ? (p.functionCall as any).id : uuidv4() + }) } + return acc + }, [] as (FunctionCallPart & { id: string })[]) + + let content: MessageContent | undefined + const inlineDataItems: any[] = [] + + const parts = candidateContent?.parts as GoogleGenerativeAIPart[] | undefined + + if (Array.isArray(parts) && parts.length === 1 && 'text' in parts[0] && parts[0].text && !parts[0].thought) { + content = parts[0].text + } else if (Array.isArray(parts) && parts.length > 0) { + content = parts.map((p) => { + if (p.thought && 'text' in p && p.text) { + return { + type: 'thinking' as const, + thinking: p.text, + ...(p.thoughtSignature ? { signature: p.thoughtSignature } : {}) + } + } else if ('text' in p) { + return { + type: 'text' as const, + text: p.text + } + } else if ('inlineData' in p && p.inlineData) { + // Extract inline data (e.g., generated images) for processing + inlineDataItems.push({ + type: 'gemini_inline_data', + mimeType: p.inlineData.mimeType, + data: p.inlineData.data + }) + return { + type: 'inlineData' as const, + inlineData: p.inlineData + } + } else if ('functionCall' in p) { + return { + type: 'functionCall' as const, + functionCall: p.functionCall + } + } else if ('functionResponse' in p) { + return { + type: 'functionResponse' as const, + functionResponse: p.functionResponse + } + } else if ('fileData' in p) { + return { + type: 'fileData' as const, + fileData: p.fileData + } + } else if ('executableCode' in p) { + return { + type: 'executableCode' as const, + executableCode: p.executableCode + } + } else if ('codeExecutionResult' in p) { + return { + type: 'codeExecutionResult' as const, + codeExecutionResult: p.codeExecutionResult + } + } + return p as any + }) + } else { + content = [] + } - this.topK = fields.topK ?? this.topK - if (this.topK && this.topK < 0) { - throw new Error('`topK` must be a positive integer') + // Extract thought signatures from function calls + const functionThoughtSignatures = functionCalls?.reduce((acc, fc) => { + if ('thoughtSignature' in fc && typeof (fc as any).thoughtSignature === 'string') { + acc[fc.id] = (fc as any).thoughtSignature } + return acc + }, {} as Record) + + let text = '' + if (typeof content === 'string') { + text = content + } else if (Array.isArray(content) && content.length > 0) { + const block = content.find((b) => 'text' in b) as { text: string } | undefined + text = block?.text ?? text + } - this.stopSequences = fields.stopSequences ?? this.stopSequences + // Build response_metadata with inline data if present + const response_metadata: Record = {} + if (inlineDataItems.length > 0) { + response_metadata.inlineData = inlineDataItems + } - this.apiKey = fields.apiKey ?? getEnvironmentVariable('GOOGLE_API_KEY') - if (!this.apiKey) { - throw new Error( - 'Please set an API key for Google GenerativeAI ' + - 'in the environment variable GOOGLE_API_KEY ' + - 'or in the `apiKey` field of the ' + - 'ChatGoogleGenerativeAI constructor' - ) - } + const generation: ChatGeneration = { + text, + message: new AIMessage({ + content: content ?? '', + tool_calls: functionCalls?.map((fc) => ({ + type: 'tool_call' as const, + id: fc.id, + name: fc.functionCall.name, + args: fc.functionCall.args as Record + })), + additional_kwargs: { + ...generationInfo, + [_FUNCTION_CALL_THOUGHT_SIGNATURES_MAP_KEY]: functionThoughtSignatures + }, + usage_metadata: extra?.usageMetadata, + response_metadata: Object.keys(response_metadata).length > 0 ? response_metadata : undefined + }), + generationInfo + } - this.safetySettings = fields.safetySettings ?? this.safetySettings - if (this.safetySettings && this.safetySettings.length > 0) { - const safetySettingsSet = new Set(this.safetySettings.map((s) => s.category)) - if (safetySettingsSet.size !== this.safetySettings.length) { - throw new Error('The categories in `safetySettings` array must be unique') + return { + generations: [generation], + llmOutput: { + tokenUsage: { + promptTokens: extra?.usageMetadata?.input_tokens, + completionTokens: extra?.usageMetadata?.output_tokens, + totalTokens: extra?.usageMetadata?.total_tokens } } + } +} - this.streaming = fields.streaming ?? this.streaming - this.json = fields.json - this.thinkingBudget = fields.thinkingBudget +export function convertResponseContentToChatGenerationChunk( + response: EnhancedGenerateContentResponse, + extra: { + usageMetadata?: UsageMetadata | undefined + index: number + } +): ChatGenerationChunk | null { + if (!response.candidates || response.candidates.length === 0) { + return null + } - this.client = new GenerativeAI(this.apiKey).getGenerativeModel( - { - model: this.model, - safetySettings: this.safetySettings as SafetySetting[], - generationConfig: { - stopSequences: this.stopSequences, - maxOutputTokens: this.maxOutputTokens, - temperature: this.temperature, - topP: this.topP, - topK: this.topK, - ...(this.json ? { responseMimeType: 'application/json' } : {}) + const [candidate] = response.candidates + const { content: candidateContent, ...generationInfo } = candidate + + // Extract function calls with IDs + const functionCalls = candidateContent.parts?.reduce((acc, p) => { + if ('functionCall' in p && p.functionCall) { + acc.push({ + ...p, + id: 'id' in p.functionCall && typeof (p.functionCall as any).id === 'string' ? (p.functionCall as any).id : uuidv4() + }) + } + return acc + }, [] as (FunctionCallPart & { id: string })[]) + + let content: MessageContent | undefined + const inlineDataItems: any[] = [] + const streamParts = candidateContent?.parts as GoogleGenerativeAIPart[] | undefined + + // Checks if all parts are plain text (no thought flags). If so, join as string. + if (Array.isArray(streamParts) && streamParts.every((p) => 'text' in p && !p.thought)) { + content = streamParts.map((p) => (p as TextPart).text).join('') + } else if (Array.isArray(streamParts)) { + content = streamParts.map((p) => { + if (p.thought && 'text' in p && p.text) { + return { + type: 'thinking' as const, + thinking: p.text, + ...(p.thoughtSignature ? { signature: p.thoughtSignature } : {}) + } + } else if ('text' in p) { + return { + type: 'text' as const, + text: p.text + } + } else if ('inlineData' in p && p.inlineData) { + // Extract inline data for streaming responses + inlineDataItems.push({ + type: 'gemini_inline_data', + mimeType: p.inlineData.mimeType, + data: p.inlineData.data + }) + return { + type: 'inlineData' as const, + inlineData: p.inlineData + } + } else if ('functionCall' in p) { + return { + type: 'functionCall' as const, + functionCall: p.functionCall + } + } else if ('functionResponse' in p) { + return { + type: 'functionResponse' as const, + functionResponse: p.functionResponse + } + } else if ('fileData' in p) { + return { + type: 'fileData' as const, + fileData: p.fileData + } + } else if ('executableCode' in p) { + return { + type: 'executableCode' as const, + executableCode: p.executableCode + } + } else if ('codeExecutionResult' in p) { + return { + type: 'codeExecutionResult' as const, + codeExecutionResult: p.codeExecutionResult } - }, - { - apiVersion: fields.apiVersion, - baseUrl: fields.baseUrl - } - ) - if (this.thinkingBudget !== undefined) { - ;(this.client.generationConfig as any).thinkingConfig = { - ...(this.thinkingBudget !== undefined ? { thinkingBudget: this.thinkingBudget } : {}) } - } - this.streamUsage = fields.streamUsage ?? this.streamUsage + return p as any + }) + } else { + content = [] } - useCachedContent(cachedContent: CachedContent, modelParams?: ModelParams, requestOptions?: RequestOptions): void { - if (!this.apiKey) return - this.client = new GenerativeAI(this.apiKey).getGenerativeModelFromCachedContent(cachedContent, modelParams, requestOptions) - if (this.thinkingBudget !== undefined) { - ;(this.client.generationConfig as any).thinkingConfig = { - ...(this.thinkingBudget !== undefined ? { thinkingBudget: this.thinkingBudget } : {}) - } - } + let text = '' + if (content && typeof content === 'string') { + text = content + } else if (Array.isArray(content)) { + const block = content.find((b) => 'text' in b) as { text: string } | undefined + text = block?.text ?? '' } - get useSystemInstruction(): boolean { - return typeof this.convertSystemMessageToHumanContent === 'boolean' - ? !this.convertSystemMessageToHumanContent - : this.computeUseSystemInstruction + const toolCallChunks: ToolCallChunk[] = [] + if (functionCalls) { + toolCallChunks.push( + ...functionCalls.map((fc) => ({ + type: 'tool_call_chunk' as const, + id: fc.id, + name: fc.functionCall.name, + args: JSON.stringify(fc.functionCall.args) + })) + ) } - get computeUseSystemInstruction(): boolean { - // This works on models from April 2024 and later - // Vertex AI: gemini-1.5-pro and gemini-1.0-002 and later - // AI Studio: gemini-1.5-pro-latest - if (this.model === 'gemini-1.0-pro-001') { - return false - } else if (this.model.startsWith('gemini-pro-vision')) { - return false - } else if (this.model.startsWith('gemini-1.0-pro-vision')) { - return false - } else if (this.model === 'gemini-pro') { - // on AI Studio gemini-pro is still pointing at gemini-1.0-pro-001 - return false + // Extract thought signatures from function calls + const functionThoughtSignatures = functionCalls?.reduce((acc, fc) => { + if ('thoughtSignature' in fc && typeof (fc as any).thoughtSignature === 'string') { + acc[fc.id] = (fc as any).thoughtSignature } - return true - } + return acc + }, {} as Record) - getLsParams(options: this['ParsedCallOptions']): LangSmithParams { - return { - ls_provider: 'google_genai', - ls_model_name: this.model, - ls_model_type: 'chat', - ls_temperature: this.client.generationConfig.temperature, - ls_max_tokens: this.client.generationConfig.maxOutputTokens, - ls_stop: options.stop - } + // Build response_metadata with inline data if present + const response_metadata: Record = { + model_provider: 'google-genai' } - - _combineLLMOutput() { - return [] + if (inlineDataItems.length > 0) { + response_metadata.inlineData = inlineDataItems } - _llmType() { - return 'googlegenerativeai' - } + return new ChatGenerationChunk({ + text, + message: new AIMessageChunk({ + content: content || '', + name: !candidateContent ? undefined : candidateContent.role, + tool_call_chunks: toolCallChunks, + additional_kwargs: { + [_FUNCTION_CALL_THOUGHT_SIGNATURES_MAP_KEY]: functionThoughtSignatures + }, + response_metadata, + usage_metadata: extra.usageMetadata + }), + generationInfo + }) +} - override bindTools( - tools: GoogleGenerativeAIToolType[], - kwargs?: Partial - ): Runnable { - return this.withConfig({ - tools: convertToolsToGenAI(tools)?.tools, - ...kwargs - }) - } +// ============================================================================ +// Extended ChatGoogleGenerativeAI Class +// ============================================================================ - invocationParams(options?: this['ParsedCallOptions']): Omit { - const toolsAndConfig = options?.tools?.length - ? convertToolsToGenAI(options.tools, { - toolChoice: options.tool_choice, - allowedFunctionNames: options.allowedFunctionNames - }) - : undefined - - if (options?.responseSchema) { - this.client.generationConfig.responseSchema = options.responseSchema - this.client.generationConfig.responseMimeType = 'application/json' - } else { - this.client.generationConfig.responseSchema = undefined - this.client.generationConfig.responseMimeType = this.json ? 'application/json' : undefined - } +export class ChatGoogleGenerativeAI extends LangchainChatGoogleGenerativeAI implements IVisionChatModal { + configuredModel: string + configuredMaxToken?: number + multiModalOption: IMultiModalOption + id: string - return { - ...(toolsAndConfig?.tools ? { tools: toolsAndConfig.tools } : {}), - ...(toolsAndConfig?.toolConfig ? { toolConfig: toolsAndConfig.toolConfig } : {}) - } + constructor(id: string, fields: GoogleGenerativeAIChatInput) { + super(fields) + this.id = id + this.configuredModel = fields?.model ?? '' + this.configuredMaxToken = fields?.maxOutputTokens } + /** + * Override _generate to use custom response mapper that extracts inlineData + */ async _generate( messages: BaseMessage[], options: this['ParsedCallOptions'], runManager?: CallbackManagerForLLMRun ): Promise { - const prompt = convertBaseMessagesToContent(messages, this._isMultimodalModel, this.useSystemInstruction) + options.signal?.throwIfAborted() + + const prompt = convertBaseMessagesToContent( + messages, + (this as any)._isMultimodalModel, + (this as any).useSystemInstruction, + this.model + ) + + // Handle system instruction let actualPrompt = prompt - if (prompt[0].role === 'system') { + if (prompt[0]?.role === 'system') { const [systemInstruction] = prompt - this.client.systemInstruction = systemInstruction + ;(this as any).client.systemInstruction = systemInstruction actualPrompt = prompt.slice(1) } - // Ensure actualPrompt is never empty - if (actualPrompt.length === 0) { - actualPrompt = [{ role: 'user', parts: [{ text: '...' }] }] - } - + // Get tools and other params const parameters = this.invocationParams(options) - // Handle streaming + // Check if streaming is enabled if (this.streaming) { - const tokenUsage: TokenUsage = {} + const tokenUsage: { completionTokens?: number; promptTokens?: number; totalTokens?: number } = {} const stream = this._streamResponseChunks(messages, options, runManager) - const finalChunks: Record = {} + const finalChunks: ChatGenerationChunk[] = [] for await (const chunk of stream) { - const index = (chunk.generationInfo as NewTokenIndices)?.completion ?? 0 + const index = (chunk.generationInfo as any)?.completion ?? 0 if (finalChunks[index] === undefined) { finalChunks[index] = chunk } else { finalChunks[index] = finalChunks[index].concat(chunk) } } - const generations = Object.entries(finalChunks) - .sort(([aKey], [bKey]) => parseInt(aKey, 10) - parseInt(bKey, 10)) - .map(([_, value]) => value) + const generations = finalChunks.filter((c): c is ChatGenerationChunk => c !== undefined) return { generations, llmOutput: { estimatedTokenUsage: tokenUsage } } } - const res = await this.completionWithRetry({ + // Non-streaming: make the API call directly + const res = await (this as any).completionWithRetry({ ...parameters, contents: actualPrompt }) let usageMetadata: UsageMetadata | undefined if ('usageMetadata' in res.response) { - const genAIUsageMetadata = res.response.usageMetadata as { - promptTokenCount: number | undefined - candidatesTokenCount: number | undefined - totalTokenCount: number | undefined - } - usageMetadata = { - input_tokens: genAIUsageMetadata.promptTokenCount ?? 0, - output_tokens: genAIUsageMetadata.candidatesTokenCount ?? 0, - total_tokens: genAIUsageMetadata.totalTokenCount ?? 0 - } + usageMetadata = convertUsageMetadata(res.response.usageMetadata) } const generationResult = mapGenerateContentResultToChatResult(res.response, { @@ -849,59 +847,73 @@ export class LangchainChatGoogleGenerativeAI return generationResult } + /** + * Override streaming method to use custom chunk converter that extracts inlineData + */ async *_streamResponseChunks( messages: BaseMessage[], options: this['ParsedCallOptions'], runManager?: CallbackManagerForLLMRun ): AsyncGenerator { - const prompt = convertBaseMessagesToContent(messages, this._isMultimodalModel, this.useSystemInstruction) + const prompt = convertBaseMessagesToContent( + messages, + (this as any)._isMultimodalModel, + (this as any).useSystemInstruction, + this.model + ) + let actualPrompt = prompt - if (prompt[0].role === 'system') { + if (prompt[0]?.role === 'system') { const [systemInstruction] = prompt - this.client.systemInstruction = systemInstruction + ;(this as any).client.systemInstruction = systemInstruction actualPrompt = prompt.slice(1) } - // Ensure actualPrompt is never empty - if (actualPrompt.length === 0) { - actualPrompt = [{ role: 'user', parts: [{ text: '...' }] }] - } - const parameters = this.invocationParams(options) const request = { ...parameters, contents: actualPrompt } - const stream = await this.caller.callWithOptions({ signal: options?.signal }, async () => { - const { stream } = await this.client.generateContentStream(request) + + const stream = await (this as any).caller.callWithOptions({ signal: options?.signal }, async () => { + const { stream } = await (this as any).client.generateContentStream(request, { + signal: options?.signal + }) return stream }) let usageMetadata: UsageMetadata | undefined + // Keep prior cumulative counts for calculating token deltas while streaming + let prevPromptTokenCount = 0 + let prevCandidatesTokenCount = 0 + let prevTotalTokenCount = 0 let index = 0 + for await (const response of stream) { - if ('usageMetadata' in response && this.streamUsage !== false && options.streamUsage !== false) { - const genAIUsageMetadata = response.usageMetadata as { - promptTokenCount: number | undefined - candidatesTokenCount: number | undefined - totalTokenCount: number | undefined - } - if (!usageMetadata) { - usageMetadata = { - input_tokens: genAIUsageMetadata.promptTokenCount ?? 0, - output_tokens: genAIUsageMetadata.candidatesTokenCount ?? 0, - total_tokens: genAIUsageMetadata.totalTokenCount ?? 0 - } - } else { - // Under the hood, LangChain combines the prompt tokens. Google returns the updated - // total each time, so we need to find the difference between the tokens. - const outputTokenDiff = (genAIUsageMetadata.candidatesTokenCount ?? 0) - usageMetadata.output_tokens - usageMetadata = { - input_tokens: 0, - output_tokens: outputTokenDiff, - total_tokens: outputTokenDiff - } - } + if (options.signal?.aborted) { + return + } + if ( + 'usageMetadata' in response && + response.usageMetadata !== undefined && + (this as any).streamUsage !== false && + options.streamUsage !== false + ) { + usageMetadata = convertUsageMetadata(response.usageMetadata) + + // Under the hood, LangChain combines the prompt tokens. Google returns the updated + // total each time, so we need to find the difference between the tokens. + const newPromptTokenCount = response.usageMetadata.promptTokenCount ?? 0 + usageMetadata.input_tokens = Math.max(0, newPromptTokenCount - prevPromptTokenCount) + prevPromptTokenCount = newPromptTokenCount + + const newCandidatesTokenCount = response.usageMetadata.candidatesTokenCount ?? 0 + usageMetadata.output_tokens = Math.max(0, newCandidatesTokenCount - prevCandidatesTokenCount) + prevCandidatesTokenCount = newCandidatesTokenCount + + const newTotalTokenCount = response.usageMetadata.totalTokenCount ?? 0 + usageMetadata.total_tokens = Math.max(0, newTotalTokenCount - prevTotalTokenCount) + prevTotalTokenCount = newTotalTokenCount } const chunk = convertResponseContentToChatGenerationChunk(response, { @@ -918,146 +930,6 @@ export class LangchainChatGoogleGenerativeAI } } - async completionWithRetry( - request: string | GenerateContentRequest | (string | GenerativeAIPart)[], - options?: this['ParsedCallOptions'] - ) { - return this.caller.callWithOptions({ signal: options?.signal }, async () => { - try { - return await this.client.generateContent(request) - } catch (e: any) { - // TODO: Improve error handling - if (e.message?.includes('400 Bad Request')) { - e.status = 400 - } - throw e - } - }) - } - - // eslint-disable-next-line - withStructuredOutput = Record>( - outputSchema: InteropZodType | Record, - config?: StructuredOutputMethodOptions - ): Runnable - - // eslint-disable-next-line - withStructuredOutput = Record>( - outputSchema: InteropZodType | Record, - config?: StructuredOutputMethodOptions - ): Runnable - - // eslint-disable-next-line - withStructuredOutput = Record>( - outputSchema: InteropZodType | Record, - config?: StructuredOutputMethodOptions - ): Runnable | Runnable { - const schema: InteropZodType | Record = outputSchema - const name = config?.name - const method = config?.method - const includeRaw = config?.includeRaw - if (method === 'jsonMode') { - throw new Error(`ChatGoogleGenerativeAI only supports "jsonSchema" or "functionCalling" as a method.`) - } - - let llm - let outputParser: BaseLLMOutputParser - if (method === 'functionCalling') { - let functionName = name ?? 'extract' - let tools: GoogleGenerativeAIFunctionDeclarationsTool[] - if (isInteropZodSchema(schema)) { - const jsonSchema = schemaToGenerativeAIParameters(schema) - tools = [ - { - functionDeclarations: [ - { - name: functionName, - description: jsonSchema.description ?? 'A function available to call.', - parameters: jsonSchema as GenerativeAIFunctionDeclarationSchema - } - ] - } - ] - outputParser = new GoogleGenerativeAIToolsOutputParser>({ - returnSingle: true, - keyName: functionName, - zodSchema: schema - }) - } else { - let geminiFunctionDefinition: GenerativeAIFunctionDeclaration - if (typeof schema.name === 'string' && typeof schema.parameters === 'object' && schema.parameters != null) { - geminiFunctionDefinition = schema as GenerativeAIFunctionDeclaration - geminiFunctionDefinition.parameters = removeAdditionalProperties( - schema.parameters - ) as GenerativeAIFunctionDeclarationSchema - functionName = schema.name - } else { - geminiFunctionDefinition = { - name: functionName, - description: schema.description ?? '', - parameters: removeAdditionalProperties(schema) as GenerativeAIFunctionDeclarationSchema - } - } - tools = [ - { - functionDeclarations: [geminiFunctionDefinition] - } - ] - outputParser = new GoogleGenerativeAIToolsOutputParser({ - returnSingle: true, - keyName: functionName - }) - } - llm = this.bindTools(tools).withConfig({ - allowedFunctionNames: [functionName] - }) - } else { - const jsonSchema = schemaToGenerativeAIParameters(schema) - llm = this.withConfig({ - responseSchema: jsonSchema as Schema - }) - outputParser = new JsonOutputParser() - } - - if (!includeRaw) { - return llm.pipe(outputParser).withConfig({ - runName: 'ChatGoogleGenerativeAIStructuredOutput' - }) as Runnable - } - - const parserAssign = RunnablePassthrough.assign({ - parsed: (input: any, config) => outputParser.invoke(input.raw, config) - }) - const parserNone = RunnablePassthrough.assign({ - parsed: () => null - }) - const parsedWithFallback = parserAssign.withFallbacks({ - fallbacks: [parserNone] - }) - return RunnableSequence.from([ - { - raw: llm - }, - parsedWithFallback - ]).withConfig({ - runName: 'StructuredOutputRunnable' - }) - } -} - -export class ChatGoogleGenerativeAI extends LangchainChatGoogleGenerativeAI implements IVisionChatModal { - configuredModel: string - configuredMaxToken?: number - multiModalOption: IMultiModalOption - id: string - - constructor(id: string, fields: GoogleGenerativeAIChatInput) { - super(fields) - this.id = id - this.configuredModel = fields?.model ?? '' - this.configuredMaxToken = fields?.maxOutputTokens - } - revertToOriginalModel(): void { this.model = this.configuredModel this.maxOutputTokens = this.configuredMaxToken diff --git a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/common.ts b/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/common.ts deleted file mode 100644 index 6e0d32d2248..00000000000 --- a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/common.ts +++ /dev/null @@ -1,673 +0,0 @@ -import { - EnhancedGenerateContentResponse, - Content, - Part, - type FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool, - type FunctionDeclaration as GenerativeAIFunctionDeclaration, - POSSIBLE_ROLES, - FunctionCallPart, - TextPart, - FileDataPart, - InlineDataPart -} from '@google/generative-ai' -import { - AIMessage, - AIMessageChunk, - BaseMessage, - ChatMessage, - ToolMessage, - ToolMessageChunk, - MessageContent, - MessageContentComplex, - UsageMetadata, - isAIMessage, - isBaseMessage, - isToolMessage, - StandardContentBlockConverter, - parseBase64DataUrl, - convertToProviderContentBlock, - isDataContentBlock -} from '@langchain/core/messages' -import { ChatGeneration, ChatGenerationChunk, ChatResult } from '@langchain/core/outputs' -import { isLangChainTool } from '@langchain/core/utils/function_calling' -import { isOpenAITool } from '@langchain/core/language_models/base' -import { ToolCallChunk } from '@langchain/core/messages/tool' -import { v4 as uuidv4 } from 'uuid' -import { jsonSchemaToGeminiParameters, schemaToGenerativeAIParameters } from './zod_to_genai_parameters.js' -import { GoogleGenerativeAIToolType } from './types.js' - -export function getMessageAuthor(message: BaseMessage) { - const type = message._getType() - if (ChatMessage.isInstance(message)) { - return message.role - } - if (type === 'tool') { - return type - } - return message.name ?? type -} - -/** - * !!! IMPORTANT: Must return 'user' as default instead of throwing error - * https://github.com/FlowiseAI/Flowise/issues/4743 - * Maps a message type to a Google Generative AI chat author. - * @param message The message to map. - * @param model The model to use for mapping. - * @returns The message type mapped to a Google Generative AI chat author. - */ -export function convertAuthorToRole(author: string): (typeof POSSIBLE_ROLES)[number] { - switch (author) { - /** - * Note: Gemini currently is not supporting system messages - * we will convert them to human messages and merge with following - * */ - case 'supervisor': - case 'ai': - case 'model': // getMessageAuthor returns message.name. code ex.: return message.name ?? type; - return 'model' - case 'system': - return 'system' - case 'human': - return 'user' - case 'tool': - case 'function': - return 'function' - default: - return 'user' // return user as default instead of throwing error - } -} - -function messageContentMedia(content: MessageContentComplex): Part { - if ('mimeType' in content && 'data' in content) { - return { - inlineData: { - mimeType: content.mimeType, - data: content.data - } - } - } - if ('mimeType' in content && 'fileUri' in content) { - return { - fileData: { - mimeType: content.mimeType, - fileUri: content.fileUri - } - } - } - - throw new Error('Invalid media content') -} - -function inferToolNameFromPreviousMessages(message: ToolMessage | ToolMessageChunk, previousMessages: BaseMessage[]): string | undefined { - return previousMessages - .map((msg) => { - if (isAIMessage(msg)) { - return msg.tool_calls ?? [] - } - return [] - }) - .flat() - .find((toolCall) => { - return toolCall.id === message.tool_call_id - })?.name -} - -function _getStandardContentBlockConverter(isMultimodalModel: boolean) { - const standardContentBlockConverter: StandardContentBlockConverter<{ - text: TextPart - image: FileDataPart | InlineDataPart - audio: FileDataPart | InlineDataPart - file: FileDataPart | InlineDataPart | TextPart - }> = { - providerName: 'Google Gemini', - - fromStandardTextBlock(block) { - return { - text: block.text - } - }, - - fromStandardImageBlock(block): FileDataPart | InlineDataPart { - if (!isMultimodalModel) { - throw new Error('This model does not support images') - } - if (block.source_type === 'url') { - const data = parseBase64DataUrl({ dataUrl: block.url }) - if (data) { - return { - inlineData: { - mimeType: data.mime_type, - data: data.data - } - } - } else { - return { - fileData: { - mimeType: block.mime_type ?? '', - fileUri: block.url - } - } - } - } - - if (block.source_type === 'base64') { - return { - inlineData: { - mimeType: block.mime_type ?? '', - data: block.data - } - } - } - - throw new Error(`Unsupported source type: ${block.source_type}`) - }, - - fromStandardAudioBlock(block): FileDataPart | InlineDataPart { - if (!isMultimodalModel) { - throw new Error('This model does not support audio') - } - if (block.source_type === 'url') { - const data = parseBase64DataUrl({ dataUrl: block.url }) - if (data) { - return { - inlineData: { - mimeType: data.mime_type, - data: data.data - } - } - } else { - return { - fileData: { - mimeType: block.mime_type ?? '', - fileUri: block.url - } - } - } - } - - if (block.source_type === 'base64') { - return { - inlineData: { - mimeType: block.mime_type ?? '', - data: block.data - } - } - } - - throw new Error(`Unsupported source type: ${block.source_type}`) - }, - - fromStandardFileBlock(block): FileDataPart | InlineDataPart | TextPart { - if (!isMultimodalModel) { - throw new Error('This model does not support files') - } - if (block.source_type === 'text') { - return { - text: block.text - } - } - if (block.source_type === 'url') { - const data = parseBase64DataUrl({ dataUrl: block.url }) - if (data) { - return { - inlineData: { - mimeType: data.mime_type, - data: data.data - } - } - } else { - return { - fileData: { - mimeType: block.mime_type ?? '', - fileUri: block.url - } - } - } - } - - if (block.source_type === 'base64') { - return { - inlineData: { - mimeType: block.mime_type ?? '', - data: block.data - } - } - } - throw new Error(`Unsupported source type: ${block.source_type}`) - } - } - return standardContentBlockConverter -} - -function _convertLangChainContentToPart(content: MessageContentComplex, isMultimodalModel: boolean): Part | undefined { - if (isDataContentBlock(content)) { - return convertToProviderContentBlock(content, _getStandardContentBlockConverter(isMultimodalModel)) - } - - if (content.type === 'text') { - return { text: content.text } - } else if (content.type === 'executableCode') { - return { executableCode: content.executableCode } - } else if (content.type === 'codeExecutionResult') { - return { codeExecutionResult: content.codeExecutionResult } - } else if (content.type === 'image_url') { - if (!isMultimodalModel) { - throw new Error(`This model does not support images`) - } - let source - if (typeof content.image_url === 'string') { - source = content.image_url - } else if (typeof content.image_url === 'object' && 'url' in content.image_url) { - source = content.image_url.url - } else { - throw new Error('Please provide image as base64 encoded data URL') - } - const [dm, data] = source.split(',') - if (!dm.startsWith('data:')) { - throw new Error('Please provide image as base64 encoded data URL') - } - - const [mimeType, encoding] = dm.replace(/^data:/, '').split(';') - if (encoding !== 'base64') { - throw new Error('Please provide image as base64 encoded data URL') - } - - return { - inlineData: { - data, - mimeType - } - } - } else if (content.type === 'media') { - return messageContentMedia(content) - } else if (content.type === 'tool_use') { - return { - functionCall: { - name: content.name, - args: content.input - } - } - } else if ( - content.type?.includes('/') && - // Ensure it's a single slash. - content.type.split('/').length === 2 && - 'data' in content && - typeof content.data === 'string' - ) { - return { - inlineData: { - mimeType: content.type, - data: content.data - } - } - } else if ('functionCall' in content) { - // No action needed here — function calls will be added later from message.tool_calls - return undefined - } else { - if ('type' in content) { - throw new Error(`Unknown content type ${content.type}`) - } else { - throw new Error(`Unknown content ${JSON.stringify(content)}`) - } - } -} - -export function convertMessageContentToParts(message: BaseMessage, isMultimodalModel: boolean, previousMessages: BaseMessage[]): Part[] { - if (isToolMessage(message)) { - const messageName = message.name ?? inferToolNameFromPreviousMessages(message, previousMessages) - if (messageName === undefined) { - throw new Error( - `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.` - ) - } - - const result = Array.isArray(message.content) - ? (message.content.map((c) => _convertLangChainContentToPart(c, isMultimodalModel)).filter((p) => p !== undefined) as Part[]) - : message.content - - if (message.status === 'error') { - return [ - { - functionResponse: { - name: messageName, - // The API expects an object with an `error` field if the function call fails. - // `error` must be a valid object (not a string or array), so we wrap `message.content` here - response: { error: { details: result } } - } - } - ] - } - - return [ - { - functionResponse: { - name: messageName, - // again, can't have a string or array value for `response`, so we wrap it as an object here - response: { result } - } - } - ] - } - - let functionCalls: FunctionCallPart[] = [] - const messageParts: Part[] = [] - - if (typeof message.content === 'string' && message.content) { - messageParts.push({ text: message.content }) - } - - if (Array.isArray(message.content)) { - messageParts.push( - ...(message.content.map((c) => _convertLangChainContentToPart(c, isMultimodalModel)).filter((p) => p !== undefined) as Part[]) - ) - } - - if (isAIMessage(message) && message.tool_calls?.length) { - functionCalls = message.tool_calls.map((tc) => { - return { - functionCall: { - name: tc.name, - args: tc.args - } - } - }) - } - - return [...messageParts, ...functionCalls] -} - -export function convertBaseMessagesToContent( - messages: BaseMessage[], - isMultimodalModel: boolean, - convertSystemMessageToHumanContent: boolean = false -) { - return messages.reduce<{ - content: Content[] - mergeWithPreviousContent: boolean - }>( - (acc, message, index) => { - if (!isBaseMessage(message)) { - throw new Error('Unsupported message input') - } - const author = getMessageAuthor(message) - if (author === 'system' && index !== 0) { - throw new Error('System message should be the first one') - } - const role = convertAuthorToRole(author) - - const prevContent = acc.content[acc.content.length] - if (!acc.mergeWithPreviousContent && prevContent && prevContent.role === role) { - throw new Error('Google Generative AI requires alternate messages between authors') - } - - const parts = convertMessageContentToParts(message, isMultimodalModel, messages.slice(0, index)) - - if (acc.mergeWithPreviousContent) { - const prevContent = acc.content[acc.content.length - 1] - if (!prevContent) { - throw new Error('There was a problem parsing your system message. Please try a prompt without one.') - } - prevContent.parts.push(...parts) - - return { - mergeWithPreviousContent: false, - content: acc.content - } - } - let actualRole = role - if (actualRole === 'function' || (actualRole === 'system' && !convertSystemMessageToHumanContent)) { - // GenerativeAI API will throw an error if the role is not "user" or "model." - actualRole = 'user' - } - const content: Content = { - role: actualRole, - parts - } - return { - mergeWithPreviousContent: author === 'system' && !convertSystemMessageToHumanContent, - content: [...acc.content, content] - } - }, - { content: [], mergeWithPreviousContent: false } - ).content -} - -export function mapGenerateContentResultToChatResult( - response: EnhancedGenerateContentResponse, - extra?: { - usageMetadata: UsageMetadata | undefined - } -): ChatResult { - // if rejected or error, return empty generations with reason in filters - if (!response.candidates || response.candidates.length === 0 || !response.candidates[0]) { - return { - generations: [], - llmOutput: { - filters: response.promptFeedback - } - } - } - - const functionCalls = response.functionCalls() - const [candidate] = response.candidates - const { content: candidateContent, ...generationInfo } = candidate - let content: MessageContent | undefined - const inlineDataItems: any[] = [] - - if (Array.isArray(candidateContent?.parts) && candidateContent.parts.length === 1 && candidateContent.parts[0].text) { - content = candidateContent.parts[0].text - } else if (Array.isArray(candidateContent?.parts) && candidateContent.parts.length > 0) { - content = candidateContent.parts.map((p) => { - if ('text' in p) { - return { - type: 'text', - text: p.text - } - } else if ('executableCode' in p) { - return { - type: 'executableCode', - executableCode: p.executableCode - } - } else if ('codeExecutionResult' in p) { - return { - type: 'codeExecutionResult', - codeExecutionResult: p.codeExecutionResult - } - } else if ('inlineData' in p && p.inlineData) { - // Extract inline image data for processing by Agent - inlineDataItems.push({ - type: 'gemini_inline_data', - mimeType: p.inlineData.mimeType, - data: p.inlineData.data - }) - // Return the inline data as part of the content structure - return { - type: 'inlineData', - inlineData: p.inlineData - } - } - return p - }) - } else { - // no content returned - likely due to abnormal stop reason, e.g. malformed function call - content = [] - } - - let text = '' - if (typeof content === 'string') { - text = content - } else if (Array.isArray(content) && content.length > 0) { - const block = content.find((b) => 'text' in b) as { text: string } | undefined - text = block?.text ?? text - } - - // Build response_metadata with inline data if present - const response_metadata: any = {} - if (inlineDataItems.length > 0) { - response_metadata.inlineData = inlineDataItems - } - - const generation: ChatGeneration = { - text, - message: new AIMessage({ - content: content ?? '', - tool_calls: functionCalls?.map((fc) => { - return { - ...fc, - type: 'tool_call', - id: 'id' in fc && typeof fc.id === 'string' ? fc.id : uuidv4() - } - }), - additional_kwargs: { - ...generationInfo - }, - usage_metadata: extra?.usageMetadata, - response_metadata: Object.keys(response_metadata).length > 0 ? response_metadata : undefined - }), - generationInfo - } - - return { - generations: [generation], - llmOutput: { - tokenUsage: { - promptTokens: extra?.usageMetadata?.input_tokens, - completionTokens: extra?.usageMetadata?.output_tokens, - totalTokens: extra?.usageMetadata?.total_tokens - } - } - } -} - -export function convertResponseContentToChatGenerationChunk( - response: EnhancedGenerateContentResponse, - extra: { - usageMetadata?: UsageMetadata | undefined - index: number - } -): ChatGenerationChunk | null { - if (!response.candidates || response.candidates.length === 0) { - return null - } - const functionCalls = response.functionCalls() - const [candidate] = response.candidates - const { content: candidateContent, ...generationInfo } = candidate - let content: MessageContent | undefined - const inlineDataItems: any[] = [] - - // Checks if some parts do not have text. If false, it means that the content is a string. - if (Array.isArray(candidateContent?.parts) && candidateContent.parts.every((p) => 'text' in p)) { - content = candidateContent.parts.map((p) => p.text).join('') - } else if (Array.isArray(candidateContent?.parts)) { - content = candidateContent.parts.map((p) => { - if ('text' in p) { - return { - type: 'text', - text: p.text - } - } else if ('executableCode' in p) { - return { - type: 'executableCode', - executableCode: p.executableCode - } - } else if ('codeExecutionResult' in p) { - return { - type: 'codeExecutionResult', - codeExecutionResult: p.codeExecutionResult - } - } else if ('inlineData' in p && p.inlineData) { - // Extract inline image data for processing by Agent - inlineDataItems.push({ - type: 'gemini_inline_data', - mimeType: p.inlineData.mimeType, - data: p.inlineData.data - }) - // Return the inline data as part of the content structure - return { - type: 'inlineData', - inlineData: p.inlineData - } - } - return p - }) - } else { - // no content returned - likely due to abnormal stop reason, e.g. malformed function call - content = [] - } - - let text = '' - if (content && typeof content === 'string') { - text = content - } else if (Array.isArray(content)) { - const block = content.find((b) => 'text' in b) as { text: string } | undefined - text = block?.text ?? '' - } - - const toolCallChunks: ToolCallChunk[] = [] - if (functionCalls) { - toolCallChunks.push( - ...functionCalls.map((fc) => ({ - ...fc, - args: JSON.stringify(fc.args), - index: extra.index, - type: 'tool_call_chunk' as const, - id: 'id' in fc && typeof fc.id === 'string' ? fc.id : uuidv4() - })) - ) - } - - // Build response_metadata with inline data if present - const response_metadata: any = {} - if (inlineDataItems.length > 0) { - response_metadata.inlineData = inlineDataItems - } - - return new ChatGenerationChunk({ - text, - message: new AIMessageChunk({ - content: content || '', - name: !candidateContent ? undefined : candidateContent.role, - tool_call_chunks: toolCallChunks, - // Each chunk can have unique "generationInfo", and merging strategy is unclear, - // so leave blank for now. - additional_kwargs: {}, - usage_metadata: extra.usageMetadata, - response_metadata: Object.keys(response_metadata).length > 0 ? response_metadata : undefined - }), - generationInfo - }) -} - -export function convertToGenerativeAITools(tools: GoogleGenerativeAIToolType[]): GoogleGenerativeAIFunctionDeclarationsTool[] { - if (tools.every((tool) => 'functionDeclarations' in tool && Array.isArray(tool.functionDeclarations))) { - return tools as GoogleGenerativeAIFunctionDeclarationsTool[] - } - return [ - { - functionDeclarations: tools.map((tool): GenerativeAIFunctionDeclaration => { - if (isLangChainTool(tool)) { - const jsonSchema = schemaToGenerativeAIParameters(tool.schema) - if (jsonSchema.type === 'object' && 'properties' in jsonSchema && Object.keys(jsonSchema.properties).length === 0) { - return { - name: tool.name, - description: tool.description - } - } - return { - name: tool.name, - description: tool.description, - parameters: jsonSchema - } - } - if (isOpenAITool(tool)) { - return { - name: tool.function.name, - description: tool.function.description ?? `A function available to call.`, - parameters: jsonSchemaToGeminiParameters(tool.function.parameters) - } - } - return tool as unknown as GenerativeAIFunctionDeclaration - }) - } - ] -} diff --git a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/output_parsers.ts b/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/output_parsers.ts deleted file mode 100644 index 102596aa7cb..00000000000 --- a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/output_parsers.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { BaseLLMOutputParser, OutputParserException } from '@langchain/core/output_parsers' -import { ChatGeneration } from '@langchain/core/outputs' -import { ToolCall } from '@langchain/core/messages/tool' -import { InteropZodType, interopSafeParseAsync } from '@langchain/core/utils/types' -import { JsonOutputKeyToolsParserParamsInterop } from '@langchain/core/output_parsers/openai_tools' - -interface GoogleGenerativeAIToolsOutputParserParams> extends JsonOutputKeyToolsParserParamsInterop {} - -export class GoogleGenerativeAIToolsOutputParser = Record> extends BaseLLMOutputParser { - static lc_name() { - return 'GoogleGenerativeAIToolsOutputParser' - } - - lc_namespace = ['langchain', 'google_genai', 'output_parsers'] - - returnId = false - - /** The type of tool calls to return. */ - keyName: string - - /** Whether to return only the first tool call. */ - returnSingle = false - - zodSchema?: InteropZodType - - constructor(params: GoogleGenerativeAIToolsOutputParserParams) { - super(params) - this.keyName = params.keyName - this.returnSingle = params.returnSingle ?? this.returnSingle - this.zodSchema = params.zodSchema - } - - protected async _validateResult(result: unknown): Promise { - if (this.zodSchema === undefined) { - return result as T - } - const zodParsedResult = await interopSafeParseAsync(this.zodSchema, result) - if (zodParsedResult.success) { - return zodParsedResult.data - } else { - throw new OutputParserException( - `Failed to parse. Text: "${JSON.stringify(result, null, 2)}". Error: ${JSON.stringify(zodParsedResult.error.issues)}`, - JSON.stringify(result, null, 2) - ) - } - } - - async parseResult(generations: ChatGeneration[]): Promise { - const tools = generations.flatMap((generation) => { - const { message } = generation - if (!('tool_calls' in message) || !Array.isArray(message.tool_calls)) { - return [] - } - return message.tool_calls as ToolCall[] - }) - if (tools[0] === undefined) { - throw new Error('No parseable tool calls provided to GoogleGenerativeAIToolsOutputParser.') - } - const [tool] = tools - const validatedResult = await this._validateResult(tool.args) - return validatedResult - } -} diff --git a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/tools.ts b/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/tools.ts deleted file mode 100644 index a356252e1a2..00000000000 --- a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/tools.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { - Tool as GenerativeAITool, - ToolConfig, - FunctionCallingMode, - FunctionDeclaration, - FunctionDeclarationsTool, - FunctionDeclarationSchema -} from '@google/generative-ai' -import { ToolChoice } from '@langchain/core/language_models/chat_models' -import { StructuredToolInterface } from '@langchain/core/tools' -import { isLangChainTool } from '@langchain/core/utils/function_calling' -import { isOpenAITool, ToolDefinition } from '@langchain/core/language_models/base' -import { convertToGenerativeAITools } from './common.js' -import { GoogleGenerativeAIToolType } from './types.js' -import { removeAdditionalProperties } from './zod_to_genai_parameters.js' - -export function convertToolsToGenAI( - tools: GoogleGenerativeAIToolType[], - extra?: { - toolChoice?: ToolChoice - allowedFunctionNames?: string[] - } -): { - tools: GenerativeAITool[] - toolConfig?: ToolConfig -} { - // Extract function declaration processing to a separate function - const genAITools = processTools(tools) - - // Simplify tool config creation - const toolConfig = createToolConfig(genAITools, extra) - - return { tools: genAITools, toolConfig } -} - -function processTools(tools: GoogleGenerativeAIToolType[]): GenerativeAITool[] { - let functionDeclarationTools: FunctionDeclaration[] = [] - const genAITools: GenerativeAITool[] = [] - - tools.forEach((tool) => { - if (isLangChainTool(tool)) { - const [convertedTool] = convertToGenerativeAITools([tool as StructuredToolInterface]) - if (convertedTool.functionDeclarations) { - functionDeclarationTools.push(...convertedTool.functionDeclarations) - } - } else if (isOpenAITool(tool)) { - const { functionDeclarations } = convertOpenAIToolToGenAI(tool) - if (functionDeclarations) { - functionDeclarationTools.push(...functionDeclarations) - } else { - throw new Error('Failed to convert OpenAI structured tool to GenerativeAI tool') - } - } else { - genAITools.push(tool as GenerativeAITool) - } - }) - - const genAIFunctionDeclaration = genAITools.find((t) => 'functionDeclarations' in t) - if (genAIFunctionDeclaration) { - return genAITools.map((tool) => { - if (functionDeclarationTools?.length > 0 && 'functionDeclarations' in tool) { - const newTool = { - functionDeclarations: [...(tool.functionDeclarations || []), ...functionDeclarationTools] - } - // Clear the functionDeclarationTools array so it is not passed again - functionDeclarationTools = [] - return newTool - } - return tool - }) - } - - return [ - ...genAITools, - ...(functionDeclarationTools.length > 0 - ? [ - { - functionDeclarations: functionDeclarationTools - } - ] - : []) - ] -} - -function convertOpenAIToolToGenAI(tool: ToolDefinition): FunctionDeclarationsTool { - return { - functionDeclarations: [ - { - name: tool.function.name, - description: tool.function.description, - parameters: removeAdditionalProperties(tool.function.parameters) as FunctionDeclarationSchema - } - ] - } -} - -function createToolConfig( - genAITools: GenerativeAITool[], - extra?: { - toolChoice?: ToolChoice - allowedFunctionNames?: string[] - } -): ToolConfig | undefined { - if (!genAITools.length || !extra) return undefined - - const { toolChoice, allowedFunctionNames } = extra - - const modeMap: Record = { - any: FunctionCallingMode.ANY, - auto: FunctionCallingMode.AUTO, - none: FunctionCallingMode.NONE - } - - if (toolChoice && ['any', 'auto', 'none'].includes(toolChoice as string)) { - return { - functionCallingConfig: { - mode: modeMap[toolChoice as keyof typeof modeMap] ?? 'MODE_UNSPECIFIED', - allowedFunctionNames - } - } - } - - if (typeof toolChoice === 'string' || allowedFunctionNames) { - return { - functionCallingConfig: { - mode: FunctionCallingMode.ANY, - allowedFunctionNames: [ - ...(allowedFunctionNames ?? []), - ...(toolChoice && typeof toolChoice === 'string' ? [toolChoice] : []) - ] - } - } - } - - return undefined -} diff --git a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/types.ts b/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/types.ts deleted file mode 100644 index f784f635f2f..00000000000 --- a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/types.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { - CodeExecutionTool, - FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool, - GoogleSearchRetrievalTool -} from '@google/generative-ai' -import { BindToolsInput } from '@langchain/core/language_models/chat_models' - -export type GoogleGenerativeAIToolType = - | BindToolsInput - | GoogleGenerativeAIFunctionDeclarationsTool - | CodeExecutionTool - | GoogleSearchRetrievalTool diff --git a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/zod_to_genai_parameters.ts b/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/zod_to_genai_parameters.ts deleted file mode 100644 index 020c6359fe1..00000000000 --- a/packages/components/nodes/chatmodels/ChatGoogleGenerativeAI/utils/zod_to_genai_parameters.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - type FunctionDeclarationSchema as GenerativeAIFunctionDeclarationSchema, - type SchemaType as FunctionDeclarationSchemaType -} from '@google/generative-ai' -import { InteropZodType, isInteropZodSchema } from '@langchain/core/utils/types' -import { type JsonSchema7Type, toJsonSchema } from '@langchain/core/utils/json_schema' - -export interface GenerativeAIJsonSchema extends Record { - properties?: Record - type: FunctionDeclarationSchemaType -} - -export interface GenerativeAIJsonSchemaDirty extends GenerativeAIJsonSchema { - properties?: Record - additionalProperties?: boolean -} - -export function removeAdditionalProperties(obj: Record): GenerativeAIJsonSchema { - if (typeof obj === 'object' && obj !== null) { - const newObj = { ...obj } - - if ('additionalProperties' in newObj) { - delete newObj.additionalProperties - } - if ('$schema' in newObj) { - delete newObj.$schema - } - if ('strict' in newObj) { - delete newObj.strict - } - - for (const key in newObj) { - if (key in newObj) { - if (Array.isArray(newObj[key])) { - newObj[key] = newObj[key].map(removeAdditionalProperties) - } else if (typeof newObj[key] === 'object' && newObj[key] !== null) { - newObj[key] = removeAdditionalProperties(newObj[key]) - } - } - } - - return newObj as GenerativeAIJsonSchema - } - - return obj as GenerativeAIJsonSchema -} - -export function schemaToGenerativeAIParameters = Record>( - schema: InteropZodType | JsonSchema7Type -): GenerativeAIFunctionDeclarationSchema { - // GenerativeAI doesn't accept either the $schema or additionalProperties - // attributes, so we need to explicitly remove them. - const jsonSchema = removeAdditionalProperties(isInteropZodSchema(schema) ? toJsonSchema(schema) : schema) - const { _schema, ...rest } = jsonSchema - - return rest as GenerativeAIFunctionDeclarationSchema -} - -export function jsonSchemaToGeminiParameters(schema: Record): GenerativeAIFunctionDeclarationSchema { - // Gemini doesn't accept either the $schema or additionalProperties - // attributes, so we need to explicitly remove them. - - const jsonSchema = removeAdditionalProperties(schema as GenerativeAIJsonSchemaDirty) - const { _schema, ...rest } = jsonSchema - - return rest as GenerativeAIFunctionDeclarationSchema -} diff --git a/packages/components/nodes/chatmodels/ChatGoogleVertexAI/ChatGoogleVertexAI.ts b/packages/components/nodes/chatmodels/ChatGoogleVertexAI/ChatGoogleVertexAI.ts index 00641da1dfa..c287098d44b 100644 --- a/packages/components/nodes/chatmodels/ChatGoogleVertexAI/ChatGoogleVertexAI.ts +++ b/packages/components/nodes/chatmodels/ChatGoogleVertexAI/ChatGoogleVertexAI.ts @@ -1,5 +1,6 @@ import { BaseCache } from '@langchain/core/caches' import { ChatVertexAIInput, ChatVertexAI as LcChatVertexAI } from '@langchain/google-vertexai' +import { GoogleGenerativeAIChatInput } from '@langchain/google-genai' import { buildGoogleCredentials } from '../../../src/google-utils' import { ICommonObject, @@ -64,7 +65,7 @@ class GoogleVertexAI_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatGoogleVertexAI' + this.label = 'Google VertexAI' this.name = 'chatGoogleVertexAI' this.version = 5.3 this.type = 'ChatGoogleVertexAI' @@ -119,6 +120,14 @@ class GoogleVertexAI_ChatModels implements INode { default: 0.9, optional: true }, + { + label: 'Streaming', + name: 'streaming', + type: 'boolean', + default: true, + optional: true, + additionalParams: true + }, { label: 'Allow Image Uploads', name: 'allowImageUploads', @@ -128,13 +137,43 @@ class GoogleVertexAI_ChatModels implements INode { default: false, optional: true }, + /** The thinkingLevel parameter, recommended for Gemini 3 models and onwards. */ { - label: 'Streaming', - name: 'streaming', - type: 'boolean', - default: true, + label: 'Thinking Budget', + name: 'thinkingBudget', + type: 'number', + description: 'Guides the number of thinking tokens. -1 for dynamic, 0 to disable, or positive integer (Gemini 2.5 models).', + step: 1, optional: true, - additionalParams: true + additionalParams: true, + show: { + modelName: ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.5-flash-lite'] + } + }, + { + label: 'Thinking Level', + name: 'thinkingLevel', + type: 'options', + description: 'Adjust the amount of reasoning effort based on the complexity of the user request', + options: [ + { + label: 'Low', + name: 'LOW' + }, + { + label: 'Medium', + name: 'MEDIUM' + }, + { + label: 'High', + name: 'HIGH' + } + ], + optional: true, + additionalParams: true, + show: { + modelName: ['gemini-3.1-pro-preview', 'gemini-3.1-flash-lite-preview', 'gemini-3-flash-preview'] + } }, { label: 'Max Output Tokens', @@ -193,8 +232,9 @@ class GoogleVertexAI_ChatModels implements INode { const cache = nodeData.inputs?.cache as BaseCache const topK = nodeData.inputs?.topK as string const streaming = nodeData.inputs?.streaming as boolean - const thinkingBudget = nodeData.inputs?.thinkingBudget as string const region = nodeData.inputs?.region as string + const thinkingBudget = nodeData.inputs?.thinkingBudget as string + const thinkingLevel = nodeData.inputs?.thinkingLevel as 'LOW' | 'MEDIUM' | 'HIGH' const allowImageUploads = nodeData.inputs?.allowImageUploads as boolean @@ -204,7 +244,7 @@ class GoogleVertexAI_ChatModels implements INode { } } - const obj: ChatVertexAIInput = { + const obj: ChatVertexAIInput & Partial = { temperature: parseFloat(temperature), modelName: customModelName || modelName, streaming: streaming ?? true @@ -217,8 +257,18 @@ class GoogleVertexAI_ChatModels implements INode { if (topP) obj.topP = parseFloat(topP) if (cache) obj.cache = cache if (topK) obj.topK = parseFloat(topK) - if (thinkingBudget) obj.thinkingBudget = parseInt(thinkingBudget, 10) if (region) obj.location = region + if (thinkingLevel) { + obj.thinkingConfig = { + thinkingLevel: thinkingLevel, + includeThoughts: true + } + } else if (thinkingBudget) { + obj.thinkingConfig = { + thinkingBudget: parseInt(thinkingBudget, 10), + includeThoughts: true + } + } const model = new ChatVertexAI(nodeData.id, obj) model.setMultiModalOption(multiModalOption) diff --git a/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts b/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts index 4cda05716e5..3c3af6b9766 100644 --- a/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts +++ b/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts @@ -16,7 +16,7 @@ class ChatHuggingFace_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatHuggingFace' + this.label = 'HuggingFace' this.name = 'chatHuggingFace' this.version = 3.0 this.type = 'ChatHuggingFace' diff --git a/packages/components/nodes/chatmodels/ChatIBMWatsonx/ChatIBMWatsonx.ts b/packages/components/nodes/chatmodels/ChatIBMWatsonx/ChatIBMWatsonx.ts index 00adc75fb05..a4fb0045b6e 100644 --- a/packages/components/nodes/chatmodels/ChatIBMWatsonx/ChatIBMWatsonx.ts +++ b/packages/components/nodes/chatmodels/ChatIBMWatsonx/ChatIBMWatsonx.ts @@ -25,7 +25,7 @@ class ChatIBMWatsonx_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatIBMWatsonx' + this.label = 'IBM Watsonx' this.name = 'chatIBMWatsonx' this.version = 2.0 this.type = 'ChatIBMWatsonx' diff --git a/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts b/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts index 35ecf456252..a444d1ac79d 100644 --- a/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts +++ b/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts @@ -18,7 +18,7 @@ class ChatLitellm_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatLitellm' + this.label = 'LiteLLM' this.name = 'chatLitellm' this.version = 2.0 this.type = 'ChatLitellm' @@ -68,6 +68,15 @@ class ChatLitellm_ChatModels implements INode { optional: true, additionalParams: true }, + { + label: 'Allow Image Uploads', + name: 'allowImageUploads', + type: 'boolean', + description: + 'Allow image input. Image uploads need a model marked supports_vision=true in LiteLLM. Refer to the docs for more details.', + default: false, + optional: true + }, { label: 'Max Tokens', name: 'maxTokens', @@ -91,40 +100,6 @@ class ChatLitellm_ChatModels implements INode { step: 1, optional: true, additionalParams: true - }, - { - label: 'Allow Image Uploads', - name: 'allowImageUploads', - type: 'boolean', - description: - 'Allow image input. Image uploads need a model marked supports_vision=true in LiteLLM. Refer to the docs for more details.', - default: false, - optional: true - }, - { - label: 'Image Resolution', - description: 'This parameter controls the resolution in which the model views the image.', - name: 'imageResolution', - type: 'options', - options: [ - { - label: 'Low', - name: 'low' - }, - { - label: 'High', - name: 'high' - }, - { - label: 'Auto', - name: 'auto' - } - ], - default: 'low', - optional: false, - show: { - allowImageUploads: true - } } ] } @@ -139,7 +114,6 @@ class ChatLitellm_ChatModels implements INode { const topP = nodeData.inputs?.topP as string const timeout = nodeData.inputs?.timeout as string const allowImageUploads = nodeData.inputs?.allowImageUploads as boolean - const imageResolution = nodeData.inputs?.imageResolution as string const credentialData = await getCredentialData(nodeData.credential ?? '', options) const apiKey = getCredentialParam('litellmApiKey', credentialData, nodeData) @@ -168,8 +142,7 @@ class ChatLitellm_ChatModels implements INode { const multiModalOption: IMultiModalOption = { image: { - allowImageUploads: allowImageUploads ?? false, - imageResolution + allowImageUploads: allowImageUploads ?? false } } diff --git a/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts b/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts index 4040adc8f1c..c7233004131 100644 --- a/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts +++ b/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts @@ -16,7 +16,7 @@ class ChatLocalAI_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatLocalAI' + this.label = 'LocalAI' this.name = 'chatLocalAI' this.version = 3.0 this.type = 'ChatLocalAI' diff --git a/packages/components/nodes/chatmodels/ChatMistral/ChatMistral.ts b/packages/components/nodes/chatmodels/ChatMistral/ChatMistral.ts index 2c478b6831d..0e960576413 100644 --- a/packages/components/nodes/chatmodels/ChatMistral/ChatMistral.ts +++ b/packages/components/nodes/chatmodels/ChatMistral/ChatMistral.ts @@ -17,7 +17,7 @@ class ChatMistral_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatMistralAI' + this.label = 'MistralAI' this.name = 'chatMistralAI' this.version = 4.0 this.type = 'ChatMistralAI' diff --git a/packages/components/nodes/chatmodels/ChatNemoGuardrails/ChatNemoGuardrails.ts b/packages/components/nodes/chatmodels/ChatNemoGuardrails/ChatNemoGuardrails.ts index 8da1a7fbb11..d87cb2c0f3d 100644 --- a/packages/components/nodes/chatmodels/ChatNemoGuardrails/ChatNemoGuardrails.ts +++ b/packages/components/nodes/chatmodels/ChatNemoGuardrails/ChatNemoGuardrails.ts @@ -82,7 +82,7 @@ class ChatNemoGuardrailsChatModel implements INode { inputs: INodeParams[] constructor() { - this.label = 'Chat Nemo Guardrails' + this.label = 'Nemo Guardrails' this.name = 'chatNemoGuardrails' this.version = 1.0 this.type = 'ChatNemoGuardrails' diff --git a/packages/components/nodes/chatmodels/ChatNvdiaNIM/ChatNvdiaNIM.ts b/packages/components/nodes/chatmodels/ChatNvdiaNIM/ChatNvdiaNIM.ts index 59f57c48581..4ef8cf61893 100644 --- a/packages/components/nodes/chatmodels/ChatNvdiaNIM/ChatNvdiaNIM.ts +++ b/packages/components/nodes/chatmodels/ChatNvdiaNIM/ChatNvdiaNIM.ts @@ -16,7 +16,7 @@ class ChatNvdiaNIM_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'Chat NVIDIA NIM' + this.label = 'Nvidia NIM' this.name = 'chatNvidiaNIM' this.version = 1.1 this.type = 'ChatNvidiaNIM' diff --git a/packages/components/nodes/chatmodels/ChatOllama/ChatOllama.ts b/packages/components/nodes/chatmodels/ChatOllama/ChatOllama.ts index 23b9613df33..6d03e657ca4 100644 --- a/packages/components/nodes/chatmodels/ChatOllama/ChatOllama.ts +++ b/packages/components/nodes/chatmodels/ChatOllama/ChatOllama.ts @@ -18,7 +18,7 @@ class ChatOllama_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatOllama' + this.label = 'Ollama' this.name = 'chatOllama' this.version = 5.0 this.type = 'ChatOllama' @@ -62,6 +62,14 @@ class ChatOllama_ChatModels implements INode { default: 0.9, optional: true }, + { + label: 'Streaming', + name: 'streaming', + type: 'boolean', + default: true, + optional: true, + additionalParams: true + }, { label: 'Allow Image Uploads', name: 'allowImageUploads', @@ -71,14 +79,6 @@ class ChatOllama_ChatModels implements INode { default: false, optional: true }, - { - label: 'Streaming', - name: 'streaming', - type: 'boolean', - default: true, - optional: true, - additionalParams: true - }, { label: 'JSON Mode', name: 'jsonMode', diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts index a7421dfdaf4..03c13fee9b0 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts @@ -1,10 +1,9 @@ import { ChatOpenAI as LangchainChatOpenAI, ChatOpenAIFields } from '@langchain/openai' import { BaseCache } from '@langchain/core/caches' import { ICommonObject, IMultiModalOption, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface' -import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam, isReasoningModelOpenAI } from '../../../src/utils' import { ChatOpenAI } from './FlowiseChatOpenAI' import { getModels, MODEL_TYPE } from '../../../src/modelLoader' -import { HttpsProxyAgent } from 'https-proxy-agent' import { OpenAI as OpenAIClient } from 'openai' class ChatOpenAI_ChatModels implements INode { @@ -20,7 +19,7 @@ class ChatOpenAI_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatOpenAI' + this.label = 'OpenAI' this.name = 'chatOpenAI' this.version = 8.3 this.type = 'ChatOpenAI' @@ -64,6 +63,77 @@ class ChatOpenAI_ChatModels implements INode { optional: true, additionalParams: true }, + { + label: 'Allow Image Uploads', + name: 'allowImageUploads', + type: 'boolean', + description: + 'Allow image input. Refer to the docs for more details.', + default: false, + optional: true + }, + { + label: 'Reasoning', + description: 'Whether the model supports reasoning. Only applicable for reasoning models (gpt-5 and o-series models only)', + name: 'reasoning', + type: 'boolean', + default: false, + optional: true, + additionalParams: true + }, + { + label: 'Reasoning Effort', + description: 'Constrains effort on reasoning. Only applicable for reasoning models (gpt-5 and o-series models only)', + name: 'reasoningEffort', + type: 'options', + options: [ + { + label: 'Low', + name: 'low' + }, + { + label: 'Medium', + name: 'medium' + }, + { + label: 'High', + name: 'high' + }, + { + label: 'X-High', + name: 'xhigh', + description: 'X-High is supported for all models after gpt-5.1-codex-max' + } + ], + additionalParams: true, + show: { + reasoning: true + } + }, + { + label: 'Reasoning Summary', + description: `A summary of the reasoning performed by the model. This can be useful for debugging and understanding the model's reasoning process`, + name: 'reasoningSummary', + type: 'options', + options: [ + { + label: 'Auto', + name: 'auto' + }, + { + label: 'Concise', + name: 'concise' + }, + { + label: 'Detailed', + name: 'detailed' + } + ], + additionalParams: true, + show: { + reasoning: true + } + }, { label: 'Max Tokens', name: 'maxTokens', @@ -123,116 +193,20 @@ class ChatOpenAI_ChatModels implements INode { additionalParams: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', additionalParams: true }, { - label: 'Proxy Url', - name: 'proxyUrl', - type: 'string', - optional: true, - additionalParams: true - }, - { - label: 'BaseOptions', + label: 'Base Options', name: 'baseOptions', type: 'json', optional: true, + description: 'Default headers to include with every request to the API.', additionalParams: true - }, - { - label: 'Allow Image Uploads', - name: 'allowImageUploads', - type: 'boolean', - description: - 'Allow image input. Refer to the docs for more details.', - default: false, - optional: true - }, - { - label: 'Image Resolution', - description: 'This parameter controls the resolution in which the model views the image.', - name: 'imageResolution', - type: 'options', - options: [ - { - label: 'Low', - name: 'low' - }, - { - label: 'High', - name: 'high' - }, - { - label: 'Auto', - name: 'auto' - } - ], - default: 'low', - optional: false, - show: { - allowImageUploads: true - } - }, - { - label: 'Reasoning', - description: 'Whether the model supports reasoning. Only applicable for reasoning models.', - name: 'reasoning', - type: 'boolean', - default: false, - optional: true, - additionalParams: true - }, - { - label: 'Reasoning Effort', - description: 'Constrains effort on reasoning for reasoning models', - name: 'reasoningEffort', - type: 'options', - options: [ - { - label: 'Low', - name: 'low' - }, - { - label: 'Medium', - name: 'medium' - }, - { - label: 'High', - name: 'high' - } - ], - additionalParams: true, - show: { - reasoning: true - } - }, - { - label: 'Reasoning Summary', - description: `A summary of the reasoning performed by the model. This can be useful for debugging and understanding the model's reasoning process`, - name: 'reasoningSummary', - type: 'options', - options: [ - { - label: 'Auto', - name: 'auto' - }, - { - label: 'Concise', - name: 'concise' - }, - { - label: 'Detailed', - name: 'detailed' - } - ], - additionalParams: true, - show: { - reasoning: true - } } ] } @@ -256,13 +230,10 @@ class ChatOpenAI_ChatModels implements INode { const streaming = nodeData.inputs?.streaming as boolean const strictToolCalling = nodeData.inputs?.strictToolCalling as boolean const basePath = nodeData.inputs?.basepath as string - const proxyUrl = nodeData.inputs?.proxyUrl as string const baseOptions = nodeData.inputs?.baseOptions const reasoningEffort = nodeData.inputs?.reasoningEffort as OpenAIClient.ReasoningEffort | null const reasoningSummary = nodeData.inputs?.reasoningSummary as 'auto' | 'concise' | 'detailed' | null - const allowImageUploads = nodeData.inputs?.allowImageUploads as boolean - const imageResolution = nodeData.inputs?.imageResolution as string if (nodeData.inputs?.credentialId) { nodeData.credential = nodeData.inputs?.credentialId @@ -280,7 +251,7 @@ class ChatOpenAI_ChatModels implements INode { streaming: streaming ?? true } - if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) + if (maxTokens) obj.maxCompletionTokens = parseInt(maxTokens, 10) if (topP) obj.topP = parseFloat(topP) if (frequencyPenalty) obj.frequencyPenalty = parseFloat(frequencyPenalty) if (presencePenalty) obj.presencePenalty = parseFloat(presencePenalty) @@ -292,7 +263,7 @@ class ChatOpenAI_ChatModels implements INode { } if (strictToolCalling) obj.supportsStrictToolCalling = strictToolCalling - if (modelName.includes('o1') || modelName.includes('o3') || modelName.includes('gpt-5')) { + if (isReasoningModelOpenAI(modelName)) { delete obj.temperature delete obj.stop const reasoning: OpenAIClient.Reasoning = {} @@ -322,22 +293,15 @@ class ChatOpenAI_ChatModels implements INode { } } - if (proxyUrl) { - obj.configuration = { - ...obj?.configuration, - httpAgent: new HttpsProxyAgent(proxyUrl) - } - } - const multiModalOption: IMultiModalOption = { image: { - allowImageUploads: allowImageUploads ?? false, - imageResolution + allowImageUploads: allowImageUploads ?? false } } const model = new ChatOpenAI(nodeData.id, obj) model.setMultiModalOption(multiModalOption) + return model } } diff --git a/packages/components/nodes/chatmodels/ChatOpenAICustom/ChatOpenAICustom.ts b/packages/components/nodes/chatmodels/ChatOpenAICustom/ChatOpenAICustom.ts index 9c450ba016e..faf2ebd8b37 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAICustom/ChatOpenAICustom.ts +++ b/packages/components/nodes/chatmodels/ChatOpenAICustom/ChatOpenAICustom.ts @@ -16,7 +16,7 @@ class ChatOpenAICustom_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatOpenAI Custom' + this.label = 'OpenAI Custom Model' this.name = 'chatOpenAICustom' this.version = 4.0 this.type = 'ChatOpenAI-Custom' @@ -101,17 +101,19 @@ class ChatOpenAICustom_ChatModels implements INode { additionalParams: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', additionalParams: true }, { - label: 'BaseOptions', + label: 'Base Options', name: 'baseOptions', type: 'json', optional: true, + description: 'Default headers to include with every request to the API.', additionalParams: true } ] diff --git a/packages/components/nodes/chatmodels/ChatOpenRouter/ChatOpenRouter.ts b/packages/components/nodes/chatmodels/ChatOpenRouter/ChatOpenRouter.ts index 4defd19ed9d..3cd343ed944 100644 --- a/packages/components/nodes/chatmodels/ChatOpenRouter/ChatOpenRouter.ts +++ b/packages/components/nodes/chatmodels/ChatOpenRouter/ChatOpenRouter.ts @@ -17,7 +17,7 @@ class ChatOpenRouter_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatOpenRouter' + this.label = 'OpenRouter' this.name = 'chatOpenRouter' this.version = 1.0 this.type = 'ChatOpenRouter' @@ -61,6 +61,15 @@ class ChatOpenRouter_ChatModels implements INode { optional: true, additionalParams: true }, + { + label: 'Allow Image Uploads', + name: 'allowImageUploads', + type: 'boolean', + description: + 'Allow image input. Refer to the docs for more details.', + default: false, + optional: true + }, { label: 'Max Tokens', name: 'maxTokens', @@ -102,53 +111,21 @@ class ChatOpenRouter_ChatModels implements INode { additionalParams: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, default: 'https://openrouter.ai/api/v1', + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', additionalParams: true }, { - label: 'BaseOptions', + label: 'Base Options', name: 'baseOptions', type: 'json', optional: true, + description: 'Default headers to include with every request to the API.', additionalParams: true - }, - { - label: 'Allow Image Uploads', - name: 'allowImageUploads', - type: 'boolean', - description: - 'Allow image input. Refer to the docs for more details.', - default: false, - optional: true - }, - { - label: 'Image Resolution', - description: 'This parameter controls the resolution in which the model views the image.', - name: 'imageResolution', - type: 'options', - options: [ - { - label: 'Low', - name: 'low' - }, - { - label: 'High', - name: 'high' - }, - { - label: 'Auto', - name: 'auto' - } - ], - default: 'low', - optional: false, - show: { - allowImageUploads: true - } } ] } @@ -166,7 +143,6 @@ class ChatOpenRouter_ChatModels implements INode { const baseOptions = nodeData.inputs?.baseOptions const cache = nodeData.inputs?.cache as BaseCache const allowImageUploads = nodeData.inputs?.allowImageUploads as boolean - const imageResolution = nodeData.inputs?.imageResolution as string const credentialData = await getCredentialData(nodeData.credential ?? '', options) const openRouterApiKey = getCredentialParam('openRouterApiKey', credentialData, nodeData) @@ -205,8 +181,7 @@ class ChatOpenRouter_ChatModels implements INode { const multiModalOption: IMultiModalOption = { image: { - allowImageUploads: allowImageUploads ?? false, - imageResolution + allowImageUploads: allowImageUploads ?? false } } diff --git a/packages/components/nodes/chatmodels/ChatPerplexity/ChatPerplexity.ts b/packages/components/nodes/chatmodels/ChatPerplexity/ChatPerplexity.ts index 79817c3dfc4..13cbf645d36 100644 --- a/packages/components/nodes/chatmodels/ChatPerplexity/ChatPerplexity.ts +++ b/packages/components/nodes/chatmodels/ChatPerplexity/ChatPerplexity.ts @@ -18,7 +18,7 @@ class ChatPerplexity_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatPerplexity' + this.label = 'Perplexity' this.name = 'chatPerplexity' this.version = 0.1 this.type = 'ChatPerplexity' diff --git a/packages/components/nodes/chatmodels/ChatSambanova/ChatSambanova.ts b/packages/components/nodes/chatmodels/ChatSambanova/ChatSambanova.ts index a62ebfb30d0..7ef36545592 100644 --- a/packages/components/nodes/chatmodels/ChatSambanova/ChatSambanova.ts +++ b/packages/components/nodes/chatmodels/ChatSambanova/ChatSambanova.ts @@ -16,7 +16,7 @@ class ChatSambanova_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatSambanova' + this.label = 'SambaNova' this.name = 'chatSambanova' this.version = 1.0 this.type = 'ChatSambanova' @@ -60,18 +60,20 @@ class ChatSambanova_ChatModels implements INode { optional: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, default: 'htps://api.sambanova.ai/v1', + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', additionalParams: true }, { - label: 'BaseOptions', + label: 'Base Options', name: 'baseOptions', type: 'json', optional: true, + description: 'Default headers to include with every request to the API.', additionalParams: true } ] diff --git a/packages/components/nodes/chatmodels/ChatTogetherAI/ChatTogetherAI.ts b/packages/components/nodes/chatmodels/ChatTogetherAI/ChatTogetherAI.ts index d24a295512e..cc583cae68b 100644 --- a/packages/components/nodes/chatmodels/ChatTogetherAI/ChatTogetherAI.ts +++ b/packages/components/nodes/chatmodels/ChatTogetherAI/ChatTogetherAI.ts @@ -16,7 +16,7 @@ class ChatTogetherAI_ChatModels implements INode { credential: INodeParams constructor() { - this.label = 'ChatTogetherAI' + this.label = 'TogetherAI' this.name = 'chatTogetherAI' this.version = 2.0 this.type = 'ChatTogetherAI' diff --git a/packages/components/nodes/chatmodels/ChatXAI/ChatXAI.ts b/packages/components/nodes/chatmodels/ChatXAI/ChatXAI.ts index 2495522ce39..3834f19e6c2 100644 --- a/packages/components/nodes/chatmodels/ChatXAI/ChatXAI.ts +++ b/packages/components/nodes/chatmodels/ChatXAI/ChatXAI.ts @@ -17,7 +17,7 @@ class ChatXAI_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatXAI' + this.label = 'xAI Grok' this.name = 'chatXAI' this.version = 2.0 this.type = 'ChatXAI' @@ -60,6 +60,15 @@ class ChatXAI_ChatModels implements INode { optional: true, additionalParams: true }, + { + label: 'Allow Image Uploads', + name: 'allowImageUploads', + type: 'boolean', + description: + 'Allow image input. Refer to the docs for more details.', + default: false, + optional: true + }, { label: 'Max Tokens', name: 'maxTokens', @@ -75,15 +84,6 @@ class ChatXAI_ChatModels implements INode { step: 1, optional: true, additionalParams: true - }, - { - label: 'Allow Image Uploads', - name: 'allowImageUploads', - type: 'boolean', - description: - 'Allow image input. Refer to the docs for more details.', - default: false, - optional: true } ] } diff --git a/packages/components/nodes/chatmodels/ChatXAI/FlowiseChatXAI.ts b/packages/components/nodes/chatmodels/ChatXAI/FlowiseChatXAI.ts index e315a29a93c..05925b9cfc0 100644 --- a/packages/components/nodes/chatmodels/ChatXAI/FlowiseChatXAI.ts +++ b/packages/components/nodes/chatmodels/ChatXAI/FlowiseChatXAI.ts @@ -15,7 +15,7 @@ export class ChatXAI extends LCChatXAI implements IVisionChatModal { } revertToOriginalModel(): void { - this.modelName = this.configuredModel + this.model = this.configuredModel this.maxTokens = this.configuredMaxToken } diff --git a/packages/components/nodes/chatmodels/Deepseek/Deepseek.ts b/packages/components/nodes/chatmodels/Deepseek/Deepseek.ts index fa92a5633c2..16615576cb8 100644 --- a/packages/components/nodes/chatmodels/Deepseek/Deepseek.ts +++ b/packages/components/nodes/chatmodels/Deepseek/Deepseek.ts @@ -1,11 +1,10 @@ import { BaseCache } from '@langchain/core/caches' -import { ChatOpenAI, ChatOpenAIFields } from '@langchain/openai' +import { ChatDeepSeek, ChatDeepSeekInput } from '@langchain/deepseek' import { ICommonObject, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface' import { getModels, MODEL_TYPE } from '../../../src/modelLoader' import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' class Deepseek_ChatModels implements INode { - readonly baseURL: string = 'https://api.deepseek.com' label: string name: string version: number @@ -18,14 +17,14 @@ class Deepseek_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'ChatDeepseek' + this.label = 'Deepseek' this.name = 'chatDeepseek' this.version = 1.0 this.type = 'chatDeepseek' this.icon = 'deepseek.svg' this.category = 'Chat Models' this.description = 'Wrapper around Deepseek large language models that use the Chat endpoint' - this.baseClasses = [this.type, ...getBaseClasses(ChatOpenAI)] + this.baseClasses = [this.type, ...getBaseClasses(ChatDeepSeek)] this.credential = { label: 'Connect Credential', name: 'credential', @@ -111,6 +110,16 @@ class Deepseek_ChatModels implements INode { description: 'List of stop words to use when generating. Use comma to separate multiple stop words.', additionalParams: true }, + { + label: 'Thinking', + name: 'thinking', + type: 'boolean', + default: false, + optional: true, + additionalParams: true, + description: + 'Enable deep thinking mode for complex reasoning tasks. When enabled, the model will use extended thinking before responding.' + }, { label: 'Base Options', name: 'baseOptions', @@ -139,6 +148,7 @@ class Deepseek_ChatModels implements INode { const timeout = nodeData.inputs?.timeout as string const stopSequence = nodeData.inputs?.stopSequence as string const streaming = nodeData.inputs?.streaming as boolean + const thinking = nodeData.inputs?.thinking as boolean const baseOptions = nodeData.inputs?.baseOptions if (nodeData.inputs?.credentialId) { @@ -149,7 +159,7 @@ class Deepseek_ChatModels implements INode { const cache = nodeData.inputs?.cache as BaseCache - const obj: ChatOpenAIFields = { + const obj: ChatDeepSeekInput = { temperature: parseFloat(temperature), modelName, openAIApiKey, @@ -167,28 +177,25 @@ class Deepseek_ChatModels implements INode { const stopSequenceArray = stopSequence.split(',').map((item) => item.trim()) obj.stop = stopSequenceArray } - - let parsedBaseOptions: any | undefined = undefined + if (thinking) { + obj.modelKwargs = { + ...obj.modelKwargs, + thinking: { type: 'enabled' } + } + } if (baseOptions) { try { - parsedBaseOptions = typeof baseOptions === 'object' ? baseOptions : JSON.parse(baseOptions) - if (parsedBaseOptions.baseURL) { - console.warn("The 'baseURL' parameter is not allowed when using the ChatDeepseek node.") - parsedBaseOptions.baseURL = undefined + const parsedBaseOptions = typeof baseOptions === 'object' ? baseOptions : JSON.parse(baseOptions) + obj.configuration = { + defaultHeaders: parsedBaseOptions } } catch (exception) { throw new Error('Invalid JSON in the BaseOptions: ' + exception) } } - const model = new ChatOpenAI({ - ...obj, - configuration: { - baseURL: this.baseURL, - ...parsedBaseOptions - } - }) + const model = new ChatDeepSeek(obj) return model } } diff --git a/packages/components/nodes/chatmodels/Groq/Groq.ts b/packages/components/nodes/chatmodels/Groq/Groq.ts index 506c7277fdd..8040ac16024 100644 --- a/packages/components/nodes/chatmodels/Groq/Groq.ts +++ b/packages/components/nodes/chatmodels/Groq/Groq.ts @@ -17,7 +17,7 @@ class Groq_ChatModels implements INode { inputs: INodeParams[] constructor() { - this.label = 'GroqChat' + this.label = 'Groq' this.name = 'groqChat' this.version = 4.0 this.type = 'GroqChat' @@ -90,7 +90,7 @@ class Groq_ChatModels implements INode { const groqApiKey = getCredentialParam('groqApiKey', credentialData, nodeData) const obj: ChatGroqInput = { - modelName, + model: modelName, temperature: parseFloat(temperature), apiKey: groqApiKey, streaming: streaming ?? true diff --git a/packages/components/nodes/documentloaders/API/APILoader.ts b/packages/components/nodes/documentloaders/API/APILoader.ts index d343cb9b38b..35cce570c3a 100644 --- a/packages/components/nodes/documentloaders/API/APILoader.ts +++ b/packages/components/nodes/documentloaders/API/APILoader.ts @@ -1,8 +1,8 @@ import { Document } from '@langchain/core/documents' import { AxiosRequestConfig } from 'axios' import { secureAxiosRequest } from '../../../src/httpSecurity' -import { BaseDocumentLoader } from 'langchain/document_loaders/base' -import { TextSplitter } from 'langchain/text_splitter' +import { BaseDocumentLoader } from '@langchain/classic/document_loaders/base' +import { TextSplitter } from '@langchain/textsplitters' import { omit } from 'lodash' import { getFileFromStorage } from '../../../src' import { ICommonObject, IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' diff --git a/packages/components/nodes/documentloaders/Airtable/Airtable.ts b/packages/components/nodes/documentloaders/Airtable/Airtable.ts index 8ace551aca6..fef69300594 100644 --- a/packages/components/nodes/documentloaders/Airtable/Airtable.ts +++ b/packages/components/nodes/documentloaders/Airtable/Airtable.ts @@ -1,8 +1,8 @@ import axios from 'axios' import { omit } from 'lodash' import { Document } from '@langchain/core/documents' -import { TextSplitter } from 'langchain/text_splitter' -import { BaseDocumentLoader } from 'langchain/document_loaders/base' +import { TextSplitter } from '@langchain/textsplitters' +import { BaseDocumentLoader } from '@langchain/classic/document_loaders/base' import { getCredentialData, getCredentialParam } from '../../../src/utils' import { IDocument, ICommonObject, INode, INodeData, INodeParams, INodeOutputsValue } from '../../../src/Interface' import { handleEscapeCharacters } from '../../../src' diff --git a/packages/components/nodes/documentloaders/ApifyWebsiteContentCrawler/ApifyWebsiteContentCrawler.ts b/packages/components/nodes/documentloaders/ApifyWebsiteContentCrawler/ApifyWebsiteContentCrawler.ts index 41b91ef5dd4..281bd76f448 100644 --- a/packages/components/nodes/documentloaders/ApifyWebsiteContentCrawler/ApifyWebsiteContentCrawler.ts +++ b/packages/components/nodes/documentloaders/ApifyWebsiteContentCrawler/ApifyWebsiteContentCrawler.ts @@ -1,7 +1,7 @@ import { omit } from 'lodash' import { INode, INodeData, INodeParams, ICommonObject, INodeOutputsValue } from '../../../src/Interface' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src/utils' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { ApifyDatasetLoader } from '@langchain/community/document_loaders/web/apify_dataset' import { Document } from '@langchain/core/documents' diff --git a/packages/components/nodes/documentloaders/BraveSearchAPI/BraveSearchAPI.ts b/packages/components/nodes/documentloaders/BraveSearchAPI/BraveSearchAPI.ts index 61da9c24f2a..bd1517eb3e7 100644 --- a/packages/components/nodes/documentloaders/BraveSearchAPI/BraveSearchAPI.ts +++ b/packages/components/nodes/documentloaders/BraveSearchAPI/BraveSearchAPI.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { BraveSearch } from '@langchain/community/tools/brave_search' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src/utils' import { Document } from '@langchain/core/documents' diff --git a/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts b/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts index 9ef16850c02..e062fb4c43d 100644 --- a/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts +++ b/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts @@ -1,6 +1,6 @@ -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { omit } from 'lodash' -import { CheerioWebBaseLoader, WebBaseLoaderParams } from '@langchain/community/document_loaders/web/cheerio' +import { CheerioWebBaseLoader, CheerioWebBaseLoaderParams } from '@langchain/community/document_loaders/web/cheerio' import { test } from 'linkifyjs' import { parse } from 'css-what' import { SelectorType } from 'cheerio' @@ -140,7 +140,7 @@ class Cheerio_DocumentLoaders implements INode { const selector: SelectorType = nodeData.inputs?.selector as SelectorType - let params: WebBaseLoaderParams = {} + let params: CheerioWebBaseLoaderParams = {} if (selector) { parse(selector) // comes with cheerio - will throw error if invalid params['selector'] = selector diff --git a/packages/components/nodes/documentloaders/Confluence/Confluence.ts b/packages/components/nodes/documentloaders/Confluence/Confluence.ts index 776d28547b4..ddf6ec87822 100644 --- a/packages/components/nodes/documentloaders/Confluence/Confluence.ts +++ b/packages/components/nodes/documentloaders/Confluence/Confluence.ts @@ -1,5 +1,5 @@ import { omit } from 'lodash' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { ConfluencePagesLoader, ConfluencePagesLoaderParams } from '@langchain/community/document_loaders/web/confluence' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src/utils' import { ICommonObject, INode, INodeData, INodeParams, INodeOutputsValue } from '../../../src/Interface' diff --git a/packages/components/nodes/documentloaders/Csv/Csv.ts b/packages/components/nodes/documentloaders/Csv/Csv.ts index 9e251a3e8ed..5ada8824081 100644 --- a/packages/components/nodes/documentloaders/Csv/Csv.ts +++ b/packages/components/nodes/documentloaders/Csv/Csv.ts @@ -1,4 +1,4 @@ -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { CSVLoader } from './CsvLoader' import { getFileFromStorage, handleDocumentLoaderDocuments, handleDocumentLoaderMetadata, handleDocumentLoaderOutput } from '../../../src' import { ICommonObject, IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -135,7 +135,7 @@ class Csv_DocumentLoaders implements INode { if (!file) continue const fileData = await this.getFileData(file, { orgId, chatflowid }, fromStorage) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) const loader = new CSVLoader(blob, columnName.trim().length === 0 ? undefined : columnName.trim()) // use spread instead of push, because it raises RangeError: Maximum call stack size exceeded when too many docs diff --git a/packages/components/nodes/documentloaders/Csv/CsvLoader.ts b/packages/components/nodes/documentloaders/Csv/CsvLoader.ts index df0d19cff22..7319fab46d7 100644 --- a/packages/components/nodes/documentloaders/Csv/CsvLoader.ts +++ b/packages/components/nodes/documentloaders/Csv/CsvLoader.ts @@ -1,4 +1,4 @@ -import { TextLoader } from 'langchain/document_loaders/fs/text' +import { TextLoader } from '@langchain/classic/document_loaders/fs/text' import Papa from 'papaparse' type CSVLoaderOptions = { diff --git a/packages/components/nodes/documentloaders/Docx/Docx.ts b/packages/components/nodes/documentloaders/Docx/Docx.ts index d59a1e2b36a..6a8c3385b79 100644 --- a/packages/components/nodes/documentloaders/Docx/Docx.ts +++ b/packages/components/nodes/documentloaders/Docx/Docx.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams, INodeOutputsValue } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { DocxLoader } from '@langchain/community/document_loaders/fs/docx' import { getFileFromStorage, handleEscapeCharacters } from '../../../src' @@ -102,7 +102,7 @@ class Docx_DocumentLoaders implements INode { for (const file of files) { if (!file) continue const fileData = await getFileFromStorage(file, orgId, chatflowid) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) const loader = new DocxLoader(blob) if (textSplitter) { diff --git a/packages/components/nodes/documentloaders/Epub/Epub.ts b/packages/components/nodes/documentloaders/Epub/Epub.ts index 440cfe009bf..8b031727226 100644 --- a/packages/components/nodes/documentloaders/Epub/Epub.ts +++ b/packages/components/nodes/documentloaders/Epub/Epub.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { IDocument, ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { getFileFromStorage, handleEscapeCharacters, INodeOutputsValue } from '../../../src' import { EPubLoader } from '@langchain/community/document_loaders/fs/epub' diff --git a/packages/components/nodes/documentloaders/Figma/Figma.ts b/packages/components/nodes/documentloaders/Figma/Figma.ts index d07c681a2ca..a08b3a57dc8 100644 --- a/packages/components/nodes/documentloaders/Figma/Figma.ts +++ b/packages/components/nodes/documentloaders/Figma/Figma.ts @@ -2,7 +2,7 @@ import { omit } from 'lodash' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src' import { ICommonObject, IDocument, INode, INodeData, INodeParams, INodeOutputsValue } from '../../../src/Interface' import { FigmaFileLoader, FigmaLoaderParams } from '@langchain/community/document_loaders/web/figma' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' class Figma_DocumentLoaders implements INode { label: string diff --git a/packages/components/nodes/documentloaders/File/File.ts b/packages/components/nodes/documentloaders/File/File.ts index 80216323574..c369a39633f 100644 --- a/packages/components/nodes/documentloaders/File/File.ts +++ b/packages/components/nodes/documentloaders/File/File.ts @@ -1,12 +1,12 @@ import { omit } from 'lodash' import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' -import { TextLoader } from 'langchain/document_loaders/fs/text' -import { JSONLinesLoader, JSONLoader } from 'langchain/document_loaders/fs/json' +import { TextSplitter } from '@langchain/textsplitters' +import { TextLoader } from '@langchain/classic/document_loaders/fs/text' +import { JSONLinesLoader, JSONLoader } from '@langchain/classic/document_loaders/fs/json' import { CSVLoader } from '@langchain/community/document_loaders/fs/csv' import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf' import { DocxLoader } from '@langchain/community/document_loaders/fs/docx' -import { BaseDocumentLoader } from 'langchain/document_loaders/base' +import { BaseDocumentLoader } from '@langchain/classic/document_loaders/base' import { LoadOfSheet } from '../MicrosoftExcel/ExcelLoader' import { PowerpointLoader } from '../MicrosoftPowerpoint/PowerpointLoader' import { Document } from '@langchain/core/documents' @@ -156,14 +156,14 @@ class File_DocumentLoaders implements INode { for (const file of files) { if (!file) continue const fileData = await getFileFromStorage(file, orgId, chatflowid, options.chatId) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) fileBlobs.push({ blob, ext: file.split('.').pop() || '' }) } } else { for (const file of files) { if (!file) continue const fileData = await getFileFromStorage(file, orgId, chatflowid) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) fileBlobs.push({ blob, ext: file.split('.').pop() || '' }) } } diff --git a/packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts b/packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts index c8cf4a3dd04..654fd59e8f3 100644 --- a/packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts +++ b/packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts @@ -1,11 +1,11 @@ -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { Document, DocumentInterface } from '@langchain/core/documents' -import { BaseDocumentLoader } from 'langchain/document_loaders/base' +import { BaseDocumentLoader } from '@langchain/classic/document_loaders/base' import { INode, INodeData, INodeParams, ICommonObject, INodeOutputsValue } from '../../../src/Interface' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src/utils' import { AxiosResponse, AxiosRequestHeaders } from 'axios' import { secureAxiosRequest } from '../../../src/httpSecurity' -import { z } from 'zod' +import { z } from 'zod/v3' // FirecrawlApp interfaces interface FirecrawlAppConfig { diff --git a/packages/components/nodes/documentloaders/Folder/Folder.ts b/packages/components/nodes/documentloaders/Folder/Folder.ts index e8aa16a5be8..5823051fa59 100644 --- a/packages/components/nodes/documentloaders/Folder/Folder.ts +++ b/packages/components/nodes/documentloaders/Folder/Folder.ts @@ -1,9 +1,9 @@ import { omit } from 'lodash' import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' -import { TextLoader } from 'langchain/document_loaders/fs/text' -import { DirectoryLoader } from 'langchain/document_loaders/fs/directory' -import { JSONLinesLoader, JSONLoader } from 'langchain/document_loaders/fs/json' +import { TextSplitter } from '@langchain/textsplitters' +import { TextLoader } from '@langchain/classic/document_loaders/fs/text' +import { DirectoryLoader } from '@langchain/classic/document_loaders/fs/directory' +import { JSONLinesLoader, JSONLoader } from '@langchain/classic/document_loaders/fs/json' import { CSVLoader } from '@langchain/community/document_loaders/fs/csv' import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf' import { DocxLoader } from '@langchain/community/document_loaders/fs/docx' diff --git a/packages/components/nodes/documentloaders/Gitbook/Gitbook.ts b/packages/components/nodes/documentloaders/Gitbook/Gitbook.ts index a8db37f7f95..9142261a185 100644 --- a/packages/components/nodes/documentloaders/Gitbook/Gitbook.ts +++ b/packages/components/nodes/documentloaders/Gitbook/Gitbook.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { GitbookLoader } from '@langchain/community/document_loaders/web/gitbook' import { handleEscapeCharacters } from '../../../src/utils' diff --git a/packages/components/nodes/documentloaders/Github/Github.ts b/packages/components/nodes/documentloaders/Github/Github.ts index 3edef63f342..70d06265aa8 100644 --- a/packages/components/nodes/documentloaders/Github/Github.ts +++ b/packages/components/nodes/documentloaders/Github/Github.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { GithubRepoLoader, GithubRepoLoaderParams } from '@langchain/community/document_loaders/web/github' import { getCredentialData, getCredentialParam, handleEscapeCharacters, INodeOutputsValue } from '../../../src' diff --git a/packages/components/nodes/documentloaders/GoogleDrive/GoogleDrive.ts b/packages/components/nodes/documentloaders/GoogleDrive/GoogleDrive.ts index fe56b20f725..ef4f7b22fe2 100644 --- a/packages/components/nodes/documentloaders/GoogleDrive/GoogleDrive.ts +++ b/packages/components/nodes/documentloaders/GoogleDrive/GoogleDrive.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams, INodeOptionsValue } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { convertMultiOptionsToStringArray, getCredentialData, diff --git a/packages/components/nodes/documentloaders/GoogleSheets/GoogleSheets.ts b/packages/components/nodes/documentloaders/GoogleSheets/GoogleSheets.ts index 8c7a7a2a493..8ec0d9f15d7 100644 --- a/packages/components/nodes/documentloaders/GoogleSheets/GoogleSheets.ts +++ b/packages/components/nodes/documentloaders/GoogleSheets/GoogleSheets.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams, INodeOptionsValue } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { convertMultiOptionsToStringArray, getCredentialData, diff --git a/packages/components/nodes/documentloaders/Jira/Jira.ts b/packages/components/nodes/documentloaders/Jira/Jira.ts index 9c03282effd..cbf691c5d1a 100644 --- a/packages/components/nodes/documentloaders/Jira/Jira.ts +++ b/packages/components/nodes/documentloaders/Jira/Jira.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { JiraProjectLoaderParams, JiraProjectLoader } from '@langchain/community/document_loaders/web/jira' import { getCredentialData, getCredentialParam, handleEscapeCharacters, INodeOutputsValue } from '../../../src' diff --git a/packages/components/nodes/documentloaders/Json/Json.ts b/packages/components/nodes/documentloaders/Json/Json.ts index 042c81ef833..298bd239d5f 100644 --- a/packages/components/nodes/documentloaders/Json/Json.ts +++ b/packages/components/nodes/documentloaders/Json/Json.ts @@ -1,11 +1,11 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { getFileFromStorage, handleEscapeCharacters, INodeOutputsValue } from '../../../src' import { Document } from '@langchain/core/documents' import jsonpointer from 'jsonpointer' import type { readFile as ReadFileT } from 'node:fs/promises' -import { BaseDocumentLoader } from 'langchain/document_loaders/base' +import { BaseDocumentLoader } from '@langchain/classic/document_loaders/base' const howToUseCode = ` You can add metadata dynamically from the document: @@ -164,7 +164,7 @@ class Json_DocumentLoaders implements INode { for (const file of files) { if (!file) continue const fileData = await getFileFromStorage(file, orgId, chatflowid) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) const loader = new JSONLoader(blob, pointers.length != 0 ? pointers : undefined, metadata, separateByObject) if (textSplitter) { diff --git a/packages/components/nodes/documentloaders/Jsonlines/Jsonlines.ts b/packages/components/nodes/documentloaders/Jsonlines/Jsonlines.ts index 2b035dcfc2a..f731ec646d0 100644 --- a/packages/components/nodes/documentloaders/Jsonlines/Jsonlines.ts +++ b/packages/components/nodes/documentloaders/Jsonlines/Jsonlines.ts @@ -1,9 +1,9 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import jsonpointer from 'jsonpointer' import { getFileFromStorage, handleEscapeCharacters, INodeOutputsValue } from '../../../src' -import { BaseDocumentLoader } from 'langchain/document_loaders/base' +import { BaseDocumentLoader } from '@langchain/classic/document_loaders/base' import { Document } from '@langchain/core/documents' import type { readFile as ReadFileT } from 'node:fs/promises' @@ -141,7 +141,7 @@ class Jsonlines_DocumentLoaders implements INode { for (const file of files) { if (!file) continue const fileData = await getFileFromStorage(file, orgId, chatflowid) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) const loader = new JSONLinesLoader(blob, pointer, metadata) if (textSplitter) { diff --git a/packages/components/nodes/documentloaders/MicrosoftExcel/ExcelLoader.ts b/packages/components/nodes/documentloaders/MicrosoftExcel/ExcelLoader.ts index 1e4889e1ce4..8927262fecd 100644 --- a/packages/components/nodes/documentloaders/MicrosoftExcel/ExcelLoader.ts +++ b/packages/components/nodes/documentloaders/MicrosoftExcel/ExcelLoader.ts @@ -1,5 +1,5 @@ import { Document } from '@langchain/core/documents' -import { BufferLoader } from 'langchain/document_loaders/fs/buffer' +import { BufferLoader } from '@langchain/classic/document_loaders/fs/buffer' import { read, utils } from 'xlsx' /** diff --git a/packages/components/nodes/documentloaders/MicrosoftExcel/MicrosoftExcel.ts b/packages/components/nodes/documentloaders/MicrosoftExcel/MicrosoftExcel.ts index 468d16731b9..f38de8aac8e 100644 --- a/packages/components/nodes/documentloaders/MicrosoftExcel/MicrosoftExcel.ts +++ b/packages/components/nodes/documentloaders/MicrosoftExcel/MicrosoftExcel.ts @@ -1,4 +1,4 @@ -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { LoadOfSheet } from './ExcelLoader' import { getFileFromStorage, handleDocumentLoaderDocuments, handleDocumentLoaderMetadata, handleDocumentLoaderOutput } from '../../../src' import { ICommonObject, IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -126,7 +126,7 @@ class MicrosoftExcel_DocumentLoaders implements INode { if (!file) continue const fileData = await this.getFileData(file, { orgId, chatflowid }, fromStorage) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) const loader = new LoadOfSheet(blob) // use spread instead of push, because it raises RangeError: Maximum call stack size exceeded when too many docs diff --git a/packages/components/nodes/documentloaders/MicrosoftPowerpoint/MicrosoftPowerpoint.ts b/packages/components/nodes/documentloaders/MicrosoftPowerpoint/MicrosoftPowerpoint.ts index bca5e9a5bc2..40d9d19ac48 100644 --- a/packages/components/nodes/documentloaders/MicrosoftPowerpoint/MicrosoftPowerpoint.ts +++ b/packages/components/nodes/documentloaders/MicrosoftPowerpoint/MicrosoftPowerpoint.ts @@ -1,4 +1,4 @@ -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { PowerpointLoader } from './PowerpointLoader' import { getFileFromStorage, handleDocumentLoaderDocuments, handleDocumentLoaderMetadata, handleDocumentLoaderOutput } from '../../../src' import { ICommonObject, IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -126,7 +126,7 @@ class MicrosoftPowerpoint_DocumentLoaders implements INode { if (!file) continue const fileData = await this.getFileData(file, { orgId, chatflowid }, fromStorage) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) const loader = new PowerpointLoader(blob) // use spread instead of push, because it raises RangeError: Maximum call stack size exceeded when too many docs diff --git a/packages/components/nodes/documentloaders/MicrosoftPowerpoint/PowerpointLoader.ts b/packages/components/nodes/documentloaders/MicrosoftPowerpoint/PowerpointLoader.ts index 97f266826f0..243a53b6df5 100644 --- a/packages/components/nodes/documentloaders/MicrosoftPowerpoint/PowerpointLoader.ts +++ b/packages/components/nodes/documentloaders/MicrosoftPowerpoint/PowerpointLoader.ts @@ -1,5 +1,5 @@ import { Document } from '@langchain/core/documents' -import { BufferLoader } from 'langchain/document_loaders/fs/buffer' +import { BufferLoader } from '@langchain/classic/document_loaders/fs/buffer' import { parseOfficeAsync } from 'officeparser' /** diff --git a/packages/components/nodes/documentloaders/MicrosoftWord/MicrosoftWord.ts b/packages/components/nodes/documentloaders/MicrosoftWord/MicrosoftWord.ts index 7d74af25999..83860db6fd2 100644 --- a/packages/components/nodes/documentloaders/MicrosoftWord/MicrosoftWord.ts +++ b/packages/components/nodes/documentloaders/MicrosoftWord/MicrosoftWord.ts @@ -1,4 +1,4 @@ -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { WordLoader } from './WordLoader' import { getFileFromStorage, handleDocumentLoaderDocuments, handleDocumentLoaderMetadata, handleDocumentLoaderOutput } from '../../../src' import { ICommonObject, IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -126,7 +126,7 @@ class MicrosoftWord_DocumentLoaders implements INode { if (!file) continue const fileData = await this.getFileData(file, { orgId, chatflowid }, fromStorage) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) const loader = new WordLoader(blob) // use spread instead of push, because it raises RangeError: Maximum call stack size exceeded when too many docs diff --git a/packages/components/nodes/documentloaders/MicrosoftWord/WordLoader.ts b/packages/components/nodes/documentloaders/MicrosoftWord/WordLoader.ts index 640e2c4ff09..956736abb88 100644 --- a/packages/components/nodes/documentloaders/MicrosoftWord/WordLoader.ts +++ b/packages/components/nodes/documentloaders/MicrosoftWord/WordLoader.ts @@ -1,5 +1,5 @@ import { Document } from '@langchain/core/documents' -import { BufferLoader } from 'langchain/document_loaders/fs/buffer' +import { BufferLoader } from '@langchain/classic/document_loaders/fs/buffer' import { parseOfficeAsync } from 'officeparser' /** diff --git a/packages/components/nodes/documentloaders/Notion/NotionDB.ts b/packages/components/nodes/documentloaders/Notion/NotionDB.ts index 7fe3fe43c6d..ed8103185c4 100644 --- a/packages/components/nodes/documentloaders/Notion/NotionDB.ts +++ b/packages/components/nodes/documentloaders/Notion/NotionDB.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { NotionAPILoader, NotionAPILoaderOptions } from '@langchain/community/document_loaders/web/notionapi' import { getCredentialData, getCredentialParam, handleEscapeCharacters, INodeOutputsValue } from '../../../src' @@ -96,7 +96,7 @@ class NotionDB_DocumentLoaders implements INode { const credentialData = await getCredentialData(nodeData.credential ?? '', options) const notionIntegrationToken = getCredentialParam('notionIntegrationToken', credentialData, nodeData) - const obj: NotionAPILoaderOptions = { + const obj: NotionAPILoaderOptions & { type: 'page' | 'database' } = { clientOptions: { auth: notionIntegrationToken }, diff --git a/packages/components/nodes/documentloaders/Notion/NotionFolder.ts b/packages/components/nodes/documentloaders/Notion/NotionFolder.ts index fc9b6201b3c..ef572892c5e 100644 --- a/packages/components/nodes/documentloaders/Notion/NotionFolder.ts +++ b/packages/components/nodes/documentloaders/Notion/NotionFolder.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { NotionLoader } from '@langchain/community/document_loaders/fs/notion' import { handleEscapeCharacters } from '../../../src/utils' diff --git a/packages/components/nodes/documentloaders/Notion/NotionPage.ts b/packages/components/nodes/documentloaders/Notion/NotionPage.ts index a6338d7f0bd..83683306e37 100644 --- a/packages/components/nodes/documentloaders/Notion/NotionPage.ts +++ b/packages/components/nodes/documentloaders/Notion/NotionPage.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { NotionAPILoader, NotionAPILoaderOptions } from '@langchain/community/document_loaders/web/notionapi' import { getCredentialData, getCredentialParam, handleEscapeCharacters, INodeOutputsValue } from '../../../src' @@ -97,7 +97,7 @@ class NotionPage_DocumentLoaders implements INode { const credentialData = await getCredentialData(nodeData.credential ?? '', options) const notionIntegrationToken = getCredentialParam('notionIntegrationToken', credentialData, nodeData) - const obj: NotionAPILoaderOptions = { + const obj: NotionAPILoaderOptions & { type: 'page' | 'database' } = { clientOptions: { auth: notionIntegrationToken }, diff --git a/packages/components/nodes/documentloaders/Oxylabs/Oxylabs.ts b/packages/components/nodes/documentloaders/Oxylabs/Oxylabs.ts index c036eb7bf6a..b53de33e91d 100644 --- a/packages/components/nodes/documentloaders/Oxylabs/Oxylabs.ts +++ b/packages/components/nodes/documentloaders/Oxylabs/Oxylabs.ts @@ -1,6 +1,6 @@ -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { DocumentInterface } from '@langchain/core/documents' -import { BaseDocumentLoader } from 'langchain/document_loaders/base' +import { BaseDocumentLoader } from '@langchain/classic/document_loaders/base' import { INode, INodeData, INodeParams, ICommonObject, INodeOutputsValue } from '../../../src/Interface' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src/utils' import axios, { AxiosResponse } from 'axios' diff --git a/packages/components/nodes/documentloaders/Pdf/Pdf.ts b/packages/components/nodes/documentloaders/Pdf/Pdf.ts index 52f5197cfca..0f52f814915 100644 --- a/packages/components/nodes/documentloaders/Pdf/Pdf.ts +++ b/packages/components/nodes/documentloaders/Pdf/Pdf.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { IDocument, ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf' import { getFileFromStorage, handleEscapeCharacters, INodeOutputsValue } from '../../../src' @@ -192,7 +192,7 @@ class Pdf_DocumentLoaders implements INode { private async extractDocs(usage: string, bf: Buffer, legacyBuild: boolean, textSplitter: TextSplitter, docs: IDocument[]) { if (usage === 'perFile') { - const loader = new PDFLoader(new Blob([bf]), { + const loader = new PDFLoader(new Blob([new Uint8Array(bf)]), { splitPages: false, pdfjs: () => // @ts-ignore @@ -206,7 +206,7 @@ class Pdf_DocumentLoaders implements INode { docs.push(...(await loader.load())) } } else { - const loader = new PDFLoader(new Blob([bf]), { + const loader = new PDFLoader(new Blob([new Uint8Array(bf)]), { pdfjs: () => // @ts-ignore legacyBuild ? import('pdfjs-dist/legacy/build/pdf.js') : import('pdf-parse/lib/pdf.js/v1.10.100/build/pdf.js') diff --git a/packages/components/nodes/documentloaders/PlainText/PlainText.ts b/packages/components/nodes/documentloaders/PlainText/PlainText.ts index 03504d7b872..2a68cb4066d 100644 --- a/packages/components/nodes/documentloaders/PlainText/PlainText.ts +++ b/packages/components/nodes/documentloaders/PlainText/PlainText.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { Document } from '@langchain/core/documents' import { handleEscapeCharacters } from '../../../src' diff --git a/packages/components/nodes/documentloaders/Playwright/Playwright.ts b/packages/components/nodes/documentloaders/Playwright/Playwright.ts index f0507459347..fcef1faddf3 100644 --- a/packages/components/nodes/documentloaders/Playwright/Playwright.ts +++ b/packages/components/nodes/documentloaders/Playwright/Playwright.ts @@ -5,7 +5,7 @@ import { PlaywrightWebBaseLoaderOptions } from '@langchain/community/document_loaders/web/playwright' import { Document } from '@langchain/core/documents' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { test } from 'linkifyjs' import { omit } from 'lodash' import { handleEscapeCharacters, INodeOutputsValue, webCrawl, xmlScrape } from '../../../src' diff --git a/packages/components/nodes/documentloaders/Puppeteer/Puppeteer.ts b/packages/components/nodes/documentloaders/Puppeteer/Puppeteer.ts index 9b4ada91661..c22b05de94f 100644 --- a/packages/components/nodes/documentloaders/Puppeteer/Puppeteer.ts +++ b/packages/components/nodes/documentloaders/Puppeteer/Puppeteer.ts @@ -1,6 +1,6 @@ import { Browser, Page, PuppeteerWebBaseLoader, PuppeteerWebBaseLoaderOptions } from '@langchain/community/document_loaders/web/puppeteer' import { Document } from '@langchain/core/documents' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { test } from 'linkifyjs' import { omit } from 'lodash' import { PuppeteerLifeCycleEvent } from 'puppeteer' diff --git a/packages/components/nodes/documentloaders/S3Directory/S3Directory.ts b/packages/components/nodes/documentloaders/S3Directory/S3Directory.ts index 9d8b5a81c1f..10680aa9876 100644 --- a/packages/components/nodes/documentloaders/S3Directory/S3Directory.ts +++ b/packages/components/nodes/documentloaders/S3Directory/S3Directory.ts @@ -8,12 +8,12 @@ import * as fsDefault from 'node:fs' import * as path from 'node:path' import * as os from 'node:os' -import { DirectoryLoader } from 'langchain/document_loaders/fs/directory' -import { JSONLoader } from 'langchain/document_loaders/fs/json' +import { DirectoryLoader } from '@langchain/classic/document_loaders/fs/directory' +import { JSONLoader } from '@langchain/classic/document_loaders/fs/json' import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf' import { DocxLoader } from '@langchain/community/document_loaders/fs/docx' -import { TextLoader } from 'langchain/document_loaders/fs/text' -import { TextSplitter } from 'langchain/text_splitter' +import { TextLoader } from '@langchain/classic/document_loaders/fs/text' +import { TextSplitter } from '@langchain/textsplitters' import { CSVLoader } from '../Csv/CsvLoader' import { LoadOfSheet } from '../MicrosoftExcel/ExcelLoader' import { PowerpointLoader } from '../MicrosoftPowerpoint/PowerpointLoader' diff --git a/packages/components/nodes/documentloaders/S3File/S3File.ts b/packages/components/nodes/documentloaders/S3File/S3File.ts index fb2acebcd09..4ac60eb7583 100644 --- a/packages/components/nodes/documentloaders/S3File/S3File.ts +++ b/packages/components/nodes/documentloaders/S3File/S3File.ts @@ -20,7 +20,7 @@ import { DocxLoader } from '@langchain/community/document_loaders/fs/docx' import { CSVLoader } from '@langchain/community/document_loaders/fs/csv' import { LoadOfSheet } from '../MicrosoftExcel/ExcelLoader' import { PowerpointLoader } from '../MicrosoftPowerpoint/PowerpointLoader' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { IDocument } from '../../../src/Interface' import { omit } from 'lodash' import { handleEscapeCharacters } from '../../../src' diff --git a/packages/components/nodes/documentloaders/SearchApi/SearchAPI.ts b/packages/components/nodes/documentloaders/SearchApi/SearchAPI.ts index 4ab028be4ab..19ed6d61370 100644 --- a/packages/components/nodes/documentloaders/SearchApi/SearchAPI.ts +++ b/packages/components/nodes/documentloaders/SearchApi/SearchAPI.ts @@ -1,6 +1,6 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { SearchApiLoader } from '@langchain/community/document_loaders/web/searchapi' import { getCredentialData, getCredentialParam, handleEscapeCharacters, INodeOutputsValue } from '../../../src' diff --git a/packages/components/nodes/documentloaders/SerpApi/SerpAPI.ts b/packages/components/nodes/documentloaders/SerpApi/SerpAPI.ts index 0220cf4fb22..6802a39a53f 100644 --- a/packages/components/nodes/documentloaders/SerpApi/SerpAPI.ts +++ b/packages/components/nodes/documentloaders/SerpApi/SerpAPI.ts @@ -1,5 +1,5 @@ import { omit } from 'lodash' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/textsplitters' import { SerpAPILoader } from '@langchain/community/document_loaders/web/serpapi' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src' import { ICommonObject, IDocument, INode, INodeData, INodeParams, INodeOutputsValue } from '../../../src/Interface' diff --git a/packages/components/nodes/documentloaders/Spider/Spider.ts b/packages/components/nodes/documentloaders/Spider/Spider.ts index 71e5d46aa2d..3d22c07bde6 100644 --- a/packages/components/nodes/documentloaders/Spider/Spider.ts +++ b/packages/components/nodes/documentloaders/Spider/Spider.ts @@ -1,7 +1,7 @@ import { omit } from 'lodash' -import { TextSplitter } from 'langchain/text_splitter' +import { TextSplitter } from '@langchain/classic/text_splitter' import { Document, DocumentInterface } from '@langchain/core/documents' -import { BaseDocumentLoader } from 'langchain/document_loaders/base' +import { BaseDocumentLoader } from '@langchain/classic/document_loaders/base' import { INode, INodeData, INodeParams, ICommonObject, INodeOutputsValue } from '../../../src/Interface' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src/utils' import SpiderApp from './SpiderApp' @@ -241,7 +241,8 @@ class Spider_DocumentLoaders implements INode { let docs = [] if (textSplitter) { - docs = await loader.loadAndSplit(textSplitter) + docs = await loader.load() + docs = await textSplitter.splitDocuments(docs) } else { docs = await loader.load() } diff --git a/packages/components/nodes/documentloaders/Text/Text.ts b/packages/components/nodes/documentloaders/Text/Text.ts index 448a25979dd..08008e9fefa 100644 --- a/packages/components/nodes/documentloaders/Text/Text.ts +++ b/packages/components/nodes/documentloaders/Text/Text.ts @@ -1,7 +1,7 @@ import { omit } from 'lodash' import { ICommonObject, IDocument, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { TextSplitter } from 'langchain/text_splitter' -import { TextLoader } from 'langchain/document_loaders/fs/text' +import { TextSplitter } from '@langchain/textsplitters' +import { TextLoader } from '@langchain/classic/document_loaders/fs/text' import { getFileFromStorage, handleEscapeCharacters } from '../../../src' class Text_DocumentLoaders implements INode { @@ -104,7 +104,7 @@ class Text_DocumentLoaders implements INode { for (const file of files) { if (!file) continue const fileData = await getFileFromStorage(file, orgId, chatflowid) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) const loader = new TextLoader(blob) if (textSplitter) { diff --git a/packages/components/nodes/documentloaders/Unstructured/Unstructured.ts b/packages/components/nodes/documentloaders/Unstructured/Unstructured.ts index 2d976bfb8d7..4b647e36895 100644 --- a/packages/components/nodes/documentloaders/Unstructured/Unstructured.ts +++ b/packages/components/nodes/documentloaders/Unstructured/Unstructured.ts @@ -4,8 +4,8 @@ import { UnstructuredLoaderOptions, UnstructuredLoaderStrategy } from '@langchain/community/document_loaders/fs/unstructured' -import { BaseDocumentLoader } from 'langchain/document_loaders/base' -import { StringWithAutocomplete } from 'langchain/dist/util/types' +import { BaseDocumentLoader } from '@langchain/classic/document_loaders/base' +import { StringWithAutocomplete } from '@langchain/core/utils/types' import { Document } from '@langchain/core/documents' /** @@ -83,7 +83,7 @@ export class UnstructuredLoader extends BaseDocumentLoader { async _partition(buffer: Buffer, fileName: string): Promise { const formData = new FormData() - formData.append('files', new Blob([buffer]), fileName) + formData.append('files', new Blob([new Uint8Array(buffer)]), fileName) formData.append('strategy', this.strategy) this.ocrLanguages.forEach((language) => { formData.append('ocr_languages', language) diff --git a/packages/components/nodes/documentloaders/Unstructured/UnstructuredFolder.ts b/packages/components/nodes/documentloaders/Unstructured/UnstructuredFolder.ts deleted file mode 100644 index 1e217a65ede..00000000000 --- a/packages/components/nodes/documentloaders/Unstructured/UnstructuredFolder.ts +++ /dev/null @@ -1,522 +0,0 @@ -/* -* Uncomment this if you want to use the UnstructuredFolder to load a folder from the file system - -import { omit } from 'lodash' -import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -import { - UnstructuredDirectoryLoader, - UnstructuredLoaderOptions, - UnstructuredLoaderStrategy, - SkipInferTableTypes, - HiResModelName -} from '@langchain/community/document_loaders/fs/unstructured' -import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src/utils' - -class UnstructuredFolder_DocumentLoaders implements INode { - label: string - name: string - version: number - description: string - type: string - icon: string - category: string - baseClasses: string[] - credential: INodeParams - inputs: INodeParams[] - outputs: INodeOutputsValue[] - - constructor() { - this.label = 'Unstructured Folder Loader' - this.name = 'unstructuredFolderLoader' - this.version = 3.0 - this.type = 'Document' - this.icon = 'unstructured-folder.svg' - this.category = 'Document Loaders' - this.description = - "Use Unstructured.io to load data from a folder. Note: Currently doesn't support .png and .heic until unstructured is updated." - this.baseClasses = [this.type] - this.credential = { - label: 'Connect Credential', - name: 'credential', - type: 'credential', - credentialNames: ['unstructuredApi'], - optional: true - } - this.inputs = [ - { - label: 'Folder Path', - name: 'folderPath', - type: 'string', - placeholder: '' - }, - { - label: 'Unstructured API URL', - name: 'unstructuredAPIUrl', - description: - 'Unstructured API URL. Read more on how to get started', - type: 'string', - placeholder: process.env.UNSTRUCTURED_API_URL || 'http://localhost:8000/general/v0/general', - optional: !!process.env.UNSTRUCTURED_API_URL - }, - { - label: 'Strategy', - name: 'strategy', - description: 'The strategy to use for partitioning PDF/image. Options are fast, hi_res, auto. Default: auto.', - type: 'options', - options: [ - { - label: 'Hi-Res', - name: 'hi_res' - }, - { - label: 'Fast', - name: 'fast' - }, - { - label: 'OCR Only', - name: 'ocr_only' - }, - { - label: 'Auto', - name: 'auto' - } - ], - optional: true, - additionalParams: true, - default: 'auto' - }, - { - label: 'Encoding', - name: 'encoding', - description: 'The encoding method used to decode the text input. Default: utf-8.', - type: 'string', - optional: true, - additionalParams: true, - default: 'utf-8' - }, - { - label: 'Skip Infer Table Types', - name: 'skipInferTableTypes', - description: 'The document types that you want to skip table extraction with. Default: pdf, jpg, png.', - type: 'multiOptions', - options: [ - { - label: 'doc', - name: 'doc' - }, - { - label: 'docx', - name: 'docx' - }, - { - label: 'eml', - name: 'eml' - }, - { - label: 'epub', - name: 'epub' - }, - { - label: 'heic', - name: 'heic' - }, - { - label: 'htm', - name: 'htm' - }, - { - label: 'html', - name: 'html' - }, - { - label: 'jpeg', - name: 'jpeg' - }, - { - label: 'jpg', - name: 'jpg' - }, - { - label: 'md', - name: 'md' - }, - { - label: 'msg', - name: 'msg' - }, - { - label: 'odt', - name: 'odt' - }, - { - label: 'pdf', - name: 'pdf' - }, - { - label: 'png', - name: 'png' - }, - { - label: 'ppt', - name: 'ppt' - }, - { - label: 'pptx', - name: 'pptx' - }, - { - label: 'rtf', - name: 'rtf' - }, - { - label: 'text', - name: 'text' - }, - { - label: 'txt', - name: 'txt' - }, - { - label: 'xls', - name: 'xls' - }, - { - label: 'xlsx', - name: 'xlsx' - } - ], - optional: true, - additionalParams: true, - default: '["pdf", "jpg", "png"]' - }, - { - label: 'Hi-Res Model Name', - name: 'hiResModelName', - description: 'The name of the inference model used when strategy is hi_res. Default: detectron2_onnx.', - type: 'options', - options: [ - { - label: 'chipper', - name: 'chipper', - description: - 'Exlusive to Unstructured hosted API. The Chipper model is Unstructured in-house image-to-text model based on transformer-based Visual Document Understanding (VDU) models.' - }, - { - label: 'detectron2_onnx', - name: 'detectron2_onnx', - description: - 'A Computer Vision model by Facebook AI that provides object detection and segmentation algorithms with ONNX Runtime. It is the fastest model with the hi_res strategy.' - }, - { - label: 'yolox', - name: 'yolox', - description: 'A single-stage real-time object detector that modifies YOLOv3 with a DarkNet53 backbone.' - }, - { - label: 'yolox_quantized', - name: 'yolox_quantized', - description: 'Runs faster than YoloX and its speed is closer to Detectron2.' - } - ], - optional: true, - additionalParams: true, - default: 'detectron2_onnx' - }, - { - label: 'Chunking Strategy', - name: 'chunkingStrategy', - description: - 'Use one of the supported strategies to chunk the returned elements. When omitted, no chunking is performed and any other chunking parameters provided are ignored. Default: by_title', - type: 'options', - options: [ - { - label: 'None', - name: 'None' - }, - { - label: 'By Title', - name: 'by_title' - } - ], - optional: true, - additionalParams: true, - default: 'by_title' - }, - { - label: 'OCR Languages', - name: 'ocrLanguages', - description: 'The languages to use for OCR. Note: Being depricated as languages is the new type. Pending langchain update.', - type: 'multiOptions', - options: [ - { - label: 'English', - name: 'eng' - }, - { - label: 'Spanish (Español)', - name: 'spa' - }, - { - label: 'Mandarin Chinese (普通话)', - name: 'cmn' - }, - { - label: 'Hindi (हिन्दी)', - name: 'hin' - }, - { - label: 'Arabic (اَلْعَرَبِيَّةُ)', - name: 'ara' - }, - { - label: 'Portuguese (Português)', - name: 'por' - }, - { - label: 'Bengali (বাংলা)', - name: 'ben' - }, - { - label: 'Russian (Русский)', - name: 'rus' - }, - { - label: 'Japanese (日本語)', - name: 'jpn' - }, - { - label: 'Punjabi (ਪੰਜਾਬੀ)', - name: 'pan' - }, - { - label: 'German (Deutsch)', - name: 'deu' - }, - { - label: 'Korean (한국어)', - name: 'kor' - }, - { - label: 'French (Français)', - name: 'fra' - }, - { - label: 'Italian (Italiano)', - name: 'ita' - }, - { - label: 'Vietnamese (Tiếng Việt)', - name: 'vie' - } - ], - optional: true, - additionalParams: true - }, - { - label: 'Source ID Key', - name: 'sourceIdKey', - type: 'string', - description: - 'Key used to get the true source of document, to be compared against the record. Document metadata must contain the Source ID Key.', - default: 'source', - placeholder: 'source', - optional: true, - additionalParams: true - }, - { - label: 'Coordinates', - name: 'coordinates', - type: 'boolean', - description: 'If true, return coordinates for each element. Default: false.', - optional: true, - additionalParams: true, - default: false - }, - { - label: 'Include Page Breaks', - name: 'includePageBreaks', - description: 'When true, the output will include page break elements when the filetype supports it.', - type: 'boolean', - optional: true, - additionalParams: true - }, - { - label: 'XML Keep Tags', - name: 'xmlKeepTags', - description: 'Whether to keep XML tags in the output.', - type: 'boolean', - optional: true, - additionalParams: true - }, - { - label: 'Multi-Page Sections', - name: 'multiPageSections', - description: 'Whether to treat multi-page documents as separate sections.', - type: 'boolean', - optional: true, - additionalParams: true - }, - { - label: 'Combine Under N Chars', - name: 'combineUnderNChars', - description: - "If chunking strategy is set, combine elements until a section reaches a length of n chars. Default: value of max_characters. Can't exceed value of max_characters.", - type: 'number', - optional: true, - additionalParams: true - }, - { - label: 'New After N Chars', - name: 'newAfterNChars', - description: - "If chunking strategy is set, cut off new sections after reaching a length of n chars (soft max). value of max_characters. Can't exceed value of max_characters.", - type: 'number', - optional: true, - additionalParams: true - }, - { - label: 'Max Characters', - name: 'maxCharacters', - description: - 'If chunking strategy is set, cut off new sections after reaching a length of n chars (hard max). Default: 500', - type: 'number', - optional: true, - additionalParams: true, - default: '500' - }, - { - label: 'Additional Metadata', - name: 'metadata', - type: 'json', - description: 'Additional metadata to be added to the extracted documents', - optional: true, - additionalParams: true - }, - { - label: 'Omit Metadata Keys', - name: 'omitMetadataKeys', - type: 'string', - rows: 4, - description: - 'Each document loader comes with a default set of metadata keys that are extracted from the document. You can use this field to omit some of the default metadata keys. The value should be a list of keys, seperated by comma. Use * to omit all metadata keys execept the ones you specify in the Additional Metadata field', - placeholder: 'key1, key2, key3.nestedKey1', - optional: true, - additionalParams: true - } - ] - this.outputs = [ - { - label: 'Document', - name: 'document', - description: 'Array of document objects containing metadata and pageContent', - baseClasses: [...this.baseClasses, 'json'] - }, - { - label: 'Text', - name: 'text', - description: 'Concatenated string from pageContent of documents', - baseClasses: ['string', 'json'] - } - ] - } - - async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { - const folderPath = nodeData.inputs?.folderPath as string - const unstructuredAPIUrl = nodeData.inputs?.unstructuredAPIUrl as string - const strategy = nodeData.inputs?.strategy as UnstructuredLoaderStrategy - const encoding = nodeData.inputs?.encoding as string - const coordinates = nodeData.inputs?.coordinates as boolean - const skipInferTableTypes = nodeData.inputs?.skipInferTableTypes - ? JSON.parse(nodeData.inputs?.skipInferTableTypes as string) - : ([] as SkipInferTableTypes[]) - const hiResModelName = nodeData.inputs?.hiResModelName as HiResModelName - const includePageBreaks = nodeData.inputs?.includePageBreaks as boolean - const chunkingStrategy = nodeData.inputs?.chunkingStrategy as 'None' | 'by_title' - const metadata = nodeData.inputs?.metadata - const sourceIdKey = (nodeData.inputs?.sourceIdKey as string) || 'source' - const ocrLanguages = nodeData.inputs?.ocrLanguages ? JSON.parse(nodeData.inputs?.ocrLanguages as string) : ([] as string[]) - const xmlKeepTags = nodeData.inputs?.xmlKeepTags as boolean - const multiPageSections = nodeData.inputs?.multiPageSections as boolean - const combineUnderNChars = nodeData.inputs?.combineUnderNChars as number - const newAfterNChars = nodeData.inputs?.newAfterNChars as number - const maxCharacters = nodeData.inputs?.maxCharacters as number - const _omitMetadataKeys = nodeData.inputs?.omitMetadataKeys as string - const output = nodeData.outputs?.output as string - - let omitMetadataKeys: string[] = [] - if (_omitMetadataKeys) { - omitMetadataKeys = _omitMetadataKeys.split(',').map((key) => key.trim()) - } - - const obj: UnstructuredLoaderOptions = { - apiUrl: unstructuredAPIUrl, - strategy, - encoding, - coordinates, - skipInferTableTypes, - hiResModelName, - includePageBreaks, - chunkingStrategy, - ocrLanguages, - xmlKeepTags, - multiPageSections, - combineUnderNChars, - newAfterNChars, - maxCharacters - } - - const credentialData = await getCredentialData(nodeData.credential ?? '', options) - const unstructuredAPIKey = getCredentialParam('unstructuredAPIKey', credentialData, nodeData) - if (unstructuredAPIKey) obj.apiKey = unstructuredAPIKey - - const loader = new UnstructuredDirectoryLoader(folderPath, obj) - let docs = await loader.load() - - if (metadata) { - const parsedMetadata = typeof metadata === 'object' ? metadata : JSON.parse(metadata) - docs = docs.map((doc) => ({ - ...doc, - metadata: - _omitMetadataKeys === '*' - ? { - ...parsedMetadata - } - : omit( - { - ...doc.metadata, - ...parsedMetadata, - [sourceIdKey]: doc.metadata[sourceIdKey] || sourceIdKey - }, - omitMetadataKeys - ) - })) - } else { - docs = docs.map((doc) => ({ - ...doc, - metadata: - _omitMetadataKeys === '*' - ? {} - : omit( - { - ...doc.metadata, - [sourceIdKey]: doc.metadata[sourceIdKey] || sourceIdKey - }, - omitMetadataKeys - ) - })) - } - - if (output === 'document') { - return docs - } else { - let finaltext = '' - for (const doc of docs) { - finaltext += `${doc.pageContent}\n` - } - return handleEscapeCharacters(finaltext, false) - } - } -} - -module.exports = { nodeClass: UnstructuredFolder_DocumentLoaders } -*/ diff --git a/packages/components/nodes/embeddings/AWSBedrockEmbedding/AWSBedrockEmbedding.ts b/packages/components/nodes/embeddings/AWSBedrockEmbedding/AWSBedrockEmbedding.ts index dfc4e61a141..a355c1bfbd6 100644 --- a/packages/components/nodes/embeddings/AWSBedrockEmbedding/AWSBedrockEmbedding.ts +++ b/packages/components/nodes/embeddings/AWSBedrockEmbedding/AWSBedrockEmbedding.ts @@ -1,5 +1,5 @@ import { BedrockRuntimeClient, InvokeModelCommand } from '@aws-sdk/client-bedrock-runtime' -import { BedrockEmbeddings, BedrockEmbeddingsParams } from '@langchain/community/embeddings/bedrock' +import { BedrockEmbeddings, BedrockEmbeddingsParams } from '@langchain/aws' import { ICommonObject, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { getAWSCredentialConfig } from '../../../src/awsToolsUtils' @@ -18,7 +18,7 @@ class AWSBedrockEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'AWS Bedrock Embeddings' + this.label = 'AWS Bedrock Embedding' this.name = 'AWSBedrockEmbeddings' this.version = 5.0 this.type = 'AWSBedrockEmbeddings' diff --git a/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts b/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts index 6e4b747b4b4..d7f90c67421 100644 --- a/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts +++ b/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts @@ -21,7 +21,7 @@ class AzureOpenAIEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'Azure OpenAI Embeddings' + this.label = 'Azure OpenAI Embedding' this.name = 'azureOpenAIEmbeddings' this.version = 2.0 this.type = 'AzureOpenAIEmbeddings' @@ -53,17 +53,19 @@ class AzureOpenAIEmbedding_Embeddings implements INode { additionalParams: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', additionalParams: true }, { - label: 'BaseOptions', + label: 'Base Options', name: 'baseOptions', type: 'json', optional: true, + description: 'Default headers to include with every request to the API.', additionalParams: true } ] diff --git a/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts b/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts index af7fbad5b14..603d99de329 100644 --- a/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts +++ b/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts @@ -16,7 +16,7 @@ class CohereEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'Cohere Embeddings' + this.label = 'Cohere Embedding' this.name = 'cohereEmbeddings' this.version = 3.0 this.type = 'CohereEmbeddings' diff --git a/packages/components/nodes/embeddings/GoogleGenerativeAIEmbedding/GoogleGenerativeAIEmbedding.ts b/packages/components/nodes/embeddings/GoogleGenerativeAIEmbedding/GoogleGenerativeAIEmbedding.ts index f4d6d0f04dd..9a82fc072a9 100644 --- a/packages/components/nodes/embeddings/GoogleGenerativeAIEmbedding/GoogleGenerativeAIEmbedding.ts +++ b/packages/components/nodes/embeddings/GoogleGenerativeAIEmbedding/GoogleGenerativeAIEmbedding.ts @@ -36,7 +36,7 @@ class GoogleGenerativeAIEmbedding_Embeddings implements INode { credential: INodeParams constructor() { - this.label = 'GoogleGenerativeAI Embeddings' + this.label = 'Google Gemini Embedding' this.name = 'googleGenerativeAiEmbeddings' this.version = 2.0 this.type = 'GoogleGenerativeAiEmbeddings' diff --git a/packages/components/nodes/embeddings/GoogleVertexAIEmbedding/GoogleVertexAIEmbedding.ts b/packages/components/nodes/embeddings/GoogleVertexAIEmbedding/GoogleVertexAIEmbedding.ts index 1744ff24116..32bc2c4b13a 100644 --- a/packages/components/nodes/embeddings/GoogleVertexAIEmbedding/GoogleVertexAIEmbedding.ts +++ b/packages/components/nodes/embeddings/GoogleVertexAIEmbedding/GoogleVertexAIEmbedding.ts @@ -36,7 +36,7 @@ class GoogleVertexAIEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'GoogleVertexAI Embeddings' + this.label = 'Google VertexAI Embedding' this.name = 'googlevertexaiEmbeddings' this.version = 2.1 this.type = 'GoogleVertexAIEmbeddings' diff --git a/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts b/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts index 5768f1d951f..91d450ddf96 100644 --- a/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts +++ b/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts @@ -15,7 +15,7 @@ class HuggingFaceInferenceEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'HuggingFace Inference Embeddings' + this.label = 'HuggingFace Inference Embedding' this.name = 'huggingFaceInferenceEmbeddings' this.version = 1.0 this.type = 'HuggingFaceInferenceEmbeddings' diff --git a/packages/components/nodes/embeddings/IBMWatsonxEmbedding/IBMWatsonxEmbedding.ts b/packages/components/nodes/embeddings/IBMWatsonxEmbedding/IBMWatsonxEmbedding.ts index 45b0d628db0..9c1f18dd1b6 100644 --- a/packages/components/nodes/embeddings/IBMWatsonxEmbedding/IBMWatsonxEmbedding.ts +++ b/packages/components/nodes/embeddings/IBMWatsonxEmbedding/IBMWatsonxEmbedding.ts @@ -16,7 +16,7 @@ class IBMWatsonx_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'IBM Watsonx Embeddings' + this.label = 'IBM Watsonx Embedding' this.name = 'ibmEmbedding' this.version = 1.0 this.type = 'WatsonxEmbeddings' diff --git a/packages/components/nodes/embeddings/JinaAIEmbedding/JinaAIEmbedding.ts b/packages/components/nodes/embeddings/JinaAIEmbedding/JinaAIEmbedding.ts index bdb138f85ad..a183bd8e0b2 100644 --- a/packages/components/nodes/embeddings/JinaAIEmbedding/JinaAIEmbedding.ts +++ b/packages/components/nodes/embeddings/JinaAIEmbedding/JinaAIEmbedding.ts @@ -25,7 +25,7 @@ class JinaAIEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'Jina Embeddings' + this.label = 'Jina Embedding' this.name = 'jinaEmbeddings' this.version = 3.0 this.type = 'JinaEmbeddings' diff --git a/packages/components/nodes/embeddings/LocalAIEmbedding/LocalAIEmbedding.ts b/packages/components/nodes/embeddings/LocalAIEmbedding/LocalAIEmbedding.ts index ec2683c6173..472feba4bd8 100644 --- a/packages/components/nodes/embeddings/LocalAIEmbedding/LocalAIEmbedding.ts +++ b/packages/components/nodes/embeddings/LocalAIEmbedding/LocalAIEmbedding.ts @@ -15,7 +15,7 @@ class LocalAIEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'LocalAI Embeddings' + this.label = 'LocalAI Embedding' this.name = 'localAIEmbeddings' this.version = 1.0 this.type = 'LocalAI Embeddings' diff --git a/packages/components/nodes/embeddings/MistralEmbedding/MistralEmbedding.ts b/packages/components/nodes/embeddings/MistralEmbedding/MistralEmbedding.ts index f923e10b2c3..9fa50ea1158 100644 --- a/packages/components/nodes/embeddings/MistralEmbedding/MistralEmbedding.ts +++ b/packages/components/nodes/embeddings/MistralEmbedding/MistralEmbedding.ts @@ -16,7 +16,7 @@ class MistralEmbedding_Embeddings implements INode { credential: INodeParams constructor() { - this.label = 'MistralAI Embeddings' + this.label = 'MistralAI Embedding' this.name = 'mistralAIEmbeddings' this.version = 2.0 this.type = 'MistralAIEmbeddings' diff --git a/packages/components/nodes/embeddings/OllamaEmbedding/OllamaEmbedding.ts b/packages/components/nodes/embeddings/OllamaEmbedding/OllamaEmbedding.ts index 17b6c4fafd2..bf85de72b08 100644 --- a/packages/components/nodes/embeddings/OllamaEmbedding/OllamaEmbedding.ts +++ b/packages/components/nodes/embeddings/OllamaEmbedding/OllamaEmbedding.ts @@ -15,7 +15,7 @@ class OllamaEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'Ollama Embeddings' + this.label = 'Ollama Embedding' this.name = 'ollamaEmbedding' this.version = 2.0 this.type = 'OllamaEmbeddings' diff --git a/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts b/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts index f11171812a1..767b15b9756 100644 --- a/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts +++ b/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts @@ -16,7 +16,7 @@ class OpenAIEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'OpenAI Embeddings' + this.label = 'OpenAI Embedding' this.name = 'openAIEmbeddings' this.version = 4.0 this.type = 'OpenAIEmbeddings' @@ -60,10 +60,19 @@ class OpenAIEmbedding_Embeddings implements INode { additionalParams: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', + additionalParams: true + }, + { + label: 'Base Options', + name: 'baseOptions', + type: 'json', + optional: true, + description: 'Default headers to include with every request to the API.', additionalParams: true }, { @@ -72,6 +81,23 @@ class OpenAIEmbedding_Embeddings implements INode { type: 'number', optional: true, additionalParams: true + }, + { + label: 'Encoding Format', + name: 'encodingFormat', + type: 'options', + options: [ + { + label: 'float', + name: 'float' + }, + { + label: 'base64', + name: 'base64' + } + ], + optional: true, + additionalParams: true } ] } @@ -88,8 +114,10 @@ class OpenAIEmbedding_Embeddings implements INode { const batchSize = nodeData.inputs?.batchSize as string const timeout = nodeData.inputs?.timeout as string const basePath = nodeData.inputs?.basepath as string + const baseOptions = nodeData.inputs?.baseOptions const modelName = nodeData.inputs?.modelName as string const dimensions = nodeData.inputs?.dimensions as string + const encodingFormat = nodeData.inputs?.encodingFormat as 'float' | 'base64' | undefined if (nodeData.inputs?.credentialId) { nodeData.credential = nodeData.inputs?.credentialId @@ -106,10 +134,22 @@ class OpenAIEmbedding_Embeddings implements INode { if (batchSize) obj.batchSize = parseInt(batchSize, 10) if (timeout) obj.timeout = parseInt(timeout, 10) if (dimensions) obj.dimensions = parseInt(dimensions, 10) + if (encodingFormat) obj.encodingFormat = encodingFormat + + let parsedBaseOptions: any | undefined = undefined + + if (baseOptions) { + try { + parsedBaseOptions = typeof baseOptions === 'object' ? baseOptions : JSON.parse(baseOptions) + } catch (exception) { + throw new Error("Invalid JSON in the OpenAIEmbedding's BaseOptions: " + exception) + } + } - if (basePath) { + if (basePath || parsedBaseOptions) { obj.configuration = { - baseURL: basePath + baseURL: basePath, + defaultHeaders: parsedBaseOptions } } diff --git a/packages/components/nodes/embeddings/OpenAIEmbeddingCustom/OpenAIEmbeddingCustom.ts b/packages/components/nodes/embeddings/OpenAIEmbeddingCustom/OpenAIEmbeddingCustom.ts index d0e65a012a6..8e23108ee67 100644 --- a/packages/components/nodes/embeddings/OpenAIEmbeddingCustom/OpenAIEmbeddingCustom.ts +++ b/packages/components/nodes/embeddings/OpenAIEmbeddingCustom/OpenAIEmbeddingCustom.ts @@ -15,7 +15,7 @@ class OpenAIEmbeddingCustom_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'OpenAI Embeddings Custom' + this.label = 'OpenAI Custom Embedding' this.name = 'openAIEmbeddingsCustom' this.version = 3.0 this.type = 'OpenAIEmbeddingsCustom' @@ -52,17 +52,19 @@ class OpenAIEmbeddingCustom_Embeddings implements INode { additionalParams: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', additionalParams: true }, { - label: 'BaseOptions', + label: 'Base Options', name: 'baseOptions', type: 'json', optional: true, + description: 'Default headers to include with every request to the API.', additionalParams: true }, { @@ -77,6 +79,23 @@ class OpenAIEmbeddingCustom_Embeddings implements INode { type: 'number', optional: true, additionalParams: true + }, + { + label: 'Encoding Format', + name: 'encodingFormat', + type: 'options', + options: [ + { + label: 'float', + name: 'float' + }, + { + label: 'base64', + name: 'base64' + } + ], + optional: true, + additionalParams: true } ] } @@ -89,6 +108,7 @@ class OpenAIEmbeddingCustom_Embeddings implements INode { const modelName = nodeData.inputs?.modelName as string const dimensions = nodeData.inputs?.dimensions as string const baseOptions = nodeData.inputs?.baseOptions + const encodingFormat = nodeData.inputs?.encodingFormat as 'float' | 'base64' | undefined const credentialData = await getCredentialData(nodeData.credential ?? '', options) const openAIApiKey = getCredentialParam('openAIApiKey', credentialData, nodeData) @@ -102,6 +122,7 @@ class OpenAIEmbeddingCustom_Embeddings implements INode { if (timeout) obj.timeout = parseInt(timeout, 10) if (modelName) obj.modelName = modelName if (dimensions) obj.dimensions = parseInt(dimensions, 10) + if (encodingFormat) obj.encodingFormat = encodingFormat let parsedBaseOptions: any | undefined = undefined if (baseOptions) { diff --git a/packages/components/nodes/embeddings/TogetherAIEmbedding/TogetherAIEmbedding.ts b/packages/components/nodes/embeddings/TogetherAIEmbedding/TogetherAIEmbedding.ts index 38c65d3c5f3..2d04b24b55d 100644 --- a/packages/components/nodes/embeddings/TogetherAIEmbedding/TogetherAIEmbedding.ts +++ b/packages/components/nodes/embeddings/TogetherAIEmbedding/TogetherAIEmbedding.ts @@ -15,7 +15,7 @@ class TogetherAIEmbedding_Embeddings implements INode { credential: INodeParams constructor() { - this.label = 'TogetherAIEmbedding' + this.label = 'TogetherAI Embedding' this.name = 'togetherAIEmbedding' this.version = 1.0 this.type = 'TogetherAIEmbedding' diff --git a/packages/components/nodes/embeddings/VoyageAIEmbedding/VoyageAIEmbedding.ts b/packages/components/nodes/embeddings/VoyageAIEmbedding/VoyageAIEmbedding.ts index 5267a01a6fa..1d258875b43 100644 --- a/packages/components/nodes/embeddings/VoyageAIEmbedding/VoyageAIEmbedding.ts +++ b/packages/components/nodes/embeddings/VoyageAIEmbedding/VoyageAIEmbedding.ts @@ -16,7 +16,7 @@ class VoyageAIEmbedding_Embeddings implements INode { inputs: INodeParams[] constructor() { - this.label = 'VoyageAI Embeddings' + this.label = 'VoyageAI Embedding' this.name = 'voyageAIEmbeddings' this.version = 2.0 this.type = 'VoyageAIEmbeddings' diff --git a/packages/components/nodes/llms/AWSBedrock/AWSBedrock.ts b/packages/components/nodes/llms/AWSBedrock/AWSBedrock.ts index 6bd7790e0e4..1811ffcf1ba 100644 --- a/packages/components/nodes/llms/AWSBedrock/AWSBedrock.ts +++ b/packages/components/nodes/llms/AWSBedrock/AWSBedrock.ts @@ -21,6 +21,8 @@ class AWSBedrock_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'AWS Bedrock' @@ -30,6 +32,8 @@ class AWSBedrock_LLMs implements INode { this.icon = 'aws.svg' this.category = 'LLMs' this.description = 'Wrapper around AWS Bedrock large language models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use AWS Bedrock Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(Bedrock)] this.credential = { label: 'AWS Credential', diff --git a/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts b/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts index 86689d23485..022173f6326 100644 --- a/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts +++ b/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts @@ -22,6 +22,8 @@ class AzureOpenAI_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'Azure OpenAI' @@ -31,6 +33,8 @@ class AzureOpenAI_LLMs implements INode { this.icon = 'Azure.svg' this.category = 'LLMs' this.description = 'Wrapper around Azure OpenAI large language models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use Azure OpenAI Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(AzureOpenAI)] this.credential = { label: 'Connect Credential', @@ -110,10 +114,11 @@ class AzureOpenAI_LLMs implements INode { additionalParams: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', additionalParams: true } ] @@ -165,7 +170,7 @@ class AzureOpenAI_LLMs implements INode { if (cache) obj.cache = cache if (basePath) obj.azureOpenAIBasePath = basePath - const model = new AzureOpenAI(obj) + const model = new AzureOpenAI(obj as ConstructorParameters[0]) return model } } diff --git a/packages/components/nodes/llms/Cohere/Cohere.ts b/packages/components/nodes/llms/Cohere/Cohere.ts index 0b5f7a0e6b1..cb443138537 100644 --- a/packages/components/nodes/llms/Cohere/Cohere.ts +++ b/packages/components/nodes/llms/Cohere/Cohere.ts @@ -15,6 +15,8 @@ class Cohere_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'Cohere' @@ -24,6 +26,8 @@ class Cohere_LLMs implements INode { this.icon = 'Cohere.svg' this.category = 'LLMs' this.description = 'Wrapper around Cohere large language models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use Cohere Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(Cohere)] this.credential = { label: 'Connect Credential', diff --git a/packages/components/nodes/llms/Fireworks/Fireworks.ts b/packages/components/nodes/llms/Fireworks/Fireworks.ts index 9d1c1791a44..7737e50c1c4 100644 --- a/packages/components/nodes/llms/Fireworks/Fireworks.ts +++ b/packages/components/nodes/llms/Fireworks/Fireworks.ts @@ -13,6 +13,8 @@ class Fireworks_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'Fireworks' @@ -22,6 +24,8 @@ class Fireworks_LLMs implements INode { this.icon = 'fireworks.png' this.category = 'LLMs' this.description = 'Wrapper around Fireworks API for large language models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use Fireworks Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(Fireworks)] this.credential = { label: 'Connect Credential', diff --git a/packages/components/nodes/llms/GoogleVertexAI/GoogleVertexAI.ts b/packages/components/nodes/llms/GoogleVertexAI/GoogleVertexAI.ts index 273ce81b9eb..6c2dd616549 100644 --- a/packages/components/nodes/llms/GoogleVertexAI/GoogleVertexAI.ts +++ b/packages/components/nodes/llms/GoogleVertexAI/GoogleVertexAI.ts @@ -16,6 +16,8 @@ class GoogleVertexAI_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'GoogleVertexAI' @@ -25,6 +27,8 @@ class GoogleVertexAI_LLMs implements INode { this.icon = 'GoogleVertex.svg' this.category = 'LLMs' this.description = 'Wrapper around GoogleVertexAI large language models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use GoogleVertexAI Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(VertexAI)] this.credential = { label: 'Connect Credential', diff --git a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts index 92d9d723dd7..335220469c7 100644 --- a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts +++ b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts @@ -14,6 +14,8 @@ class HuggingFaceInference_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'HuggingFace Inference' @@ -23,6 +25,8 @@ class HuggingFaceInference_LLMs implements INode { this.icon = 'HuggingFace.svg' this.category = 'LLMs' this.description = 'Wrapper around HuggingFace large language models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use HuggingFace Inference Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(HuggingFaceInference)] this.credential = { label: 'Connect Credential', diff --git a/packages/components/nodes/llms/IBMWatsonx/IBMWatsonx.ts b/packages/components/nodes/llms/IBMWatsonx/IBMWatsonx.ts index 8d138eb2592..6899a0cab6f 100644 --- a/packages/components/nodes/llms/IBMWatsonx/IBMWatsonx.ts +++ b/packages/components/nodes/llms/IBMWatsonx/IBMWatsonx.ts @@ -15,6 +15,8 @@ class IBMWatsonx_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'IBMWatsonx' @@ -24,6 +26,8 @@ class IBMWatsonx_LLMs implements INode { this.icon = 'ibm.png' this.category = 'LLMs' this.description = 'Wrapper around IBM watsonx.ai foundation models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use IBM Watsonx Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(WatsonxLLM)] this.credential = { label: 'Connect Credential', diff --git a/packages/components/nodes/llms/Ollama/Ollama.ts b/packages/components/nodes/llms/Ollama/Ollama.ts index e87d08a1161..c40fce41c48 100644 --- a/packages/components/nodes/llms/Ollama/Ollama.ts +++ b/packages/components/nodes/llms/Ollama/Ollama.ts @@ -1,4 +1,4 @@ -import { Ollama, OllamaInput } from '@langchain/community/llms/ollama' +import { Ollama, OllamaInput } from '@langchain/ollama' import { BaseCache } from '@langchain/core/caches' import { BaseLLMParams } from '@langchain/core/language_models/llms' import { INode, INodeData, INodeParams } from '../../../src/Interface' @@ -15,15 +15,19 @@ class Ollama_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'Ollama' this.name = 'ollama' - this.version = 2.0 + this.version = 2.1 this.type = 'Ollama' this.icon = 'Ollama.svg' this.category = 'LLMs' this.description = 'Wrapper around open source large language models on Ollama' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use Ollama Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(Ollama)] this.inputs = [ { @@ -114,16 +118,6 @@ class Ollama_LLMs implements INode { optional: true, additionalParams: true }, - { - label: 'Number of GQA groups', - name: 'numGqa', - type: 'number', - description: - 'The number of GQA groups in the transformer layer. Required for some models, for example it is 8 for llama2:70b. Refer to docs for more details', - step: 1, - optional: true, - additionalParams: true - }, { label: 'Number of GPU', name: 'numGpu', @@ -198,7 +192,6 @@ class Ollama_LLMs implements INode { const mirostatEta = nodeData.inputs?.mirostatEta as string const mirostatTau = nodeData.inputs?.mirostatTau as string const numCtx = nodeData.inputs?.numCtx as string - const numGqa = nodeData.inputs?.numGqa as string const numGpu = nodeData.inputs?.numGpu as string const numThread = nodeData.inputs?.numThread as string const repeatLastN = nodeData.inputs?.repeatLastN as string @@ -220,7 +213,6 @@ class Ollama_LLMs implements INode { if (mirostatEta) obj.mirostatEta = parseFloat(mirostatEta) if (mirostatTau) obj.mirostatTau = parseFloat(mirostatTau) if (numCtx) obj.numCtx = parseFloat(numCtx) - if (numGqa) obj.numGqa = parseFloat(numGqa) if (numGpu) obj.numGpu = parseFloat(numGpu) if (numThread) obj.numThread = parseFloat(numThread) if (repeatLastN) obj.repeatLastN = parseFloat(repeatLastN) diff --git a/packages/components/nodes/llms/OpenAI/OpenAI.ts b/packages/components/nodes/llms/OpenAI/OpenAI.ts index 06b237c01eb..55aa7dc7287 100644 --- a/packages/components/nodes/llms/OpenAI/OpenAI.ts +++ b/packages/components/nodes/llms/OpenAI/OpenAI.ts @@ -16,6 +16,8 @@ class OpenAI_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'OpenAI' @@ -25,6 +27,8 @@ class OpenAI_LLMs implements INode { this.icon = 'openai.svg' this.category = 'LLMs' this.description = 'Wrapper around OpenAI large language models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use OpenAI Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(OpenAI)] this.credential = { label: 'Connect Credential', @@ -111,17 +115,19 @@ class OpenAI_LLMs implements INode { additionalParams: true }, { - label: 'BasePath', + label: 'Base Path', name: 'basepath', type: 'string', optional: true, + description: 'Override the default base URL for the API, e.g., "https://api.example.com/v2/', additionalParams: true }, { - label: 'BaseOptions', + label: 'Base Options', name: 'baseOptions', type: 'json', optional: true, + description: 'Default headers to include with every request to the API.', additionalParams: true } ] diff --git a/packages/components/nodes/llms/SambaNova/Sambanova.ts b/packages/components/nodes/llms/SambaNova/Sambanova.ts index 4cb76aefa76..0eda5771ff8 100644 --- a/packages/components/nodes/llms/SambaNova/Sambanova.ts +++ b/packages/components/nodes/llms/SambaNova/Sambanova.ts @@ -13,6 +13,8 @@ class Sambanova_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'Sambanova' @@ -22,6 +24,8 @@ class Sambanova_LLMs implements INode { this.icon = 'sambanova.png' this.category = 'LLMs' this.description = 'Wrapper around Sambanova API for large language models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use Sambanova Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(OpenAI)] this.credential = { label: 'Connect Credential', diff --git a/packages/components/nodes/llms/TogetherAI/TogetherAI.ts b/packages/components/nodes/llms/TogetherAI/TogetherAI.ts index 3849328cab0..21f01dbbd76 100644 --- a/packages/components/nodes/llms/TogetherAI/TogetherAI.ts +++ b/packages/components/nodes/llms/TogetherAI/TogetherAI.ts @@ -15,6 +15,8 @@ class TogetherAI_LLMs implements INode { baseClasses: string[] credential: INodeParams inputs: INodeParams[] + badge: string + deprecateMessage: string constructor() { this.label = 'TogetherAI' @@ -24,6 +26,8 @@ class TogetherAI_LLMs implements INode { this.icon = 'togetherai.png' this.category = 'LLMs' this.description = 'Wrapper around TogetherAI large language models' + this.badge = 'DEPRECATING' + this.deprecateMessage = 'Use TogetherAI Chat Models instead' this.baseClasses = [this.type, ...getBaseClasses(TogetherAI)] this.credential = { label: 'Connect Credential', diff --git a/packages/components/nodes/memory/BufferMemory/BufferMemory.ts b/packages/components/nodes/memory/BufferMemory/BufferMemory.ts index 1a46e0d3ce6..db08405a5e1 100644 --- a/packages/components/nodes/memory/BufferMemory/BufferMemory.ts +++ b/packages/components/nodes/memory/BufferMemory/BufferMemory.ts @@ -9,7 +9,7 @@ import { MemoryMethods } from '../../../src/Interface' import { getBaseClasses, mapChatMessageToBaseMessage } from '../../../src/utils' -import { BufferMemory, BufferMemoryInput } from 'langchain/memory' +import { BufferMemory, BufferMemoryInput } from '@langchain/classic/memory' import { BaseMessage } from '@langchain/core/messages' import { DataSource } from 'typeorm' diff --git a/packages/components/nodes/memory/BufferWindowMemory/BufferWindowMemory.ts b/packages/components/nodes/memory/BufferWindowMemory/BufferWindowMemory.ts index e63e106264f..0fd30c7a948 100644 --- a/packages/components/nodes/memory/BufferWindowMemory/BufferWindowMemory.ts +++ b/packages/components/nodes/memory/BufferWindowMemory/BufferWindowMemory.ts @@ -9,7 +9,7 @@ import { MemoryMethods } from '../../../src/Interface' import { getBaseClasses, mapChatMessageToBaseMessage } from '../../../src/utils' -import { BufferWindowMemory, BufferWindowMemoryInput } from 'langchain/memory' +import { BufferWindowMemory, BufferWindowMemoryInput } from '@langchain/classic/memory' import { BaseMessage } from '@langchain/core/messages' import { DataSource } from 'typeorm' diff --git a/packages/components/nodes/memory/ConversationSummaryBufferMemory/ConversationSummaryBufferMemory.ts b/packages/components/nodes/memory/ConversationSummaryBufferMemory/ConversationSummaryBufferMemory.ts index f8d3c00f0cc..d41b95a32cf 100644 --- a/packages/components/nodes/memory/ConversationSummaryBufferMemory/ConversationSummaryBufferMemory.ts +++ b/packages/components/nodes/memory/ConversationSummaryBufferMemory/ConversationSummaryBufferMemory.ts @@ -11,7 +11,7 @@ import { import { getBaseClasses, mapChatMessageToBaseMessage } from '../../../src/utils' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { BaseMessage, getBufferString, HumanMessage } from '@langchain/core/messages' -import { ConversationSummaryBufferMemory, ConversationSummaryBufferMemoryInput } from 'langchain/memory' +import { ConversationSummaryBufferMemory, ConversationSummaryBufferMemoryInput } from '@langchain/classic/memory' import { DataSource } from 'typeorm' import { ChatAnthropic } from '../../chatmodels/ChatAnthropic/FlowiseChatAnthropic' diff --git a/packages/components/nodes/memory/ConversationSummaryMemory/ConversationSummaryMemory.ts b/packages/components/nodes/memory/ConversationSummaryMemory/ConversationSummaryMemory.ts index 44cb0902976..52aad4ba3c3 100644 --- a/packages/components/nodes/memory/ConversationSummaryMemory/ConversationSummaryMemory.ts +++ b/packages/components/nodes/memory/ConversationSummaryMemory/ConversationSummaryMemory.ts @@ -11,7 +11,7 @@ import { import { getBaseClasses, mapChatMessageToBaseMessage } from '../../../src/utils' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { BaseMessage, HumanMessage, SystemMessage } from '@langchain/core/messages' -import { ConversationSummaryMemory, ConversationSummaryMemoryInput } from 'langchain/memory' +import { ConversationSummaryMemory, ConversationSummaryMemoryInput } from '@langchain/classic/memory' import { DataSource } from 'typeorm' import { ChatAnthropic } from '../../chatmodels/ChatAnthropic/FlowiseChatAnthropic' diff --git a/packages/components/nodes/memory/DynamoDb/DynamoDb.ts b/packages/components/nodes/memory/DynamoDb/DynamoDb.ts index 91e4e7298bf..991ef61c76b 100644 --- a/packages/components/nodes/memory/DynamoDb/DynamoDb.ts +++ b/packages/components/nodes/memory/DynamoDb/DynamoDb.ts @@ -11,7 +11,7 @@ import { } from '@aws-sdk/client-dynamodb' import { DynamoDBChatMessageHistory } from '@langchain/community/stores/message/dynamodb' import { mapStoredMessageToChatMessage, AIMessage, HumanMessage, StoredMessage, BaseMessage } from '@langchain/core/messages' -import { BufferMemory, BufferMemoryInput } from 'langchain/memory' +import { BufferMemory, BufferMemoryInput } from '@langchain/classic/memory' import { convertBaseMessagetoIMessage, getBaseClasses, @@ -264,7 +264,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods { } })) .filter((x): x is StoredMessage => x.type !== undefined && x.data.content !== undefined) - const baseMessages = messages.map(mapStoredMessageToChatMessage) + const baseMessages: BaseMessage[] = messages.map(mapStoredMessageToChatMessage) if (prependMessages?.length) { baseMessages.unshift(...(await mapChatMessageToBaseMessage(prependMessages, this.orgId))) } diff --git a/packages/components/nodes/memory/MongoDBMemory/MongoDBMemory.ts b/packages/components/nodes/memory/MongoDBMemory/MongoDBMemory.ts index 0fad704ef00..3b123cd3e7b 100644 --- a/packages/components/nodes/memory/MongoDBMemory/MongoDBMemory.ts +++ b/packages/components/nodes/memory/MongoDBMemory/MongoDBMemory.ts @@ -1,5 +1,5 @@ import { MongoClient } from 'mongodb' -import { BufferMemory, BufferMemoryInput } from 'langchain/memory' +import { BufferMemory, BufferMemoryInput } from '@langchain/classic/memory' import { mapStoredMessageToChatMessage, AIMessage, HumanMessage, BaseMessage } from '@langchain/core/messages' import { convertBaseMessagetoIMessage, diff --git a/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts b/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts index 757cb68f2cf..9e14ebdcc10 100644 --- a/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts +++ b/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts @@ -1,5 +1,5 @@ import { Redis, RedisOptions } from 'ioredis' -import { BufferMemory, BufferMemoryInput } from 'langchain/memory' +import { BufferMemory, BufferMemoryInput } from '@langchain/classic/memory' import { mapStoredMessageToChatMessage, BaseMessage, AIMessage, HumanMessage } from '@langchain/core/messages' import { INode, INodeData, INodeParams, ICommonObject, MessageType, IMessage, MemoryMethods, FlowiseMemory } from '../../../src/Interface' import { @@ -168,7 +168,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods { const id = overrideSessionId ? overrideSessionId : this.sessionId const rawStoredMessages = await client.lrange(id, this.windowSize ? this.windowSize * -1 : 0, -1) const orderedMessages = rawStoredMessages.reverse().map((message) => JSON.parse(message)) - const baseMessages = orderedMessages.map(mapStoredMessageToChatMessage) + const baseMessages: BaseMessage[] = orderedMessages.map(mapStoredMessageToChatMessage) if (prependMessages?.length) { baseMessages.unshift(...(await mapChatMessageToBaseMessage(prependMessages, this.orgId))) } diff --git a/packages/components/nodes/memory/UpstashRedisBackedChatMemory/UpstashRedisBackedChatMemory.ts b/packages/components/nodes/memory/UpstashRedisBackedChatMemory/UpstashRedisBackedChatMemory.ts index 3dd7ea5026b..cd55000433c 100644 --- a/packages/components/nodes/memory/UpstashRedisBackedChatMemory/UpstashRedisBackedChatMemory.ts +++ b/packages/components/nodes/memory/UpstashRedisBackedChatMemory/UpstashRedisBackedChatMemory.ts @@ -1,5 +1,5 @@ import { Redis } from '@upstash/redis' -import { BufferMemory, BufferMemoryInput } from 'langchain/memory' +import { BufferMemory, BufferMemoryInput } from '@langchain/classic/memory' import { UpstashRedisChatMessageHistory } from '@langchain/community/stores/message/upstash_redis' import { mapStoredMessageToChatMessage, AIMessage, HumanMessage, StoredMessage, BaseMessage } from '@langchain/core/messages' import { FlowiseMemory, IMessage, INode, INodeData, INodeParams, MemoryMethods, MessageType } from '../../../src/Interface' @@ -145,7 +145,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods { const rawStoredMessages: StoredMessage[] = await this.redisClient.lrange(id, 0, -1) const orderedMessages = rawStoredMessages.reverse() const previousMessages = orderedMessages.filter((x): x is StoredMessage => x.type !== undefined && x.data.content !== undefined) - const baseMessages = previousMessages.map(mapStoredMessageToChatMessage) + const baseMessages: BaseMessage[] = previousMessages.map(mapStoredMessageToChatMessage) if (prependMessages?.length) { baseMessages.unshift(...(await mapChatMessageToBaseMessage(prependMessages, this.orgId))) } diff --git a/packages/components/nodes/memory/ZepMemory/ZepMemory.ts b/packages/components/nodes/memory/ZepMemory/ZepMemory.ts index a49d3eb4e31..6cac573edac 100644 --- a/packages/components/nodes/memory/ZepMemory/ZepMemory.ts +++ b/packages/components/nodes/memory/ZepMemory/ZepMemory.ts @@ -1,6 +1,6 @@ import { ZepMemory, ZepMemoryInput } from '@langchain/community/memory/zep' import { BaseMessage } from '@langchain/core/messages' -import { InputValues, MemoryVariables, OutputValues } from 'langchain/memory' +import { InputValues, MemoryVariables, OutputValues } from '@langchain/classic/memory' import { IMessage, INode, INodeData, INodeParams, MemoryMethods, MessageType, ICommonObject } from '../../../src/Interface' import { convertBaseMessagetoIMessage, diff --git a/packages/components/nodes/memory/ZepMemoryCloud/ZepMemoryCloud.ts b/packages/components/nodes/memory/ZepMemoryCloud/ZepMemoryCloud.ts index d6068b01ee7..6fa23fb5220 100644 --- a/packages/components/nodes/memory/ZepMemoryCloud/ZepMemoryCloud.ts +++ b/packages/components/nodes/memory/ZepMemoryCloud/ZepMemoryCloud.ts @@ -1,6 +1,6 @@ -import { ZepMemory, ZepMemoryInput } from '@getzep/zep-cloud/langchain' +import { ZepCloudMemory } from '@langchain/community/memory/zep_cloud' import { BaseMessage } from '@langchain/core/messages' -import { InputValues, MemoryVariables, OutputValues } from 'langchain/memory' +import { InputValues, MemoryVariables, OutputValues } from '@langchain/classic/memory' import { ICommonObject } from '../../../src' import { IMessage, INode, INodeData, INodeParams, MemoryMethods, MessageType } from '../../../src/Interface' import { @@ -11,6 +11,18 @@ import { mapChatMessageToBaseMessage } from '../../../src/utils' +interface ZepCloudMemoryInput { + apiKey: string + sessionId: string + aiPrefix?: string + humanPrefix?: string + memoryKey?: string + memoryType?: 'perpetual' | 'message_window' + returnMessages?: boolean + inputKey?: string + outputKey?: string +} + class ZepMemoryCloud_Memory implements INode { label: string name: string @@ -31,7 +43,7 @@ class ZepMemoryCloud_Memory implements INode { this.icon = 'zep.svg' this.category = 'Memory' this.description = 'Summarizes the conversation and stores the memory in zep server' - this.baseClasses = [this.type, ...getBaseClasses(ZepMemory)] + this.baseClasses = [this.type, ...getBaseClasses(ZepCloudMemory)] this.credential = { label: 'Connect Credential', name: 'credential', @@ -102,7 +114,7 @@ class ZepMemoryCloud_Memory implements INode { } } -const initializeZep = async (nodeData: INodeData, options: ICommonObject): Promise => { +const initializeZep = async (nodeData: INodeData, options: ICommonObject): Promise => { const aiPrefix = nodeData.inputs?.aiPrefix as string const humanPrefix = nodeData.inputs?.humanPrefix as string const memoryKey = nodeData.inputs?.memoryKey as string @@ -114,7 +126,7 @@ const initializeZep = async (nodeData: INodeData, options: ICommonObject): Promi const credentialData = await getCredentialData(nodeData.credential ?? '', options) const apiKey = getCredentialParam('apiKey', credentialData, nodeData) const orgId = options.orgId as string - const obj: ZepMemoryInput & ZepMemoryExtendedInput = { + const obj: ZepCloudMemoryInput & ZepMemoryExtendedInput = { apiKey, aiPrefix, humanPrefix, @@ -132,16 +144,18 @@ const initializeZep = async (nodeData: INodeData, options: ICommonObject): Promi interface ZepMemoryExtendedInput { memoryType?: 'perpetual' | 'message_window' orgId: string + inputKey?: string + returnMessages?: boolean } -class ZepMemoryExtended extends ZepMemory implements MemoryMethods { - memoryType: 'perpetual' | 'message_window' +class ZepMemoryExtended extends ZepCloudMemory implements MemoryMethods { orgId: string + declare inputKey: string - constructor(fields: ZepMemoryInput & ZepMemoryExtendedInput) { + constructor(fields: ZepCloudMemoryInput & ZepMemoryExtendedInput) { super(fields) - this.memoryType = fields.memoryType ?? 'perpetual' this.orgId = fields.orgId + this.inputKey = fields.inputKey ?? 'input' } async loadMemoryVariables(values: InputValues, overrideSessionId = ''): Promise { diff --git a/packages/components/nodes/moderation/OpenAIModeration/OpenAIModerationRunner.ts b/packages/components/nodes/moderation/OpenAIModeration/OpenAIModerationRunner.ts index 3a3ec550273..2db3aa89d80 100644 --- a/packages/components/nodes/moderation/OpenAIModeration/OpenAIModerationRunner.ts +++ b/packages/components/nodes/moderation/OpenAIModeration/OpenAIModerationRunner.ts @@ -1,5 +1,5 @@ import { Moderation } from '../Moderation' -import { OpenAIModerationChain } from 'langchain/chains' +import { OpenAIModerationChain } from '@langchain/classic/chains' export class OpenAIModerationRunner implements Moderation { private openAIApiKey = '' diff --git a/packages/components/nodes/moderation/SimplePromptModeration/SimplePromptModerationRunner.ts b/packages/components/nodes/moderation/SimplePromptModeration/SimplePromptModerationRunner.ts index 65726afb8c3..36a7bdcb797 100644 --- a/packages/components/nodes/moderation/SimplePromptModeration/SimplePromptModerationRunner.ts +++ b/packages/components/nodes/moderation/SimplePromptModeration/SimplePromptModerationRunner.ts @@ -1,3 +1,4 @@ +import { extractResponseContent } from '../../../src/utils' import { Moderation } from '../Moderation' import { BaseChatModel } from '@langchain/core/language_models/chat_models' @@ -23,7 +24,8 @@ export class SimplePromptModerationRunner implements Moderation { const res = await this.model.invoke( `Are these two sentences similar to each other? Only return Yes or No.\nFirst sentence: ${input}\nSecond sentence: ${denyStr}` ) - if (res.content.toString().toLowerCase().includes('yes')) { + const responseContent = extractResponseContent(res) + if (responseContent.toLowerCase().includes('yes')) { throw Error(this.moderationErrorMessage) } } diff --git a/packages/components/nodes/multiagents/Supervisor/Supervisor.ts b/packages/components/nodes/multiagents/Supervisor/Supervisor.ts index 2babee9aa02..2b7b2d189f8 100644 --- a/packages/components/nodes/multiagents/Supervisor/Supervisor.ts +++ b/packages/components/nodes/multiagents/Supervisor/Supervisor.ts @@ -13,7 +13,7 @@ import { MessageContentImageUrl } from '../../../src/Interface' import { Moderation } from '../../moderation/Moderation' -import { z } from 'zod' +import { z } from 'zod/v3' import { StructuredTool } from '@langchain/core/tools' import { AgentExecutor, JsonOutputToolsParser, ToolCallingAgentOutputParser } from '../../../src/agents' import { ChatMistralAI } from '@langchain/mistralai' @@ -164,9 +164,7 @@ class Supervisor_MultiAgents implements INode { multiModalMessageContent = messages.multiModalMessageContent // Force Mistral to use tool - // @ts-ignore - const modelWithTool = llm.bind({ - tools: [tool], + const modelWithTool = llm.bindTools([tool]).withConfig({ tool_choice: 'any', signal: abortControllerSignal ? abortControllerSignal.signal : undefined }) @@ -256,8 +254,7 @@ class Supervisor_MultiAgents implements INode { multiModalMessageContent = messages.multiModalMessageContent // Force OpenAI to use tool - const modelWithTool = llm.bind({ - tools: [tool], + const modelWithTool = llm.bindTools([tool]).withConfig({ tool_choice: { type: 'function', function: { name: routerToolName } }, signal: abortControllerSignal ? abortControllerSignal.signal : undefined }) @@ -417,9 +414,7 @@ class Supervisor_MultiAgents implements INode { multiModalMessageContent = messages.multiModalMessageContent // Force Mistral to use tool - // @ts-ignore - const modelWithTool = llm.bind({ - tools: [tool], + const modelWithTool = llm.bindTools([tool]).withConfig({ tool_choice: 'any', signal: abortControllerSignal ? abortControllerSignal.signal : undefined }) @@ -514,8 +509,7 @@ class Supervisor_MultiAgents implements INode { multiModalMessageContent = messages.multiModalMessageContent // Force OpenAI to use tool - const modelWithTool = llm.bind({ - tools: [tool], + const modelWithTool = llm.bindTools([tool]).withConfig({ tool_choice: { type: 'function', function: { name: routerToolName } }, signal: abortControllerSignal ? abortControllerSignal.signal : undefined }) diff --git a/packages/components/nodes/multiagents/Worker/Worker.ts b/packages/components/nodes/multiagents/Worker/Worker.ts index 06a5d059cc2..6dab582e95e 100644 --- a/packages/components/nodes/multiagents/Worker/Worker.ts +++ b/packages/components/nodes/multiagents/Worker/Worker.ts @@ -3,12 +3,11 @@ import { RunnableSequence, RunnablePassthrough, RunnableConfig } from '@langchai import { ChatPromptTemplate, MessagesPlaceholder, HumanMessagePromptTemplate } from '@langchain/core/prompts' import { BaseChatModel } from '@langchain/core/language_models/chat_models' import { HumanMessage } from '@langchain/core/messages' -import { formatToOpenAIToolMessages } from 'langchain/agents/format_scratchpad/openai_tools' -import { type ToolsAgentStep } from 'langchain/agents/openai/output_parser' +import { formatToOpenAIToolMessages } from '@langchain/classic/agents/format_scratchpad/openai_tools' +import { type ToolsAgentStep } from '@langchain/classic/agents/openai/output_parser' import { INode, INodeData, INodeParams, IMultiAgentNode, ITeamState, ICommonObject, MessageContentImageUrl } from '../../../src/Interface' import { ToolCallingAgentOutputParser, AgentExecutor } from '../../../src/agents' -import { StringOutputParser } from '@langchain/core/output_parsers' -import { getInputVariables, handleEscapeCharacters } from '../../../src/utils' +import { getInputVariables, handleEscapeCharacters, createTextOnlyOutputParser } from '../../../src/utils' const examplePrompt = 'You are a research assistant who can search for up-to-date info using search engine.' @@ -254,13 +253,13 @@ async function createAgent( let conversationChain if (!workerInputVariablesValues || !Object.keys(workerInputVariablesValues).length) { - conversationChain = RunnableSequence.from([prompt, llm, new StringOutputParser()]) + conversationChain = RunnableSequence.from([prompt, llm, createTextOnlyOutputParser()]) } else { conversationChain = RunnableSequence.from([ RunnablePassthrough.assign(transformObjectPropertyToFunction(workerInputVariablesValues)), prompt, llm, - new StringOutputParser() + createTextOnlyOutputParser() ]) } return conversationChain diff --git a/packages/components/nodes/outputparsers/OutputParserHelpers.ts b/packages/components/nodes/outputparsers/OutputParserHelpers.ts index f68b3c42764..d7ce5ba8836 100644 --- a/packages/components/nodes/outputparsers/OutputParserHelpers.ts +++ b/packages/components/nodes/outputparsers/OutputParserHelpers.ts @@ -1,7 +1,7 @@ import { BaseOutputParser } from '@langchain/core/output_parsers' import { ChatPromptTemplate, FewShotPromptTemplate, PromptTemplate, SystemMessagePromptTemplate } from '@langchain/core/prompts' import { BaseLanguageModel, BaseLanguageModelCallOptions } from '@langchain/core/language_models/base' -import { LLMChain } from 'langchain/chains' +import { LLMChain } from '@langchain/classic/chains' import { ICommonObject } from '../../src' export const CATEGORY = 'Output Parsers' diff --git a/packages/components/nodes/outputparsers/StructuredOutputParser/StructuredOutputParser.ts b/packages/components/nodes/outputparsers/StructuredOutputParser/StructuredOutputParser.ts index 85110e71894..df47045d2bf 100644 --- a/packages/components/nodes/outputparsers/StructuredOutputParser/StructuredOutputParser.ts +++ b/packages/components/nodes/outputparsers/StructuredOutputParser/StructuredOutputParser.ts @@ -1,6 +1,6 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { BaseOutputParser } from '@langchain/core/output_parsers' -import { StructuredOutputParser as LangchainStructuredOutputParser } from 'langchain/output_parsers' +import { StructuredOutputParser as LangchainStructuredOutputParser } from '@langchain/core/output_parsers' import { CATEGORY } from '../OutputParserHelpers' import { convertSchemaToZod, getBaseClasses, INode, INodeData, INodeParams } from '../../../src' import { jsonrepair } from 'jsonrepair' diff --git a/packages/components/nodes/outputparsers/StructuredOutputParserAdvanced/StructuredOutputParserAdvanced.ts b/packages/components/nodes/outputparsers/StructuredOutputParserAdvanced/StructuredOutputParserAdvanced.ts index cc8a8ee9793..fff55280032 100644 --- a/packages/components/nodes/outputparsers/StructuredOutputParserAdvanced/StructuredOutputParserAdvanced.ts +++ b/packages/components/nodes/outputparsers/StructuredOutputParserAdvanced/StructuredOutputParserAdvanced.ts @@ -1,6 +1,6 @@ import { getBaseClasses, INode, INodeData, INodeParams } from '../../../src' import { BaseOutputParser } from '@langchain/core/output_parsers' -import { StructuredOutputParser as LangchainStructuredOutputParser } from 'langchain/output_parsers' +import { StructuredOutputParser as LangchainStructuredOutputParser } from '@langchain/core/output_parsers' import { CATEGORY } from '../OutputParserHelpers' import { jsonrepair } from 'jsonrepair' import { SecureZodSchemaParser } from '../../../src/secureZodParser' @@ -59,7 +59,7 @@ class AdvancedStructuredOutputParser implements INode { try { const zodSchema = SecureZodSchemaParser.parseZodSchema(schemaString) - const structuredOutputParser = LangchainStructuredOutputParser.fromZodSchema(zodSchema) + const structuredOutputParser = LangchainStructuredOutputParser.fromZodSchema(zodSchema as any) const baseParse = structuredOutputParser.parse diff --git a/packages/components/nodes/retrievers/AzureRerankRetriever/AzureRerank.ts b/packages/components/nodes/retrievers/AzureRerankRetriever/AzureRerank.ts index 7115f799383..c8b267c890a 100644 --- a/packages/components/nodes/retrievers/AzureRerankRetriever/AzureRerank.ts +++ b/packages/components/nodes/retrievers/AzureRerankRetriever/AzureRerank.ts @@ -1,7 +1,7 @@ import { secureAxiosRequest } from '../../../src/httpSecurity' import { Callbacks } from '@langchain/core/callbacks/manager' import { Document } from '@langchain/core/documents' -import { BaseDocumentCompressor } from 'langchain/retrievers/document_compressors' +import { BaseDocumentCompressor } from '@langchain/classic/retrievers/document_compressors' export class AzureRerank extends BaseDocumentCompressor { private readonly azureApiKey: string diff --git a/packages/components/nodes/retrievers/AzureRerankRetriever/AzureRerankRetriever.ts b/packages/components/nodes/retrievers/AzureRerankRetriever/AzureRerankRetriever.ts index 20bbd944fc4..532c2f32df2 100644 --- a/packages/components/nodes/retrievers/AzureRerankRetriever/AzureRerankRetriever.ts +++ b/packages/components/nodes/retrievers/AzureRerankRetriever/AzureRerankRetriever.ts @@ -1,6 +1,6 @@ import { BaseRetriever } from '@langchain/core/retrievers' import { VectorStoreRetriever } from '@langchain/core/vectorstores' -import { ContextualCompressionRetriever } from 'langchain/retrievers/contextual_compression' +import { ContextualCompressionRetriever } from '@langchain/classic/retrievers/contextual_compression' import { AzureRerank } from './AzureRerank' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src' import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -144,11 +144,11 @@ class AzureRerankRetriever_Retrievers implements INode { }) if (output === 'retriever') return retriever - else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) + else if (output === 'document') return await retriever._getRelevantDocuments(query ? query : input) else if (output === 'text') { let finaltext = '' - const docs = await retriever.getRelevantDocuments(query ? query : input) + const docs = await retriever._getRelevantDocuments(query ? query : input) for (const doc of docs) finaltext += `${doc.pageContent}\n` diff --git a/packages/components/nodes/retrievers/CohereRerankRetriever/CohereRerank.ts b/packages/components/nodes/retrievers/CohereRerankRetriever/CohereRerank.ts index a4544595ffa..9089fbe1e09 100644 --- a/packages/components/nodes/retrievers/CohereRerankRetriever/CohereRerank.ts +++ b/packages/components/nodes/retrievers/CohereRerankRetriever/CohereRerank.ts @@ -1,7 +1,7 @@ import axios from 'axios' import { Callbacks } from '@langchain/core/callbacks/manager' import { Document } from '@langchain/core/documents' -import { BaseDocumentCompressor } from 'langchain/retrievers/document_compressors' +import { BaseDocumentCompressor } from '@langchain/classic/retrievers/document_compressors' export class CohereRerank extends BaseDocumentCompressor { private cohereAPIKey: any diff --git a/packages/components/nodes/retrievers/CohereRerankRetriever/CohereRerankRetriever.ts b/packages/components/nodes/retrievers/CohereRerankRetriever/CohereRerankRetriever.ts index b4f8f867201..24f43a492f7 100644 --- a/packages/components/nodes/retrievers/CohereRerankRetriever/CohereRerankRetriever.ts +++ b/packages/components/nodes/retrievers/CohereRerankRetriever/CohereRerankRetriever.ts @@ -1,6 +1,6 @@ import { BaseRetriever } from '@langchain/core/retrievers' import { VectorStoreRetriever } from '@langchain/core/vectorstores' -import { ContextualCompressionRetriever } from 'langchain/retrievers/contextual_compression' +import { ContextualCompressionRetriever } from '@langchain/classic/retrievers/contextual_compression' import { CohereRerank } from './CohereRerank' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src' import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -129,11 +129,11 @@ class CohereRerankRetriever_Retrievers implements INode { }) if (output === 'retriever') return retriever - else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) + else if (output === 'document') return await retriever._getRelevantDocuments(query ? query : input) else if (output === 'text') { let finaltext = '' - const docs = await retriever.getRelevantDocuments(query ? query : input) + const docs = await retriever._getRelevantDocuments(query ? query : input) for (const doc of docs) finaltext += `${doc.pageContent}\n` diff --git a/packages/components/nodes/retrievers/EmbeddingsFilterRetriever/EmbeddingsFilterRetriever.ts b/packages/components/nodes/retrievers/EmbeddingsFilterRetriever/EmbeddingsFilterRetriever.ts index 35ed07e4627..d0ad3c9ee01 100644 --- a/packages/components/nodes/retrievers/EmbeddingsFilterRetriever/EmbeddingsFilterRetriever.ts +++ b/packages/components/nodes/retrievers/EmbeddingsFilterRetriever/EmbeddingsFilterRetriever.ts @@ -1,7 +1,7 @@ import { BaseRetriever } from '@langchain/core/retrievers' import { Embeddings } from '@langchain/core/embeddings' -import { ContextualCompressionRetriever } from 'langchain/retrievers/contextual_compression' -import { EmbeddingsFilter } from 'langchain/retrievers/document_compressors/embeddings_filter' +import { ContextualCompressionRetriever } from '@langchain/classic/retrievers/contextual_compression' +import { EmbeddingsFilter } from '@langchain/classic/retrievers/document_compressors/embeddings_filter' import { handleEscapeCharacters } from '../../../src/utils' import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -116,11 +116,11 @@ class EmbeddingsFilterRetriever_Retrievers implements INode { }) if (output === 'retriever') return retriever - else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) + else if (output === 'document') return await retriever._getRelevantDocuments(query ? query : input) else if (output === 'text') { let finaltext = '' - const docs = await retriever.getRelevantDocuments(query ? query : input) + const docs = await retriever._getRelevantDocuments(query ? query : input) for (const doc of docs) finaltext += `${doc.pageContent}\n` diff --git a/packages/components/nodes/retrievers/ExtractMetadataRetriever/ExtractMetadataRetriever.ts b/packages/components/nodes/retrievers/ExtractMetadataRetriever/ExtractMetadataRetriever.ts index 1e6205f6236..f625d6022ef 100644 --- a/packages/components/nodes/retrievers/ExtractMetadataRetriever/ExtractMetadataRetriever.ts +++ b/packages/components/nodes/retrievers/ExtractMetadataRetriever/ExtractMetadataRetriever.ts @@ -2,7 +2,7 @@ import { Document } from '@langchain/core/documents' import { VectorStore, VectorStoreRetriever, VectorStoreRetrieverInput } from '@langchain/core/vectorstores' import { INode, INodeData, INodeParams, INodeOutputsValue } from '../../../src/Interface' import { handleEscapeCharacters } from '../../../src' -import { z } from 'zod' +import { z } from 'zod/v3' import { convertStructuredSchemaToZod } from '../../sequentialagents/commonUtils' const queryPrefix = 'query' @@ -126,7 +126,9 @@ class ExtractMetadataRetriever_Retrievers implements INode { const structuredOutput = z.object(convertStructuredSchemaToZod(llmStructuredOutput)) // @ts-ignore - llm = llm.withStructuredOutput(structuredOutput) + llm = llm.withStructuredOutput(structuredOutput, { + method: 'functionCalling' + }) } catch (exception) { console.error(exception) } diff --git a/packages/components/nodes/retrievers/HydeRetriever/HydeRetriever.ts b/packages/components/nodes/retrievers/HydeRetriever/HydeRetriever.ts index 580d4ba4c0b..197dc4b8095 100644 --- a/packages/components/nodes/retrievers/HydeRetriever/HydeRetriever.ts +++ b/packages/components/nodes/retrievers/HydeRetriever/HydeRetriever.ts @@ -1,7 +1,7 @@ import { VectorStore } from '@langchain/core/vectorstores' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { PromptTemplate } from '@langchain/core/prompts' -import { HydeRetriever, HydeRetrieverOptions, PromptKey } from 'langchain/retrievers/hyde' +import { HydeRetriever, HydeRetrieverOptions, PromptKey } from '@langchain/classic/retrievers/hyde' import { handleEscapeCharacters } from '../../../src/utils' import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -175,11 +175,11 @@ Passage:` retriever.filter = vectorStore?.lc_kwargs?.filter ?? (vectorStore as any).filter if (output === 'retriever') return retriever - else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) + else if (output === 'document') return await retriever._getRelevantDocuments(query ? query : input) else if (output === 'text') { let finaltext = '' - const docs = await retriever.getRelevantDocuments(query ? query : input) + const docs = await retriever._getRelevantDocuments(query ? query : input) for (const doc of docs) finaltext += `${doc.pageContent}\n` diff --git a/packages/components/nodes/retrievers/JinaRerankRetriever/JinaRerank.ts b/packages/components/nodes/retrievers/JinaRerankRetriever/JinaRerank.ts index f55ea53abe4..ba82c7f33a1 100644 --- a/packages/components/nodes/retrievers/JinaRerankRetriever/JinaRerank.ts +++ b/packages/components/nodes/retrievers/JinaRerankRetriever/JinaRerank.ts @@ -1,7 +1,7 @@ import { Callbacks } from '@langchain/core/callbacks/manager' import { Document } from '@langchain/core/documents' import axios from 'axios' -import { BaseDocumentCompressor } from 'langchain/retrievers/document_compressors' +import { BaseDocumentCompressor } from '@langchain/classic/retrievers/document_compressors' export class JinaRerank extends BaseDocumentCompressor { private jinaAPIKey: string diff --git a/packages/components/nodes/retrievers/JinaRerankRetriever/JinaRerankRetriever.ts b/packages/components/nodes/retrievers/JinaRerankRetriever/JinaRerankRetriever.ts index 3160f3f7a30..b3f6e7e54f6 100644 --- a/packages/components/nodes/retrievers/JinaRerankRetriever/JinaRerankRetriever.ts +++ b/packages/components/nodes/retrievers/JinaRerankRetriever/JinaRerankRetriever.ts @@ -1,5 +1,5 @@ import { BaseRetriever } from '@langchain/core/retrievers' -import { ContextualCompressionRetriever } from 'langchain/retrievers/contextual_compression' +import { ContextualCompressionRetriever } from '@langchain/classic/retrievers/contextual_compression' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src' import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { JinaRerank } from './JinaRerank' diff --git a/packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts b/packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts index 7fbdfab1ded..536f8e590df 100644 --- a/packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts +++ b/packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts @@ -1,7 +1,7 @@ import { BaseRetriever } from '@langchain/core/retrievers' import { BaseLanguageModel } from '@langchain/core/language_models/base' -import { ContextualCompressionRetriever } from 'langchain/retrievers/contextual_compression' -import { LLMChainExtractor } from 'langchain/retrievers/document_compressors/chain_extract' +import { ContextualCompressionRetriever } from '@langchain/classic/retrievers/contextual_compression' +import { LLMChainExtractor } from '@langchain/classic/retrievers/document_compressors/chain_extract' import { handleEscapeCharacters } from '../../../src/utils' import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -83,11 +83,11 @@ class LLMFilterCompressionRetriever_Retrievers implements INode { }) if (output === 'retriever') return retriever - else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) + else if (output === 'document') return await retriever._getRelevantDocuments(query ? query : input) else if (output === 'text') { let finaltext = '' - const docs = await retriever.getRelevantDocuments(query ? query : input) + const docs = await retriever._getRelevantDocuments(query ? query : input) for (const doc of docs) finaltext += `${doc.pageContent}\n` diff --git a/packages/components/nodes/retrievers/MultiQueryRetriever/MultiQueryRetriever.ts b/packages/components/nodes/retrievers/MultiQueryRetriever/MultiQueryRetriever.ts index fd845a35c96..d4ac055833c 100644 --- a/packages/components/nodes/retrievers/MultiQueryRetriever/MultiQueryRetriever.ts +++ b/packages/components/nodes/retrievers/MultiQueryRetriever/MultiQueryRetriever.ts @@ -1,6 +1,6 @@ import { PromptTemplate } from '@langchain/core/prompts' import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { MultiQueryRetriever } from 'langchain/retrievers/multi_query' +import { MultiQueryRetriever } from '@langchain/classic/retrievers/multi_query' const defaultPrompt = `You are an AI language model assistant. Your task is to generate 3 different versions of the given user diff --git a/packages/components/nodes/retrievers/RRFRetriever/RRFRetriever.ts b/packages/components/nodes/retrievers/RRFRetriever/RRFRetriever.ts index 15ff7e56c01..89ef1e6a5e0 100644 --- a/packages/components/nodes/retrievers/RRFRetriever/RRFRetriever.ts +++ b/packages/components/nodes/retrievers/RRFRetriever/RRFRetriever.ts @@ -1,7 +1,7 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { BaseRetriever } from '@langchain/core/retrievers' import { VectorStoreRetriever } from '@langchain/core/vectorstores' -import { ContextualCompressionRetriever } from 'langchain/retrievers/contextual_compression' +import { ContextualCompressionRetriever } from '@langchain/classic/retrievers/contextual_compression' import { ReciprocalRankFusion } from './ReciprocalRankFusion' import { handleEscapeCharacters } from '../../../src/utils' import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -119,11 +119,11 @@ class RRFRetriever_Retrievers implements INode { }) if (output === 'retriever') return retriever - else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) + else if (output === 'document') return await retriever._getRelevantDocuments(query ? query : input) else if (output === 'text') { let finaltext = '' - const docs = await retriever.getRelevantDocuments(query ? query : input) + const docs = await retriever._getRelevantDocuments(query ? query : input) for (const doc of docs) finaltext += `${doc.pageContent}\n` diff --git a/packages/components/nodes/retrievers/RRFRetriever/ReciprocalRankFusion.ts b/packages/components/nodes/retrievers/RRFRetriever/ReciprocalRankFusion.ts index 47ae2d00076..286c64a875e 100644 --- a/packages/components/nodes/retrievers/RRFRetriever/ReciprocalRankFusion.ts +++ b/packages/components/nodes/retrievers/RRFRetriever/ReciprocalRankFusion.ts @@ -3,8 +3,8 @@ import { Callbacks } from '@langchain/core/callbacks/manager' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { VectorStoreRetriever } from '@langchain/core/vectorstores' import { ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate } from '@langchain/core/prompts' -import { LLMChain } from 'langchain/chains' -import { BaseDocumentCompressor } from 'langchain/retrievers/document_compressors' +import { LLMChain } from '@langchain/classic/chains' +import { BaseDocumentCompressor } from '@langchain/classic/retrievers/document_compressors' export class ReciprocalRankFusion extends BaseDocumentCompressor { private readonly llm: BaseLanguageModel diff --git a/packages/components/nodes/retrievers/SimilarityThresholdRetriever/SimilarityThresholdRetriever.ts b/packages/components/nodes/retrievers/SimilarityThresholdRetriever/SimilarityThresholdRetriever.ts index 94c2d021764..07f7b41ae83 100644 --- a/packages/components/nodes/retrievers/SimilarityThresholdRetriever/SimilarityThresholdRetriever.ts +++ b/packages/components/nodes/retrievers/SimilarityThresholdRetriever/SimilarityThresholdRetriever.ts @@ -1,5 +1,5 @@ import { VectorStore } from '@langchain/core/vectorstores' -import { ScoreThresholdRetriever } from 'langchain/retrievers/score_threshold' +import { ScoreThresholdRetriever } from '@langchain/classic/retrievers/score_threshold' import { INode, INodeData, INodeParams, INodeOutputsValue } from '../../../src/Interface' import { handleEscapeCharacters } from '../../../src' @@ -103,11 +103,11 @@ class SimilarityThresholdRetriever_Retrievers implements INode { retriever.filter = vectorStore?.lc_kwargs?.filter ?? (vectorStore as any).filter if (output === 'retriever') return retriever - else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) + else if (output === 'document') return await retriever._getRelevantDocuments(query ? query : input) else if (output === 'text') { let finaltext = '' - const docs = await retriever.getRelevantDocuments(query ? query : input) + const docs = await retriever._getRelevantDocuments(query ? query : input) for (const doc of docs) finaltext += `${doc.pageContent}\n` diff --git a/packages/components/nodes/retrievers/VoyageAIRetriever/VoyageAIRerank.ts b/packages/components/nodes/retrievers/VoyageAIRetriever/VoyageAIRerank.ts index fd43c0b656b..6e7e62b5ad6 100644 --- a/packages/components/nodes/retrievers/VoyageAIRetriever/VoyageAIRerank.ts +++ b/packages/components/nodes/retrievers/VoyageAIRetriever/VoyageAIRerank.ts @@ -1,7 +1,7 @@ import axios from 'axios' import { Callbacks } from '@langchain/core/callbacks/manager' import { Document } from '@langchain/core/documents' -import { BaseDocumentCompressor } from 'langchain/retrievers/document_compressors' +import { BaseDocumentCompressor } from '@langchain/classic/retrievers/document_compressors' export class VoyageAIRerank extends BaseDocumentCompressor { private voyageAIAPIKey: any diff --git a/packages/components/nodes/retrievers/VoyageAIRetriever/VoyageAIRerankRetriever.ts b/packages/components/nodes/retrievers/VoyageAIRetriever/VoyageAIRerankRetriever.ts index 53f02187fde..8a53f1edbc9 100644 --- a/packages/components/nodes/retrievers/VoyageAIRetriever/VoyageAIRerankRetriever.ts +++ b/packages/components/nodes/retrievers/VoyageAIRetriever/VoyageAIRerankRetriever.ts @@ -1,6 +1,6 @@ import { BaseRetriever } from '@langchain/core/retrievers' import { VectorStoreRetriever } from '@langchain/core/vectorstores' -import { ContextualCompressionRetriever } from 'langchain/retrievers/contextual_compression' +import { ContextualCompressionRetriever } from '@langchain/classic/retrievers/contextual_compression' import { VoyageAIRerank } from './VoyageAIRerank' import { getCredentialData, getCredentialParam, handleEscapeCharacters } from '../../../src' import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' @@ -122,11 +122,11 @@ class VoyageAIRerankRetriever_Retrievers implements INode { }) if (output === 'retriever') return retriever - else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) + else if (output === 'document') return await retriever._getRelevantDocuments(query ? query : input) else if (output === 'text') { let finaltext = '' - const docs = await retriever.getRelevantDocuments(query ? query : input) + const docs = await retriever._getRelevantDocuments(query ? query : input) for (const doc of docs) finaltext += `${doc.pageContent}\n` diff --git a/packages/components/nodes/sequentialagents/Agent/Agent.ts b/packages/components/nodes/sequentialagents/Agent/Agent.ts index 0933731f1ab..3486316b142 100644 --- a/packages/components/nodes/sequentialagents/Agent/Agent.ts +++ b/packages/components/nodes/sequentialagents/Agent/Agent.ts @@ -4,9 +4,8 @@ import { RunnableSequence, RunnablePassthrough, RunnableConfig } from '@langchai import { ChatPromptTemplate, MessagesPlaceholder, HumanMessagePromptTemplate, BaseMessagePromptTemplateLike } from '@langchain/core/prompts' import { BaseChatModel } from '@langchain/core/language_models/chat_models' import { AIMessage, AIMessageChunk, BaseMessage, HumanMessage, ToolMessage } from '@langchain/core/messages' -import { formatToOpenAIToolMessages } from 'langchain/agents/format_scratchpad/openai_tools' -import { type ToolsAgentStep } from 'langchain/agents/openai/output_parser' -import { StringOutputParser } from '@langchain/core/output_parsers' +import { formatToOpenAIToolMessages } from '@langchain/classic/agents/format_scratchpad/openai_tools' +import { type ToolsAgentStep } from '@langchain/classic/agents/openai/output_parser' import { INode, INodeData, @@ -38,7 +37,8 @@ import { removeInvalidImageMarkdown, transformBracesWithColon, executeJavaScriptCode, - createCodeExecutionSandbox + createCodeExecutionSandbox, + createTextOnlyOutputParser } from '../../../src/utils' import { customGet, @@ -742,7 +742,7 @@ async function createAgent( let conversationChain if (!agentInputVariablesValues || !Object.keys(agentInputVariablesValues).length) { - conversationChain = RunnableSequence.from([prompt, llm, new StringOutputParser()]).withConfig({ + conversationChain = RunnableSequence.from([prompt, llm, createTextOnlyOutputParser()]).withConfig({ metadata: { sequentialNodeName: agentName } }) } else { @@ -750,7 +750,7 @@ async function createAgent( RunnablePassthrough.assign(transformObjectPropertyToFunction(agentInputVariablesValues, state)), prompt, llm, - new StringOutputParser() + createTextOnlyOutputParser() ]).withConfig({ metadata: { sequentialNodeName: agentName } }) diff --git a/packages/components/nodes/sequentialagents/ConditionAgent/ConditionAgent.ts b/packages/components/nodes/sequentialagents/ConditionAgent/ConditionAgent.ts index fada093056c..dce2e2e1560 100644 --- a/packages/components/nodes/sequentialagents/ConditionAgent/ConditionAgent.ts +++ b/packages/components/nodes/sequentialagents/ConditionAgent/ConditionAgent.ts @@ -1,6 +1,6 @@ import { uniq } from 'lodash' import { DataSource } from 'typeorm' -import { z } from 'zod' +import { z } from 'zod/v3' import { BaseMessagePromptTemplateLike, ChatPromptTemplate, MessagesPlaceholder } from '@langchain/core/prompts' import { RunnableSequence, RunnablePassthrough, RunnableConfig } from '@langchain/core/runnables' import { BaseMessage } from '@langchain/core/messages' @@ -491,7 +491,9 @@ const runCondition = async ( const structuredOutput = z.object(convertStructuredSchemaToZod(conditionAgentStructuredOutput)) // @ts-ignore - model = llm.withStructuredOutput(structuredOutput) + model = llm.withStructuredOutput(structuredOutput, { + method: 'functionCalling' + }) } catch (exception) { console.error('Invalid JSON in Condition Agent Structured Output: ' + exception) model = llm diff --git a/packages/components/nodes/sequentialagents/LLMNode/LLMNode.ts b/packages/components/nodes/sequentialagents/LLMNode/LLMNode.ts index e0b577fb22c..dfccb1db645 100644 --- a/packages/components/nodes/sequentialagents/LLMNode/LLMNode.ts +++ b/packages/components/nodes/sequentialagents/LLMNode/LLMNode.ts @@ -1,6 +1,6 @@ import { difference, flatten, uniq } from 'lodash' import { DataSource } from 'typeorm' -import { z } from 'zod' +import { z } from 'zod/v3' import { RunnableSequence, RunnablePassthrough, RunnableConfig } from '@langchain/core/runnables' import { ChatPromptTemplate, MessagesPlaceholder, HumanMessagePromptTemplate, BaseMessagePromptTemplateLike } from '@langchain/core/prompts' import { BaseChatModel } from '@langchain/core/language_models/chat_models' @@ -513,7 +513,9 @@ async function createAgent( const structuredOutput = z.object(convertStructuredSchemaToZod(llmStructuredOutput)) // @ts-ignore - llm = llm.withStructuredOutput(structuredOutput) + llm = llm.withStructuredOutput(structuredOutput, { + method: 'functionCalling' + }) } catch (exception) { console.error(exception) } diff --git a/packages/components/nodes/sequentialagents/commonUtils.ts b/packages/components/nodes/sequentialagents/commonUtils.ts index e970a64ea60..f7011647a7a 100644 --- a/packages/components/nodes/sequentialagents/commonUtils.ts +++ b/packages/components/nodes/sequentialagents/commonUtils.ts @@ -1,5 +1,5 @@ import { get } from 'lodash' -import { z } from 'zod' +import { z } from 'zod/v3' import { DataSource } from 'typeorm' import { StructuredTool } from '@langchain/core/tools' import { ChatMistralAI } from '@langchain/mistralai' diff --git a/packages/components/nodes/textsplitters/CharacterTextSplitter/CharacterTextSplitter.ts b/packages/components/nodes/textsplitters/CharacterTextSplitter/CharacterTextSplitter.ts index de90c20f0b7..43991c1f033 100644 --- a/packages/components/nodes/textsplitters/CharacterTextSplitter/CharacterTextSplitter.ts +++ b/packages/components/nodes/textsplitters/CharacterTextSplitter/CharacterTextSplitter.ts @@ -1,6 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' -import { CharacterTextSplitter, CharacterTextSplitterParams } from 'langchain/text_splitter' +import { CharacterTextSplitter, CharacterTextSplitterParams } from '@langchain/textsplitters' class CharacterTextSplitter_TextSplitters implements INode { label: string diff --git a/packages/components/nodes/textsplitters/CodeTextSplitter/CodeTextSplitter.ts b/packages/components/nodes/textsplitters/CodeTextSplitter/CodeTextSplitter.ts index 7e5a4468939..292486ac2bf 100644 --- a/packages/components/nodes/textsplitters/CodeTextSplitter/CodeTextSplitter.ts +++ b/packages/components/nodes/textsplitters/CodeTextSplitter/CodeTextSplitter.ts @@ -4,7 +4,7 @@ import { RecursiveCharacterTextSplitter, RecursiveCharacterTextSplitterParams, SupportedTextSplitterLanguage -} from 'langchain/text_splitter' +} from '@langchain/textsplitters' class CodeTextSplitter_TextSplitters implements INode { label: string diff --git a/packages/components/nodes/textsplitters/HtmlToMarkdownTextSplitter/HtmlToMarkdownTextSplitter.ts b/packages/components/nodes/textsplitters/HtmlToMarkdownTextSplitter/HtmlToMarkdownTextSplitter.ts index 898db60d4d7..2fbcac9b424 100644 --- a/packages/components/nodes/textsplitters/HtmlToMarkdownTextSplitter/HtmlToMarkdownTextSplitter.ts +++ b/packages/components/nodes/textsplitters/HtmlToMarkdownTextSplitter/HtmlToMarkdownTextSplitter.ts @@ -1,6 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' -import { MarkdownTextSplitter, MarkdownTextSplitterParams } from 'langchain/text_splitter' +import { MarkdownTextSplitter, MarkdownTextSplitterParams } from '@langchain/textsplitters' import { NodeHtmlMarkdown } from 'node-html-markdown' class HtmlToMarkdownTextSplitter_TextSplitters implements INode { diff --git a/packages/components/nodes/textsplitters/MarkdownTextSplitter/MarkdownTextSplitter.ts b/packages/components/nodes/textsplitters/MarkdownTextSplitter/MarkdownTextSplitter.ts index 4170972ad30..6a9ec1c05a2 100644 --- a/packages/components/nodes/textsplitters/MarkdownTextSplitter/MarkdownTextSplitter.ts +++ b/packages/components/nodes/textsplitters/MarkdownTextSplitter/MarkdownTextSplitter.ts @@ -1,6 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' -import { MarkdownTextSplitter, MarkdownTextSplitterParams } from 'langchain/text_splitter' +import { MarkdownTextSplitter, MarkdownTextSplitterParams } from '@langchain/textsplitters' class MarkdownTextSplitter_TextSplitters implements INode { label: string diff --git a/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts b/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts index 8f1454ea2ad..cafdcd8d83e 100644 --- a/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts +++ b/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts @@ -1,6 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' -import { RecursiveCharacterTextSplitter, RecursiveCharacterTextSplitterParams } from 'langchain/text_splitter' +import { RecursiveCharacterTextSplitter, RecursiveCharacterTextSplitterParams } from '@langchain/textsplitters' class RecursiveCharacterTextSplitter_TextSplitters implements INode { label: string diff --git a/packages/components/nodes/textsplitters/TokenTextSplitter/TokenTextSplitter.ts b/packages/components/nodes/textsplitters/TokenTextSplitter/TokenTextSplitter.ts index 85c4cac209a..a1b59deb771 100644 --- a/packages/components/nodes/textsplitters/TokenTextSplitter/TokenTextSplitter.ts +++ b/packages/components/nodes/textsplitters/TokenTextSplitter/TokenTextSplitter.ts @@ -1,6 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' -import { TokenTextSplitter, TokenTextSplitterParams } from 'langchain/text_splitter' +import { TokenTextSplitter, TokenTextSplitterParams } from '@langchain/textsplitters' import { TiktokenEncoding } from '@dqbd/tiktoken' class TokenTextSplitter_TextSplitters implements INode { diff --git a/packages/components/nodes/tools/AWSDynamoDBKVStorage/AWSDynamoDBKVStorage.ts b/packages/components/nodes/tools/AWSDynamoDBKVStorage/AWSDynamoDBKVStorage.ts index b3d20aaa84c..143b0f70b64 100644 --- a/packages/components/nodes/tools/AWSDynamoDBKVStorage/AWSDynamoDBKVStorage.ts +++ b/packages/components/nodes/tools/AWSDynamoDBKVStorage/AWSDynamoDBKVStorage.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { StructuredTool } from '@langchain/core/tools' import { ICommonObject, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' diff --git a/packages/components/nodes/tools/AgentAsTool/AgentAsTool.ts b/packages/components/nodes/tools/AgentAsTool/AgentAsTool.ts index 4fd9e7108d8..0565c0caf73 100644 --- a/packages/components/nodes/tools/AgentAsTool/AgentAsTool.ts +++ b/packages/components/nodes/tools/AgentAsTool/AgentAsTool.ts @@ -1,5 +1,5 @@ import { DataSource } from 'typeorm' -import { z } from 'zod' +import { z } from 'zod/v3' import { RunnableConfig } from '@langchain/core/runnables' import { CallbackManagerForToolRun, Callbacks, CallbackManager, parseCallbackConfigArg } from '@langchain/core/callbacks/manager' import { StructuredTool } from '@langchain/core/tools' diff --git a/packages/components/nodes/tools/Arxiv/core.ts b/packages/components/nodes/tools/Arxiv/core.ts index a774eb3adc3..2346fd0f0bd 100644 --- a/packages/components/nodes/tools/Arxiv/core.ts +++ b/packages/components/nodes/tools/Arxiv/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import fetch from 'node-fetch' import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' @@ -177,7 +177,7 @@ export class ArxivTool extends DynamicStructuredTool { // Get PDF buffer and create blob const buffer = await response.buffer() - const blob = new Blob([buffer]) + const blob = new Blob([new Uint8Array(buffer)]) // Use PDFLoader to extract text (same as Pdf.ts) const loader = new PDFLoader(blob, { diff --git a/packages/components/nodes/tools/ChainTool/ChainTool.ts b/packages/components/nodes/tools/ChainTool/ChainTool.ts index a79a8b4a35c..e850e208cc6 100644 --- a/packages/components/nodes/tools/ChainTool/ChainTool.ts +++ b/packages/components/nodes/tools/ChainTool/ChainTool.ts @@ -1,4 +1,4 @@ -import { BaseChain } from 'langchain/chains' +import { BaseChain } from '@langchain/classic/chains' import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' import { ChainTool } from './core' diff --git a/packages/components/nodes/tools/ChainTool/core.ts b/packages/components/nodes/tools/ChainTool/core.ts index e43c126f8d5..21f680c73bd 100644 --- a/packages/components/nodes/tools/ChainTool/core.ts +++ b/packages/components/nodes/tools/ChainTool/core.ts @@ -1,5 +1,5 @@ import { DynamicTool, DynamicToolInput } from '@langchain/core/tools' -import { BaseChain } from 'langchain/chains' +import { BaseChain } from '@langchain/classic/chains' import { handleEscapeCharacters } from '../../../src/utils' import { CustomChainHandler } from '../../../src' diff --git a/packages/components/nodes/tools/ChatflowTool/ChatflowTool.ts b/packages/components/nodes/tools/ChatflowTool/ChatflowTool.ts index a2db7fbf33e..fa9d463aec1 100644 --- a/packages/components/nodes/tools/ChatflowTool/ChatflowTool.ts +++ b/packages/components/nodes/tools/ChatflowTool/ChatflowTool.ts @@ -1,5 +1,5 @@ import { DataSource } from 'typeorm' -import { z } from 'zod' +import { z } from 'zod/v3' import { RunnableConfig } from '@langchain/core/runnables' import { CallbackManagerForToolRun, Callbacks, CallbackManager, parseCallbackConfigArg } from '@langchain/core/callbacks/manager' import { StructuredTool } from '@langchain/core/tools' diff --git a/packages/components/nodes/tools/CodeInterpreterE2B/CodeInterpreterE2B.ts b/packages/components/nodes/tools/CodeInterpreterE2B/CodeInterpreterE2B.ts index 544ed856a38..ee964edff7f 100644 --- a/packages/components/nodes/tools/CodeInterpreterE2B/CodeInterpreterE2B.ts +++ b/packages/components/nodes/tools/CodeInterpreterE2B/CodeInterpreterE2B.ts @@ -2,7 +2,7 @@ import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Inter import { getBaseClasses, getCredentialData, getCredentialParam, parseWithTypeConversion } from '../../../src/utils' import { StructuredTool, ToolInputParsingException, ToolParams } from '@langchain/core/tools' import { Sandbox } from '@e2b/code-interpreter' -import { z } from 'zod' +import { z } from 'zod/v3' import { addSingleFileToStorage } from '../../../src/storageUtils' import { CallbackManager, CallbackManagerForToolRun, Callbacks, parseCallbackConfigArg } from '@langchain/core/callbacks/manager' import { RunnableConfig } from '@langchain/core/runnables' diff --git a/packages/components/nodes/tools/CurrentDateTime/CurrentDateTime.ts b/packages/components/nodes/tools/CurrentDateTime/CurrentDateTime.ts index f65747c4d40..4afe391fa66 100644 --- a/packages/components/nodes/tools/CurrentDateTime/CurrentDateTime.ts +++ b/packages/components/nodes/tools/CurrentDateTime/CurrentDateTime.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { INode } from '../../../src/Interface' import { DynamicStructuredTool } from '../CustomTool/core' diff --git a/packages/components/nodes/tools/CustomTool/CustomTool.ts b/packages/components/nodes/tools/CustomTool/CustomTool.ts index 514376aa8bd..dfd09706852 100644 --- a/packages/components/nodes/tools/CustomTool/CustomTool.ts +++ b/packages/components/nodes/tools/CustomTool/CustomTool.ts @@ -1,7 +1,7 @@ import { ICommonObject, IDatabaseEntity, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface' import { convertSchemaToZod, getBaseClasses, getVars } from '../../../src/utils' import { DynamicStructuredTool } from './core' -import { z } from 'zod' +import { z } from 'zod/v3' import { DataSource } from 'typeorm' import { SecureZodSchemaParser } from '../../../src/secureZodParser' diff --git a/packages/components/nodes/tools/CustomTool/core.ts b/packages/components/nodes/tools/CustomTool/core.ts index 06ebd3e29a4..be9b1b8c0b7 100644 --- a/packages/components/nodes/tools/CustomTool/core.ts +++ b/packages/components/nodes/tools/CustomTool/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { RunnableConfig } from '@langchain/core/runnables' import { StructuredTool, ToolParams } from '@langchain/core/tools' import { CallbackManagerForToolRun, Callbacks, CallbackManager, parseCallbackConfigArg } from '@langchain/core/callbacks/manager' diff --git a/packages/components/nodes/tools/Gmail/core.ts b/packages/components/nodes/tools/Gmail/core.ts index 00f053c035d..9fc98da713e 100644 --- a/packages/components/nodes/tools/Gmail/core.ts +++ b/packages/components/nodes/tools/Gmail/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import fetch from 'node-fetch' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { TOOL_ARGS_PREFIX, formatToolError } from '../../../src/agents' diff --git a/packages/components/nodes/tools/GoogleCalendar/core.ts b/packages/components/nodes/tools/GoogleCalendar/core.ts index 00f21d85dbe..7c801577446 100644 --- a/packages/components/nodes/tools/GoogleCalendar/core.ts +++ b/packages/components/nodes/tools/GoogleCalendar/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import fetch from 'node-fetch' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { TOOL_ARGS_PREFIX, formatToolError } from '../../../src/agents' diff --git a/packages/components/nodes/tools/GoogleDocs/core.ts b/packages/components/nodes/tools/GoogleDocs/core.ts index 51cfa6f8f4f..2b434a5478a 100644 --- a/packages/components/nodes/tools/GoogleDocs/core.ts +++ b/packages/components/nodes/tools/GoogleDocs/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import fetch from 'node-fetch' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { TOOL_ARGS_PREFIX, formatToolError } from '../../../src/agents' diff --git a/packages/components/nodes/tools/GoogleDrive/core.ts b/packages/components/nodes/tools/GoogleDrive/core.ts index e67cc6ae7ea..bb2538b764e 100644 --- a/packages/components/nodes/tools/GoogleDrive/core.ts +++ b/packages/components/nodes/tools/GoogleDrive/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import fetch from 'node-fetch' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { TOOL_ARGS_PREFIX, formatToolError } from '../../../src/agents' diff --git a/packages/components/nodes/tools/GoogleSheets/core.ts b/packages/components/nodes/tools/GoogleSheets/core.ts index ad64ce49855..ad4c49212d3 100644 --- a/packages/components/nodes/tools/GoogleSheets/core.ts +++ b/packages/components/nodes/tools/GoogleSheets/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import fetch from 'node-fetch' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { TOOL_ARGS_PREFIX, formatToolError } from '../../../src/agents' diff --git a/packages/components/nodes/tools/JSONPathExtractor/JSONPathExtractor.ts b/packages/components/nodes/tools/JSONPathExtractor/JSONPathExtractor.ts index 4ab7adc1cb9..b10601f4ed4 100644 --- a/packages/components/nodes/tools/JSONPathExtractor/JSONPathExtractor.ts +++ b/packages/components/nodes/tools/JSONPathExtractor/JSONPathExtractor.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { StructuredTool } from '@langchain/core/tools' import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' diff --git a/packages/components/nodes/tools/Jira/core.ts b/packages/components/nodes/tools/Jira/core.ts index f0d1507790a..904aacf7d87 100644 --- a/packages/components/nodes/tools/Jira/core.ts +++ b/packages/components/nodes/tools/Jira/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { TOOL_ARGS_PREFIX, formatToolError } from '../../../src/agents' import { secureFetch } from '../../../src/httpSecurity' diff --git a/packages/components/nodes/tools/MCP/core.ts b/packages/components/nodes/tools/MCP/core.ts index fd0a5e92bda..ae3a4766d4b 100644 --- a/packages/components/nodes/tools/MCP/core.ts +++ b/packages/components/nodes/tools/MCP/core.ts @@ -2,7 +2,7 @@ import { CallToolRequest, CallToolResultSchema, ListToolsResult, ListToolsResult import { Client } from '@modelcontextprotocol/sdk/client/index.js' import { StdioClientTransport, StdioServerParameters } from '@modelcontextprotocol/sdk/client/stdio.js' import { BaseToolkit, tool, Tool } from '@langchain/core/tools' -import { z } from 'zod' +import { z, type ZodTypeAny } from 'zod/v3' import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js' import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js' import { checkDenyList, secureFetch } from '../../../src/httpSecurity' @@ -172,17 +172,17 @@ export async function MCPTool({ function createSchemaModel( inputSchema: { type: 'object' - properties?: import('zod').objectOutputType<{}, import('zod').ZodTypeAny, 'passthrough'> | undefined + properties?: Record } & { [k: string]: unknown } -): any { +): z.ZodObject> { if (inputSchema.type !== 'object' || !inputSchema.properties) { throw new Error('Invalid schema type or missing properties') } - const schemaProperties = Object.entries(inputSchema.properties).reduce((acc, [key, _]) => { + const schemaProperties = Object.entries(inputSchema.properties).reduce((acc, [key]) => { acc[key] = z.any() return acc - }, {} as Record) + }, {} as Record) return z.object(schemaProperties) } diff --git a/packages/components/nodes/tools/MicrosoftOutlook/core.ts b/packages/components/nodes/tools/MicrosoftOutlook/core.ts index 0468da632c9..37ade53200e 100644 --- a/packages/components/nodes/tools/MicrosoftOutlook/core.ts +++ b/packages/components/nodes/tools/MicrosoftOutlook/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import fetch from 'node-fetch' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { TOOL_ARGS_PREFIX, formatToolError } from '../../../src/agents' diff --git a/packages/components/nodes/tools/MicrosoftTeams/core.ts b/packages/components/nodes/tools/MicrosoftTeams/core.ts index 77c6feaf9b7..bca224f12a5 100644 --- a/packages/components/nodes/tools/MicrosoftTeams/core.ts +++ b/packages/components/nodes/tools/MicrosoftTeams/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager' import { DynamicStructuredTool, DynamicStructuredToolInput } from '../OpenAPIToolkit/core' import { TOOL_ARGS_PREFIX } from '../../../src/agents' diff --git a/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts b/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts index fa039a6681d..b45f3f5a06a 100644 --- a/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts +++ b/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts @@ -2,7 +2,7 @@ import { load } from 'js-yaml' import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' import { getFileFromStorage, getVars, IDatabaseEntity, IVariable } from '../../../src' import $RefParser from '@apidevtools/json-schema-ref-parser' -import { z, ZodSchema, ZodTypeAny } from 'zod' +import { z, ZodSchema, ZodTypeAny } from 'zod/v3' import { defaultCode, DynamicStructuredTool, howToUseCode } from './core' import { DataSource } from 'typeorm' import { secureFetch } from '../../../src/httpSecurity' diff --git a/packages/components/nodes/tools/OpenAPIToolkit/core.ts b/packages/components/nodes/tools/OpenAPIToolkit/core.ts index ebfc8c14b63..f2febf8872f 100644 --- a/packages/components/nodes/tools/OpenAPIToolkit/core.ts +++ b/packages/components/nodes/tools/OpenAPIToolkit/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { RequestInit } from 'node-fetch' import { RunnableConfig } from '@langchain/core/runnables' import { StructuredTool, ToolParams } from '@langchain/core/tools' diff --git a/packages/components/nodes/tools/RequestsDelete/core.ts b/packages/components/nodes/tools/RequestsDelete/core.ts index 47e8b586674..41ff77b2f75 100644 --- a/packages/components/nodes/tools/RequestsDelete/core.ts +++ b/packages/components/nodes/tools/RequestsDelete/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { secureFetch } from '../../../src/httpSecurity' import { parseJsonBody } from '../../../src/utils' diff --git a/packages/components/nodes/tools/RequestsGet/core.ts b/packages/components/nodes/tools/RequestsGet/core.ts index ca2b07d46ed..65655f2dce1 100644 --- a/packages/components/nodes/tools/RequestsGet/core.ts +++ b/packages/components/nodes/tools/RequestsGet/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { secureFetch } from '../../../src/httpSecurity' import { parseJsonBody } from '../../../src/utils' diff --git a/packages/components/nodes/tools/RequestsPost/core.ts b/packages/components/nodes/tools/RequestsPost/core.ts index 96eb7981d54..18227513a8d 100644 --- a/packages/components/nodes/tools/RequestsPost/core.ts +++ b/packages/components/nodes/tools/RequestsPost/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { secureFetch } from '../../../src/httpSecurity' import { parseJsonBody } from '../../../src/utils' diff --git a/packages/components/nodes/tools/RequestsPut/core.ts b/packages/components/nodes/tools/RequestsPut/core.ts index 2db2b88630a..a118c4f2bed 100644 --- a/packages/components/nodes/tools/RequestsPut/core.ts +++ b/packages/components/nodes/tools/RequestsPut/core.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { DynamicStructuredTool } from '../OpenAPIToolkit/core' import { secureFetch } from '../../../src/httpSecurity' import { parseJsonBody } from '../../../src/utils' diff --git a/packages/components/nodes/tools/RetrieverTool/RetrieverTool.ts b/packages/components/nodes/tools/RetrieverTool/RetrieverTool.ts index f23701e6b62..ab976d3d521 100644 --- a/packages/components/nodes/tools/RetrieverTool/RetrieverTool.ts +++ b/packages/components/nodes/tools/RetrieverTool/RetrieverTool.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' import { CallbackManager, CallbackManagerForToolRun, Callbacks, parseCallbackConfigArg } from '@langchain/core/callbacks/manager' import { BaseDynamicToolInput, DynamicTool, StructuredTool, ToolInputParsingException } from '@langchain/core/tools' import { BaseRetriever } from '@langchain/core/retrievers' diff --git a/packages/components/nodes/tools/TavilyAPI/TavilyAPI.ts b/packages/components/nodes/tools/TavilyAPI/TavilyAPI.ts index a44415c1552..66f4b20fe8d 100644 --- a/packages/components/nodes/tools/TavilyAPI/TavilyAPI.ts +++ b/packages/components/nodes/tools/TavilyAPI/TavilyAPI.ts @@ -1,4 +1,4 @@ -import { TavilySearchResults } from '@langchain/community/tools/tavily_search' +import { TavilySearch } from '@langchain/tavily' import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' @@ -150,7 +150,7 @@ class TavilyAPI_Tools implements INode { type: 'credential', credentialNames: ['tavilyApi'] } - this.baseClasses = [this.type, ...getBaseClasses(TavilySearchResults)] + this.baseClasses = [this.type, ...getBaseClasses(TavilySearch)] } async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { @@ -187,7 +187,7 @@ class TavilyAPI_Tools implements INode { if (includeDomains) config.includeDomains = includeDomains.split(',').map((d) => d.trim()) if (excludeDomains) config.excludeDomains = excludeDomains.split(',').map((d) => d.trim()) - return new TavilySearchResults(config) + return new TavilySearch(config) } } diff --git a/packages/components/nodes/tools/WebBrowser/WebBrowser.ts b/packages/components/nodes/tools/WebBrowser/WebBrowser.ts index 874051c7040..d1151d2b195 100644 --- a/packages/components/nodes/tools/WebBrowser/WebBrowser.ts +++ b/packages/components/nodes/tools/WebBrowser/WebBrowser.ts @@ -1,6 +1,6 @@ import { BaseLanguageModel } from '@langchain/core/language_models/base' import { Embeddings } from '@langchain/core/embeddings' -import { WebBrowser } from 'langchain/tools/webbrowser' +import { WebBrowser } from '@langchain/classic/tools/webbrowser' import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' diff --git a/packages/components/nodes/vectorstores/Astra/Astra.ts b/packages/components/nodes/vectorstores/Astra/Astra.ts index 4a821b48d6c..024718e1d7d 100644 --- a/packages/components/nodes/vectorstores/Astra/Astra.ts +++ b/packages/components/nodes/vectorstores/Astra/Astra.ts @@ -23,7 +23,7 @@ class Astra_VectorStores implements INode { constructor() { this.label = 'Astra' this.name = 'Astra' - this.version = 2.0 + this.version = 2.1 this.type = 'Astra' this.icon = 'astra.svg' this.category = 'Vector Stores' @@ -48,11 +48,6 @@ class Astra_VectorStores implements INode { name: 'embeddings', type: 'Embeddings' }, - { - label: 'Namespace', - name: 'astraNamespace', - type: 'string' - }, { label: 'Collection', name: 'astraCollection', @@ -105,7 +100,6 @@ class Astra_VectorStores implements INode { const docs = nodeData.inputs?.document as Document[] const embeddings = nodeData.inputs?.embeddings as Embeddings const vectorDimension = nodeData.inputs?.vectorDimension as number - const astraNamespace = nodeData.inputs?.astraNamespace as string const astraCollection = nodeData.inputs?.astraCollection as string const similarityMetric = nodeData.inputs?.similarityMetric as 'cosine' | 'euclidean' | 'dot_product' | undefined const credentialData = await getCredentialData(nodeData.credential ?? '', options) @@ -122,7 +116,6 @@ class Astra_VectorStores implements INode { const astraConfig: AstraLibArgs = { ...clientConfig, - namespace: astraNamespace ?? 'default_keyspace', collection: astraCollection ?? credentialData.collectionName ?? 'flowise_test', collectionOptions: { vector: { @@ -153,7 +146,6 @@ class Astra_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const vectorDimension = nodeData.inputs?.vectorDimension as number const similarityMetric = nodeData.inputs?.similarityMetric as 'cosine' | 'euclidean' | 'dot_product' | undefined - const astraNamespace = nodeData.inputs?.astraNamespace as string const astraCollection = nodeData.inputs?.astraCollection as string const credentialData = await getCredentialData(nodeData.credential ?? '', options) @@ -169,7 +161,6 @@ class Astra_VectorStores implements INode { const astraConfig: AstraLibArgs = { ...clientConfig, - namespace: astraNamespace ?? 'default_keyspace', collection: astraCollection ?? credentialData.collectionName ?? 'flowise_test', collectionOptions: { vector: { diff --git a/packages/components/nodes/vectorstores/Couchbase/Couchbase.ts b/packages/components/nodes/vectorstores/Couchbase/Couchbase.ts index 4c6eee44c2b..2b7d27e526b 100644 --- a/packages/components/nodes/vectorstores/Couchbase/Couchbase.ts +++ b/packages/components/nodes/vectorstores/Couchbase/Couchbase.ts @@ -1,7 +1,7 @@ import { flatten } from 'lodash' import { Embeddings } from '@langchain/core/embeddings' import { Document } from '@langchain/core/documents' -import { CouchbaseVectorStore, CouchbaseVectorStoreArgs } from '@langchain/community/vectorstores/couchbase' +import { CouchbaseSearchVectorStore, CouchbaseSearchVectorStoreArgs } from '@langchain/community/vectorstores/couchbase_search' import { Cluster } from 'couchbase' import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams, IndexingResult } from '../../../src/Interface' import { getBaseClasses, getCredentialData, getCredentialParam, parseJsonBody } from '../../../src/utils' @@ -118,7 +118,7 @@ class Couchbase_VectorStores implements INode { { label: 'Couchbase Vector Store', name: 'vectorStore', - baseClasses: [this.type, ...getBaseClasses(CouchbaseVectorStore)] + baseClasses: [this.type, ...getBaseClasses(CouchbaseSearchVectorStore)] } ] } @@ -156,7 +156,7 @@ class Couchbase_VectorStores implements INode { configProfile: 'wanDevelopment' }) - const couchbaseConfig: CouchbaseVectorStoreArgs = { + const couchbaseConfig: CouchbaseSearchVectorStoreArgs = { cluster: couchbaseClient, bucketName: bucketName, scopeName: scopeName, @@ -170,7 +170,7 @@ class Couchbase_VectorStores implements INode { if (!textKey || textKey === '') couchbaseConfig.textKey = 'text' if (!embeddingKey || embeddingKey === '') couchbaseConfig.embeddingKey = 'embedding' - await CouchbaseVectorStore.fromDocuments(finalDocs, embeddings, couchbaseConfig) + await CouchbaseSearchVectorStore.fromDocuments(finalDocs, embeddings, couchbaseConfig) return { numAdded: finalDocs.length, addedDocs: finalDocs } } catch (e) { throw new Error(e) @@ -200,7 +200,7 @@ class Couchbase_VectorStores implements INode { configProfile: 'wanDevelopment' }) - const couchbaseConfig: CouchbaseVectorStoreArgs = { + const couchbaseConfig: CouchbaseSearchVectorStoreArgs = { cluster: couchbaseClient, bucketName: bucketName, scopeName: scopeName, @@ -219,7 +219,7 @@ class Couchbase_VectorStores implements INode { typeof couchbaseMetadataFilter === 'object' ? couchbaseMetadataFilter : parseJsonBody(couchbaseMetadataFilter) } - const vectorStore = await CouchbaseVectorStore.initialize(embeddings, couchbaseConfig) + const vectorStore = await CouchbaseSearchVectorStore.initialize(embeddings, couchbaseConfig) return resolveVectorStoreOrRetriever(nodeData, vectorStore, metadatafilter) } catch (e) { diff --git a/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts b/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts index 8c54fe272ff..bd6cdc38366 100644 --- a/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts +++ b/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts @@ -1,5 +1,5 @@ import { flatten } from 'lodash' -import { MemoryVectorStore } from 'langchain/vectorstores/memory' +import { MemoryVectorStore } from '@langchain/classic/vectorstores/memory' import { Embeddings } from '@langchain/core/embeddings' import { Document } from '@langchain/core/documents' import { INode, INodeData, INodeOutputsValue, INodeParams, IndexingResult } from '../../../src/Interface' diff --git a/packages/components/nodes/vectorstores/Pinecone/Pinecone_LlamaIndex.ts b/packages/components/nodes/vectorstores/Pinecone/Pinecone_LlamaIndex.ts index 47dc0dadd54..2230b41c744 100644 --- a/packages/components/nodes/vectorstores/Pinecone/Pinecone_LlamaIndex.ts +++ b/packages/components/nodes/vectorstores/Pinecone/Pinecone_LlamaIndex.ts @@ -14,7 +14,7 @@ import { } from 'llamaindex' import { FetchResponse, Index, Pinecone, ScoredPineconeRecord } from '@pinecone-database/pinecone' import { flatten } from 'lodash' -import { Document as LCDocument } from 'langchain/document' +import { Document as LCDocument } from '@langchain/core/documents' import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams, IndexingResult } from '../../../src/Interface' import { flattenObject, getCredentialData, getCredentialParam, parseJsonBody } from '../../../src/utils' diff --git a/packages/components/nodes/vectorstores/Qdrant/Qdrant.ts b/packages/components/nodes/vectorstores/Qdrant/Qdrant.ts index afc3cf25b23..da87efaceb6 100644 --- a/packages/components/nodes/vectorstores/Qdrant/Qdrant.ts +++ b/packages/components/nodes/vectorstores/Qdrant/Qdrant.ts @@ -228,7 +228,7 @@ class Qdrant_VectorStores implements INode { } const dbConfig: QdrantLibArgs = { - client, + client: client as any, url: qdrantServerUrl, collectionName, collectionConfig: { @@ -353,7 +353,7 @@ class Qdrant_VectorStores implements INode { }) const dbConfig: QdrantLibArgs = { - client, + client: client as any, url: qdrantServerUrl, collectionName, collectionConfig: { @@ -430,7 +430,7 @@ class Qdrant_VectorStores implements INode { }) const dbConfig: QdrantLibArgs = { - client, + client: client as any, collectionName, contentPayloadKey, metadataPayloadKey diff --git a/packages/components/nodes/vectorstores/Redis/Redis.ts b/packages/components/nodes/vectorstores/Redis/Redis.ts index 23f1241392e..dc6b6363821 100644 --- a/packages/components/nodes/vectorstores/Redis/Redis.ts +++ b/packages/components/nodes/vectorstores/Redis/Redis.ts @@ -1,7 +1,7 @@ import { flatten } from 'lodash' import { createClient, SearchOptions } from 'redis' import { Embeddings } from '@langchain/core/embeddings' -import { RedisVectorStore, RedisVectorStoreConfig } from '@langchain/community/vectorstores/redis' +import { RedisVectorStore, RedisVectorStoreConfig } from '@langchain/redis' import { Document } from '@langchain/core/documents' import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams, IndexingResult } from '../../../src/Interface' import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' @@ -163,7 +163,7 @@ class Redis_VectorStores implements INode { await redisClient.connect() const storeConfig: RedisVectorStoreConfig = { - redisClient: redisClient, + redisClient: redisClient as any, indexName: indexName } const isIndexExists = await checkIndexExists(redisClient, indexName) @@ -239,7 +239,7 @@ class Redis_VectorStores implements INode { }) const storeConfig: RedisVectorStoreConfig = { - redisClient: redisClient, + redisClient: redisClient as any, indexName: indexName } diff --git a/packages/components/nodes/vectorstores/SimpleStore/SimpleStore.ts b/packages/components/nodes/vectorstores/SimpleStore/SimpleStore.ts index ed8213cf017..e49acbd0dcf 100644 --- a/packages/components/nodes/vectorstores/SimpleStore/SimpleStore.ts +++ b/packages/components/nodes/vectorstores/SimpleStore/SimpleStore.ts @@ -1,6 +1,6 @@ import { flatten } from 'lodash' import { storageContextFromDefaults, serviceContextFromDefaults, VectorStoreIndex, Document } from 'llamaindex' -import { Document as LCDocument } from 'langchain/document' +import { Document as LCDocument } from '@langchain/core/documents' import { INode, INodeData, INodeOutputsValue, INodeParams, IndexingResult } from '../../../src/Interface' import { validateVectorStorePath } from '../../../src/validator' diff --git a/packages/components/nodes/vectorstores/Vectara/Vectara.ts b/packages/components/nodes/vectorstores/Vectara/Vectara.ts index ae752602f05..eb7313a654a 100644 --- a/packages/components/nodes/vectorstores/Vectara/Vectara.ts +++ b/packages/components/nodes/vectorstores/Vectara/Vectara.ts @@ -198,7 +198,7 @@ class Vectara_VectorStores implements INode { for (const file of files) { if (!file) continue const fileData = await getFileFromStorage(file, orgId, chatflowid) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) vectaraFiles.push({ blob: blob, fileName: getFileName(file) }) } } else { diff --git a/packages/components/nodes/vectorstores/Vectara/Vectara_Upload.ts b/packages/components/nodes/vectorstores/Vectara/Vectara_Upload.ts index e205c5e6d34..d8948d42cc0 100644 --- a/packages/components/nodes/vectorstores/Vectara/Vectara_Upload.ts +++ b/packages/components/nodes/vectorstores/Vectara/Vectara_Upload.ts @@ -144,7 +144,7 @@ class VectaraUpload_VectorStores implements INode { for (const file of files) { const fileData = await getFileFromStorage(file, orgId, chatflowid) - const blob = new Blob([fileData]) + const blob = new Blob([new Uint8Array(fileData)]) vectaraFiles.push({ blob: blob, fileName: getFileName(file) }) } } else { diff --git a/packages/components/nodes/vectorstores/ZepCloud/ZepCloud.ts b/packages/components/nodes/vectorstores/ZepCloud/ZepCloud.ts index 6adbe86daf4..ca38f635e0d 100644 --- a/packages/components/nodes/vectorstores/ZepCloud/ZepCloud.ts +++ b/packages/components/nodes/vectorstores/ZepCloud/ZepCloud.ts @@ -1,11 +1,11 @@ import { flatten } from 'lodash' import { ZepClient } from '@getzep/zep-cloud' -import { IZepConfig, ZepVectorStore } from '@getzep/zep-cloud/langchain' -import { Document } from 'langchain/document' +import { ZepCloudVectorStore, IZepCloudConfig } from '@langchain/community/vectorstores/zep_cloud' +import { Document } from '@langchain/core/documents' import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams, IndexingResult } from '../../../src/Interface' import { getBaseClasses, getCredentialData, getCredentialParam, parseJsonBody } from '../../../src/utils' import { addMMRInputParams, resolveVectorStoreOrRetriever } from '../VectorStoreUtils' -import { FakeEmbeddings } from 'langchain/embeddings/fake' +import { FakeEmbeddings } from '@langchain/classic/embeddings/fake' import { Embeddings } from '@langchain/core/embeddings' class Zep_CloudVectorStores implements INode { @@ -82,7 +82,7 @@ class Zep_CloudVectorStores implements INode { { label: 'Zep Vector Store', name: 'vectorStore', - baseClasses: [this.type, ...getBaseClasses(ZepVectorStore)] + baseClasses: [this.type, ...getBaseClasses(ZepCloudVectorStore)] } ] } @@ -110,7 +110,7 @@ class Zep_CloudVectorStores implements INode { client } try { - await ZepVectorStore.fromDocuments(finalDocs, new FakeEmbeddings(), zepConfig) + await ZepCloudVectorStore.fromDocuments(finalDocs, new FakeEmbeddings(), zepConfig) return { numAdded: finalDocs.length, addedDocs: finalDocs } } catch (e) { throw new Error(e) @@ -124,7 +124,7 @@ class Zep_CloudVectorStores implements INode { const credentialData = await getCredentialData(nodeData.credential ?? '', options) const apiKey = getCredentialParam('apiKey', credentialData, nodeData) - const zepConfig: IZepConfig & Partial = { + const zepConfig: IZepCloudConfig & Partial = { apiKey, collectionName: zepCollection } @@ -143,17 +143,17 @@ interface ZepFilter { filter: Record } -class ZepExistingVS extends ZepVectorStore { +class ZepExistingVS extends ZepCloudVectorStore { filter?: Record - args?: IZepConfig & Partial + args?: IZepCloudConfig & Partial - constructor(embeddings: Embeddings, args: IZepConfig & Partial) { + constructor(embeddings: Embeddings, args: IZepCloudConfig & Partial) { super(embeddings, args) this.filter = args.filter this.args = args } - static async fromExistingIndex(embeddings: Embeddings, dbConfig: IZepConfig & Partial): Promise { + static async fromExistingIndex(embeddings: Embeddings, dbConfig: IZepCloudConfig & Partial): Promise { return new this(embeddings, dbConfig) } } diff --git a/packages/components/package.json b/packages/components/package.json index c8cce49b0e6..8000337232e 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -21,9 +21,10 @@ }, "license": "SEE LICENSE IN LICENSE.md", "dependencies": { + "@anthropic-ai/sdk": "^0.73.0", "@apidevtools/json-schema-ref-parser": "^11.7.0", "@arizeai/openinference-instrumentation-langchain": "^2.0.0", - "@aws-sdk/client-bedrock-runtime": "3.422.0", + "@aws-sdk/client-bedrock-runtime": "3.966.0", "@aws-sdk/client-dynamodb": "^3.360.0", "@aws-sdk/client-kendra": "^3.750.0", "@aws-sdk/client-s3": "^3.844.0", @@ -46,29 +47,35 @@ "@google/generative-ai": "^0.24.0", "@grpc/grpc-js": "^1.10.10", "@huggingface/inference": "^4.13.2", - "@langchain/anthropic": "0.3.33", - "@langchain/aws": "^0.1.11", - "@langchain/baidu-qianfan": "^0.1.0", - "@langchain/cloudflare": "^1.0.1", - "@langchain/cohere": "^0.0.7", - "@langchain/community": "^0.3.47", - "@langchain/core": "0.3.61", - "@langchain/exa": "^0.0.5", - "@langchain/google-genai": "0.2.3", - "@langchain/google-vertexai": "^0.2.10", - "@langchain/groq": "0.1.2", + "@ibm-cloud/watsonx-ai": "1.7.7", + "@langchain/anthropic": "1.3.20", + "@langchain/aws": "1.2.2", + "@langchain/baidu-qianfan": "1.0.1", + "@langchain/deepseek": "1.0.9", + "@langchain/classic": "1.0.15", + "@langchain/cloudflare": "1.0.1", + "@langchain/cohere": "1.0.2", + "@langchain/community": "1.1.12", + "@langchain/core": "1.1.20", + "@langchain/exa": "1.0.1", + "@langchain/google-genai": "2.1.15", + "@langchain/google-vertexai": "2.1.15", + "@langchain/groq": "1.0.4", "@langchain/langgraph": "^0.0.22", - "@langchain/mistralai": "^0.2.0", - "@langchain/mongodb": "^0.0.1", - "@langchain/ollama": "0.2.0", - "@langchain/openai": "0.6.3", - "@langchain/pinecone": "^0.1.3", - "@langchain/qdrant": "^0.0.5", - "@langchain/weaviate": "^0.0.1", - "@langchain/xai": "^0.0.1", + "@langchain/mistralai": "1.0.4", + "@langchain/mongodb": "1.1.0", + "@langchain/ollama": "1.2.2", + "@langchain/openai": "1.2.5", + "@langchain/pinecone": "1.0.1", + "@langchain/qdrant": "1.0.1", + "@langchain/redis": "1.1.0", + "@langchain/tavily": "1.2.0", + "@langchain/textsplitters": "1.0.1", + "@langchain/weaviate": "1.0.1", + "@langchain/xai": "1.3.1", "@mem0/community": "^0.0.1", "@mendable/firecrawl-js": "^1.18.2", - "@mistralai/mistralai": "0.1.3", + "@mistralai/mistralai": "1.14.0", "@modelcontextprotocol/sdk": "^1.10.1", "@modelcontextprotocol/server-brave-search": "^0.6.2", "@modelcontextprotocol/server-github": "^2025.1.23", @@ -127,10 +134,10 @@ "json5": "2.2.3", "jsonpointer": "^5.0.1", "jsonrepair": "^3.11.1", - "langchain": "^0.3.5", + "langchain": "1.2.18", "langfuse": "3.3.4", "langfuse-langchain": "^3.3.4", - "langsmith": "0.1.6", + "langsmith": "0.4.12", "langwatch": "^0.1.1", "linkifyjs": "^4.3.2", "llamaindex": "^0.3.13", @@ -148,7 +155,7 @@ "object-hash": "^3.0.0", "officeparser": "5.1.1", "ollama": "^0.5.11", - "openai": "^4.96.0", + "openai": "6.19.0", "papaparse": "^5.4.1", "pdf-parse": "^1.1.1", "pdfjs-dist": "^5.3.93", @@ -163,12 +170,13 @@ "srt-parser-2": "^1.2.3", "supergateway": "3.0.1", "typeorm": "^0.3.6", + "uuid": "^10.0.0", "weaviate-ts-client": "^1.1.0", "winston": "^3.9.0", "ws": "^8.18.0", "xlsx": "0.18.5", - "zod": "3.22.4", - "zod-to-json-schema": "^3.21.4" + "zod": "^3.25.76 || ^4", + "zod-to-json-schema": "^3.24.6" }, "devDependencies": { "@swc/core": "^1.3.99", diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index c64d601d7e1..b11cae873c3 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -1,5 +1,5 @@ import { BaseMessage } from '@langchain/core/messages' -import { BufferMemory, BufferWindowMemory, ConversationSummaryMemory, ConversationSummaryBufferMemory } from 'langchain/memory' +import { BufferMemory, BufferWindowMemory, ConversationSummaryMemory, ConversationSummaryBufferMemory } from '@langchain/classic/memory' import { Moderation } from '../nodes/moderation/Moderation' /** @@ -428,6 +428,7 @@ export * from './Interface.Evaluation' export interface IServerSideEventStreamer { streamStartEvent(chatId: string, data: any): void streamTokenEvent(chatId: string, data: string): void + streamThinkingEvent(chatId: string, data: string, duration?: number): void streamCustomEvent(chatId: string, eventType: string, data: any): void streamSourceDocumentsEvent(chatId: string, data: any): void streamUsedToolsEvent(chatId: string, data: any): void diff --git a/packages/components/src/agentflowv2Generator.ts b/packages/components/src/agentflowv2Generator.ts index 24d70c6234b..3f3135a79bc 100644 --- a/packages/components/src/agentflowv2Generator.ts +++ b/packages/components/src/agentflowv2Generator.ts @@ -1,8 +1,9 @@ import { ICommonObject } from './Interface' -import { z } from 'zod' +import { z } from 'zod/v3' import { StructuredOutputParser } from '@langchain/core/output_parsers' import { isEqual, get, cloneDeep } from 'lodash' import { BaseChatModel } from '@langchain/core/language_models/chat_models' +import { extractResponseContent } from './utils' const ToolType = z.array(z.string()).describe('List of tools') @@ -329,7 +330,7 @@ const _generateSelectedTools = async (config: Record, question: str const response = await model.invoke(messages) // Try to extract JSON from the response - const responseContent = response.content.toString() + const responseContent = extractResponseContent(response) const jsonMatch = responseContent.match(/```json\n([\s\S]*?)\n```/) || responseContent.match(/{[\s\S]*?}/) if (jsonMatch) { @@ -385,7 +386,7 @@ const generateNodesEdges = async (config: Record, question: string, const response = await model.invoke(messages) // Try to extract JSON from the response - const responseContent = response.content.toString() + const responseContent = extractResponseContent(response) const jsonMatch = responseContent.match(/```json\n([\s\S]*?)\n```/) || responseContent.match(/{[\s\S]*?}/) if (jsonMatch) { diff --git a/packages/components/src/agents.ts b/packages/components/src/agents.ts index cfc43928021..5b14db48dfb 100644 --- a/packages/components/src/agents.ts +++ b/packages/components/src/agents.ts @@ -1,7 +1,7 @@ import { flatten } from 'lodash' import { ChainValues } from '@langchain/core/utils/types' import { AgentStep, AgentAction } from '@langchain/core/agents' -import { BaseMessage, FunctionMessage, AIMessage, isBaseMessage } from '@langchain/core/messages' +import { BaseMessage, FunctionMessage, AIMessage, isAIMessage } from '@langchain/core/messages' import { ToolCall } from '@langchain/core/messages/tool' import { OutputParserException, BaseOutputParser, BaseLLMOutputParser } from '@langchain/core/output_parsers' import { BaseLanguageModel } from '@langchain/core/language_models/base' @@ -12,7 +12,7 @@ import { Serializable } from '@langchain/core/load/serializable' import { renderTemplate } from '@langchain/core/prompts' import { ChatGeneration } from '@langchain/core/outputs' import { Document } from '@langchain/core/documents' -import { BaseChain, SerializedLLMChain } from 'langchain/chains' +import { BaseChain, SerializedLLMChain } from '@langchain/classic/chains' import { CreateReactAgentParams, AgentExecutorInput, @@ -21,8 +21,8 @@ import { BaseMultiActionAgent, RunnableAgent, StoppingMethod -} from 'langchain/agents' -import { formatLogToString } from 'langchain/agents/format_scratchpad/log' +} from '@langchain/classic/agents' +import { formatLogToString } from '@langchain/classic/agents/format_scratchpad/log' import { IUsedTool } from './Interface' import { getErrorMessage } from './error' @@ -753,7 +753,7 @@ export const formatAgentSteps = (steps: AgentStep[]): BaseMessage[] => } else { content = observation } - return new FunctionMessage(content, action.tool) + return new FunctionMessage({ content, name: action.tool }) } if ('messageLog' in action && action.messageLog !== undefined) { const log = action.messageLog as BaseMessage[] @@ -778,7 +778,7 @@ export const createReactAgent = async ({ llm, tools, prompt }: CreateReactAgentP tool_names: toolNames.join(', ') }) // TODO: Add .bind to core runnable interface. - const llmWithStop = (llm as BaseLanguageModel).bind({ + const llmWithStop = (llm as BaseLanguageModel).withConfig({ stop: ['\nObservation:'] }) const agent = RunnableSequence.from([ @@ -964,7 +964,7 @@ export class ToolCallingAgentOutputParser extends AgentMultiActionOutputParser { } async parseResult(generations: ChatGeneration[]) { - if ('message' in generations[0] && isBaseMessage(generations[0].message)) { + if ('message' in generations[0] && isAIMessage(generations[0].message)) { return parseAIMessageToToolAction(generations[0].message) } throw new Error('parseResult on ToolCallingAgentOutputParser only works on ChatGeneration output') diff --git a/packages/components/src/followUpPrompts.ts b/packages/components/src/followUpPrompts.ts index 72014c6d40e..bc3b2e0f942 100644 --- a/packages/components/src/followUpPrompts.ts +++ b/packages/components/src/followUpPrompts.ts @@ -4,7 +4,7 @@ import { ChatAnthropic } from '@langchain/anthropic' import { ChatGoogleGenerativeAI } from '@langchain/google-genai' import { ChatMistralAI } from '@langchain/mistralai' import { ChatOpenAI, AzureChatOpenAI } from '@langchain/openai' -import { z } from 'zod' +import { z } from 'zod/v3' import { PromptTemplate } from '@langchain/core/prompts' import { StructuredOutputParser } from '@langchain/core/output_parsers' import { ChatGroq } from '@langchain/groq' @@ -16,11 +16,15 @@ const FollowUpPromptType = z }) .describe('Generate Follow Up Prompts') +export interface FollowUpPromptResult { + questions: string[] +} + export const generateFollowUpPrompts = async ( followUpPromptsConfig: FollowUpPromptConfig, apiMessageContent: string, options: ICommonObject -) => { +): Promise => { if (followUpPromptsConfig) { if (!followUpPromptsConfig.status) return undefined const providerConfig = followUpPromptsConfig[followUpPromptsConfig.selectedProvider] @@ -37,9 +41,11 @@ export const generateFollowUpPrompts = async ( temperature: parseFloat(`${providerConfig.temperature}`) }) // @ts-ignore - const structuredLLM = llm.withStructuredOutput(FollowUpPromptType) + const structuredLLM = llm.withStructuredOutput(FollowUpPromptType, { + method: 'functionCalling' + }) const structuredResponse = await structuredLLM.invoke(followUpPromptsPrompt) - return structuredResponse + return structuredResponse as FollowUpPromptResult } case FollowUpPromptProvider.AZURE_OPENAI: { const azureOpenAIApiKey = credentialData['azureOpenAIApiKey'] @@ -68,7 +74,7 @@ export const generateFollowUpPrompts = async ( history: apiMessageContent, format_instructions: formatInstructions }) - return structuredResponse + return structuredResponse as FollowUpPromptResult } case FollowUpPromptProvider.GOOGLE_GENAI: { const model = new ChatGoogleGenerativeAI({ @@ -76,9 +82,11 @@ export const generateFollowUpPrompts = async ( model: providerConfig.modelName, temperature: parseFloat(`${providerConfig.temperature}`) }) - const structuredLLM = model.withStructuredOutput(FollowUpPromptType) + const structuredLLM = model.withStructuredOutput(FollowUpPromptType, { + method: 'functionCalling' + }) const structuredResponse = await structuredLLM.invoke(followUpPromptsPrompt) - return structuredResponse + return structuredResponse as FollowUpPromptResult } case FollowUpPromptProvider.MISTRALAI: { const model = new ChatMistralAI({ @@ -87,9 +95,11 @@ export const generateFollowUpPrompts = async ( temperature: parseFloat(`${providerConfig.temperature}`) }) // @ts-ignore - const structuredLLM = model.withStructuredOutput(FollowUpPromptType) + const structuredLLM = model.withStructuredOutput(FollowUpPromptType, { + method: 'functionCalling' + }) const structuredResponse = await structuredLLM.invoke(followUpPromptsPrompt) - return structuredResponse + return structuredResponse as FollowUpPromptResult } case FollowUpPromptProvider.OPENAI: { const model = new ChatOpenAI({ @@ -99,9 +109,11 @@ export const generateFollowUpPrompts = async ( useResponsesApi: true }) // @ts-ignore - const structuredLLM = model.withStructuredOutput(FollowUpPromptType) + const structuredLLM = model.withStructuredOutput(FollowUpPromptType, { + method: 'functionCalling' + }) const structuredResponse = await structuredLLM.invoke(followUpPromptsPrompt) - return structuredResponse + return structuredResponse as FollowUpPromptResult } case FollowUpPromptProvider.GROQ: { const llm = new ChatGroq({ @@ -109,9 +121,11 @@ export const generateFollowUpPrompts = async ( model: providerConfig.modelName, temperature: parseFloat(`${providerConfig.temperature}`) }) - const structuredLLM = llm.withStructuredOutput(FollowUpPromptType) + const structuredLLM = llm.withStructuredOutput(FollowUpPromptType, { + method: 'functionCalling' + }) const structuredResponse = await structuredLLM.invoke(followUpPromptsPrompt) - return structuredResponse + return structuredResponse as FollowUpPromptResult } case FollowUpPromptProvider.OLLAMA: { const ollamaClient = new Ollama({ diff --git a/packages/components/src/indexing.ts b/packages/components/src/indexing.ts index 25d0f27071d..44c22469625 100644 --- a/packages/components/src/indexing.ts +++ b/packages/components/src/indexing.ts @@ -1,9 +1,8 @@ import { VectorStore } from '@langchain/core/vectorstores' import { v5 as uuidv5 } from 'uuid' import { RecordManagerInterface, UUIDV5_NAMESPACE } from '@langchain/community/indexes/base' -import { insecureHash } from '@langchain/core/utils/hash' +import { sha256 } from '@langchain/core/utils/hash' import { Document, DocumentInterface } from '@langchain/core/documents' -import { BaseDocumentLoader } from 'langchain/document_loaders/base.js' import { IndexingResult } from './Interface' type Metadata = Record @@ -14,6 +13,26 @@ export interface ExtendedRecordManagerInterface extends RecordManagerInterface { type StringOrDocFunc = string | ((doc: DocumentInterface) => string) +/** + * Interface that defines the methods for loading and splitting documents. + */ +export interface DocumentLoader { + load(): Promise +} + +/** + * Abstract class that provides a default implementation for the + * loadAndSplit() method from the DocumentLoader interface. The load() + * method is left abstract and needs to be implemented by subclasses. + */ +export abstract class BaseDocumentLoader implements DocumentLoader { + /** + * Loads the documents. + * @returns A Promise that resolves with an array of Document instances. + */ + abstract load(): Promise +} + export interface HashedDocumentInterface extends DocumentInterface { uid: string hash_?: string @@ -101,13 +120,13 @@ export class _HashedDocument implements HashedDocumentInterface { } private _hashStringToUUID(inputString: string): string { - const hash_value = insecureHash(inputString) + const hash_value = sha256(inputString) return uuidv5(hash_value, UUIDV5_NAMESPACE) } private _hashNestedDictToUUID(data: Record): string { const serialized_data = JSON.stringify(data, Object.keys(data).sort()) - const hash_value = insecureHash(serialized_data) + const hash_value = sha256(serialized_data) return uuidv5(hash_value, UUIDV5_NAMESPACE) } } diff --git a/packages/components/src/multiModalUtils.ts b/packages/components/src/multiModalUtils.ts index b048e8a91a9..c0eb4826f98 100644 --- a/packages/components/src/multiModalUtils.ts +++ b/packages/components/src/multiModalUtils.ts @@ -23,16 +23,14 @@ export const addImagesToMessages = async ( imageContent.push({ type: 'image_url', image_url: { - url: bf, - detail: multiModalOption.image.imageResolution ?? 'low' + url: bf } }) } else if (upload.type == 'url' && bf) { imageContent.push({ type: 'image_url', image_url: { - url: bf, - detail: multiModalOption.image.imageResolution ?? 'low' + url: bf } }) } diff --git a/packages/components/src/secureZodParser.ts b/packages/components/src/secureZodParser.ts index 544a8f7552c..4f8a94ee16c 100644 --- a/packages/components/src/secureZodParser.ts +++ b/packages/components/src/secureZodParser.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' /** * This parser safely handles Zod schema strings without allowing arbitrary code execution diff --git a/packages/components/src/speechToText.ts b/packages/components/src/speechToText.ts index 29097655ab7..e59368a5eae 100644 --- a/packages/components/src/speechToText.ts +++ b/packages/components/src/speechToText.ts @@ -80,7 +80,7 @@ export const convertSpeechToText = async (upload: IFileUpload, speechToTextConfi const apiVersion = credentialData.apiVersion || '2024-05-15-preview' const formData = new FormData() - const audioBlob = new Blob([audio_file], { type: upload.type }) + const audioBlob = new Blob([new Uint8Array(audio_file)], { type: upload.type }) formData.append('audio', audioBlob, upload.name) const channelsStr = speechToTextConfig.channels || '0,1' diff --git a/packages/components/src/textToSpeech.ts b/packages/components/src/textToSpeech.ts index fdc17af65ba..c4611806406 100644 --- a/packages/components/src/textToSpeech.ts +++ b/packages/components/src/textToSpeech.ts @@ -63,7 +63,7 @@ export const convertTextToSpeechStream = async ( } ) - const stream = response.body as unknown as Readable + const stream = Readable.fromWeb(response.body as unknown as ReadableStream) if (!stream) { throw new Error('Failed to get response stream') } diff --git a/packages/components/src/utils.ts b/packages/components/src/utils.ts index 91bf5d4f1cb..5fa142856ed 100644 --- a/packages/components/src/utils.ts +++ b/packages/components/src/utils.ts @@ -3,20 +3,21 @@ import { load } from 'cheerio' import * as fs from 'fs' import * as path from 'path' import { JSDOM } from 'jsdom' -import { z } from 'zod' +import { z } from 'zod/v3' import { cloneDeep, omit, get } from 'lodash' import TurndownService from 'turndown' import { DataSource, Equal } from 'typeorm' import { ICommonObject, IDatabaseEntity, IFileUpload, IMessage, INodeData, IVariable, MessageContentImageUrl } from './Interface' import { BaseChatModel } from '@langchain/core/language_models/chat_models' import { AES, enc } from 'crypto-js' -import { AIMessage, HumanMessage, BaseMessage } from '@langchain/core/messages' +import { AIMessage, AIMessageChunk, HumanMessage, BaseMessage } from '@langchain/core/messages' +import { RunnableLambda } from '@langchain/core/runnables' import { Document } from '@langchain/core/documents' import { getFileFromStorage } from './storageUtils' import { GetSecretValueCommand, SecretsManagerClient, SecretsManagerClientConfig } from '@aws-sdk/client-secrets-manager' import { customGet } from '../nodes/sequentialagents/commonUtils' -import { TextSplitter } from 'langchain/text_splitter' -import { DocumentLoader } from 'langchain/document_loaders/base' +import { TextSplitter } from '@langchain/textsplitters' +import { DocumentLoader } from '@langchain/classic/document_loaders/base' import { NodeVM } from '@flowiseai/nodevm' import { Sandbox } from '@e2b/code-interpreter' import { secureFetch, checkDenyList, secureAxiosRequest } from './httpSecurity' @@ -301,6 +302,27 @@ export const transformBracesWithColon = (input: string): string => { }) } +/** + * Creates a RunnableLambda that extracts text content from a chat model response, + * filtering out reasoning/thinking content blocks that reasoning models may return. + */ +export const createTextOnlyOutputParser = () => { + return new RunnableLambda({ + func: (response: AIMessageChunk) => { + if (typeof response.content === 'string') { + return response.content + } + if (Array.isArray(response.content)) { + return response.content + .filter((block: any) => block.type === 'text' || block.type === 'text_delta') + .map((block: any) => block.text ?? '') + .join('') + } + return '' + } + }) +} + /** * Crawl all available urls given a domain url and limit * @param {string} url @@ -2110,7 +2132,9 @@ export const configureStructuredOutput = (llmNodeInstance: BaseChatModel, struct const structuredOutputSchema = z.object(zodObj) // @ts-ignore - return llmNodeInstance.withStructuredOutput(structuredOutputSchema) + return llmNodeInstance.withStructuredOutput(structuredOutputSchema, { + method: 'functionCalling' + }) } catch (exception) { console.error(exception) return llmNodeInstance @@ -2217,3 +2241,34 @@ export const createZodSchemaFromJSON = (jsonSchema: any): z.ZodTypeAny => { // Fallback to any for unknown types return z.any() } + +export const extractResponseContent = (response: any): string => { + if (!response) return '' + + const content = response.content + + if (Array.isArray(content)) { + return content + .map((item: any) => { + if ((item.text && !item.type) || (item.type === 'text' && item.text)) { + return item.text + } + return '' + }) + .filter((text: string) => text) + .join('\n') + } + + if (typeof content === 'string') return content + if (content != null) return JSON.stringify(content, null, 2) + + return JSON.stringify(response, null, 2) +} + +export const isReasoningModelOpenAI = (name: string): boolean => { + if (/^o[134]/.test(name)) return true + if (name === 'codex-mini') return true + if (name.includes('gpt-5') && name.includes('-chat')) return false + if (name.includes('gpt-5')) return true + return false +} diff --git a/packages/components/src/validator.ts b/packages/components/src/validator.ts index ca248a94ba9..43789b77489 100644 --- a/packages/components/src/validator.ts +++ b/packages/components/src/validator.ts @@ -1,4 +1,5 @@ import path from 'path' +import sanitize from 'sanitize-filename' import { getUserHome, isAllowedUploadMimeType, mapMimeTypeToExt } from './utils' /** @@ -260,3 +261,37 @@ export const validateVectorStorePath = (userProvidedPath: string | undefined): s return resolvedPath } + +/** + * Sanitize a file name to prevent path traversal attacks. + * Strips common storage prefixes, extracts the basename, runs it through + * the `sanitize-filename` package, and rejects anything that still looks unsafe. + * + * @param {string} name The file name to sanitize + */ +export const sanitizeFileName = (name: string): string => { + if (!name || typeof name !== 'string') { + throw new Error('Invalid file name: name is required') + } + // Strip the FILE-STORAGE:: prefix if present + let stripped = name.replace(/^FILE-STORAGE::/, '') + // Decode percent-encoded traversal sequences before basename extraction + try { + stripped = decodeURIComponent(stripped) + } catch (_) { + // If decoding fails the raw string is fine — basename will still strip dirs + } + // Normalize backslashes to forward slashes so path.basename works on all + // platforms (on Linux, path.basename does not treat \ as a separator) + stripped = stripped.replace(/\\/g, '/') + // Extract only the base filename — removes all directory components + let baseName = path.basename(stripped) + // Run through sanitize-filename to strip OS-reserved chars, control chars, etc. + baseName = sanitize(baseName) + // Remove leading dots to prevent hidden files or relative path references + baseName = baseName.replace(/^\.+/, '') + if (!baseName || isUnsafeFilePath(baseName)) { + throw new Error(`Invalid or unsafe file name: ${name}`) + } + return baseName +} diff --git a/packages/server/package.json b/packages/server/package.json index 3ea7a993537..05ae807b53e 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -87,7 +87,6 @@ "@types/passport": "^1.0.16", "@types/passport-jwt": "^4.0.1", "@types/passport-local": "^1.0.38", - "@types/uuid": "^9.0.7", "async-mutex": "^0.4.0", "axios": "1.12.0", "bcryptjs": "^2.4.3", @@ -128,7 +127,7 @@ "mysql2": "^3.11.3", "nanoid": "3", "nodemailer": "^7.0.7", - "openai": "^4.96.0", + "openai": "6.19.0", "passport": "^0.7.0", "passport-auth0": "^1.4.4", "passport-cookie": "^1.0.9", @@ -148,7 +147,7 @@ "stripe": "^15.6.0", "turndown": "^7.2.0", "typeorm": "^0.3.6", - "uuid": "^9.0.1", + "uuid": "^10.0.0", "winston": "^3.9.0", "winston-azure-blob": "^1.5.0", "winston-daily-rotate-file": "^5.0.0" diff --git a/packages/server/src/Interface.ts b/packages/server/src/Interface.ts index cff078a25a9..60175e23528 100644 --- a/packages/server/src/Interface.ts +++ b/packages/server/src/Interface.ts @@ -83,6 +83,7 @@ export interface IChatMessage { usedTools?: string fileAnnotations?: string agentReasoning?: string + reasonContent?: string fileUploads?: string artifacts?: string chatType: string diff --git a/packages/server/src/controllers/chat-messages/index.ts b/packages/server/src/controllers/chat-messages/index.ts index 79c5cc64d99..d926d9e9b32 100644 --- a/packages/server/src/controllers/chat-messages/index.ts +++ b/packages/server/src/controllers/chat-messages/index.ts @@ -336,6 +336,9 @@ const parseAPIResponse = (apiResponse: ChatMessage | ChatMessage[]): ChatMessage if (parsedResponse.agentReasoning) { parsedResponse.agentReasoning = JSON.parse(parsedResponse.agentReasoning) } + if (parsedResponse.reasonContent) { + parsedResponse.reasonContent = JSON.parse(parsedResponse.reasonContent) + } if (parsedResponse.fileUploads) { parsedResponse.fileUploads = JSON.parse(parsedResponse.fileUploads) } diff --git a/packages/server/src/database/entities/ChatMessage.ts b/packages/server/src/database/entities/ChatMessage.ts index e44f05a9dd3..0919761b191 100644 --- a/packages/server/src/database/entities/ChatMessage.ts +++ b/packages/server/src/database/entities/ChatMessage.ts @@ -37,6 +37,9 @@ export class ChatMessage implements IChatMessage { @Column({ nullable: true, type: 'text' }) agentReasoning?: string + @Column({ nullable: true, type: 'text' }) + reasonContent?: string + @Column({ nullable: true, type: 'text' }) fileUploads?: string diff --git a/packages/server/src/database/migrations/mariadb/1764759496768-AddReasonContentToChatMessage.ts b/packages/server/src/database/migrations/mariadb/1764759496768-AddReasonContentToChatMessage.ts new file mode 100644 index 00000000000..61da3e550c2 --- /dev/null +++ b/packages/server/src/database/migrations/mariadb/1764759496768-AddReasonContentToChatMessage.ts @@ -0,0 +1,12 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddReasonContentToChatMessage1764759496768 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + const columnExists = await queryRunner.hasColumn('chat_message', 'reasonContent') + if (!columnExists) queryRunner.query(`ALTER TABLE \`chat_message\` ADD COLUMN \`reasonContent\` LONGTEXT;`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`chat_message\` DROP COLUMN \`reasonContent\`;`) + } +} diff --git a/packages/server/src/database/migrations/mariadb/index.ts b/packages/server/src/database/migrations/mariadb/index.ts index b0ec9e5d5af..f9d3d5fdcd8 100644 --- a/packages/server/src/database/migrations/mariadb/index.ts +++ b/packages/server/src/database/migrations/mariadb/index.ts @@ -42,7 +42,7 @@ import { AddTextToSpeechToChatFlow1759419231100 } from './1759419231100-AddTextT import { AddChatFlowNameIndex1759424809984 } from './1759424809984-AddChatFlowNameIndex' import { FixDocumentStoreFileChunkLongText1765000000000 } from './1765000000000-FixDocumentStoreFileChunkLongText' import { AddApiKeyPermission1765360298674 } from './1765360298674-AddApiKeyPermission' - +import { AddReasonContentToChatMessage1764759496768 } from './1764759496768-AddReasonContentToChatMessage' import { AddAuthTables1720230151482 } from '../../../enterprise/database/migrations/mariadb/1720230151482-AddAuthTables' import { AddWorkspace1725437498242 } from '../../../enterprise/database/migrations/mariadb/1725437498242-AddWorkspace' import { AddWorkspaceShared1726654922034 } from '../../../enterprise/database/migrations/mariadb/1726654922034-AddWorkspaceShared' @@ -110,5 +110,6 @@ export const mariadbMigrations = [ AddTextToSpeechToChatFlow1759419231100, AddChatFlowNameIndex1759424809984, FixDocumentStoreFileChunkLongText1765000000000, - AddApiKeyPermission1765360298674 + AddApiKeyPermission1765360298674, + AddReasonContentToChatMessage1764759496768 ] diff --git a/packages/server/src/database/migrations/mysql/1764759496768-AddReasonContentToChatMessage.ts b/packages/server/src/database/migrations/mysql/1764759496768-AddReasonContentToChatMessage.ts new file mode 100644 index 00000000000..61da3e550c2 --- /dev/null +++ b/packages/server/src/database/migrations/mysql/1764759496768-AddReasonContentToChatMessage.ts @@ -0,0 +1,12 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddReasonContentToChatMessage1764759496768 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + const columnExists = await queryRunner.hasColumn('chat_message', 'reasonContent') + if (!columnExists) queryRunner.query(`ALTER TABLE \`chat_message\` ADD COLUMN \`reasonContent\` LONGTEXT;`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`chat_message\` DROP COLUMN \`reasonContent\`;`) + } +} diff --git a/packages/server/src/database/migrations/mysql/index.ts b/packages/server/src/database/migrations/mysql/index.ts index 1f34da60bfc..a22168aefcf 100644 --- a/packages/server/src/database/migrations/mysql/index.ts +++ b/packages/server/src/database/migrations/mysql/index.ts @@ -43,7 +43,7 @@ import { AddTextToSpeechToChatFlow1759419216034 } from './1759419216034-AddTextT import { AddChatFlowNameIndex1759424828558 } from './1759424828558-AddChatFlowNameIndex' import { FixDocumentStoreFileChunkLongText1765000000000 } from './1765000000000-FixDocumentStoreFileChunkLongText' import { AddApiKeyPermission1765360298674 } from './1765360298674-AddApiKeyPermission' - +import { AddReasonContentToChatMessage1764759496768 } from './1764759496768-AddReasonContentToChatMessage' import { AddAuthTables1720230151482 } from '../../../enterprise/database/migrations/mysql/1720230151482-AddAuthTables' import { AddWorkspace1720230151484 } from '../../../enterprise/database/migrations/mysql/1720230151484-AddWorkspace' import { AddWorkspaceShared1726654922034 } from '../../../enterprise/database/migrations/mysql/1726654922034-AddWorkspaceShared' @@ -112,5 +112,6 @@ export const mysqlMigrations = [ AddTextToSpeechToChatFlow1759419216034, AddChatFlowNameIndex1759424828558, FixDocumentStoreFileChunkLongText1765000000000, - AddApiKeyPermission1765360298674 + AddApiKeyPermission1765360298674, + AddReasonContentToChatMessage1764759496768 ] diff --git a/packages/server/src/database/migrations/postgres/1764759496768-AddReasonContentToChatMessage.ts b/packages/server/src/database/migrations/postgres/1764759496768-AddReasonContentToChatMessage.ts new file mode 100644 index 00000000000..dac45fdd11f --- /dev/null +++ b/packages/server/src/database/migrations/postgres/1764759496768-AddReasonContentToChatMessage.ts @@ -0,0 +1,11 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddReasonContentToChatMessage1764759496768 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "chat_message" ADD COLUMN IF NOT EXISTS "reasonContent" TEXT;`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "chat_message" DROP COLUMN "reasonContent";`) + } +} diff --git a/packages/server/src/database/migrations/postgres/index.ts b/packages/server/src/database/migrations/postgres/index.ts index cd25296cc38..9303033e02b 100644 --- a/packages/server/src/database/migrations/postgres/index.ts +++ b/packages/server/src/database/migrations/postgres/index.ts @@ -41,7 +41,7 @@ import { ModifyChatflowType1755066758601 } from './1755066758601-ModifyChatflowT import { AddTextToSpeechToChatFlow1759419194331 } from './1759419194331-AddTextToSpeechToChatFlow' import { AddChatFlowNameIndex1759424903973 } from './1759424903973-AddChatFlowNameIndex' import { AddApiKeyPermission1765360298674 } from './1765360298674-AddApiKeyPermission' - +import { AddReasonContentToChatMessage1764759496768 } from './1764759496768-AddReasonContentToChatMessage' import { AddAuthTables1720230151482 } from '../../../enterprise/database/migrations/postgres/1720230151482-AddAuthTables' import { AddWorkspace1720230151484 } from '../../../enterprise/database/migrations/postgres/1720230151484-AddWorkspace' import { AddWorkspaceShared1726654922034 } from '../../../enterprise/database/migrations/postgres/1726654922034-AddWorkspaceShared' @@ -108,5 +108,6 @@ export const postgresMigrations = [ ModifyChatflowType1755066758601, AddTextToSpeechToChatFlow1759419194331, AddChatFlowNameIndex1759424903973, - AddApiKeyPermission1765360298674 + AddApiKeyPermission1765360298674, + AddReasonContentToChatMessage1764759496768 ] diff --git a/packages/server/src/database/migrations/sqlite/1764759496768-AddReasonContentToChatMessage.ts b/packages/server/src/database/migrations/sqlite/1764759496768-AddReasonContentToChatMessage.ts new file mode 100644 index 00000000000..bfe20a86199 --- /dev/null +++ b/packages/server/src/database/migrations/sqlite/1764759496768-AddReasonContentToChatMessage.ts @@ -0,0 +1,11 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddReasonContentToChatMessage1764759496768 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "chat_message" ADD COLUMN "reasonContent" TEXT;`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "chat_message" DROP COLUMN "reasonContent";`) + } +} diff --git a/packages/server/src/database/migrations/sqlite/index.ts b/packages/server/src/database/migrations/sqlite/index.ts index b793abab7d0..90b42a2475f 100644 --- a/packages/server/src/database/migrations/sqlite/index.ts +++ b/packages/server/src/database/migrations/sqlite/index.ts @@ -39,7 +39,7 @@ import { ModifyChatflowType1755066758601 } from './1755066758601-ModifyChatflowT import { AddTextToSpeechToChatFlow1759419136055 } from './1759419136055-AddTextToSpeechToChatFlow' import { AddChatFlowNameIndex1759424923093 } from './1759424923093-AddChatFlowNameIndex' import { AddApiKeyPermission1765360298674 } from './1765360298674-AddApiKeyPermission' - +import { AddReasonContentToChatMessage1764759496768 } from './1764759496768-AddReasonContentToChatMessage' import { AddAuthTables1720230151482 } from '../../../enterprise/database/migrations/sqlite/1720230151482-AddAuthTables' import { AddWorkspace1720230151484 } from '../../../enterprise/database/migrations/sqlite/1720230151484-AddWorkspace' import { AddWorkspaceShared1726654922034 } from '../../../enterprise/database/migrations/sqlite/1726654922034-AddWorkspaceShared' @@ -104,5 +104,6 @@ export const sqliteMigrations = [ ModifyChatflowType1755066758601, AddTextToSpeechToChatFlow1759419136055, AddChatFlowNameIndex1759424923093, - AddApiKeyPermission1765360298674 + AddApiKeyPermission1765360298674, + AddReasonContentToChatMessage1764759496768 ] diff --git a/packages/server/src/enterprise/Interface.Enterprise.ts b/packages/server/src/enterprise/Interface.Enterprise.ts index 15052994205..65f168aad62 100644 --- a/packages/server/src/enterprise/Interface.Enterprise.ts +++ b/packages/server/src/enterprise/Interface.Enterprise.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' export enum UserStatus { INVITED = 'invited', diff --git a/packages/server/src/queue/RedisEventPublisher.ts b/packages/server/src/queue/RedisEventPublisher.ts index cb8aa6ecf1f..da3f54c368c 100644 --- a/packages/server/src/queue/RedisEventPublisher.ts +++ b/packages/server/src/queue/RedisEventPublisher.ts @@ -125,6 +125,22 @@ export class RedisEventPublisher implements IServerSideEventStreamer { } } + streamThinkingEvent(chatId: string, data: string, duration?: number) { + try { + this.redisPublisher.publish( + chatId, + JSON.stringify({ + chatId, + eventType: 'thinking', + data, + duration + }) + ) + } catch (error) { + console.error('Error streaming thinking event:', error) + } + } + streamSourceDocumentsEvent(chatId: string, data: any) { try { this.redisPublisher.publish( diff --git a/packages/server/src/queue/RedisEventSubscriber.ts b/packages/server/src/queue/RedisEventSubscriber.ts index c70d6f73284..c26c46ccba9 100644 --- a/packages/server/src/queue/RedisEventSubscriber.ts +++ b/packages/server/src/queue/RedisEventSubscriber.ts @@ -102,7 +102,7 @@ export class RedisEventSubscriber { private handleEvent(message: string) { // Parse the message from Redis const event = JSON.parse(message) - const { eventType, chatId, chatMessageId, data } = event + const { eventType, chatId, chatMessageId, data, duration } = event // Stream the event to the client switch (eventType) { @@ -112,6 +112,9 @@ export class RedisEventSubscriber { case 'token': this.sseStreamer.streamTokenEvent(chatId, data) break + case 'thinking': + this.sseStreamer.streamThinkingEvent(chatId, data, duration) + break case 'sourceDocuments': this.sseStreamer.streamSourceDocumentsEvent(chatId, data) break diff --git a/packages/server/src/services/agentflowv2-generator/index.ts b/packages/server/src/services/agentflowv2-generator/index.ts index c41a2018477..694dc3835c4 100644 --- a/packages/server/src/services/agentflowv2-generator/index.ts +++ b/packages/server/src/services/agentflowv2-generator/index.ts @@ -5,7 +5,7 @@ import { getRunningExpressApp } from '../../utils/getRunningExpressApp' import path from 'path' import * as fs from 'fs' import { generateAgentflowv2 as generateAgentflowv2_json } from 'flowise-components' -import { z } from 'zod' +import { z } from 'zod/v3' import { sysPrompt } from './prompt' import { databaseEntities } from '../../utils' import logger from '../../utils/logger' diff --git a/packages/server/src/services/assistants/index.ts b/packages/server/src/services/assistants/index.ts index 0151124b9ca..b6c9d539369 100644 --- a/packages/server/src/services/assistants/index.ts +++ b/packages/server/src/services/assistants/index.ts @@ -1,4 +1,4 @@ -import { ICommonObject } from 'flowise-components' +import { extractResponseContent, ICommonObject } from 'flowise-components' import { StatusCodes } from 'http-status-codes' import { cloneDeep, isEqual, uniqWith } from 'lodash' import OpenAI from 'openai' @@ -193,7 +193,7 @@ const deleteAssistant = async (assistantId: string, isDeleteBoth: any, workspace const openai = new OpenAI({ apiKey: openAIApiKey }) const dbResponse = await appServer.AppDataSource.getRepository(Assistant).delete({ id: assistantId }) - if (isDeleteBoth) await openai.beta.assistants.del(assistantDetails.id) + if (isDeleteBoth) await openai.beta.assistants.delete(assistantDetails.id) return dbResponse } catch (error: any) { throw new InternalFlowiseError(StatusCodes.INTERNAL_SERVER_ERROR, `Error deleting assistant - ${getErrorMessage(error)}`) @@ -529,8 +529,7 @@ const generateAssistantInstruction = async (task: string, selectedChatModel: ICo content: ASSISTANT_PROMPT_GENERATOR.replace('{{task}}', task) } ]) - const content = response?.content || response.kwargs?.content - + const content = extractResponseContent(response) return { content } } diff --git a/packages/server/src/services/documentstore/index.ts b/packages/server/src/services/documentstore/index.ts index 20de181325c..ee145276d94 100644 --- a/packages/server/src/services/documentstore/index.ts +++ b/packages/server/src/services/documentstore/index.ts @@ -2,6 +2,7 @@ import { Document } from '@langchain/core/documents' import { addArrayFilesToStorage, addSingleFileToStorage, + extractResponseContent, getFileFromStorage, getFileFromUpload, ICommonObject, @@ -2134,7 +2135,7 @@ const refreshDocStoreMiddleware = async ( } } -const generateDocStoreToolDesc = async (docStoreId: string, selectedChatModel: ICommonObject): Promise => { +const generateDocStoreToolDesc = async (docStoreId: string, selectedChatModel: ICommonObject): Promise => { try { const appServer = getRunningExpressApp() @@ -2176,7 +2177,8 @@ const generateDocStoreToolDesc = async (docStoreId: string, selectedChatModel: I const response = await llmNodeInstance.invoke( DOCUMENTSTORE_TOOL_DESCRIPTION_PROMPT_GENERATOR.replace('{context}', chunksPageContent) ) - return response + const content = extractResponseContent(response) + return { content } } throw new InternalFlowiseError( diff --git a/packages/server/src/services/evaluations/LLMEvaluationRunner.ts b/packages/server/src/services/evaluations/LLMEvaluationRunner.ts index 351fdad6092..6b86b111f2e 100644 --- a/packages/server/src/services/evaluations/LLMEvaluationRunner.ts +++ b/packages/server/src/services/evaluations/LLMEvaluationRunner.ts @@ -1,5 +1,5 @@ import { convertSchemaToZod, ICommonObject } from 'flowise-components' -import { z } from 'zod' +import { z } from 'zod/v3' import { RunnableSequence } from '@langchain/core/runnables' import { PromptTemplate } from '@langchain/core/prompts' import { getRunningExpressApp } from '../../utils/getRunningExpressApp' @@ -27,7 +27,9 @@ export class LLMEvaluationRunner { const llmEvaluator = llmEvaluatorMap[i] let evaluator = llmEvaluator.evaluator const schema = z.object(convertSchemaToZod(JSON.stringify(evaluator.outputSchema))) - const modelWithStructuredOutput = this.llm.withStructuredOutput(schema) + const modelWithStructuredOutput = this.llm.withStructuredOutput(schema, { + method: 'functionCalling' + }) const llmExecutor = RunnableSequence.from([ PromptTemplate.fromTemplate(evaluator.prompt as string), modelWithStructuredOutput diff --git a/packages/server/src/services/openai-assistants-vector-store/index.ts b/packages/server/src/services/openai-assistants-vector-store/index.ts index c7b08262006..851ce86b5fd 100644 --- a/packages/server/src/services/openai-assistants-vector-store/index.ts +++ b/packages/server/src/services/openai-assistants-vector-store/index.ts @@ -145,7 +145,7 @@ const deleteAssistantVectorStore = async (credentialId: string, vectorStoreId: s } const openai = new OpenAI({ apiKey: openAIApiKey }) - const dbResponse = await openai.vectorStores.del(vectorStoreId) + const dbResponse = await openai.vectorStores.delete(vectorStoreId) return dbResponse } catch (error) { throw new InternalFlowiseError( @@ -232,7 +232,7 @@ const deleteFilesFromAssistantVectorStore = async (credentialId: string, vectorS const deletedFileIds = [] let count = 0 for (const file of file_ids) { - const res = await openai.vectorStores.files.del(vectorStoreId, file) + const res = await openai.vectorStores.files.delete(file, { vector_store_id: vectorStoreId }) if (res.deleted) { deletedFileIds.push(file) count += 1 diff --git a/packages/server/src/utils/SSEStreamer.ts b/packages/server/src/utils/SSEStreamer.ts index 2d858a6cf9f..afd656349d0 100644 --- a/packages/server/src/utils/SSEStreamer.ts +++ b/packages/server/src/utils/SSEStreamer.ts @@ -69,6 +69,18 @@ export class SSEStreamer implements IServerSideEventStreamer { } } + streamThinkingEvent(chatId: string, data: string, duration?: number) { + const client = this.clients[chatId] + if (client) { + const clientResponse = { + event: 'thinking', + data: data, + duration: duration + } + client.response.write('message:\ndata:' + JSON.stringify(clientResponse) + '\n\n') + } + } + streamSourceDocumentsEvent(chatId: string, data: any) { const client = this.clients[chatId] if (client) { diff --git a/packages/server/src/utils/buildAgentGraph.ts b/packages/server/src/utils/buildAgentGraph.ts index 31489170987..8ba0b42cd16 100644 --- a/packages/server/src/utils/buildAgentGraph.ts +++ b/packages/server/src/utils/buildAgentGraph.ts @@ -1029,7 +1029,7 @@ const compileSeqAgentsGraph = async (params: SeqAgentsGraphParams) => { } const finalQuestion = uploadedFilesContent ? `${uploadedFilesContent}\n\n${question}` : question - let humanMsg: { messages: HumanMessage[] | ToolMessage[] } | null = { + let humanMsg: { messages: BaseMessage[] } | null = { messages: [...prependMessages, new HumanMessage({ content: finalQuestion })] } diff --git a/packages/server/src/utils/buildAgentflow.ts b/packages/server/src/utils/buildAgentflow.ts index 02803326df6..d9362475063 100644 --- a/packages/server/src/utils/buildAgentflow.ts +++ b/packages/server/src/utils/buildAgentflow.ts @@ -2278,6 +2278,7 @@ export const executeAgentFlow = async ({ if (lastNodeOutput?.usedTools) apiMessage.usedTools = JSON.stringify(lastNodeOutput.usedTools) if (lastNodeOutput?.fileAnnotations) apiMessage.fileAnnotations = JSON.stringify(lastNodeOutput.fileAnnotations) if (lastNodeOutput?.artifacts) apiMessage.artifacts = JSON.stringify(lastNodeOutput.artifacts) + if (lastNodeOutput?.reasonContent) apiMessage.reasonContent = JSON.stringify(lastNodeOutput.reasonContent) if (chatflow.followUpPrompts) { const followUpPromptsConfig = JSON.parse(chatflow.followUpPrompts) const followUpPrompts = await generateFollowUpPrompts(followUpPromptsConfig, apiMessage.content, { diff --git a/packages/server/src/utils/constants.ts b/packages/server/src/utils/constants.ts index 443bc043e51..17caf4834ae 100644 --- a/packages/server/src/utils/constants.ts +++ b/packages/server/src/utils/constants.ts @@ -10,6 +10,7 @@ export const WHITELIST_URLS = [ '/api/v1/public-chatbotConfig', '/api/v1/public-executions', '/api/v1/prediction/', + '/api/v1/chatmessage/abort', '/api/v1/node-icon/', '/api/v1/components-credentials-icon/', '/api/v1/chatflows-streaming', diff --git a/packages/server/test/enterprise/utils/url.util.test.ts b/packages/server/test/enterprise/utils/url.util.test.ts index 29a105d3c6f..74a4151e54e 100644 --- a/packages/server/test/enterprise/utils/url.util.test.ts +++ b/packages/server/test/enterprise/utils/url.util.test.ts @@ -1,4 +1,10 @@ import { describe, expect, it, afterEach } from '@jest/globals' + +jest.mock('../../../src/utils/logger', () => ({ + __esModule: true, + default: { warn: jest.fn(), info: jest.fn(), error: jest.fn(), debug: jest.fn() } +})) + import { getSecureAppUrl, getSecureTokenLink } from '../../../src/enterprise/utils/url.util' describe('URL Security Utilities', () => { diff --git a/packages/ui/package.json b/packages/ui/package.json index 0a657f9992a..ed9ec5a48ef 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -73,7 +73,7 @@ "remark-math": "^5.1.1", "showdown": "^2.1.0", "tippy.js": "^6.3.7", - "uuid": "^9.0.1", + "uuid": "^10.0.0", "yup": "^0.32.9" }, "scripts": { diff --git a/packages/ui/src/ui-component/dialog/ViewMessagesDialog.jsx b/packages/ui/src/ui-component/dialog/ViewMessagesDialog.jsx index 03697b2fcb1..41754a18c27 100644 --- a/packages/ui/src/ui-component/dialog/ViewMessagesDialog.jsx +++ b/packages/ui/src/ui-component/dialog/ViewMessagesDialog.jsx @@ -50,6 +50,7 @@ import { MultiDropdown } from '@/ui-component/dropdown/MultiDropdown' import { StyledButton } from '@/ui-component/button/StyledButton' import StatsCard from '@/ui-component/cards/StatsCard' import Feedback from '@/ui-component/extended/Feedback' +import ThinkingCard from '@/views/chatmessage/ThinkingCard' // store import { HIDE_CANVAS_DIALOG, SHOW_CANVAS_DIALOG } from '@/store/actions' @@ -509,6 +510,10 @@ const ViewMessagesDialog = ({ show, dialogProps, onCancel }) => { if (chatmsg.usedTools) obj.usedTools = chatmsg.usedTools if (chatmsg.fileAnnotations) obj.fileAnnotations = chatmsg.fileAnnotations if (chatmsg.agentReasoning) obj.agentReasoning = chatmsg.agentReasoning + if (chatmsg.reasonContent && typeof chatmsg.reasonContent === 'object') { + obj.thinking = chatmsg.reasonContent.thinking + obj.thinkingDuration = chatmsg.reasonContent.thinkingDuration + } if (chatmsg.artifacts) { obj.artifacts = chatmsg.artifacts obj.artifacts.forEach((artifact) => { @@ -1226,6 +1231,14 @@ const ViewMessagesDialog = ({ show, dialogProps, onCancel }) => { })} )} + {message.thinking && ( + + )} {message.agentReasoning && (
{message.agentReasoning.map((agent, index) => { diff --git a/packages/ui/src/utils/validation.js b/packages/ui/src/utils/validation.js index b456d8eaed3..a443d446dcf 100644 --- a/packages/ui/src/utils/validation.js +++ b/packages/ui/src/utils/validation.js @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v3' export const passwordSchema = z .string() diff --git a/packages/ui/src/views/agentexecutions/NodeExecutionDetails.jsx b/packages/ui/src/views/agentexecutions/NodeExecutionDetails.jsx index 4b750d8fa5a..60d0d732508 100644 --- a/packages/ui/src/views/agentexecutions/NodeExecutionDetails.jsx +++ b/packages/ui/src/views/agentexecutions/NodeExecutionDetails.jsx @@ -25,7 +25,7 @@ import { } from '@mui/material' import { useTheme, darken } from '@mui/material/styles' import { useSnackbar } from 'notistack' -import { IconCoins, IconClock, IconChevronDown, IconDownload, IconTool } from '@tabler/icons-react' +import { IconCoins, IconCoin, IconClock, IconChevronDown, IconDownload, IconTool } from '@tabler/icons-react' import toolSVG from '@/assets/images/tool.svg' // Project imports @@ -326,6 +326,24 @@ export const NodeExecutionDetails = ({ data, label, status, metadata, isPublic, sx={{ ml: 1, '& .MuiChip-icon': { mr: 0.2, ml: 1 } }} /> )} + {data.output?.usageMetadata?.total_cost != null && Number(data.output.usageMetadata.total_cost) >= 0 && ( + } + label={ + data.output.usageMetadata.total_cost >= 0.01 + ? `$${Number(data.output.usageMetadata.total_cost).toFixed(2)}` + : `$${Number(data.output.usageMetadata.total_cost).toFixed(6)}` + } + variant='contained' + size='small' + sx={{ + ml: 1, + backgroundColor: '#c49331', + color: 'white', + '& .MuiChip-icon': { color: 'white', mr: 0.2, ml: 1 } + }} + /> + )} , iconText: 'OpenAI', - gradient: 'linear-gradient(135deg, #c9ffd85f 0%, #a0f0b567 100%)' - }, - { - title: 'Azure Assistant (Coming Soon)', - description: 'Create assistant using Azure Assistant API', - icon: , - iconText: 'Azure', - gradient: 'linear-gradient(135deg, #c4e1ff57 0%, #80b7ff5a 100%)' + gradient: 'linear-gradient(135deg, #c9ffd85f 0%, #a0f0b567 100%)', + deprecating: true } ] @@ -66,7 +61,6 @@ const FeatureCards = () => { const onCardClick = (index) => { if (index === 0) navigate('/assistants/custom') if (index === 1) navigate('/assistants/openai') - if (index === 2) alert('Under Development') } return ( @@ -84,7 +78,7 @@ const FeatureCards = () => { gradient={card.gradient} sx={{ flex: 1, - maxWidth: 'calc((100% - 2 * 16px) / 3)', + maxWidth: 'calc((100% - 16px) / 2)', height: 'auto', display: 'flex', flexDirection: 'column', @@ -93,19 +87,21 @@ const FeatureCards = () => { borderColor: theme.palette.grey[900] + 25, borderRadius: 2, color: customization.isDarkMode ? theme.palette.common.white : '#333333', - cursor: index === 2 ? 'not-allowed' : 'pointer', - opacity: index === 2 ? 0.6 : 1, + cursor: 'pointer', '&:hover': { - boxShadow: index === 2 ? 'none' : '0 4px 20px rgba(0, 0, 0, 0.1)' + boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)' } }} - onClick={() => index !== 2 && onCardClick(index)} + onClick={() => onCardClick(index)} > - - {card.icon} - {card.iconText} - + + + {card.icon} + {card.iconText} + + {card.deprecating && } +

{card.title}

{card.description}

diff --git a/packages/ui/src/views/auth/register.jsx b/packages/ui/src/views/auth/register.jsx index 3273f3402c3..40311e0cb9e 100644 --- a/packages/ui/src/views/auth/register.jsx +++ b/packages/ui/src/views/auth/register.jsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react' import { Link, useNavigate, useSearchParams } from 'react-router-dom' -import { z } from 'zod' +import { z } from 'zod/v3' // material-ui import { Alert, Box, Button, Divider, Icon, List, ListItemText, OutlinedInput, Stack, Typography, useTheme } from '@mui/material' diff --git a/packages/ui/src/views/chatmessage/AgentExecutedDataCard.jsx b/packages/ui/src/views/chatmessage/AgentExecutedDataCard.jsx index a9650a286aa..f4559b67b62 100644 --- a/packages/ui/src/views/chatmessage/AgentExecutedDataCard.jsx +++ b/packages/ui/src/views/chatmessage/AgentExecutedDataCard.jsx @@ -1,4 +1,5 @@ import { useEffect, useState, useCallback, forwardRef, memo } from 'react' +import { useSelector } from 'react-redux' import PropTypes from 'prop-types' // MUI @@ -32,8 +33,14 @@ import CheckCircleIcon from '@mui/icons-material/CheckCircle' import StopCircleIcon from '@mui/icons-material/StopCircle' import ErrorIcon from '@mui/icons-material/Error' import { IconButton } from '@mui/material' -import ExpandMoreIcon from '@mui/icons-material/ExpandMore' -import { IconArrowsMaximize, IconLoader, IconCircleXFilled, IconRelationOneToManyFilled } from '@tabler/icons-react' +import { + IconArrowsMaximize, + IconLoader, + IconCircleXFilled, + IconRelationOneToManyFilled, + IconChevronDown, + IconChevronRight +} from '@tabler/icons-react' // Project imports import { useTheme } from '@mui/material/styles' @@ -321,7 +328,9 @@ const AgentExecutedDataCard = ({ status, execution, agentflowId, sessionId }) => const [executionTree, setExecution] = useState([]) const [expandedItems, setExpandedItems] = useState([]) const [selectedItem, setSelectedItem] = useState(null) + const [isAccordionExpanded, setIsAccordionExpanded] = useState(false) const theme = useTheme() + const customization = useSelector((state) => state.customization) const getAllNodeIds = (nodes) => { let ids = [] @@ -650,29 +659,52 @@ const AgentExecutedDataCard = ({ status, execution, agentflowId, sessionId }) => }, []) return ( - + setIsAccordionExpanded(expanded)} sx={{ - width: '100%' + width: '100%', + borderRadius: 2, + border: '1px solid', + borderColor: customization.isDarkMode ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.12)', + backgroundColor: customization.isDarkMode ? 'rgba(255, 255, 255, 0.02)' : 'white', + '&:before': { + display: 'none' + }, + '&.Mui-expanded': { + margin: 0 + } }} > } sx={{ '& .MuiAccordionSummary-content': { alignItems: 'center' + }, + '& .MuiAccordionSummary-expandIconWrapper': { + display: 'none' + }, + '&:hover': { + backgroundColor: customization.isDarkMode ? 'rgba(255, 255, 255, 0.05)' : 'rgba(0, 0, 0, 0.04)' } }} > + + {isAccordionExpanded ? ( + + ) : ( + + )} + {executionTree.length > 0 && (() => { const execStatus = status ?? getExecutionStatus(executionTree) return ( - + ) })()} - Process Flow + + Process Flow + diff --git a/packages/ui/src/views/chatmessage/ChatMessage.jsx b/packages/ui/src/views/chatmessage/ChatMessage.jsx index d2f30d41fe3..bf55a262022 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.jsx +++ b/packages/ui/src/views/chatmessage/ChatMessage.jsx @@ -56,6 +56,7 @@ import ChatFeedbackContentDialog from '@/ui-component/dialog/ChatFeedbackContent import StarterPromptsCard from '@/ui-component/cards/StarterPromptsCard' import AgentReasoningCard from './AgentReasoningCard' import AgentExecutedDataCard from './AgentExecutedDataCard' +import ThinkingCard from './ThinkingCard' import { ImageButton, ImageSrc, ImageBackdrop, ImageMarked } from '@/ui-component/button/ImageButton' import CopyToClipboardButton from '@/ui-component/button/CopyToClipboardButton' import ThumbsUpButton from '@/ui-component/button/ThumbsUpButton' @@ -246,6 +247,9 @@ const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, previews, setP const [followUpPromptsStatus, setFollowUpPromptsStatus] = useState(false) const [followUpPrompts, setFollowUpPrompts] = useState([]) + // thinking/reasoning state + const [isThinking, setIsThinking] = useState(false) + // drag & drop and file input const imgUploadRef = useRef(null) const fileUploadRef = useRef(null) @@ -639,6 +643,45 @@ const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, previews, setP }) } + const handleThinkingEvent = (data, duration) => { + if (data && duration === undefined) { + // Still thinking - append content + setIsThinking(true) + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 1].type === 'userMessage') return allMessages + const lastMessage = allMessages[allMessages.length - 1] + lastMessage.thinking = (lastMessage.thinking || '') + data + lastMessage.isThinking = true + return allMessages + }) + } else if (data === '' && duration !== undefined) { + // Thinking finished - set duration + setIsThinking(false) + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 1].type === 'userMessage') return allMessages + const lastMessage = allMessages[allMessages.length - 1] + lastMessage.thinkingDuration = duration + lastMessage.isThinking = false + return allMessages + }) + } + } + + const finalizeThinking = () => { + // Clean up thinking state if stream ends unexpectedly + if (isThinking) { + setIsThinking(false) + setMessages((prevMessages) => { + let allMessages = [...cloneDeep(prevMessages)] + if (allMessages[allMessages.length - 1].type === 'userMessage') return allMessages + allMessages[allMessages.length - 1].isThinking = false + return allMessages + }) + } + } + const updateAgentFlowEvent = (event) => { if (event === 'INPROGRESS') { setMessages((prevMessages) => [...prevMessages, { message: '', type: 'apiMessage', agentFlowEventStatus: event }]) @@ -1115,6 +1158,9 @@ const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, previews, setP case 'agentReasoning': updateLastMessageAgentReasoning(payload.data) break + case 'thinking': + handleThinkingEvent(payload.data, payload.duration) + break case 'agentFlowEvent': updateAgentFlowEvent(payload.data) break @@ -1157,6 +1203,7 @@ const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, previews, setP break case 'end': cleanupCalledTools() + finalizeThinking() setLocalStorageChatflow(chatflowid, chatId) closeResponse() break @@ -1279,6 +1326,10 @@ const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, previews, setP if (message.calledTools) obj.calledTools = message.calledTools if (message.fileAnnotations) obj.fileAnnotations = message.fileAnnotations if (message.agentReasoning) obj.agentReasoning = message.agentReasoning + if (message.reasonContent && typeof message.reasonContent === 'object') { + obj.thinking = message.reasonContent.thinking + obj.thinkingDuration = message.reasonContent.thinkingDuration + } if (message.action) obj.action = message.action if (message.artifacts) { obj.artifacts = message.artifacts @@ -2466,6 +2517,14 @@ const ChatMessage = ({ open, chatflowid, isAgentCanvas, isDialog, previews, setP })}
)} + {message.thinking && ( + + )} {message.agentReasoning && message.agentReasoning.length > 0 && (
{message.agentReasoning.map((agent, index) => ( diff --git a/packages/ui/src/views/chatmessage/ThinkingCard.jsx b/packages/ui/src/views/chatmessage/ThinkingCard.jsx new file mode 100644 index 00000000000..4c5b3771cd9 --- /dev/null +++ b/packages/ui/src/views/chatmessage/ThinkingCard.jsx @@ -0,0 +1,162 @@ +import { useState, useEffect, memo } from 'react' +import PropTypes from 'prop-types' +import { Box, Collapse, Typography, CircularProgress } from '@mui/material' +import { useTheme } from '@mui/material/styles' +import { IconChevronDown, IconChevronRight, IconBrain } from '@tabler/icons-react' + +const ThinkingCard = ({ thinking, thinkingDuration, isThinking, customization }) => { + const theme = useTheme() + const [isExpanded, setIsExpanded] = useState(false) + + // Auto-expand when thinking is active + useEffect(() => { + if (isThinking) { + setIsExpanded(true) + } + }, [isThinking]) + + if (!thinking) return null + + // Parse thinking content into bullet points + const parseThinkingContent = (content) => { + if (!content) return [] + // Split by newlines and filter out empty lines + const lines = content.split('\n').filter((line) => line.trim()) + return lines + } + + const thinkingLines = parseThinkingContent(thinking) + + // Determine header text + const getHeaderText = () => { + if (isThinking) { + return 'Thinking...' + } + if (thinkingDuration !== undefined && thinkingDuration !== null) { + return `Thought for ${thinkingDuration} second${thinkingDuration !== 1 ? 's' : ''}` + } + return 'Thinking...' + } + + return ( + + {/* Header */} + setIsExpanded(!isExpanded)} + sx={{ + display: 'flex', + alignItems: 'center', + gap: 1, + px: 2, + py: 1.5, + cursor: 'pointer', + borderRadius: isExpanded ? '8px 8px 0 0' : 2, + '&:hover': { + backgroundColor: customization.isDarkMode ? 'rgba(255, 255, 255, 0.05)' : 'rgba(0, 0, 0, 0.04)' + } + }} + > + + {isExpanded ? ( + + ) : ( + + )} + + + {isThinking ? ( + + ) : ( + + )} + + + {getHeaderText()} + + + + {/* Collapsible Content */} + + + {thinkingLines.length > 0 ? ( + + {thinkingLines.map((line, index) => ( + + + {line} + + + ))} + + ) : ( + + {thinking} + + )} + + + + ) +} + +ThinkingCard.propTypes = { + thinking: PropTypes.string, + thinkingDuration: PropTypes.number, + isThinking: PropTypes.bool, + customization: PropTypes.object +} + +export default memo(ThinkingCard) diff --git a/packages/ui/src/views/organization/index.jsx b/packages/ui/src/views/organization/index.jsx index a23023d7d24..137f45f742c 100644 --- a/packages/ui/src/views/organization/index.jsx +++ b/packages/ui/src/views/organization/index.jsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' -import { z } from 'zod' +import { z } from 'zod/v3' // material-ui import { Alert, Box, Button, Chip, Divider, Icon, List, ListItemText, Stack, TextField, Typography } from '@mui/material' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8257b779cf2..9c38abbceae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,12 +5,14 @@ settings: excludeLinksFromLockfile: false overrides: + '@anthropic-ai/sdk': ^0.73.0 '@google/generative-ai': ^0.24.0 '@grpc/grpc-js': ^1.10.10 - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 '@qdrant/openapi-typescript-fetch': 1.2.6 - openai: 4.96.0 + openai: 6.19.0 protobufjs: 7.4.0 + uuid: ^10.0.0 axios: 1.12.0 body-parser: 2.0.2 braces: 3.0.3 @@ -31,6 +33,7 @@ overrides: webpack-dev-middleware: 7.4.2 ws: 8.18.3 xlsx: https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz + request>uuid: ^3.4.0 importers: @@ -136,8 +139,8 @@ importers: specifier: ^11.5.0 version: 11.10.4(@types/react@18.2.65)(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) uuid: - specifier: ^9.0.1 - version: 9.0.1 + specifier: ^10.0.0 + version: 10.0.0 devDependencies: '@testing-library/jest-dom': specifier: ^6.6.3 @@ -160,9 +163,6 @@ importers: '@types/react-dom': specifier: ^18.2.0 version: 18.2.21 - '@types/uuid': - specifier: ^9.0.0 - version: 9.0.8 '@typescript-eslint/eslint-plugin': specifier: ^8.18.2 version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2) @@ -224,15 +224,18 @@ importers: packages/components: dependencies: + '@anthropic-ai/sdk': + specifier: ^0.73.0 + version: 0.73.0(zod@4.3.6) '@apidevtools/json-schema-ref-parser': specifier: ^11.7.0 version: 11.7.0 '@arizeai/openinference-instrumentation-langchain': specifier: ^2.0.0 - version: 2.0.0(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + version: 2.0.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) '@aws-sdk/client-bedrock-runtime': - specifier: 3.422.0 - version: 3.422.0 + specifier: 3.966.0 + version: 3.966.0 '@aws-sdk/client-dynamodb': specifier: ^3.360.0 version: 3.529.1 @@ -274,7 +277,7 @@ importers: version: 3.9.25 '@getzep/zep-cloud': specifier: ~1.0.7 - version: 1.0.7(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(langchain@0.3.6(08bef5ed58eb471b0c368ae979090c97)) + version: 1.0.7(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13)(langchain@1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6))) '@getzep/zep-js': specifier: ^0.9.0 version: 0.9.0 @@ -299,75 +302,93 @@ importers: '@huggingface/inference': specifier: ^4.13.2 version: 4.13.2 + '@ibm-cloud/watsonx-ai': + specifier: 1.7.7 + version: 1.7.7 '@langchain/anthropic': - specifier: 0.3.33 - version: 0.3.33(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(zod@3.22.4) + specifier: 1.3.20 + version: 1.3.20(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) '@langchain/aws': - specifier: ^0.1.11 - version: 0.1.11(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + specifier: 1.2.2 + version: 1.2.2(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) '@langchain/baidu-qianfan': - specifier: ^0.1.0 - version: 0.1.0(@babel/core@7.24.0)(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + specifier: 1.0.1 + version: 1.0.1(@babel/core@7.24.0)(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13) + '@langchain/classic': + specifier: 1.0.15 + version: 1.0.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(cheerio@1.0.0-rc.12)(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) '@langchain/cloudflare': - specifier: ^1.0.1 - version: 1.0.1(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + specifier: 1.0.1 + version: 1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) '@langchain/cohere': - specifier: ^0.0.7 - version: 0.0.7(encoding@0.1.13)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + specifier: 1.0.2 + version: 1.0.2(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) '@langchain/community': - specifier: ^0.3.47 - version: 0.3.49(96a2dea491375c22412401f1555fc2c2) + specifier: 1.1.12 + version: 1.1.12(e577dfcf74b50aa1c4311c22b814981a) '@langchain/core': - specifier: 0.3.61 - version: 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + specifier: 1.1.20 + version: 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/deepseek': + specifier: 1.0.9 + version: 1.0.9(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) '@langchain/exa': - specifier: ^0.0.5 - version: 0.0.5(encoding@0.1.13)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + specifier: 1.0.1 + version: 1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13) '@langchain/google-genai': - specifier: 0.2.3 - version: 0.2.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(zod@3.22.4) + specifier: 2.1.15 + version: 2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) '@langchain/google-vertexai': - specifier: ^0.2.10 - version: 0.2.14(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + specifier: 2.1.15 + version: 2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) '@langchain/groq': - specifier: 0.1.2 - version: 0.1.2(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + specifier: 1.0.4 + version: 1.0.4(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13) '@langchain/langgraph': specifier: ^0.0.22 - version: 0.0.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + version: 0.0.22(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) '@langchain/mistralai': - specifier: ^0.2.0 - version: 0.2.0(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + specifier: 1.0.4 + version: 1.0.4(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@langchain/mongodb': - specifier: ^0.0.1 - version: 0.0.1(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(socks@2.8.1) + specifier: 1.1.0 + version: 1.1.0(@aws-sdk/credential-providers@3.1002.0)(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(socks@2.8.1) '@langchain/ollama': - specifier: 0.2.0 - version: 0.2.0(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + specifier: 1.2.2 + version: 1.2.2(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) '@langchain/openai': - specifier: 0.6.3 - version: 0.6.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + specifier: 1.2.5 + version: 1.2.5(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) '@langchain/pinecone': - specifier: ^0.1.3 - version: 0.1.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + specifier: 1.0.1 + version: 1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@pinecone-database/pinecone@4.0.0) '@langchain/qdrant': - specifier: ^0.0.5 - version: 0.0.5(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(typescript@5.5.2) + specifier: 1.0.1 + version: 1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(typescript@5.5.2) + '@langchain/redis': + specifier: 1.1.0 + version: 1.1.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + '@langchain/tavily': + specifier: 1.2.0 + version: 1.2.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + '@langchain/textsplitters': + specifier: 1.0.1 + version: 1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) '@langchain/weaviate': - specifier: ^0.0.1 - version: 0.0.1(encoding@0.1.13)(graphql@16.8.1)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + specifier: 1.0.1 + version: 1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13) '@langchain/xai': - specifier: ^0.0.1 - version: 0.0.1(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + specifier: 1.3.1 + version: 1.3.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) '@mem0/community': specifier: ^0.0.1 - version: 0.0.1(5a79e038a0f9851c2336c9f7472dc8f5) + version: 0.0.1(3e4894d986beae381e4fca68387f0d30) '@mendable/firecrawl-js': specifier: ^1.18.2 version: 1.25.1 '@mistralai/mistralai': - specifier: 0.1.3 - version: 0.1.3(encoding@0.1.13) + specifier: 1.14.0 + version: 1.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@modelcontextprotocol/sdk': specifier: ^1.10.1 version: 1.10.2 @@ -442,7 +463,7 @@ importers: version: 1.9.0(typescript@5.5.2) '@stripe/agent-toolkit': specifier: ^0.1.20 - version: 0.1.21(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(ai@3.2.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.22.4)) + version: 0.1.21(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ai@3.2.22(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@4.3.6)) '@supabase/supabase-js': specifier: ^2.29.0 version: 2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4) @@ -481,7 +502,7 @@ importers: version: 7.10.0(encoding@0.1.13) composio-core: specifier: ^0.5.39 - version: 0.5.39(@ai-sdk/openai@3.0.2(zod@3.22.4))(@cloudflare/workers-types@4.20260101.0)(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(@langchain/openai@0.6.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(ai@3.2.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.22.4))(langchain@0.3.6(08bef5ed58eb471b0c368ae979090c97))(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + version: 0.5.39(be623a5ed387a5e9d079928a84fd4c7c) couchbase: specifier: 4.4.1 version: 4.4.1 @@ -543,32 +564,32 @@ importers: specifier: ^3.11.1 version: 3.12.0 langchain: - specifier: ^0.3.5 - version: 0.3.6(08bef5ed58eb471b0c368ae979090c97) + specifier: 1.2.18 + version: 1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6)) langfuse: specifier: 3.3.4 version: 3.3.4 langfuse-langchain: specifier: ^3.3.4 - version: 3.3.4(langchain@0.3.6(08bef5ed58eb471b0c368ae979090c97)) + version: 3.3.4(langchain@1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6))) langsmith: - specifier: 0.1.6 - version: 0.1.6 + specifier: 0.4.12 + version: 0.4.12(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) langwatch: specifier: ^0.1.1 - version: 0.1.1(encoding@0.1.13)(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + version: 0.1.1(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) linkifyjs: specifier: ^4.3.2 version: 4.3.2 llamaindex: specifier: ^0.3.13 - version: 0.3.13(@notionhq/client@2.2.14(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13))(socks@2.8.1)(typescript@5.5.2)(utf-8-validate@6.0.4)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + version: 0.3.13(@aws-sdk/credential-providers@3.1002.0)(@notionhq/client@2.2.14(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13))(socks@2.8.1)(typescript@5.5.2)(utf-8-validate@6.0.4)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) lodash: specifier: ^4.17.21 version: 4.17.21 lunary: specifier: ^0.7.12 - version: 0.7.12(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0) + version: 0.7.12(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0) mammoth: specifier: ^1.5.1 version: 1.7.0 @@ -580,7 +601,7 @@ importers: version: 2.30.1 mongodb: specifier: 6.3.0 - version: 6.3.0(socks@2.8.1) + version: 6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1) mysql2: specifier: ^3.11.3 version: 3.11.4 @@ -606,8 +627,8 @@ importers: specifier: ^0.5.11 version: 0.5.11 openai: - specifier: 4.96.0 - version: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + specifier: 6.19.0 + version: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) papaparse: specifier: ^5.4.1 version: 5.4.1 @@ -649,7 +670,10 @@ importers: version: 3.0.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) typeorm: specifier: ^0.3.6 - version: 0.3.20(ioredis@5.3.2)(mongodb@6.3.0(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)) + version: 0.3.20(ioredis@5.3.2)(mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)) + uuid: + specifier: ^10.0.0 + version: 10.0.0 weaviate-ts-client: specifier: ^1.1.0 version: 1.6.0(encoding@0.1.13)(graphql@16.8.1) @@ -663,11 +687,11 @@ importers: specifier: https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz version: https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz zod: - specifier: 3.22.4 - version: 3.22.4 + specifier: ^3.25.76 || ^4 + version: 4.3.6 zod-to-json-schema: - specifier: ^3.21.4 - version: 3.22.4(zod@3.22.4) + specifier: ^3.24.6 + version: 3.25.1(zod@4.3.6) devDependencies: '@swc/core': specifier: ^1.3.99 @@ -734,7 +758,7 @@ importers: version: 6.11.0 '@google-cloud/logging-winston': specifier: ^6.0.0 - version: 6.0.0(encoding@0.1.13)(winston@3.12.0) + version: 6.0.0(winston@3.12.0) '@keyv/redis': specifier: ^4.2.0 version: 4.3.3 @@ -798,9 +822,6 @@ importers: '@types/passport-local': specifier: ^1.0.38 version: 1.0.38 - '@types/uuid': - specifier: ^9.0.7 - version: 9.0.8 async-mutex: specifier: ^0.4.0 version: 0.4.1 @@ -908,7 +929,7 @@ importers: version: 1.2.0 multer-cloud-storage: specifier: ^4.0.0 - version: 4.0.0(encoding@0.1.13) + version: 4.0.0 multer-s3: specifier: ^3.0.1 version: 3.0.1(@aws-sdk/client-s3@3.844.0) @@ -922,8 +943,8 @@ importers: specifier: ^7.0.7 version: 7.0.11 openai: - specifier: 4.96.0 - version: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.25.32) + specifier: 6.19.0 + version: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) passport: specifier: ^0.7.0 version: 0.7.0 @@ -982,8 +1003,8 @@ importers: specifier: ^0.3.6 version: 0.3.20(ioredis@5.4.2)(mysql2@3.11.4)(pg@8.11.3)(redis@4.7.0)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)) uuid: - specifier: ^9.0.1 - version: 9.0.1 + specifier: ^10.0.0 + version: 10.0.0 winston: specifier: ^3.9.0 version: 3.12.0 @@ -1283,8 +1304,8 @@ importers: specifier: ^6.3.7 version: 6.3.7 uuid: - specifier: ^9.0.1 - version: 9.0.1 + specifier: ^10.0.0 + version: 10.0.0 yup: specifier: ^0.32.9 version: 0.32.11 @@ -1442,14 +1463,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@anthropic-ai/sdk@0.20.9': - resolution: {integrity: sha512-Lq74+DhiEQO6F9/gdVOLmHx57pX45ebK2Q/zH14xYe1157a7QeUVknRqIp0Jz5gQI01o7NKbuv9Dag2uQsLjDg==} - - '@anthropic-ai/sdk@0.27.3': - resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==} - - '@anthropic-ai/sdk@0.65.0': - resolution: {integrity: sha512-zIdPOcrCVEI8t3Di40nH4z9EoeyGZfXbYSvWdDLsB/KkaSYMnEgC7gmcgWu83g2NTn1ZTpbMvpdttWDGGIk6zw==} + '@anthropic-ai/sdk@0.73.0': + resolution: {integrity: sha512-URURVzhxXGJDGUGFunIOtBlSl7KWvZiAAKY/ttTkZAkXT9bTPqdk2eK0b8qqSxXpikh3QKPnPYpiyX98zf5ebw==} hasBin: true peerDependencies: zod: ^3.25.0 || ^4.0.0 @@ -1494,7 +1509,7 @@ packages: '@arizeai/openinference-instrumentation-langchain@2.0.0': resolution: {integrity: sha512-bDRyCnXsapwOckqZlDoh5cyeogWtX/DXjw+rfdRpmbZ9ejz26HUroWn2/JU89DW4rHWV+Y5kZtM3qDsTSkqN/Q==} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 '@arizeai/openinference-semantic-conventions@1.0.0': resolution: {integrity: sha512-I14TjDAoDXQFT1boslWSgNU59XgcVL8VS7UwX9EA524fVgOAoxWaowKwTPLvT4y8EYQLtdg+X9t3KvBiO3+AmA==} @@ -1544,18 +1559,18 @@ packages: resolution: {integrity: sha512-Rxqn6XOGIT11se6GW2kdkevhFFaSTGdiV9eoqqMzKzz2WJMnrqxD+p2WdI4pFMQrKgCOjyZyQx3kzAZ78DXyTw==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-bedrock-runtime@3.422.0': - resolution: {integrity: sha512-gbvlxoRpoppcKib3zH8qITSF8hXnE3uJxD278KSyIGV4C6tyCz+bm70369/1PkLaxcNDjzN/Jh9xNKeYplKDuA==} - engines: {node: '>=14.0.0'} - - '@aws-sdk/client-bedrock-runtime@3.755.0': - resolution: {integrity: sha512-g5Adp2haJn3d1M7he4KSBUO/QAJuDNhnCNSZ4Ud30F0WvX07C7nZUDzKOi8cYa8xeXK6gpSlk6DdgcJflXdfXA==} + '@aws-sdk/client-bedrock-runtime@3.966.0': + resolution: {integrity: sha512-Ofk8pTFChNNv9QRjpJGFwy+w2I+UJc6Buz5s7eFemboF899yLq66QSkHs/sByhByf543jO9Lbsauth6BdLSlGg==} engines: {node: '>=18.0.0'} '@aws-sdk/client-cloudfront@3.844.0': resolution: {integrity: sha512-1ufD5Y5jTQ3K+/2jmOn/IXXADPvDdXo1tfCj59DVktWi/rUlqP+oJ115vfYaPHWBwtLYmMXtAfhirDaSmLkAJA==} engines: {node: '>=18.0.0'} + '@aws-sdk/client-cognito-identity@3.1002.0': + resolution: {integrity: sha512-tWopjShTQyg0/KIdOiUHWQAb7Ef26X7voDIRinxL9oql90qRMSEbSw050OzXM0pwpF0TapyMsed4V8V/Z5k+Cg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/client-dynamodb@3.529.1': resolution: {integrity: sha512-oyMCMu4JUGUIwuLYm2WAI/wUbw3RwWwgPTPTxJdus79NVgQ0lGCZnS4cOd2LtzufRglShr5LZUvueVdyn8Hrjw==} engines: {node: '>=14.0.0'} @@ -1568,6 +1583,10 @@ packages: resolution: {integrity: sha512-Yhp8+U4KFVQqL6phZ5yrHF5PdCvKWbYtLSS+egAfAW+N5w78amhbZcctervj59uqOZHMGDWXuDBklN+7eVfasg==} engines: {node: '>=18.0.0'} + '@aws-sdk/client-sagemaker@3.1002.0': + resolution: {integrity: sha512-l8Blv6gC0c5L5LzAxyzYQZlZUdfYsnjCBNPbDSjC0hLzYBywXCNQ+IMwgAwFotp+cpFH2l0AUrbUK62aitP6EQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/client-secrets-manager@3.726.1': resolution: {integrity: sha512-eO9WpE8IyQrs2xWhfQCdHcVTHQTwJ56JGx3FhwhtFWWYHIS0c1bTIAvP5E3jSWAZNaK1iWdVexz3yGi3aAnGzA==} engines: {node: '>=18.0.0'} @@ -1588,10 +1607,6 @@ packages: peerDependencies: '@aws-sdk/client-sts': ^3.726.0 - '@aws-sdk/client-sso@3.421.0': - resolution: {integrity: sha512-40CmW7K2/FZEn3CbOjbpRYeVjKu6aJQlpRHcAgEJGNoVEAnRA3YNH4H0BN2iWWITfYg3B7sIjMm5VE9fCIK1Ng==} - engines: {node: '>=14.0.0'} - '@aws-sdk/client-sso@3.529.1': resolution: {integrity: sha512-KT1U/ZNjDhVv2ZgjzaeAn9VM7l667yeSguMrRYC8qk5h91/61MbjZypi6eOuKuVM+0fsQvzKScTQz0Lio0eYag==} engines: {node: '>=14.0.0'} @@ -1612,9 +1627,9 @@ packages: resolution: {integrity: sha512-THiOp0OpQROEKZ6IdDCDNNh3qnNn/kFFaTSOiugDpgcE5QdsOxh1/RXq7LmHpTJum3cmnFf8jG59PHcz9Tjnlw==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.421.0': - resolution: {integrity: sha512-/92NOZMcdkBcvGrINk5B/l+6DGcVzYE4Ab3ME4vcY9y//u2gd0yNn5YYRSzzjVBLvhDP3u6CbTfLX2Bm4qihPw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/client-sso@3.966.0': + resolution: {integrity: sha512-hQZDQgqRJclALDo9wK+bb5O+VpO8JcjImp52w9KPSz9XveNRgE9AYfklRJd8qT2Bwhxe6IbnqYEino2wqUMA1w==} + engines: {node: '>=18.0.0'} '@aws-sdk/client-sts@3.529.1': resolution: {integrity: sha512-Rvk2Sr3MACQTOtngUU+omlf4E17k47dRVXR7OFRD6Ow5iGgC9tkN2q/ExDPW/ktPOmM0lSgzWyQ6/PC/Zq3HUg==} @@ -1646,9 +1661,17 @@ packages: resolution: {integrity: sha512-LFUREbobleHEln+Zf7IG83lAZwvHZG0stI7UU0CtwyuhQy5Yx0rKksHNOCmlM7MpTEbSCfntEhYi3jUaY5e5lg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.418.0': - resolution: {integrity: sha512-e74sS+x63EZUBO+HaI8zor886YdtmULzwKdctsZp5/37Xho1CVUNtEC+fYa69nigBD9afoiH33I4JggaHgrekQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/core@3.966.0': + resolution: {integrity: sha512-QaRVBHD1prdrFXIeFAY/1w4b4S0EFyo/ytzU+rCklEjMRT7DKGXGoHXTWLGz+HD7ovlS5u+9cf8a/LeSOEMzww==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.973.17': + resolution: {integrity: sha512-VtgGP0TjbCeyp6DQpiBqJKbemTSIaN2bZc3UbeTDCani3lBCyxn75ouJYD6koSSp0bh7rKLEbUpiFsNCI7tr0w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.972.8': + resolution: {integrity: sha512-ATo3JAoPiGFM+m6cW42ntpOAgHY817NnRZOoe3jNRsMDibHKfjkCPFz1azgIjKRwFp3ioY7QNkOZNp4t8XNI2Q==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-env@3.523.0': resolution: {integrity: sha512-Y6DWdH6/OuMDoNKVzZlNeBc6f1Yjk1lYMjANKpIhMbkRCvLJw/PYZKOZa8WpXbTYdgg9XLjKybnLIb3ww3uuzA==} @@ -1670,6 +1693,14 @@ packages: resolution: {integrity: sha512-StJPOI2Rt8UE6lYjXUpg6tqSZaM72xg46ljPg8kIevtBAAfdtq9K20qT/kSliWGIBocMFAv0g2mC0hAa+ECyvg==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-env@3.966.0': + resolution: {integrity: sha512-sxVKc9PY0SH7jgN/8WxhbKQ7MWDIgaJv1AoAKJkhJ+GM5r09G5Vb2Vl8ALYpsy+r8b+iYpq5dGJj8k2VqxoQMg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.972.15': + resolution: {integrity: sha512-RhHQG1lhkWHL4tK1C/KDjaOeis+9U0tAMnWDiwiSVQZMC7CsST9Xin+sK89XywJ5g/tyABtb7TvFePJ4Te5XSQ==} + engines: {node: '>=20.0.0'} + '@aws-sdk/credential-provider-http@3.525.0': resolution: {integrity: sha512-RNWQGuSBQZhl3iqklOslUEfQ4br1V3DCPboMpeqFtddUWJV3m2u2extFur9/4Uy+1EHVF120IwZUKtd8dF+ibw==} engines: {node: '>=14.0.0'} @@ -1690,9 +1721,13 @@ packages: resolution: {integrity: sha512-E/RFVxGTuGnuD+9pFPH2j4l6HvrXzPhmpL8H8nOoJUosjx7d4v93GJMbbl1v/fkDLqW9qN4Jx2cI6PAjohA6OA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.421.0': - resolution: {integrity: sha512-J5yH/gkpAk6FMeH5F9u5Nr6oG+97tj1kkn5q49g3XMbtWw7GiynadxdtoRBCeIg1C7o2LOQx4B1AnhNhIw1z/g==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-http@3.966.0': + resolution: {integrity: sha512-VTJDP1jOibVtc5pn5TNE12rhqOO/n10IjkoJi8fFp9BMfmh3iqo70Ppvphz/Pe/R9LcK5Z3h0Z4EB9IXDR6kag==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.972.17': + resolution: {integrity: sha512-b/bDL76p51+yQ+0O9ZDH5nw/ioE0sRYkjwjOwFWAWZXo6it2kQZUOXhVpjohx3ldKyUxt/SwAivjUu1Nr/PWlQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-ini@3.529.1': resolution: {integrity: sha512-RjHsuTvHIwXG7a/3ERexemiD3c9riKMCZQzY2/b0Gg0ButEVbBcMfERtUzWmQ0V4ufe/PEZjP68MH1gupcoF9A==} @@ -1716,9 +1751,21 @@ packages: resolution: {integrity: sha512-PlxrijguR1gxyPd5EYam6OfWLarj2MJGf07DvCx9MAuQkw77HBnsu6+XbV8fQriFuoJVTBLn9ROhMr/ROAYfUg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.421.0': - resolution: {integrity: sha512-g1dvdvfDj0u8B/gOsHR3o1arP4O4QE/dFm2IJBYr/eUdKISMUgbQULWtg4zdtAf0Oz4xN0723i7fpXAF1gTnRA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-ini@3.966.0': + resolution: {integrity: sha512-4oQKkYMCUx0mffKuH8LQag1M4Fo5daKVmsLAnjrIqKh91xmCrcWlAFNMgeEYvI1Yy125XeNSaFMfir6oNc2ODA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.972.15': + resolution: {integrity: sha512-qWnM+wB8MmU2kKY7f4KowKjOjkwRosaFxrtseEEIefwoXn1SjN+CbHzXBVdTAQxxkbBiqhPgJ/WHiPtES4grRQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.966.0': + resolution: {integrity: sha512-wD1KlqLyh23Xfns/ZAPxebwXixoJJCuDbeJHFrLDpP4D4h3vA2S8nSFgBSFR15q9FhgRfHleClycf6g5K4Ww6w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-login@3.972.15': + resolution: {integrity: sha512-x92FJy34/95wgu+qOGD8SHcgh1hZ9Qx2uFtQEGn4m9Ljou8ICIv3Ybq5yxdB7A60S8ZGCQB0mIopmjJwiLbh5g==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-node@3.529.1': resolution: {integrity: sha512-mvY7F3dMmk/0dZOCfl5sUI1bG0osureBjxhELGCF0KkJqhWI0hIzh8UnPkYytSg3vdc97CMv7pTcozxrdA3b0g==} @@ -1740,9 +1787,13 @@ packages: resolution: {integrity: sha512-2BEymFeXURS+4jE9tP3vahPwbYRl0/1MVaFZcijj6pq+nf5EPGvkFillbdBRdc98ZI2NedZgSKu3gfZXgYdUhQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.418.0': - resolution: {integrity: sha512-xPbdm2WKz1oH6pTkrJoUmr3OLuqvvcPYTQX0IIlc31tmDwDWPQjXGGFD/vwZGIZIkKaFpFxVMgAzfFScxox7dw==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-node@3.966.0': + resolution: {integrity: sha512-7QCOERGddMw7QbjE+LSAFgwOBpPv4px2ty0GCK7ZiPJGsni2EYmM4TtYnQb9u1WNHmHqIPWMbZR0pKDbyRyHlQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.972.16': + resolution: {integrity: sha512-7mlt14Ee4rPFAFUVgpWE7+0CBhetJJyzVFqfIsMp7sgyOSm9Y/+qHZOWAuK5I4JNc+Y5PltvJ9kssTzRo92iXQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-process@3.523.0': resolution: {integrity: sha512-f0LP9KlFmMvPWdKeUKYlZ6FkQAECUeZMmISsv6NKtvPCI9e4O4cLTeR09telwDK8P0HrgcRuZfXM7E30m8re0Q==} @@ -1764,9 +1815,13 @@ packages: resolution: {integrity: sha512-Zxnn1hxhq7EOqXhVYgkF4rI9MnaO3+6bSg/tErnBQ3F8kDpA7CFU24G1YxwaJXp2X4aX3LwthefmSJHwcVP/2g==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.421.0': - resolution: {integrity: sha512-f8T3L5rhImL6T6RTSvbOxaWw9k2fDOT2DZbNjcPz9ITWmwXj2NNbdHGWuRi3dv2HoY/nW2IJdNxnhdhbn6Fc1A==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-process@3.966.0': + resolution: {integrity: sha512-q5kCo+xHXisNbbPAh/DiCd+LZX4wdby77t7GLk0b2U0/mrel4lgy6o79CApe+0emakpOS1nPZS7voXA7vGPz4w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.972.15': + resolution: {integrity: sha512-PrH3iTeD18y/8uJvQD2s/T87BTGhsdS/1KZU7ReWHXsplBwvCqi7AbnnNbML1pFlQwRWCE2RdSZFWDVId3CvkA==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-sso@3.529.1': resolution: {integrity: sha512-KFMKkaoTGDgSJG+o9Ii7AglWG5JQeF6IFw9cXLMwDdIrp3KUmRcUIqe0cjOoCqeQEDGy0VHsimHmKKJ3894i/A==} @@ -1788,9 +1843,13 @@ packages: resolution: {integrity: sha512-UPyPNQbxDwHVGmgWdGg9/9yvzuedRQVF5jtMkmP565YX9pKZ8wYAcXhcYdNPWFvH0GYdB0crKOmvib+bmCuwkw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.418.0': - resolution: {integrity: sha512-do7ang565n9p3dS1JdsQY01rUfRx8vkxQqz5M8OlcEHBNiCdi2PvSjNwcBdrv/FKkyIxZb0TImOfBSt40hVdxQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/credential-provider-sso@3.966.0': + resolution: {integrity: sha512-Rv5aEfbpqsQZzxpX2x+FbSyVFOE3Dngome+exNA8jGzc00rrMZEUnm3J3yAsLp/I2l7wnTfI0r2zMe+T9/nZAQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.972.15': + resolution: {integrity: sha512-M/+LBHTPKZxxXckM6m4dnJeR+jlm9NynH9b2YDswN4Zj2St05SK/crdL3Wy3WfJTZootnnhm3oTh87Usl7PS7w==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-web-identity@3.529.1': resolution: {integrity: sha512-AGuZDOKN+AttjwTjrF47WLqzeEut2YynyxjkXZhxZF/xn8i5Y51kUAUdXsXw1bgR25pAeXQIdhsrQlRa1Pm5kw==} @@ -1814,10 +1873,26 @@ packages: resolution: {integrity: sha512-nNcjPN4SYg8drLwqK0vgVeSvxeGQiD0FxOaT38mV2H8cu0C5NzpvA+14Xy+W6vT84dxgmJYKk71Cr5QL2Oz+rA==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-web-identity@3.966.0': + resolution: {integrity: sha512-Yv1lc9iic9xg3ywMmIAeXN1YwuvfcClLVdiF2y71LqUgIOupW8B8my84XJr6pmOQuKzZa++c2znNhC9lGsbKyw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.15': + resolution: {integrity: sha512-QTH6k93v+UOfFam/ado8zc71tH+enTVyuvLy9uEWXX1x894dN5ovtf/MdBDgFwq3g6c9mbtgVJ4B+yBqDtXvdA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-providers@3.1002.0': + resolution: {integrity: sha512-D9E3iBWt7kQ3WZ6R6mOy4GDiC/fV+z5lVMVuHNdicryga0fWkuoZBK/dTEdFBEiQBQ3WdDORzEzD+PytYstFBg==} + engines: {node: '>=20.0.0'} + '@aws-sdk/endpoint-cache@3.495.0': resolution: {integrity: sha512-XCDrpiS50WaPzPzp7FwsChPHtX9PQQUU4nRzcn2N7IkUtpcFCUx8m1PAZe086VQr6hrbdeE4Z4j8hUPNwVdJGQ==} engines: {node: '>=14.0.0'} + '@aws-sdk/eventstream-handler-node@3.965.0': + resolution: {integrity: sha512-QriACiXP+/x2xXw8u849BxID+zSUbh/7Gt0Zfaxeye0mIKVeSTid5776rXfrM8wcYhbVXWWZhKd1Du7oPuFwsg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/lib-storage@3.726.1': resolution: {integrity: sha512-WuDxSZ8Bfe1N7gn5eXQ02dhlKWCAwW5qQErpJ4CCddXosF+gLxhGkrP9LkaaP0CpA3PxboHyET6HbWAggOWtqA==} engines: {node: '>=18.0.0'} @@ -1832,6 +1907,10 @@ packages: resolution: {integrity: sha512-nT/XYP3RDRWPFCTEOZQbOC3HWmUkxB0fDuobmH8WzL92MCBGz9gBG/q9XBxiw9pHk9Dky/MIkLV50BlGB3kM7g==} engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-eventstream@3.965.0': + resolution: {integrity: sha512-YVNOPbc3r+gETUY6ufnJYsgIRMaBfoGRM9GzPb+gwtidCPd0BEpLjmZNIVGYawMrGc2kAdlV1kjBzAvmYaMINw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-expect-continue@3.840.0': resolution: {integrity: sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==} engines: {node: '>=18.0.0'} @@ -1840,10 +1919,6 @@ packages: resolution: {integrity: sha512-LCImZd1hpM0cegfdpgZyK6x4on4Ky+c9XCFURfE4wil1J9HXf6OP4KsfHQwt1yIkMEbFqvd/ab2I5fmp7S7aFA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.418.0': - resolution: {integrity: sha512-LrMTdzalkPw/1ujLCKPLwCGvPMCmT4P+vOZQRbSEVZPnlZk+Aj++aL/RaHou0jL4kJH3zl8iQepriBt4a7UvXQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-host-header@3.523.0': resolution: {integrity: sha512-4g3q7Ta9sdD9TMUuohBAkbx/e3I/juTqfKi7TPgP+8jxcYX72MOsgemAMHuP6CX27eyj4dpvjH+w4SIVDiDSmg==} engines: {node: '>=14.0.0'} @@ -1864,14 +1939,18 @@ packages: resolution: {integrity: sha512-jDje8dCFeFHfuCAxMDXBs8hy8q9NCTlyK4ThyyfAj3U4Pixly2mmzY2u7b7AyGhWsjJNx8uhTjlYq5zkQPQCYw==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-host-header@3.965.0': + resolution: {integrity: sha512-SfpSYqoPOAmdb3DBsnNsZ0vix+1VAtkUkzXM79JL3R5IfacpyKE2zytOgVAQx/FjhhlpSTwuXd+LRhUEVb3MaA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-host-header@3.972.6': + resolution: {integrity: sha512-5XHwjPH1lHB+1q4bfC7T8Z5zZrZXfaLcjSMwTd1HPSPrCmPFMbg3UQ5vgNWcVj0xoX4HWqTGkSf2byrjlnRg5w==} + engines: {node: '>=20.0.0'} + '@aws-sdk/middleware-location-constraint@3.840.0': resolution: {integrity: sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.418.0': - resolution: {integrity: sha512-StKGmyPVfoO/wdNTtKemYwoJsqIl4l7oqarQY7VSf2Mp3mqaa+njLViHsQbirYpyqpgUEusOnuTlH5utxJ1NsQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-logger@3.523.0': resolution: {integrity: sha512-PeDNJNhfiaZx54LBaLTXzUaJ9LXFwDFFIksipjqjvxMafnoVcQwKbkoPUWLe5ytT4nnL1LogD3s55mERFUsnwg==} engines: {node: '>=14.0.0'} @@ -1892,9 +1971,13 @@ packages: resolution: {integrity: sha512-N/bXSJznNBR/i7Ofmf9+gM6dx/SPBK09ZWLKsW5iQjqKxAKn/2DozlnE54uiEs1saHZWoNDRg69Ww4XYYSlG1Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.418.0': - resolution: {integrity: sha512-kKFrIQglBLUFPbHSDy1+bbe3Na2Kd70JSUC3QLMbUHmqipXN8KeXRfAj7vTv97zXl0WzG0buV++WcNwOm1rFjg==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-logger@3.965.0': + resolution: {integrity: sha512-gjUvJRZT1bUABKewnvkj51LAynFrfz2h5DYAg5/2F4Utx6UOGByTSr9Rq8JCLbURvvzAbCtcMkkIJRxw+8Zuzw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-logger@3.972.6': + resolution: {integrity: sha512-iFnaMFMQdljAPrvsCVKYltPt2j40LQqukAbXvW7v0aL5I+1GO7bZ/W8m12WxW3gwyK5p5u1WlHg8TSAizC5cZw==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-recursion-detection@3.523.0': resolution: {integrity: sha512-nZ3Vt7ehfSDYnrcg/aAfjjvpdE+61B3Zk68i6/hSUIegT3IH9H1vSW67NDKVp+50hcEfzWwM2HMPXxlzuyFyrw==} @@ -1916,26 +1999,22 @@ packages: resolution: {integrity: sha512-KVoo3IOzEkTq97YKM4uxZcYFSNnMkhW/qj22csofLegZi5fk90ztUnnaeKfaEJHfHp/tm1Y3uSoOXH45s++kKQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.844.0': - resolution: {integrity: sha512-vOD5reqZszXBWMbZFN3EUar203o2i8gcoTdrymY4GMsAPDsh0k8yd3VJRNPuxT/017tP6G+rQepOGzna4umung==} + '@aws-sdk/middleware-recursion-detection@3.965.0': + resolution: {integrity: sha512-6dvD+18Ni14KCRu+tfEoNxq1sIGVp9tvoZDZ7aMvpnA7mDXuRLrOjRQ/TAZqXwr9ENKVGyxcPl0cRK8jk1YWjA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-sts@3.418.0': - resolution: {integrity: sha512-cW8ijrCTP+mgihvcq4+TbhAcE/we5lFl4ydRqvTdtcSnYQAVQADg47rnTScQiFsPFEB3NKq7BGeyTJF9MKolPA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-recursion-detection@3.972.6': + resolution: {integrity: sha512-dY4v3of5EEMvik6+UDwQ96KfUFDk8m1oZDdkSc5lwi4o7rFrjnv0A+yTV+gu230iybQZnKgDLg/rt2P3H+Vscw==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-signing@3.418.0': - resolution: {integrity: sha512-onvs5KoYQE8OlOE740RxWBGtsUyVIgAo0CzRKOQO63ZEYqpL1Os+MS1CGzdNhvQnJgJruE1WW+Ix8fjN30zKPA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/middleware-sdk-s3@3.844.0': + resolution: {integrity: sha512-vOD5reqZszXBWMbZFN3EUar203o2i8gcoTdrymY4GMsAPDsh0k8yd3VJRNPuxT/017tP6G+rQepOGzna4umung==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-ssec@3.840.0': resolution: {integrity: sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.418.0': - resolution: {integrity: sha512-Jdcztg9Tal9SEAL0dKRrnpKrm6LFlWmAhvuwv0dQ7bNTJxIxyEFbpqdgy7mpQHsLVZgq1Aad/7gT/72c9igyZw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/middleware-user-agent@3.525.0': resolution: {integrity: sha512-4al/6uO+t/QIYXK2OgqzDKQzzLAYJza1vWFS+S0lJ3jLNGyLB5BMU5KqWjDzevYZ4eCnz2Nn7z0FveUTNz8YdQ==} engines: {node: '>=14.0.0'} @@ -1956,6 +2035,18 @@ packages: resolution: {integrity: sha512-wrddonw4EyLNSNBrApzEhpSrDwJiNfjxDm5E+bn8n32BbAojXASH8W8jNpxz/jMgNkkJNxCfyqybGKzBX0OhbQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-user-agent@3.966.0': + resolution: {integrity: sha512-MvGoy0vhMluVpSB5GaGJbYLqwbZfZjwEZhneDHdPhgCgQqmCtugnYIIjpUw7kKqWGsmaMQmNEgSFf1zYYmwOyg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-user-agent@3.972.17': + resolution: {integrity: sha512-HHArkgWzomuwufXwheQqkddu763PWCpoNTq1dGjqXzJT/lojX3VlOqjNSR2Xvb6/T9ISfwYcMOcbFgUp4EWxXA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-websocket@3.965.0': + resolution: {integrity: sha512-BGU92StrWF0EJj8jX5EFvRkX9z4/CVIZfON0nWow8gb5ouKwz47o1rO9CP/k2b3F6g134/0XqwXvrUgIWfjJeA==} + engines: {node: '>= 14.0.0'} + '@aws-sdk/nested-clients@3.750.0': resolution: {integrity: sha512-OH68BRF0rt9nDloq4zsfeHI0G21lj11a66qosaljtEP66PWm7tQ06feKbFkXHT5E1K3QhJW3nVyK8v2fEBY5fg==} engines: {node: '>=18.0.0'} @@ -1968,9 +2059,13 @@ packages: resolution: {integrity: sha512-H1C+NjSmz2y8Tbgh7Yy89J20yD/hVyk15hNoZDbCYkXg0M358KS7KVIEYs8E2aPOCr1sK3HBE819D/yvdMgokA==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.418.0': - resolution: {integrity: sha512-lJRZ/9TjZU6yLz+mAwxJkcJZ6BmyYoIJVo1p5+BN//EFdEmC8/c0c9gXMRzfISV/mqWSttdtccpAyN4/goHTYA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/nested-clients@3.966.0': + resolution: {integrity: sha512-FRzAWwLNoKiaEWbYhnpnfartIdOgiaBLnPcd3uG1Io+vvxQUeRPhQIy4EfKnT3AuA+g7gzSCjMG2JKoJOplDtQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/nested-clients@3.996.5': + resolution: {integrity: sha512-zn0WApcULn7Rtl6T+KP2CQTZo/7wOa2YV1yHQnbijTQoi4YXQHM8s21JcJzt33/mqPh8AdvWX1f+83KvKuxlZw==} + engines: {node: '>=20.0.0'} '@aws-sdk/region-config-resolver@3.525.0': resolution: {integrity: sha512-8kFqXk6UyKgTMi7N7QlhA6qM4pGPWbiUXqEY2RgUWngtxqNFGeM9JTexZeuavQI+qLLe09VPShPNX71fEDcM6w==} @@ -1992,13 +2087,21 @@ packages: resolution: {integrity: sha512-VisR+/HuVFICrBPY+q9novEiE4b3mvDofWqyvmxHcWM7HumTz9ZQSuEtnlB/92GVM3KDUrR9EmBHNRrfXYZkcQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/region-config-resolver@3.965.0': + resolution: {integrity: sha512-RoMhu9ly2B0coxn8ctXosPP2WmDD0MkQlZGLjoYHQUOCBmty5qmCxOqBmBDa6wbWbB8xKtMQ/4VXloQOgzjHXg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/region-config-resolver@3.972.6': + resolution: {integrity: sha512-Aa5PusHLXAqLTX1UKDvI3pHQJtIsF7Q+3turCHqfz/1F61/zDMWfbTC8evjhrrYVAtz9Vsv3SJ/waSUeu7B6gw==} + engines: {node: '>=20.0.0'} + '@aws-sdk/signature-v4-multi-region@3.844.0': resolution: {integrity: sha512-QC8nocQcZ3Bj7vTnuL47iNhcuUjMC46E2L85mU+sPQo3LN2qBVGSOTF+xSWGvmSFDpkN4ZXUMVeA0cJoJFEDFA==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.418.0': - resolution: {integrity: sha512-9P7Q0VN0hEzTngy3Sz5eya2qEOEf0Q8qf1vB3um0gE6ID6EVAdz/nc/DztfN32MFxk8FeVBrCP5vWdoOzmd72g==} - engines: {node: '>=14.0.0'} + '@aws-sdk/token-providers@3.1002.0': + resolution: {integrity: sha512-x972uKOydFn4Rb0PZJzLdNW59rH0KWC78Q2JbQzZpGlGt0DxjYdDRwBG6F42B1MyaEwHGqO/tkGc4r3/PRFfMw==} + engines: {node: '>=20.0.0'} '@aws-sdk/token-providers@3.529.1': resolution: {integrity: sha512-NpgMjsfpqiugbxrYGXtta914N43Mx/H0niidqv8wKMTgWQEtsJvYtOni+kuLXB+LmpjaMFNlpadooFU/bK4buA==} @@ -2022,9 +2125,9 @@ packages: resolution: {integrity: sha512-gTc2QHOBo05SCwVA65dUtnJC6QERvFaPiuppGDSxoF7O5AQNK0UR/kMSenwLqN8b5E1oLYvQTv3C1idJLRX0cg==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.418.0': - resolution: {integrity: sha512-y4PQSH+ulfFLY0+FYkaK4qbIaQI9IJNMO2xsxukW6/aNoApNymN1D2FSi2la8Qbp/iPjNDKsG8suNPm9NtsWXQ==} - engines: {node: '>=14.0.0'} + '@aws-sdk/token-providers@3.966.0': + resolution: {integrity: sha512-8k5cBTicTGYJHhKaweO4gL4fud1KDnLS5fByT6/Xbiu59AxYM4E/h3ds+3jxDMnniCE3gIWpEnyfM9khtmw2lA==} + engines: {node: '>=18.0.0'} '@aws-sdk/types@3.523.0': resolution: {integrity: sha512-AqGIu4u+SxPiUuNBp2acCVcq80KDUFjxe6e3cMTvKWTzCbrVk1AXv0dAaJnCmdkWIha6zJDWxpIk/aL4EGhZ9A==} @@ -2046,14 +2149,18 @@ packages: resolution: {integrity: sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==} engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.965.0': + resolution: {integrity: sha512-jvodoJdMavvg8faN7co58vVJRO5MVep4JFPRzUNCzpJ98BDqWDk/ad045aMJcmxkLzYLS2UAnUmqjJ/tUPNlzQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/types@3.973.4': + resolution: {integrity: sha512-RW60aH26Bsc016Y9B98hC0Plx6fK5P2v/iQYwMzrSjiDh1qRMUCP6KrXHYEHe3uFvKiOC93Z9zk4BJsUi6Tj1Q==} + engines: {node: '>=20.0.0'} + '@aws-sdk/util-arn-parser@3.804.0': resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.418.0': - resolution: {integrity: sha512-sYSDwRTl7yE7LhHkPzemGzmIXFVHSsi3AQ1KeNEk84eBqxMHHcCc2kqklaBk2roXWe50QDgRMy1ikZUxvtzNHQ==} - engines: {node: '>=14.0.0'} - '@aws-sdk/util-endpoints@3.525.0': resolution: {integrity: sha512-DIW7WWU5tIGkeeKX6NJUyrEIdWMiqjLQG3XBzaUj+ufIENwNjdAHhlD8l2vX7Yr3JZRT6yN/84wBCj7Tw1xd1g==} engines: {node: '>=14.0.0'} @@ -2074,13 +2181,22 @@ packages: resolution: {integrity: sha512-eCZuScdE9MWWkHGM2BJxm726MCmWk/dlHjOKvkM0sN1zxBellBMw5JohNss1Z8/TUmnW2gb9XHTOiHuGjOdksA==} engines: {node: '>=18.0.0'} + '@aws-sdk/util-endpoints@3.965.0': + resolution: {integrity: sha512-WqSCB0XIsGUwZWvrYkuoofi2vzoVHqyeJ2kN+WyoOsxPLTiQSBIoqm/01R/qJvoxwK/gOOF7su9i84Vw2NQQpQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.996.3': + resolution: {integrity: sha512-yWIQSNiCjykLL+ezN5A+DfBb1gfXTytBxm57e64lYmwxDHNmInYHRJYYRAGWG1o77vKEiWaw4ui28e3yb1k5aQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-format-url@3.965.0': + resolution: {integrity: sha512-KiplV4xYGXdNCcz5eRP8WfAejT5EkE2gQxC4IY6WsuxYprzQKsnGaAzEQ+giR5GgQLIRBkPaWT0xHEYkMiCQ1Q==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-locate-window@3.495.0': resolution: {integrity: sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==} engines: {node: '>=14.0.0'} - '@aws-sdk/util-user-agent-browser@3.418.0': - resolution: {integrity: sha512-c4p4mc0VV/jIeNH0lsXzhJ1MpWRLuboGtNEpqE4s1Vl9ck2amv9VdUUZUmHbg+bVxlMgRQ4nmiovA4qIrqGuyg==} - '@aws-sdk/util-user-agent-browser@3.523.0': resolution: {integrity: sha512-6ZRNdGHX6+HQFqTbIA5+i8RWzxFyxsZv8D3soRfpdyWIKkzhSz8IyRKXRciwKBJDaC7OX2jzGE90wxRQft27nA==} @@ -2096,14 +2212,11 @@ packages: '@aws-sdk/util-user-agent-browser@3.862.0': resolution: {integrity: sha512-BmPTlm0r9/10MMr5ND9E92r8KMZbq5ltYXYpVcUbAsnB1RJ8ASJuRoLne5F7mB3YMx0FJoOTuSq7LdQM3LgW3Q==} - '@aws-sdk/util-user-agent-node@3.418.0': - resolution: {integrity: sha512-BXMskXFtg+dmzSCgmnWOffokxIbPr1lFqa1D9kvM3l3IFRiFGx2IyDg+8MAhq11aPDLvoa/BDuQ0Yqma5izOhg==} - engines: {node: '>=14.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true + '@aws-sdk/util-user-agent-browser@3.965.0': + resolution: {integrity: sha512-Xiza/zMntQGpkd2dETQeAK8So1pg5+STTzpcdGWxj5q0jGO5ayjqT/q1Q7BrsX5KIr6PvRkl9/V7lLCv04wGjQ==} + + '@aws-sdk/util-user-agent-browser@3.972.6': + resolution: {integrity: sha512-Fwr/llD6GOrFgQnKaI2glhohdGuBDfHfora6iG9qsBBBR8xv1SdCSwbtf5CWlUdCw5X7g76G/9Hf0Inh0EmoxA==} '@aws-sdk/util-user-agent-node@3.525.0': resolution: {integrity: sha512-88Wjt4efyUSBGcyIuh1dvoMqY1k15jpJc5A/3yi67clBQEFsu9QCodQCQPqmRjV3VRcMtBOk+jeCTiUzTY5dRQ==} @@ -2150,6 +2263,24 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.966.0': + resolution: {integrity: sha512-vPPe8V0GLj+jVS5EqFz2NUBgWH35favqxliUOvhp8xBdNRkEjiZm5TqitVtFlxS4RrLY3HOndrWbrP5ejbwl1Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/util-user-agent-node@3.973.2': + resolution: {integrity: sha512-lpaIuekdkpw7VRiik0IZmd6TyvEUcuLgKZ5fKRGpCA3I4PjrD/XH15sSwW+OptxQjNU4DEzSxag70spC9SluvA==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} @@ -2161,6 +2292,18 @@ packages: resolution: {integrity: sha512-6Ed0kmC1NMbuFTEgNmamAUU1h5gShgxL1hBVLbEzUa3trX5aJBz1vU4bXaBTvOYUAnOHtiy1Ml4AMStd6hJnFA==} engines: {node: '>=18.0.0'} + '@aws-sdk/xml-builder@3.965.0': + resolution: {integrity: sha512-Tcod25/BTupraQwtb+Q+GX8bmEZfxIFjjJ/AvkhUZsZlkPeVluzq1uu3Oeqf145DCdMjzLIN6vab5MrykbDP+g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/xml-builder@3.972.9': + resolution: {integrity: sha512-ItnlMgSqkPrUfJs7EsvU/01zw5UeIb2tNPhD09LBLHbg+g+HDiKibSLwpkuz/ZIlz4F2IMn+5XgE4AK/pfPuog==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.2.3': + resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + engines: {node: '>=18.0.0'} + '@azure/abort-controller@2.1.2': resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} engines: {node: '>=18.0.0'} @@ -3348,7 +3491,7 @@ packages: '@playwright/test': ^1.42.1 deepmerge: ^4.3.1 dotenv: ^16.4.5 - openai: 4.96.0 + openai: 6.19.0 zod: ^3.23.8 '@bufbuild/protobuf@2.6.1': @@ -4032,7 +4175,7 @@ packages: '@getzep/zep-cloud@1.0.7': resolution: {integrity: sha512-QL0v8SBqDVm/CX447pAGaw55hIE8U3WfOCjmiGx/S0ICamtJFRmVZDeOpCzb6sPPxVE9OjaSaCuW8ORvzHb2Ew==} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 langchain: ~0.1.19 peerDependenciesMeta: '@langchain/core': @@ -4171,9 +4314,9 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} deprecated: Use @eslint/object-schema instead - '@ibm-cloud/watsonx-ai@1.2.0': - resolution: {integrity: sha512-9eAyLr0sMXmrG6nSjQVqomkl8xd7m1Iy37XPgM2AjB+yjRD5IPjKgwbOXx9xWCa47V0Jt3zrPZWiPUDdaNlU4Q==} - engines: {node: '>=18.0.0'} + '@ibm-cloud/watsonx-ai@1.7.7': + resolution: {integrity: sha512-CTnhB1tTzNhI4pkPmIGYMlJn/diB2G7sScaPN0vJHyv8YGUCKa/AEcyaFZt47HzeKBKzR2cNmw3vKG+7CScXAA==} + engines: {node: '>=20.0.0'} '@icons/material@0.2.4': resolution: {integrity: sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==} @@ -4694,33 +4837,51 @@ packages: react: '>=16.14.0' react-dom: '>=16.14.0' - '@langchain/anthropic@0.3.33': - resolution: {integrity: sha512-uaMwieUNQbFbu0TQG6Kiub2m7hGcdjQRwniu2RzB4mroUsYCcFThv3MDumEjFMQZW/9P0eyzzTGPXJCNdQUoZg==} - engines: {node: '>=18'} + '@langchain/anthropic@1.3.20': + resolution: {integrity: sha512-Bbo8KR0lbGjFvkH2z1m0KdQPF+yHVCP+Wu6q0GmMdwK2AFCDCTHor48MhpIn10WvYKZhHMbBzHvB9NV4yLcPhQ==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/aws@0.1.11': - resolution: {integrity: sha512-JNnEmJaJB5TzcniPYGZi6dlpmZyzeyVsS+Za0Ye1DhCpcNmEiWRy514gVcTPQUEl5EcpIR51B/YyowI7zUzVvg==} - engines: {node: '>=18'} + '@langchain/aws@1.2.2': + resolution: {integrity: sha512-KIrqcVUAMiwPr97hA/6OIARAlvTHUDuDeDhSqMuYWSpMqE48cmwnexbs9PwR5Tlq2RBlIJix81SSvt/tLGfsFA==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/baidu-qianfan@0.1.0': - resolution: {integrity: sha512-sl0kgN/7pBti2oF3PQRk1dLfXpmx3kGuyFiooTfkTswO7zeVbv5VPwjmw2/096ctkziEQLBGqQ7dZReEDcXPRA==} - engines: {node: '>=18'} + '@langchain/baidu-qianfan@1.0.1': + resolution: {integrity: sha512-2Jqn+nYxNdZt052zSZ0RnTXZomFAH3DufWFz04zK2A33ZNUco61vMLfjNyVLc5rIF+3ZEOCPRMtCd08iTUjadQ==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 + + '@langchain/classic@1.0.15': + resolution: {integrity: sha512-fpEGvDn7uMcYLrRvubQqoO2VUk2cHM0reuyrQVkAutLWVYPZrQfeCV78WN8rqoTG3CEXtLr8qcs8t5wFWx0z5w==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 + cheerio: '*' + peggy: ^3.0.2 + typeorm: '*' + peerDependenciesMeta: + cheerio: + optional: true + peggy: + optional: true + typeorm: + optional: true '@langchain/cloudflare@1.0.1': resolution: {integrity: sha512-Ym4rN8jDeGK7UJHiSnogNHzaNuKBiKKwvpDWZBtwjz6d5SQqYB9i05tPYubuxtHJMFBAdOiSGUVnZp92rp1uUg==} engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/cohere@0.0.7': - resolution: {integrity: sha512-ICSrSOT6FzSbR+xnbkP6BxXhuom1ViPRiy8K8KrL6bHbTiR5v1UnpskTWRpyhQS1GA6+3t1gp7XHxB5CZzLyqQ==} - engines: {node: '>=18'} + '@langchain/cohere@1.0.2': + resolution: {integrity: sha512-v7OWwLshIQTIgt7mbGI8RkVwuHxOESauXlpw0oEouiiG0oUo/difFNpBSvrMAldLIa7cyYB/jPV+l6n15qsuYg==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 '@langchain/community@0.3.49': resolution: {integrity: sha512-1AAo9mvr1FmqYHUpXhYI8P4NBPC4t9TfUAuvefEImrtb3gZ60fPelVu17ljWlKJcHC1hPSHYpPJWm0Yx7yRvrw==} @@ -4758,7 +4919,7 @@ packages: '@huggingface/transformers': ^3.5.2 '@ibm-cloud/watsonx-ai': '*' '@lancedb/lancedb': ^0.12.0 - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 '@layerup/layerup-security': ^1.5.12 '@libsql/client': ^0.14.0 '@mendable/firecrawl-js': ^1.4.3 @@ -4833,7 +4994,7 @@ packages: neo4j-driver: '*' notion-to-md: ^3.1.0 officeparser: ^4.0.4 - openai: 4.96.0 + openai: 6.19.0 pdf-parse: 1.1.1 pg: ^8.11.0 pg-copy-streams: ^6.0.5 @@ -5096,8 +5257,373 @@ packages: optional: true weaviate-client: optional: true - web-auth-library: - optional: true + web-auth-library: + optional: true + word-extractor: + optional: true + ws: + optional: true + youtubei.js: + optional: true + + '@langchain/community@1.1.12': + resolution: {integrity: sha512-AKR/JoKLIbIq/StLf8YCzo1tVPCNM7VVDUkY4mLHXtYUzNntQ3f5/40zi/Eax05gnIKCLh9ZO/14P8BncVZJnA==} + engines: {node: '>=20'} + peerDependencies: + '@arcjet/redact': ^v1.0.0-alpha.23 + '@aws-crypto/sha256-js': ^5.0.0 + '@aws-sdk/client-dynamodb': ^3.749.0 + '@aws-sdk/client-lambda': ^3.749.0 + '@aws-sdk/client-s3': ^3.749.0 + '@aws-sdk/client-sagemaker-runtime': ^3.749.0 + '@aws-sdk/client-sfn': ^3.749.0 + '@aws-sdk/credential-provider-node': ^3.388.0 + '@aws-sdk/dsql-signer': '*' + '@azure/search-documents': ^12.0.0 + '@azure/storage-blob': ^12.15.0 + '@browserbasehq/sdk': '*' + '@browserbasehq/stagehand': ^1.0.0 + '@clickhouse/client': ^0.2.5 + '@datastax/astra-db-ts': ^1.0.0 + '@elastic/elasticsearch': ^8.4.0 + '@getmetal/metal-sdk': '*' + '@getzep/zep-cloud': ^1.0.6 + '@getzep/zep-js': ^0.9.0 + '@gomomento/sdk-core': ^1.51.1 + '@google-cloud/storage': ^6.10.1 || ^7.7.0 + '@gradientai/nodejs-sdk': ^1.2.0 + '@huggingface/inference': ^4.0.5 + '@huggingface/transformers': ^3.5.2 + '@ibm-cloud/watsonx-ai': '*' + '@lancedb/lancedb': ^0.19.1 + '@langchain/core': 1.1.20 + '@layerup/layerup-security': ^1.5.12 + '@libsql/client': ^0.14.0 + '@mendable/firecrawl-js': ^1.4.3 + '@mlc-ai/web-llm': '*' + '@mozilla/readability': '*' + '@neondatabase/serverless': '*' + '@notionhq/client': ^2.2.10 + '@opensearch-project/opensearch': '*' + '@pinecone-database/pinecone': '*' + '@planetscale/database': ^1.8.0 + '@premai/prem-sdk': ^0.3.25 + '@qdrant/js-client-rest': '*' + '@raycast/api': ^1.55.2 + '@rockset/client': ^0.9.1 + '@smithy/eventstream-codec': ^2.0.5 + '@smithy/protocol-http': ^3.0.6 + '@smithy/signature-v4': ^2.0.10 + '@smithy/util-utf8': ^2.0.0 + '@spider-cloud/spider-client': ^0.0.21 + '@supabase/supabase-js': ^2.45.0 + '@tensorflow-models/universal-sentence-encoder': '*' + '@tensorflow/tfjs-core': '*' + '@upstash/ratelimit': ^1.1.3 || ^2.0.3 + '@upstash/redis': ^1.20.6 + '@upstash/vector': ^1.1.1 + '@vercel/kv': '*' + '@vercel/postgres': '*' + '@writerai/writer-sdk': ^0.40.2 + '@xata.io/client': ^0.28.0 + '@xenova/transformers': '*' + '@zilliz/milvus2-sdk-node': '>=2.3.5' + apify-client: ^2.7.1 + assemblyai: ^4.6.0 + azion: ^1.11.1 + better-sqlite3: '>=9.4.0 <12.0.0' + cassandra-driver: ^4.7.2 + cborg: ^4.1.1 + cheerio: ^1.0.0-rc.12 + chromadb: '*' + closevector-common: 0.1.3 + closevector-node: 0.1.6 + closevector-web: 0.1.6 + cohere-ai: '*' + convex: ^1.3.1 + couchbase: ^4.4.6 + crypto-js: ^4.2.0 + d3-dsv: ^2.0.0 + discord.js: ^14.14.1 + duck-duck-scrape: ^2.2.5 + epub2: ^3.0.1 + faiss-node: '*' + fast-xml-parser: '*' + firebase-admin: ^11.9.0 || ^12.0.0 || ^13.0.0 + google-auth-library: '*' + googleapis: '*' + hnswlib-node: ^3.0.0 + html-to-text: ^9.0.5 + ibm-cloud-sdk-core: '*' + ignore: ^5.2.0 + interface-datastore: ^8.2.11 + ioredis: ^5.3.2 + it-all: ^3.0.4 + jsdom: '*' + jsonwebtoken: ^9.0.2 + lodash: ^4.17.23 + lunary: ^0.7.10 + mammoth: ^1.11.0 + mariadb: ^3.4.0 + mem0ai: ^2.1.8 + mongodb: '*' + mysql2: ^3.9.8 + neo4j-driver: '*' + node-llama-cpp: '>=3.0.0' + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + openai: 6.19.0 + pdf-parse: 1.1.1 + pg: ^8.11.0 + pg-copy-streams: ^6.0.5 + pickleparser: ^0.2.1 + playwright: ^1.56.1 + portkey-ai: ^0.1.11 + puppeteer: '*' + pyodide: '>=0.24.1 <0.27.0' + redis: '*' + replicate: '*' + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.26 + typesense: ^1.5.3 + usearch: ^1.1.1 + voy-search: 0.6.2 + weaviate-client: '*' + word-extractor: '*' + ws: 8.18.3 + youtubei.js: '*' + peerDependenciesMeta: + '@arcjet/redact': + optional: true + '@aws-crypto/sha256-js': + optional: true + '@aws-sdk/client-dynamodb': + optional: true + '@aws-sdk/client-lambda': + optional: true + '@aws-sdk/client-s3': + optional: true + '@aws-sdk/client-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@aws-sdk/dsql-signer': + optional: true + '@azure/search-documents': + optional: true + '@azure/storage-blob': + optional: true + '@browserbasehq/sdk': + optional: true + '@clickhouse/client': + optional: true + '@datastax/astra-db-ts': + optional: true + '@elastic/elasticsearch': + optional: true + '@getmetal/metal-sdk': + optional: true + '@getzep/zep-cloud': + optional: true + '@getzep/zep-js': + optional: true + '@gomomento/sdk-core': + optional: true + '@google-cloud/storage': + optional: true + '@gradientai/nodejs-sdk': + optional: true + '@huggingface/inference': + optional: true + '@huggingface/transformers': + optional: true + '@lancedb/lancedb': + optional: true + '@layerup/layerup-security': + optional: true + '@libsql/client': + optional: true + '@mendable/firecrawl-js': + optional: true + '@mlc-ai/web-llm': + optional: true + '@mozilla/readability': + optional: true + '@neondatabase/serverless': + optional: true + '@notionhq/client': + optional: true + '@opensearch-project/opensearch': + optional: true + '@pinecone-database/pinecone': + optional: true + '@planetscale/database': + optional: true + '@premai/prem-sdk': + optional: true + '@qdrant/js-client-rest': + optional: true + '@raycast/api': + optional: true + '@rockset/client': + optional: true + '@smithy/eventstream-codec': + optional: true + '@smithy/protocol-http': + optional: true + '@smithy/signature-v4': + optional: true + '@smithy/util-utf8': + optional: true + '@spider-cloud/spider-client': + optional: true + '@supabase/supabase-js': + optional: true + '@tensorflow-models/universal-sentence-encoder': + optional: true + '@tensorflow/tfjs-core': + optional: true + '@upstash/ratelimit': + optional: true + '@upstash/redis': + optional: true + '@upstash/vector': + optional: true + '@vercel/kv': + optional: true + '@vercel/postgres': + optional: true + '@writerai/writer-sdk': + optional: true + '@xata.io/client': + optional: true + '@xenova/transformers': + optional: true + '@zilliz/milvus2-sdk-node': + optional: true + apify-client: + optional: true + assemblyai: + optional: true + azion: + optional: true + better-sqlite3: + optional: true + cassandra-driver: + optional: true + cborg: + optional: true + cheerio: + optional: true + chromadb: + optional: true + closevector-common: + optional: true + closevector-node: + optional: true + closevector-web: + optional: true + cohere-ai: + optional: true + convex: + optional: true + couchbase: + optional: true + crypto-js: + optional: true + d3-dsv: + optional: true + discord.js: + optional: true + duck-duck-scrape: + optional: true + epub2: + optional: true + faiss-node: + optional: true + fast-xml-parser: + optional: true + firebase-admin: + optional: true + google-auth-library: + optional: true + googleapis: + optional: true + hnswlib-node: + optional: true + html-to-text: + optional: true + ignore: + optional: true + interface-datastore: + optional: true + ioredis: + optional: true + it-all: + optional: true + jsdom: + optional: true + jsonwebtoken: + optional: true + lodash: + optional: true + lunary: + optional: true + mammoth: + optional: true + mariadb: + optional: true + mem0ai: + optional: true + mongodb: + optional: true + mysql2: + optional: true + neo4j-driver: + optional: true + node-llama-cpp: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + pg: + optional: true + pg-copy-streams: + optional: true + pickleparser: + optional: true + playwright: + optional: true + portkey-ai: + optional: true + puppeteer: + optional: true + pyodide: + optional: true + redis: + optional: true + replicate: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + typesense: + optional: true + usearch: + optional: true + voy-search: + optional: true + weaviate-client: + optional: true word-extractor: optional: true ws: @@ -5105,43 +5631,67 @@ packages: youtubei.js: optional: true - '@langchain/core@0.3.61': - resolution: {integrity: sha512-4O7fw5SXNSE+uBnathLQrhm3t+7dZGagt/5kt37A+pXw0AkudxEBvveg73sSnpBd9SIz3/Vc7F4k8rCKXGbEDA==} - engines: {node: '>=18'} + '@langchain/core@1.1.20': + resolution: {integrity: sha512-rwi7ZMhR336xIewGxVtOVZd63QBzVsV+zg/o1Og82yG4xTWODI8RIczMUATE5YYbEQQcbqsLPmM7vPpXtD5eHQ==} + engines: {node: '>=20'} - '@langchain/exa@0.0.5': - resolution: {integrity: sha512-KXNCYLxKs6rDGw+jcrFqE4CrIooUgzU0ip0k76YFptvMPrqLpNurYyqr5mAys0qn2vFavFfC3eJV/wrZ602EfA==} - engines: {node: '>=18'} + '@langchain/deepseek@1.0.9': + resolution: {integrity: sha512-x47iPH9/66ta3aYsVL5fiDFUlkBtOeGYy617Onr55pS6Nad0Z1mT5eHWhvrH8mtIaBTEvAvpb55vQQyz8LvwLw==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 - '@langchain/google-common@0.2.14': - resolution: {integrity: sha512-oz1YwwPUP+FC5UMLus1reJ578LfNSEh81shqBP8xXDioLUfKub6p5Jye61gHm8JTXcSvKHPCLGPeK0Uq7PDx2g==} - engines: {node: '>=18'} + '@langchain/exa@1.0.1': + resolution: {integrity: sha512-mojKKWUSe1qD/2/mqs9EL5IMXAg4xhf8fzhOjc/gsiVvbh5kfu7wHRy69LCAGiS6R+QJFjoggGrqoyQINa5GCg==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/google-gauth@0.2.14': - resolution: {integrity: sha512-vS68e13eupTOfQ6P0QpIaOkiAlwZthV23U9Afm7b6rD2lsZ78jwTabzmmkU2o9x/DioNa9hEPpbE7+Z26V0NYg==} - engines: {node: '>=18'} + '@langchain/google-common@2.1.15': + resolution: {integrity: sha512-6cBA8wXMFLCjXhkowofq58GDHRygY5SpJi4ZP+cX+XumMY6M5d76bP4KhWqoPBy2e2augh08vZVUAg67z/8LXA==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/google-genai@0.2.3': - resolution: {integrity: sha512-2oWH24zPZh+HkgFcgcQClnsST3shMDuDToMolnWsRPg6wR7G6sAOkHQdqmHVxc4qAJx5wopf+vH0j+zbCk+Bag==} - engines: {node: '>=18'} + '@langchain/google-gauth@2.1.15': + resolution: {integrity: sha512-QnT11K3YredmdtoOZwdJZB6atnsL23fBRsI8O+I6v+STEL/chq1fidHaiocjRPhVUYK+RrqL+BH+CTvBxWnZzQ==} + engines: {node: '>=20'} + + '@langchain/google-genai@2.1.15': + resolution: {integrity: sha512-Pg+mbMP1q83T/YWjF9E9uKq/D+GhnKS/xOQQuGUIM4wjGlA4BBKtjSzjVnIl66l3CUemVMCu8XYfUnDPbHmm1A==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/google-vertexai@0.2.14': - resolution: {integrity: sha512-OqfK3xDo8AmVFJHoINSfqFeKCp4d9aH4YnCOPBe6qDaTnME1QTCHs3U9BRWwUhfD46K50ocbQUAsnTYSclhhMg==} - engines: {node: '>=18'} + '@langchain/google-vertexai@2.1.15': + resolution: {integrity: sha512-p3klocNvePVnSytM9bcbnHIfUjOK42nQ4wvgdMOCI2FsUsHLg4He7pVGqGsIMfh6krKmiPcN8yadkomK+zh3NQ==} + engines: {node: '>=20'} + + '@langchain/groq@1.0.4': + resolution: {integrity: sha512-FqY9m1rykq46/B3P20rpZzd9pbt01sVsqRJvb5i21fIlYTvgxgVbwxVvqijyZJc4YA982Fe30chjGgiOEdCSsg==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/groq@0.1.2': - resolution: {integrity: sha512-bgQ9yGoNHOwG6LG2ngGvSNxF/1U1c1u3vKmFWmzecFIcBoQQOJY0jb0MrL3g1uTife0Sr3zxkWKXQg2aK/U4Sg==} + '@langchain/langgraph-checkpoint@1.0.0': + resolution: {integrity: sha512-xrclBGvNCXDmi0Nz28t3vjpxSH6UYx6w5XAXSiiB1WEdc2xD2iY/a913I3x3a31XpInUW/GGfXXfePfaghV54A==} engines: {node: '>=18'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 + + '@langchain/langgraph-sdk@1.6.5': + resolution: {integrity: sha512-JjprmbhgCnoNJ9DUKcvrEU+C9FfKsNGyT3ooqWxAY5Cx2qofhXmDJOpTCqqbxfDHPKG0RjTs5HgVK3WW5M6Big==} + peerDependencies: + '@langchain/core': 1.1.20 + react: ^18 || ^19 + react-dom: ^18 || ^19 + peerDependenciesMeta: + '@langchain/core': + optional: true + react: + optional: true + react-dom: + optional: true '@langchain/langgraph@0.0.22': resolution: {integrity: sha512-VdWUDRo/CXe1SjR34WxtbIwxIykSKjbdduKaNxCIPCZYxhfeL+NY3xi3F8ES6RTQV9gNYrl6ODuuXQtACQpK7g==} @@ -5152,63 +5702,105 @@ packages: better-sqlite3: optional: true - '@langchain/mistralai@0.2.0': - resolution: {integrity: sha512-VdfbKZopAuSXf/vlXbriGWLK3c7j5s47DoB3S31xpprY2BMSKZZiX9vE9TsgxMfAPuIDPIYcfgU7p1upvTYt8g==} + '@langchain/langgraph@1.2.0': + resolution: {integrity: sha512-wyqKIzXTAfXX3L1d8R7icM+HmRQBTbuNLWtUlpRJ/JP/ux1ei/sOSt6p8f90ARoOP2iJVlM70wOBYWaGErdBlA==} engines: {node: '>=18'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 + zod: ^3.25.32 || ^4.2.0 + zod-to-json-schema: ^3.x + peerDependenciesMeta: + zod-to-json-schema: + optional: true - '@langchain/mongodb@0.0.1': - resolution: {integrity: sha512-5CWh73s7D9/WraXcZJTqc6VRkITNe71G4uXBO/KwtE1E/7DlYT8EvWzX6Er+HvVp1EsBGlcJGUp9St/lvbfrPg==} - engines: {node: '>=18'} + '@langchain/mistralai@1.0.4': + resolution: {integrity: sha512-e3tHpcD5Of+Dz5bA7IgNWEUaexjaAU6epqLvbI0FHdZeg7IItDuVlRh7pSDvUwdVag2bndqwPEbSOHXZWP5OCw==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 - '@langchain/ollama@0.2.0': - resolution: {integrity: sha512-jLlYFqt+nbhaJKLakk7lRTWHZJ7wHeJLM6yuv4jToQ8zPzpL//372+MjggDoW0mnw8ofysg1T2C6mEJspKJtiA==} - engines: {node: '>=18'} + '@langchain/mongodb@1.1.0': + resolution: {integrity: sha512-oEshb4TekZVA05jpTIJdV6AEF1p4K4psg29JLTx7SuLXSSC3OYefDvbDf1W4MwK4bbiASqI5eE5qDfdz44U7jw==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 + + '@langchain/ollama@1.2.2': + resolution: {integrity: sha512-UmbDSToADT15O7kMBm+0MVs/Zie8SHVFMKt4BDSyunXZOgDdqIPvc4pEqy50m1/gq6kIaVuR2hRAy5kcF0V8kg==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 '@langchain/openai@0.3.13': resolution: {integrity: sha512-lfiauYttb1Vv1GVGDNZlse8475RUsKm9JJ7X9kMVtYoOQnK8xxzMVSrpW7HYLmJokrtVgF6STwRzNJI2gZ3uBw==} engines: {node: '>=18'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 '@langchain/openai@0.6.3': resolution: {integrity: sha512-dSNuXDTJitDzN8D2wFNqWVELDbBRhMpJiFeiWpHjfPuq7R6wSjzNNY/Uk6x+FLpvbOs/zKNWy5+0q0p3KrCjRQ==} engines: {node: '>=18'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/pinecone@0.1.3': - resolution: {integrity: sha512-1DPZvkg3Ve1TJSUfmpf7GF2SvRyg8cLjKjffkuW/C3oPONti2a9W7Q+F18YgBf1Swk0bPJ7A1EtMvlsU+NOQmw==} - engines: {node: '>=18'} + '@langchain/openai@1.2.5': + resolution: {integrity: sha512-AtnzS0j8Kv7IIdXywp/N27ytsMIbmncvFckiaWyOGibgqQYZyyR3rFC6P4z2x4/yoMgU7nXcd8dTNf+mABzLUw==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/qdrant@0.0.5': - resolution: {integrity: sha512-zhBHE3rSBUBzIqBnR4RQB48DwXLPp5LGbCPfFCDrum4ZXDUXHQNq6Jrq8OAm6UFfx9IzMQ07Dlr7/VO6w3BlaQ==} - engines: {node: '>=18'} + '@langchain/pinecone@1.0.1': + resolution: {integrity: sha512-iq/dmGg6RF+sMLyIhN5Z9eXgxQsr+vwj19B7HG4utR42mF2VM/yI7KJHnyL0n/LdXsovUi5F4fef8bF7ZlYFyA==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 + '@pinecone-database/pinecone': ^5.0.2 + + '@langchain/qdrant@1.0.1': + resolution: {integrity: sha512-y3QK+KXgA++ZXAE9ofKjT5u6yh4FQqTF5CpdWIynKV2Zz926SSFq3ELbPhvMfUGu61Ils7p6jd1DIbXpZNAkgQ==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 + + '@langchain/redis@1.1.0': + resolution: {integrity: sha512-ZJZOv9kBS8dCX5NGBUlp4qqxEuLeoOFlXeq9jXmTQDTwTO6NhVcrYF2fK3tKL/PFajYPpTCLHV9pD9kuXb0EvA==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 + + '@langchain/tavily@1.2.0': + resolution: {integrity: sha512-aPLPgtw8+b/Rnr3H+X8H8z98T/Y7JuCE4B5eqRDHoEWgZvMDUFF7divqwQqCTMq2deQttlVrm5bN5JbKaAR7/w==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 '@langchain/textsplitters@0.0.1': resolution: {integrity: sha512-DqYsdZ/W2e4DlC8uFEFkYMtlAAmtDJgEJIl59XkueCQ0yNIMi1r9zpiRykaK/hBNEwE8FnQxixGj3mXwVTerdQ==} engines: {node: '>=18'} - '@langchain/weaviate@0.0.1': - resolution: {integrity: sha512-Lf6zgTf6i/fsPNlkDxPRLA3LEz2Wwgk6LNe54dByt0oZM4W+N4n5n/gDwojsXAKNEF5alXUv2N6yAOcUuXSbxg==} - engines: {node: '>=18'} + '@langchain/textsplitters@1.0.1': + resolution: {integrity: sha512-rheJlB01iVtrOUzttscutRgLybPH9qR79EyzBEbf1u97ljWyuxQfCwIWK+SjoQTM9O8M7GGLLRBSYE26Jmcoww==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 '@langchain/weaviate@0.2.1': resolution: {integrity: sha512-rlfAKF+GB0A5MUrol34oDrBkl4q6AefARk9KDW+LfzhV/74pZZLZyIPYPxvE4XwI3gvpwp024DNsDxK/4UW0/g==} engines: {node: '>=18'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 - '@langchain/xai@0.0.1': - resolution: {integrity: sha512-F1/btq7+DzvyBFsCsShkt1MVUXIo52b4f6Ti2Eea0o/Oth/D2jfpnQmZLZ4rZHSGjxI0bRkS5zLyYveTbr+7yA==} - engines: {node: '>=18'} + '@langchain/weaviate@1.0.1': + resolution: {integrity: sha512-6FZxtJkFWwm1R985mW9VvRd+K70FKtIT5FS/P5KKnIaQkGDUYmteLzHoTi9w47Ry3PHwLWhI1Ps8DCoYRtsQhw==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 + + '@langchain/xai@1.3.1': + resolution: {integrity: sha512-x9KAKgPTp5pMrl6OVp3pyfZocNO1Pk5X5PjMFGInktCmXzcgQ2anbgxGOQUSp4c084a3xZwS0IZyoA3s/p3+jA==} + engines: {node: '>=20'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 '@leichtgewicht/ip-codec@2.0.4': resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} @@ -5284,16 +5876,11 @@ packages: '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - '@mistralai/mistralai@0.1.3': - resolution: {integrity: sha512-WUHxC2xdeqX9PTXJEqdiNY54vT2ir72WSJrZTTBKRnkfhX6zIfCYA24faRlWjUB5WTpn+wfdGsTMl3ArijlXFA==} - '@mistralai/mistralai@0.2.0': resolution: {integrity: sha512-mYjE9NovwWdhSXd6KvOgjWUyka2qlxhuohsqhRN4rFtH2MdTDJhAeH3Aqvu3P9q71Xz9oBX2pNWrPVVzkgwZTg==} - '@mistralai/mistralai@1.3.6': - resolution: {integrity: sha512-2y7U5riZq+cIjKpxGO9y417XuZv9CpBXEAvbjRMzWPGhXY7U1ZXj4VO4H9riS2kFZqTR2yLEKSE6/pGWVVIqgQ==} - peerDependencies: - zod: '>= 3' + '@mistralai/mistralai@1.14.0': + resolution: {integrity: sha512-6zaj2f2LCd37cRpBvCgctkDbXtYBlAC85p+u4uU/726zjtsI+sdVH34qRzkm9iE3tRb8BoaiI0/P7TD+uMvLLQ==} '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} @@ -5339,6 +5926,9 @@ packages: '@mongodb-js/saslprep@1.1.5': resolution: {integrity: sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==} + '@mongodb-js/saslprep@1.4.6': + resolution: {integrity: sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g==} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} cpu: [arm64] @@ -6330,6 +6920,12 @@ packages: typescript: optional: true + '@qdrant/js-client-rest@1.17.0': + resolution: {integrity: sha512-aZFQeirWVqWAa1a8vJ957LMzcXkFHGbsoRhzc8AkGfg6V0jtK8PlG8/eyyc2xhYsR961FDDx1Tx6nyE0K7lS+A==} + engines: {node: '>=18.17.0', pnpm: '>=8'} + peerDependencies: + typescript: '>=4.7' + '@qdrant/js-client-rest@1.9.0': resolution: {integrity: sha512-YiX/IskbRCoAY2ujyPDI6FBcO0ygAS4pgkGaJ7DcrJFh4SZV2XHs+u0KM7mO72RWJn1eJQFF2PQwxG+401xxJg==} engines: {node: '>=18.0.0', pnpm: '>=8'} @@ -6689,6 +7285,10 @@ packages: resolution: {integrity: sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==} engines: {node: '>=18.0.0'} + '@smithy/abort-controller@4.2.11': + resolution: {integrity: sha512-Hj4WoYWMJnSpM6/kchsm4bUNTL9XiSyhvoMb2KIq4VJzyDt7JpGHUZHkVNPZVC7YE1tf8tPeVauxpFBKGW4/KQ==} + engines: {node: '>=18.0.0'} + '@smithy/chunked-blob-reader-native@4.0.0': resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} engines: {node: '>=18.0.0'} @@ -6713,6 +7313,10 @@ packages: resolution: {integrity: sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==} engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.4.10': + resolution: {integrity: sha512-IRTkd6ps0ru+lTWnfnsbXzW80A8Od8p3pYiZnW98K2Hb20rqfsX7VTlfUwhrcOeSSy68Gn9WBofwPuw3e5CCsg==} + engines: {node: '>=18.0.0'} + '@smithy/core@1.3.7': resolution: {integrity: sha512-zHrrstOO78g+/rOJoHi4j3mGUBtsljRhcKNzloWPv1XIwgcFUi+F1YFKr2qPQ3z7Ls5dNc4L2SPrVarNFIQqog==} engines: {node: '>=14.0.0'} @@ -6721,6 +7325,10 @@ packages: resolution: {integrity: sha512-swFv0wQiK7TGHeuAp6lfF5Kw1dHWsTrCuc+yh4Kh05gEShjsE2RUxHucEerR9ih9JITNtaHcSpUThn5Y/vDw0A==} engines: {node: '>=18.0.0'} + '@smithy/core@3.23.8': + resolution: {integrity: sha512-f7uPeBi7ehmLT4YF2u9j3qx6lSnurG1DLXOsTtJrIRNDF7VXio4BGHQ+SQteN/BrUVudbkuL4v7oOsRCzq4BqA==} + engines: {node: '>=18.0.0'} + '@smithy/core@3.7.0': resolution: {integrity: sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==} engines: {node: '>=18.0.0'} @@ -6745,6 +7353,10 @@ packages: resolution: {integrity: sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==} engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.2.11': + resolution: {integrity: sha512-lBXrS6ku0kTj3xLmsJW0WwqWbGQ6ueooYyp/1L9lkyT0M02C+DWwYwc5aTyXFbRaK38ojALxNixg+LxKSHZc0g==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-codec@2.1.4': resolution: {integrity: sha512-UkiieTztP7adg8EuqZvB0Y4LewdleZCJU7Kgt9RDutMsRYqO32fMpWeQHeTHaIMosmzcRZUykMRrhwGJe9mP3A==} @@ -6752,50 +7364,42 @@ packages: resolution: {integrity: sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@2.1.4': - resolution: {integrity: sha512-K0SyvrUu/vARKzNW+Wp9HImiC/cJ6K88/n7FTH1slY+MErdKoiSbRLaXbJ9qD6x1Hu28cplHMlhADwZelUx/Ww==} - engines: {node: '>=14.0.0'} - - '@smithy/eventstream-serde-browser@4.0.1': - resolution: {integrity: sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==} + '@smithy/eventstream-codec@4.2.11': + resolution: {integrity: sha512-Sf39Ml0iVX+ba/bgMPxaXWAAFmHqYLTmbjAPfLPLY8CrYkRDEqZdUsKC1OwVMCdJXfAt0v4j49GIJ8DoSYAe6w==} engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-browser@4.0.4': resolution: {integrity: sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@2.1.4': - resolution: {integrity: sha512-FH+2AwOwZ0kHPB9sciWJtUqx81V4vizfT3P6T9eslmIC2hi8ch/KFvQlF7jDmwR1aLlPlq6qqLKLqzK/71Ki4A==} - engines: {node: '>=14.0.0'} - - '@smithy/eventstream-serde-config-resolver@4.0.1': - resolution: {integrity: sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==} + '@smithy/eventstream-serde-browser@4.2.11': + resolution: {integrity: sha512-3rEpo3G6f/nRS7fQDsZmxw/ius6rnlIpz4UX6FlALEzz8JoSxFmdBt0SZnthis+km7sQo6q5/3e+UJcuQivoXA==} engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-config-resolver@4.1.2': resolution: {integrity: sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@2.1.4': - resolution: {integrity: sha512-gsc5ZTvVcB9sleLQzsK/rOhgn52+AAsmhEr41WDwAcctccBjh429+b8gT9t+SU8QyajypfsLOZfJQu0+zE515Q==} - engines: {node: '>=14.0.0'} - - '@smithy/eventstream-serde-node@4.0.1': - resolution: {integrity: sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==} + '@smithy/eventstream-serde-config-resolver@4.3.11': + resolution: {integrity: sha512-XeNIA8tcP/GDWnnKkO7qEm/bg0B/bP9lvIXZBXcGZwZ+VYM8h8k9wuDvUODtdQ2Wcp2RcBkPTCSMmaniVHrMlA==} engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-node@4.0.4': resolution: {integrity: sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@2.1.4': - resolution: {integrity: sha512-NKLAsYnZA5s+ntipJRKo1RrRbhYHrsEnmiUoz0EhVYrAih+UELY9sKR+A1ujGaFm3nKDs5fPfiozC2wpXq2zUA==} - engines: {node: '>=14.0.0'} + '@smithy/eventstream-serde-node@4.2.11': + resolution: {integrity: sha512-fzbCh18rscBDTQSCrsp1fGcclLNF//nJyhjldsEl/5wCYmgpHblv5JSppQAyQI24lClsFT0wV06N1Porn0IsEw==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-universal@4.0.4': resolution: {integrity: sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-universal@4.2.11': + resolution: {integrity: sha512-MJ7HcI+jEkqoWT5vp+uoVaAjBrmxBtKhZTeynDRG/seEjJfqyg3SiqMMqyPnAMzmIfLaeJ/uiuSDP/l9AnMy/Q==} + engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@2.4.4': resolution: {integrity: sha512-DSUtmsnIx26tPuyyrK49dk2DAhPgEw6xRW7V62nMHIB5dk3NqhGnwcKO2fMdt/l3NUVgia34ZsSJA8bD+3nh7g==} @@ -6811,6 +7415,10 @@ packages: resolution: {integrity: sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==} engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@5.3.13': + resolution: {integrity: sha512-U2Hcfl2s3XaYjikN9cT4mPu8ybDbImV3baXR0PkVlC0TTx808bRP3FaPGAzPtB8OByI+JqJ1kyS+7GEgae7+qQ==} + engines: {node: '>=18.0.0'} + '@smithy/hash-blob-browser@4.0.4': resolution: {integrity: sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==} engines: {node: '>=18.0.0'} @@ -6831,6 +7439,10 @@ packages: resolution: {integrity: sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==} engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.2.11': + resolution: {integrity: sha512-T+p1pNynRkydpdL015ruIoyPSRw9e/SQOWmSAMmmprfswMrd5Ow5igOWNVlvyVFZlxXqGmyH3NQwfwy8r5Jx0A==} + engines: {node: '>=18.0.0'} + '@smithy/hash-stream-node@4.0.4': resolution: {integrity: sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==} engines: {node: '>=18.0.0'} @@ -6850,6 +7462,10 @@ packages: resolution: {integrity: sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==} engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.2.11': + resolution: {integrity: sha512-cGNMrgykRmddrNhYy1yBdrp5GwIgEkniS7k9O1VLB38yxQtlvrxpZtUVvo6T4cKpeZsriukBuuxfJcdZQc/f/g==} + engines: {node: '>=18.0.0'} + '@smithy/is-array-buffer@2.1.1': resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==} engines: {node: '>=14.0.0'} @@ -6858,6 +7474,10 @@ packages: resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} engines: {node: '>=18.0.0'} + '@smithy/is-array-buffer@4.2.2': + resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} + engines: {node: '>=18.0.0'} + '@smithy/md5-js@4.0.4': resolution: {integrity: sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==} engines: {node: '>=18.0.0'} @@ -6878,6 +7498,10 @@ packages: resolution: {integrity: sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.2.11': + resolution: {integrity: sha512-UvIfKYAKhCzr4p6jFevPlKhQwyQwlJ6IeKLDhmV1PlYfcW3RL4ROjNEDtSik4NYMi9kDkH7eSwyTP3vNJ/u/Dw==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@2.4.6': resolution: {integrity: sha512-AsXtUXHPOAS0EGZUSFOsVJvc7p0KL29PGkLxLfycPOcFVLru/oinYB6yvyL73ZZPX2OB8sMYUMrj7eH2kI7V/w==} engines: {node: '>=14.0.0'} @@ -6895,6 +7519,10 @@ packages: resolution: {integrity: sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.4.22': + resolution: {integrity: sha512-sc81w1o4Jy+/MAQlY3sQ8C7CmSpcvIi3TAzXblUv2hjG11BBSJi/Cw8vDx5BxMxapuH2I+Gc+45vWsgU07WZRQ==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@2.1.6': resolution: {integrity: sha512-khpSV0NxqMHfa06kfG4WYv+978sVvfTFmn0hIFKKwOXtIxyYtPKiQWFT4nnwZD07fGdYGbtCBu3YALc8SsA5mA==} engines: {node: '>=14.0.0'} @@ -6911,6 +7539,10 @@ packages: resolution: {integrity: sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.4.39': + resolution: {integrity: sha512-MCVCxaCzuZgiHtHGV2Ke44nh6t4+8/tO+rTYOzrr2+G4nMLU/qbzNCWKBX54lyEaVcGQrfOJiG2f8imtiw+nIQ==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@2.2.1': resolution: {integrity: sha512-VAWRWqnNjgccebndpyK94om4ZTYzXLQxUmNCXYzM/3O9MTfQjTNBgtFtQwyIIez6z7LWcCsXmnKVIOE9mLqAHQ==} engines: {node: '>=14.0.0'} @@ -6927,6 +7559,10 @@ packages: resolution: {integrity: sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==} engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.2.12': + resolution: {integrity: sha512-W9g1bOLui7Xn5FABRVS0o3rXL0gfN37d/8I/W7i0N7oxjx9QecUmXEMSUMADTODwdtka9cN43t5BI2CodLJpng==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@2.1.4': resolution: {integrity: sha512-Qqs2ba8Ax1rGKOSGJS2JN23fhhox2WMdRuzx0NYHtXzhxbJOIMmz9uQY6Hf4PY8FPteBPp1+h0j5Fmr+oW12sg==} engines: {node: '>=14.0.0'} @@ -6943,6 +7579,10 @@ packages: resolution: {integrity: sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.2.11': + resolution: {integrity: sha512-s+eenEPW6RgliDk2IhjD2hWOxIx1NKrOHxEwNUaUXxYBxIyCcDfNULZ2Mu15E3kwcJWBedTET/kEASPV1A1Akg==} + engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@2.2.5': resolution: {integrity: sha512-CxPf2CXhjO79IypHJLBATB66Dw6suvr1Yc2ccY39hpR6wdse3pZ3E8RF83SODiNH0Wjmkd0ze4OF8exugEixgA==} engines: {node: '>=14.0.0'} @@ -6959,6 +7599,10 @@ packages: resolution: {integrity: sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==} engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.3.11': + resolution: {integrity: sha512-xD17eE7kaLgBBGf5CZQ58hh2YmwK1Z0O8YhffwB/De2jsL0U3JklmhVYJ9Uf37OtUDLF2gsW40Xwwag9U869Gg==} + engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@2.4.2': resolution: {integrity: sha512-yrj3c1g145uiK5io+1UPbJAHo8BSGORkBzrmzvAsOmBKb+1p3jmM8ZwNLDH/HTTxVLm9iM5rMszx+iAh1HUC4Q==} engines: {node: '>=14.0.0'} @@ -6975,6 +7619,10 @@ packages: resolution: {integrity: sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==} engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.4.14': + resolution: {integrity: sha512-DamSqaU8nuk0xTJDrYnRzZndHwwRnyj/n/+RqGGCcBKB4qrQem0mSDiWdupaNWdwxzyMU91qxDmHOCazfhtO3A==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@2.1.4': resolution: {integrity: sha512-nWaY/MImj1BiXZ9WY65h45dcxOx8pl06KYoHxwojDxDL+Q9yLU1YnZpgv8zsHhEftlj9KhePENjQTlNowWVyug==} engines: {node: '>=14.0.0'} @@ -6991,6 +7639,10 @@ packages: resolution: {integrity: sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==} engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.2.11': + resolution: {integrity: sha512-14T1V64o6/ndyrnl1ze1ZhyLzIeYNN47oF/QU6P5m82AEtyOkMJTb0gO1dPubYjyyKuPD6OSVMPDKe+zioOnCg==} + engines: {node: '>=18.0.0'} + '@smithy/protocol-http@3.2.2': resolution: {integrity: sha512-xYBlllOQcOuLoxzhF2u8kRHhIFGQpDeTQj/dBSnw4kfI29WMKL5RnW1m9YjnJAJ49miuIvrkJR+gW5bCQ+Mchw==} engines: {node: '>=14.0.0'} @@ -7007,6 +7659,10 @@ packages: resolution: {integrity: sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==} engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.3.11': + resolution: {integrity: sha512-hI+barOVDJBkNt4y0L2mu3Ugc0w7+BpJ2CZuLwXtSltGAAwCb3IvnalGlbDV/UCS6a9ZuT3+exd1WxNdLb5IlQ==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@2.1.4': resolution: {integrity: sha512-LXSL0J/nRWvGT+jIj+Fip3j0J1ZmHkUyBFRzg/4SmPNCLeDrtVu7ptKOnTboPsFZu5BxmpYok3kJuQzzRdrhbw==} engines: {node: '>=14.0.0'} @@ -7023,6 +7679,10 @@ packages: resolution: {integrity: sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==} engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.2.11': + resolution: {integrity: sha512-7spdikrYiljpket6u0up2Ck2mxhy7dZ0+TDd+S53Dg2DHd6wg+YNJrTCHiLdgZmEXZKI7LJZcwL3721ZRDFiqA==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@2.1.4': resolution: {integrity: sha512-U2b8olKXgZAs0eRo7Op11jTNmmcC/sqYmsA7vN6A+jkGnDvJlEl7AetUegbBzU8q3D6WzC5rhR/joIy8tXPzIg==} engines: {node: '>=14.0.0'} @@ -7039,6 +7699,10 @@ packages: resolution: {integrity: sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==} engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.2.11': + resolution: {integrity: sha512-nE3IRNjDltvGcoThD2abTozI1dkSy8aX+a2N1Rs55en5UsdyyIXgGEmevUL3okZFoJC77JgRGe99xYohhsjivQ==} + engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@2.1.4': resolution: {integrity: sha512-JW2Hthy21evnvDmYYk1kItOmbp3X5XI5iqorXgFEunb6hQfSDZ7O1g0Clyxg7k/Pcr9pfLk5xDIR2To/IohlsQ==} engines: {node: '>=14.0.0'} @@ -7055,6 +7719,10 @@ packages: resolution: {integrity: sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==} engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.2.11': + resolution: {integrity: sha512-HkMFJZJUhzU3HvND1+Yw/kYWXp4RPDLBWLcK1n+Vqw8xn4y2YiBhdww8IxhkQjP/QlZun5bwm3vcHc8AqIU3zw==} + engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@2.3.5': resolution: {integrity: sha512-oI99+hOvsM8oAJtxAGmoL/YCcGXtbP0fjPseYGaNmJ4X5xOFTer0KPk7AIH3AL6c5AlYErivEi1X/X78HgTVIw==} engines: {node: '>=14.0.0'} @@ -7071,6 +7739,10 @@ packages: resolution: {integrity: sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==} engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.4.6': + resolution: {integrity: sha512-IB/M5I8G0EeXZTHsAxpx51tMQ5R719F3aq+fjEB6VtNcCHDc0ajFDIGDZw+FW9GxtEkgTduiPpjveJdA/CX7sw==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@2.1.4': resolution: {integrity: sha512-gnu9gCn0qQ8IdhNjs6o3QVCXzUs33znSDYwVMWo3nX4dM6j7z9u6FC302ShYyVWfO4MkVMuGCCJ6nl3PcH7V1Q==} engines: {node: '>=14.0.0'} @@ -7083,6 +7755,10 @@ packages: resolution: {integrity: sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==} engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.3.11': + resolution: {integrity: sha512-V1L6N9aKOBAN4wEHLyqjLBnAz13mtILU0SeDrjOaIZEeN6IFa6DxwRt1NNpOdmSpQUfkBj0qeD3m6P77uzMhgQ==} + engines: {node: '>=18.0.0'} + '@smithy/smithy-client@2.4.4': resolution: {integrity: sha512-SNE17wjycPZIJ2P5sv6wMTteV/vQVPdaqQkoK1KeGoWHXx79t3iLhQXj1uqRdlkMUS9pXJrLOAS+VvUSOYwQKw==} engines: {node: '>=14.0.0'} @@ -7091,6 +7767,10 @@ packages: resolution: {integrity: sha512-nxsNWCDmWR6LrnC55+fKhbuA1S9v/gNh+5BSiYEQ5X8OYCRZj3G8DBoLoWNc5oXd7LOXvoPEXRnsRph4at8Ttw==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.12.2': + resolution: {integrity: sha512-HezY3UuG0k4T+4xhFKctLXCA5N2oN+Rtv+mmL8Gt7YmsUY2yhmcLyW75qrSzldfj75IsCW/4UhY3s20KcFnZqA==} + engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.4.10': resolution: {integrity: sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==} engines: {node: '>=18.0.0'} @@ -7107,6 +7787,10 @@ packages: resolution: {integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==} engines: {node: '>=18.0.0'} + '@smithy/types@4.13.0': + resolution: {integrity: sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.3.1': resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} engines: {node: '>=18.0.0'} @@ -7130,6 +7814,10 @@ packages: resolution: {integrity: sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==} engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.2.11': + resolution: {integrity: sha512-oTAGGHo8ZYc5VZsBREzuf5lf2pAurJQsccMusVZ85wDkX66ojEc/XauiGjzCj50A61ObFTPe6d7Pyt6UBYaing==} + engines: {node: '>=18.0.0'} + '@smithy/util-base64@2.2.0': resolution: {integrity: sha512-RiQI/Txu0SxCR38Ky5BMEVaFfkNTBjpbxlr2UhhxggSmnsHDQPZJWMtPoXs7TWZaseslIlAWMiHmqRT3AV/P2w==} engines: {node: '>=14.0.0'} @@ -7138,6 +7826,10 @@ packages: resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} engines: {node: '>=18.0.0'} + '@smithy/util-base64@4.3.2': + resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@2.1.1': resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==} @@ -7145,6 +7837,10 @@ packages: resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@4.2.2': + resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@2.2.1': resolution: {integrity: sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==} engines: {node: '>=14.0.0'} @@ -7153,6 +7849,10 @@ packages: resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@4.2.3': + resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} + engines: {node: '>=18.0.0'} + '@smithy/util-buffer-from@2.1.1': resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==} engines: {node: '>=14.0.0'} @@ -7161,6 +7861,10 @@ packages: resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} engines: {node: '>=18.0.0'} + '@smithy/util-buffer-from@4.2.2': + resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} + engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@2.2.1': resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==} engines: {node: '>=14.0.0'} @@ -7169,6 +7873,10 @@ packages: resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@4.2.2': + resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@2.1.6': resolution: {integrity: sha512-lM2JMYCilrejfGf8WWnVfrKly3vf+mc5x9TrTpT++qIKP452uWfLqlaUxbz1TkSfhqm8RjrlY22589B9aI8A9w==} engines: {node: '>= 10.0.0'} @@ -7185,6 +7893,10 @@ packages: resolution: {integrity: sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.3.38': + resolution: {integrity: sha512-c8P1mFLNxcsdAMabB8/VUQUbWzFmgujWi4bAXSggcqLYPc8V4U5abqFqOyn+dK4YT+q8UyCVkTO8807t4t2syA==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@2.2.6': resolution: {integrity: sha512-UmUbPHbkBJCXRFbq+FPLpVwiFPHj1oPWXJS2f2sy23PtXM94c9X5EceI6JKuKdBty+tzhrAs5JbmPM/HvmDB8Q==} engines: {node: '>= 10.0.0'} @@ -7201,6 +7913,10 @@ packages: resolution: {integrity: sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.2.41': + resolution: {integrity: sha512-/UG+9MT3UZAR0fLzOtMJMfWGcjjHvgggq924x/CRy8vRbL+yFf3Z6vETlvq8vDH92+31P/1gSOFoo7303wN8WQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@1.1.5': resolution: {integrity: sha512-tgDpaUNsUtRvNiBulKU1VnpoXU1GINMfZZXunRhUXOTBEAufG1Wp79uDXLau2gg1RZ4dpAR6lXCkrmddihCGUg==} engines: {node: '>= 14.0.0'} @@ -7217,6 +7933,10 @@ packages: resolution: {integrity: sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==} engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.3.2': + resolution: {integrity: sha512-+4HFLpE5u29AbFlTdlKIT7jfOzZ8PDYZKTb3e+AgLz986OYwqTourQ5H+jg79/66DB69Un1+qKecLnkZdAsYcA==} + engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@2.1.1': resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==} engines: {node: '>=14.0.0'} @@ -7225,6 +7945,10 @@ packages: resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@4.2.2': + resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} + engines: {node: '>=18.0.0'} + '@smithy/util-middleware@2.1.4': resolution: {integrity: sha512-5yYNOgCN0DL0OplME0pthoUR/sCfipnROkbTO7m872o0GHCVNJj5xOFJ143rvHNA54+pIPMLum4z2DhPC2pVGA==} engines: {node: '>=14.0.0'} @@ -7241,6 +7965,10 @@ packages: resolution: {integrity: sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==} engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.2.11': + resolution: {integrity: sha512-r3dtF9F+TpSZUxpOVVtPfk09Rlo4lT6ORBqEvX3IBT6SkQAdDSVKR5GcfmZbtl7WKhKnmb3wbDTQ6ibR2XHClw==} + engines: {node: '>=18.0.0'} + '@smithy/util-retry@2.1.4': resolution: {integrity: sha512-JRZwhA3fhkdenSEYIWatC8oLwt4Bdf2LhHbNQApqb7yFoIGMl4twcYI3BcJZ7YIBZrACA9jGveW6tuCd836XzQ==} engines: {node: '>= 14.0.0'} @@ -7257,6 +7985,10 @@ packages: resolution: {integrity: sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==} engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.2.11': + resolution: {integrity: sha512-XSZULmL5x6aCTTii59wJqKsY1l3eMIAomRAccW7Tzh9r8s7T/7rdo03oektuH5jeYRlJMPcNP92EuRDvk9aXbw==} + engines: {node: '>=18.0.0'} + '@smithy/util-stream@2.1.4': resolution: {integrity: sha512-CiWaFPXstoR7v/PGHddFckovkhJb28wgQR7LwIt6RsQCJeRIHvUTVWhXw/Pco6Jm6nz/vfzN9FFdj/JN7RTkxQ==} engines: {node: '>=14.0.0'} @@ -7273,6 +8005,10 @@ packages: resolution: {integrity: sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==} engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.5.17': + resolution: {integrity: sha512-793BYZ4h2JAQkNHcEnyFxDTcZbm9bVybD0UV/LEWmZ5bkTms7JqjfrLMi2Qy0E5WFcCzLwCAPgcvcvxoeALbAQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@2.1.1': resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==} engines: {node: '>=14.0.0'} @@ -7281,6 +8017,10 @@ packages: resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@4.2.2': + resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} + engines: {node: '>=18.0.0'} + '@smithy/util-utf8@2.2.0': resolution: {integrity: sha512-hBsKr5BqrDrKS8qy+YcV7/htmMGxriA1PREOf/8AGBhHIZnfilVv1Waf1OyKhSbFW15U/8+gcMUQ9/Kk5qwpHQ==} engines: {node: '>=14.0.0'} @@ -7289,6 +8029,10 @@ packages: resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} engines: {node: '>=18.0.0'} + '@smithy/util-utf8@4.2.2': + resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} + engines: {node: '>=18.0.0'} + '@smithy/util-waiter@2.1.4': resolution: {integrity: sha512-AK17WaC0hx1wR9juAOsQkJ6DjDxBGEf5TrKhpXtNFEn+cVto9Li3MVsdpAO97AF7bhFXSyC8tJA3F4ThhqwCdg==} engines: {node: '>=14.0.0'} @@ -7297,6 +8041,14 @@ packages: resolution: {integrity: sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==} engines: {node: '>=18.0.0'} + '@smithy/util-waiter@4.2.11': + resolution: {integrity: sha512-x7Rh2azQPs3XxbvCzcttRErKKvLnbZfqRf/gOjw2pb+ZscX88e5UkRPCB67bVnsFHxayvMvmePfKTqsRb+is1A==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.2': + resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} + engines: {node: '>=18.0.0'} + '@sqltools/formatter@1.2.5': resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} @@ -7307,7 +8059,7 @@ packages: resolution: {integrity: sha512-fuKNgCgqLih+L1um0rKuwLSypn9dgvFnG6VKtJnFVwEVrqKZTcD1KXMNuwru+6FWhpkjbmshGWZRwx0VtEsR1Q==} engines: {node: '>=18'} peerDependencies: - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 ai: ^3.4.7 '@supabase/functions-js@2.1.5': @@ -8040,8 +8792,8 @@ packages: '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - '@types/node@10.14.22': - resolution: {integrity: sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} '@types/node@18.19.23': resolution: {integrity: sha512-wtE3d0OUfNKtZYAqZb8HAWGxxXsImJcPUAgZNw+dWFxO6s5tIwIjyKnY76tsTatsNCLJPkVYwUpq15D38ng9Aw==} @@ -8786,7 +9538,7 @@ packages: resolution: {integrity: sha512-2u2YT6cf/bTRexUtSiSDco/3/z/xlQ9iiW3y2aH05RwDlj9Q6rpALsTdjRNcglI+OBPaXUEORB/bD1dRwxob6Q==} engines: {node: '>=18'} peerDependencies: - openai: 4.96.0 + openai: 6.19.0 react: ^18 || ^19 svelte: ^3.0.0 || ^4.0.0 zod: ^3.0.0 @@ -9436,6 +10188,10 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bson@6.10.4: + resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} + engines: {node: '>=16.20.1'} + bson@6.4.0: resolution: {integrity: sha512-6/gSSEdbkuFlSb+ufj5jUSU4+wo8xQOwm2bDSqwmxiPE17JTpsP63eAwoN8iF8Oy4gJYj+PAL3zdRCTdaw5Y1g==} engines: {node: '>=16.20.1'} @@ -9621,6 +10377,10 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@4.1.2: resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} @@ -9711,7 +10471,7 @@ packages: peerDependencies: '@google/generative-ai': ^0.24.0 cohere-ai: ^5.0.0 || ^6.0.0 || ^7.0.0 - openai: 4.96.0 + openai: 6.19.0 peerDependenciesMeta: '@google/generative-ai': optional: true @@ -9874,6 +10634,10 @@ packages: cohere-ai@7.10.0: resolution: {integrity: sha512-HmPyn+DOM9yUv20oM1xlQSZWtFSAKbS8nqtstGKdjX9DK5zTiQXwpwsP7Il5l66jx2TB8NyNXLujmuw0MTgmSQ==} + cohere-ai@7.20.0: + resolution: {integrity: sha512-h/3h3pcLXRUmkzp/W+/FWViEMcAFtSZ8YayCTFQXpib112uNSj3feApOtJg7v9lreWR1t7gznhE6N9KNCX5FOA==} + engines: {node: '>=18.0.0'} + collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} @@ -10003,11 +10767,11 @@ packages: peerDependencies: '@ai-sdk/openai': '>=0.0.36' '@cloudflare/workers-types': '>=4.20240718.0' - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 '@langchain/openai': '>=0.2.5' ai: '>=3.2.22' langchain: '>=0.2.11' - openai: 4.96.0 + openai: 6.19.0 compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} @@ -10087,6 +10851,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convict@6.2.4: + resolution: {integrity: sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==} + engines: {node: '>=6'} + cookie-parser@1.4.6: resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} engines: {node: '>= 0.8.0'} @@ -11540,6 +12308,9 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-xml-builder@1.0.0: + resolution: {integrity: sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==} + fast-xml-parser@4.2.5: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true @@ -11552,6 +12323,10 @@ packages: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true + fast-xml-parser@5.4.1: + resolution: {integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==} + hasBin: true + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -11797,6 +12572,10 @@ packages: resolution: {integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==} engines: {node: '>= 18'} + form-data-encoder@4.1.0: + resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} + engines: {node: '>= 18'} + form-data@4.0.4: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} @@ -12177,8 +12956,8 @@ packages: resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - groq-sdk@0.5.0: - resolution: {integrity: sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==} + groq-sdk@0.19.0: + resolution: {integrity: sha512-vdh5h7ORvwvOvutA80dKF81b0gPWHxu6K/GOJBOM0n6p6CSqAVLhFfeS79Ef0j/yCycDR09jqY7jkYz9dLiS6w==} grpc-tools@1.12.4: resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} @@ -12516,9 +13295,9 @@ packages: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} - ibm-cloud-sdk-core@5.1.0: - resolution: {integrity: sha512-KJCbPz3tiXB1NGAD7cL4JtwpWV8yd/C7jsaHsxvedMo2ZblNG8emMyvSpGhiKAQVZmi3c0ujz6eJdy22NHuUWQ==} - engines: {node: '>=18'} + ibm-cloud-sdk-core@5.4.8: + resolution: {integrity: sha512-tLMlZv13cV6S1UPj/bhv8XfV9Z1BDDs/4DxHKWnCw7QlJMzmGdHLPX386x9nrFMQMPZ48eAH+Thsa06tzUZkaA==} + engines: {node: '>=20'} iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -12824,6 +13603,10 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} + is-network-error@1.3.1: + resolution: {integrity: sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==} + engines: {node: '>=16'} + is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -13358,6 +14141,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} @@ -13472,6 +14259,10 @@ packages: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + jsprim@1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} @@ -13496,12 +14287,18 @@ packages: jwa@2.0.0: resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} jws@4.0.0: resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + jwt-decode@3.1.2: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} @@ -13564,7 +14361,7 @@ packages: '@langchain/anthropic': '*' '@langchain/aws': '*' '@langchain/cohere': '*' - '@langchain/core': 0.3.61 + '@langchain/core': 1.1.20 '@langchain/google-genai': '*' '@langchain/google-vertexai': '*' '@langchain/groq': '*' @@ -13603,6 +14400,12 @@ packages: typeorm: optional: true + langchain@1.2.18: + resolution: {integrity: sha512-+7P9pA57Q1zvHyeDt/MVmBJ+RXVsS7FF1Lo0h6bpxFrAjLaxkBWPG8FMI376jBEtFug6wk0CtInEH9PXPxlukA==} + engines: {node: '>=20'} + peerDependencies: + '@langchain/core': 1.1.20 + langchainhub@0.0.11: resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==} @@ -13620,14 +14423,10 @@ packages: resolution: {integrity: sha512-QCUf+z2v+HDI78c02nsN7Fgu9jly67u4OwMRDeEQ/vOCiaUTKT4GLpYyzIL3sfl5DOp+pQsVozC/207CU8X1vw==} engines: {node: '>=18'} - langsmith@0.1.6: - resolution: {integrity: sha512-pLwepjtA7ki4aK20L1KqbJi55f10KVHHOSPAqzoNnAZqWv/YlHyxHhNrY/Nkxb+rM+hKLZNBMpmjlgvceEQtvw==} - hasBin: true - langsmith@0.2.8: resolution: {integrity: sha512-wKVNZoYtd8EqQWUEsfDZlZ77rH7vVqgNtONXRwynUp7ZFMFUIPhSlqE9pXqrmYPE8ZTBFj7diag2lFgUuaOEKw==} peerDependencies: - openai: 4.96.0 + openai: 6.19.0 peerDependenciesMeta: openai: optional: true @@ -13635,8 +14434,42 @@ packages: langsmith@0.3.34: resolution: {integrity: sha512-rxYuuypqaSzIuNjZMTsCVAgG0cYdI516dwuKn58bu4YuBRlLaLeNlHewRyoqP9lrEAlpkekCV9fUwwZ7lO8f2g==} peerDependencies: - openai: 4.96.0 + openai: 6.19.0 + peerDependenciesMeta: + openai: + optional: true + + langsmith@0.4.12: + resolution: {integrity: sha512-YWt0jcGvKqjUgIvd78rd4QcdMss0lUkeUaqp0UpVRq7H2yNDx8H5jOUO/laWUmaPtWGgcip0qturykXe1g9Gqw==} + peerDependencies: + '@opentelemetry/api': '*' + '@opentelemetry/exporter-trace-otlp-proto': '*' + '@opentelemetry/sdk-trace-base': '*' + openai: 6.19.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/exporter-trace-otlp-proto': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true + openai: + optional: true + + langsmith@0.5.7: + resolution: {integrity: sha512-FjYf2oBGMoSXnaT4SRaFguIiGJaonZ5VKWKJDPl9awLZjz2RkN29AcQWceecSINVzXzTvtRWPOjAWT+XggqNNg==} + peerDependencies: + '@opentelemetry/api': '*' + '@opentelemetry/exporter-trace-otlp-proto': '*' + '@opentelemetry/sdk-trace-base': '*' + openai: 6.19.0 peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/exporter-trace-otlp-proto': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true openai: optional: true @@ -13782,6 +14615,9 @@ packages: lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + lodash.curry@4.1.1: resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} @@ -13928,7 +14764,7 @@ packages: lunary@0.7.12: resolution: {integrity: sha512-ruEJaV2Jjw50l34RAgYG+9YYzsIZk3mmUklAp0Zpuk0trxbjOKAPEnovMGQJesEokf9+qdloq+Z0pG+cwFbAtw==} peerDependencies: - openai: 4.96.0 + openai: 6.19.0 react: '>=17.0.0' peerDependenciesMeta: openai: @@ -14021,6 +14857,9 @@ packages: material-colors@1.2.6: resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} + math-expression-evaluator@2.0.7: + resolution: {integrity: sha512-uwliJZ6BPHRq4eiqNWxZBDzKUiS5RIynFFcgchqhBOloVLVBpZpNG8jRYkedLcBvhph8TnRyWEuxPqiQcwIdog==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -14113,7 +14952,7 @@ packages: resolution: {integrity: sha512-rgNKFSBnEroeqOT3fYM26hs53W5IA72Ca/JA+5YoX7BeE5yL/KeDVrO3LbseFUGABpp4rFrvzjfE92u+sAdpvw==} engines: {node: '>=18'} peerDependencies: - '@anthropic-ai/sdk': 0.18.0 + '@anthropic-ai/sdk': ^0.73.0 '@google/genai': ^0.7.0 '@mistralai/mistralai': ^1.5.2 '@qdrant/js-client-rest': 1.13.0 @@ -14450,6 +15289,36 @@ packages: mongodb-connection-string-url@3.0.0: resolution: {integrity: sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==} + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} + + mongodb@6.21.0: + resolution: {integrity: sha512-URyb/VXMjJ4da46OeSXg+puO39XH9DeQpWCslifrRn9JWugy0D+DvvBvkm2WxmHe61O/H19JM66p1z7RHVkZ6A==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.3.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + mongodb@6.3.0: resolution: {integrity: sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==} engines: {node: '>=16.20.1'} @@ -14934,8 +15803,8 @@ packages: ollama@0.5.11: resolution: {integrity: sha512-lDAKcpmBU3VAOGF05NcQipHNKTdpKfAHpZ7bjCsElkUkmX7SNZImi6lwIxz/l1zQtLq0S3wuLneRuiXxX2KIew==} - ollama@0.5.14: - resolution: {integrity: sha512-pvOuEYa2WkkAumxzJP0RdEYHkbZ64AYyyUszXVX7ruLvk5L+EiO2G71da2GqEQ4IAk4j6eLoUbGk5arzFT1wJA==} + ollama@0.6.3: + resolution: {integrity: sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -14976,12 +15845,12 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openai@4.96.0: - resolution: {integrity: sha512-dKoW56i02Prv2XQolJ9Rl9Svqubqkzg3QpwEOBuSVZLk05Shelu7s+ErRTwFc1Bs3JZ2qBqBfVpXQiJhwOGG8A==} + openai@6.19.0: + resolution: {integrity: sha512-5uGrF82Ql7TKgIWUnuxh+OyzYbPRPwYDSgGc05JowbXRFsOkuj0dJuCdPCTBZT4mcmp2NEvj/URwDzW+lYgmVw==} hasBin: true peerDependencies: ws: 8.18.3 - zod: ^3.23.8 + zod: ^3.25 || ^4.0 peerDependenciesMeta: ws: optional: true @@ -15065,14 +15934,26 @@ packages: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} + p-queue@9.1.0: + resolution: {integrity: sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==} + engines: {node: '>=20'} + p-retry@4.6.2: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} + p-retry@7.1.1: + resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} + engines: {node: '>=20'} + p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -16545,6 +17426,10 @@ packages: resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-web-to-node-stream@3.0.2: resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} engines: {node: '>=8'} @@ -17602,6 +18487,9 @@ packages: strnum@2.1.1: resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + strnum@2.2.0: + resolution: {integrity: sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==} + strtok3@6.3.0: resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} engines: {node: '>=10'} @@ -18363,6 +19251,10 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} + undici@6.23.0: + resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + engines: {node: '>=18.17'} + unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -18563,23 +19455,11 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - uuidv7@0.6.3: resolution: {integrity: sha512-zV3eW2NlXTsun/aJ7AixxZjH/byQcH/r3J99MI0dDEkU2cJIBJxhEWUHDTpOaLPRNhebPZoeHuykYREkI9HafA==} hasBin: true @@ -18804,10 +19684,6 @@ packages: resolution: {integrity: sha512-1We0l8/uw6r8xnPsY8nSne1+/Ntd6o2JFq5LODqb63ac9v4QWDpT8dyPSRriUhif+IZ2Ttusw+w38361z72eaw==} engines: {node: '>=16.0.0'} - weaviate-ts-client@2.1.1: - resolution: {integrity: sha512-d8yc2KnIEIV1beHAU8mhrElT3BoROoXGDsLlqFX8QGx3G+gOiPTRMc7SLy4F17+LvaUaTD0XkHvWX++4iehnsg==} - engines: {node: '>=16.0.0'} - web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -19301,25 +20177,15 @@ packages: engines: {node: '>=8.0.0'} hasBin: true - zod-to-json-schema@3.22.4: - resolution: {integrity: sha512-2Ed5dJ+n/O3cU383xSY28cuVi0BCQhF8nYqWU5paEpl7fVdqdAmiLdqLyfblbNdfOFwFfi/mqU4O1pwc60iBhQ==} - peerDependencies: - zod: ^3.22.4 - zod-to-json-schema@3.22.5: resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} peerDependencies: zod: ^3.22.4 - zod-to-json-schema@3.23.1: - resolution: {integrity: sha512-oT9INvydob1XV0v1d2IadrR74rLtDInLvDFfAa1CG0Pmg/vxATk7I2gSelfj271mbzeM4Da0uuDQE/Nkj3DWNw==} - peerDependencies: - zod: ^3.23.3 - - zod-to-json-schema@3.24.1: - resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: - zod: ^3.24.1 + zod: ^3.25 || ^4 zod-validation-error@3.3.0: resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} @@ -19330,14 +20196,11 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@3.25.32: - resolution: {integrity: sha512-OSm2xTIRfW8CV5/QKgngwmQW/8aPfGdaQFlrGoErlgg/Epm7cjb6K6VEyExfe65a3VybUOnu381edLb0dfJl0g==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} zustand@4.5.2: resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} @@ -19365,36 +20228,54 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/openai@3.0.2(zod@3.22.4)': + '@ai-sdk/openai@3.0.2(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.1 - '@ai-sdk/provider-utils': 4.0.2(zod@3.22.4) - zod: 3.22.4 + '@ai-sdk/provider-utils': 4.0.2(zod@4.3.6) + zod: 4.3.6 - '@ai-sdk/provider-utils@0.0.14(zod@3.22.4)': + '@ai-sdk/provider-utils@0.0.14(zod@3.25.76)': dependencies: '@ai-sdk/provider': 0.0.10 eventsource-parser: 1.1.2 nanoid: 3.3.6 secure-json-parse: 2.7.0 optionalDependencies: - zod: 3.22.4 + zod: 3.25.76 + + '@ai-sdk/provider-utils@0.0.14(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 0.0.10 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 4.3.6 - '@ai-sdk/provider-utils@1.0.2(zod@3.22.4)': + '@ai-sdk/provider-utils@1.0.2(zod@3.25.76)': dependencies: '@ai-sdk/provider': 0.0.12 eventsource-parser: 1.1.2 nanoid: 3.3.6 secure-json-parse: 2.7.0 optionalDependencies: - zod: 3.22.4 + zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.2(zod@3.22.4)': + '@ai-sdk/provider-utils@1.0.2(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 0.0.12 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 4.3.6 + + '@ai-sdk/provider-utils@4.0.2(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.1 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 - zod: 3.22.4 + zod: 4.3.6 '@ai-sdk/provider@0.0.10': dependencies: @@ -19408,44 +20289,88 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@0.0.20(react@18.2.0)(zod@3.22.4)': + '@ai-sdk/react@0.0.20(react@18.2.0)(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 1.0.2(zod@3.22.4) - '@ai-sdk/ui-utils': 0.0.12(zod@3.22.4) + '@ai-sdk/provider-utils': 1.0.2(zod@3.25.76) + '@ai-sdk/ui-utils': 0.0.12(zod@3.25.76) swr: 2.2.0(react@18.2.0) optionalDependencies: react: 18.2.0 - zod: 3.22.4 + zod: 3.25.76 - '@ai-sdk/solid@0.0.14(solid-js@1.9.7)(zod@3.22.4)': + '@ai-sdk/react@0.0.20(react@18.2.0)(zod@4.3.6)': dependencies: - '@ai-sdk/ui-utils': 0.0.12(zod@3.22.4) + '@ai-sdk/provider-utils': 1.0.2(zod@4.3.6) + '@ai-sdk/ui-utils': 0.0.12(zod@4.3.6) + swr: 2.2.0(react@18.2.0) + optionalDependencies: + react: 18.2.0 + zod: 4.3.6 + + '@ai-sdk/solid@0.0.14(solid-js@1.9.7)(zod@3.25.76)': + dependencies: + '@ai-sdk/ui-utils': 0.0.12(zod@3.25.76) + optionalDependencies: + solid-js: 1.9.7 + transitivePeerDependencies: + - zod + + '@ai-sdk/solid@0.0.14(solid-js@1.9.7)(zod@4.3.6)': + dependencies: + '@ai-sdk/ui-utils': 0.0.12(zod@4.3.6) optionalDependencies: solid-js: 1.9.7 transitivePeerDependencies: - zod - '@ai-sdk/svelte@0.0.15(svelte@4.2.18)(zod@3.22.4)': + '@ai-sdk/svelte@0.0.15(svelte@4.2.18)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 1.0.2(zod@3.25.76) + '@ai-sdk/ui-utils': 0.0.12(zod@3.25.76) + sswr: 2.1.0(svelte@4.2.18) + optionalDependencies: + svelte: 4.2.18 + transitivePeerDependencies: + - zod + + '@ai-sdk/svelte@0.0.15(svelte@4.2.18)(zod@4.3.6)': dependencies: - '@ai-sdk/provider-utils': 1.0.2(zod@3.22.4) - '@ai-sdk/ui-utils': 0.0.12(zod@3.22.4) + '@ai-sdk/provider-utils': 1.0.2(zod@4.3.6) + '@ai-sdk/ui-utils': 0.0.12(zod@4.3.6) sswr: 2.1.0(svelte@4.2.18) optionalDependencies: svelte: 4.2.18 transitivePeerDependencies: - zod - '@ai-sdk/ui-utils@0.0.12(zod@3.22.4)': + '@ai-sdk/ui-utils@0.0.12(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 1.0.2(zod@3.22.4) + '@ai-sdk/provider-utils': 1.0.2(zod@3.25.76) secure-json-parse: 2.7.0 optionalDependencies: - zod: 3.22.4 + zod: 3.25.76 + + '@ai-sdk/ui-utils@0.0.12(zod@4.3.6)': + dependencies: + '@ai-sdk/provider-utils': 1.0.2(zod@4.3.6) + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 4.3.6 - '@ai-sdk/vue@0.0.15(vue@3.4.31(typescript@5.5.2))(zod@3.22.4)': + '@ai-sdk/vue@0.0.15(vue@3.4.31(typescript@5.5.2))(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 0.0.14(zod@3.22.4) - '@ai-sdk/ui-utils': 0.0.12(zod@3.22.4) + '@ai-sdk/provider-utils': 0.0.14(zod@3.25.76) + '@ai-sdk/ui-utils': 0.0.12(zod@3.25.76) + swrv: 1.0.4(vue@3.4.31(typescript@5.5.2)) + optionalDependencies: + vue: 3.4.31(typescript@5.5.2) + transitivePeerDependencies: + - zod + + '@ai-sdk/vue@0.0.15(vue@3.4.31(typescript@5.5.2))(zod@4.3.6)': + dependencies: + '@ai-sdk/provider-utils': 0.0.14(zod@4.3.6) + '@ai-sdk/ui-utils': 0.0.12(zod@4.3.6) swrv: 1.0.4(vue@3.4.31(typescript@5.5.2)) optionalDependencies: vue: 3.4.31(typescript@5.5.2) @@ -19459,36 +20384,11 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@anthropic-ai/sdk@0.20.9(encoding@0.1.13)': - dependencies: - '@types/node': 18.19.23 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - web-streams-polyfill: 3.3.3 - transitivePeerDependencies: - - encoding - - '@anthropic-ai/sdk@0.27.3(encoding@0.1.13)': - dependencies: - '@types/node': 18.19.23 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - '@anthropic-ai/sdk@0.65.0(zod@3.22.4)': + '@anthropic-ai/sdk@0.73.0(zod@4.3.6)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: - zod: 3.22.4 + zod: 4.3.6 '@apideck/better-ajv-errors@0.3.6(ajv@8.13.0)': dependencies: @@ -19537,11 +20437,11 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@arizeai/openinference-instrumentation-langchain@2.0.0(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))': + '@arizeai/openinference-instrumentation-langchain@2.0.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: '@arizeai/openinference-core': 1.0.0 '@arizeai/openinference-semantic-conventions': 1.0.0 - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.46.0(@opentelemetry/api@1.9.0) @@ -19559,14 +20459,14 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.965.0 + tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.862.0 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-crypto/ie11-detection@3.0.0': dependencies: @@ -19597,10 +20497,10 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.840.0 + '@aws-sdk/types': 3.965.0 '@aws-sdk/util-locate-window': 3.495.0 '@smithy/util-utf8': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-crypto/sha256-js@3.0.0': dependencies: @@ -19611,8 +20511,8 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.965.0 + tslib: 2.8.1 '@aws-crypto/supports-web-crypto@3.0.0': dependencies: @@ -19620,7 +20520,7 @@ snapshots: '@aws-crypto/supports-web-crypto@5.2.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@aws-crypto/util@3.0.0': dependencies: @@ -19630,9 +20530,9 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.965.0 '@smithy/util-utf8': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/client-bedrock-agent-runtime@3.755.0': dependencies: @@ -19649,131 +20549,87 @@ snapshots: '@aws-sdk/util-endpoints': 3.743.0 '@aws-sdk/util-user-agent-browser': 3.734.0 '@aws-sdk/util-user-agent-node': 3.750.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 - '@smithy/eventstream-serde-browser': 4.0.1 - '@smithy/eventstream-serde-config-resolver': 4.0.1 - '@smithy/eventstream-serde-node': 4.0.1 - '@smithy/fetch-http-handler': 5.1.0 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-retry': 4.1.15 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.1.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/eventstream-serde-browser': 4.0.4 + '@smithy/eventstream-serde-config-resolver': 4.1.2 + '@smithy/eventstream-serde-node': 4.0.4 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/hash-node': 4.0.5 + '@smithy/invalid-dependency': 4.0.5 + '@smithy/middleware-content-length': 4.0.5 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-retry': 4.1.19 + '@smithy/middleware-serde': 4.0.9 + '@smithy/middleware-stack': 4.0.5 + '@smithy/node-config-provider': 4.1.4 + '@smithy/node-http-handler': 4.1.1 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.22 - '@smithy/util-defaults-mode-node': 4.0.22 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 + '@smithy/util-defaults-mode-browser': 4.0.26 + '@smithy/util-defaults-mode-node': 4.0.26 + '@smithy/util-endpoints': 3.0.7 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-bedrock-runtime@3.422.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.421.0 - '@aws-sdk/credential-provider-node': 3.421.0 - '@aws-sdk/middleware-host-header': 3.418.0 - '@aws-sdk/middleware-logger': 3.418.0 - '@aws-sdk/middleware-recursion-detection': 3.418.0 - '@aws-sdk/middleware-signing': 3.418.0 - '@aws-sdk/middleware-user-agent': 3.418.0 - '@aws-sdk/region-config-resolver': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@aws-sdk/util-user-agent-browser': 3.418.0 - '@aws-sdk/util-user-agent-node': 3.418.0 - '@smithy/config-resolver': 2.1.5 - '@smithy/eventstream-serde-browser': 2.1.4 - '@smithy/eventstream-serde-config-resolver': 2.1.4 - '@smithy/eventstream-serde-node': 2.1.4 - '@smithy/fetch-http-handler': 2.4.4 - '@smithy/hash-node': 2.1.4 - '@smithy/invalid-dependency': 2.1.4 - '@smithy/middleware-content-length': 2.1.4 - '@smithy/middleware-endpoint': 2.4.6 - '@smithy/middleware-retry': 2.1.6 - '@smithy/middleware-serde': 2.2.1 - '@smithy/middleware-stack': 2.1.4 - '@smithy/node-config-provider': 2.2.5 - '@smithy/node-http-handler': 2.4.2 - '@smithy/protocol-http': 3.2.2 - '@smithy/smithy-client': 2.4.4 - '@smithy/types': 2.11.0 - '@smithy/url-parser': 2.1.4 - '@smithy/util-base64': 2.2.0 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.6 - '@smithy/util-defaults-mode-node': 2.2.6 - '@smithy/util-retry': 2.1.4 - '@smithy/util-stream': 2.1.4 - '@smithy/util-utf8': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-bedrock-runtime@3.755.0': + '@aws-sdk/client-bedrock-runtime@3.966.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.750.0 - '@aws-sdk/credential-provider-node': 3.750.0 - '@aws-sdk/middleware-host-header': 3.734.0 - '@aws-sdk/middleware-logger': 3.734.0 - '@aws-sdk/middleware-recursion-detection': 3.734.0 - '@aws-sdk/middleware-user-agent': 3.750.0 - '@aws-sdk/region-config-resolver': 3.734.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@aws-sdk/util-user-agent-browser': 3.734.0 - '@aws-sdk/util-user-agent-node': 3.750.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 - '@smithy/eventstream-serde-browser': 4.0.1 - '@smithy/eventstream-serde-config-resolver': 4.0.1 - '@smithy/eventstream-serde-node': 4.0.1 - '@smithy/fetch-http-handler': 5.1.0 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-retry': 4.1.15 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.1.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.22 - '@smithy/util-defaults-mode-node': 4.0.22 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@smithy/util-stream': 4.2.3 - '@smithy/util-utf8': 4.0.0 - '@types/uuid': 9.0.8 - tslib: 2.6.2 - uuid: 9.0.1 + '@aws-sdk/core': 3.966.0 + '@aws-sdk/credential-provider-node': 3.966.0 + '@aws-sdk/eventstream-handler-node': 3.965.0 + '@aws-sdk/middleware-eventstream': 3.965.0 + '@aws-sdk/middleware-host-header': 3.965.0 + '@aws-sdk/middleware-logger': 3.965.0 + '@aws-sdk/middleware-recursion-detection': 3.965.0 + '@aws-sdk/middleware-user-agent': 3.966.0 + '@aws-sdk/middleware-websocket': 3.965.0 + '@aws-sdk/region-config-resolver': 3.965.0 + '@aws-sdk/token-providers': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-endpoints': 3.965.0 + '@aws-sdk/util-user-agent-browser': 3.965.0 + '@aws-sdk/util-user-agent-node': 3.966.0 + '@smithy/config-resolver': 4.4.10 + '@smithy/core': 3.23.8 + '@smithy/eventstream-serde-browser': 4.2.11 + '@smithy/eventstream-serde-config-resolver': 4.3.11 + '@smithy/eventstream-serde-node': 4.2.11 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/hash-node': 4.2.11 + '@smithy/invalid-dependency': 4.2.11 + '@smithy/middleware-content-length': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 + '@smithy/middleware-serde': 4.2.12 + '@smithy/middleware-stack': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/node-http-handler': 4.4.14 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/util-stream': 4.5.17 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -19820,7 +20676,51 @@ snapshots: '@smithy/util-stream': 4.2.4 '@smithy/util-utf8': 4.0.0 '@smithy/util-waiter': 4.0.6 - tslib: 2.6.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-cognito-identity@3.1002.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/credential-provider-node': 3.972.16 + '@aws-sdk/middleware-host-header': 3.972.6 + '@aws-sdk/middleware-logger': 3.972.6 + '@aws-sdk/middleware-recursion-detection': 3.972.6 + '@aws-sdk/middleware-user-agent': 3.972.17 + '@aws-sdk/region-config-resolver': 3.972.6 + '@aws-sdk/types': 3.973.4 + '@aws-sdk/util-endpoints': 3.996.3 + '@aws-sdk/util-user-agent-browser': 3.972.6 + '@aws-sdk/util-user-agent-node': 3.973.2 + '@smithy/config-resolver': 4.4.10 + '@smithy/core': 3.23.8 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/hash-node': 4.2.11 + '@smithy/invalid-dependency': 4.2.11 + '@smithy/middleware-content-length': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 + '@smithy/middleware-serde': 4.2.12 + '@smithy/middleware-stack': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/node-http-handler': 4.4.14 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -19868,7 +20768,7 @@ snapshots: '@smithy/util-utf8': 2.2.0 '@smithy/util-waiter': 2.1.4 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - aws-crt @@ -19914,7 +20814,7 @@ snapshots: '@smithy/util-utf8': 4.0.0 '@types/uuid': 9.0.8 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - aws-crt @@ -19977,7 +20877,52 @@ snapshots: '@smithy/util-waiter': 4.0.6 '@types/uuid': 9.0.8 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sagemaker@3.1002.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/credential-provider-node': 3.972.16 + '@aws-sdk/middleware-host-header': 3.972.6 + '@aws-sdk/middleware-logger': 3.972.6 + '@aws-sdk/middleware-recursion-detection': 3.972.6 + '@aws-sdk/middleware-user-agent': 3.972.17 + '@aws-sdk/region-config-resolver': 3.972.6 + '@aws-sdk/types': 3.973.4 + '@aws-sdk/util-endpoints': 3.996.3 + '@aws-sdk/util-user-agent-browser': 3.972.6 + '@aws-sdk/util-user-agent-node': 3.973.2 + '@smithy/config-resolver': 4.4.10 + '@smithy/core': 3.23.8 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/hash-node': 4.2.11 + '@smithy/invalid-dependency': 4.2.11 + '@smithy/middleware-content-length': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 + '@smithy/middleware-serde': 4.2.12 + '@smithy/middleware-stack': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/node-http-handler': 4.4.14 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/util-utf8': 4.2.2 + '@smithy/util-waiter': 4.2.11 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20025,7 +20970,7 @@ snapshots: '@smithy/util-utf8': 4.0.0 '@types/uuid': 9.0.8 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - aws-crt @@ -20114,7 +21059,7 @@ snapshots: '@smithy/util-middleware': 2.1.4 '@smithy/util-retry': 2.1.4 '@smithy/util-utf8': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20163,45 +21108,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.421.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.418.0 - '@aws-sdk/middleware-logger': 3.418.0 - '@aws-sdk/middleware-recursion-detection': 3.418.0 - '@aws-sdk/middleware-user-agent': 3.418.0 - '@aws-sdk/region-config-resolver': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@aws-sdk/util-user-agent-browser': 3.418.0 - '@aws-sdk/util-user-agent-node': 3.418.0 - '@smithy/config-resolver': 2.1.5 - '@smithy/fetch-http-handler': 2.4.4 - '@smithy/hash-node': 2.1.4 - '@smithy/invalid-dependency': 2.1.4 - '@smithy/middleware-content-length': 2.1.4 - '@smithy/middleware-endpoint': 2.4.6 - '@smithy/middleware-retry': 2.1.6 - '@smithy/middleware-serde': 2.2.1 - '@smithy/middleware-stack': 2.1.4 - '@smithy/node-config-provider': 2.2.5 - '@smithy/node-http-handler': 2.4.2 - '@smithy/protocol-http': 3.2.2 - '@smithy/smithy-client': 2.4.4 - '@smithy/types': 2.11.0 - '@smithy/url-parser': 2.1.4 - '@smithy/util-base64': 2.2.0 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.6 - '@smithy/util-defaults-mode-node': 2.2.6 - '@smithy/util-retry': 2.1.4 - '@smithy/util-utf8': 2.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-sso@3.529.1': dependencies: '@aws-crypto/sha256-browser': 3.0.0 @@ -20241,7 +21147,7 @@ snapshots: '@smithy/util-middleware': 2.1.4 '@smithy/util-retry': 2.1.4 '@smithy/util-utf8': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20284,7 +21190,7 @@ snapshots: '@smithy/util-middleware': 4.0.5 '@smithy/util-retry': 4.0.7 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20327,7 +21233,7 @@ snapshots: '@smithy/util-middleware': 4.0.5 '@smithy/util-retry': 4.0.7 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20370,7 +21276,7 @@ snapshots: '@smithy/util-middleware': 4.0.5 '@smithy/util-retry': 4.0.7 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20413,50 +21319,50 @@ snapshots: '@smithy/util-middleware': 4.0.5 '@smithy/util-retry': 4.0.7 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.421.0': + '@aws-sdk/client-sso@3.966.0': dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/credential-provider-node': 3.421.0 - '@aws-sdk/middleware-host-header': 3.418.0 - '@aws-sdk/middleware-logger': 3.418.0 - '@aws-sdk/middleware-recursion-detection': 3.418.0 - '@aws-sdk/middleware-sdk-sts': 3.418.0 - '@aws-sdk/middleware-signing': 3.418.0 - '@aws-sdk/middleware-user-agent': 3.418.0 - '@aws-sdk/region-config-resolver': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@aws-sdk/util-user-agent-browser': 3.418.0 - '@aws-sdk/util-user-agent-node': 3.418.0 - '@smithy/config-resolver': 2.1.5 - '@smithy/fetch-http-handler': 2.4.4 - '@smithy/hash-node': 2.1.4 - '@smithy/invalid-dependency': 2.1.4 - '@smithy/middleware-content-length': 2.1.4 - '@smithy/middleware-endpoint': 2.4.6 - '@smithy/middleware-retry': 2.1.6 - '@smithy/middleware-serde': 2.2.1 - '@smithy/middleware-stack': 2.1.4 - '@smithy/node-config-provider': 2.2.5 - '@smithy/node-http-handler': 2.4.2 - '@smithy/protocol-http': 3.2.2 - '@smithy/smithy-client': 2.4.4 - '@smithy/types': 2.11.0 - '@smithy/url-parser': 2.1.4 - '@smithy/util-base64': 2.2.0 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.6 - '@smithy/util-defaults-mode-node': 2.2.6 - '@smithy/util-retry': 2.1.4 - '@smithy/util-utf8': 2.2.0 - fast-xml-parser: 4.2.5 - tslib: 2.6.2 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.966.0 + '@aws-sdk/middleware-host-header': 3.965.0 + '@aws-sdk/middleware-logger': 3.965.0 + '@aws-sdk/middleware-recursion-detection': 3.965.0 + '@aws-sdk/middleware-user-agent': 3.966.0 + '@aws-sdk/region-config-resolver': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-endpoints': 3.965.0 + '@aws-sdk/util-user-agent-browser': 3.965.0 + '@aws-sdk/util-user-agent-node': 3.966.0 + '@smithy/config-resolver': 4.4.10 + '@smithy/core': 3.23.8 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/hash-node': 4.2.11 + '@smithy/invalid-dependency': 4.2.11 + '@smithy/middleware-content-length': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 + '@smithy/middleware-serde': 4.2.12 + '@smithy/middleware-stack': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/node-http-handler': 4.4.14 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20623,19 +21529,54 @@ snapshots: fast-xml-parser: 5.2.5 tslib: 2.6.2 - '@aws-sdk/credential-provider-env@3.418.0': + '@aws-sdk/core@3.966.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@aws-sdk/xml-builder': 3.965.0 + '@smithy/core': 3.23.8 + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/signature-v4': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/util-base64': 4.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@aws-sdk/core@3.973.17': + dependencies: + '@aws-sdk/types': 3.973.4 + '@aws-sdk/xml-builder': 3.972.9 + '@smithy/core': 3.23.8 + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/signature-v4': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/util-base64': 4.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-cognito-identity@3.972.8': dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.1.4 - '@smithy/types': 2.11.0 - tslib: 2.6.2 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/types': 3.973.4 + '@smithy/property-provider': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt '@aws-sdk/credential-provider-env@3.523.0': dependencies: '@aws-sdk/types': 3.523.0 '@smithy/property-provider': 2.1.4 '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-env@3.723.0': dependencies: @@ -20643,7 +21584,7 @@ snapshots: '@aws-sdk/types': 3.723.0 '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-env@3.750.0': dependencies: @@ -20651,7 +21592,7 @@ snapshots: '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-env@3.844.0': dependencies: @@ -20659,7 +21600,7 @@ snapshots: '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-env@3.864.0': dependencies: @@ -20667,7 +21608,23 @@ snapshots: '@aws-sdk/types': 3.862.0 '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.966.0': + dependencies: + '@aws-sdk/core': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.15': + dependencies: + '@aws-sdk/core': 3.973.17 + '@aws-sdk/types': 3.973.4 + '@smithy/property-provider': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@aws-sdk/credential-provider-http@3.525.0': dependencies: @@ -20679,7 +21636,7 @@ snapshots: '@smithy/smithy-client': 2.4.4 '@smithy/types': 2.11.0 '@smithy/util-stream': 2.1.4 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-http@3.723.0': dependencies: @@ -20692,7 +21649,7 @@ snapshots: '@smithy/smithy-client': 4.4.10 '@smithy/types': 4.3.2 '@smithy/util-stream': 4.2.4 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-http@3.750.0': dependencies: @@ -20705,7 +21662,7 @@ snapshots: '@smithy/smithy-client': 4.4.10 '@smithy/types': 4.3.2 '@smithy/util-stream': 4.2.4 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-http@3.844.0': dependencies: @@ -20718,7 +21675,7 @@ snapshots: '@smithy/smithy-client': 4.4.10 '@smithy/types': 4.3.2 '@smithy/util-stream': 4.2.4 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-http@3.864.0': dependencies: @@ -20731,22 +21688,33 @@ snapshots: '@smithy/smithy-client': 4.4.10 '@smithy/types': 4.3.2 '@smithy/util-stream': 4.2.4 - tslib: 2.6.2 + tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.421.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.418.0 - '@aws-sdk/credential-provider-process': 3.418.0 - '@aws-sdk/credential-provider-sso': 3.421.0 - '@aws-sdk/credential-provider-web-identity': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@smithy/credential-provider-imds': 2.2.6 - '@smithy/property-provider': 2.1.4 - '@smithy/shared-ini-file-loader': 2.3.5 - '@smithy/types': 2.11.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt + '@aws-sdk/credential-provider-http@3.966.0': + dependencies: + '@aws-sdk/core': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/node-http-handler': 4.4.14 + '@smithy/property-provider': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/util-stream': 4.5.17 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.17': + dependencies: + '@aws-sdk/core': 3.973.17 + '@aws-sdk/types': 3.973.4 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/node-http-handler': 4.4.14 + '@smithy/property-provider': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/util-stream': 4.5.17 + tslib: 2.8.1 '@aws-sdk/credential-provider-ini@3.529.1(@aws-sdk/credential-provider-node@3.529.1)': dependencies: @@ -20760,7 +21728,7 @@ snapshots: '@smithy/property-provider': 2.1.4 '@smithy/shared-ini-file-loader': 2.3.5 '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - aws-crt @@ -20779,7 +21747,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt @@ -20798,7 +21766,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20816,7 +21784,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20834,23 +21802,71 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-ini@3.966.0': + dependencies: + '@aws-sdk/core': 3.966.0 + '@aws-sdk/credential-provider-env': 3.966.0 + '@aws-sdk/credential-provider-http': 3.966.0 + '@aws-sdk/credential-provider-login': 3.966.0 + '@aws-sdk/credential-provider-process': 3.966.0 + '@aws-sdk/credential-provider-sso': 3.966.0 + '@aws-sdk/credential-provider-web-identity': 3.966.0 + '@aws-sdk/nested-clients': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-ini@3.972.15': + dependencies: + '@aws-sdk/core': 3.973.17 + '@aws-sdk/credential-provider-env': 3.972.15 + '@aws-sdk/credential-provider-http': 3.972.17 + '@aws-sdk/credential-provider-login': 3.972.15 + '@aws-sdk/credential-provider-process': 3.972.15 + '@aws-sdk/credential-provider-sso': 3.972.15 + '@aws-sdk/credential-provider-web-identity': 3.972.15 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/types': 3.973.4 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.421.0': + '@aws-sdk/credential-provider-login@3.966.0': dependencies: - '@aws-sdk/credential-provider-env': 3.418.0 - '@aws-sdk/credential-provider-ini': 3.421.0 - '@aws-sdk/credential-provider-process': 3.418.0 - '@aws-sdk/credential-provider-sso': 3.421.0 - '@aws-sdk/credential-provider-web-identity': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@smithy/credential-provider-imds': 2.2.6 - '@smithy/property-provider': 2.1.4 - '@smithy/shared-ini-file-loader': 2.3.5 - '@smithy/types': 2.11.0 - tslib: 2.6.2 + '@aws-sdk/core': 3.966.0 + '@aws-sdk/nested-clients': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-login@3.972.15': + dependencies: + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/types': 3.973.4 + '@smithy/property-provider': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -20941,13 +21957,39 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.418.0': - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.1.4 - '@smithy/shared-ini-file-loader': 2.3.5 - '@smithy/types': 2.11.0 - tslib: 2.6.2 + '@aws-sdk/credential-provider-node@3.966.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.966.0 + '@aws-sdk/credential-provider-http': 3.966.0 + '@aws-sdk/credential-provider-ini': 3.966.0 + '@aws-sdk/credential-provider-process': 3.966.0 + '@aws-sdk/credential-provider-sso': 3.966.0 + '@aws-sdk/credential-provider-web-identity': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.972.16': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.15 + '@aws-sdk/credential-provider-http': 3.972.17 + '@aws-sdk/credential-provider-ini': 3.972.15 + '@aws-sdk/credential-provider-process': 3.972.15 + '@aws-sdk/credential-provider-sso': 3.972.15 + '@aws-sdk/credential-provider-web-identity': 3.972.15 + '@aws-sdk/types': 3.973.4 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt '@aws-sdk/credential-provider-process@3.523.0': dependencies: @@ -20955,7 +21997,7 @@ snapshots: '@smithy/property-provider': 2.1.4 '@smithy/shared-ini-file-loader': 2.3.5 '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-process@3.723.0': dependencies: @@ -20964,7 +22006,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-process@3.750.0': dependencies: @@ -20973,7 +22015,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-process@3.844.0': dependencies: @@ -20982,7 +22024,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-process@3.864.0': dependencies: @@ -20991,19 +22033,25 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.421.0': + '@aws-sdk/credential-provider-process@3.966.0': dependencies: - '@aws-sdk/client-sso': 3.421.0 - '@aws-sdk/token-providers': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.1.4 - '@smithy/shared-ini-file-loader': 2.3.5 - '@smithy/types': 2.11.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt + '@aws-sdk/core': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-process@3.972.15': + dependencies: + '@aws-sdk/core': 3.973.17 + '@aws-sdk/types': 3.973.4 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@aws-sdk/credential-provider-sso@3.529.1(@aws-sdk/credential-provider-node@3.529.1)': dependencies: @@ -21013,7 +22061,7 @@ snapshots: '@smithy/property-provider': 2.1.4 '@smithy/shared-ini-file-loader': 2.3.5 '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - aws-crt @@ -21027,7 +22075,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt @@ -21041,7 +22089,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -21054,7 +22102,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -21067,16 +22115,35 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.418.0': + '@aws-sdk/credential-provider-sso@3.966.0': dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.1.4 - '@smithy/types': 2.11.0 - tslib: 2.6.2 + '@aws-sdk/client-sso': 3.966.0 + '@aws-sdk/core': 3.966.0 + '@aws-sdk/token-providers': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-sso@3.972.15': + dependencies: + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/token-providers': 3.1002.0 + '@aws-sdk/types': 3.973.4 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt '@aws-sdk/credential-provider-web-identity@3.529.1(@aws-sdk/credential-provider-node@3.529.1)': dependencies: @@ -21084,7 +22151,7 @@ snapshots: '@aws-sdk/types': 3.523.0 '@smithy/property-provider': 2.1.4 '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - aws-crt @@ -21096,7 +22163,7 @@ snapshots: '@aws-sdk/types': 3.723.0 '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/credential-provider-web-identity@3.750.0': dependencies: @@ -21105,7 +22172,7 @@ snapshots: '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -21116,7 +22183,7 @@ snapshots: '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -21127,14 +22194,70 @@ snapshots: '@aws-sdk/types': 3.862.0 '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.966.0': + dependencies: + '@aws-sdk/core': 3.966.0 + '@aws-sdk/nested-clients': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.972.15': + dependencies: + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/types': 3.973.4 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-providers@3.1002.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.1002.0 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/credential-provider-cognito-identity': 3.972.8 + '@aws-sdk/credential-provider-env': 3.972.15 + '@aws-sdk/credential-provider-http': 3.972.17 + '@aws-sdk/credential-provider-ini': 3.972.15 + '@aws-sdk/credential-provider-login': 3.972.15 + '@aws-sdk/credential-provider-node': 3.972.16 + '@aws-sdk/credential-provider-process': 3.972.15 + '@aws-sdk/credential-provider-sso': 3.972.15 + '@aws-sdk/credential-provider-web-identity': 3.972.15 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/types': 3.973.4 + '@smithy/config-resolver': 4.4.10 + '@smithy/core': 3.23.8 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt '@aws-sdk/endpoint-cache@3.495.0': dependencies: mnemonist: 0.38.3 - tslib: 2.6.2 + tslib: 2.8.1 + + '@aws-sdk/eventstream-handler-node@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/eventstream-codec': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@aws-sdk/lib-storage@3.726.1(@aws-sdk/client-s3@3.844.0)': dependencies: @@ -21145,7 +22268,7 @@ snapshots: buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/middleware-bucket-endpoint@3.840.0': dependencies: @@ -21166,6 +22289,13 @@ snapshots: '@smithy/types': 2.11.0 tslib: 2.6.2 + '@aws-sdk/middleware-eventstream@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@aws-sdk/middleware-expect-continue@3.840.0': dependencies: '@aws-sdk/types': 3.840.0 @@ -21189,13 +22319,6 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-host-header@3.418.0': - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/protocol-http': 3.2.2 - '@smithy/types': 2.11.0 - tslib: 2.6.2 - '@aws-sdk/middleware-host-header@3.523.0': dependencies: '@aws-sdk/types': 3.523.0 @@ -21231,18 +22354,26 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@aws-sdk/middleware-host-header@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.972.6': + dependencies: + '@aws-sdk/types': 3.973.4 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@aws-sdk/middleware-location-constraint@3.840.0': dependencies: '@aws-sdk/types': 3.840.0 '@smithy/types': 4.3.1 tslib: 2.6.2 - '@aws-sdk/middleware-logger@3.418.0': - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/types': 2.11.0 - tslib: 2.6.2 - '@aws-sdk/middleware-logger@3.523.0': dependencies: '@aws-sdk/types': 3.523.0 @@ -21273,12 +22404,17 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 - '@aws-sdk/middleware-recursion-detection@3.418.0': + '@aws-sdk/middleware-logger@3.965.0': dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/protocol-http': 3.2.2 - '@smithy/types': 2.11.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.965.0 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.972.6': + dependencies: + '@aws-sdk/types': 3.973.4 + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@aws-sdk/middleware-recursion-detection@3.523.0': dependencies: @@ -21315,6 +22451,22 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@aws-sdk/middleware-recursion-detection@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.972.6': + dependencies: + '@aws-sdk/types': 3.973.4 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@aws-sdk/middleware-sdk-s3@3.844.0': dependencies: '@aws-sdk/core': 3.844.0 @@ -21332,37 +22484,12 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.6.2 - '@aws-sdk/middleware-sdk-sts@3.418.0': - dependencies: - '@aws-sdk/middleware-signing': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@smithy/types': 2.11.0 - tslib: 2.6.2 - - '@aws-sdk/middleware-signing@3.418.0': - dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/property-provider': 2.1.4 - '@smithy/protocol-http': 3.2.2 - '@smithy/signature-v4': 2.1.4 - '@smithy/types': 2.11.0 - '@smithy/util-middleware': 2.1.4 - tslib: 2.6.2 - '@aws-sdk/middleware-ssec@3.840.0': dependencies: '@aws-sdk/types': 3.840.0 '@smithy/types': 4.3.1 tslib: 2.6.2 - '@aws-sdk/middleware-user-agent@3.418.0': - dependencies: - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@smithy/protocol-http': 3.2.2 - '@smithy/types': 2.11.0 - tslib: 2.6.2 - '@aws-sdk/middleware-user-agent@3.525.0': dependencies: '@aws-sdk/types': 3.523.0 @@ -21411,6 +22538,39 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@aws-sdk/middleware-user-agent@3.966.0': + dependencies: + '@aws-sdk/core': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-endpoints': 3.965.0 + '@smithy/core': 3.23.8 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.972.17': + dependencies: + '@aws-sdk/core': 3.973.17 + '@aws-sdk/types': 3.973.4 + '@aws-sdk/util-endpoints': 3.996.3 + '@smithy/core': 3.23.8 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-websocket@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-format-url': 3.965.0 + '@smithy/eventstream-codec': 4.2.11 + '@smithy/eventstream-serde-browser': 4.2.11 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/protocol-http': 5.3.11 + '@smithy/signature-v4': 5.3.11 + '@smithy/types': 4.13.0 + '@smithy/util-hex-encoding': 4.2.2 + tslib: 2.8.1 + '@aws-sdk/nested-clients@3.750.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -21450,7 +22610,7 @@ snapshots: '@smithy/util-middleware': 4.0.5 '@smithy/util-retry': 4.0.7 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -21493,60 +22653,138 @@ snapshots: '@smithy/util-middleware': 4.0.5 '@smithy/util-retry': 4.0.7 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/nested-clients@3.864.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.864.0 + '@aws-sdk/middleware-host-header': 3.862.0 + '@aws-sdk/middleware-logger': 3.862.0 + '@aws-sdk/middleware-recursion-detection': 3.862.0 + '@aws-sdk/middleware-user-agent': 3.864.0 + '@aws-sdk/region-config-resolver': 3.862.0 + '@aws-sdk/types': 3.862.0 + '@aws-sdk/util-endpoints': 3.862.0 + '@aws-sdk/util-user-agent-browser': 3.862.0 + '@aws-sdk/util-user-agent-node': 3.864.0 + '@smithy/config-resolver': 4.1.5 + '@smithy/core': 3.8.0 + '@smithy/fetch-http-handler': 5.1.1 + '@smithy/hash-node': 4.0.5 + '@smithy/invalid-dependency': 4.0.5 + '@smithy/middleware-content-length': 4.0.5 + '@smithy/middleware-endpoint': 4.1.18 + '@smithy/middleware-retry': 4.1.19 + '@smithy/middleware-serde': 4.0.9 + '@smithy/middleware-stack': 4.0.5 + '@smithy/node-config-provider': 4.1.4 + '@smithy/node-http-handler': 4.1.1 + '@smithy/protocol-http': 5.1.3 + '@smithy/smithy-client': 4.4.10 + '@smithy/types': 4.3.2 + '@smithy/url-parser': 4.0.5 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.26 + '@smithy/util-defaults-mode-node': 4.0.26 + '@smithy/util-endpoints': 3.0.7 + '@smithy/util-middleware': 4.0.5 + '@smithy/util-retry': 4.0.7 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/nested-clients@3.864.0': + '@aws-sdk/nested-clients@3.966.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.864.0 - '@aws-sdk/middleware-host-header': 3.862.0 - '@aws-sdk/middleware-logger': 3.862.0 - '@aws-sdk/middleware-recursion-detection': 3.862.0 - '@aws-sdk/middleware-user-agent': 3.864.0 - '@aws-sdk/region-config-resolver': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.862.0 - '@aws-sdk/util-user-agent-browser': 3.862.0 - '@aws-sdk/util-user-agent-node': 3.864.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + '@aws-sdk/core': 3.966.0 + '@aws-sdk/middleware-host-header': 3.965.0 + '@aws-sdk/middleware-logger': 3.965.0 + '@aws-sdk/middleware-recursion-detection': 3.965.0 + '@aws-sdk/middleware-user-agent': 3.966.0 + '@aws-sdk/region-config-resolver': 3.965.0 + '@aws-sdk/types': 3.965.0 + '@aws-sdk/util-endpoints': 3.965.0 + '@aws-sdk/util-user-agent-browser': 3.965.0 + '@aws-sdk/util-user-agent-node': 3.966.0 + '@smithy/config-resolver': 4.4.10 + '@smithy/core': 3.23.8 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/hash-node': 4.2.11 + '@smithy/invalid-dependency': 4.2.11 + '@smithy/middleware-content-length': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 + '@smithy/middleware-serde': 4.2.12 + '@smithy/middleware-stack': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/node-http-handler': 4.4.14 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.418.0': + '@aws-sdk/nested-clients@3.996.5': dependencies: - '@smithy/node-config-provider': 2.2.5 - '@smithy/types': 2.11.0 - '@smithy/util-config-provider': 2.2.1 - '@smithy/util-middleware': 2.1.4 - tslib: 2.6.2 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/middleware-host-header': 3.972.6 + '@aws-sdk/middleware-logger': 3.972.6 + '@aws-sdk/middleware-recursion-detection': 3.972.6 + '@aws-sdk/middleware-user-agent': 3.972.17 + '@aws-sdk/region-config-resolver': 3.972.6 + '@aws-sdk/types': 3.973.4 + '@aws-sdk/util-endpoints': 3.996.3 + '@aws-sdk/util-user-agent-browser': 3.972.6 + '@aws-sdk/util-user-agent-node': 3.973.2 + '@smithy/config-resolver': 4.4.10 + '@smithy/core': 3.23.8 + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/hash-node': 4.2.11 + '@smithy/invalid-dependency': 4.2.11 + '@smithy/middleware-content-length': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-retry': 4.4.39 + '@smithy/middleware-serde': 4.2.12 + '@smithy/middleware-stack': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/node-http-handler': 4.4.14 + '@smithy/protocol-http': 5.3.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.38 + '@smithy/util-defaults-mode-node': 4.2.41 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt '@aws-sdk/region-config-resolver@3.525.0': dependencies: @@ -21593,6 +22831,22 @@ snapshots: '@smithy/util-middleware': 4.0.5 tslib: 2.6.2 + '@aws-sdk/region-config-resolver@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/config-resolver': 4.4.10 + '@smithy/node-config-provider': 4.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/region-config-resolver@3.972.6': + dependencies: + '@aws-sdk/types': 3.973.4 + '@smithy/config-resolver': 4.4.10 + '@smithy/node-config-provider': 4.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@aws-sdk/signature-v4-multi-region@3.844.0': dependencies: '@aws-sdk/middleware-sdk-s3': 3.844.0 @@ -21602,43 +22856,15 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.6.2 - '@aws-sdk/token-providers@3.418.0': + '@aws-sdk/token-providers@3.1002.0': dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.418.0 - '@aws-sdk/middleware-logger': 3.418.0 - '@aws-sdk/middleware-recursion-detection': 3.418.0 - '@aws-sdk/middleware-user-agent': 3.418.0 - '@aws-sdk/types': 3.418.0 - '@aws-sdk/util-endpoints': 3.418.0 - '@aws-sdk/util-user-agent-browser': 3.418.0 - '@aws-sdk/util-user-agent-node': 3.418.0 - '@smithy/config-resolver': 2.1.5 - '@smithy/fetch-http-handler': 2.4.4 - '@smithy/hash-node': 2.1.4 - '@smithy/invalid-dependency': 2.1.4 - '@smithy/middleware-content-length': 2.1.4 - '@smithy/middleware-endpoint': 2.4.6 - '@smithy/middleware-retry': 2.1.6 - '@smithy/middleware-serde': 2.2.1 - '@smithy/middleware-stack': 2.1.4 - '@smithy/node-config-provider': 2.2.5 - '@smithy/node-http-handler': 2.4.2 - '@smithy/property-provider': 2.1.4 - '@smithy/protocol-http': 3.2.2 - '@smithy/shared-ini-file-loader': 2.3.5 - '@smithy/smithy-client': 2.4.4 - '@smithy/types': 2.11.0 - '@smithy/url-parser': 2.1.4 - '@smithy/util-base64': 2.2.0 - '@smithy/util-body-length-browser': 2.1.1 - '@smithy/util-body-length-node': 2.2.1 - '@smithy/util-defaults-mode-browser': 2.1.6 - '@smithy/util-defaults-mode-node': 2.2.6 - '@smithy/util-retry': 2.1.4 - '@smithy/util-utf8': 2.2.0 - tslib: 2.6.2 + '@aws-sdk/core': 3.973.17 + '@aws-sdk/nested-clients': 3.996.5 + '@aws-sdk/types': 3.973.4 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -21649,7 +22875,7 @@ snapshots: '@smithy/property-provider': 2.1.4 '@smithy/shared-ini-file-loader': 2.3.5 '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/credential-provider-node' - aws-crt @@ -21661,7 +22887,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/token-providers@3.750.0': dependencies: @@ -21670,7 +22896,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -21682,7 +22908,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -21694,14 +22920,21 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.418.0': + '@aws-sdk/token-providers@3.966.0': dependencies: - '@smithy/types': 2.11.0 - tslib: 2.6.2 + '@aws-sdk/core': 3.966.0 + '@aws-sdk/nested-clients': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt '@aws-sdk/types@3.523.0': dependencies: @@ -21728,14 +22961,19 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 - '@aws-sdk/util-arn-parser@3.804.0': + '@aws-sdk/types@3.965.0': dependencies: - tslib: 2.6.2 + '@smithy/types': 4.13.0 + tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.418.0': + '@aws-sdk/types@3.973.4': dependencies: - '@aws-sdk/types': 3.418.0 - tslib: 2.6.2 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.804.0': + dependencies: + tslib: 2.8.1 '@aws-sdk/util-endpoints@3.525.0': dependencies: @@ -21774,16 +23012,32 @@ snapshots: '@smithy/util-endpoints': 3.0.7 tslib: 2.6.2 - '@aws-sdk/util-locate-window@3.495.0': + '@aws-sdk/util-endpoints@3.965.0': dependencies: - tslib: 2.6.2 + '@aws-sdk/types': 3.965.0 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + '@smithy/util-endpoints': 3.3.2 + tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.418.0': + '@aws-sdk/util-endpoints@3.996.3': dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/types': 2.11.0 - bowser: 2.11.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.973.4 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + '@smithy/util-endpoints': 3.3.2 + tslib: 2.8.1 + + '@aws-sdk/util-format-url@3.965.0': + dependencies: + '@aws-sdk/types': 3.965.0 + '@smithy/querystring-builder': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.495.0': + dependencies: + tslib: 2.8.1 '@aws-sdk/util-user-agent-browser@3.523.0': dependencies: @@ -21820,12 +23074,19 @@ snapshots: bowser: 2.11.0 tslib: 2.6.2 - '@aws-sdk/util-user-agent-node@3.418.0': + '@aws-sdk/util-user-agent-browser@3.965.0': dependencies: - '@aws-sdk/types': 3.418.0 - '@smithy/node-config-provider': 2.2.5 - '@smithy/types': 2.11.0 - tslib: 2.6.2 + '@aws-sdk/types': 3.965.0 + '@smithy/types': 4.13.0 + bowser: 2.11.0 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.972.6': + dependencies: + '@aws-sdk/types': 3.973.4 + '@smithy/types': 4.13.0 + bowser: 2.11.0 + tslib: 2.8.1 '@aws-sdk/util-user-agent-node@3.525.0': dependencies: @@ -21866,9 +23127,25 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@aws-sdk/util-user-agent-node@3.966.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.966.0 + '@aws-sdk/types': 3.965.0 + '@smithy/node-config-provider': 4.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.973.2': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.17 + '@aws-sdk/types': 3.973.4 + '@smithy/node-config-provider': 4.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@aws-sdk/util-utf8-browser@3.259.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@aws-sdk/xml-builder@3.821.0': dependencies: @@ -21878,7 +23155,21 @@ snapshots: '@aws-sdk/xml-builder@3.862.0': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.965.0': + dependencies: + '@smithy/types': 4.13.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.9': + dependencies: + '@smithy/types': 4.13.0 + fast-xml-parser: 5.4.1 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.3': {} '@azure/abort-controller@2.1.2': dependencies: @@ -23379,7 +24670,7 @@ snapshots: bottleneck: 2.19.5 crypto-js: 4.2.0 dotenv: 16.4.5 - express: 4.21.1 + express: 4.21.2 node-fetch: 2.7.0(encoding@0.1.13) rollup: 4.45.0 typescript: 5.5.2 @@ -23395,7 +24686,7 @@ snapshots: '@browserbasehq/sdk@2.0.0(encoding@0.1.13)': dependencies: - '@types/node': 18.19.23 + '@types/node': 18.19.130 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -23405,18 +24696,18 @@ snapshots: transitivePeerDependencies: - encoding - '@browserbasehq/stagehand@1.9.0(@playwright/test@1.49.1)(bufferutil@4.0.8)(deepmerge@4.3.1)(dotenv@16.4.5)(encoding@0.1.13)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(utf-8-validate@6.0.4)(zod@3.22.4)': + '@browserbasehq/stagehand@1.9.0(@playwright/test@1.49.1)(bufferutil@4.0.8)(deepmerge@4.3.1)(dotenv@16.4.5)(encoding@0.1.13)(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(utf-8-validate@6.0.4)(zod@4.3.6)': dependencies: - '@anthropic-ai/sdk': 0.27.3(encoding@0.1.13) + '@anthropic-ai/sdk': 0.73.0(zod@4.3.6) '@browserbasehq/sdk': 2.0.0(encoding@0.1.13) '@playwright/test': 1.49.1 deepmerge: 4.3.1 dotenv: 16.4.5 - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) sharp: 0.33.5 ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) - zod: 3.22.4 - zod-to-json-schema: 3.24.1(zod@3.22.4) + zod: 4.3.6 + zod-to-json-schema: 3.25.1(zod@4.3.6) transitivePeerDependencies: - bufferutil - encoding @@ -23589,7 +24880,7 @@ snapshots: '@crawlee/types@3.8.1': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@cspotcode/source-map-support@0.8.1': dependencies: @@ -23694,7 +24985,7 @@ snapshots: safe-buffer: 5.2.1 tough-cookie: 4.1.3 tunnel-agent: 0.6.0 - uuid: 8.3.2 + uuid: 10.0.0 '@cypress/xvfb@1.2.4(supports-color@8.1.1)': dependencies: @@ -23750,17 +25041,17 @@ snapshots: '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 - tslib: 2.6.2 + tslib: 2.8.1 optional: true '@emnapi/runtime@1.8.1': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 optional: true '@emnapi/wasi-threads@1.1.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 optional: true '@emotion/babel-plugin@11.11.0': @@ -24064,16 +25355,16 @@ snapshots: '@gar/promisify@1.1.3': optional: true - '@getzep/zep-cloud@1.0.7(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(langchain@0.3.6(08bef5ed58eb471b0c368ae979090c97))': + '@getzep/zep-cloud@1.0.7(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13)(langchain@1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6)))': dependencies: form-data: 4.0.4 node-fetch: 2.7.0(encoding@0.1.13) qs: 6.11.2 url-join: 4.0.1 - zod: 3.23.8 + zod: 3.25.76 optionalDependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - langchain: 0.3.6(08bef5ed58eb471b0c368ae979090c97) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + langchain: 1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6)) transitivePeerDependencies: - encoding @@ -24117,7 +25408,7 @@ snapshots: - encoding - supports-color - '@google-cloud/common@5.0.2(encoding@0.1.13)': + '@google-cloud/common@5.0.2': dependencies: '@google-cloud/projectify': 4.0.0 '@google-cloud/promisify': 4.1.0 @@ -24132,9 +25423,9 @@ snapshots: - encoding - supports-color - '@google-cloud/logging-winston@6.0.0(encoding@0.1.13)(winston@3.12.0)': + '@google-cloud/logging-winston@6.0.0(winston@3.12.0)': dependencies: - '@google-cloud/logging': 11.2.0(encoding@0.1.13) + '@google-cloud/logging': 11.2.0 google-auth-library: 9.15.1(encoding@0.1.13) lodash.mapvalues: 4.6.0 winston: 3.12.0 @@ -24143,9 +25434,9 @@ snapshots: - encoding - supports-color - '@google-cloud/logging@11.2.0(encoding@0.1.13)': + '@google-cloud/logging@11.2.0': dependencies: - '@google-cloud/common': 5.0.2(encoding@0.1.13) + '@google-cloud/common': 5.0.2 '@google-cloud/paginator': 5.0.2 '@google-cloud/projectify': 4.0.0 '@google-cloud/promisify': 4.1.0 @@ -24160,7 +25451,7 @@ snapshots: on-finished: 2.4.1 pumpify: 2.0.1 stream-events: 1.0.5 - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - encoding - supports-color @@ -24192,7 +25483,7 @@ snapshots: p-limit: 3.1.0 retry-request: 7.0.2(encoding@0.1.13) teeny-request: 9.0.0(encoding@0.1.13) - uuid: 8.3.2 + uuid: 10.0.0 transitivePeerDependencies: - encoding - supports-color @@ -24283,11 +25574,12 @@ snapshots: '@humanwhocodes/object-schema@2.0.2': {} - '@ibm-cloud/watsonx-ai@1.2.0': + '@ibm-cloud/watsonx-ai@1.7.7': dependencies: '@types/node': 18.19.23 extend: 3.0.2 - ibm-cloud-sdk-core: 5.1.0 + form-data: 4.0.4 + ibm-cloud-sdk-core: 5.4.8 transitivePeerDependencies: - supports-color @@ -24975,21 +26267,21 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@jsonjoy.com/base64@1.1.2(tslib@2.6.2)': + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.1.1(tslib@2.6.2)': + '@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1)': dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.6.2) - '@jsonjoy.com/util': 1.5.0(tslib@2.6.2) + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.6.2) - tslib: 2.6.2 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 - '@jsonjoy.com/util@1.5.0(tslib@2.6.2)': + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@keyv/redis@4.3.3': dependencies: @@ -25056,71 +26348,88 @@ snapshots: - terser - typescript - '@langchain/anthropic@0.3.33(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(zod@3.22.4)': + '@langchain/anthropic@1.3.20(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: - '@anthropic-ai/sdk': 0.65.0(zod@3.22.4) - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - fast-xml-parser: 4.4.1 - transitivePeerDependencies: - - zod + '@anthropic-ai/sdk': 0.73.0(zod@4.3.6) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + zod: 4.3.6 - '@langchain/aws@0.1.11(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))': + '@langchain/aws@1.2.2(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: '@aws-sdk/client-bedrock-agent-runtime': 3.755.0 - '@aws-sdk/client-bedrock-runtime': 3.755.0 + '@aws-sdk/client-bedrock-runtime': 3.966.0 '@aws-sdk/client-kendra': 3.750.0 - '@aws-sdk/credential-provider-node': 3.750.0 - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@aws-sdk/credential-provider-node': 3.864.0 + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) transitivePeerDependencies: - aws-crt - '@langchain/baidu-qianfan@0.1.0(@babel/core@7.24.0)(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + '@langchain/baidu-qianfan@1.0.1(@babel/core@7.24.0)(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13)': dependencies: '@baiducloud/qianfan': 0.1.9(@babel/core@7.24.0)(encoding@0.1.13) - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@langchain/openai': 0.3.13(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - zod: 3.22.4 - zod-to-json-schema: 3.23.1(zod@3.22.4) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) transitivePeerDependencies: - '@babel/core' - encoding - supports-color + + '@langchain/classic@1.0.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(cheerio@1.0.0-rc.12)(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/openai': 1.2.5(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@langchain/textsplitters': 1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + handlebars: 4.7.8 + js-yaml: 4.1.1 + jsonpointer: 5.0.1 + openapi-types: 12.1.3 + uuid: 10.0.0 + yaml: 2.4.1 + zod: 4.3.6 + optionalDependencies: + cheerio: 1.0.0-rc.12 + langsmith: 0.4.12(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + typeorm: 0.3.20(ioredis@5.3.2)(mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai - ws - '@langchain/cloudflare@1.0.1(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))': + '@langchain/cloudflare@1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) uuid: 10.0.0 - '@langchain/cohere@0.0.7(encoding@0.1.13)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))': + '@langchain/cohere@1.0.2(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - cohere-ai: 7.10.0(encoding@0.1.13) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + cohere-ai: 7.20.0 + uuid: 10.0.0 transitivePeerDependencies: - - encoding - - openai + - aws-crt - '@langchain/community@0.3.49(96a2dea491375c22412401f1555fc2c2)': + '@langchain/community@0.3.49(4a03f9a73642b58970271108ecf076d6)': dependencies: - '@browserbasehq/stagehand': 1.9.0(@playwright/test@1.49.1)(bufferutil@4.0.8)(deepmerge@4.3.1)(dotenv@16.4.5)(encoding@0.1.13)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(utf-8-validate@6.0.4)(zod@3.22.4) - '@ibm-cloud/watsonx-ai': 1.2.0 - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@langchain/openai': 0.6.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - '@langchain/weaviate': 0.2.1(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13) + '@browserbasehq/stagehand': 1.9.0(@playwright/test@1.49.1)(bufferutil@4.0.8)(deepmerge@4.3.1)(dotenv@16.4.5)(encoding@0.1.13)(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(utf-8-validate@6.0.4)(zod@4.3.6) + '@ibm-cloud/watsonx-ai': 1.7.7 + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/openai': 0.6.3(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@langchain/weaviate': 0.2.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13) binary-extensions: 2.2.0 expr-eval: 2.0.2 flat: 5.0.2 - ibm-cloud-sdk-core: 5.1.0 + ibm-cloud-sdk-core: 5.4.8 js-yaml: 4.1.0 - langchain: 0.3.6(08bef5ed58eb471b0c368ae979090c97) - langsmith: 0.3.34(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + langchain: 0.3.6(ae6cc523d80405ef1a537f4975d7f084) + langsmith: 0.3.34(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) uuid: 10.0.0 - zod: 3.25.32 + zod: 3.25.76 optionalDependencies: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-bedrock-agent-runtime': 3.755.0 - '@aws-sdk/client-bedrock-runtime': 3.422.0 + '@aws-sdk/client-bedrock-runtime': 3.966.0 '@aws-sdk/client-dynamodb': 3.529.1 '@aws-sdk/client-kendra': 3.750.0 '@aws-sdk/client-s3': 3.844.0 @@ -25129,7 +26438,7 @@ snapshots: '@browserbasehq/sdk': 2.0.0(encoding@0.1.13) '@datastax/astra-db-ts': 1.5.0 '@elastic/elasticsearch': 8.12.2 - '@getzep/zep-cloud': 1.0.7(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(langchain@0.3.6(08bef5ed58eb471b0c368ae979090c97)) + '@getzep/zep-cloud': 1.0.7(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13)(langchain@1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6))) '@getzep/zep-js': 0.9.0 '@gomomento/sdk': 1.68.1(encoding@0.1.13) '@gomomento/sdk-core': 1.68.1 @@ -25157,18 +26466,115 @@ snapshots: crypto-js: 4.2.0 d3-dsv: 2.0.0 epub2: 3.0.2(ts-toolbelt@9.6.0) - fast-xml-parser: 5.2.5 + fast-xml-parser: 5.4.1 + google-auth-library: 9.6.3(encoding@0.1.13) + html-to-text: 9.0.5 + ignore: 5.3.1 + ioredis: 5.3.2 + jsdom: 22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4) + jsonwebtoken: 9.0.3 + lodash: 4.17.21 + lunary: 0.7.12(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0) + mammoth: 1.7.0 + mem0ai: 2.1.16(@anthropic-ai/sdk@0.73.0(zod@4.3.6))(@google/genai@0.7.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))(@mistralai/mistralai@1.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/jest@29.5.14)(@types/pg@8.11.2)(@types/sqlite3@3.1.11)(groq-sdk@0.19.0(encoding@0.1.13))(neo4j-driver@5.27.0)(ollama@0.5.11)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + mongodb: 6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1) + mysql2: 3.11.4 + neo4j-driver: 5.27.0 + notion-to-md: 3.1.1(encoding@0.1.13) + officeparser: 5.1.1 + pdf-parse: 1.1.1 + pg: 8.11.3 + playwright: 1.42.1 + portkey-ai: 0.1.16 + puppeteer: 20.9.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@6.0.4) + pyodide: 0.25.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + redis: 4.6.13 + replicate: 0.31.1 + srt-parser-2: 1.2.3 + typeorm: 0.3.20(ioredis@5.3.2)(mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)) + weaviate-client: 3.8.0(encoding@0.1.13) + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) + transitivePeerDependencies: + - '@langchain/anthropic' + - '@langchain/aws' + - '@langchain/cohere' + - '@langchain/google-genai' + - '@langchain/google-vertexai' + - '@langchain/groq' + - '@langchain/mistralai' + - '@langchain/ollama' + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - axios + - encoding + - handlebars + - peggy + + '@langchain/community@1.1.12(e577dfcf74b50aa1c4311c22b814981a)': + dependencies: + '@browserbasehq/stagehand': 1.9.0(@playwright/test@1.49.1)(bufferutil@4.0.8)(deepmerge@4.3.1)(dotenv@16.4.5)(encoding@0.1.13)(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(utf-8-validate@6.0.4)(zod@4.3.6) + '@ibm-cloud/watsonx-ai': 1.7.7 + '@langchain/classic': 1.0.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(cheerio@1.0.0-rc.12)(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/openai': 1.2.5(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + binary-extensions: 2.2.0 + flat: 5.0.2 + ibm-cloud-sdk-core: 5.4.8 + js-yaml: 4.1.1 + math-expression-evaluator: 2.0.7 + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) + uuid: 10.0.0 + zod: 4.3.6 + optionalDependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-dynamodb': 3.529.1 + '@aws-sdk/client-s3': 3.844.0 + '@aws-sdk/credential-provider-node': 3.529.1 + '@azure/storage-blob': 12.31.0 + '@browserbasehq/sdk': 2.0.0(encoding@0.1.13) + '@datastax/astra-db-ts': 1.5.0 + '@elastic/elasticsearch': 8.12.2 + '@getzep/zep-cloud': 1.0.7(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13)(langchain@1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6))) + '@getzep/zep-js': 0.9.0 + '@gomomento/sdk-core': 1.68.1 + '@google-cloud/storage': 7.16.0(encoding@0.1.13) + '@huggingface/inference': 4.13.2 + '@mendable/firecrawl-js': 1.25.1 + '@notionhq/client': 2.2.14(encoding@0.1.13) + '@opensearch-project/opensearch': 1.2.0 + '@pinecone-database/pinecone': 4.0.0 + '@qdrant/js-client-rest': 1.9.0(typescript@5.5.2) + '@smithy/eventstream-codec': 2.1.4 + '@smithy/protocol-http': 3.2.2 + '@smithy/signature-v4': 2.1.4 + '@smithy/util-utf8': 2.2.0 + '@supabase/supabase-js': 2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@upstash/redis': 1.22.1(encoding@0.1.13) + '@upstash/vector': 1.1.5 + '@zilliz/milvus2-sdk-node': 2.3.5 + apify-client: 2.9.3 + assemblyai: 4.3.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) + cheerio: 1.0.0-rc.12 + chromadb: 3.1.6 + cohere-ai: 7.10.0(encoding@0.1.13) + couchbase: 4.4.1 + crypto-js: 4.2.0 + d3-dsv: 2.0.0 + epub2: 3.0.2(ts-toolbelt@9.6.0) + faiss-node: 0.5.1 + fast-xml-parser: 5.4.1 google-auth-library: 9.6.3(encoding@0.1.13) html-to-text: 9.0.5 ignore: 5.3.1 ioredis: 5.3.2 jsdom: 22.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.4) - jsonwebtoken: 9.0.2 + jsonwebtoken: 9.0.3 lodash: 4.17.21 - lunary: 0.7.12(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0) + lunary: 0.7.12(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0) mammoth: 1.7.0 - mem0ai: 2.1.16(@anthropic-ai/sdk@0.65.0(zod@3.22.4))(@google/genai@0.7.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))(@mistralai/mistralai@0.1.3(encoding@0.1.13))(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/jest@29.5.14)(@types/pg@8.11.2)(@types/sqlite3@3.1.11)(encoding@0.1.13)(groq-sdk@0.5.0(encoding@0.1.13))(neo4j-driver@5.27.0)(ollama@0.5.11)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - mongodb: 6.3.0(socks@2.8.1) + mem0ai: 2.1.16(@anthropic-ai/sdk@0.73.0(zod@4.3.6))(@google/genai@0.7.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))(@mistralai/mistralai@1.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/jest@29.5.14)(@types/pg@8.11.2)(@types/sqlite3@3.1.11)(groq-sdk@0.19.0(encoding@0.1.13))(neo4j-driver@5.27.0)(ollama@0.5.11)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + mongodb: 6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1) mysql2: 3.11.4 neo4j-driver: 5.27.0 notion-to-md: 3.1.1(encoding@0.1.13) @@ -25182,193 +26588,238 @@ snapshots: redis: 4.6.13 replicate: 0.31.1 srt-parser-2: 1.2.3 - typeorm: 0.3.20(ioredis@5.3.2)(mongodb@6.3.0(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)) + typeorm: 0.3.20(ioredis@5.3.2)(mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)) weaviate-client: 3.8.0(encoding@0.1.13) ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - - '@langchain/anthropic' - - '@langchain/aws' - - '@langchain/cohere' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - axios - - encoding - - handlebars + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - peggy - '@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))': + '@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))': dependencies: '@cfworker/json-schema': 4.1.0 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.3.34(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + langsmith: 0.5.7(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) mustache: 4.2.0 p-queue: 6.6.2 - p-retry: 4.6.2 uuid: 10.0.0 - zod: 3.25.32 - zod-to-json-schema: 3.24.1(zod@3.25.32) + zod: 4.3.6 transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - openai - '@langchain/exa@0.0.5(encoding@0.1.13)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))': + '@langchain/deepseek@1.0.9(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/openai': 1.2.5(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + transitivePeerDependencies: + - ws + + '@langchain/exa@1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13)': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) exa-js: 1.0.12(encoding@0.1.13) transitivePeerDependencies: - encoding - - openai - '@langchain/google-common@0.2.14(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))': + '@langchain/google-common@2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) uuid: 10.0.0 - '@langchain/google-gauth@0.2.14(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))': + '@langchain/google-gauth@2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@langchain/google-common': 0.2.14(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + '@langchain/google-common': 2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) google-auth-library: 10.1.0 transitivePeerDependencies: + - '@langchain/core' - supports-color - '@langchain/google-genai@0.2.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(zod@3.22.4)': + '@langchain/google-genai@2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: '@google/generative-ai': 0.24.0 - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - uuid: 11.1.0 - zod-to-json-schema: 3.24.1(zod@3.22.4) - transitivePeerDependencies: - - zod + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + uuid: 10.0.0 - '@langchain/google-vertexai@0.2.14(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))': + '@langchain/google-vertexai@2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@langchain/google-gauth': 0.2.14(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + '@langchain/google-gauth': 2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) transitivePeerDependencies: + - '@langchain/core' - supports-color - '@langchain/groq@0.1.2(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + '@langchain/groq@1.0.4(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13)': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@langchain/openai': 0.3.13(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - groq-sdk: 0.5.0(encoding@0.1.13) - zod: 3.22.4 - zod-to-json-schema: 3.23.1(zod@3.22.4) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + groq-sdk: 0.19.0(encoding@0.1.13) transitivePeerDependencies: - encoding - - ws - '@langchain/langgraph@0.0.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))': + '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + uuid: 10.0.0 + + '@langchain/langgraph-sdk@1.6.5(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - uuid: 9.0.1 + '@types/json-schema': 7.0.15 + p-queue: 9.1.0 + p-retry: 7.1.1 + uuid: 10.0.0 + optionalDependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@langchain/langgraph@0.0.22(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))': + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + uuid: 10.0.0 transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - openai - '@langchain/mistralai@0.2.0(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))': + '@langchain/langgraph@1.2.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6)': + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + '@langchain/langgraph-sdk': 1.6.5(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@standard-schema/spec': 1.1.0 + uuid: 10.0.0 + zod: 4.3.6 + optionalDependencies: + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - react + - react-dom + + '@langchain/mistralai@1.0.4(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(bufferutil@4.0.8)(utf-8-validate@6.0.4)': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@mistralai/mistralai': 1.3.6(zod@3.23.8) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@mistralai/mistralai': 1.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) uuid: 10.0.0 - zod: 3.23.8 - zod-to-json-schema: 3.23.1(zod@3.23.8) + transitivePeerDependencies: + - bufferutil + - utf-8-validate - '@langchain/mongodb@0.0.1(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(socks@2.8.1)': + '@langchain/mongodb@1.1.0(@aws-sdk/credential-providers@3.1002.0)(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(socks@2.8.1)': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - mongodb: 6.3.0(socks@2.8.1) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + mongodb: 6.21.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1) transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@mongodb-js/zstd' - gcp-metadata - kerberos - mongodb-client-encryption - - openai - snappy - socks - '@langchain/ollama@0.2.0(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))': + '@langchain/ollama@1.2.2(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - ollama: 0.5.14 + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + ollama: 0.6.3 uuid: 10.0.0 - zod: 3.24.2 - zod-to-json-schema: 3.24.1(zod@3.24.2) - '@langchain/openai@0.3.13(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + '@langchain/openai@0.3.13(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) js-tiktoken: 1.0.12 - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) - zod: 3.22.4 - zod-to-json-schema: 3.24.1(zod@3.22.4) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - - encoding - ws - '@langchain/openai@0.6.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + '@langchain/openai@0.6.3(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) js-tiktoken: 1.0.12 - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.25.32) - zod: 3.25.32 + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - ws + + '@langchain/openai@1.2.5(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + js-tiktoken: 1.0.12 + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) + zod: 4.3.6 transitivePeerDependencies: - - encoding - ws - '@langchain/pinecone@0.1.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))': + '@langchain/pinecone@1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@pinecone-database/pinecone@4.0.0)': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) '@pinecone-database/pinecone': 4.0.0 flat: 5.0.2 uuid: 10.0.0 - '@langchain/qdrant@0.0.5(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(typescript@5.5.2)': + '@langchain/qdrant@1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(typescript@5.5.2)': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@qdrant/js-client-rest': 1.9.0(typescript@5.5.2) - uuid: 9.0.1 + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@qdrant/js-client-rest': 1.17.0(typescript@5.5.2) + uuid: 10.0.0 transitivePeerDependencies: - - openai - typescript - '@langchain/textsplitters@0.0.1(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))': + '@langchain/redis@1.1.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + redis: 4.7.0 + uuid: 10.0.0 + + '@langchain/tavily@1.2.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + zod: 4.3.6 + + '@langchain/textsplitters@0.0.1(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))': + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) js-tiktoken: 1.0.12 transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - openai - '@langchain/weaviate@0.0.1(encoding@0.1.13)(graphql@16.8.1)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))': + '@langchain/textsplitters@1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - uuid: 9.0.1 - weaviate-ts-client: 2.1.1(encoding@0.1.13)(graphql@16.8.1) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + js-tiktoken: 1.0.12 + + '@langchain/weaviate@0.2.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13)': + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + uuid: 10.0.0 + weaviate-client: 3.8.0(encoding@0.1.13) transitivePeerDependencies: - encoding - - graphql - - openai - '@langchain/weaviate@0.2.1(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)': + '@langchain/weaviate@1.0.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13)': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) uuid: 10.0.0 weaviate-client: 3.8.0(encoding@0.1.13) transitivePeerDependencies: - encoding - '@langchain/xai@0.0.1(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + '@langchain/xai@1.3.1(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@langchain/openai': 0.3.13(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/openai': 1.2.5(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) transitivePeerDependencies: - - encoding - ws '@leichtgewicht/ip-codec@2.0.4': {} @@ -25444,13 +26895,13 @@ snapshots: - encoding - supports-color - '@mem0/community@0.0.1(5a79e038a0f9851c2336c9f7472dc8f5)': + '@mem0/community@0.0.1(3e4894d986beae381e4fca68387f0d30)': dependencies: - '@langchain/community': 0.3.49(96a2dea491375c22412401f1555fc2c2) - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/community': 0.3.49(4a03f9a73642b58970271108ecf076d6) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) axios: 1.12.0(debug@4.3.4) - mem0ai: 2.1.16(@anthropic-ai/sdk@0.65.0(zod@3.22.4))(@google/genai@0.7.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))(@mistralai/mistralai@0.1.3(encoding@0.1.13))(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/jest@29.5.14)(@types/pg@8.11.2)(@types/sqlite3@3.1.11)(encoding@0.1.13)(groq-sdk@0.5.0(encoding@0.1.13))(neo4j-driver@5.27.0)(ollama@0.5.11)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - uuid: 9.0.1 + mem0ai: 2.1.16(@anthropic-ai/sdk@0.73.0(zod@4.3.6))(@google/genai@0.7.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))(@mistralai/mistralai@1.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/jest@29.5.14)(@types/pg@8.11.2)(@types/sqlite3@3.1.11)(groq-sdk@0.19.0(encoding@0.1.13))(neo4j-driver@5.27.0)(ollama@0.5.11)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + uuid: 10.0.0 zod: 3.22.4 transitivePeerDependencies: - '@anthropic-ai/sdk' @@ -25504,6 +26955,9 @@ snapshots: - '@neondatabase/serverless' - '@notionhq/client' - '@opensearch-project/opensearch' + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - '@pinecone-database/pinecone' - '@planetscale/database' - '@premai/prem-sdk' @@ -25606,8 +27060,8 @@ snapshots: dependencies: axios: 1.12.0(debug@4.3.4) typescript-event-target: 1.1.1 - zod: 3.24.2 - zod-to-json-schema: 3.24.1(zod@3.24.2) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - debug @@ -25648,21 +27102,20 @@ snapshots: '@microsoft/tsdoc@0.14.2': {} - '@mistralai/mistralai@0.1.3(encoding@0.1.13)': - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - '@mistralai/mistralai@0.2.0(encoding@0.1.13)': dependencies: node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - '@mistralai/mistralai@1.3.6(zod@3.23.8)': + '@mistralai/mistralai@1.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)': dependencies: - zod: 3.23.8 + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) + zod: 4.3.6 + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - bufferutil + - utf-8-validate '@mixmark-io/domino@2.2.0': {} @@ -25670,13 +27123,13 @@ snapshots: dependencies: content-type: 1.0.5 raw-body: 3.0.0 - zod: 3.25.32 + zod: 3.25.76 '@modelcontextprotocol/sdk@1.0.1': dependencies: content-type: 1.0.5 raw-body: 3.0.0 - zod: 3.25.32 + zod: 3.25.76 '@modelcontextprotocol/sdk@1.10.2': dependencies: @@ -25688,8 +27141,8 @@ snapshots: express-rate-limit: 7.5.0(express@5.0.1) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.24.2 - zod-to-json-schema: 3.24.1(zod@3.24.2) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -25704,8 +27157,8 @@ snapshots: express-rate-limit: 7.5.0(express@5.0.1) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.25.32 - zod-to-json-schema: 3.24.1(zod@3.25.32) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -25719,8 +27172,8 @@ snapshots: '@types/node': 22.5.4 '@types/node-fetch': 2.6.12 node-fetch: 3.3.2 - zod: 3.22.4 - zod-to-json-schema: 3.24.1(zod@3.22.4) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) '@modelcontextprotocol/server-postgres@0.6.2': dependencies: @@ -25743,6 +27196,10 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 + '@mongodb-js/saslprep@1.4.6': + dependencies: + sparse-bitfield: 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': optional: true @@ -26984,6 +28441,12 @@ snapshots: - bare-buffer - supports-color + '@qdrant/js-client-rest@1.17.0(typescript@5.5.2)': + dependencies: + '@qdrant/openapi-typescript-fetch': 1.2.6 + typescript: 5.5.2 + undici: 6.23.0 + '@qdrant/js-client-rest@1.9.0(typescript@5.5.2)': dependencies: '@qdrant/openapi-typescript-fetch': 1.2.6 @@ -27329,31 +28792,36 @@ snapshots: '@smithy/abort-controller@2.1.4': dependencies: '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/abort-controller@4.0.1': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/abort-controller@4.0.4': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/abort-controller@4.0.5': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/abort-controller@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@smithy/chunked-blob-reader-native@4.0.0': dependencies: '@smithy/util-base64': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/chunked-blob-reader@5.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/config-resolver@2.1.5': dependencies: @@ -27387,6 +28855,15 @@ snapshots: '@smithy/util-middleware': 4.0.5 tslib: 2.6.2 + '@smithy/config-resolver@4.4.10': + dependencies: + '@smithy/node-config-provider': 4.3.11 + '@smithy/types': 4.13.0 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-endpoints': 3.3.2 + '@smithy/util-middleware': 4.2.11 + tslib: 2.8.1 + '@smithy/core@1.3.7': dependencies: '@smithy/middleware-endpoint': 2.4.6 @@ -27409,6 +28886,19 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.6.2 + '@smithy/core@3.23.8': + dependencies: + '@smithy/middleware-serde': 4.2.12 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-stream': 4.5.17 + '@smithy/util-utf8': 4.2.2 + '@smithy/uuid': 1.1.2 + tslib: 2.8.1 + '@smithy/core@3.7.0': dependencies: '@smithy/middleware-serde': 4.0.8 @@ -27433,7 +28923,7 @@ snapshots: '@smithy/util-utf8': 4.0.0 '@types/uuid': 9.0.8 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 '@smithy/credential-provider-imds@2.2.6': dependencies: @@ -27441,7 +28931,7 @@ snapshots: '@smithy/property-provider': 2.1.4 '@smithy/types': 2.11.0 '@smithy/url-parser': 2.1.4 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/credential-provider-imds@4.0.1': dependencies: @@ -27449,7 +28939,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 '@smithy/url-parser': 4.0.5 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/credential-provider-imds@4.0.6': dependencies: @@ -27457,7 +28947,7 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 '@smithy/url-parser': 4.0.5 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/credential-provider-imds@4.0.7': dependencies: @@ -27465,33 +28955,36 @@ snapshots: '@smithy/property-provider': 4.0.5 '@smithy/types': 4.3.2 '@smithy/url-parser': 4.0.5 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.11': + dependencies: + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + tslib: 2.8.1 '@smithy/eventstream-codec@2.1.4': dependencies: '@aws-crypto/crc32': 3.0.0 '@smithy/types': 2.11.0 '@smithy/util-hex-encoding': 2.1.1 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/eventstream-codec@4.0.4': dependencies: '@aws-crypto/crc32': 5.2.0 '@smithy/types': 4.3.2 '@smithy/util-hex-encoding': 4.0.0 - tslib: 2.6.2 - - '@smithy/eventstream-serde-browser@2.1.4': - dependencies: - '@smithy/eventstream-serde-universal': 2.1.4 - '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.0.1': + '@smithy/eventstream-codec@4.2.11': dependencies: - '@smithy/eventstream-serde-universal': 4.0.4 - '@smithy/types': 4.3.2 - tslib: 2.6.2 + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.13.0 + '@smithy/util-hex-encoding': 4.2.2 + tslib: 2.8.1 '@smithy/eventstream-serde-browser@4.0.4': dependencies: @@ -27499,32 +28992,21 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.6.2 - '@smithy/eventstream-serde-config-resolver@2.1.4': + '@smithy/eventstream-serde-browser@4.2.11': dependencies: - '@smithy/types': 2.11.0 - tslib: 2.6.2 - - '@smithy/eventstream-serde-config-resolver@4.0.1': - dependencies: - '@smithy/types': 4.3.2 - tslib: 2.6.2 + '@smithy/eventstream-serde-universal': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@smithy/eventstream-serde-config-resolver@4.1.2': dependencies: '@smithy/types': 4.3.1 tslib: 2.6.2 - '@smithy/eventstream-serde-node@2.1.4': + '@smithy/eventstream-serde-config-resolver@4.3.11': dependencies: - '@smithy/eventstream-serde-universal': 2.1.4 - '@smithy/types': 2.11.0 - tslib: 2.6.2 - - '@smithy/eventstream-serde-node@4.0.1': - dependencies: - '@smithy/eventstream-serde-universal': 4.0.4 - '@smithy/types': 4.3.2 - tslib: 2.6.2 + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@smithy/eventstream-serde-node@4.0.4': dependencies: @@ -27532,17 +29014,23 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.6.2 - '@smithy/eventstream-serde-universal@2.1.4': + '@smithy/eventstream-serde-node@4.2.11': dependencies: - '@smithy/eventstream-codec': 2.1.4 - '@smithy/types': 2.11.0 - tslib: 2.6.2 + '@smithy/eventstream-serde-universal': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@smithy/eventstream-serde-universal@4.0.4': dependencies: '@smithy/eventstream-codec': 4.0.4 '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.2.11': + dependencies: + '@smithy/eventstream-codec': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@smithy/fetch-http-handler@2.4.4': dependencies: @@ -27576,6 +29064,14 @@ snapshots: '@smithy/util-base64': 4.0.0 tslib: 2.6.2 + '@smithy/fetch-http-handler@5.3.13': + dependencies: + '@smithy/protocol-http': 5.3.11 + '@smithy/querystring-builder': 4.2.11 + '@smithy/types': 4.13.0 + '@smithy/util-base64': 4.3.2 + tslib: 2.8.1 + '@smithy/hash-blob-browser@4.0.4': dependencies: '@smithy/chunked-blob-reader': 5.0.0 @@ -27611,6 +29107,13 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.6.2 + '@smithy/hash-node@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@smithy/hash-stream-node@4.0.4': dependencies: '@smithy/types': 4.3.1 @@ -27637,13 +29140,22 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/invalid-dependency@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/is-array-buffer@2.1.1': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/is-array-buffer@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.2.2': + dependencies: + tslib: 2.8.1 '@smithy/md5-js@4.0.4': dependencies: @@ -27675,6 +29187,12 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/middleware-content-length@4.2.11': + dependencies: + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/middleware-endpoint@2.4.6': dependencies: '@smithy/middleware-serde': 2.2.1 @@ -27718,6 +29236,17 @@ snapshots: '@smithy/util-middleware': 4.0.5 tslib: 2.6.2 + '@smithy/middleware-endpoint@4.4.22': + dependencies: + '@smithy/core': 3.23.8 + '@smithy/middleware-serde': 4.2.12 + '@smithy/node-config-provider': 4.3.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + '@smithy/url-parser': 4.2.11 + '@smithy/util-middleware': 4.2.11 + tslib: 2.8.1 + '@smithy/middleware-retry@2.1.6': dependencies: '@smithy/node-config-provider': 2.2.5 @@ -27728,7 +29257,7 @@ snapshots: '@smithy/util-middleware': 2.1.4 '@smithy/util-retry': 2.1.4 tslib: 2.6.2 - uuid: 8.3.2 + uuid: 10.0.0 '@smithy/middleware-retry@4.0.2': dependencies: @@ -27740,7 +29269,7 @@ snapshots: '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 '@smithy/middleware-retry@4.1.15': dependencies: @@ -27752,7 +29281,7 @@ snapshots: '@smithy/util-middleware': 4.0.4 '@smithy/util-retry': 4.0.6 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 '@smithy/middleware-retry@4.1.19': dependencies: @@ -27765,7 +29294,19 @@ snapshots: '@smithy/util-retry': 4.0.7 '@types/uuid': 9.0.8 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 + + '@smithy/middleware-retry@4.4.39': + dependencies: + '@smithy/node-config-provider': 4.3.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/service-error-classification': 4.2.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-retry': 4.2.11 + '@smithy/uuid': 1.1.2 + tslib: 2.8.1 '@smithy/middleware-serde@2.2.1': dependencies: @@ -27789,6 +29330,12 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/middleware-serde@4.2.12': + dependencies: + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/middleware-stack@2.1.4': dependencies: '@smithy/types': 2.11.0 @@ -27809,6 +29356,11 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/middleware-stack@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/node-config-provider@2.2.5': dependencies: '@smithy/property-provider': 2.1.4 @@ -27837,6 +29389,13 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/node-config-provider@4.3.11': + dependencies: + '@smithy/property-provider': 4.2.11 + '@smithy/shared-ini-file-loader': 4.4.6 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/node-http-handler@2.4.2': dependencies: '@smithy/abort-controller': 2.1.4 @@ -27869,25 +29428,38 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/node-http-handler@4.4.14': + dependencies: + '@smithy/abort-controller': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/querystring-builder': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/property-provider@2.1.4': dependencies: '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/property-provider@4.0.1': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/property-provider@4.0.4': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/property-provider@4.0.5': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@smithy/protocol-http@3.2.2': dependencies: @@ -27909,49 +29481,65 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/protocol-http@5.3.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/querystring-builder@2.1.4': dependencies: '@smithy/types': 2.11.0 '@smithy/util-uri-escape': 2.1.1 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/querystring-builder@4.0.1': dependencies: '@smithy/types': 4.3.2 '@smithy/util-uri-escape': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/querystring-builder@4.0.4': dependencies: '@smithy/types': 4.3.2 '@smithy/util-uri-escape': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/querystring-builder@4.0.5': dependencies: '@smithy/types': 4.3.2 '@smithy/util-uri-escape': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + '@smithy/util-uri-escape': 4.2.2 + tslib: 2.8.1 '@smithy/querystring-parser@2.1.4': dependencies: '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/querystring-parser@4.0.1': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/querystring-parser@4.0.4': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/querystring-parser@4.0.5': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@smithy/service-error-classification@2.1.4': dependencies: @@ -27969,25 +29557,34 @@ snapshots: dependencies: '@smithy/types': 4.3.2 + '@smithy/service-error-classification@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + '@smithy/shared-ini-file-loader@2.3.5': dependencies: '@smithy/types': 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/shared-ini-file-loader@4.0.1': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/shared-ini-file-loader@4.0.4': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/shared-ini-file-loader@4.0.5': dependencies: '@smithy/types': 4.3.2 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/shared-ini-file-loader@4.4.6': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 '@smithy/signature-v4@2.1.4': dependencies: @@ -27998,7 +29595,7 @@ snapshots: '@smithy/util-middleware': 2.1.4 '@smithy/util-uri-escape': 2.1.1 '@smithy/util-utf8': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/signature-v4@5.1.2': dependencies: @@ -28009,7 +29606,7 @@ snapshots: '@smithy/util-middleware': 4.0.5 '@smithy/util-uri-escape': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/signature-v4@5.1.3': dependencies: @@ -28020,7 +29617,18 @@ snapshots: '@smithy/util-middleware': 4.0.5 '@smithy/util-uri-escape': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.11': + dependencies: + '@smithy/is-array-buffer': 4.2.2 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-middleware': 4.2.11 + '@smithy/util-uri-escape': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 '@smithy/smithy-client@2.4.4': dependencies: @@ -28041,6 +29649,16 @@ snapshots: '@smithy/util-stream': 4.0.1 tslib: 2.6.2 + '@smithy/smithy-client@4.12.2': + dependencies: + '@smithy/core': 3.23.8 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/middleware-stack': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/types': 4.13.0 + '@smithy/util-stream': 4.5.17 + tslib: 2.8.1 + '@smithy/smithy-client@4.4.10': dependencies: '@smithy/core': 3.8.0 @@ -28069,6 +29687,10 @@ snapshots: dependencies: tslib: 2.6.2 + '@smithy/types@4.13.0': + dependencies: + tslib: 2.8.1 + '@smithy/types@4.3.1': dependencies: tslib: 2.6.2 @@ -28101,6 +29723,12 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/url-parser@4.2.11': + dependencies: + '@smithy/querystring-parser': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/util-base64@2.2.0': dependencies: '@smithy/util-buffer-from': 2.1.1 @@ -28113,6 +29741,12 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.6.2 + '@smithy/util-base64@4.3.2': + dependencies: + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 + '@smithy/util-body-length-browser@2.1.1': dependencies: tslib: 2.6.2 @@ -28121,6 +29755,10 @@ snapshots: dependencies: tslib: 2.6.2 + '@smithy/util-body-length-browser@4.2.2': + dependencies: + tslib: 2.8.1 + '@smithy/util-body-length-node@2.2.1': dependencies: tslib: 2.6.2 @@ -28129,23 +29767,36 @@ snapshots: dependencies: tslib: 2.6.2 + '@smithy/util-body-length-node@4.2.3': + dependencies: + tslib: 2.8.1 + '@smithy/util-buffer-from@2.1.1': dependencies: '@smithy/is-array-buffer': 2.1.1 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/util-buffer-from@4.0.0': dependencies: '@smithy/is-array-buffer': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.2': + dependencies: + '@smithy/is-array-buffer': 4.2.2 + tslib: 2.8.1 '@smithy/util-config-provider@2.2.1': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/util-config-provider@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.2': + dependencies: + tslib: 2.8.1 '@smithy/util-defaults-mode-browser@2.1.6': dependencies: @@ -28179,6 +29830,13 @@ snapshots: bowser: 2.11.0 tslib: 2.6.2 + '@smithy/util-defaults-mode-browser@4.3.38': + dependencies: + '@smithy/property-provider': 4.2.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/util-defaults-mode-node@2.2.6': dependencies: '@smithy/config-resolver': 2.1.5 @@ -28219,6 +29877,16 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/util-defaults-mode-node@4.2.41': + dependencies: + '@smithy/config-resolver': 4.4.10 + '@smithy/credential-provider-imds': 4.2.11 + '@smithy/node-config-provider': 4.3.11 + '@smithy/property-provider': 4.2.11 + '@smithy/smithy-client': 4.12.2 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/util-endpoints@1.1.5': dependencies: '@smithy/node-config-provider': 2.2.5 @@ -28243,13 +29911,23 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/util-endpoints@3.3.2': + dependencies: + '@smithy/node-config-provider': 4.3.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/util-hex-encoding@2.1.1': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/util-hex-encoding@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.2': + dependencies: + tslib: 2.8.1 '@smithy/util-middleware@2.1.4': dependencies: @@ -28271,6 +29949,11 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/util-middleware@4.2.11': + dependencies: + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/util-retry@2.1.4': dependencies: '@smithy/service-error-classification': 2.1.4 @@ -28295,6 +29978,12 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.6.2 + '@smithy/util-retry@4.2.11': + dependencies: + '@smithy/service-error-classification': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + '@smithy/util-stream@2.1.4': dependencies: '@smithy/fetch-http-handler': 2.4.4 @@ -28304,7 +29993,7 @@ snapshots: '@smithy/util-buffer-from': 2.1.1 '@smithy/util-hex-encoding': 2.1.1 '@smithy/util-utf8': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/util-stream@4.0.1': dependencies: @@ -28315,7 +30004,7 @@ snapshots: '@smithy/util-buffer-from': 4.0.0 '@smithy/util-hex-encoding': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/util-stream@4.2.3': dependencies: @@ -28337,15 +30026,30 @@ snapshots: '@smithy/util-buffer-from': 4.0.0 '@smithy/util-hex-encoding': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.17': + dependencies: + '@smithy/fetch-http-handler': 5.3.13 + '@smithy/node-http-handler': 4.4.14 + '@smithy/types': 4.13.0 + '@smithy/util-base64': 4.3.2 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-utf8': 4.2.2 + tslib: 2.8.1 '@smithy/util-uri-escape@2.1.1': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@smithy/util-uri-escape@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.2': + dependencies: + tslib: 2.8.1 '@smithy/util-utf8@2.2.0': dependencies: @@ -28357,6 +30061,11 @@ snapshots: '@smithy/util-buffer-from': 4.0.0 tslib: 2.6.2 + '@smithy/util-utf8@4.2.2': + dependencies: + '@smithy/util-buffer-from': 4.2.2 + tslib: 2.8.1 + '@smithy/util-waiter@2.1.4': dependencies: '@smithy/abort-controller': 2.1.4 @@ -28369,16 +30078,26 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.6.2 + '@smithy/util-waiter@4.2.11': + dependencies: + '@smithy/abort-controller': 4.2.11 + '@smithy/types': 4.13.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.2': + dependencies: + tslib: 2.8.1 + '@sqltools/formatter@1.2.5': {} '@standard-schema/spec@1.1.0': {} - '@stripe/agent-toolkit@0.1.21(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(ai@3.2.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.22.4))': + '@stripe/agent-toolkit@0.1.21(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ai@3.2.22(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@4.3.6))': dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - ai: 3.2.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.22.4) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + ai: 3.2.22(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@4.3.6) stripe: 17.3.1 - zod: 3.23.8 + zod: 3.25.76 '@supabase/functions-js@2.1.5': dependencies: @@ -28806,7 +30525,7 @@ snapshots: '@ts-stack/markdown@1.5.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@tsconfig/node10@1.0.9': {} @@ -28818,7 +30537,7 @@ snapshots: '@tybys/wasm-util@0.10.1': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 optional: true '@types/argparse@1.0.38': {} @@ -29217,7 +30936,9 @@ snapshots: dependencies: '@types/node': 22.16.3 - '@types/node@10.14.22': {} + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 '@types/node@18.19.23': dependencies: @@ -30126,15 +31847,15 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@3.2.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.22.4): + ai@3.2.22(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.25.76): dependencies: '@ai-sdk/provider': 0.0.12 - '@ai-sdk/provider-utils': 1.0.2(zod@3.22.4) - '@ai-sdk/react': 0.0.20(react@18.2.0)(zod@3.22.4) - '@ai-sdk/solid': 0.0.14(solid-js@1.9.7)(zod@3.22.4) - '@ai-sdk/svelte': 0.0.15(svelte@4.2.18)(zod@3.22.4) - '@ai-sdk/ui-utils': 0.0.12(zod@3.22.4) - '@ai-sdk/vue': 0.0.15(vue@3.4.31(typescript@5.5.2))(zod@3.22.4) + '@ai-sdk/provider-utils': 1.0.2(zod@3.25.76) + '@ai-sdk/react': 0.0.20(react@18.2.0)(zod@3.25.76) + '@ai-sdk/solid': 0.0.14(solid-js@1.9.7)(zod@3.25.76) + '@ai-sdk/svelte': 0.0.15(svelte@4.2.18)(zod@3.25.76) + '@ai-sdk/ui-utils': 0.0.12(zod@3.25.76) + '@ai-sdk/vue': 0.0.15(vue@3.4.31(typescript@5.5.2))(zod@3.25.76) '@opentelemetry/api': 1.9.0 eventsource-parser: 1.1.2 json-schema: 0.4.0 @@ -30142,12 +31863,38 @@ snapshots: nanoid: 3.3.6 secure-json-parse: 2.7.0 sswr: 2.1.0(svelte@4.2.18) - zod-to-json-schema: 3.22.5(zod@3.22.4) + zod-to-json-schema: 3.22.5(zod@3.25.76) optionalDependencies: - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) react: 18.2.0 svelte: 4.2.18 - zod: 3.22.4 + zod: 3.25.76 + transitivePeerDependencies: + - solid-js + - vue + + ai@3.2.22(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@4.3.6): + dependencies: + '@ai-sdk/provider': 0.0.12 + '@ai-sdk/provider-utils': 1.0.2(zod@4.3.6) + '@ai-sdk/react': 0.0.20(react@18.2.0)(zod@4.3.6) + '@ai-sdk/solid': 0.0.14(solid-js@1.9.7)(zod@4.3.6) + '@ai-sdk/svelte': 0.0.15(svelte@4.2.18)(zod@4.3.6) + '@ai-sdk/ui-utils': 0.0.12(zod@4.3.6) + '@ai-sdk/vue': 0.0.15(vue@3.4.31(typescript@5.5.2))(zod@4.3.6) + '@opentelemetry/api': 1.9.0 + eventsource-parser: 1.1.2 + json-schema: 0.4.0 + jsondiffpatch: 0.6.0 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + sswr: 2.1.0(svelte@4.2.18) + zod-to-json-schema: 3.22.5(zod@4.3.6) + optionalDependencies: + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) + react: 18.2.0 + svelte: 4.2.18 + zod: 4.3.6 transitivePeerDependencies: - solid-js - vue @@ -30459,7 +32206,7 @@ snapshots: ast-types@0.13.4: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 astral-regex@2.0.0: {} @@ -30478,7 +32225,7 @@ snapshots: async-mutex@0.5.0: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 async-retry@1.3.3: dependencies: @@ -30558,7 +32305,7 @@ snapshots: readable-stream: 2.3.8 request: 2.88.2 underscore: 1.13.6 - uuid: 3.4.0 + uuid: 10.0.0 validator: 13.12.0 xml2js: 0.2.8 xmlbuilder: 9.0.7 @@ -30916,6 +32663,8 @@ snapshots: dependencies: node-int64: 0.4.0 + bson@6.10.4: {} + bson@6.4.0: {} bson@6.7.0: {} @@ -30963,7 +32712,7 @@ snapshots: node-abort-controller: 3.1.1 semver: 7.7.1 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - supports-color @@ -31067,7 +32816,7 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.6.2 + tslib: 2.8.1 camelcase-css@2.0.1: {} @@ -31105,7 +32854,7 @@ snapshots: capital-case@1.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 upper-case-first: 2.0.2 case-sensitive-paths-webpack-plugin@2.4.0: {} @@ -31132,6 +32881,8 @@ snapshots: chalk@5.3.0: {} + chalk@5.6.2: {} + change-case@4.1.2: dependencies: camel-case: 4.1.2 @@ -31145,7 +32896,7 @@ snapshots: path-case: 3.0.4 sentence-case: 3.0.4 snake-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 char-regex@1.0.2: {} @@ -31231,14 +32982,14 @@ snapshots: chromadb-js-bindings-win32-x64-msvc@1.1.1: optional: true - chromadb@1.7.3(@google/generative-ai@0.24.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)): + chromadb@1.7.3(@google/generative-ai@0.24.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)): dependencies: cliui: 8.0.1 isomorphic-fetch: 3.0.0(encoding@0.1.13) optionalDependencies: '@google/generative-ai': 0.24.0 cohere-ai: 7.10.0(encoding@0.1.13) - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) transitivePeerDependencies: - encoding @@ -31429,6 +33180,21 @@ snapshots: transitivePeerDependencies: - encoding + cohere-ai@7.20.0: + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sagemaker': 3.1002.0 + '@aws-sdk/credential-providers': 3.1002.0 + '@smithy/protocol-http': 5.1.3 + '@smithy/signature-v4': 5.1.3 + convict: 6.2.4 + form-data: 4.0.4 + form-data-encoder: 4.1.0 + formdata-node: 6.0.3 + readable-stream: 4.7.0 + transitivePeerDependencies: + - aws-crt + collect-v8-coverage@1.0.2: {} collection-map@1.0.0: @@ -31524,28 +33290,28 @@ snapshots: component-register@0.8.3: {} - composio-core@0.5.39(@ai-sdk/openai@3.0.2(zod@3.22.4))(@cloudflare/workers-types@4.20260101.0)(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(@langchain/openai@0.6.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(ai@3.2.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.22.4))(langchain@0.3.6(08bef5ed58eb471b0c368ae979090c97))(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)): + composio-core@0.5.39(be623a5ed387a5e9d079928a84fd4c7c): dependencies: - '@ai-sdk/openai': 3.0.2(zod@3.22.4) + '@ai-sdk/openai': 3.0.2(zod@4.3.6) '@cloudflare/workers-types': 4.20260101.0 '@composio/mcp': 1.0.3-0 '@hey-api/client-axios': 0.2.12(axios@1.12.0) - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@langchain/openai': 0.6.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - ai: 3.2.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.22.4) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/openai': 1.2.5(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + ai: 3.2.22(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@4.3.6) axios: 1.12.0(debug@4.3.4) chalk: 4.1.2 cli-progress: 3.12.0 commander: 12.1.0 inquirer: 10.2.2 - langchain: 0.3.6(08bef5ed58eb471b0c368ae979090c97) + langchain: 1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6)) open: 8.4.2 - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) pusher-js: 8.4.0-rc2 resolve-package-path: 4.0.3 uuid: 10.0.0 - zod: 3.25.32 - zod-to-json-schema: 3.24.1(zod@3.25.32) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - debug @@ -31631,7 +33397,7 @@ snapshots: constant-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 upper-case: 2.0.2 content-disposition@0.5.4: @@ -31648,6 +33414,11 @@ snapshots: convert-source-map@2.0.0: {} + convict@6.2.4: + dependencies: + lodash.clonedeep: 4.5.0 + yargs-parser: 20.2.9 + cookie-parser@1.4.6: dependencies: cookie: 0.4.1 @@ -32469,7 +34240,7 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 dot-prop@6.0.1: dependencies: @@ -33189,7 +34960,7 @@ snapshots: eventid@2.0.1: dependencies: - uuid: 8.3.2 + uuid: 10.0.0 events@3.3.0: {} @@ -33564,6 +35335,8 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-xml-builder@1.0.0: {} + fast-xml-parser@4.2.5: dependencies: strnum: 1.0.5 @@ -33576,6 +35349,11 @@ snapshots: dependencies: strnum: 2.1.1 + fast-xml-parser@5.4.1: + dependencies: + fast-xml-builder: 1.0.0 + strnum: 2.2.0 + fastest-levenshtein@1.0.16: {} fastq@1.17.1: @@ -33820,7 +35598,7 @@ snapshots: prettier: 3.2.5 solid-element: 1.7.0(solid-js@1.9.7) solid-js: 1.9.7 - zod: 3.22.4 + zod: 3.25.76 transitivePeerDependencies: - debug - supports-color @@ -33916,6 +35694,8 @@ snapshots: form-data-encoder@4.0.2: {} + form-data-encoder@4.1.0: {} + form-data@4.0.4: dependencies: asynckit: 0.4.0 @@ -33979,7 +35759,7 @@ snapshots: framesync@5.3.0: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 fresh@0.5.2: {} @@ -34384,7 +36164,7 @@ snapshots: proto3-json-serializer: 2.0.2 protobufjs: 7.4.0 retry-request: 7.0.2(encoding@0.1.13) - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - encoding - supports-color @@ -34437,7 +36217,7 @@ snapshots: graphql@16.8.1: {} - groq-sdk@0.5.0(encoding@0.1.13): + groq-sdk@0.19.0(encoding@0.1.13): dependencies: '@types/node': 18.19.23 '@types/node-fetch': 2.6.12 @@ -34446,7 +36226,6 @@ snapshots: form-data-encoder: 1.7.2 formdata-node: 4.4.1 node-fetch: 2.7.0(encoding@0.1.13) - web-streams-polyfill: 3.3.3 transitivePeerDependencies: - encoding @@ -34680,7 +36459,7 @@ snapshots: header-case@2.0.4: dependencies: capital-case: 1.0.4 - tslib: 2.6.2 + tslib: 2.8.1 hey-listen@1.0.8: {} @@ -34911,10 +36690,10 @@ snapshots: hyperdyperid@1.2.0: {} - ibm-cloud-sdk-core@5.1.0: + ibm-cloud-sdk-core@5.4.8: dependencies: '@types/debug': 4.1.12 - '@types/node': 10.14.22 + '@types/node': 18.19.130 '@types/tough-cookie': 4.0.5 axios: 1.12.0(debug@4.4.3) camelcase: 6.3.0 @@ -34924,7 +36703,7 @@ snapshots: file-type: 16.5.4 form-data: 4.0.4 isstream: 0.1.2 - jsonwebtoken: 9.0.2 + jsonwebtoken: 9.0.3 mime-types: 2.1.35 retry-axios: 2.6.0(axios@1.12.0) tough-cookie: 4.1.3 @@ -35224,6 +37003,8 @@ snapshots: is-negative-zero@2.0.3: {} + is-network-error@1.3.1: {} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -36188,6 +37969,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsbn@0.1.1: {} jsbn@1.1.0: {} @@ -36375,6 +38160,19 @@ snapshots: ms: 2.1.3 semver: 7.7.1 + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.1 + jsprim@1.4.2: dependencies: assert-plus: 1.0.0 @@ -36417,6 +38215,12 @@ snapshots: ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + jws@3.2.2: dependencies: jwa: 1.4.1 @@ -36427,6 +38231,11 @@ snapshots: jwa: 2.0.0 safe-buffer: 5.2.1 + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + jwt-decode@3.1.2: {} jwt-decode@4.0.0: {} @@ -36470,48 +38279,67 @@ snapshots: kuler@2.0.0: {} - langchain@0.3.6(08bef5ed58eb471b0c368ae979090c97): + langchain@0.3.6(ae6cc523d80405ef1a537f4975d7f084): dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@langchain/openai': 0.3.13(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - '@langchain/textsplitters': 0.0.1(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/openai': 0.3.13(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@langchain/textsplitters': 0.0.1(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 - langsmith: 0.2.8(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + langsmith: 0.2.8(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 10.0.0 yaml: 2.4.1 - zod: 3.22.4 - zod-to-json-schema: 3.23.1(zod@3.22.4) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) optionalDependencies: - '@langchain/anthropic': 0.3.33(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(zod@3.22.4) - '@langchain/aws': 0.1.11(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) - '@langchain/cohere': 0.0.7(encoding@0.1.13)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - '@langchain/google-genai': 0.2.3(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(zod@3.22.4) - '@langchain/google-vertexai': 0.2.14(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) - '@langchain/groq': 0.1.2(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)))(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - '@langchain/mistralai': 0.2.0(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) - '@langchain/ollama': 0.2.0(@langchain/core@0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))) + '@langchain/anthropic': 1.3.20(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + '@langchain/aws': 1.2.2(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + '@langchain/cohere': 1.0.2(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + '@langchain/google-genai': 2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + '@langchain/google-vertexai': 2.1.15(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + '@langchain/groq': 1.0.4(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(encoding@0.1.13) + '@langchain/mistralai': 1.0.4(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(bufferutil@4.0.8)(utf-8-validate@6.0.4) + '@langchain/ollama': 1.2.2(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) axios: 1.12.0(debug@4.3.4) cheerio: 1.0.0-rc.12 handlebars: 4.7.8 - typeorm: 0.3.20(ioredis@5.3.2)(mongodb@6.3.0(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)) + typeorm: 0.3.20(ioredis@5.3.2)(mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)) transitivePeerDependencies: - - encoding + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - openai - ws + langchain@1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6)): + dependencies: + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + '@langchain/langgraph': 1.2.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))) + langsmith: 0.4.12(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + uuid: 10.0.0 + zod: 4.3.6 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - react + - react-dom + - zod-to-json-schema + langchainhub@0.0.11: {} langfuse-core@3.3.4: dependencies: mustache: 4.2.0 - langfuse-langchain@3.3.4(langchain@0.3.6(08bef5ed58eb471b0c368ae979090c97)): + langfuse-langchain@3.3.4(langchain@1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6))): dependencies: - langchain: 0.3.6(08bef5ed58eb471b0c368ae979090c97) + langchain: 1.2.18(@langchain/core@1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(zod-to-json-schema@3.25.1(zod@4.3.6)) langfuse: 3.3.4 langfuse-core: 3.3.4 @@ -36519,36 +38347,56 @@ snapshots: dependencies: langfuse-core: 3.3.4 - langsmith@0.1.6: + langsmith@0.2.8(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)): dependencies: - '@types/uuid': 9.0.8 + '@types/uuid': 10.0.0 commander: 10.0.1 p-queue: 6.6.2 p-retry: 4.6.2 - uuid: 9.0.1 + semver: 7.7.1 + uuid: 10.0.0 + optionalDependencies: + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) - langsmith@0.2.8(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)): + langsmith@0.3.34(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)): dependencies: '@types/uuid': 10.0.0 - commander: 10.0.1 + chalk: 4.1.2 + console-table-printer: 2.14.6 p-queue: 6.6.2 p-retry: 4.6.2 semver: 7.7.1 uuid: 10.0.0 optionalDependencies: - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) - langsmith@0.3.34(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)): + langsmith@0.4.12(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 console-table-printer: 2.14.6 p-queue: 6.6.2 - p-retry: 4.6.2 semver: 7.7.1 uuid: 10.0.0 optionalDependencies: - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-proto': 0.54.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) + + langsmith@0.5.7(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)): + dependencies: + '@types/uuid': 10.0.0 + chalk: 5.6.2 + console-table-printer: 2.14.6 + p-queue: 6.6.2 + semver: 7.7.1 + uuid: 10.0.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-proto': 0.54.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) language-subtag-registry@0.3.22: {} @@ -36556,18 +38404,20 @@ snapshots: dependencies: language-subtag-registry: 0.3.22 - langwatch@0.1.1(encoding@0.1.13)(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)): + langwatch@0.1.1(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)): dependencies: - '@langchain/core': 0.3.61(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) - ai: 3.2.22(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.22.4) + '@langchain/core': 1.1.20(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) + ai: 3.2.22(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0)(solid-js@1.9.7)(svelte@4.2.18)(vue@3.4.31(typescript@5.5.2))(zod@3.25.76) javascript-stringify: 2.1.0 llm-cost: 1.0.4 nanoid: 5.0.7 - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) - zod: 3.22.4 - zod-validation-error: 3.3.0(zod@3.22.4) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.25.76) + zod: 3.25.76 + zod-validation-error: 3.3.0(zod@3.25.76) transitivePeerDependencies: - - encoding + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' - react - solid-js - svelte @@ -36681,9 +38531,9 @@ snapshots: optionalDependencies: enquirer: 2.4.1 - llamaindex@0.3.13(@notionhq/client@2.2.14(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13))(socks@2.8.1)(typescript@5.5.2)(utf-8-validate@6.0.4)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4): + llamaindex@0.3.13(@aws-sdk/credential-providers@3.1002.0)(@notionhq/client@2.2.14(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13))(socks@2.8.1)(typescript@5.5.2)(utf-8-validate@6.0.4)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6): dependencies: - '@anthropic-ai/sdk': 0.20.9(encoding@0.1.13) + '@anthropic-ai/sdk': 0.73.0(zod@4.3.6) '@aws-crypto/sha256-js': 5.2.0 '@datastax/astra-db-ts': 1.5.0 '@google-cloud/vertexai': 1.1.0(encoding@0.1.13) @@ -36703,16 +38553,16 @@ snapshots: '@zilliz/milvus2-sdk-node': 2.4.2 ajv: 8.13.0 assemblyai: 4.4.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) - chromadb: 1.7.3(@google/generative-ai@0.24.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4)) + chromadb: 1.7.3(@google/generative-ai@0.24.0)(cohere-ai@7.10.0(encoding@0.1.13))(encoding@0.1.13)(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6)) cohere-ai: 7.10.0(encoding@0.1.13) js-tiktoken: 1.0.12 lodash: 4.17.21 magic-bytes.js: 1.10.0 mammoth: 1.7.2 md-utils-ts: 2.0.0 - mongodb: 6.6.2(socks@2.8.1) + mongodb: 6.6.2(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1) notion-md-crawler: 1.0.0(encoding@0.1.13) - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) papaparse: 5.4.1 pathe: 1.1.2 pdf2json: 3.0.5 @@ -36784,6 +38634,8 @@ snapshots: lodash.camelcase@4.3.0: {} + lodash.clonedeep@4.5.0: {} + lodash.curry@4.1.1: {} lodash.debounce@4.0.8: {} @@ -36875,7 +38727,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 lowercase-keys@3.0.0: {} @@ -36914,11 +38766,11 @@ snapshots: lru.min@1.1.1: {} - lunary@0.7.12(openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4))(react@18.2.0): + lunary@0.7.12(openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6))(react@18.2.0): dependencies: unctx: 2.3.1 optionalDependencies: - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6) react: 18.2.0 luxon@3.5.0: {} @@ -37044,6 +38896,8 @@ snapshots: material-colors@1.2.6: {} + math-expression-evaluator@2.0.7: {} + math-intrinsics@1.1.0: {} mathjax-full@3.2.2: @@ -37214,29 +39068,28 @@ snapshots: transitivePeerDependencies: - encoding - mem0ai@2.1.16(@anthropic-ai/sdk@0.65.0(zod@3.22.4))(@google/genai@0.7.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))(@mistralai/mistralai@0.1.3(encoding@0.1.13))(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/jest@29.5.14)(@types/pg@8.11.2)(@types/sqlite3@3.1.11)(encoding@0.1.13)(groq-sdk@0.5.0(encoding@0.1.13))(neo4j-driver@5.27.0)(ollama@0.5.11)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)): + mem0ai@2.1.16(@anthropic-ai/sdk@0.73.0(zod@4.3.6))(@google/genai@0.7.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4))(@mistralai/mistralai@1.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@qdrant/js-client-rest@1.9.0(typescript@5.5.2))(@supabase/supabase-js@2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@types/jest@29.5.14)(@types/pg@8.11.2)(@types/sqlite3@3.1.11)(groq-sdk@0.19.0(encoding@0.1.13))(neo4j-driver@5.27.0)(ollama@0.5.11)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)): dependencies: - '@anthropic-ai/sdk': 0.65.0(zod@3.22.4) + '@anthropic-ai/sdk': 0.73.0(zod@4.3.6) '@google/genai': 0.7.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.4) - '@mistralai/mistralai': 0.1.3(encoding@0.1.13) + '@mistralai/mistralai': 1.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@qdrant/js-client-rest': 1.9.0(typescript@5.5.2) '@supabase/supabase-js': 2.39.8(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@types/jest': 29.5.14 '@types/pg': 8.11.2 '@types/sqlite3': 3.1.11 axios: 1.12.0(debug@4.3.4) - groq-sdk: 0.5.0(encoding@0.1.13) + groq-sdk: 0.19.0(encoding@0.1.13) neo4j-driver: 5.27.0 ollama: 0.5.11 - openai: 4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.25.32) + openai: 6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.25.76) pg: 8.11.3 redis: 4.6.13 sqlite3: 5.1.7 - uuid: 9.0.1 - zod: 3.25.32 + uuid: 10.0.0 + zod: 3.25.76 transitivePeerDependencies: - debug - - encoding - ws memfs@3.5.3: @@ -37245,10 +39098,10 @@ snapshots: memfs@4.17.0: dependencies: - '@jsonjoy.com/json-pack': 1.1.1(tslib@2.6.2) - '@jsonjoy.com/util': 1.5.0(tslib@2.6.2) - tree-dump: 1.0.2(tslib@2.6.2) - tslib: 2.6.2 + '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 memory-pager@1.5.0: {} @@ -37666,20 +39519,36 @@ snapshots: '@types/whatwg-url': 11.0.4 whatwg-url: 13.0.0 - mongodb@6.3.0(socks@2.8.1): + mongodb-connection-string-url@3.0.2: + dependencies: + '@types/whatwg-url': 11.0.4 + whatwg-url: 13.0.0 + + mongodb@6.21.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1): + dependencies: + '@mongodb-js/saslprep': 1.4.6 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 + optionalDependencies: + '@aws-sdk/credential-providers': 3.1002.0 + socks: 2.8.1 + + mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1): dependencies: '@mongodb-js/saslprep': 1.1.5 bson: 6.4.0 mongodb-connection-string-url: 3.0.0 optionalDependencies: + '@aws-sdk/credential-providers': 3.1002.0 socks: 2.8.1 - mongodb@6.6.2(socks@2.8.1): + mongodb@6.6.2(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1): dependencies: '@mongodb-js/saslprep': 1.1.5 bson: 6.7.0 mongodb-connection-string-url: 3.0.0 optionalDependencies: + '@aws-sdk/credential-providers': 3.1002.0 socks: 2.8.1 mri@1.2.0: {} @@ -37714,17 +39583,17 @@ snapshots: express: 4.21.2 multer: 1.4.5-lts.1 path: 0.12.7 - uuid: 8.3.2 + uuid: 10.0.0 transitivePeerDependencies: - supports-color - multer-cloud-storage@4.0.0(encoding@0.1.13): + multer-cloud-storage@4.0.0: dependencies: '@google-cloud/storage': 7.16.0(encoding@0.1.13) '@types/express': 5.0.1 multer: 1.4.5-lts.1 urlencode: 2.0.0 - uuid: 11.1.0 + uuid: 10.0.0 transitivePeerDependencies: - encoding - supports-color @@ -37880,7 +39749,7 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 node-abi@3.56.0: dependencies: @@ -38208,7 +40077,7 @@ snapshots: dependencies: whatwg-fetch: 3.6.20 - ollama@0.5.14: + ollama@0.6.3: dependencies: whatwg-fetch: 3.6.20 @@ -38260,35 +40129,15 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.22.4): - dependencies: - '@types/node': 18.19.23 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) + openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.25.76): optionalDependencies: ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) - zod: 3.22.4 - transitivePeerDependencies: - - encoding + zod: 3.25.76 - openai@4.96.0(encoding@0.1.13)(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@3.25.32): - dependencies: - '@types/node': 18.19.23 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) + openai@6.19.0(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4))(zod@4.3.6): optionalDependencies: ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) - zod: 3.25.32 - transitivePeerDependencies: - - encoding + zod: 4.3.6 openapi-fetch@0.9.8: dependencies: @@ -38373,15 +40222,26 @@ snapshots: eventemitter3: 4.0.7 p-timeout: 3.2.0 + p-queue@9.1.0: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 7.0.1 + p-retry@4.6.2: dependencies: '@types/retry': 0.12.0 retry: 0.13.1 + p-retry@7.1.1: + dependencies: + is-network-error: 1.3.1 + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 + p-timeout@7.0.1: {} + p-try@2.2.0: {} pac-proxy-agent@7.0.1: @@ -38411,7 +40271,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 parent-module@1.0.1: dependencies: @@ -38481,7 +40341,7 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 pascalcase@0.1.1: {} @@ -38551,7 +40411,7 @@ snapshots: path-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 path-exists@2.1.0: dependencies: @@ -38776,7 +40636,7 @@ snapshots: framesync: 5.3.0 hey-listen: 1.0.8 style-value-types: 4.1.4 - tslib: 2.6.2 + tslib: 2.8.1 portkey-ai@0.1.16: dependencies: @@ -40092,6 +41952,14 @@ snapshots: string_decoder: 1.3.0 optional: true + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + readable-web-to-node-stream@3.0.2: dependencies: readable-stream: 3.6.2 @@ -40553,7 +42421,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 s3-streamlogger@1.11.0: dependencies: @@ -40738,7 +42606,7 @@ snapshots: sentence-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 upper-case-first: 2.0.2 seq-queue@0.0.5: {} @@ -40966,7 +42834,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 snapdragon@0.8.2: dependencies: @@ -40984,7 +42852,7 @@ snapshots: sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 - uuid: 8.3.2 + uuid: 10.0.0 websocket-driver: 0.7.4 socks-proxy-agent@6.2.1: @@ -41419,6 +43287,8 @@ snapshots: strnum@2.1.1: {} + strnum@2.2.0: {} + strtok3@6.3.0: dependencies: '@tokenizer/token': 0.3.0 @@ -41447,7 +43317,7 @@ snapshots: style-value-types@4.1.4: dependencies: hey-listen: 1.0.8 - tslib: 2.6.2 + tslib: 2.8.1 styled-components@6.1.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: @@ -41503,10 +43373,10 @@ snapshots: body-parser: 2.0.2 cors: 2.8.5 express: 4.21.2 - uuid: 11.1.0 + uuid: 10.0.0 ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@6.0.4) yargs: 17.7.2 - zod: 3.25.32 + zod: 3.25.76 transitivePeerDependencies: - bufferutil - supports-color @@ -41691,7 +43561,7 @@ snapshots: https-proxy-agent: 5.0.1 node-fetch: 2.7.0(encoding@0.1.13) stream-events: 1.0.5 - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - encoding - supports-color @@ -41751,9 +43621,9 @@ snapshots: dependencies: any-promise: 1.3.0 - thingies@1.21.0(tslib@2.6.2): + thingies@1.21.0(tslib@2.8.1): dependencies: - tslib: 2.6.2 + tslib: 2.8.1 throat@6.0.2: {} @@ -41883,9 +43753,9 @@ snapshots: dependencies: punycode: 2.3.1 - tree-dump@1.0.2(tslib@2.6.2): + tree-dump@1.0.2(tslib@2.8.1): dependencies: - tslib: 2.6.2 + tslib: 2.8.1 tree-kill@1.2.2: {} @@ -41961,7 +43831,7 @@ snapshots: dependencies: '@types/node': 22.16.3 ts-toolbelt: 9.6.0 - tslib: 2.6.2 + tslib: 2.8.1 typedarray-dts: 1.0.0 tsc-watch@6.0.4(typescript@5.5.2): @@ -42122,7 +43992,7 @@ snapshots: typedarray@0.0.6: {} - typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)): + typeorm@0.3.20(ioredis@5.3.2)(mongodb@6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1))(mysql2@3.11.4)(pg@8.11.3)(redis@4.6.13)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.4.6)(@types/node@22.16.3)(typescript@5.5.2)): dependencies: '@sqltools/formatter': 1.2.5 app-root-path: 3.1.0 @@ -42137,11 +44007,11 @@ snapshots: reflect-metadata: 0.2.1 sha.js: 2.4.11 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 yargs: 17.7.2 optionalDependencies: ioredis: 5.3.2 - mongodb: 6.3.0(socks@2.8.1) + mongodb: 6.3.0(@aws-sdk/credential-providers@3.1002.0)(socks@2.8.1) mysql2: 3.11.4 pg: 8.11.3 redis: 4.6.13 @@ -42165,7 +44035,7 @@ snapshots: reflect-metadata: 0.2.1 sha.js: 2.4.11 tslib: 2.6.2 - uuid: 9.0.1 + uuid: 10.0.0 yargs: 17.7.2 optionalDependencies: ioredis: 5.4.2 @@ -42254,6 +44124,8 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + undici@6.23.0: {} + unicode-canonical-property-names-ecmascript@2.0.0: {} unicode-match-property-ecmascript@2.0.0: @@ -42416,11 +44288,11 @@ snapshots: upper-case-first@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 upper-case@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 uri-js@4.4.1: dependencies: @@ -42488,14 +44360,8 @@ snapshots: uuid@10.0.0: {} - uuid@11.1.0: {} - uuid@3.4.0: {} - uuid@8.3.2: {} - - uuid@9.0.1: {} - uuidv7@0.6.3: {} uvu@0.5.6: @@ -42768,7 +44634,7 @@ snapshots: nice-grpc: 2.1.12 nice-grpc-client-middleware-retry: 3.1.11 nice-grpc-common: 2.0.2 - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - encoding @@ -42776,15 +44642,7 @@ snapshots: dependencies: graphql-request: 5.2.0(encoding@0.1.13)(graphql@16.8.1) isomorphic-fetch: 3.0.0(encoding@0.1.13) - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - - graphql - - weaviate-ts-client@2.1.1(encoding@0.1.13)(graphql@16.8.1): - dependencies: - graphql-request: 5.2.0(encoding@0.1.13)(graphql@16.8.1) - uuid: 9.0.1 + uuid: 10.0.0 transitivePeerDependencies: - encoding - graphql @@ -43506,45 +45364,31 @@ snapshots: optionalDependencies: commander: 9.5.0 - zod-to-json-schema@3.22.4(zod@3.22.4): - dependencies: - zod: 3.22.4 - - zod-to-json-schema@3.22.5(zod@3.22.4): - dependencies: - zod: 3.22.4 - - zod-to-json-schema@3.23.1(zod@3.22.4): - dependencies: - zod: 3.22.4 - - zod-to-json-schema@3.23.1(zod@3.23.8): + zod-to-json-schema@3.22.5(zod@3.25.76): dependencies: - zod: 3.23.8 + zod: 3.25.76 - zod-to-json-schema@3.24.1(zod@3.22.4): + zod-to-json-schema@3.22.5(zod@4.3.6): dependencies: - zod: 3.22.4 + zod: 4.3.6 - zod-to-json-schema@3.24.1(zod@3.24.2): + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: - zod: 3.24.2 + zod: 3.25.76 - zod-to-json-schema@3.24.1(zod@3.25.32): + zod-to-json-schema@3.25.1(zod@4.3.6): dependencies: - zod: 3.25.32 + zod: 4.3.6 - zod-validation-error@3.3.0(zod@3.22.4): + zod-validation-error@3.3.0(zod@3.25.76): dependencies: - zod: 3.22.4 + zod: 3.25.76 zod@3.22.4: {} - zod@3.23.8: {} - - zod@3.24.2: {} + zod@3.25.76: {} - zod@3.25.32: {} + zod@4.3.6: {} zustand@4.5.2(@types/react@18.2.65)(immer@10.1.1)(react@18.2.0): dependencies: