fix for concurrent requests for media handling

This commit is contained in:
vinodkiran 2024-02-14 13:16:51 -05:00
parent 44c1f54d05
commit a71c5a109d
3 changed files with 22 additions and 10 deletions

View File

@ -244,7 +244,7 @@ class ChatOpenAI_ChatModels implements INode {
} }
} }
const model = new ChatOpenAI(obj, { const model = new ChatOpenAI(nodeData.id, obj, {
baseURL: basePath, baseURL: basePath,
baseOptions: parsedBaseOptions baseOptions: parsedBaseOptions
}) })

View File

@ -9,20 +9,33 @@ import { Callbacks } from '@langchain/core/callbacks/manager'
import { ICommonObject, IMultiModalOption, INodeData } from '../../../src' import { ICommonObject, IMultiModalOption, INodeData } from '../../../src'
import { addImagesToMessages } from '../../../src/multiModalUtils' import { addImagesToMessages } from '../../../src/multiModalUtils'
interface MultiModalOptions {
chainNodeData: INodeData
chainNodeOptions: ICommonObject
}
export class ChatOpenAI extends LangchainChatOpenAI { export class ChatOpenAI extends LangchainChatOpenAI {
//TODO: Should be class variables and not static //TODO: Should be class variables and not static
public static chainNodeData: INodeData // public static nodeData: INodeData
public static chainNodeOptions: ICommonObject // public static nodeOptions: ICommonObject
private static chainNodeDataOptions: Map<string, MultiModalOptions> = new Map()
configuredModel: string configuredModel: string
configuredMaxToken?: number configuredMaxToken?: number
multiModalOption?: IMultiModalOption multiModalOption?: IMultiModalOption
id: string
public static injectChainNodeData(nodeData: INodeData, options: ICommonObject) {
ChatOpenAI.chainNodeDataOptions.set(nodeData.id, { chainNodeData: nodeData, chainNodeOptions: options })
}
constructor( constructor(
id: string,
fields?: Partial<OpenAIChatInput> & BaseChatModelParams & { openAIApiKey?: string; multiModalOption?: IMultiModalOption }, fields?: Partial<OpenAIChatInput> & BaseChatModelParams & { openAIApiKey?: string; multiModalOption?: IMultiModalOption },
/** @deprecated */ /** @deprecated */
configuration?: ClientOptions & LegacyOpenAIInput configuration?: ClientOptions & LegacyOpenAIInput
) { ) {
super(fields, configuration) super(fields, configuration)
this.id = id
this.multiModalOption = fields?.multiModalOption this.multiModalOption = fields?.multiModalOption
this.configuredModel = fields?.modelName ?? 'gpt-3.5-turbo' this.configuredModel = fields?.modelName ?? 'gpt-3.5-turbo'
this.configuredMaxToken = fields?.maxTokens this.configuredMaxToken = fields?.maxTokens
@ -33,15 +46,15 @@ export class ChatOpenAI extends LangchainChatOpenAI {
} }
async generate(messages: BaseMessageLike[][], options?: string[] | ChatOpenAICallOptions, callbacks?: Callbacks): Promise<LLMResult> { async generate(messages: BaseMessageLike[][], options?: string[] | ChatOpenAICallOptions, callbacks?: Callbacks): Promise<LLMResult> {
if (ChatOpenAI.chainNodeData && ChatOpenAI.chainNodeOptions) { if (ChatOpenAI.chainNodeDataOptions.has(this.id)) {
await this.injectMultiModalMessages(messages) await this.injectMultiModalMessages(messages, ChatOpenAI.chainNodeDataOptions.get(this.id) as MultiModalOptions)
} }
return super.generate(messages, options, callbacks) return super.generate(messages, options, callbacks)
} }
private async injectMultiModalMessages(messages: BaseMessageLike[][]) { private async injectMultiModalMessages(messages: BaseMessageLike[][], nodeOptions: MultiModalOptions) {
const nodeData = ChatOpenAI.chainNodeData const nodeData = nodeOptions.chainNodeData
const optionsData = ChatOpenAI.chainNodeOptions const optionsData = nodeOptions.chainNodeOptions
const messageContent = addImagesToMessages(nodeData, optionsData, this.multiModalOption) const messageContent = addImagesToMessages(nodeData, optionsData, this.multiModalOption)
if (messageContent?.length) { if (messageContent?.length) {
if (messages[0].length > 0 && messages[0][messages[0].length - 1] instanceof HumanMessage) { if (messages[0].length > 0 && messages[0][messages[0].length - 1] instanceof HumanMessage) {

View File

@ -12,8 +12,7 @@ export const injectChainNodeData = (nodeData: INodeData, options: ICommonObject)
if (model instanceof ChatOpenAI) { 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 // 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.injectChainNodeData(nodeData, options)
ChatOpenAI.chainNodeData = nodeData
} }
} }