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