@langchain/core 1.1.9 → 1.1.11-dev-1767748783694
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 +6 -0
- package/dist/documents/document.cjs.map +1 -1
- package/dist/documents/document.js.map +1 -1
- package/dist/documents/transformers.cjs.map +1 -1
- package/dist/documents/transformers.js.map +1 -1
- package/dist/example_selectors/conditional.cjs.map +1 -1
- package/dist/example_selectors/conditional.js.map +1 -1
- package/dist/example_selectors/semantic_similarity.cjs.map +1 -1
- package/dist/example_selectors/semantic_similarity.js.map +1 -1
- package/dist/language_models/base.cjs.map +1 -1
- package/dist/language_models/base.js.map +1 -1
- package/dist/language_models/chat_models.cjs.map +1 -1
- package/dist/language_models/chat_models.js.map +1 -1
- package/dist/language_models/llms.cjs.map +1 -1
- package/dist/language_models/llms.js.map +1 -1
- package/dist/load/import_map.cjs +11 -11
- package/dist/load/import_map.cjs.map +1 -1
- package/dist/load/import_map.js +11 -11
- package/dist/load/import_map.js.map +1 -1
- package/dist/load/index.cjs.map +1 -1
- package/dist/load/index.js.map +1 -1
- package/dist/load/serializable.cjs +3 -3
- package/dist/load/serializable.cjs.map +1 -1
- package/dist/load/serializable.js +3 -3
- package/dist/load/serializable.js.map +1 -1
- package/dist/load/validation.cjs +13 -7
- package/dist/load/validation.cjs.map +1 -1
- package/dist/load/validation.js +13 -7
- package/dist/load/validation.js.map +1 -1
- package/dist/messages/ai.cjs.map +1 -1
- package/dist/messages/ai.js.map +1 -1
- package/dist/messages/base.cjs +3 -1
- package/dist/messages/base.cjs.map +1 -1
- package/dist/messages/base.d.cts +1 -1
- package/dist/messages/base.d.cts.map +1 -1
- package/dist/messages/base.d.ts +1 -1
- package/dist/messages/base.d.ts.map +1 -1
- package/dist/messages/base.js +3 -1
- package/dist/messages/base.js.map +1 -1
- package/dist/messages/chat.cjs.map +1 -1
- package/dist/messages/chat.js.map +1 -1
- package/dist/messages/content/data.cjs.map +1 -1
- package/dist/messages/content/data.js.map +1 -1
- package/dist/messages/content/index.cjs.map +1 -1
- package/dist/messages/content/index.js.map +1 -1
- package/dist/messages/content/tools.cjs.map +1 -1
- package/dist/messages/content/tools.js.map +1 -1
- package/dist/messages/function.cjs.map +1 -1
- package/dist/messages/function.js.map +1 -1
- package/dist/messages/human.cjs.map +1 -1
- package/dist/messages/human.js.map +1 -1
- package/dist/messages/message.cjs.map +1 -1
- package/dist/messages/message.js.map +1 -1
- package/dist/messages/metadata.cjs +1 -1
- package/dist/messages/metadata.cjs.map +1 -1
- package/dist/messages/metadata.js +1 -1
- package/dist/messages/metadata.js.map +1 -1
- package/dist/messages/modifier.cjs.map +1 -1
- package/dist/messages/modifier.js.map +1 -1
- package/dist/messages/system.cjs.map +1 -1
- package/dist/messages/system.js.map +1 -1
- package/dist/messages/tool.cjs.map +1 -1
- package/dist/messages/tool.js.map +1 -1
- package/dist/messages/utils.cjs.map +1 -1
- package/dist/messages/utils.js.map +1 -1
- package/dist/output_parsers/base.cjs.map +1 -1
- package/dist/output_parsers/base.js.map +1 -1
- package/dist/output_parsers/index.cjs +1 -1
- package/dist/output_parsers/index.js +1 -1
- package/dist/output_parsers/json.cjs.map +1 -1
- package/dist/output_parsers/json.js.map +1 -1
- package/dist/output_parsers/openai_functions/json_output_functions_parsers.cjs.map +1 -1
- package/dist/output_parsers/openai_functions/json_output_functions_parsers.js.map +1 -1
- package/dist/output_parsers/openai_tools/json_output_tools_parsers.cjs.map +1 -1
- package/dist/output_parsers/openai_tools/json_output_tools_parsers.js.map +1 -1
- package/dist/output_parsers/structured.cjs.map +1 -1
- package/dist/output_parsers/structured.js.map +1 -1
- package/dist/output_parsers/transform.cjs.map +1 -1
- package/dist/output_parsers/transform.js.map +1 -1
- package/dist/prompts/base.cjs.map +1 -1
- package/dist/prompts/base.js.map +1 -1
- package/dist/prompts/chat.cjs.map +1 -1
- package/dist/prompts/chat.js.map +1 -1
- package/dist/prompts/dict.cjs.map +1 -1
- package/dist/prompts/dict.js.map +1 -1
- package/dist/prompts/few_shot.cjs.map +1 -1
- package/dist/prompts/few_shot.js.map +1 -1
- package/dist/prompts/image.cjs.map +1 -1
- package/dist/prompts/image.js.map +1 -1
- package/dist/prompts/pipeline.cjs.map +1 -1
- package/dist/prompts/pipeline.js.map +1 -1
- package/dist/prompts/prompt.cjs.map +1 -1
- package/dist/prompts/prompt.js.map +1 -1
- package/dist/prompts/string.cjs.map +1 -1
- package/dist/prompts/string.js.map +1 -1
- package/dist/prompts/structured.cjs.map +1 -1
- package/dist/prompts/structured.js.map +1 -1
- package/dist/prompts/template.cjs +1 -4
- package/dist/prompts/template.cjs.map +1 -1
- package/dist/prompts/template.js +1 -4
- package/dist/prompts/template.js.map +1 -1
- package/dist/retrievers/index.cjs.map +1 -1
- package/dist/retrievers/index.js.map +1 -1
- package/dist/runnables/base.cjs.map +1 -1
- package/dist/runnables/base.js.map +1 -1
- package/dist/runnables/branch.cjs.map +1 -1
- package/dist/runnables/branch.js.map +1 -1
- package/dist/runnables/history.cjs.map +1 -1
- package/dist/runnables/history.js.map +1 -1
- package/dist/runnables/passthrough.cjs.map +1 -1
- package/dist/runnables/passthrough.js.map +1 -1
- package/dist/runnables/router.cjs.map +1 -1
- package/dist/runnables/router.js.map +1 -1
- package/dist/singletons/callbacks.cjs.map +1 -1
- package/dist/singletons/callbacks.js.map +1 -1
- package/dist/structured_query/base.cjs.map +1 -1
- package/dist/structured_query/base.js.map +1 -1
- package/dist/structured_query/ir.cjs.map +1 -1
- package/dist/structured_query/ir.js.map +1 -1
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.cjs.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/utils/async_caller.cjs.map +1 -1
- package/dist/utils/async_caller.js.map +1 -1
- package/dist/utils/stream.cjs.map +1 -1
- package/dist/utils/stream.js.map +1 -1
- package/dist/utils/testing/chat_models.cjs.map +1 -1
- package/dist/utils/testing/chat_models.js.map +1 -1
- package/dist/utils/testing/tools.cjs.map +1 -1
- package/dist/utils/testing/tools.js.map +1 -1
- package/dist/utils/types/zod.cjs.map +1 -1
- package/dist/utils/types/zod.js.map +1 -1
- package/dist/vectorstores.cjs.map +1 -1
- package/dist/vectorstores.d.cts.map +1 -1
- package/dist/vectorstores.js.map +1 -1
- package/package.json +2 -2
- package/agents.cjs +0 -1
- package/agents.d.cts +0 -1
- package/agents.d.ts +0 -1
- package/agents.js +0 -1
- package/caches.cjs +0 -1
- package/caches.d.cts +0 -1
- package/caches.d.ts +0 -1
- package/caches.js +0 -1
- package/callbacks/base.cjs +0 -1
- package/callbacks/base.d.cts +0 -1
- package/callbacks/base.d.ts +0 -1
- package/callbacks/base.js +0 -1
- package/callbacks/dispatch/web.cjs +0 -1
- package/callbacks/dispatch/web.d.cts +0 -1
- package/callbacks/dispatch/web.d.ts +0 -1
- package/callbacks/dispatch/web.js +0 -1
- package/callbacks/dispatch.cjs +0 -1
- package/callbacks/dispatch.d.cts +0 -1
- package/callbacks/dispatch.d.ts +0 -1
- package/callbacks/dispatch.js +0 -1
- package/callbacks/manager.cjs +0 -1
- package/callbacks/manager.d.cts +0 -1
- package/callbacks/manager.d.ts +0 -1
- package/callbacks/manager.js +0 -1
- package/callbacks/promises.cjs +0 -1
- package/callbacks/promises.d.cts +0 -1
- package/callbacks/promises.d.ts +0 -1
- package/callbacks/promises.js +0 -1
- package/chat_history.cjs +0 -1
- package/chat_history.d.cts +0 -1
- package/chat_history.d.ts +0 -1
- package/chat_history.js +0 -1
- package/context.cjs +0 -1
- package/context.d.cts +0 -1
- package/context.d.ts +0 -1
- package/context.js +0 -1
- package/document_loaders/base.cjs +0 -1
- package/document_loaders/base.d.cts +0 -1
- package/document_loaders/base.d.ts +0 -1
- package/document_loaders/base.js +0 -1
- package/document_loaders/langsmith.cjs +0 -1
- package/document_loaders/langsmith.d.cts +0 -1
- package/document_loaders/langsmith.d.ts +0 -1
- package/document_loaders/langsmith.js +0 -1
- package/documents.cjs +0 -1
- package/documents.d.cts +0 -1
- package/documents.d.ts +0 -1
- package/documents.js +0 -1
- package/embeddings.cjs +0 -1
- package/embeddings.d.cts +0 -1
- package/embeddings.d.ts +0 -1
- package/embeddings.js +0 -1
- package/example_selectors.cjs +0 -1
- package/example_selectors.d.cts +0 -1
- package/example_selectors.d.ts +0 -1
- package/example_selectors.js +0 -1
- package/indexing.cjs +0 -1
- package/indexing.d.cts +0 -1
- package/indexing.d.ts +0 -1
- package/indexing.js +0 -1
- package/language_models/base.cjs +0 -1
- package/language_models/base.d.cts +0 -1
- package/language_models/base.d.ts +0 -1
- package/language_models/base.js +0 -1
- package/language_models/chat_models.cjs +0 -1
- package/language_models/chat_models.d.cts +0 -1
- package/language_models/chat_models.d.ts +0 -1
- package/language_models/chat_models.js +0 -1
- package/language_models/llms.cjs +0 -1
- package/language_models/llms.d.cts +0 -1
- package/language_models/llms.d.ts +0 -1
- package/language_models/llms.js +0 -1
- package/language_models/profile.cjs +0 -1
- package/language_models/profile.d.cts +0 -1
- package/language_models/profile.d.ts +0 -1
- package/language_models/profile.js +0 -1
- package/load/serializable.cjs +0 -1
- package/load/serializable.d.cts +0 -1
- package/load/serializable.d.ts +0 -1
- package/load/serializable.js +0 -1
- package/load.cjs +0 -1
- package/load.d.cts +0 -1
- package/load.d.ts +0 -1
- package/load.js +0 -1
- package/memory.cjs +0 -1
- package/memory.d.cts +0 -1
- package/memory.d.ts +0 -1
- package/memory.js +0 -1
- package/messages/tool.cjs +0 -1
- package/messages/tool.d.cts +0 -1
- package/messages/tool.d.ts +0 -1
- package/messages/tool.js +0 -1
- package/messages.cjs +0 -1
- package/messages.d.cts +0 -1
- package/messages.d.ts +0 -1
- package/messages.js +0 -1
- package/output_parsers/openai_functions.cjs +0 -1
- package/output_parsers/openai_functions.d.cts +0 -1
- package/output_parsers/openai_functions.d.ts +0 -1
- package/output_parsers/openai_functions.js +0 -1
- package/output_parsers/openai_tools.cjs +0 -1
- package/output_parsers/openai_tools.d.cts +0 -1
- package/output_parsers/openai_tools.d.ts +0 -1
- package/output_parsers/openai_tools.js +0 -1
- package/output_parsers.cjs +0 -1
- package/output_parsers.d.cts +0 -1
- package/output_parsers.d.ts +0 -1
- package/output_parsers.js +0 -1
- package/outputs.cjs +0 -1
- package/outputs.d.cts +0 -1
- package/outputs.d.ts +0 -1
- package/outputs.js +0 -1
- package/prompt_values.cjs +0 -1
- package/prompt_values.d.cts +0 -1
- package/prompt_values.d.ts +0 -1
- package/prompt_values.js +0 -1
- package/prompts.cjs +0 -1
- package/prompts.d.cts +0 -1
- package/prompts.d.ts +0 -1
- package/prompts.js +0 -1
- package/retrievers/document_compressors.cjs +0 -1
- package/retrievers/document_compressors.d.cts +0 -1
- package/retrievers/document_compressors.d.ts +0 -1
- package/retrievers/document_compressors.js +0 -1
- package/retrievers.cjs +0 -1
- package/retrievers.d.cts +0 -1
- package/retrievers.d.ts +0 -1
- package/retrievers.js +0 -1
- package/runnables/graph.cjs +0 -1
- package/runnables/graph.d.cts +0 -1
- package/runnables/graph.d.ts +0 -1
- package/runnables/graph.js +0 -1
- package/runnables.cjs +0 -1
- package/runnables.d.cts +0 -1
- package/runnables.d.ts +0 -1
- package/runnables.js +0 -1
- package/singletons.cjs +0 -1
- package/singletons.d.cts +0 -1
- package/singletons.d.ts +0 -1
- package/singletons.js +0 -1
- package/stores.cjs +0 -1
- package/stores.d.cts +0 -1
- package/stores.d.ts +0 -1
- package/stores.js +0 -1
- package/structured_query.cjs +0 -1
- package/structured_query.d.cts +0 -1
- package/structured_query.d.ts +0 -1
- package/structured_query.js +0 -1
- package/tools.cjs +0 -1
- package/tools.d.cts +0 -1
- package/tools.d.ts +0 -1
- package/tools.js +0 -1
- package/tracers/base.cjs +0 -1
- package/tracers/base.d.cts +0 -1
- package/tracers/base.d.ts +0 -1
- package/tracers/base.js +0 -1
- package/tracers/console.cjs +0 -1
- package/tracers/console.d.cts +0 -1
- package/tracers/console.d.ts +0 -1
- package/tracers/console.js +0 -1
- package/tracers/log_stream.cjs +0 -1
- package/tracers/log_stream.d.cts +0 -1
- package/tracers/log_stream.d.ts +0 -1
- package/tracers/log_stream.js +0 -1
- package/tracers/run_collector.cjs +0 -1
- package/tracers/run_collector.d.cts +0 -1
- package/tracers/run_collector.d.ts +0 -1
- package/tracers/run_collector.js +0 -1
- package/tracers/tracer_langchain.cjs +0 -1
- package/tracers/tracer_langchain.d.cts +0 -1
- package/tracers/tracer_langchain.d.ts +0 -1
- package/tracers/tracer_langchain.js +0 -1
- package/types/stream.cjs +0 -1
- package/types/stream.d.cts +0 -1
- package/types/stream.d.ts +0 -1
- package/types/stream.js +0 -1
- package/utils/async_caller.cjs +0 -1
- package/utils/async_caller.d.cts +0 -1
- package/utils/async_caller.d.ts +0 -1
- package/utils/async_caller.js +0 -1
- package/utils/chunk_array.cjs +0 -1
- package/utils/chunk_array.d.cts +0 -1
- package/utils/chunk_array.d.ts +0 -1
- package/utils/chunk_array.js +0 -1
- package/utils/context.cjs +0 -1
- package/utils/context.d.cts +0 -1
- package/utils/context.d.ts +0 -1
- package/utils/context.js +0 -1
- package/utils/env.cjs +0 -1
- package/utils/env.d.cts +0 -1
- package/utils/env.d.ts +0 -1
- package/utils/env.js +0 -1
- package/utils/event_source_parse.cjs +0 -1
- package/utils/event_source_parse.d.cts +0 -1
- package/utils/event_source_parse.d.ts +0 -1
- package/utils/event_source_parse.js +0 -1
- package/utils/format.cjs +0 -1
- package/utils/format.d.cts +0 -1
- package/utils/format.d.ts +0 -1
- package/utils/format.js +0 -1
- package/utils/function_calling.cjs +0 -1
- package/utils/function_calling.d.cts +0 -1
- package/utils/function_calling.d.ts +0 -1
- package/utils/function_calling.js +0 -1
- package/utils/hash.cjs +0 -1
- package/utils/hash.d.cts +0 -1
- package/utils/hash.d.ts +0 -1
- package/utils/hash.js +0 -1
- package/utils/json_patch.cjs +0 -1
- package/utils/json_patch.d.cts +0 -1
- package/utils/json_patch.d.ts +0 -1
- package/utils/json_patch.js +0 -1
- package/utils/json_schema.cjs +0 -1
- package/utils/json_schema.d.cts +0 -1
- package/utils/json_schema.d.ts +0 -1
- package/utils/json_schema.js +0 -1
- package/utils/math.cjs +0 -1
- package/utils/math.d.cts +0 -1
- package/utils/math.d.ts +0 -1
- package/utils/math.js +0 -1
- package/utils/stream.cjs +0 -1
- package/utils/stream.d.cts +0 -1
- package/utils/stream.d.ts +0 -1
- package/utils/stream.js +0 -1
- package/utils/testing.cjs +0 -1
- package/utils/testing.d.cts +0 -1
- package/utils/testing.d.ts +0 -1
- package/utils/testing.js +0 -1
- package/utils/tiktoken.cjs +0 -1
- package/utils/tiktoken.d.cts +0 -1
- package/utils/tiktoken.d.ts +0 -1
- package/utils/tiktoken.js +0 -1
- package/utils/types.cjs +0 -1
- package/utils/types.d.cts +0 -1
- package/utils/types.d.ts +0 -1
- package/utils/types.js +0 -1
- package/vectorstores.cjs +0 -1
- package/vectorstores.d.cts +0 -1
- package/vectorstores.d.ts +0 -1
- package/vectorstores.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch.cjs","names":["Runnable","fields: {\n branches: Branch<RunInput, RunOutput>[];\n default: Runnable<RunInput, RunOutput>;\n }","branches: [\n ...BranchLike<RunInput, RunOutput>[],\n RunnableLike<RunInput, RunOutput>\n ]","coercedBranches: Branch<RunInput, RunOutput>[]","_coerceToRunnable","input: RunInput","config?: Partial<RunnableConfig>","runManager?: CallbackManagerForChainRun","patchConfig","config: RunnableConfig","getCallbackManagerForConfig","_coerceToDict","concat"],"sources":["../../src/runnables/branch.ts"],"sourcesContent":["import {\n Runnable,\n RunnableLike,\n _coerceToDict,\n _coerceToRunnable,\n} from \"./base.js\";\nimport {\n RunnableConfig,\n getCallbackManagerForConfig,\n patchConfig,\n} from \"./config.js\";\nimport { CallbackManagerForChainRun } from \"../callbacks/manager.js\";\nimport { concat } from \"../utils/stream.js\";\n\n/**\n * Type for a branch in the RunnableBranch. It consists of a condition\n * runnable and a branch runnable. The condition runnable is used to\n * determine whether the branch should be executed, and the branch runnable\n * is executed if the condition is true.\n */\nexport type Branch<RunInput, RunOutput> = [\n Runnable<RunInput, boolean>,\n Runnable<RunInput, RunOutput>\n];\n\nexport type BranchLike<RunInput, RunOutput> = [\n RunnableLike<RunInput, boolean>,\n RunnableLike<RunInput, RunOutput>\n];\n\n/**\n * Class that represents a runnable branch. The RunnableBranch is\n * initialized with an array of branches and a default branch. When invoked,\n * it evaluates the condition of each branch in order and executes the\n * corresponding branch if the condition is true. If none of the conditions\n * are true, it executes the default branch.\n * @example\n * ```typescript\n * const branch = RunnableBranch.from([\n * [\n * (x: { topic: string; question: string }) =>\n * x.topic.toLowerCase().includes(\"anthropic\"),\n * anthropicChain,\n * ],\n * [\n * (x: { topic: string; question: string }) =>\n * x.topic.toLowerCase().includes(\"langchain\"),\n * langChainChain,\n * ],\n * generalChain,\n * ]);\n *\n * const fullChain = RunnableSequence.from([\n * {\n * topic: classificationChain,\n * question: (input: { question: string }) => input.question,\n * },\n * branch,\n * ]);\n *\n * const result = await fullChain.invoke({\n * question: \"how do I use LangChain?\",\n * });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class RunnableBranch<RunInput = any, RunOutput = any> extends Runnable<\n RunInput,\n RunOutput\n> {\n static lc_name() {\n return \"RunnableBranch\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n default: Runnable<RunInput, RunOutput>;\n\n branches: Branch<RunInput, RunOutput>[];\n\n constructor(fields: {\n branches: Branch<RunInput, RunOutput>[];\n default: Runnable<RunInput, RunOutput>;\n }) {\n super(fields);\n this.branches = fields.branches;\n this.default = fields.default;\n }\n\n /**\n * Convenience method for instantiating a RunnableBranch from\n * RunnableLikes (objects, functions, or Runnables).\n *\n * Each item in the input except for the last one should be a\n * tuple with two items. The first is a \"condition\" RunnableLike that\n * returns \"true\" if the second RunnableLike in the tuple should run.\n *\n * The final item in the input should be a RunnableLike that acts as a\n * default branch if no other branches match.\n *\n * @example\n * ```ts\n * import { RunnableBranch } from \"@langchain/core/runnables\";\n *\n * const branch = RunnableBranch.from([\n * [(x: number) => x > 0, (x: number) => x + 1],\n * [(x: number) => x < 0, (x: number) => x - 1],\n * (x: number) => x\n * ]);\n * ```\n * @param branches An array where the every item except the last is a tuple of [condition, runnable]\n * pairs. The last item is a default runnable which is invoked if no other condition matches.\n * @returns A new RunnableBranch.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static from<RunInput = any, RunOutput = any>(\n branches: [\n ...BranchLike<RunInput, RunOutput>[],\n RunnableLike<RunInput, RunOutput>\n ]\n ) {\n if (branches.length < 1) {\n throw new Error(\"RunnableBranch requires at least one branch\");\n }\n const branchLikes = branches.slice(0, -1) as BranchLike<\n RunInput,\n RunOutput\n >[];\n const coercedBranches: Branch<RunInput, RunOutput>[] = branchLikes.map(\n ([condition, runnable]) => [\n _coerceToRunnable(condition),\n _coerceToRunnable(runnable),\n ]\n );\n const defaultBranch = _coerceToRunnable(\n branches[branches.length - 1] as RunnableLike<RunInput, RunOutput>\n );\n return new this({\n branches: coercedBranches,\n default: defaultBranch,\n });\n }\n\n async _invoke(\n input: RunInput,\n config?: Partial<RunnableConfig>,\n runManager?: CallbackManagerForChainRun\n ): Promise<RunOutput> {\n let result;\n for (let i = 0; i < this.branches.length; i += 1) {\n const [condition, branchRunnable] = this.branches[i];\n const conditionValue = await condition.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`condition:${i + 1}`),\n })\n );\n if (conditionValue) {\n result = await branchRunnable.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`branch:${i + 1}`),\n })\n );\n break;\n }\n }\n if (!result) {\n result = await this.default.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(\"branch:default\"),\n })\n );\n }\n return result;\n }\n\n async invoke(\n input: RunInput,\n config: RunnableConfig = {}\n ): Promise<RunOutput> {\n return this._callWithConfig(this._invoke, input, config);\n }\n\n async *_streamIterator(input: RunInput, config?: Partial<RunnableConfig>) {\n const callbackManager_ = await getCallbackManagerForConfig(config);\n const runManager = await callbackManager_?.handleChainStart(\n this.toJSON(),\n _coerceToDict(input, \"input\"),\n config?.runId,\n undefined,\n undefined,\n undefined,\n config?.runName\n );\n let finalOutput;\n let finalOutputSupported = true;\n let stream;\n try {\n for (let i = 0; i < this.branches.length; i += 1) {\n const [condition, branchRunnable] = this.branches[i];\n const conditionValue = await condition.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`condition:${i + 1}`),\n })\n );\n if (conditionValue) {\n stream = await branchRunnable.stream(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`branch:${i + 1}`),\n })\n );\n for await (const chunk of stream) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n finalOutput = concat(finalOutput, chunk);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n break;\n }\n }\n if (stream === undefined) {\n stream = await this.default.stream(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(\"branch:default\"),\n })\n );\n for await (const chunk of stream) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n finalOutput = concat(finalOutput, chunk as RunOutput);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n }\n } catch (e) {\n await runManager?.handleChainError(e);\n throw e;\n }\n await runManager?.handleChainEnd(finalOutput ?? {});\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"branch.cjs","names":["Runnable","fields: {\n branches: Branch<RunInput, RunOutput>[];\n default: Runnable<RunInput, RunOutput>;\n }","branches: [\n ...BranchLike<RunInput, RunOutput>[],\n RunnableLike<RunInput, RunOutput>,\n ]","coercedBranches: Branch<RunInput, RunOutput>[]","_coerceToRunnable","input: RunInput","config?: Partial<RunnableConfig>","runManager?: CallbackManagerForChainRun","patchConfig","config: RunnableConfig","getCallbackManagerForConfig","_coerceToDict","concat"],"sources":["../../src/runnables/branch.ts"],"sourcesContent":["import {\n Runnable,\n RunnableLike,\n _coerceToDict,\n _coerceToRunnable,\n} from \"./base.js\";\nimport {\n RunnableConfig,\n getCallbackManagerForConfig,\n patchConfig,\n} from \"./config.js\";\nimport { CallbackManagerForChainRun } from \"../callbacks/manager.js\";\nimport { concat } from \"../utils/stream.js\";\n\n/**\n * Type for a branch in the RunnableBranch. It consists of a condition\n * runnable and a branch runnable. The condition runnable is used to\n * determine whether the branch should be executed, and the branch runnable\n * is executed if the condition is true.\n */\nexport type Branch<RunInput, RunOutput> = [\n Runnable<RunInput, boolean>,\n Runnable<RunInput, RunOutput>,\n];\n\nexport type BranchLike<RunInput, RunOutput> = [\n RunnableLike<RunInput, boolean>,\n RunnableLike<RunInput, RunOutput>,\n];\n\n/**\n * Class that represents a runnable branch. The RunnableBranch is\n * initialized with an array of branches and a default branch. When invoked,\n * it evaluates the condition of each branch in order and executes the\n * corresponding branch if the condition is true. If none of the conditions\n * are true, it executes the default branch.\n * @example\n * ```typescript\n * const branch = RunnableBranch.from([\n * [\n * (x: { topic: string; question: string }) =>\n * x.topic.toLowerCase().includes(\"anthropic\"),\n * anthropicChain,\n * ],\n * [\n * (x: { topic: string; question: string }) =>\n * x.topic.toLowerCase().includes(\"langchain\"),\n * langChainChain,\n * ],\n * generalChain,\n * ]);\n *\n * const fullChain = RunnableSequence.from([\n * {\n * topic: classificationChain,\n * question: (input: { question: string }) => input.question,\n * },\n * branch,\n * ]);\n *\n * const result = await fullChain.invoke({\n * question: \"how do I use LangChain?\",\n * });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class RunnableBranch<RunInput = any, RunOutput = any> extends Runnable<\n RunInput,\n RunOutput\n> {\n static lc_name() {\n return \"RunnableBranch\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n default: Runnable<RunInput, RunOutput>;\n\n branches: Branch<RunInput, RunOutput>[];\n\n constructor(fields: {\n branches: Branch<RunInput, RunOutput>[];\n default: Runnable<RunInput, RunOutput>;\n }) {\n super(fields);\n this.branches = fields.branches;\n this.default = fields.default;\n }\n\n /**\n * Convenience method for instantiating a RunnableBranch from\n * RunnableLikes (objects, functions, or Runnables).\n *\n * Each item in the input except for the last one should be a\n * tuple with two items. The first is a \"condition\" RunnableLike that\n * returns \"true\" if the second RunnableLike in the tuple should run.\n *\n * The final item in the input should be a RunnableLike that acts as a\n * default branch if no other branches match.\n *\n * @example\n * ```ts\n * import { RunnableBranch } from \"@langchain/core/runnables\";\n *\n * const branch = RunnableBranch.from([\n * [(x: number) => x > 0, (x: number) => x + 1],\n * [(x: number) => x < 0, (x: number) => x - 1],\n * (x: number) => x\n * ]);\n * ```\n * @param branches An array where the every item except the last is a tuple of [condition, runnable]\n * pairs. The last item is a default runnable which is invoked if no other condition matches.\n * @returns A new RunnableBranch.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static from<RunInput = any, RunOutput = any>(\n branches: [\n ...BranchLike<RunInput, RunOutput>[],\n RunnableLike<RunInput, RunOutput>,\n ]\n ) {\n if (branches.length < 1) {\n throw new Error(\"RunnableBranch requires at least one branch\");\n }\n const branchLikes = branches.slice(0, -1) as BranchLike<\n RunInput,\n RunOutput\n >[];\n const coercedBranches: Branch<RunInput, RunOutput>[] = branchLikes.map(\n ([condition, runnable]) => [\n _coerceToRunnable(condition),\n _coerceToRunnable(runnable),\n ]\n );\n const defaultBranch = _coerceToRunnable(\n branches[branches.length - 1] as RunnableLike<RunInput, RunOutput>\n );\n return new this({\n branches: coercedBranches,\n default: defaultBranch,\n });\n }\n\n async _invoke(\n input: RunInput,\n config?: Partial<RunnableConfig>,\n runManager?: CallbackManagerForChainRun\n ): Promise<RunOutput> {\n let result;\n for (let i = 0; i < this.branches.length; i += 1) {\n const [condition, branchRunnable] = this.branches[i];\n const conditionValue = await condition.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`condition:${i + 1}`),\n })\n );\n if (conditionValue) {\n result = await branchRunnable.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`branch:${i + 1}`),\n })\n );\n break;\n }\n }\n if (!result) {\n result = await this.default.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(\"branch:default\"),\n })\n );\n }\n return result;\n }\n\n async invoke(\n input: RunInput,\n config: RunnableConfig = {}\n ): Promise<RunOutput> {\n return this._callWithConfig(this._invoke, input, config);\n }\n\n async *_streamIterator(input: RunInput, config?: Partial<RunnableConfig>) {\n const callbackManager_ = await getCallbackManagerForConfig(config);\n const runManager = await callbackManager_?.handleChainStart(\n this.toJSON(),\n _coerceToDict(input, \"input\"),\n config?.runId,\n undefined,\n undefined,\n undefined,\n config?.runName\n );\n let finalOutput;\n let finalOutputSupported = true;\n let stream;\n try {\n for (let i = 0; i < this.branches.length; i += 1) {\n const [condition, branchRunnable] = this.branches[i];\n const conditionValue = await condition.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`condition:${i + 1}`),\n })\n );\n if (conditionValue) {\n stream = await branchRunnable.stream(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`branch:${i + 1}`),\n })\n );\n for await (const chunk of stream) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n finalOutput = concat(finalOutput, chunk);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n break;\n }\n }\n if (stream === undefined) {\n stream = await this.default.stream(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(\"branch:default\"),\n })\n );\n for await (const chunk of stream) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n finalOutput = concat(finalOutput, chunk as RunOutput);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n }\n } catch (e) {\n await runManager?.handleChainError(e);\n throw e;\n }\n await runManager?.handleChainEnd(finalOutput ?? {});\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch.js","names":["fields: {\n branches: Branch<RunInput, RunOutput>[];\n default: Runnable<RunInput, RunOutput>;\n }","branches: [\n ...BranchLike<RunInput, RunOutput>[],\n RunnableLike<RunInput, RunOutput>\n ]","coercedBranches: Branch<RunInput, RunOutput>[]","input: RunInput","config?: Partial<RunnableConfig>","runManager?: CallbackManagerForChainRun","config: RunnableConfig"],"sources":["../../src/runnables/branch.ts"],"sourcesContent":["import {\n Runnable,\n RunnableLike,\n _coerceToDict,\n _coerceToRunnable,\n} from \"./base.js\";\nimport {\n RunnableConfig,\n getCallbackManagerForConfig,\n patchConfig,\n} from \"./config.js\";\nimport { CallbackManagerForChainRun } from \"../callbacks/manager.js\";\nimport { concat } from \"../utils/stream.js\";\n\n/**\n * Type for a branch in the RunnableBranch. It consists of a condition\n * runnable and a branch runnable. The condition runnable is used to\n * determine whether the branch should be executed, and the branch runnable\n * is executed if the condition is true.\n */\nexport type Branch<RunInput, RunOutput> = [\n Runnable<RunInput, boolean>,\n Runnable<RunInput, RunOutput>\n];\n\nexport type BranchLike<RunInput, RunOutput> = [\n RunnableLike<RunInput, boolean>,\n RunnableLike<RunInput, RunOutput>\n];\n\n/**\n * Class that represents a runnable branch. The RunnableBranch is\n * initialized with an array of branches and a default branch. When invoked,\n * it evaluates the condition of each branch in order and executes the\n * corresponding branch if the condition is true. If none of the conditions\n * are true, it executes the default branch.\n * @example\n * ```typescript\n * const branch = RunnableBranch.from([\n * [\n * (x: { topic: string; question: string }) =>\n * x.topic.toLowerCase().includes(\"anthropic\"),\n * anthropicChain,\n * ],\n * [\n * (x: { topic: string; question: string }) =>\n * x.topic.toLowerCase().includes(\"langchain\"),\n * langChainChain,\n * ],\n * generalChain,\n * ]);\n *\n * const fullChain = RunnableSequence.from([\n * {\n * topic: classificationChain,\n * question: (input: { question: string }) => input.question,\n * },\n * branch,\n * ]);\n *\n * const result = await fullChain.invoke({\n * question: \"how do I use LangChain?\",\n * });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class RunnableBranch<RunInput = any, RunOutput = any> extends Runnable<\n RunInput,\n RunOutput\n> {\n static lc_name() {\n return \"RunnableBranch\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n default: Runnable<RunInput, RunOutput>;\n\n branches: Branch<RunInput, RunOutput>[];\n\n constructor(fields: {\n branches: Branch<RunInput, RunOutput>[];\n default: Runnable<RunInput, RunOutput>;\n }) {\n super(fields);\n this.branches = fields.branches;\n this.default = fields.default;\n }\n\n /**\n * Convenience method for instantiating a RunnableBranch from\n * RunnableLikes (objects, functions, or Runnables).\n *\n * Each item in the input except for the last one should be a\n * tuple with two items. The first is a \"condition\" RunnableLike that\n * returns \"true\" if the second RunnableLike in the tuple should run.\n *\n * The final item in the input should be a RunnableLike that acts as a\n * default branch if no other branches match.\n *\n * @example\n * ```ts\n * import { RunnableBranch } from \"@langchain/core/runnables\";\n *\n * const branch = RunnableBranch.from([\n * [(x: number) => x > 0, (x: number) => x + 1],\n * [(x: number) => x < 0, (x: number) => x - 1],\n * (x: number) => x\n * ]);\n * ```\n * @param branches An array where the every item except the last is a tuple of [condition, runnable]\n * pairs. The last item is a default runnable which is invoked if no other condition matches.\n * @returns A new RunnableBranch.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static from<RunInput = any, RunOutput = any>(\n branches: [\n ...BranchLike<RunInput, RunOutput>[],\n RunnableLike<RunInput, RunOutput>\n ]\n ) {\n if (branches.length < 1) {\n throw new Error(\"RunnableBranch requires at least one branch\");\n }\n const branchLikes = branches.slice(0, -1) as BranchLike<\n RunInput,\n RunOutput\n >[];\n const coercedBranches: Branch<RunInput, RunOutput>[] = branchLikes.map(\n ([condition, runnable]) => [\n _coerceToRunnable(condition),\n _coerceToRunnable(runnable),\n ]\n );\n const defaultBranch = _coerceToRunnable(\n branches[branches.length - 1] as RunnableLike<RunInput, RunOutput>\n );\n return new this({\n branches: coercedBranches,\n default: defaultBranch,\n });\n }\n\n async _invoke(\n input: RunInput,\n config?: Partial<RunnableConfig>,\n runManager?: CallbackManagerForChainRun\n ): Promise<RunOutput> {\n let result;\n for (let i = 0; i < this.branches.length; i += 1) {\n const [condition, branchRunnable] = this.branches[i];\n const conditionValue = await condition.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`condition:${i + 1}`),\n })\n );\n if (conditionValue) {\n result = await branchRunnable.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`branch:${i + 1}`),\n })\n );\n break;\n }\n }\n if (!result) {\n result = await this.default.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(\"branch:default\"),\n })\n );\n }\n return result;\n }\n\n async invoke(\n input: RunInput,\n config: RunnableConfig = {}\n ): Promise<RunOutput> {\n return this._callWithConfig(this._invoke, input, config);\n }\n\n async *_streamIterator(input: RunInput, config?: Partial<RunnableConfig>) {\n const callbackManager_ = await getCallbackManagerForConfig(config);\n const runManager = await callbackManager_?.handleChainStart(\n this.toJSON(),\n _coerceToDict(input, \"input\"),\n config?.runId,\n undefined,\n undefined,\n undefined,\n config?.runName\n );\n let finalOutput;\n let finalOutputSupported = true;\n let stream;\n try {\n for (let i = 0; i < this.branches.length; i += 1) {\n const [condition, branchRunnable] = this.branches[i];\n const conditionValue = await condition.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`condition:${i + 1}`),\n })\n );\n if (conditionValue) {\n stream = await branchRunnable.stream(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`branch:${i + 1}`),\n })\n );\n for await (const chunk of stream) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n finalOutput = concat(finalOutput, chunk);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n break;\n }\n }\n if (stream === undefined) {\n stream = await this.default.stream(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(\"branch:default\"),\n })\n );\n for await (const chunk of stream) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n finalOutput = concat(finalOutput, chunk as RunOutput);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n }\n } catch (e) {\n await runManager?.handleChainError(e);\n throw e;\n }\n await runManager?.handleChainEnd(finalOutput ?? {});\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"branch.js","names":["fields: {\n branches: Branch<RunInput, RunOutput>[];\n default: Runnable<RunInput, RunOutput>;\n }","branches: [\n ...BranchLike<RunInput, RunOutput>[],\n RunnableLike<RunInput, RunOutput>,\n ]","coercedBranches: Branch<RunInput, RunOutput>[]","input: RunInput","config?: Partial<RunnableConfig>","runManager?: CallbackManagerForChainRun","config: RunnableConfig"],"sources":["../../src/runnables/branch.ts"],"sourcesContent":["import {\n Runnable,\n RunnableLike,\n _coerceToDict,\n _coerceToRunnable,\n} from \"./base.js\";\nimport {\n RunnableConfig,\n getCallbackManagerForConfig,\n patchConfig,\n} from \"./config.js\";\nimport { CallbackManagerForChainRun } from \"../callbacks/manager.js\";\nimport { concat } from \"../utils/stream.js\";\n\n/**\n * Type for a branch in the RunnableBranch. It consists of a condition\n * runnable and a branch runnable. The condition runnable is used to\n * determine whether the branch should be executed, and the branch runnable\n * is executed if the condition is true.\n */\nexport type Branch<RunInput, RunOutput> = [\n Runnable<RunInput, boolean>,\n Runnable<RunInput, RunOutput>,\n];\n\nexport type BranchLike<RunInput, RunOutput> = [\n RunnableLike<RunInput, boolean>,\n RunnableLike<RunInput, RunOutput>,\n];\n\n/**\n * Class that represents a runnable branch. The RunnableBranch is\n * initialized with an array of branches and a default branch. When invoked,\n * it evaluates the condition of each branch in order and executes the\n * corresponding branch if the condition is true. If none of the conditions\n * are true, it executes the default branch.\n * @example\n * ```typescript\n * const branch = RunnableBranch.from([\n * [\n * (x: { topic: string; question: string }) =>\n * x.topic.toLowerCase().includes(\"anthropic\"),\n * anthropicChain,\n * ],\n * [\n * (x: { topic: string; question: string }) =>\n * x.topic.toLowerCase().includes(\"langchain\"),\n * langChainChain,\n * ],\n * generalChain,\n * ]);\n *\n * const fullChain = RunnableSequence.from([\n * {\n * topic: classificationChain,\n * question: (input: { question: string }) => input.question,\n * },\n * branch,\n * ]);\n *\n * const result = await fullChain.invoke({\n * question: \"how do I use LangChain?\",\n * });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class RunnableBranch<RunInput = any, RunOutput = any> extends Runnable<\n RunInput,\n RunOutput\n> {\n static lc_name() {\n return \"RunnableBranch\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n default: Runnable<RunInput, RunOutput>;\n\n branches: Branch<RunInput, RunOutput>[];\n\n constructor(fields: {\n branches: Branch<RunInput, RunOutput>[];\n default: Runnable<RunInput, RunOutput>;\n }) {\n super(fields);\n this.branches = fields.branches;\n this.default = fields.default;\n }\n\n /**\n * Convenience method for instantiating a RunnableBranch from\n * RunnableLikes (objects, functions, or Runnables).\n *\n * Each item in the input except for the last one should be a\n * tuple with two items. The first is a \"condition\" RunnableLike that\n * returns \"true\" if the second RunnableLike in the tuple should run.\n *\n * The final item in the input should be a RunnableLike that acts as a\n * default branch if no other branches match.\n *\n * @example\n * ```ts\n * import { RunnableBranch } from \"@langchain/core/runnables\";\n *\n * const branch = RunnableBranch.from([\n * [(x: number) => x > 0, (x: number) => x + 1],\n * [(x: number) => x < 0, (x: number) => x - 1],\n * (x: number) => x\n * ]);\n * ```\n * @param branches An array where the every item except the last is a tuple of [condition, runnable]\n * pairs. The last item is a default runnable which is invoked if no other condition matches.\n * @returns A new RunnableBranch.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static from<RunInput = any, RunOutput = any>(\n branches: [\n ...BranchLike<RunInput, RunOutput>[],\n RunnableLike<RunInput, RunOutput>,\n ]\n ) {\n if (branches.length < 1) {\n throw new Error(\"RunnableBranch requires at least one branch\");\n }\n const branchLikes = branches.slice(0, -1) as BranchLike<\n RunInput,\n RunOutput\n >[];\n const coercedBranches: Branch<RunInput, RunOutput>[] = branchLikes.map(\n ([condition, runnable]) => [\n _coerceToRunnable(condition),\n _coerceToRunnable(runnable),\n ]\n );\n const defaultBranch = _coerceToRunnable(\n branches[branches.length - 1] as RunnableLike<RunInput, RunOutput>\n );\n return new this({\n branches: coercedBranches,\n default: defaultBranch,\n });\n }\n\n async _invoke(\n input: RunInput,\n config?: Partial<RunnableConfig>,\n runManager?: CallbackManagerForChainRun\n ): Promise<RunOutput> {\n let result;\n for (let i = 0; i < this.branches.length; i += 1) {\n const [condition, branchRunnable] = this.branches[i];\n const conditionValue = await condition.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`condition:${i + 1}`),\n })\n );\n if (conditionValue) {\n result = await branchRunnable.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`branch:${i + 1}`),\n })\n );\n break;\n }\n }\n if (!result) {\n result = await this.default.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(\"branch:default\"),\n })\n );\n }\n return result;\n }\n\n async invoke(\n input: RunInput,\n config: RunnableConfig = {}\n ): Promise<RunOutput> {\n return this._callWithConfig(this._invoke, input, config);\n }\n\n async *_streamIterator(input: RunInput, config?: Partial<RunnableConfig>) {\n const callbackManager_ = await getCallbackManagerForConfig(config);\n const runManager = await callbackManager_?.handleChainStart(\n this.toJSON(),\n _coerceToDict(input, \"input\"),\n config?.runId,\n undefined,\n undefined,\n undefined,\n config?.runName\n );\n let finalOutput;\n let finalOutputSupported = true;\n let stream;\n try {\n for (let i = 0; i < this.branches.length; i += 1) {\n const [condition, branchRunnable] = this.branches[i];\n const conditionValue = await condition.invoke(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`condition:${i + 1}`),\n })\n );\n if (conditionValue) {\n stream = await branchRunnable.stream(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(`branch:${i + 1}`),\n })\n );\n for await (const chunk of stream) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n finalOutput = concat(finalOutput, chunk);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n break;\n }\n }\n if (stream === undefined) {\n stream = await this.default.stream(\n input,\n patchConfig(config, {\n callbacks: runManager?.getChild(\"branch:default\"),\n })\n );\n for await (const chunk of stream) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n finalOutput = concat(finalOutput, chunk as RunOutput);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n }\n } catch (e) {\n await runManager?.handleChainError(e);\n throw e;\n }\n await runManager?.handleChainEnd(finalOutput ?? {});\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.cjs","names":["RunnableBinding","fields: RunnableWithMessageHistoryInputs<RunInput, RunOutput>","historyChain: Runnable","RunnableLambda","RunnablePassthrough","config","inputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>","isBaseMessage","HumanMessage","outputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>","AIMessage","input: any","kwargs?: RunnableConfig","run: Run","config: RunnableConfig"],"sources":["../../src/runnables/history.ts"],"sourcesContent":["import {\n BaseChatMessageHistory,\n BaseListChatMessageHistory,\n} from \"../chat_history.js\";\nimport {\n AIMessage,\n BaseMessage,\n HumanMessage,\n isBaseMessage,\n} from \"../messages/index.js\";\nimport { Run } from \"../tracers/base.js\";\nimport {\n Runnable,\n RunnableBinding,\n type RunnableBindingArgs,\n RunnableLambda,\n} from \"./base.js\";\nimport { RunnableConfig } from \"./config.js\";\nimport { RunnablePassthrough } from \"./passthrough.js\";\n\ntype GetSessionHistoryCallable = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: Array<any>\n) =>\n | Promise<BaseChatMessageHistory | BaseListChatMessageHistory>\n | BaseChatMessageHistory\n | BaseListChatMessageHistory;\n\nexport interface RunnableWithMessageHistoryInputs<RunInput, RunOutput>\n extends Omit<RunnableBindingArgs<RunInput, RunOutput>, \"bound\" | \"config\"> {\n runnable: Runnable<RunInput, RunOutput>;\n getMessageHistory: GetSessionHistoryCallable;\n inputMessagesKey?: string;\n outputMessagesKey?: string;\n historyMessagesKey?: string;\n config?: RunnableConfig;\n}\n\n/**\n * Wraps a LCEL chain and manages history. It appends input messages\n * and chain outputs as history, and adds the current history messages to\n * the chain input.\n * @example\n * ```typescript\n * // pnpm install @langchain/anthropic @langchain/community @upstash/redis\n *\n * import {\n * ChatPromptTemplate,\n * MessagesPlaceholder,\n * } from \"@langchain/core/prompts\";\n * import { ChatAnthropic } from \"@langchain/anthropic\";\n * import { UpstashRedisChatMessageHistory } from \"@langchain/community/stores/message/upstash_redis\";\n * // For demos, you can also use an in-memory store:\n * // import { ChatMessageHistory } from \"@langchain/classic/stores/message/in_memory\";\n *\n * const prompt = ChatPromptTemplate.fromMessages([\n * [\"system\", \"You're an assistant who's good at {ability}\"],\n * new MessagesPlaceholder(\"history\"),\n * [\"human\", \"{question}\"],\n * ]);\n *\n * const chain = prompt.pipe(new ChatAnthropic({}));\n *\n * const chainWithHistory = new RunnableWithMessageHistory({\n * runnable: chain,\n * getMessageHistory: (sessionId) =>\n * new UpstashRedisChatMessageHistory({\n * sessionId,\n * config: {\n * url: process.env.UPSTASH_REDIS_REST_URL!,\n * token: process.env.UPSTASH_REDIS_REST_TOKEN!,\n * },\n * }),\n * inputMessagesKey: \"question\",\n * historyMessagesKey: \"history\",\n * });\n *\n * const result = await chainWithHistory.invoke(\n * {\n * ability: \"math\",\n * question: \"What does cosine mean?\",\n * },\n * {\n * configurable: {\n * sessionId: \"some_string_identifying_a_user\",\n * },\n * }\n * );\n *\n * const result2 = await chainWithHistory.invoke(\n * {\n * ability: \"math\",\n * question: \"What's its inverse?\",\n * },\n * {\n * configurable: {\n * sessionId: \"some_string_identifying_a_user\",\n * },\n * }\n * );\n * ```\n */\nexport class RunnableWithMessageHistory<\n RunInput,\n RunOutput\n> extends RunnableBinding<RunInput, RunOutput> {\n runnable: Runnable<RunInput, RunOutput>;\n\n inputMessagesKey?: string;\n\n outputMessagesKey?: string;\n\n historyMessagesKey?: string;\n\n getMessageHistory: GetSessionHistoryCallable;\n\n constructor(fields: RunnableWithMessageHistoryInputs<RunInput, RunOutput>) {\n let historyChain: Runnable = RunnableLambda.from((input, options) =>\n this._enterHistory(input, options ?? {})\n ).withConfig({ runName: \"loadHistory\" });\n\n const messagesKey = fields.historyMessagesKey ?? fields.inputMessagesKey;\n if (messagesKey) {\n historyChain = RunnablePassthrough.assign({\n [messagesKey]: historyChain,\n }).withConfig({ runName: \"insertHistory\" });\n }\n\n const bound = historyChain\n .pipe(\n fields.runnable.withListeners({\n onEnd: (run, config) => this._exitHistory(run, config ?? {}),\n })\n )\n .withConfig({ runName: \"RunnableWithMessageHistory\" });\n\n const config = fields.config ?? {};\n\n super({\n ...fields,\n config,\n bound,\n });\n this.runnable = fields.runnable;\n this.getMessageHistory = fields.getMessageHistory;\n this.inputMessagesKey = fields.inputMessagesKey;\n this.outputMessagesKey = fields.outputMessagesKey;\n this.historyMessagesKey = fields.historyMessagesKey;\n }\n\n _getInputMessages(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>\n ): Array<BaseMessage> {\n let parsedInputValue;\n if (\n typeof inputValue === \"object\" &&\n !Array.isArray(inputValue) &&\n !isBaseMessage(inputValue)\n ) {\n let key;\n if (this.inputMessagesKey) {\n key = this.inputMessagesKey;\n } else if (Object.keys(inputValue).length === 1) {\n key = Object.keys(inputValue)[0];\n } else {\n key = \"input\";\n }\n if (Array.isArray(inputValue[key]) && Array.isArray(inputValue[key][0])) {\n parsedInputValue = inputValue[key][0];\n } else {\n parsedInputValue = inputValue[key];\n }\n } else {\n parsedInputValue = inputValue;\n }\n if (typeof parsedInputValue === \"string\") {\n return [new HumanMessage(parsedInputValue)];\n } else if (Array.isArray(parsedInputValue)) {\n return parsedInputValue;\n } else if (isBaseMessage(parsedInputValue)) {\n return [parsedInputValue];\n } else {\n throw new Error(\n `Expected a string, BaseMessage, or array of BaseMessages.\\nGot ${JSON.stringify(\n parsedInputValue,\n null,\n 2\n )}`\n );\n }\n }\n\n _getOutputMessages(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>\n ): Array<BaseMessage> {\n let parsedOutputValue;\n if (\n !Array.isArray(outputValue) &&\n !isBaseMessage(outputValue) &&\n typeof outputValue !== \"string\"\n ) {\n let key;\n if (this.outputMessagesKey !== undefined) {\n key = this.outputMessagesKey;\n } else if (Object.keys(outputValue).length === 1) {\n key = Object.keys(outputValue)[0];\n } else {\n key = \"output\";\n }\n // If you are wrapping a chat model directly\n // The output is actually this weird generations object\n if (outputValue.generations !== undefined) {\n parsedOutputValue = outputValue.generations[0][0].message;\n } else {\n parsedOutputValue = outputValue[key];\n }\n } else {\n parsedOutputValue = outputValue;\n }\n\n if (typeof parsedOutputValue === \"string\") {\n return [new AIMessage(parsedOutputValue)];\n } else if (Array.isArray(parsedOutputValue)) {\n return parsedOutputValue;\n } else if (isBaseMessage(parsedOutputValue)) {\n return [parsedOutputValue];\n } else {\n throw new Error(\n `Expected a string, BaseMessage, or array of BaseMessages. Received: ${JSON.stringify(\n parsedOutputValue,\n null,\n 2\n )}`\n );\n }\n }\n\n async _enterHistory(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any,\n kwargs?: RunnableConfig\n ): Promise<BaseMessage[]> {\n const history = kwargs?.configurable?.messageHistory;\n const messages = await history.getMessages();\n if (this.historyMessagesKey === undefined) {\n return messages.concat(this._getInputMessages(input));\n }\n return messages;\n }\n\n async _exitHistory(run: Run, config: RunnableConfig): Promise<void> {\n const history = config.configurable?.messageHistory;\n\n // Get input messages\n let inputs;\n // Chat model inputs are nested arrays\n if (Array.isArray(run.inputs) && Array.isArray(run.inputs[0])) {\n inputs = run.inputs[0];\n } else {\n inputs = run.inputs;\n }\n let inputMessages = this._getInputMessages(inputs);\n // If historic messages were prepended to the input messages, remove them to\n // avoid adding duplicate messages to history.\n if (this.historyMessagesKey === undefined) {\n const existingMessages = await history.getMessages();\n inputMessages = inputMessages.slice(existingMessages.length);\n }\n // Get output messages\n const outputValue = run.outputs;\n if (!outputValue) {\n throw new Error(\n `Output values from 'Run' undefined. Run: ${JSON.stringify(\n run,\n null,\n 2\n )}`\n );\n }\n const outputMessages = this._getOutputMessages(outputValue);\n await history.addMessages([...inputMessages, ...outputMessages]);\n }\n\n async _mergeConfig(...configs: Array<RunnableConfig | undefined>) {\n const config = await super._mergeConfig(...configs);\n // Extract sessionId\n if (!config.configurable || !config.configurable.sessionId) {\n const exampleInput = {\n [this.inputMessagesKey ?? \"input\"]: \"foo\",\n };\n const exampleConfig = { configurable: { sessionId: \"123\" } };\n throw new Error(\n `sessionId is required. Pass it in as part of the config argument to .invoke() or .stream()\\n` +\n `eg. chain.invoke(${JSON.stringify(exampleInput)}, ${JSON.stringify(\n exampleConfig\n )})`\n );\n }\n // attach messageHistory\n const { sessionId } = config.configurable;\n config.configurable.messageHistory = await this.getMessageHistory(\n sessionId\n );\n return config;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"history.cjs","names":["RunnableBinding","fields: RunnableWithMessageHistoryInputs<RunInput, RunOutput>","historyChain: Runnable","RunnableLambda","RunnablePassthrough","config","inputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>","isBaseMessage","HumanMessage","outputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>","AIMessage","input: any","kwargs?: RunnableConfig","run: Run","config: RunnableConfig"],"sources":["../../src/runnables/history.ts"],"sourcesContent":["import {\n BaseChatMessageHistory,\n BaseListChatMessageHistory,\n} from \"../chat_history.js\";\nimport {\n AIMessage,\n BaseMessage,\n HumanMessage,\n isBaseMessage,\n} from \"../messages/index.js\";\nimport { Run } from \"../tracers/base.js\";\nimport {\n Runnable,\n RunnableBinding,\n type RunnableBindingArgs,\n RunnableLambda,\n} from \"./base.js\";\nimport { RunnableConfig } from \"./config.js\";\nimport { RunnablePassthrough } from \"./passthrough.js\";\n\ntype GetSessionHistoryCallable = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: Array<any>\n) =>\n | Promise<BaseChatMessageHistory | BaseListChatMessageHistory>\n | BaseChatMessageHistory\n | BaseListChatMessageHistory;\n\nexport interface RunnableWithMessageHistoryInputs<RunInput, RunOutput>\n extends Omit<RunnableBindingArgs<RunInput, RunOutput>, \"bound\" | \"config\"> {\n runnable: Runnable<RunInput, RunOutput>;\n getMessageHistory: GetSessionHistoryCallable;\n inputMessagesKey?: string;\n outputMessagesKey?: string;\n historyMessagesKey?: string;\n config?: RunnableConfig;\n}\n\n/**\n * Wraps a LCEL chain and manages history. It appends input messages\n * and chain outputs as history, and adds the current history messages to\n * the chain input.\n * @example\n * ```typescript\n * // pnpm install @langchain/anthropic @langchain/community @upstash/redis\n *\n * import {\n * ChatPromptTemplate,\n * MessagesPlaceholder,\n * } from \"@langchain/core/prompts\";\n * import { ChatAnthropic } from \"@langchain/anthropic\";\n * import { UpstashRedisChatMessageHistory } from \"@langchain/community/stores/message/upstash_redis\";\n * // For demos, you can also use an in-memory store:\n * // import { ChatMessageHistory } from \"@langchain/classic/stores/message/in_memory\";\n *\n * const prompt = ChatPromptTemplate.fromMessages([\n * [\"system\", \"You're an assistant who's good at {ability}\"],\n * new MessagesPlaceholder(\"history\"),\n * [\"human\", \"{question}\"],\n * ]);\n *\n * const chain = prompt.pipe(new ChatAnthropic({}));\n *\n * const chainWithHistory = new RunnableWithMessageHistory({\n * runnable: chain,\n * getMessageHistory: (sessionId) =>\n * new UpstashRedisChatMessageHistory({\n * sessionId,\n * config: {\n * url: process.env.UPSTASH_REDIS_REST_URL!,\n * token: process.env.UPSTASH_REDIS_REST_TOKEN!,\n * },\n * }),\n * inputMessagesKey: \"question\",\n * historyMessagesKey: \"history\",\n * });\n *\n * const result = await chainWithHistory.invoke(\n * {\n * ability: \"math\",\n * question: \"What does cosine mean?\",\n * },\n * {\n * configurable: {\n * sessionId: \"some_string_identifying_a_user\",\n * },\n * }\n * );\n *\n * const result2 = await chainWithHistory.invoke(\n * {\n * ability: \"math\",\n * question: \"What's its inverse?\",\n * },\n * {\n * configurable: {\n * sessionId: \"some_string_identifying_a_user\",\n * },\n * }\n * );\n * ```\n */\nexport class RunnableWithMessageHistory<\n RunInput,\n RunOutput,\n> extends RunnableBinding<RunInput, RunOutput> {\n runnable: Runnable<RunInput, RunOutput>;\n\n inputMessagesKey?: string;\n\n outputMessagesKey?: string;\n\n historyMessagesKey?: string;\n\n getMessageHistory: GetSessionHistoryCallable;\n\n constructor(fields: RunnableWithMessageHistoryInputs<RunInput, RunOutput>) {\n let historyChain: Runnable = RunnableLambda.from((input, options) =>\n this._enterHistory(input, options ?? {})\n ).withConfig({ runName: \"loadHistory\" });\n\n const messagesKey = fields.historyMessagesKey ?? fields.inputMessagesKey;\n if (messagesKey) {\n historyChain = RunnablePassthrough.assign({\n [messagesKey]: historyChain,\n }).withConfig({ runName: \"insertHistory\" });\n }\n\n const bound = historyChain\n .pipe(\n fields.runnable.withListeners({\n onEnd: (run, config) => this._exitHistory(run, config ?? {}),\n })\n )\n .withConfig({ runName: \"RunnableWithMessageHistory\" });\n\n const config = fields.config ?? {};\n\n super({\n ...fields,\n config,\n bound,\n });\n this.runnable = fields.runnable;\n this.getMessageHistory = fields.getMessageHistory;\n this.inputMessagesKey = fields.inputMessagesKey;\n this.outputMessagesKey = fields.outputMessagesKey;\n this.historyMessagesKey = fields.historyMessagesKey;\n }\n\n _getInputMessages(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>\n ): Array<BaseMessage> {\n let parsedInputValue;\n if (\n typeof inputValue === \"object\" &&\n !Array.isArray(inputValue) &&\n !isBaseMessage(inputValue)\n ) {\n let key;\n if (this.inputMessagesKey) {\n key = this.inputMessagesKey;\n } else if (Object.keys(inputValue).length === 1) {\n key = Object.keys(inputValue)[0];\n } else {\n key = \"input\";\n }\n if (Array.isArray(inputValue[key]) && Array.isArray(inputValue[key][0])) {\n parsedInputValue = inputValue[key][0];\n } else {\n parsedInputValue = inputValue[key];\n }\n } else {\n parsedInputValue = inputValue;\n }\n if (typeof parsedInputValue === \"string\") {\n return [new HumanMessage(parsedInputValue)];\n } else if (Array.isArray(parsedInputValue)) {\n return parsedInputValue;\n } else if (isBaseMessage(parsedInputValue)) {\n return [parsedInputValue];\n } else {\n throw new Error(\n `Expected a string, BaseMessage, or array of BaseMessages.\\nGot ${JSON.stringify(\n parsedInputValue,\n null,\n 2\n )}`\n );\n }\n }\n\n _getOutputMessages(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>\n ): Array<BaseMessage> {\n let parsedOutputValue;\n if (\n !Array.isArray(outputValue) &&\n !isBaseMessage(outputValue) &&\n typeof outputValue !== \"string\"\n ) {\n let key;\n if (this.outputMessagesKey !== undefined) {\n key = this.outputMessagesKey;\n } else if (Object.keys(outputValue).length === 1) {\n key = Object.keys(outputValue)[0];\n } else {\n key = \"output\";\n }\n // If you are wrapping a chat model directly\n // The output is actually this weird generations object\n if (outputValue.generations !== undefined) {\n parsedOutputValue = outputValue.generations[0][0].message;\n } else {\n parsedOutputValue = outputValue[key];\n }\n } else {\n parsedOutputValue = outputValue;\n }\n\n if (typeof parsedOutputValue === \"string\") {\n return [new AIMessage(parsedOutputValue)];\n } else if (Array.isArray(parsedOutputValue)) {\n return parsedOutputValue;\n } else if (isBaseMessage(parsedOutputValue)) {\n return [parsedOutputValue];\n } else {\n throw new Error(\n `Expected a string, BaseMessage, or array of BaseMessages. Received: ${JSON.stringify(\n parsedOutputValue,\n null,\n 2\n )}`\n );\n }\n }\n\n async _enterHistory(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any,\n kwargs?: RunnableConfig\n ): Promise<BaseMessage[]> {\n const history = kwargs?.configurable?.messageHistory;\n const messages = await history.getMessages();\n if (this.historyMessagesKey === undefined) {\n return messages.concat(this._getInputMessages(input));\n }\n return messages;\n }\n\n async _exitHistory(run: Run, config: RunnableConfig): Promise<void> {\n const history = config.configurable?.messageHistory;\n\n // Get input messages\n let inputs;\n // Chat model inputs are nested arrays\n if (Array.isArray(run.inputs) && Array.isArray(run.inputs[0])) {\n inputs = run.inputs[0];\n } else {\n inputs = run.inputs;\n }\n let inputMessages = this._getInputMessages(inputs);\n // If historic messages were prepended to the input messages, remove them to\n // avoid adding duplicate messages to history.\n if (this.historyMessagesKey === undefined) {\n const existingMessages = await history.getMessages();\n inputMessages = inputMessages.slice(existingMessages.length);\n }\n // Get output messages\n const outputValue = run.outputs;\n if (!outputValue) {\n throw new Error(\n `Output values from 'Run' undefined. Run: ${JSON.stringify(\n run,\n null,\n 2\n )}`\n );\n }\n const outputMessages = this._getOutputMessages(outputValue);\n await history.addMessages([...inputMessages, ...outputMessages]);\n }\n\n async _mergeConfig(...configs: Array<RunnableConfig | undefined>) {\n const config = await super._mergeConfig(...configs);\n // Extract sessionId\n if (!config.configurable || !config.configurable.sessionId) {\n const exampleInput = {\n [this.inputMessagesKey ?? \"input\"]: \"foo\",\n };\n const exampleConfig = { configurable: { sessionId: \"123\" } };\n throw new Error(\n `sessionId is required. Pass it in as part of the config argument to .invoke() or .stream()\\n` +\n `eg. chain.invoke(${JSON.stringify(exampleInput)}, ${JSON.stringify(\n exampleConfig\n )})`\n );\n }\n // attach messageHistory\n const { sessionId } = config.configurable;\n config.configurable.messageHistory =\n await this.getMessageHistory(sessionId);\n return config;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","names":["fields: RunnableWithMessageHistoryInputs<RunInput, RunOutput>","historyChain: Runnable","config","inputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>","outputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>","input: any","kwargs?: RunnableConfig","run: Run","config: RunnableConfig"],"sources":["../../src/runnables/history.ts"],"sourcesContent":["import {\n BaseChatMessageHistory,\n BaseListChatMessageHistory,\n} from \"../chat_history.js\";\nimport {\n AIMessage,\n BaseMessage,\n HumanMessage,\n isBaseMessage,\n} from \"../messages/index.js\";\nimport { Run } from \"../tracers/base.js\";\nimport {\n Runnable,\n RunnableBinding,\n type RunnableBindingArgs,\n RunnableLambda,\n} from \"./base.js\";\nimport { RunnableConfig } from \"./config.js\";\nimport { RunnablePassthrough } from \"./passthrough.js\";\n\ntype GetSessionHistoryCallable = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: Array<any>\n) =>\n | Promise<BaseChatMessageHistory | BaseListChatMessageHistory>\n | BaseChatMessageHistory\n | BaseListChatMessageHistory;\n\nexport interface RunnableWithMessageHistoryInputs<RunInput, RunOutput>\n extends Omit<RunnableBindingArgs<RunInput, RunOutput>, \"bound\" | \"config\"> {\n runnable: Runnable<RunInput, RunOutput>;\n getMessageHistory: GetSessionHistoryCallable;\n inputMessagesKey?: string;\n outputMessagesKey?: string;\n historyMessagesKey?: string;\n config?: RunnableConfig;\n}\n\n/**\n * Wraps a LCEL chain and manages history. It appends input messages\n * and chain outputs as history, and adds the current history messages to\n * the chain input.\n * @example\n * ```typescript\n * // pnpm install @langchain/anthropic @langchain/community @upstash/redis\n *\n * import {\n * ChatPromptTemplate,\n * MessagesPlaceholder,\n * } from \"@langchain/core/prompts\";\n * import { ChatAnthropic } from \"@langchain/anthropic\";\n * import { UpstashRedisChatMessageHistory } from \"@langchain/community/stores/message/upstash_redis\";\n * // For demos, you can also use an in-memory store:\n * // import { ChatMessageHistory } from \"@langchain/classic/stores/message/in_memory\";\n *\n * const prompt = ChatPromptTemplate.fromMessages([\n * [\"system\", \"You're an assistant who's good at {ability}\"],\n * new MessagesPlaceholder(\"history\"),\n * [\"human\", \"{question}\"],\n * ]);\n *\n * const chain = prompt.pipe(new ChatAnthropic({}));\n *\n * const chainWithHistory = new RunnableWithMessageHistory({\n * runnable: chain,\n * getMessageHistory: (sessionId) =>\n * new UpstashRedisChatMessageHistory({\n * sessionId,\n * config: {\n * url: process.env.UPSTASH_REDIS_REST_URL!,\n * token: process.env.UPSTASH_REDIS_REST_TOKEN!,\n * },\n * }),\n * inputMessagesKey: \"question\",\n * historyMessagesKey: \"history\",\n * });\n *\n * const result = await chainWithHistory.invoke(\n * {\n * ability: \"math\",\n * question: \"What does cosine mean?\",\n * },\n * {\n * configurable: {\n * sessionId: \"some_string_identifying_a_user\",\n * },\n * }\n * );\n *\n * const result2 = await chainWithHistory.invoke(\n * {\n * ability: \"math\",\n * question: \"What's its inverse?\",\n * },\n * {\n * configurable: {\n * sessionId: \"some_string_identifying_a_user\",\n * },\n * }\n * );\n * ```\n */\nexport class RunnableWithMessageHistory<\n RunInput,\n RunOutput\n> extends RunnableBinding<RunInput, RunOutput> {\n runnable: Runnable<RunInput, RunOutput>;\n\n inputMessagesKey?: string;\n\n outputMessagesKey?: string;\n\n historyMessagesKey?: string;\n\n getMessageHistory: GetSessionHistoryCallable;\n\n constructor(fields: RunnableWithMessageHistoryInputs<RunInput, RunOutput>) {\n let historyChain: Runnable = RunnableLambda.from((input, options) =>\n this._enterHistory(input, options ?? {})\n ).withConfig({ runName: \"loadHistory\" });\n\n const messagesKey = fields.historyMessagesKey ?? fields.inputMessagesKey;\n if (messagesKey) {\n historyChain = RunnablePassthrough.assign({\n [messagesKey]: historyChain,\n }).withConfig({ runName: \"insertHistory\" });\n }\n\n const bound = historyChain\n .pipe(\n fields.runnable.withListeners({\n onEnd: (run, config) => this._exitHistory(run, config ?? {}),\n })\n )\n .withConfig({ runName: \"RunnableWithMessageHistory\" });\n\n const config = fields.config ?? {};\n\n super({\n ...fields,\n config,\n bound,\n });\n this.runnable = fields.runnable;\n this.getMessageHistory = fields.getMessageHistory;\n this.inputMessagesKey = fields.inputMessagesKey;\n this.outputMessagesKey = fields.outputMessagesKey;\n this.historyMessagesKey = fields.historyMessagesKey;\n }\n\n _getInputMessages(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>\n ): Array<BaseMessage> {\n let parsedInputValue;\n if (\n typeof inputValue === \"object\" &&\n !Array.isArray(inputValue) &&\n !isBaseMessage(inputValue)\n ) {\n let key;\n if (this.inputMessagesKey) {\n key = this.inputMessagesKey;\n } else if (Object.keys(inputValue).length === 1) {\n key = Object.keys(inputValue)[0];\n } else {\n key = \"input\";\n }\n if (Array.isArray(inputValue[key]) && Array.isArray(inputValue[key][0])) {\n parsedInputValue = inputValue[key][0];\n } else {\n parsedInputValue = inputValue[key];\n }\n } else {\n parsedInputValue = inputValue;\n }\n if (typeof parsedInputValue === \"string\") {\n return [new HumanMessage(parsedInputValue)];\n } else if (Array.isArray(parsedInputValue)) {\n return parsedInputValue;\n } else if (isBaseMessage(parsedInputValue)) {\n return [parsedInputValue];\n } else {\n throw new Error(\n `Expected a string, BaseMessage, or array of BaseMessages.\\nGot ${JSON.stringify(\n parsedInputValue,\n null,\n 2\n )}`\n );\n }\n }\n\n _getOutputMessages(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>\n ): Array<BaseMessage> {\n let parsedOutputValue;\n if (\n !Array.isArray(outputValue) &&\n !isBaseMessage(outputValue) &&\n typeof outputValue !== \"string\"\n ) {\n let key;\n if (this.outputMessagesKey !== undefined) {\n key = this.outputMessagesKey;\n } else if (Object.keys(outputValue).length === 1) {\n key = Object.keys(outputValue)[0];\n } else {\n key = \"output\";\n }\n // If you are wrapping a chat model directly\n // The output is actually this weird generations object\n if (outputValue.generations !== undefined) {\n parsedOutputValue = outputValue.generations[0][0].message;\n } else {\n parsedOutputValue = outputValue[key];\n }\n } else {\n parsedOutputValue = outputValue;\n }\n\n if (typeof parsedOutputValue === \"string\") {\n return [new AIMessage(parsedOutputValue)];\n } else if (Array.isArray(parsedOutputValue)) {\n return parsedOutputValue;\n } else if (isBaseMessage(parsedOutputValue)) {\n return [parsedOutputValue];\n } else {\n throw new Error(\n `Expected a string, BaseMessage, or array of BaseMessages. Received: ${JSON.stringify(\n parsedOutputValue,\n null,\n 2\n )}`\n );\n }\n }\n\n async _enterHistory(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any,\n kwargs?: RunnableConfig\n ): Promise<BaseMessage[]> {\n const history = kwargs?.configurable?.messageHistory;\n const messages = await history.getMessages();\n if (this.historyMessagesKey === undefined) {\n return messages.concat(this._getInputMessages(input));\n }\n return messages;\n }\n\n async _exitHistory(run: Run, config: RunnableConfig): Promise<void> {\n const history = config.configurable?.messageHistory;\n\n // Get input messages\n let inputs;\n // Chat model inputs are nested arrays\n if (Array.isArray(run.inputs) && Array.isArray(run.inputs[0])) {\n inputs = run.inputs[0];\n } else {\n inputs = run.inputs;\n }\n let inputMessages = this._getInputMessages(inputs);\n // If historic messages were prepended to the input messages, remove them to\n // avoid adding duplicate messages to history.\n if (this.historyMessagesKey === undefined) {\n const existingMessages = await history.getMessages();\n inputMessages = inputMessages.slice(existingMessages.length);\n }\n // Get output messages\n const outputValue = run.outputs;\n if (!outputValue) {\n throw new Error(\n `Output values from 'Run' undefined. Run: ${JSON.stringify(\n run,\n null,\n 2\n )}`\n );\n }\n const outputMessages = this._getOutputMessages(outputValue);\n await history.addMessages([...inputMessages, ...outputMessages]);\n }\n\n async _mergeConfig(...configs: Array<RunnableConfig | undefined>) {\n const config = await super._mergeConfig(...configs);\n // Extract sessionId\n if (!config.configurable || !config.configurable.sessionId) {\n const exampleInput = {\n [this.inputMessagesKey ?? \"input\"]: \"foo\",\n };\n const exampleConfig = { configurable: { sessionId: \"123\" } };\n throw new Error(\n `sessionId is required. Pass it in as part of the config argument to .invoke() or .stream()\\n` +\n `eg. chain.invoke(${JSON.stringify(exampleInput)}, ${JSON.stringify(\n exampleConfig\n )})`\n );\n }\n // attach messageHistory\n const { sessionId } = config.configurable;\n config.configurable.messageHistory = await this.getMessageHistory(\n sessionId\n );\n return config;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"history.js","names":["fields: RunnableWithMessageHistoryInputs<RunInput, RunOutput>","historyChain: Runnable","config","inputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>","outputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>","input: any","kwargs?: RunnableConfig","run: Run","config: RunnableConfig"],"sources":["../../src/runnables/history.ts"],"sourcesContent":["import {\n BaseChatMessageHistory,\n BaseListChatMessageHistory,\n} from \"../chat_history.js\";\nimport {\n AIMessage,\n BaseMessage,\n HumanMessage,\n isBaseMessage,\n} from \"../messages/index.js\";\nimport { Run } from \"../tracers/base.js\";\nimport {\n Runnable,\n RunnableBinding,\n type RunnableBindingArgs,\n RunnableLambda,\n} from \"./base.js\";\nimport { RunnableConfig } from \"./config.js\";\nimport { RunnablePassthrough } from \"./passthrough.js\";\n\ntype GetSessionHistoryCallable = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: Array<any>\n) =>\n | Promise<BaseChatMessageHistory | BaseListChatMessageHistory>\n | BaseChatMessageHistory\n | BaseListChatMessageHistory;\n\nexport interface RunnableWithMessageHistoryInputs<RunInput, RunOutput>\n extends Omit<RunnableBindingArgs<RunInput, RunOutput>, \"bound\" | \"config\"> {\n runnable: Runnable<RunInput, RunOutput>;\n getMessageHistory: GetSessionHistoryCallable;\n inputMessagesKey?: string;\n outputMessagesKey?: string;\n historyMessagesKey?: string;\n config?: RunnableConfig;\n}\n\n/**\n * Wraps a LCEL chain and manages history. It appends input messages\n * and chain outputs as history, and adds the current history messages to\n * the chain input.\n * @example\n * ```typescript\n * // pnpm install @langchain/anthropic @langchain/community @upstash/redis\n *\n * import {\n * ChatPromptTemplate,\n * MessagesPlaceholder,\n * } from \"@langchain/core/prompts\";\n * import { ChatAnthropic } from \"@langchain/anthropic\";\n * import { UpstashRedisChatMessageHistory } from \"@langchain/community/stores/message/upstash_redis\";\n * // For demos, you can also use an in-memory store:\n * // import { ChatMessageHistory } from \"@langchain/classic/stores/message/in_memory\";\n *\n * const prompt = ChatPromptTemplate.fromMessages([\n * [\"system\", \"You're an assistant who's good at {ability}\"],\n * new MessagesPlaceholder(\"history\"),\n * [\"human\", \"{question}\"],\n * ]);\n *\n * const chain = prompt.pipe(new ChatAnthropic({}));\n *\n * const chainWithHistory = new RunnableWithMessageHistory({\n * runnable: chain,\n * getMessageHistory: (sessionId) =>\n * new UpstashRedisChatMessageHistory({\n * sessionId,\n * config: {\n * url: process.env.UPSTASH_REDIS_REST_URL!,\n * token: process.env.UPSTASH_REDIS_REST_TOKEN!,\n * },\n * }),\n * inputMessagesKey: \"question\",\n * historyMessagesKey: \"history\",\n * });\n *\n * const result = await chainWithHistory.invoke(\n * {\n * ability: \"math\",\n * question: \"What does cosine mean?\",\n * },\n * {\n * configurable: {\n * sessionId: \"some_string_identifying_a_user\",\n * },\n * }\n * );\n *\n * const result2 = await chainWithHistory.invoke(\n * {\n * ability: \"math\",\n * question: \"What's its inverse?\",\n * },\n * {\n * configurable: {\n * sessionId: \"some_string_identifying_a_user\",\n * },\n * }\n * );\n * ```\n */\nexport class RunnableWithMessageHistory<\n RunInput,\n RunOutput,\n> extends RunnableBinding<RunInput, RunOutput> {\n runnable: Runnable<RunInput, RunOutput>;\n\n inputMessagesKey?: string;\n\n outputMessagesKey?: string;\n\n historyMessagesKey?: string;\n\n getMessageHistory: GetSessionHistoryCallable;\n\n constructor(fields: RunnableWithMessageHistoryInputs<RunInput, RunOutput>) {\n let historyChain: Runnable = RunnableLambda.from((input, options) =>\n this._enterHistory(input, options ?? {})\n ).withConfig({ runName: \"loadHistory\" });\n\n const messagesKey = fields.historyMessagesKey ?? fields.inputMessagesKey;\n if (messagesKey) {\n historyChain = RunnablePassthrough.assign({\n [messagesKey]: historyChain,\n }).withConfig({ runName: \"insertHistory\" });\n }\n\n const bound = historyChain\n .pipe(\n fields.runnable.withListeners({\n onEnd: (run, config) => this._exitHistory(run, config ?? {}),\n })\n )\n .withConfig({ runName: \"RunnableWithMessageHistory\" });\n\n const config = fields.config ?? {};\n\n super({\n ...fields,\n config,\n bound,\n });\n this.runnable = fields.runnable;\n this.getMessageHistory = fields.getMessageHistory;\n this.inputMessagesKey = fields.inputMessagesKey;\n this.outputMessagesKey = fields.outputMessagesKey;\n this.historyMessagesKey = fields.historyMessagesKey;\n }\n\n _getInputMessages(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>\n ): Array<BaseMessage> {\n let parsedInputValue;\n if (\n typeof inputValue === \"object\" &&\n !Array.isArray(inputValue) &&\n !isBaseMessage(inputValue)\n ) {\n let key;\n if (this.inputMessagesKey) {\n key = this.inputMessagesKey;\n } else if (Object.keys(inputValue).length === 1) {\n key = Object.keys(inputValue)[0];\n } else {\n key = \"input\";\n }\n if (Array.isArray(inputValue[key]) && Array.isArray(inputValue[key][0])) {\n parsedInputValue = inputValue[key][0];\n } else {\n parsedInputValue = inputValue[key];\n }\n } else {\n parsedInputValue = inputValue;\n }\n if (typeof parsedInputValue === \"string\") {\n return [new HumanMessage(parsedInputValue)];\n } else if (Array.isArray(parsedInputValue)) {\n return parsedInputValue;\n } else if (isBaseMessage(parsedInputValue)) {\n return [parsedInputValue];\n } else {\n throw new Error(\n `Expected a string, BaseMessage, or array of BaseMessages.\\nGot ${JSON.stringify(\n parsedInputValue,\n null,\n 2\n )}`\n );\n }\n }\n\n _getOutputMessages(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputValue: string | BaseMessage | Array<BaseMessage> | Record<string, any>\n ): Array<BaseMessage> {\n let parsedOutputValue;\n if (\n !Array.isArray(outputValue) &&\n !isBaseMessage(outputValue) &&\n typeof outputValue !== \"string\"\n ) {\n let key;\n if (this.outputMessagesKey !== undefined) {\n key = this.outputMessagesKey;\n } else if (Object.keys(outputValue).length === 1) {\n key = Object.keys(outputValue)[0];\n } else {\n key = \"output\";\n }\n // If you are wrapping a chat model directly\n // The output is actually this weird generations object\n if (outputValue.generations !== undefined) {\n parsedOutputValue = outputValue.generations[0][0].message;\n } else {\n parsedOutputValue = outputValue[key];\n }\n } else {\n parsedOutputValue = outputValue;\n }\n\n if (typeof parsedOutputValue === \"string\") {\n return [new AIMessage(parsedOutputValue)];\n } else if (Array.isArray(parsedOutputValue)) {\n return parsedOutputValue;\n } else if (isBaseMessage(parsedOutputValue)) {\n return [parsedOutputValue];\n } else {\n throw new Error(\n `Expected a string, BaseMessage, or array of BaseMessages. Received: ${JSON.stringify(\n parsedOutputValue,\n null,\n 2\n )}`\n );\n }\n }\n\n async _enterHistory(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any,\n kwargs?: RunnableConfig\n ): Promise<BaseMessage[]> {\n const history = kwargs?.configurable?.messageHistory;\n const messages = await history.getMessages();\n if (this.historyMessagesKey === undefined) {\n return messages.concat(this._getInputMessages(input));\n }\n return messages;\n }\n\n async _exitHistory(run: Run, config: RunnableConfig): Promise<void> {\n const history = config.configurable?.messageHistory;\n\n // Get input messages\n let inputs;\n // Chat model inputs are nested arrays\n if (Array.isArray(run.inputs) && Array.isArray(run.inputs[0])) {\n inputs = run.inputs[0];\n } else {\n inputs = run.inputs;\n }\n let inputMessages = this._getInputMessages(inputs);\n // If historic messages were prepended to the input messages, remove them to\n // avoid adding duplicate messages to history.\n if (this.historyMessagesKey === undefined) {\n const existingMessages = await history.getMessages();\n inputMessages = inputMessages.slice(existingMessages.length);\n }\n // Get output messages\n const outputValue = run.outputs;\n if (!outputValue) {\n throw new Error(\n `Output values from 'Run' undefined. Run: ${JSON.stringify(\n run,\n null,\n 2\n )}`\n );\n }\n const outputMessages = this._getOutputMessages(outputValue);\n await history.addMessages([...inputMessages, ...outputMessages]);\n }\n\n async _mergeConfig(...configs: Array<RunnableConfig | undefined>) {\n const config = await super._mergeConfig(...configs);\n // Extract sessionId\n if (!config.configurable || !config.configurable.sessionId) {\n const exampleInput = {\n [this.inputMessagesKey ?? \"input\"]: \"foo\",\n };\n const exampleConfig = { configurable: { sessionId: \"123\" } };\n throw new Error(\n `sessionId is required. Pass it in as part of the config argument to .invoke() or .stream()\\n` +\n `eg. chain.invoke(${JSON.stringify(exampleInput)}, ${JSON.stringify(\n exampleConfig\n )})`\n );\n }\n // attach messageHistory\n const { sessionId } = config.configurable;\n config.configurable.messageHistory =\n await this.getMessageHistory(sessionId);\n return config;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passthrough.cjs","names":["Runnable","fields?: { func?: RunnablePassthroughFunc<RunInput> }","input: RunInput","options?: Partial<RunnableConfig>","ensureConfig","input","generator: AsyncGenerator<RunInput>","options: Partial<RunnableConfig>","finalOutput: RunInput | undefined","input: AsyncGenerator<RunInput>","concat","mapping: RunnableMapLike<RunInput, RunOutput>","RunnableAssign","RunnableMap"],"sources":["../../src/runnables/passthrough.ts"],"sourcesContent":["import { concat } from \"../utils/stream.js\";\nimport {\n Runnable,\n RunnableAssign,\n RunnableMap,\n RunnableMapLike,\n} from \"./base.js\";\nimport { ensureConfig, type RunnableConfig } from \"./config.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RunnablePassthroughFunc<RunInput = any> =\n | ((input: RunInput) => void)\n | ((input: RunInput, config?: RunnableConfig) => void)\n | ((input: RunInput) => Promise<void>)\n | ((input: RunInput, config?: RunnableConfig) => Promise<void>);\n\n/**\n * A runnable to passthrough inputs unchanged or with additional keys.\n *\n * This runnable behaves almost like the identity function, except that it\n * can be configured to add additional keys to the output, if the input is\n * an object.\n *\n * The example below demonstrates how to use `RunnablePassthrough to\n * passthrough the input from the `.invoke()`\n *\n * @example\n * ```typescript\n * const chain = RunnableSequence.from([\n * {\n * question: new RunnablePassthrough(),\n * context: async () => loadContextFromStore(),\n * },\n * prompt,\n * llm,\n * outputParser,\n * ]);\n * const response = await chain.invoke(\n * \"I can pass a single string instead of an object since I'm using `RunnablePassthrough`.\"\n * );\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class RunnablePassthrough<RunInput = any> extends Runnable<\n RunInput,\n RunInput\n> {\n static lc_name() {\n return \"RunnablePassthrough\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n func?: RunnablePassthroughFunc<RunInput>;\n\n constructor(fields?: { func?: RunnablePassthroughFunc<RunInput> }) {\n super(fields);\n if (fields) {\n this.func = fields.func;\n }\n }\n\n async invoke(\n input: RunInput,\n options?: Partial<RunnableConfig>\n ): Promise<RunInput> {\n const config = ensureConfig(options);\n if (this.func) {\n await this.func(input, config);\n }\n\n return this._callWithConfig(\n (input: RunInput) => Promise.resolve(input),\n input,\n config\n );\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: Partial<RunnableConfig>\n ): AsyncGenerator<RunInput> {\n const config = ensureConfig(options);\n let finalOutput: RunInput | undefined;\n let finalOutputSupported = true;\n\n for await (const chunk of this._transformStreamWithConfig(\n generator,\n (input: AsyncGenerator<RunInput>) => input,\n config\n )) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n finalOutput = concat(finalOutput, chunk as any);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n\n if (this.func && finalOutput !== undefined) {\n await this.func(finalOutput, config);\n }\n }\n\n /**\n * A runnable that assigns key-value pairs to the input.\n *\n * The example below shows how you could use it with an inline function.\n *\n * @example\n * ```typescript\n * const prompt =\n * PromptTemplate.fromTemplate(`Write a SQL query to answer the question using the following schema: {schema}\n * Question: {question}\n * SQL Query:`);\n *\n * // The `RunnablePassthrough.assign()` is used here to passthrough the input from the `.invoke()`\n * // call (in this example it's the question), along with any inputs passed to the `.assign()` method.\n * // In this case, we're passing the schema.\n * const sqlQueryGeneratorChain = RunnableSequence.from([\n * RunnablePassthrough.assign({\n * schema: async () => db.getTableInfo(),\n * }),\n * prompt,\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }).withConfig({ stop: [\"\\nSQLResult:\"] }),\n * new StringOutputParser(),\n * ]);\n * const result = await sqlQueryGeneratorChain.invoke({\n * question: \"How many employees are there?\",\n * });\n * ```\n */\n static assign<\n RunInput extends Record<string, unknown> = Record<string, unknown>,\n RunOutput extends Record<string, unknown> = Record<string, unknown
|
|
1
|
+
{"version":3,"file":"passthrough.cjs","names":["Runnable","fields?: { func?: RunnablePassthroughFunc<RunInput> }","input: RunInput","options?: Partial<RunnableConfig>","ensureConfig","input","generator: AsyncGenerator<RunInput>","options: Partial<RunnableConfig>","finalOutput: RunInput | undefined","input: AsyncGenerator<RunInput>","concat","mapping: RunnableMapLike<RunInput, RunOutput>","RunnableAssign","RunnableMap"],"sources":["../../src/runnables/passthrough.ts"],"sourcesContent":["import { concat } from \"../utils/stream.js\";\nimport {\n Runnable,\n RunnableAssign,\n RunnableMap,\n RunnableMapLike,\n} from \"./base.js\";\nimport { ensureConfig, type RunnableConfig } from \"./config.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RunnablePassthroughFunc<RunInput = any> =\n | ((input: RunInput) => void)\n | ((input: RunInput, config?: RunnableConfig) => void)\n | ((input: RunInput) => Promise<void>)\n | ((input: RunInput, config?: RunnableConfig) => Promise<void>);\n\n/**\n * A runnable to passthrough inputs unchanged or with additional keys.\n *\n * This runnable behaves almost like the identity function, except that it\n * can be configured to add additional keys to the output, if the input is\n * an object.\n *\n * The example below demonstrates how to use `RunnablePassthrough to\n * passthrough the input from the `.invoke()`\n *\n * @example\n * ```typescript\n * const chain = RunnableSequence.from([\n * {\n * question: new RunnablePassthrough(),\n * context: async () => loadContextFromStore(),\n * },\n * prompt,\n * llm,\n * outputParser,\n * ]);\n * const response = await chain.invoke(\n * \"I can pass a single string instead of an object since I'm using `RunnablePassthrough`.\"\n * );\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class RunnablePassthrough<RunInput = any> extends Runnable<\n RunInput,\n RunInput\n> {\n static lc_name() {\n return \"RunnablePassthrough\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n func?: RunnablePassthroughFunc<RunInput>;\n\n constructor(fields?: { func?: RunnablePassthroughFunc<RunInput> }) {\n super(fields);\n if (fields) {\n this.func = fields.func;\n }\n }\n\n async invoke(\n input: RunInput,\n options?: Partial<RunnableConfig>\n ): Promise<RunInput> {\n const config = ensureConfig(options);\n if (this.func) {\n await this.func(input, config);\n }\n\n return this._callWithConfig(\n (input: RunInput) => Promise.resolve(input),\n input,\n config\n );\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: Partial<RunnableConfig>\n ): AsyncGenerator<RunInput> {\n const config = ensureConfig(options);\n let finalOutput: RunInput | undefined;\n let finalOutputSupported = true;\n\n for await (const chunk of this._transformStreamWithConfig(\n generator,\n (input: AsyncGenerator<RunInput>) => input,\n config\n )) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n finalOutput = concat(finalOutput, chunk as any);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n\n if (this.func && finalOutput !== undefined) {\n await this.func(finalOutput, config);\n }\n }\n\n /**\n * A runnable that assigns key-value pairs to the input.\n *\n * The example below shows how you could use it with an inline function.\n *\n * @example\n * ```typescript\n * const prompt =\n * PromptTemplate.fromTemplate(`Write a SQL query to answer the question using the following schema: {schema}\n * Question: {question}\n * SQL Query:`);\n *\n * // The `RunnablePassthrough.assign()` is used here to passthrough the input from the `.invoke()`\n * // call (in this example it's the question), along with any inputs passed to the `.assign()` method.\n * // In this case, we're passing the schema.\n * const sqlQueryGeneratorChain = RunnableSequence.from([\n * RunnablePassthrough.assign({\n * schema: async () => db.getTableInfo(),\n * }),\n * prompt,\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }).withConfig({ stop: [\"\\nSQLResult:\"] }),\n * new StringOutputParser(),\n * ]);\n * const result = await sqlQueryGeneratorChain.invoke({\n * question: \"How many employees are there?\",\n * });\n * ```\n */\n static assign<\n RunInput extends Record<string, unknown> = Record<string, unknown>,\n RunOutput extends Record<string, unknown> = Record<string, unknown>,\n >(\n mapping: RunnableMapLike<RunInput, RunOutput>\n ): RunnableAssign<RunInput, RunInput & RunOutput> {\n return new RunnableAssign(new RunnableMap({ steps: mapping }));\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,sBAAb,cAAyDA,sBAGvD;CACA,OAAO,UAAU;AACf,SAAO;CACR;CAED,eAAe,CAAC,kBAAkB,WAAY;CAE9C,kBAAkB;CAElB;CAEA,YAAYC,QAAuD;EACjE,MAAM,OAAO;AACb,MAAI,QACF,KAAK,OAAO,OAAO;CAEtB;CAED,MAAM,OACJC,OACAC,SACmB;EACnB,MAAM,SAASC,4BAAa,QAAQ;AACpC,MAAI,KAAK,MACP,MAAM,KAAK,KAAK,OAAO,OAAO;AAGhC,SAAO,KAAK,gBACV,CAACF,YAAoB,QAAQ,QAAQG,QAAM,EAC3C,OACA,OACD;CACF;CAED,OAAO,UACLC,WACAC,SAC0B;EAC1B,MAAM,SAASH,4BAAa,QAAQ;EACpC,IAAII;EACJ,IAAI,uBAAuB;AAE3B,aAAW,MAAM,SAAS,KAAK,2BAC7B,WACA,CAACC,UAAoC,OACrC,OACD,EAAE;GACD,MAAM;AACN,OAAI,qBACF,KAAI,gBAAgB,QAClB,cAAc;OAEd,KAAI;IAEF,cAAcC,4BAAO,aAAa,MAAa;GAChD,QAAO;IACN,cAAc;IACd,uBAAuB;GACxB;EAGN;AAED,MAAI,KAAK,QAAQ,gBAAgB,QAC/B,MAAM,KAAK,KAAK,aAAa,OAAO;CAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BD,OAAO,OAILC,SACgD;AAChD,SAAO,IAAIC,4BAAe,IAAIC,yBAAY,EAAE,OAAO,QAAS;CAC7D;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passthrough.js","names":["fields?: { func?: RunnablePassthroughFunc<RunInput> }","input: RunInput","options?: Partial<RunnableConfig>","input","generator: AsyncGenerator<RunInput>","options: Partial<RunnableConfig>","finalOutput: RunInput | undefined","input: AsyncGenerator<RunInput>","mapping: RunnableMapLike<RunInput, RunOutput>"],"sources":["../../src/runnables/passthrough.ts"],"sourcesContent":["import { concat } from \"../utils/stream.js\";\nimport {\n Runnable,\n RunnableAssign,\n RunnableMap,\n RunnableMapLike,\n} from \"./base.js\";\nimport { ensureConfig, type RunnableConfig } from \"./config.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RunnablePassthroughFunc<RunInput = any> =\n | ((input: RunInput) => void)\n | ((input: RunInput, config?: RunnableConfig) => void)\n | ((input: RunInput) => Promise<void>)\n | ((input: RunInput, config?: RunnableConfig) => Promise<void>);\n\n/**\n * A runnable to passthrough inputs unchanged or with additional keys.\n *\n * This runnable behaves almost like the identity function, except that it\n * can be configured to add additional keys to the output, if the input is\n * an object.\n *\n * The example below demonstrates how to use `RunnablePassthrough to\n * passthrough the input from the `.invoke()`\n *\n * @example\n * ```typescript\n * const chain = RunnableSequence.from([\n * {\n * question: new RunnablePassthrough(),\n * context: async () => loadContextFromStore(),\n * },\n * prompt,\n * llm,\n * outputParser,\n * ]);\n * const response = await chain.invoke(\n * \"I can pass a single string instead of an object since I'm using `RunnablePassthrough`.\"\n * );\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class RunnablePassthrough<RunInput = any> extends Runnable<\n RunInput,\n RunInput\n> {\n static lc_name() {\n return \"RunnablePassthrough\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n func?: RunnablePassthroughFunc<RunInput>;\n\n constructor(fields?: { func?: RunnablePassthroughFunc<RunInput> }) {\n super(fields);\n if (fields) {\n this.func = fields.func;\n }\n }\n\n async invoke(\n input: RunInput,\n options?: Partial<RunnableConfig>\n ): Promise<RunInput> {\n const config = ensureConfig(options);\n if (this.func) {\n await this.func(input, config);\n }\n\n return this._callWithConfig(\n (input: RunInput) => Promise.resolve(input),\n input,\n config\n );\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: Partial<RunnableConfig>\n ): AsyncGenerator<RunInput> {\n const config = ensureConfig(options);\n let finalOutput: RunInput | undefined;\n let finalOutputSupported = true;\n\n for await (const chunk of this._transformStreamWithConfig(\n generator,\n (input: AsyncGenerator<RunInput>) => input,\n config\n )) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n finalOutput = concat(finalOutput, chunk as any);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n\n if (this.func && finalOutput !== undefined) {\n await this.func(finalOutput, config);\n }\n }\n\n /**\n * A runnable that assigns key-value pairs to the input.\n *\n * The example below shows how you could use it with an inline function.\n *\n * @example\n * ```typescript\n * const prompt =\n * PromptTemplate.fromTemplate(`Write a SQL query to answer the question using the following schema: {schema}\n * Question: {question}\n * SQL Query:`);\n *\n * // The `RunnablePassthrough.assign()` is used here to passthrough the input from the `.invoke()`\n * // call (in this example it's the question), along with any inputs passed to the `.assign()` method.\n * // In this case, we're passing the schema.\n * const sqlQueryGeneratorChain = RunnableSequence.from([\n * RunnablePassthrough.assign({\n * schema: async () => db.getTableInfo(),\n * }),\n * prompt,\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }).withConfig({ stop: [\"\\nSQLResult:\"] }),\n * new StringOutputParser(),\n * ]);\n * const result = await sqlQueryGeneratorChain.invoke({\n * question: \"How many employees are there?\",\n * });\n * ```\n */\n static assign<\n RunInput extends Record<string, unknown> = Record<string, unknown>,\n RunOutput extends Record<string, unknown> = Record<string, unknown
|
|
1
|
+
{"version":3,"file":"passthrough.js","names":["fields?: { func?: RunnablePassthroughFunc<RunInput> }","input: RunInput","options?: Partial<RunnableConfig>","input","generator: AsyncGenerator<RunInput>","options: Partial<RunnableConfig>","finalOutput: RunInput | undefined","input: AsyncGenerator<RunInput>","mapping: RunnableMapLike<RunInput, RunOutput>"],"sources":["../../src/runnables/passthrough.ts"],"sourcesContent":["import { concat } from \"../utils/stream.js\";\nimport {\n Runnable,\n RunnableAssign,\n RunnableMap,\n RunnableMapLike,\n} from \"./base.js\";\nimport { ensureConfig, type RunnableConfig } from \"./config.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RunnablePassthroughFunc<RunInput = any> =\n | ((input: RunInput) => void)\n | ((input: RunInput, config?: RunnableConfig) => void)\n | ((input: RunInput) => Promise<void>)\n | ((input: RunInput, config?: RunnableConfig) => Promise<void>);\n\n/**\n * A runnable to passthrough inputs unchanged or with additional keys.\n *\n * This runnable behaves almost like the identity function, except that it\n * can be configured to add additional keys to the output, if the input is\n * an object.\n *\n * The example below demonstrates how to use `RunnablePassthrough to\n * passthrough the input from the `.invoke()`\n *\n * @example\n * ```typescript\n * const chain = RunnableSequence.from([\n * {\n * question: new RunnablePassthrough(),\n * context: async () => loadContextFromStore(),\n * },\n * prompt,\n * llm,\n * outputParser,\n * ]);\n * const response = await chain.invoke(\n * \"I can pass a single string instead of an object since I'm using `RunnablePassthrough`.\"\n * );\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class RunnablePassthrough<RunInput = any> extends Runnable<\n RunInput,\n RunInput\n> {\n static lc_name() {\n return \"RunnablePassthrough\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n func?: RunnablePassthroughFunc<RunInput>;\n\n constructor(fields?: { func?: RunnablePassthroughFunc<RunInput> }) {\n super(fields);\n if (fields) {\n this.func = fields.func;\n }\n }\n\n async invoke(\n input: RunInput,\n options?: Partial<RunnableConfig>\n ): Promise<RunInput> {\n const config = ensureConfig(options);\n if (this.func) {\n await this.func(input, config);\n }\n\n return this._callWithConfig(\n (input: RunInput) => Promise.resolve(input),\n input,\n config\n );\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: Partial<RunnableConfig>\n ): AsyncGenerator<RunInput> {\n const config = ensureConfig(options);\n let finalOutput: RunInput | undefined;\n let finalOutputSupported = true;\n\n for await (const chunk of this._transformStreamWithConfig(\n generator,\n (input: AsyncGenerator<RunInput>) => input,\n config\n )) {\n yield chunk;\n if (finalOutputSupported) {\n if (finalOutput === undefined) {\n finalOutput = chunk;\n } else {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n finalOutput = concat(finalOutput, chunk as any);\n } catch {\n finalOutput = undefined;\n finalOutputSupported = false;\n }\n }\n }\n }\n\n if (this.func && finalOutput !== undefined) {\n await this.func(finalOutput, config);\n }\n }\n\n /**\n * A runnable that assigns key-value pairs to the input.\n *\n * The example below shows how you could use it with an inline function.\n *\n * @example\n * ```typescript\n * const prompt =\n * PromptTemplate.fromTemplate(`Write a SQL query to answer the question using the following schema: {schema}\n * Question: {question}\n * SQL Query:`);\n *\n * // The `RunnablePassthrough.assign()` is used here to passthrough the input from the `.invoke()`\n * // call (in this example it's the question), along with any inputs passed to the `.assign()` method.\n * // In this case, we're passing the schema.\n * const sqlQueryGeneratorChain = RunnableSequence.from([\n * RunnablePassthrough.assign({\n * schema: async () => db.getTableInfo(),\n * }),\n * prompt,\n * new ChatOpenAI({ model: \"gpt-4o-mini\" }).withConfig({ stop: [\"\\nSQLResult:\"] }),\n * new StringOutputParser(),\n * ]);\n * const result = await sqlQueryGeneratorChain.invoke({\n * question: \"How many employees are there?\",\n * });\n * ```\n */\n static assign<\n RunInput extends Record<string, unknown> = Record<string, unknown>,\n RunOutput extends Record<string, unknown> = Record<string, unknown>,\n >(\n mapping: RunnableMapLike<RunInput, RunOutput>\n ): RunnableAssign<RunInput, RunInput & RunOutput> {\n return new RunnableAssign(new RunnableMap({ steps: mapping }));\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,sBAAb,cAAyD,SAGvD;CACA,OAAO,UAAU;AACf,SAAO;CACR;CAED,eAAe,CAAC,kBAAkB,WAAY;CAE9C,kBAAkB;CAElB;CAEA,YAAYA,QAAuD;EACjE,MAAM,OAAO;AACb,MAAI,QACF,KAAK,OAAO,OAAO;CAEtB;CAED,MAAM,OACJC,OACAC,SACmB;EACnB,MAAM,SAAS,aAAa,QAAQ;AACpC,MAAI,KAAK,MACP,MAAM,KAAK,KAAK,OAAO,OAAO;AAGhC,SAAO,KAAK,gBACV,CAACD,YAAoB,QAAQ,QAAQE,QAAM,EAC3C,OACA,OACD;CACF;CAED,OAAO,UACLC,WACAC,SAC0B;EAC1B,MAAM,SAAS,aAAa,QAAQ;EACpC,IAAIC;EACJ,IAAI,uBAAuB;AAE3B,aAAW,MAAM,SAAS,KAAK,2BAC7B,WACA,CAACC,UAAoC,OACrC,OACD,EAAE;GACD,MAAM;AACN,OAAI,qBACF,KAAI,gBAAgB,QAClB,cAAc;OAEd,KAAI;IAEF,cAAc,OAAO,aAAa,MAAa;GAChD,QAAO;IACN,cAAc;IACd,uBAAuB;GACxB;EAGN;AAED,MAAI,KAAK,QAAQ,gBAAgB,QAC/B,MAAM,KAAK,KAAK,aAAa,OAAO;CAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BD,OAAO,OAILC,SACgD;AAChD,SAAO,IAAI,eAAe,IAAI,YAAY,EAAE,OAAO,QAAS;CAC7D;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.cjs","names":["Runnable","fields: {\n runnables: Record<string, Runnable<RunnableInput, RunOutput>>;\n }","input: RunInput","options?: Partial<RunnableConfig>","ensureConfig","inputs: RunInput[]","options?: Partial<RunnableConfig> | Partial<RunnableConfig>[]","batchOptions?: RunnableBatchOptions","i"],"sources":["../../src/runnables/router.ts"],"sourcesContent":["import { Runnable, type RunnableBatchOptions } from \"./base.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\nimport { ensureConfig, type RunnableConfig } from \"./config.js\";\n\nexport type RouterInput = {\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any;\n};\n\n/**\n * A runnable that routes to a set of runnables based on Input['key'].\n * Returns the output of the selected runnable.\n * @example\n * ```typescript\n * import { RouterRunnable, RunnableLambda } from \"@langchain/core/runnables\";\n *\n * const router = new RouterRunnable({\n * runnables: {\n * toUpperCase: RunnableLambda.from((text: string) => text.toUpperCase()),\n * reverseText: RunnableLambda.from((text: string) =>\n * text.split(\"\").reverse().join(\"\")\n * ),\n * },\n * });\n *\n * // Invoke the 'reverseText' runnable\n * const result1 = router.invoke({ key: \"reverseText\", input: \"Hello World\" });\n *\n * // \"dlroW olleH\"\n *\n * // Invoke the 'toUpperCase' runnable\n * const result2 = router.invoke({ key: \"toUpperCase\", input: \"Hello World\" });\n *\n * // \"HELLO WORLD\"\n * ```\n */\nexport class RouterRunnable<\n RunInput extends RouterInput,\n RunnableInput,\n RunOutput
|
|
1
|
+
{"version":3,"file":"router.cjs","names":["Runnable","fields: {\n runnables: Record<string, Runnable<RunnableInput, RunOutput>>;\n }","input: RunInput","options?: Partial<RunnableConfig>","ensureConfig","inputs: RunInput[]","options?: Partial<RunnableConfig> | Partial<RunnableConfig>[]","batchOptions?: RunnableBatchOptions","i"],"sources":["../../src/runnables/router.ts"],"sourcesContent":["import { Runnable, type RunnableBatchOptions } from \"./base.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\nimport { ensureConfig, type RunnableConfig } from \"./config.js\";\n\nexport type RouterInput = {\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any;\n};\n\n/**\n * A runnable that routes to a set of runnables based on Input['key'].\n * Returns the output of the selected runnable.\n * @example\n * ```typescript\n * import { RouterRunnable, RunnableLambda } from \"@langchain/core/runnables\";\n *\n * const router = new RouterRunnable({\n * runnables: {\n * toUpperCase: RunnableLambda.from((text: string) => text.toUpperCase()),\n * reverseText: RunnableLambda.from((text: string) =>\n * text.split(\"\").reverse().join(\"\")\n * ),\n * },\n * });\n *\n * // Invoke the 'reverseText' runnable\n * const result1 = router.invoke({ key: \"reverseText\", input: \"Hello World\" });\n *\n * // \"dlroW olleH\"\n *\n * // Invoke the 'toUpperCase' runnable\n * const result2 = router.invoke({ key: \"toUpperCase\", input: \"Hello World\" });\n *\n * // \"HELLO WORLD\"\n * ```\n */\nexport class RouterRunnable<\n RunInput extends RouterInput,\n RunnableInput,\n RunOutput,\n> extends Runnable<RunInput, RunOutput> {\n static lc_name() {\n return \"RouterRunnable\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n runnables: Record<string, Runnable<RunnableInput, RunOutput>>;\n\n constructor(fields: {\n runnables: Record<string, Runnable<RunnableInput, RunOutput>>;\n }) {\n super(fields);\n this.runnables = fields.runnables;\n }\n\n async invoke(\n input: RunInput,\n options?: Partial<RunnableConfig>\n ): Promise<RunOutput> {\n const { key, input: actualInput } = input;\n const runnable = this.runnables[key];\n if (runnable === undefined) {\n throw new Error(`No runnable associated with key \"${key}\".`);\n }\n return runnable.invoke(actualInput, ensureConfig(options));\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<RunnableConfig> | Partial<RunnableConfig>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<RunOutput[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<RunnableConfig> | Partial<RunnableConfig>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(RunOutput | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<RunnableConfig> | Partial<RunnableConfig>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(RunOutput | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<RunnableConfig> | Partial<RunnableConfig>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(RunOutput | Error)[]> {\n const keys = inputs.map((input) => input.key);\n const actualInputs = inputs.map((input) => input.input);\n const missingKey = keys.find((key) => this.runnables[key] === undefined);\n if (missingKey !== undefined) {\n throw new Error(`One or more keys do not have a corresponding runnable.`);\n }\n const runnables = keys.map((key) => this.runnables[key]);\n const optionsList = this._getOptionsList(options ?? {}, inputs.length);\n const maxConcurrency =\n optionsList[0]?.maxConcurrency ?? batchOptions?.maxConcurrency;\n const batchSize =\n maxConcurrency && maxConcurrency > 0 ? maxConcurrency : inputs.length;\n const batchResults = [];\n for (let i = 0; i < actualInputs.length; i += batchSize) {\n const batchPromises = actualInputs\n .slice(i, i + batchSize)\n .map((actualInput, i) =>\n runnables[i].invoke(actualInput, optionsList[i])\n );\n const batchResult = await Promise.all(batchPromises);\n batchResults.push(batchResult);\n }\n return batchResults.flat();\n }\n\n async stream(\n input: RunInput,\n options?: Partial<RunnableConfig>\n ): Promise<IterableReadableStream<RunOutput>> {\n const { key, input: actualInput } = input;\n const runnable = this.runnables[key];\n if (runnable === undefined) {\n throw new Error(`No runnable associated with key \"${key}\".`);\n }\n return runnable.stream(actualInput, options);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,IAAa,iBAAb,cAIUA,sBAA8B;CACtC,OAAO,UAAU;AACf,SAAO;CACR;CAED,eAAe,CAAC,kBAAkB,WAAY;CAE9C,kBAAkB;CAElB;CAEA,YAAYC,QAET;EACD,MAAM,OAAO;EACb,KAAK,YAAY,OAAO;CACzB;CAED,MAAM,OACJC,OACAC,SACoB;EACpB,MAAM,EAAE,KAAK,OAAO,aAAa,GAAG;EACpC,MAAM,WAAW,KAAK,UAAU;AAChC,MAAI,aAAa,OACf,OAAM,IAAI,MAAM,CAAC,iCAAiC,EAAE,IAAI,EAAE,CAAC;AAE7D,SAAO,SAAS,OAAO,aAAaC,4BAAa,QAAQ,CAAC;CAC3D;CAoBD,MAAM,MACJC,QACAC,SACAC,cACgC;EAChC,MAAM,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;EAC7C,MAAM,eAAe,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM;EACvD,MAAM,aAAa,KAAK,KAAK,CAAC,QAAQ,KAAK,UAAU,SAAS,OAAU;AACxE,MAAI,eAAe,OACjB,OAAM,IAAI,MAAM,CAAC,sDAAsD,CAAC;EAE1E,MAAM,YAAY,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,KAAK;EACxD,MAAM,cAAc,KAAK,gBAAgB,WAAW,CAAE,GAAE,OAAO,OAAO;EACtE,MAAM,iBACJ,YAAY,IAAI,kBAAkB,cAAc;EAClD,MAAM,YACJ,kBAAkB,iBAAiB,IAAI,iBAAiB,OAAO;EACjE,MAAM,eAAe,CAAE;AACvB,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,WAAW;GACvD,MAAM,gBAAgB,aACnB,MAAM,GAAG,IAAI,UAAU,CACvB,IAAI,CAAC,aAAaC,QACjB,UAAUA,KAAG,OAAO,aAAa,YAAYA,KAAG,CACjD;GACH,MAAM,cAAc,MAAM,QAAQ,IAAI,cAAc;GACpD,aAAa,KAAK,YAAY;EAC/B;AACD,SAAO,aAAa,MAAM;CAC3B;CAED,MAAM,OACJN,OACAC,SAC4C;EAC5C,MAAM,EAAE,KAAK,OAAO,aAAa,GAAG;EACpC,MAAM,WAAW,KAAK,UAAU;AAChC,MAAI,aAAa,OACf,OAAM,IAAI,MAAM,CAAC,iCAAiC,EAAE,IAAI,EAAE,CAAC;AAE7D,SAAO,SAAS,OAAO,aAAa,QAAQ;CAC7C;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","names":["fields: {\n runnables: Record<string, Runnable<RunnableInput, RunOutput>>;\n }","input: RunInput","options?: Partial<RunnableConfig>","inputs: RunInput[]","options?: Partial<RunnableConfig> | Partial<RunnableConfig>[]","batchOptions?: RunnableBatchOptions","i"],"sources":["../../src/runnables/router.ts"],"sourcesContent":["import { Runnable, type RunnableBatchOptions } from \"./base.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\nimport { ensureConfig, type RunnableConfig } from \"./config.js\";\n\nexport type RouterInput = {\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any;\n};\n\n/**\n * A runnable that routes to a set of runnables based on Input['key'].\n * Returns the output of the selected runnable.\n * @example\n * ```typescript\n * import { RouterRunnable, RunnableLambda } from \"@langchain/core/runnables\";\n *\n * const router = new RouterRunnable({\n * runnables: {\n * toUpperCase: RunnableLambda.from((text: string) => text.toUpperCase()),\n * reverseText: RunnableLambda.from((text: string) =>\n * text.split(\"\").reverse().join(\"\")\n * ),\n * },\n * });\n *\n * // Invoke the 'reverseText' runnable\n * const result1 = router.invoke({ key: \"reverseText\", input: \"Hello World\" });\n *\n * // \"dlroW olleH\"\n *\n * // Invoke the 'toUpperCase' runnable\n * const result2 = router.invoke({ key: \"toUpperCase\", input: \"Hello World\" });\n *\n * // \"HELLO WORLD\"\n * ```\n */\nexport class RouterRunnable<\n RunInput extends RouterInput,\n RunnableInput,\n RunOutput
|
|
1
|
+
{"version":3,"file":"router.js","names":["fields: {\n runnables: Record<string, Runnable<RunnableInput, RunOutput>>;\n }","input: RunInput","options?: Partial<RunnableConfig>","inputs: RunInput[]","options?: Partial<RunnableConfig> | Partial<RunnableConfig>[]","batchOptions?: RunnableBatchOptions","i"],"sources":["../../src/runnables/router.ts"],"sourcesContent":["import { Runnable, type RunnableBatchOptions } from \"./base.js\";\nimport { IterableReadableStream } from \"../utils/stream.js\";\nimport { ensureConfig, type RunnableConfig } from \"./config.js\";\n\nexport type RouterInput = {\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input: any;\n};\n\n/**\n * A runnable that routes to a set of runnables based on Input['key'].\n * Returns the output of the selected runnable.\n * @example\n * ```typescript\n * import { RouterRunnable, RunnableLambda } from \"@langchain/core/runnables\";\n *\n * const router = new RouterRunnable({\n * runnables: {\n * toUpperCase: RunnableLambda.from((text: string) => text.toUpperCase()),\n * reverseText: RunnableLambda.from((text: string) =>\n * text.split(\"\").reverse().join(\"\")\n * ),\n * },\n * });\n *\n * // Invoke the 'reverseText' runnable\n * const result1 = router.invoke({ key: \"reverseText\", input: \"Hello World\" });\n *\n * // \"dlroW olleH\"\n *\n * // Invoke the 'toUpperCase' runnable\n * const result2 = router.invoke({ key: \"toUpperCase\", input: \"Hello World\" });\n *\n * // \"HELLO WORLD\"\n * ```\n */\nexport class RouterRunnable<\n RunInput extends RouterInput,\n RunnableInput,\n RunOutput,\n> extends Runnable<RunInput, RunOutput> {\n static lc_name() {\n return \"RouterRunnable\";\n }\n\n lc_namespace = [\"langchain_core\", \"runnables\"];\n\n lc_serializable = true;\n\n runnables: Record<string, Runnable<RunnableInput, RunOutput>>;\n\n constructor(fields: {\n runnables: Record<string, Runnable<RunnableInput, RunOutput>>;\n }) {\n super(fields);\n this.runnables = fields.runnables;\n }\n\n async invoke(\n input: RunInput,\n options?: Partial<RunnableConfig>\n ): Promise<RunOutput> {\n const { key, input: actualInput } = input;\n const runnable = this.runnables[key];\n if (runnable === undefined) {\n throw new Error(`No runnable associated with key \"${key}\".`);\n }\n return runnable.invoke(actualInput, ensureConfig(options));\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<RunnableConfig> | Partial<RunnableConfig>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<RunOutput[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<RunnableConfig> | Partial<RunnableConfig>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(RunOutput | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<RunnableConfig> | Partial<RunnableConfig>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(RunOutput | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<RunnableConfig> | Partial<RunnableConfig>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(RunOutput | Error)[]> {\n const keys = inputs.map((input) => input.key);\n const actualInputs = inputs.map((input) => input.input);\n const missingKey = keys.find((key) => this.runnables[key] === undefined);\n if (missingKey !== undefined) {\n throw new Error(`One or more keys do not have a corresponding runnable.`);\n }\n const runnables = keys.map((key) => this.runnables[key]);\n const optionsList = this._getOptionsList(options ?? {}, inputs.length);\n const maxConcurrency =\n optionsList[0]?.maxConcurrency ?? batchOptions?.maxConcurrency;\n const batchSize =\n maxConcurrency && maxConcurrency > 0 ? maxConcurrency : inputs.length;\n const batchResults = [];\n for (let i = 0; i < actualInputs.length; i += batchSize) {\n const batchPromises = actualInputs\n .slice(i, i + batchSize)\n .map((actualInput, i) =>\n runnables[i].invoke(actualInput, optionsList[i])\n );\n const batchResult = await Promise.all(batchPromises);\n batchResults.push(batchResult);\n }\n return batchResults.flat();\n }\n\n async stream(\n input: RunInput,\n options?: Partial<RunnableConfig>\n ): Promise<IterableReadableStream<RunOutput>> {\n const { key, input: actualInput } = input;\n const runnable = this.runnables[key];\n if (runnable === undefined) {\n throw new Error(`No runnable associated with key \"${key}\".`);\n }\n return runnable.stream(actualInput, options);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,IAAa,iBAAb,cAIU,SAA8B;CACtC,OAAO,UAAU;AACf,SAAO;CACR;CAED,eAAe,CAAC,kBAAkB,WAAY;CAE9C,kBAAkB;CAElB;CAEA,YAAYA,QAET;EACD,MAAM,OAAO;EACb,KAAK,YAAY,OAAO;CACzB;CAED,MAAM,OACJC,OACAC,SACoB;EACpB,MAAM,EAAE,KAAK,OAAO,aAAa,GAAG;EACpC,MAAM,WAAW,KAAK,UAAU;AAChC,MAAI,aAAa,OACf,OAAM,IAAI,MAAM,CAAC,iCAAiC,EAAE,IAAI,EAAE,CAAC;AAE7D,SAAO,SAAS,OAAO,aAAa,aAAa,QAAQ,CAAC;CAC3D;CAoBD,MAAM,MACJC,QACAC,SACAC,cACgC;EAChC,MAAM,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;EAC7C,MAAM,eAAe,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM;EACvD,MAAM,aAAa,KAAK,KAAK,CAAC,QAAQ,KAAK,UAAU,SAAS,OAAU;AACxE,MAAI,eAAe,OACjB,OAAM,IAAI,MAAM,CAAC,sDAAsD,CAAC;EAE1E,MAAM,YAAY,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,KAAK;EACxD,MAAM,cAAc,KAAK,gBAAgB,WAAW,CAAE,GAAE,OAAO,OAAO;EACtE,MAAM,iBACJ,YAAY,IAAI,kBAAkB,cAAc;EAClD,MAAM,YACJ,kBAAkB,iBAAiB,IAAI,iBAAiB,OAAO;EACjE,MAAM,eAAe,CAAE;AACvB,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,WAAW;GACvD,MAAM,gBAAgB,aACnB,MAAM,GAAG,IAAI,UAAU,CACvB,IAAI,CAAC,aAAaC,QACjB,UAAUA,KAAG,OAAO,aAAa,YAAYA,KAAG,CACjD;GACH,MAAM,cAAc,MAAM,QAAQ,IAAI,cAAc;GACpD,aAAa,KAAK,YAAY;EAC/B;AACD,SAAO,aAAa,MAAM;CAC3B;CAED,MAAM,OACJL,OACAC,SAC4C;EAC5C,MAAM,EAAE,KAAK,OAAO,aAAa,GAAG;EACpC,MAAM,WAAW,KAAK,UAAU;AAChC,MAAI,aAAa,OACf,OAAM,IAAI,MAAM,CAAC,iCAAiC,EAAE,IAAI,EAAE,CAAC;AAE7D,SAAO,SAAS,OAAO,aAAa,QAAQ;CAC7C;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callbacks.cjs","names":["queue: typeof import(\"p-queue\")[\"default\"][\"prototype\"]","PQueue: any","PQueueMod","promiseFn: () => Promise<T> | T | void","wait: boolean","getGlobalAsyncLocalStorageInstance","getDefaultLangChainClientSingleton"],"sources":["../../src/singletons/callbacks.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport PQueueMod from \"p-queue\";\nimport { getGlobalAsyncLocalStorageInstance } from \"./async_local_storage/globals.js\";\nimport { getDefaultLangChainClientSingleton } from \"./tracer.js\";\n\nlet queue: typeof import(\"p-queue\")[\"default\"][\"prototype\"];\n\n/**\n * Creates a queue using the p-queue library. The queue is configured to\n * auto-start and has a concurrency of 1, meaning it will process tasks\n * one at a time.\n */\nfunction createQueue() {\n const PQueue: any = \"default\" in PQueueMod ? PQueueMod.default : PQueueMod;\n return new PQueue({\n autoStart: true,\n concurrency: 1,\n });\n}\n\nexport function getQueue() {\n if (typeof queue === \"undefined\") {\n queue = createQueue();\n }\n return queue;\n}\n\n/**\n * Consume a promise, either adding it to the queue or waiting for it to resolve\n * @param promiseFn Promise to consume\n * @param wait Whether to wait for the promise to resolve or resolve immediately\n */\nexport async function consumeCallback<T>(\n promiseFn: () => Promise<T> | T | void,\n wait: boolean\n): Promise<void> {\n if (wait === true) {\n // Clear config since callbacks are not part of the root run\n // Avoid using global singleton due to circuluar dependency issues\n const asyncLocalStorageInstance = getGlobalAsyncLocalStorageInstance();\n if (asyncLocalStorageInstance !== undefined) {\n await asyncLocalStorageInstance.run(undefined, async () => promiseFn());\n } else {\n await promiseFn();\n }\n } else {\n queue = getQueue();\n // eslint-disable-next-line no-void\n void queue.add(async () => {\n const asyncLocalStorageInstance = getGlobalAsyncLocalStorageInstance();\n if (asyncLocalStorageInstance !== undefined) {\n await asyncLocalStorageInstance.run(undefined, async () => promiseFn());\n } else {\n await promiseFn();\n }\n });\n }\n}\n\n/**\n * Waits for all promises in the queue to resolve. If the queue is\n * undefined, it immediately resolves a promise.\n */\nexport async function awaitAllCallbacks(): Promise<void> {\n const defaultClient = getDefaultLangChainClientSingleton();\n await Promise.allSettled([\n typeof queue !== \"undefined\" ? queue.onIdle() : Promise.resolve(),\n defaultClient.awaitPendingTraceBatches(),\n ]);\n}\n"],"mappings":";;;;;;AAMA,IAAIA;;;;;;AAOJ,SAAS,cAAc;CACrB,MAAMC,SAAc,aAAaC,kBAAYA,gBAAU,UAAUA;AACjE,QAAO,IAAI,OAAO;EAChB,WAAW;EACX,aAAa;CACd;AACF;AAED,SAAgB,WAAW;AACzB,KAAI,OAAO,UAAU,aACnB,QAAQ,aAAa;AAEvB,QAAO;AACR;;;;;;AAOD,eAAsB,gBACpBC,WACAC,MACe;AACf,KAAI,SAAS,MAAM;EAGjB,MAAM,4BAA4BC,oDAAoC;AACtE,MAAI,8BAA8B,QAChC,MAAM,0BAA0B,IAAI,QAAW,YAAY,WAAW,CAAC;OAEvE,MAAM,WAAW;CAEpB,OAAM;EACL,QAAQ,UAAU;EAEb,MAAM,IAAI,YAAY;GACzB,MAAM,4BAA4BA,oDAAoC;AACtE,OAAI,8BAA8B,QAChC,MAAM,0BAA0B,IAAI,QAAW,YAAY,WAAW,CAAC;QAEvE,MAAM,WAAW;EAEpB,EAAC;CACH;AACF;;;;;AAMD,eAAsB,oBAAmC;CACvD,MAAM,gBAAgBC,mDAAoC;CAC1D,MAAM,QAAQ,WAAW,CACvB,OAAO,UAAU,cAAc,MAAM,QAAQ,GAAG,QAAQ,SAAS,EACjE,cAAc,0BAA0B,AACzC,EAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"callbacks.cjs","names":["queue: (typeof import(\"p-queue\"))[\"default\"][\"prototype\"]","PQueue: any","PQueueMod","promiseFn: () => Promise<T> | T | void","wait: boolean","getGlobalAsyncLocalStorageInstance","getDefaultLangChainClientSingleton"],"sources":["../../src/singletons/callbacks.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport PQueueMod from \"p-queue\";\nimport { getGlobalAsyncLocalStorageInstance } from \"./async_local_storage/globals.js\";\nimport { getDefaultLangChainClientSingleton } from \"./tracer.js\";\n\nlet queue: (typeof import(\"p-queue\"))[\"default\"][\"prototype\"];\n\n/**\n * Creates a queue using the p-queue library. The queue is configured to\n * auto-start and has a concurrency of 1, meaning it will process tasks\n * one at a time.\n */\nfunction createQueue() {\n const PQueue: any = \"default\" in PQueueMod ? PQueueMod.default : PQueueMod;\n return new PQueue({\n autoStart: true,\n concurrency: 1,\n });\n}\n\nexport function getQueue() {\n if (typeof queue === \"undefined\") {\n queue = createQueue();\n }\n return queue;\n}\n\n/**\n * Consume a promise, either adding it to the queue or waiting for it to resolve\n * @param promiseFn Promise to consume\n * @param wait Whether to wait for the promise to resolve or resolve immediately\n */\nexport async function consumeCallback<T>(\n promiseFn: () => Promise<T> | T | void,\n wait: boolean\n): Promise<void> {\n if (wait === true) {\n // Clear config since callbacks are not part of the root run\n // Avoid using global singleton due to circuluar dependency issues\n const asyncLocalStorageInstance = getGlobalAsyncLocalStorageInstance();\n if (asyncLocalStorageInstance !== undefined) {\n await asyncLocalStorageInstance.run(undefined, async () => promiseFn());\n } else {\n await promiseFn();\n }\n } else {\n queue = getQueue();\n // eslint-disable-next-line no-void\n void queue.add(async () => {\n const asyncLocalStorageInstance = getGlobalAsyncLocalStorageInstance();\n if (asyncLocalStorageInstance !== undefined) {\n await asyncLocalStorageInstance.run(undefined, async () => promiseFn());\n } else {\n await promiseFn();\n }\n });\n }\n}\n\n/**\n * Waits for all promises in the queue to resolve. If the queue is\n * undefined, it immediately resolves a promise.\n */\nexport async function awaitAllCallbacks(): Promise<void> {\n const defaultClient = getDefaultLangChainClientSingleton();\n await Promise.allSettled([\n typeof queue !== \"undefined\" ? queue.onIdle() : Promise.resolve(),\n defaultClient.awaitPendingTraceBatches(),\n ]);\n}\n"],"mappings":";;;;;;AAMA,IAAIA;;;;;;AAOJ,SAAS,cAAc;CACrB,MAAMC,SAAc,aAAaC,kBAAYA,gBAAU,UAAUA;AACjE,QAAO,IAAI,OAAO;EAChB,WAAW;EACX,aAAa;CACd;AACF;AAED,SAAgB,WAAW;AACzB,KAAI,OAAO,UAAU,aACnB,QAAQ,aAAa;AAEvB,QAAO;AACR;;;;;;AAOD,eAAsB,gBACpBC,WACAC,MACe;AACf,KAAI,SAAS,MAAM;EAGjB,MAAM,4BAA4BC,oDAAoC;AACtE,MAAI,8BAA8B,QAChC,MAAM,0BAA0B,IAAI,QAAW,YAAY,WAAW,CAAC;OAEvE,MAAM,WAAW;CAEpB,OAAM;EACL,QAAQ,UAAU;EAEb,MAAM,IAAI,YAAY;GACzB,MAAM,4BAA4BA,oDAAoC;AACtE,OAAI,8BAA8B,QAChC,MAAM,0BAA0B,IAAI,QAAW,YAAY,WAAW,CAAC;QAEvE,MAAM,WAAW;EAEpB,EAAC;CACH;AACF;;;;;AAMD,eAAsB,oBAAmC;CACvD,MAAM,gBAAgBC,mDAAoC;CAC1D,MAAM,QAAQ,WAAW,CACvB,OAAO,UAAU,cAAc,MAAM,QAAQ,GAAG,QAAQ,SAAS,EACjE,cAAc,0BAA0B,AACzC,EAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callbacks.js","names":["queue: typeof import(\"p-queue\")[\"default\"][\"prototype\"]","PQueue: any","promiseFn: () => Promise<T> | T | void","wait: boolean"],"sources":["../../src/singletons/callbacks.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport PQueueMod from \"p-queue\";\nimport { getGlobalAsyncLocalStorageInstance } from \"./async_local_storage/globals.js\";\nimport { getDefaultLangChainClientSingleton } from \"./tracer.js\";\n\nlet queue: typeof import(\"p-queue\")[\"default\"][\"prototype\"];\n\n/**\n * Creates a queue using the p-queue library. The queue is configured to\n * auto-start and has a concurrency of 1, meaning it will process tasks\n * one at a time.\n */\nfunction createQueue() {\n const PQueue: any = \"default\" in PQueueMod ? PQueueMod.default : PQueueMod;\n return new PQueue({\n autoStart: true,\n concurrency: 1,\n });\n}\n\nexport function getQueue() {\n if (typeof queue === \"undefined\") {\n queue = createQueue();\n }\n return queue;\n}\n\n/**\n * Consume a promise, either adding it to the queue or waiting for it to resolve\n * @param promiseFn Promise to consume\n * @param wait Whether to wait for the promise to resolve or resolve immediately\n */\nexport async function consumeCallback<T>(\n promiseFn: () => Promise<T> | T | void,\n wait: boolean\n): Promise<void> {\n if (wait === true) {\n // Clear config since callbacks are not part of the root run\n // Avoid using global singleton due to circuluar dependency issues\n const asyncLocalStorageInstance = getGlobalAsyncLocalStorageInstance();\n if (asyncLocalStorageInstance !== undefined) {\n await asyncLocalStorageInstance.run(undefined, async () => promiseFn());\n } else {\n await promiseFn();\n }\n } else {\n queue = getQueue();\n // eslint-disable-next-line no-void\n void queue.add(async () => {\n const asyncLocalStorageInstance = getGlobalAsyncLocalStorageInstance();\n if (asyncLocalStorageInstance !== undefined) {\n await asyncLocalStorageInstance.run(undefined, async () => promiseFn());\n } else {\n await promiseFn();\n }\n });\n }\n}\n\n/**\n * Waits for all promises in the queue to resolve. If the queue is\n * undefined, it immediately resolves a promise.\n */\nexport async function awaitAllCallbacks(): Promise<void> {\n const defaultClient = getDefaultLangChainClientSingleton();\n await Promise.allSettled([\n typeof queue !== \"undefined\" ? queue.onIdle() : Promise.resolve(),\n defaultClient.awaitPendingTraceBatches(),\n ]);\n}\n"],"mappings":";;;;;AAMA,IAAIA;;;;;;AAOJ,SAAS,cAAc;CACrB,MAAMC,SAAc,aAAa,YAAY,UAAU,UAAU;AACjE,QAAO,IAAI,OAAO;EAChB,WAAW;EACX,aAAa;CACd;AACF;AAED,SAAgB,WAAW;AACzB,KAAI,OAAO,UAAU,aACnB,QAAQ,aAAa;AAEvB,QAAO;AACR;;;;;;AAOD,eAAsB,gBACpBC,WACAC,MACe;AACf,KAAI,SAAS,MAAM;EAGjB,MAAM,4BAA4B,oCAAoC;AACtE,MAAI,8BAA8B,QAChC,MAAM,0BAA0B,IAAI,QAAW,YAAY,WAAW,CAAC;OAEvE,MAAM,WAAW;CAEpB,OAAM;EACL,QAAQ,UAAU;EAEb,MAAM,IAAI,YAAY;GACzB,MAAM,4BAA4B,oCAAoC;AACtE,OAAI,8BAA8B,QAChC,MAAM,0BAA0B,IAAI,QAAW,YAAY,WAAW,CAAC;QAEvE,MAAM,WAAW;EAEpB,EAAC;CACH;AACF;;;;;AAMD,eAAsB,oBAAmC;CACvD,MAAM,gBAAgB,oCAAoC;CAC1D,MAAM,QAAQ,WAAW,CACvB,OAAO,UAAU,cAAc,MAAM,QAAQ,GAAG,QAAQ,SAAS,EACjE,cAAc,0BAA0B,AACzC,EAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"callbacks.js","names":["queue: (typeof import(\"p-queue\"))[\"default\"][\"prototype\"]","PQueue: any","promiseFn: () => Promise<T> | T | void","wait: boolean"],"sources":["../../src/singletons/callbacks.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport PQueueMod from \"p-queue\";\nimport { getGlobalAsyncLocalStorageInstance } from \"./async_local_storage/globals.js\";\nimport { getDefaultLangChainClientSingleton } from \"./tracer.js\";\n\nlet queue: (typeof import(\"p-queue\"))[\"default\"][\"prototype\"];\n\n/**\n * Creates a queue using the p-queue library. The queue is configured to\n * auto-start and has a concurrency of 1, meaning it will process tasks\n * one at a time.\n */\nfunction createQueue() {\n const PQueue: any = \"default\" in PQueueMod ? PQueueMod.default : PQueueMod;\n return new PQueue({\n autoStart: true,\n concurrency: 1,\n });\n}\n\nexport function getQueue() {\n if (typeof queue === \"undefined\") {\n queue = createQueue();\n }\n return queue;\n}\n\n/**\n * Consume a promise, either adding it to the queue or waiting for it to resolve\n * @param promiseFn Promise to consume\n * @param wait Whether to wait for the promise to resolve or resolve immediately\n */\nexport async function consumeCallback<T>(\n promiseFn: () => Promise<T> | T | void,\n wait: boolean\n): Promise<void> {\n if (wait === true) {\n // Clear config since callbacks are not part of the root run\n // Avoid using global singleton due to circuluar dependency issues\n const asyncLocalStorageInstance = getGlobalAsyncLocalStorageInstance();\n if (asyncLocalStorageInstance !== undefined) {\n await asyncLocalStorageInstance.run(undefined, async () => promiseFn());\n } else {\n await promiseFn();\n }\n } else {\n queue = getQueue();\n // eslint-disable-next-line no-void\n void queue.add(async () => {\n const asyncLocalStorageInstance = getGlobalAsyncLocalStorageInstance();\n if (asyncLocalStorageInstance !== undefined) {\n await asyncLocalStorageInstance.run(undefined, async () => promiseFn());\n } else {\n await promiseFn();\n }\n });\n }\n}\n\n/**\n * Waits for all promises in the queue to resolve. If the queue is\n * undefined, it immediately resolves a promise.\n */\nexport async function awaitAllCallbacks(): Promise<void> {\n const defaultClient = getDefaultLangChainClientSingleton();\n await Promise.allSettled([\n typeof queue !== \"undefined\" ? queue.onIdle() : Promise.resolve(),\n defaultClient.awaitPendingTraceBatches(),\n ]);\n}\n"],"mappings":";;;;;AAMA,IAAIA;;;;;;AAOJ,SAAS,cAAc;CACrB,MAAMC,SAAc,aAAa,YAAY,UAAU,UAAU;AACjE,QAAO,IAAI,OAAO;EAChB,WAAW;EACX,aAAa;CACd;AACF;AAED,SAAgB,WAAW;AACzB,KAAI,OAAO,UAAU,aACnB,QAAQ,aAAa;AAEvB,QAAO;AACR;;;;;;AAOD,eAAsB,gBACpBC,WACAC,MACe;AACf,KAAI,SAAS,MAAM;EAGjB,MAAM,4BAA4B,oCAAoC;AACtE,MAAI,8BAA8B,QAChC,MAAM,0BAA0B,IAAI,QAAW,YAAY,WAAW,CAAC;OAEvE,MAAM,WAAW;CAEpB,OAAM;EACL,QAAQ,UAAU;EAEb,MAAM,IAAI,YAAY;GACzB,MAAM,4BAA4B,oCAAoC;AACtE,OAAI,8BAA8B,QAChC,MAAM,0BAA0B,IAAI,QAAW,YAAY,WAAW,CAAC;QAEvE,MAAM,WAAW;EAEpB,EAAC;CACH;AACF;;;;;AAMD,eAAsB,oBAAmC;CACvD,MAAM,gBAAgB,oCAAoC;CAC1D,MAAM,QAAQ,WAAW,CACvB,OAAO,UAAU,cAAc,MAAM,QAAQ,GAAG,QAAQ,SAAS,EACjE,cAAc,0BAA0B,AACzC,EAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.cjs","names":["Visitor","opts?: TranslatorOpts","Operators","Comparators","func: Operator | Comparator","operation: Operation","comparison: Comparison","castValue","query: StructuredQuery","defaultFilter: VisitorStructuredQueryResult[\"filter\"] | undefined","generatedFilter: VisitorStructuredQueryResult[\"filter\"] | undefined","isFilterEmpty"],"sources":["../../src/structured_query/base.ts"],"sourcesContent":["import { VectorStore } from \"../vectorstores.js\";\nimport {\n Comparator,\n Comparators,\n Comparison,\n Operation,\n Operator,\n Operators,\n StructuredQuery,\n Visitor,\n VisitorComparisonResult,\n VisitorOperationResult,\n VisitorResult,\n VisitorStructuredQueryResult,\n} from \"./ir.js\";\nimport { isFilterEmpty, castValue } from \"./utils.js\";\n\n/**\n * Options object for the BasicTranslator class. Specifies the allowed\n * operators and comparators.\n */\nexport type TranslatorOpts = {\n allowedOperators: Operator[];\n allowedComparators: Comparator[];\n};\n\n/**\n * Abstract class that provides a blueprint for creating specific\n * translator classes. Defines two abstract methods: formatFunction and\n * mergeFilters.\n */\nexport abstract class BaseTranslator<\n T extends VectorStore = VectorStore
|
|
1
|
+
{"version":3,"file":"base.cjs","names":["Visitor","opts?: TranslatorOpts","Operators","Comparators","func: Operator | Comparator","operation: Operation","comparison: Comparison","castValue","query: StructuredQuery","defaultFilter: VisitorStructuredQueryResult[\"filter\"] | undefined","generatedFilter: VisitorStructuredQueryResult[\"filter\"] | undefined","isFilterEmpty"],"sources":["../../src/structured_query/base.ts"],"sourcesContent":["import { VectorStore } from \"../vectorstores.js\";\nimport {\n Comparator,\n Comparators,\n Comparison,\n Operation,\n Operator,\n Operators,\n StructuredQuery,\n Visitor,\n VisitorComparisonResult,\n VisitorOperationResult,\n VisitorResult,\n VisitorStructuredQueryResult,\n} from \"./ir.js\";\nimport { isFilterEmpty, castValue } from \"./utils.js\";\n\n/**\n * Options object for the BasicTranslator class. Specifies the allowed\n * operators and comparators.\n */\nexport type TranslatorOpts = {\n allowedOperators: Operator[];\n allowedComparators: Comparator[];\n};\n\n/**\n * Abstract class that provides a blueprint for creating specific\n * translator classes. Defines two abstract methods: formatFunction and\n * mergeFilters.\n */\nexport abstract class BaseTranslator<\n T extends VectorStore = VectorStore,\n> extends Visitor<T> {\n /**\n * Formats a given function (either an operator or a comparator) into a\n * string.\n * @param func The function to format.\n * @returns Formatted string representation of the function.\n */\n abstract formatFunction(func: Operator | Comparator): string;\n\n /**\n * Merges two filters into one, using a specified merge type.\n * @param defaultFilter The default filter.\n * @param generatedFilter The generated filter.\n * @param mergeType The type of merge to perform. Can be 'and', 'or', or 'replace'.\n * @param forceDefaultFilter If true, the default filter will be used even if the generated filter is not empty.\n * @returns The merged filter, or undefined if both filters are empty.\n */\n abstract mergeFilters(\n defaultFilter: this[\"VisitStructuredQueryOutput\"][\"filter\"] | undefined,\n generatedFilter: this[\"VisitStructuredQueryOutput\"][\"filter\"] | undefined,\n mergeType?: \"and\" | \"or\" | \"replace\",\n forceDefaultFilter?: boolean\n ): this[\"VisitStructuredQueryOutput\"][\"filter\"] | undefined;\n}\n\n/**\n * Class that extends the BaseTranslator class and provides concrete\n * implementations for the abstract methods. Also declares three types:\n * VisitOperationOutput, VisitComparisonOutput, and\n * VisitStructuredQueryOutput, which are used as the return types for the\n * visitOperation, visitComparison, and visitStructuredQuery methods\n * respectively.\n */\nexport class BasicTranslator<\n T extends VectorStore = VectorStore,\n> extends BaseTranslator<T> {\n declare VisitOperationOutput: VisitorOperationResult;\n\n declare VisitComparisonOutput: VisitorComparisonResult;\n\n declare VisitStructuredQueryOutput: VisitorStructuredQueryResult;\n\n allowedOperators: Operator[];\n\n allowedComparators: Comparator[];\n\n constructor(opts?: TranslatorOpts) {\n super();\n this.allowedOperators = opts?.allowedOperators ?? [\n Operators.and,\n Operators.or,\n ];\n this.allowedComparators = opts?.allowedComparators ?? [\n Comparators.eq,\n Comparators.ne,\n Comparators.gt,\n Comparators.gte,\n Comparators.lt,\n Comparators.lte,\n ];\n }\n\n formatFunction(func: Operator | Comparator): string {\n if (func in Comparators) {\n if (\n this.allowedComparators.length > 0 &&\n this.allowedComparators.indexOf(func as Comparator) === -1\n ) {\n throw new Error(\n `Comparator ${func} not allowed. Allowed comparators: ${this.allowedComparators.join(\n \", \"\n )}`\n );\n }\n } else if (func in Operators) {\n if (\n this.allowedOperators.length > 0 &&\n this.allowedOperators.indexOf(func as Operator) === -1\n ) {\n throw new Error(\n `Operator ${func} not allowed. Allowed operators: ${this.allowedOperators.join(\n \", \"\n )}`\n );\n }\n } else {\n throw new Error(\"Unknown comparator or operator\");\n }\n return `$${func}`;\n }\n\n /**\n * Visits an operation and returns a result.\n * @param operation The operation to visit.\n * @returns The result of visiting the operation.\n */\n visitOperation(operation: Operation): this[\"VisitOperationOutput\"] {\n const args = operation.args?.map((arg) =>\n arg.accept(this)\n ) as VisitorResult[];\n return {\n [this.formatFunction(operation.operator)]: args,\n };\n }\n\n /**\n * Visits a comparison and returns a result.\n * @param comparison The comparison to visit.\n * @returns The result of visiting the comparison.\n */\n visitComparison(comparison: Comparison): this[\"VisitComparisonOutput\"] {\n return {\n [comparison.attribute]: {\n [this.formatFunction(comparison.comparator)]: castValue(\n comparison.value\n ),\n },\n };\n }\n\n /**\n * Visits a structured query and returns a result.\n * @param query The structured query to visit.\n * @returns The result of visiting the structured query.\n */\n visitStructuredQuery(\n query: StructuredQuery\n ): this[\"VisitStructuredQueryOutput\"] {\n let nextArg = {};\n if (query.filter) {\n nextArg = {\n filter: query.filter.accept(this),\n };\n }\n return nextArg;\n }\n\n mergeFilters(\n defaultFilter: VisitorStructuredQueryResult[\"filter\"] | undefined,\n generatedFilter: VisitorStructuredQueryResult[\"filter\"] | undefined,\n mergeType = \"and\",\n forceDefaultFilter = false\n ): VisitorStructuredQueryResult[\"filter\"] | undefined {\n if (isFilterEmpty(defaultFilter) && isFilterEmpty(generatedFilter)) {\n return undefined;\n }\n if (isFilterEmpty(defaultFilter) || mergeType === \"replace\") {\n if (isFilterEmpty(generatedFilter)) {\n return undefined;\n }\n return generatedFilter;\n }\n if (isFilterEmpty(generatedFilter)) {\n if (forceDefaultFilter) {\n return defaultFilter;\n }\n if (mergeType === \"and\") {\n return undefined;\n }\n return defaultFilter;\n }\n if (mergeType === \"and\") {\n return {\n $and: [defaultFilter, generatedFilter],\n };\n } else if (mergeType === \"or\") {\n return {\n $or: [defaultFilter, generatedFilter],\n };\n } else {\n throw new Error(\"Unknown merge type\");\n }\n }\n}\n"],"mappings":";;;;;;;;;AA+BA,IAAsB,iBAAtB,cAEUA,mBAAW,CAuBpB;;;;;;;;;AAUD,IAAa,kBAAb,cAEU,eAAkB;CAO1B;CAEA;CAEA,YAAYC,MAAuB;EACjC,OAAO;EACP,KAAK,mBAAmB,MAAM,oBAAoB,CAChDC,qBAAU,KACVA,qBAAU,EACX;EACD,KAAK,qBAAqB,MAAM,sBAAsB;GACpDC,uBAAY;GACZA,uBAAY;GACZA,uBAAY;GACZA,uBAAY;GACZA,uBAAY;GACZA,uBAAY;EACb;CACF;CAED,eAAeC,MAAqC;AAClD,MAAI,QAAQD,wBACV;OACE,KAAK,mBAAmB,SAAS,KACjC,KAAK,mBAAmB,QAAQ,KAAmB,KAAK,GAExD,OAAM,IAAI,MACR,CAAC,WAAW,EAAE,KAAK,mCAAmC,EAAE,KAAK,mBAAmB,KAC9E,KACD,EAAE;EAEN,WACQ,QAAQD,sBACjB;OACE,KAAK,iBAAiB,SAAS,KAC/B,KAAK,iBAAiB,QAAQ,KAAiB,KAAK,GAEpD,OAAM,IAAI,MACR,CAAC,SAAS,EAAE,KAAK,iCAAiC,EAAE,KAAK,iBAAiB,KACxE,KACD,EAAE;EAEN,MAED,OAAM,IAAI,MAAM;AAElB,SAAO,CAAC,CAAC,EAAE,MAAM;CAClB;;;;;;CAOD,eAAeG,WAAoD;EACjE,MAAM,OAAO,UAAU,MAAM,IAAI,CAAC,QAChC,IAAI,OAAO,KAAK,CACjB;AACD,SAAO,GACJ,KAAK,eAAe,UAAU,SAAS,GAAG,KAC5C;CACF;;;;;;CAOD,gBAAgBC,YAAuD;AACrE,SAAO,GACJ,WAAW,YAAY,GACrB,KAAK,eAAe,WAAW,WAAW,GAAGC,wBAC5C,WAAW,MACZ,CACF,EACF;CACF;;;;;;CAOD,qBACEC,OACoC;EACpC,IAAI,UAAU,CAAE;AAChB,MAAI,MAAM,QACR,UAAU,EACR,QAAQ,MAAM,OAAO,OAAO,KAAK,CAClC;AAEH,SAAO;CACR;CAED,aACEC,eACAC,iBACA,YAAY,OACZ,qBAAqB,OAC+B;AACpD,MAAIC,4BAAc,cAAc,IAAIA,4BAAc,gBAAgB,CAChE,QAAO;AAET,MAAIA,4BAAc,cAAc,IAAI,cAAc,WAAW;AAC3D,OAAIA,4BAAc,gBAAgB,CAChC,QAAO;AAET,UAAO;EACR;AACD,MAAIA,4BAAc,gBAAgB,EAAE;AAClC,OAAI,mBACF,QAAO;AAET,OAAI,cAAc,MAChB,QAAO;AAET,UAAO;EACR;AACD,MAAI,cAAc,MAChB,QAAO,EACL,MAAM,CAAC,eAAe,eAAgB,EACvC;WACQ,cAAc,KACvB,QAAO,EACL,KAAK,CAAC,eAAe,eAAgB,EACtC;MAED,OAAM,IAAI,MAAM;CAEnB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","names":["opts?: TranslatorOpts","func: Operator | Comparator","operation: Operation","comparison: Comparison","query: StructuredQuery","defaultFilter: VisitorStructuredQueryResult[\"filter\"] | undefined","generatedFilter: VisitorStructuredQueryResult[\"filter\"] | undefined"],"sources":["../../src/structured_query/base.ts"],"sourcesContent":["import { VectorStore } from \"../vectorstores.js\";\nimport {\n Comparator,\n Comparators,\n Comparison,\n Operation,\n Operator,\n Operators,\n StructuredQuery,\n Visitor,\n VisitorComparisonResult,\n VisitorOperationResult,\n VisitorResult,\n VisitorStructuredQueryResult,\n} from \"./ir.js\";\nimport { isFilterEmpty, castValue } from \"./utils.js\";\n\n/**\n * Options object for the BasicTranslator class. Specifies the allowed\n * operators and comparators.\n */\nexport type TranslatorOpts = {\n allowedOperators: Operator[];\n allowedComparators: Comparator[];\n};\n\n/**\n * Abstract class that provides a blueprint for creating specific\n * translator classes. Defines two abstract methods: formatFunction and\n * mergeFilters.\n */\nexport abstract class BaseTranslator<\n T extends VectorStore = VectorStore
|
|
1
|
+
{"version":3,"file":"base.js","names":["opts?: TranslatorOpts","func: Operator | Comparator","operation: Operation","comparison: Comparison","query: StructuredQuery","defaultFilter: VisitorStructuredQueryResult[\"filter\"] | undefined","generatedFilter: VisitorStructuredQueryResult[\"filter\"] | undefined"],"sources":["../../src/structured_query/base.ts"],"sourcesContent":["import { VectorStore } from \"../vectorstores.js\";\nimport {\n Comparator,\n Comparators,\n Comparison,\n Operation,\n Operator,\n Operators,\n StructuredQuery,\n Visitor,\n VisitorComparisonResult,\n VisitorOperationResult,\n VisitorResult,\n VisitorStructuredQueryResult,\n} from \"./ir.js\";\nimport { isFilterEmpty, castValue } from \"./utils.js\";\n\n/**\n * Options object for the BasicTranslator class. Specifies the allowed\n * operators and comparators.\n */\nexport type TranslatorOpts = {\n allowedOperators: Operator[];\n allowedComparators: Comparator[];\n};\n\n/**\n * Abstract class that provides a blueprint for creating specific\n * translator classes. Defines two abstract methods: formatFunction and\n * mergeFilters.\n */\nexport abstract class BaseTranslator<\n T extends VectorStore = VectorStore,\n> extends Visitor<T> {\n /**\n * Formats a given function (either an operator or a comparator) into a\n * string.\n * @param func The function to format.\n * @returns Formatted string representation of the function.\n */\n abstract formatFunction(func: Operator | Comparator): string;\n\n /**\n * Merges two filters into one, using a specified merge type.\n * @param defaultFilter The default filter.\n * @param generatedFilter The generated filter.\n * @param mergeType The type of merge to perform. Can be 'and', 'or', or 'replace'.\n * @param forceDefaultFilter If true, the default filter will be used even if the generated filter is not empty.\n * @returns The merged filter, or undefined if both filters are empty.\n */\n abstract mergeFilters(\n defaultFilter: this[\"VisitStructuredQueryOutput\"][\"filter\"] | undefined,\n generatedFilter: this[\"VisitStructuredQueryOutput\"][\"filter\"] | undefined,\n mergeType?: \"and\" | \"or\" | \"replace\",\n forceDefaultFilter?: boolean\n ): this[\"VisitStructuredQueryOutput\"][\"filter\"] | undefined;\n}\n\n/**\n * Class that extends the BaseTranslator class and provides concrete\n * implementations for the abstract methods. Also declares three types:\n * VisitOperationOutput, VisitComparisonOutput, and\n * VisitStructuredQueryOutput, which are used as the return types for the\n * visitOperation, visitComparison, and visitStructuredQuery methods\n * respectively.\n */\nexport class BasicTranslator<\n T extends VectorStore = VectorStore,\n> extends BaseTranslator<T> {\n declare VisitOperationOutput: VisitorOperationResult;\n\n declare VisitComparisonOutput: VisitorComparisonResult;\n\n declare VisitStructuredQueryOutput: VisitorStructuredQueryResult;\n\n allowedOperators: Operator[];\n\n allowedComparators: Comparator[];\n\n constructor(opts?: TranslatorOpts) {\n super();\n this.allowedOperators = opts?.allowedOperators ?? [\n Operators.and,\n Operators.or,\n ];\n this.allowedComparators = opts?.allowedComparators ?? [\n Comparators.eq,\n Comparators.ne,\n Comparators.gt,\n Comparators.gte,\n Comparators.lt,\n Comparators.lte,\n ];\n }\n\n formatFunction(func: Operator | Comparator): string {\n if (func in Comparators) {\n if (\n this.allowedComparators.length > 0 &&\n this.allowedComparators.indexOf(func as Comparator) === -1\n ) {\n throw new Error(\n `Comparator ${func} not allowed. Allowed comparators: ${this.allowedComparators.join(\n \", \"\n )}`\n );\n }\n } else if (func in Operators) {\n if (\n this.allowedOperators.length > 0 &&\n this.allowedOperators.indexOf(func as Operator) === -1\n ) {\n throw new Error(\n `Operator ${func} not allowed. Allowed operators: ${this.allowedOperators.join(\n \", \"\n )}`\n );\n }\n } else {\n throw new Error(\"Unknown comparator or operator\");\n }\n return `$${func}`;\n }\n\n /**\n * Visits an operation and returns a result.\n * @param operation The operation to visit.\n * @returns The result of visiting the operation.\n */\n visitOperation(operation: Operation): this[\"VisitOperationOutput\"] {\n const args = operation.args?.map((arg) =>\n arg.accept(this)\n ) as VisitorResult[];\n return {\n [this.formatFunction(operation.operator)]: args,\n };\n }\n\n /**\n * Visits a comparison and returns a result.\n * @param comparison The comparison to visit.\n * @returns The result of visiting the comparison.\n */\n visitComparison(comparison: Comparison): this[\"VisitComparisonOutput\"] {\n return {\n [comparison.attribute]: {\n [this.formatFunction(comparison.comparator)]: castValue(\n comparison.value\n ),\n },\n };\n }\n\n /**\n * Visits a structured query and returns a result.\n * @param query The structured query to visit.\n * @returns The result of visiting the structured query.\n */\n visitStructuredQuery(\n query: StructuredQuery\n ): this[\"VisitStructuredQueryOutput\"] {\n let nextArg = {};\n if (query.filter) {\n nextArg = {\n filter: query.filter.accept(this),\n };\n }\n return nextArg;\n }\n\n mergeFilters(\n defaultFilter: VisitorStructuredQueryResult[\"filter\"] | undefined,\n generatedFilter: VisitorStructuredQueryResult[\"filter\"] | undefined,\n mergeType = \"and\",\n forceDefaultFilter = false\n ): VisitorStructuredQueryResult[\"filter\"] | undefined {\n if (isFilterEmpty(defaultFilter) && isFilterEmpty(generatedFilter)) {\n return undefined;\n }\n if (isFilterEmpty(defaultFilter) || mergeType === \"replace\") {\n if (isFilterEmpty(generatedFilter)) {\n return undefined;\n }\n return generatedFilter;\n }\n if (isFilterEmpty(generatedFilter)) {\n if (forceDefaultFilter) {\n return defaultFilter;\n }\n if (mergeType === \"and\") {\n return undefined;\n }\n return defaultFilter;\n }\n if (mergeType === \"and\") {\n return {\n $and: [defaultFilter, generatedFilter],\n };\n } else if (mergeType === \"or\") {\n return {\n $or: [defaultFilter, generatedFilter],\n };\n } else {\n throw new Error(\"Unknown merge type\");\n }\n }\n}\n"],"mappings":";;;;;;;;;AA+BA,IAAsB,iBAAtB,cAEU,QAAW,CAuBpB;;;;;;;;;AAUD,IAAa,kBAAb,cAEU,eAAkB;CAO1B;CAEA;CAEA,YAAYA,MAAuB;EACjC,OAAO;EACP,KAAK,mBAAmB,MAAM,oBAAoB,CAChD,UAAU,KACV,UAAU,EACX;EACD,KAAK,qBAAqB,MAAM,sBAAsB;GACpD,YAAY;GACZ,YAAY;GACZ,YAAY;GACZ,YAAY;GACZ,YAAY;GACZ,YAAY;EACb;CACF;CAED,eAAeC,MAAqC;AAClD,MAAI,QAAQ,aACV;OACE,KAAK,mBAAmB,SAAS,KACjC,KAAK,mBAAmB,QAAQ,KAAmB,KAAK,GAExD,OAAM,IAAI,MACR,CAAC,WAAW,EAAE,KAAK,mCAAmC,EAAE,KAAK,mBAAmB,KAC9E,KACD,EAAE;EAEN,WACQ,QAAQ,WACjB;OACE,KAAK,iBAAiB,SAAS,KAC/B,KAAK,iBAAiB,QAAQ,KAAiB,KAAK,GAEpD,OAAM,IAAI,MACR,CAAC,SAAS,EAAE,KAAK,iCAAiC,EAAE,KAAK,iBAAiB,KACxE,KACD,EAAE;EAEN,MAED,OAAM,IAAI,MAAM;AAElB,SAAO,CAAC,CAAC,EAAE,MAAM;CAClB;;;;;;CAOD,eAAeC,WAAoD;EACjE,MAAM,OAAO,UAAU,MAAM,IAAI,CAAC,QAChC,IAAI,OAAO,KAAK,CACjB;AACD,SAAO,GACJ,KAAK,eAAe,UAAU,SAAS,GAAG,KAC5C;CACF;;;;;;CAOD,gBAAgBC,YAAuD;AACrE,SAAO,GACJ,WAAW,YAAY,GACrB,KAAK,eAAe,WAAW,WAAW,GAAG,UAC5C,WAAW,MACZ,CACF,EACF;CACF;;;;;;CAOD,qBACEC,OACoC;EACpC,IAAI,UAAU,CAAE;AAChB,MAAI,MAAM,QACR,UAAU,EACR,QAAQ,MAAM,OAAO,OAAO,KAAK,CAClC;AAEH,SAAO;CACR;CAED,aACEC,eACAC,iBACA,YAAY,OACZ,qBAAqB,OAC+B;AACpD,MAAI,cAAc,cAAc,IAAI,cAAc,gBAAgB,CAChE,QAAO;AAET,MAAI,cAAc,cAAc,IAAI,cAAc,WAAW;AAC3D,OAAI,cAAc,gBAAgB,CAChC,QAAO;AAET,UAAO;EACR;AACD,MAAI,cAAc,gBAAgB,EAAE;AAClC,OAAI,mBACF,QAAO;AAET,OAAI,cAAc,MAChB,QAAO;AAET,UAAO;EACR;AACD,MAAI,cAAc,MAChB,QAAO,EACL,MAAM,CAAC,eAAe,eAAgB,EACvC;WACQ,cAAc,KACvB,QAAO,EACL,KAAK,CAAC,eAAe,eAAgB,EACtC;MAED,OAAM,IAAI,MAAM;CAEnB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ir.cjs","names":["Operators: { [key: string]: Operator }","Comparators: { [key: string]: Comparator }","visitor: Visitor","comparator: Comparator","attribute: string","value: ValueTypes","operator: Operator","args?: FilterDirective[]","query: string","filter?: FilterDirective"],"sources":["../../src/structured_query/ir.ts"],"sourcesContent":["import { VectorStore } from \"../vectorstores.js\";\n\n/**\n * Represents logical AND operator.\n */\nexport type AND = \"and\";\n/**\n * Represents logical OR operator.\n */\nexport type OR = \"or\";\n/**\n * Represents logical NOT operator.\n */\nexport type NOT = \"not\";\n\n/**\n * Represents a logical operator which can be AND, OR, or NOT.\n */\nexport type Operator = AND | OR | NOT;\n\n/**\n * Represents equality comparison operator.\n */\nexport type EQ = \"eq\";\n/**\n * Represents inequality comparison operator.\n */\nexport type NE = \"ne\";\n/**\n * Represents less than comparison operator.\n */\nexport type LT = \"lt\";\n/**\n * Represents greater than comparison operator.\n */\nexport type GT = \"gt\";\n/**\n * Represents less than or equal to comparison operator.\n */\nexport type LTE = \"lte\";\n/**\n * Represents greater than or equal to comparison operator.\n */\nexport type GTE = \"gte\";\n\n/**\n * Represents a comparison operator which can be EQ, NE, LT, GT, LTE, or\n * GTE.\n */\nexport type Comparator = EQ | NE | LT | GT | LTE | GTE;\n\nexport const Operators: { [key: string]: Operator } = {\n and: \"and\",\n or: \"or\",\n not: \"not\",\n};\n\nexport const Comparators: { [key: string]: Comparator } = {\n eq: \"eq\",\n ne: \"ne\",\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n};\n\n/**\n * Represents the result of visiting an operation or comparison\n * expression.\n */\nexport type VisitorResult = VisitorOperationResult | VisitorComparisonResult;\n\n/**\n * Represents the result of visiting an operation expression.\n */\nexport type VisitorOperationResult = {\n [operator: string]: VisitorResult[];\n};\n\n/**\n * Represents the result of visiting a comparison expression.\n */\nexport type VisitorComparisonResult = {\n [attr: string]: {\n [comparator: string]: string | number | boolean;\n };\n};\n\n/**\n * Represents the result of visiting a structured query expression.\n */\nexport type VisitorStructuredQueryResult = {\n filter?: VisitorComparisonResult | VisitorOperationResult;\n};\n\n/**\n * Abstract class for visiting expressions. Subclasses must implement\n * visitOperation, visitComparison, and visitStructuredQuery methods.\n */\nexport abstract class Visitor<T extends VectorStore = VectorStore> {\n declare VisitOperationOutput: object;\n\n declare VisitComparisonOutput: object;\n\n declare VisitStructuredQueryOutput: { filter?: T[\"FilterType\"] };\n\n abstract allowedOperators: Operator[];\n\n abstract allowedComparators: Comparator[];\n\n abstract visitOperation(operation: Operation): this[\"VisitOperationOutput\"];\n\n abstract visitComparison(\n comparison: Comparison\n ): this[\"VisitComparisonOutput\"];\n\n abstract visitStructuredQuery(\n structuredQuery: StructuredQuery\n ): this[\"VisitStructuredQueryOutput\"];\n}\n\n/**\n * Abstract class representing an expression. Subclasses must implement\n * the exprName property and the accept method.\n */\nexport abstract class Expression {\n abstract exprName: \"Operation\" | \"Comparison\" | \"StructuredQuery\";\n\n accept(visitor: Visitor) {\n if (this.exprName === \"Operation\") {\n return visitor.visitOperation(this as unknown as Operation);\n } else if (this.exprName === \"Comparison\") {\n return visitor.visitComparison(this as unknown as Comparison);\n } else if (this.exprName === \"StructuredQuery\") {\n return visitor.visitStructuredQuery(this as unknown as StructuredQuery);\n } else {\n throw new Error(\"Unknown Expression type\");\n }\n }\n}\n\n/**\n * Abstract class representing a filter directive. It extends the\n * Expression class.\n */\nexport abstract class FilterDirective extends Expression {}\n\n/**\n * Class representing a comparison filter directive. It extends the\n * FilterDirective class.\n */\nexport class Comparison<ValueTypes = string | number> extends FilterDirective {\n exprName = \"Comparison\" as const;\n\n constructor(\n public comparator: Comparator,\n public attribute: string,\n public value: ValueTypes\n ) {\n super();\n }\n}\n\n/**\n * Class representing an operation filter directive. It extends the\n * FilterDirective class.\n */\nexport class Operation extends FilterDirective {\n exprName = \"Operation\" as const;\n\n constructor(public operator: Operator
|
|
1
|
+
{"version":3,"file":"ir.cjs","names":["Operators: { [key: string]: Operator }","Comparators: { [key: string]: Comparator }","visitor: Visitor","comparator: Comparator","attribute: string","value: ValueTypes","operator: Operator","args?: FilterDirective[]","query: string","filter?: FilterDirective"],"sources":["../../src/structured_query/ir.ts"],"sourcesContent":["import { VectorStore } from \"../vectorstores.js\";\n\n/**\n * Represents logical AND operator.\n */\nexport type AND = \"and\";\n/**\n * Represents logical OR operator.\n */\nexport type OR = \"or\";\n/**\n * Represents logical NOT operator.\n */\nexport type NOT = \"not\";\n\n/**\n * Represents a logical operator which can be AND, OR, or NOT.\n */\nexport type Operator = AND | OR | NOT;\n\n/**\n * Represents equality comparison operator.\n */\nexport type EQ = \"eq\";\n/**\n * Represents inequality comparison operator.\n */\nexport type NE = \"ne\";\n/**\n * Represents less than comparison operator.\n */\nexport type LT = \"lt\";\n/**\n * Represents greater than comparison operator.\n */\nexport type GT = \"gt\";\n/**\n * Represents less than or equal to comparison operator.\n */\nexport type LTE = \"lte\";\n/**\n * Represents greater than or equal to comparison operator.\n */\nexport type GTE = \"gte\";\n\n/**\n * Represents a comparison operator which can be EQ, NE, LT, GT, LTE, or\n * GTE.\n */\nexport type Comparator = EQ | NE | LT | GT | LTE | GTE;\n\nexport const Operators: { [key: string]: Operator } = {\n and: \"and\",\n or: \"or\",\n not: \"not\",\n};\n\nexport const Comparators: { [key: string]: Comparator } = {\n eq: \"eq\",\n ne: \"ne\",\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n};\n\n/**\n * Represents the result of visiting an operation or comparison\n * expression.\n */\nexport type VisitorResult = VisitorOperationResult | VisitorComparisonResult;\n\n/**\n * Represents the result of visiting an operation expression.\n */\nexport type VisitorOperationResult = {\n [operator: string]: VisitorResult[];\n};\n\n/**\n * Represents the result of visiting a comparison expression.\n */\nexport type VisitorComparisonResult = {\n [attr: string]: {\n [comparator: string]: string | number | boolean;\n };\n};\n\n/**\n * Represents the result of visiting a structured query expression.\n */\nexport type VisitorStructuredQueryResult = {\n filter?: VisitorComparisonResult | VisitorOperationResult;\n};\n\n/**\n * Abstract class for visiting expressions. Subclasses must implement\n * visitOperation, visitComparison, and visitStructuredQuery methods.\n */\nexport abstract class Visitor<T extends VectorStore = VectorStore> {\n declare VisitOperationOutput: object;\n\n declare VisitComparisonOutput: object;\n\n declare VisitStructuredQueryOutput: { filter?: T[\"FilterType\"] };\n\n abstract allowedOperators: Operator[];\n\n abstract allowedComparators: Comparator[];\n\n abstract visitOperation(operation: Operation): this[\"VisitOperationOutput\"];\n\n abstract visitComparison(\n comparison: Comparison\n ): this[\"VisitComparisonOutput\"];\n\n abstract visitStructuredQuery(\n structuredQuery: StructuredQuery\n ): this[\"VisitStructuredQueryOutput\"];\n}\n\n/**\n * Abstract class representing an expression. Subclasses must implement\n * the exprName property and the accept method.\n */\nexport abstract class Expression {\n abstract exprName: \"Operation\" | \"Comparison\" | \"StructuredQuery\";\n\n accept(visitor: Visitor) {\n if (this.exprName === \"Operation\") {\n return visitor.visitOperation(this as unknown as Operation);\n } else if (this.exprName === \"Comparison\") {\n return visitor.visitComparison(this as unknown as Comparison);\n } else if (this.exprName === \"StructuredQuery\") {\n return visitor.visitStructuredQuery(this as unknown as StructuredQuery);\n } else {\n throw new Error(\"Unknown Expression type\");\n }\n }\n}\n\n/**\n * Abstract class representing a filter directive. It extends the\n * Expression class.\n */\nexport abstract class FilterDirective extends Expression {}\n\n/**\n * Class representing a comparison filter directive. It extends the\n * FilterDirective class.\n */\nexport class Comparison<ValueTypes = string | number> extends FilterDirective {\n exprName = \"Comparison\" as const;\n\n constructor(\n public comparator: Comparator,\n public attribute: string,\n public value: ValueTypes\n ) {\n super();\n }\n}\n\n/**\n * Class representing an operation filter directive. It extends the\n * FilterDirective class.\n */\nexport class Operation extends FilterDirective {\n exprName = \"Operation\" as const;\n\n constructor(\n public operator: Operator,\n public args?: FilterDirective[]\n ) {\n super();\n }\n}\n\n/**\n * Class representing a structured query expression. It extends the\n * Expression class.\n */\nexport class StructuredQuery extends Expression {\n exprName = \"StructuredQuery\" as const;\n\n constructor(\n public query: string,\n public filter?: FilterDirective\n ) {\n super();\n }\n}\n"],"mappings":";;AAmDA,MAAaA,YAAyC;CACpD,KAAK;CACL,IAAI;CACJ,KAAK;AACN;AAED,MAAaC,cAA6C;CACxD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,KAAK;AACN;;;;;AAmCD,IAAsB,UAAtB,MAAmE,CAoBlE;;;;;AAMD,IAAsB,aAAtB,MAAiC;CAG/B,OAAOC,SAAkB;AACvB,MAAI,KAAK,aAAa,YACpB,QAAO,QAAQ,eAAe,KAA6B;WAClD,KAAK,aAAa,aAC3B,QAAO,QAAQ,gBAAgB,KAA8B;WACpD,KAAK,aAAa,kBAC3B,QAAO,QAAQ,qBAAqB,KAAmC;MAEvE,OAAM,IAAI,MAAM;CAEnB;AACF;;;;;AAMD,IAAsB,kBAAtB,cAA8C,WAAW,CAAE;;;;;AAM3D,IAAa,aAAb,cAA8D,gBAAgB;CAC5E,WAAW;CAEX,YACSC,YACAC,WACAC,OACP;EACA,OAAO;EAJA;EACA;EACA;CAGR;AACF;;;;;AAMD,IAAa,YAAb,cAA+B,gBAAgB;CAC7C,WAAW;CAEX,YACSC,UACAC,MACP;EACA,OAAO;EAHA;EACA;CAGR;AACF;;;;;AAMD,IAAa,kBAAb,cAAqC,WAAW;CAC9C,WAAW;CAEX,YACSC,OACAC,QACP;EACA,OAAO;EAHA;EACA;CAGR;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ir.js","names":["Operators: { [key: string]: Operator }","Comparators: { [key: string]: Comparator }","visitor: Visitor","comparator: Comparator","attribute: string","value: ValueTypes","operator: Operator","args?: FilterDirective[]","query: string","filter?: FilterDirective"],"sources":["../../src/structured_query/ir.ts"],"sourcesContent":["import { VectorStore } from \"../vectorstores.js\";\n\n/**\n * Represents logical AND operator.\n */\nexport type AND = \"and\";\n/**\n * Represents logical OR operator.\n */\nexport type OR = \"or\";\n/**\n * Represents logical NOT operator.\n */\nexport type NOT = \"not\";\n\n/**\n * Represents a logical operator which can be AND, OR, or NOT.\n */\nexport type Operator = AND | OR | NOT;\n\n/**\n * Represents equality comparison operator.\n */\nexport type EQ = \"eq\";\n/**\n * Represents inequality comparison operator.\n */\nexport type NE = \"ne\";\n/**\n * Represents less than comparison operator.\n */\nexport type LT = \"lt\";\n/**\n * Represents greater than comparison operator.\n */\nexport type GT = \"gt\";\n/**\n * Represents less than or equal to comparison operator.\n */\nexport type LTE = \"lte\";\n/**\n * Represents greater than or equal to comparison operator.\n */\nexport type GTE = \"gte\";\n\n/**\n * Represents a comparison operator which can be EQ, NE, LT, GT, LTE, or\n * GTE.\n */\nexport type Comparator = EQ | NE | LT | GT | LTE | GTE;\n\nexport const Operators: { [key: string]: Operator } = {\n and: \"and\",\n or: \"or\",\n not: \"not\",\n};\n\nexport const Comparators: { [key: string]: Comparator } = {\n eq: \"eq\",\n ne: \"ne\",\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n};\n\n/**\n * Represents the result of visiting an operation or comparison\n * expression.\n */\nexport type VisitorResult = VisitorOperationResult | VisitorComparisonResult;\n\n/**\n * Represents the result of visiting an operation expression.\n */\nexport type VisitorOperationResult = {\n [operator: string]: VisitorResult[];\n};\n\n/**\n * Represents the result of visiting a comparison expression.\n */\nexport type VisitorComparisonResult = {\n [attr: string]: {\n [comparator: string]: string | number | boolean;\n };\n};\n\n/**\n * Represents the result of visiting a structured query expression.\n */\nexport type VisitorStructuredQueryResult = {\n filter?: VisitorComparisonResult | VisitorOperationResult;\n};\n\n/**\n * Abstract class for visiting expressions. Subclasses must implement\n * visitOperation, visitComparison, and visitStructuredQuery methods.\n */\nexport abstract class Visitor<T extends VectorStore = VectorStore> {\n declare VisitOperationOutput: object;\n\n declare VisitComparisonOutput: object;\n\n declare VisitStructuredQueryOutput: { filter?: T[\"FilterType\"] };\n\n abstract allowedOperators: Operator[];\n\n abstract allowedComparators: Comparator[];\n\n abstract visitOperation(operation: Operation): this[\"VisitOperationOutput\"];\n\n abstract visitComparison(\n comparison: Comparison\n ): this[\"VisitComparisonOutput\"];\n\n abstract visitStructuredQuery(\n structuredQuery: StructuredQuery\n ): this[\"VisitStructuredQueryOutput\"];\n}\n\n/**\n * Abstract class representing an expression. Subclasses must implement\n * the exprName property and the accept method.\n */\nexport abstract class Expression {\n abstract exprName: \"Operation\" | \"Comparison\" | \"StructuredQuery\";\n\n accept(visitor: Visitor) {\n if (this.exprName === \"Operation\") {\n return visitor.visitOperation(this as unknown as Operation);\n } else if (this.exprName === \"Comparison\") {\n return visitor.visitComparison(this as unknown as Comparison);\n } else if (this.exprName === \"StructuredQuery\") {\n return visitor.visitStructuredQuery(this as unknown as StructuredQuery);\n } else {\n throw new Error(\"Unknown Expression type\");\n }\n }\n}\n\n/**\n * Abstract class representing a filter directive. It extends the\n * Expression class.\n */\nexport abstract class FilterDirective extends Expression {}\n\n/**\n * Class representing a comparison filter directive. It extends the\n * FilterDirective class.\n */\nexport class Comparison<ValueTypes = string | number> extends FilterDirective {\n exprName = \"Comparison\" as const;\n\n constructor(\n public comparator: Comparator,\n public attribute: string,\n public value: ValueTypes\n ) {\n super();\n }\n}\n\n/**\n * Class representing an operation filter directive. It extends the\n * FilterDirective class.\n */\nexport class Operation extends FilterDirective {\n exprName = \"Operation\" as const;\n\n constructor(public operator: Operator
|
|
1
|
+
{"version":3,"file":"ir.js","names":["Operators: { [key: string]: Operator }","Comparators: { [key: string]: Comparator }","visitor: Visitor","comparator: Comparator","attribute: string","value: ValueTypes","operator: Operator","args?: FilterDirective[]","query: string","filter?: FilterDirective"],"sources":["../../src/structured_query/ir.ts"],"sourcesContent":["import { VectorStore } from \"../vectorstores.js\";\n\n/**\n * Represents logical AND operator.\n */\nexport type AND = \"and\";\n/**\n * Represents logical OR operator.\n */\nexport type OR = \"or\";\n/**\n * Represents logical NOT operator.\n */\nexport type NOT = \"not\";\n\n/**\n * Represents a logical operator which can be AND, OR, or NOT.\n */\nexport type Operator = AND | OR | NOT;\n\n/**\n * Represents equality comparison operator.\n */\nexport type EQ = \"eq\";\n/**\n * Represents inequality comparison operator.\n */\nexport type NE = \"ne\";\n/**\n * Represents less than comparison operator.\n */\nexport type LT = \"lt\";\n/**\n * Represents greater than comparison operator.\n */\nexport type GT = \"gt\";\n/**\n * Represents less than or equal to comparison operator.\n */\nexport type LTE = \"lte\";\n/**\n * Represents greater than or equal to comparison operator.\n */\nexport type GTE = \"gte\";\n\n/**\n * Represents a comparison operator which can be EQ, NE, LT, GT, LTE, or\n * GTE.\n */\nexport type Comparator = EQ | NE | LT | GT | LTE | GTE;\n\nexport const Operators: { [key: string]: Operator } = {\n and: \"and\",\n or: \"or\",\n not: \"not\",\n};\n\nexport const Comparators: { [key: string]: Comparator } = {\n eq: \"eq\",\n ne: \"ne\",\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n};\n\n/**\n * Represents the result of visiting an operation or comparison\n * expression.\n */\nexport type VisitorResult = VisitorOperationResult | VisitorComparisonResult;\n\n/**\n * Represents the result of visiting an operation expression.\n */\nexport type VisitorOperationResult = {\n [operator: string]: VisitorResult[];\n};\n\n/**\n * Represents the result of visiting a comparison expression.\n */\nexport type VisitorComparisonResult = {\n [attr: string]: {\n [comparator: string]: string | number | boolean;\n };\n};\n\n/**\n * Represents the result of visiting a structured query expression.\n */\nexport type VisitorStructuredQueryResult = {\n filter?: VisitorComparisonResult | VisitorOperationResult;\n};\n\n/**\n * Abstract class for visiting expressions. Subclasses must implement\n * visitOperation, visitComparison, and visitStructuredQuery methods.\n */\nexport abstract class Visitor<T extends VectorStore = VectorStore> {\n declare VisitOperationOutput: object;\n\n declare VisitComparisonOutput: object;\n\n declare VisitStructuredQueryOutput: { filter?: T[\"FilterType\"] };\n\n abstract allowedOperators: Operator[];\n\n abstract allowedComparators: Comparator[];\n\n abstract visitOperation(operation: Operation): this[\"VisitOperationOutput\"];\n\n abstract visitComparison(\n comparison: Comparison\n ): this[\"VisitComparisonOutput\"];\n\n abstract visitStructuredQuery(\n structuredQuery: StructuredQuery\n ): this[\"VisitStructuredQueryOutput\"];\n}\n\n/**\n * Abstract class representing an expression. Subclasses must implement\n * the exprName property and the accept method.\n */\nexport abstract class Expression {\n abstract exprName: \"Operation\" | \"Comparison\" | \"StructuredQuery\";\n\n accept(visitor: Visitor) {\n if (this.exprName === \"Operation\") {\n return visitor.visitOperation(this as unknown as Operation);\n } else if (this.exprName === \"Comparison\") {\n return visitor.visitComparison(this as unknown as Comparison);\n } else if (this.exprName === \"StructuredQuery\") {\n return visitor.visitStructuredQuery(this as unknown as StructuredQuery);\n } else {\n throw new Error(\"Unknown Expression type\");\n }\n }\n}\n\n/**\n * Abstract class representing a filter directive. It extends the\n * Expression class.\n */\nexport abstract class FilterDirective extends Expression {}\n\n/**\n * Class representing a comparison filter directive. It extends the\n * FilterDirective class.\n */\nexport class Comparison<ValueTypes = string | number> extends FilterDirective {\n exprName = \"Comparison\" as const;\n\n constructor(\n public comparator: Comparator,\n public attribute: string,\n public value: ValueTypes\n ) {\n super();\n }\n}\n\n/**\n * Class representing an operation filter directive. It extends the\n * FilterDirective class.\n */\nexport class Operation extends FilterDirective {\n exprName = \"Operation\" as const;\n\n constructor(\n public operator: Operator,\n public args?: FilterDirective[]\n ) {\n super();\n }\n}\n\n/**\n * Class representing a structured query expression. It extends the\n * Expression class.\n */\nexport class StructuredQuery extends Expression {\n exprName = \"StructuredQuery\" as const;\n\n constructor(\n public query: string,\n public filter?: FilterDirective\n ) {\n super();\n }\n}\n"],"mappings":";AAmDA,MAAaA,YAAyC;CACpD,KAAK;CACL,IAAI;CACJ,KAAK;AACN;AAED,MAAaC,cAA6C;CACxD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,KAAK;AACN;;;;;AAmCD,IAAsB,UAAtB,MAAmE,CAoBlE;;;;;AAMD,IAAsB,aAAtB,MAAiC;CAG/B,OAAOC,SAAkB;AACvB,MAAI,KAAK,aAAa,YACpB,QAAO,QAAQ,eAAe,KAA6B;WAClD,KAAK,aAAa,aAC3B,QAAO,QAAQ,gBAAgB,KAA8B;WACpD,KAAK,aAAa,kBAC3B,QAAO,QAAQ,qBAAqB,KAAmC;MAEvE,OAAM,IAAI,MAAM;CAEnB;AACF;;;;;AAMD,IAAsB,kBAAtB,cAA8C,WAAW,CAAE;;;;;AAM3D,IAAa,aAAb,cAA8D,gBAAgB;CAC5E,WAAW;CAEX,YACSC,YACAC,WACAC,OACP;EACA,OAAO;EAJA;EACA;EACA;CAGR;AACF;;;;;AAMD,IAAa,YAAb,cAA+B,gBAAgB;CAC7C,WAAW;CAEX,YACSC,UACAC,MACP;EACA,OAAO;EAHA;EACA;CAGR;AACF;;;;;AAMD,IAAa,kBAAb,cAAqC,WAAW;CAC9C,WAAW;CAEX,YACSC,OACAC,QACP;EACA,OAAO;EAHA;EACA;CAGR;AACF"}
|