UNPKG

@langchain/core

Version:
1 lines 8 kB
{"version":3,"file":"pipeline.cjs","names":["BasePromptTemplate","input: PipelinePromptTemplateInput<PromptTemplateType>","allValues: InputValues","requiredValueNames: string[]","values: InputValues","ChatPromptTemplate","values: PartialValues"],"sources":["../../src/prompts/pipeline.ts"],"sourcesContent":["import type { InputValues, PartialValues } from \"../utils/types/index.js\";\nimport type { SerializedBasePromptTemplate } from \"./serde.js\";\nimport { BasePromptTemplate, type BasePromptTemplateInput } from \"./base.js\";\nimport { ChatPromptTemplate } from \"./chat.js\";\n\n/**\n * Type that includes the name of the prompt and the prompt itself.\n */\nexport type PipelinePromptParams<\n PromptTemplateType extends BasePromptTemplate\n> = {\n name: string;\n prompt: PromptTemplateType;\n};\n\n/**\n * Type that extends the BasePromptTemplateInput type, excluding the\n * inputVariables property. It includes an array of pipelinePrompts and a\n * finalPrompt.\n */\nexport type PipelinePromptTemplateInput<\n PromptTemplateType extends BasePromptTemplate\n> = Omit<BasePromptTemplateInput, \"inputVariables\"> & {\n pipelinePrompts: PipelinePromptParams<PromptTemplateType>[];\n finalPrompt: PromptTemplateType;\n};\n\n/**\n * Class that handles a sequence of prompts, each of which may require\n * different input variables. Includes methods for formatting these\n * prompts, extracting required input values, and handling partial\n * prompts.\n * @example\n * ```typescript\n * const composedPrompt = new PipelinePromptTemplate({\n * pipelinePrompts: [\n * {\n * name: \"introduction\",\n * prompt: PromptTemplate.fromTemplate(`You are impersonating {person}.`),\n * },\n * {\n * name: \"example\",\n * prompt: PromptTemplate.fromTemplate(\n * `Here's an example of an interaction:\n * Q: {example_q}\n * A: {example_a}`,\n * ),\n * },\n * {\n * name: \"start\",\n * prompt: PromptTemplate.fromTemplate(\n * `Now, do this for real!\n * Q: {input}\n * A:`,\n * ),\n * },\n * ],\n * finalPrompt: PromptTemplate.fromTemplate(\n * `{introduction}\n * {example}\n * {start}`,\n * ),\n * });\n *\n * const formattedPrompt = await composedPrompt.format({\n * person: \"Elon Musk\",\n * example_q: `What's your favorite car?`,\n * example_a: \"Tesla\",\n * input: `What's your favorite social media site?`,\n * });\n * ```\n */\nexport class PipelinePromptTemplate<\n PromptTemplateType extends BasePromptTemplate\n> extends BasePromptTemplate {\n static lc_name() {\n return \"PipelinePromptTemplate\";\n }\n\n pipelinePrompts: PipelinePromptParams<PromptTemplateType>[];\n\n finalPrompt: PromptTemplateType;\n\n constructor(input: PipelinePromptTemplateInput<PromptTemplateType>) {\n super({ ...input, inputVariables: [] });\n this.pipelinePrompts = input.pipelinePrompts;\n this.finalPrompt = input.finalPrompt;\n this.inputVariables = this.computeInputValues();\n }\n\n /**\n * Computes the input values required by the pipeline prompts.\n * @returns Array of input values required by the pipeline prompts.\n */\n protected computeInputValues() {\n const intermediateValues = this.pipelinePrompts.map(\n (pipelinePrompt) => pipelinePrompt.name\n );\n const inputValues = this.pipelinePrompts\n .map((pipelinePrompt) =>\n pipelinePrompt.prompt.inputVariables.filter(\n (inputValue) => !intermediateValues.includes(inputValue)\n )\n )\n .flat();\n return [...new Set(inputValues)];\n }\n\n protected static extractRequiredInputValues(\n allValues: InputValues,\n requiredValueNames: string[]\n ) {\n return requiredValueNames.reduce((requiredValues, valueName) => {\n requiredValues[valueName] = allValues[valueName];\n return requiredValues;\n }, {} as InputValues);\n }\n\n /**\n * Formats the pipeline prompts based on the provided input values.\n * @param values Input values to format the pipeline prompts.\n * @returns Promise that resolves with the formatted input values.\n */\n protected async formatPipelinePrompts(\n values: InputValues\n ): Promise<InputValues> {\n const allValues = await this.mergePartialAndUserVariables(values);\n for (const { name: pipelinePromptName, prompt: pipelinePrompt } of this\n .pipelinePrompts) {\n const pipelinePromptInputValues =\n PipelinePromptTemplate.extractRequiredInputValues(\n allValues,\n pipelinePrompt.inputVariables\n );\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (pipelinePrompt instanceof ChatPromptTemplate) {\n allValues[pipelinePromptName] = await pipelinePrompt.formatMessages(\n pipelinePromptInputValues\n );\n } else {\n allValues[pipelinePromptName] = await pipelinePrompt.format(\n pipelinePromptInputValues\n );\n }\n }\n return PipelinePromptTemplate.extractRequiredInputValues(\n allValues,\n this.finalPrompt.inputVariables\n );\n }\n\n /**\n * Formats the final prompt value based on the provided input values.\n * @param values Input values to format the final prompt value.\n * @returns Promise that resolves with the formatted final prompt value.\n */\n async formatPromptValue(\n values: InputValues\n ): Promise<PromptTemplateType[\"PromptValueReturnType\"]> {\n return this.finalPrompt.formatPromptValue(\n await this.formatPipelinePrompts(values)\n );\n }\n\n async format(values: InputValues): Promise<string> {\n return this.finalPrompt.format(await this.formatPipelinePrompts(values));\n }\n\n /**\n * Handles partial prompts, which are prompts that have been partially\n * filled with input values.\n * @param values Partial input values.\n * @returns Promise that resolves with a new PipelinePromptTemplate instance with updated input variables.\n */\n async partial(\n values: PartialValues\n ): Promise<PipelinePromptTemplate<PromptTemplateType>> {\n const promptDict = { ...this };\n promptDict.inputVariables = this.inputVariables.filter(\n (iv) => !(iv in values)\n );\n promptDict.partialVariables = {\n ...(this.partialVariables ?? {}),\n ...values,\n };\n return new PipelinePromptTemplate<PromptTemplateType>(promptDict);\n }\n\n serialize(): SerializedBasePromptTemplate {\n throw new Error(\"Not implemented.\");\n }\n\n _getPromptType(): string {\n return \"pipeline\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEA,IAAa,yBAAb,MAAa,+BAEHA,gCAAmB;CAC3B,OAAO,UAAU;AACf,SAAO;CACR;CAED;CAEA;CAEA,YAAYC,OAAwD;EAClE,MAAM;GAAE,GAAG;GAAO,gBAAgB,CAAE;EAAE,EAAC;EACvC,KAAK,kBAAkB,MAAM;EAC7B,KAAK,cAAc,MAAM;EACzB,KAAK,iBAAiB,KAAK,oBAAoB;CAChD;;;;;CAMD,AAAU,qBAAqB;EAC7B,MAAM,qBAAqB,KAAK,gBAAgB,IAC9C,CAAC,mBAAmB,eAAe,KACpC;EACD,MAAM,cAAc,KAAK,gBACtB,IAAI,CAAC,mBACJ,eAAe,OAAO,eAAe,OACnC,CAAC,eAAe,CAAC,mBAAmB,SAAS,WAAW,CACzD,CACF,CACA,MAAM;AACT,SAAO,CAAC,GAAG,IAAI,IAAI,YAAa;CACjC;CAED,OAAiB,2BACfC,WACAC,oBACA;AACA,SAAO,mBAAmB,OAAO,CAAC,gBAAgB,cAAc;GAC9D,eAAe,aAAa,UAAU;AACtC,UAAO;EACR,GAAE,CAAE,EAAgB;CACtB;;;;;;CAOD,MAAgB,sBACdC,QACsB;EACtB,MAAM,YAAY,MAAM,KAAK,6BAA6B,OAAO;AACjE,OAAK,MAAM,EAAE,MAAM,oBAAoB,QAAQ,gBAAgB,IAAI,KAChE,iBAAiB;GAClB,MAAM,4BACJ,uBAAuB,2BACrB,WACA,eAAe,eAChB;AAEH,OAAI,0BAA0BC,iCAC5B,UAAU,sBAAsB,MAAM,eAAe,eACnD,0BACD;QAED,UAAU,sBAAsB,MAAM,eAAe,OACnD,0BACD;EAEJ;AACD,SAAO,uBAAuB,2BAC5B,WACA,KAAK,YAAY,eAClB;CACF;;;;;;CAOD,MAAM,kBACJD,QACsD;AACtD,SAAO,KAAK,YAAY,kBACtB,MAAM,KAAK,sBAAsB,OAAO,CACzC;CACF;CAED,MAAM,OAAOA,QAAsC;AACjD,SAAO,KAAK,YAAY,OAAO,MAAM,KAAK,sBAAsB,OAAO,CAAC;CACzE;;;;;;;CAQD,MAAM,QACJE,QACqD;EACrD,MAAM,aAAa,EAAE,GAAG,KAAM;EAC9B,WAAW,iBAAiB,KAAK,eAAe,OAC9C,CAAC,OAAO,EAAE,MAAM,QACjB;EACD,WAAW,mBAAmB;GAC5B,GAAI,KAAK,oBAAoB,CAAE;GAC/B,GAAG;EACJ;AACD,SAAO,IAAI,uBAA2C;CACvD;CAED,YAA0C;AACxC,QAAM,IAAI,MAAM;CACjB;CAED,iBAAyB;AACvB,SAAO;CACR;AACF"}