{"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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"}