@langchain/classic 1.0.45 → 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 (199) hide show
  1. package/CHANGELOG.md +7 -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/mrkl/outputParser.d.ts +1 -1
  25. package/dist/agents/openai_functions/index.cjs +2 -1
  26. package/dist/agents/openai_functions/index.cjs.map +1 -1
  27. package/dist/agents/openai_functions/index.js +2 -1
  28. package/dist/agents/openai_functions/index.js.map +1 -1
  29. package/dist/agents/openai_functions/output_parser.cjs.map +1 -1
  30. package/dist/agents/openai_tools/index.cjs.map +1 -1
  31. package/dist/agents/openai_tools/output_parser.cjs.map +1 -1
  32. package/dist/agents/react/output_parser.cjs.map +1 -1
  33. package/dist/agents/structured_chat/index.cjs +6 -5
  34. package/dist/agents/structured_chat/index.cjs.map +1 -1
  35. package/dist/agents/structured_chat/index.js +6 -5
  36. package/dist/agents/structured_chat/index.js.map +1 -1
  37. package/dist/agents/structured_chat/outputParser.cjs.map +1 -1
  38. package/dist/agents/tool_calling/output_parser.cjs.map +1 -1
  39. package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.cjs.map +1 -1
  40. package/dist/agents/toolkits/conversational_retrieval/tool.cjs +2 -1
  41. package/dist/agents/toolkits/conversational_retrieval/tool.cjs.map +1 -1
  42. package/dist/agents/toolkits/conversational_retrieval/tool.js +2 -1
  43. package/dist/agents/toolkits/conversational_retrieval/tool.js.map +1 -1
  44. package/dist/agents/toolkits/json/json.cjs +10 -8
  45. package/dist/agents/toolkits/json/json.cjs.map +1 -1
  46. package/dist/agents/toolkits/json/json.js +10 -8
  47. package/dist/agents/toolkits/json/json.js.map +1 -1
  48. package/dist/agents/toolkits/openapi/openapi.cjs +12 -9
  49. package/dist/agents/toolkits/openapi/openapi.cjs.map +1 -1
  50. package/dist/agents/toolkits/openapi/openapi.js +12 -9
  51. package/dist/agents/toolkits/openapi/openapi.js.map +1 -1
  52. package/dist/agents/toolkits/sql/sql.cjs +10 -8
  53. package/dist/agents/toolkits/sql/sql.cjs.map +1 -1
  54. package/dist/agents/toolkits/sql/sql.js +10 -8
  55. package/dist/agents/toolkits/sql/sql.js.map +1 -1
  56. package/dist/agents/toolkits/vectorstore/vectorstore.cjs +20 -16
  57. package/dist/agents/toolkits/vectorstore/vectorstore.cjs.map +1 -1
  58. package/dist/agents/toolkits/vectorstore/vectorstore.js +20 -16
  59. package/dist/agents/toolkits/vectorstore/vectorstore.js.map +1 -1
  60. package/dist/agents/xml/index.cjs +2 -1
  61. package/dist/agents/xml/index.cjs.map +1 -1
  62. package/dist/agents/xml/index.js +2 -1
  63. package/dist/agents/xml/index.js.map +1 -1
  64. package/dist/chains/base.cjs.map +1 -1
  65. package/dist/chains/chat_vector_db_chain.cjs +2 -1
  66. package/dist/chains/chat_vector_db_chain.cjs.map +1 -1
  67. package/dist/chains/chat_vector_db_chain.js +2 -1
  68. package/dist/chains/chat_vector_db_chain.js.map +1 -1
  69. package/dist/chains/conversational_retrieval_chain.cjs +2 -1
  70. package/dist/chains/conversational_retrieval_chain.cjs.map +1 -1
  71. package/dist/chains/conversational_retrieval_chain.js +2 -1
  72. package/dist/chains/conversational_retrieval_chain.js.map +1 -1
  73. package/dist/chains/openai_functions/base.cjs.map +1 -1
  74. package/dist/chains/openai_functions/extraction.cjs.map +1 -1
  75. package/dist/chains/openai_functions/openapi.cjs +9 -8
  76. package/dist/chains/openai_functions/openapi.cjs.map +1 -1
  77. package/dist/chains/openai_functions/openapi.js +9 -8
  78. package/dist/chains/openai_functions/openapi.js.map +1 -1
  79. package/dist/chains/openai_functions/tagging.cjs.map +1 -1
  80. package/dist/chains/openai_moderation.cjs.map +1 -1
  81. package/dist/chains/query_constructor/index.cjs +15 -9
  82. package/dist/chains/query_constructor/index.cjs.map +1 -1
  83. package/dist/chains/query_constructor/index.js +15 -9
  84. package/dist/chains/query_constructor/index.js.map +1 -1
  85. package/dist/chains/query_constructor/parser.cjs +12 -6
  86. package/dist/chains/query_constructor/parser.cjs.map +1 -1
  87. package/dist/chains/query_constructor/parser.js +12 -6
  88. package/dist/chains/query_constructor/parser.js.map +1 -1
  89. package/dist/chains/question_answering/load.cjs +35 -29
  90. package/dist/chains/question_answering/load.cjs.map +1 -1
  91. package/dist/chains/question_answering/load.js +35 -29
  92. package/dist/chains/question_answering/load.js.map +1 -1
  93. package/dist/chains/router/multi_prompt.cjs +5 -3
  94. package/dist/chains/router/multi_prompt.cjs.map +1 -1
  95. package/dist/chains/router/multi_prompt.js +5 -3
  96. package/dist/chains/router/multi_prompt.js.map +1 -1
  97. package/dist/chains/router/multi_retrieval_qa.cjs +18 -11
  98. package/dist/chains/router/multi_retrieval_qa.cjs.map +1 -1
  99. package/dist/chains/router/multi_retrieval_qa.js +18 -11
  100. package/dist/chains/router/multi_retrieval_qa.js.map +1 -1
  101. package/dist/chains/sequential_chain.cjs +6 -5
  102. package/dist/chains/sequential_chain.cjs.map +1 -1
  103. package/dist/chains/sequential_chain.js +6 -5
  104. package/dist/chains/sequential_chain.js.map +1 -1
  105. package/dist/chains/sql_db/sql_db_chain.cjs +2 -1
  106. package/dist/chains/sql_db/sql_db_chain.cjs.map +1 -1
  107. package/dist/chains/sql_db/sql_db_chain.js +2 -1
  108. package/dist/chains/sql_db/sql_db_chain.js.map +1 -1
  109. package/dist/chains/summarization/load.cjs +35 -29
  110. package/dist/chains/summarization/load.cjs.map +1 -1
  111. package/dist/chains/summarization/load.js +35 -29
  112. package/dist/chains/summarization/load.js.map +1 -1
  113. package/dist/chat_models/universal.cjs +12 -10
  114. package/dist/chat_models/universal.cjs.map +1 -1
  115. package/dist/chat_models/universal.js +12 -10
  116. package/dist/chat_models/universal.js.map +1 -1
  117. package/dist/document_loaders/fs/buffer.cjs.map +1 -1
  118. package/dist/document_loaders/fs/directory.cjs.map +1 -1
  119. package/dist/document_loaders/fs/multi_file.cjs.map +1 -1
  120. package/dist/document_loaders/fs/text.cjs.map +1 -1
  121. package/dist/document_transformers/openai_functions.cjs.map +1 -1
  122. package/dist/embeddings/cache_backed.cjs.map +1 -1
  123. package/dist/evaluation/comparison/pairwise.cjs +4 -2
  124. package/dist/evaluation/comparison/pairwise.cjs.map +1 -1
  125. package/dist/evaluation/comparison/pairwise.js +4 -2
  126. package/dist/evaluation/comparison/pairwise.js.map +1 -1
  127. package/dist/evaluation/criteria/criteria.cjs +4 -2
  128. package/dist/evaluation/criteria/criteria.cjs.map +1 -1
  129. package/dist/evaluation/criteria/criteria.js +4 -2
  130. package/dist/evaluation/criteria/criteria.js.map +1 -1
  131. package/dist/experimental/autogpt/agent.cjs +8 -7
  132. package/dist/experimental/autogpt/agent.cjs.map +1 -1
  133. package/dist/experimental/autogpt/agent.js +8 -7
  134. package/dist/experimental/autogpt/agent.js.map +1 -1
  135. package/dist/experimental/autogpt/prompt.cjs +2 -1
  136. package/dist/experimental/autogpt/prompt.cjs.map +1 -1
  137. package/dist/experimental/autogpt/prompt.js +2 -1
  138. package/dist/experimental/autogpt/prompt.js.map +1 -1
  139. package/dist/experimental/autogpt/prompt_generator.cjs.map +1 -1
  140. package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.cjs.map +1 -1
  141. package/dist/experimental/openai_assistant/index.cjs.map +1 -1
  142. package/dist/experimental/plan_and_execute/agent_executor.cjs +3 -2
  143. package/dist/experimental/plan_and_execute/agent_executor.cjs.map +1 -1
  144. package/dist/experimental/plan_and_execute/agent_executor.js +3 -2
  145. package/dist/experimental/plan_and_execute/agent_executor.js.map +1 -1
  146. package/dist/hub/base.cjs.map +1 -1
  147. package/dist/hub/base.js.map +1 -1
  148. package/dist/hub/index.cjs +2 -1
  149. package/dist/hub/index.cjs.map +1 -1
  150. package/dist/hub/index.js +2 -1
  151. package/dist/hub/index.js.map +1 -1
  152. package/dist/hub/node.cjs +4 -2
  153. package/dist/hub/node.cjs.map +1 -1
  154. package/dist/hub/node.js +4 -2
  155. package/dist/hub/node.js.map +1 -1
  156. package/dist/load/index.cjs.map +1 -1
  157. package/dist/memory/buffer_memory.cjs.map +1 -1
  158. package/dist/memory/buffer_token_memory.cjs.map +1 -1
  159. package/dist/memory/buffer_window_memory.cjs.map +1 -1
  160. package/dist/memory/chat_memory.cjs.map +1 -1
  161. package/dist/memory/entity_memory.cjs +2 -1
  162. package/dist/memory/entity_memory.cjs.map +1 -1
  163. package/dist/memory/entity_memory.js +2 -1
  164. package/dist/memory/entity_memory.js.map +1 -1
  165. package/dist/memory/summary.cjs.map +1 -1
  166. package/dist/memory/summary_buffer.cjs.map +1 -1
  167. package/dist/memory/vector_store.cjs.map +1 -1
  168. package/dist/output_parsers/fix.cjs +2 -1
  169. package/dist/output_parsers/fix.cjs.map +1 -1
  170. package/dist/output_parsers/fix.js +2 -1
  171. package/dist/output_parsers/fix.js.map +1 -1
  172. package/dist/output_parsers/openai_functions.cjs.map +1 -1
  173. package/dist/output_parsers/structured.cjs.map +1 -1
  174. package/dist/retrievers/document_compressors/chain_extract.cjs +2 -1
  175. package/dist/retrievers/document_compressors/chain_extract.cjs.map +1 -1
  176. package/dist/retrievers/document_compressors/chain_extract.js +2 -1
  177. package/dist/retrievers/document_compressors/chain_extract.js.map +1 -1
  178. package/dist/retrievers/matryoshka_retriever.cjs.map +1 -1
  179. package/dist/retrievers/multi_query.cjs +2 -1
  180. package/dist/retrievers/multi_query.cjs.map +1 -1
  181. package/dist/retrievers/multi_query.js +2 -1
  182. package/dist/retrievers/multi_query.js.map +1 -1
  183. package/dist/smith/runner_utils.cjs.map +1 -1
  184. package/dist/stores/file/node.cjs.map +1 -1
  185. package/dist/tools/render.cjs.map +1 -1
  186. package/dist/tools/retriever.cjs +2 -1
  187. package/dist/tools/retriever.cjs.map +1 -1
  188. package/dist/tools/retriever.js +2 -1
  189. package/dist/tools/retriever.js.map +1 -1
  190. package/dist/tools/webbrowser.cjs +2 -1
  191. package/dist/tools/webbrowser.cjs.map +1 -1
  192. package/dist/tools/webbrowser.js +2 -1
  193. package/dist/tools/webbrowser.js.map +1 -1
  194. package/dist/util/hub.cjs.map +1 -1
  195. package/dist/vectorstores/memory.cjs +2 -1
  196. package/dist/vectorstores/memory.cjs.map +1 -1
  197. package/dist/vectorstores/memory.js +2 -1
  198. package/dist/vectorstores/memory.js.map +1 -1
  199. package/package.json +23 -23
@@ -1 +1 @@
1
- {"version":3,"file":"webbrowser.cjs","names":["Tool","RecursiveCharacterTextSplitter","Document","formatDocumentsAsString","MemoryVectorStore","RunnableSequence","StringOutputParser"],"sources":["../../src/tools/webbrowser.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { Document } from \"@langchain/core/documents\";\nimport type { EmbeddingsInterface } from \"@langchain/core/embeddings\";\n\nimport * as cheerio from \"cheerio\";\nimport {\n CallbackManager,\n CallbackManagerForToolRun,\n} from \"@langchain/core/callbacks/manager\";\n\nimport { Tool, ToolParams } from \"@langchain/core/tools\";\nimport { RunnableSequence } from \"@langchain/core/runnables\";\nimport { StringOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n RecursiveCharacterTextSplitter,\n TextSplitter,\n} from \"@langchain/textsplitters\";\nimport { MemoryVectorStore } from \"../vectorstores/memory.js\";\n\nimport { formatDocumentsAsString } from \"../util/document.js\";\n\nexport const parseInputs = (inputs: string): [string, string] => {\n const [baseUrl, task] = inputs.split(\",\").map((input) => {\n let t = input.trim();\n t = t.startsWith('\"') ? t.slice(1) : t;\n t = t.endsWith('\"') ? t.slice(0, -1) : t;\n // it likes to put / at the end of urls, wont matter for task\n t = t.endsWith(\"/\") ? t.slice(0, -1) : t;\n return t.trim();\n });\n\n return [baseUrl, task];\n};\n\nexport const getText = (\n html: string,\n baseUrl: string,\n summary: boolean\n): string => {\n // scriptingEnabled so noscript elements are parsed\n const $ = cheerio.load(html, { scriptingEnabled: true });\n\n let text = \"\";\n\n // lets only get the body if its a summary, dont need to summarize header or footer etc\n const rootElement = summary ? \"body \" : \"*\";\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n $(`${rootElement}:not(style):not(script):not(svg)`).each((_i, elem: any) => {\n // we dont want duplicated content as we drill down so remove children\n let content = $(elem).clone().children().remove().end().text().trim();\n const $el = $(elem);\n\n // if its an ahref, print the content and url\n let href = $el.attr(\"href\");\n if ($el.prop(\"tagName\")?.toLowerCase() === \"a\" && href) {\n if (!href.startsWith(\"http\")) {\n try {\n href = new URL(href, baseUrl).toString();\n } catch {\n // if this fails thats fine, just no url for this\n href = \"\";\n }\n }\n\n const imgAlt = $el.find(\"img[alt]\").attr(\"alt\")?.trim();\n if (imgAlt) {\n content += ` ${imgAlt}`;\n }\n\n text += ` [${content}](${href})`;\n }\n // otherwise just print the content\n else if (content !== \"\") {\n text += ` ${content}`;\n }\n });\n\n return text.trim().replace(/\\n+/g, \" \");\n};\n\nconst getHtml = async (baseUrl: string, h: Headers, config: RequestConfig) => {\n const domain = new URL(baseUrl).hostname;\n\n const headers = { ...h };\n // these appear to be positional, which means they have to exist in the headers passed in\n headers.Host = domain;\n headers[\"Alt-Used\"] = domain;\n\n let htmlResponse;\n try {\n const fetchOptions: RequestInit = {\n method: \"GET\",\n headers,\n credentials: config.withCredentials ? \"include\" : \"same-origin\",\n ...config,\n };\n\n htmlResponse = await fetch(baseUrl, fetchOptions);\n\n if (!htmlResponse.ok) {\n throw new Error(`http response ${htmlResponse.status}`);\n }\n } catch (e) {\n if (\n e &&\n typeof e === \"object\" &&\n \"message\" in e &&\n typeof e.message === \"string\" &&\n e.message.includes(\"http response\")\n ) {\n throw e;\n }\n throw e;\n }\n\n const allowedContentTypes = [\n \"text/html\",\n \"application/json\",\n \"application/xml\",\n \"application/javascript\",\n \"text/plain\",\n ];\n\n const contentType = htmlResponse.headers.get(\"content-type\") || \"\";\n const contentTypeArray = contentType.split(\";\");\n if (\n contentTypeArray[0] &&\n !allowedContentTypes.includes(contentTypeArray[0])\n ) {\n throw new Error(\"returned page was not utf8\");\n }\n return htmlResponse.text();\n};\n\nconst DEFAULT_HEADERS = {\n Accept:\n \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\n \"Accept-Encoding\": \"gzip, deflate\",\n \"Accept-Language\": \"en-US,en;q=0.5\",\n \"Alt-Used\": \"LEAVE-THIS-KEY-SET-BY-TOOL\",\n Connection: \"keep-alive\",\n Host: \"LEAVE-THIS-KEY-SET-BY-TOOL\",\n Referer: \"https://www.google.com/\",\n \"Sec-Fetch-Dest\": \"document\",\n \"Sec-Fetch-Mode\": \"navigate\",\n \"Sec-Fetch-Site\": \"cross-site\",\n \"Upgrade-Insecure-Requests\": \"1\",\n \"User-Agent\":\n \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0\",\n};\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype Headers = Record<string, any>;\n\n/**\n * Configuration options for fetch requests, similar to axios config but for fetch\n */\nexport interface RequestConfig extends Omit<RequestInit, \"headers\"> {\n withCredentials?: boolean;\n}\n\n/**\n * Defines the arguments that can be passed to the WebBrowser constructor.\n * It extends the ToolParams interface and includes properties for a\n * language model, embeddings, HTTP headers, an Axios configuration, a\n * callback manager, and a text splitter.\n */\nexport interface WebBrowserArgs extends ToolParams {\n model: BaseLanguageModelInterface;\n\n embeddings: EmbeddingsInterface;\n\n headers?: Headers;\n\n requestConfig?: RequestConfig;\n\n /** @deprecated */\n callbackManager?: CallbackManager;\n\n textSplitter?: TextSplitter;\n}\n\n/**\n * A class designed to interact with web pages, either to extract\n * information from them or to summarize their content. It uses the native\n * fetch API to send HTTP requests and the cheerio library to parse the\n * returned HTML.\n * @example\n * ```typescript\n * const browser = new WebBrowser({\n * model: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 }),\n * embeddings: new OpenAIEmbeddings({}),\n * });\n * const result = await browser.invoke(\"https:exampleurl.com\");\n * ```\n */\nexport class WebBrowser extends Tool {\n static lc_name() {\n return \"WebBrowser\";\n }\n\n get lc_namespace() {\n return [...super.lc_namespace, \"webbrowser\"];\n }\n\n private model: BaseLanguageModelInterface;\n\n private embeddings: EmbeddingsInterface;\n\n private headers: Headers;\n\n private requestConfig: RequestConfig;\n\n private textSplitter: TextSplitter;\n\n constructor({\n model,\n headers,\n embeddings,\n requestConfig,\n textSplitter,\n }: WebBrowserArgs) {\n super(...arguments);\n\n this.model = model;\n this.embeddings = embeddings;\n this.headers = headers ?? DEFAULT_HEADERS;\n this.requestConfig = {\n withCredentials: true,\n ...requestConfig,\n };\n this.textSplitter =\n textSplitter ??\n new RecursiveCharacterTextSplitter({\n chunkSize: 2000,\n chunkOverlap: 200,\n });\n }\n\n /** @ignore */\n async _call(inputs: string, runManager?: CallbackManagerForToolRun) {\n const [baseUrl, task] = parseInputs(inputs);\n const doSummary = !task;\n\n let text;\n try {\n const html = await getHtml(baseUrl, this.headers, this.requestConfig);\n text = getText(html, baseUrl, doSummary);\n } catch (e) {\n if (e) {\n return e.toString();\n }\n return \"There was a problem connecting to the site\";\n }\n\n const texts = await this.textSplitter.splitText(text);\n\n let context;\n // if we want a summary grab first 4\n if (doSummary) {\n context = texts.slice(0, 4).join(\"\\n\");\n }\n // search term well embed and grab top 4\n else {\n const docs = texts.map(\n (pageContent) =>\n new Document({\n pageContent,\n metadata: [],\n })\n );\n\n const vectorStore = await MemoryVectorStore.fromDocuments(\n docs,\n this.embeddings\n );\n const results = await vectorStore.similaritySearch(\n task,\n 4,\n undefined,\n runManager?.getChild(\"vectorstore\")\n );\n context = formatDocumentsAsString(results);\n }\n\n const input = `Text:${context}\\n\\nI need ${\n doSummary ? \"a summary\" : task\n } from the above text, also provide up to 5 markdown links from within that would be of interest (always including URL and text). Links should be provided, if present, in markdown syntax as a list under the heading \"Relevant Links:\".`;\n\n const chain = RunnableSequence.from([this.model, new StringOutputParser()]);\n return chain.invoke(input, runManager?.getChild());\n }\n\n name = \"web-browser\";\n\n description = `useful for when you need to find something on or summarize a webpage. input should be a comma separated list of \"ONE valid http URL including protocol\",\"what you want to find on the page or empty string for a summary\".`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"webbrowser.cjs","names":["Tool","RecursiveCharacterTextSplitter","Document","MemoryVectorStore","formatDocumentsAsString","RunnableSequence","StringOutputParser"],"sources":["../../src/tools/webbrowser.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { Document } from \"@langchain/core/documents\";\nimport type { EmbeddingsInterface } from \"@langchain/core/embeddings\";\n\nimport * as cheerio from \"cheerio\";\nimport {\n CallbackManager,\n CallbackManagerForToolRun,\n} from \"@langchain/core/callbacks/manager\";\n\nimport { Tool, ToolParams } from \"@langchain/core/tools\";\nimport { RunnableSequence } from \"@langchain/core/runnables\";\nimport { StringOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n RecursiveCharacterTextSplitter,\n TextSplitter,\n} from \"@langchain/textsplitters\";\nimport { MemoryVectorStore } from \"../vectorstores/memory.js\";\n\nimport { formatDocumentsAsString } from \"../util/document.js\";\n\nexport const parseInputs = (inputs: string): [string, string] => {\n const [baseUrl, task] = inputs.split(\",\").map((input) => {\n let t = input.trim();\n t = t.startsWith('\"') ? t.slice(1) : t;\n t = t.endsWith('\"') ? t.slice(0, -1) : t;\n // it likes to put / at the end of urls, wont matter for task\n t = t.endsWith(\"/\") ? t.slice(0, -1) : t;\n return t.trim();\n });\n\n return [baseUrl, task];\n};\n\nexport const getText = (\n html: string,\n baseUrl: string,\n summary: boolean\n): string => {\n // scriptingEnabled so noscript elements are parsed\n const $ = cheerio.load(html, { scriptingEnabled: true });\n\n let text = \"\";\n\n // lets only get the body if its a summary, dont need to summarize header or footer etc\n const rootElement = summary ? \"body \" : \"*\";\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n $(`${rootElement}:not(style):not(script):not(svg)`).each((_i, elem: any) => {\n // we dont want duplicated content as we drill down so remove children\n let content = $(elem).clone().children().remove().end().text().trim();\n const $el = $(elem);\n\n // if its an ahref, print the content and url\n let href = $el.attr(\"href\");\n if ($el.prop(\"tagName\")?.toLowerCase() === \"a\" && href) {\n if (!href.startsWith(\"http\")) {\n try {\n href = new URL(href, baseUrl).toString();\n } catch {\n // if this fails thats fine, just no url for this\n href = \"\";\n }\n }\n\n const imgAlt = $el.find(\"img[alt]\").attr(\"alt\")?.trim();\n if (imgAlt) {\n content += ` ${imgAlt}`;\n }\n\n text += ` [${content}](${href})`;\n }\n // otherwise just print the content\n else if (content !== \"\") {\n text += ` ${content}`;\n }\n });\n\n return text.trim().replace(/\\n+/g, \" \");\n};\n\nconst getHtml = async (baseUrl: string, h: Headers, config: RequestConfig) => {\n const domain = new URL(baseUrl).hostname;\n\n const headers = { ...h };\n // these appear to be positional, which means they have to exist in the headers passed in\n headers.Host = domain;\n headers[\"Alt-Used\"] = domain;\n\n let htmlResponse;\n try {\n const fetchOptions: RequestInit = {\n method: \"GET\",\n headers,\n credentials: config.withCredentials ? \"include\" : \"same-origin\",\n ...config,\n };\n\n htmlResponse = await fetch(baseUrl, fetchOptions);\n\n if (!htmlResponse.ok) {\n throw new Error(`http response ${htmlResponse.status}`);\n }\n } catch (e) {\n if (\n e &&\n typeof e === \"object\" &&\n \"message\" in e &&\n typeof e.message === \"string\" &&\n e.message.includes(\"http response\")\n ) {\n throw e;\n }\n throw e;\n }\n\n const allowedContentTypes = [\n \"text/html\",\n \"application/json\",\n \"application/xml\",\n \"application/javascript\",\n \"text/plain\",\n ];\n\n const contentType = htmlResponse.headers.get(\"content-type\") || \"\";\n const contentTypeArray = contentType.split(\";\");\n if (\n contentTypeArray[0] &&\n !allowedContentTypes.includes(contentTypeArray[0])\n ) {\n throw new Error(\"returned page was not utf8\");\n }\n return htmlResponse.text();\n};\n\nconst DEFAULT_HEADERS = {\n Accept:\n \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\n \"Accept-Encoding\": \"gzip, deflate\",\n \"Accept-Language\": \"en-US,en;q=0.5\",\n \"Alt-Used\": \"LEAVE-THIS-KEY-SET-BY-TOOL\",\n Connection: \"keep-alive\",\n Host: \"LEAVE-THIS-KEY-SET-BY-TOOL\",\n Referer: \"https://www.google.com/\",\n \"Sec-Fetch-Dest\": \"document\",\n \"Sec-Fetch-Mode\": \"navigate\",\n \"Sec-Fetch-Site\": \"cross-site\",\n \"Upgrade-Insecure-Requests\": \"1\",\n \"User-Agent\":\n \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0\",\n};\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype Headers = Record<string, any>;\n\n/**\n * Configuration options for fetch requests, similar to axios config but for fetch\n */\nexport interface RequestConfig extends Omit<RequestInit, \"headers\"> {\n withCredentials?: boolean;\n}\n\n/**\n * Defines the arguments that can be passed to the WebBrowser constructor.\n * It extends the ToolParams interface and includes properties for a\n * language model, embeddings, HTTP headers, an Axios configuration, a\n * callback manager, and a text splitter.\n */\nexport interface WebBrowserArgs extends ToolParams {\n model: BaseLanguageModelInterface;\n\n embeddings: EmbeddingsInterface;\n\n headers?: Headers;\n\n requestConfig?: RequestConfig;\n\n /** @deprecated */\n callbackManager?: CallbackManager;\n\n textSplitter?: TextSplitter;\n}\n\n/**\n * A class designed to interact with web pages, either to extract\n * information from them or to summarize their content. It uses the native\n * fetch API to send HTTP requests and the cheerio library to parse the\n * returned HTML.\n * @example\n * ```typescript\n * const browser = new WebBrowser({\n * model: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 }),\n * embeddings: new OpenAIEmbeddings({}),\n * });\n * const result = await browser.invoke(\"https:exampleurl.com\");\n * ```\n */\nexport class WebBrowser extends Tool {\n static lc_name() {\n return \"WebBrowser\";\n }\n\n get lc_namespace() {\n return [...super.lc_namespace, \"webbrowser\"];\n }\n\n private model: BaseLanguageModelInterface;\n\n private embeddings: EmbeddingsInterface;\n\n private headers: Headers;\n\n private requestConfig: RequestConfig;\n\n private textSplitter: TextSplitter;\n\n constructor({\n model,\n headers,\n embeddings,\n requestConfig,\n textSplitter,\n }: WebBrowserArgs) {\n super(...arguments);\n\n this.model = model;\n this.embeddings = embeddings;\n this.headers = headers ?? DEFAULT_HEADERS;\n this.requestConfig = {\n withCredentials: true,\n ...requestConfig,\n };\n this.textSplitter =\n textSplitter ??\n new RecursiveCharacterTextSplitter({\n chunkSize: 2000,\n chunkOverlap: 200,\n });\n }\n\n /** @ignore */\n async _call(inputs: string, runManager?: CallbackManagerForToolRun) {\n const [baseUrl, task] = parseInputs(inputs);\n const doSummary = !task;\n\n let text;\n try {\n const html = await getHtml(baseUrl, this.headers, this.requestConfig);\n text = getText(html, baseUrl, doSummary);\n } catch (e) {\n if (e) {\n return e.toString();\n }\n return \"There was a problem connecting to the site\";\n }\n\n const texts = await this.textSplitter.splitText(text);\n\n let context;\n // if we want a summary grab first 4\n if (doSummary) {\n context = texts.slice(0, 4).join(\"\\n\");\n }\n // search term well embed and grab top 4\n else {\n const docs = texts.map(\n (pageContent) =>\n new Document({\n pageContent,\n metadata: [],\n })\n );\n\n const vectorStore = await MemoryVectorStore.fromDocuments(\n docs,\n this.embeddings\n );\n const results = await vectorStore.similaritySearch(\n task,\n 4,\n undefined,\n runManager?.getChild(\"vectorstore\")\n );\n context = formatDocumentsAsString(results);\n }\n\n const input = `Text:${context}\\n\\nI need ${\n doSummary ? \"a summary\" : task\n } from the above text, also provide up to 5 markdown links from within that would be of interest (always including URL and text). Links should be provided, if present, in markdown syntax as a list under the heading \"Relevant Links:\".`;\n\n const chain = RunnableSequence.from([this.model, new StringOutputParser()]);\n return chain.invoke(input, runManager?.getChild());\n }\n\n name = \"web-browser\";\n\n description = `useful for when you need to find something on or summarize a webpage. input should be a comma separated list of \"ONE valid http URL including protocol\",\"what you want to find on the page or empty string for a summary\".`;\n}\n"],"mappings":"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"}
@@ -147,7 +147,8 @@ var WebBrowser = class extends Tool {
147
147
  pageContent,
148
148
  metadata: []
149
149
  }));
150
- context = formatDocumentsAsString(await (await MemoryVectorStore.fromDocuments(docs, this.embeddings)).similaritySearch(task, 4, void 0, runManager?.getChild("vectorstore")));
150
+ const results = await (await MemoryVectorStore.fromDocuments(docs, this.embeddings)).similaritySearch(task, 4, void 0, runManager?.getChild("vectorstore"));
151
+ context = formatDocumentsAsString(results);
151
152
  }
152
153
  const input = `Text:${context}\n\nI need ${doSummary ? "a summary" : task} from the above text, also provide up to 5 markdown links from within that would be of interest (always including URL and text). Links should be provided, if present, in markdown syntax as a list under the heading "Relevant Links:".`;
153
154
  return RunnableSequence.from([this.model, new StringOutputParser()]).invoke(input, runManager?.getChild());
@@ -1 +1 @@
1
- {"version":3,"file":"webbrowser.js","names":[],"sources":["../../src/tools/webbrowser.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { Document } from \"@langchain/core/documents\";\nimport type { EmbeddingsInterface } from \"@langchain/core/embeddings\";\n\nimport * as cheerio from \"cheerio\";\nimport {\n CallbackManager,\n CallbackManagerForToolRun,\n} from \"@langchain/core/callbacks/manager\";\n\nimport { Tool, ToolParams } from \"@langchain/core/tools\";\nimport { RunnableSequence } from \"@langchain/core/runnables\";\nimport { StringOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n RecursiveCharacterTextSplitter,\n TextSplitter,\n} from \"@langchain/textsplitters\";\nimport { MemoryVectorStore } from \"../vectorstores/memory.js\";\n\nimport { formatDocumentsAsString } from \"../util/document.js\";\n\nexport const parseInputs = (inputs: string): [string, string] => {\n const [baseUrl, task] = inputs.split(\",\").map((input) => {\n let t = input.trim();\n t = t.startsWith('\"') ? t.slice(1) : t;\n t = t.endsWith('\"') ? t.slice(0, -1) : t;\n // it likes to put / at the end of urls, wont matter for task\n t = t.endsWith(\"/\") ? t.slice(0, -1) : t;\n return t.trim();\n });\n\n return [baseUrl, task];\n};\n\nexport const getText = (\n html: string,\n baseUrl: string,\n summary: boolean\n): string => {\n // scriptingEnabled so noscript elements are parsed\n const $ = cheerio.load(html, { scriptingEnabled: true });\n\n let text = \"\";\n\n // lets only get the body if its a summary, dont need to summarize header or footer etc\n const rootElement = summary ? \"body \" : \"*\";\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n $(`${rootElement}:not(style):not(script):not(svg)`).each((_i, elem: any) => {\n // we dont want duplicated content as we drill down so remove children\n let content = $(elem).clone().children().remove().end().text().trim();\n const $el = $(elem);\n\n // if its an ahref, print the content and url\n let href = $el.attr(\"href\");\n if ($el.prop(\"tagName\")?.toLowerCase() === \"a\" && href) {\n if (!href.startsWith(\"http\")) {\n try {\n href = new URL(href, baseUrl).toString();\n } catch {\n // if this fails thats fine, just no url for this\n href = \"\";\n }\n }\n\n const imgAlt = $el.find(\"img[alt]\").attr(\"alt\")?.trim();\n if (imgAlt) {\n content += ` ${imgAlt}`;\n }\n\n text += ` [${content}](${href})`;\n }\n // otherwise just print the content\n else if (content !== \"\") {\n text += ` ${content}`;\n }\n });\n\n return text.trim().replace(/\\n+/g, \" \");\n};\n\nconst getHtml = async (baseUrl: string, h: Headers, config: RequestConfig) => {\n const domain = new URL(baseUrl).hostname;\n\n const headers = { ...h };\n // these appear to be positional, which means they have to exist in the headers passed in\n headers.Host = domain;\n headers[\"Alt-Used\"] = domain;\n\n let htmlResponse;\n try {\n const fetchOptions: RequestInit = {\n method: \"GET\",\n headers,\n credentials: config.withCredentials ? \"include\" : \"same-origin\",\n ...config,\n };\n\n htmlResponse = await fetch(baseUrl, fetchOptions);\n\n if (!htmlResponse.ok) {\n throw new Error(`http response ${htmlResponse.status}`);\n }\n } catch (e) {\n if (\n e &&\n typeof e === \"object\" &&\n \"message\" in e &&\n typeof e.message === \"string\" &&\n e.message.includes(\"http response\")\n ) {\n throw e;\n }\n throw e;\n }\n\n const allowedContentTypes = [\n \"text/html\",\n \"application/json\",\n \"application/xml\",\n \"application/javascript\",\n \"text/plain\",\n ];\n\n const contentType = htmlResponse.headers.get(\"content-type\") || \"\";\n const contentTypeArray = contentType.split(\";\");\n if (\n contentTypeArray[0] &&\n !allowedContentTypes.includes(contentTypeArray[0])\n ) {\n throw new Error(\"returned page was not utf8\");\n }\n return htmlResponse.text();\n};\n\nconst DEFAULT_HEADERS = {\n Accept:\n \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\n \"Accept-Encoding\": \"gzip, deflate\",\n \"Accept-Language\": \"en-US,en;q=0.5\",\n \"Alt-Used\": \"LEAVE-THIS-KEY-SET-BY-TOOL\",\n Connection: \"keep-alive\",\n Host: \"LEAVE-THIS-KEY-SET-BY-TOOL\",\n Referer: \"https://www.google.com/\",\n \"Sec-Fetch-Dest\": \"document\",\n \"Sec-Fetch-Mode\": \"navigate\",\n \"Sec-Fetch-Site\": \"cross-site\",\n \"Upgrade-Insecure-Requests\": \"1\",\n \"User-Agent\":\n \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0\",\n};\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype Headers = Record<string, any>;\n\n/**\n * Configuration options for fetch requests, similar to axios config but for fetch\n */\nexport interface RequestConfig extends Omit<RequestInit, \"headers\"> {\n withCredentials?: boolean;\n}\n\n/**\n * Defines the arguments that can be passed to the WebBrowser constructor.\n * It extends the ToolParams interface and includes properties for a\n * language model, embeddings, HTTP headers, an Axios configuration, a\n * callback manager, and a text splitter.\n */\nexport interface WebBrowserArgs extends ToolParams {\n model: BaseLanguageModelInterface;\n\n embeddings: EmbeddingsInterface;\n\n headers?: Headers;\n\n requestConfig?: RequestConfig;\n\n /** @deprecated */\n callbackManager?: CallbackManager;\n\n textSplitter?: TextSplitter;\n}\n\n/**\n * A class designed to interact with web pages, either to extract\n * information from them or to summarize their content. It uses the native\n * fetch API to send HTTP requests and the cheerio library to parse the\n * returned HTML.\n * @example\n * ```typescript\n * const browser = new WebBrowser({\n * model: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 }),\n * embeddings: new OpenAIEmbeddings({}),\n * });\n * const result = await browser.invoke(\"https:exampleurl.com\");\n * ```\n */\nexport class WebBrowser extends Tool {\n static lc_name() {\n return \"WebBrowser\";\n }\n\n get lc_namespace() {\n return [...super.lc_namespace, \"webbrowser\"];\n }\n\n private model: BaseLanguageModelInterface;\n\n private embeddings: EmbeddingsInterface;\n\n private headers: Headers;\n\n private requestConfig: RequestConfig;\n\n private textSplitter: TextSplitter;\n\n constructor({\n model,\n headers,\n embeddings,\n requestConfig,\n textSplitter,\n }: WebBrowserArgs) {\n super(...arguments);\n\n this.model = model;\n this.embeddings = embeddings;\n this.headers = headers ?? DEFAULT_HEADERS;\n this.requestConfig = {\n withCredentials: true,\n ...requestConfig,\n };\n this.textSplitter =\n textSplitter ??\n new RecursiveCharacterTextSplitter({\n chunkSize: 2000,\n chunkOverlap: 200,\n });\n }\n\n /** @ignore */\n async _call(inputs: string, runManager?: CallbackManagerForToolRun) {\n const [baseUrl, task] = parseInputs(inputs);\n const doSummary = !task;\n\n let text;\n try {\n const html = await getHtml(baseUrl, this.headers, this.requestConfig);\n text = getText(html, baseUrl, doSummary);\n } catch (e) {\n if (e) {\n return e.toString();\n }\n return \"There was a problem connecting to the site\";\n }\n\n const texts = await this.textSplitter.splitText(text);\n\n let context;\n // if we want a summary grab first 4\n if (doSummary) {\n context = texts.slice(0, 4).join(\"\\n\");\n }\n // search term well embed and grab top 4\n else {\n const docs = texts.map(\n (pageContent) =>\n new Document({\n pageContent,\n metadata: [],\n })\n );\n\n const vectorStore = await MemoryVectorStore.fromDocuments(\n docs,\n this.embeddings\n );\n const results = await vectorStore.similaritySearch(\n task,\n 4,\n undefined,\n runManager?.getChild(\"vectorstore\")\n );\n context = formatDocumentsAsString(results);\n }\n\n const input = `Text:${context}\\n\\nI need ${\n doSummary ? \"a summary\" : task\n } from the above text, also provide up to 5 markdown links from within that would be of interest (always including URL and text). Links should be provided, if present, in markdown syntax as a list under the heading \"Relevant Links:\".`;\n\n const chain = RunnableSequence.from([this.model, new StringOutputParser()]);\n return chain.invoke(input, runManager?.getChild());\n }\n\n name = \"web-browser\";\n\n description = `useful for when you need to find something on or summarize a webpage. input should be a comma separated list of \"ONE valid http URL including protocol\",\"what you want to find on the page or empty string for a summary\".`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"webbrowser.js","names":[],"sources":["../../src/tools/webbrowser.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { Document } from \"@langchain/core/documents\";\nimport type { EmbeddingsInterface } from \"@langchain/core/embeddings\";\n\nimport * as cheerio from \"cheerio\";\nimport {\n CallbackManager,\n CallbackManagerForToolRun,\n} from \"@langchain/core/callbacks/manager\";\n\nimport { Tool, ToolParams } from \"@langchain/core/tools\";\nimport { RunnableSequence } from \"@langchain/core/runnables\";\nimport { StringOutputParser } from \"@langchain/core/output_parsers\";\nimport {\n RecursiveCharacterTextSplitter,\n TextSplitter,\n} from \"@langchain/textsplitters\";\nimport { MemoryVectorStore } from \"../vectorstores/memory.js\";\n\nimport { formatDocumentsAsString } from \"../util/document.js\";\n\nexport const parseInputs = (inputs: string): [string, string] => {\n const [baseUrl, task] = inputs.split(\",\").map((input) => {\n let t = input.trim();\n t = t.startsWith('\"') ? t.slice(1) : t;\n t = t.endsWith('\"') ? t.slice(0, -1) : t;\n // it likes to put / at the end of urls, wont matter for task\n t = t.endsWith(\"/\") ? t.slice(0, -1) : t;\n return t.trim();\n });\n\n return [baseUrl, task];\n};\n\nexport const getText = (\n html: string,\n baseUrl: string,\n summary: boolean\n): string => {\n // scriptingEnabled so noscript elements are parsed\n const $ = cheerio.load(html, { scriptingEnabled: true });\n\n let text = \"\";\n\n // lets only get the body if its a summary, dont need to summarize header or footer etc\n const rootElement = summary ? \"body \" : \"*\";\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n $(`${rootElement}:not(style):not(script):not(svg)`).each((_i, elem: any) => {\n // we dont want duplicated content as we drill down so remove children\n let content = $(elem).clone().children().remove().end().text().trim();\n const $el = $(elem);\n\n // if its an ahref, print the content and url\n let href = $el.attr(\"href\");\n if ($el.prop(\"tagName\")?.toLowerCase() === \"a\" && href) {\n if (!href.startsWith(\"http\")) {\n try {\n href = new URL(href, baseUrl).toString();\n } catch {\n // if this fails thats fine, just no url for this\n href = \"\";\n }\n }\n\n const imgAlt = $el.find(\"img[alt]\").attr(\"alt\")?.trim();\n if (imgAlt) {\n content += ` ${imgAlt}`;\n }\n\n text += ` [${content}](${href})`;\n }\n // otherwise just print the content\n else if (content !== \"\") {\n text += ` ${content}`;\n }\n });\n\n return text.trim().replace(/\\n+/g, \" \");\n};\n\nconst getHtml = async (baseUrl: string, h: Headers, config: RequestConfig) => {\n const domain = new URL(baseUrl).hostname;\n\n const headers = { ...h };\n // these appear to be positional, which means they have to exist in the headers passed in\n headers.Host = domain;\n headers[\"Alt-Used\"] = domain;\n\n let htmlResponse;\n try {\n const fetchOptions: RequestInit = {\n method: \"GET\",\n headers,\n credentials: config.withCredentials ? \"include\" : \"same-origin\",\n ...config,\n };\n\n htmlResponse = await fetch(baseUrl, fetchOptions);\n\n if (!htmlResponse.ok) {\n throw new Error(`http response ${htmlResponse.status}`);\n }\n } catch (e) {\n if (\n e &&\n typeof e === \"object\" &&\n \"message\" in e &&\n typeof e.message === \"string\" &&\n e.message.includes(\"http response\")\n ) {\n throw e;\n }\n throw e;\n }\n\n const allowedContentTypes = [\n \"text/html\",\n \"application/json\",\n \"application/xml\",\n \"application/javascript\",\n \"text/plain\",\n ];\n\n const contentType = htmlResponse.headers.get(\"content-type\") || \"\";\n const contentTypeArray = contentType.split(\";\");\n if (\n contentTypeArray[0] &&\n !allowedContentTypes.includes(contentTypeArray[0])\n ) {\n throw new Error(\"returned page was not utf8\");\n }\n return htmlResponse.text();\n};\n\nconst DEFAULT_HEADERS = {\n Accept:\n \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\",\n \"Accept-Encoding\": \"gzip, deflate\",\n \"Accept-Language\": \"en-US,en;q=0.5\",\n \"Alt-Used\": \"LEAVE-THIS-KEY-SET-BY-TOOL\",\n Connection: \"keep-alive\",\n Host: \"LEAVE-THIS-KEY-SET-BY-TOOL\",\n Referer: \"https://www.google.com/\",\n \"Sec-Fetch-Dest\": \"document\",\n \"Sec-Fetch-Mode\": \"navigate\",\n \"Sec-Fetch-Site\": \"cross-site\",\n \"Upgrade-Insecure-Requests\": \"1\",\n \"User-Agent\":\n \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0\",\n};\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype Headers = Record<string, any>;\n\n/**\n * Configuration options for fetch requests, similar to axios config but for fetch\n */\nexport interface RequestConfig extends Omit<RequestInit, \"headers\"> {\n withCredentials?: boolean;\n}\n\n/**\n * Defines the arguments that can be passed to the WebBrowser constructor.\n * It extends the ToolParams interface and includes properties for a\n * language model, embeddings, HTTP headers, an Axios configuration, a\n * callback manager, and a text splitter.\n */\nexport interface WebBrowserArgs extends ToolParams {\n model: BaseLanguageModelInterface;\n\n embeddings: EmbeddingsInterface;\n\n headers?: Headers;\n\n requestConfig?: RequestConfig;\n\n /** @deprecated */\n callbackManager?: CallbackManager;\n\n textSplitter?: TextSplitter;\n}\n\n/**\n * A class designed to interact with web pages, either to extract\n * information from them or to summarize their content. It uses the native\n * fetch API to send HTTP requests and the cheerio library to parse the\n * returned HTML.\n * @example\n * ```typescript\n * const browser = new WebBrowser({\n * model: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 }),\n * embeddings: new OpenAIEmbeddings({}),\n * });\n * const result = await browser.invoke(\"https:exampleurl.com\");\n * ```\n */\nexport class WebBrowser extends Tool {\n static lc_name() {\n return \"WebBrowser\";\n }\n\n get lc_namespace() {\n return [...super.lc_namespace, \"webbrowser\"];\n }\n\n private model: BaseLanguageModelInterface;\n\n private embeddings: EmbeddingsInterface;\n\n private headers: Headers;\n\n private requestConfig: RequestConfig;\n\n private textSplitter: TextSplitter;\n\n constructor({\n model,\n headers,\n embeddings,\n requestConfig,\n textSplitter,\n }: WebBrowserArgs) {\n super(...arguments);\n\n this.model = model;\n this.embeddings = embeddings;\n this.headers = headers ?? DEFAULT_HEADERS;\n this.requestConfig = {\n withCredentials: true,\n ...requestConfig,\n };\n this.textSplitter =\n textSplitter ??\n new RecursiveCharacterTextSplitter({\n chunkSize: 2000,\n chunkOverlap: 200,\n });\n }\n\n /** @ignore */\n async _call(inputs: string, runManager?: CallbackManagerForToolRun) {\n const [baseUrl, task] = parseInputs(inputs);\n const doSummary = !task;\n\n let text;\n try {\n const html = await getHtml(baseUrl, this.headers, this.requestConfig);\n text = getText(html, baseUrl, doSummary);\n } catch (e) {\n if (e) {\n return e.toString();\n }\n return \"There was a problem connecting to the site\";\n }\n\n const texts = await this.textSplitter.splitText(text);\n\n let context;\n // if we want a summary grab first 4\n if (doSummary) {\n context = texts.slice(0, 4).join(\"\\n\");\n }\n // search term well embed and grab top 4\n else {\n const docs = texts.map(\n (pageContent) =>\n new Document({\n pageContent,\n metadata: [],\n })\n );\n\n const vectorStore = await MemoryVectorStore.fromDocuments(\n docs,\n this.embeddings\n );\n const results = await vectorStore.similaritySearch(\n task,\n 4,\n undefined,\n runManager?.getChild(\"vectorstore\")\n );\n context = formatDocumentsAsString(results);\n }\n\n const input = `Text:${context}\\n\\nI need ${\n doSummary ? \"a summary\" : task\n } from the above text, also provide up to 5 markdown links from within that would be of interest (always including URL and text). Links should be provided, if present, in markdown syntax as a list under the heading \"Relevant Links:\".`;\n\n const chain = RunnableSequence.from([this.model, new StringOutputParser()]);\n return chain.invoke(input, runManager?.getChild());\n }\n\n name = \"web-browser\";\n\n description = `useful for when you need to find something on or summarize a webpage. input should be a comma separated list of \"ONE valid http URL including protocol\",\"what you want to find on the page or empty string for a summary\".`;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hub.cjs","names":["extname","pRetry"],"sources":["../../src/util/hub.ts"],"sourcesContent":["import pRetry from \"./p-retry/index.js\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { FileLoader, LoadValues } from \"./load.js\";\nimport { extname } from \"./extname.js\";\n\nconst fetchWithTimeout = async (\n url: string,\n init: Omit<RequestInit, \"signal\"> & { timeout: number }\n) => {\n const { timeout, ...rest } = init;\n const res = await fetch(url, {\n ...rest,\n signal: AbortSignal.timeout(timeout),\n });\n return res;\n};\n\nconst HUB_PATH_REGEX = /lc(@[^:]+)?:\\/\\/(.*)/;\n\nconst URL_PATH_SEPARATOR = \"/\";\n\nexport const loadFromHub = async <T>(\n uri: string,\n loader: FileLoader<T>,\n validPrefix: string,\n validSuffixes: Set<string>,\n values: LoadValues = {}\n): Promise<T | undefined> => {\n const LANGCHAIN_HUB_DEFAULT_REF =\n getEnvironmentVariable(\"LANGCHAIN_HUB_DEFAULT_REF\") ?? \"master\";\n const LANGCHAIN_HUB_URL_BASE =\n getEnvironmentVariable(\"LANGCHAIN_HUB_URL_BASE\") ??\n \"https://raw.githubusercontent.com/hwchase17/langchain-hub/\";\n\n const match = uri.match(HUB_PATH_REGEX);\n if (!match) {\n return undefined;\n }\n const [rawRef, remotePath] = match.slice(1);\n const ref = rawRef ? rawRef.slice(1) : LANGCHAIN_HUB_DEFAULT_REF;\n const parts = remotePath.split(URL_PATH_SEPARATOR);\n if (parts[0] !== validPrefix) {\n return undefined;\n }\n\n if (!validSuffixes.has(extname(remotePath).slice(1))) {\n throw new Error(\"Unsupported file type.\");\n }\n\n const url = [LANGCHAIN_HUB_URL_BASE, ref, remotePath].join(\"/\");\n const res = await pRetry(() => fetchWithTimeout(url, { timeout: 5000 }), {\n retries: 6,\n });\n if (res.status !== 200) {\n throw new Error(`Could not find file at ${url}`);\n }\n\n return loader(await res.text(), remotePath, values);\n};\n"],"mappings":";;;;AAKA,MAAM,mBAAmB,OACvB,KACA,SACG;CACH,MAAM,EAAE,SAAS,GAAG,SAAS;CAK7B,OAAO,MAJW,MAAM,KAAK;EAC3B,GAAG;EACH,QAAQ,YAAY,QAAQ,OAAO;CACrC,CAAC;AAEH;AAEA,MAAM,iBAAiB;AAEvB,MAAM,qBAAqB;AAE3B,MAAa,cAAc,OACzB,KACA,QACA,aACA,eACA,SAAqB,CAAC,MACK;CAC3B,MAAM,6BAAA,GAAA,0BAAA,uBAAA,CACmB,2BAA2B,KAAK;CACzD,MAAM,0BAAA,GAAA,0BAAA,uBAAA,CACmB,wBAAwB,KAC/C;CAEF,MAAM,QAAQ,IAAI,MAAM,cAAc;CACtC,IAAI,CAAC,OACH;CAEF,MAAM,CAAC,QAAQ,cAAc,MAAM,MAAM,CAAC;CAC1C,MAAM,MAAM,SAAS,OAAO,MAAM,CAAC,IAAI;CAEvC,IADc,WAAW,MAAM,kBACvB,CAAC,CAAC,OAAO,aACf;CAGF,IAAI,CAAC,cAAc,IAAIA,gBAAAA,QAAQ,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GACjD,MAAM,IAAI,MAAM,wBAAwB;CAG1C,MAAM,MAAM;EAAC;EAAwB;EAAK;CAAU,CAAC,CAAC,KAAK,GAAG;CAC9D,MAAM,MAAM,MAAMC,cAAAA,cAAa,iBAAiB,KAAK,EAAE,SAAS,IAAK,CAAC,GAAG,EACvE,SAAS,EACX,CAAC;CACD,IAAI,IAAI,WAAW,KACjB,MAAM,IAAI,MAAM,0BAA0B,KAAK;CAGjD,OAAO,OAAO,MAAM,IAAI,KAAK,GAAG,YAAY,MAAM;AACpD"}
1
+ {"version":3,"file":"hub.cjs","names":["getEnvironmentVariable","extname","pRetry"],"sources":["../../src/util/hub.ts"],"sourcesContent":["import pRetry from \"./p-retry/index.js\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { FileLoader, LoadValues } from \"./load.js\";\nimport { extname } from \"./extname.js\";\n\nconst fetchWithTimeout = async (\n url: string,\n init: Omit<RequestInit, \"signal\"> & { timeout: number }\n) => {\n const { timeout, ...rest } = init;\n const res = await fetch(url, {\n ...rest,\n signal: AbortSignal.timeout(timeout),\n });\n return res;\n};\n\nconst HUB_PATH_REGEX = /lc(@[^:]+)?:\\/\\/(.*)/;\n\nconst URL_PATH_SEPARATOR = \"/\";\n\nexport const loadFromHub = async <T>(\n uri: string,\n loader: FileLoader<T>,\n validPrefix: string,\n validSuffixes: Set<string>,\n values: LoadValues = {}\n): Promise<T | undefined> => {\n const LANGCHAIN_HUB_DEFAULT_REF =\n getEnvironmentVariable(\"LANGCHAIN_HUB_DEFAULT_REF\") ?? \"master\";\n const LANGCHAIN_HUB_URL_BASE =\n getEnvironmentVariable(\"LANGCHAIN_HUB_URL_BASE\") ??\n \"https://raw.githubusercontent.com/hwchase17/langchain-hub/\";\n\n const match = uri.match(HUB_PATH_REGEX);\n if (!match) {\n return undefined;\n }\n const [rawRef, remotePath] = match.slice(1);\n const ref = rawRef ? rawRef.slice(1) : LANGCHAIN_HUB_DEFAULT_REF;\n const parts = remotePath.split(URL_PATH_SEPARATOR);\n if (parts[0] !== validPrefix) {\n return undefined;\n }\n\n if (!validSuffixes.has(extname(remotePath).slice(1))) {\n throw new Error(\"Unsupported file type.\");\n }\n\n const url = [LANGCHAIN_HUB_URL_BASE, ref, remotePath].join(\"/\");\n const res = await pRetry(() => fetchWithTimeout(url, { timeout: 5000 }), {\n retries: 6,\n });\n if (res.status !== 200) {\n throw new Error(`Could not find file at ${url}`);\n }\n\n return loader(await res.text(), remotePath, values);\n};\n"],"mappings":";;;;AAKA,MAAM,mBAAmB,OACvB,KACA,SACG;CACH,MAAM,EAAE,SAAS,GAAG,SAAS;CAK7B,OAAO,MAJW,MAAM,KAAK;EAC3B,GAAG;EACH,QAAQ,YAAY,QAAQ,OAAO;CACrC,CAAC;AAEH;AAEA,MAAM,iBAAiB;AAEvB,MAAM,qBAAqB;AAE3B,MAAa,cAAc,OACzB,KACA,QACA,aACA,eACA,SAAqB,CAAC,MACK;CAC3B,MAAM,6BAAA,GACJA,0BAAAA,uBAAAA,CAAuB,2BAA2B,KAAK;CACzD,MAAM,0BAAA,GACJA,0BAAAA,uBAAAA,CAAuB,wBAAwB,KAC/C;CAEF,MAAM,QAAQ,IAAI,MAAM,cAAc;CACtC,IAAI,CAAC,OACH;CAEF,MAAM,CAAC,QAAQ,cAAc,MAAM,MAAM,CAAC;CAC1C,MAAM,MAAM,SAAS,OAAO,MAAM,CAAC,IAAI;CAEvC,IADc,WAAW,MAAM,kBACvB,CAAC,CAAC,OAAO,aACf;CAGF,IAAI,CAAC,cAAc,IAAIC,gBAAAA,QAAQ,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GACjD,MAAM,IAAI,MAAM,wBAAwB;CAG1C,MAAM,MAAM;EAAC;EAAwB;EAAK;CAAU,CAAC,CAAC,KAAK,GAAG;CAC9D,MAAM,MAAM,MAAMC,cAAAA,cAAa,iBAAiB,KAAK,EAAE,SAAS,IAAK,CAAC,GAAG,EACvE,SAAS,EACX,CAAC;CACD,IAAI,IAAI,WAAW,KACjB,MAAM,IAAI,MAAM,0BAA0B,KAAK;CAGjD,OAAO,OAAO,MAAM,IAAI,KAAK,GAAG,YAAY,MAAM;AACpD"}
@@ -192,7 +192,8 @@ var MemoryVectorStore = class MemoryVectorStore extends _langchain_core_vectorst
192
192
  async maxMarginalRelevanceSearch(query, options) {
193
193
  const queryEmbedding = await this.embeddings.embedQuery(query);
194
194
  const searches = await this._queryVectors(queryEmbedding, options.fetchK ?? 20, options.filter);
195
- return (0, _langchain_core_utils_math.maximalMarginalRelevance)(queryEmbedding, searches.map((searchResp) => searchResp.embedding), options.lambda, options.k).map((idx) => new _langchain_core_documents.Document({
195
+ const embeddingList = searches.map((searchResp) => searchResp.embedding);
196
+ return (0, _langchain_core_utils_math.maximalMarginalRelevance)(queryEmbedding, embeddingList, options.lambda, options.k).map((idx) => new _langchain_core_documents.Document({
196
197
  metadata: searches[idx].metadata,
197
198
  pageContent: searches[idx].content,
198
199
  id: searches[idx].id
@@ -1 +1 @@
1
- {"version":3,"file":"memory.cjs","names":["VectorStore","cosine","Document"],"sources":["../../src/vectorstores/memory.ts"],"sourcesContent":["import {\n MaxMarginalRelevanceSearchOptions,\n VectorStore,\n} from \"@langchain/core/vectorstores\";\nimport type { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { Document, DocumentInterface } from \"@langchain/core/documents\";\nimport { maximalMarginalRelevance } from \"@langchain/core/utils/math\";\nimport { cosine } from \"../util/ml-distance/similarities.js\";\n\n/**\n * Interface representing a vector in memory. It includes the content\n * (text), the corresponding embedding (vector), and any associated\n * metadata.\n */\ninterface MemoryVector {\n content: string;\n embedding: number[];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n metadata: Record<string, any>;\n id?: string;\n}\n\n/**\n * Interface for the arguments that can be passed to the\n * `MemoryVectorStore` constructor. It includes an optional `similarity`\n * function.\n */\nexport interface MemoryVectorStoreArgs {\n similarity?: typeof cosine;\n}\n\n/**\n * In-memory, ephemeral vector store.\n *\n * Setup:\n * Install `langchain`:\n *\n * ```bash\n * npm install langchain\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/langchain.vectorstores_memory.MemoryVectorStore.html#constructor)\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { MemoryVectorStore } from 'langchain/vectorstores/memory';\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const vectorStore = new MemoryVectorStore(embeddings);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n *\n * await vectorStore.addDocuments(documents);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, { baz: \"bar\" });\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * [SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport class MemoryVectorStore extends VectorStore {\n declare FilterType: (doc: Document) => boolean;\n\n memoryVectors: MemoryVector[] = [];\n\n similarity: typeof cosine;\n\n _vectorstoreType(): string {\n return \"memory\";\n }\n\n constructor(\n embeddings: EmbeddingsInterface,\n { similarity, ...rest }: MemoryVectorStoreArgs = {}\n ) {\n super(embeddings, rest);\n\n this.similarity = similarity ?? cosine;\n }\n\n /**\n * Method to add documents to the memory vector store. It extracts the\n * text from each document, generates embeddings for them, and adds the\n * resulting vectors to the store.\n * @param documents Array of `Document` instances to be added to the store.\n * @returns Promise that resolves when all documents have been added.\n */\n async addDocuments(documents: Document[]): Promise<void> {\n const texts = documents.map(({ pageContent }) => pageContent);\n return this.addVectors(\n await this.embeddings.embedDocuments(texts),\n documents\n );\n }\n\n /**\n * Method to add vectors to the memory vector store. It creates\n * `MemoryVector` instances for each vector and document pair and adds\n * them to the store.\n * @param vectors Array of vectors to be added to the store.\n * @param documents Array of `Document` instances corresponding to the vectors.\n * @returns Promise that resolves when all vectors have been added.\n */\n async addVectors(vectors: number[][], documents: Document[]): Promise<void> {\n const memoryVectors = vectors.map((embedding, idx) => ({\n content: documents[idx].pageContent,\n embedding,\n metadata: documents[idx].metadata,\n id: documents[idx].id,\n }));\n\n this.memoryVectors = this.memoryVectors.concat(memoryVectors);\n }\n\n protected async _queryVectors(\n query: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ) {\n const filterFunction = (memoryVector: MemoryVector) => {\n if (!filter) {\n return true;\n }\n\n const doc = new Document({\n metadata: memoryVector.metadata,\n pageContent: memoryVector.content,\n id: memoryVector.id,\n });\n return filter(doc);\n };\n const filteredMemoryVectors = this.memoryVectors.filter(filterFunction);\n return filteredMemoryVectors\n .map((vector, index) => ({\n similarity: this.similarity(query, vector.embedding),\n index,\n metadata: vector.metadata,\n content: vector.content,\n embedding: vector.embedding,\n id: vector.id,\n }))\n .sort((a, b) => (a.similarity > b.similarity ? -1 : 0))\n .slice(0, k);\n }\n\n /**\n * Method to perform a similarity search in the memory vector store. It\n * calculates the similarity between the query vector and each vector in\n * the store, sorts the results by similarity, and returns the top `k`\n * results along with their scores.\n * @param query Query vector to compare against the vectors in the store.\n * @param k Number of top results to return.\n * @param filter Optional filter function to apply to the vectors before performing the search.\n * @returns Promise that resolves with an array of tuples, each containing a `Document` and its similarity score.\n */\n async similaritySearchVectorWithScore(\n query: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ): Promise<[Document, number][]> {\n const searches = await this._queryVectors(query, k, filter);\n const result: [Document, number][] = searches.map((search) => [\n new Document({\n metadata: search.metadata,\n pageContent: search.content,\n id: search.id,\n }),\n search.similarity,\n ]);\n\n return result;\n }\n\n async maxMarginalRelevanceSearch(\n query: string,\n options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>\n ): Promise<DocumentInterface[]> {\n const queryEmbedding = await this.embeddings.embedQuery(query);\n\n const searches = await this._queryVectors(\n queryEmbedding,\n options.fetchK ?? 20,\n options.filter\n );\n\n const embeddingList = searches.map((searchResp) => searchResp.embedding);\n\n const mmrIndexes = maximalMarginalRelevance(\n queryEmbedding,\n embeddingList,\n options.lambda,\n options.k\n );\n\n return mmrIndexes.map(\n (idx) =>\n new Document({\n metadata: searches[idx].metadata,\n pageContent: searches[idx].content,\n id: searches[idx].id,\n })\n );\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an array of\n * texts. It creates a `Document` for each text and metadata pair, and\n * adds them to the store.\n * @param texts Array of texts to be added to the store.\n * @param metadatas Array or single object of metadata corresponding to the texts.\n * @param embeddings `Embeddings` instance used to generate embeddings for the texts.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromTexts(\n texts: string[],\n metadatas: object[] | object,\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const docs: Document[] = [];\n for (let i = 0; i < texts.length; i += 1) {\n const metadata = Array.isArray(metadatas) ? metadatas[i] : metadatas;\n const newDoc = new Document({\n pageContent: texts[i],\n metadata,\n });\n docs.push(newDoc);\n }\n return MemoryVectorStore.fromDocuments(docs, embeddings, dbConfig);\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an array of\n * `Document` instances. It adds the documents to the store.\n * @param docs Array of `Document` instances to be added to the store.\n * @param embeddings `Embeddings` instance used to generate embeddings for the documents.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromDocuments(\n docs: Document[],\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const instance = new this(embeddings, dbConfig);\n await instance.addDocuments(docs);\n return instance;\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an existing\n * index. It creates a new `MemoryVectorStore` instance without adding any\n * documents or vectors.\n * @param embeddings `Embeddings` instance used to generate embeddings for the documents.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromExistingIndex(\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const instance = new this(embeddings, dbConfig);\n return instance;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"memory.cjs","names":["VectorStore","cosine","Document","maximalMarginalRelevance"],"sources":["../../src/vectorstores/memory.ts"],"sourcesContent":["import {\n MaxMarginalRelevanceSearchOptions,\n VectorStore,\n} from \"@langchain/core/vectorstores\";\nimport type { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { Document, DocumentInterface } from \"@langchain/core/documents\";\nimport { maximalMarginalRelevance } from \"@langchain/core/utils/math\";\nimport { cosine } from \"../util/ml-distance/similarities.js\";\n\n/**\n * Interface representing a vector in memory. It includes the content\n * (text), the corresponding embedding (vector), and any associated\n * metadata.\n */\ninterface MemoryVector {\n content: string;\n embedding: number[];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n metadata: Record<string, any>;\n id?: string;\n}\n\n/**\n * Interface for the arguments that can be passed to the\n * `MemoryVectorStore` constructor. It includes an optional `similarity`\n * function.\n */\nexport interface MemoryVectorStoreArgs {\n similarity?: typeof cosine;\n}\n\n/**\n * In-memory, ephemeral vector store.\n *\n * Setup:\n * Install `langchain`:\n *\n * ```bash\n * npm install langchain\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/langchain.vectorstores_memory.MemoryVectorStore.html#constructor)\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { MemoryVectorStore } from 'langchain/vectorstores/memory';\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const vectorStore = new MemoryVectorStore(embeddings);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n *\n * await vectorStore.addDocuments(documents);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, { baz: \"bar\" });\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * [SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport class MemoryVectorStore extends VectorStore {\n declare FilterType: (doc: Document) => boolean;\n\n memoryVectors: MemoryVector[] = [];\n\n similarity: typeof cosine;\n\n _vectorstoreType(): string {\n return \"memory\";\n }\n\n constructor(\n embeddings: EmbeddingsInterface,\n { similarity, ...rest }: MemoryVectorStoreArgs = {}\n ) {\n super(embeddings, rest);\n\n this.similarity = similarity ?? cosine;\n }\n\n /**\n * Method to add documents to the memory vector store. It extracts the\n * text from each document, generates embeddings for them, and adds the\n * resulting vectors to the store.\n * @param documents Array of `Document` instances to be added to the store.\n * @returns Promise that resolves when all documents have been added.\n */\n async addDocuments(documents: Document[]): Promise<void> {\n const texts = documents.map(({ pageContent }) => pageContent);\n return this.addVectors(\n await this.embeddings.embedDocuments(texts),\n documents\n );\n }\n\n /**\n * Method to add vectors to the memory vector store. It creates\n * `MemoryVector` instances for each vector and document pair and adds\n * them to the store.\n * @param vectors Array of vectors to be added to the store.\n * @param documents Array of `Document` instances corresponding to the vectors.\n * @returns Promise that resolves when all vectors have been added.\n */\n async addVectors(vectors: number[][], documents: Document[]): Promise<void> {\n const memoryVectors = vectors.map((embedding, idx) => ({\n content: documents[idx].pageContent,\n embedding,\n metadata: documents[idx].metadata,\n id: documents[idx].id,\n }));\n\n this.memoryVectors = this.memoryVectors.concat(memoryVectors);\n }\n\n protected async _queryVectors(\n query: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ) {\n const filterFunction = (memoryVector: MemoryVector) => {\n if (!filter) {\n return true;\n }\n\n const doc = new Document({\n metadata: memoryVector.metadata,\n pageContent: memoryVector.content,\n id: memoryVector.id,\n });\n return filter(doc);\n };\n const filteredMemoryVectors = this.memoryVectors.filter(filterFunction);\n return filteredMemoryVectors\n .map((vector, index) => ({\n similarity: this.similarity(query, vector.embedding),\n index,\n metadata: vector.metadata,\n content: vector.content,\n embedding: vector.embedding,\n id: vector.id,\n }))\n .sort((a, b) => (a.similarity > b.similarity ? -1 : 0))\n .slice(0, k);\n }\n\n /**\n * Method to perform a similarity search in the memory vector store. It\n * calculates the similarity between the query vector and each vector in\n * the store, sorts the results by similarity, and returns the top `k`\n * results along with their scores.\n * @param query Query vector to compare against the vectors in the store.\n * @param k Number of top results to return.\n * @param filter Optional filter function to apply to the vectors before performing the search.\n * @returns Promise that resolves with an array of tuples, each containing a `Document` and its similarity score.\n */\n async similaritySearchVectorWithScore(\n query: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ): Promise<[Document, number][]> {\n const searches = await this._queryVectors(query, k, filter);\n const result: [Document, number][] = searches.map((search) => [\n new Document({\n metadata: search.metadata,\n pageContent: search.content,\n id: search.id,\n }),\n search.similarity,\n ]);\n\n return result;\n }\n\n async maxMarginalRelevanceSearch(\n query: string,\n options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>\n ): Promise<DocumentInterface[]> {\n const queryEmbedding = await this.embeddings.embedQuery(query);\n\n const searches = await this._queryVectors(\n queryEmbedding,\n options.fetchK ?? 20,\n options.filter\n );\n\n const embeddingList = searches.map((searchResp) => searchResp.embedding);\n\n const mmrIndexes = maximalMarginalRelevance(\n queryEmbedding,\n embeddingList,\n options.lambda,\n options.k\n );\n\n return mmrIndexes.map(\n (idx) =>\n new Document({\n metadata: searches[idx].metadata,\n pageContent: searches[idx].content,\n id: searches[idx].id,\n })\n );\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an array of\n * texts. It creates a `Document` for each text and metadata pair, and\n * adds them to the store.\n * @param texts Array of texts to be added to the store.\n * @param metadatas Array or single object of metadata corresponding to the texts.\n * @param embeddings `Embeddings` instance used to generate embeddings for the texts.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromTexts(\n texts: string[],\n metadatas: object[] | object,\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const docs: Document[] = [];\n for (let i = 0; i < texts.length; i += 1) {\n const metadata = Array.isArray(metadatas) ? metadatas[i] : metadatas;\n const newDoc = new Document({\n pageContent: texts[i],\n metadata,\n });\n docs.push(newDoc);\n }\n return MemoryVectorStore.fromDocuments(docs, embeddings, dbConfig);\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an array of\n * `Document` instances. It adds the documents to the store.\n * @param docs Array of `Document` instances to be added to the store.\n * @param embeddings `Embeddings` instance used to generate embeddings for the documents.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromDocuments(\n docs: Document[],\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const instance = new this(embeddings, dbConfig);\n await instance.addDocuments(docs);\n return instance;\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an existing\n * index. It creates a new `MemoryVectorStore` instance without adding any\n * documents or vectors.\n * @param embeddings `Embeddings` instance used to generate embeddings for the documents.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromExistingIndex(\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const instance = new this(embeddings, dbConfig);\n return instance;\n }\n}\n"],"mappings":"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"}
@@ -191,7 +191,8 @@ var MemoryVectorStore = class MemoryVectorStore extends VectorStore {
191
191
  async maxMarginalRelevanceSearch(query, options) {
192
192
  const queryEmbedding = await this.embeddings.embedQuery(query);
193
193
  const searches = await this._queryVectors(queryEmbedding, options.fetchK ?? 20, options.filter);
194
- return maximalMarginalRelevance(queryEmbedding, searches.map((searchResp) => searchResp.embedding), options.lambda, options.k).map((idx) => new Document({
194
+ const embeddingList = searches.map((searchResp) => searchResp.embedding);
195
+ return maximalMarginalRelevance(queryEmbedding, embeddingList, options.lambda, options.k).map((idx) => new Document({
195
196
  metadata: searches[idx].metadata,
196
197
  pageContent: searches[idx].content,
197
198
  id: searches[idx].id
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","names":[],"sources":["../../src/vectorstores/memory.ts"],"sourcesContent":["import {\n MaxMarginalRelevanceSearchOptions,\n VectorStore,\n} from \"@langchain/core/vectorstores\";\nimport type { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { Document, DocumentInterface } from \"@langchain/core/documents\";\nimport { maximalMarginalRelevance } from \"@langchain/core/utils/math\";\nimport { cosine } from \"../util/ml-distance/similarities.js\";\n\n/**\n * Interface representing a vector in memory. It includes the content\n * (text), the corresponding embedding (vector), and any associated\n * metadata.\n */\ninterface MemoryVector {\n content: string;\n embedding: number[];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n metadata: Record<string, any>;\n id?: string;\n}\n\n/**\n * Interface for the arguments that can be passed to the\n * `MemoryVectorStore` constructor. It includes an optional `similarity`\n * function.\n */\nexport interface MemoryVectorStoreArgs {\n similarity?: typeof cosine;\n}\n\n/**\n * In-memory, ephemeral vector store.\n *\n * Setup:\n * Install `langchain`:\n *\n * ```bash\n * npm install langchain\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/langchain.vectorstores_memory.MemoryVectorStore.html#constructor)\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { MemoryVectorStore } from 'langchain/vectorstores/memory';\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const vectorStore = new MemoryVectorStore(embeddings);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n *\n * await vectorStore.addDocuments(documents);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, { baz: \"bar\" });\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * [SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport class MemoryVectorStore extends VectorStore {\n declare FilterType: (doc: Document) => boolean;\n\n memoryVectors: MemoryVector[] = [];\n\n similarity: typeof cosine;\n\n _vectorstoreType(): string {\n return \"memory\";\n }\n\n constructor(\n embeddings: EmbeddingsInterface,\n { similarity, ...rest }: MemoryVectorStoreArgs = {}\n ) {\n super(embeddings, rest);\n\n this.similarity = similarity ?? cosine;\n }\n\n /**\n * Method to add documents to the memory vector store. It extracts the\n * text from each document, generates embeddings for them, and adds the\n * resulting vectors to the store.\n * @param documents Array of `Document` instances to be added to the store.\n * @returns Promise that resolves when all documents have been added.\n */\n async addDocuments(documents: Document[]): Promise<void> {\n const texts = documents.map(({ pageContent }) => pageContent);\n return this.addVectors(\n await this.embeddings.embedDocuments(texts),\n documents\n );\n }\n\n /**\n * Method to add vectors to the memory vector store. It creates\n * `MemoryVector` instances for each vector and document pair and adds\n * them to the store.\n * @param vectors Array of vectors to be added to the store.\n * @param documents Array of `Document` instances corresponding to the vectors.\n * @returns Promise that resolves when all vectors have been added.\n */\n async addVectors(vectors: number[][], documents: Document[]): Promise<void> {\n const memoryVectors = vectors.map((embedding, idx) => ({\n content: documents[idx].pageContent,\n embedding,\n metadata: documents[idx].metadata,\n id: documents[idx].id,\n }));\n\n this.memoryVectors = this.memoryVectors.concat(memoryVectors);\n }\n\n protected async _queryVectors(\n query: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ) {\n const filterFunction = (memoryVector: MemoryVector) => {\n if (!filter) {\n return true;\n }\n\n const doc = new Document({\n metadata: memoryVector.metadata,\n pageContent: memoryVector.content,\n id: memoryVector.id,\n });\n return filter(doc);\n };\n const filteredMemoryVectors = this.memoryVectors.filter(filterFunction);\n return filteredMemoryVectors\n .map((vector, index) => ({\n similarity: this.similarity(query, vector.embedding),\n index,\n metadata: vector.metadata,\n content: vector.content,\n embedding: vector.embedding,\n id: vector.id,\n }))\n .sort((a, b) => (a.similarity > b.similarity ? -1 : 0))\n .slice(0, k);\n }\n\n /**\n * Method to perform a similarity search in the memory vector store. It\n * calculates the similarity between the query vector and each vector in\n * the store, sorts the results by similarity, and returns the top `k`\n * results along with their scores.\n * @param query Query vector to compare against the vectors in the store.\n * @param k Number of top results to return.\n * @param filter Optional filter function to apply to the vectors before performing the search.\n * @returns Promise that resolves with an array of tuples, each containing a `Document` and its similarity score.\n */\n async similaritySearchVectorWithScore(\n query: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ): Promise<[Document, number][]> {\n const searches = await this._queryVectors(query, k, filter);\n const result: [Document, number][] = searches.map((search) => [\n new Document({\n metadata: search.metadata,\n pageContent: search.content,\n id: search.id,\n }),\n search.similarity,\n ]);\n\n return result;\n }\n\n async maxMarginalRelevanceSearch(\n query: string,\n options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>\n ): Promise<DocumentInterface[]> {\n const queryEmbedding = await this.embeddings.embedQuery(query);\n\n const searches = await this._queryVectors(\n queryEmbedding,\n options.fetchK ?? 20,\n options.filter\n );\n\n const embeddingList = searches.map((searchResp) => searchResp.embedding);\n\n const mmrIndexes = maximalMarginalRelevance(\n queryEmbedding,\n embeddingList,\n options.lambda,\n options.k\n );\n\n return mmrIndexes.map(\n (idx) =>\n new Document({\n metadata: searches[idx].metadata,\n pageContent: searches[idx].content,\n id: searches[idx].id,\n })\n );\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an array of\n * texts. It creates a `Document` for each text and metadata pair, and\n * adds them to the store.\n * @param texts Array of texts to be added to the store.\n * @param metadatas Array or single object of metadata corresponding to the texts.\n * @param embeddings `Embeddings` instance used to generate embeddings for the texts.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromTexts(\n texts: string[],\n metadatas: object[] | object,\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const docs: Document[] = [];\n for (let i = 0; i < texts.length; i += 1) {\n const metadata = Array.isArray(metadatas) ? metadatas[i] : metadatas;\n const newDoc = new Document({\n pageContent: texts[i],\n metadata,\n });\n docs.push(newDoc);\n }\n return MemoryVectorStore.fromDocuments(docs, embeddings, dbConfig);\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an array of\n * `Document` instances. It adds the documents to the store.\n * @param docs Array of `Document` instances to be added to the store.\n * @param embeddings `Embeddings` instance used to generate embeddings for the documents.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromDocuments(\n docs: Document[],\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const instance = new this(embeddings, dbConfig);\n await instance.addDocuments(docs);\n return instance;\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an existing\n * index. It creates a new `MemoryVectorStore` instance without adding any\n * documents or vectors.\n * @param embeddings `Embeddings` instance used to generate embeddings for the documents.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromExistingIndex(\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const instance = new this(embeddings, dbConfig);\n return instance;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","names":[],"sources":["../../src/vectorstores/memory.ts"],"sourcesContent":["import {\n MaxMarginalRelevanceSearchOptions,\n VectorStore,\n} from \"@langchain/core/vectorstores\";\nimport type { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { Document, DocumentInterface } from \"@langchain/core/documents\";\nimport { maximalMarginalRelevance } from \"@langchain/core/utils/math\";\nimport { cosine } from \"../util/ml-distance/similarities.js\";\n\n/**\n * Interface representing a vector in memory. It includes the content\n * (text), the corresponding embedding (vector), and any associated\n * metadata.\n */\ninterface MemoryVector {\n content: string;\n embedding: number[];\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n metadata: Record<string, any>;\n id?: string;\n}\n\n/**\n * Interface for the arguments that can be passed to the\n * `MemoryVectorStore` constructor. It includes an optional `similarity`\n * function.\n */\nexport interface MemoryVectorStoreArgs {\n similarity?: typeof cosine;\n}\n\n/**\n * In-memory, ephemeral vector store.\n *\n * Setup:\n * Install `langchain`:\n *\n * ```bash\n * npm install langchain\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/langchain.vectorstores_memory.MemoryVectorStore.html#constructor)\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { MemoryVectorStore } from 'langchain/vectorstores/memory';\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const vectorStore = new MemoryVectorStore(embeddings);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n *\n * await vectorStore.addDocuments(documents);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, { baz: \"bar\" });\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output: * [SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport class MemoryVectorStore extends VectorStore {\n declare FilterType: (doc: Document) => boolean;\n\n memoryVectors: MemoryVector[] = [];\n\n similarity: typeof cosine;\n\n _vectorstoreType(): string {\n return \"memory\";\n }\n\n constructor(\n embeddings: EmbeddingsInterface,\n { similarity, ...rest }: MemoryVectorStoreArgs = {}\n ) {\n super(embeddings, rest);\n\n this.similarity = similarity ?? cosine;\n }\n\n /**\n * Method to add documents to the memory vector store. It extracts the\n * text from each document, generates embeddings for them, and adds the\n * resulting vectors to the store.\n * @param documents Array of `Document` instances to be added to the store.\n * @returns Promise that resolves when all documents have been added.\n */\n async addDocuments(documents: Document[]): Promise<void> {\n const texts = documents.map(({ pageContent }) => pageContent);\n return this.addVectors(\n await this.embeddings.embedDocuments(texts),\n documents\n );\n }\n\n /**\n * Method to add vectors to the memory vector store. It creates\n * `MemoryVector` instances for each vector and document pair and adds\n * them to the store.\n * @param vectors Array of vectors to be added to the store.\n * @param documents Array of `Document` instances corresponding to the vectors.\n * @returns Promise that resolves when all vectors have been added.\n */\n async addVectors(vectors: number[][], documents: Document[]): Promise<void> {\n const memoryVectors = vectors.map((embedding, idx) => ({\n content: documents[idx].pageContent,\n embedding,\n metadata: documents[idx].metadata,\n id: documents[idx].id,\n }));\n\n this.memoryVectors = this.memoryVectors.concat(memoryVectors);\n }\n\n protected async _queryVectors(\n query: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ) {\n const filterFunction = (memoryVector: MemoryVector) => {\n if (!filter) {\n return true;\n }\n\n const doc = new Document({\n metadata: memoryVector.metadata,\n pageContent: memoryVector.content,\n id: memoryVector.id,\n });\n return filter(doc);\n };\n const filteredMemoryVectors = this.memoryVectors.filter(filterFunction);\n return filteredMemoryVectors\n .map((vector, index) => ({\n similarity: this.similarity(query, vector.embedding),\n index,\n metadata: vector.metadata,\n content: vector.content,\n embedding: vector.embedding,\n id: vector.id,\n }))\n .sort((a, b) => (a.similarity > b.similarity ? -1 : 0))\n .slice(0, k);\n }\n\n /**\n * Method to perform a similarity search in the memory vector store. It\n * calculates the similarity between the query vector and each vector in\n * the store, sorts the results by similarity, and returns the top `k`\n * results along with their scores.\n * @param query Query vector to compare against the vectors in the store.\n * @param k Number of top results to return.\n * @param filter Optional filter function to apply to the vectors before performing the search.\n * @returns Promise that resolves with an array of tuples, each containing a `Document` and its similarity score.\n */\n async similaritySearchVectorWithScore(\n query: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ): Promise<[Document, number][]> {\n const searches = await this._queryVectors(query, k, filter);\n const result: [Document, number][] = searches.map((search) => [\n new Document({\n metadata: search.metadata,\n pageContent: search.content,\n id: search.id,\n }),\n search.similarity,\n ]);\n\n return result;\n }\n\n async maxMarginalRelevanceSearch(\n query: string,\n options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>\n ): Promise<DocumentInterface[]> {\n const queryEmbedding = await this.embeddings.embedQuery(query);\n\n const searches = await this._queryVectors(\n queryEmbedding,\n options.fetchK ?? 20,\n options.filter\n );\n\n const embeddingList = searches.map((searchResp) => searchResp.embedding);\n\n const mmrIndexes = maximalMarginalRelevance(\n queryEmbedding,\n embeddingList,\n options.lambda,\n options.k\n );\n\n return mmrIndexes.map(\n (idx) =>\n new Document({\n metadata: searches[idx].metadata,\n pageContent: searches[idx].content,\n id: searches[idx].id,\n })\n );\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an array of\n * texts. It creates a `Document` for each text and metadata pair, and\n * adds them to the store.\n * @param texts Array of texts to be added to the store.\n * @param metadatas Array or single object of metadata corresponding to the texts.\n * @param embeddings `Embeddings` instance used to generate embeddings for the texts.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromTexts(\n texts: string[],\n metadatas: object[] | object,\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const docs: Document[] = [];\n for (let i = 0; i < texts.length; i += 1) {\n const metadata = Array.isArray(metadatas) ? metadatas[i] : metadatas;\n const newDoc = new Document({\n pageContent: texts[i],\n metadata,\n });\n docs.push(newDoc);\n }\n return MemoryVectorStore.fromDocuments(docs, embeddings, dbConfig);\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an array of\n * `Document` instances. It adds the documents to the store.\n * @param docs Array of `Document` instances to be added to the store.\n * @param embeddings `Embeddings` instance used to generate embeddings for the documents.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromDocuments(\n docs: Document[],\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const instance = new this(embeddings, dbConfig);\n await instance.addDocuments(docs);\n return instance;\n }\n\n /**\n * Static method to create a `MemoryVectorStore` instance from an existing\n * index. It creates a new `MemoryVectorStore` instance without adding any\n * documents or vectors.\n * @param embeddings `Embeddings` instance used to generate embeddings for the documents.\n * @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.\n * @returns Promise that resolves with a new `MemoryVectorStore` instance.\n */\n static async fromExistingIndex(\n embeddings: EmbeddingsInterface,\n dbConfig?: MemoryVectorStoreArgs\n ): Promise<MemoryVectorStore> {\n const instance = new this(embeddings, dbConfig);\n return instance;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/classic",
3
- "version": "1.0.45",
3
+ "version": "1.0.46",
4
4
  "description": "Old abstractions from LangChain.js",
5
5
  "author": "LangChain",
6
6
  "license": "MIT",
@@ -95,8 +95,8 @@
95
95
  },
96
96
  "homepage": "https://github.com/langchain-ai/langchainjs/tree/main/langchain/",
97
97
  "devDependencies": {
98
- "@aws-sdk/dsql-signer": "^3.1097.0",
99
- "@azure/identity": "^4.12.0",
98
+ "@aws-sdk/dsql-signer": "^3.1116.0",
99
+ "@azure/identity": "^4.13.2",
100
100
  "@browserbasehq/stagehand": "^1.3.0",
101
101
  "@clickhouse/client": "^0.2.5",
102
102
  "@cloudflare/workers-types": "^4.20260602.1",
@@ -107,33 +107,33 @@
107
107
  "@getzep/zep-js": "^2.0.2",
108
108
  "@gomomento/sdk": "1.118.0",
109
109
  "@google/generative-ai": "^0.24.1",
110
- "@lancedb/lancedb": "^0.33.0",
111
- "@langchain/langgraph": "1.4.10",
110
+ "@lancedb/lancedb": "^0.37.1",
111
+ "@langchain/langgraph": "1.4.12",
112
112
  "@layerup/layerup-security": "^1.5.12",
113
113
  "@opensearch-project/opensearch": "^2.2.0",
114
114
  "@pinecone-database/pinecone": "^5.0.2",
115
115
  "@planetscale/database": "^1.20.1",
116
116
  "@prisma/client": "^6.19.3",
117
- "@qdrant/js-client-rest": "^1.18.0",
117
+ "@qdrant/js-client-rest": "^1.19.0",
118
118
  "@rockset/client": "^0.9.1",
119
- "@supabase/supabase-js": "^2.111.0",
119
+ "@supabase/supabase-js": "^2.112.3",
120
120
  "@tensorflow/tfjs-backend-cpu": "^4.22.0",
121
121
  "@tsconfig/recommended": "^1.0.2",
122
122
  "@types/js-yaml": "^4",
123
- "@types/jsdom": "^28.0.3",
124
- "@types/pg": "^8.20.3",
123
+ "@types/jsdom": "^30.0.0",
124
+ "@types/pg": "^8.23.1",
125
125
  "@types/ws": "^8",
126
- "@upstash/redis": "^1.38.0",
126
+ "@upstash/redis": "^1.38.2",
127
127
  "@upstash/vector": "^1.2.2",
128
128
  "@vercel/kv": "^3.0.0",
129
- "@vitest/coverage-v8": "^4.1.10",
129
+ "@vitest/coverage-v8": "^4.1.11",
130
130
  "@xata.io/client": "^0.30.1",
131
131
  "@zilliz/milvus2-sdk-node": "^2.6.14",
132
- "axios": "^1.18.1",
132
+ "axios": "^1.19.0",
133
133
  "cheerio": "1.2.0",
134
134
  "chromadb": "^1.5.3",
135
135
  "cohere-ai": "^7.14.0",
136
- "convex": "^1.42.3",
136
+ "convex": "^1.45.0",
137
137
  "date-fns": "^4.4.0",
138
138
  "dotenv": "^17.4.0",
139
139
  "dpdm": "^3.14.0",
@@ -147,11 +147,11 @@
147
147
  "lorem-ipsum": "^3.0.0",
148
148
  "lunary": "^0.8.8",
149
149
  "mariadb": "^3.5.3",
150
- "mem0ai": "^3.1.2",
150
+ "mem0ai": "^3.1.6",
151
151
  "mongodb": "^6.17.0",
152
152
  "openai": "^6.41.0",
153
153
  "peggy": "^5.1.0",
154
- "pg": "^8.22.0",
154
+ "pg": "^8.23.0",
155
155
  "pickleparser": "^0.2.1",
156
156
  "prisma": "^7.9.1",
157
157
  "readline": "^1.3.0",
@@ -166,12 +166,12 @@
166
166
  "voy-search": "0.6.3",
167
167
  "weaviate-client": "^3.14.0",
168
168
  "zod-to-json-schema": "^3.25.2",
169
- "@langchain/anthropic": "1.5.8",
170
- "@langchain/aws": "1.4.4",
169
+ "@langchain/anthropic": "1.5.9",
170
+ "@langchain/aws": "1.4.5",
171
171
  "@langchain/cloudflare": "1.1.0",
172
172
  "@langchain/core": "^1.2.9",
173
- "@langchain/deepseek": "1.1.10",
174
- "@langchain/fireworks": "0.2.10",
173
+ "@langchain/deepseek": "1.1.11",
174
+ "@langchain/fireworks": "0.2.11",
175
175
  "@langchain/google-common": "2.3.0",
176
176
  "@langchain/google-genai": "2.3.0",
177
177
  "@langchain/google-vertexai": "2.3.0",
@@ -182,10 +182,10 @@
182
182
  "@langchain/ollama": "1.3.0",
183
183
  "@langchain/redis": "1.1.3",
184
184
  "@langchain/textsplitters": "1.0.1",
185
- "@langchain/xai": "1.4.10",
185
+ "@langchain/xai": "1.4.11",
186
186
  "@langchain/tsconfig": "0.0.1",
187
187
  "langchain": "1.5.10",
188
- "@langchain/together-ai": "0.2.10"
188
+ "@langchain/together-ai": "0.2.11"
189
189
  },
190
190
  "peerDependencies": {
191
191
  "cheerio": "*",
@@ -206,12 +206,12 @@
206
206
  },
207
207
  "dependencies": {
208
208
  "handlebars": "^4.7.9",
209
- "js-yaml": "^5.2.2",
209
+ "js-yaml": "^5.3.0",
210
210
  "jsonpointer": "^5.0.1",
211
211
  "openapi-types": "^12.1.3",
212
212
  "yaml": "^2.9.0",
213
213
  "zod": "^3.25.76 || ^4",
214
- "@langchain/openai": "1.5.10",
214
+ "@langchain/openai": "1.5.11",
215
215
  "@langchain/textsplitters": "1.0.1"
216
216
  },
217
217
  "optionalDependencies": {