diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts index d94cc3a1a..221d5e177 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts @@ -244,7 +244,7 @@ class ChatOpenAI_ChatModels implements INode { } } - const model = new ChatOpenAI(obj, { + const model = new ChatOpenAI(nodeData.id, obj, { baseURL: basePath, baseOptions: parsedBaseOptions }) diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/FlowiseChatOpenAI.ts b/packages/components/nodes/chatmodels/ChatOpenAI/FlowiseChatOpenAI.ts index 7b39f1ed6..396d74334 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAI/FlowiseChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/ChatOpenAI/FlowiseChatOpenAI.ts @@ -9,20 +9,33 @@ import { Callbacks } from '@langchain/core/callbacks/manager' import { ICommonObject, IMultiModalOption, INodeData } from '../../../src' import { addImagesToMessages } from '../../../src/multiModalUtils' +interface MultiModalOptions { + chainNodeData: INodeData + chainNodeOptions: ICommonObject +} + export class ChatOpenAI extends LangchainChatOpenAI { //TODO: Should be class variables and not static - public static chainNodeData: INodeData - public static chainNodeOptions: ICommonObject + // public static nodeData: INodeData + // public static nodeOptions: ICommonObject + private static chainNodeDataOptions: Map = new Map() configuredModel: string configuredMaxToken?: number multiModalOption?: IMultiModalOption + id: string + + public static injectChainNodeData(nodeData: INodeData, options: ICommonObject) { + ChatOpenAI.chainNodeDataOptions.set(nodeData.id, { chainNodeData: nodeData, chainNodeOptions: options }) + } constructor( + id: string, fields?: Partial & BaseChatModelParams & { openAIApiKey?: string; multiModalOption?: IMultiModalOption }, /** @deprecated */ configuration?: ClientOptions & LegacyOpenAIInput ) { super(fields, configuration) + this.id = id this.multiModalOption = fields?.multiModalOption this.configuredModel = fields?.modelName ?? 'gpt-3.5-turbo' this.configuredMaxToken = fields?.maxTokens @@ -33,15 +46,15 @@ export class ChatOpenAI extends LangchainChatOpenAI { } async generate(messages: BaseMessageLike[][], options?: string[] | ChatOpenAICallOptions, callbacks?: Callbacks): Promise { - if (ChatOpenAI.chainNodeData && ChatOpenAI.chainNodeOptions) { - await this.injectMultiModalMessages(messages) + if (ChatOpenAI.chainNodeDataOptions.has(this.id)) { + await this.injectMultiModalMessages(messages, ChatOpenAI.chainNodeDataOptions.get(this.id) as MultiModalOptions) } return super.generate(messages, options, callbacks) } - private async injectMultiModalMessages(messages: BaseMessageLike[][]) { - const nodeData = ChatOpenAI.chainNodeData - const optionsData = ChatOpenAI.chainNodeOptions + private async injectMultiModalMessages(messages: BaseMessageLike[][], nodeOptions: MultiModalOptions) { + const nodeData = nodeOptions.chainNodeData + const optionsData = nodeOptions.chainNodeOptions const messageContent = addImagesToMessages(nodeData, optionsData, this.multiModalOption) if (messageContent?.length) { if (messages[0].length > 0 && messages[0][messages[0].length - 1] instanceof HumanMessage) { diff --git a/packages/components/src/multiModalUtils.ts b/packages/components/src/multiModalUtils.ts index 6cbd75a07..c321f0888 100644 --- a/packages/components/src/multiModalUtils.ts +++ b/packages/components/src/multiModalUtils.ts @@ -12,8 +12,7 @@ export const injectChainNodeData = (nodeData: INodeData, options: ICommonObject) if (model instanceof ChatOpenAI) { // TODO: this should not be static, need to figure out how to pass the nodeData and options to the invoke method - ChatOpenAI.chainNodeOptions = options - ChatOpenAI.chainNodeData = nodeData + ChatOpenAI.injectChainNodeData(nodeData, options) } }