UNPKG

@langchain/community

Version:
1 lines • 8.63 kB
{"version":3,"file":"wikipedia_query_run.cjs","names":["Tool","params: WikipediaQueryRunParams","query: string","summaries: string[]","page: string","parameters: P","nonUndefinedParams: [string, string][]","data: SearchResults","redirect: boolean","data: PageResult"],"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,4BAAK;CAC1C,OAAO,UAAU;AACf,SAAO;CACR;CAED,OAAO;CAEP,cACE;CAEF,AAAU,cAAc;CAExB,AAAU,sBAAsB;CAEhC,AAAU,UAAU;CAEpB,YAAYC,SAAkC,CAAE,GAAE;EAChD,OAAO;EAEP,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,sBACH,OAAO,uBAAuB,KAAK;EACrC,KAAK,UAAU,OAAO,WAAW,KAAK;CACvC;CAED,MAAM,MAAMC,OAAgC;EAC1C,MAAM,gBAAgB,MAAM,KAAK,oBAAoB,MAAM;EAC3D,MAAMC,YAAsB,CAAE;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,CAAC,MAAM,EAAE,KAAK,WAAW,EAAE,YAAY,SAAS;IAChE,UAAU,KAAK,QAAQ;GACxB;EACF;AAED,MAAI,UAAU,WAAW,EACvB,QAAO;MAEP,QAAO,UAAU,KAAK,OAAO,CAAC,MAAM,GAAG,KAAK,oBAAoB;CAEnE;;;;;;;;CASD,MAAa,QAAQC,MAAc,WAAW,MAAuB;AACnE,MAAI;GACF,MAAM,SAAS,MAAM,KAAK,WAAW,MAAM,SAAS;AACpD,UAAO,OAAO;EACf,SAAQ,OAAO;AACd,SAAM,IAAI,MAAM,CAAC,kCAAkC,EAAE,KAAK,GAAG,EAAE,OAAO;EACvE;CACF;;;;;;CAOD,AAAU,SAAkCC,YAAuB;EACjE,MAAMC,qBAAyC,OAAO,QAAQ,WAAW,CACtE,OAAO,CAAC,CAAC,GAAG,MAAM,KAAK,UAAU,OAAU,CAC3C,IAAI,CAAC,CAAC,KAAK,MAAM,KAAK,CAAC,KAAK,GAAG,OAAO,AAAC,EAAC;EAC3C,MAAM,eAAe,IAAI,gBAAgB;AACzC,SAAO,GAAG,KAAK,QAAQ,CAAC,EAAE,cAAc;CACzC;CAED,MAAc,oBAAoBJ,OAAuC;EACvE,MAAM,eAAe,IAAI,gBAAgB;GACvC,QAAQ;GACR,MAAM;GACN,UAAU;GACV,QAAQ;EACT;EAED,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,CAAC,EAAE,aAAa,UAAU,EAAE,CAAC;AAC1E,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM;EAElC,MAAMK,OAAsB,MAAM,SAAS,MAAM;AAEjD,SAAO;CACR;CAED,MAAc,WAAWH,MAAcI,UAAkC;EACvE,MAAM,SAAS,IAAI,gBAAgB;GACjC,QAAQ;GACR,MAAM;GACN,aAAa;GACb,WAAW,WAAW,MAAM;GAC5B,QAAQ;GACR,QAAQ;EACT;EAED,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,CAAC,EAAE,OAAO,UAAU,EAAE,CAAC;AACpE,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM;EAElC,MAAMC,OAAmB,MAAM,SAAS,MAAM;EAC9C,MAAM,EAAE,OAAO,GAAG,KAAK;EACvB,MAAM,SAAS,OAAO,KAAK,MAAM,CAAC;AAElC,SAAO,MAAM;CACd;AACF"}