UNPKG

@langchain/community

Version:
1 lines 8.23 kB
{"version":3,"file":"wikipedia_query_run.cjs","names":["Tool"],"sources":["../../src/tools/wikipedia_query_run.ts"],"sourcesContent":["import { Tool } from \"@langchain/core/tools\";\n\n/**\n * Interface for the parameters that can be passed to the\n * WikipediaQueryRun constructor.\n */\nexport interface WikipediaQueryRunParams {\n topKResults?: number;\n maxDocContentLength?: number;\n baseUrl?: string;\n}\n\n/**\n * Type alias for URL parameters. Represents a record where keys are\n * strings and values can be string, number, boolean, undefined, or null.\n */\ntype UrlParameters = Record<\n string,\n string | number | boolean | undefined | null\n>;\n\n/**\n * Interface for the structure of search results returned by the Wikipedia\n * API.\n */\ninterface SearchResults {\n query: {\n search: Array<{\n title: string;\n }>;\n };\n}\n\n/**\n * Interface for the structure of a page returned by the Wikipedia API.\n */\ninterface Page {\n pageid: number;\n ns: number;\n title: string;\n extract: string;\n}\n\n/**\n * Interface for the structure of a page result returned by the Wikipedia\n * API.\n */\ninterface PageResult {\n batchcomplete: string;\n query: {\n pages: Record<string, Page>;\n };\n}\n\n/**\n * Wikipedia query tool integration.\n *\n * Setup:\n * Install `@langchain/community`. You'll also need an API key.\n *\n * ```bash\n * npm install @langchain/community\n * ```\n *\n * ## [Constructor args](https://api.js.langchain.com/classes/_langchain_community.tools_wikipedia_query_run.WikipediaQueryRun.html#constructor)\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { WikipediaQueryRun } from \"@langchain/community/tools/wikipedia_query_run\";\n *\n * const tool = new WikipediaQueryRun({\n * topKResults: 3,\n * maxDocContentLength: 4000,\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n *\n * <summary><strong>Invocation</strong></summary>\n *\n * ```typescript\n * await tool.invoke(\"what is the current weather in sf?\");\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n *\n * <summary><strong>Invocation with tool call</strong></summary>\n *\n * ```typescript\n * // This is usually generated by a model, but we'll create a tool call directly for demo purposes.\n * const modelGeneratedToolCall = {\n * args: {\n * input: \"what is the current weather in sf?\",\n * },\n * id: \"tool_call_id\",\n * name: tool.name,\n * type: \"tool_call\",\n * };\n * await tool.invoke(modelGeneratedToolCall);\n * ```\n *\n * ```text\n * ToolMessage {\n * \"content\": \"...\",\n * \"name\": \"wikipedia-api\",\n * \"additional_kwargs\": {},\n * \"response_metadata\": {},\n * \"tool_call_id\": \"tool_call_id\"\n * }\n * ```\n * </details>\n */\nexport class WikipediaQueryRun extends Tool {\n static lc_name() {\n return \"WikipediaQueryRun\";\n }\n\n name = \"wikipedia-api\";\n\n description =\n \"A tool for interacting with and fetching data from the Wikipedia API.\";\n\n protected topKResults = 3;\n\n protected maxDocContentLength = 4000;\n\n protected baseUrl = \"https://en.wikipedia.org/w/api.php\";\n\n constructor(params: WikipediaQueryRunParams = {}) {\n super();\n\n this.topKResults = params.topKResults ?? this.topKResults;\n this.maxDocContentLength =\n params.maxDocContentLength ?? this.maxDocContentLength;\n this.baseUrl = params.baseUrl ?? this.baseUrl;\n }\n\n async _call(query: string): Promise<string> {\n const searchResults = await this._fetchSearchResults(query);\n const summaries: string[] = [];\n\n for (\n let i = 0;\n i < Math.min(this.topKResults, searchResults.query.search.length);\n i += 1\n ) {\n const page = searchResults.query.search[i].title;\n const pageDetails = await this._fetchPage(page, true);\n\n if (pageDetails) {\n const summary = `Page: ${page}\\nSummary: ${pageDetails.extract}`;\n summaries.push(summary);\n }\n }\n\n if (summaries.length === 0) {\n return \"No good Wikipedia Search Result was found\";\n } else {\n return summaries.join(\"\\n\\n\").slice(0, this.maxDocContentLength);\n }\n }\n\n /**\n * Fetches the content of a specific Wikipedia page. It returns the\n * extracted content as a string.\n * @param page The specific Wikipedia page to fetch its content.\n * @param redirect A boolean value to indicate whether to redirect or not.\n * @returns The extracted content of the specific Wikipedia page as a string.\n */\n public async content(page: string, redirect = true): Promise<string> {\n try {\n const result = await this._fetchPage(page, redirect);\n return result.extract;\n } catch (error) {\n throw new Error(`Failed to fetch content for page \"${page}\": ${error}`);\n }\n }\n\n /**\n * Builds a URL for the Wikipedia API using the provided parameters.\n * @param parameters The parameters to be used in building the URL.\n * @returns A string representing the built URL.\n */\n protected buildUrl<P extends UrlParameters>(parameters: P): string {\n const nonUndefinedParams: [string, string][] = Object.entries(parameters)\n .filter(([_, value]) => value !== undefined)\n .map(([key, value]) => [key, `${value}`]);\n const searchParams = new URLSearchParams(nonUndefinedParams);\n return `${this.baseUrl}?${searchParams}`;\n }\n\n private async _fetchSearchResults(query: string): Promise<SearchResults> {\n const searchParams = new URLSearchParams({\n action: \"query\",\n list: \"search\",\n srsearch: query,\n format: \"json\",\n });\n\n const response = await fetch(`${this.baseUrl}?${searchParams.toString()}`);\n if (!response.ok) throw new Error(\"Network response was not ok\");\n\n const data: SearchResults = await response.json();\n\n return data;\n }\n\n private async _fetchPage(page: string, redirect: boolean): Promise<Page> {\n const params = new URLSearchParams({\n action: \"query\",\n prop: \"extracts\",\n explaintext: \"true\",\n redirects: redirect ? \"1\" : \"0\",\n format: \"json\",\n titles: page,\n });\n\n const response = await fetch(`${this.baseUrl}?${params.toString()}`);\n if (!response.ok) throw new Error(\"Network response was not ok\");\n\n const data: PageResult = await response.json();\n const { pages } = data.query;\n const pageId = Object.keys(pages)[0];\n\n return pages[pageId];\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwHA,IAAa,oBAAb,cAAuCA,sBAAAA,KAAK;CAC1C,OAAO,UAAU;AACf,SAAO;;CAGT,OAAO;CAEP,cACE;CAEF,cAAwB;CAExB,sBAAgC;CAEhC,UAAoB;CAEpB,YAAY,SAAkC,EAAE,EAAE;AAChD,SAAO;AAEP,OAAK,cAAc,OAAO,eAAe,KAAK;AAC9C,OAAK,sBACH,OAAO,uBAAuB,KAAK;AACrC,OAAK,UAAU,OAAO,WAAW,KAAK;;CAGxC,MAAM,MAAM,OAAgC;EAC1C,MAAM,gBAAgB,MAAM,KAAK,oBAAoB,MAAM;EAC3D,MAAM,YAAsB,EAAE;AAE9B,OACE,IAAI,IAAI,GACR,IAAI,KAAK,IAAI,KAAK,aAAa,cAAc,MAAM,OAAO,OAAO,EACjE,KAAK,GACL;GACA,MAAM,OAAO,cAAc,MAAM,OAAO,GAAG;GAC3C,MAAM,cAAc,MAAM,KAAK,WAAW,MAAM,KAAK;AAErD,OAAI,aAAa;IACf,MAAM,UAAU,SAAS,KAAK,aAAa,YAAY;AACvD,cAAU,KAAK,QAAQ;;;AAI3B,MAAI,UAAU,WAAW,EACvB,QAAO;MAEP,QAAO,UAAU,KAAK,OAAO,CAAC,MAAM,GAAG,KAAK,oBAAoB;;;;;;;;;CAWpE,MAAa,QAAQ,MAAc,WAAW,MAAuB;AACnE,MAAI;AAEF,WADe,MAAM,KAAK,WAAW,MAAM,SAAS,EACtC;WACP,OAAO;AACd,SAAM,IAAI,MAAM,qCAAqC,KAAK,KAAK,QAAQ;;;;;;;;CAS3E,SAA4C,YAAuB;EACjE,MAAM,qBAAyC,OAAO,QAAQ,WAAW,CACtE,QAAQ,CAAC,GAAG,WAAW,UAAU,KAAA,EAAU,CAC3C,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC;EAC3C,MAAM,eAAe,IAAI,gBAAgB,mBAAmB;AAC5D,SAAO,GAAG,KAAK,QAAQ,GAAG;;CAG5B,MAAc,oBAAoB,OAAuC;EACvE,MAAM,eAAe,IAAI,gBAAgB;GACvC,QAAQ;GACR,MAAM;GACN,UAAU;GACV,QAAQ;GACT,CAAC;EAEF,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,GAAG,aAAa,UAAU,GAAG;AAC1E,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,8BAA8B;AAIhE,SAF4B,MAAM,SAAS,MAAM;;CAKnD,MAAc,WAAW,MAAc,UAAkC;EACvE,MAAM,SAAS,IAAI,gBAAgB;GACjC,QAAQ;GACR,MAAM;GACN,aAAa;GACb,WAAW,WAAW,MAAM;GAC5B,QAAQ;GACR,QAAQ;GACT,CAAC;EAEF,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,GAAG,OAAO,UAAU,GAAG;AACpE,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,8BAA8B;EAGhE,MAAM,EAAE,WADiB,MAAM,SAAS,MAAM,EACvB;AAGvB,SAAO,MAFQ,OAAO,KAAK,MAAM,CAAC"}