fix for concurrent requests for media handling
This commit is contained in:
parent
44c1f54d05
commit
a71c5a109d
|
|
@ -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
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue