@langchain/core
Version:
Core LangChain.js abstractions and schemas
1 lines • 54.1 kB
Source Map (JSON)
{"version":3,"file":"chat.cjs","names":["Runnable","input: RunInput","options?: BaseCallbackConfig","input","fields:\n | Extract<keyof RunInput, string>\n | MessagesPlaceholderFields<Extract<keyof RunInput, string>>","values: TypedPromptInputValues<RunInput>","coerceMessageLikeToMessage","e: any","fields:\n | MessageStringPromptTemplateFields<\n InputValues<Extract<keyof RunInput, string>>\n >\n | BaseStringPromptTemplate<\n InputValues<Extract<keyof RunInput, string>>,\n string\n >","BasePromptTemplate","input: BasePromptTemplateInput<RunInput, PartialVariableName>","ChatPromptValue","fields:\n | ChatMessagePromptTemplateFields<\n InputValues<Extract<keyof RunInput, string>>\n >\n | BaseStringPromptTemplate<InputValues<Extract<keyof RunInput, string>>>","role?: string","values: RunInput","ChatMessage","template: T","role: string","options?: { templateFormat?: TemplateFormat }","PromptTemplate","param: unknown","fields: any","additionalOptions?: _StringImageMessagePromptTemplateOptions","inputVariables: Extract<keyof RunInput, string>[]","content: MessageContent","name: string","template:\n | string\n | Array<\n | string\n | _TextTemplateParam\n | _ImageTemplateParam\n | Record<string, unknown>\n >","prompt: Array<\n | PromptTemplate<InputValues>\n | ImagePromptTemplate<InputValues>\n | DictPromptTemplate\n >","imgTemplateObject: ImagePromptTemplate<InputValues>","inputVariables: string[]","parsedTemplate: ParsedTemplateNode[]","parseMustache","parseFString","item","ImagePromptTemplate","DictPromptTemplate","input: TypedPromptInputValues<RunInput>","BaseStringPromptTemplate","inputs: Record<string, any>","additionalContentFields: ContentBlock | undefined","HumanMessage","AIMessage","SystemMessage","baseMessagePromptTemplateLike: BaseMessagePromptTemplateLike","messagePromptTemplateLike: BaseMessagePromptTemplateLike","extra?: Extra","isBaseMessage","templateData:\n | string\n | (\n | string\n | _TextTemplateParam\n | _ImageTemplateParam\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>\n )[]","x: BaseMessagePromptTemplate | BaseMessage","input: ChatPromptTemplateInput<RunInput, PartialVariableName>","BaseMessage","message: BaseMessage","inputValues: InputValues<\n PartialVariableName | Extract<keyof RunInput, string>\n >","resultMessages: BaseMessage[]","inputValues: InputValues","addLangChainErrorFields","values: PartialValues<NewPartialVariableName>","options?: Omit<\n PromptTemplateInput<RunInput, string, TemplateFormat>,\n \"template\" | \"inputVariables\"\n >","promptMessages: (\n | ChatPromptTemplate<InputValues, string>\n | BaseMessagePromptTemplateLike\n )[]","extra?: Omit<\n Extra,\n \"inputVariables\" | \"promptMessages\" | \"partialVariables\"\n >","acc: Array<BaseMessagePromptTemplate | BaseMessage>"],"sources":["../../src/prompts/chat.ts"],"sourcesContent":["// Default generic \"any\" values are for backwards compatibility.\n// Replace with \"string\" when we are comfortable with a breaking change.\n\nimport type { BaseCallbackConfig } from \"../callbacks/manager.js\";\nimport {\n AIMessage,\n HumanMessage,\n SystemMessage,\n BaseMessage,\n ChatMessage,\n type BaseMessageLike,\n coerceMessageLikeToMessage,\n isBaseMessage,\n MessageContent,\n ContentBlock,\n} from \"../messages/index.js\";\nimport {\n type ChatPromptValueInterface,\n ChatPromptValue,\n} from \"../prompt_values.js\";\nimport type { InputValues, PartialValues } from \"../utils/types/index.js\";\nimport { Runnable } from \"../runnables/base.js\";\nimport { BaseStringPromptTemplate } from \"./string.js\";\nimport {\n BasePromptTemplate,\n type BasePromptTemplateInput,\n type TypedPromptInputValues,\n} from \"./base.js\";\nimport {\n PromptTemplate,\n type ParamsFromFString,\n PromptTemplateInput,\n ExtractedFStringParams,\n} from \"./prompt.js\";\nimport { ImagePromptTemplate } from \"./image.js\";\nimport {\n ParsedTemplateNode,\n TemplateFormat,\n parseFString,\n parseMustache,\n} from \"./template.js\";\nimport { addLangChainErrorFields } from \"../errors/index.js\";\nimport { DictPromptTemplate } from \"./dict.js\";\n\n/**\n * Abstract class that serves as a base for creating message prompt\n * templates. It defines how to format messages for different roles in a\n * conversation.\n */\nexport abstract class BaseMessagePromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n RunOutput extends BaseMessage[] = BaseMessage[]\n> extends Runnable<RunInput, RunOutput> {\n lc_namespace = [\"langchain_core\", \"prompts\", \"chat\"];\n\n lc_serializable = true;\n\n abstract inputVariables: Array<Extract<keyof RunInput, string>>;\n\n /**\n * Method that takes an object of TypedPromptInputValues and returns a\n * promise that resolves to an array of BaseMessage instances.\n * @param values Object of TypedPromptInputValues\n * @returns Formatted array of BaseMessages\n */\n abstract formatMessages(\n values: TypedPromptInputValues<RunInput>\n ): Promise<RunOutput>;\n\n /**\n * Calls the formatMessages method with the provided input and options.\n * @param input Input for the formatMessages method\n * @param options Optional BaseCallbackConfig\n * @returns Formatted output messages\n */\n async invoke(\n input: RunInput,\n options?: BaseCallbackConfig\n ): Promise<RunOutput> {\n return this._callWithConfig(\n (input: RunInput) => this.formatMessages(input),\n input,\n { ...options, runType: \"prompt\" }\n );\n }\n}\n\n/**\n * Interface for the fields of a MessagePlaceholder.\n */\nexport interface MessagesPlaceholderFields<T extends string> {\n variableName: T;\n optional?: boolean;\n}\n\n/**\n * Class that represents a placeholder for messages in a chat prompt. It\n * extends the BaseMessagePromptTemplate.\n */\nexport class MessagesPlaceholder<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any\n >\n extends BaseMessagePromptTemplate<RunInput>\n implements MessagesPlaceholderFields<Extract<keyof RunInput, string>>\n{\n static lc_name() {\n return \"MessagesPlaceholder\";\n }\n\n variableName: Extract<keyof RunInput, string>;\n\n optional: boolean;\n\n constructor(variableName: Extract<keyof RunInput, string>);\n\n constructor(\n fields: MessagesPlaceholderFields<Extract<keyof RunInput, string>>\n );\n\n constructor(\n fields:\n | Extract<keyof RunInput, string>\n | MessagesPlaceholderFields<Extract<keyof RunInput, string>>\n ) {\n if (typeof fields === \"string\") {\n // eslint-disable-next-line no-param-reassign\n fields = { variableName: fields };\n }\n super(fields);\n this.variableName = fields.variableName;\n this.optional = fields.optional ?? false;\n }\n\n get inputVariables() {\n return [this.variableName];\n }\n\n async formatMessages(\n values: TypedPromptInputValues<RunInput>\n ): Promise<BaseMessage[]> {\n const input = values[this.variableName];\n if (this.optional && !input) {\n return [];\n } else if (!input) {\n const error = new Error(\n `Field \"${this.variableName}\" in prompt uses a MessagesPlaceholder, which expects an array of BaseMessages as an input value. Received: undefined`\n );\n error.name = \"InputFormatError\";\n throw error;\n }\n\n let formattedMessages;\n try {\n if (Array.isArray(input)) {\n formattedMessages = input.map(coerceMessageLikeToMessage);\n } else {\n formattedMessages = [coerceMessageLikeToMessage(input)];\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n const readableInput =\n typeof input === \"string\" ? input : JSON.stringify(input, null, 2);\n const error = new Error(\n [\n `Field \"${this.variableName}\" in prompt uses a MessagesPlaceholder, which expects an array of BaseMessages or coerceable values as input.`,\n `Received value: ${readableInput}`,\n `Additional message: ${e.message}`,\n ].join(\"\\n\\n\")\n );\n error.name = \"InputFormatError\";\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).lc_error_code = e.lc_error_code;\n throw error;\n }\n\n return formattedMessages;\n }\n}\n\n/**\n * Interface for the fields of a MessageStringPromptTemplate.\n */\nexport interface MessageStringPromptTemplateFields<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends InputValues = any\n> {\n prompt: BaseStringPromptTemplate<T, string>;\n}\n\n/**\n * Abstract class that serves as a base for creating message string prompt\n * templates. It extends the BaseMessagePromptTemplate.\n */\nexport abstract class BaseMessageStringPromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any\n> extends BaseMessagePromptTemplate<RunInput> {\n prompt: BaseStringPromptTemplate<\n InputValues<Extract<keyof RunInput, string>>,\n string\n >;\n\n constructor(\n prompt: BaseStringPromptTemplate<\n InputValues<Extract<keyof RunInput, string>>\n >\n );\n\n constructor(\n fields: MessageStringPromptTemplateFields<\n InputValues<Extract<keyof RunInput, string>>\n >\n );\n\n constructor(\n fields:\n | MessageStringPromptTemplateFields<\n InputValues<Extract<keyof RunInput, string>>\n >\n | BaseStringPromptTemplate<\n InputValues<Extract<keyof RunInput, string>>,\n string\n >\n ) {\n if (!(\"prompt\" in fields)) {\n // eslint-disable-next-line no-param-reassign\n fields = { prompt: fields };\n }\n super(fields);\n this.prompt = fields.prompt;\n }\n\n get inputVariables() {\n return this.prompt.inputVariables;\n }\n\n abstract format(\n values: TypedPromptInputValues<RunInput>\n ): Promise<BaseMessage>;\n\n async formatMessages(\n values: TypedPromptInputValues<RunInput>\n ): Promise<BaseMessage[]> {\n return [await this.format(values)];\n }\n}\n\n/**\n * Abstract class that serves as a base for creating chat prompt\n * templates. It extends the BasePromptTemplate.\n */\nexport abstract class BaseChatPromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n PartialVariableName extends string = any\n> extends BasePromptTemplate<\n RunInput,\n ChatPromptValueInterface,\n PartialVariableName\n> {\n constructor(input: BasePromptTemplateInput<RunInput, PartialVariableName>) {\n super(input);\n }\n\n abstract formatMessages(\n values: TypedPromptInputValues<RunInput>\n ): Promise<BaseMessage[]>;\n\n async format(values: TypedPromptInputValues<RunInput>): Promise<string> {\n return (await this.formatPromptValue(values)).toString();\n }\n\n async formatPromptValue(\n values: TypedPromptInputValues<RunInput>\n ): Promise<ChatPromptValueInterface> {\n const resultMessages = await this.formatMessages(values);\n return new ChatPromptValue(resultMessages);\n }\n}\n\n/**\n * Interface for the fields of a ChatMessagePromptTemplate.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface ChatMessagePromptTemplateFields<T extends InputValues = any>\n extends MessageStringPromptTemplateFields<T> {\n role: string;\n}\n\n/**\n * Class that represents a chat message prompt template. It extends the\n * BaseMessageStringPromptTemplate.\n */\nexport class ChatMessagePromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any\n> extends BaseMessageStringPromptTemplate<RunInput> {\n static lc_name() {\n return \"ChatMessagePromptTemplate\";\n }\n\n role: string;\n\n constructor(\n prompt: BaseStringPromptTemplate<\n InputValues<Extract<keyof RunInput, string>>\n >,\n role: string\n );\n\n constructor(\n fields: ChatMessagePromptTemplateFields<\n InputValues<Extract<keyof RunInput, string>>\n >\n );\n\n constructor(\n fields:\n | ChatMessagePromptTemplateFields<\n InputValues<Extract<keyof RunInput, string>>\n >\n | BaseStringPromptTemplate<InputValues<Extract<keyof RunInput, string>>>,\n role?: string\n ) {\n if (!(\"prompt\" in fields)) {\n // eslint-disable-next-line no-param-reassign\n fields = { prompt: fields, role: role! };\n }\n super(fields);\n this.role = fields.role;\n }\n\n async format(values: RunInput): Promise<BaseMessage> {\n return new ChatMessage(await this.prompt.format(values), this.role);\n }\n\n static fromTemplate<\n RunInput extends InputValues = Symbol,\n T extends string = string\n >(template: T, role: string, options?: { templateFormat?: TemplateFormat }) {\n return new this(\n PromptTemplate.fromTemplate<RunInput, T>(template, {\n templateFormat: options?.templateFormat,\n }),\n role\n );\n }\n}\n\ninterface _TextTemplateParam {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n text?: string | Record<string, any>;\n}\n\nfunction isTextTemplateParam(param: unknown): param is _TextTemplateParam {\n if (param === null || typeof param !== \"object\" || Array.isArray(param)) {\n return false;\n }\n return (\n Object.keys(param).length === 1 &&\n \"text\" in param &&\n typeof param.text === \"string\"\n );\n}\n\ninterface _ImageTemplateParam {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n image_url?: string | Record<string, any>;\n}\n\nfunction isImageTemplateParam(param: unknown): param is _ImageTemplateParam {\n if (param === null || typeof param !== \"object\" || Array.isArray(param)) {\n return false;\n }\n return (\n \"image_url\" in param &&\n (typeof param.image_url === \"string\" ||\n (typeof param.image_url === \"object\" &&\n param.image_url !== null &&\n \"url\" in param.image_url &&\n typeof param.image_url.url === \"string\"))\n );\n}\n\ntype MessageClass =\n | typeof HumanMessage\n | typeof AIMessage\n | typeof SystemMessage;\n\ntype ChatMessageClass = typeof ChatMessage;\n\ninterface _StringImageMessagePromptTemplateOptions<\n Format extends TemplateFormat = TemplateFormat\n> extends Record<string, unknown> {\n templateFormat?: Format;\n}\n\nclass _StringImageMessagePromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n RunOutput extends BaseMessage[] = BaseMessage[]\n> extends BaseMessagePromptTemplate<RunInput, RunOutput> {\n lc_namespace = [\"langchain_core\", \"prompts\", \"chat\"];\n\n lc_serializable = true;\n\n inputVariables: Array<Extract<keyof RunInput, string>> = [];\n\n additionalOptions: _StringImageMessagePromptTemplateOptions = {};\n\n prompt:\n | BaseStringPromptTemplate<\n InputValues<Extract<keyof RunInput, string>>,\n string\n >\n | Array<\n | BaseStringPromptTemplate<\n InputValues<Extract<keyof RunInput, string>>,\n string\n >\n | ImagePromptTemplate<\n InputValues<Extract<keyof RunInput, string>>,\n string\n >\n | MessageStringPromptTemplateFields<\n InputValues<Extract<keyof RunInput, string>>\n >\n | DictPromptTemplate<InputValues<Extract<keyof RunInput, string>>>\n >;\n\n protected messageClass?: MessageClass;\n\n static _messageClass(): MessageClass {\n throw new Error(\n \"Can not invoke _messageClass from inside _StringImageMessagePromptTemplate\"\n );\n }\n\n // ChatMessage contains role field, others don't.\n // Because of this, we have a separate class property for ChatMessage.\n protected chatMessageClass?: ChatMessageClass;\n\n constructor(\n /** @TODO When we come up with a better way to type prompt templates, fix this */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fields: any,\n additionalOptions?: _StringImageMessagePromptTemplateOptions\n ) {\n if (!(\"prompt\" in fields)) {\n // eslint-disable-next-line no-param-reassign\n fields = { prompt: fields };\n }\n super(fields);\n this.prompt = fields.prompt;\n if (Array.isArray(this.prompt)) {\n let inputVariables: Extract<keyof RunInput, string>[] = [];\n this.prompt.forEach((prompt) => {\n if (\"inputVariables\" in prompt) {\n inputVariables = inputVariables.concat(prompt.inputVariables);\n }\n });\n this.inputVariables = inputVariables;\n } else {\n this.inputVariables = this.prompt.inputVariables;\n }\n this.additionalOptions = additionalOptions ?? this.additionalOptions;\n }\n\n createMessage(content: MessageContent) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const constructor = this.constructor as any;\n if (constructor._messageClass()) {\n const MsgClass = constructor._messageClass();\n return new MsgClass({ content });\n } else if (constructor.chatMessageClass) {\n const MsgClass = constructor.chatMessageClass();\n // Assuming ChatMessage constructor also takes a content argument\n return new MsgClass({\n content,\n role: this.getRoleFromMessageClass(MsgClass.lc_name()),\n });\n } else {\n throw new Error(\"No message class defined\");\n }\n }\n\n getRoleFromMessageClass(name: string) {\n switch (name) {\n case \"HumanMessage\":\n return \"human\";\n case \"AIMessage\":\n return \"ai\";\n case \"SystemMessage\":\n return \"system\";\n case \"ChatMessage\":\n return \"chat\";\n default:\n throw new Error(\"Invalid message class name\");\n }\n }\n\n static fromTemplate(\n template:\n | string\n | Array<\n | string\n | _TextTemplateParam\n | _ImageTemplateParam\n | Record<string, unknown>\n >,\n additionalOptions?: _StringImageMessagePromptTemplateOptions\n ) {\n if (typeof template === \"string\") {\n return new this(PromptTemplate.fromTemplate(template, additionalOptions));\n }\n const prompt: Array<\n | PromptTemplate<InputValues>\n | ImagePromptTemplate<InputValues>\n | DictPromptTemplate\n > = [];\n for (const item of template) {\n // handle string cases\n if (typeof item === \"string\") {\n prompt.push(PromptTemplate.fromTemplate(item, additionalOptions));\n } else if (item === null) {\n // pass\n } else if (isTextTemplateParam(item)) {\n let text = \"\";\n if (typeof item.text === \"string\") {\n text = item.text ?? \"\";\n }\n\n const options = {\n ...additionalOptions,\n additionalContentFields: item as ContentBlock,\n };\n prompt.push(PromptTemplate.fromTemplate(text, options));\n } else if (isImageTemplateParam(item)) {\n let imgTemplate = item.image_url ?? \"\";\n let imgTemplateObject: ImagePromptTemplate<InputValues>;\n let inputVariables: string[] = [];\n if (typeof imgTemplate === \"string\") {\n let parsedTemplate: ParsedTemplateNode[];\n if (additionalOptions?.templateFormat === \"mustache\") {\n parsedTemplate = parseMustache(imgTemplate);\n } else {\n parsedTemplate = parseFString(imgTemplate);\n }\n\n const variables = parsedTemplate.flatMap((item) =>\n item.type === \"variable\" ? [item.name] : []\n );\n\n if ((variables?.length ?? 0) > 0) {\n if (variables.length > 1) {\n throw new Error(\n `Only one format variable allowed per image template.\\nGot: ${variables}\\nFrom: ${imgTemplate}`\n );\n }\n inputVariables = [variables[0]];\n } else {\n inputVariables = [];\n }\n\n imgTemplate = { url: imgTemplate };\n imgTemplateObject = new ImagePromptTemplate<InputValues>({\n template: imgTemplate,\n inputVariables,\n templateFormat: additionalOptions?.templateFormat,\n additionalContentFields: item as ContentBlock,\n });\n } else if (typeof imgTemplate === \"object\") {\n if (\"url\" in imgTemplate) {\n let parsedTemplate: ParsedTemplateNode[];\n if (additionalOptions?.templateFormat === \"mustache\") {\n parsedTemplate = parseMustache(imgTemplate.url);\n } else {\n parsedTemplate = parseFString(imgTemplate.url);\n }\n\n inputVariables = parsedTemplate.flatMap((item) =>\n item.type === \"variable\" ? [item.name] : []\n );\n } else {\n inputVariables = [];\n }\n imgTemplateObject = new ImagePromptTemplate<InputValues>({\n template: imgTemplate,\n inputVariables,\n templateFormat: additionalOptions?.templateFormat,\n additionalContentFields: item as ContentBlock,\n });\n } else {\n throw new Error(\"Invalid image template\");\n }\n prompt.push(imgTemplateObject);\n } else if (typeof item === \"object\") {\n prompt.push(\n new DictPromptTemplate({\n template: item,\n templateFormat: additionalOptions?.templateFormat,\n })\n );\n }\n }\n return new this({ prompt, additionalOptions });\n }\n\n async format(input: TypedPromptInputValues<RunInput>): Promise<BaseMessage> {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (this.prompt instanceof BaseStringPromptTemplate) {\n const text = await this.prompt.format(input);\n\n return this.createMessage(text);\n } else {\n const content: MessageContent = [];\n for (const prompt of this.prompt) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let inputs: Record<string, any> = {};\n if (!(\"inputVariables\" in prompt)) {\n throw new Error(\n `Prompt ${prompt} does not have inputVariables defined.`\n );\n }\n for (const item of prompt.inputVariables) {\n if (!inputs) {\n inputs = { [item]: input[item] };\n }\n inputs = { ...inputs, [item]: input[item] };\n }\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (prompt instanceof BaseStringPromptTemplate) {\n const formatted = await prompt.format(\n inputs as TypedPromptInputValues<RunInput>\n );\n let additionalContentFields: ContentBlock | undefined;\n if (\"additionalContentFields\" in prompt) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additionalContentFields = prompt.additionalContentFields as any;\n }\n if (formatted !== \"\") {\n content.push({\n ...additionalContentFields,\n type: \"text\",\n text: formatted,\n });\n }\n /** @TODO replace this */\n // eslint-disable-next-line no-instanceof/no-instanceof\n } else if (prompt instanceof ImagePromptTemplate) {\n const formatted = await prompt.format(\n inputs as TypedPromptInputValues<RunInput>\n );\n let additionalContentFields: ContentBlock | undefined;\n if (\"additionalContentFields\" in prompt) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additionalContentFields = prompt.additionalContentFields as any;\n }\n content.push({\n ...additionalContentFields,\n type: \"image_url\",\n image_url: formatted,\n });\n // eslint-disable-next-line no-instanceof/no-instanceof\n } else if (prompt instanceof DictPromptTemplate) {\n const formatted = await prompt.format(\n inputs as TypedPromptInputValues<RunInput>\n );\n let additionalContentFields: ContentBlock | undefined;\n if (\"additionalContentFields\" in prompt) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additionalContentFields = prompt.additionalContentFields as any;\n }\n content.push({\n ...additionalContentFields,\n ...formatted,\n } as ContentBlock);\n }\n }\n return this.createMessage(content);\n }\n }\n\n async formatMessages(values: RunInput): Promise<RunOutput> {\n return [await this.format(values)] as BaseMessage[] as RunOutput;\n }\n}\n\n/**\n * Class that represents a human message prompt template. It extends the\n * BaseMessageStringPromptTemplate.\n * @example\n * ```typescript\n * const message = HumanMessagePromptTemplate.fromTemplate(\"{text}\");\n * const formatted = await message.format({ text: \"Hello world!\" });\n *\n * const chatPrompt = ChatPromptTemplate.fromMessages([message]);\n * const formattedChatPrompt = await chatPrompt.invoke({\n * text: \"Hello world!\",\n * });\n * ```\n */\nexport class HumanMessagePromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any\n> extends _StringImageMessagePromptTemplate<RunInput> {\n static _messageClass(): typeof HumanMessage {\n return HumanMessage;\n }\n\n static lc_name() {\n return \"HumanMessagePromptTemplate\";\n }\n}\n\n/**\n * Class that represents an AI message prompt template. It extends the\n * BaseMessageStringPromptTemplate.\n */\nexport class AIMessagePromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any\n> extends _StringImageMessagePromptTemplate<RunInput> {\n static _messageClass(): typeof AIMessage {\n return AIMessage;\n }\n\n static lc_name() {\n return \"AIMessagePromptTemplate\";\n }\n}\n\n/**\n * Class that represents a system message prompt template. It extends the\n * BaseMessageStringPromptTemplate.\n * @example\n * ```typescript\n * const message = SystemMessagePromptTemplate.fromTemplate(\"{text}\");\n * const formatted = await message.format({ text: \"Hello world!\" });\n *\n * const chatPrompt = ChatPromptTemplate.fromMessages([message]);\n * const formattedChatPrompt = await chatPrompt.invoke({\n * text: \"Hello world!\",\n * });\n * ```\n */\nexport class SystemMessagePromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any\n> extends _StringImageMessagePromptTemplate<RunInput> {\n static _messageClass(): typeof SystemMessage {\n return SystemMessage;\n }\n\n static lc_name() {\n return \"SystemMessagePromptTemplate\";\n }\n}\n\n/**\n * Interface for the input of a ChatPromptTemplate.\n */\nexport interface ChatPromptTemplateInput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n PartialVariableName extends string = any\n> extends BasePromptTemplateInput<RunInput, PartialVariableName> {\n /**\n * The prompt messages\n */\n promptMessages: Array<BaseMessagePromptTemplate | BaseMessage>;\n\n /**\n * Whether to try validating the template on initialization\n *\n * @defaultValue `true`\n */\n validateTemplate?: boolean;\n\n /**\n * The formatting method to use on the prompt.\n * @default \"f-string\"\n */\n templateFormat?: TemplateFormat;\n}\n\nexport type BaseMessagePromptTemplateLike =\n | BaseMessagePromptTemplate\n | BaseMessageLike;\n\nfunction _isBaseMessagePromptTemplate(\n baseMessagePromptTemplateLike: BaseMessagePromptTemplateLike\n): baseMessagePromptTemplateLike is BaseMessagePromptTemplate {\n return (\n typeof (baseMessagePromptTemplateLike as BaseMessagePromptTemplate)\n .formatMessages === \"function\"\n );\n}\n\nfunction _coerceMessagePromptTemplateLike<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n Extra extends Omit<\n ChatPromptTemplateInput<RunInput>,\n \"inputVariables\" | \"promptMessages\" | \"partialVariables\"\n > = Omit<\n ChatPromptTemplateInput<RunInput>,\n \"inputVariables\" | \"promptMessages\" | \"partialVariables\"\n >\n>(\n messagePromptTemplateLike: BaseMessagePromptTemplateLike,\n extra?: Extra\n): BaseMessagePromptTemplate | BaseMessage {\n if (\n _isBaseMessagePromptTemplate(messagePromptTemplateLike) ||\n isBaseMessage(messagePromptTemplateLike)\n ) {\n return messagePromptTemplateLike;\n }\n if (\n Array.isArray(messagePromptTemplateLike) &&\n messagePromptTemplateLike[0] === \"placeholder\"\n ) {\n const messageContent = messagePromptTemplateLike[1];\n if (\n extra?.templateFormat === \"mustache\" &&\n typeof messageContent === \"string\" &&\n messageContent.slice(0, 2) === \"{{\" &&\n messageContent.slice(-2) === \"}}\"\n ) {\n const variableName = messageContent.slice(2, -2);\n return new MessagesPlaceholder({ variableName, optional: true });\n } else if (\n typeof messageContent === \"string\" &&\n messageContent[0] === \"{\" &&\n messageContent[messageContent.length - 1] === \"}\"\n ) {\n const variableName = messageContent.slice(1, -1);\n return new MessagesPlaceholder({ variableName, optional: true });\n }\n throw new Error(\n `Invalid placeholder template for format ${\n extra?.templateFormat ?? `\"f-string\"`\n }: \"${\n messagePromptTemplateLike[1]\n }\". Expected a variable name surrounded by ${\n extra?.templateFormat === \"mustache\" ? \"double\" : \"single\"\n } curly braces.`\n );\n }\n const message = coerceMessageLikeToMessage(messagePromptTemplateLike);\n let templateData:\n | string\n | (\n | string\n | _TextTemplateParam\n | _ImageTemplateParam\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>\n )[];\n\n if (typeof message.content === \"string\") {\n templateData = message.content;\n } else {\n // Assuming message.content is an array of complex objects, transform it.\n templateData = message.content.map((item) => {\n if (\"text\" in item) {\n return { ...item, text: item.text };\n } else if (\"image_url\" in item) {\n return { ...item, image_url: item.image_url };\n } else {\n return item;\n }\n });\n }\n\n if (message._getType() === \"human\") {\n return HumanMessagePromptTemplate.fromTemplate(templateData, extra);\n } else if (message._getType() === \"ai\") {\n return AIMessagePromptTemplate.fromTemplate(templateData, extra);\n } else if (message._getType() === \"system\") {\n return SystemMessagePromptTemplate.fromTemplate(templateData, extra);\n } else if (ChatMessage.isInstance(message)) {\n return ChatMessagePromptTemplate.fromTemplate(\n message.content as string,\n message.role,\n extra\n );\n } else {\n throw new Error(\n `Could not coerce message prompt template from input. Received message type: \"${message._getType()}\".`\n );\n }\n}\n\nfunction isMessagesPlaceholder(\n x: BaseMessagePromptTemplate | BaseMessage\n): x is MessagesPlaceholder {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (x.constructor as any).lc_name() === \"MessagesPlaceholder\";\n}\n\n/**\n * Class that represents a chat prompt. It extends the\n * BaseChatPromptTemplate and uses an array of BaseMessagePromptTemplate\n * instances to format a series of messages for a conversation.\n * @example\n * ```typescript\n * const message = SystemMessagePromptTemplate.fromTemplate(\"{text}\");\n * const chatPrompt = ChatPromptTemplate.fromMessages([\n * [\"ai\", \"You are a helpful assistant.\"],\n * message,\n * ]);\n * const formattedChatPrompt = await chatPrompt.invoke({\n * text: \"Hello world!\",\n * });\n * ```\n */\nexport class ChatPromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n PartialVariableName extends string = any\n >\n extends BaseChatPromptTemplate<RunInput, PartialVariableName>\n implements ChatPromptTemplateInput<RunInput, PartialVariableName>\n{\n static lc_name() {\n return \"ChatPromptTemplate\";\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n promptMessages: \"messages\",\n };\n }\n\n promptMessages: Array<BaseMessagePromptTemplate | BaseMessage>;\n\n validateTemplate = true;\n\n templateFormat: TemplateFormat = \"f-string\";\n\n constructor(input: ChatPromptTemplateInput<RunInput, PartialVariableName>) {\n super(input);\n // If input is mustache and validateTemplate is not defined, set it to false\n if (\n input.templateFormat === \"mustache\" &&\n input.validateTemplate === undefined\n ) {\n this.validateTemplate = false;\n }\n Object.assign(this, input);\n\n if (this.validateTemplate) {\n const inputVariablesMessages = new Set<string>();\n for (const promptMessage of this.promptMessages) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (promptMessage instanceof BaseMessage) continue;\n for (const inputVariable of promptMessage.inputVariables) {\n inputVariablesMessages.add(inputVariable);\n }\n }\n\n const totalInputVariables = this.inputVariables as string[];\n const inputVariablesInstance = new Set(\n this.partialVariables\n ? totalInputVariables.concat(Object.keys(this.partialVariables))\n : totalInputVariables\n );\n const difference = new Set(\n [...inputVariablesInstance].filter(\n (x) => !inputVariablesMessages.has(x)\n )\n );\n if (difference.size > 0) {\n throw new Error(\n `Input variables \\`${[\n ...difference,\n ]}\\` are not used in any of the prompt messages.`\n );\n }\n const otherDifference = new Set(\n [...inputVariablesMessages].filter(\n (x) => !inputVariablesInstance.has(x)\n )\n );\n if (otherDifference.size > 0) {\n throw new Error(\n `Input variables \\`${[\n ...otherDifference,\n ]}\\` are used in prompt messages but not in the prompt template.`\n );\n }\n }\n }\n\n _getPromptType(): \"chat\" {\n return \"chat\";\n }\n\n private async _parseImagePrompts(\n message: BaseMessage,\n inputValues: InputValues<\n PartialVariableName | Extract<keyof RunInput, string>\n >\n ): Promise<BaseMessage> {\n if (typeof message.content === \"string\") {\n return message;\n }\n const formattedMessageContent = await Promise.all(\n message.content.map(async (item) => {\n if (item.type !== \"image_url\") {\n return item;\n }\n\n let imageUrl = \"\";\n if (typeof item.image_url === \"string\") {\n imageUrl = item.image_url;\n } else if (\n typeof item.image_url === \"object\" &&\n item.image_url !== null &&\n \"url\" in item.image_url &&\n typeof item.image_url.url === \"string\"\n ) {\n imageUrl = item.image_url.url;\n }\n\n const promptTemplatePlaceholder = PromptTemplate.fromTemplate(\n imageUrl,\n {\n templateFormat: this.templateFormat,\n }\n );\n const formattedUrl = await promptTemplatePlaceholder.format(\n inputValues\n );\n\n if (\n typeof item.image_url === \"object\" &&\n item.image_url !== null &&\n \"url\" in item.image_url\n ) {\n // eslint-disable-next-line no-param-reassign\n item.image_url.url = formattedUrl;\n } else {\n item.image_url = formattedUrl;\n }\n return item;\n })\n );\n message.content = formattedMessageContent;\n return message;\n }\n\n async formatMessages(\n values: TypedPromptInputValues<RunInput>\n ): Promise<BaseMessage[]> {\n const allValues = await this.mergePartialAndUserVariables(values);\n let resultMessages: BaseMessage[] = [];\n\n for (const promptMessage of this.promptMessages) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (promptMessage instanceof BaseMessage) {\n resultMessages.push(\n await this._parseImagePrompts(promptMessage, allValues)\n );\n } else {\n let inputValues: InputValues;\n\n if (this.templateFormat === \"mustache\") {\n inputValues = { ...allValues };\n } else {\n inputValues = promptMessage.inputVariables.reduce(\n (acc, inputVariable) => {\n if (\n !(inputVariable in allValues) &&\n !(\n isMessagesPlaceholder(promptMessage) && promptMessage.optional\n )\n ) {\n const error = addLangChainErrorFields(\n new Error(\n `Missing value for input variable \\`${inputVariable.toString()}\\``\n ),\n \"INVALID_PROMPT_INPUT\"\n );\n throw error;\n }\n acc[inputVariable] = allValues[inputVariable];\n return acc;\n },\n {} as InputValues\n );\n }\n const message = await promptMessage.formatMessages(inputValues);\n resultMessages = resultMessages.concat(message);\n }\n }\n return resultMessages;\n }\n\n async partial<NewPartialVariableName extends string>(\n values: PartialValues<NewPartialVariableName>\n ) {\n // This is implemented in a way it doesn't require making\n // BaseMessagePromptTemplate aware of .partial()\n const newInputVariables = this.inputVariables.filter(\n (iv) => !(iv in values)\n ) as Exclude<Extract<keyof RunInput, string>, NewPartialVariableName>[];\n const newPartialVariables = {\n ...(this.partialVariables ?? {}),\n ...values,\n } as PartialValues<PartialVariableName | NewPartialVariableName>;\n const promptDict = {\n ...this,\n inputVariables: newInputVariables,\n partialVariables: newPartialVariables,\n };\n return new ChatPromptTemplate<\n InputValues<\n Exclude<Extract<keyof RunInput, string>, NewPartialVariableName>\n >\n >(promptDict);\n }\n\n /**\n * Load prompt template from a template f-string\n */\n static fromTemplate<\n RunInput extends InputValues = Symbol,\n T extends string = string\n >(\n template: T,\n options?: Omit<\n PromptTemplateInput<RunInput, string, \"f-string\">,\n \"template\" | \"inputVariables\"\n >\n ): ChatPromptTemplate<ExtractedFStringParams<T, RunInput>>;\n\n static fromTemplate<\n RunInput extends InputValues = Symbol,\n T extends string = string\n >(\n template: T,\n options?: Omit<\n PromptTemplateInput<RunInput, string>,\n \"template\" | \"inputVariables\"\n >\n ): ChatPromptTemplate<ExtractedFStringParams<T, RunInput>>;\n\n static fromTemplate<\n RunInput extends InputValues = Symbol,\n T extends string = string\n >(\n template: T,\n options?: Omit<\n PromptTemplateInput<RunInput, string, \"mustache\">,\n \"template\" | \"inputVariables\"\n >\n ): ChatPromptTemplate<InputValues>;\n\n static fromTemplate<\n RunInput extends InputValues = Symbol,\n T extends string = string\n >(\n template: T,\n options?: Omit<\n PromptTemplateInput<RunInput, string, TemplateFormat>,\n \"template\" | \"inputVariables\"\n >\n ): ChatPromptTemplate<ExtractedFStringParams<T, RunInput> | InputValues> {\n const prompt = PromptTemplate.fromTemplate(template, options);\n const humanTemplate = new HumanMessagePromptTemplate({ prompt });\n return this.fromMessages<\n RunInput extends Symbol ? ParamsFromFString<T> : RunInput\n >([humanTemplate]);\n }\n\n /**\n * Create a chat model-specific prompt from individual chat messages\n * or message-like tuples.\n * @param promptMessages Messages to be passed to the chat model\n * @returns A new ChatPromptTemplate\n */\n static fromMessages<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n Extra extends ChatPromptTemplateInput<RunInput> = ChatPromptTemplateInput<RunInput>\n >(\n promptMessages: (\n | ChatPromptTemplate<InputValues, string>\n | BaseMessagePromptTemplateLike\n )[],\n extra?: Omit<\n Extra,\n \"inputVariables\" | \"promptMessages\" | \"partialVariables\"\n >\n ): ChatPromptTemplate<RunInput> {\n const flattenedMessages = promptMessages.reduce(\n (acc: Array<BaseMessagePromptTemplate | BaseMessage>, promptMessage) =>\n acc.concat(\n // eslint-disable-next-line no-instanceof/no-instanceof\n promptMessage instanceof ChatPromptTemplate\n ? promptMessage.promptMessages\n : [\n _coerceMessagePromptTemplateLike<\n RunInput,\n Omit<\n Extra,\n \"inputVariables\" | \"promptMessages\" | \"partialVariables\"\n >\n >(promptMessage, extra),\n ]\n ),\n []\n );\n const flattenedPartialVariables = promptMessages.reduce(\n (acc, promptMessage) =>\n // eslint-disable-next-line no-instanceof/no-instanceof\n promptMessage instanceof ChatPromptTemplate\n ? Object.assign(acc, promptMessage.partialVariables)\n : acc,\n Object.create(null) as PartialValues\n );\n const inputVariables = new Set<string>();\n for (const promptMessage of flattenedMessages) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (promptMessage instanceof BaseMessage) continue;\n for (const inputVariable of promptMessage.inputVariables) {\n if (inputVariable in flattenedPartialVariables) {\n continue;\n }\n inputVariables.add(inputVariable);\n }\n }\n return new this<RunInput>({\n ...extra,\n inputVariables: [...inputVariables] as Extract<keyof RunInput, string>[],\n promptMessages: flattenedMessages,\n partialVariables: flattenedPartialVariables,\n templateFormat: extra?.templateFormat,\n });\n }\n}\n"],"mappings":"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