"""Open-Meteo current-weather adapter. The adapter only knows the upstream protocol. Cache policy belongs to LocalContentService so callers cannot accidentally bypass it. """ from datetime import datetime from typing import Any import httpx OPEN_METEO_URL = "https://api.open-meteo.com/v1/forecast" class OpenMeteoRequestFailed(RuntimeError): pass async def fetch_current_weather(latitude: float, longitude: float) -> dict[str, Any]: params = { "latitude": latitude, "longitude": longitude, "current": "temperature_2m,weather_code,wind_speed_10m", "timezone": "auto", } try: async with httpx.AsyncClient(timeout=httpx.Timeout(10.0, connect=5.0)) as client: response = await client.get(OPEN_METEO_URL, params=params) response.raise_for_status() payload = response.json() current = payload["current"] return { "temperature": current["temperature_2m"], "weather_code": current["weather_code"], "wind_speed": current.get("wind_speed_10m"), "observed_at": current["time"], "timezone": payload.get("timezone"), "latitude": payload.get("latitude", latitude), "longitude": payload.get("longitude", longitude), } except (httpx.HTTPError, KeyError, TypeError, ValueError) as ex: raise OpenMeteoRequestFailed("Open-Meteo 날씨 조회에 실패했습니다.") from ex