@langchain/classic 1.0.34 → 1.0.35
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.
- package/CHANGELOG.md +7 -0
- package/dist/agents/chat/index.cjs.map +1 -1
- package/dist/agents/chat/index.js.map +1 -1
- package/dist/agents/chat/outputParser.cjs.map +1 -1
- package/dist/agents/chat/outputParser.d.cts +2 -2
- package/dist/agents/chat/outputParser.js.map +1 -1
- package/dist/agents/chat_convo/index.cjs.map +1 -1
- package/dist/agents/chat_convo/index.js.map +1 -1
- package/dist/agents/chat_convo/outputParser.cjs.map +1 -1
- package/dist/agents/chat_convo/outputParser.js.map +1 -1
- package/dist/agents/executor.cjs.map +1 -1
- package/dist/agents/executor.js.map +1 -1
- package/dist/agents/format_scratchpad/log.cjs.map +1 -1
- package/dist/agents/format_scratchpad/log.js.map +1 -1
- package/dist/agents/format_scratchpad/log_to_message.cjs.map +1 -1
- package/dist/agents/format_scratchpad/log_to_message.js.map +1 -1
- package/dist/agents/initialize.cjs.map +1 -1
- package/dist/agents/initialize.js.map +1 -1
- package/dist/agents/mrkl/index.cjs.map +1 -1
- package/dist/agents/mrkl/index.js.map +1 -1
- package/dist/agents/mrkl/outputParser.cjs.map +1 -1
- package/dist/agents/mrkl/outputParser.d.cts +1 -1
- package/dist/agents/mrkl/outputParser.js.map +1 -1
- package/dist/agents/openai_functions/index.cjs.map +1 -1
- package/dist/agents/openai_functions/index.js.map +1 -1
- package/dist/agents/openai_tools/index.cjs.map +1 -1
- package/dist/agents/openai_tools/index.js.map +1 -1
- package/dist/agents/react/index.cjs.map +1 -1
- package/dist/agents/react/index.js.map +1 -1
- package/dist/agents/react/output_parser.cjs.map +1 -1
- package/dist/agents/react/output_parser.js.map +1 -1
- package/dist/agents/structured_chat/index.cjs.map +1 -1
- package/dist/agents/structured_chat/index.js.map +1 -1
- package/dist/agents/structured_chat/outputParser.cjs.map +1 -1
- package/dist/agents/structured_chat/outputParser.js.map +1 -1
- package/dist/agents/tool_calling/index.cjs.map +1 -1
- package/dist/agents/tool_calling/index.js.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/openai_functions.cjs.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/openai_functions.js.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/tool.cjs.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/tool.js.map +1 -1
- package/dist/agents/toolkits/json/json.cjs.map +1 -1
- package/dist/agents/toolkits/json/json.js.map +1 -1
- package/dist/agents/toolkits/openapi/openapi.cjs.map +1 -1
- package/dist/agents/toolkits/openapi/openapi.js.map +1 -1
- package/dist/agents/toolkits/sql/sql.cjs.map +1 -1
- package/dist/agents/toolkits/sql/sql.js.map +1 -1
- package/dist/agents/toolkits/vectorstore/vectorstore.cjs.map +1 -1
- package/dist/agents/toolkits/vectorstore/vectorstore.js.map +1 -1
- package/dist/agents/xml/index.cjs.map +1 -1
- package/dist/agents/xml/index.js.map +1 -1
- package/dist/chains/analyze_documents_chain.cjs.map +1 -1
- package/dist/chains/analyze_documents_chain.js.map +1 -1
- package/dist/chains/api/api_chain.cjs.map +1 -1
- package/dist/chains/api/api_chain.js.map +1 -1
- package/dist/chains/api/prompts.js.map +1 -1
- package/dist/chains/base.cjs.map +1 -1
- package/dist/chains/base.js.map +1 -1
- package/dist/chains/chat_vector_db_chain.cjs.map +1 -1
- package/dist/chains/chat_vector_db_chain.js.map +1 -1
- package/dist/chains/combine_docs_chain.cjs.map +1 -1
- package/dist/chains/combine_docs_chain.js.map +1 -1
- package/dist/chains/combine_documents/base.cjs.map +1 -1
- package/dist/chains/combine_documents/base.js.map +1 -1
- package/dist/chains/combine_documents/reduce.cjs.map +1 -1
- package/dist/chains/combine_documents/reduce.js.map +1 -1
- package/dist/chains/constitutional_ai/constitutional_prompts.cjs.map +1 -1
- package/dist/chains/constitutional_ai/constitutional_prompts.js.map +1 -1
- package/dist/chains/conversational_retrieval_chain.cjs.map +1 -1
- package/dist/chains/conversational_retrieval_chain.js.map +1 -1
- package/dist/chains/graph_qa/cypher.cjs.map +1 -1
- package/dist/chains/graph_qa/cypher.js.map +1 -1
- package/dist/chains/graph_qa/prompts.cjs.map +1 -1
- package/dist/chains/graph_qa/prompts.js.map +1 -1
- package/dist/chains/history_aware_retriever.cjs.map +1 -1
- package/dist/chains/history_aware_retriever.js.map +1 -1
- package/dist/chains/llm_chain.cjs.map +1 -1
- package/dist/chains/llm_chain.js.map +1 -1
- package/dist/chains/openai_functions/base.cjs.map +1 -1
- package/dist/chains/openai_functions/base.js.map +1 -1
- package/dist/chains/openai_functions/openapi.cjs.map +1 -1
- package/dist/chains/openai_functions/openapi.js.map +1 -1
- package/dist/chains/query_constructor/index.cjs.map +1 -1
- package/dist/chains/query_constructor/index.js.map +1 -1
- package/dist/chains/query_constructor/parser.cjs.map +1 -1
- package/dist/chains/query_constructor/parser.js.map +1 -1
- package/dist/chains/query_constructor/prompt.cjs.map +1 -1
- package/dist/chains/query_constructor/prompt.js.map +1 -1
- package/dist/chains/question_answering/load.cjs.map +1 -1
- package/dist/chains/question_answering/load.js.map +1 -1
- package/dist/chains/question_answering/map_reduce_prompts.cjs.map +1 -1
- package/dist/chains/question_answering/map_reduce_prompts.js.map +1 -1
- package/dist/chains/question_answering/refine_prompts.cjs.map +1 -1
- package/dist/chains/question_answering/refine_prompts.js.map +1 -1
- package/dist/chains/question_answering/stuff_prompts.cjs.map +1 -1
- package/dist/chains/question_answering/stuff_prompts.js.map +1 -1
- package/dist/chains/retrieval.cjs.map +1 -1
- package/dist/chains/retrieval.js.map +1 -1
- package/dist/chains/router/multi_prompt.cjs.map +1 -1
- package/dist/chains/router/multi_prompt.js.map +1 -1
- package/dist/chains/router/multi_retrieval_qa.cjs.map +1 -1
- package/dist/chains/router/multi_retrieval_qa.js.map +1 -1
- package/dist/chains/sql_db/sql_db_chain.cjs.map +1 -1
- package/dist/chains/sql_db/sql_db_chain.js.map +1 -1
- package/dist/chains/summarization/load.cjs.map +1 -1
- package/dist/chains/summarization/load.js.map +1 -1
- package/dist/chains/summarization/refine_prompts.cjs.map +1 -1
- package/dist/chains/summarization/refine_prompts.js.map +1 -1
- package/dist/chains/summarization/stuff_prompts.cjs.map +1 -1
- package/dist/chains/summarization/stuff_prompts.js.map +1 -1
- package/dist/chat_models/universal.cjs.map +1 -1
- package/dist/chat_models/universal.js.map +1 -1
- package/dist/document_loaders/fs/json.cjs.map +1 -1
- package/dist/document_loaders/fs/json.js.map +1 -1
- package/dist/document_loaders/fs/multi_file.cjs.map +1 -1
- package/dist/document_loaders/fs/multi_file.js.map +1 -1
- package/dist/document_transformers/openai_functions.cjs.map +1 -1
- package/dist/document_transformers/openai_functions.js.map +1 -1
- package/dist/evaluation/agents/prompt.cjs.map +1 -1
- package/dist/evaluation/agents/prompt.js.map +1 -1
- package/dist/evaluation/comparison/pairwise.cjs.map +1 -1
- package/dist/evaluation/comparison/pairwise.js.map +1 -1
- package/dist/evaluation/comparison/prompt.cjs.map +1 -1
- package/dist/evaluation/comparison/prompt.js.map +1 -1
- package/dist/evaluation/criteria/criteria.cjs.map +1 -1
- package/dist/evaluation/criteria/criteria.js.map +1 -1
- package/dist/evaluation/criteria/prompt.cjs.map +1 -1
- package/dist/evaluation/criteria/prompt.js.map +1 -1
- package/dist/evaluation/embedding_distance/base.cjs.map +1 -1
- package/dist/evaluation/embedding_distance/base.js.map +1 -1
- package/dist/evaluation/qa/eval_chain.cjs.map +1 -1
- package/dist/evaluation/qa/eval_chain.js.map +1 -1
- package/dist/evaluation/qa/prompt.cjs.map +1 -1
- package/dist/evaluation/qa/prompt.js.map +1 -1
- package/dist/experimental/autogpt/agent.cjs.map +1 -1
- package/dist/experimental/autogpt/agent.js.map +1 -1
- package/dist/experimental/autogpt/prompt.cjs.map +1 -1
- package/dist/experimental/autogpt/prompt.js.map +1 -1
- package/dist/experimental/autogpt/prompt_generator.cjs.map +1 -1
- package/dist/experimental/autogpt/prompt_generator.js.map +1 -1
- package/dist/experimental/babyagi/agent.cjs.map +1 -1
- package/dist/experimental/babyagi/agent.js.map +1 -1
- package/dist/experimental/babyagi/task_creation.cjs.map +1 -1
- package/dist/experimental/babyagi/task_creation.js.map +1 -1
- package/dist/experimental/babyagi/task_execution.cjs.map +1 -1
- package/dist/experimental/babyagi/task_execution.js.map +1 -1
- package/dist/experimental/babyagi/task_prioritization.cjs.map +1 -1
- package/dist/experimental/babyagi/task_prioritization.js.map +1 -1
- package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.cjs.map +1 -1
- package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.js.map +1 -1
- package/dist/experimental/generative_agents/generative_agent.cjs.map +1 -1
- package/dist/experimental/generative_agents/generative_agent.js.map +1 -1
- package/dist/experimental/generative_agents/generative_agent_memory.cjs.map +1 -1
- package/dist/experimental/generative_agents/generative_agent_memory.js.map +1 -1
- package/dist/experimental/masking/regex_masking_transformer.cjs.map +1 -1
- package/dist/experimental/masking/regex_masking_transformer.js.map +1 -1
- package/dist/experimental/openai_assistant/index.cjs.map +1 -1
- package/dist/experimental/openai_assistant/index.js.map +1 -1
- package/dist/experimental/plan_and_execute/agent_executor.cjs.map +1 -1
- package/dist/experimental/plan_and_execute/agent_executor.js.map +1 -1
- package/dist/experimental/plan_and_execute/base.cjs.map +1 -1
- package/dist/experimental/plan_and_execute/base.js.map +1 -1
- package/dist/experimental/prompts/handlebars.cjs.map +1 -1
- package/dist/experimental/prompts/handlebars.js.map +1 -1
- package/dist/hub/base.cjs.map +1 -1
- package/dist/hub/base.js.map +1 -1
- package/dist/hub/index.cjs.map +1 -1
- package/dist/hub/index.js.map +1 -1
- package/dist/hub/node.cjs.map +1 -1
- package/dist/hub/node.js.map +1 -1
- package/dist/memory/buffer_memory.cjs.map +1 -1
- package/dist/memory/buffer_memory.js.map +1 -1
- package/dist/memory/buffer_token_memory.cjs.map +1 -1
- package/dist/memory/buffer_token_memory.js.map +1 -1
- package/dist/memory/buffer_window_memory.cjs.map +1 -1
- package/dist/memory/buffer_window_memory.js.map +1 -1
- package/dist/memory/entity_memory.cjs.map +1 -1
- package/dist/memory/entity_memory.js.map +1 -1
- package/dist/memory/prompt.cjs.map +1 -1
- package/dist/memory/prompt.js.map +1 -1
- package/dist/memory/summary.cjs.map +1 -1
- package/dist/memory/summary.js.map +1 -1
- package/dist/output_parsers/expression.cjs.map +1 -1
- package/dist/output_parsers/expression.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/base.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/base.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/factory.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/factory.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/identifier_handler.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/identifier_handler.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/property_assignment_handler.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/property_assignment_handler.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/string_literal_handler.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/string_literal_handler.js.map +1 -1
- package/dist/output_parsers/fix.cjs.map +1 -1
- package/dist/output_parsers/fix.js.map +1 -1
- package/dist/output_parsers/http_response.cjs.map +1 -1
- package/dist/output_parsers/http_response.js.map +1 -1
- package/dist/output_parsers/openai_functions.cjs.map +1 -1
- package/dist/output_parsers/openai_functions.js.map +1 -1
- package/dist/output_parsers/openai_tools.cjs.map +1 -1
- package/dist/output_parsers/openai_tools.js.map +1 -1
- package/dist/output_parsers/prompts.cjs.map +1 -1
- package/dist/output_parsers/prompts.js.map +1 -1
- package/dist/output_parsers/structured.cjs.map +1 -1
- package/dist/output_parsers/structured.js.map +1 -1
- package/dist/retrievers/contextual_compression.cjs.map +1 -1
- package/dist/retrievers/contextual_compression.js.map +1 -1
- package/dist/retrievers/document_compressors/chain_extract.cjs.map +1 -1
- package/dist/retrievers/document_compressors/chain_extract.js.map +1 -1
- package/dist/retrievers/ensemble.cjs.map +1 -1
- package/dist/retrievers/ensemble.js.map +1 -1
- package/dist/retrievers/hyde.cjs.map +1 -1
- package/dist/retrievers/hyde.js.map +1 -1
- package/dist/retrievers/multi_query.cjs.map +1 -1
- package/dist/retrievers/multi_query.js.map +1 -1
- package/dist/retrievers/multi_vector.cjs.map +1 -1
- package/dist/retrievers/multi_vector.js.map +1 -1
- package/dist/retrievers/parent_document.cjs.map +1 -1
- package/dist/retrievers/parent_document.js.map +1 -1
- package/dist/retrievers/score_threshold.cjs.map +1 -1
- package/dist/retrievers/score_threshold.js.map +1 -1
- package/dist/smith/runner_utils.cjs.map +1 -1
- package/dist/smith/runner_utils.js.map +1 -1
- package/dist/storage/encoder_backed.cjs.map +1 -1
- package/dist/storage/encoder_backed.js.map +1 -1
- package/dist/storage/file_system.cjs.map +1 -1
- package/dist/storage/file_system.js.map +1 -1
- package/dist/tools/json.cjs.map +1 -1
- package/dist/tools/json.js.map +1 -1
- package/dist/tools/requests.cjs.map +1 -1
- package/dist/tools/requests.js.map +1 -1
- package/dist/tools/retriever.cjs.map +1 -1
- package/dist/tools/retriever.js.map +1 -1
- package/dist/tools/sql.cjs.map +1 -1
- package/dist/tools/sql.js.map +1 -1
- package/dist/tools/webbrowser.cjs.map +1 -1
- package/dist/tools/webbrowser.js.map +1 -1
- package/dist/util/hub.cjs.map +1 -1
- package/dist/util/hub.js.map +1 -1
- package/dist/util/load.cjs.map +1 -1
- package/dist/util/load.js.map +1 -1
- package/dist/util/openapi.cjs.map +1 -1
- package/dist/util/openapi.js.map +1 -1
- package/dist/util/sql_utils.cjs.map +1 -1
- package/dist/util/sql_utils.js.map +1 -1
- package/dist/vectorstores/memory.cjs.map +1 -1
- package/dist/vectorstores/memory.js.map +1 -1
- package/package.json +47 -48
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieval.cjs","names":["RunnableSequence","RunnablePassthrough"],"sources":["../../src/chains/retrieval.ts"],"sourcesContent":["import type { BaseRetrieverInterface } from \"@langchain/core/retrievers\";\nimport {\n type Runnable,\n RunnableSequence,\n type RunnableInterface,\n RunnablePassthrough,\n} from \"@langchain/core/runnables\";\nimport type { BaseMessage } from \"@langchain/core/messages\";\nimport type { DocumentInterface, Document } from \"@langchain/core/documents\";\n\n/**\n * Parameters for the createRetrievalChain method.\n */\nexport type CreateRetrievalChainParams<RunOutput> = {\n /**\n * Retriever-like object that returns list of documents. Should\n * either be a subclass of BaseRetriever or a Runnable that returns\n * a list of documents. If a subclass of BaseRetriever, then it\n * is expected that an `input` key be passed in - this is what\n * is will be used to pass into the retriever. If this is NOT a\n * subclass of BaseRetriever, then all the inputs will be passed\n * into this runnable, meaning that runnable should take a object\n * as input.\n */\n retriever:\n | BaseRetrieverInterface\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | RunnableInterface<Record<string, any>, DocumentInterface[]>;\n /**\n * Runnable that takes inputs and produces a string output.\n * The inputs to this will be any original inputs to this chain, a new\n * context key with the retrieved documents, and chat_history (if not present\n * in the inputs) with a value of `[]` (to easily enable conversational\n * retrieval).\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n combineDocsChain: RunnableInterface<Record<string, any>, RunOutput>;\n};\n\nfunction isBaseRetriever(x: unknown): x is BaseRetrieverInterface {\n return !!x && typeof (x as BaseRetrieverInterface).invoke === \"function\";\n}\n\n/**\n * Create a retrieval chain that retrieves documents and then passes them on.\n * @param {CreateRetrievalChainParams} params A params object\n * containing a retriever and a combineDocsChain.\n * @returns An LCEL Runnable which returns a an object\n * containing at least `context` and `answer` keys.\n * @example\n * ```typescript\n * // pnpm add langchain @langchain/openai\n *\n * import { ChatOpenAI } from \"@langchain/openai\";\n * import { pull } from \"langchain/hub\";\n * import { createRetrievalChain } from \"@langchain/classic/chains/retrieval\";\n * import { createStuffDocumentsChain } from \"@langchain/classic/chains/combine_documents\";\n *\n * const retrievalQAChatPrompt = await pull(\"langchain-ai/retrieval-qa-chat\");\n * const llm = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n * const retriever = ...\n * const combineDocsChain = await createStuffDocumentsChain(...);\n * const retrievalChain = await createRetrievalChain({\n * retriever,\n * combineDocsChain,\n * });\n * const response = await chain.invoke({ input: \"...\" });\n * ```\n */\nexport async function createRetrievalChain<RunOutput>({\n retriever,\n combineDocsChain,\n}: CreateRetrievalChainParams<RunOutput>): Promise<\n Runnable<\n { input: string; chat_history?: BaseMessage[] | string } & {\n [key: string]: unknown;\n },\n { context: Document[]; answer: RunOutput } & { [key: string]: unknown }\n >\n> {\n let retrieveDocumentsChain: Runnable<{ input: string }, DocumentInterface[]>;\n if (isBaseRetriever(retriever)) {\n retrieveDocumentsChain = RunnableSequence.from([\n (input) => input.input,\n retriever,\n ]);\n } else {\n // TODO: Fix typing by adding withConfig to core RunnableInterface\n retrieveDocumentsChain = retriever as Runnable;\n }\n const retrievalChain = RunnableSequence.from<{\n input: string;\n chat_history?: BaseMessage[] | string;\n }>([\n RunnablePassthrough.assign({\n context: retrieveDocumentsChain.withConfig({\n runName: \"retrieve_documents\",\n }),\n chat_history: (input) => input.chat_history ?? [],\n }),\n RunnablePassthrough.assign({\n answer: combineDocsChain,\n }),\n ]).withConfig({ runName: \"retrieval_chain\" });\n return retrievalChain;\n}\n"],"mappings":";;;;;AAuCA,SAAS,gBAAgB,GAAyC;AAChE,QAAO,CAAC,CAAC,KAAK,OAAQ,EAA6B,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BhE,eAAsB,qBAAgC,EACpD,WACA,oBAQA;CACA,IAAI;AACJ,KAAI,gBAAgB,UAAU,CAC5B,0BAAyBA,0BAAAA,iBAAiB,KAAK,EAC5C,UAAU,MAAM,OACjB,UACD,CAAC;KAGF,0BAAyB;AAgB3B,QAduBA,0BAAAA,iBAAiB,KAGrC,CACDC,0BAAAA,oBAAoB,OAAO;EACzB,SAAS,uBAAuB,WAAW,EACzC,SAAS,sBACV,CAAC;EACF,eAAe,UAAU,MAAM,gBAAgB,EAAE;EAClD,CAAC,EACFA,0BAAAA,oBAAoB,OAAO,EACzB,QAAQ,kBACT,CAAC,CACH,CAAC,CAAC,WAAW,EAAE,SAAS,mBAAmB,
|
|
1
|
+
{"version":3,"file":"retrieval.cjs","names":["RunnableSequence","RunnablePassthrough"],"sources":["../../src/chains/retrieval.ts"],"sourcesContent":["import type { BaseRetrieverInterface } from \"@langchain/core/retrievers\";\nimport {\n type Runnable,\n RunnableSequence,\n type RunnableInterface,\n RunnablePassthrough,\n} from \"@langchain/core/runnables\";\nimport type { BaseMessage } from \"@langchain/core/messages\";\nimport type { DocumentInterface, Document } from \"@langchain/core/documents\";\n\n/**\n * Parameters for the createRetrievalChain method.\n */\nexport type CreateRetrievalChainParams<RunOutput> = {\n /**\n * Retriever-like object that returns list of documents. Should\n * either be a subclass of BaseRetriever or a Runnable that returns\n * a list of documents. If a subclass of BaseRetriever, then it\n * is expected that an `input` key be passed in - this is what\n * is will be used to pass into the retriever. If this is NOT a\n * subclass of BaseRetriever, then all the inputs will be passed\n * into this runnable, meaning that runnable should take a object\n * as input.\n */\n retriever:\n | BaseRetrieverInterface\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | RunnableInterface<Record<string, any>, DocumentInterface[]>;\n /**\n * Runnable that takes inputs and produces a string output.\n * The inputs to this will be any original inputs to this chain, a new\n * context key with the retrieved documents, and chat_history (if not present\n * in the inputs) with a value of `[]` (to easily enable conversational\n * retrieval).\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n combineDocsChain: RunnableInterface<Record<string, any>, RunOutput>;\n};\n\nfunction isBaseRetriever(x: unknown): x is BaseRetrieverInterface {\n return !!x && typeof (x as BaseRetrieverInterface).invoke === \"function\";\n}\n\n/**\n * Create a retrieval chain that retrieves documents and then passes them on.\n * @param {CreateRetrievalChainParams} params A params object\n * containing a retriever and a combineDocsChain.\n * @returns An LCEL Runnable which returns a an object\n * containing at least `context` and `answer` keys.\n * @example\n * ```typescript\n * // pnpm add langchain @langchain/openai\n *\n * import { ChatOpenAI } from \"@langchain/openai\";\n * import { pull } from \"langchain/hub\";\n * import { createRetrievalChain } from \"@langchain/classic/chains/retrieval\";\n * import { createStuffDocumentsChain } from \"@langchain/classic/chains/combine_documents\";\n *\n * const retrievalQAChatPrompt = await pull(\"langchain-ai/retrieval-qa-chat\");\n * const llm = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n * const retriever = ...\n * const combineDocsChain = await createStuffDocumentsChain(...);\n * const retrievalChain = await createRetrievalChain({\n * retriever,\n * combineDocsChain,\n * });\n * const response = await chain.invoke({ input: \"...\" });\n * ```\n */\nexport async function createRetrievalChain<RunOutput>({\n retriever,\n combineDocsChain,\n}: CreateRetrievalChainParams<RunOutput>): Promise<\n Runnable<\n { input: string; chat_history?: BaseMessage[] | string } & {\n [key: string]: unknown;\n },\n { context: Document[]; answer: RunOutput } & { [key: string]: unknown }\n >\n> {\n let retrieveDocumentsChain: Runnable<{ input: string }, DocumentInterface[]>;\n if (isBaseRetriever(retriever)) {\n retrieveDocumentsChain = RunnableSequence.from([\n (input) => input.input,\n retriever,\n ]);\n } else {\n // TODO: Fix typing by adding withConfig to core RunnableInterface\n retrieveDocumentsChain = retriever as Runnable;\n }\n const retrievalChain = RunnableSequence.from<{\n input: string;\n chat_history?: BaseMessage[] | string;\n }>([\n RunnablePassthrough.assign({\n context: retrieveDocumentsChain.withConfig({\n runName: \"retrieve_documents\",\n }),\n chat_history: (input) => input.chat_history ?? [],\n }),\n RunnablePassthrough.assign({\n answer: combineDocsChain,\n }),\n ]).withConfig({ runName: \"retrieval_chain\" });\n return retrievalChain;\n}\n"],"mappings":";;;;;AAuCA,SAAS,gBAAgB,GAAyC;AAChE,QAAO,CAAC,CAAC,KAAK,OAAQ,EAA6B,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BhE,eAAsB,qBAAgC,EACpD,WACA,oBAQA;CACA,IAAI;AACJ,KAAI,gBAAgB,UAAU,CAC5B,0BAAyBA,0BAAAA,iBAAiB,KAAK,EAC5C,UAAU,MAAM,OACjB,UACD,CAAC;KAGF,0BAAyB;AAgB3B,QAduBA,0BAAAA,iBAAiB,KAGrC,CACDC,0BAAAA,oBAAoB,OAAO;EACzB,SAAS,uBAAuB,WAAW,EACzC,SAAS,sBACV,CAAC;EACF,eAAe,UAAU,MAAM,gBAAgB,EAAE;EAClD,CAAC,EACFA,0BAAAA,oBAAoB,OAAO,EACzB,QAAQ,kBACT,CAAC,CACH,CAAC,CAAC,WAAW,EAAE,SAAS,mBAAmB,CACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieval.js","names":[],"sources":["../../src/chains/retrieval.ts"],"sourcesContent":["import type { BaseRetrieverInterface } from \"@langchain/core/retrievers\";\nimport {\n type Runnable,\n RunnableSequence,\n type RunnableInterface,\n RunnablePassthrough,\n} from \"@langchain/core/runnables\";\nimport type { BaseMessage } from \"@langchain/core/messages\";\nimport type { DocumentInterface, Document } from \"@langchain/core/documents\";\n\n/**\n * Parameters for the createRetrievalChain method.\n */\nexport type CreateRetrievalChainParams<RunOutput> = {\n /**\n * Retriever-like object that returns list of documents. Should\n * either be a subclass of BaseRetriever or a Runnable that returns\n * a list of documents. If a subclass of BaseRetriever, then it\n * is expected that an `input` key be passed in - this is what\n * is will be used to pass into the retriever. If this is NOT a\n * subclass of BaseRetriever, then all the inputs will be passed\n * into this runnable, meaning that runnable should take a object\n * as input.\n */\n retriever:\n | BaseRetrieverInterface\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | RunnableInterface<Record<string, any>, DocumentInterface[]>;\n /**\n * Runnable that takes inputs and produces a string output.\n * The inputs to this will be any original inputs to this chain, a new\n * context key with the retrieved documents, and chat_history (if not present\n * in the inputs) with a value of `[]` (to easily enable conversational\n * retrieval).\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n combineDocsChain: RunnableInterface<Record<string, any>, RunOutput>;\n};\n\nfunction isBaseRetriever(x: unknown): x is BaseRetrieverInterface {\n return !!x && typeof (x as BaseRetrieverInterface).invoke === \"function\";\n}\n\n/**\n * Create a retrieval chain that retrieves documents and then passes them on.\n * @param {CreateRetrievalChainParams} params A params object\n * containing a retriever and a combineDocsChain.\n * @returns An LCEL Runnable which returns a an object\n * containing at least `context` and `answer` keys.\n * @example\n * ```typescript\n * // pnpm add langchain @langchain/openai\n *\n * import { ChatOpenAI } from \"@langchain/openai\";\n * import { pull } from \"langchain/hub\";\n * import { createRetrievalChain } from \"@langchain/classic/chains/retrieval\";\n * import { createStuffDocumentsChain } from \"@langchain/classic/chains/combine_documents\";\n *\n * const retrievalQAChatPrompt = await pull(\"langchain-ai/retrieval-qa-chat\");\n * const llm = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n * const retriever = ...\n * const combineDocsChain = await createStuffDocumentsChain(...);\n * const retrievalChain = await createRetrievalChain({\n * retriever,\n * combineDocsChain,\n * });\n * const response = await chain.invoke({ input: \"...\" });\n * ```\n */\nexport async function createRetrievalChain<RunOutput>({\n retriever,\n combineDocsChain,\n}: CreateRetrievalChainParams<RunOutput>): Promise<\n Runnable<\n { input: string; chat_history?: BaseMessage[] | string } & {\n [key: string]: unknown;\n },\n { context: Document[]; answer: RunOutput } & { [key: string]: unknown }\n >\n> {\n let retrieveDocumentsChain: Runnable<{ input: string }, DocumentInterface[]>;\n if (isBaseRetriever(retriever)) {\n retrieveDocumentsChain = RunnableSequence.from([\n (input) => input.input,\n retriever,\n ]);\n } else {\n // TODO: Fix typing by adding withConfig to core RunnableInterface\n retrieveDocumentsChain = retriever as Runnable;\n }\n const retrievalChain = RunnableSequence.from<{\n input: string;\n chat_history?: BaseMessage[] | string;\n }>([\n RunnablePassthrough.assign({\n context: retrieveDocumentsChain.withConfig({\n runName: \"retrieve_documents\",\n }),\n chat_history: (input) => input.chat_history ?? [],\n }),\n RunnablePassthrough.assign({\n answer: combineDocsChain,\n }),\n ]).withConfig({ runName: \"retrieval_chain\" });\n return retrievalChain;\n}\n"],"mappings":";;;;AAuCA,SAAS,gBAAgB,GAAyC;AAChE,QAAO,CAAC,CAAC,KAAK,OAAQ,EAA6B,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BhE,eAAsB,qBAAgC,EACpD,WACA,oBAQA;CACA,IAAI;AACJ,KAAI,gBAAgB,UAAU,CAC5B,0BAAyB,iBAAiB,KAAK,EAC5C,UAAU,MAAM,OACjB,UACD,CAAC;KAGF,0BAAyB;AAgB3B,QAduB,iBAAiB,KAGrC,CACD,oBAAoB,OAAO;EACzB,SAAS,uBAAuB,WAAW,EACzC,SAAS,sBACV,CAAC;EACF,eAAe,UAAU,MAAM,gBAAgB,EAAE;EAClD,CAAC,EACF,oBAAoB,OAAO,EACzB,QAAQ,kBACT,CAAC,CACH,CAAC,CAAC,WAAW,EAAE,SAAS,mBAAmB,
|
|
1
|
+
{"version":3,"file":"retrieval.js","names":[],"sources":["../../src/chains/retrieval.ts"],"sourcesContent":["import type { BaseRetrieverInterface } from \"@langchain/core/retrievers\";\nimport {\n type Runnable,\n RunnableSequence,\n type RunnableInterface,\n RunnablePassthrough,\n} from \"@langchain/core/runnables\";\nimport type { BaseMessage } from \"@langchain/core/messages\";\nimport type { DocumentInterface, Document } from \"@langchain/core/documents\";\n\n/**\n * Parameters for the createRetrievalChain method.\n */\nexport type CreateRetrievalChainParams<RunOutput> = {\n /**\n * Retriever-like object that returns list of documents. Should\n * either be a subclass of BaseRetriever or a Runnable that returns\n * a list of documents. If a subclass of BaseRetriever, then it\n * is expected that an `input` key be passed in - this is what\n * is will be used to pass into the retriever. If this is NOT a\n * subclass of BaseRetriever, then all the inputs will be passed\n * into this runnable, meaning that runnable should take a object\n * as input.\n */\n retriever:\n | BaseRetrieverInterface\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | RunnableInterface<Record<string, any>, DocumentInterface[]>;\n /**\n * Runnable that takes inputs and produces a string output.\n * The inputs to this will be any original inputs to this chain, a new\n * context key with the retrieved documents, and chat_history (if not present\n * in the inputs) with a value of `[]` (to easily enable conversational\n * retrieval).\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n combineDocsChain: RunnableInterface<Record<string, any>, RunOutput>;\n};\n\nfunction isBaseRetriever(x: unknown): x is BaseRetrieverInterface {\n return !!x && typeof (x as BaseRetrieverInterface).invoke === \"function\";\n}\n\n/**\n * Create a retrieval chain that retrieves documents and then passes them on.\n * @param {CreateRetrievalChainParams} params A params object\n * containing a retriever and a combineDocsChain.\n * @returns An LCEL Runnable which returns a an object\n * containing at least `context` and `answer` keys.\n * @example\n * ```typescript\n * // pnpm add langchain @langchain/openai\n *\n * import { ChatOpenAI } from \"@langchain/openai\";\n * import { pull } from \"langchain/hub\";\n * import { createRetrievalChain } from \"@langchain/classic/chains/retrieval\";\n * import { createStuffDocumentsChain } from \"@langchain/classic/chains/combine_documents\";\n *\n * const retrievalQAChatPrompt = await pull(\"langchain-ai/retrieval-qa-chat\");\n * const llm = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n * const retriever = ...\n * const combineDocsChain = await createStuffDocumentsChain(...);\n * const retrievalChain = await createRetrievalChain({\n * retriever,\n * combineDocsChain,\n * });\n * const response = await chain.invoke({ input: \"...\" });\n * ```\n */\nexport async function createRetrievalChain<RunOutput>({\n retriever,\n combineDocsChain,\n}: CreateRetrievalChainParams<RunOutput>): Promise<\n Runnable<\n { input: string; chat_history?: BaseMessage[] | string } & {\n [key: string]: unknown;\n },\n { context: Document[]; answer: RunOutput } & { [key: string]: unknown }\n >\n> {\n let retrieveDocumentsChain: Runnable<{ input: string }, DocumentInterface[]>;\n if (isBaseRetriever(retriever)) {\n retrieveDocumentsChain = RunnableSequence.from([\n (input) => input.input,\n retriever,\n ]);\n } else {\n // TODO: Fix typing by adding withConfig to core RunnableInterface\n retrieveDocumentsChain = retriever as Runnable;\n }\n const retrievalChain = RunnableSequence.from<{\n input: string;\n chat_history?: BaseMessage[] | string;\n }>([\n RunnablePassthrough.assign({\n context: retrieveDocumentsChain.withConfig({\n runName: \"retrieve_documents\",\n }),\n chat_history: (input) => input.chat_history ?? [],\n }),\n RunnablePassthrough.assign({\n answer: combineDocsChain,\n }),\n ]).withConfig({ runName: \"retrieval_chain\" });\n return retrievalChain;\n}\n"],"mappings":";;;;AAuCA,SAAS,gBAAgB,GAAyC;AAChE,QAAO,CAAC,CAAC,KAAK,OAAQ,EAA6B,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BhE,eAAsB,qBAAgC,EACpD,WACA,oBAQA;CACA,IAAI;AACJ,KAAI,gBAAgB,UAAU,CAC5B,0BAAyB,iBAAiB,KAAK,EAC5C,UAAU,MAAM,OACjB,UACD,CAAC;KAGF,0BAAyB;AAgB3B,QAduB,iBAAiB,KAGrC,CACD,oBAAoB,OAAO;EACzB,SAAS,uBAAuB,WAAW,EACzC,SAAS,sBACV,CAAC;EACF,eAAe,UAAU,MAAM,gBAAgB,EAAE;EAClD,CAAC,EACF,oBAAoB,OAAO,EACzB,QAAQ,kBACT,CAAC,CACH,CAAC,CAAC,WAAW,EAAE,SAAS,mBAAmB,CACvB"}
|
|
@@ -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;AACA,SAAO,iBAAiB,kBAAkB,KAAK;GAC7C;GACA;GACA;GACA;GACA,qBAAqB;GACtB,CAAC;;;;;;;;;;;;;;;;CAiBJ,OAAO,kBACL,KACA,EACE,aACA,oBACA,iBACA,cACA,cACA,uBACA,uBAUgB;EAClB,MAAM,eAAeC,cAAAA,WAAW,aAAa,mBAAmB,CAAC,KAC9D,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,OAC/B;EAgBD,MAAM,eAAe,IAAIC,eAAAA,mBAdYC,OAAAA,EAAE,OAAO;GAC5C,aAAaA,OAAAA,EACV,QAAQ,CACR,UAAU,CACV,SAAS,8DAA4D;GACxE,aAAaA,OAAAA,EACV,OAAO,EACN,OAAOA,OAAAA,EACJ,QAAQ,CACR,SAAS,uDAAuD,EACpE,CAAC,CACD,SAAS,oCAAoC;GACjD,CAAC
|
|
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;AACA,SAAO,iBAAiB,kBAAkB,KAAK;GAC7C;GACA;GACA;GACA;GACA,qBAAqB;GACtB,CAAC;;;;;;;;;;;;;;;;CAiBJ,OAAO,kBACL,KACA,EACE,aACA,oBACA,iBACA,cACA,cACA,uBACA,uBAUgB;EAClB,MAAM,eAAeC,cAAAA,WAAW,aAAa,mBAAmB,CAAC,KAC9D,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,OAC/B;EAgBD,MAAM,eAAe,IAAIC,eAAAA,mBAdYC,OAAAA,EAAE,OAAO;GAC5C,aAAaA,OAAAA,EACV,QAAQ,CACR,UAAU,CACV,SAAS,8DAA4D;GACxE,aAAaA,OAAAA,EACV,OAAO,EACN,OAAOA,OAAAA,EACJ,QAAQ,CACR,SAAS,uDAAuD,EACpE,CAAC,CACD,SAAS,oCAAoC;GACjD,CAEuE,CAAC;EAEzE,MAAM,kBAAkB,aAAa,KAAK,KAAK;EAU/C,MAAM,eAAe,IAAIC,wBAAAA,eAAe;GACtC,WAAA,GAAA,wBAAA,oBATAC,4BAAAA,wCACE,aAAa,sBAAsB,EAAE,oBAAoB,GAAG,CAAC,CAC9D,EACD,EACE,cAAc,iBACf,CAIuB;GACxB,gBAAgB,CAAC,QAAQ;GACzB;GACD,CAAC;EAEF,MAAM,cAAcC,mBAAAA,eAAe,QAAQ,KAAK,aAAa;EAC7D,MAAM,oBAAoBL,cAAAA,WACxB,aACA,gBACD,CAAC,QACC,KAAK,CAAC,MAAM,cAAc;GACzB,IAAI;AACJ,OAAI,OAAO,aAAa,SACtB,YAAW;YACF,OAAO,aAAa,SAC7B,YAAW,IAAIG,wBAAAA,eAAe;IAClB;IACV,gBAAgB,CAAC,QAAQ;IAC1B,CAAC;OAEF,OAAM,IAAI,MAAM,0BAA0B;AAE5C,OAAI,QAAkB,IAAIG,kBAAAA,SAAS;IACjC,GAAG;IACH;IACA,QAAQ;IACT,CAAC;AACF,UAAO;KAET,EAAE,CACH;EAED,MAAM,YAAY,IAAIC,qBAAAA,kBAAkB;GACtC,GAAG;GACH;GACA,WAAW;GACZ,CAAC;AAEF,SAAO,IAAI,iBAAiB;GAC1B,GAAG;GACH;GACA;GACA,cAAc,gBAAgB;GAC/B,CAAC;;CAGJ,aAAqB;AACnB,SAAO"}
|
|
@@ -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;AACA,SAAO,iBAAiB,kBAAkB,KAAK;GAC7C;GACA;GACA;GACA;GACA,qBAAqB;GACtB,CAAC;;;;;;;;;;;;;;;;CAiBJ,OAAO,kBACL,KACA,EACE,aACA,oBACA,iBACA,cACA,cACA,uBACA,uBAUgB;EAClB,MAAM,eAAe,WAAW,aAAa,mBAAmB,CAAC,KAC9D,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,OAC/B;EAgBD,MAAM,eAAe,IAAI,mBAdY,EAAE,OAAO;GAC5C,aAAa,EACV,QAAQ,CACR,UAAU,CACV,SAAS,8DAA4D;GACxE,aAAa,EACV,OAAO,EACN,OAAO,EACJ,QAAQ,CACR,SAAS,uDAAuD,EACpE,CAAC,CACD,SAAS,oCAAoC;GACjD,CAAC
|
|
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;AACA,SAAO,iBAAiB,kBAAkB,KAAK;GAC7C;GACA;GACA;GACA;GACA,qBAAqB;GACtB,CAAC;;;;;;;;;;;;;;;;CAiBJ,OAAO,kBACL,KACA,EACE,aACA,oBACA,iBACA,cACA,cACA,uBACA,uBAUgB;EAClB,MAAM,eAAe,WAAW,aAAa,mBAAmB,CAAC,KAC9D,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,OAC/B;EAgBD,MAAM,eAAe,IAAI,mBAdY,EAAE,OAAO;GAC5C,aAAa,EACV,QAAQ,CACR,UAAU,CACV,SAAS,8DAA4D;GACxE,aAAa,EACV,OAAO,EACN,OAAO,EACJ,QAAQ,CACR,SAAS,uDAAuD,EACpE,CAAC,CACD,SAAS,oCAAoC;GACjD,CAEuE,CAAC;EAEzE,MAAM,kBAAkB,aAAa,KAAK,KAAK;EAU/C,MAAM,eAAe,IAAI,eAAe;GACtC,UAVqB,mBACrB,wCACE,aAAa,sBAAsB,EAAE,oBAAoB,GAAG,CAAC,CAC9D,EACD,EACE,cAAc,iBACf,CAIuB;GACxB,gBAAgB,CAAC,QAAQ;GACzB;GACD,CAAC;EAEF,MAAM,cAAc,eAAe,QAAQ,KAAK,aAAa;EAC7D,MAAM,oBAAoB,WACxB,aACA,gBACD,CAAC,QACC,KAAK,CAAC,MAAM,cAAc;GACzB,IAAI;AACJ,OAAI,OAAO,aAAa,SACtB,YAAW;YACF,OAAO,aAAa,SAC7B,YAAW,IAAI,eAAe;IAClB;IACV,gBAAgB,CAAC,QAAQ;IAC1B,CAAC;OAEF,OAAM,IAAI,MAAM,0BAA0B;AAE5C,OAAI,QAAkB,IAAI,SAAS;IACjC,GAAG;IACH;IACA,QAAQ;IACT,CAAC;AACF,UAAO;KAET,EAAE,CACH;EAED,MAAM,YAAY,IAAI,kBAAkB;GACtC,GAAG;GACH;GACA,WAAW;GACZ,CAAC;AAEF,SAAO,IAAI,iBAAiB;GAC1B,GAAG;GACH;GACA;GACA,cAAc,gBAAgB;GAC/B,CAAC;;CAGJ,aAAqB;AACnB,SAAO"}
|
|
@@ -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;AACzB,SAAO,CAAC,SAAS;;;;;CAMnB,OAAO,eACL,KACA,gBACA,uBACA,YACA,kBACA,UACA,SACA;AACA,SAAO,sBAAsB,qBAAqB,KAAK;GACrD;GACA;GACA;GACA;GACA;GACA,yBAAyB;GAC1B,CAAC;;;;;;;;;;;;;;;;;;CAmBJ,OAAO,qBACL,KACA,EACE,gBACA,uBACA,YACA,kBACA,UACA,yBACA,wBAcqB;EACvB,MAAM,EAAE,kBAAkB,eAAe,iBAAiB,YAAY,EAAE;AACxE,MAAI,iBAAiB,CAAC,iBACpB,OAAM,IAAI,MACR,2GACD;EAEH,MAAM,eAAeC,cAAAA,WACnB,gBACA,sBACD,CAAC,KAAK,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,OAAO;EAgB3C,MAAM,eAAe,IAAIC,eAAAA,mBAdYC,OAAAA,EAAE,OAAO;GAC5C,aAAaA,OAAAA,EACV,QAAQ,CACR,UAAU,CACV,SAAS,8DAA4D;GACxE,aAAaA,OAAAA,EACV,OAAO,EACN,OAAOA,OAAAA,EACJ,QAAQ,CACR,SAAS,uDAAuD,EACpE,CAAC,CACD,SAAS,oCAAoC;GACjD,CAAC,CAI6B;EAE/B,MAAM,kBAAkB,aAAa,KAAK,KAAK;EAS/C,MAAM,eAAe,IAAIC,wBAAAA,eAAe;GACtC,WAAA,GAAA,wBAAA,oBARAC,+BAAAA,2CACE,aAAa,sBAAsB,EAAE,oBAAoB,GAAG,CAAC,CAC9D,EACD,EACE,cAAc,iBACf,CACF;GAGC,gBAAgB,CAAC,QAAQ;GACzB;GACD,CAAC;EAEF,MAAM,cAAcC,mBAAAA,eAAe,QAAQ,KAAK,aAAa;EAE7D,MAAM,oBAAoBL,cAAAA,WAExB,gBAAgB,YAHF,oBAAoB,WAAW,UAAU,KAAK,CAGxB,CAAC,QACpC,KAAK,CAAC,MAAM,WAAW,YAAY;GAClC,MAAM,MAEF,wBAAwB,EAAE;AAC9B,OAAI,OACF,KAAI,SAAS;AAEf,OAAI,QAAQM,qBAAAA,iBAAiB,QAAQ,KAAK,WAAW,IAAI;AACzD,UAAO;KAET,EAAE,CACH;EAED,IAAI;AACJ,MAAI,aACF,iBAAgB;WACP,iBACT,iBAAgBA,qBAAAA,iBAAiB,QAAQ,KAAK,kBAAkB;GAC9D,GAAG;GACH,QAAQ;GACT,CAAC;MAOF,iBAAgB,IAAIC,qBAAAA,kBAAkB;GACpC;GACA,QANa,IAAIJ,wBAAAA,eAAe;IAChC,UAFqBK,qBAAAA,iBAAiB,QAAQ,SAAS,QAAQ;IAG/D,gBAAgB,CAAC,WAAW,QAAQ;IACrC,CAAC;GAIA,WAAW;GACZ,CAAC;AAGJ,SAAO,IAAI,sBAAsB;GAC/B,GAAG;GACH;GACA;GACA,cAAc;GACf,CAAC;;CAGJ,aAAqB;AACnB,SAAO"}
|
|
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;AACzB,SAAO,CAAC,SAAS;;;;;CAMnB,OAAO,eACL,KACA,gBACA,uBACA,YACA,kBACA,UACA,SACA;AACA,SAAO,sBAAsB,qBAAqB,KAAK;GACrD;GACA;GACA;GACA;GACA;GACA,yBAAyB;GAC1B,CAAC;;;;;;;;;;;;;;;;;;CAmBJ,OAAO,qBACL,KACA,EACE,gBACA,uBACA,YACA,kBACA,UACA,yBACA,wBAcqB;EACvB,MAAM,EAAE,kBAAkB,eAAe,iBAAiB,YAAY,EAAE;AACxE,MAAI,iBAAiB,CAAC,iBACpB,OAAM,IAAI,MACR,2GACD;EAEH,MAAM,eAAeC,cAAAA,WACnB,gBACA,sBACD,CAAC,KAAK,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,OAAO;EAgB3C,MAAM,eAAe,IAAIC,eAAAA,mBAdYC,OAAAA,EAAE,OAAO;GAC5C,aAAaA,OAAAA,EACV,QAAQ,CACR,UAAU,CACV,SAAS,8DAA4D;GACxE,aAAaA,OAAAA,EACV,OAAO,EACN,OAAOA,OAAAA,EACJ,QAAQ,CACR,SAAS,uDAAuD,EACpE,CAAC,CACD,SAAS,oCAAoC;GACjD,CAI6B,CAAC;EAE/B,MAAM,kBAAkB,aAAa,KAAK,KAAK;EAS/C,MAAM,eAAe,IAAIC,wBAAAA,eAAe;GACtC,WAAA,GAAA,wBAAA,oBARAC,+BAAAA,2CACE,aAAa,sBAAsB,EAAE,oBAAoB,GAAG,CAAC,CAC9D,EACD,EACE,cAAc,iBACf,CAGuB;GACxB,gBAAgB,CAAC,QAAQ;GACzB;GACD,CAAC;EAEF,MAAM,cAAcC,mBAAAA,eAAe,QAAQ,KAAK,aAAa;EAE7D,MAAM,oBAAoBL,cAAAA,WAExB,gBAAgB,YAHF,oBAAoB,WAAW,UAAU,KAAK,CAGxB,CAAC,QACpC,KAAK,CAAC,MAAM,WAAW,YAAY;GAClC,MAAM,MAEF,wBAAwB,EAAE;AAC9B,OAAI,OACF,KAAI,SAAS;AAEf,OAAI,QAAQM,qBAAAA,iBAAiB,QAAQ,KAAK,WAAW,IAAI;AACzD,UAAO;KAET,EAAE,CACH;EAED,IAAI;AACJ,MAAI,aACF,iBAAgB;WACP,iBACT,iBAAgBA,qBAAAA,iBAAiB,QAAQ,KAAK,kBAAkB;GAC9D,GAAG;GACH,QAAQ;GACT,CAAC;MAOF,iBAAgB,IAAIC,qBAAAA,kBAAkB;GACpC;GACA,QAAA,IANiBJ,wBAAAA,eAAe;IAChC,UAFqBK,qBAAAA,iBAAiB,QAAQ,SAAS,QAE/B;IACxB,gBAAgB,CAAC,WAAW,QAAQ;IACrC,CAGO;GACN,WAAW;GACZ,CAAC;AAGJ,SAAO,IAAI,sBAAsB;GAC/B,GAAG;GACH;GACA;GACA,cAAc;GACf,CAAC;;CAGJ,aAAqB;AACnB,SAAO"}
|
|
@@ -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;AACzB,SAAO,CAAC,SAAS;;;;;CAMnB,OAAO,eACL,KACA,gBACA,uBACA,YACA,kBACA,UACA,SACA;AACA,SAAO,sBAAsB,qBAAqB,KAAK;GACrD;GACA;GACA;GACA;GACA;GACA,yBAAyB;GAC1B,CAAC;;;;;;;;;;;;;;;;;;CAmBJ,OAAO,qBACL,KACA,EACE,gBACA,uBACA,YACA,kBACA,UACA,yBACA,wBAcqB;EACvB,MAAM,EAAE,kBAAkB,eAAe,iBAAiB,YAAY,EAAE;AACxE,MAAI,iBAAiB,CAAC,iBACpB,OAAM,IAAI,MACR,2GACD;EAEH,MAAM,eAAe,WACnB,gBACA,sBACD,CAAC,KAAK,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,OAAO;EAgB3C,MAAM,eAAe,IAAI,mBAdY,EAAE,OAAO;GAC5C,aAAa,EACV,QAAQ,CACR,UAAU,CACV,SAAS,8DAA4D;GACxE,aAAa,EACV,OAAO,EACN,OAAO,EACJ,QAAQ,CACR,SAAS,uDAAuD,EACpE,CAAC,CACD,SAAS,oCAAoC;GACjD,CAAC
|
|
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;AACzB,SAAO,CAAC,SAAS;;;;;CAMnB,OAAO,eACL,KACA,gBACA,uBACA,YACA,kBACA,UACA,SACA;AACA,SAAO,sBAAsB,qBAAqB,KAAK;GACrD;GACA;GACA;GACA;GACA;GACA,yBAAyB;GAC1B,CAAC;;;;;;;;;;;;;;;;;;CAmBJ,OAAO,qBACL,KACA,EACE,gBACA,uBACA,YACA,kBACA,UACA,yBACA,wBAcqB;EACvB,MAAM,EAAE,kBAAkB,eAAe,iBAAiB,YAAY,EAAE;AACxE,MAAI,iBAAiB,CAAC,iBACpB,OAAM,IAAI,MACR,2GACD;EAEH,MAAM,eAAe,WACnB,gBACA,sBACD,CAAC,KAAK,CAAC,MAAM,UAAU,GAAG,KAAK,IAAI,OAAO;EAgB3C,MAAM,eAAe,IAAI,mBAdY,EAAE,OAAO;GAC5C,aAAa,EACV,QAAQ,CACR,UAAU,CACV,SAAS,8DAA4D;GACxE,aAAa,EACV,OAAO,EACN,OAAO,EACJ,QAAQ,CACR,SAAS,uDAAuD,EACpE,CAAC,CACD,SAAS,oCAAoC;GACjD,CAI6B,CAAC;EAE/B,MAAM,kBAAkB,aAAa,KAAK,KAAK;EAS/C,MAAM,eAAe,IAAI,eAAe;GACtC,UATqB,mBACrB,2CACE,aAAa,sBAAsB,EAAE,oBAAoB,GAAG,CAAC,CAC9D,EACD,EACE,cAAc,iBACf,CAGuB;GACxB,gBAAgB,CAAC,QAAQ;GACzB;GACD,CAAC;EAEF,MAAM,cAAc,eAAe,QAAQ,KAAK,aAAa;EAE7D,MAAM,oBAAoB,WAExB,gBAAgB,YAHF,oBAAoB,WAAW,UAAU,KAAK,CAGxB,CAAC,QACpC,KAAK,CAAC,MAAM,WAAW,YAAY;GAClC,MAAM,MAEF,wBAAwB,EAAE;AAC9B,OAAI,OACF,KAAI,SAAS;AAEf,OAAI,QAAQ,iBAAiB,QAAQ,KAAK,WAAW,IAAI;AACzD,UAAO;KAET,EAAE,CACH;EAED,IAAI;AACJ,MAAI,aACF,iBAAgB;WACP,iBACT,iBAAgB,iBAAiB,QAAQ,KAAK,kBAAkB;GAC9D,GAAG;GACH,QAAQ;GACT,CAAC;MAOF,iBAAgB,IAAI,kBAAkB;GACpC;GACA,QAAA,IANiB,eAAe;IAChC,UAFqB,iBAAiB,QAAQ,SAAS,QAE/B;IACxB,gBAAgB,CAAC,WAAW,QAAQ;IACrC,CAGO;GACN,WAAW;GACZ,CAAC;AAGJ,SAAO,IAAI,sBAAsB;GAC/B,GAAG;GACH;GACA;GACA,cAAc;GACf,CAAC;;CAGJ,aAAqB;AACnB,SAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql_db_chain.cjs","names":["BaseChain","DEFAULT_SQL_DATABASE_PROMPT","getPromptTemplateFromDataSource","LLMChain","SQL_PROMPTS_MAP","RunnableSequence","RunnablePassthrough","StringOutputParser"],"sources":["../../../src/chains/sql_db/sql_db_chain.ts"],"sourcesContent":["import type {\n BaseLanguageModel,\n BaseLanguageModelInterface,\n} from \"@langchain/core/language_models/base\";\nimport type { OpenAI, TiktokenModel } from \"@langchain/openai\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { BasePromptTemplate, PromptTemplate } from \"@langchain/core/prompts\";\nimport {\n calculateMaxTokens,\n getModelContextSize,\n} from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { StringOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n DEFAULT_SQL_DATABASE_PROMPT,\n SQL_PROMPTS_MAP,\n SqlDialect,\n} from \"./sql_db_prompt.js\";\nimport { BaseChain, ChainInputs } from \"../base.js\";\nimport { LLMChain } from \"../llm_chain.js\";\nimport type { SqlDatabase } from \"../../sql_db.js\";\nimport { getPromptTemplateFromDataSource } from \"../../util/sql_utils.js\";\n\n/**\n * Interface that extends the ChainInputs interface and defines additional\n * fields specific to a SQL database chain. It represents the input fields\n * for a SQL database chain.\n */\nexport interface SqlDatabaseChainInput extends ChainInputs {\n llm: BaseLanguageModelInterface;\n database: SqlDatabase;\n topK?: number;\n inputKey?: string;\n outputKey?: string;\n sqlOutputKey?: string;\n prompt?: PromptTemplate;\n}\n\n/**\n * Class that represents a SQL database chain in the LangChain framework.\n * It extends the BaseChain class and implements the functionality\n * specific to a SQL database chain.\n *\n * @security **Security Notice**\n * This chain generates SQL queries for the given database.\n * The SQLDatabase class provides a getTableInfo method that can be used\n * to get column information as well as sample data from the table.\n * To mitigate risk of leaking sensitive data, limit permissions\n * to read and scope to the tables that are needed.\n * Optionally, use the includesTables or ignoreTables class parameters\n * to limit which tables can/cannot be accessed.\n *\n * @link See https://js.langchain.com/docs/security for more information.\n * @example\n * ```typescript\n * const chain = new SqlDatabaseChain({\n * llm: new OpenAI({ temperature: 0 }),\n * database: new SqlDatabase({ ...config }),\n * });\n *\n * const result = await chain.run(\"How many tracks are there?\");\n * ```\n */\nexport class SqlDatabaseChain extends BaseChain {\n static lc_name() {\n return \"SqlDatabaseChain\";\n }\n\n // LLM wrapper to use\n llm: BaseLanguageModelInterface;\n\n // SQL Database to connect to.\n database: SqlDatabase;\n\n // Prompt to use to translate natural language to SQL.\n prompt = DEFAULT_SQL_DATABASE_PROMPT;\n\n // Number of results to return from the query\n topK = 5;\n\n inputKey = \"query\";\n\n outputKey = \"result\";\n\n sqlOutputKey: string | undefined = undefined;\n\n // Whether to return the result of querying the SQL table directly.\n returnDirect = false;\n\n constructor(fields: SqlDatabaseChainInput) {\n super(fields);\n this.llm = fields.llm;\n this.database = fields.database;\n this.topK = fields.topK ?? this.topK;\n this.inputKey = fields.inputKey ?? this.inputKey;\n this.outputKey = fields.outputKey ?? this.outputKey;\n this.sqlOutputKey = fields.sqlOutputKey ?? this.sqlOutputKey;\n this.prompt =\n fields.prompt ??\n getPromptTemplateFromDataSource(this.database.appDataSource);\n }\n\n /** @ignore */\n async _call(\n values: ChainValues,\n runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const llmChain = new LLMChain({\n prompt: this.prompt,\n llm: this.llm,\n outputKey: this.outputKey,\n memory: this.memory,\n });\n if (!(this.inputKey in values)) {\n throw new Error(`Question key ${this.inputKey} not found.`);\n }\n const question: string = values[this.inputKey];\n let inputText = `${question}\\nSQLQuery:`;\n const tablesToUse = values.table_names_to_use;\n const tableInfo = await this.database.getTableInfo(tablesToUse);\n\n const llmInputs = {\n input: inputText,\n top_k: this.topK,\n dialect: this.database.appDataSourceOptions.type,\n table_info: tableInfo,\n stop: [\"\\nSQLResult:\"],\n };\n await this.verifyNumberOfTokens(inputText, tableInfo);\n\n const sqlCommand = await llmChain.predict(\n llmInputs,\n runManager?.getChild(\"sql_generation\")\n );\n let queryResult = \"\";\n try {\n queryResult = await this.database.appDataSource.query(sqlCommand);\n } catch (error) {\n console.error(error);\n }\n\n let finalResult;\n if (this.returnDirect) {\n finalResult = { [this.outputKey]: queryResult };\n } else {\n inputText += `${sqlCommand}\\nSQLResult: ${JSON.stringify(\n queryResult\n )}\\nAnswer:`;\n llmInputs.input = inputText;\n finalResult = {\n [this.outputKey]: await llmChain.predict(\n llmInputs,\n runManager?.getChild(\"result_generation\")\n ),\n };\n }\n\n if (this.sqlOutputKey != null) {\n finalResult[this.sqlOutputKey] = sqlCommand;\n }\n\n return finalResult;\n }\n\n _chainType() {\n return \"sql_database_chain\" as const;\n }\n\n get inputKeys(): string[] {\n return [this.inputKey];\n }\n\n get outputKeys(): string[] {\n if (this.sqlOutputKey != null) {\n return [this.outputKey, this.sqlOutputKey];\n }\n return [this.outputKey];\n }\n\n /**\n * Private method that verifies the number of tokens in the input text and\n * table information. It throws an error if the number of tokens exceeds\n * the maximum allowed by the language model.\n * @param inputText The input text.\n * @param tableinfo The table information.\n * @returns A promise that resolves when the verification is complete.\n */\n private async verifyNumberOfTokens(\n inputText: string,\n tableinfo: string\n ): Promise<void> {\n // We verify it only for OpenAI for the moment\n if (this.llm._llmType() !== \"openai\") {\n return;\n }\n const llm = this.llm as OpenAI;\n const promptTemplate = this.prompt.template;\n const stringWeSend = `${inputText}${promptTemplate}${tableinfo}`;\n\n const maxToken = await calculateMaxTokens({\n prompt: stringWeSend,\n // Cast here to allow for other models that may not fit the union\n modelName: llm.model as TiktokenModel,\n });\n\n if (maxToken < (llm.maxTokens ?? -1)) {\n throw new Error(`The combination of the database structure and your question is too big for the model ${\n llm.model\n } which can compute only a max tokens of ${getModelContextSize(\n llm.model\n )}.\n We suggest you to use the includeTables parameters when creating the SqlDatabase object to select only a subset of the tables. You can also use a model which can handle more tokens.`);\n }\n }\n}\n\nexport interface CreateSqlQueryChainFields {\n llm: BaseLanguageModel;\n db: SqlDatabase;\n prompt?: BasePromptTemplate;\n /**\n * @default 5\n */\n k?: number;\n dialect: SqlDialect;\n}\n\ntype SqlInput = {\n question: string;\n};\n\ntype SqlInoutWithTables = SqlInput & {\n tableNamesToUse: string[];\n};\n\nconst strip = (text: string) => {\n // Replace escaped quotes with actual quotes\n let newText = text.replace(/\\\\\"/g, '\"').trim();\n // Remove wrapping quotes if the entire string is wrapped in quotes\n if (newText.startsWith('\"') && newText.endsWith('\"')) {\n newText = newText.substring(1, newText.length - 1);\n }\n return newText;\n};\n\nconst difference = (setA: Set<string>, setB: Set<string>) =>\n new Set([...setA].filter((x) => !setB.has(x)));\n\n/**\n * Create a SQL query chain that can create SQL queries for the given database.\n * Returns a Runnable.\n *\n * @param {BaseLanguageModel} llm The language model to use in the chain.\n * @param {SqlDatabase} db The database to use in the chain.\n * @param {BasePromptTemplate | undefined} prompt The prompt to use in the chain.\n * @param {BaseLanguageModel | undefined} k The amount of docs/results to return. Passed through the prompt input value `top_k`.\n * @param {SqlDialect} dialect The SQL dialect to use in the chain.\n * @returns {Promise<RunnableSequence<Record<string, unknown>, string>>} A runnable sequence representing the chain.\n * @example ```typescript\n * const datasource = new DataSource({\n * type: \"sqlite\",\n * database: \"../../../../Chinook.db\",\n * });\n * const db = await SqlDatabase.fromDataSourceParams({\n * appDataSource: datasource,\n * });\n * const llm = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 });\n * const chain = await createSqlQueryChain({\n * llm,\n * db,\n * dialect: \"sqlite\",\n * });\n * ```\n */\nexport async function createSqlQueryChain({\n llm,\n db,\n prompt,\n k = 5,\n dialect,\n}: CreateSqlQueryChainFields) {\n let promptToUse: BasePromptTemplate;\n if (prompt) {\n promptToUse = prompt;\n } else if (SQL_PROMPTS_MAP[dialect]) {\n promptToUse = SQL_PROMPTS_MAP[dialect];\n } else {\n promptToUse = DEFAULT_SQL_DATABASE_PROMPT;\n }\n\n if (\n difference(\n new Set([\"input\", \"top_k\", \"table_info\"]),\n new Set(promptToUse.inputVariables)\n ).size > 0\n ) {\n throw new Error(\n `Prompt must have input variables: 'input', 'top_k', 'table_info'. Received prompt with input variables: ` +\n `${promptToUse.inputVariables}. Full prompt:\\n\\n${promptToUse}`\n );\n }\n if (promptToUse.inputVariables.includes(\"dialect\")) {\n promptToUse = await promptToUse.partial({ dialect });\n }\n\n promptToUse = await promptToUse.partial({ top_k: k.toString() });\n\n const inputs = {\n input: (x: Record<string, unknown>) => {\n if (\"question\" in x) {\n return `${(x as SqlInput).question}\\nSQLQuery: `;\n }\n throw new Error(\"Input must include a question property.\");\n },\n table_info: async (x: Record<string, unknown>) =>\n db.getTableInfo((x as SqlInoutWithTables).tableNamesToUse),\n };\n\n return RunnableSequence.from([\n RunnablePassthrough.assign(inputs),\n (x) => {\n const newInputs = { ...x };\n delete newInputs.question;\n delete newInputs.tableNamesToUse;\n return newInputs;\n },\n promptToUse,\n llm.withConfig({ stop: [\"\\nSQLResult:\"] }),\n new StringOutputParser(),\n strip,\n ]);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sql_db_chain.cjs","names":["BaseChain","DEFAULT_SQL_DATABASE_PROMPT","getPromptTemplateFromDataSource","LLMChain","SQL_PROMPTS_MAP","RunnableSequence","RunnablePassthrough","StringOutputParser"],"sources":["../../../src/chains/sql_db/sql_db_chain.ts"],"sourcesContent":["import type {\n BaseLanguageModel,\n BaseLanguageModelInterface,\n} from \"@langchain/core/language_models/base\";\nimport type { OpenAI, TiktokenModel } from \"@langchain/openai\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { BasePromptTemplate, PromptTemplate } from \"@langchain/core/prompts\";\nimport {\n calculateMaxTokens,\n getModelContextSize,\n} from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { StringOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n DEFAULT_SQL_DATABASE_PROMPT,\n SQL_PROMPTS_MAP,\n SqlDialect,\n} from \"./sql_db_prompt.js\";\nimport { BaseChain, ChainInputs } from \"../base.js\";\nimport { LLMChain } from \"../llm_chain.js\";\nimport type { SqlDatabase } from \"../../sql_db.js\";\nimport { getPromptTemplateFromDataSource } from \"../../util/sql_utils.js\";\n\n/**\n * Interface that extends the ChainInputs interface and defines additional\n * fields specific to a SQL database chain. It represents the input fields\n * for a SQL database chain.\n */\nexport interface SqlDatabaseChainInput extends ChainInputs {\n llm: BaseLanguageModelInterface;\n database: SqlDatabase;\n topK?: number;\n inputKey?: string;\n outputKey?: string;\n sqlOutputKey?: string;\n prompt?: PromptTemplate;\n}\n\n/**\n * Class that represents a SQL database chain in the LangChain framework.\n * It extends the BaseChain class and implements the functionality\n * specific to a SQL database chain.\n *\n * @security **Security Notice**\n * This chain generates SQL queries for the given database.\n * The SQLDatabase class provides a getTableInfo method that can be used\n * to get column information as well as sample data from the table.\n * To mitigate risk of leaking sensitive data, limit permissions\n * to read and scope to the tables that are needed.\n * Optionally, use the includesTables or ignoreTables class parameters\n * to limit which tables can/cannot be accessed.\n *\n * @link See https://js.langchain.com/docs/security for more information.\n * @example\n * ```typescript\n * const chain = new SqlDatabaseChain({\n * llm: new OpenAI({ temperature: 0 }),\n * database: new SqlDatabase({ ...config }),\n * });\n *\n * const result = await chain.run(\"How many tracks are there?\");\n * ```\n */\nexport class SqlDatabaseChain extends BaseChain {\n static lc_name() {\n return \"SqlDatabaseChain\";\n }\n\n // LLM wrapper to use\n llm: BaseLanguageModelInterface;\n\n // SQL Database to connect to.\n database: SqlDatabase;\n\n // Prompt to use to translate natural language to SQL.\n prompt = DEFAULT_SQL_DATABASE_PROMPT;\n\n // Number of results to return from the query\n topK = 5;\n\n inputKey = \"query\";\n\n outputKey = \"result\";\n\n sqlOutputKey: string | undefined = undefined;\n\n // Whether to return the result of querying the SQL table directly.\n returnDirect = false;\n\n constructor(fields: SqlDatabaseChainInput) {\n super(fields);\n this.llm = fields.llm;\n this.database = fields.database;\n this.topK = fields.topK ?? this.topK;\n this.inputKey = fields.inputKey ?? this.inputKey;\n this.outputKey = fields.outputKey ?? this.outputKey;\n this.sqlOutputKey = fields.sqlOutputKey ?? this.sqlOutputKey;\n this.prompt =\n fields.prompt ??\n getPromptTemplateFromDataSource(this.database.appDataSource);\n }\n\n /** @ignore */\n async _call(\n values: ChainValues,\n runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const llmChain = new LLMChain({\n prompt: this.prompt,\n llm: this.llm,\n outputKey: this.outputKey,\n memory: this.memory,\n });\n if (!(this.inputKey in values)) {\n throw new Error(`Question key ${this.inputKey} not found.`);\n }\n const question: string = values[this.inputKey];\n let inputText = `${question}\\nSQLQuery:`;\n const tablesToUse = values.table_names_to_use;\n const tableInfo = await this.database.getTableInfo(tablesToUse);\n\n const llmInputs = {\n input: inputText,\n top_k: this.topK,\n dialect: this.database.appDataSourceOptions.type,\n table_info: tableInfo,\n stop: [\"\\nSQLResult:\"],\n };\n await this.verifyNumberOfTokens(inputText, tableInfo);\n\n const sqlCommand = await llmChain.predict(\n llmInputs,\n runManager?.getChild(\"sql_generation\")\n );\n let queryResult = \"\";\n try {\n queryResult = await this.database.appDataSource.query(sqlCommand);\n } catch (error) {\n console.error(error);\n }\n\n let finalResult;\n if (this.returnDirect) {\n finalResult = { [this.outputKey]: queryResult };\n } else {\n inputText += `${sqlCommand}\\nSQLResult: ${JSON.stringify(\n queryResult\n )}\\nAnswer:`;\n llmInputs.input = inputText;\n finalResult = {\n [this.outputKey]: await llmChain.predict(\n llmInputs,\n runManager?.getChild(\"result_generation\")\n ),\n };\n }\n\n if (this.sqlOutputKey != null) {\n finalResult[this.sqlOutputKey] = sqlCommand;\n }\n\n return finalResult;\n }\n\n _chainType() {\n return \"sql_database_chain\" as const;\n }\n\n get inputKeys(): string[] {\n return [this.inputKey];\n }\n\n get outputKeys(): string[] {\n if (this.sqlOutputKey != null) {\n return [this.outputKey, this.sqlOutputKey];\n }\n return [this.outputKey];\n }\n\n /**\n * Private method that verifies the number of tokens in the input text and\n * table information. It throws an error if the number of tokens exceeds\n * the maximum allowed by the language model.\n * @param inputText The input text.\n * @param tableinfo The table information.\n * @returns A promise that resolves when the verification is complete.\n */\n private async verifyNumberOfTokens(\n inputText: string,\n tableinfo: string\n ): Promise<void> {\n // We verify it only for OpenAI for the moment\n if (this.llm._llmType() !== \"openai\") {\n return;\n }\n const llm = this.llm as OpenAI;\n const promptTemplate = this.prompt.template;\n const stringWeSend = `${inputText}${promptTemplate}${tableinfo}`;\n\n const maxToken = await calculateMaxTokens({\n prompt: stringWeSend,\n // Cast here to allow for other models that may not fit the union\n modelName: llm.model as TiktokenModel,\n });\n\n if (maxToken < (llm.maxTokens ?? -1)) {\n throw new Error(`The combination of the database structure and your question is too big for the model ${\n llm.model\n } which can compute only a max tokens of ${getModelContextSize(\n llm.model\n )}.\n We suggest you to use the includeTables parameters when creating the SqlDatabase object to select only a subset of the tables. You can also use a model which can handle more tokens.`);\n }\n }\n}\n\nexport interface CreateSqlQueryChainFields {\n llm: BaseLanguageModel;\n db: SqlDatabase;\n prompt?: BasePromptTemplate;\n /**\n * @default 5\n */\n k?: number;\n dialect: SqlDialect;\n}\n\ntype SqlInput = {\n question: string;\n};\n\ntype SqlInoutWithTables = SqlInput & {\n tableNamesToUse: string[];\n};\n\nconst strip = (text: string) => {\n // Replace escaped quotes with actual quotes\n let newText = text.replace(/\\\\\"/g, '\"').trim();\n // Remove wrapping quotes if the entire string is wrapped in quotes\n if (newText.startsWith('\"') && newText.endsWith('\"')) {\n newText = newText.substring(1, newText.length - 1);\n }\n return newText;\n};\n\nconst difference = (setA: Set<string>, setB: Set<string>) =>\n new Set([...setA].filter((x) => !setB.has(x)));\n\n/**\n * Create a SQL query chain that can create SQL queries for the given database.\n * Returns a Runnable.\n *\n * @param {BaseLanguageModel} llm The language model to use in the chain.\n * @param {SqlDatabase} db The database to use in the chain.\n * @param {BasePromptTemplate | undefined} prompt The prompt to use in the chain.\n * @param {BaseLanguageModel | undefined} k The amount of docs/results to return. Passed through the prompt input value `top_k`.\n * @param {SqlDialect} dialect The SQL dialect to use in the chain.\n * @returns {Promise<RunnableSequence<Record<string, unknown>, string>>} A runnable sequence representing the chain.\n * @example ```typescript\n * const datasource = new DataSource({\n * type: \"sqlite\",\n * database: \"../../../../Chinook.db\",\n * });\n * const db = await SqlDatabase.fromDataSourceParams({\n * appDataSource: datasource,\n * });\n * const llm = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 });\n * const chain = await createSqlQueryChain({\n * llm,\n * db,\n * dialect: \"sqlite\",\n * });\n * ```\n */\nexport async function createSqlQueryChain({\n llm,\n db,\n prompt,\n k = 5,\n dialect,\n}: CreateSqlQueryChainFields) {\n let promptToUse: BasePromptTemplate;\n if (prompt) {\n promptToUse = prompt;\n } else if (SQL_PROMPTS_MAP[dialect]) {\n promptToUse = SQL_PROMPTS_MAP[dialect];\n } else {\n promptToUse = DEFAULT_SQL_DATABASE_PROMPT;\n }\n\n if (\n difference(\n new Set([\"input\", \"top_k\", \"table_info\"]),\n new Set(promptToUse.inputVariables)\n ).size > 0\n ) {\n throw new Error(\n `Prompt must have input variables: 'input', 'top_k', 'table_info'. Received prompt with input variables: ` +\n `${promptToUse.inputVariables}. Full prompt:\\n\\n${promptToUse}`\n );\n }\n if (promptToUse.inputVariables.includes(\"dialect\")) {\n promptToUse = await promptToUse.partial({ dialect });\n }\n\n promptToUse = await promptToUse.partial({ top_k: k.toString() });\n\n const inputs = {\n input: (x: Record<string, unknown>) => {\n if (\"question\" in x) {\n return `${(x as SqlInput).question}\\nSQLQuery: `;\n }\n throw new Error(\"Input must include a question property.\");\n },\n table_info: async (x: Record<string, unknown>) =>\n db.getTableInfo((x as SqlInoutWithTables).tableNamesToUse),\n };\n\n return RunnableSequence.from([\n RunnablePassthrough.assign(inputs),\n (x) => {\n const newInputs = { ...x };\n delete newInputs.question;\n delete newInputs.tableNamesToUse;\n return newInputs;\n },\n promptToUse,\n llm.withConfig({ stop: [\"\\nSQLResult:\"] }),\n new StringOutputParser(),\n strip,\n ]);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql_db_chain.js","names":[],"sources":["../../../src/chains/sql_db/sql_db_chain.ts"],"sourcesContent":["import type {\n BaseLanguageModel,\n BaseLanguageModelInterface,\n} from \"@langchain/core/language_models/base\";\nimport type { OpenAI, TiktokenModel } from \"@langchain/openai\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { BasePromptTemplate, PromptTemplate } from \"@langchain/core/prompts\";\nimport {\n calculateMaxTokens,\n getModelContextSize,\n} from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { StringOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n DEFAULT_SQL_DATABASE_PROMPT,\n SQL_PROMPTS_MAP,\n SqlDialect,\n} from \"./sql_db_prompt.js\";\nimport { BaseChain, ChainInputs } from \"../base.js\";\nimport { LLMChain } from \"../llm_chain.js\";\nimport type { SqlDatabase } from \"../../sql_db.js\";\nimport { getPromptTemplateFromDataSource } from \"../../util/sql_utils.js\";\n\n/**\n * Interface that extends the ChainInputs interface and defines additional\n * fields specific to a SQL database chain. It represents the input fields\n * for a SQL database chain.\n */\nexport interface SqlDatabaseChainInput extends ChainInputs {\n llm: BaseLanguageModelInterface;\n database: SqlDatabase;\n topK?: number;\n inputKey?: string;\n outputKey?: string;\n sqlOutputKey?: string;\n prompt?: PromptTemplate;\n}\n\n/**\n * Class that represents a SQL database chain in the LangChain framework.\n * It extends the BaseChain class and implements the functionality\n * specific to a SQL database chain.\n *\n * @security **Security Notice**\n * This chain generates SQL queries for the given database.\n * The SQLDatabase class provides a getTableInfo method that can be used\n * to get column information as well as sample data from the table.\n * To mitigate risk of leaking sensitive data, limit permissions\n * to read and scope to the tables that are needed.\n * Optionally, use the includesTables or ignoreTables class parameters\n * to limit which tables can/cannot be accessed.\n *\n * @link See https://js.langchain.com/docs/security for more information.\n * @example\n * ```typescript\n * const chain = new SqlDatabaseChain({\n * llm: new OpenAI({ temperature: 0 }),\n * database: new SqlDatabase({ ...config }),\n * });\n *\n * const result = await chain.run(\"How many tracks are there?\");\n * ```\n */\nexport class SqlDatabaseChain extends BaseChain {\n static lc_name() {\n return \"SqlDatabaseChain\";\n }\n\n // LLM wrapper to use\n llm: BaseLanguageModelInterface;\n\n // SQL Database to connect to.\n database: SqlDatabase;\n\n // Prompt to use to translate natural language to SQL.\n prompt = DEFAULT_SQL_DATABASE_PROMPT;\n\n // Number of results to return from the query\n topK = 5;\n\n inputKey = \"query\";\n\n outputKey = \"result\";\n\n sqlOutputKey: string | undefined = undefined;\n\n // Whether to return the result of querying the SQL table directly.\n returnDirect = false;\n\n constructor(fields: SqlDatabaseChainInput) {\n super(fields);\n this.llm = fields.llm;\n this.database = fields.database;\n this.topK = fields.topK ?? this.topK;\n this.inputKey = fields.inputKey ?? this.inputKey;\n this.outputKey = fields.outputKey ?? this.outputKey;\n this.sqlOutputKey = fields.sqlOutputKey ?? this.sqlOutputKey;\n this.prompt =\n fields.prompt ??\n getPromptTemplateFromDataSource(this.database.appDataSource);\n }\n\n /** @ignore */\n async _call(\n values: ChainValues,\n runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const llmChain = new LLMChain({\n prompt: this.prompt,\n llm: this.llm,\n outputKey: this.outputKey,\n memory: this.memory,\n });\n if (!(this.inputKey in values)) {\n throw new Error(`Question key ${this.inputKey} not found.`);\n }\n const question: string = values[this.inputKey];\n let inputText = `${question}\\nSQLQuery:`;\n const tablesToUse = values.table_names_to_use;\n const tableInfo = await this.database.getTableInfo(tablesToUse);\n\n const llmInputs = {\n input: inputText,\n top_k: this.topK,\n dialect: this.database.appDataSourceOptions.type,\n table_info: tableInfo,\n stop: [\"\\nSQLResult:\"],\n };\n await this.verifyNumberOfTokens(inputText, tableInfo);\n\n const sqlCommand = await llmChain.predict(\n llmInputs,\n runManager?.getChild(\"sql_generation\")\n );\n let queryResult = \"\";\n try {\n queryResult = await this.database.appDataSource.query(sqlCommand);\n } catch (error) {\n console.error(error);\n }\n\n let finalResult;\n if (this.returnDirect) {\n finalResult = { [this.outputKey]: queryResult };\n } else {\n inputText += `${sqlCommand}\\nSQLResult: ${JSON.stringify(\n queryResult\n )}\\nAnswer:`;\n llmInputs.input = inputText;\n finalResult = {\n [this.outputKey]: await llmChain.predict(\n llmInputs,\n runManager?.getChild(\"result_generation\")\n ),\n };\n }\n\n if (this.sqlOutputKey != null) {\n finalResult[this.sqlOutputKey] = sqlCommand;\n }\n\n return finalResult;\n }\n\n _chainType() {\n return \"sql_database_chain\" as const;\n }\n\n get inputKeys(): string[] {\n return [this.inputKey];\n }\n\n get outputKeys(): string[] {\n if (this.sqlOutputKey != null) {\n return [this.outputKey, this.sqlOutputKey];\n }\n return [this.outputKey];\n }\n\n /**\n * Private method that verifies the number of tokens in the input text and\n * table information. It throws an error if the number of tokens exceeds\n * the maximum allowed by the language model.\n * @param inputText The input text.\n * @param tableinfo The table information.\n * @returns A promise that resolves when the verification is complete.\n */\n private async verifyNumberOfTokens(\n inputText: string,\n tableinfo: string\n ): Promise<void> {\n // We verify it only for OpenAI for the moment\n if (this.llm._llmType() !== \"openai\") {\n return;\n }\n const llm = this.llm as OpenAI;\n const promptTemplate = this.prompt.template;\n const stringWeSend = `${inputText}${promptTemplate}${tableinfo}`;\n\n const maxToken = await calculateMaxTokens({\n prompt: stringWeSend,\n // Cast here to allow for other models that may not fit the union\n modelName: llm.model as TiktokenModel,\n });\n\n if (maxToken < (llm.maxTokens ?? -1)) {\n throw new Error(`The combination of the database structure and your question is too big for the model ${\n llm.model\n } which can compute only a max tokens of ${getModelContextSize(\n llm.model\n )}.\n We suggest you to use the includeTables parameters when creating the SqlDatabase object to select only a subset of the tables. You can also use a model which can handle more tokens.`);\n }\n }\n}\n\nexport interface CreateSqlQueryChainFields {\n llm: BaseLanguageModel;\n db: SqlDatabase;\n prompt?: BasePromptTemplate;\n /**\n * @default 5\n */\n k?: number;\n dialect: SqlDialect;\n}\n\ntype SqlInput = {\n question: string;\n};\n\ntype SqlInoutWithTables = SqlInput & {\n tableNamesToUse: string[];\n};\n\nconst strip = (text: string) => {\n // Replace escaped quotes with actual quotes\n let newText = text.replace(/\\\\\"/g, '\"').trim();\n // Remove wrapping quotes if the entire string is wrapped in quotes\n if (newText.startsWith('\"') && newText.endsWith('\"')) {\n newText = newText.substring(1, newText.length - 1);\n }\n return newText;\n};\n\nconst difference = (setA: Set<string>, setB: Set<string>) =>\n new Set([...setA].filter((x) => !setB.has(x)));\n\n/**\n * Create a SQL query chain that can create SQL queries for the given database.\n * Returns a Runnable.\n *\n * @param {BaseLanguageModel} llm The language model to use in the chain.\n * @param {SqlDatabase} db The database to use in the chain.\n * @param {BasePromptTemplate | undefined} prompt The prompt to use in the chain.\n * @param {BaseLanguageModel | undefined} k The amount of docs/results to return. Passed through the prompt input value `top_k`.\n * @param {SqlDialect} dialect The SQL dialect to use in the chain.\n * @returns {Promise<RunnableSequence<Record<string, unknown>, string>>} A runnable sequence representing the chain.\n * @example ```typescript\n * const datasource = new DataSource({\n * type: \"sqlite\",\n * database: \"../../../../Chinook.db\",\n * });\n * const db = await SqlDatabase.fromDataSourceParams({\n * appDataSource: datasource,\n * });\n * const llm = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 });\n * const chain = await createSqlQueryChain({\n * llm,\n * db,\n * dialect: \"sqlite\",\n * });\n * ```\n */\nexport async function createSqlQueryChain({\n llm,\n db,\n prompt,\n k = 5,\n dialect,\n}: CreateSqlQueryChainFields) {\n let promptToUse: BasePromptTemplate;\n if (prompt) {\n promptToUse = prompt;\n } else if (SQL_PROMPTS_MAP[dialect]) {\n promptToUse = SQL_PROMPTS_MAP[dialect];\n } else {\n promptToUse = DEFAULT_SQL_DATABASE_PROMPT;\n }\n\n if (\n difference(\n new Set([\"input\", \"top_k\", \"table_info\"]),\n new Set(promptToUse.inputVariables)\n ).size > 0\n ) {\n throw new Error(\n `Prompt must have input variables: 'input', 'top_k', 'table_info'. Received prompt with input variables: ` +\n `${promptToUse.inputVariables}. Full prompt:\\n\\n${promptToUse}`\n );\n }\n if (promptToUse.inputVariables.includes(\"dialect\")) {\n promptToUse = await promptToUse.partial({ dialect });\n }\n\n promptToUse = await promptToUse.partial({ top_k: k.toString() });\n\n const inputs = {\n input: (x: Record<string, unknown>) => {\n if (\"question\" in x) {\n return `${(x as SqlInput).question}\\nSQLQuery: `;\n }\n throw new Error(\"Input must include a question property.\");\n },\n table_info: async (x: Record<string, unknown>) =>\n db.getTableInfo((x as SqlInoutWithTables).tableNamesToUse),\n };\n\n return RunnableSequence.from([\n RunnablePassthrough.assign(inputs),\n (x) => {\n const newInputs = { ...x };\n delete newInputs.question;\n delete newInputs.tableNamesToUse;\n return newInputs;\n },\n promptToUse,\n llm.withConfig({ stop: [\"\\nSQLResult:\"] }),\n new StringOutputParser(),\n strip,\n ]);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sql_db_chain.js","names":[],"sources":["../../../src/chains/sql_db/sql_db_chain.ts"],"sourcesContent":["import type {\n BaseLanguageModel,\n BaseLanguageModelInterface,\n} from \"@langchain/core/language_models/base\";\nimport type { OpenAI, TiktokenModel } from \"@langchain/openai\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { BasePromptTemplate, PromptTemplate } from \"@langchain/core/prompts\";\nimport {\n calculateMaxTokens,\n getModelContextSize,\n} from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { StringOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n DEFAULT_SQL_DATABASE_PROMPT,\n SQL_PROMPTS_MAP,\n SqlDialect,\n} from \"./sql_db_prompt.js\";\nimport { BaseChain, ChainInputs } from \"../base.js\";\nimport { LLMChain } from \"../llm_chain.js\";\nimport type { SqlDatabase } from \"../../sql_db.js\";\nimport { getPromptTemplateFromDataSource } from \"../../util/sql_utils.js\";\n\n/**\n * Interface that extends the ChainInputs interface and defines additional\n * fields specific to a SQL database chain. It represents the input fields\n * for a SQL database chain.\n */\nexport interface SqlDatabaseChainInput extends ChainInputs {\n llm: BaseLanguageModelInterface;\n database: SqlDatabase;\n topK?: number;\n inputKey?: string;\n outputKey?: string;\n sqlOutputKey?: string;\n prompt?: PromptTemplate;\n}\n\n/**\n * Class that represents a SQL database chain in the LangChain framework.\n * It extends the BaseChain class and implements the functionality\n * specific to a SQL database chain.\n *\n * @security **Security Notice**\n * This chain generates SQL queries for the given database.\n * The SQLDatabase class provides a getTableInfo method that can be used\n * to get column information as well as sample data from the table.\n * To mitigate risk of leaking sensitive data, limit permissions\n * to read and scope to the tables that are needed.\n * Optionally, use the includesTables or ignoreTables class parameters\n * to limit which tables can/cannot be accessed.\n *\n * @link See https://js.langchain.com/docs/security for more information.\n * @example\n * ```typescript\n * const chain = new SqlDatabaseChain({\n * llm: new OpenAI({ temperature: 0 }),\n * database: new SqlDatabase({ ...config }),\n * });\n *\n * const result = await chain.run(\"How many tracks are there?\");\n * ```\n */\nexport class SqlDatabaseChain extends BaseChain {\n static lc_name() {\n return \"SqlDatabaseChain\";\n }\n\n // LLM wrapper to use\n llm: BaseLanguageModelInterface;\n\n // SQL Database to connect to.\n database: SqlDatabase;\n\n // Prompt to use to translate natural language to SQL.\n prompt = DEFAULT_SQL_DATABASE_PROMPT;\n\n // Number of results to return from the query\n topK = 5;\n\n inputKey = \"query\";\n\n outputKey = \"result\";\n\n sqlOutputKey: string | undefined = undefined;\n\n // Whether to return the result of querying the SQL table directly.\n returnDirect = false;\n\n constructor(fields: SqlDatabaseChainInput) {\n super(fields);\n this.llm = fields.llm;\n this.database = fields.database;\n this.topK = fields.topK ?? this.topK;\n this.inputKey = fields.inputKey ?? this.inputKey;\n this.outputKey = fields.outputKey ?? this.outputKey;\n this.sqlOutputKey = fields.sqlOutputKey ?? this.sqlOutputKey;\n this.prompt =\n fields.prompt ??\n getPromptTemplateFromDataSource(this.database.appDataSource);\n }\n\n /** @ignore */\n async _call(\n values: ChainValues,\n runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const llmChain = new LLMChain({\n prompt: this.prompt,\n llm: this.llm,\n outputKey: this.outputKey,\n memory: this.memory,\n });\n if (!(this.inputKey in values)) {\n throw new Error(`Question key ${this.inputKey} not found.`);\n }\n const question: string = values[this.inputKey];\n let inputText = `${question}\\nSQLQuery:`;\n const tablesToUse = values.table_names_to_use;\n const tableInfo = await this.database.getTableInfo(tablesToUse);\n\n const llmInputs = {\n input: inputText,\n top_k: this.topK,\n dialect: this.database.appDataSourceOptions.type,\n table_info: tableInfo,\n stop: [\"\\nSQLResult:\"],\n };\n await this.verifyNumberOfTokens(inputText, tableInfo);\n\n const sqlCommand = await llmChain.predict(\n llmInputs,\n runManager?.getChild(\"sql_generation\")\n );\n let queryResult = \"\";\n try {\n queryResult = await this.database.appDataSource.query(sqlCommand);\n } catch (error) {\n console.error(error);\n }\n\n let finalResult;\n if (this.returnDirect) {\n finalResult = { [this.outputKey]: queryResult };\n } else {\n inputText += `${sqlCommand}\\nSQLResult: ${JSON.stringify(\n queryResult\n )}\\nAnswer:`;\n llmInputs.input = inputText;\n finalResult = {\n [this.outputKey]: await llmChain.predict(\n llmInputs,\n runManager?.getChild(\"result_generation\")\n ),\n };\n }\n\n if (this.sqlOutputKey != null) {\n finalResult[this.sqlOutputKey] = sqlCommand;\n }\n\n return finalResult;\n }\n\n _chainType() {\n return \"sql_database_chain\" as const;\n }\n\n get inputKeys(): string[] {\n return [this.inputKey];\n }\n\n get outputKeys(): string[] {\n if (this.sqlOutputKey != null) {\n return [this.outputKey, this.sqlOutputKey];\n }\n return [this.outputKey];\n }\n\n /**\n * Private method that verifies the number of tokens in the input text and\n * table information. It throws an error if the number of tokens exceeds\n * the maximum allowed by the language model.\n * @param inputText The input text.\n * @param tableinfo The table information.\n * @returns A promise that resolves when the verification is complete.\n */\n private async verifyNumberOfTokens(\n inputText: string,\n tableinfo: string\n ): Promise<void> {\n // We verify it only for OpenAI for the moment\n if (this.llm._llmType() !== \"openai\") {\n return;\n }\n const llm = this.llm as OpenAI;\n const promptTemplate = this.prompt.template;\n const stringWeSend = `${inputText}${promptTemplate}${tableinfo}`;\n\n const maxToken = await calculateMaxTokens({\n prompt: stringWeSend,\n // Cast here to allow for other models that may not fit the union\n modelName: llm.model as TiktokenModel,\n });\n\n if (maxToken < (llm.maxTokens ?? -1)) {\n throw new Error(`The combination of the database structure and your question is too big for the model ${\n llm.model\n } which can compute only a max tokens of ${getModelContextSize(\n llm.model\n )}.\n We suggest you to use the includeTables parameters when creating the SqlDatabase object to select only a subset of the tables. You can also use a model which can handle more tokens.`);\n }\n }\n}\n\nexport interface CreateSqlQueryChainFields {\n llm: BaseLanguageModel;\n db: SqlDatabase;\n prompt?: BasePromptTemplate;\n /**\n * @default 5\n */\n k?: number;\n dialect: SqlDialect;\n}\n\ntype SqlInput = {\n question: string;\n};\n\ntype SqlInoutWithTables = SqlInput & {\n tableNamesToUse: string[];\n};\n\nconst strip = (text: string) => {\n // Replace escaped quotes with actual quotes\n let newText = text.replace(/\\\\\"/g, '\"').trim();\n // Remove wrapping quotes if the entire string is wrapped in quotes\n if (newText.startsWith('\"') && newText.endsWith('\"')) {\n newText = newText.substring(1, newText.length - 1);\n }\n return newText;\n};\n\nconst difference = (setA: Set<string>, setB: Set<string>) =>\n new Set([...setA].filter((x) => !setB.has(x)));\n\n/**\n * Create a SQL query chain that can create SQL queries for the given database.\n * Returns a Runnable.\n *\n * @param {BaseLanguageModel} llm The language model to use in the chain.\n * @param {SqlDatabase} db The database to use in the chain.\n * @param {BasePromptTemplate | undefined} prompt The prompt to use in the chain.\n * @param {BaseLanguageModel | undefined} k The amount of docs/results to return. Passed through the prompt input value `top_k`.\n * @param {SqlDialect} dialect The SQL dialect to use in the chain.\n * @returns {Promise<RunnableSequence<Record<string, unknown>, string>>} A runnable sequence representing the chain.\n * @example ```typescript\n * const datasource = new DataSource({\n * type: \"sqlite\",\n * database: \"../../../../Chinook.db\",\n * });\n * const db = await SqlDatabase.fromDataSourceParams({\n * appDataSource: datasource,\n * });\n * const llm = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 });\n * const chain = await createSqlQueryChain({\n * llm,\n * db,\n * dialect: \"sqlite\",\n * });\n * ```\n */\nexport async function createSqlQueryChain({\n llm,\n db,\n prompt,\n k = 5,\n dialect,\n}: CreateSqlQueryChainFields) {\n let promptToUse: BasePromptTemplate;\n if (prompt) {\n promptToUse = prompt;\n } else if (SQL_PROMPTS_MAP[dialect]) {\n promptToUse = SQL_PROMPTS_MAP[dialect];\n } else {\n promptToUse = DEFAULT_SQL_DATABASE_PROMPT;\n }\n\n if (\n difference(\n new Set([\"input\", \"top_k\", \"table_info\"]),\n new Set(promptToUse.inputVariables)\n ).size > 0\n ) {\n throw new Error(\n `Prompt must have input variables: 'input', 'top_k', 'table_info'. Received prompt with input variables: ` +\n `${promptToUse.inputVariables}. Full prompt:\\n\\n${promptToUse}`\n );\n }\n if (promptToUse.inputVariables.includes(\"dialect\")) {\n promptToUse = await promptToUse.partial({ dialect });\n }\n\n promptToUse = await promptToUse.partial({ top_k: k.toString() });\n\n const inputs = {\n input: (x: Record<string, unknown>) => {\n if (\"question\" in x) {\n return `${(x as SqlInput).question}\\nSQLQuery: `;\n }\n throw new Error(\"Input must include a question property.\");\n },\n table_info: async (x: Record<string, unknown>) =>\n db.getTableInfo((x as SqlInoutWithTables).tableNamesToUse),\n };\n\n return RunnableSequence.from([\n RunnablePassthrough.assign(inputs),\n (x) => {\n const newInputs = { ...x };\n delete newInputs.question;\n delete newInputs.tableNamesToUse;\n return newInputs;\n },\n promptToUse,\n llm.withConfig({ stop: [\"\\nSQLResult:\"] }),\n new StringOutputParser(),\n strip,\n ]);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.cjs","names":["DEFAULT_PROMPT","StuffDocumentsChain","LLMChain","MapReduceDocumentsChain","REFINE_PROMPT","RefineDocumentsChain"],"sources":["../../../src/chains/summarization/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 { DEFAULT_PROMPT } from \"./stuff_prompts.js\";\nimport { REFINE_PROMPT } from \"./refine_prompts.js\";\n\n/**\n * Type for the base parameters that can be used to configure a\n * summarization chain.\n */\ntype BaseParams = {\n verbose?: boolean;\n};\n\n/** @interface */\nexport type SummarizationChainParams = BaseParams &\n (\n | {\n type?: \"stuff\";\n prompt?: BasePromptTemplate;\n }\n | ({\n type?: \"map_reduce\";\n combineMapPrompt?: BasePromptTemplate;\n combinePrompt?: BasePromptTemplate;\n combineLLM?: BaseLanguageModelInterface;\n } & Pick<MapReduceDocumentsChainInput, \"returnIntermediateSteps\">)\n | {\n type?: \"refine\";\n refinePrompt?: BasePromptTemplate;\n refineLLM?: BaseLanguageModelInterface;\n questionPrompt?: BasePromptTemplate;\n }\n );\n\nexport const loadSummarizationChain = (\n llm: BaseLanguageModelInterface,\n params: SummarizationChainParams = { type: \"map_reduce\" }\n) => {\n const { verbose } = params;\n if (params.type === \"stuff\") {\n const { prompt = DEFAULT_PROMPT } = params;\n const llmChain = new LLMChain({ prompt, llm, verbose });\n const chain = new StuffDocumentsChain({\n llmChain,\n documentVariableName: \"text\",\n verbose,\n });\n return chain;\n }\n if (params.type === \"map_reduce\") {\n const {\n combineMapPrompt = DEFAULT_PROMPT,\n combinePrompt = DEFAULT_PROMPT,\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: \"text\",\n verbose,\n });\n const chain = new MapReduceDocumentsChain({\n llmChain,\n combineDocumentChain,\n documentVariableName: \"text\",\n returnIntermediateSteps,\n verbose,\n });\n return chain;\n }\n if (params.type === \"refine\") {\n const {\n refinePrompt = REFINE_PROMPT,\n refineLLM,\n questionPrompt = DEFAULT_PROMPT,\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 const chain = new RefineDocumentsChain({\n llmChain,\n refineLLMChain,\n documentVariableName: \"text\",\n verbose,\n });\n return chain;\n }\n throw new Error(`Invalid _type: ${params.type}`);\n};\n"],"mappings":";;;;;AAyCA,MAAa,0BACX,KACA,SAAmC,EAAE,MAAM,cAAc,KACtD;CACH,MAAM,EAAE,YAAY;AACpB,KAAI,OAAO,SAAS,SAAS;EAC3B,MAAM,EAAE,SAASA,sBAAAA,mBAAmB;AAOpC,
|
|
1
|
+
{"version":3,"file":"load.cjs","names":["DEFAULT_PROMPT","StuffDocumentsChain","LLMChain","MapReduceDocumentsChain","REFINE_PROMPT","RefineDocumentsChain"],"sources":["../../../src/chains/summarization/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 { DEFAULT_PROMPT } from \"./stuff_prompts.js\";\nimport { REFINE_PROMPT } from \"./refine_prompts.js\";\n\n/**\n * Type for the base parameters that can be used to configure a\n * summarization chain.\n */\ntype BaseParams = {\n verbose?: boolean;\n};\n\n/** @interface */\nexport type SummarizationChainParams = BaseParams &\n (\n | {\n type?: \"stuff\";\n prompt?: BasePromptTemplate;\n }\n | ({\n type?: \"map_reduce\";\n combineMapPrompt?: BasePromptTemplate;\n combinePrompt?: BasePromptTemplate;\n combineLLM?: BaseLanguageModelInterface;\n } & Pick<MapReduceDocumentsChainInput, \"returnIntermediateSteps\">)\n | {\n type?: \"refine\";\n refinePrompt?: BasePromptTemplate;\n refineLLM?: BaseLanguageModelInterface;\n questionPrompt?: BasePromptTemplate;\n }\n );\n\nexport const loadSummarizationChain = (\n llm: BaseLanguageModelInterface,\n params: SummarizationChainParams = { type: \"map_reduce\" }\n) => {\n const { verbose } = params;\n if (params.type === \"stuff\") {\n const { prompt = DEFAULT_PROMPT } = params;\n const llmChain = new LLMChain({ prompt, llm, verbose });\n const chain = new StuffDocumentsChain({\n llmChain,\n documentVariableName: \"text\",\n verbose,\n });\n return chain;\n }\n if (params.type === \"map_reduce\") {\n const {\n combineMapPrompt = DEFAULT_PROMPT,\n combinePrompt = DEFAULT_PROMPT,\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: \"text\",\n verbose,\n });\n const chain = new MapReduceDocumentsChain({\n llmChain,\n combineDocumentChain,\n documentVariableName: \"text\",\n returnIntermediateSteps,\n verbose,\n });\n return chain;\n }\n if (params.type === \"refine\") {\n const {\n refinePrompt = REFINE_PROMPT,\n refineLLM,\n questionPrompt = DEFAULT_PROMPT,\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 const chain = new RefineDocumentsChain({\n llmChain,\n refineLLMChain,\n documentVariableName: \"text\",\n verbose,\n });\n return chain;\n }\n throw new Error(`Invalid _type: ${params.type}`);\n};\n"],"mappings":";;;;;AAyCA,MAAa,0BACX,KACA,SAAmC,EAAE,MAAM,cAAc,KACtD;CACH,MAAM,EAAE,YAAY;AACpB,KAAI,OAAO,SAAS,SAAS;EAC3B,MAAM,EAAE,SAASA,sBAAAA,mBAAmB;AAOpC,SAAO,IALWC,2BAAAA,oBAAoB;GACpC,UAAA,IAFmBC,kBAAAA,SAAS;IAAE;IAAQ;IAAK;IAAS,CAE5C;GACR,sBAAsB;GACtB;GACD,CACW;;AAEd,KAAI,OAAO,SAAS,cAAc;EAChC,MAAM,EACJ,mBAAmBF,sBAAAA,gBACnB,gBAAgBA,sBAAAA,gBAChB,YACA,4BACE;AAmBJ,SAAO,IAPWG,2BAAAA,wBAAwB;GACxC,UAAA,IAZmBD,kBAAAA,SAAS;IAAE,QAAQ;IAAkB;IAAK;IAAS,CAY9D;GACR,sBAAA,IAP+BD,2BAAAA,oBAAoB;IACnD,UAAU,IANgBC,kBAAAA,SAAS;KACnC,QAAQ;KACR,KAAK,cAAc;KACnB;KACD,CAE0B;IACzB,sBAAsB;IACtB;IACD,CAGqB;GACpB,sBAAsB;GACtB;GACA;GACD,CACW;;AAEd,KAAI,OAAO,SAAS,UAAU;EAC5B,MAAM,EACJ,eAAeE,uBAAAA,eACf,WACA,iBAAiBJ,sBAAAA,mBACf;AAaJ,SAAO,IANWK,2BAAAA,qBAAqB;GACrC,UAAA,IAPmBH,kBAAAA,SAAS;IAAE,QAAQ;IAAgB;IAAK;IAAS,CAO5D;GACR,gBAAA,IAPyBA,kBAAAA,SAAS;IAClC,QAAQ;IACR,KAAK,aAAa;IAClB;IACD,CAGe;GACd,sBAAsB;GACtB;GACD,CACW;;AAEd,OAAM,IAAI,MAAM,kBAAkB,OAAO,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","names":[],"sources":["../../../src/chains/summarization/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 { DEFAULT_PROMPT } from \"./stuff_prompts.js\";\nimport { REFINE_PROMPT } from \"./refine_prompts.js\";\n\n/**\n * Type for the base parameters that can be used to configure a\n * summarization chain.\n */\ntype BaseParams = {\n verbose?: boolean;\n};\n\n/** @interface */\nexport type SummarizationChainParams = BaseParams &\n (\n | {\n type?: \"stuff\";\n prompt?: BasePromptTemplate;\n }\n | ({\n type?: \"map_reduce\";\n combineMapPrompt?: BasePromptTemplate;\n combinePrompt?: BasePromptTemplate;\n combineLLM?: BaseLanguageModelInterface;\n } & Pick<MapReduceDocumentsChainInput, \"returnIntermediateSteps\">)\n | {\n type?: \"refine\";\n refinePrompt?: BasePromptTemplate;\n refineLLM?: BaseLanguageModelInterface;\n questionPrompt?: BasePromptTemplate;\n }\n );\n\nexport const loadSummarizationChain = (\n llm: BaseLanguageModelInterface,\n params: SummarizationChainParams = { type: \"map_reduce\" }\n) => {\n const { verbose } = params;\n if (params.type === \"stuff\") {\n const { prompt = DEFAULT_PROMPT } = params;\n const llmChain = new LLMChain({ prompt, llm, verbose });\n const chain = new StuffDocumentsChain({\n llmChain,\n documentVariableName: \"text\",\n verbose,\n });\n return chain;\n }\n if (params.type === \"map_reduce\") {\n const {\n combineMapPrompt = DEFAULT_PROMPT,\n combinePrompt = DEFAULT_PROMPT,\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: \"text\",\n verbose,\n });\n const chain = new MapReduceDocumentsChain({\n llmChain,\n combineDocumentChain,\n documentVariableName: \"text\",\n returnIntermediateSteps,\n verbose,\n });\n return chain;\n }\n if (params.type === \"refine\") {\n const {\n refinePrompt = REFINE_PROMPT,\n refineLLM,\n questionPrompt = DEFAULT_PROMPT,\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 const chain = new RefineDocumentsChain({\n llmChain,\n refineLLMChain,\n documentVariableName: \"text\",\n verbose,\n });\n return chain;\n }\n throw new Error(`Invalid _type: ${params.type}`);\n};\n"],"mappings":";;;;;AAyCA,MAAa,0BACX,KACA,SAAmC,EAAE,MAAM,cAAc,KACtD;CACH,MAAM,EAAE,YAAY;AACpB,KAAI,OAAO,SAAS,SAAS;EAC3B,MAAM,EAAE,SAAS,mBAAmB;AAOpC,
|
|
1
|
+
{"version":3,"file":"load.js","names":[],"sources":["../../../src/chains/summarization/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 { DEFAULT_PROMPT } from \"./stuff_prompts.js\";\nimport { REFINE_PROMPT } from \"./refine_prompts.js\";\n\n/**\n * Type for the base parameters that can be used to configure a\n * summarization chain.\n */\ntype BaseParams = {\n verbose?: boolean;\n};\n\n/** @interface */\nexport type SummarizationChainParams = BaseParams &\n (\n | {\n type?: \"stuff\";\n prompt?: BasePromptTemplate;\n }\n | ({\n type?: \"map_reduce\";\n combineMapPrompt?: BasePromptTemplate;\n combinePrompt?: BasePromptTemplate;\n combineLLM?: BaseLanguageModelInterface;\n } & Pick<MapReduceDocumentsChainInput, \"returnIntermediateSteps\">)\n | {\n type?: \"refine\";\n refinePrompt?: BasePromptTemplate;\n refineLLM?: BaseLanguageModelInterface;\n questionPrompt?: BasePromptTemplate;\n }\n );\n\nexport const loadSummarizationChain = (\n llm: BaseLanguageModelInterface,\n params: SummarizationChainParams = { type: \"map_reduce\" }\n) => {\n const { verbose } = params;\n if (params.type === \"stuff\") {\n const { prompt = DEFAULT_PROMPT } = params;\n const llmChain = new LLMChain({ prompt, llm, verbose });\n const chain = new StuffDocumentsChain({\n llmChain,\n documentVariableName: \"text\",\n verbose,\n });\n return chain;\n }\n if (params.type === \"map_reduce\") {\n const {\n combineMapPrompt = DEFAULT_PROMPT,\n combinePrompt = DEFAULT_PROMPT,\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: \"text\",\n verbose,\n });\n const chain = new MapReduceDocumentsChain({\n llmChain,\n combineDocumentChain,\n documentVariableName: \"text\",\n returnIntermediateSteps,\n verbose,\n });\n return chain;\n }\n if (params.type === \"refine\") {\n const {\n refinePrompt = REFINE_PROMPT,\n refineLLM,\n questionPrompt = DEFAULT_PROMPT,\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 const chain = new RefineDocumentsChain({\n llmChain,\n refineLLMChain,\n documentVariableName: \"text\",\n verbose,\n });\n return chain;\n }\n throw new Error(`Invalid _type: ${params.type}`);\n};\n"],"mappings":";;;;;AAyCA,MAAa,0BACX,KACA,SAAmC,EAAE,MAAM,cAAc,KACtD;CACH,MAAM,EAAE,YAAY;AACpB,KAAI,OAAO,SAAS,SAAS;EAC3B,MAAM,EAAE,SAAS,mBAAmB;AAOpC,SAAO,IALW,oBAAoB;GACpC,UAAA,IAFmB,SAAS;IAAE;IAAQ;IAAK;IAAS,CAE5C;GACR,sBAAsB;GACtB;GACD,CACW;;AAEd,KAAI,OAAO,SAAS,cAAc;EAChC,MAAM,EACJ,mBAAmB,gBACnB,gBAAgB,gBAChB,YACA,4BACE;AAmBJ,SAAO,IAPW,wBAAwB;GACxC,UAAA,IAZmB,SAAS;IAAE,QAAQ;IAAkB;IAAK;IAAS,CAY9D;GACR,sBAAA,IAP+B,oBAAoB;IACnD,UAAU,IANgB,SAAS;KACnC,QAAQ;KACR,KAAK,cAAc;KACnB;KACD,CAE0B;IACzB,sBAAsB;IACtB;IACD,CAGqB;GACpB,sBAAsB;GACtB;GACA;GACD,CACW;;AAEd,KAAI,OAAO,SAAS,UAAU;EAC5B,MAAM,EACJ,eAAe,eACf,WACA,iBAAiB,mBACf;AAaJ,SAAO,IANW,qBAAqB;GACrC,UAAA,IAPmB,SAAS;IAAE,QAAQ;IAAgB;IAAK;IAAS,CAO5D;GACR,gBAAA,IAPyB,SAAS;IAClC,QAAQ;IACR,KAAK,aAAa;IAClB;IACD,CAGe;GACd,sBAAsB;GACtB;GACD,CACW;;AAEd,OAAM,IAAI,MAAM,kBAAkB,OAAO,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refine_prompts.cjs","names":["PromptTemplate"],"sources":["../../../src/chains/summarization/refine_prompts.ts"],"sourcesContent":["import { PromptTemplate } from \"@langchain/core/prompts\";\n\nconst refinePromptTemplate = `Your job is to produce a final summary\nWe have provided an existing summary up to a certain point: \"{existing_answer}\"\nWe have the opportunity to refine the existing summary\n(only if needed) with some more context below.\n------------\n\"{text}\"\n------------\n\nGiven the new context, refine the original summary\nIf the context isn't useful, return the original summary.\n\nREFINED SUMMARY:`;\n\nexport const REFINE_PROMPT = /* #__PURE__ */ new PromptTemplate({\n template: refinePromptTemplate,\n inputVariables: [\"existing_answer\", \"text\"],\n});\n"],"mappings":";AAeA,MAAa,gCAAgC,
|
|
1
|
+
{"version":3,"file":"refine_prompts.cjs","names":["PromptTemplate"],"sources":["../../../src/chains/summarization/refine_prompts.ts"],"sourcesContent":["import { PromptTemplate } from \"@langchain/core/prompts\";\n\nconst refinePromptTemplate = `Your job is to produce a final summary\nWe have provided an existing summary up to a certain point: \"{existing_answer}\"\nWe have the opportunity to refine the existing summary\n(only if needed) with some more context below.\n------------\n\"{text}\"\n------------\n\nGiven the new context, refine the original summary\nIf the context isn't useful, return the original summary.\n\nREFINED SUMMARY:`;\n\nexport const REFINE_PROMPT = /* #__PURE__ */ new PromptTemplate({\n template: refinePromptTemplate,\n inputVariables: [\"existing_answer\", \"text\"],\n});\n"],"mappings":";AAeA,MAAa,gCAAgC,uCAAIA,EAAAA,eAAe;CAC9D,UAAU;;;;;;;;;;;;CACV,gBAAgB,CAAC,mBAAmB,OAAO;CAC5C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refine_prompts.js","names":[],"sources":["../../../src/chains/summarization/refine_prompts.ts"],"sourcesContent":["import { PromptTemplate } from \"@langchain/core/prompts\";\n\nconst refinePromptTemplate = `Your job is to produce a final summary\nWe have provided an existing summary up to a certain point: \"{existing_answer}\"\nWe have the opportunity to refine the existing summary\n(only if needed) with some more context below.\n------------\n\"{text}\"\n------------\n\nGiven the new context, refine the original summary\nIf the context isn't useful, return the original summary.\n\nREFINED SUMMARY:`;\n\nexport const REFINE_PROMPT = /* #__PURE__ */ new PromptTemplate({\n template: refinePromptTemplate,\n inputVariables: [\"existing_answer\", \"text\"],\n});\n"],"mappings":";AAeA,MAAa,gCAAgC,IAAI,eAAe;CAC9D,
|
|
1
|
+
{"version":3,"file":"refine_prompts.js","names":[],"sources":["../../../src/chains/summarization/refine_prompts.ts"],"sourcesContent":["import { PromptTemplate } from \"@langchain/core/prompts\";\n\nconst refinePromptTemplate = `Your job is to produce a final summary\nWe have provided an existing summary up to a certain point: \"{existing_answer}\"\nWe have the opportunity to refine the existing summary\n(only if needed) with some more context below.\n------------\n\"{text}\"\n------------\n\nGiven the new context, refine the original summary\nIf the context isn't useful, return the original summary.\n\nREFINED SUMMARY:`;\n\nexport const REFINE_PROMPT = /* #__PURE__ */ new PromptTemplate({\n template: refinePromptTemplate,\n inputVariables: [\"existing_answer\", \"text\"],\n});\n"],"mappings":";AAeA,MAAa,gCAAgC,IAAI,eAAe;CAC9D,UAAU;;;;;;;;;;;;CACV,gBAAgB,CAAC,mBAAmB,OAAO;CAC5C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stuff_prompts.cjs","names":["PromptTemplate"],"sources":["../../../src/chains/summarization/stuff_prompts.ts"],"sourcesContent":["import { PromptTemplate } from \"@langchain/core/prompts\";\n\nconst template = `Write a concise summary of the following:\n\n\n\"{text}\"\n\n\nCONCISE SUMMARY:`;\n\nexport const DEFAULT_PROMPT = /*#__PURE__*/ new PromptTemplate({\n template,\n inputVariables: [\"text\"],\n});\n"],"mappings":";AAUA,MAAa,iCAA+B,
|
|
1
|
+
{"version":3,"file":"stuff_prompts.cjs","names":["PromptTemplate"],"sources":["../../../src/chains/summarization/stuff_prompts.ts"],"sourcesContent":["import { PromptTemplate } from \"@langchain/core/prompts\";\n\nconst template = `Write a concise summary of the following:\n\n\n\"{text}\"\n\n\nCONCISE SUMMARY:`;\n\nexport const DEFAULT_PROMPT = /*#__PURE__*/ new PromptTemplate({\n template,\n inputVariables: [\"text\"],\n});\n"],"mappings":";AAUA,MAAa,iCAA+B,uCAAIA,EAAAA,eAAe;CAC7D;;;;;;;CACA,gBAAgB,CAAC,OAAO;CACzB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stuff_prompts.js","names":[],"sources":["../../../src/chains/summarization/stuff_prompts.ts"],"sourcesContent":["import { PromptTemplate } from \"@langchain/core/prompts\";\n\nconst template = `Write a concise summary of the following:\n\n\n\"{text}\"\n\n\nCONCISE SUMMARY:`;\n\nexport const DEFAULT_PROMPT = /*#__PURE__*/ new PromptTemplate({\n template,\n inputVariables: [\"text\"],\n});\n"],"mappings":";AAUA,MAAa,iCAA+B,IAAI,eAAe;CAC7D
|
|
1
|
+
{"version":3,"file":"stuff_prompts.js","names":[],"sources":["../../../src/chains/summarization/stuff_prompts.ts"],"sourcesContent":["import { PromptTemplate } from \"@langchain/core/prompts\";\n\nconst template = `Write a concise summary of the following:\n\n\n\"{text}\"\n\n\nCONCISE SUMMARY:`;\n\nexport const DEFAULT_PROMPT = /*#__PURE__*/ new PromptTemplate({\n template,\n inputVariables: [\"text\"],\n});\n"],"mappings":";AAUA,MAAa,iCAA+B,IAAI,eAAe;CAC7D;;;;;;;CACA,gBAAgB,CAAC,OAAO;CACzB,CAAC"}
|