{"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"}