{"version":3,"file":"google_places.cjs","names":["Tool","fields?: GooglePlacesAPIParams","input: string","json","place: {\n          id?: string;\n          internationalPhoneNumber?: string;\n          formattedAddress?: string;\n          websiteUri?: string;\n          displayName?: { text?: string };\n        }"],"sources":["../../src/tools/google_places.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { Tool } from \"@langchain/core/tools\";\n\n/**\n * Interface for parameters required by GooglePlacesAPI class.\n */\nexport interface GooglePlacesAPIParams {\n  apiKey?: string;\n}\n\n/**\n * Tool that queries the Google Places API\n */\nexport class GooglePlacesAPI extends Tool {\n  static lc_name() {\n    return \"GooglePlacesAPI\";\n  }\n\n  get lc_secrets(): { [key: string]: string } | undefined {\n    return {\n      apiKey: \"GOOGLE_PLACES_API_KEY\",\n    };\n  }\n\n  name = \"google_places\";\n\n  protected apiKey: string;\n\n  description = `A wrapper around Google Places API. Useful for when you need to validate or \n  discover addresses from ambiguous text. Input should be a search query.`;\n\n  constructor(fields?: GooglePlacesAPIParams) {\n    super(...arguments);\n    const apiKey =\n      fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_PLACES_API_KEY\");\n    if (apiKey === undefined) {\n      throw new Error(\n        `Google Places API key not set. You can set it as \"GOOGLE_PLACES_API_KEY\" in your environment variables.`\n      );\n    }\n    this.apiKey = apiKey;\n  }\n\n  async _call(input: string) {\n    const res = await fetch(\n      `https://places.googleapis.com/v1/places:searchText`,\n      {\n        method: \"POST\",\n        body: JSON.stringify({\n          textQuery: input,\n          languageCode: \"en\",\n        }),\n        headers: {\n          \"X-Goog-Api-Key\": this.apiKey,\n          \"X-Goog-FieldMask\":\n            \"places.displayName,places.formattedAddress,places.id,places.internationalPhoneNumber,places.websiteUri\",\n          \"Content-Type\": \"application/json\",\n        },\n      }\n    );\n\n    if (!res.ok) {\n      let message;\n      try {\n        const json = await res.json();\n        message = json.error.message;\n      } catch {\n        message =\n          \"Unable to parse error message: Google did not return a JSON response.\";\n      }\n      throw new Error(\n        `Got ${res.status}: ${res.statusText} error from Google Places API: ${message}`\n      );\n    }\n\n    const json = await res.json();\n\n    const results =\n      json?.places?.map(\n        (place: {\n          id?: string;\n          internationalPhoneNumber?: string;\n          formattedAddress?: string;\n          websiteUri?: string;\n          displayName?: { text?: string };\n        }) => ({\n          name: place.displayName?.text,\n          id: place.id,\n          address: place.formattedAddress,\n          phoneNumber: place.internationalPhoneNumber,\n          website: place.websiteUri,\n        })\n      ) ?? [];\n    return JSON.stringify(results);\n  }\n}\n"],"mappings":";;;;;;;;;;AAaA,IAAa,kBAAb,cAAqCA,4BAAK;CACxC,OAAO,UAAU;AACf,SAAO;CACR;CAED,IAAI,aAAoD;AACtD,SAAO,EACL,QAAQ,wBACT;CACF;CAED,OAAO;CAEP,AAAU;CAEV,cAAc,CAAC;yEACwD,CAAC;CAExE,YAAYC,QAAgC;EAC1C,MAAM,GAAG,UAAU;EACnB,MAAM,SACJ,QAAQ,iEAAiC,wBAAwB;AACnE,MAAI,WAAW,OACb,OAAM,IAAI,MACR,CAAC,uGAAuG,CAAC;EAG7G,KAAK,SAAS;CACf;CAED,MAAM,MAAMC,OAAe;EACzB,MAAM,MAAM,MAAM,MAChB,CAAC,kDAAkD,CAAC,EACpD;GACE,QAAQ;GACR,MAAM,KAAK,UAAU;IACnB,WAAW;IACX,cAAc;GACf,EAAC;GACF,SAAS;IACP,kBAAkB,KAAK;IACvB,oBACE;IACF,gBAAgB;GACjB;EACF,EACF;AAED,MAAI,CAAC,IAAI,IAAI;GACX,IAAI;AACJ,OAAI;IACF,MAAMC,SAAO,MAAM,IAAI,MAAM;IAC7B,UAAUA,OAAK,MAAM;GACtB,QAAO;IACN,UACE;GACH;AACD,SAAM,IAAI,MACR,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,EAAE,IAAI,WAAW,+BAA+B,EAAE,SAAS;EAElF;EAED,MAAM,OAAO,MAAM,IAAI,MAAM;EAE7B,MAAM,UACJ,MAAM,QAAQ,IACZ,CAACC,WAMM;GACL,MAAM,MAAM,aAAa;GACzB,IAAI,MAAM;GACV,SAAS,MAAM;GACf,aAAa,MAAM;GACnB,SAAS,MAAM;EAChB,GACF,IAAI,CAAE;AACT,SAAO,KAAK,UAAU,QAAQ;CAC/B;AACF"}