{"version":3,"file":"chat.cjs","names":["Runnable","coerceMessageLikeToMessage","BasePromptTemplate","ChatPromptValue","ChatMessage","PromptTemplate","parseMustache","parseFString","ImagePromptTemplate","DictPromptTemplate","BaseStringPromptTemplate","HumanMessage","AIMessage","SystemMessage","isBaseMessage","BaseMessage","addLangChainErrorFields"],"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  // oxlint-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  // oxlint-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      // oxlint-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      // oxlint-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      // oxlint-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  // oxlint-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  // oxlint-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      // oxlint-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  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n  RunInput extends InputValues = any,\n  // oxlint-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 */\nexport interface ChatMessagePromptTemplateFields<\n  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n  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  // oxlint-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      // oxlint-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  // oxlint-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  // oxlint-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  // oxlint-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    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    fields: any,\n    additionalOptions?: _StringImageMessagePromptTemplateOptions\n  ) {\n    if (!(\"prompt\" in fields)) {\n      // oxlint-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    // oxlint-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    // oxlint-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        // oxlint-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        // oxlint-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            // oxlint-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          // oxlint-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            // oxlint-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          // oxlint-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            // oxlint-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  // oxlint-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  // oxlint-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  // oxlint-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  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n  RunInput extends InputValues = any,\n  // oxlint-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  // oxlint-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        // oxlint-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  // oxlint-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  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n  RunInput extends InputValues = any,\n  // oxlint-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        // oxlint-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 =\n          await promptTemplatePlaceholder.format(inputValues);\n\n        if (\n          typeof item.image_url === \"object\" &&\n          item.image_url !== null &&\n          \"url\" in item.image_url\n        ) {\n          // oxlint-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      // oxlint-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    // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n    RunInput extends InputValues = any,\n    Extra extends ChatPromptTemplateInput<RunInput> =\n      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          // oxlint-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        // oxlint-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      // oxlint-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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"}