@langchain/classic 1.0.44 → 1.0.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/_virtual/_rolldown/runtime.cjs +1 -1
  3. package/dist/agents/agent.cjs.map +1 -1
  4. package/dist/agents/chat/index.cjs +2 -1
  5. package/dist/agents/chat/index.cjs.map +1 -1
  6. package/dist/agents/chat/index.js +2 -1
  7. package/dist/agents/chat/index.js.map +1 -1
  8. package/dist/agents/chat_convo/index.cjs +7 -5
  9. package/dist/agents/chat_convo/index.cjs.map +1 -1
  10. package/dist/agents/chat_convo/index.js +7 -5
  11. package/dist/agents/chat_convo/index.js.map +1 -1
  12. package/dist/agents/chat_convo/outputParser.cjs.map +1 -1
  13. package/dist/agents/executor.cjs +22 -19
  14. package/dist/agents/executor.cjs.map +1 -1
  15. package/dist/agents/executor.js +22 -19
  16. package/dist/agents/executor.js.map +1 -1
  17. package/dist/agents/format_scratchpad/log_to_message.cjs.map +1 -1
  18. package/dist/agents/format_scratchpad/openai_functions.cjs.map +1 -1
  19. package/dist/agents/mrkl/index.cjs +9 -6
  20. package/dist/agents/mrkl/index.cjs.map +1 -1
  21. package/dist/agents/mrkl/index.js +9 -6
  22. package/dist/agents/mrkl/index.js.map +1 -1
  23. package/dist/agents/mrkl/outputParser.d.cts +1 -1
  24. package/dist/agents/openai_functions/index.cjs +2 -1
  25. package/dist/agents/openai_functions/index.cjs.map +1 -1
  26. package/dist/agents/openai_functions/index.js +2 -1
  27. package/dist/agents/openai_functions/index.js.map +1 -1
  28. package/dist/agents/openai_functions/output_parser.cjs.map +1 -1
  29. package/dist/agents/openai_tools/index.cjs.map +1 -1
  30. package/dist/agents/openai_tools/output_parser.cjs.map +1 -1
  31. package/dist/agents/react/output_parser.cjs.map +1 -1
  32. package/dist/agents/structured_chat/index.cjs +6 -5
  33. package/dist/agents/structured_chat/index.cjs.map +1 -1
  34. package/dist/agents/structured_chat/index.js +6 -5
  35. package/dist/agents/structured_chat/index.js.map +1 -1
  36. package/dist/agents/structured_chat/outputParser.cjs.map +1 -1
  37. package/dist/agents/tool_calling/output_parser.cjs.map +1 -1
  38. package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.cjs.map +1 -1
  39. package/dist/agents/toolkits/conversational_retrieval/tool.cjs +2 -1
  40. package/dist/agents/toolkits/conversational_retrieval/tool.cjs.map +1 -1
  41. package/dist/agents/toolkits/conversational_retrieval/tool.js +2 -1
  42. package/dist/agents/toolkits/conversational_retrieval/tool.js.map +1 -1
  43. package/dist/agents/toolkits/json/json.cjs +10 -8
  44. package/dist/agents/toolkits/json/json.cjs.map +1 -1
  45. package/dist/agents/toolkits/json/json.js +10 -8
  46. package/dist/agents/toolkits/json/json.js.map +1 -1
  47. package/dist/agents/toolkits/openapi/openapi.cjs +12 -9
  48. package/dist/agents/toolkits/openapi/openapi.cjs.map +1 -1
  49. package/dist/agents/toolkits/openapi/openapi.js +12 -9
  50. package/dist/agents/toolkits/openapi/openapi.js.map +1 -1
  51. package/dist/agents/toolkits/sql/sql.cjs +10 -8
  52. package/dist/agents/toolkits/sql/sql.cjs.map +1 -1
  53. package/dist/agents/toolkits/sql/sql.js +10 -8
  54. package/dist/agents/toolkits/sql/sql.js.map +1 -1
  55. package/dist/agents/toolkits/vectorstore/vectorstore.cjs +20 -16
  56. package/dist/agents/toolkits/vectorstore/vectorstore.cjs.map +1 -1
  57. package/dist/agents/toolkits/vectorstore/vectorstore.js +20 -16
  58. package/dist/agents/toolkits/vectorstore/vectorstore.js.map +1 -1
  59. package/dist/agents/xml/index.cjs +2 -1
  60. package/dist/agents/xml/index.cjs.map +1 -1
  61. package/dist/agents/xml/index.js +2 -1
  62. package/dist/agents/xml/index.js.map +1 -1
  63. package/dist/chains/base.cjs.map +1 -1
  64. package/dist/chains/chat_vector_db_chain.cjs +2 -1
  65. package/dist/chains/chat_vector_db_chain.cjs.map +1 -1
  66. package/dist/chains/chat_vector_db_chain.js +2 -1
  67. package/dist/chains/chat_vector_db_chain.js.map +1 -1
  68. package/dist/chains/conversational_retrieval_chain.cjs +2 -1
  69. package/dist/chains/conversational_retrieval_chain.cjs.map +1 -1
  70. package/dist/chains/conversational_retrieval_chain.js +2 -1
  71. package/dist/chains/conversational_retrieval_chain.js.map +1 -1
  72. package/dist/chains/openai_functions/base.cjs.map +1 -1
  73. package/dist/chains/openai_functions/extraction.cjs.map +1 -1
  74. package/dist/chains/openai_functions/openapi.cjs +9 -8
  75. package/dist/chains/openai_functions/openapi.cjs.map +1 -1
  76. package/dist/chains/openai_functions/openapi.js +9 -8
  77. package/dist/chains/openai_functions/openapi.js.map +1 -1
  78. package/dist/chains/openai_functions/tagging.cjs.map +1 -1
  79. package/dist/chains/openai_moderation.cjs.map +1 -1
  80. package/dist/chains/query_constructor/index.cjs +15 -9
  81. package/dist/chains/query_constructor/index.cjs.map +1 -1
  82. package/dist/chains/query_constructor/index.js +15 -9
  83. package/dist/chains/query_constructor/index.js.map +1 -1
  84. package/dist/chains/query_constructor/parser.cjs +12 -6
  85. package/dist/chains/query_constructor/parser.cjs.map +1 -1
  86. package/dist/chains/query_constructor/parser.js +12 -6
  87. package/dist/chains/query_constructor/parser.js.map +1 -1
  88. package/dist/chains/question_answering/load.cjs +35 -29
  89. package/dist/chains/question_answering/load.cjs.map +1 -1
  90. package/dist/chains/question_answering/load.js +35 -29
  91. package/dist/chains/question_answering/load.js.map +1 -1
  92. package/dist/chains/router/multi_prompt.cjs +5 -3
  93. package/dist/chains/router/multi_prompt.cjs.map +1 -1
  94. package/dist/chains/router/multi_prompt.js +5 -3
  95. package/dist/chains/router/multi_prompt.js.map +1 -1
  96. package/dist/chains/router/multi_retrieval_qa.cjs +18 -11
  97. package/dist/chains/router/multi_retrieval_qa.cjs.map +1 -1
  98. package/dist/chains/router/multi_retrieval_qa.js +18 -11
  99. package/dist/chains/router/multi_retrieval_qa.js.map +1 -1
  100. package/dist/chains/sequential_chain.cjs +6 -5
  101. package/dist/chains/sequential_chain.cjs.map +1 -1
  102. package/dist/chains/sequential_chain.js +6 -5
  103. package/dist/chains/sequential_chain.js.map +1 -1
  104. package/dist/chains/sql_db/sql_db_chain.cjs +2 -1
  105. package/dist/chains/sql_db/sql_db_chain.cjs.map +1 -1
  106. package/dist/chains/sql_db/sql_db_chain.js +2 -1
  107. package/dist/chains/sql_db/sql_db_chain.js.map +1 -1
  108. package/dist/chains/summarization/load.cjs +35 -29
  109. package/dist/chains/summarization/load.cjs.map +1 -1
  110. package/dist/chains/summarization/load.js +35 -29
  111. package/dist/chains/summarization/load.js.map +1 -1
  112. package/dist/chat_models/universal.cjs +12 -10
  113. package/dist/chat_models/universal.cjs.map +1 -1
  114. package/dist/chat_models/universal.js +12 -10
  115. package/dist/chat_models/universal.js.map +1 -1
  116. package/dist/document_loaders/fs/buffer.cjs.map +1 -1
  117. package/dist/document_loaders/fs/directory.cjs.map +1 -1
  118. package/dist/document_loaders/fs/multi_file.cjs.map +1 -1
  119. package/dist/document_loaders/fs/text.cjs.map +1 -1
  120. package/dist/document_transformers/openai_functions.cjs.map +1 -1
  121. package/dist/embeddings/cache_backed.cjs.map +1 -1
  122. package/dist/evaluation/comparison/pairwise.cjs +4 -2
  123. package/dist/evaluation/comparison/pairwise.cjs.map +1 -1
  124. package/dist/evaluation/comparison/pairwise.js +4 -2
  125. package/dist/evaluation/comparison/pairwise.js.map +1 -1
  126. package/dist/evaluation/criteria/criteria.cjs +4 -2
  127. package/dist/evaluation/criteria/criteria.cjs.map +1 -1
  128. package/dist/evaluation/criteria/criteria.js +4 -2
  129. package/dist/evaluation/criteria/criteria.js.map +1 -1
  130. package/dist/experimental/autogpt/agent.cjs +8 -7
  131. package/dist/experimental/autogpt/agent.cjs.map +1 -1
  132. package/dist/experimental/autogpt/agent.js +8 -7
  133. package/dist/experimental/autogpt/agent.js.map +1 -1
  134. package/dist/experimental/autogpt/prompt.cjs +2 -1
  135. package/dist/experimental/autogpt/prompt.cjs.map +1 -1
  136. package/dist/experimental/autogpt/prompt.js +2 -1
  137. package/dist/experimental/autogpt/prompt.js.map +1 -1
  138. package/dist/experimental/autogpt/prompt_generator.cjs.map +1 -1
  139. package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.cjs.map +1 -1
  140. package/dist/experimental/openai_assistant/index.cjs.map +1 -1
  141. package/dist/experimental/plan_and_execute/agent_executor.cjs +3 -2
  142. package/dist/experimental/plan_and_execute/agent_executor.cjs.map +1 -1
  143. package/dist/experimental/plan_and_execute/agent_executor.js +3 -2
  144. package/dist/experimental/plan_and_execute/agent_executor.js.map +1 -1
  145. package/dist/hub/base.cjs.map +1 -1
  146. package/dist/hub/base.js.map +1 -1
  147. package/dist/hub/index.cjs +2 -1
  148. package/dist/hub/index.cjs.map +1 -1
  149. package/dist/hub/index.js +2 -1
  150. package/dist/hub/index.js.map +1 -1
  151. package/dist/hub/node.cjs +4 -2
  152. package/dist/hub/node.cjs.map +1 -1
  153. package/dist/hub/node.js +4 -2
  154. package/dist/hub/node.js.map +1 -1
  155. package/dist/load/index.cjs.map +1 -1
  156. package/dist/memory/buffer_memory.cjs.map +1 -1
  157. package/dist/memory/buffer_token_memory.cjs.map +1 -1
  158. package/dist/memory/buffer_window_memory.cjs.map +1 -1
  159. package/dist/memory/chat_memory.cjs.map +1 -1
  160. package/dist/memory/entity_memory.cjs +2 -1
  161. package/dist/memory/entity_memory.cjs.map +1 -1
  162. package/dist/memory/entity_memory.js +2 -1
  163. package/dist/memory/entity_memory.js.map +1 -1
  164. package/dist/memory/summary.cjs.map +1 -1
  165. package/dist/memory/summary_buffer.cjs.map +1 -1
  166. package/dist/memory/vector_store.cjs.map +1 -1
  167. package/dist/output_parsers/fix.cjs +2 -1
  168. package/dist/output_parsers/fix.cjs.map +1 -1
  169. package/dist/output_parsers/fix.js +2 -1
  170. package/dist/output_parsers/fix.js.map +1 -1
  171. package/dist/output_parsers/openai_functions.cjs.map +1 -1
  172. package/dist/output_parsers/structured.cjs.map +1 -1
  173. package/dist/retrievers/document_compressors/chain_extract.cjs +2 -1
  174. package/dist/retrievers/document_compressors/chain_extract.cjs.map +1 -1
  175. package/dist/retrievers/document_compressors/chain_extract.js +2 -1
  176. package/dist/retrievers/document_compressors/chain_extract.js.map +1 -1
  177. package/dist/retrievers/matryoshka_retriever.cjs.map +1 -1
  178. package/dist/retrievers/multi_query.cjs +2 -1
  179. package/dist/retrievers/multi_query.cjs.map +1 -1
  180. package/dist/retrievers/multi_query.js +2 -1
  181. package/dist/retrievers/multi_query.js.map +1 -1
  182. package/dist/smith/runner_utils.cjs.map +1 -1
  183. package/dist/stores/file/node.cjs.map +1 -1
  184. package/dist/tools/render.cjs.map +1 -1
  185. package/dist/tools/retriever.cjs +2 -1
  186. package/dist/tools/retriever.cjs.map +1 -1
  187. package/dist/tools/retriever.js +2 -1
  188. package/dist/tools/retriever.js.map +1 -1
  189. package/dist/tools/webbrowser.cjs +2 -1
  190. package/dist/tools/webbrowser.cjs.map +1 -1
  191. package/dist/tools/webbrowser.js +2 -1
  192. package/dist/tools/webbrowser.js.map +1 -1
  193. package/dist/util/hub.cjs.map +1 -1
  194. package/dist/vectorstores/memory.cjs +2 -1
  195. package/dist/vectorstores/memory.cjs.map +1 -1
  196. package/dist/vectorstores/memory.js +2 -1
  197. package/dist/vectorstores/memory.js.map +1 -1
  198. package/package.json +23 -23
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","names":[],"sources":["../../../src/chains/query_constructor/parser.ts"],"sourcesContent":["import {\n Comparator,\n Comparators,\n Comparison,\n FilterDirective,\n Operation,\n Operator,\n Operators,\n} from \"@langchain/core/structured_query\";\nimport {\n CallExpressionType,\n ExpressionParser,\n ParsedType,\n} from \"../../output_parsers/expression.js\";\n\n/**\n * A type representing the possible types that can be traversed in an\n * expression.\n */\nexport type TraverseType =\n | boolean\n | Operation\n | Comparison\n | string\n | number\n | { [key: string]: TraverseType }\n | TraverseType[];\n\n/**\n * A class for transforming and parsing query expressions.\n */\nexport class QueryTransformer {\n constructor(\n public allowedComparators: Comparator[] = [],\n public allowedOperators: Operator[] = []\n ) {}\n\n /**\n * Matches a function name to a comparator or operator. Throws an error if\n * the function name is unknown or not allowed.\n * @param funcName The function name to match.\n * @returns The matched function name.\n */\n private matchFunctionName(funcName: string) {\n if (funcName in Comparators) {\n if (this.allowedComparators.length > 0) {\n if (this.allowedComparators.includes(funcName as Comparator)) {\n return funcName;\n } else {\n throw new Error(\"Received comparator not allowed\");\n }\n } else {\n return funcName;\n }\n }\n if (funcName in Operators) {\n if (this.allowedOperators.length > 0) {\n if (this.allowedOperators.includes(funcName as Operator)) {\n return funcName;\n } else {\n throw new Error(\"Received operator not allowed\");\n }\n } else {\n return funcName;\n }\n }\n throw new Error(\"Unknown function name\");\n }\n\n /**\n * Transforms a parsed expression into an operation or comparison. Throws\n * an error if the parsed expression is not supported.\n * @param parsed The parsed expression to transform.\n * @returns The transformed operation or comparison.\n */\n private transform(parsed: CallExpressionType): Operation | Comparison {\n const traverse = (node: ParsedType): TraverseType => {\n switch (node.type) {\n case \"call_expression\": {\n if (typeof node.funcCall !== \"string\") {\n throw new Error(\n \"Property access expression and element access expression not supported\"\n );\n }\n const funcName = this.matchFunctionName(node.funcCall);\n if (funcName in Operators) {\n return new Operation(\n funcName as Operator,\n node.args?.map((arg) => traverse(arg)) as FilterDirective[]\n );\n }\n if (funcName in Comparators) {\n if (node.args && node.args.length === 2) {\n const [attribute, value] = node.args;\n return new Comparison(\n funcName as Comparator,\n traverse(attribute) as string,\n traverse(value) as string | number\n );\n }\n throw new Error(\"Comparator must have exactly 2 arguments\");\n }\n throw new Error(\"Function name neither operator nor comparator\");\n }\n case \"string_literal\": {\n return node.value;\n }\n case \"numeric_literal\": {\n return node.value;\n }\n case \"array_literal\": {\n return node.values.map((value) => traverse(value));\n }\n case \"object_literal\": {\n return node.values.reduce(\n (acc, value) => {\n acc[value.identifier] = traverse(value.value);\n return acc;\n },\n {} as { [key: string]: TraverseType }\n );\n }\n case \"boolean_literal\": {\n return node.value;\n }\n default: {\n throw new Error(\"Unknown node type\");\n }\n }\n };\n return traverse(parsed) as Operation | Comparison;\n }\n\n /**\n * Parses an expression and returns the transformed operation or\n * comparison. Throws an error if the expression cannot be parsed.\n * @param expression The expression to parse.\n * @returns A Promise that resolves to the transformed operation or comparison.\n */\n async parse(expression: string): Promise<Operation | Comparison> {\n const expressionParser = new ExpressionParser();\n const parsed = (await expressionParser.parse(\n expression\n )) as CallExpressionType;\n if (!parsed) {\n throw new Error(\"Could not parse expression\");\n }\n return this.transform(parsed);\n }\n}\n"],"mappings":";;;;;;AA+BA,IAAa,mBAAb,MAA8B;CAEnB;CACA;CAFT,YACE,qBAA0C,CAAC,GAC3C,mBAAsC,CAAC,GACvC;EAFO,KAAA,qBAAA;EACA,KAAA,mBAAA;CACN;;;;;;;CAQH,kBAA0B,UAAkB;EAC1C,IAAI,YAAY,aACd,IAAI,KAAK,mBAAmB,SAAS,GACnC,IAAI,KAAK,mBAAmB,SAAS,QAAsB,GACzD,OAAO;OAEP,MAAM,IAAI,MAAM,iCAAiC;OAGnD,OAAO;EAGX,IAAI,YAAY,WACd,IAAI,KAAK,iBAAiB,SAAS,GACjC,IAAI,KAAK,iBAAiB,SAAS,QAAoB,GACrD,OAAO;OAEP,MAAM,IAAI,MAAM,+BAA+B;OAGjD,OAAO;EAGX,MAAM,IAAI,MAAM,uBAAuB;CACzC;;;;;;;CAQA,UAAkB,QAAoD;EACpE,MAAM,YAAY,SAAmC;GACnD,QAAQ,KAAK,MAAb;IACE,KAAK,mBAAmB;KACtB,IAAI,OAAO,KAAK,aAAa,UAC3B,MAAM,IAAI,MACR,wEACF;KAEF,MAAM,WAAW,KAAK,kBAAkB,KAAK,QAAQ;KACrD,IAAI,YAAY,WACd,OAAO,IAAI,UACT,UACA,KAAK,MAAM,KAAK,QAAQ,SAAS,GAAG,CAAC,CACvC;KAEF,IAAI,YAAY,aAAa;MAC3B,IAAI,KAAK,QAAQ,KAAK,KAAK,WAAW,GAAG;OACvC,MAAM,CAAC,WAAW,SAAS,KAAK;OAChC,OAAO,IAAI,WACT,UACA,SAAS,SAAS,GAClB,SAAS,KAAK,CAChB;MACF;MACA,MAAM,IAAI,MAAM,0CAA0C;KAC5D;KACA,MAAM,IAAI,MAAM,+CAA+C;IACjE;IACA,KAAK,kBACH,OAAO,KAAK;IAEd,KAAK,mBACH,OAAO,KAAK;IAEd,KAAK,iBACH,OAAO,KAAK,OAAO,KAAK,UAAU,SAAS,KAAK,CAAC;IAEnD,KAAK,kBACH,OAAO,KAAK,OAAO,QAChB,KAAK,UAAU;KACd,IAAI,MAAM,cAAc,SAAS,MAAM,KAAK;KAC5C,OAAO;IACT,GACA,CAAC,CACH;IAEF,KAAK,mBACH,OAAO,KAAK;IAEd,SACE,MAAM,IAAI,MAAM,mBAAmB;GAEvC;EACF;EACA,OAAO,SAAS,MAAM;CACxB;;;;;;;CAQA,MAAM,MAAM,YAAqD;EAE/D,MAAM,SAAU,MAAM,IADO,iBACQ,CAAC,CAAC,MACrC,UACF;EACA,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,4BAA4B;EAE9C,OAAO,KAAK,UAAU,MAAM;CAC9B;AACF"}
1
+ {"version":3,"file":"parser.js","names":[],"sources":["../../../src/chains/query_constructor/parser.ts"],"sourcesContent":["import {\n Comparator,\n Comparators,\n Comparison,\n FilterDirective,\n Operation,\n Operator,\n Operators,\n} from \"@langchain/core/structured_query\";\nimport {\n CallExpressionType,\n ExpressionParser,\n ParsedType,\n} from \"../../output_parsers/expression.js\";\n\n/**\n * A type representing the possible types that can be traversed in an\n * expression.\n */\nexport type TraverseType =\n | boolean\n | Operation\n | Comparison\n | string\n | number\n | { [key: string]: TraverseType }\n | TraverseType[];\n\n/**\n * A class for transforming and parsing query expressions.\n */\nexport class QueryTransformer {\n constructor(\n public allowedComparators: Comparator[] = [],\n public allowedOperators: Operator[] = []\n ) {}\n\n /**\n * Matches a function name to a comparator or operator. Throws an error if\n * the function name is unknown or not allowed.\n * @param funcName The function name to match.\n * @returns The matched function name.\n */\n private matchFunctionName(funcName: string) {\n if (funcName in Comparators) {\n if (this.allowedComparators.length > 0) {\n if (this.allowedComparators.includes(funcName as Comparator)) {\n return funcName;\n } else {\n throw new Error(\"Received comparator not allowed\");\n }\n } else {\n return funcName;\n }\n }\n if (funcName in Operators) {\n if (this.allowedOperators.length > 0) {\n if (this.allowedOperators.includes(funcName as Operator)) {\n return funcName;\n } else {\n throw new Error(\"Received operator not allowed\");\n }\n } else {\n return funcName;\n }\n }\n throw new Error(\"Unknown function name\");\n }\n\n /**\n * Transforms a parsed expression into an operation or comparison. Throws\n * an error if the parsed expression is not supported.\n * @param parsed The parsed expression to transform.\n * @returns The transformed operation or comparison.\n */\n private transform(parsed: CallExpressionType): Operation | Comparison {\n const traverse = (node: ParsedType): TraverseType => {\n switch (node.type) {\n case \"call_expression\": {\n if (typeof node.funcCall !== \"string\") {\n throw new Error(\n \"Property access expression and element access expression not supported\"\n );\n }\n const funcName = this.matchFunctionName(node.funcCall);\n if (funcName in Operators) {\n return new Operation(\n funcName as Operator,\n node.args?.map((arg) => traverse(arg)) as FilterDirective[]\n );\n }\n if (funcName in Comparators) {\n if (node.args && node.args.length === 2) {\n const [attribute, value] = node.args;\n return new Comparison(\n funcName as Comparator,\n traverse(attribute) as string,\n traverse(value) as string | number\n );\n }\n throw new Error(\"Comparator must have exactly 2 arguments\");\n }\n throw new Error(\"Function name neither operator nor comparator\");\n }\n case \"string_literal\": {\n return node.value;\n }\n case \"numeric_literal\": {\n return node.value;\n }\n case \"array_literal\": {\n return node.values.map((value) => traverse(value));\n }\n case \"object_literal\": {\n return node.values.reduce(\n (acc, value) => {\n acc[value.identifier] = traverse(value.value);\n return acc;\n },\n {} as { [key: string]: TraverseType }\n );\n }\n case \"boolean_literal\": {\n return node.value;\n }\n default: {\n throw new Error(\"Unknown node type\");\n }\n }\n };\n return traverse(parsed) as Operation | Comparison;\n }\n\n /**\n * Parses an expression and returns the transformed operation or\n * comparison. Throws an error if the expression cannot be parsed.\n * @param expression The expression to parse.\n * @returns A Promise that resolves to the transformed operation or comparison.\n */\n async parse(expression: string): Promise<Operation | Comparison> {\n const expressionParser = new ExpressionParser();\n const parsed = (await expressionParser.parse(\n expression\n )) as CallExpressionType;\n if (!parsed) {\n throw new Error(\"Could not parse expression\");\n }\n return this.transform(parsed);\n }\n}\n"],"mappings":";;;;;;AA+BA,IAAa,mBAAb,MAA8B;CAEnB;CACA;CAFT,YACE,qBAA0C,CAAC,GAC3C,mBAAsC,CAAC,GACvC;EAFO,KAAA,qBAAA;EACA,KAAA,mBAAA;CACN;;;;;;;CAQH,kBAA0B,UAAkB;EAC1C,IAAI,YAAY,aAAa;GAC3B,IAAI,KAAK,mBAAmB,SAAS,GAAG;IACtC,IAAI,KAAK,mBAAmB,SAAS,QAAsB,GACzD,OAAO;SAEP,MAAM,IAAI,MAAM,iCAAiC;GAErD,OACE,OAAO;EAEX;EACA,IAAI,YAAY,WAAW;GACzB,IAAI,KAAK,iBAAiB,SAAS,GAAG;IACpC,IAAI,KAAK,iBAAiB,SAAS,QAAoB,GACrD,OAAO;SAEP,MAAM,IAAI,MAAM,+BAA+B;GAEnD,OACE,OAAO;EAEX;EACA,MAAM,IAAI,MAAM,uBAAuB;CACzC;;;;;;;CAQA,UAAkB,QAAoD;EACpE,MAAM,YAAY,SAAmC;GACnD,QAAQ,KAAK,MAAb;IACE,KAAK,mBAAmB;KACtB,IAAI,OAAO,KAAK,aAAa,UAC3B,MAAM,IAAI,MACR,wEACF;KAEF,MAAM,WAAW,KAAK,kBAAkB,KAAK,QAAQ;KACrD,IAAI,YAAY,WACd,OAAO,IAAI,UACT,UACA,KAAK,MAAM,KAAK,QAAQ,SAAS,GAAG,CAAC,CACvC;KAEF,IAAI,YAAY,aAAa;MAC3B,IAAI,KAAK,QAAQ,KAAK,KAAK,WAAW,GAAG;OACvC,MAAM,CAAC,WAAW,SAAS,KAAK;OAChC,OAAO,IAAI,WACT,UACA,SAAS,SAAS,GAClB,SAAS,KAAK,CAChB;MACF;MACA,MAAM,IAAI,MAAM,0CAA0C;KAC5D;KACA,MAAM,IAAI,MAAM,+CAA+C;IACjE;IACA,KAAK,kBACH,OAAO,KAAK;IAEd,KAAK,mBACH,OAAO,KAAK;IAEd,KAAK,iBACH,OAAO,KAAK,OAAO,KAAK,UAAU,SAAS,KAAK,CAAC;IAEnD,KAAK,kBACH,OAAO,KAAK,OAAO,QAChB,KAAK,UAAU;KACd,IAAI,MAAM,cAAc,SAAS,MAAM,KAAK;KAC5C,OAAO;IACT,GACA,CAAC,CACH;IAEF,KAAK,mBACH,OAAO,KAAK;IAEd,SACE,MAAM,IAAI,MAAM,mBAAmB;GAEvC;EACF;EACA,OAAO,SAAS,MAAM;CACxB;;;;;;;CAQA,MAAM,MAAM,YAAqD;EAE/D,MAAM,SAAU,MAAM,IADO,iBACQ,CAAC,CAAC,MACrC,UACF;EACA,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,4BAA4B;EAE9C,OAAO,KAAK,UAAU,MAAM;CAC9B;AACF"}
@@ -20,12 +20,13 @@ const loadQAChain = (llm, params = { type: "stuff" }) => {
20
20
  */
21
21
  function loadQAStuffChain(llm, params = {}) {
22
22
  const { prompt = require_stuff_prompts.QA_PROMPT_SELECTOR.getPrompt(llm), verbose } = params;
23
+ const llmChain = new require_llm_chain.LLMChain({
24
+ prompt,
25
+ llm,
26
+ verbose
27
+ });
23
28
  return new require_combine_docs_chain.StuffDocumentsChain({
24
- llmChain: new require_llm_chain.LLMChain({
25
- prompt,
26
- llm,
27
- verbose
28
- }),
29
+ llmChain,
29
30
  verbose
30
31
  });
31
32
  }
@@ -38,21 +39,24 @@ function loadQAStuffChain(llm, params = {}) {
38
39
  */
39
40
  function loadQAMapReduceChain(llm, params = {}) {
40
41
  const { combineMapPrompt = require_map_reduce_prompts.COMBINE_QA_PROMPT_SELECTOR.getPrompt(llm), combinePrompt = require_map_reduce_prompts.COMBINE_PROMPT_SELECTOR.getPrompt(llm), verbose, combineLLM, returnIntermediateSteps } = params;
42
+ const llmChain = new require_llm_chain.LLMChain({
43
+ prompt: combineMapPrompt,
44
+ llm,
45
+ verbose
46
+ });
47
+ const combineLLMChain = new require_llm_chain.LLMChain({
48
+ prompt: combinePrompt,
49
+ llm: combineLLM ?? llm,
50
+ verbose
51
+ });
52
+ const combineDocumentChain = new require_combine_docs_chain.StuffDocumentsChain({
53
+ llmChain: combineLLMChain,
54
+ documentVariableName: "summaries",
55
+ verbose
56
+ });
41
57
  return new require_combine_docs_chain.MapReduceDocumentsChain({
42
- llmChain: new require_llm_chain.LLMChain({
43
- prompt: combineMapPrompt,
44
- llm,
45
- verbose
46
- }),
47
- combineDocumentChain: new require_combine_docs_chain.StuffDocumentsChain({
48
- llmChain: new require_llm_chain.LLMChain({
49
- prompt: combinePrompt,
50
- llm: combineLLM ?? llm,
51
- verbose
52
- }),
53
- documentVariableName: "summaries",
54
- verbose
55
- }),
58
+ llmChain,
59
+ combineDocumentChain,
56
60
  returnIntermediateSteps,
57
61
  verbose
58
62
  });
@@ -66,17 +70,19 @@ function loadQAMapReduceChain(llm, params = {}) {
66
70
  */
67
71
  function loadQARefineChain(llm, params = {}) {
68
72
  const { questionPrompt = require_refine_prompts.QUESTION_PROMPT_SELECTOR.getPrompt(llm), refinePrompt = require_refine_prompts.REFINE_PROMPT_SELECTOR.getPrompt(llm), refineLLM, verbose } = params;
73
+ const llmChain = new require_llm_chain.LLMChain({
74
+ prompt: questionPrompt,
75
+ llm,
76
+ verbose
77
+ });
78
+ const refineLLMChain = new require_llm_chain.LLMChain({
79
+ prompt: refinePrompt,
80
+ llm: refineLLM ?? llm,
81
+ verbose
82
+ });
69
83
  return new require_combine_docs_chain.RefineDocumentsChain({
70
- llmChain: new require_llm_chain.LLMChain({
71
- prompt: questionPrompt,
72
- llm,
73
- verbose
74
- }),
75
- refineLLMChain: new require_llm_chain.LLMChain({
76
- prompt: refinePrompt,
77
- llm: refineLLM ?? llm,
78
- verbose
79
- }),
84
+ llmChain,
85
+ refineLLMChain,
80
86
  verbose
81
87
  });
82
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"load.cjs","names":["QA_PROMPT_SELECTOR","StuffDocumentsChain","LLMChain","COMBINE_QA_PROMPT_SELECTOR","COMBINE_PROMPT_SELECTOR","MapReduceDocumentsChain","QUESTION_PROMPT_SELECTOR","REFINE_PROMPT_SELECTOR","RefineDocumentsChain"],"sources":["../../../src/chains/question_answering/load.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { LLMChain } from \"../llm_chain.js\";\nimport {\n StuffDocumentsChain,\n MapReduceDocumentsChain,\n RefineDocumentsChain,\n MapReduceDocumentsChainInput,\n} from \"../combine_docs_chain.js\";\nimport { QA_PROMPT_SELECTOR } from \"./stuff_prompts.js\";\nimport {\n COMBINE_PROMPT_SELECTOR,\n COMBINE_QA_PROMPT_SELECTOR,\n} from \"./map_reduce_prompts.js\";\nimport {\n QUESTION_PROMPT_SELECTOR,\n REFINE_PROMPT_SELECTOR,\n} from \"./refine_prompts.js\";\n\n/**\n * Represents the parameters for creating a QAChain. It can be of three\n * types: \"stuff\", \"map_reduce\", or \"refine\".\n */\nexport type QAChainParams =\n | ({\n type?: \"stuff\";\n } & StuffQAChainParams)\n | ({\n type?: \"map_reduce\";\n } & MapReduceQAChainParams)\n | ({\n type?: \"refine\";\n } & RefineQAChainParams);\n\nexport const loadQAChain = (\n llm: BaseLanguageModelInterface,\n params: QAChainParams = { type: \"stuff\" }\n) => {\n const { type } = params;\n if (type === \"stuff\") {\n return loadQAStuffChain(llm, params);\n }\n if (type === \"map_reduce\") {\n return loadQAMapReduceChain(llm, params);\n }\n if (type === \"refine\") {\n return loadQARefineChain(llm, params);\n }\n throw new Error(`Invalid _type: ${type}`);\n};\n\n/**\n * Represents the parameters for creating a StuffQAChain.\n */\nexport interface StuffQAChainParams {\n prompt?: BasePromptTemplate;\n verbose?: boolean;\n}\n\n/**\n * Loads a StuffQAChain based on the provided parameters. It takes an LLM\n * instance and StuffQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a StuffQAChain.\n * @returns A StuffQAChain instance.\n */\nexport function loadQAStuffChain(\n llm: BaseLanguageModelInterface,\n params: StuffQAChainParams = {}\n) {\n const { prompt = QA_PROMPT_SELECTOR.getPrompt(llm), verbose } = params;\n const llmChain = new LLMChain({ prompt, llm, verbose });\n const chain = new StuffDocumentsChain({ llmChain, verbose });\n return chain;\n}\n\n/**\n * Represents the parameters for creating a MapReduceQAChain.\n */\nexport interface MapReduceQAChainParams {\n returnIntermediateSteps?: MapReduceDocumentsChainInput[\"returnIntermediateSteps\"];\n combineMapPrompt?: BasePromptTemplate;\n combinePrompt?: BasePromptTemplate;\n combineLLM?: BaseLanguageModelInterface;\n verbose?: boolean;\n}\n\n/**\n * Loads a MapReduceQAChain based on the provided parameters. It takes an\n * LLM instance and MapReduceQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a MapReduceQAChain.\n * @returns A MapReduceQAChain instance.\n */\nexport function loadQAMapReduceChain(\n llm: BaseLanguageModelInterface,\n params: MapReduceQAChainParams = {}\n) {\n const {\n combineMapPrompt = COMBINE_QA_PROMPT_SELECTOR.getPrompt(llm),\n combinePrompt = COMBINE_PROMPT_SELECTOR.getPrompt(llm),\n verbose,\n combineLLM,\n returnIntermediateSteps,\n } = params;\n const llmChain = new LLMChain({ prompt: combineMapPrompt, llm, verbose });\n const combineLLMChain = new LLMChain({\n prompt: combinePrompt,\n llm: combineLLM ?? llm,\n verbose,\n });\n const combineDocumentChain = new StuffDocumentsChain({\n llmChain: combineLLMChain,\n documentVariableName: \"summaries\",\n verbose,\n });\n const chain = new MapReduceDocumentsChain({\n llmChain,\n combineDocumentChain,\n returnIntermediateSteps,\n verbose,\n });\n return chain;\n}\n\n/**\n * Represents the parameters for creating a RefineQAChain.\n */\nexport interface RefineQAChainParams {\n questionPrompt?: BasePromptTemplate;\n refinePrompt?: BasePromptTemplate;\n refineLLM?: BaseLanguageModelInterface;\n verbose?: boolean;\n}\n\n/**\n * Loads a RefineQAChain based on the provided parameters. It takes an LLM\n * instance and RefineQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a RefineQAChain.\n * @returns A RefineQAChain instance.\n */\nexport function loadQARefineChain(\n llm: BaseLanguageModelInterface,\n params: RefineQAChainParams = {}\n) {\n const {\n questionPrompt = QUESTION_PROMPT_SELECTOR.getPrompt(llm),\n refinePrompt = REFINE_PROMPT_SELECTOR.getPrompt(llm),\n refineLLM,\n verbose,\n } = params;\n const llmChain = new LLMChain({ prompt: questionPrompt, llm, verbose });\n const refineLLMChain = new LLMChain({\n prompt: refinePrompt,\n llm: refineLLM ?? llm,\n verbose,\n });\n\n const chain = new RefineDocumentsChain({\n llmChain,\n refineLLMChain,\n verbose,\n });\n return chain;\n}\n"],"mappings":";;;;;;AAkCA,MAAa,eACX,KACA,SAAwB,EAAE,MAAM,QAAQ,MACrC;CACH,MAAM,EAAE,SAAS;CACjB,IAAI,SAAS,SACX,OAAO,iBAAiB,KAAK,MAAM;CAErC,IAAI,SAAS,cACX,OAAO,qBAAqB,KAAK,MAAM;CAEzC,IAAI,SAAS,UACX,OAAO,kBAAkB,KAAK,MAAM;CAEtC,MAAM,IAAI,MAAM,kBAAkB,MAAM;AAC1C;;;;;;;;AAiBA,SAAgB,iBACd,KACA,SAA6B,CAAC,GAC9B;CACA,MAAM,EAAE,SAASA,sBAAAA,mBAAmB,UAAU,GAAG,GAAG,YAAY;CAGhE,OAAO,IADWC,2BAAAA,oBAAoB;EAAE,UAAA,IADnBC,kBAAAA,SAAS;GAAE;GAAQ;GAAK;EAAQ,CACN;EAAG;CAAQ,CAC/C;AACb;;;;;;;;AAoBA,SAAgB,qBACd,KACA,SAAiC,CAAC,GAClC;CACA,MAAM,EACJ,mBAAmBC,2BAAAA,2BAA2B,UAAU,GAAG,GAC3D,gBAAgBC,2BAAAA,wBAAwB,UAAU,GAAG,GACrD,SACA,YACA,4BACE;CAkBJ,OAAO,IANWC,2BAAAA,wBAAwB;EACxC,UAAA,IAZmBH,kBAAAA,SAAS;GAAE,QAAQ;GAAkB;GAAK;EAAQ,CAY9D;EACP,sBAAA,IAP+BD,2BAAAA,oBAAoB;GACnD,UAAU,IANgBC,kBAAAA,SAAS;IACnC,QAAQ;IACR,KAAK,cAAc;IACnB;GACF,CAE0B;GACxB,sBAAsB;GACtB;EACF,CAGqB;EACnB;EACA;CACF,CACW;AACb;;;;;;;;AAmBA,SAAgB,kBACd,KACA,SAA8B,CAAC,GAC/B;CACA,MAAM,EACJ,iBAAiBI,uBAAAA,yBAAyB,UAAU,GAAG,GACvD,eAAeC,uBAAAA,uBAAuB,UAAU,GAAG,GACnD,WACA,YACE;CAaJ,OAAO,IALWC,2BAAAA,qBAAqB;EACrC,UAAA,IARmBN,kBAAAA,SAAS;GAAE,QAAQ;GAAgB;GAAK;EAAQ,CAQ5D;EACP,gBAAA,IARyBA,kBAAAA,SAAS;GAClC,QAAQ;GACR,KAAK,aAAa;GAClB;EACF,CAIe;EACb;CACF,CACW;AACb"}
1
+ {"version":3,"file":"load.cjs","names":["QA_PROMPT_SELECTOR","LLMChain","StuffDocumentsChain","COMBINE_QA_PROMPT_SELECTOR","COMBINE_PROMPT_SELECTOR","MapReduceDocumentsChain","QUESTION_PROMPT_SELECTOR","REFINE_PROMPT_SELECTOR","RefineDocumentsChain"],"sources":["../../../src/chains/question_answering/load.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { LLMChain } from \"../llm_chain.js\";\nimport {\n StuffDocumentsChain,\n MapReduceDocumentsChain,\n RefineDocumentsChain,\n MapReduceDocumentsChainInput,\n} from \"../combine_docs_chain.js\";\nimport { QA_PROMPT_SELECTOR } from \"./stuff_prompts.js\";\nimport {\n COMBINE_PROMPT_SELECTOR,\n COMBINE_QA_PROMPT_SELECTOR,\n} from \"./map_reduce_prompts.js\";\nimport {\n QUESTION_PROMPT_SELECTOR,\n REFINE_PROMPT_SELECTOR,\n} from \"./refine_prompts.js\";\n\n/**\n * Represents the parameters for creating a QAChain. It can be of three\n * types: \"stuff\", \"map_reduce\", or \"refine\".\n */\nexport type QAChainParams =\n | ({\n type?: \"stuff\";\n } & StuffQAChainParams)\n | ({\n type?: \"map_reduce\";\n } & MapReduceQAChainParams)\n | ({\n type?: \"refine\";\n } & RefineQAChainParams);\n\nexport const loadQAChain = (\n llm: BaseLanguageModelInterface,\n params: QAChainParams = { type: \"stuff\" }\n) => {\n const { type } = params;\n if (type === \"stuff\") {\n return loadQAStuffChain(llm, params);\n }\n if (type === \"map_reduce\") {\n return loadQAMapReduceChain(llm, params);\n }\n if (type === \"refine\") {\n return loadQARefineChain(llm, params);\n }\n throw new Error(`Invalid _type: ${type}`);\n};\n\n/**\n * Represents the parameters for creating a StuffQAChain.\n */\nexport interface StuffQAChainParams {\n prompt?: BasePromptTemplate;\n verbose?: boolean;\n}\n\n/**\n * Loads a StuffQAChain based on the provided parameters. It takes an LLM\n * instance and StuffQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a StuffQAChain.\n * @returns A StuffQAChain instance.\n */\nexport function loadQAStuffChain(\n llm: BaseLanguageModelInterface,\n params: StuffQAChainParams = {}\n) {\n const { prompt = QA_PROMPT_SELECTOR.getPrompt(llm), verbose } = params;\n const llmChain = new LLMChain({ prompt, llm, verbose });\n const chain = new StuffDocumentsChain({ llmChain, verbose });\n return chain;\n}\n\n/**\n * Represents the parameters for creating a MapReduceQAChain.\n */\nexport interface MapReduceQAChainParams {\n returnIntermediateSteps?: MapReduceDocumentsChainInput[\"returnIntermediateSteps\"];\n combineMapPrompt?: BasePromptTemplate;\n combinePrompt?: BasePromptTemplate;\n combineLLM?: BaseLanguageModelInterface;\n verbose?: boolean;\n}\n\n/**\n * Loads a MapReduceQAChain based on the provided parameters. It takes an\n * LLM instance and MapReduceQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a MapReduceQAChain.\n * @returns A MapReduceQAChain instance.\n */\nexport function loadQAMapReduceChain(\n llm: BaseLanguageModelInterface,\n params: MapReduceQAChainParams = {}\n) {\n const {\n combineMapPrompt = COMBINE_QA_PROMPT_SELECTOR.getPrompt(llm),\n combinePrompt = COMBINE_PROMPT_SELECTOR.getPrompt(llm),\n verbose,\n combineLLM,\n returnIntermediateSteps,\n } = params;\n const llmChain = new LLMChain({ prompt: combineMapPrompt, llm, verbose });\n const combineLLMChain = new LLMChain({\n prompt: combinePrompt,\n llm: combineLLM ?? llm,\n verbose,\n });\n const combineDocumentChain = new StuffDocumentsChain({\n llmChain: combineLLMChain,\n documentVariableName: \"summaries\",\n verbose,\n });\n const chain = new MapReduceDocumentsChain({\n llmChain,\n combineDocumentChain,\n returnIntermediateSteps,\n verbose,\n });\n return chain;\n}\n\n/**\n * Represents the parameters for creating a RefineQAChain.\n */\nexport interface RefineQAChainParams {\n questionPrompt?: BasePromptTemplate;\n refinePrompt?: BasePromptTemplate;\n refineLLM?: BaseLanguageModelInterface;\n verbose?: boolean;\n}\n\n/**\n * Loads a RefineQAChain based on the provided parameters. It takes an LLM\n * instance and RefineQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a RefineQAChain.\n * @returns A RefineQAChain instance.\n */\nexport function loadQARefineChain(\n llm: BaseLanguageModelInterface,\n params: RefineQAChainParams = {}\n) {\n const {\n questionPrompt = QUESTION_PROMPT_SELECTOR.getPrompt(llm),\n refinePrompt = REFINE_PROMPT_SELECTOR.getPrompt(llm),\n refineLLM,\n verbose,\n } = params;\n const llmChain = new LLMChain({ prompt: questionPrompt, llm, verbose });\n const refineLLMChain = new LLMChain({\n prompt: refinePrompt,\n llm: refineLLM ?? llm,\n verbose,\n });\n\n const chain = new RefineDocumentsChain({\n llmChain,\n refineLLMChain,\n verbose,\n });\n return chain;\n}\n"],"mappings":";;;;;;AAkCA,MAAa,eACX,KACA,SAAwB,EAAE,MAAM,QAAQ,MACrC;CACH,MAAM,EAAE,SAAS;CACjB,IAAI,SAAS,SACX,OAAO,iBAAiB,KAAK,MAAM;CAErC,IAAI,SAAS,cACX,OAAO,qBAAqB,KAAK,MAAM;CAEzC,IAAI,SAAS,UACX,OAAO,kBAAkB,KAAK,MAAM;CAEtC,MAAM,IAAI,MAAM,kBAAkB,MAAM;AAC1C;;;;;;;;AAiBA,SAAgB,iBACd,KACA,SAA6B,CAAC,GAC9B;CACA,MAAM,EAAE,SAASA,sBAAAA,mBAAmB,UAAU,GAAG,GAAG,YAAY;CAChE,MAAM,WAAW,IAAIC,kBAAAA,SAAS;EAAE;EAAQ;EAAK;CAAQ,CAAC;CAEtD,OAAO,IADWC,2BAAAA,oBAAoB;EAAE;EAAU;CAAQ,CAC/C;AACb;;;;;;;;AAoBA,SAAgB,qBACd,KACA,SAAiC,CAAC,GAClC;CACA,MAAM,EACJ,mBAAmBC,2BAAAA,2BAA2B,UAAU,GAAG,GAC3D,gBAAgBC,2BAAAA,wBAAwB,UAAU,GAAG,GACrD,SACA,YACA,4BACE;CACJ,MAAM,WAAW,IAAIH,kBAAAA,SAAS;EAAE,QAAQ;EAAkB;EAAK;CAAQ,CAAC;CACxE,MAAM,kBAAkB,IAAIA,kBAAAA,SAAS;EACnC,QAAQ;EACR,KAAK,cAAc;EACnB;CACF,CAAC;CACD,MAAM,uBAAuB,IAAIC,2BAAAA,oBAAoB;EACnD,UAAU;EACV,sBAAsB;EACtB;CACF,CAAC;CAOD,OAAO,IANWG,2BAAAA,wBAAwB;EACxC;EACA;EACA;EACA;CACF,CACW;AACb;;;;;;;;AAmBA,SAAgB,kBACd,KACA,SAA8B,CAAC,GAC/B;CACA,MAAM,EACJ,iBAAiBC,uBAAAA,yBAAyB,UAAU,GAAG,GACvD,eAAeC,uBAAAA,uBAAuB,UAAU,GAAG,GACnD,WACA,YACE;CACJ,MAAM,WAAW,IAAIN,kBAAAA,SAAS;EAAE,QAAQ;EAAgB;EAAK;CAAQ,CAAC;CACtE,MAAM,iBAAiB,IAAIA,kBAAAA,SAAS;EAClC,QAAQ;EACR,KAAK,aAAa;EAClB;CACF,CAAC;CAOD,OAAO,IALWO,2BAAAA,qBAAqB;EACrC;EACA;EACA;CACF,CACW;AACb"}
@@ -20,12 +20,13 @@ const loadQAChain = (llm, params = { type: "stuff" }) => {
20
20
  */
21
21
  function loadQAStuffChain(llm, params = {}) {
22
22
  const { prompt = QA_PROMPT_SELECTOR.getPrompt(llm), verbose } = params;
23
+ const llmChain = new LLMChain({
24
+ prompt,
25
+ llm,
26
+ verbose
27
+ });
23
28
  return new StuffDocumentsChain({
24
- llmChain: new LLMChain({
25
- prompt,
26
- llm,
27
- verbose
28
- }),
29
+ llmChain,
29
30
  verbose
30
31
  });
31
32
  }
@@ -38,21 +39,24 @@ function loadQAStuffChain(llm, params = {}) {
38
39
  */
39
40
  function loadQAMapReduceChain(llm, params = {}) {
40
41
  const { combineMapPrompt = COMBINE_QA_PROMPT_SELECTOR.getPrompt(llm), combinePrompt = COMBINE_PROMPT_SELECTOR.getPrompt(llm), verbose, combineLLM, returnIntermediateSteps } = params;
42
+ const llmChain = new LLMChain({
43
+ prompt: combineMapPrompt,
44
+ llm,
45
+ verbose
46
+ });
47
+ const combineLLMChain = new LLMChain({
48
+ prompt: combinePrompt,
49
+ llm: combineLLM ?? llm,
50
+ verbose
51
+ });
52
+ const combineDocumentChain = new StuffDocumentsChain({
53
+ llmChain: combineLLMChain,
54
+ documentVariableName: "summaries",
55
+ verbose
56
+ });
41
57
  return new MapReduceDocumentsChain({
42
- llmChain: new LLMChain({
43
- prompt: combineMapPrompt,
44
- llm,
45
- verbose
46
- }),
47
- combineDocumentChain: new StuffDocumentsChain({
48
- llmChain: new LLMChain({
49
- prompt: combinePrompt,
50
- llm: combineLLM ?? llm,
51
- verbose
52
- }),
53
- documentVariableName: "summaries",
54
- verbose
55
- }),
58
+ llmChain,
59
+ combineDocumentChain,
56
60
  returnIntermediateSteps,
57
61
  verbose
58
62
  });
@@ -66,17 +70,19 @@ function loadQAMapReduceChain(llm, params = {}) {
66
70
  */
67
71
  function loadQARefineChain(llm, params = {}) {
68
72
  const { questionPrompt = QUESTION_PROMPT_SELECTOR.getPrompt(llm), refinePrompt = REFINE_PROMPT_SELECTOR.getPrompt(llm), refineLLM, verbose } = params;
73
+ const llmChain = new LLMChain({
74
+ prompt: questionPrompt,
75
+ llm,
76
+ verbose
77
+ });
78
+ const refineLLMChain = new LLMChain({
79
+ prompt: refinePrompt,
80
+ llm: refineLLM ?? llm,
81
+ verbose
82
+ });
69
83
  return new RefineDocumentsChain({
70
- llmChain: new LLMChain({
71
- prompt: questionPrompt,
72
- llm,
73
- verbose
74
- }),
75
- refineLLMChain: new LLMChain({
76
- prompt: refinePrompt,
77
- llm: refineLLM ?? llm,
78
- verbose
79
- }),
84
+ llmChain,
85
+ refineLLMChain,
80
86
  verbose
81
87
  });
82
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","names":[],"sources":["../../../src/chains/question_answering/load.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { LLMChain } from \"../llm_chain.js\";\nimport {\n StuffDocumentsChain,\n MapReduceDocumentsChain,\n RefineDocumentsChain,\n MapReduceDocumentsChainInput,\n} from \"../combine_docs_chain.js\";\nimport { QA_PROMPT_SELECTOR } from \"./stuff_prompts.js\";\nimport {\n COMBINE_PROMPT_SELECTOR,\n COMBINE_QA_PROMPT_SELECTOR,\n} from \"./map_reduce_prompts.js\";\nimport {\n QUESTION_PROMPT_SELECTOR,\n REFINE_PROMPT_SELECTOR,\n} from \"./refine_prompts.js\";\n\n/**\n * Represents the parameters for creating a QAChain. It can be of three\n * types: \"stuff\", \"map_reduce\", or \"refine\".\n */\nexport type QAChainParams =\n | ({\n type?: \"stuff\";\n } & StuffQAChainParams)\n | ({\n type?: \"map_reduce\";\n } & MapReduceQAChainParams)\n | ({\n type?: \"refine\";\n } & RefineQAChainParams);\n\nexport const loadQAChain = (\n llm: BaseLanguageModelInterface,\n params: QAChainParams = { type: \"stuff\" }\n) => {\n const { type } = params;\n if (type === \"stuff\") {\n return loadQAStuffChain(llm, params);\n }\n if (type === \"map_reduce\") {\n return loadQAMapReduceChain(llm, params);\n }\n if (type === \"refine\") {\n return loadQARefineChain(llm, params);\n }\n throw new Error(`Invalid _type: ${type}`);\n};\n\n/**\n * Represents the parameters for creating a StuffQAChain.\n */\nexport interface StuffQAChainParams {\n prompt?: BasePromptTemplate;\n verbose?: boolean;\n}\n\n/**\n * Loads a StuffQAChain based on the provided parameters. It takes an LLM\n * instance and StuffQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a StuffQAChain.\n * @returns A StuffQAChain instance.\n */\nexport function loadQAStuffChain(\n llm: BaseLanguageModelInterface,\n params: StuffQAChainParams = {}\n) {\n const { prompt = QA_PROMPT_SELECTOR.getPrompt(llm), verbose } = params;\n const llmChain = new LLMChain({ prompt, llm, verbose });\n const chain = new StuffDocumentsChain({ llmChain, verbose });\n return chain;\n}\n\n/**\n * Represents the parameters for creating a MapReduceQAChain.\n */\nexport interface MapReduceQAChainParams {\n returnIntermediateSteps?: MapReduceDocumentsChainInput[\"returnIntermediateSteps\"];\n combineMapPrompt?: BasePromptTemplate;\n combinePrompt?: BasePromptTemplate;\n combineLLM?: BaseLanguageModelInterface;\n verbose?: boolean;\n}\n\n/**\n * Loads a MapReduceQAChain based on the provided parameters. It takes an\n * LLM instance and MapReduceQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a MapReduceQAChain.\n * @returns A MapReduceQAChain instance.\n */\nexport function loadQAMapReduceChain(\n llm: BaseLanguageModelInterface,\n params: MapReduceQAChainParams = {}\n) {\n const {\n combineMapPrompt = COMBINE_QA_PROMPT_SELECTOR.getPrompt(llm),\n combinePrompt = COMBINE_PROMPT_SELECTOR.getPrompt(llm),\n verbose,\n combineLLM,\n returnIntermediateSteps,\n } = params;\n const llmChain = new LLMChain({ prompt: combineMapPrompt, llm, verbose });\n const combineLLMChain = new LLMChain({\n prompt: combinePrompt,\n llm: combineLLM ?? llm,\n verbose,\n });\n const combineDocumentChain = new StuffDocumentsChain({\n llmChain: combineLLMChain,\n documentVariableName: \"summaries\",\n verbose,\n });\n const chain = new MapReduceDocumentsChain({\n llmChain,\n combineDocumentChain,\n returnIntermediateSteps,\n verbose,\n });\n return chain;\n}\n\n/**\n * Represents the parameters for creating a RefineQAChain.\n */\nexport interface RefineQAChainParams {\n questionPrompt?: BasePromptTemplate;\n refinePrompt?: BasePromptTemplate;\n refineLLM?: BaseLanguageModelInterface;\n verbose?: boolean;\n}\n\n/**\n * Loads a RefineQAChain based on the provided parameters. It takes an LLM\n * instance and RefineQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a RefineQAChain.\n * @returns A RefineQAChain instance.\n */\nexport function loadQARefineChain(\n llm: BaseLanguageModelInterface,\n params: RefineQAChainParams = {}\n) {\n const {\n questionPrompt = QUESTION_PROMPT_SELECTOR.getPrompt(llm),\n refinePrompt = REFINE_PROMPT_SELECTOR.getPrompt(llm),\n refineLLM,\n verbose,\n } = params;\n const llmChain = new LLMChain({ prompt: questionPrompt, llm, verbose });\n const refineLLMChain = new LLMChain({\n prompt: refinePrompt,\n llm: refineLLM ?? llm,\n verbose,\n });\n\n const chain = new RefineDocumentsChain({\n llmChain,\n refineLLMChain,\n verbose,\n });\n return chain;\n}\n"],"mappings":";;;;;;AAkCA,MAAa,eACX,KACA,SAAwB,EAAE,MAAM,QAAQ,MACrC;CACH,MAAM,EAAE,SAAS;CACjB,IAAI,SAAS,SACX,OAAO,iBAAiB,KAAK,MAAM;CAErC,IAAI,SAAS,cACX,OAAO,qBAAqB,KAAK,MAAM;CAEzC,IAAI,SAAS,UACX,OAAO,kBAAkB,KAAK,MAAM;CAEtC,MAAM,IAAI,MAAM,kBAAkB,MAAM;AAC1C;;;;;;;;AAiBA,SAAgB,iBACd,KACA,SAA6B,CAAC,GAC9B;CACA,MAAM,EAAE,SAAS,mBAAmB,UAAU,GAAG,GAAG,YAAY;CAGhE,OAAO,IADW,oBAAoB;EAAE,UAAA,IADnB,SAAS;GAAE;GAAQ;GAAK;EAAQ,CACN;EAAG;CAAQ,CAC/C;AACb;;;;;;;;AAoBA,SAAgB,qBACd,KACA,SAAiC,CAAC,GAClC;CACA,MAAM,EACJ,mBAAmB,2BAA2B,UAAU,GAAG,GAC3D,gBAAgB,wBAAwB,UAAU,GAAG,GACrD,SACA,YACA,4BACE;CAkBJ,OAAO,IANW,wBAAwB;EACxC,UAAA,IAZmB,SAAS;GAAE,QAAQ;GAAkB;GAAK;EAAQ,CAY9D;EACP,sBAAA,IAP+B,oBAAoB;GACnD,UAAU,IANgB,SAAS;IACnC,QAAQ;IACR,KAAK,cAAc;IACnB;GACF,CAE0B;GACxB,sBAAsB;GACtB;EACF,CAGqB;EACnB;EACA;CACF,CACW;AACb;;;;;;;;AAmBA,SAAgB,kBACd,KACA,SAA8B,CAAC,GAC/B;CACA,MAAM,EACJ,iBAAiB,yBAAyB,UAAU,GAAG,GACvD,eAAe,uBAAuB,UAAU,GAAG,GACnD,WACA,YACE;CAaJ,OAAO,IALW,qBAAqB;EACrC,UAAA,IARmB,SAAS;GAAE,QAAQ;GAAgB;GAAK;EAAQ,CAQ5D;EACP,gBAAA,IARyB,SAAS;GAClC,QAAQ;GACR,KAAK,aAAa;GAClB;EACF,CAIe;EACb;CACF,CACW;AACb"}
1
+ {"version":3,"file":"load.js","names":[],"sources":["../../../src/chains/question_answering/load.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { LLMChain } from \"../llm_chain.js\";\nimport {\n StuffDocumentsChain,\n MapReduceDocumentsChain,\n RefineDocumentsChain,\n MapReduceDocumentsChainInput,\n} from \"../combine_docs_chain.js\";\nimport { QA_PROMPT_SELECTOR } from \"./stuff_prompts.js\";\nimport {\n COMBINE_PROMPT_SELECTOR,\n COMBINE_QA_PROMPT_SELECTOR,\n} from \"./map_reduce_prompts.js\";\nimport {\n QUESTION_PROMPT_SELECTOR,\n REFINE_PROMPT_SELECTOR,\n} from \"./refine_prompts.js\";\n\n/**\n * Represents the parameters for creating a QAChain. It can be of three\n * types: \"stuff\", \"map_reduce\", or \"refine\".\n */\nexport type QAChainParams =\n | ({\n type?: \"stuff\";\n } & StuffQAChainParams)\n | ({\n type?: \"map_reduce\";\n } & MapReduceQAChainParams)\n | ({\n type?: \"refine\";\n } & RefineQAChainParams);\n\nexport const loadQAChain = (\n llm: BaseLanguageModelInterface,\n params: QAChainParams = { type: \"stuff\" }\n) => {\n const { type } = params;\n if (type === \"stuff\") {\n return loadQAStuffChain(llm, params);\n }\n if (type === \"map_reduce\") {\n return loadQAMapReduceChain(llm, params);\n }\n if (type === \"refine\") {\n return loadQARefineChain(llm, params);\n }\n throw new Error(`Invalid _type: ${type}`);\n};\n\n/**\n * Represents the parameters for creating a StuffQAChain.\n */\nexport interface StuffQAChainParams {\n prompt?: BasePromptTemplate;\n verbose?: boolean;\n}\n\n/**\n * Loads a StuffQAChain based on the provided parameters. It takes an LLM\n * instance and StuffQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a StuffQAChain.\n * @returns A StuffQAChain instance.\n */\nexport function loadQAStuffChain(\n llm: BaseLanguageModelInterface,\n params: StuffQAChainParams = {}\n) {\n const { prompt = QA_PROMPT_SELECTOR.getPrompt(llm), verbose } = params;\n const llmChain = new LLMChain({ prompt, llm, verbose });\n const chain = new StuffDocumentsChain({ llmChain, verbose });\n return chain;\n}\n\n/**\n * Represents the parameters for creating a MapReduceQAChain.\n */\nexport interface MapReduceQAChainParams {\n returnIntermediateSteps?: MapReduceDocumentsChainInput[\"returnIntermediateSteps\"];\n combineMapPrompt?: BasePromptTemplate;\n combinePrompt?: BasePromptTemplate;\n combineLLM?: BaseLanguageModelInterface;\n verbose?: boolean;\n}\n\n/**\n * Loads a MapReduceQAChain based on the provided parameters. It takes an\n * LLM instance and MapReduceQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a MapReduceQAChain.\n * @returns A MapReduceQAChain instance.\n */\nexport function loadQAMapReduceChain(\n llm: BaseLanguageModelInterface,\n params: MapReduceQAChainParams = {}\n) {\n const {\n combineMapPrompt = COMBINE_QA_PROMPT_SELECTOR.getPrompt(llm),\n combinePrompt = COMBINE_PROMPT_SELECTOR.getPrompt(llm),\n verbose,\n combineLLM,\n returnIntermediateSteps,\n } = params;\n const llmChain = new LLMChain({ prompt: combineMapPrompt, llm, verbose });\n const combineLLMChain = new LLMChain({\n prompt: combinePrompt,\n llm: combineLLM ?? llm,\n verbose,\n });\n const combineDocumentChain = new StuffDocumentsChain({\n llmChain: combineLLMChain,\n documentVariableName: \"summaries\",\n verbose,\n });\n const chain = new MapReduceDocumentsChain({\n llmChain,\n combineDocumentChain,\n returnIntermediateSteps,\n verbose,\n });\n return chain;\n}\n\n/**\n * Represents the parameters for creating a RefineQAChain.\n */\nexport interface RefineQAChainParams {\n questionPrompt?: BasePromptTemplate;\n refinePrompt?: BasePromptTemplate;\n refineLLM?: BaseLanguageModelInterface;\n verbose?: boolean;\n}\n\n/**\n * Loads a RefineQAChain based on the provided parameters. It takes an LLM\n * instance and RefineQAChainParams as parameters.\n * @param llm An instance of BaseLanguageModel.\n * @param params Parameters for creating a RefineQAChain.\n * @returns A RefineQAChain instance.\n */\nexport function loadQARefineChain(\n llm: BaseLanguageModelInterface,\n params: RefineQAChainParams = {}\n) {\n const {\n questionPrompt = QUESTION_PROMPT_SELECTOR.getPrompt(llm),\n refinePrompt = REFINE_PROMPT_SELECTOR.getPrompt(llm),\n refineLLM,\n verbose,\n } = params;\n const llmChain = new LLMChain({ prompt: questionPrompt, llm, verbose });\n const refineLLMChain = new LLMChain({\n prompt: refinePrompt,\n llm: refineLLM ?? llm,\n verbose,\n });\n\n const chain = new RefineDocumentsChain({\n llmChain,\n refineLLMChain,\n verbose,\n });\n return chain;\n}\n"],"mappings":";;;;;;AAkCA,MAAa,eACX,KACA,SAAwB,EAAE,MAAM,QAAQ,MACrC;CACH,MAAM,EAAE,SAAS;CACjB,IAAI,SAAS,SACX,OAAO,iBAAiB,KAAK,MAAM;CAErC,IAAI,SAAS,cACX,OAAO,qBAAqB,KAAK,MAAM;CAEzC,IAAI,SAAS,UACX,OAAO,kBAAkB,KAAK,MAAM;CAEtC,MAAM,IAAI,MAAM,kBAAkB,MAAM;AAC1C;;;;;;;;AAiBA,SAAgB,iBACd,KACA,SAA6B,CAAC,GAC9B;CACA,MAAM,EAAE,SAAS,mBAAmB,UAAU,GAAG,GAAG,YAAY;CAChE,MAAM,WAAW,IAAI,SAAS;EAAE;EAAQ;EAAK;CAAQ,CAAC;CAEtD,OAAO,IADW,oBAAoB;EAAE;EAAU;CAAQ,CAC/C;AACb;;;;;;;;AAoBA,SAAgB,qBACd,KACA,SAAiC,CAAC,GAClC;CACA,MAAM,EACJ,mBAAmB,2BAA2B,UAAU,GAAG,GAC3D,gBAAgB,wBAAwB,UAAU,GAAG,GACrD,SACA,YACA,4BACE;CACJ,MAAM,WAAW,IAAI,SAAS;EAAE,QAAQ;EAAkB;EAAK;CAAQ,CAAC;CACxE,MAAM,kBAAkB,IAAI,SAAS;EACnC,QAAQ;EACR,KAAK,cAAc;EACnB;CACF,CAAC;CACD,MAAM,uBAAuB,IAAI,oBAAoB;EACnD,UAAU;EACV,sBAAsB;EACtB;CACF,CAAC;CAOD,OAAO,IANW,wBAAwB;EACxC;EACA;EACA;EACA;CACF,CACW;AACb;;;;;;;;AAmBA,SAAgB,kBACd,KACA,SAA8B,CAAC,GAC/B;CACA,MAAM,EACJ,iBAAiB,yBAAyB,UAAU,GAAG,GACvD,eAAe,uBAAuB,UAAU,GAAG,GACnD,WACA,YACE;CACJ,MAAM,WAAW,IAAI,SAAS;EAAE,QAAQ;EAAgB;EAAK;CAAQ,CAAC;CACtE,MAAM,iBAAiB,IAAI,SAAS;EAClC,QAAQ;EACR,KAAK,aAAa;EAClB;CACF,CAAC;CAOD,OAAO,IALW,qBAAqB;EACrC;EACA;EACA;CACF,CACW;AACb"}
@@ -64,13 +64,15 @@ var MultiPromptChain = class MultiPromptChain extends require_multi_route.MultiR
64
64
  */
65
65
  static fromLLMAndPrompts(llm, { promptNames, promptDescriptions, promptTemplates, defaultChain, llmChainOpts, conversationChainOpts, multiRouteChainOpts }) {
66
66
  const destinations = require_utils.zipEntries(promptNames, promptDescriptions).map(([name, desc]) => `${name}: ${desc}`);
67
- const outputParser = new require_router.RouterOutputParser(zod_v3.z.object({
67
+ const structuredOutputParserSchema = zod_v3.z.object({
68
68
  destination: zod_v3.z.string().optional().describe("name of the question answering system to use or \"DEFAULT\""),
69
69
  next_inputs: zod_v3.z.object({ input: zod_v3.z.string().describe("a potentially modified version of the original input") }).describe("input to be fed to the next model")
70
- }));
70
+ });
71
+ const outputParser = new require_router.RouterOutputParser(structuredOutputParserSchema);
71
72
  const destinationsStr = destinations.join("\n");
73
+ const routerTemplate = (0, _langchain_core_prompts.interpolateFString)(require_multi_prompt_prompt.STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE(outputParser.getFormatInstructions({ interpolationDepth: 4 })), { destinations: destinationsStr });
72
74
  const routerPrompt = new _langchain_core_prompts.PromptTemplate({
73
- template: (0, _langchain_core_prompts.interpolateFString)(require_multi_prompt_prompt.STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE(outputParser.getFormatInstructions({ interpolationDepth: 4 })), { destinations: destinationsStr }),
75
+ template: routerTemplate,
74
76
  inputVariables: ["input"],
75
77
  outputParser
76
78
  });
@@ -1 +1 @@
1
- {"version":3,"file":"multi_prompt.cjs","names":["MultiRouteChain","zipEntries","RouterOutputParser","z","PromptTemplate","STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE","LLMRouterChain","LLMChain","ConversationChain"],"sources":["../../../src/chains/router/multi_prompt.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { z } from \"zod/v3\";\nimport { interpolateFString, PromptTemplate } from \"@langchain/core/prompts\";\nimport { MultiRouteChain, MultiRouteChainInput } from \"./multi_route.js\";\nimport { STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE } from \"./multi_prompt_prompt.js\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMChain, LLMChainInput } from \"../../chains/llm_chain.js\";\nimport { LLMRouterChain } from \"./llm_router.js\";\nimport { ConversationChain } from \"../../chains/conversation.js\";\nimport { zipEntries } from \"./utils.js\";\nimport { RouterOutputParser } from \"../../output_parsers/router.js\";\n\n/**\n * A class that represents a multi-prompt chain in the LangChain\n * framework. It extends the MultiRouteChain class and provides additional\n * functionality specific to multi-prompt chains.\n * @example\n * ```typescript\n * const multiPromptChain = MultiPromptChain.fromLLMAndPrompts(\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * {\n * promptNames: [\"physics\", \"math\", \"history\"],\n * promptDescriptions: [\n * \"Good for answering questions about physics\",\n * \"Good for answering math questions\",\n * \"Good for answering questions about history\",\n * ],\n * promptTemplates: [\n * `You are a very smart physics professor. Here is a question:\\n{input}\\n`,\n * `You are a very good mathematician. Here is a question:\\n{input}\\n`,\n * `You are a very smart history professor. Here is a question:\\n{input}\\n`,\n * ],\n * }\n * );\n * const result = await multiPromptChain.call({\n * input: \"What is the speed of light?\",\n * });\n * ```\n */\nexport class MultiPromptChain extends MultiRouteChain {\n /**\n * @deprecated Use `fromLLMAndPrompts` instead\n */\n static fromPrompts(\n llm: BaseLanguageModelInterface,\n promptNames: string[],\n promptDescriptions: string[],\n promptTemplates: string[] | PromptTemplate[],\n defaultChain?: BaseChain,\n options?: Omit<MultiRouteChainInput, \"defaultChain\">\n ) {\n return MultiPromptChain.fromLLMAndPrompts(llm, {\n promptNames,\n promptDescriptions,\n promptTemplates,\n defaultChain,\n multiRouteChainOpts: options,\n });\n }\n\n /**\n * A static method that creates an instance of MultiPromptChain from a\n * BaseLanguageModel and a set of prompts. It takes in optional parameters\n * for the default chain and additional options.\n * @param llm A BaseLanguageModel instance.\n * @param promptNames An array of prompt names.\n * @param promptDescriptions An array of prompt descriptions.\n * @param promptTemplates An array of prompt templates.\n * @param defaultChain An optional BaseChain instance to be used as the default chain.\n * @param llmChainOpts Optional parameters for the LLMChainInput, excluding 'llm' and 'prompt'.\n * @param conversationChainOpts Optional parameters for the LLMChainInput, excluding 'llm' and 'outputKey'.\n * @param multiRouteChainOpts Optional parameters for the MultiRouteChainInput, excluding 'defaultChain'.\n * @returns An instance of MultiPromptChain.\n */\n static fromLLMAndPrompts(\n llm: BaseLanguageModelInterface,\n {\n promptNames,\n promptDescriptions,\n promptTemplates,\n defaultChain,\n llmChainOpts,\n conversationChainOpts,\n multiRouteChainOpts,\n }: {\n promptNames: string[];\n promptDescriptions: string[];\n promptTemplates: string[] | PromptTemplate[];\n defaultChain?: BaseChain;\n llmChainOpts?: Omit<LLMChainInput, \"llm\" | \"prompt\">;\n conversationChainOpts?: Omit<LLMChainInput, \"llm\" | \"outputKey\">;\n multiRouteChainOpts?: Omit<MultiRouteChainInput, \"defaultChain\">;\n }\n ): MultiPromptChain {\n const destinations = zipEntries(promptNames, promptDescriptions).map(\n ([name, desc]) => `${name}: ${desc}`\n );\n\n const structuredOutputParserSchema = z.object({\n destination: z\n .string()\n .optional()\n .describe('name of the question answering system to use or \"DEFAULT\"'),\n next_inputs: z\n .object({\n input: z\n .string()\n .describe(\"a potentially modified version of the original input\"),\n })\n .describe(\"input to be fed to the next model\"),\n });\n\n const outputParser = new RouterOutputParser(structuredOutputParserSchema);\n\n const destinationsStr = destinations.join(\"\\n\");\n const routerTemplate = interpolateFString(\n STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE(\n outputParser.getFormatInstructions({ interpolationDepth: 4 })\n ),\n {\n destinations: destinationsStr,\n }\n );\n\n const routerPrompt = new PromptTemplate({\n template: routerTemplate,\n inputVariables: [\"input\"],\n outputParser,\n });\n\n const routerChain = LLMRouterChain.fromLLM(llm, routerPrompt);\n const destinationChains = zipEntries<[string, string | PromptTemplate]>(\n promptNames,\n promptTemplates\n ).reduce(\n (acc, [name, template]) => {\n let myPrompt: string | PromptTemplate;\n if (typeof template === \"object\") {\n myPrompt = template;\n } else if (typeof template === \"string\") {\n myPrompt = new PromptTemplate({\n template: template as string,\n inputVariables: [\"input\"],\n });\n } else {\n throw new Error(\"Invalid prompt template\");\n }\n acc[name as string] = new LLMChain({\n ...llmChainOpts,\n llm,\n prompt: myPrompt,\n });\n return acc;\n },\n {} as { [name: string]: LLMChain }\n );\n\n const convChain = new ConversationChain({\n ...conversationChainOpts,\n llm,\n outputKey: \"text\",\n });\n\n return new MultiPromptChain({\n ...multiRouteChainOpts,\n routerChain,\n destinationChains,\n defaultChain: defaultChain ?? convChain,\n });\n }\n\n _chainType(): string {\n return \"multi_prompt_chain\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,IAAa,mBAAb,MAAa,yBAAyBA,oBAAAA,gBAAgB;;;;CAIpD,OAAO,YACL,KACA,aACA,oBACA,iBACA,cACA,SACA;EACA,OAAO,iBAAiB,kBAAkB,KAAK;GAC7C;GACA;GACA;GACA;GACA,qBAAqB;EACvB,CAAC;CACH;;;;;;;;;;;;;;;CAgBA,OAAO,kBACL,KACA,EACE,aACA,oBACA,iBACA,cACA,cACA,uBACA,uBAUgB;EAClB,MAAM,eAAeC,cAAAA,WAAW,aAAa,kBAAkB,CAAC,CAAC,KAC9D,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,MAChC;EAgBA,MAAM,eAAe,IAAIC,eAAAA,mBAdYC,OAAAA,EAAE,OAAO;GAC5C,aAAaA,OAAAA,EACV,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,6DAA2D;GACvE,aAAaA,OAAAA,EACV,OAAO,EACN,OAAOA,OAAAA,EACJ,OAAO,CAAC,CACR,SAAS,sDAAsD,EACpE,CAAC,CAAC,CACD,SAAS,mCAAmC;EACjD,CAEuE,CAAC;EAExE,MAAM,kBAAkB,aAAa,KAAK,IAAI;EAU9C,MAAM,eAAe,IAAIC,wBAAAA,eAAe;GACtC,WAAA,GAAA,wBAAA,mBAAA,CATAC,4BAAAA,wCACE,aAAa,sBAAsB,EAAE,oBAAoB,EAAE,CAAC,CAC9D,GACA,EACE,cAAc,gBAChB,CAIuB;GACvB,gBAAgB,CAAC,OAAO;GACxB;EACF,CAAC;EAED,MAAM,cAAcC,mBAAAA,eAAe,QAAQ,KAAK,YAAY;EAC5D,MAAM,oBAAoBL,cAAAA,WACxB,aACA,eACF,CAAC,CAAC,QACC,KAAK,CAAC,MAAM,cAAc;GACzB,IAAI;GACJ,IAAI,OAAO,aAAa,UACtB,WAAW;QACN,IAAI,OAAO,aAAa,UAC7B,WAAW,IAAIG,wBAAAA,eAAe;IAClB;IACV,gBAAgB,CAAC,OAAO;GAC1B,CAAC;QAED,MAAM,IAAI,MAAM,yBAAyB;GAE3C,IAAI,QAAkB,IAAIG,kBAAAA,SAAS;IACjC,GAAG;IACH;IACA,QAAQ;GACV,CAAC;GACD,OAAO;EACT,GACA,CAAC,CACH;EAEA,MAAM,YAAY,IAAIC,qBAAAA,kBAAkB;GACtC,GAAG;GACH;GACA,WAAW;EACb,CAAC;EAED,OAAO,IAAI,iBAAiB;GAC1B,GAAG;GACH;GACA;GACA,cAAc,gBAAgB;EAChC,CAAC;CACH;CAEA,aAAqB;EACnB,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"multi_prompt.cjs","names":["MultiRouteChain","zipEntries","z","RouterOutputParser","interpolateFString","STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE","PromptTemplate","LLMRouterChain","LLMChain","ConversationChain"],"sources":["../../../src/chains/router/multi_prompt.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { z } from \"zod/v3\";\nimport { interpolateFString, PromptTemplate } from \"@langchain/core/prompts\";\nimport { MultiRouteChain, MultiRouteChainInput } from \"./multi_route.js\";\nimport { STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE } from \"./multi_prompt_prompt.js\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMChain, LLMChainInput } from \"../../chains/llm_chain.js\";\nimport { LLMRouterChain } from \"./llm_router.js\";\nimport { ConversationChain } from \"../../chains/conversation.js\";\nimport { zipEntries } from \"./utils.js\";\nimport { RouterOutputParser } from \"../../output_parsers/router.js\";\n\n/**\n * A class that represents a multi-prompt chain in the LangChain\n * framework. It extends the MultiRouteChain class and provides additional\n * functionality specific to multi-prompt chains.\n * @example\n * ```typescript\n * const multiPromptChain = MultiPromptChain.fromLLMAndPrompts(\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * {\n * promptNames: [\"physics\", \"math\", \"history\"],\n * promptDescriptions: [\n * \"Good for answering questions about physics\",\n * \"Good for answering math questions\",\n * \"Good for answering questions about history\",\n * ],\n * promptTemplates: [\n * `You are a very smart physics professor. Here is a question:\\n{input}\\n`,\n * `You are a very good mathematician. Here is a question:\\n{input}\\n`,\n * `You are a very smart history professor. Here is a question:\\n{input}\\n`,\n * ],\n * }\n * );\n * const result = await multiPromptChain.call({\n * input: \"What is the speed of light?\",\n * });\n * ```\n */\nexport class MultiPromptChain extends MultiRouteChain {\n /**\n * @deprecated Use `fromLLMAndPrompts` instead\n */\n static fromPrompts(\n llm: BaseLanguageModelInterface,\n promptNames: string[],\n promptDescriptions: string[],\n promptTemplates: string[] | PromptTemplate[],\n defaultChain?: BaseChain,\n options?: Omit<MultiRouteChainInput, \"defaultChain\">\n ) {\n return MultiPromptChain.fromLLMAndPrompts(llm, {\n promptNames,\n promptDescriptions,\n promptTemplates,\n defaultChain,\n multiRouteChainOpts: options,\n });\n }\n\n /**\n * A static method that creates an instance of MultiPromptChain from a\n * BaseLanguageModel and a set of prompts. It takes in optional parameters\n * for the default chain and additional options.\n * @param llm A BaseLanguageModel instance.\n * @param promptNames An array of prompt names.\n * @param promptDescriptions An array of prompt descriptions.\n * @param promptTemplates An array of prompt templates.\n * @param defaultChain An optional BaseChain instance to be used as the default chain.\n * @param llmChainOpts Optional parameters for the LLMChainInput, excluding 'llm' and 'prompt'.\n * @param conversationChainOpts Optional parameters for the LLMChainInput, excluding 'llm' and 'outputKey'.\n * @param multiRouteChainOpts Optional parameters for the MultiRouteChainInput, excluding 'defaultChain'.\n * @returns An instance of MultiPromptChain.\n */\n static fromLLMAndPrompts(\n llm: BaseLanguageModelInterface,\n {\n promptNames,\n promptDescriptions,\n promptTemplates,\n defaultChain,\n llmChainOpts,\n conversationChainOpts,\n multiRouteChainOpts,\n }: {\n promptNames: string[];\n promptDescriptions: string[];\n promptTemplates: string[] | PromptTemplate[];\n defaultChain?: BaseChain;\n llmChainOpts?: Omit<LLMChainInput, \"llm\" | \"prompt\">;\n conversationChainOpts?: Omit<LLMChainInput, \"llm\" | \"outputKey\">;\n multiRouteChainOpts?: Omit<MultiRouteChainInput, \"defaultChain\">;\n }\n ): MultiPromptChain {\n const destinations = zipEntries(promptNames, promptDescriptions).map(\n ([name, desc]) => `${name}: ${desc}`\n );\n\n const structuredOutputParserSchema = z.object({\n destination: z\n .string()\n .optional()\n .describe('name of the question answering system to use or \"DEFAULT\"'),\n next_inputs: z\n .object({\n input: z\n .string()\n .describe(\"a potentially modified version of the original input\"),\n })\n .describe(\"input to be fed to the next model\"),\n });\n\n const outputParser = new RouterOutputParser(structuredOutputParserSchema);\n\n const destinationsStr = destinations.join(\"\\n\");\n const routerTemplate = interpolateFString(\n STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE(\n outputParser.getFormatInstructions({ interpolationDepth: 4 })\n ),\n {\n destinations: destinationsStr,\n }\n );\n\n const routerPrompt = new PromptTemplate({\n template: routerTemplate,\n inputVariables: [\"input\"],\n outputParser,\n });\n\n const routerChain = LLMRouterChain.fromLLM(llm, routerPrompt);\n const destinationChains = zipEntries<[string, string | PromptTemplate]>(\n promptNames,\n promptTemplates\n ).reduce(\n (acc, [name, template]) => {\n let myPrompt: string | PromptTemplate;\n if (typeof template === \"object\") {\n myPrompt = template;\n } else if (typeof template === \"string\") {\n myPrompt = new PromptTemplate({\n template: template as string,\n inputVariables: [\"input\"],\n });\n } else {\n throw new Error(\"Invalid prompt template\");\n }\n acc[name as string] = new LLMChain({\n ...llmChainOpts,\n llm,\n prompt: myPrompt,\n });\n return acc;\n },\n {} as { [name: string]: LLMChain }\n );\n\n const convChain = new ConversationChain({\n ...conversationChainOpts,\n llm,\n outputKey: \"text\",\n });\n\n return new MultiPromptChain({\n ...multiRouteChainOpts,\n routerChain,\n destinationChains,\n defaultChain: defaultChain ?? convChain,\n });\n }\n\n _chainType(): string {\n return \"multi_prompt_chain\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,IAAa,mBAAb,MAAa,yBAAyBA,oBAAAA,gBAAgB;;;;CAIpD,OAAO,YACL,KACA,aACA,oBACA,iBACA,cACA,SACA;EACA,OAAO,iBAAiB,kBAAkB,KAAK;GAC7C;GACA;GACA;GACA;GACA,qBAAqB;EACvB,CAAC;CACH;;;;;;;;;;;;;;;CAgBA,OAAO,kBACL,KACA,EACE,aACA,oBACA,iBACA,cACA,cACA,uBACA,uBAUgB;EAClB,MAAM,eAAeC,cAAAA,WAAW,aAAa,kBAAkB,CAAC,CAAC,KAC9D,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,MAChC;EAEA,MAAM,+BAA+BC,OAAAA,EAAE,OAAO;GAC5C,aAAaA,OAAAA,EACV,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,6DAA2D;GACvE,aAAaA,OAAAA,EACV,OAAO,EACN,OAAOA,OAAAA,EACJ,OAAO,CAAC,CACR,SAAS,sDAAsD,EACpE,CAAC,CAAC,CACD,SAAS,mCAAmC;EACjD,CAAC;EAED,MAAM,eAAe,IAAIC,eAAAA,mBAAmB,4BAA4B;EAExE,MAAM,kBAAkB,aAAa,KAAK,IAAI;EAC9C,MAAM,kBAAA,GAAiBC,wBAAAA,mBAAAA,CACrBC,4BAAAA,wCACE,aAAa,sBAAsB,EAAE,oBAAoB,EAAE,CAAC,CAC9D,GACA,EACE,cAAc,gBAChB,CACF;EAEA,MAAM,eAAe,IAAIC,wBAAAA,eAAe;GACtC,UAAU;GACV,gBAAgB,CAAC,OAAO;GACxB;EACF,CAAC;EAED,MAAM,cAAcC,mBAAAA,eAAe,QAAQ,KAAK,YAAY;EAC5D,MAAM,oBAAoBN,cAAAA,WACxB,aACA,eACF,CAAC,CAAC,QACC,KAAK,CAAC,MAAM,cAAc;GACzB,IAAI;GACJ,IAAI,OAAO,aAAa,UACtB,WAAW;QACN,IAAI,OAAO,aAAa,UAC7B,WAAW,IAAIK,wBAAAA,eAAe;IAClB;IACV,gBAAgB,CAAC,OAAO;GAC1B,CAAC;QAED,MAAM,IAAI,MAAM,yBAAyB;GAE3C,IAAI,QAAkB,IAAIE,kBAAAA,SAAS;IACjC,GAAG;IACH;IACA,QAAQ;GACV,CAAC;GACD,OAAO;EACT,GACA,CAAC,CACH;EAEA,MAAM,YAAY,IAAIC,qBAAAA,kBAAkB;GACtC,GAAG;GACH;GACA,WAAW;EACb,CAAC;EAED,OAAO,IAAI,iBAAiB;GAC1B,GAAG;GACH;GACA;GACA,cAAc,gBAAgB;EAChC,CAAC;CACH;CAEA,aAAqB;EACnB,OAAO;CACT;AACF"}
@@ -64,13 +64,15 @@ var MultiPromptChain = class MultiPromptChain extends MultiRouteChain {
64
64
  */
65
65
  static fromLLMAndPrompts(llm, { promptNames, promptDescriptions, promptTemplates, defaultChain, llmChainOpts, conversationChainOpts, multiRouteChainOpts }) {
66
66
  const destinations = zipEntries(promptNames, promptDescriptions).map(([name, desc]) => `${name}: ${desc}`);
67
- const outputParser = new RouterOutputParser(z.object({
67
+ const structuredOutputParserSchema = z.object({
68
68
  destination: z.string().optional().describe("name of the question answering system to use or \"DEFAULT\""),
69
69
  next_inputs: z.object({ input: z.string().describe("a potentially modified version of the original input") }).describe("input to be fed to the next model")
70
- }));
70
+ });
71
+ const outputParser = new RouterOutputParser(structuredOutputParserSchema);
71
72
  const destinationsStr = destinations.join("\n");
73
+ const routerTemplate = interpolateFString(STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE(outputParser.getFormatInstructions({ interpolationDepth: 4 })), { destinations: destinationsStr });
72
74
  const routerPrompt = new PromptTemplate({
73
- template: interpolateFString(STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE(outputParser.getFormatInstructions({ interpolationDepth: 4 })), { destinations: destinationsStr }),
75
+ template: routerTemplate,
74
76
  inputVariables: ["input"],
75
77
  outputParser
76
78
  });
@@ -1 +1 @@
1
- {"version":3,"file":"multi_prompt.js","names":[],"sources":["../../../src/chains/router/multi_prompt.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { z } from \"zod/v3\";\nimport { interpolateFString, PromptTemplate } from \"@langchain/core/prompts\";\nimport { MultiRouteChain, MultiRouteChainInput } from \"./multi_route.js\";\nimport { STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE } from \"./multi_prompt_prompt.js\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMChain, LLMChainInput } from \"../../chains/llm_chain.js\";\nimport { LLMRouterChain } from \"./llm_router.js\";\nimport { ConversationChain } from \"../../chains/conversation.js\";\nimport { zipEntries } from \"./utils.js\";\nimport { RouterOutputParser } from \"../../output_parsers/router.js\";\n\n/**\n * A class that represents a multi-prompt chain in the LangChain\n * framework. It extends the MultiRouteChain class and provides additional\n * functionality specific to multi-prompt chains.\n * @example\n * ```typescript\n * const multiPromptChain = MultiPromptChain.fromLLMAndPrompts(\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * {\n * promptNames: [\"physics\", \"math\", \"history\"],\n * promptDescriptions: [\n * \"Good for answering questions about physics\",\n * \"Good for answering math questions\",\n * \"Good for answering questions about history\",\n * ],\n * promptTemplates: [\n * `You are a very smart physics professor. Here is a question:\\n{input}\\n`,\n * `You are a very good mathematician. Here is a question:\\n{input}\\n`,\n * `You are a very smart history professor. Here is a question:\\n{input}\\n`,\n * ],\n * }\n * );\n * const result = await multiPromptChain.call({\n * input: \"What is the speed of light?\",\n * });\n * ```\n */\nexport class MultiPromptChain extends MultiRouteChain {\n /**\n * @deprecated Use `fromLLMAndPrompts` instead\n */\n static fromPrompts(\n llm: BaseLanguageModelInterface,\n promptNames: string[],\n promptDescriptions: string[],\n promptTemplates: string[] | PromptTemplate[],\n defaultChain?: BaseChain,\n options?: Omit<MultiRouteChainInput, \"defaultChain\">\n ) {\n return MultiPromptChain.fromLLMAndPrompts(llm, {\n promptNames,\n promptDescriptions,\n promptTemplates,\n defaultChain,\n multiRouteChainOpts: options,\n });\n }\n\n /**\n * A static method that creates an instance of MultiPromptChain from a\n * BaseLanguageModel and a set of prompts. It takes in optional parameters\n * for the default chain and additional options.\n * @param llm A BaseLanguageModel instance.\n * @param promptNames An array of prompt names.\n * @param promptDescriptions An array of prompt descriptions.\n * @param promptTemplates An array of prompt templates.\n * @param defaultChain An optional BaseChain instance to be used as the default chain.\n * @param llmChainOpts Optional parameters for the LLMChainInput, excluding 'llm' and 'prompt'.\n * @param conversationChainOpts Optional parameters for the LLMChainInput, excluding 'llm' and 'outputKey'.\n * @param multiRouteChainOpts Optional parameters for the MultiRouteChainInput, excluding 'defaultChain'.\n * @returns An instance of MultiPromptChain.\n */\n static fromLLMAndPrompts(\n llm: BaseLanguageModelInterface,\n {\n promptNames,\n promptDescriptions,\n promptTemplates,\n defaultChain,\n llmChainOpts,\n conversationChainOpts,\n multiRouteChainOpts,\n }: {\n promptNames: string[];\n promptDescriptions: string[];\n promptTemplates: string[] | PromptTemplate[];\n defaultChain?: BaseChain;\n llmChainOpts?: Omit<LLMChainInput, \"llm\" | \"prompt\">;\n conversationChainOpts?: Omit<LLMChainInput, \"llm\" | \"outputKey\">;\n multiRouteChainOpts?: Omit<MultiRouteChainInput, \"defaultChain\">;\n }\n ): MultiPromptChain {\n const destinations = zipEntries(promptNames, promptDescriptions).map(\n ([name, desc]) => `${name}: ${desc}`\n );\n\n const structuredOutputParserSchema = z.object({\n destination: z\n .string()\n .optional()\n .describe('name of the question answering system to use or \"DEFAULT\"'),\n next_inputs: z\n .object({\n input: z\n .string()\n .describe(\"a potentially modified version of the original input\"),\n })\n .describe(\"input to be fed to the next model\"),\n });\n\n const outputParser = new RouterOutputParser(structuredOutputParserSchema);\n\n const destinationsStr = destinations.join(\"\\n\");\n const routerTemplate = interpolateFString(\n STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE(\n outputParser.getFormatInstructions({ interpolationDepth: 4 })\n ),\n {\n destinations: destinationsStr,\n }\n );\n\n const routerPrompt = new PromptTemplate({\n template: routerTemplate,\n inputVariables: [\"input\"],\n outputParser,\n });\n\n const routerChain = LLMRouterChain.fromLLM(llm, routerPrompt);\n const destinationChains = zipEntries<[string, string | PromptTemplate]>(\n promptNames,\n promptTemplates\n ).reduce(\n (acc, [name, template]) => {\n let myPrompt: string | PromptTemplate;\n if (typeof template === \"object\") {\n myPrompt = template;\n } else if (typeof template === \"string\") {\n myPrompt = new PromptTemplate({\n template: template as string,\n inputVariables: [\"input\"],\n });\n } else {\n throw new Error(\"Invalid prompt template\");\n }\n acc[name as string] = new LLMChain({\n ...llmChainOpts,\n llm,\n prompt: myPrompt,\n });\n return acc;\n },\n {} as { [name: string]: LLMChain }\n );\n\n const convChain = new ConversationChain({\n ...conversationChainOpts,\n llm,\n outputKey: \"text\",\n });\n\n return new MultiPromptChain({\n ...multiRouteChainOpts,\n routerChain,\n destinationChains,\n defaultChain: defaultChain ?? convChain,\n });\n }\n\n _chainType(): string {\n return \"multi_prompt_chain\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,IAAa,mBAAb,MAAa,yBAAyB,gBAAgB;;;;CAIpD,OAAO,YACL,KACA,aACA,oBACA,iBACA,cACA,SACA;EACA,OAAO,iBAAiB,kBAAkB,KAAK;GAC7C;GACA;GACA;GACA;GACA,qBAAqB;EACvB,CAAC;CACH;;;;;;;;;;;;;;;CAgBA,OAAO,kBACL,KACA,EACE,aACA,oBACA,iBACA,cACA,cACA,uBACA,uBAUgB;EAClB,MAAM,eAAe,WAAW,aAAa,kBAAkB,CAAC,CAAC,KAC9D,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,MAChC;EAgBA,MAAM,eAAe,IAAI,mBAdY,EAAE,OAAO;GAC5C,aAAa,EACV,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,6DAA2D;GACvE,aAAa,EACV,OAAO,EACN,OAAO,EACJ,OAAO,CAAC,CACR,SAAS,sDAAsD,EACpE,CAAC,CAAC,CACD,SAAS,mCAAmC;EACjD,CAEuE,CAAC;EAExE,MAAM,kBAAkB,aAAa,KAAK,IAAI;EAU9C,MAAM,eAAe,IAAI,eAAe;GACtC,UAVqB,mBACrB,wCACE,aAAa,sBAAsB,EAAE,oBAAoB,EAAE,CAAC,CAC9D,GACA,EACE,cAAc,gBAChB,CAIuB;GACvB,gBAAgB,CAAC,OAAO;GACxB;EACF,CAAC;EAED,MAAM,cAAc,eAAe,QAAQ,KAAK,YAAY;EAC5D,MAAM,oBAAoB,WACxB,aACA,eACF,CAAC,CAAC,QACC,KAAK,CAAC,MAAM,cAAc;GACzB,IAAI;GACJ,IAAI,OAAO,aAAa,UACtB,WAAW;QACN,IAAI,OAAO,aAAa,UAC7B,WAAW,IAAI,eAAe;IAClB;IACV,gBAAgB,CAAC,OAAO;GAC1B,CAAC;QAED,MAAM,IAAI,MAAM,yBAAyB;GAE3C,IAAI,QAAkB,IAAI,SAAS;IACjC,GAAG;IACH;IACA,QAAQ;GACV,CAAC;GACD,OAAO;EACT,GACA,CAAC,CACH;EAEA,MAAM,YAAY,IAAI,kBAAkB;GACtC,GAAG;GACH;GACA,WAAW;EACb,CAAC;EAED,OAAO,IAAI,iBAAiB;GAC1B,GAAG;GACH;GACA;GACA,cAAc,gBAAgB;EAChC,CAAC;CACH;CAEA,aAAqB;EACnB,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"multi_prompt.js","names":[],"sources":["../../../src/chains/router/multi_prompt.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { z } from \"zod/v3\";\nimport { interpolateFString, PromptTemplate } from \"@langchain/core/prompts\";\nimport { MultiRouteChain, MultiRouteChainInput } from \"./multi_route.js\";\nimport { STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE } from \"./multi_prompt_prompt.js\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMChain, LLMChainInput } from \"../../chains/llm_chain.js\";\nimport { LLMRouterChain } from \"./llm_router.js\";\nimport { ConversationChain } from \"../../chains/conversation.js\";\nimport { zipEntries } from \"./utils.js\";\nimport { RouterOutputParser } from \"../../output_parsers/router.js\";\n\n/**\n * A class that represents a multi-prompt chain in the LangChain\n * framework. It extends the MultiRouteChain class and provides additional\n * functionality specific to multi-prompt chains.\n * @example\n * ```typescript\n * const multiPromptChain = MultiPromptChain.fromLLMAndPrompts(\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * {\n * promptNames: [\"physics\", \"math\", \"history\"],\n * promptDescriptions: [\n * \"Good for answering questions about physics\",\n * \"Good for answering math questions\",\n * \"Good for answering questions about history\",\n * ],\n * promptTemplates: [\n * `You are a very smart physics professor. Here is a question:\\n{input}\\n`,\n * `You are a very good mathematician. Here is a question:\\n{input}\\n`,\n * `You are a very smart history professor. Here is a question:\\n{input}\\n`,\n * ],\n * }\n * );\n * const result = await multiPromptChain.call({\n * input: \"What is the speed of light?\",\n * });\n * ```\n */\nexport class MultiPromptChain extends MultiRouteChain {\n /**\n * @deprecated Use `fromLLMAndPrompts` instead\n */\n static fromPrompts(\n llm: BaseLanguageModelInterface,\n promptNames: string[],\n promptDescriptions: string[],\n promptTemplates: string[] | PromptTemplate[],\n defaultChain?: BaseChain,\n options?: Omit<MultiRouteChainInput, \"defaultChain\">\n ) {\n return MultiPromptChain.fromLLMAndPrompts(llm, {\n promptNames,\n promptDescriptions,\n promptTemplates,\n defaultChain,\n multiRouteChainOpts: options,\n });\n }\n\n /**\n * A static method that creates an instance of MultiPromptChain from a\n * BaseLanguageModel and a set of prompts. It takes in optional parameters\n * for the default chain and additional options.\n * @param llm A BaseLanguageModel instance.\n * @param promptNames An array of prompt names.\n * @param promptDescriptions An array of prompt descriptions.\n * @param promptTemplates An array of prompt templates.\n * @param defaultChain An optional BaseChain instance to be used as the default chain.\n * @param llmChainOpts Optional parameters for the LLMChainInput, excluding 'llm' and 'prompt'.\n * @param conversationChainOpts Optional parameters for the LLMChainInput, excluding 'llm' and 'outputKey'.\n * @param multiRouteChainOpts Optional parameters for the MultiRouteChainInput, excluding 'defaultChain'.\n * @returns An instance of MultiPromptChain.\n */\n static fromLLMAndPrompts(\n llm: BaseLanguageModelInterface,\n {\n promptNames,\n promptDescriptions,\n promptTemplates,\n defaultChain,\n llmChainOpts,\n conversationChainOpts,\n multiRouteChainOpts,\n }: {\n promptNames: string[];\n promptDescriptions: string[];\n promptTemplates: string[] | PromptTemplate[];\n defaultChain?: BaseChain;\n llmChainOpts?: Omit<LLMChainInput, \"llm\" | \"prompt\">;\n conversationChainOpts?: Omit<LLMChainInput, \"llm\" | \"outputKey\">;\n multiRouteChainOpts?: Omit<MultiRouteChainInput, \"defaultChain\">;\n }\n ): MultiPromptChain {\n const destinations = zipEntries(promptNames, promptDescriptions).map(\n ([name, desc]) => `${name}: ${desc}`\n );\n\n const structuredOutputParserSchema = z.object({\n destination: z\n .string()\n .optional()\n .describe('name of the question answering system to use or \"DEFAULT\"'),\n next_inputs: z\n .object({\n input: z\n .string()\n .describe(\"a potentially modified version of the original input\"),\n })\n .describe(\"input to be fed to the next model\"),\n });\n\n const outputParser = new RouterOutputParser(structuredOutputParserSchema);\n\n const destinationsStr = destinations.join(\"\\n\");\n const routerTemplate = interpolateFString(\n STRUCTURED_MULTI_PROMPT_ROUTER_TEMPLATE(\n outputParser.getFormatInstructions({ interpolationDepth: 4 })\n ),\n {\n destinations: destinationsStr,\n }\n );\n\n const routerPrompt = new PromptTemplate({\n template: routerTemplate,\n inputVariables: [\"input\"],\n outputParser,\n });\n\n const routerChain = LLMRouterChain.fromLLM(llm, routerPrompt);\n const destinationChains = zipEntries<[string, string | PromptTemplate]>(\n promptNames,\n promptTemplates\n ).reduce(\n (acc, [name, template]) => {\n let myPrompt: string | PromptTemplate;\n if (typeof template === \"object\") {\n myPrompt = template;\n } else if (typeof template === \"string\") {\n myPrompt = new PromptTemplate({\n template: template as string,\n inputVariables: [\"input\"],\n });\n } else {\n throw new Error(\"Invalid prompt template\");\n }\n acc[name as string] = new LLMChain({\n ...llmChainOpts,\n llm,\n prompt: myPrompt,\n });\n return acc;\n },\n {} as { [name: string]: LLMChain }\n );\n\n const convChain = new ConversationChain({\n ...conversationChainOpts,\n llm,\n outputKey: \"text\",\n });\n\n return new MultiPromptChain({\n ...multiRouteChainOpts,\n routerChain,\n destinationChains,\n defaultChain: defaultChain ?? convChain,\n });\n }\n\n _chainType(): string {\n return \"multi_prompt_chain\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,IAAa,mBAAb,MAAa,yBAAyB,gBAAgB;;;;CAIpD,OAAO,YACL,KACA,aACA,oBACA,iBACA,cACA,SACA;EACA,OAAO,iBAAiB,kBAAkB,KAAK;GAC7C;GACA;GACA;GACA;GACA,qBAAqB;EACvB,CAAC;CACH;;;;;;;;;;;;;;;CAgBA,OAAO,kBACL,KACA,EACE,aACA,oBACA,iBACA,cACA,cACA,uBACA,uBAUgB;EAClB,MAAM,eAAe,WAAW,aAAa,kBAAkB,CAAC,CAAC,KAC9D,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,MAChC;EAEA,MAAM,+BAA+B,EAAE,OAAO;GAC5C,aAAa,EACV,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,6DAA2D;GACvE,aAAa,EACV,OAAO,EACN,OAAO,EACJ,OAAO,CAAC,CACR,SAAS,sDAAsD,EACpE,CAAC,CAAC,CACD,SAAS,mCAAmC;EACjD,CAAC;EAED,MAAM,eAAe,IAAI,mBAAmB,4BAA4B;EAExE,MAAM,kBAAkB,aAAa,KAAK,IAAI;EAC9C,MAAM,iBAAiB,mBACrB,wCACE,aAAa,sBAAsB,EAAE,oBAAoB,EAAE,CAAC,CAC9D,GACA,EACE,cAAc,gBAChB,CACF;EAEA,MAAM,eAAe,IAAI,eAAe;GACtC,UAAU;GACV,gBAAgB,CAAC,OAAO;GACxB;EACF,CAAC;EAED,MAAM,cAAc,eAAe,QAAQ,KAAK,YAAY;EAC5D,MAAM,oBAAoB,WACxB,aACA,eACF,CAAC,CAAC,QACC,KAAK,CAAC,MAAM,cAAc;GACzB,IAAI;GACJ,IAAI,OAAO,aAAa,UACtB,WAAW;QACN,IAAI,OAAO,aAAa,UAC7B,WAAW,IAAI,eAAe;IAClB;IACV,gBAAgB,CAAC,OAAO;GAC1B,CAAC;QAED,MAAM,IAAI,MAAM,yBAAyB;GAE3C,IAAI,QAAkB,IAAI,SAAS;IACjC,GAAG;IACH;IACA,QAAQ;GACV,CAAC;GACD,OAAO;EACT,GACA,CAAC,CACH;EAEA,MAAM,YAAY,IAAI,kBAAkB;GACtC,GAAG;GACH;GACA,WAAW;EACb,CAAC;EAED,OAAO,IAAI,iBAAiB;GAC1B,GAAG;GACH;GACA;GACA,cAAc,gBAAgB;EAChC,CAAC;CACH;CAEA,aAAqB;EACnB,OAAO;CACT;AACF"}
@@ -80,18 +80,21 @@ var MultiRetrievalQAChain = class MultiRetrievalQAChain extends require_multi_ro
80
80
  const { defaultRetriever, defaultPrompt, defaultChain } = defaults ?? {};
81
81
  if (defaultPrompt && !defaultRetriever) throw new Error("`default_retriever` must be specified if `default_prompt` is \nprovided. Received only `default_prompt`.");
82
82
  const destinations = require_utils.zipEntries(retrieverNames, retrieverDescriptions).map(([name, desc]) => `${name}: ${desc}`);
83
- const outputParser = new require_router.RouterOutputParser(zod_v3.z.object({
83
+ const structuredOutputParserSchema = zod_v3.z.object({
84
84
  destination: zod_v3.z.string().optional().describe("name of the question answering system to use or \"DEFAULT\""),
85
85
  next_inputs: zod_v3.z.object({ query: zod_v3.z.string().describe("a potentially modified version of the original input") }).describe("input to be fed to the next model")
86
- }));
86
+ });
87
+ const outputParser = new require_router.RouterOutputParser(structuredOutputParserSchema);
87
88
  const destinationsStr = destinations.join("\n");
89
+ const routerTemplate = (0, _langchain_core_prompts.interpolateFString)(require_multi_retrieval_prompt.STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE(outputParser.getFormatInstructions({ interpolationDepth: 4 })), { destinations: destinationsStr });
88
90
  const routerPrompt = new _langchain_core_prompts.PromptTemplate({
89
- template: (0, _langchain_core_prompts.interpolateFString)(require_multi_retrieval_prompt.STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE(outputParser.getFormatInstructions({ interpolationDepth: 4 })), { destinations: destinationsStr }),
91
+ template: routerTemplate,
90
92
  inputVariables: ["input"],
91
93
  outputParser
92
94
  });
93
95
  const routerChain = require_llm_router.LLMRouterChain.fromLLM(llm, routerPrompt);
94
- const destinationChains = require_utils.zipEntries(retrieverNames, retrievers, retrieverPrompts ?? retrievers.map(() => null)).reduce((acc, [name, retriever, prompt]) => {
96
+ const prompts = retrieverPrompts ?? retrievers.map(() => null);
97
+ const destinationChains = require_utils.zipEntries(retrieverNames, retrievers, prompts).reduce((acc, [name, retriever, prompt]) => {
95
98
  const opt = retrievalQAChainOpts ?? {};
96
99
  if (prompt) opt.prompt = prompt;
97
100
  acc[name] = require_retrieval_qa.RetrievalQAChain.fromLLM(llm, retriever, opt);
@@ -103,14 +106,18 @@ var MultiRetrievalQAChain = class MultiRetrievalQAChain extends require_multi_ro
103
106
  ...retrievalQAChainOpts,
104
107
  prompt: defaultPrompt
105
108
  });
106
- else _defaultChain = new require_conversation.ConversationChain({
107
- llm,
108
- prompt: new _langchain_core_prompts.PromptTemplate({
109
- template: require_conversation.DEFAULT_TEMPLATE.replace("input", "query"),
109
+ else {
110
+ const promptTemplate = require_conversation.DEFAULT_TEMPLATE.replace("input", "query");
111
+ const prompt = new _langchain_core_prompts.PromptTemplate({
112
+ template: promptTemplate,
110
113
  inputVariables: ["history", "query"]
111
- }),
112
- outputKey: "result"
113
- });
114
+ });
115
+ _defaultChain = new require_conversation.ConversationChain({
116
+ llm,
117
+ prompt,
118
+ outputKey: "result"
119
+ });
120
+ }
114
121
  return new MultiRetrievalQAChain({
115
122
  ...multiRetrievalChainOpts,
116
123
  routerChain,
@@ -1 +1 @@
1
- {"version":3,"file":"multi_retrieval_qa.cjs","names":["MultiRouteChain","zipEntries","RouterOutputParser","z","PromptTemplate","STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE","LLMRouterChain","RetrievalQAChain","ConversationChain","DEFAULT_TEMPLATE"],"sources":["../../../src/chains/router/multi_retrieval_qa.ts"],"sourcesContent":["import { z } from \"zod/v3\";\nimport type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport type { BaseRetrieverInterface } from \"@langchain/core/retrievers\";\nimport { interpolateFString, PromptTemplate } from \"@langchain/core/prompts\";\nimport { MultiRouteChain, MultiRouteChainInput } from \"./multi_route.js\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMRouterChain } from \"./llm_router.js\";\nimport {\n ConversationChain,\n DEFAULT_TEMPLATE,\n} from \"../../chains/conversation.js\";\nimport { STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE } from \"./multi_retrieval_prompt.js\";\nimport { zipEntries } from \"./utils.js\";\nimport {\n RetrievalQAChain,\n RetrievalQAChainInput,\n} from \"../../chains/retrieval_qa.js\";\nimport { RouterOutputParser } from \"../../output_parsers/router.js\";\n\n/**\n * A type that represents the default values for the MultiRetrievalQAChain\n * class. It includes optional properties for the default retriever,\n * default prompt, and default chain.\n */\nexport type MultiRetrievalDefaults = {\n defaultRetriever?: BaseRetrieverInterface;\n defaultPrompt?: PromptTemplate;\n defaultChain?: BaseChain;\n};\n\n/**\n * A class that represents a multi-retrieval question answering chain in\n * the LangChain framework. It extends the MultiRouteChain class and\n * provides additional functionality specific to multi-retrieval QA\n * chains.\n * @example\n * ```typescript\n * const multiRetrievalQAChain = MultiRetrievalQAChain.fromLLMAndRetrievers(\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * {\n * retrieverNames: [\"aqua teen\", \"mst3k\", \"animaniacs\"],\n * retrieverDescriptions: [\n * \"Good for answering questions about Aqua Teen Hunger Force theme song\",\n * \"Good for answering questions about Mystery Science Theater 3000 theme song\",\n * \"Good for answering questions about Animaniacs theme song\",\n * ],\n * retrievers: [\n * new MemoryVectorStore().asRetriever(3),\n * new MemoryVectorStore().asRetriever(3),\n * new MemoryVectorStore().asRetriever(3),\n * ],\n * retrievalQAChainOpts: {\n * returnSourceDocuments: true,\n * },\n * },\n * );\n *\n * const result = await multiRetrievalQAChain.call({\n * input:\n * \"In the Aqua Teen Hunger Force theme song, who calls himself the mike rula?\",\n * });\n *\n * console.log(result.sourceDocuments, result.text);\n * ```\n */\nexport class MultiRetrievalQAChain extends MultiRouteChain {\n get outputKeys(): string[] {\n return [\"result\"];\n }\n\n /**\n * @deprecated Use `fromRetrieversAndPrompts` instead\n */\n static fromRetrievers(\n llm: BaseLanguageModelInterface,\n retrieverNames: string[],\n retrieverDescriptions: string[],\n retrievers: BaseRetrieverInterface[],\n retrieverPrompts?: PromptTemplate[],\n defaults?: MultiRetrievalDefaults,\n options?: Omit<MultiRouteChainInput, \"defaultChain\">\n ) {\n return MultiRetrievalQAChain.fromLLMAndRetrievers(llm, {\n retrieverNames,\n retrieverDescriptions,\n retrievers,\n retrieverPrompts,\n defaults,\n multiRetrievalChainOpts: options,\n });\n }\n\n /**\n * A static method that creates an instance of MultiRetrievalQAChain from\n * a BaseLanguageModel and a set of retrievers. It takes in optional\n * parameters for the retriever names, descriptions, prompts, defaults,\n * and additional options. It is an alternative method to fromRetrievers\n * and provides more flexibility in configuring the underlying chains.\n * @param llm A BaseLanguageModel instance.\n * @param retrieverNames An array of retriever names.\n * @param retrieverDescriptions An array of retriever descriptions.\n * @param retrievers An array of BaseRetrieverInterface instances.\n * @param retrieverPrompts An optional array of PromptTemplate instances for the retrievers.\n * @param defaults An optional MultiRetrievalDefaults instance.\n * @param multiRetrievalChainOpts Additional optional parameters for the multi-retrieval chain.\n * @param retrievalQAChainOpts Additional optional parameters for the retrieval QA chain.\n * @returns A new instance of MultiRetrievalQAChain.\n */\n static fromLLMAndRetrievers(\n llm: BaseLanguageModelInterface,\n {\n retrieverNames,\n retrieverDescriptions,\n retrievers,\n retrieverPrompts,\n defaults,\n multiRetrievalChainOpts,\n retrievalQAChainOpts,\n }: {\n retrieverNames: string[];\n retrieverDescriptions: string[];\n retrievers: BaseRetrieverInterface[];\n retrieverPrompts?: PromptTemplate[];\n defaults?: MultiRetrievalDefaults;\n multiRetrievalChainOpts?: Omit<MultiRouteChainInput, \"defaultChain\">;\n retrievalQAChainOpts?: Partial<\n Omit<RetrievalQAChainInput, \"retriever\" | \"combineDocumentsChain\">\n > & {\n prompt?: PromptTemplate;\n };\n }\n ): MultiRetrievalQAChain {\n const { defaultRetriever, defaultPrompt, defaultChain } = defaults ?? {};\n if (defaultPrompt && !defaultRetriever) {\n throw new Error(\n \"`default_retriever` must be specified if `default_prompt` is \\nprovided. Received only `default_prompt`.\"\n );\n }\n const destinations = zipEntries<[string, string]>(\n retrieverNames,\n retrieverDescriptions\n ).map(([name, desc]) => `${name}: ${desc}`);\n\n const structuredOutputParserSchema = z.object({\n destination: z\n .string()\n .optional()\n .describe('name of the question answering system to use or \"DEFAULT\"'),\n next_inputs: z\n .object({\n query: z\n .string()\n .describe(\"a potentially modified version of the original input\"),\n })\n .describe(\"input to be fed to the next model\"),\n });\n\n const outputParser = new RouterOutputParser<\n typeof structuredOutputParserSchema\n >(structuredOutputParserSchema);\n\n const destinationsStr = destinations.join(\"\\n\");\n const routerTemplate = interpolateFString(\n STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE(\n outputParser.getFormatInstructions({ interpolationDepth: 4 })\n ),\n {\n destinations: destinationsStr,\n }\n );\n const routerPrompt = new PromptTemplate({\n template: routerTemplate,\n inputVariables: [\"input\"],\n outputParser,\n });\n\n const routerChain = LLMRouterChain.fromLLM(llm, routerPrompt);\n const prompts = retrieverPrompts ?? retrievers.map(() => null);\n const destinationChains = zipEntries<\n [string, BaseRetrieverInterface, PromptTemplate | null]\n >(retrieverNames, retrievers, prompts).reduce(\n (acc, [name, retriever, prompt]) => {\n const opt: Partial<RetrievalQAChainInput> & {\n prompt?: PromptTemplate;\n } = retrievalQAChainOpts ?? {};\n if (prompt) {\n opt.prompt = prompt;\n }\n acc[name] = RetrievalQAChain.fromLLM(llm, retriever, opt);\n return acc;\n },\n {} as { [name: string]: RetrievalQAChain }\n );\n\n let _defaultChain;\n if (defaultChain) {\n _defaultChain = defaultChain;\n } else if (defaultRetriever) {\n _defaultChain = RetrievalQAChain.fromLLM(llm, defaultRetriever, {\n ...retrievalQAChainOpts,\n prompt: defaultPrompt,\n });\n } else {\n const promptTemplate = DEFAULT_TEMPLATE.replace(\"input\", \"query\");\n const prompt = new PromptTemplate({\n template: promptTemplate,\n inputVariables: [\"history\", \"query\"],\n });\n _defaultChain = new ConversationChain({\n llm,\n prompt,\n outputKey: \"result\",\n });\n }\n\n return new MultiRetrievalQAChain({\n ...multiRetrievalChainOpts,\n routerChain,\n destinationChains,\n defaultChain: _defaultChain,\n });\n }\n\n _chainType(): string {\n return \"multi_retrieval_qa_chain\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,IAAa,wBAAb,MAAa,8BAA8BA,oBAAAA,gBAAgB;CACzD,IAAI,aAAuB;EACzB,OAAO,CAAC,QAAQ;CAClB;;;;CAKA,OAAO,eACL,KACA,gBACA,uBACA,YACA,kBACA,UACA,SACA;EACA,OAAO,sBAAsB,qBAAqB,KAAK;GACrD;GACA;GACA;GACA;GACA;GACA,yBAAyB;EAC3B,CAAC;CACH;;;;;;;;;;;;;;;;;CAkBA,OAAO,qBACL,KACA,EACE,gBACA,uBACA,YACA,kBACA,UACA,yBACA,wBAcqB;EACvB,MAAM,EAAE,kBAAkB,eAAe,iBAAiB,YAAY,CAAC;EACvE,IAAI,iBAAiB,CAAC,kBACpB,MAAM,IAAI,MACR,0GACF;EAEF,MAAM,eAAeC,cAAAA,WACnB,gBACA,qBACF,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,MAAM;EAgB1C,MAAM,eAAe,IAAIC,eAAAA,mBAdYC,OAAAA,EAAE,OAAO;GAC5C,aAAaA,OAAAA,EACV,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,6DAA2D;GACvE,aAAaA,OAAAA,EACV,OAAO,EACN,OAAOA,OAAAA,EACJ,OAAO,CAAC,CACR,SAAS,sDAAsD,EACpE,CAAC,CAAC,CACD,SAAS,mCAAmC;EACjD,CAI6B,CAAC;EAE9B,MAAM,kBAAkB,aAAa,KAAK,IAAI;EAS9C,MAAM,eAAe,IAAIC,wBAAAA,eAAe;GACtC,WAAA,GAAA,wBAAA,mBAAA,CARAC,+BAAAA,2CACE,aAAa,sBAAsB,EAAE,oBAAoB,EAAE,CAAC,CAC9D,GACA,EACE,cAAc,gBAChB,CAGuB;GACvB,gBAAgB,CAAC,OAAO;GACxB;EACF,CAAC;EAED,MAAM,cAAcC,mBAAAA,eAAe,QAAQ,KAAK,YAAY;EAE5D,MAAM,oBAAoBL,cAAAA,WAExB,gBAAgB,YAHF,oBAAoB,WAAW,UAAU,IAAI,CAGxB,CAAC,CAAC,QACpC,KAAK,CAAC,MAAM,WAAW,YAAY;GAClC,MAAM,MAEF,wBAAwB,CAAC;GAC7B,IAAI,QACF,IAAI,SAAS;GAEf,IAAI,QAAQM,qBAAAA,iBAAiB,QAAQ,KAAK,WAAW,GAAG;GACxD,OAAO;EACT,GACA,CAAC,CACH;EAEA,IAAI;EACJ,IAAI,cACF,gBAAgB;OACX,IAAI,kBACT,gBAAgBA,qBAAAA,iBAAiB,QAAQ,KAAK,kBAAkB;GAC9D,GAAG;GACH,QAAQ;EACV,CAAC;OAOD,gBAAgB,IAAIC,qBAAAA,kBAAkB;GACpC;GACA,QAAA,IANiBJ,wBAAAA,eAAe;IAChC,UAFqBK,qBAAAA,iBAAiB,QAAQ,SAAS,OAEhC;IACvB,gBAAgB,CAAC,WAAW,OAAO;GACrC,CAGO;GACL,WAAW;EACb,CAAC;EAGH,OAAO,IAAI,sBAAsB;GAC/B,GAAG;GACH;GACA;GACA,cAAc;EAChB,CAAC;CACH;CAEA,aAAqB;EACnB,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"multi_retrieval_qa.cjs","names":["MultiRouteChain","zipEntries","z","RouterOutputParser","interpolateFString","STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE","PromptTemplate","LLMRouterChain","RetrievalQAChain","DEFAULT_TEMPLATE","ConversationChain"],"sources":["../../../src/chains/router/multi_retrieval_qa.ts"],"sourcesContent":["import { z } from \"zod/v3\";\nimport type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport type { BaseRetrieverInterface } from \"@langchain/core/retrievers\";\nimport { interpolateFString, PromptTemplate } from \"@langchain/core/prompts\";\nimport { MultiRouteChain, MultiRouteChainInput } from \"./multi_route.js\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMRouterChain } from \"./llm_router.js\";\nimport {\n ConversationChain,\n DEFAULT_TEMPLATE,\n} from \"../../chains/conversation.js\";\nimport { STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE } from \"./multi_retrieval_prompt.js\";\nimport { zipEntries } from \"./utils.js\";\nimport {\n RetrievalQAChain,\n RetrievalQAChainInput,\n} from \"../../chains/retrieval_qa.js\";\nimport { RouterOutputParser } from \"../../output_parsers/router.js\";\n\n/**\n * A type that represents the default values for the MultiRetrievalQAChain\n * class. It includes optional properties for the default retriever,\n * default prompt, and default chain.\n */\nexport type MultiRetrievalDefaults = {\n defaultRetriever?: BaseRetrieverInterface;\n defaultPrompt?: PromptTemplate;\n defaultChain?: BaseChain;\n};\n\n/**\n * A class that represents a multi-retrieval question answering chain in\n * the LangChain framework. It extends the MultiRouteChain class and\n * provides additional functionality specific to multi-retrieval QA\n * chains.\n * @example\n * ```typescript\n * const multiRetrievalQAChain = MultiRetrievalQAChain.fromLLMAndRetrievers(\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * {\n * retrieverNames: [\"aqua teen\", \"mst3k\", \"animaniacs\"],\n * retrieverDescriptions: [\n * \"Good for answering questions about Aqua Teen Hunger Force theme song\",\n * \"Good for answering questions about Mystery Science Theater 3000 theme song\",\n * \"Good for answering questions about Animaniacs theme song\",\n * ],\n * retrievers: [\n * new MemoryVectorStore().asRetriever(3),\n * new MemoryVectorStore().asRetriever(3),\n * new MemoryVectorStore().asRetriever(3),\n * ],\n * retrievalQAChainOpts: {\n * returnSourceDocuments: true,\n * },\n * },\n * );\n *\n * const result = await multiRetrievalQAChain.call({\n * input:\n * \"In the Aqua Teen Hunger Force theme song, who calls himself the mike rula?\",\n * });\n *\n * console.log(result.sourceDocuments, result.text);\n * ```\n */\nexport class MultiRetrievalQAChain extends MultiRouteChain {\n get outputKeys(): string[] {\n return [\"result\"];\n }\n\n /**\n * @deprecated Use `fromRetrieversAndPrompts` instead\n */\n static fromRetrievers(\n llm: BaseLanguageModelInterface,\n retrieverNames: string[],\n retrieverDescriptions: string[],\n retrievers: BaseRetrieverInterface[],\n retrieverPrompts?: PromptTemplate[],\n defaults?: MultiRetrievalDefaults,\n options?: Omit<MultiRouteChainInput, \"defaultChain\">\n ) {\n return MultiRetrievalQAChain.fromLLMAndRetrievers(llm, {\n retrieverNames,\n retrieverDescriptions,\n retrievers,\n retrieverPrompts,\n defaults,\n multiRetrievalChainOpts: options,\n });\n }\n\n /**\n * A static method that creates an instance of MultiRetrievalQAChain from\n * a BaseLanguageModel and a set of retrievers. It takes in optional\n * parameters for the retriever names, descriptions, prompts, defaults,\n * and additional options. It is an alternative method to fromRetrievers\n * and provides more flexibility in configuring the underlying chains.\n * @param llm A BaseLanguageModel instance.\n * @param retrieverNames An array of retriever names.\n * @param retrieverDescriptions An array of retriever descriptions.\n * @param retrievers An array of BaseRetrieverInterface instances.\n * @param retrieverPrompts An optional array of PromptTemplate instances for the retrievers.\n * @param defaults An optional MultiRetrievalDefaults instance.\n * @param multiRetrievalChainOpts Additional optional parameters for the multi-retrieval chain.\n * @param retrievalQAChainOpts Additional optional parameters for the retrieval QA chain.\n * @returns A new instance of MultiRetrievalQAChain.\n */\n static fromLLMAndRetrievers(\n llm: BaseLanguageModelInterface,\n {\n retrieverNames,\n retrieverDescriptions,\n retrievers,\n retrieverPrompts,\n defaults,\n multiRetrievalChainOpts,\n retrievalQAChainOpts,\n }: {\n retrieverNames: string[];\n retrieverDescriptions: string[];\n retrievers: BaseRetrieverInterface[];\n retrieverPrompts?: PromptTemplate[];\n defaults?: MultiRetrievalDefaults;\n multiRetrievalChainOpts?: Omit<MultiRouteChainInput, \"defaultChain\">;\n retrievalQAChainOpts?: Partial<\n Omit<RetrievalQAChainInput, \"retriever\" | \"combineDocumentsChain\">\n > & {\n prompt?: PromptTemplate;\n };\n }\n ): MultiRetrievalQAChain {\n const { defaultRetriever, defaultPrompt, defaultChain } = defaults ?? {};\n if (defaultPrompt && !defaultRetriever) {\n throw new Error(\n \"`default_retriever` must be specified if `default_prompt` is \\nprovided. Received only `default_prompt`.\"\n );\n }\n const destinations = zipEntries<[string, string]>(\n retrieverNames,\n retrieverDescriptions\n ).map(([name, desc]) => `${name}: ${desc}`);\n\n const structuredOutputParserSchema = z.object({\n destination: z\n .string()\n .optional()\n .describe('name of the question answering system to use or \"DEFAULT\"'),\n next_inputs: z\n .object({\n query: z\n .string()\n .describe(\"a potentially modified version of the original input\"),\n })\n .describe(\"input to be fed to the next model\"),\n });\n\n const outputParser = new RouterOutputParser<\n typeof structuredOutputParserSchema\n >(structuredOutputParserSchema);\n\n const destinationsStr = destinations.join(\"\\n\");\n const routerTemplate = interpolateFString(\n STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE(\n outputParser.getFormatInstructions({ interpolationDepth: 4 })\n ),\n {\n destinations: destinationsStr,\n }\n );\n const routerPrompt = new PromptTemplate({\n template: routerTemplate,\n inputVariables: [\"input\"],\n outputParser,\n });\n\n const routerChain = LLMRouterChain.fromLLM(llm, routerPrompt);\n const prompts = retrieverPrompts ?? retrievers.map(() => null);\n const destinationChains = zipEntries<\n [string, BaseRetrieverInterface, PromptTemplate | null]\n >(retrieverNames, retrievers, prompts).reduce(\n (acc, [name, retriever, prompt]) => {\n const opt: Partial<RetrievalQAChainInput> & {\n prompt?: PromptTemplate;\n } = retrievalQAChainOpts ?? {};\n if (prompt) {\n opt.prompt = prompt;\n }\n acc[name] = RetrievalQAChain.fromLLM(llm, retriever, opt);\n return acc;\n },\n {} as { [name: string]: RetrievalQAChain }\n );\n\n let _defaultChain;\n if (defaultChain) {\n _defaultChain = defaultChain;\n } else if (defaultRetriever) {\n _defaultChain = RetrievalQAChain.fromLLM(llm, defaultRetriever, {\n ...retrievalQAChainOpts,\n prompt: defaultPrompt,\n });\n } else {\n const promptTemplate = DEFAULT_TEMPLATE.replace(\"input\", \"query\");\n const prompt = new PromptTemplate({\n template: promptTemplate,\n inputVariables: [\"history\", \"query\"],\n });\n _defaultChain = new ConversationChain({\n llm,\n prompt,\n outputKey: \"result\",\n });\n }\n\n return new MultiRetrievalQAChain({\n ...multiRetrievalChainOpts,\n routerChain,\n destinationChains,\n defaultChain: _defaultChain,\n });\n }\n\n _chainType(): string {\n return \"multi_retrieval_qa_chain\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,IAAa,wBAAb,MAAa,8BAA8BA,oBAAAA,gBAAgB;CACzD,IAAI,aAAuB;EACzB,OAAO,CAAC,QAAQ;CAClB;;;;CAKA,OAAO,eACL,KACA,gBACA,uBACA,YACA,kBACA,UACA,SACA;EACA,OAAO,sBAAsB,qBAAqB,KAAK;GACrD;GACA;GACA;GACA;GACA;GACA,yBAAyB;EAC3B,CAAC;CACH;;;;;;;;;;;;;;;;;CAkBA,OAAO,qBACL,KACA,EACE,gBACA,uBACA,YACA,kBACA,UACA,yBACA,wBAcqB;EACvB,MAAM,EAAE,kBAAkB,eAAe,iBAAiB,YAAY,CAAC;EACvE,IAAI,iBAAiB,CAAC,kBACpB,MAAM,IAAI,MACR,0GACF;EAEF,MAAM,eAAeC,cAAAA,WACnB,gBACA,qBACF,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,MAAM;EAE1C,MAAM,+BAA+BC,OAAAA,EAAE,OAAO;GAC5C,aAAaA,OAAAA,EACV,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,6DAA2D;GACvE,aAAaA,OAAAA,EACV,OAAO,EACN,OAAOA,OAAAA,EACJ,OAAO,CAAC,CACR,SAAS,sDAAsD,EACpE,CAAC,CAAC,CACD,SAAS,mCAAmC;EACjD,CAAC;EAED,MAAM,eAAe,IAAIC,eAAAA,mBAEvB,4BAA4B;EAE9B,MAAM,kBAAkB,aAAa,KAAK,IAAI;EAC9C,MAAM,kBAAA,GAAiBC,wBAAAA,mBAAAA,CACrBC,+BAAAA,2CACE,aAAa,sBAAsB,EAAE,oBAAoB,EAAE,CAAC,CAC9D,GACA,EACE,cAAc,gBAChB,CACF;EACA,MAAM,eAAe,IAAIC,wBAAAA,eAAe;GACtC,UAAU;GACV,gBAAgB,CAAC,OAAO;GACxB;EACF,CAAC;EAED,MAAM,cAAcC,mBAAAA,eAAe,QAAQ,KAAK,YAAY;EAC5D,MAAM,UAAU,oBAAoB,WAAW,UAAU,IAAI;EAC7D,MAAM,oBAAoBN,cAAAA,WAExB,gBAAgB,YAAY,OAAO,CAAC,CAAC,QACpC,KAAK,CAAC,MAAM,WAAW,YAAY;GAClC,MAAM,MAEF,wBAAwB,CAAC;GAC7B,IAAI,QACF,IAAI,SAAS;GAEf,IAAI,QAAQO,qBAAAA,iBAAiB,QAAQ,KAAK,WAAW,GAAG;GACxD,OAAO;EACT,GACA,CAAC,CACH;EAEA,IAAI;EACJ,IAAI,cACF,gBAAgB;OACX,IAAI,kBACT,gBAAgBA,qBAAAA,iBAAiB,QAAQ,KAAK,kBAAkB;GAC9D,GAAG;GACH,QAAQ;EACV,CAAC;OACI;GACL,MAAM,iBAAiBC,qBAAAA,iBAAiB,QAAQ,SAAS,OAAO;GAChE,MAAM,SAAS,IAAIH,wBAAAA,eAAe;IAChC,UAAU;IACV,gBAAgB,CAAC,WAAW,OAAO;GACrC,CAAC;GACD,gBAAgB,IAAII,qBAAAA,kBAAkB;IACpC;IACA;IACA,WAAW;GACb,CAAC;EACH;EAEA,OAAO,IAAI,sBAAsB;GAC/B,GAAG;GACH;GACA;GACA,cAAc;EAChB,CAAC;CACH;CAEA,aAAqB;EACnB,OAAO;CACT;AACF"}
@@ -80,18 +80,21 @@ var MultiRetrievalQAChain = class MultiRetrievalQAChain extends MultiRouteChain
80
80
  const { defaultRetriever, defaultPrompt, defaultChain } = defaults ?? {};
81
81
  if (defaultPrompt && !defaultRetriever) throw new Error("`default_retriever` must be specified if `default_prompt` is \nprovided. Received only `default_prompt`.");
82
82
  const destinations = zipEntries(retrieverNames, retrieverDescriptions).map(([name, desc]) => `${name}: ${desc}`);
83
- const outputParser = new RouterOutputParser(z.object({
83
+ const structuredOutputParserSchema = z.object({
84
84
  destination: z.string().optional().describe("name of the question answering system to use or \"DEFAULT\""),
85
85
  next_inputs: z.object({ query: z.string().describe("a potentially modified version of the original input") }).describe("input to be fed to the next model")
86
- }));
86
+ });
87
+ const outputParser = new RouterOutputParser(structuredOutputParserSchema);
87
88
  const destinationsStr = destinations.join("\n");
89
+ const routerTemplate = interpolateFString(STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE(outputParser.getFormatInstructions({ interpolationDepth: 4 })), { destinations: destinationsStr });
88
90
  const routerPrompt = new PromptTemplate({
89
- template: interpolateFString(STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE(outputParser.getFormatInstructions({ interpolationDepth: 4 })), { destinations: destinationsStr }),
91
+ template: routerTemplate,
90
92
  inputVariables: ["input"],
91
93
  outputParser
92
94
  });
93
95
  const routerChain = LLMRouterChain.fromLLM(llm, routerPrompt);
94
- const destinationChains = zipEntries(retrieverNames, retrievers, retrieverPrompts ?? retrievers.map(() => null)).reduce((acc, [name, retriever, prompt]) => {
96
+ const prompts = retrieverPrompts ?? retrievers.map(() => null);
97
+ const destinationChains = zipEntries(retrieverNames, retrievers, prompts).reduce((acc, [name, retriever, prompt]) => {
95
98
  const opt = retrievalQAChainOpts ?? {};
96
99
  if (prompt) opt.prompt = prompt;
97
100
  acc[name] = RetrievalQAChain.fromLLM(llm, retriever, opt);
@@ -103,14 +106,18 @@ var MultiRetrievalQAChain = class MultiRetrievalQAChain extends MultiRouteChain
103
106
  ...retrievalQAChainOpts,
104
107
  prompt: defaultPrompt
105
108
  });
106
- else _defaultChain = new ConversationChain({
107
- llm,
108
- prompt: new PromptTemplate({
109
- template: DEFAULT_TEMPLATE.replace("input", "query"),
109
+ else {
110
+ const promptTemplate = DEFAULT_TEMPLATE.replace("input", "query");
111
+ const prompt = new PromptTemplate({
112
+ template: promptTemplate,
110
113
  inputVariables: ["history", "query"]
111
- }),
112
- outputKey: "result"
113
- });
114
+ });
115
+ _defaultChain = new ConversationChain({
116
+ llm,
117
+ prompt,
118
+ outputKey: "result"
119
+ });
120
+ }
114
121
  return new MultiRetrievalQAChain({
115
122
  ...multiRetrievalChainOpts,
116
123
  routerChain,
@@ -1 +1 @@
1
- {"version":3,"file":"multi_retrieval_qa.js","names":[],"sources":["../../../src/chains/router/multi_retrieval_qa.ts"],"sourcesContent":["import { z } from \"zod/v3\";\nimport type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport type { BaseRetrieverInterface } from \"@langchain/core/retrievers\";\nimport { interpolateFString, PromptTemplate } from \"@langchain/core/prompts\";\nimport { MultiRouteChain, MultiRouteChainInput } from \"./multi_route.js\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMRouterChain } from \"./llm_router.js\";\nimport {\n ConversationChain,\n DEFAULT_TEMPLATE,\n} from \"../../chains/conversation.js\";\nimport { STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE } from \"./multi_retrieval_prompt.js\";\nimport { zipEntries } from \"./utils.js\";\nimport {\n RetrievalQAChain,\n RetrievalQAChainInput,\n} from \"../../chains/retrieval_qa.js\";\nimport { RouterOutputParser } from \"../../output_parsers/router.js\";\n\n/**\n * A type that represents the default values for the MultiRetrievalQAChain\n * class. It includes optional properties for the default retriever,\n * default prompt, and default chain.\n */\nexport type MultiRetrievalDefaults = {\n defaultRetriever?: BaseRetrieverInterface;\n defaultPrompt?: PromptTemplate;\n defaultChain?: BaseChain;\n};\n\n/**\n * A class that represents a multi-retrieval question answering chain in\n * the LangChain framework. It extends the MultiRouteChain class and\n * provides additional functionality specific to multi-retrieval QA\n * chains.\n * @example\n * ```typescript\n * const multiRetrievalQAChain = MultiRetrievalQAChain.fromLLMAndRetrievers(\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * {\n * retrieverNames: [\"aqua teen\", \"mst3k\", \"animaniacs\"],\n * retrieverDescriptions: [\n * \"Good for answering questions about Aqua Teen Hunger Force theme song\",\n * \"Good for answering questions about Mystery Science Theater 3000 theme song\",\n * \"Good for answering questions about Animaniacs theme song\",\n * ],\n * retrievers: [\n * new MemoryVectorStore().asRetriever(3),\n * new MemoryVectorStore().asRetriever(3),\n * new MemoryVectorStore().asRetriever(3),\n * ],\n * retrievalQAChainOpts: {\n * returnSourceDocuments: true,\n * },\n * },\n * );\n *\n * const result = await multiRetrievalQAChain.call({\n * input:\n * \"In the Aqua Teen Hunger Force theme song, who calls himself the mike rula?\",\n * });\n *\n * console.log(result.sourceDocuments, result.text);\n * ```\n */\nexport class MultiRetrievalQAChain extends MultiRouteChain {\n get outputKeys(): string[] {\n return [\"result\"];\n }\n\n /**\n * @deprecated Use `fromRetrieversAndPrompts` instead\n */\n static fromRetrievers(\n llm: BaseLanguageModelInterface,\n retrieverNames: string[],\n retrieverDescriptions: string[],\n retrievers: BaseRetrieverInterface[],\n retrieverPrompts?: PromptTemplate[],\n defaults?: MultiRetrievalDefaults,\n options?: Omit<MultiRouteChainInput, \"defaultChain\">\n ) {\n return MultiRetrievalQAChain.fromLLMAndRetrievers(llm, {\n retrieverNames,\n retrieverDescriptions,\n retrievers,\n retrieverPrompts,\n defaults,\n multiRetrievalChainOpts: options,\n });\n }\n\n /**\n * A static method that creates an instance of MultiRetrievalQAChain from\n * a BaseLanguageModel and a set of retrievers. It takes in optional\n * parameters for the retriever names, descriptions, prompts, defaults,\n * and additional options. It is an alternative method to fromRetrievers\n * and provides more flexibility in configuring the underlying chains.\n * @param llm A BaseLanguageModel instance.\n * @param retrieverNames An array of retriever names.\n * @param retrieverDescriptions An array of retriever descriptions.\n * @param retrievers An array of BaseRetrieverInterface instances.\n * @param retrieverPrompts An optional array of PromptTemplate instances for the retrievers.\n * @param defaults An optional MultiRetrievalDefaults instance.\n * @param multiRetrievalChainOpts Additional optional parameters for the multi-retrieval chain.\n * @param retrievalQAChainOpts Additional optional parameters for the retrieval QA chain.\n * @returns A new instance of MultiRetrievalQAChain.\n */\n static fromLLMAndRetrievers(\n llm: BaseLanguageModelInterface,\n {\n retrieverNames,\n retrieverDescriptions,\n retrievers,\n retrieverPrompts,\n defaults,\n multiRetrievalChainOpts,\n retrievalQAChainOpts,\n }: {\n retrieverNames: string[];\n retrieverDescriptions: string[];\n retrievers: BaseRetrieverInterface[];\n retrieverPrompts?: PromptTemplate[];\n defaults?: MultiRetrievalDefaults;\n multiRetrievalChainOpts?: Omit<MultiRouteChainInput, \"defaultChain\">;\n retrievalQAChainOpts?: Partial<\n Omit<RetrievalQAChainInput, \"retriever\" | \"combineDocumentsChain\">\n > & {\n prompt?: PromptTemplate;\n };\n }\n ): MultiRetrievalQAChain {\n const { defaultRetriever, defaultPrompt, defaultChain } = defaults ?? {};\n if (defaultPrompt && !defaultRetriever) {\n throw new Error(\n \"`default_retriever` must be specified if `default_prompt` is \\nprovided. Received only `default_prompt`.\"\n );\n }\n const destinations = zipEntries<[string, string]>(\n retrieverNames,\n retrieverDescriptions\n ).map(([name, desc]) => `${name}: ${desc}`);\n\n const structuredOutputParserSchema = z.object({\n destination: z\n .string()\n .optional()\n .describe('name of the question answering system to use or \"DEFAULT\"'),\n next_inputs: z\n .object({\n query: z\n .string()\n .describe(\"a potentially modified version of the original input\"),\n })\n .describe(\"input to be fed to the next model\"),\n });\n\n const outputParser = new RouterOutputParser<\n typeof structuredOutputParserSchema\n >(structuredOutputParserSchema);\n\n const destinationsStr = destinations.join(\"\\n\");\n const routerTemplate = interpolateFString(\n STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE(\n outputParser.getFormatInstructions({ interpolationDepth: 4 })\n ),\n {\n destinations: destinationsStr,\n }\n );\n const routerPrompt = new PromptTemplate({\n template: routerTemplate,\n inputVariables: [\"input\"],\n outputParser,\n });\n\n const routerChain = LLMRouterChain.fromLLM(llm, routerPrompt);\n const prompts = retrieverPrompts ?? retrievers.map(() => null);\n const destinationChains = zipEntries<\n [string, BaseRetrieverInterface, PromptTemplate | null]\n >(retrieverNames, retrievers, prompts).reduce(\n (acc, [name, retriever, prompt]) => {\n const opt: Partial<RetrievalQAChainInput> & {\n prompt?: PromptTemplate;\n } = retrievalQAChainOpts ?? {};\n if (prompt) {\n opt.prompt = prompt;\n }\n acc[name] = RetrievalQAChain.fromLLM(llm, retriever, opt);\n return acc;\n },\n {} as { [name: string]: RetrievalQAChain }\n );\n\n let _defaultChain;\n if (defaultChain) {\n _defaultChain = defaultChain;\n } else if (defaultRetriever) {\n _defaultChain = RetrievalQAChain.fromLLM(llm, defaultRetriever, {\n ...retrievalQAChainOpts,\n prompt: defaultPrompt,\n });\n } else {\n const promptTemplate = DEFAULT_TEMPLATE.replace(\"input\", \"query\");\n const prompt = new PromptTemplate({\n template: promptTemplate,\n inputVariables: [\"history\", \"query\"],\n });\n _defaultChain = new ConversationChain({\n llm,\n prompt,\n outputKey: \"result\",\n });\n }\n\n return new MultiRetrievalQAChain({\n ...multiRetrievalChainOpts,\n routerChain,\n destinationChains,\n defaultChain: _defaultChain,\n });\n }\n\n _chainType(): string {\n return \"multi_retrieval_qa_chain\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,IAAa,wBAAb,MAAa,8BAA8B,gBAAgB;CACzD,IAAI,aAAuB;EACzB,OAAO,CAAC,QAAQ;CAClB;;;;CAKA,OAAO,eACL,KACA,gBACA,uBACA,YACA,kBACA,UACA,SACA;EACA,OAAO,sBAAsB,qBAAqB,KAAK;GACrD;GACA;GACA;GACA;GACA;GACA,yBAAyB;EAC3B,CAAC;CACH;;;;;;;;;;;;;;;;;CAkBA,OAAO,qBACL,KACA,EACE,gBACA,uBACA,YACA,kBACA,UACA,yBACA,wBAcqB;EACvB,MAAM,EAAE,kBAAkB,eAAe,iBAAiB,YAAY,CAAC;EACvE,IAAI,iBAAiB,CAAC,kBACpB,MAAM,IAAI,MACR,0GACF;EAEF,MAAM,eAAe,WACnB,gBACA,qBACF,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,MAAM;EAgB1C,MAAM,eAAe,IAAI,mBAdY,EAAE,OAAO;GAC5C,aAAa,EACV,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,6DAA2D;GACvE,aAAa,EACV,OAAO,EACN,OAAO,EACJ,OAAO,CAAC,CACR,SAAS,sDAAsD,EACpE,CAAC,CAAC,CACD,SAAS,mCAAmC;EACjD,CAI6B,CAAC;EAE9B,MAAM,kBAAkB,aAAa,KAAK,IAAI;EAS9C,MAAM,eAAe,IAAI,eAAe;GACtC,UATqB,mBACrB,2CACE,aAAa,sBAAsB,EAAE,oBAAoB,EAAE,CAAC,CAC9D,GACA,EACE,cAAc,gBAChB,CAGuB;GACvB,gBAAgB,CAAC,OAAO;GACxB;EACF,CAAC;EAED,MAAM,cAAc,eAAe,QAAQ,KAAK,YAAY;EAE5D,MAAM,oBAAoB,WAExB,gBAAgB,YAHF,oBAAoB,WAAW,UAAU,IAAI,CAGxB,CAAC,CAAC,QACpC,KAAK,CAAC,MAAM,WAAW,YAAY;GAClC,MAAM,MAEF,wBAAwB,CAAC;GAC7B,IAAI,QACF,IAAI,SAAS;GAEf,IAAI,QAAQ,iBAAiB,QAAQ,KAAK,WAAW,GAAG;GACxD,OAAO;EACT,GACA,CAAC,CACH;EAEA,IAAI;EACJ,IAAI,cACF,gBAAgB;OACX,IAAI,kBACT,gBAAgB,iBAAiB,QAAQ,KAAK,kBAAkB;GAC9D,GAAG;GACH,QAAQ;EACV,CAAC;OAOD,gBAAgB,IAAI,kBAAkB;GACpC;GACA,QAAA,IANiB,eAAe;IAChC,UAFqB,iBAAiB,QAAQ,SAAS,OAEhC;IACvB,gBAAgB,CAAC,WAAW,OAAO;GACrC,CAGO;GACL,WAAW;EACb,CAAC;EAGH,OAAO,IAAI,sBAAsB;GAC/B,GAAG;GACH;GACA;GACA,cAAc;EAChB,CAAC;CACH;CAEA,aAAqB;EACnB,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"multi_retrieval_qa.js","names":[],"sources":["../../../src/chains/router/multi_retrieval_qa.ts"],"sourcesContent":["import { z } from \"zod/v3\";\nimport type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport type { BaseRetrieverInterface } from \"@langchain/core/retrievers\";\nimport { interpolateFString, PromptTemplate } from \"@langchain/core/prompts\";\nimport { MultiRouteChain, MultiRouteChainInput } from \"./multi_route.js\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMRouterChain } from \"./llm_router.js\";\nimport {\n ConversationChain,\n DEFAULT_TEMPLATE,\n} from \"../../chains/conversation.js\";\nimport { STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE } from \"./multi_retrieval_prompt.js\";\nimport { zipEntries } from \"./utils.js\";\nimport {\n RetrievalQAChain,\n RetrievalQAChainInput,\n} from \"../../chains/retrieval_qa.js\";\nimport { RouterOutputParser } from \"../../output_parsers/router.js\";\n\n/**\n * A type that represents the default values for the MultiRetrievalQAChain\n * class. It includes optional properties for the default retriever,\n * default prompt, and default chain.\n */\nexport type MultiRetrievalDefaults = {\n defaultRetriever?: BaseRetrieverInterface;\n defaultPrompt?: PromptTemplate;\n defaultChain?: BaseChain;\n};\n\n/**\n * A class that represents a multi-retrieval question answering chain in\n * the LangChain framework. It extends the MultiRouteChain class and\n * provides additional functionality specific to multi-retrieval QA\n * chains.\n * @example\n * ```typescript\n * const multiRetrievalQAChain = MultiRetrievalQAChain.fromLLMAndRetrievers(\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * {\n * retrieverNames: [\"aqua teen\", \"mst3k\", \"animaniacs\"],\n * retrieverDescriptions: [\n * \"Good for answering questions about Aqua Teen Hunger Force theme song\",\n * \"Good for answering questions about Mystery Science Theater 3000 theme song\",\n * \"Good for answering questions about Animaniacs theme song\",\n * ],\n * retrievers: [\n * new MemoryVectorStore().asRetriever(3),\n * new MemoryVectorStore().asRetriever(3),\n * new MemoryVectorStore().asRetriever(3),\n * ],\n * retrievalQAChainOpts: {\n * returnSourceDocuments: true,\n * },\n * },\n * );\n *\n * const result = await multiRetrievalQAChain.call({\n * input:\n * \"In the Aqua Teen Hunger Force theme song, who calls himself the mike rula?\",\n * });\n *\n * console.log(result.sourceDocuments, result.text);\n * ```\n */\nexport class MultiRetrievalQAChain extends MultiRouteChain {\n get outputKeys(): string[] {\n return [\"result\"];\n }\n\n /**\n * @deprecated Use `fromRetrieversAndPrompts` instead\n */\n static fromRetrievers(\n llm: BaseLanguageModelInterface,\n retrieverNames: string[],\n retrieverDescriptions: string[],\n retrievers: BaseRetrieverInterface[],\n retrieverPrompts?: PromptTemplate[],\n defaults?: MultiRetrievalDefaults,\n options?: Omit<MultiRouteChainInput, \"defaultChain\">\n ) {\n return MultiRetrievalQAChain.fromLLMAndRetrievers(llm, {\n retrieverNames,\n retrieverDescriptions,\n retrievers,\n retrieverPrompts,\n defaults,\n multiRetrievalChainOpts: options,\n });\n }\n\n /**\n * A static method that creates an instance of MultiRetrievalQAChain from\n * a BaseLanguageModel and a set of retrievers. It takes in optional\n * parameters for the retriever names, descriptions, prompts, defaults,\n * and additional options. It is an alternative method to fromRetrievers\n * and provides more flexibility in configuring the underlying chains.\n * @param llm A BaseLanguageModel instance.\n * @param retrieverNames An array of retriever names.\n * @param retrieverDescriptions An array of retriever descriptions.\n * @param retrievers An array of BaseRetrieverInterface instances.\n * @param retrieverPrompts An optional array of PromptTemplate instances for the retrievers.\n * @param defaults An optional MultiRetrievalDefaults instance.\n * @param multiRetrievalChainOpts Additional optional parameters for the multi-retrieval chain.\n * @param retrievalQAChainOpts Additional optional parameters for the retrieval QA chain.\n * @returns A new instance of MultiRetrievalQAChain.\n */\n static fromLLMAndRetrievers(\n llm: BaseLanguageModelInterface,\n {\n retrieverNames,\n retrieverDescriptions,\n retrievers,\n retrieverPrompts,\n defaults,\n multiRetrievalChainOpts,\n retrievalQAChainOpts,\n }: {\n retrieverNames: string[];\n retrieverDescriptions: string[];\n retrievers: BaseRetrieverInterface[];\n retrieverPrompts?: PromptTemplate[];\n defaults?: MultiRetrievalDefaults;\n multiRetrievalChainOpts?: Omit<MultiRouteChainInput, \"defaultChain\">;\n retrievalQAChainOpts?: Partial<\n Omit<RetrievalQAChainInput, \"retriever\" | \"combineDocumentsChain\">\n > & {\n prompt?: PromptTemplate;\n };\n }\n ): MultiRetrievalQAChain {\n const { defaultRetriever, defaultPrompt, defaultChain } = defaults ?? {};\n if (defaultPrompt && !defaultRetriever) {\n throw new Error(\n \"`default_retriever` must be specified if `default_prompt` is \\nprovided. Received only `default_prompt`.\"\n );\n }\n const destinations = zipEntries<[string, string]>(\n retrieverNames,\n retrieverDescriptions\n ).map(([name, desc]) => `${name}: ${desc}`);\n\n const structuredOutputParserSchema = z.object({\n destination: z\n .string()\n .optional()\n .describe('name of the question answering system to use or \"DEFAULT\"'),\n next_inputs: z\n .object({\n query: z\n .string()\n .describe(\"a potentially modified version of the original input\"),\n })\n .describe(\"input to be fed to the next model\"),\n });\n\n const outputParser = new RouterOutputParser<\n typeof structuredOutputParserSchema\n >(structuredOutputParserSchema);\n\n const destinationsStr = destinations.join(\"\\n\");\n const routerTemplate = interpolateFString(\n STRUCTURED_MULTI_RETRIEVAL_ROUTER_TEMPLATE(\n outputParser.getFormatInstructions({ interpolationDepth: 4 })\n ),\n {\n destinations: destinationsStr,\n }\n );\n const routerPrompt = new PromptTemplate({\n template: routerTemplate,\n inputVariables: [\"input\"],\n outputParser,\n });\n\n const routerChain = LLMRouterChain.fromLLM(llm, routerPrompt);\n const prompts = retrieverPrompts ?? retrievers.map(() => null);\n const destinationChains = zipEntries<\n [string, BaseRetrieverInterface, PromptTemplate | null]\n >(retrieverNames, retrievers, prompts).reduce(\n (acc, [name, retriever, prompt]) => {\n const opt: Partial<RetrievalQAChainInput> & {\n prompt?: PromptTemplate;\n } = retrievalQAChainOpts ?? {};\n if (prompt) {\n opt.prompt = prompt;\n }\n acc[name] = RetrievalQAChain.fromLLM(llm, retriever, opt);\n return acc;\n },\n {} as { [name: string]: RetrievalQAChain }\n );\n\n let _defaultChain;\n if (defaultChain) {\n _defaultChain = defaultChain;\n } else if (defaultRetriever) {\n _defaultChain = RetrievalQAChain.fromLLM(llm, defaultRetriever, {\n ...retrievalQAChainOpts,\n prompt: defaultPrompt,\n });\n } else {\n const promptTemplate = DEFAULT_TEMPLATE.replace(\"input\", \"query\");\n const prompt = new PromptTemplate({\n template: promptTemplate,\n inputVariables: [\"history\", \"query\"],\n });\n _defaultChain = new ConversationChain({\n llm,\n prompt,\n outputKey: \"result\",\n });\n }\n\n return new MultiRetrievalQAChain({\n ...multiRetrievalChainOpts,\n routerChain,\n destinationChains,\n defaultChain: _defaultChain,\n });\n }\n\n _chainType(): string {\n return \"multi_retrieval_qa_chain\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,IAAa,wBAAb,MAAa,8BAA8B,gBAAgB;CACzD,IAAI,aAAuB;EACzB,OAAO,CAAC,QAAQ;CAClB;;;;CAKA,OAAO,eACL,KACA,gBACA,uBACA,YACA,kBACA,UACA,SACA;EACA,OAAO,sBAAsB,qBAAqB,KAAK;GACrD;GACA;GACA;GACA;GACA;GACA,yBAAyB;EAC3B,CAAC;CACH;;;;;;;;;;;;;;;;;CAkBA,OAAO,qBACL,KACA,EACE,gBACA,uBACA,YACA,kBACA,UACA,yBACA,wBAcqB;EACvB,MAAM,EAAE,kBAAkB,eAAe,iBAAiB,YAAY,CAAC;EACvE,IAAI,iBAAiB,CAAC,kBACpB,MAAM,IAAI,MACR,0GACF;EAEF,MAAM,eAAe,WACnB,gBACA,qBACF,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,MAAM;EAE1C,MAAM,+BAA+B,EAAE,OAAO;GAC5C,aAAa,EACV,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,6DAA2D;GACvE,aAAa,EACV,OAAO,EACN,OAAO,EACJ,OAAO,CAAC,CACR,SAAS,sDAAsD,EACpE,CAAC,CAAC,CACD,SAAS,mCAAmC;EACjD,CAAC;EAED,MAAM,eAAe,IAAI,mBAEvB,4BAA4B;EAE9B,MAAM,kBAAkB,aAAa,KAAK,IAAI;EAC9C,MAAM,iBAAiB,mBACrB,2CACE,aAAa,sBAAsB,EAAE,oBAAoB,EAAE,CAAC,CAC9D,GACA,EACE,cAAc,gBAChB,CACF;EACA,MAAM,eAAe,IAAI,eAAe;GACtC,UAAU;GACV,gBAAgB,CAAC,OAAO;GACxB;EACF,CAAC;EAED,MAAM,cAAc,eAAe,QAAQ,KAAK,YAAY;EAC5D,MAAM,UAAU,oBAAoB,WAAW,UAAU,IAAI;EAC7D,MAAM,oBAAoB,WAExB,gBAAgB,YAAY,OAAO,CAAC,CAAC,QACpC,KAAK,CAAC,MAAM,WAAW,YAAY;GAClC,MAAM,MAEF,wBAAwB,CAAC;GAC7B,IAAI,QACF,IAAI,SAAS;GAEf,IAAI,QAAQ,iBAAiB,QAAQ,KAAK,WAAW,GAAG;GACxD,OAAO;EACT,GACA,CAAC,CACH;EAEA,IAAI;EACJ,IAAI,cACF,gBAAgB;OACX,IAAI,kBACT,gBAAgB,iBAAiB,QAAQ,KAAK,kBAAkB;GAC9D,GAAG;GACH,QAAQ;EACV,CAAC;OACI;GACL,MAAM,iBAAiB,iBAAiB,QAAQ,SAAS,OAAO;GAChE,MAAM,SAAS,IAAI,eAAe;IAChC,UAAU;IACV,gBAAgB,CAAC,WAAW,OAAO;GACrC,CAAC;GACD,gBAAgB,IAAI,kBAAkB;IACpC;IACA;IACA,WAAW;GACb,CAAC;EACH;EAEA,OAAO,IAAI,sBAAsB;GAC/B,GAAG;GACH;GACA;GACA,cAAc;EAChB,CAAC;CACH;CAEA,aAAqB;EACnB,OAAO;CACT;AACF"}