@langchain/classic 1.0.45 → 1.0.47-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -1
- package/dist/agents/agent.cjs.map +1 -1
- package/dist/agents/chat/index.cjs +2 -1
- package/dist/agents/chat/index.cjs.map +1 -1
- package/dist/agents/chat/index.js +2 -1
- package/dist/agents/chat/index.js.map +1 -1
- package/dist/agents/chat_convo/index.cjs +7 -5
- package/dist/agents/chat_convo/index.cjs.map +1 -1
- package/dist/agents/chat_convo/index.js +7 -5
- package/dist/agents/chat_convo/index.js.map +1 -1
- package/dist/agents/chat_convo/outputParser.cjs.map +1 -1
- package/dist/agents/executor.cjs +22 -19
- package/dist/agents/executor.cjs.map +1 -1
- package/dist/agents/executor.js +22 -19
- package/dist/agents/executor.js.map +1 -1
- package/dist/agents/format_scratchpad/log_to_message.cjs.map +1 -1
- package/dist/agents/format_scratchpad/openai_functions.cjs.map +1 -1
- package/dist/agents/mrkl/index.cjs +9 -6
- package/dist/agents/mrkl/index.cjs.map +1 -1
- package/dist/agents/mrkl/index.js +9 -6
- package/dist/agents/mrkl/index.js.map +1 -1
- package/dist/agents/mrkl/outputParser.d.ts +1 -1
- package/dist/agents/openai_functions/index.cjs +2 -1
- package/dist/agents/openai_functions/index.cjs.map +1 -1
- package/dist/agents/openai_functions/index.js +2 -1
- package/dist/agents/openai_functions/index.js.map +1 -1
- package/dist/agents/openai_functions/output_parser.cjs.map +1 -1
- package/dist/agents/openai_tools/index.cjs.map +1 -1
- package/dist/agents/openai_tools/output_parser.cjs.map +1 -1
- package/dist/agents/react/output_parser.cjs.map +1 -1
- package/dist/agents/structured_chat/index.cjs +6 -5
- package/dist/agents/structured_chat/index.cjs.map +1 -1
- package/dist/agents/structured_chat/index.js +6 -5
- package/dist/agents/structured_chat/index.js.map +1 -1
- package/dist/agents/structured_chat/outputParser.cjs.map +1 -1
- package/dist/agents/tool_calling/output_parser.cjs.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.cjs.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/tool.cjs +2 -1
- package/dist/agents/toolkits/conversational_retrieval/tool.cjs.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/tool.js +2 -1
- package/dist/agents/toolkits/conversational_retrieval/tool.js.map +1 -1
- package/dist/agents/toolkits/json/json.cjs +10 -8
- package/dist/agents/toolkits/json/json.cjs.map +1 -1
- package/dist/agents/toolkits/json/json.js +10 -8
- package/dist/agents/toolkits/json/json.js.map +1 -1
- package/dist/agents/toolkits/openapi/openapi.cjs +12 -9
- package/dist/agents/toolkits/openapi/openapi.cjs.map +1 -1
- package/dist/agents/toolkits/openapi/openapi.js +12 -9
- package/dist/agents/toolkits/openapi/openapi.js.map +1 -1
- package/dist/agents/toolkits/sql/sql.cjs +10 -8
- package/dist/agents/toolkits/sql/sql.cjs.map +1 -1
- package/dist/agents/toolkits/sql/sql.js +10 -8
- package/dist/agents/toolkits/sql/sql.js.map +1 -1
- package/dist/agents/toolkits/vectorstore/vectorstore.cjs +20 -16
- package/dist/agents/toolkits/vectorstore/vectorstore.cjs.map +1 -1
- package/dist/agents/toolkits/vectorstore/vectorstore.js +20 -16
- package/dist/agents/toolkits/vectorstore/vectorstore.js.map +1 -1
- package/dist/agents/xml/index.cjs +2 -1
- package/dist/agents/xml/index.cjs.map +1 -1
- package/dist/agents/xml/index.js +2 -1
- package/dist/agents/xml/index.js.map +1 -1
- package/dist/chains/base.cjs.map +1 -1
- package/dist/chains/chat_vector_db_chain.cjs +2 -1
- package/dist/chains/chat_vector_db_chain.cjs.map +1 -1
- package/dist/chains/chat_vector_db_chain.js +2 -1
- package/dist/chains/chat_vector_db_chain.js.map +1 -1
- package/dist/chains/conversational_retrieval_chain.cjs +2 -1
- package/dist/chains/conversational_retrieval_chain.cjs.map +1 -1
- package/dist/chains/conversational_retrieval_chain.js +2 -1
- package/dist/chains/conversational_retrieval_chain.js.map +1 -1
- package/dist/chains/openai_functions/base.cjs.map +1 -1
- package/dist/chains/openai_functions/extraction.cjs.map +1 -1
- package/dist/chains/openai_functions/openapi.cjs +9 -8
- package/dist/chains/openai_functions/openapi.cjs.map +1 -1
- package/dist/chains/openai_functions/openapi.js +9 -8
- package/dist/chains/openai_functions/openapi.js.map +1 -1
- package/dist/chains/openai_functions/tagging.cjs.map +1 -1
- package/dist/chains/openai_moderation.cjs.map +1 -1
- package/dist/chains/query_constructor/index.cjs +15 -9
- package/dist/chains/query_constructor/index.cjs.map +1 -1
- package/dist/chains/query_constructor/index.js +15 -9
- package/dist/chains/query_constructor/index.js.map +1 -1
- package/dist/chains/query_constructor/parser.cjs +12 -6
- package/dist/chains/query_constructor/parser.cjs.map +1 -1
- package/dist/chains/query_constructor/parser.js +12 -6
- package/dist/chains/query_constructor/parser.js.map +1 -1
- package/dist/chains/question_answering/load.cjs +35 -29
- package/dist/chains/question_answering/load.cjs.map +1 -1
- package/dist/chains/question_answering/load.js +35 -29
- package/dist/chains/question_answering/load.js.map +1 -1
- package/dist/chains/router/multi_prompt.cjs +5 -3
- package/dist/chains/router/multi_prompt.cjs.map +1 -1
- package/dist/chains/router/multi_prompt.js +5 -3
- package/dist/chains/router/multi_prompt.js.map +1 -1
- package/dist/chains/router/multi_retrieval_qa.cjs +18 -11
- package/dist/chains/router/multi_retrieval_qa.cjs.map +1 -1
- package/dist/chains/router/multi_retrieval_qa.js +18 -11
- package/dist/chains/router/multi_retrieval_qa.js.map +1 -1
- package/dist/chains/sequential_chain.cjs +6 -5
- package/dist/chains/sequential_chain.cjs.map +1 -1
- package/dist/chains/sequential_chain.js +6 -5
- package/dist/chains/sequential_chain.js.map +1 -1
- package/dist/chains/sql_db/sql_db_chain.cjs +2 -1
- package/dist/chains/sql_db/sql_db_chain.cjs.map +1 -1
- package/dist/chains/sql_db/sql_db_chain.js +2 -1
- package/dist/chains/sql_db/sql_db_chain.js.map +1 -1
- package/dist/chains/summarization/load.cjs +35 -29
- package/dist/chains/summarization/load.cjs.map +1 -1
- package/dist/chains/summarization/load.js +35 -29
- package/dist/chains/summarization/load.js.map +1 -1
- package/dist/chat_models/universal.cjs +12 -10
- package/dist/chat_models/universal.cjs.map +1 -1
- package/dist/chat_models/universal.js +12 -10
- package/dist/chat_models/universal.js.map +1 -1
- package/dist/document_loaders/fs/buffer.cjs.map +1 -1
- package/dist/document_loaders/fs/directory.cjs.map +1 -1
- package/dist/document_loaders/fs/multi_file.cjs.map +1 -1
- package/dist/document_loaders/fs/text.cjs.map +1 -1
- package/dist/document_transformers/openai_functions.cjs.map +1 -1
- package/dist/embeddings/cache_backed.cjs.map +1 -1
- package/dist/evaluation/comparison/pairwise.cjs +4 -2
- package/dist/evaluation/comparison/pairwise.cjs.map +1 -1
- package/dist/evaluation/comparison/pairwise.js +4 -2
- package/dist/evaluation/comparison/pairwise.js.map +1 -1
- package/dist/evaluation/criteria/criteria.cjs +4 -2
- package/dist/evaluation/criteria/criteria.cjs.map +1 -1
- package/dist/evaluation/criteria/criteria.js +4 -2
- package/dist/evaluation/criteria/criteria.js.map +1 -1
- package/dist/experimental/autogpt/agent.cjs +8 -7
- package/dist/experimental/autogpt/agent.cjs.map +1 -1
- package/dist/experimental/autogpt/agent.js +8 -7
- package/dist/experimental/autogpt/agent.js.map +1 -1
- package/dist/experimental/autogpt/prompt.cjs +2 -1
- package/dist/experimental/autogpt/prompt.cjs.map +1 -1
- package/dist/experimental/autogpt/prompt.js +2 -1
- package/dist/experimental/autogpt/prompt.js.map +1 -1
- package/dist/experimental/autogpt/prompt_generator.cjs.map +1 -1
- package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.cjs.map +1 -1
- package/dist/experimental/openai_assistant/index.cjs.map +1 -1
- package/dist/experimental/plan_and_execute/agent_executor.cjs +3 -2
- package/dist/experimental/plan_and_execute/agent_executor.cjs.map +1 -1
- package/dist/experimental/plan_and_execute/agent_executor.js +3 -2
- package/dist/experimental/plan_and_execute/agent_executor.js.map +1 -1
- package/dist/hub/base.cjs.map +1 -1
- package/dist/hub/base.js.map +1 -1
- package/dist/hub/index.cjs +2 -1
- package/dist/hub/index.cjs.map +1 -1
- package/dist/hub/index.js +2 -1
- package/dist/hub/index.js.map +1 -1
- package/dist/hub/node.cjs +4 -2
- package/dist/hub/node.cjs.map +1 -1
- package/dist/hub/node.js +4 -2
- package/dist/hub/node.js.map +1 -1
- package/dist/load/index.cjs.map +1 -1
- package/dist/memory/buffer_memory.cjs.map +1 -1
- package/dist/memory/buffer_token_memory.cjs.map +1 -1
- package/dist/memory/buffer_window_memory.cjs.map +1 -1
- package/dist/memory/chat_memory.cjs.map +1 -1
- package/dist/memory/entity_memory.cjs +2 -1
- package/dist/memory/entity_memory.cjs.map +1 -1
- package/dist/memory/entity_memory.js +2 -1
- package/dist/memory/entity_memory.js.map +1 -1
- package/dist/memory/summary.cjs.map +1 -1
- package/dist/memory/summary_buffer.cjs.map +1 -1
- package/dist/memory/vector_store.cjs.map +1 -1
- package/dist/output_parsers/fix.cjs +2 -1
- package/dist/output_parsers/fix.cjs.map +1 -1
- package/dist/output_parsers/fix.js +2 -1
- package/dist/output_parsers/fix.js.map +1 -1
- package/dist/output_parsers/openai_functions.cjs.map +1 -1
- package/dist/output_parsers/structured.cjs.map +1 -1
- package/dist/retrievers/document_compressors/chain_extract.cjs +2 -1
- package/dist/retrievers/document_compressors/chain_extract.cjs.map +1 -1
- package/dist/retrievers/document_compressors/chain_extract.js +2 -1
- package/dist/retrievers/document_compressors/chain_extract.js.map +1 -1
- package/dist/retrievers/matryoshka_retriever.cjs.map +1 -1
- package/dist/retrievers/multi_query.cjs +2 -1
- package/dist/retrievers/multi_query.cjs.map +1 -1
- package/dist/retrievers/multi_query.js +2 -1
- package/dist/retrievers/multi_query.js.map +1 -1
- package/dist/smith/runner_utils.cjs.map +1 -1
- package/dist/stores/file/node.cjs.map +1 -1
- package/dist/tools/render.cjs.map +1 -1
- package/dist/tools/retriever.cjs +2 -1
- package/dist/tools/retriever.cjs.map +1 -1
- package/dist/tools/retriever.js +2 -1
- package/dist/tools/retriever.js.map +1 -1
- package/dist/tools/webbrowser.cjs +2 -1
- package/dist/tools/webbrowser.cjs.map +1 -1
- package/dist/tools/webbrowser.js +2 -1
- package/dist/tools/webbrowser.js.map +1 -1
- package/dist/util/hub.cjs.map +1 -1
- package/dist/vectorstores/memory.cjs +2 -1
- package/dist/vectorstores/memory.cjs.map +1 -1
- package/dist/vectorstores/memory.js +2 -1
- package/dist/vectorstores/memory.js.map +1 -1
- package/package.json +45 -45
|
@@ -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":";;;;;;;;;;;;;;;;;AAqBA,MAAa,eAAe,WAAqC;CAC/D,MAAM,CAAC,SAAS,QAAQ,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU;EACvD,IAAI,IAAI,MAAM,KAAK;EACnB,IAAI,EAAE,WAAW,IAAG,IAAI,EAAE,MAAM,CAAC,IAAI;EACrC,IAAI,EAAE,SAAS,IAAG,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;EAEvC,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;EACvC,OAAO,EAAE,KAAK;CAChB,CAAC;CAED,OAAO,CAAC,SAAS,IAAI;AACvB;AAEA,MAAa,WACX,MACA,SACA,YACW;CAEX,MAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,kBAAkB,KAAK,CAAC;CAEvD,IAAI,OAAO;CAMX,EAAE,GAHkB,UAAU,UAAU,IAGvB,iCAAiC,CAAC,CAAC,MAAM,IAAI,SAAc;EAE1E,IAAI,UAAU,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK;EACpE,MAAM,MAAM,EAAE,IAAI;EAGlB,IAAI,OAAO,IAAI,KAAK,MAAM;EAC1B,IAAI,IAAI,KAAK,SAAS,CAAC,EAAE,YAAY,MAAM,OAAO,MAAM;GACtD,IAAI,CAAC,KAAK,WAAW,MAAM,GACzB,IAAI;IACF,OAAO,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC,SAAS;GACzC,QAAQ;IAEN,OAAO;GACT;GAGF,MAAM,SAAS,IAAI,KAAK,UAAU,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,KAAK;GACtD,IAAI,QACF,WAAW,IAAI;GAGjB,QAAQ,KAAK,QAAQ,IAAI,KAAK;EAChC,OAEK,IAAI,YAAY,IACnB,QAAQ,IAAI;CAEhB,CAAC;CAED,OAAO,KAAK,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG;AACxC;AAEA,MAAM,UAAU,OAAO,SAAiB,GAAY,WAA0B;CAC5E,MAAM,SAAS,IAAI,IAAI,OAAO,CAAC,CAAC;CAEhC,MAAM,UAAU,EAAE,GAAG,EAAE;CAEvB,QAAQ,OAAO;CACf,QAAQ,cAAc;CAEtB,IAAI;CACJ,IAAI;EACF,MAAM,eAA4B;GAChC,QAAQ;GACR;GACA,aAAa,OAAO,kBAAkB,YAAY;GAClD,GAAG;EACL;EAEA,eAAe,MAAM,MAAM,SAAS,YAAY;EAEhD,IAAI,CAAC,aAAa,IAChB,MAAM,IAAI,MAAM,iBAAiB,aAAa,QAAQ;CAE1D,SAAS,GAAG;EACV,IACE,KACA,OAAO,MAAM,YACb,aAAa,KACb,OAAO,EAAE,YAAY,YACrB,EAAE,QAAQ,SAAS,eAAe,GAElC,MAAM;EAER,MAAM;CACR;CAEA,MAAM,sBAAsB;EAC1B;EACA;EACA;EACA;EACA;CACF;CAGA,MAAM,oBADc,aAAa,QAAQ,IAAI,cAAc,KAAK,GAAA,CAC3B,MAAM,GAAG;CAC9C,IACE,iBAAiB,MACjB,CAAC,oBAAoB,SAAS,iBAAiB,EAAE,GAEjD,MAAM,IAAI,MAAM,4BAA4B;CAE9C,OAAO,aAAa,KAAK;AAC3B;AAEA,MAAM,kBAAkB;CACtB,QACE;CACF,mBAAmB;CACnB,mBAAmB;CACnB,YAAY;CACZ,YAAY;CACZ,MAAM;CACN,SAAS;CACT,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,6BAA6B;CAC7B,cACE;AACJ;;;;;;;;;;;;;;;AA+CA,IAAa,aAAb,cAAgCA,sBAAAA,KAAK;CACnC,OAAO,UAAU;EACf,OAAO;CACT;CAEA,IAAI,eAAe;EACjB,OAAO,CAAC,GAAG,MAAM,cAAc,YAAY;CAC7C;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,YAAY,EACV,OACA,SACA,YACA,eACA,gBACiB;EACjB,MAAM,GAAG,SAAS;EAElB,KAAK,QAAQ;EACb,KAAK,aAAa;EAClB,KAAK,UAAU,WAAW;EAC1B,KAAK,gBAAgB;GACnB,iBAAiB;GACjB,GAAG;EACL;EACA,KAAK,eACH,gBACA,IAAIC,yBAAAA,+BAA+B;GACjC,WAAW;GACX,cAAc;EAChB,CAAC;CACL;;CAGA,MAAM,MAAM,QAAgB,YAAwC;EAClE,MAAM,CAAC,SAAS,QAAQ,YAAY,MAAM;EAC1C,MAAM,YAAY,CAAC;EAEnB,IAAI;EACJ,IAAI;GACF,MAAM,OAAO,MAAM,QAAQ,SAAS,KAAK,SAAS,KAAK,aAAa;GACpE,OAAO,QAAQ,MAAM,SAAS,SAAS;EACzC,SAAS,GAAG;GACV,IAAI,GACF,OAAO,EAAE,SAAS;GAEpB,OAAO;EACT;EAEA,MAAM,QAAQ,MAAM,KAAK,aAAa,UAAU,IAAI;EAEpD,IAAI;EAEJ,IAAI,WACF,UAAU,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;OAGlC;GACH,MAAM,OAAO,MAAM,KAChB,gBACC,IAAIC,0BAAAA,SAAS;IACX;IACA,UAAU,CAAC;GACb,CAAC,CACL;GAMA,MAAM,UAAU,OAAM,MAJIC,4BAAAA,kBAAkB,cAC1C,MACA,KAAK,UACP,EAAA,CACkC,iBAChC,MACA,GACA,KAAA,GACA,YAAY,SAAS,aAAa,CACpC;GACA,UAAUC,sBAAAA,wBAAwB,OAAO;EAC3C;EAEA,MAAM,QAAQ,QAAQ,QAAQ,aAC5B,YAAY,cAAc,KAC3B;EAGD,OADcC,0BAAAA,iBAAiB,KAAK,CAAC,KAAK,OAAO,IAAIC,+BAAAA,mBAAmB,CAAC,CAC9D,CAAC,CAAC,OAAO,OAAO,YAAY,SAAS,CAAC;CACnD;CAEA,OAAO;CAEP,cAAc;AAChB"}
|
package/dist/tools/webbrowser.js
CHANGED
|
@@ -147,7 +147,8 @@ var WebBrowser = class extends Tool {
|
|
|
147
147
|
pageContent,
|
|
148
148
|
metadata: []
|
|
149
149
|
}));
|
|
150
|
-
|
|
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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"}
|
package/dist/util/hub.cjs.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
3
|
+
"version": "1.0.47-rc.0",
|
|
4
4
|
"description": "Old abstractions from LangChain.js",
|
|
5
5
|
"author": "LangChain",
|
|
6
6
|
"license": "MIT",
|
|
@@ -95,70 +95,70 @@
|
|
|
95
95
|
},
|
|
96
96
|
"homepage": "https://github.com/langchain-ai/langchainjs/tree/main/langchain/",
|
|
97
97
|
"devDependencies": {
|
|
98
|
-
"@aws-sdk/dsql-signer": "^3.
|
|
99
|
-
"@azure/identity": "^4.
|
|
100
|
-
"@browserbasehq/stagehand": "^
|
|
101
|
-
"@clickhouse/client": "^
|
|
102
|
-
"@cloudflare/workers-types": "^
|
|
98
|
+
"@aws-sdk/dsql-signer": "^3.1121.0",
|
|
99
|
+
"@azure/identity": "^4.13.2",
|
|
100
|
+
"@browserbasehq/stagehand": "^4.0.2",
|
|
101
|
+
"@clickhouse/client": "^1.23.1",
|
|
102
|
+
"@cloudflare/workers-types": "^5.20260830.1",
|
|
103
103
|
"@elastic/elasticsearch": "^8.19.2",
|
|
104
|
-
"@faker-js/faker": "^10.
|
|
104
|
+
"@faker-js/faker": "^10.5.0",
|
|
105
105
|
"@getmetal/metal-sdk": "^7.7.1",
|
|
106
|
-
"@getzep/zep-cloud": "^
|
|
106
|
+
"@getzep/zep-cloud": "^3.28.0",
|
|
107
107
|
"@getzep/zep-js": "^2.0.2",
|
|
108
|
-
"@gomomento/sdk": "1.118.
|
|
108
|
+
"@gomomento/sdk": "1.118.1",
|
|
109
109
|
"@google/generative-ai": "^0.24.1",
|
|
110
|
-
"@lancedb/lancedb": "^0.
|
|
111
|
-
"@langchain/langgraph": "1.4.
|
|
110
|
+
"@lancedb/lancedb": "^0.37.1",
|
|
111
|
+
"@langchain/langgraph": "1.4.13",
|
|
112
112
|
"@layerup/layerup-security": "^1.5.12",
|
|
113
|
-
"@opensearch-project/opensearch": "^
|
|
114
|
-
"@pinecone-database/pinecone": "^
|
|
113
|
+
"@opensearch-project/opensearch": "^3.6.0",
|
|
114
|
+
"@pinecone-database/pinecone": "^8.2.0",
|
|
115
115
|
"@planetscale/database": "^1.20.1",
|
|
116
116
|
"@prisma/client": "^6.19.3",
|
|
117
|
-
"@qdrant/js-client-rest": "^1.
|
|
117
|
+
"@qdrant/js-client-rest": "^1.19.0",
|
|
118
118
|
"@rockset/client": "^0.9.1",
|
|
119
|
-
"@supabase/supabase-js": "^2.
|
|
119
|
+
"@supabase/supabase-js": "^2.112.4",
|
|
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": "^
|
|
124
|
-
"@types/pg": "^8.
|
|
123
|
+
"@types/jsdom": "^30.0.0",
|
|
124
|
+
"@types/pg": "^8.23.1",
|
|
125
125
|
"@types/ws": "^8",
|
|
126
|
-
"@upstash/redis": "^1.38.
|
|
126
|
+
"@upstash/redis": "^1.38.3",
|
|
127
127
|
"@upstash/vector": "^1.2.2",
|
|
128
128
|
"@vercel/kv": "^3.0.0",
|
|
129
|
-
"@vitest/coverage-v8": "^4.1.
|
|
129
|
+
"@vitest/coverage-v8": "^4.1.11",
|
|
130
130
|
"@xata.io/client": "^0.30.1",
|
|
131
|
-
"@zilliz/milvus2-sdk-node": "^
|
|
132
|
-
"axios": "^1.
|
|
131
|
+
"@zilliz/milvus2-sdk-node": "^3.0.5",
|
|
132
|
+
"axios": "^1.20.0",
|
|
133
133
|
"cheerio": "1.2.0",
|
|
134
|
-
"chromadb": "^
|
|
135
|
-
"cohere-ai": "^
|
|
136
|
-
"convex": "^1.
|
|
134
|
+
"chromadb": "^3.5.0",
|
|
135
|
+
"cohere-ai": "^8.1.0",
|
|
136
|
+
"convex": "^1.45.0",
|
|
137
137
|
"date-fns": "^4.4.0",
|
|
138
|
-
"dotenv": "^17.4.
|
|
139
|
-
"dpdm": "^3.
|
|
138
|
+
"dotenv": "^17.4.2",
|
|
139
|
+
"dpdm": "^4.3.0",
|
|
140
140
|
"duck-duck-scrape": "^2.2.5",
|
|
141
141
|
"exa-js": "^1.10.3",
|
|
142
|
-
"firebase-admin": "^
|
|
143
|
-
"graphql": "^
|
|
142
|
+
"firebase-admin": "^14.3.0",
|
|
143
|
+
"graphql": "^17.0.2",
|
|
144
144
|
"hdb": "^0.19.8",
|
|
145
|
-
"ioredis": "^
|
|
145
|
+
"ioredis": "^6.0.0",
|
|
146
146
|
"langsmith": ">=0.4.0 <1.0.0",
|
|
147
147
|
"lorem-ipsum": "^3.0.0",
|
|
148
|
-
"lunary": "^0.
|
|
148
|
+
"lunary": "^1.0.18",
|
|
149
149
|
"mariadb": "^3.5.3",
|
|
150
|
-
"mem0ai": "^3.1.
|
|
150
|
+
"mem0ai": "^3.1.7",
|
|
151
151
|
"mongodb": "^6.17.0",
|
|
152
|
-
"openai": "^
|
|
152
|
+
"openai": "^7.8.0",
|
|
153
153
|
"peggy": "^5.1.0",
|
|
154
|
-
"pg": "^8.
|
|
154
|
+
"pg": "^8.23.0",
|
|
155
155
|
"pickleparser": "^0.2.1",
|
|
156
|
-
"prisma": "^7.
|
|
156
|
+
"prisma": "^7.10.0",
|
|
157
157
|
"readline": "^1.3.0",
|
|
158
|
-
"redis": "^
|
|
158
|
+
"redis": "^6.2.1",
|
|
159
159
|
"reflect-metadata": "^0.2.2",
|
|
160
160
|
"rimraf": "^6.1.3",
|
|
161
|
-
"sqlite3": "^
|
|
161
|
+
"sqlite3": "^6.0.1",
|
|
162
162
|
"typeorm": "^1.1.0",
|
|
163
163
|
"typescript": "~7.0.2",
|
|
164
164
|
"typesense": "^3.0.5",
|
|
@@ -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.
|
|
170
|
-
"@langchain/aws": "1.4.
|
|
169
|
+
"@langchain/anthropic": "1.5.10-rc.0",
|
|
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.
|
|
174
|
-
"@langchain/fireworks": "0.2.
|
|
173
|
+
"@langchain/deepseek": "1.1.12-rc.0",
|
|
174
|
+
"@langchain/fireworks": "0.2.12-rc.0",
|
|
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.
|
|
185
|
+
"@langchain/xai": "1.4.12-rc.0",
|
|
186
186
|
"@langchain/tsconfig": "0.0.1",
|
|
187
|
-
"langchain": "1.5.
|
|
188
|
-
"@langchain/together-ai": "0.2.
|
|
187
|
+
"langchain": "1.5.11-rc.0",
|
|
188
|
+
"@langchain/together-ai": "0.2.12-rc.0"
|
|
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.
|
|
209
|
+
"js-yaml": "^5.4.1",
|
|
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.
|
|
214
|
+
"@langchain/openai": "1.5.12-rc.0",
|
|
215
215
|
"@langchain/textsplitters": "1.0.1"
|
|
216
216
|
},
|
|
217
217
|
"optionalDependencies": {
|