@langchain/classic 1.0.44 → 1.0.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/_virtual/_rolldown/runtime.cjs +1 -1
  3. package/dist/agents/agent.cjs.map +1 -1
  4. package/dist/agents/chat/index.cjs +2 -1
  5. package/dist/agents/chat/index.cjs.map +1 -1
  6. package/dist/agents/chat/index.js +2 -1
  7. package/dist/agents/chat/index.js.map +1 -1
  8. package/dist/agents/chat_convo/index.cjs +7 -5
  9. package/dist/agents/chat_convo/index.cjs.map +1 -1
  10. package/dist/agents/chat_convo/index.js +7 -5
  11. package/dist/agents/chat_convo/index.js.map +1 -1
  12. package/dist/agents/chat_convo/outputParser.cjs.map +1 -1
  13. package/dist/agents/executor.cjs +22 -19
  14. package/dist/agents/executor.cjs.map +1 -1
  15. package/dist/agents/executor.js +22 -19
  16. package/dist/agents/executor.js.map +1 -1
  17. package/dist/agents/format_scratchpad/log_to_message.cjs.map +1 -1
  18. package/dist/agents/format_scratchpad/openai_functions.cjs.map +1 -1
  19. package/dist/agents/mrkl/index.cjs +9 -6
  20. package/dist/agents/mrkl/index.cjs.map +1 -1
  21. package/dist/agents/mrkl/index.js +9 -6
  22. package/dist/agents/mrkl/index.js.map +1 -1
  23. package/dist/agents/mrkl/outputParser.d.cts +1 -1
  24. package/dist/agents/openai_functions/index.cjs +2 -1
  25. package/dist/agents/openai_functions/index.cjs.map +1 -1
  26. package/dist/agents/openai_functions/index.js +2 -1
  27. package/dist/agents/openai_functions/index.js.map +1 -1
  28. package/dist/agents/openai_functions/output_parser.cjs.map +1 -1
  29. package/dist/agents/openai_tools/index.cjs.map +1 -1
  30. package/dist/agents/openai_tools/output_parser.cjs.map +1 -1
  31. package/dist/agents/react/output_parser.cjs.map +1 -1
  32. package/dist/agents/structured_chat/index.cjs +6 -5
  33. package/dist/agents/structured_chat/index.cjs.map +1 -1
  34. package/dist/agents/structured_chat/index.js +6 -5
  35. package/dist/agents/structured_chat/index.js.map +1 -1
  36. package/dist/agents/structured_chat/outputParser.cjs.map +1 -1
  37. package/dist/agents/tool_calling/output_parser.cjs.map +1 -1
  38. package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.cjs.map +1 -1
  39. package/dist/agents/toolkits/conversational_retrieval/tool.cjs +2 -1
  40. package/dist/agents/toolkits/conversational_retrieval/tool.cjs.map +1 -1
  41. package/dist/agents/toolkits/conversational_retrieval/tool.js +2 -1
  42. package/dist/agents/toolkits/conversational_retrieval/tool.js.map +1 -1
  43. package/dist/agents/toolkits/json/json.cjs +10 -8
  44. package/dist/agents/toolkits/json/json.cjs.map +1 -1
  45. package/dist/agents/toolkits/json/json.js +10 -8
  46. package/dist/agents/toolkits/json/json.js.map +1 -1
  47. package/dist/agents/toolkits/openapi/openapi.cjs +12 -9
  48. package/dist/agents/toolkits/openapi/openapi.cjs.map +1 -1
  49. package/dist/agents/toolkits/openapi/openapi.js +12 -9
  50. package/dist/agents/toolkits/openapi/openapi.js.map +1 -1
  51. package/dist/agents/toolkits/sql/sql.cjs +10 -8
  52. package/dist/agents/toolkits/sql/sql.cjs.map +1 -1
  53. package/dist/agents/toolkits/sql/sql.js +10 -8
  54. package/dist/agents/toolkits/sql/sql.js.map +1 -1
  55. package/dist/agents/toolkits/vectorstore/vectorstore.cjs +20 -16
  56. package/dist/agents/toolkits/vectorstore/vectorstore.cjs.map +1 -1
  57. package/dist/agents/toolkits/vectorstore/vectorstore.js +20 -16
  58. package/dist/agents/toolkits/vectorstore/vectorstore.js.map +1 -1
  59. package/dist/agents/xml/index.cjs +2 -1
  60. package/dist/agents/xml/index.cjs.map +1 -1
  61. package/dist/agents/xml/index.js +2 -1
  62. package/dist/agents/xml/index.js.map +1 -1
  63. package/dist/chains/base.cjs.map +1 -1
  64. package/dist/chains/chat_vector_db_chain.cjs +2 -1
  65. package/dist/chains/chat_vector_db_chain.cjs.map +1 -1
  66. package/dist/chains/chat_vector_db_chain.js +2 -1
  67. package/dist/chains/chat_vector_db_chain.js.map +1 -1
  68. package/dist/chains/conversational_retrieval_chain.cjs +2 -1
  69. package/dist/chains/conversational_retrieval_chain.cjs.map +1 -1
  70. package/dist/chains/conversational_retrieval_chain.js +2 -1
  71. package/dist/chains/conversational_retrieval_chain.js.map +1 -1
  72. package/dist/chains/openai_functions/base.cjs.map +1 -1
  73. package/dist/chains/openai_functions/extraction.cjs.map +1 -1
  74. package/dist/chains/openai_functions/openapi.cjs +9 -8
  75. package/dist/chains/openai_functions/openapi.cjs.map +1 -1
  76. package/dist/chains/openai_functions/openapi.js +9 -8
  77. package/dist/chains/openai_functions/openapi.js.map +1 -1
  78. package/dist/chains/openai_functions/tagging.cjs.map +1 -1
  79. package/dist/chains/openai_moderation.cjs.map +1 -1
  80. package/dist/chains/query_constructor/index.cjs +15 -9
  81. package/dist/chains/query_constructor/index.cjs.map +1 -1
  82. package/dist/chains/query_constructor/index.js +15 -9
  83. package/dist/chains/query_constructor/index.js.map +1 -1
  84. package/dist/chains/query_constructor/parser.cjs +12 -6
  85. package/dist/chains/query_constructor/parser.cjs.map +1 -1
  86. package/dist/chains/query_constructor/parser.js +12 -6
  87. package/dist/chains/query_constructor/parser.js.map +1 -1
  88. package/dist/chains/question_answering/load.cjs +35 -29
  89. package/dist/chains/question_answering/load.cjs.map +1 -1
  90. package/dist/chains/question_answering/load.js +35 -29
  91. package/dist/chains/question_answering/load.js.map +1 -1
  92. package/dist/chains/router/multi_prompt.cjs +5 -3
  93. package/dist/chains/router/multi_prompt.cjs.map +1 -1
  94. package/dist/chains/router/multi_prompt.js +5 -3
  95. package/dist/chains/router/multi_prompt.js.map +1 -1
  96. package/dist/chains/router/multi_retrieval_qa.cjs +18 -11
  97. package/dist/chains/router/multi_retrieval_qa.cjs.map +1 -1
  98. package/dist/chains/router/multi_retrieval_qa.js +18 -11
  99. package/dist/chains/router/multi_retrieval_qa.js.map +1 -1
  100. package/dist/chains/sequential_chain.cjs +6 -5
  101. package/dist/chains/sequential_chain.cjs.map +1 -1
  102. package/dist/chains/sequential_chain.js +6 -5
  103. package/dist/chains/sequential_chain.js.map +1 -1
  104. package/dist/chains/sql_db/sql_db_chain.cjs +2 -1
  105. package/dist/chains/sql_db/sql_db_chain.cjs.map +1 -1
  106. package/dist/chains/sql_db/sql_db_chain.js +2 -1
  107. package/dist/chains/sql_db/sql_db_chain.js.map +1 -1
  108. package/dist/chains/summarization/load.cjs +35 -29
  109. package/dist/chains/summarization/load.cjs.map +1 -1
  110. package/dist/chains/summarization/load.js +35 -29
  111. package/dist/chains/summarization/load.js.map +1 -1
  112. package/dist/chat_models/universal.cjs +12 -10
  113. package/dist/chat_models/universal.cjs.map +1 -1
  114. package/dist/chat_models/universal.js +12 -10
  115. package/dist/chat_models/universal.js.map +1 -1
  116. package/dist/document_loaders/fs/buffer.cjs.map +1 -1
  117. package/dist/document_loaders/fs/directory.cjs.map +1 -1
  118. package/dist/document_loaders/fs/multi_file.cjs.map +1 -1
  119. package/dist/document_loaders/fs/text.cjs.map +1 -1
  120. package/dist/document_transformers/openai_functions.cjs.map +1 -1
  121. package/dist/embeddings/cache_backed.cjs.map +1 -1
  122. package/dist/evaluation/comparison/pairwise.cjs +4 -2
  123. package/dist/evaluation/comparison/pairwise.cjs.map +1 -1
  124. package/dist/evaluation/comparison/pairwise.js +4 -2
  125. package/dist/evaluation/comparison/pairwise.js.map +1 -1
  126. package/dist/evaluation/criteria/criteria.cjs +4 -2
  127. package/dist/evaluation/criteria/criteria.cjs.map +1 -1
  128. package/dist/evaluation/criteria/criteria.js +4 -2
  129. package/dist/evaluation/criteria/criteria.js.map +1 -1
  130. package/dist/experimental/autogpt/agent.cjs +8 -7
  131. package/dist/experimental/autogpt/agent.cjs.map +1 -1
  132. package/dist/experimental/autogpt/agent.js +8 -7
  133. package/dist/experimental/autogpt/agent.js.map +1 -1
  134. package/dist/experimental/autogpt/prompt.cjs +2 -1
  135. package/dist/experimental/autogpt/prompt.cjs.map +1 -1
  136. package/dist/experimental/autogpt/prompt.js +2 -1
  137. package/dist/experimental/autogpt/prompt.js.map +1 -1
  138. package/dist/experimental/autogpt/prompt_generator.cjs.map +1 -1
  139. package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.cjs.map +1 -1
  140. package/dist/experimental/openai_assistant/index.cjs.map +1 -1
  141. package/dist/experimental/plan_and_execute/agent_executor.cjs +3 -2
  142. package/dist/experimental/plan_and_execute/agent_executor.cjs.map +1 -1
  143. package/dist/experimental/plan_and_execute/agent_executor.js +3 -2
  144. package/dist/experimental/plan_and_execute/agent_executor.js.map +1 -1
  145. package/dist/hub/base.cjs.map +1 -1
  146. package/dist/hub/base.js.map +1 -1
  147. package/dist/hub/index.cjs +2 -1
  148. package/dist/hub/index.cjs.map +1 -1
  149. package/dist/hub/index.js +2 -1
  150. package/dist/hub/index.js.map +1 -1
  151. package/dist/hub/node.cjs +4 -2
  152. package/dist/hub/node.cjs.map +1 -1
  153. package/dist/hub/node.js +4 -2
  154. package/dist/hub/node.js.map +1 -1
  155. package/dist/load/index.cjs.map +1 -1
  156. package/dist/memory/buffer_memory.cjs.map +1 -1
  157. package/dist/memory/buffer_token_memory.cjs.map +1 -1
  158. package/dist/memory/buffer_window_memory.cjs.map +1 -1
  159. package/dist/memory/chat_memory.cjs.map +1 -1
  160. package/dist/memory/entity_memory.cjs +2 -1
  161. package/dist/memory/entity_memory.cjs.map +1 -1
  162. package/dist/memory/entity_memory.js +2 -1
  163. package/dist/memory/entity_memory.js.map +1 -1
  164. package/dist/memory/summary.cjs.map +1 -1
  165. package/dist/memory/summary_buffer.cjs.map +1 -1
  166. package/dist/memory/vector_store.cjs.map +1 -1
  167. package/dist/output_parsers/fix.cjs +2 -1
  168. package/dist/output_parsers/fix.cjs.map +1 -1
  169. package/dist/output_parsers/fix.js +2 -1
  170. package/dist/output_parsers/fix.js.map +1 -1
  171. package/dist/output_parsers/openai_functions.cjs.map +1 -1
  172. package/dist/output_parsers/structured.cjs.map +1 -1
  173. package/dist/retrievers/document_compressors/chain_extract.cjs +2 -1
  174. package/dist/retrievers/document_compressors/chain_extract.cjs.map +1 -1
  175. package/dist/retrievers/document_compressors/chain_extract.js +2 -1
  176. package/dist/retrievers/document_compressors/chain_extract.js.map +1 -1
  177. package/dist/retrievers/matryoshka_retriever.cjs.map +1 -1
  178. package/dist/retrievers/multi_query.cjs +2 -1
  179. package/dist/retrievers/multi_query.cjs.map +1 -1
  180. package/dist/retrievers/multi_query.js +2 -1
  181. package/dist/retrievers/multi_query.js.map +1 -1
  182. package/dist/smith/runner_utils.cjs.map +1 -1
  183. package/dist/stores/file/node.cjs.map +1 -1
  184. package/dist/tools/render.cjs.map +1 -1
  185. package/dist/tools/retriever.cjs +2 -1
  186. package/dist/tools/retriever.cjs.map +1 -1
  187. package/dist/tools/retriever.js +2 -1
  188. package/dist/tools/retriever.js.map +1 -1
  189. package/dist/tools/webbrowser.cjs +2 -1
  190. package/dist/tools/webbrowser.cjs.map +1 -1
  191. package/dist/tools/webbrowser.js +2 -1
  192. package/dist/tools/webbrowser.js.map +1 -1
  193. package/dist/util/hub.cjs.map +1 -1
  194. package/dist/vectorstores/memory.cjs +2 -1
  195. package/dist/vectorstores/memory.cjs.map +1 -1
  196. package/dist/vectorstores/memory.js +2 -1
  197. package/dist/vectorstores/memory.js.map +1 -1
  198. package/package.json +23 -23
@@ -240,17 +240,18 @@ var ConfigurableModel = class ConfigurableModel extends _langchain_core_language
240
240
  const modelParams = this._modelParams(mergedConfig);
241
241
  const remainingConfig = Object.fromEntries(Object.entries(mergedConfig).filter(([k]) => k !== "configurable"));
242
242
  remainingConfig.configurable = Object.fromEntries(Object.entries(mergedConfig.configurable || {}).filter(([k]) => this._configPrefix && !Object.keys(modelParams).includes(this._removePrefix(k, this._configPrefix))));
243
+ const newConfigurableModel = new ConfigurableModel({
244
+ defaultConfig: {
245
+ ...this._defaultConfig,
246
+ ...modelParams
247
+ },
248
+ configurableFields: Array.isArray(this._configurableFields) ? [...this._configurableFields] : this._configurableFields,
249
+ configPrefix: this._configPrefix,
250
+ queuedMethodOperations: this._queuedMethodOperations
251
+ });
243
252
  return new _langchain_core_runnables.RunnableBinding({
244
253
  config: mergedConfig,
245
- bound: new ConfigurableModel({
246
- defaultConfig: {
247
- ...this._defaultConfig,
248
- ...modelParams
249
- },
250
- configurableFields: Array.isArray(this._configurableFields) ? [...this._configurableFields] : this._configurableFields,
251
- configPrefix: this._configPrefix,
252
- queuedMethodOperations: this._queuedMethodOperations
253
- })
254
+ bound: newConfigurableModel
254
255
  });
255
256
  }
256
257
  async invoke(input, options) {
@@ -259,8 +260,9 @@ var ConfigurableModel = class ConfigurableModel extends _langchain_core_language
259
260
  return model.invoke(input, config);
260
261
  }
261
262
  async stream(input, options) {
263
+ const model = await this._model(options);
262
264
  const wrappedGenerator = new _langchain_core_utils_stream.AsyncGeneratorWithSetup({
263
- generator: await (await this._model(options)).stream(input, options),
265
+ generator: await model.stream(input, options),
264
266
  config: options
265
267
  });
266
268
  await wrappedGenerator.setup;
@@ -1 +1 @@
1
- {"version":3,"file":"universal.cjs","names":["BaseChatModel","RunnableBinding","AsyncGeneratorWithSetup","IterableReadableStream"],"sources":["../../src/chat_models/universal.ts"],"sourcesContent":["import {\n BaseLanguageModelInput,\n ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport {\n BaseChatModel,\n BaseChatModelParams,\n BindToolsInput,\n type BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n type AIMessageChunk,\n MessageStructure,\n} from \"@langchain/core/messages\";\nimport {\n type RunnableBatchOptions,\n RunnableBinding,\n type RunnableConfig,\n type RunnableToolLike,\n ensureConfig,\n} from \"@langchain/core/runnables\";\nimport {\n AsyncGeneratorWithSetup,\n IterableReadableStream,\n} from \"@langchain/core/utils/stream\";\nimport {\n type LogStreamCallbackHandlerInput,\n type RunLogPatch,\n type StreamEvent,\n} from \"@langchain/core/tracers/log_stream\";\nimport { type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\n\n// TODO: remove once `EventStreamCallbackHandlerInput` is exposed in core\ninterface EventStreamCallbackHandlerInput extends Omit<\n LogStreamCallbackHandlerInput,\n \"_schemaFormat\"\n> {}\n\nexport interface ConfigurableChatModelCallOptions extends BaseChatModelCallOptions {\n tools?: (\n | StructuredToolInterface\n | Record<string, unknown>\n | ToolDefinition\n | RunnableToolLike\n )[];\n}\n\n// Configuration map for model providers\nexport const MODEL_PROVIDER_CONFIG = {\n openai: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n anthropic: {\n package: \"@langchain/anthropic\",\n className: \"ChatAnthropic\",\n },\n azure_openai: {\n package: \"@langchain/openai\",\n className: \"AzureChatOpenAI\",\n },\n cohere: {\n package: \"@langchain/cohere\",\n className: \"ChatCohere\",\n },\n \"google-vertexai\": {\n package: \"@langchain/google-vertexai\",\n className: \"ChatVertexAI\",\n },\n \"google-vertexai-web\": {\n package: \"@langchain/google-vertexai-web\",\n className: \"ChatVertexAI\",\n },\n \"google-genai\": {\n package: \"@langchain/google-genai\",\n className: \"ChatGoogleGenerativeAI\",\n },\n ollama: {\n package: \"@langchain/ollama\",\n className: \"ChatOllama\",\n },\n mistralai: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n groq: {\n package: \"@langchain/groq\",\n className: \"ChatGroq\",\n },\n cerebras: {\n package: \"@langchain/cerebras\",\n className: \"ChatCerebras\",\n },\n bedrock: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n aws: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n deepseek: {\n package: \"@langchain/deepseek\",\n className: \"ChatDeepSeek\",\n },\n xai: {\n package: \"@langchain/xai\",\n className: \"ChatXAI\",\n },\n fireworks: {\n package: \"@langchain/fireworks\",\n className: \"ChatFireworks\",\n },\n together: {\n package: \"@langchain/together-ai\",\n className: \"ChatTogetherAI\",\n hasCircularDependency: true,\n },\n perplexity: {\n package: \"@langchain/perplexity\",\n className: \"ChatPerplexity\",\n },\n} as const;\n\nconst SUPPORTED_PROVIDERS = Object.keys(\n MODEL_PROVIDER_CONFIG\n) as (keyof typeof MODEL_PROVIDER_CONFIG)[];\nexport type ChatModelProvider = keyof typeof MODEL_PROVIDER_CONFIG;\ntype ModelProviderConfig = {\n package: string;\n className: string;\n hasCircularDependency?: boolean;\n};\n\n/**\n * Helper function to get a chat model class by its class name or model provider.\n * @param className The class name (e.g., \"ChatOpenAI\", \"ChatAnthropic\")\n * @param modelProvider Optional model provider key for direct lookup (e.g., \"google-vertexai-web\").\n * When provided, uses direct lookup to avoid className collision issues.\n * @returns The imported model class or undefined if not found\n */\nexport async function getChatModelByClassName(\n className: string,\n modelProvider?: string\n) {\n let config: ModelProviderConfig | undefined;\n\n if (modelProvider) {\n // Direct lookup by modelProvider key - avoids className collision\n // (e.g., google-vertexai and google-vertexai-web both use \"ChatVertexAI\")\n config = MODEL_PROVIDER_CONFIG[\n modelProvider as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig | undefined;\n } else {\n // Fallback to className lookup for backward compatibility\n const providerEntry = Object.entries(MODEL_PROVIDER_CONFIG).find(\n ([, c]) => c.className === className\n );\n config = providerEntry\n ? (providerEntry[1] as ModelProviderConfig)\n : undefined;\n }\n\n if (!config) {\n return undefined;\n }\n\n try {\n const module = await import(config.package);\n return module[config.className];\n } catch (e: unknown) {\n const err = e as Error;\n if (\n \"code\" in err &&\n err.code?.toString().includes(\"ERR_MODULE_NOT_FOUND\") &&\n \"message\" in err &&\n typeof err.message === \"string\"\n ) {\n const msg = err.message.startsWith(\"Error: \")\n ? err.message.slice(\"Error: \".length)\n : err.message;\n const attemptedPackage = msg\n .split(\"Cannot find package '\")[1]\n .split(\"'\")[0];\n throw new Error(\n `Unable to import ${attemptedPackage}. Please install with ` +\n `\\`npm install ${attemptedPackage}\\` or \\`pnpm install ${attemptedPackage}\\``\n );\n }\n throw e;\n }\n}\n\nasync function _initChatModelHelper(\n model: string,\n modelProvider?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any> = {}\n): Promise<BaseChatModel> {\n const modelProviderCopy = modelProvider || _inferModelProvider(model);\n if (!modelProviderCopy) {\n throw new Error(\n `Unable to infer model provider for { model: ${model} }, please specify modelProvider directly.`\n );\n }\n\n const config = MODEL_PROVIDER_CONFIG[\n modelProviderCopy as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig;\n if (!config) {\n const supported = SUPPORTED_PROVIDERS.join(\", \");\n throw new Error(\n `Unsupported { modelProvider: ${modelProviderCopy} }.\\n\\nSupported model providers are: ${supported}`\n );\n }\n\n const { modelProvider: _unused, ...passedParams } = params;\n // Pass modelProviderCopy to use direct lookup and avoid className collision\n const ProviderClass = await getChatModelByClassName(\n config.className,\n modelProviderCopy\n );\n return new ProviderClass({ model, ...passedParams });\n}\n\n/**\n * Attempts to infer the model provider based on the given model name.\n *\n * @param {string} modelName - The name of the model to infer the provider for.\n * @returns {string | undefined} The inferred model provider name, or undefined if unable to infer.\n *\n * @example\n * _inferModelProvider(\"gpt-4\"); // returns \"openai\"\n * _inferModelProvider(\"claude-2\"); // returns \"anthropic\"\n * _inferModelProvider(\"unknown-model\"); // returns undefined\n */\nexport function _inferModelProvider(modelName: string): string | undefined {\n if (\n modelName.startsWith(\"gpt-3\") ||\n modelName.startsWith(\"gpt-4\") ||\n modelName.startsWith(\"gpt-5\") ||\n modelName.startsWith(\"o1\") ||\n modelName.startsWith(\"o3\") ||\n modelName.startsWith(\"o4\")\n ) {\n return \"openai\";\n } else if (modelName.startsWith(\"claude\")) {\n return \"anthropic\";\n } else if (modelName.startsWith(\"command\")) {\n return \"cohere\";\n } else if (modelName.startsWith(\"accounts/fireworks\")) {\n return \"fireworks\";\n } else if (modelName.startsWith(\"gemini\")) {\n return \"google-vertexai\";\n } else if (modelName.startsWith(\"amazon.\")) {\n return \"bedrock\";\n } else if (modelName.startsWith(\"mistral\")) {\n return \"mistralai\";\n } else if (modelName.startsWith(\"sonar\") || modelName.startsWith(\"pplx\")) {\n return \"perplexity\";\n } else {\n return undefined;\n }\n}\n\ninterface ConfigurableModelFields extends BaseChatModelParams {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n defaultConfig?: Record<string, any>;\n /**\n * @default \"any\"\n */\n configurableFields?: string[] | \"any\";\n /**\n * @default \"\"\n */\n configPrefix?: string;\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n queuedMethodOperations?: Record<string, any>;\n}\n\n/**\n * Internal class used to create chat models.\n *\n * @internal\n */\nexport class ConfigurableModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n _llmType(): string {\n return \"chat_model\";\n }\n\n lc_namespace = [\"langchain\", \"chat_models\"];\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _defaultConfig?: Record<string, any> = {};\n\n /**\n * @default \"any\"\n */\n _configurableFields: string[] | \"any\" = \"any\";\n\n /**\n * @default \"\"\n */\n _configPrefix: string;\n\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _queuedMethodOperations: Record<string, any> = {};\n\n constructor(fields: ConfigurableModelFields) {\n super(fields);\n this._defaultConfig = fields.defaultConfig ?? {};\n\n if (fields.configurableFields === \"any\") {\n this._configurableFields = \"any\";\n } else {\n this._configurableFields = fields.configurableFields ?? [\n \"model\",\n \"modelProvider\",\n ];\n }\n\n if (fields.configPrefix) {\n this._configPrefix = fields.configPrefix.endsWith(\"_\")\n ? fields.configPrefix\n : `${fields.configPrefix}_`;\n } else {\n this._configPrefix = \"\";\n }\n\n this._queuedMethodOperations =\n fields.queuedMethodOperations ?? this._queuedMethodOperations;\n }\n\n async _model(\n config?: RunnableConfig\n ): Promise<\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n > {\n const params = { ...this._defaultConfig, ...this._modelParams(config) };\n let initializedModel = await _initChatModelHelper(\n params.model,\n params.modelProvider,\n params\n );\n\n // Apply queued method operations\n const queuedMethodOperationsEntries = Object.entries(\n this._queuedMethodOperations\n );\n if (queuedMethodOperationsEntries.length > 0) {\n for (const [method, args] of queuedMethodOperationsEntries) {\n if (\n method in initializedModel &&\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (initializedModel as any)[method] === \"function\"\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n initializedModel = await (initializedModel as any)[method](...args);\n }\n }\n }\n\n return initializedModel;\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const model = await this._model(options);\n return model._generate(messages, options ?? {}, runManager);\n }\n\n override bindTools(\n tools: BindToolsInput[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>\n ): ConfigurableModel<RunInput, CallOptions> {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.bindTools = [tools, params];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n });\n }\n\n // Extract the input types from the `BaseModel` class.\n withStructuredOutput: BaseChatModel[\"withStructuredOutput\"] = (\n schema,\n ...args\n ): ReturnType<BaseChatModel[\"withStructuredOutput\"]> => {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.withStructuredOutput = [schema, ...args];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n }) as unknown as ReturnType<BaseChatModel[\"withStructuredOutput\"]>;\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _modelParams(config?: RunnableConfig): Record<string, any> {\n const configurable = config?.configurable ?? {};\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n let modelParams: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(configurable)) {\n if (key.startsWith(this._configPrefix)) {\n const strippedKey = this._removePrefix(key, this._configPrefix);\n modelParams[strippedKey] = value;\n }\n }\n\n if (this._configurableFields !== \"any\") {\n modelParams = Object.fromEntries(\n Object.entries(modelParams).filter(([key]) =>\n this._configurableFields.includes(key)\n )\n );\n }\n\n return modelParams;\n }\n\n _removePrefix(str: string, prefix: string): string {\n return str.startsWith(prefix) ? str.slice(prefix.length) : str;\n }\n\n /**\n * Bind config to a Runnable, returning a new Runnable.\n * @param {RunnableConfig | undefined} [config] - The config to bind.\n * @returns {RunnableBinding<RunInput, RunOutput, CallOptions>} A new RunnableBinding with the bound config.\n */\n withConfig(\n config?: RunnableConfig\n ): RunnableBinding<RunInput, AIMessageChunk, CallOptions> {\n const mergedConfig: RunnableConfig = { ...(config || {}) };\n const modelParams = this._modelParams(mergedConfig);\n\n const remainingConfig: RunnableConfig = Object.fromEntries(\n Object.entries(mergedConfig).filter(([k]) => k !== \"configurable\")\n );\n\n remainingConfig.configurable = Object.fromEntries(\n Object.entries(mergedConfig.configurable || {}).filter(\n ([k]) =>\n this._configPrefix &&\n !Object.keys(modelParams).includes(\n this._removePrefix(k, this._configPrefix)\n )\n )\n );\n\n const newConfigurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: { ...this._defaultConfig, ...modelParams },\n configurableFields: Array.isArray(this._configurableFields)\n ? [...this._configurableFields]\n : this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: this._queuedMethodOperations,\n });\n\n return new RunnableBinding<RunInput, AIMessageChunk, CallOptions>({\n config: mergedConfig,\n bound: newConfigurableModel,\n });\n }\n\n async invoke(\n input: RunInput,\n options?: CallOptions\n ): Promise<AIMessageChunk> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n return model.invoke(input, config);\n }\n\n async stream(\n input: RunInput,\n options?: CallOptions\n ): Promise<IterableReadableStream<AIMessageChunk>> {\n const model = await this._model(options);\n const wrappedGenerator = new AsyncGeneratorWithSetup({\n generator: await model.stream(input, options),\n config: options,\n });\n await wrappedGenerator.setup;\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator);\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<AIMessageChunk[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]> {\n // We can super this since the base runnable implementation of\n // `.batch` will call `.invoke` on each input.\n return super.batch(inputs, options, batchOptions);\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: CallOptions\n ): AsyncGenerator<AIMessageChunk> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n\n yield* model.transform(generator, config);\n }\n\n async *streamLog(\n input: RunInput,\n options?: Partial<CallOptions>,\n streamOptions?: Omit<LogStreamCallbackHandlerInput, \"autoClose\">\n ): AsyncGenerator<RunLogPatch> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n\n yield* model.streamLog(input, config, {\n ...streamOptions,\n _schemaFormat: \"original\",\n includeNames: streamOptions?.includeNames,\n includeTypes: streamOptions?.includeTypes,\n includeTags: streamOptions?.includeTags,\n excludeNames: streamOptions?.excludeNames,\n excludeTypes: streamOptions?.excludeTypes,\n excludeTags: streamOptions?.excludeTags,\n });\n }\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v1\" | \"v2\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\" | \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\" | \"v2\";\n encoding?: \"text/event-stream\" | undefined;\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent | Uint8Array> {\n const outerThis = this;\n async function* wrappedGenerator() {\n const model = await outerThis._model(options);\n const config = ensureConfig(options);\n const eventStream = model.streamEvents(input, config, streamOptions);\n\n for await (const chunk of eventStream) {\n yield chunk;\n }\n }\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator());\n }\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface InitChatModelFields extends Partial<Record<string, any>> {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n}\n\nexport type ConfigurableFields = \"any\" | string[];\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: never,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: ConfigurableFields;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\n// ################################# FOR CONTRIBUTORS #################################\n//\n// If adding support for a new provider, please append the provider\n// name to the supported list in the docstring below.\n//\n// ####################################################################################\n\n/**\n * Initialize a ChatModel from the model name and provider.\n * Must have the integration package corresponding to the model provider installed.\n *\n * @template {extends BaseLanguageModelInput = BaseLanguageModelInput} RunInput - The input type for the model.\n * @template {extends ConfigurableChatModelCallOptions = ConfigurableChatModelCallOptions} CallOptions - Call options for the model.\n *\n * @param {string | ChatModelProvider} [model] - The name of the model, e.g. \"gpt-4\", \"claude-3-opus-20240229\".\n * Can be prefixed with the model provider, e.g. \"openai:gpt-4\", \"anthropic:claude-3-opus-20240229\".\n * @param {Object} [fields] - Additional configuration options.\n * @param {string} [fields.modelProvider] - The model provider. Supported values include:\n * - openai (@langchain/openai)\n * - anthropic (@langchain/anthropic)\n * - azure_openai (@langchain/openai)\n * - google-vertexai (@langchain/google-vertexai)\n * - google-vertexai-web (@langchain/google-vertexai-web)\n * - google-genai (@langchain/google-genai)\n * - bedrock (@langchain/aws)\n * - cohere (@langchain/cohere)\n * - fireworks (@langchain/fireworks)\n * - together (@langchain/together-ai)\n * - mistralai (@langchain/mistralai)\n * - groq (@langchain/groq)\n * - ollama (@langchain/ollama)\n * - perplexity (@langchain/perplexity)\n * - cerebras (@langchain/cerebras)\n * - deepseek (@langchain/deepseek)\n * - xai (@langchain/xai)\n * @param {string[] | \"any\"} [fields.configurableFields] - Which model parameters are configurable:\n * - undefined: No configurable fields.\n * - \"any\": All fields are configurable. (See Security Note in description)\n * - string[]: Specified fields are configurable.\n * @param {string} [fields.configPrefix] - Prefix for configurable fields at runtime.\n * @param {Record<string, any>} [fields.params] - Additional keyword args to pass to the ChatModel constructor.\n * @returns {Promise<ConfigurableModel<RunInput, CallOptions>>} A class which extends BaseChatModel.\n * @throws {Error} If modelProvider cannot be inferred or isn't supported.\n * @throws {Error} If the model provider integration package is not installed.\n *\n * @example Initialize non-configurable models\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const gpt4 = await initChatModel(\"openai:gpt-4\", {\n * temperature: 0.25,\n * });\n * const gpt4Result = await gpt4.invoke(\"what's your name\");\n *\n * const claude = await initChatModel(\"anthropic:claude-3-opus-20240229\", {\n * temperature: 0.25,\n * });\n * const claudeResult = await claude.invoke(\"what's your name\");\n *\n * const gemini = await initChatModel(\"gemini-1.5-pro\", {\n * modelProvider: \"google-vertexai\",\n * temperature: 0.25,\n * });\n * const geminiResult = await gemini.invoke(\"what's your name\");\n * ```\n *\n * @example Create a partially configurable model with no default model\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModel = await initChatModel(undefined, {\n * temperature: 0,\n * configurableFields: [\"model\", \"apiKey\"],\n * });\n *\n * const gpt4Result = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"gpt-4\",\n * },\n * });\n *\n * const claudeResult = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * },\n * });\n * ```\n *\n * @example Create a fully configurable model with a default model and a config prefix\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModelWithDefault = await initChatModel(\"gpt-4\", {\n * modelProvider: \"openai\",\n * configurableFields: \"any\",\n * configPrefix: \"foo\",\n * temperature: 0,\n * });\n *\n * const openaiResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const claudeResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_model: \"claude-sonnet-4-5-20250929\",\n * foo_modelProvider: \"anthropic\",\n * foo_temperature: 0.6,\n * foo_apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Bind tools to a configurable model:\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n * import { z } from \"zod/v3\";\n * import { tool } from \"@langchain/core/tools\";\n *\n * const getWeatherTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current weather in a given location\"),\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * }\n * );\n *\n * const getPopulationTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current population in a given location\"),\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * }\n * );\n *\n * const configurableModel = await initChatModel(\"gpt-4\", {\n * configurableFields: [\"model\", \"modelProvider\", \"apiKey\"],\n * temperature: 0,\n * });\n *\n * const configurableModelWithTools = configurableModel.bindTools([\n * getWeatherTool,\n * getPopulationTool,\n * ]);\n *\n * const configurableToolResult = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const configurableToolResult2 = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @description\n * This function initializes a ChatModel based on the provided model name and provider.\n * It supports various model providers and allows for runtime configuration of model parameters.\n *\n * Security Note: Setting `configurableFields` to \"any\" means fields like apiKey, baseUrl, etc.\n * can be altered at runtime, potentially redirecting model requests to a different service/user.\n * Make sure that if you're accepting untrusted configurations, you enumerate the\n * `configurableFields` explicitly.\n *\n * The function will attempt to infer the model provider from the model name if not specified.\n * Certain model name prefixes are associated with specific providers:\n * - gpt-3... or gpt-4... -> openai\n * - claude... -> anthropic\n * - amazon.... -> bedrock\n * - gemini... -> google-vertexai\n * - command... -> cohere\n * - accounts/fireworks... -> fireworks\n *\n * @since 0.2.11\n * @version 0.2.11\n */\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>> {\n // oxlint-disable-next-line prefer-const\n let { configurableFields, configPrefix, modelProvider, ...params } = {\n configPrefix: \"\",\n ...(fields ?? {}),\n };\n if (modelProvider === undefined && model?.includes(\":\")) {\n const modelComponents = model.split(\":\", 2);\n if (SUPPORTED_PROVIDERS.includes(modelComponents[0] as ChatModelProvider)) {\n // oxlint-disable-next-line no-param-reassign\n [modelProvider, model] = modelComponents;\n }\n }\n let configurableFieldsCopy = Array.isArray(configurableFields)\n ? [...configurableFields]\n : configurableFields;\n\n if (!model && configurableFieldsCopy === undefined) {\n configurableFieldsCopy = [\"model\", \"modelProvider\"];\n }\n if (configPrefix && configurableFieldsCopy === undefined) {\n console.warn(\n `{ configPrefix: ${configPrefix} } has been set but no fields are configurable. Set ` +\n `{ configurableFields: [...] } to specify the model params that are ` +\n `configurable.`\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const paramsCopy: Record<string, any> = { ...params };\n\n if (configurableFieldsCopy === undefined) {\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: {\n ...paramsCopy,\n model,\n modelProvider,\n },\n configPrefix,\n });\n } else {\n if (model) {\n paramsCopy.model = model;\n }\n if (modelProvider) {\n paramsCopy.modelProvider = modelProvider;\n }\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: paramsCopy,\n configPrefix,\n configurableFields: configurableFieldsCopy,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"universal.cjs","names":["BaseChatModel","RunnableBinding","ensureConfig","AsyncGeneratorWithSetup","IterableReadableStream"],"sources":["../../src/chat_models/universal.ts"],"sourcesContent":["import {\n BaseLanguageModelInput,\n ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport {\n BaseChatModel,\n BaseChatModelParams,\n BindToolsInput,\n type BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n type AIMessageChunk,\n MessageStructure,\n} from \"@langchain/core/messages\";\nimport {\n type RunnableBatchOptions,\n RunnableBinding,\n type RunnableConfig,\n type RunnableToolLike,\n ensureConfig,\n} from \"@langchain/core/runnables\";\nimport {\n AsyncGeneratorWithSetup,\n IterableReadableStream,\n} from \"@langchain/core/utils/stream\";\nimport {\n type LogStreamCallbackHandlerInput,\n type RunLogPatch,\n type StreamEvent,\n} from \"@langchain/core/tracers/log_stream\";\nimport { type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\n\n// TODO: remove once `EventStreamCallbackHandlerInput` is exposed in core\ninterface EventStreamCallbackHandlerInput extends Omit<\n LogStreamCallbackHandlerInput,\n \"_schemaFormat\"\n> {}\n\nexport interface ConfigurableChatModelCallOptions extends BaseChatModelCallOptions {\n tools?: (\n | StructuredToolInterface\n | Record<string, unknown>\n | ToolDefinition\n | RunnableToolLike\n )[];\n}\n\n// Configuration map for model providers\nexport const MODEL_PROVIDER_CONFIG = {\n openai: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n anthropic: {\n package: \"@langchain/anthropic\",\n className: \"ChatAnthropic\",\n },\n azure_openai: {\n package: \"@langchain/openai\",\n className: \"AzureChatOpenAI\",\n },\n cohere: {\n package: \"@langchain/cohere\",\n className: \"ChatCohere\",\n },\n \"google-vertexai\": {\n package: \"@langchain/google-vertexai\",\n className: \"ChatVertexAI\",\n },\n \"google-vertexai-web\": {\n package: \"@langchain/google-vertexai-web\",\n className: \"ChatVertexAI\",\n },\n \"google-genai\": {\n package: \"@langchain/google-genai\",\n className: \"ChatGoogleGenerativeAI\",\n },\n ollama: {\n package: \"@langchain/ollama\",\n className: \"ChatOllama\",\n },\n mistralai: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n groq: {\n package: \"@langchain/groq\",\n className: \"ChatGroq\",\n },\n cerebras: {\n package: \"@langchain/cerebras\",\n className: \"ChatCerebras\",\n },\n bedrock: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n aws: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n deepseek: {\n package: \"@langchain/deepseek\",\n className: \"ChatDeepSeek\",\n },\n xai: {\n package: \"@langchain/xai\",\n className: \"ChatXAI\",\n },\n fireworks: {\n package: \"@langchain/fireworks\",\n className: \"ChatFireworks\",\n },\n together: {\n package: \"@langchain/together-ai\",\n className: \"ChatTogetherAI\",\n hasCircularDependency: true,\n },\n perplexity: {\n package: \"@langchain/perplexity\",\n className: \"ChatPerplexity\",\n },\n} as const;\n\nconst SUPPORTED_PROVIDERS = Object.keys(\n MODEL_PROVIDER_CONFIG\n) as (keyof typeof MODEL_PROVIDER_CONFIG)[];\nexport type ChatModelProvider = keyof typeof MODEL_PROVIDER_CONFIG;\ntype ModelProviderConfig = {\n package: string;\n className: string;\n hasCircularDependency?: boolean;\n};\n\n/**\n * Helper function to get a chat model class by its class name or model provider.\n * @param className The class name (e.g., \"ChatOpenAI\", \"ChatAnthropic\")\n * @param modelProvider Optional model provider key for direct lookup (e.g., \"google-vertexai-web\").\n * When provided, uses direct lookup to avoid className collision issues.\n * @returns The imported model class or undefined if not found\n */\nexport async function getChatModelByClassName(\n className: string,\n modelProvider?: string\n) {\n let config: ModelProviderConfig | undefined;\n\n if (modelProvider) {\n // Direct lookup by modelProvider key - avoids className collision\n // (e.g., google-vertexai and google-vertexai-web both use \"ChatVertexAI\")\n config = MODEL_PROVIDER_CONFIG[\n modelProvider as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig | undefined;\n } else {\n // Fallback to className lookup for backward compatibility\n const providerEntry = Object.entries(MODEL_PROVIDER_CONFIG).find(\n ([, c]) => c.className === className\n );\n config = providerEntry\n ? (providerEntry[1] as ModelProviderConfig)\n : undefined;\n }\n\n if (!config) {\n return undefined;\n }\n\n try {\n const module = await import(config.package);\n return module[config.className];\n } catch (e: unknown) {\n const err = e as Error;\n if (\n \"code\" in err &&\n err.code?.toString().includes(\"ERR_MODULE_NOT_FOUND\") &&\n \"message\" in err &&\n typeof err.message === \"string\"\n ) {\n const msg = err.message.startsWith(\"Error: \")\n ? err.message.slice(\"Error: \".length)\n : err.message;\n const attemptedPackage = msg\n .split(\"Cannot find package '\")[1]\n .split(\"'\")[0];\n throw new Error(\n `Unable to import ${attemptedPackage}. Please install with ` +\n `\\`npm install ${attemptedPackage}\\` or \\`pnpm install ${attemptedPackage}\\``\n );\n }\n throw e;\n }\n}\n\nasync function _initChatModelHelper(\n model: string,\n modelProvider?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any> = {}\n): Promise<BaseChatModel> {\n const modelProviderCopy = modelProvider || _inferModelProvider(model);\n if (!modelProviderCopy) {\n throw new Error(\n `Unable to infer model provider for { model: ${model} }, please specify modelProvider directly.`\n );\n }\n\n const config = MODEL_PROVIDER_CONFIG[\n modelProviderCopy as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig;\n if (!config) {\n const supported = SUPPORTED_PROVIDERS.join(\", \");\n throw new Error(\n `Unsupported { modelProvider: ${modelProviderCopy} }.\\n\\nSupported model providers are: ${supported}`\n );\n }\n\n const { modelProvider: _unused, ...passedParams } = params;\n // Pass modelProviderCopy to use direct lookup and avoid className collision\n const ProviderClass = await getChatModelByClassName(\n config.className,\n modelProviderCopy\n );\n return new ProviderClass({ model, ...passedParams });\n}\n\n/**\n * Attempts to infer the model provider based on the given model name.\n *\n * @param {string} modelName - The name of the model to infer the provider for.\n * @returns {string | undefined} The inferred model provider name, or undefined if unable to infer.\n *\n * @example\n * _inferModelProvider(\"gpt-4\"); // returns \"openai\"\n * _inferModelProvider(\"claude-2\"); // returns \"anthropic\"\n * _inferModelProvider(\"unknown-model\"); // returns undefined\n */\nexport function _inferModelProvider(modelName: string): string | undefined {\n if (\n modelName.startsWith(\"gpt-3\") ||\n modelName.startsWith(\"gpt-4\") ||\n modelName.startsWith(\"gpt-5\") ||\n modelName.startsWith(\"o1\") ||\n modelName.startsWith(\"o3\") ||\n modelName.startsWith(\"o4\")\n ) {\n return \"openai\";\n } else if (modelName.startsWith(\"claude\")) {\n return \"anthropic\";\n } else if (modelName.startsWith(\"command\")) {\n return \"cohere\";\n } else if (modelName.startsWith(\"accounts/fireworks\")) {\n return \"fireworks\";\n } else if (modelName.startsWith(\"gemini\")) {\n return \"google-vertexai\";\n } else if (modelName.startsWith(\"amazon.\")) {\n return \"bedrock\";\n } else if (modelName.startsWith(\"mistral\")) {\n return \"mistralai\";\n } else if (modelName.startsWith(\"sonar\") || modelName.startsWith(\"pplx\")) {\n return \"perplexity\";\n } else {\n return undefined;\n }\n}\n\ninterface ConfigurableModelFields extends BaseChatModelParams {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n defaultConfig?: Record<string, any>;\n /**\n * @default \"any\"\n */\n configurableFields?: string[] | \"any\";\n /**\n * @default \"\"\n */\n configPrefix?: string;\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n queuedMethodOperations?: Record<string, any>;\n}\n\n/**\n * Internal class used to create chat models.\n *\n * @internal\n */\nexport class ConfigurableModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n _llmType(): string {\n return \"chat_model\";\n }\n\n lc_namespace = [\"langchain\", \"chat_models\"];\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _defaultConfig?: Record<string, any> = {};\n\n /**\n * @default \"any\"\n */\n _configurableFields: string[] | \"any\" = \"any\";\n\n /**\n * @default \"\"\n */\n _configPrefix: string;\n\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _queuedMethodOperations: Record<string, any> = {};\n\n constructor(fields: ConfigurableModelFields) {\n super(fields);\n this._defaultConfig = fields.defaultConfig ?? {};\n\n if (fields.configurableFields === \"any\") {\n this._configurableFields = \"any\";\n } else {\n this._configurableFields = fields.configurableFields ?? [\n \"model\",\n \"modelProvider\",\n ];\n }\n\n if (fields.configPrefix) {\n this._configPrefix = fields.configPrefix.endsWith(\"_\")\n ? fields.configPrefix\n : `${fields.configPrefix}_`;\n } else {\n this._configPrefix = \"\";\n }\n\n this._queuedMethodOperations =\n fields.queuedMethodOperations ?? this._queuedMethodOperations;\n }\n\n async _model(\n config?: RunnableConfig\n ): Promise<\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n > {\n const params = { ...this._defaultConfig, ...this._modelParams(config) };\n let initializedModel = await _initChatModelHelper(\n params.model,\n params.modelProvider,\n params\n );\n\n // Apply queued method operations\n const queuedMethodOperationsEntries = Object.entries(\n this._queuedMethodOperations\n );\n if (queuedMethodOperationsEntries.length > 0) {\n for (const [method, args] of queuedMethodOperationsEntries) {\n if (\n method in initializedModel &&\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (initializedModel as any)[method] === \"function\"\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n initializedModel = await (initializedModel as any)[method](...args);\n }\n }\n }\n\n return initializedModel;\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const model = await this._model(options);\n return model._generate(messages, options ?? {}, runManager);\n }\n\n override bindTools(\n tools: BindToolsInput[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>\n ): ConfigurableModel<RunInput, CallOptions> {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.bindTools = [tools, params];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n });\n }\n\n // Extract the input types from the `BaseModel` class.\n withStructuredOutput: BaseChatModel[\"withStructuredOutput\"] = (\n schema,\n ...args\n ): ReturnType<BaseChatModel[\"withStructuredOutput\"]> => {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.withStructuredOutput = [schema, ...args];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n }) as unknown as ReturnType<BaseChatModel[\"withStructuredOutput\"]>;\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _modelParams(config?: RunnableConfig): Record<string, any> {\n const configurable = config?.configurable ?? {};\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n let modelParams: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(configurable)) {\n if (key.startsWith(this._configPrefix)) {\n const strippedKey = this._removePrefix(key, this._configPrefix);\n modelParams[strippedKey] = value;\n }\n }\n\n if (this._configurableFields !== \"any\") {\n modelParams = Object.fromEntries(\n Object.entries(modelParams).filter(([key]) =>\n this._configurableFields.includes(key)\n )\n );\n }\n\n return modelParams;\n }\n\n _removePrefix(str: string, prefix: string): string {\n return str.startsWith(prefix) ? str.slice(prefix.length) : str;\n }\n\n /**\n * Bind config to a Runnable, returning a new Runnable.\n * @param {RunnableConfig | undefined} [config] - The config to bind.\n * @returns {RunnableBinding<RunInput, RunOutput, CallOptions>} A new RunnableBinding with the bound config.\n */\n withConfig(\n config?: RunnableConfig\n ): RunnableBinding<RunInput, AIMessageChunk, CallOptions> {\n const mergedConfig: RunnableConfig = { ...(config || {}) };\n const modelParams = this._modelParams(mergedConfig);\n\n const remainingConfig: RunnableConfig = Object.fromEntries(\n Object.entries(mergedConfig).filter(([k]) => k !== \"configurable\")\n );\n\n remainingConfig.configurable = Object.fromEntries(\n Object.entries(mergedConfig.configurable || {}).filter(\n ([k]) =>\n this._configPrefix &&\n !Object.keys(modelParams).includes(\n this._removePrefix(k, this._configPrefix)\n )\n )\n );\n\n const newConfigurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: { ...this._defaultConfig, ...modelParams },\n configurableFields: Array.isArray(this._configurableFields)\n ? [...this._configurableFields]\n : this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: this._queuedMethodOperations,\n });\n\n return new RunnableBinding<RunInput, AIMessageChunk, CallOptions>({\n config: mergedConfig,\n bound: newConfigurableModel,\n });\n }\n\n async invoke(\n input: RunInput,\n options?: CallOptions\n ): Promise<AIMessageChunk> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n return model.invoke(input, config);\n }\n\n async stream(\n input: RunInput,\n options?: CallOptions\n ): Promise<IterableReadableStream<AIMessageChunk>> {\n const model = await this._model(options);\n const wrappedGenerator = new AsyncGeneratorWithSetup({\n generator: await model.stream(input, options),\n config: options,\n });\n await wrappedGenerator.setup;\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator);\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<AIMessageChunk[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]> {\n // We can super this since the base runnable implementation of\n // `.batch` will call `.invoke` on each input.\n return super.batch(inputs, options, batchOptions);\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: CallOptions\n ): AsyncGenerator<AIMessageChunk> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n\n yield* model.transform(generator, config);\n }\n\n async *streamLog(\n input: RunInput,\n options?: Partial<CallOptions>,\n streamOptions?: Omit<LogStreamCallbackHandlerInput, \"autoClose\">\n ): AsyncGenerator<RunLogPatch> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n\n yield* model.streamLog(input, config, {\n ...streamOptions,\n _schemaFormat: \"original\",\n includeNames: streamOptions?.includeNames,\n includeTypes: streamOptions?.includeTypes,\n includeTags: streamOptions?.includeTags,\n excludeNames: streamOptions?.excludeNames,\n excludeTypes: streamOptions?.excludeTypes,\n excludeTags: streamOptions?.excludeTags,\n });\n }\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v1\" | \"v2\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\" | \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\" | \"v2\";\n encoding?: \"text/event-stream\" | undefined;\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent | Uint8Array> {\n const outerThis = this;\n async function* wrappedGenerator() {\n const model = await outerThis._model(options);\n const config = ensureConfig(options);\n const eventStream = model.streamEvents(input, config, streamOptions);\n\n for await (const chunk of eventStream) {\n yield chunk;\n }\n }\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator());\n }\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface InitChatModelFields extends Partial<Record<string, any>> {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n}\n\nexport type ConfigurableFields = \"any\" | string[];\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: never,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: ConfigurableFields;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\n// ################################# FOR CONTRIBUTORS #################################\n//\n// If adding support for a new provider, please append the provider\n// name to the supported list in the docstring below.\n//\n// ####################################################################################\n\n/**\n * Initialize a ChatModel from the model name and provider.\n * Must have the integration package corresponding to the model provider installed.\n *\n * @template {extends BaseLanguageModelInput = BaseLanguageModelInput} RunInput - The input type for the model.\n * @template {extends ConfigurableChatModelCallOptions = ConfigurableChatModelCallOptions} CallOptions - Call options for the model.\n *\n * @param {string | ChatModelProvider} [model] - The name of the model, e.g. \"gpt-4\", \"claude-3-opus-20240229\".\n * Can be prefixed with the model provider, e.g. \"openai:gpt-4\", \"anthropic:claude-3-opus-20240229\".\n * @param {Object} [fields] - Additional configuration options.\n * @param {string} [fields.modelProvider] - The model provider. Supported values include:\n * - openai (@langchain/openai)\n * - anthropic (@langchain/anthropic)\n * - azure_openai (@langchain/openai)\n * - google-vertexai (@langchain/google-vertexai)\n * - google-vertexai-web (@langchain/google-vertexai-web)\n * - google-genai (@langchain/google-genai)\n * - bedrock (@langchain/aws)\n * - cohere (@langchain/cohere)\n * - fireworks (@langchain/fireworks)\n * - together (@langchain/together-ai)\n * - mistralai (@langchain/mistralai)\n * - groq (@langchain/groq)\n * - ollama (@langchain/ollama)\n * - perplexity (@langchain/perplexity)\n * - cerebras (@langchain/cerebras)\n * - deepseek (@langchain/deepseek)\n * - xai (@langchain/xai)\n * @param {string[] | \"any\"} [fields.configurableFields] - Which model parameters are configurable:\n * - undefined: No configurable fields.\n * - \"any\": All fields are configurable. (See Security Note in description)\n * - string[]: Specified fields are configurable.\n * @param {string} [fields.configPrefix] - Prefix for configurable fields at runtime.\n * @param {Record<string, any>} [fields.params] - Additional keyword args to pass to the ChatModel constructor.\n * @returns {Promise<ConfigurableModel<RunInput, CallOptions>>} A class which extends BaseChatModel.\n * @throws {Error} If modelProvider cannot be inferred or isn't supported.\n * @throws {Error} If the model provider integration package is not installed.\n *\n * @example Initialize non-configurable models\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const gpt4 = await initChatModel(\"openai:gpt-4\", {\n * temperature: 0.25,\n * });\n * const gpt4Result = await gpt4.invoke(\"what's your name\");\n *\n * const claude = await initChatModel(\"anthropic:claude-3-opus-20240229\", {\n * temperature: 0.25,\n * });\n * const claudeResult = await claude.invoke(\"what's your name\");\n *\n * const gemini = await initChatModel(\"gemini-1.5-pro\", {\n * modelProvider: \"google-vertexai\",\n * temperature: 0.25,\n * });\n * const geminiResult = await gemini.invoke(\"what's your name\");\n * ```\n *\n * @example Create a partially configurable model with no default model\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModel = await initChatModel(undefined, {\n * temperature: 0,\n * configurableFields: [\"model\", \"apiKey\"],\n * });\n *\n * const gpt4Result = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"gpt-4\",\n * },\n * });\n *\n * const claudeResult = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * },\n * });\n * ```\n *\n * @example Create a fully configurable model with a default model and a config prefix\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModelWithDefault = await initChatModel(\"gpt-4\", {\n * modelProvider: \"openai\",\n * configurableFields: \"any\",\n * configPrefix: \"foo\",\n * temperature: 0,\n * });\n *\n * const openaiResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const claudeResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_model: \"claude-sonnet-4-5-20250929\",\n * foo_modelProvider: \"anthropic\",\n * foo_temperature: 0.6,\n * foo_apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Bind tools to a configurable model:\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n * import { z } from \"zod/v3\";\n * import { tool } from \"@langchain/core/tools\";\n *\n * const getWeatherTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current weather in a given location\"),\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * }\n * );\n *\n * const getPopulationTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current population in a given location\"),\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * }\n * );\n *\n * const configurableModel = await initChatModel(\"gpt-4\", {\n * configurableFields: [\"model\", \"modelProvider\", \"apiKey\"],\n * temperature: 0,\n * });\n *\n * const configurableModelWithTools = configurableModel.bindTools([\n * getWeatherTool,\n * getPopulationTool,\n * ]);\n *\n * const configurableToolResult = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const configurableToolResult2 = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @description\n * This function initializes a ChatModel based on the provided model name and provider.\n * It supports various model providers and allows for runtime configuration of model parameters.\n *\n * Security Note: Setting `configurableFields` to \"any\" means fields like apiKey, baseUrl, etc.\n * can be altered at runtime, potentially redirecting model requests to a different service/user.\n * Make sure that if you're accepting untrusted configurations, you enumerate the\n * `configurableFields` explicitly.\n *\n * The function will attempt to infer the model provider from the model name if not specified.\n * Certain model name prefixes are associated with specific providers:\n * - gpt-3... or gpt-4... -> openai\n * - claude... -> anthropic\n * - amazon.... -> bedrock\n * - gemini... -> google-vertexai\n * - command... -> cohere\n * - accounts/fireworks... -> fireworks\n *\n * @since 0.2.11\n * @version 0.2.11\n */\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>> {\n // oxlint-disable-next-line prefer-const\n let { configurableFields, configPrefix, modelProvider, ...params } = {\n configPrefix: \"\",\n ...(fields ?? {}),\n };\n if (modelProvider === undefined && model?.includes(\":\")) {\n const modelComponents = model.split(\":\", 2);\n if (SUPPORTED_PROVIDERS.includes(modelComponents[0] as ChatModelProvider)) {\n // oxlint-disable-next-line no-param-reassign\n [modelProvider, model] = modelComponents;\n }\n }\n let configurableFieldsCopy = Array.isArray(configurableFields)\n ? [...configurableFields]\n : configurableFields;\n\n if (!model && configurableFieldsCopy === undefined) {\n configurableFieldsCopy = [\"model\", \"modelProvider\"];\n }\n if (configPrefix && configurableFieldsCopy === undefined) {\n console.warn(\n `{ configPrefix: ${configPrefix} } has been set but no fields are configurable. Set ` +\n `{ configurableFields: [...] } to specify the model params that are ` +\n `configurable.`\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const paramsCopy: Record<string, any> = { ...params };\n\n if (configurableFieldsCopy === undefined) {\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: {\n ...paramsCopy,\n model,\n modelProvider,\n },\n configPrefix,\n });\n } else {\n if (model) {\n paramsCopy.model = model;\n }\n if (modelProvider) {\n paramsCopy.modelProvider = modelProvider;\n }\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: paramsCopy,\n configPrefix,\n configurableFields: configurableFieldsCopy,\n });\n }\n}\n"],"mappings":"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"}
@@ -239,17 +239,18 @@ var ConfigurableModel = class ConfigurableModel extends BaseChatModel {
239
239
  const modelParams = this._modelParams(mergedConfig);
240
240
  const remainingConfig = Object.fromEntries(Object.entries(mergedConfig).filter(([k]) => k !== "configurable"));
241
241
  remainingConfig.configurable = Object.fromEntries(Object.entries(mergedConfig.configurable || {}).filter(([k]) => this._configPrefix && !Object.keys(modelParams).includes(this._removePrefix(k, this._configPrefix))));
242
+ const newConfigurableModel = new ConfigurableModel({
243
+ defaultConfig: {
244
+ ...this._defaultConfig,
245
+ ...modelParams
246
+ },
247
+ configurableFields: Array.isArray(this._configurableFields) ? [...this._configurableFields] : this._configurableFields,
248
+ configPrefix: this._configPrefix,
249
+ queuedMethodOperations: this._queuedMethodOperations
250
+ });
242
251
  return new RunnableBinding({
243
252
  config: mergedConfig,
244
- bound: new ConfigurableModel({
245
- defaultConfig: {
246
- ...this._defaultConfig,
247
- ...modelParams
248
- },
249
- configurableFields: Array.isArray(this._configurableFields) ? [...this._configurableFields] : this._configurableFields,
250
- configPrefix: this._configPrefix,
251
- queuedMethodOperations: this._queuedMethodOperations
252
- })
253
+ bound: newConfigurableModel
253
254
  });
254
255
  }
255
256
  async invoke(input, options) {
@@ -258,8 +259,9 @@ var ConfigurableModel = class ConfigurableModel extends BaseChatModel {
258
259
  return model.invoke(input, config);
259
260
  }
260
261
  async stream(input, options) {
262
+ const model = await this._model(options);
261
263
  const wrappedGenerator = new AsyncGeneratorWithSetup({
262
- generator: await (await this._model(options)).stream(input, options),
264
+ generator: await model.stream(input, options),
263
265
  config: options
264
266
  });
265
267
  await wrappedGenerator.setup;
@@ -1 +1 @@
1
- {"version":3,"file":"universal.js","names":[],"sources":["../../src/chat_models/universal.ts"],"sourcesContent":["import {\n BaseLanguageModelInput,\n ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport {\n BaseChatModel,\n BaseChatModelParams,\n BindToolsInput,\n type BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n type AIMessageChunk,\n MessageStructure,\n} from \"@langchain/core/messages\";\nimport {\n type RunnableBatchOptions,\n RunnableBinding,\n type RunnableConfig,\n type RunnableToolLike,\n ensureConfig,\n} from \"@langchain/core/runnables\";\nimport {\n AsyncGeneratorWithSetup,\n IterableReadableStream,\n} from \"@langchain/core/utils/stream\";\nimport {\n type LogStreamCallbackHandlerInput,\n type RunLogPatch,\n type StreamEvent,\n} from \"@langchain/core/tracers/log_stream\";\nimport { type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\n\n// TODO: remove once `EventStreamCallbackHandlerInput` is exposed in core\ninterface EventStreamCallbackHandlerInput extends Omit<\n LogStreamCallbackHandlerInput,\n \"_schemaFormat\"\n> {}\n\nexport interface ConfigurableChatModelCallOptions extends BaseChatModelCallOptions {\n tools?: (\n | StructuredToolInterface\n | Record<string, unknown>\n | ToolDefinition\n | RunnableToolLike\n )[];\n}\n\n// Configuration map for model providers\nexport const MODEL_PROVIDER_CONFIG = {\n openai: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n anthropic: {\n package: \"@langchain/anthropic\",\n className: \"ChatAnthropic\",\n },\n azure_openai: {\n package: \"@langchain/openai\",\n className: \"AzureChatOpenAI\",\n },\n cohere: {\n package: \"@langchain/cohere\",\n className: \"ChatCohere\",\n },\n \"google-vertexai\": {\n package: \"@langchain/google-vertexai\",\n className: \"ChatVertexAI\",\n },\n \"google-vertexai-web\": {\n package: \"@langchain/google-vertexai-web\",\n className: \"ChatVertexAI\",\n },\n \"google-genai\": {\n package: \"@langchain/google-genai\",\n className: \"ChatGoogleGenerativeAI\",\n },\n ollama: {\n package: \"@langchain/ollama\",\n className: \"ChatOllama\",\n },\n mistralai: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n groq: {\n package: \"@langchain/groq\",\n className: \"ChatGroq\",\n },\n cerebras: {\n package: \"@langchain/cerebras\",\n className: \"ChatCerebras\",\n },\n bedrock: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n aws: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n deepseek: {\n package: \"@langchain/deepseek\",\n className: \"ChatDeepSeek\",\n },\n xai: {\n package: \"@langchain/xai\",\n className: \"ChatXAI\",\n },\n fireworks: {\n package: \"@langchain/fireworks\",\n className: \"ChatFireworks\",\n },\n together: {\n package: \"@langchain/together-ai\",\n className: \"ChatTogetherAI\",\n hasCircularDependency: true,\n },\n perplexity: {\n package: \"@langchain/perplexity\",\n className: \"ChatPerplexity\",\n },\n} as const;\n\nconst SUPPORTED_PROVIDERS = Object.keys(\n MODEL_PROVIDER_CONFIG\n) as (keyof typeof MODEL_PROVIDER_CONFIG)[];\nexport type ChatModelProvider = keyof typeof MODEL_PROVIDER_CONFIG;\ntype ModelProviderConfig = {\n package: string;\n className: string;\n hasCircularDependency?: boolean;\n};\n\n/**\n * Helper function to get a chat model class by its class name or model provider.\n * @param className The class name (e.g., \"ChatOpenAI\", \"ChatAnthropic\")\n * @param modelProvider Optional model provider key for direct lookup (e.g., \"google-vertexai-web\").\n * When provided, uses direct lookup to avoid className collision issues.\n * @returns The imported model class or undefined if not found\n */\nexport async function getChatModelByClassName(\n className: string,\n modelProvider?: string\n) {\n let config: ModelProviderConfig | undefined;\n\n if (modelProvider) {\n // Direct lookup by modelProvider key - avoids className collision\n // (e.g., google-vertexai and google-vertexai-web both use \"ChatVertexAI\")\n config = MODEL_PROVIDER_CONFIG[\n modelProvider as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig | undefined;\n } else {\n // Fallback to className lookup for backward compatibility\n const providerEntry = Object.entries(MODEL_PROVIDER_CONFIG).find(\n ([, c]) => c.className === className\n );\n config = providerEntry\n ? (providerEntry[1] as ModelProviderConfig)\n : undefined;\n }\n\n if (!config) {\n return undefined;\n }\n\n try {\n const module = await import(config.package);\n return module[config.className];\n } catch (e: unknown) {\n const err = e as Error;\n if (\n \"code\" in err &&\n err.code?.toString().includes(\"ERR_MODULE_NOT_FOUND\") &&\n \"message\" in err &&\n typeof err.message === \"string\"\n ) {\n const msg = err.message.startsWith(\"Error: \")\n ? err.message.slice(\"Error: \".length)\n : err.message;\n const attemptedPackage = msg\n .split(\"Cannot find package '\")[1]\n .split(\"'\")[0];\n throw new Error(\n `Unable to import ${attemptedPackage}. Please install with ` +\n `\\`npm install ${attemptedPackage}\\` or \\`pnpm install ${attemptedPackage}\\``\n );\n }\n throw e;\n }\n}\n\nasync function _initChatModelHelper(\n model: string,\n modelProvider?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any> = {}\n): Promise<BaseChatModel> {\n const modelProviderCopy = modelProvider || _inferModelProvider(model);\n if (!modelProviderCopy) {\n throw new Error(\n `Unable to infer model provider for { model: ${model} }, please specify modelProvider directly.`\n );\n }\n\n const config = MODEL_PROVIDER_CONFIG[\n modelProviderCopy as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig;\n if (!config) {\n const supported = SUPPORTED_PROVIDERS.join(\", \");\n throw new Error(\n `Unsupported { modelProvider: ${modelProviderCopy} }.\\n\\nSupported model providers are: ${supported}`\n );\n }\n\n const { modelProvider: _unused, ...passedParams } = params;\n // Pass modelProviderCopy to use direct lookup and avoid className collision\n const ProviderClass = await getChatModelByClassName(\n config.className,\n modelProviderCopy\n );\n return new ProviderClass({ model, ...passedParams });\n}\n\n/**\n * Attempts to infer the model provider based on the given model name.\n *\n * @param {string} modelName - The name of the model to infer the provider for.\n * @returns {string | undefined} The inferred model provider name, or undefined if unable to infer.\n *\n * @example\n * _inferModelProvider(\"gpt-4\"); // returns \"openai\"\n * _inferModelProvider(\"claude-2\"); // returns \"anthropic\"\n * _inferModelProvider(\"unknown-model\"); // returns undefined\n */\nexport function _inferModelProvider(modelName: string): string | undefined {\n if (\n modelName.startsWith(\"gpt-3\") ||\n modelName.startsWith(\"gpt-4\") ||\n modelName.startsWith(\"gpt-5\") ||\n modelName.startsWith(\"o1\") ||\n modelName.startsWith(\"o3\") ||\n modelName.startsWith(\"o4\")\n ) {\n return \"openai\";\n } else if (modelName.startsWith(\"claude\")) {\n return \"anthropic\";\n } else if (modelName.startsWith(\"command\")) {\n return \"cohere\";\n } else if (modelName.startsWith(\"accounts/fireworks\")) {\n return \"fireworks\";\n } else if (modelName.startsWith(\"gemini\")) {\n return \"google-vertexai\";\n } else if (modelName.startsWith(\"amazon.\")) {\n return \"bedrock\";\n } else if (modelName.startsWith(\"mistral\")) {\n return \"mistralai\";\n } else if (modelName.startsWith(\"sonar\") || modelName.startsWith(\"pplx\")) {\n return \"perplexity\";\n } else {\n return undefined;\n }\n}\n\ninterface ConfigurableModelFields extends BaseChatModelParams {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n defaultConfig?: Record<string, any>;\n /**\n * @default \"any\"\n */\n configurableFields?: string[] | \"any\";\n /**\n * @default \"\"\n */\n configPrefix?: string;\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n queuedMethodOperations?: Record<string, any>;\n}\n\n/**\n * Internal class used to create chat models.\n *\n * @internal\n */\nexport class ConfigurableModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n _llmType(): string {\n return \"chat_model\";\n }\n\n lc_namespace = [\"langchain\", \"chat_models\"];\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _defaultConfig?: Record<string, any> = {};\n\n /**\n * @default \"any\"\n */\n _configurableFields: string[] | \"any\" = \"any\";\n\n /**\n * @default \"\"\n */\n _configPrefix: string;\n\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _queuedMethodOperations: Record<string, any> = {};\n\n constructor(fields: ConfigurableModelFields) {\n super(fields);\n this._defaultConfig = fields.defaultConfig ?? {};\n\n if (fields.configurableFields === \"any\") {\n this._configurableFields = \"any\";\n } else {\n this._configurableFields = fields.configurableFields ?? [\n \"model\",\n \"modelProvider\",\n ];\n }\n\n if (fields.configPrefix) {\n this._configPrefix = fields.configPrefix.endsWith(\"_\")\n ? fields.configPrefix\n : `${fields.configPrefix}_`;\n } else {\n this._configPrefix = \"\";\n }\n\n this._queuedMethodOperations =\n fields.queuedMethodOperations ?? this._queuedMethodOperations;\n }\n\n async _model(\n config?: RunnableConfig\n ): Promise<\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n > {\n const params = { ...this._defaultConfig, ...this._modelParams(config) };\n let initializedModel = await _initChatModelHelper(\n params.model,\n params.modelProvider,\n params\n );\n\n // Apply queued method operations\n const queuedMethodOperationsEntries = Object.entries(\n this._queuedMethodOperations\n );\n if (queuedMethodOperationsEntries.length > 0) {\n for (const [method, args] of queuedMethodOperationsEntries) {\n if (\n method in initializedModel &&\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (initializedModel as any)[method] === \"function\"\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n initializedModel = await (initializedModel as any)[method](...args);\n }\n }\n }\n\n return initializedModel;\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const model = await this._model(options);\n return model._generate(messages, options ?? {}, runManager);\n }\n\n override bindTools(\n tools: BindToolsInput[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>\n ): ConfigurableModel<RunInput, CallOptions> {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.bindTools = [tools, params];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n });\n }\n\n // Extract the input types from the `BaseModel` class.\n withStructuredOutput: BaseChatModel[\"withStructuredOutput\"] = (\n schema,\n ...args\n ): ReturnType<BaseChatModel[\"withStructuredOutput\"]> => {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.withStructuredOutput = [schema, ...args];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n }) as unknown as ReturnType<BaseChatModel[\"withStructuredOutput\"]>;\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _modelParams(config?: RunnableConfig): Record<string, any> {\n const configurable = config?.configurable ?? {};\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n let modelParams: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(configurable)) {\n if (key.startsWith(this._configPrefix)) {\n const strippedKey = this._removePrefix(key, this._configPrefix);\n modelParams[strippedKey] = value;\n }\n }\n\n if (this._configurableFields !== \"any\") {\n modelParams = Object.fromEntries(\n Object.entries(modelParams).filter(([key]) =>\n this._configurableFields.includes(key)\n )\n );\n }\n\n return modelParams;\n }\n\n _removePrefix(str: string, prefix: string): string {\n return str.startsWith(prefix) ? str.slice(prefix.length) : str;\n }\n\n /**\n * Bind config to a Runnable, returning a new Runnable.\n * @param {RunnableConfig | undefined} [config] - The config to bind.\n * @returns {RunnableBinding<RunInput, RunOutput, CallOptions>} A new RunnableBinding with the bound config.\n */\n withConfig(\n config?: RunnableConfig\n ): RunnableBinding<RunInput, AIMessageChunk, CallOptions> {\n const mergedConfig: RunnableConfig = { ...(config || {}) };\n const modelParams = this._modelParams(mergedConfig);\n\n const remainingConfig: RunnableConfig = Object.fromEntries(\n Object.entries(mergedConfig).filter(([k]) => k !== \"configurable\")\n );\n\n remainingConfig.configurable = Object.fromEntries(\n Object.entries(mergedConfig.configurable || {}).filter(\n ([k]) =>\n this._configPrefix &&\n !Object.keys(modelParams).includes(\n this._removePrefix(k, this._configPrefix)\n )\n )\n );\n\n const newConfigurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: { ...this._defaultConfig, ...modelParams },\n configurableFields: Array.isArray(this._configurableFields)\n ? [...this._configurableFields]\n : this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: this._queuedMethodOperations,\n });\n\n return new RunnableBinding<RunInput, AIMessageChunk, CallOptions>({\n config: mergedConfig,\n bound: newConfigurableModel,\n });\n }\n\n async invoke(\n input: RunInput,\n options?: CallOptions\n ): Promise<AIMessageChunk> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n return model.invoke(input, config);\n }\n\n async stream(\n input: RunInput,\n options?: CallOptions\n ): Promise<IterableReadableStream<AIMessageChunk>> {\n const model = await this._model(options);\n const wrappedGenerator = new AsyncGeneratorWithSetup({\n generator: await model.stream(input, options),\n config: options,\n });\n await wrappedGenerator.setup;\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator);\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<AIMessageChunk[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]> {\n // We can super this since the base runnable implementation of\n // `.batch` will call `.invoke` on each input.\n return super.batch(inputs, options, batchOptions);\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: CallOptions\n ): AsyncGenerator<AIMessageChunk> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n\n yield* model.transform(generator, config);\n }\n\n async *streamLog(\n input: RunInput,\n options?: Partial<CallOptions>,\n streamOptions?: Omit<LogStreamCallbackHandlerInput, \"autoClose\">\n ): AsyncGenerator<RunLogPatch> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n\n yield* model.streamLog(input, config, {\n ...streamOptions,\n _schemaFormat: \"original\",\n includeNames: streamOptions?.includeNames,\n includeTypes: streamOptions?.includeTypes,\n includeTags: streamOptions?.includeTags,\n excludeNames: streamOptions?.excludeNames,\n excludeTypes: streamOptions?.excludeTypes,\n excludeTags: streamOptions?.excludeTags,\n });\n }\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v1\" | \"v2\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\" | \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\" | \"v2\";\n encoding?: \"text/event-stream\" | undefined;\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent | Uint8Array> {\n const outerThis = this;\n async function* wrappedGenerator() {\n const model = await outerThis._model(options);\n const config = ensureConfig(options);\n const eventStream = model.streamEvents(input, config, streamOptions);\n\n for await (const chunk of eventStream) {\n yield chunk;\n }\n }\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator());\n }\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface InitChatModelFields extends Partial<Record<string, any>> {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n}\n\nexport type ConfigurableFields = \"any\" | string[];\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: never,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: ConfigurableFields;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\n// ################################# FOR CONTRIBUTORS #################################\n//\n// If adding support for a new provider, please append the provider\n// name to the supported list in the docstring below.\n//\n// ####################################################################################\n\n/**\n * Initialize a ChatModel from the model name and provider.\n * Must have the integration package corresponding to the model provider installed.\n *\n * @template {extends BaseLanguageModelInput = BaseLanguageModelInput} RunInput - The input type for the model.\n * @template {extends ConfigurableChatModelCallOptions = ConfigurableChatModelCallOptions} CallOptions - Call options for the model.\n *\n * @param {string | ChatModelProvider} [model] - The name of the model, e.g. \"gpt-4\", \"claude-3-opus-20240229\".\n * Can be prefixed with the model provider, e.g. \"openai:gpt-4\", \"anthropic:claude-3-opus-20240229\".\n * @param {Object} [fields] - Additional configuration options.\n * @param {string} [fields.modelProvider] - The model provider. Supported values include:\n * - openai (@langchain/openai)\n * - anthropic (@langchain/anthropic)\n * - azure_openai (@langchain/openai)\n * - google-vertexai (@langchain/google-vertexai)\n * - google-vertexai-web (@langchain/google-vertexai-web)\n * - google-genai (@langchain/google-genai)\n * - bedrock (@langchain/aws)\n * - cohere (@langchain/cohere)\n * - fireworks (@langchain/fireworks)\n * - together (@langchain/together-ai)\n * - mistralai (@langchain/mistralai)\n * - groq (@langchain/groq)\n * - ollama (@langchain/ollama)\n * - perplexity (@langchain/perplexity)\n * - cerebras (@langchain/cerebras)\n * - deepseek (@langchain/deepseek)\n * - xai (@langchain/xai)\n * @param {string[] | \"any\"} [fields.configurableFields] - Which model parameters are configurable:\n * - undefined: No configurable fields.\n * - \"any\": All fields are configurable. (See Security Note in description)\n * - string[]: Specified fields are configurable.\n * @param {string} [fields.configPrefix] - Prefix for configurable fields at runtime.\n * @param {Record<string, any>} [fields.params] - Additional keyword args to pass to the ChatModel constructor.\n * @returns {Promise<ConfigurableModel<RunInput, CallOptions>>} A class which extends BaseChatModel.\n * @throws {Error} If modelProvider cannot be inferred or isn't supported.\n * @throws {Error} If the model provider integration package is not installed.\n *\n * @example Initialize non-configurable models\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const gpt4 = await initChatModel(\"openai:gpt-4\", {\n * temperature: 0.25,\n * });\n * const gpt4Result = await gpt4.invoke(\"what's your name\");\n *\n * const claude = await initChatModel(\"anthropic:claude-3-opus-20240229\", {\n * temperature: 0.25,\n * });\n * const claudeResult = await claude.invoke(\"what's your name\");\n *\n * const gemini = await initChatModel(\"gemini-1.5-pro\", {\n * modelProvider: \"google-vertexai\",\n * temperature: 0.25,\n * });\n * const geminiResult = await gemini.invoke(\"what's your name\");\n * ```\n *\n * @example Create a partially configurable model with no default model\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModel = await initChatModel(undefined, {\n * temperature: 0,\n * configurableFields: [\"model\", \"apiKey\"],\n * });\n *\n * const gpt4Result = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"gpt-4\",\n * },\n * });\n *\n * const claudeResult = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * },\n * });\n * ```\n *\n * @example Create a fully configurable model with a default model and a config prefix\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModelWithDefault = await initChatModel(\"gpt-4\", {\n * modelProvider: \"openai\",\n * configurableFields: \"any\",\n * configPrefix: \"foo\",\n * temperature: 0,\n * });\n *\n * const openaiResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const claudeResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_model: \"claude-sonnet-4-5-20250929\",\n * foo_modelProvider: \"anthropic\",\n * foo_temperature: 0.6,\n * foo_apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Bind tools to a configurable model:\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n * import { z } from \"zod/v3\";\n * import { tool } from \"@langchain/core/tools\";\n *\n * const getWeatherTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current weather in a given location\"),\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * }\n * );\n *\n * const getPopulationTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current population in a given location\"),\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * }\n * );\n *\n * const configurableModel = await initChatModel(\"gpt-4\", {\n * configurableFields: [\"model\", \"modelProvider\", \"apiKey\"],\n * temperature: 0,\n * });\n *\n * const configurableModelWithTools = configurableModel.bindTools([\n * getWeatherTool,\n * getPopulationTool,\n * ]);\n *\n * const configurableToolResult = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const configurableToolResult2 = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @description\n * This function initializes a ChatModel based on the provided model name and provider.\n * It supports various model providers and allows for runtime configuration of model parameters.\n *\n * Security Note: Setting `configurableFields` to \"any\" means fields like apiKey, baseUrl, etc.\n * can be altered at runtime, potentially redirecting model requests to a different service/user.\n * Make sure that if you're accepting untrusted configurations, you enumerate the\n * `configurableFields` explicitly.\n *\n * The function will attempt to infer the model provider from the model name if not specified.\n * Certain model name prefixes are associated with specific providers:\n * - gpt-3... or gpt-4... -> openai\n * - claude... -> anthropic\n * - amazon.... -> bedrock\n * - gemini... -> google-vertexai\n * - command... -> cohere\n * - accounts/fireworks... -> fireworks\n *\n * @since 0.2.11\n * @version 0.2.11\n */\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>> {\n // oxlint-disable-next-line prefer-const\n let { configurableFields, configPrefix, modelProvider, ...params } = {\n configPrefix: \"\",\n ...(fields ?? {}),\n };\n if (modelProvider === undefined && model?.includes(\":\")) {\n const modelComponents = model.split(\":\", 2);\n if (SUPPORTED_PROVIDERS.includes(modelComponents[0] as ChatModelProvider)) {\n // oxlint-disable-next-line no-param-reassign\n [modelProvider, model] = modelComponents;\n }\n }\n let configurableFieldsCopy = Array.isArray(configurableFields)\n ? [...configurableFields]\n : configurableFields;\n\n if (!model && configurableFieldsCopy === undefined) {\n configurableFieldsCopy = [\"model\", \"modelProvider\"];\n }\n if (configPrefix && configurableFieldsCopy === undefined) {\n console.warn(\n `{ configPrefix: ${configPrefix} } has been set but no fields are configurable. Set ` +\n `{ configurableFields: [...] } to specify the model params that are ` +\n `configurable.`\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const paramsCopy: Record<string, any> = { ...params };\n\n if (configurableFieldsCopy === undefined) {\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: {\n ...paramsCopy,\n model,\n modelProvider,\n },\n configPrefix,\n });\n } else {\n if (model) {\n paramsCopy.model = model;\n }\n if (modelProvider) {\n paramsCopy.modelProvider = modelProvider;\n }\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: paramsCopy,\n configPrefix,\n configurableFields: configurableFieldsCopy,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"universal.js","names":[],"sources":["../../src/chat_models/universal.ts"],"sourcesContent":["import {\n BaseLanguageModelInput,\n ToolDefinition,\n} from \"@langchain/core/language_models/base\";\nimport {\n BaseChatModel,\n BaseChatModelParams,\n BindToolsInput,\n type BaseChatModelCallOptions,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseMessage,\n type AIMessageChunk,\n MessageStructure,\n} from \"@langchain/core/messages\";\nimport {\n type RunnableBatchOptions,\n RunnableBinding,\n type RunnableConfig,\n type RunnableToolLike,\n ensureConfig,\n} from \"@langchain/core/runnables\";\nimport {\n AsyncGeneratorWithSetup,\n IterableReadableStream,\n} from \"@langchain/core/utils/stream\";\nimport {\n type LogStreamCallbackHandlerInput,\n type RunLogPatch,\n type StreamEvent,\n} from \"@langchain/core/tracers/log_stream\";\nimport { type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { ChatResult } from \"@langchain/core/outputs\";\n\n// TODO: remove once `EventStreamCallbackHandlerInput` is exposed in core\ninterface EventStreamCallbackHandlerInput extends Omit<\n LogStreamCallbackHandlerInput,\n \"_schemaFormat\"\n> {}\n\nexport interface ConfigurableChatModelCallOptions extends BaseChatModelCallOptions {\n tools?: (\n | StructuredToolInterface\n | Record<string, unknown>\n | ToolDefinition\n | RunnableToolLike\n )[];\n}\n\n// Configuration map for model providers\nexport const MODEL_PROVIDER_CONFIG = {\n openai: {\n package: \"@langchain/openai\",\n className: \"ChatOpenAI\",\n },\n anthropic: {\n package: \"@langchain/anthropic\",\n className: \"ChatAnthropic\",\n },\n azure_openai: {\n package: \"@langchain/openai\",\n className: \"AzureChatOpenAI\",\n },\n cohere: {\n package: \"@langchain/cohere\",\n className: \"ChatCohere\",\n },\n \"google-vertexai\": {\n package: \"@langchain/google-vertexai\",\n className: \"ChatVertexAI\",\n },\n \"google-vertexai-web\": {\n package: \"@langchain/google-vertexai-web\",\n className: \"ChatVertexAI\",\n },\n \"google-genai\": {\n package: \"@langchain/google-genai\",\n className: \"ChatGoogleGenerativeAI\",\n },\n ollama: {\n package: \"@langchain/ollama\",\n className: \"ChatOllama\",\n },\n mistralai: {\n package: \"@langchain/mistralai\",\n className: \"ChatMistralAI\",\n },\n groq: {\n package: \"@langchain/groq\",\n className: \"ChatGroq\",\n },\n cerebras: {\n package: \"@langchain/cerebras\",\n className: \"ChatCerebras\",\n },\n bedrock: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n aws: {\n package: \"@langchain/aws\",\n className: \"ChatBedrockConverse\",\n },\n deepseek: {\n package: \"@langchain/deepseek\",\n className: \"ChatDeepSeek\",\n },\n xai: {\n package: \"@langchain/xai\",\n className: \"ChatXAI\",\n },\n fireworks: {\n package: \"@langchain/fireworks\",\n className: \"ChatFireworks\",\n },\n together: {\n package: \"@langchain/together-ai\",\n className: \"ChatTogetherAI\",\n hasCircularDependency: true,\n },\n perplexity: {\n package: \"@langchain/perplexity\",\n className: \"ChatPerplexity\",\n },\n} as const;\n\nconst SUPPORTED_PROVIDERS = Object.keys(\n MODEL_PROVIDER_CONFIG\n) as (keyof typeof MODEL_PROVIDER_CONFIG)[];\nexport type ChatModelProvider = keyof typeof MODEL_PROVIDER_CONFIG;\ntype ModelProviderConfig = {\n package: string;\n className: string;\n hasCircularDependency?: boolean;\n};\n\n/**\n * Helper function to get a chat model class by its class name or model provider.\n * @param className The class name (e.g., \"ChatOpenAI\", \"ChatAnthropic\")\n * @param modelProvider Optional model provider key for direct lookup (e.g., \"google-vertexai-web\").\n * When provided, uses direct lookup to avoid className collision issues.\n * @returns The imported model class or undefined if not found\n */\nexport async function getChatModelByClassName(\n className: string,\n modelProvider?: string\n) {\n let config: ModelProviderConfig | undefined;\n\n if (modelProvider) {\n // Direct lookup by modelProvider key - avoids className collision\n // (e.g., google-vertexai and google-vertexai-web both use \"ChatVertexAI\")\n config = MODEL_PROVIDER_CONFIG[\n modelProvider as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig | undefined;\n } else {\n // Fallback to className lookup for backward compatibility\n const providerEntry = Object.entries(MODEL_PROVIDER_CONFIG).find(\n ([, c]) => c.className === className\n );\n config = providerEntry\n ? (providerEntry[1] as ModelProviderConfig)\n : undefined;\n }\n\n if (!config) {\n return undefined;\n }\n\n try {\n const module = await import(config.package);\n return module[config.className];\n } catch (e: unknown) {\n const err = e as Error;\n if (\n \"code\" in err &&\n err.code?.toString().includes(\"ERR_MODULE_NOT_FOUND\") &&\n \"message\" in err &&\n typeof err.message === \"string\"\n ) {\n const msg = err.message.startsWith(\"Error: \")\n ? err.message.slice(\"Error: \".length)\n : err.message;\n const attemptedPackage = msg\n .split(\"Cannot find package '\")[1]\n .split(\"'\")[0];\n throw new Error(\n `Unable to import ${attemptedPackage}. Please install with ` +\n `\\`npm install ${attemptedPackage}\\` or \\`pnpm install ${attemptedPackage}\\``\n );\n }\n throw e;\n }\n}\n\nasync function _initChatModelHelper(\n model: string,\n modelProvider?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any> = {}\n): Promise<BaseChatModel> {\n const modelProviderCopy = modelProvider || _inferModelProvider(model);\n if (!modelProviderCopy) {\n throw new Error(\n `Unable to infer model provider for { model: ${model} }, please specify modelProvider directly.`\n );\n }\n\n const config = MODEL_PROVIDER_CONFIG[\n modelProviderCopy as keyof typeof MODEL_PROVIDER_CONFIG\n ] as ModelProviderConfig;\n if (!config) {\n const supported = SUPPORTED_PROVIDERS.join(\", \");\n throw new Error(\n `Unsupported { modelProvider: ${modelProviderCopy} }.\\n\\nSupported model providers are: ${supported}`\n );\n }\n\n const { modelProvider: _unused, ...passedParams } = params;\n // Pass modelProviderCopy to use direct lookup and avoid className collision\n const ProviderClass = await getChatModelByClassName(\n config.className,\n modelProviderCopy\n );\n return new ProviderClass({ model, ...passedParams });\n}\n\n/**\n * Attempts to infer the model provider based on the given model name.\n *\n * @param {string} modelName - The name of the model to infer the provider for.\n * @returns {string | undefined} The inferred model provider name, or undefined if unable to infer.\n *\n * @example\n * _inferModelProvider(\"gpt-4\"); // returns \"openai\"\n * _inferModelProvider(\"claude-2\"); // returns \"anthropic\"\n * _inferModelProvider(\"unknown-model\"); // returns undefined\n */\nexport function _inferModelProvider(modelName: string): string | undefined {\n if (\n modelName.startsWith(\"gpt-3\") ||\n modelName.startsWith(\"gpt-4\") ||\n modelName.startsWith(\"gpt-5\") ||\n modelName.startsWith(\"o1\") ||\n modelName.startsWith(\"o3\") ||\n modelName.startsWith(\"o4\")\n ) {\n return \"openai\";\n } else if (modelName.startsWith(\"claude\")) {\n return \"anthropic\";\n } else if (modelName.startsWith(\"command\")) {\n return \"cohere\";\n } else if (modelName.startsWith(\"accounts/fireworks\")) {\n return \"fireworks\";\n } else if (modelName.startsWith(\"gemini\")) {\n return \"google-vertexai\";\n } else if (modelName.startsWith(\"amazon.\")) {\n return \"bedrock\";\n } else if (modelName.startsWith(\"mistral\")) {\n return \"mistralai\";\n } else if (modelName.startsWith(\"sonar\") || modelName.startsWith(\"pplx\")) {\n return \"perplexity\";\n } else {\n return undefined;\n }\n}\n\ninterface ConfigurableModelFields extends BaseChatModelParams {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n defaultConfig?: Record<string, any>;\n /**\n * @default \"any\"\n */\n configurableFields?: string[] | \"any\";\n /**\n * @default \"\"\n */\n configPrefix?: string;\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n queuedMethodOperations?: Record<string, any>;\n}\n\n/**\n * Internal class used to create chat models.\n *\n * @internal\n */\nexport class ConfigurableModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n> extends BaseChatModel<CallOptions, AIMessageChunk> {\n _llmType(): string {\n return \"chat_model\";\n }\n\n lc_namespace = [\"langchain\", \"chat_models\"];\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _defaultConfig?: Record<string, any> = {};\n\n /**\n * @default \"any\"\n */\n _configurableFields: string[] | \"any\" = \"any\";\n\n /**\n * @default \"\"\n */\n _configPrefix: string;\n\n /**\n * Methods which should be called after the model is initialized.\n * The key will be the method name, and the value will be the arguments.\n */\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _queuedMethodOperations: Record<string, any> = {};\n\n constructor(fields: ConfigurableModelFields) {\n super(fields);\n this._defaultConfig = fields.defaultConfig ?? {};\n\n if (fields.configurableFields === \"any\") {\n this._configurableFields = \"any\";\n } else {\n this._configurableFields = fields.configurableFields ?? [\n \"model\",\n \"modelProvider\",\n ];\n }\n\n if (fields.configPrefix) {\n this._configPrefix = fields.configPrefix.endsWith(\"_\")\n ? fields.configPrefix\n : `${fields.configPrefix}_`;\n } else {\n this._configPrefix = \"\";\n }\n\n this._queuedMethodOperations =\n fields.queuedMethodOperations ?? this._queuedMethodOperations;\n }\n\n async _model(\n config?: RunnableConfig\n ): Promise<\n BaseChatModel<BaseChatModelCallOptions, AIMessageChunk<MessageStructure>>\n > {\n const params = { ...this._defaultConfig, ...this._modelParams(config) };\n let initializedModel = await _initChatModelHelper(\n params.model,\n params.modelProvider,\n params\n );\n\n // Apply queued method operations\n const queuedMethodOperationsEntries = Object.entries(\n this._queuedMethodOperations\n );\n if (queuedMethodOperationsEntries.length > 0) {\n for (const [method, args] of queuedMethodOperationsEntries) {\n if (\n method in initializedModel &&\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (initializedModel as any)[method] === \"function\"\n ) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n initializedModel = await (initializedModel as any)[method](...args);\n }\n }\n }\n\n return initializedModel;\n }\n\n async _generate(\n messages: BaseMessage[],\n options?: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const model = await this._model(options);\n return model._generate(messages, options ?? {}, runManager);\n }\n\n override bindTools(\n tools: BindToolsInput[],\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>\n ): ConfigurableModel<RunInput, CallOptions> {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.bindTools = [tools, params];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n });\n }\n\n // Extract the input types from the `BaseModel` class.\n withStructuredOutput: BaseChatModel[\"withStructuredOutput\"] = (\n schema,\n ...args\n ): ReturnType<BaseChatModel[\"withStructuredOutput\"]> => {\n const newQueuedOperations = { ...this._queuedMethodOperations };\n newQueuedOperations.withStructuredOutput = [schema, ...args];\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: this._defaultConfig,\n configurableFields: this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: newQueuedOperations,\n }) as unknown as ReturnType<BaseChatModel[\"withStructuredOutput\"]>;\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n _modelParams(config?: RunnableConfig): Record<string, any> {\n const configurable = config?.configurable ?? {};\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n let modelParams: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(configurable)) {\n if (key.startsWith(this._configPrefix)) {\n const strippedKey = this._removePrefix(key, this._configPrefix);\n modelParams[strippedKey] = value;\n }\n }\n\n if (this._configurableFields !== \"any\") {\n modelParams = Object.fromEntries(\n Object.entries(modelParams).filter(([key]) =>\n this._configurableFields.includes(key)\n )\n );\n }\n\n return modelParams;\n }\n\n _removePrefix(str: string, prefix: string): string {\n return str.startsWith(prefix) ? str.slice(prefix.length) : str;\n }\n\n /**\n * Bind config to a Runnable, returning a new Runnable.\n * @param {RunnableConfig | undefined} [config] - The config to bind.\n * @returns {RunnableBinding<RunInput, RunOutput, CallOptions>} A new RunnableBinding with the bound config.\n */\n withConfig(\n config?: RunnableConfig\n ): RunnableBinding<RunInput, AIMessageChunk, CallOptions> {\n const mergedConfig: RunnableConfig = { ...(config || {}) };\n const modelParams = this._modelParams(mergedConfig);\n\n const remainingConfig: RunnableConfig = Object.fromEntries(\n Object.entries(mergedConfig).filter(([k]) => k !== \"configurable\")\n );\n\n remainingConfig.configurable = Object.fromEntries(\n Object.entries(mergedConfig.configurable || {}).filter(\n ([k]) =>\n this._configPrefix &&\n !Object.keys(modelParams).includes(\n this._removePrefix(k, this._configPrefix)\n )\n )\n );\n\n const newConfigurableModel = new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: { ...this._defaultConfig, ...modelParams },\n configurableFields: Array.isArray(this._configurableFields)\n ? [...this._configurableFields]\n : this._configurableFields,\n configPrefix: this._configPrefix,\n queuedMethodOperations: this._queuedMethodOperations,\n });\n\n return new RunnableBinding<RunInput, AIMessageChunk, CallOptions>({\n config: mergedConfig,\n bound: newConfigurableModel,\n });\n }\n\n async invoke(\n input: RunInput,\n options?: CallOptions\n ): Promise<AIMessageChunk> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n return model.invoke(input, config);\n }\n\n async stream(\n input: RunInput,\n options?: CallOptions\n ): Promise<IterableReadableStream<AIMessageChunk>> {\n const model = await this._model(options);\n const wrappedGenerator = new AsyncGeneratorWithSetup({\n generator: await model.stream(input, options),\n config: options,\n });\n await wrappedGenerator.setup;\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator);\n }\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions?: false }\n ): Promise<AIMessageChunk[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions & { returnExceptions: true }\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]>;\n\n async batch(\n inputs: RunInput[],\n options?: Partial<CallOptions> | Partial<CallOptions>[],\n batchOptions?: RunnableBatchOptions\n ): Promise<(AIMessageChunk | Error)[]> {\n // We can super this since the base runnable implementation of\n // `.batch` will call `.invoke` on each input.\n return super.batch(inputs, options, batchOptions);\n }\n\n async *transform(\n generator: AsyncGenerator<RunInput>,\n options: CallOptions\n ): AsyncGenerator<AIMessageChunk> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n\n yield* model.transform(generator, config);\n }\n\n async *streamLog(\n input: RunInput,\n options?: Partial<CallOptions>,\n streamOptions?: Omit<LogStreamCallbackHandlerInput, \"autoClose\">\n ): AsyncGenerator<RunLogPatch> {\n const model = await this._model(options);\n const config = ensureConfig(options);\n\n yield* model.streamLog(input, config, {\n ...streamOptions,\n _schemaFormat: \"original\",\n includeNames: streamOptions?.includeNames,\n includeTypes: streamOptions?.includeTypes,\n includeTags: streamOptions?.includeTags,\n excludeNames: streamOptions?.excludeNames,\n excludeTypes: streamOptions?.excludeTypes,\n excludeTags: streamOptions?.excludeTags,\n });\n }\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & { version: \"v1\" | \"v2\" },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent>;\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\" | \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<Uint8Array>;\n\n streamEvents(\n input: RunInput,\n options: Partial<CallOptions> & {\n version: \"v1\" | \"v2\";\n encoding?: \"text/event-stream\" | undefined;\n },\n streamOptions?: Omit<EventStreamCallbackHandlerInput, \"autoClose\">\n ): IterableReadableStream<StreamEvent | Uint8Array> {\n const outerThis = this;\n async function* wrappedGenerator() {\n const model = await outerThis._model(options);\n const config = ensureConfig(options);\n const eventStream = model.streamEvents(input, config, streamOptions);\n\n for await (const chunk of eventStream) {\n yield chunk;\n }\n }\n return IterableReadableStream.fromAsyncGenerator(wrappedGenerator());\n }\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface InitChatModelFields extends Partial<Record<string, any>> {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n}\n\nexport type ConfigurableFields = \"any\" | string[];\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model: never,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: never;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n options?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: ConfigurableFields;\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>>;\n\n// ################################# FOR CONTRIBUTORS #################################\n//\n// If adding support for a new provider, please append the provider\n// name to the supported list in the docstring below.\n//\n// ####################################################################################\n\n/**\n * Initialize a ChatModel from the model name and provider.\n * Must have the integration package corresponding to the model provider installed.\n *\n * @template {extends BaseLanguageModelInput = BaseLanguageModelInput} RunInput - The input type for the model.\n * @template {extends ConfigurableChatModelCallOptions = ConfigurableChatModelCallOptions} CallOptions - Call options for the model.\n *\n * @param {string | ChatModelProvider} [model] - The name of the model, e.g. \"gpt-4\", \"claude-3-opus-20240229\".\n * Can be prefixed with the model provider, e.g. \"openai:gpt-4\", \"anthropic:claude-3-opus-20240229\".\n * @param {Object} [fields] - Additional configuration options.\n * @param {string} [fields.modelProvider] - The model provider. Supported values include:\n * - openai (@langchain/openai)\n * - anthropic (@langchain/anthropic)\n * - azure_openai (@langchain/openai)\n * - google-vertexai (@langchain/google-vertexai)\n * - google-vertexai-web (@langchain/google-vertexai-web)\n * - google-genai (@langchain/google-genai)\n * - bedrock (@langchain/aws)\n * - cohere (@langchain/cohere)\n * - fireworks (@langchain/fireworks)\n * - together (@langchain/together-ai)\n * - mistralai (@langchain/mistralai)\n * - groq (@langchain/groq)\n * - ollama (@langchain/ollama)\n * - perplexity (@langchain/perplexity)\n * - cerebras (@langchain/cerebras)\n * - deepseek (@langchain/deepseek)\n * - xai (@langchain/xai)\n * @param {string[] | \"any\"} [fields.configurableFields] - Which model parameters are configurable:\n * - undefined: No configurable fields.\n * - \"any\": All fields are configurable. (See Security Note in description)\n * - string[]: Specified fields are configurable.\n * @param {string} [fields.configPrefix] - Prefix for configurable fields at runtime.\n * @param {Record<string, any>} [fields.params] - Additional keyword args to pass to the ChatModel constructor.\n * @returns {Promise<ConfigurableModel<RunInput, CallOptions>>} A class which extends BaseChatModel.\n * @throws {Error} If modelProvider cannot be inferred or isn't supported.\n * @throws {Error} If the model provider integration package is not installed.\n *\n * @example Initialize non-configurable models\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const gpt4 = await initChatModel(\"openai:gpt-4\", {\n * temperature: 0.25,\n * });\n * const gpt4Result = await gpt4.invoke(\"what's your name\");\n *\n * const claude = await initChatModel(\"anthropic:claude-3-opus-20240229\", {\n * temperature: 0.25,\n * });\n * const claudeResult = await claude.invoke(\"what's your name\");\n *\n * const gemini = await initChatModel(\"gemini-1.5-pro\", {\n * modelProvider: \"google-vertexai\",\n * temperature: 0.25,\n * });\n * const geminiResult = await gemini.invoke(\"what's your name\");\n * ```\n *\n * @example Create a partially configurable model with no default model\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModel = await initChatModel(undefined, {\n * temperature: 0,\n * configurableFields: [\"model\", \"apiKey\"],\n * });\n *\n * const gpt4Result = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"gpt-4\",\n * },\n * });\n *\n * const claudeResult = await configurableModel.invoke(\"what's your name\", {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * },\n * });\n * ```\n *\n * @example Create a fully configurable model with a default model and a config prefix\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n *\n * const configurableModelWithDefault = await initChatModel(\"gpt-4\", {\n * modelProvider: \"openai\",\n * configurableFields: \"any\",\n * configPrefix: \"foo\",\n * temperature: 0,\n * });\n *\n * const openaiResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const claudeResult = await configurableModelWithDefault.invoke(\n * \"what's your name\",\n * {\n * configurable: {\n * foo_model: \"claude-sonnet-4-5-20250929\",\n * foo_modelProvider: \"anthropic\",\n * foo_temperature: 0.6,\n * foo_apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @example Bind tools to a configurable model:\n * ```typescript\n * import { initChatModel } from \"langchain/chat_models/universal\";\n * import { z } from \"zod/v3\";\n * import { tool } from \"@langchain/core/tools\";\n *\n * const getWeatherTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current weather in a given location\"),\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * }\n * );\n *\n * const getPopulationTool = tool(\n * (input) => {\n * // Do something with the input\n * return JSON.stringify(input);\n * },\n * {\n * schema: z\n * .object({\n * location: z\n * .string()\n * .describe(\"The city and state, e.g. San Francisco, CA\"),\n * })\n * .describe(\"Get the current population in a given location\"),\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * }\n * );\n *\n * const configurableModel = await initChatModel(\"gpt-4\", {\n * configurableFields: [\"model\", \"modelProvider\", \"apiKey\"],\n * temperature: 0,\n * });\n *\n * const configurableModelWithTools = configurableModel.bindTools([\n * getWeatherTool,\n * getPopulationTool,\n * ]);\n *\n * const configurableToolResult = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * apiKey: process.env.OPENAI_API_KEY,\n * },\n * }\n * );\n *\n * const configurableToolResult2 = await configurableModelWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\",\n * {\n * configurable: {\n * model: \"claude-sonnet-4-5-20250929\",\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * },\n * }\n * );\n * ```\n *\n * @description\n * This function initializes a ChatModel based on the provided model name and provider.\n * It supports various model providers and allows for runtime configuration of model parameters.\n *\n * Security Note: Setting `configurableFields` to \"any\" means fields like apiKey, baseUrl, etc.\n * can be altered at runtime, potentially redirecting model requests to a different service/user.\n * Make sure that if you're accepting untrusted configurations, you enumerate the\n * `configurableFields` explicitly.\n *\n * The function will attempt to infer the model provider from the model name if not specified.\n * Certain model name prefixes are associated with specific providers:\n * - gpt-3... or gpt-4... -> openai\n * - claude... -> anthropic\n * - amazon.... -> bedrock\n * - gemini... -> google-vertexai\n * - command... -> cohere\n * - accounts/fireworks... -> fireworks\n *\n * @since 0.2.11\n * @version 0.2.11\n */\nexport async function initChatModel<\n RunInput extends BaseLanguageModelInput = BaseLanguageModelInput,\n CallOptions extends ConfigurableChatModelCallOptions =\n ConfigurableChatModelCallOptions,\n>(\n model?: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n fields?: Partial<Record<string, any>> & {\n modelProvider?: string;\n configurableFields?: string[] | \"any\";\n configPrefix?: string;\n }\n): Promise<ConfigurableModel<RunInput, CallOptions>> {\n // oxlint-disable-next-line prefer-const\n let { configurableFields, configPrefix, modelProvider, ...params } = {\n configPrefix: \"\",\n ...(fields ?? {}),\n };\n if (modelProvider === undefined && model?.includes(\":\")) {\n const modelComponents = model.split(\":\", 2);\n if (SUPPORTED_PROVIDERS.includes(modelComponents[0] as ChatModelProvider)) {\n // oxlint-disable-next-line no-param-reassign\n [modelProvider, model] = modelComponents;\n }\n }\n let configurableFieldsCopy = Array.isArray(configurableFields)\n ? [...configurableFields]\n : configurableFields;\n\n if (!model && configurableFieldsCopy === undefined) {\n configurableFieldsCopy = [\"model\", \"modelProvider\"];\n }\n if (configPrefix && configurableFieldsCopy === undefined) {\n console.warn(\n `{ configPrefix: ${configPrefix} } has been set but no fields are configurable. Set ` +\n `{ configurableFields: [...] } to specify the model params that are ` +\n `configurable.`\n );\n }\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const paramsCopy: Record<string, any> = { ...params };\n\n if (configurableFieldsCopy === undefined) {\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: {\n ...paramsCopy,\n model,\n modelProvider,\n },\n configPrefix,\n });\n } else {\n if (model) {\n paramsCopy.model = model;\n }\n if (modelProvider) {\n paramsCopy.modelProvider = modelProvider;\n }\n return new ConfigurableModel<RunInput, CallOptions>({\n defaultConfig: paramsCopy,\n configPrefix,\n configurableFields: configurableFieldsCopy,\n });\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"buffer.cjs","names":["BaseDocumentLoader"],"sources":["../../../src/document_loaders/fs/buffer.ts"],"sourcesContent":["import type { readFile as ReadFileT } from \"node:fs/promises\";\nimport { Document } from \"@langchain/core/documents\";\nimport { getEnv } from \"@langchain/core/utils/env\";\nimport { BaseDocumentLoader } from \"@langchain/core/document_loaders/base\";\n\n/**\n * Abstract class that extends the `BaseDocumentLoader` class. It\n * represents a document loader that loads documents from a buffer. The\n * `load()` method is implemented to read the buffer contents and metadata\n * based on the type of `filePathOrBlob`, and then calls the `parse()`\n * method to parse the buffer and return the documents.\n */\nexport abstract class BufferLoader extends BaseDocumentLoader {\n constructor(public filePathOrBlob: string | Blob) {\n super();\n }\n\n /**\n * Abstract method that needs to be implemented by subclasses. It is used\n * to parse the buffer and return the documents.\n * @param raw The buffer to be parsed.\n * @param metadata Metadata of the document.\n * @returns Promise that resolves with an array of `Document` objects.\n */\n protected abstract parse(\n raw: Buffer,\n metadata: Document[\"metadata\"]\n ): Promise<Document[]>;\n\n /**\n * Method that reads the buffer contents and metadata based on the type of\n * `filePathOrBlob`, and then calls the `parse()` method to parse the\n * buffer and return the documents.\n * @returns Promise that resolves with an array of `Document` objects.\n */\n public async load(): Promise<Document[]> {\n let buffer: Buffer;\n let metadata: Record<string, string>;\n if (typeof this.filePathOrBlob === \"string\") {\n const { readFile } = await BufferLoader.imports();\n buffer = await readFile(this.filePathOrBlob);\n metadata = { source: this.filePathOrBlob };\n } else {\n buffer = await this.filePathOrBlob\n .arrayBuffer()\n .then((ab) => Buffer.from(ab));\n metadata = { source: \"blob\", blobType: this.filePathOrBlob.type };\n }\n return this.parse(buffer, metadata);\n }\n\n /**\n * Static method that imports the `readFile` function from the\n * `fs/promises` module in Node.js. It is used to dynamically import the\n * function when needed. If the import fails, it throws an error\n * indicating that the `fs/promises` module is not available in the\n * current environment.\n * @returns Promise that resolves with an object containing the `readFile` function.\n */\n static async imports(): Promise<{\n readFile: typeof ReadFileT;\n }> {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n return { readFile };\n } catch (e) {\n console.error(e);\n throw new Error(\n `Failed to load fs/promises. TextLoader available only on environment 'node'. It appears you are running environment '${getEnv()}'. See https://<link to docs> for alternatives.`\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,IAAsB,eAAtB,MAAsB,qBAAqBA,sCAAAA,mBAAmB;CACzC;CAAnB,YAAY,gBAAsC;EAChD,MAAM;EADW,KAAA,iBAAA;CAEnB;;;;;;;CAoBA,MAAa,OAA4B;EACvC,IAAI;EACJ,IAAI;EACJ,IAAI,OAAO,KAAK,mBAAmB,UAAU;GAC3C,MAAM,EAAE,aAAa,MAAM,aAAa,QAAQ;GAChD,SAAS,MAAM,SAAS,KAAK,cAAc;GAC3C,WAAW,EAAE,QAAQ,KAAK,eAAe;EAC3C,OAAO;GACL,SAAS,MAAM,KAAK,eACjB,YAAY,CAAC,CACb,MAAM,OAAO,OAAO,KAAK,EAAE,CAAC;GAC/B,WAAW;IAAE,QAAQ;IAAQ,UAAU,KAAK,eAAe;GAAK;EAClE;EACA,OAAO,KAAK,MAAM,QAAQ,QAAQ;CACpC;;;;;;;;;CAUA,aAAa,UAEV;EACD,IAAI;GACF,MAAM,EAAE,aAAa,MAAM,OAAO;GAClC,OAAO,EAAE,SAAS;EACpB,SAAS,GAAG;GACV,QAAQ,MAAM,CAAC;GACf,MAAM,IAAI,MACR,yHAAA,GAAA,0BAAA,OAAA,CAA+H,EAAE,gDACnI;EACF;CACF;AACF"}
1
+ {"version":3,"file":"buffer.cjs","names":["BaseDocumentLoader","getEnv"],"sources":["../../../src/document_loaders/fs/buffer.ts"],"sourcesContent":["import type { readFile as ReadFileT } from \"node:fs/promises\";\nimport { Document } from \"@langchain/core/documents\";\nimport { getEnv } from \"@langchain/core/utils/env\";\nimport { BaseDocumentLoader } from \"@langchain/core/document_loaders/base\";\n\n/**\n * Abstract class that extends the `BaseDocumentLoader` class. It\n * represents a document loader that loads documents from a buffer. The\n * `load()` method is implemented to read the buffer contents and metadata\n * based on the type of `filePathOrBlob`, and then calls the `parse()`\n * method to parse the buffer and return the documents.\n */\nexport abstract class BufferLoader extends BaseDocumentLoader {\n constructor(public filePathOrBlob: string | Blob) {\n super();\n }\n\n /**\n * Abstract method that needs to be implemented by subclasses. It is used\n * to parse the buffer and return the documents.\n * @param raw The buffer to be parsed.\n * @param metadata Metadata of the document.\n * @returns Promise that resolves with an array of `Document` objects.\n */\n protected abstract parse(\n raw: Buffer,\n metadata: Document[\"metadata\"]\n ): Promise<Document[]>;\n\n /**\n * Method that reads the buffer contents and metadata based on the type of\n * `filePathOrBlob`, and then calls the `parse()` method to parse the\n * buffer and return the documents.\n * @returns Promise that resolves with an array of `Document` objects.\n */\n public async load(): Promise<Document[]> {\n let buffer: Buffer;\n let metadata: Record<string, string>;\n if (typeof this.filePathOrBlob === \"string\") {\n const { readFile } = await BufferLoader.imports();\n buffer = await readFile(this.filePathOrBlob);\n metadata = { source: this.filePathOrBlob };\n } else {\n buffer = await this.filePathOrBlob\n .arrayBuffer()\n .then((ab) => Buffer.from(ab));\n metadata = { source: \"blob\", blobType: this.filePathOrBlob.type };\n }\n return this.parse(buffer, metadata);\n }\n\n /**\n * Static method that imports the `readFile` function from the\n * `fs/promises` module in Node.js. It is used to dynamically import the\n * function when needed. If the import fails, it throws an error\n * indicating that the `fs/promises` module is not available in the\n * current environment.\n * @returns Promise that resolves with an object containing the `readFile` function.\n */\n static async imports(): Promise<{\n readFile: typeof ReadFileT;\n }> {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n return { readFile };\n } catch (e) {\n console.error(e);\n throw new Error(\n `Failed to load fs/promises. TextLoader available only on environment 'node'. It appears you are running environment '${getEnv()}'. See https://<link to docs> for alternatives.`\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,IAAsB,eAAtB,MAAsB,qBAAqBA,sCAAAA,mBAAmB;CACzC;CAAnB,YAAY,gBAAsC;EAChD,MAAM;EADW,KAAA,iBAAA;CAEnB;;;;;;;CAoBA,MAAa,OAA4B;EACvC,IAAI;EACJ,IAAI;EACJ,IAAI,OAAO,KAAK,mBAAmB,UAAU;GAC3C,MAAM,EAAE,aAAa,MAAM,aAAa,QAAQ;GAChD,SAAS,MAAM,SAAS,KAAK,cAAc;GAC3C,WAAW,EAAE,QAAQ,KAAK,eAAe;EAC3C,OAAO;GACL,SAAS,MAAM,KAAK,eACjB,YAAY,CAAC,CACb,MAAM,OAAO,OAAO,KAAK,EAAE,CAAC;GAC/B,WAAW;IAAE,QAAQ;IAAQ,UAAU,KAAK,eAAe;GAAK;EAClE;EACA,OAAO,KAAK,MAAM,QAAQ,QAAQ;CACpC;;;;;;;;;CAUA,aAAa,UAEV;EACD,IAAI;GACF,MAAM,EAAE,aAAa,MAAM,OAAO;GAClC,OAAO,EAAE,SAAS;EACpB,SAAS,GAAG;GACV,QAAQ,MAAM,CAAC;GACf,MAAM,IAAI,MACR,yHAAA,GAAwHC,0BAAAA,OAAAA,CAAO,EAAE,gDACnI;EACF;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"directory.cjs","names":["BaseDocumentLoader"],"sources":["../../../src/document_loaders/fs/directory.ts"],"sourcesContent":["import type { extname as ExtnameT, resolve as ResolveT } from \"node:path\";\nimport type { readdir as ReaddirT } from \"node:fs/promises\";\nimport { Document } from \"@langchain/core/documents\";\nimport { getEnv } from \"@langchain/core/utils/env\";\nimport { BaseDocumentLoader } from \"@langchain/core/document_loaders/base\";\n\n// TypeScript enums are not tree-shakeable, so doing this instead\n// See https://bargsten.org/jsts/enums/\nexport const UnknownHandling = {\n Ignore: \"ignore\",\n Warn: \"warn\",\n Error: \"error\",\n} as const;\n/**\n * An enumeration of possible handling strategies for unknown file types.\n */\nexport type UnknownHandling =\n (typeof UnknownHandling)[keyof typeof UnknownHandling];\n\n/**\n * A mapping of file extensions to loader functions. Each loader function\n * takes a file path as a parameter and returns a `BaseDocumentLoader`\n * instance.\n */\nexport interface LoadersMapping {\n [extension: string]: (filePath: string) => BaseDocumentLoader;\n}\n\n/**\n * A document loader that loads documents from a directory. It extends the\n * `BaseDocumentLoader` class and implements the `load()` method.\n * @example\n * ```typescript\n *\n * const directoryLoader = new DirectoryLoader(\n * \"src/document_loaders/example_data/\",\n * {\n * \".pdf\": (path: string) => new PDFLoader(path),\n * },\n * );\n *\n * const docs = await directoryLoader.load();\n * console.log({ docs });\n *\n * ```\n */\nexport class DirectoryLoader extends BaseDocumentLoader {\n constructor(\n public directoryPath: string,\n public loaders: LoadersMapping,\n public recursive: boolean = true,\n public unknown: UnknownHandling = UnknownHandling.Warn\n ) {\n super();\n\n if (Object.keys(loaders).length === 0) {\n throw new Error(\"Must provide at least one loader\");\n }\n for (const extension in loaders) {\n if (Object.hasOwn(loaders, extension)) {\n if (extension[0] !== \".\") {\n throw new Error(`Extension must start with a dot: ${extension}`);\n }\n }\n }\n }\n\n /**\n * Loads the documents from the directory. If a file is a directory and\n * `recursive` is `true`, it recursively loads documents from the\n * subdirectory. If a file is a file, it checks if there is a\n * corresponding loader function for the file extension in the `loaders`\n * mapping. If there is, it loads the documents. If there is no\n * corresponding loader function and `unknown` is set to `Warn`, it logs a\n * warning message. If `unknown` is set to `Error`, it throws an error.\n * @returns A promise that resolves to an array of loaded documents.\n */\n public async load(): Promise<Document[]> {\n const { readdir, extname, resolve } = await DirectoryLoader.imports();\n const files = await readdir(this.directoryPath, { withFileTypes: true });\n\n const documents: Document[] = [];\n\n for (const file of files) {\n const fullPath = resolve(this.directoryPath, file.name);\n if (file.isDirectory()) {\n if (this.recursive) {\n const loader = new DirectoryLoader(\n fullPath,\n this.loaders,\n this.recursive,\n this.unknown\n );\n documents.push(...(await loader.load()));\n }\n } else {\n // I'm aware some things won't be files,\n // but they will be caught by the \"unknown\" handling below.\n const loaderFactory = this.loaders[extname(file.name)];\n if (loaderFactory) {\n const loader = loaderFactory(fullPath);\n documents.push(...(await loader.load()));\n } else {\n switch (this.unknown) {\n case UnknownHandling.Ignore:\n break;\n case UnknownHandling.Warn:\n console.warn(`Unknown file type: ${file.name}`);\n break;\n case UnknownHandling.Error:\n throw new Error(`Unknown file type: ${file.name}`);\n default:\n throw new Error(`Unknown unknown handling: ${this.unknown}`);\n }\n }\n }\n }\n\n return documents;\n }\n\n /**\n * Imports the necessary functions from the `node:path` and\n * `node:fs/promises` modules. It is used to dynamically import the\n * functions when needed. If the import fails, it throws an error\n * indicating that the modules failed to load.\n * @returns A promise that resolves to an object containing the imported functions.\n */\n static async imports(): Promise<{\n readdir: typeof ReaddirT;\n extname: typeof ExtnameT;\n resolve: typeof ResolveT;\n }> {\n try {\n const { extname, resolve } = await import(\"node:path\");\n const { readdir } = await import(\"node:fs/promises\");\n return { readdir, extname, resolve };\n } catch (e) {\n console.error(e);\n throw new Error(\n `Failed to load fs/promises. DirectoryLoader available only on environment 'node'. It appears you are running environment '${getEnv()}'. See https://<link to docs> for alternatives.`\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;AAQA,MAAa,kBAAkB;CAC7B,QAAQ;CACR,MAAM;CACN,OAAO;AACT;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,kBAAb,MAAa,wBAAwBA,sCAAAA,mBAAmB;CAE7C;CACA;CACA;CACA;CAJT,YACE,eACA,SACA,YAA4B,MAC5B,UAAkC,gBAAgB,MAClD;EACA,MAAM;EALC,KAAA,gBAAA;EACA,KAAA,UAAA;EACA,KAAA,YAAA;EACA,KAAA,UAAA;EAIP,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,GAClC,MAAM,IAAI,MAAM,kCAAkC;EAEpD,KAAK,MAAM,aAAa,SACtB,IAAI,OAAO,OAAO,SAAS,SAAS,GAC9B;OAAA,UAAU,OAAO,KACnB,MAAM,IAAI,MAAM,oCAAoC,WAAW;EAAA;CAIvE;;;;;;;;;;;CAYA,MAAa,OAA4B;EACvC,MAAM,EAAE,SAAS,SAAS,YAAY,MAAM,gBAAgB,QAAQ;EACpE,MAAM,QAAQ,MAAM,QAAQ,KAAK,eAAe,EAAE,eAAe,KAAK,CAAC;EAEvE,MAAM,YAAwB,CAAC;EAE/B,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,WAAW,QAAQ,KAAK,eAAe,KAAK,IAAI;GACtD,IAAI,KAAK,YAAY,GACf;QAAA,KAAK,WAAW;KAClB,MAAM,SAAS,IAAI,gBACjB,UACA,KAAK,SACL,KAAK,WACL,KAAK,OACP;KACA,UAAU,KAAK,GAAI,MAAM,OAAO,KAAK,CAAE;IACzC;UACK;IAGL,MAAM,gBAAgB,KAAK,QAAQ,QAAQ,KAAK,IAAI;IACpD,IAAI,eAAe;KACjB,MAAM,SAAS,cAAc,QAAQ;KACrC,UAAU,KAAK,GAAI,MAAM,OAAO,KAAK,CAAE;IACzC,OACE,QAAQ,KAAK,SAAb;KACE,KAAK,gBAAgB,QACnB;KACF,KAAK,gBAAgB;MACnB,QAAQ,KAAK,sBAAsB,KAAK,MAAM;MAC9C;KACF,KAAK,gBAAgB,OACnB,MAAM,IAAI,MAAM,sBAAsB,KAAK,MAAM;KACnD,SACE,MAAM,IAAI,MAAM,6BAA6B,KAAK,SAAS;IAC/D;GAEJ;EACF;EAEA,OAAO;CACT;;;;;;;;CASA,aAAa,UAIV;EACD,IAAI;GACF,MAAM,EAAE,SAAS,YAAY,MAAM,OAAO;GAC1C,MAAM,EAAE,YAAY,MAAM,OAAO;GACjC,OAAO;IAAE;IAAS;IAAS;GAAQ;EACrC,SAAS,GAAG;GACV,QAAQ,MAAM,CAAC;GACf,MAAM,IAAI,MACR,8HAAA,GAAA,0BAAA,OAAA,CAAoI,EAAE,gDACxI;EACF;CACF;AACF"}
1
+ {"version":3,"file":"directory.cjs","names":["BaseDocumentLoader","getEnv"],"sources":["../../../src/document_loaders/fs/directory.ts"],"sourcesContent":["import type { extname as ExtnameT, resolve as ResolveT } from \"node:path\";\nimport type { readdir as ReaddirT } from \"node:fs/promises\";\nimport { Document } from \"@langchain/core/documents\";\nimport { getEnv } from \"@langchain/core/utils/env\";\nimport { BaseDocumentLoader } from \"@langchain/core/document_loaders/base\";\n\n// TypeScript enums are not tree-shakeable, so doing this instead\n// See https://bargsten.org/jsts/enums/\nexport const UnknownHandling = {\n Ignore: \"ignore\",\n Warn: \"warn\",\n Error: \"error\",\n} as const;\n/**\n * An enumeration of possible handling strategies for unknown file types.\n */\nexport type UnknownHandling =\n (typeof UnknownHandling)[keyof typeof UnknownHandling];\n\n/**\n * A mapping of file extensions to loader functions. Each loader function\n * takes a file path as a parameter and returns a `BaseDocumentLoader`\n * instance.\n */\nexport interface LoadersMapping {\n [extension: string]: (filePath: string) => BaseDocumentLoader;\n}\n\n/**\n * A document loader that loads documents from a directory. It extends the\n * `BaseDocumentLoader` class and implements the `load()` method.\n * @example\n * ```typescript\n *\n * const directoryLoader = new DirectoryLoader(\n * \"src/document_loaders/example_data/\",\n * {\n * \".pdf\": (path: string) => new PDFLoader(path),\n * },\n * );\n *\n * const docs = await directoryLoader.load();\n * console.log({ docs });\n *\n * ```\n */\nexport class DirectoryLoader extends BaseDocumentLoader {\n constructor(\n public directoryPath: string,\n public loaders: LoadersMapping,\n public recursive: boolean = true,\n public unknown: UnknownHandling = UnknownHandling.Warn\n ) {\n super();\n\n if (Object.keys(loaders).length === 0) {\n throw new Error(\"Must provide at least one loader\");\n }\n for (const extension in loaders) {\n if (Object.hasOwn(loaders, extension)) {\n if (extension[0] !== \".\") {\n throw new Error(`Extension must start with a dot: ${extension}`);\n }\n }\n }\n }\n\n /**\n * Loads the documents from the directory. If a file is a directory and\n * `recursive` is `true`, it recursively loads documents from the\n * subdirectory. If a file is a file, it checks if there is a\n * corresponding loader function for the file extension in the `loaders`\n * mapping. If there is, it loads the documents. If there is no\n * corresponding loader function and `unknown` is set to `Warn`, it logs a\n * warning message. If `unknown` is set to `Error`, it throws an error.\n * @returns A promise that resolves to an array of loaded documents.\n */\n public async load(): Promise<Document[]> {\n const { readdir, extname, resolve } = await DirectoryLoader.imports();\n const files = await readdir(this.directoryPath, { withFileTypes: true });\n\n const documents: Document[] = [];\n\n for (const file of files) {\n const fullPath = resolve(this.directoryPath, file.name);\n if (file.isDirectory()) {\n if (this.recursive) {\n const loader = new DirectoryLoader(\n fullPath,\n this.loaders,\n this.recursive,\n this.unknown\n );\n documents.push(...(await loader.load()));\n }\n } else {\n // I'm aware some things won't be files,\n // but they will be caught by the \"unknown\" handling below.\n const loaderFactory = this.loaders[extname(file.name)];\n if (loaderFactory) {\n const loader = loaderFactory(fullPath);\n documents.push(...(await loader.load()));\n } else {\n switch (this.unknown) {\n case UnknownHandling.Ignore:\n break;\n case UnknownHandling.Warn:\n console.warn(`Unknown file type: ${file.name}`);\n break;\n case UnknownHandling.Error:\n throw new Error(`Unknown file type: ${file.name}`);\n default:\n throw new Error(`Unknown unknown handling: ${this.unknown}`);\n }\n }\n }\n }\n\n return documents;\n }\n\n /**\n * Imports the necessary functions from the `node:path` and\n * `node:fs/promises` modules. It is used to dynamically import the\n * functions when needed. If the import fails, it throws an error\n * indicating that the modules failed to load.\n * @returns A promise that resolves to an object containing the imported functions.\n */\n static async imports(): Promise<{\n readdir: typeof ReaddirT;\n extname: typeof ExtnameT;\n resolve: typeof ResolveT;\n }> {\n try {\n const { extname, resolve } = await import(\"node:path\");\n const { readdir } = await import(\"node:fs/promises\");\n return { readdir, extname, resolve };\n } catch (e) {\n console.error(e);\n throw new Error(\n `Failed to load fs/promises. DirectoryLoader available only on environment 'node'. It appears you are running environment '${getEnv()}'. See https://<link to docs> for alternatives.`\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;AAQA,MAAa,kBAAkB;CAC7B,QAAQ;CACR,MAAM;CACN,OAAO;AACT;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,kBAAb,MAAa,wBAAwBA,sCAAAA,mBAAmB;CAE7C;CACA;CACA;CACA;CAJT,YACE,eACA,SACA,YAA4B,MAC5B,UAAkC,gBAAgB,MAClD;EACA,MAAM;EALC,KAAA,gBAAA;EACA,KAAA,UAAA;EACA,KAAA,YAAA;EACA,KAAA,UAAA;EAIP,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,GAClC,MAAM,IAAI,MAAM,kCAAkC;EAEpD,KAAK,MAAM,aAAa,SACtB,IAAI,OAAO,OAAO,SAAS,SAAS,GAC9B;OAAA,UAAU,OAAO,KACnB,MAAM,IAAI,MAAM,oCAAoC,WAAW;EAAA;CAIvE;;;;;;;;;;;CAYA,MAAa,OAA4B;EACvC,MAAM,EAAE,SAAS,SAAS,YAAY,MAAM,gBAAgB,QAAQ;EACpE,MAAM,QAAQ,MAAM,QAAQ,KAAK,eAAe,EAAE,eAAe,KAAK,CAAC;EAEvE,MAAM,YAAwB,CAAC;EAE/B,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,WAAW,QAAQ,KAAK,eAAe,KAAK,IAAI;GACtD,IAAI,KAAK,YAAY,GACf;QAAA,KAAK,WAAW;KAClB,MAAM,SAAS,IAAI,gBACjB,UACA,KAAK,SACL,KAAK,WACL,KAAK,OACP;KACA,UAAU,KAAK,GAAI,MAAM,OAAO,KAAK,CAAE;IACzC;UACK;IAGL,MAAM,gBAAgB,KAAK,QAAQ,QAAQ,KAAK,IAAI;IACpD,IAAI,eAAe;KACjB,MAAM,SAAS,cAAc,QAAQ;KACrC,UAAU,KAAK,GAAI,MAAM,OAAO,KAAK,CAAE;IACzC,OACE,QAAQ,KAAK,SAAb;KACE,KAAK,gBAAgB,QACnB;KACF,KAAK,gBAAgB;MACnB,QAAQ,KAAK,sBAAsB,KAAK,MAAM;MAC9C;KACF,KAAK,gBAAgB,OACnB,MAAM,IAAI,MAAM,sBAAsB,KAAK,MAAM;KACnD,SACE,MAAM,IAAI,MAAM,6BAA6B,KAAK,SAAS;IAC/D;GAEJ;EACF;EAEA,OAAO;CACT;;;;;;;;CASA,aAAa,UAIV;EACD,IAAI;GACF,MAAM,EAAE,SAAS,YAAY,MAAM,OAAO;GAC1C,MAAM,EAAE,YAAY,MAAM,OAAO;GACjC,OAAO;IAAE;IAAS;IAAS;GAAQ;EACrC,SAAS,GAAG;GACV,QAAQ,MAAM,CAAC;GACf,MAAM,IAAI,MACR,8HAAA,GAA6HC,0BAAAA,OAAAA,CAAO,EAAE,gDACxI;EACF;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"multi_file.cjs","names":["BaseDocumentLoader","UnknownHandling"],"sources":["../../../src/document_loaders/fs/multi_file.ts"],"sourcesContent":["import { extname, resolve } from \"node:path\";\nimport { stat } from \"node:fs/promises\";\nimport { Document } from \"@langchain/core/documents\";\nimport { BaseDocumentLoader } from \"@langchain/core/document_loaders/base\";\nimport { type LoadersMapping, UnknownHandling } from \"./directory.js\";\n\n/**\n * A document loader that loads documents from multiple files. It extends the\n * `BaseDocumentLoader` class and implements the `load()` method.\n * @example\n * ```typescript\n *\n * const multiFileLoader = new MultiFileLoader(\n * [\"path/to/file1.pdf\", \"path/to/file2.txt\"],\n * {\n * \".pdf\": (path: string) => new PDFLoader(path),\n * },\n * );\n *\n * const docs = await multiFileLoader.load();\n * console.log({ docs });\n *\n * ```\n */\nexport class MultiFileLoader extends BaseDocumentLoader {\n constructor(\n public filePaths: string[],\n public loaders: LoadersMapping,\n public unknown: UnknownHandling = UnknownHandling.Warn\n ) {\n super();\n\n if (Object.keys(loaders).length === 0) {\n throw new Error(\"Must provide at least one loader\");\n }\n for (const extension in loaders) {\n if (Object.hasOwn(loaders, extension)) {\n if (extension[0] !== \".\") {\n throw new Error(`Extension must start with a dot: ${extension}`);\n }\n }\n }\n }\n\n /**\n * Loads the documents from the provided file paths. It checks if the file\n * is a directory and ignores it. If a file is a file, it checks if there\n * is a corresponding loader function for the file extension in the `loaders`\n * mapping. If there is, it loads the documents. If there is no\n * corresponding loader function and `unknown` is set to `Warn`, it logs a\n * warning message. If `unknown` is set to `Error`, it throws an error.\n * @returns A promise that resolves to an array of loaded documents.\n */\n public async load(): Promise<Document[]> {\n const documents: Document[] = [];\n\n for (const filePath of this.filePaths) {\n const fullPath = resolve(filePath);\n const fileStat = await stat(fullPath);\n\n if (fileStat.isDirectory()) {\n console.warn(`Ignoring directory: ${fullPath}`);\n continue;\n }\n\n const loaderFactory = this.loaders[extname(fullPath)];\n if (loaderFactory) {\n const loader = loaderFactory(fullPath);\n documents.push(...(await loader.load()));\n } else {\n switch (this.unknown) {\n case UnknownHandling.Ignore:\n break;\n case UnknownHandling.Warn:\n console.warn(`Unknown file type: ${fullPath}`);\n break;\n case UnknownHandling.Error:\n throw new Error(`Unknown file type: ${fullPath}`);\n default:\n throw new Error(`Unknown unknown handling: ${this.unknown}`);\n }\n }\n }\n\n return documents;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAa,kBAAb,cAAqCA,sCAAAA,mBAAmB;CAE7C;CACA;CACA;CAHT,YACE,WACA,SACA,UAAkCC,sCAAAA,gBAAgB,MAClD;EACA,MAAM;EAJC,KAAA,YAAA;EACA,KAAA,UAAA;EACA,KAAA,UAAA;EAIP,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,GAClC,MAAM,IAAI,MAAM,kCAAkC;EAEpD,KAAK,MAAM,aAAa,SACtB,IAAI,OAAO,OAAO,SAAS,SAAS,GAC9B;OAAA,UAAU,OAAO,KACnB,MAAM,IAAI,MAAM,oCAAoC,WAAW;EAAA;CAIvE;;;;;;;;;;CAWA,MAAa,OAA4B;EACvC,MAAM,YAAwB,CAAC;EAE/B,KAAK,MAAM,YAAY,KAAK,WAAW;GACrC,MAAM,YAAA,GAAA,UAAA,QAAA,CAAmB,QAAQ;GAGjC,KAAI,OAAA,GAAA,iBAAA,KAAA,CAFwB,QAAQ,EAAA,CAEvB,YAAY,GAAG;IAC1B,QAAQ,KAAK,uBAAuB,UAAU;IAC9C;GACF;GAEA,MAAM,gBAAgB,KAAK,SAAA,GAAA,UAAA,QAAA,CAAgB,QAAQ;GACnD,IAAI,eAAe;IACjB,MAAM,SAAS,cAAc,QAAQ;IACrC,UAAU,KAAK,GAAI,MAAM,OAAO,KAAK,CAAE;GACzC,OACE,QAAQ,KAAK,SAAb;IACE,KAAKA,sCAAAA,gBAAgB,QACnB;IACF,KAAKA,sCAAAA,gBAAgB;KACnB,QAAQ,KAAK,sBAAsB,UAAU;KAC7C;IACF,KAAKA,sCAAAA,gBAAgB,OACnB,MAAM,IAAI,MAAM,sBAAsB,UAAU;IAClD,SACE,MAAM,IAAI,MAAM,6BAA6B,KAAK,SAAS;GAC/D;EAEJ;EAEA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"multi_file.cjs","names":["BaseDocumentLoader","UnknownHandling","resolve","stat","extname"],"sources":["../../../src/document_loaders/fs/multi_file.ts"],"sourcesContent":["import { extname, resolve } from \"node:path\";\nimport { stat } from \"node:fs/promises\";\nimport { Document } from \"@langchain/core/documents\";\nimport { BaseDocumentLoader } from \"@langchain/core/document_loaders/base\";\nimport { type LoadersMapping, UnknownHandling } from \"./directory.js\";\n\n/**\n * A document loader that loads documents from multiple files. It extends the\n * `BaseDocumentLoader` class and implements the `load()` method.\n * @example\n * ```typescript\n *\n * const multiFileLoader = new MultiFileLoader(\n * [\"path/to/file1.pdf\", \"path/to/file2.txt\"],\n * {\n * \".pdf\": (path: string) => new PDFLoader(path),\n * },\n * );\n *\n * const docs = await multiFileLoader.load();\n * console.log({ docs });\n *\n * ```\n */\nexport class MultiFileLoader extends BaseDocumentLoader {\n constructor(\n public filePaths: string[],\n public loaders: LoadersMapping,\n public unknown: UnknownHandling = UnknownHandling.Warn\n ) {\n super();\n\n if (Object.keys(loaders).length === 0) {\n throw new Error(\"Must provide at least one loader\");\n }\n for (const extension in loaders) {\n if (Object.hasOwn(loaders, extension)) {\n if (extension[0] !== \".\") {\n throw new Error(`Extension must start with a dot: ${extension}`);\n }\n }\n }\n }\n\n /**\n * Loads the documents from the provided file paths. It checks if the file\n * is a directory and ignores it. If a file is a file, it checks if there\n * is a corresponding loader function for the file extension in the `loaders`\n * mapping. If there is, it loads the documents. If there is no\n * corresponding loader function and `unknown` is set to `Warn`, it logs a\n * warning message. If `unknown` is set to `Error`, it throws an error.\n * @returns A promise that resolves to an array of loaded documents.\n */\n public async load(): Promise<Document[]> {\n const documents: Document[] = [];\n\n for (const filePath of this.filePaths) {\n const fullPath = resolve(filePath);\n const fileStat = await stat(fullPath);\n\n if (fileStat.isDirectory()) {\n console.warn(`Ignoring directory: ${fullPath}`);\n continue;\n }\n\n const loaderFactory = this.loaders[extname(fullPath)];\n if (loaderFactory) {\n const loader = loaderFactory(fullPath);\n documents.push(...(await loader.load()));\n } else {\n switch (this.unknown) {\n case UnknownHandling.Ignore:\n break;\n case UnknownHandling.Warn:\n console.warn(`Unknown file type: ${fullPath}`);\n break;\n case UnknownHandling.Error:\n throw new Error(`Unknown file type: ${fullPath}`);\n default:\n throw new Error(`Unknown unknown handling: ${this.unknown}`);\n }\n }\n }\n\n return documents;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAa,kBAAb,cAAqCA,sCAAAA,mBAAmB;CAE7C;CACA;CACA;CAHT,YACE,WACA,SACA,UAAkCC,sCAAAA,gBAAgB,MAClD;EACA,MAAM;EAJC,KAAA,YAAA;EACA,KAAA,UAAA;EACA,KAAA,UAAA;EAIP,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW,GAClC,MAAM,IAAI,MAAM,kCAAkC;EAEpD,KAAK,MAAM,aAAa,SACtB,IAAI,OAAO,OAAO,SAAS,SAAS,GAC9B;OAAA,UAAU,OAAO,KACnB,MAAM,IAAI,MAAM,oCAAoC,WAAW;EAAA;CAIvE;;;;;;;;;;CAWA,MAAa,OAA4B;EACvC,MAAM,YAAwB,CAAC;EAE/B,KAAK,MAAM,YAAY,KAAK,WAAW;GACrC,MAAM,YAAA,GAAWC,UAAAA,QAAAA,CAAQ,QAAQ;GAGjC,KAAI,OAAA,GAFmBC,iBAAAA,KAAAA,CAAK,QAAQ,EAAA,CAEvB,YAAY,GAAG;IAC1B,QAAQ,KAAK,uBAAuB,UAAU;IAC9C;GACF;GAEA,MAAM,gBAAgB,KAAK,SAAA,GAAQC,UAAAA,QAAAA,CAAQ,QAAQ;GACnD,IAAI,eAAe;IACjB,MAAM,SAAS,cAAc,QAAQ;IACrC,UAAU,KAAK,GAAI,MAAM,OAAO,KAAK,CAAE;GACzC,OACE,QAAQ,KAAK,SAAb;IACE,KAAKH,sCAAAA,gBAAgB,QACnB;IACF,KAAKA,sCAAAA,gBAAgB;KACnB,QAAQ,KAAK,sBAAsB,UAAU;KAC7C;IACF,KAAKA,sCAAAA,gBAAgB,OACnB,MAAM,IAAI,MAAM,sBAAsB,UAAU;IAClD,SACE,MAAM,IAAI,MAAM,6BAA6B,KAAK,SAAS;GAC/D;EAEJ;EAEA,OAAO;CACT;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"text.cjs","names":["BaseDocumentLoader","Document"],"sources":["../../../src/document_loaders/fs/text.ts"],"sourcesContent":["import type { readFile as ReadFileT } from \"node:fs/promises\";\nimport { Document } from \"@langchain/core/documents\";\nimport { getEnv } from \"@langchain/core/utils/env\";\nimport { BaseDocumentLoader } from \"@langchain/core/document_loaders/base\";\n\n/**\n * A class that extends the `BaseDocumentLoader` class. It represents a\n * document loader that loads documents from a text file. The `load()`\n * method is implemented to read the text from the file or blob, parse it\n * using the `parse()` method, and create a `Document` instance for each\n * parsed page. The metadata includes the source of the text (file path or\n * blob) and, if there are multiple pages, the line number of each page.\n * @example\n * ```typescript\n * const loader = new TextLoader(\"src/document_loaders/example_data/example.txt\");\n * const docs = await loader.load();\n * ```\n */\nexport class TextLoader extends BaseDocumentLoader {\n constructor(public filePathOrBlob: string | Blob) {\n super();\n }\n\n /**\n * A protected method that takes a `raw` string as a parameter and returns\n * a promise that resolves to an array containing the raw text as a single\n * element.\n * @param raw The raw text to be parsed.\n * @returns A promise that resolves to an array containing the raw text as a single element.\n */\n protected async parse(raw: string): Promise<string[]> {\n return [raw];\n }\n\n /**\n * A method that loads the text file or blob and returns a promise that\n * resolves to an array of `Document` instances. It reads the text from\n * the file or blob using the `readFile` function from the\n * `node:fs/promises` module or the `text()` method of the blob. It then\n * parses the text using the `parse()` method and creates a `Document`\n * instance for each parsed page. The metadata includes the source of the\n * text (file path or blob) and, if there are multiple pages, the line\n * number of each page.\n * @returns A promise that resolves to an array of `Document` instances.\n */\n public async load(): Promise<Document[]> {\n let text: string;\n let metadata: Record<string, string>;\n if (typeof this.filePathOrBlob === \"string\") {\n const { readFile } = await TextLoader.imports();\n text = await readFile(this.filePathOrBlob, \"utf8\");\n metadata = { source: this.filePathOrBlob };\n } else {\n text = await this.filePathOrBlob.text();\n metadata = { source: \"blob\", blobType: this.filePathOrBlob.type };\n }\n const parsed = await this.parse(text);\n parsed.forEach((pageContent, i) => {\n if (typeof pageContent !== \"string\") {\n throw new Error(\n `Expected string, at position ${i} got ${typeof pageContent}`\n );\n }\n });\n return parsed.map(\n (pageContent, i) =>\n new Document({\n pageContent,\n metadata:\n parsed.length === 1\n ? metadata\n : {\n ...metadata,\n line: i + 1,\n },\n })\n );\n }\n\n /**\n * A static method that imports the `readFile` function from the\n * `node:fs/promises` module. It is used to dynamically import the\n * function when needed. If the import fails, it throws an error\n * indicating that the `fs/promises` module is not available in the\n * current environment.\n * @returns A promise that resolves to an object containing the `readFile` function from the `node:fs/promises` module.\n */\n static async imports(): Promise<{\n readFile: typeof ReadFileT;\n }> {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n return { readFile };\n } catch (e) {\n console.error(e);\n throw new Error(\n `Failed to load fs/promises. TextLoader available only on environment 'node'. It appears you are running environment '${getEnv()}'. See https://<link to docs> for alternatives.`\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkBA,IAAa,aAAb,MAAa,mBAAmBA,sCAAAA,mBAAmB;CAC9B;CAAnB,YAAY,gBAAsC;EAChD,MAAM;EADW,KAAA,iBAAA;CAEnB;;;;;;;;CASA,MAAgB,MAAM,KAAgC;EACpD,OAAO,CAAC,GAAG;CACb;;;;;;;;;;;;CAaA,MAAa,OAA4B;EACvC,IAAI;EACJ,IAAI;EACJ,IAAI,OAAO,KAAK,mBAAmB,UAAU;GAC3C,MAAM,EAAE,aAAa,MAAM,WAAW,QAAQ;GAC9C,OAAO,MAAM,SAAS,KAAK,gBAAgB,MAAM;GACjD,WAAW,EAAE,QAAQ,KAAK,eAAe;EAC3C,OAAO;GACL,OAAO,MAAM,KAAK,eAAe,KAAK;GACtC,WAAW;IAAE,QAAQ;IAAQ,UAAU,KAAK,eAAe;GAAK;EAClE;EACA,MAAM,SAAS,MAAM,KAAK,MAAM,IAAI;EACpC,OAAO,SAAS,aAAa,MAAM;GACjC,IAAI,OAAO,gBAAgB,UACzB,MAAM,IAAI,MACR,gCAAgC,EAAE,OAAO,OAAO,aAClD;EAEJ,CAAC;EACD,OAAO,OAAO,KACX,aAAa,MACZ,IAAIC,0BAAAA,SAAS;GACX;GACA,UACE,OAAO,WAAW,IACd,WACA;IACE,GAAG;IACH,MAAM,IAAI;GACZ;EACR,CAAC,CACL;CACF;;;;;;;;;CAUA,aAAa,UAEV;EACD,IAAI;GACF,MAAM,EAAE,aAAa,MAAM,OAAO;GAClC,OAAO,EAAE,SAAS;EACpB,SAAS,GAAG;GACV,QAAQ,MAAM,CAAC;GACf,MAAM,IAAI,MACR,yHAAA,GAAA,0BAAA,OAAA,CAA+H,EAAE,gDACnI;EACF;CACF;AACF"}
1
+ {"version":3,"file":"text.cjs","names":["BaseDocumentLoader","Document","getEnv"],"sources":["../../../src/document_loaders/fs/text.ts"],"sourcesContent":["import type { readFile as ReadFileT } from \"node:fs/promises\";\nimport { Document } from \"@langchain/core/documents\";\nimport { getEnv } from \"@langchain/core/utils/env\";\nimport { BaseDocumentLoader } from \"@langchain/core/document_loaders/base\";\n\n/**\n * A class that extends the `BaseDocumentLoader` class. It represents a\n * document loader that loads documents from a text file. The `load()`\n * method is implemented to read the text from the file or blob, parse it\n * using the `parse()` method, and create a `Document` instance for each\n * parsed page. The metadata includes the source of the text (file path or\n * blob) and, if there are multiple pages, the line number of each page.\n * @example\n * ```typescript\n * const loader = new TextLoader(\"src/document_loaders/example_data/example.txt\");\n * const docs = await loader.load();\n * ```\n */\nexport class TextLoader extends BaseDocumentLoader {\n constructor(public filePathOrBlob: string | Blob) {\n super();\n }\n\n /**\n * A protected method that takes a `raw` string as a parameter and returns\n * a promise that resolves to an array containing the raw text as a single\n * element.\n * @param raw The raw text to be parsed.\n * @returns A promise that resolves to an array containing the raw text as a single element.\n */\n protected async parse(raw: string): Promise<string[]> {\n return [raw];\n }\n\n /**\n * A method that loads the text file or blob and returns a promise that\n * resolves to an array of `Document` instances. It reads the text from\n * the file or blob using the `readFile` function from the\n * `node:fs/promises` module or the `text()` method of the blob. It then\n * parses the text using the `parse()` method and creates a `Document`\n * instance for each parsed page. The metadata includes the source of the\n * text (file path or blob) and, if there are multiple pages, the line\n * number of each page.\n * @returns A promise that resolves to an array of `Document` instances.\n */\n public async load(): Promise<Document[]> {\n let text: string;\n let metadata: Record<string, string>;\n if (typeof this.filePathOrBlob === \"string\") {\n const { readFile } = await TextLoader.imports();\n text = await readFile(this.filePathOrBlob, \"utf8\");\n metadata = { source: this.filePathOrBlob };\n } else {\n text = await this.filePathOrBlob.text();\n metadata = { source: \"blob\", blobType: this.filePathOrBlob.type };\n }\n const parsed = await this.parse(text);\n parsed.forEach((pageContent, i) => {\n if (typeof pageContent !== \"string\") {\n throw new Error(\n `Expected string, at position ${i} got ${typeof pageContent}`\n );\n }\n });\n return parsed.map(\n (pageContent, i) =>\n new Document({\n pageContent,\n metadata:\n parsed.length === 1\n ? metadata\n : {\n ...metadata,\n line: i + 1,\n },\n })\n );\n }\n\n /**\n * A static method that imports the `readFile` function from the\n * `node:fs/promises` module. It is used to dynamically import the\n * function when needed. If the import fails, it throws an error\n * indicating that the `fs/promises` module is not available in the\n * current environment.\n * @returns A promise that resolves to an object containing the `readFile` function from the `node:fs/promises` module.\n */\n static async imports(): Promise<{\n readFile: typeof ReadFileT;\n }> {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n return { readFile };\n } catch (e) {\n console.error(e);\n throw new Error(\n `Failed to load fs/promises. TextLoader available only on environment 'node'. It appears you are running environment '${getEnv()}'. See https://<link to docs> for alternatives.`\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkBA,IAAa,aAAb,MAAa,mBAAmBA,sCAAAA,mBAAmB;CAC9B;CAAnB,YAAY,gBAAsC;EAChD,MAAM;EADW,KAAA,iBAAA;CAEnB;;;;;;;;CASA,MAAgB,MAAM,KAAgC;EACpD,OAAO,CAAC,GAAG;CACb;;;;;;;;;;;;CAaA,MAAa,OAA4B;EACvC,IAAI;EACJ,IAAI;EACJ,IAAI,OAAO,KAAK,mBAAmB,UAAU;GAC3C,MAAM,EAAE,aAAa,MAAM,WAAW,QAAQ;GAC9C,OAAO,MAAM,SAAS,KAAK,gBAAgB,MAAM;GACjD,WAAW,EAAE,QAAQ,KAAK,eAAe;EAC3C,OAAO;GACL,OAAO,MAAM,KAAK,eAAe,KAAK;GACtC,WAAW;IAAE,QAAQ;IAAQ,UAAU,KAAK,eAAe;GAAK;EAClE;EACA,MAAM,SAAS,MAAM,KAAK,MAAM,IAAI;EACpC,OAAO,SAAS,aAAa,MAAM;GACjC,IAAI,OAAO,gBAAgB,UACzB,MAAM,IAAI,MACR,gCAAgC,EAAE,OAAO,OAAO,aAClD;EAEJ,CAAC;EACD,OAAO,OAAO,KACX,aAAa,MACZ,IAAIC,0BAAAA,SAAS;GACX;GACA,UACE,OAAO,WAAW,IACd,WACA;IACE,GAAG;IACH,MAAM,IAAI;GACZ;EACR,CAAC,CACL;CACF;;;;;;;;;CAUA,aAAa,UAEV;EACD,IAAI;GACF,MAAM,EAAE,aAAa,MAAM,OAAO;GAClC,OAAO,EAAE,SAAS;EACpB,SAAS,GAAG;GACV,QAAQ,MAAM,CAAC;GACf,MAAM,IAAI,MACR,yHAAA,GAAwHC,0BAAAA,OAAAA,CAAO,EAAE,gDACnI;EACF;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"openai_functions.cjs","names":["MappingDocumentTransformer","Document","ChatOpenAI","createTaggingChain"],"sources":["../../src/document_transformers/openai_functions.ts"],"sourcesContent":["import {\n Document,\n MappingDocumentTransformer,\n} from \"@langchain/core/documents\";\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport { InteropZodObject } from \"@langchain/core/utils/types\";\nimport {\n type JsonSchema7ObjectType,\n toJsonSchema,\n} from \"@langchain/core/utils/json_schema\";\nimport { BaseChain } from \"../chains/base.js\";\nimport {\n TaggingChainOptions,\n createTaggingChain,\n} from \"../chains/openai_functions/index.js\";\n\n/**\n * A transformer that tags metadata to a document using a tagging chain.\n */\nexport class MetadataTagger extends MappingDocumentTransformer {\n static lc_name() {\n return \"MetadataTagger\";\n }\n\n protected taggingChain: BaseChain;\n\n constructor(fields: { taggingChain: BaseChain }) {\n super();\n this.taggingChain = fields.taggingChain;\n if (this.taggingChain.inputKeys.length !== 1) {\n throw new Error(\n \"Invalid input chain. The input chain must have exactly one input.\"\n );\n }\n if (this.taggingChain.outputKeys.length !== 1) {\n throw new Error(\n \"Invalid input chain. The input chain must have exactly one output.\"\n );\n }\n }\n\n async _transformDocument(document: Document): Promise<Document> {\n const taggingChainResponse = await this.taggingChain.call({\n [this.taggingChain.inputKeys[0]]: document.pageContent,\n });\n const extractedMetadata =\n taggingChainResponse[this.taggingChain.outputKeys[0]];\n return new Document({\n pageContent: document.pageContent,\n metadata: { ...extractedMetadata, ...document.metadata },\n });\n }\n}\n\nexport function createMetadataTagger(\n schema: JsonSchema7ObjectType,\n options: TaggingChainOptions & { llm?: ChatOpenAI }\n) {\n const { llm = new ChatOpenAI({ model: \"gpt-3.5-turbo-0613\" }), ...rest } =\n options;\n const taggingChain = createTaggingChain(schema, llm, rest);\n return new MetadataTagger({ taggingChain });\n}\n\nexport function createMetadataTaggerFromZod(\n schema: InteropZodObject,\n options: TaggingChainOptions & { llm?: ChatOpenAI }\n) {\n return createMetadataTagger(\n toJsonSchema(schema) as JsonSchema7ObjectType,\n options\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,IAAa,iBAAb,cAAoCA,0BAAAA,2BAA2B;CAC7D,OAAO,UAAU;EACf,OAAO;CACT;CAEA;CAEA,YAAY,QAAqC;EAC/C,MAAM;EACN,KAAK,eAAe,OAAO;EAC3B,IAAI,KAAK,aAAa,UAAU,WAAW,GACzC,MAAM,IAAI,MACR,mEACF;EAEF,IAAI,KAAK,aAAa,WAAW,WAAW,GAC1C,MAAM,IAAI,MACR,oEACF;CAEJ;CAEA,MAAM,mBAAmB,UAAuC;EAI9D,MAAM,qBACJ,MAJiC,KAAK,aAAa,KAAK,GACvD,KAAK,aAAa,UAAU,KAAK,SAAS,YAC7C,CAAC,EAAA,CAEsB,KAAK,aAAa,WAAW;EACpD,OAAO,IAAIC,0BAAAA,SAAS;GAClB,aAAa,SAAS;GACtB,UAAU;IAAE,GAAG;IAAmB,GAAG,SAAS;GAAS;EACzD,CAAC;CACH;AACF;AAEA,SAAgB,qBACd,QACA,SACA;CACA,MAAM,EAAE,MAAM,IAAIC,kBAAAA,WAAW,EAAE,OAAO,qBAAqB,CAAC,GAAG,GAAG,SAChE;CAEF,OAAO,IAAI,eAAe,EAAE,cADPC,gBAAAA,mBAAmB,QAAQ,KAAK,IACzB,EAAa,CAAC;AAC5C;AAEA,SAAgB,4BACd,QACA,SACA;CACA,OAAO,sBAAA,GAAA,kCAAA,aAAA,CACQ,MAAM,GACnB,OACF;AACF"}
1
+ {"version":3,"file":"openai_functions.cjs","names":["MappingDocumentTransformer","Document","ChatOpenAI","createTaggingChain","toJsonSchema"],"sources":["../../src/document_transformers/openai_functions.ts"],"sourcesContent":["import {\n Document,\n MappingDocumentTransformer,\n} from \"@langchain/core/documents\";\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport { InteropZodObject } from \"@langchain/core/utils/types\";\nimport {\n type JsonSchema7ObjectType,\n toJsonSchema,\n} from \"@langchain/core/utils/json_schema\";\nimport { BaseChain } from \"../chains/base.js\";\nimport {\n TaggingChainOptions,\n createTaggingChain,\n} from \"../chains/openai_functions/index.js\";\n\n/**\n * A transformer that tags metadata to a document using a tagging chain.\n */\nexport class MetadataTagger extends MappingDocumentTransformer {\n static lc_name() {\n return \"MetadataTagger\";\n }\n\n protected taggingChain: BaseChain;\n\n constructor(fields: { taggingChain: BaseChain }) {\n super();\n this.taggingChain = fields.taggingChain;\n if (this.taggingChain.inputKeys.length !== 1) {\n throw new Error(\n \"Invalid input chain. The input chain must have exactly one input.\"\n );\n }\n if (this.taggingChain.outputKeys.length !== 1) {\n throw new Error(\n \"Invalid input chain. The input chain must have exactly one output.\"\n );\n }\n }\n\n async _transformDocument(document: Document): Promise<Document> {\n const taggingChainResponse = await this.taggingChain.call({\n [this.taggingChain.inputKeys[0]]: document.pageContent,\n });\n const extractedMetadata =\n taggingChainResponse[this.taggingChain.outputKeys[0]];\n return new Document({\n pageContent: document.pageContent,\n metadata: { ...extractedMetadata, ...document.metadata },\n });\n }\n}\n\nexport function createMetadataTagger(\n schema: JsonSchema7ObjectType,\n options: TaggingChainOptions & { llm?: ChatOpenAI }\n) {\n const { llm = new ChatOpenAI({ model: \"gpt-3.5-turbo-0613\" }), ...rest } =\n options;\n const taggingChain = createTaggingChain(schema, llm, rest);\n return new MetadataTagger({ taggingChain });\n}\n\nexport function createMetadataTaggerFromZod(\n schema: InteropZodObject,\n options: TaggingChainOptions & { llm?: ChatOpenAI }\n) {\n return createMetadataTagger(\n toJsonSchema(schema) as JsonSchema7ObjectType,\n options\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,IAAa,iBAAb,cAAoCA,0BAAAA,2BAA2B;CAC7D,OAAO,UAAU;EACf,OAAO;CACT;CAEA;CAEA,YAAY,QAAqC;EAC/C,MAAM;EACN,KAAK,eAAe,OAAO;EAC3B,IAAI,KAAK,aAAa,UAAU,WAAW,GACzC,MAAM,IAAI,MACR,mEACF;EAEF,IAAI,KAAK,aAAa,WAAW,WAAW,GAC1C,MAAM,IAAI,MACR,oEACF;CAEJ;CAEA,MAAM,mBAAmB,UAAuC;EAI9D,MAAM,qBACJ,MAJiC,KAAK,aAAa,KAAK,GACvD,KAAK,aAAa,UAAU,KAAK,SAAS,YAC7C,CAAC,EAAA,CAEsB,KAAK,aAAa,WAAW;EACpD,OAAO,IAAIC,0BAAAA,SAAS;GAClB,aAAa,SAAS;GACtB,UAAU;IAAE,GAAG;IAAmB,GAAG,SAAS;GAAS;EACzD,CAAC;CACH;AACF;AAEA,SAAgB,qBACd,QACA,SACA;CACA,MAAM,EAAE,MAAM,IAAIC,kBAAAA,WAAW,EAAE,OAAO,qBAAqB,CAAC,GAAG,GAAG,SAChE;CAEF,OAAO,IAAI,eAAe,EAAE,cADPC,gBAAAA,mBAAmB,QAAQ,KAAK,IACzB,EAAa,CAAC;AAC5C;AAEA,SAAgB,4BACd,QACA,SACA;CACA,OAAO,sBAAA,GACLC,kCAAAA,aAAAA,CAAa,MAAM,GACnB,OACF;AACF"}