{"version":3,"file":"serper.cjs","names":["Tool"],"sources":["../../src/tools/serper.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { Tool } from \"@langchain/core/tools\";\n\n/**\n * Defines the parameters that can be passed to the Serper class during\n * instantiation. It includes `gl` and `hl` which are optional.\n */\nexport type SerperParameters = {\n  gl?: string;\n  hl?: string;\n};\n\n/**\n * Wrapper around serper.\n *\n * You can create a free API key at https://serper.dev.\n *\n * To use, you should have the SERPER_API_KEY environment variable set.\n */\nexport class Serper extends Tool {\n  static lc_name() {\n    return \"Serper\";\n  }\n\n  /**\n   * Converts the Serper instance to JSON. This method is not implemented\n   * and will throw an error if called.\n   * @returns Throws an error.\n   */\n  toJSON() {\n    return this.toJSONNotImplemented();\n  }\n\n  protected key: string;\n\n  protected params: Partial<SerperParameters>;\n\n  constructor(\n    apiKey: string | undefined = getEnvironmentVariable(\"SERPER_API_KEY\"),\n    params: Partial<SerperParameters> = {}\n  ) {\n    super();\n\n    if (!apiKey) {\n      throw new Error(\n        \"Serper API key not set. You can set it as SERPER_API_KEY in your .env file, or pass it to Serper.\"\n      );\n    }\n\n    this.key = apiKey;\n    this.params = params;\n  }\n\n  name = \"search\";\n\n  /** @ignore */\n  async _call(input: string) {\n    const options = {\n      method: \"POST\",\n      headers: {\n        \"X-API-KEY\": this.key,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        q: input,\n        ...this.params,\n      }),\n    };\n\n    const res = await fetch(\"https://google.serper.dev/search\", options);\n\n    if (!res.ok) {\n      throw new Error(`Got ${res.status} error from serper: ${res.statusText}`);\n    }\n\n    const json = await res.json();\n\n    if (json.answerBox?.answer) {\n      return json.answerBox.answer;\n    }\n\n    if (json.answerBox?.snippet) {\n      return json.answerBox.snippet;\n    }\n\n    if (json.answerBox?.snippet_highlighted_words) {\n      return json.answerBox.snippet_highlighted_words[0];\n    }\n\n    if (json.sportsResults?.game_spotlight) {\n      return json.sportsResults.game_spotlight;\n    }\n\n    if (json.knowledgeGraph?.description) {\n      return json.knowledgeGraph.description;\n    }\n\n    if (json.organic?.[0]?.snippet) {\n      return json.organic[0].snippet;\n    }\n\n    return \"No good search result found\";\n  }\n\n  description =\n    \"a search engine. useful for when you need to answer questions about current events. input should be a search query.\";\n}\n"],"mappings":";;;;;;;;;;;;;AAmBA,IAAa,SAAb,cAA4BA,sBAAAA,KAAK;CAC/B,OAAO,UAAU;AACf,SAAO;;;;;;;CAQT,SAAS;AACP,SAAO,KAAK,sBAAsB;;CAGpC;CAEA;CAEA,YACE,UAAA,GAAA,0BAAA,wBAAoD,iBAAiB,EACrE,SAAoC,EAAE,EACtC;AACA,SAAO;AAEP,MAAI,CAAC,OACH,OAAM,IAAI,MACR,oGACD;AAGH,OAAK,MAAM;AACX,OAAK,SAAS;;CAGhB,OAAO;;CAGP,MAAM,MAAM,OAAe;EACzB,MAAM,UAAU;GACd,QAAQ;GACR,SAAS;IACP,aAAa,KAAK;IAClB,gBAAgB;IACjB;GACD,MAAM,KAAK,UAAU;IACnB,GAAG;IACH,GAAG,KAAK;IACT,CAAC;GACH;EAED,MAAM,MAAM,MAAM,MAAM,oCAAoC,QAAQ;AAEpE,MAAI,CAAC,IAAI,GACP,OAAM,IAAI,MAAM,OAAO,IAAI,OAAO,sBAAsB,IAAI,aAAa;EAG3E,MAAM,OAAO,MAAM,IAAI,MAAM;AAE7B,MAAI,KAAK,WAAW,OAClB,QAAO,KAAK,UAAU;AAGxB,MAAI,KAAK,WAAW,QAClB,QAAO,KAAK,UAAU;AAGxB,MAAI,KAAK,WAAW,0BAClB,QAAO,KAAK,UAAU,0BAA0B;AAGlD,MAAI,KAAK,eAAe,eACtB,QAAO,KAAK,cAAc;AAG5B,MAAI,KAAK,gBAAgB,YACvB,QAAO,KAAK,eAAe;AAG7B,MAAI,KAAK,UAAU,IAAI,QACrB,QAAO,KAAK,QAAQ,GAAG;AAGzB,SAAO;;CAGT,cACE"}