UNPKG

@langchain/community

Version:
1 lines 3.63 kB
{"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"}