{"version":3,"sources":["../../../src/tools/weather/openMeteo.ts"],"names":["OpenMeteoToolOutput","JSONToolOutput","OpenMeteoTool","Tool","name","description","inputSchema","z","object","location","union","string","min","country","optional","language","default","strip","latitude","coerce","number","longitude","start_date","date","describe","end_date","temperature_unit","enum","emitter","Emitter","root","child","namespace","creator","register","options","responseFilter","excludedKeys","preprocessInput","rawInput","fixDate","key","value","getProp","setProp","substring","_run","startDate","endDate","input","_options","run","apiKey","prepareParams","extractLocation","response","_geocode","signal","pick","validateAndSetDates","startDateStr","endDateStr","now","Date","start","UTC","getFullYear","getMonth","getDate","end","ToolInputValidationError","toDateString","toISOString","split","createURLParams","pickBy","v","isNullish","current","daily","hourly","timezone","params","fetch","headers","Authorization","ok","ToolError","Error","text","data","json","omit","format","count","results","length"],"mappings":"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","file":"openMeteo.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n  BaseToolOptions,\n  BaseToolRunOptions,\n  ToolEmitter,\n  JSONToolOutput,\n  Tool,\n  ToolError,\n  ToolInput,\n  ToolInputValidationError,\n} from \"@/tools/base.js\";\nimport { z } from \"zod\";\nimport { createURLParams } from \"@/internals/fetcher.js\";\nimport { isNullish, omit, pick, pickBy } from \"remeda\";\nimport { Cache } from \"@/cache/decoratorCache.js\";\nimport { RunContext } from \"@/context.js\";\nimport { getProp, setProp } from \"@/internals/helpers/object.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\n\nexport interface ResponseFilter {\n  excludedKeys: (keyof OpenMeteoToolResponse)[];\n}\n\ninterface ToolOptions extends BaseToolOptions {\n  apiKey?: string;\n  responseFilter?: ResponseFilter;\n}\n\ntype ToolRunOptions = BaseToolRunOptions;\n\ninterface Location {\n  latitude: number;\n  longitude: number;\n}\n\ninterface LocationSearch {\n  name: string;\n  country?: string;\n  language?: string;\n}\n\nexport interface OpenMeteoToolResponse {\n  latitude?: number;\n  longitude?: number;\n  generationtime_ms?: number;\n  utc_offset_seconds?: number;\n  timezone?: string;\n  timezone_abbreviation?: string;\n  elevation?: number;\n  current_units?: Record<string, string>;\n  current?: Record<string, string>;\n  hourly_units?: Record<string, string>;\n  hourly?: Record<string, any[]>;\n  daily_units?: Record<string, string>;\n  daily?: Record<string, any[]>;\n}\n\nexport class OpenMeteoToolOutput extends JSONToolOutput<OpenMeteoToolResponse> {}\n\nexport class OpenMeteoTool extends Tool<OpenMeteoToolOutput, ToolOptions, ToolRunOptions> {\n  name = \"OpenMeteo\";\n  description = `Retrieve current, past, or future weather forecasts for a location.`;\n\n  inputSchema() {\n    return z\n      .object({\n        location: z.union([\n          z\n            .object({\n              name: z.string().min(1),\n              country: z.string().optional(),\n              language: z.string().default(\"English\"),\n            })\n            .strip(),\n          z\n            .object({\n              latitude: z.coerce.number(),\n              longitude: z.coerce.number(),\n            })\n            .strip(),\n        ]),\n        start_date: z\n          .string()\n          .date()\n          .describe(\"Start date for the weather forecast in the format YYYY-MM-DD (UTC)\"),\n        end_date: z\n          .string()\n          .date()\n          .describe(\"End date for the weather forecast in the format YYYY-MM-DD (UTC)\")\n          .optional(),\n        temperature_unit: z.enum([\"celsius\", \"fahrenheit\"]).default(\"celsius\"),\n      })\n      .strip();\n  }\n\n  public readonly emitter: ToolEmitter<ToolInput<this>, OpenMeteoToolOutput> = Emitter.root.child({\n    namespace: [\"tool\", \"weather\", \"openMeteo\"],\n    creator: this,\n  });\n\n  static {\n    this.register();\n  }\n\n  public constructor(options: Partial<ToolOptions> = {}) {\n    super({\n      ...options,\n      responseFilter: options?.responseFilter ?? {\n        excludedKeys: [\n          \"latitude\",\n          \"longitude\",\n          \"generationtime_ms\",\n          \"utc_offset_seconds\",\n          \"timezone\",\n          \"timezone_abbreviation\",\n          \"elevation\",\n          \"hourly\",\n          \"hourly_units\",\n        ],\n      },\n    });\n  }\n\n  protected preprocessInput(rawInput: unknown) {\n    super.preprocessInput(rawInput);\n\n    const fixDate = (key: keyof ToolInput<this>) => {\n      const value = getProp(rawInput, [key]);\n      if (value) {\n        setProp(rawInput, [key], value.substring(0, 10));\n      }\n    };\n\n    fixDate(\"start_date\");\n    fixDate(\"end_date\");\n  }\n\n  protected async _run(\n    { location, start_date: startDate, end_date: endDate, ...input }: ToolInput<this>,\n    _options: Partial<BaseToolRunOptions>,\n    run: RunContext<this>,\n  ) {\n    const { apiKey } = this.options;\n\n    const prepareParams = async () => {\n      const extractLocation = async (): Promise<Location> => {\n        if (\"name\" in location) {\n          const response = await this._geocode(location, run.signal);\n          return pick(response, [\"latitude\", \"longitude\"]) as Location;\n        }\n        return location;\n      };\n\n      function validateAndSetDates(\n        startDateStr: string,\n        endDateStr?: string,\n      ): { start: Date; end: Date } {\n        const now = new Date();\n        const start = startDateStr\n          ? new Date(startDateStr)\n          : new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));\n\n        if (endDateStr) {\n          const end = new Date(endDateStr);\n          if (end < start) {\n            throw new ToolInputValidationError(\n              `The 'end_date' (${endDateStr}) has to occur on or after the 'start_date' (${startDateStr}).`,\n            );\n          }\n          return { start: start, end: end };\n        } else {\n          // If endDate is undefined, set it to the start date\n          return { start: start, end: new Date(start) };\n        }\n      }\n\n      const { start, end } = validateAndSetDates(startDate, endDate);\n\n      const toDateString = (date: Date) => date.toISOString().split(\"T\")[0];\n\n      return createURLParams({\n        ...pickBy(input, (v) => !isNullish(v) && v !== \"\"),\n        ...(await extractLocation()),\n        start_date: toDateString(start),\n        end_date: toDateString(end),\n        current: [\"temperature_2m\", \"rain\", \"relative_humidity_2m\", \"wind_speed_10m\"],\n        daily: [\"temperature_2m_max\", \"temperature_2m_min\", \"rain_sum\"],\n        hourly: [\"temperature_2m\", \"relative_humidity_2m\", \"rain\"],\n        timezone: \"UTC\",\n      });\n    };\n\n    const params = await prepareParams();\n    const response = await fetch(`https://api.open-meteo.com/v1/forecast?${params}`, {\n      headers: {\n        ...(apiKey && {\n          Authorization: `Bearer ${apiKey}`,\n        }),\n      },\n      signal: run.signal,\n    });\n\n    if (!response.ok) {\n      throw new ToolError(\"Request to OpenMeteo API has failed!\", [\n        new Error(await response.text()),\n      ]);\n    }\n\n    let data: OpenMeteoToolResponse = await response.json();\n\n    if (this.options?.responseFilter?.excludedKeys) {\n      data = omit(data, this.options.responseFilter.excludedKeys);\n    }\n\n    return new OpenMeteoToolOutput(data);\n  }\n\n  @Cache()\n  protected async _geocode(location: LocationSearch, signal: AbortSignal) {\n    const { apiKey } = this.options;\n\n    const params = createURLParams({\n      name: location.name,\n      language: location.language,\n      country: location.country,\n      format: \"json\",\n      count: 1,\n    });\n    const response = await fetch(`https://geocoding-api.open-meteo.com/v1/search?${params}`, {\n      headers: {\n        ...(apiKey && {\n          Authorization: `Bearer ${apiKey}`,\n        }),\n      },\n      signal,\n    });\n    if (!response.ok) {\n      throw new ToolError(`Failed to GeoCode provided location (${location.name}).`, [\n        new Error(await response.text()),\n      ]);\n    }\n\n    const { results } = await response.json();\n    if (!results || results.length === 0) {\n      throw new ToolError(`Location '${location.name}' was not found.`);\n    }\n    return results[0];\n  }\n}\n"]}