Spaces:
Sleeping
Sleeping
| import os | |
| import urllib.request | |
| import zipfile | |
| from pathlib import Path | |
| import pandas as pd | |
| import requests | |
| import yaml | |
| from smolagents import CodeAgent, HfApiModel, load_tool, tool | |
| from tools.final_answer import FinalAnswerTool | |
| from Gradio_UI import GradioUI | |
| def download_and_unzip(download_folder) -> pd.DataFrame: | |
| os.makedirs(download_folder, exist_ok=True) | |
| csv_path = Path(download_folder) / "worldcities.csv" | |
| if csv_path.exists(): | |
| return pd.read_csv(csv_path, index_col=False) | |
| zip_filename = "simplemaps_worldcities_basicv1.77.zip" | |
| zip_filepath = os.path.join(download_folder, zip_filename) | |
| if not os.path.exists(zip_filepath): | |
| url = "https://simplemaps.com/static/data/world-cities/basic/simplemaps_worldcities_basicv1.77.zip" | |
| urllib.request.urlretrieve(url, zip_filepath) | |
| with zipfile.ZipFile(zip_filepath, 'r') as zip_ref: | |
| zip_ref.extractall(download_folder) | |
| return pd.read_csv(csv_path, index_col=False) | |
| def get_weather_for_city(city: str, country: str) -> str: | |
| """Searches for the city in the world cities dataset, obtains its coordinates, | |
| and fetches current weather from the Open-Meteo API. | |
| Args: | |
| city: Name of the city (case insensitive, matches 'city_ascii' in the CSV). | |
| country: Name of the country (case insensitive). | |
| Returns: | |
| A string containing the city's coordinates and current weather details. | |
| """ | |
| df = download_and_unzip("downloads") | |
| matches = df[(df['city_ascii'].str.lower() == city.lower()) & (df['country'].str.lower() == country.lower())] | |
| if matches.empty: | |
| return f"No location found for {city}, {country}." | |
| row = matches.iloc[0] | |
| lat = float(row['lat']) | |
| lng = float(row['lng']) | |
| url = "https://api.open-meteo.com/v1/forecast" | |
| params = { | |
| "latitude": lat, | |
| "longitude": lng, | |
| "current_weather": "true" | |
| } | |
| try: | |
| response = requests.get(url, params=params, timeout=10) | |
| if response.status_code != 200: | |
| return f"Error fetching weather data: {response.status_code}." | |
| data = response.json() | |
| if "current_weather" not in data: | |
| return "Weather data not available." | |
| current = data["current_weather"] | |
| temperature = current.get("temperature") | |
| windspeed = current.get("windspeed") | |
| winddirection = current.get("winddirection") | |
| time_str = current.get("time") | |
| return (f"Current weather in {row['city_ascii']}, {row['country']} (lat: {lat}, lng: {lng}):\n" | |
| f"Temperature: {temperature}°C, Wind Speed: {windspeed} km/h, Wind Direction: {winddirection}° at {time_str}.") | |
| except Exception as e: | |
| return f"An error occurred while fetching weather data: {str(e)}" | |
| final_answer = FinalAnswerTool() | |
| model = HfApiModel( | |
| max_tokens=2096, | |
| temperature=0.4, | |
| model_id='Qwen/Qwen2.5-Coder-32B-Instruct', | |
| custom_role_conversions=None, | |
| ) | |
| with open("prompts.yaml", 'r') as stream: | |
| prompt_templates = yaml.safe_load(stream) | |
| agent = CodeAgent( | |
| model=model, | |
| tools=[final_answer, get_weather_for_city], | |
| max_steps=6, | |
| verbosity_level=1, | |
| grammar=None, | |
| planning_interval=None, | |
| name=None, | |
| description=None, | |
| prompt_templates=prompt_templates | |
| ) | |
| GradioUI(agent).launch() | |