Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -68,20 +68,14 @@ def get_air_quality(city: str, lang: str = "en") -> str:
|
|
| 68 |
"air_quality": "Air quality",
|
| 69 |
"pm2_5": "Fine particles (PM2.5)",
|
| 70 |
"pm10": "Coarse particles (PM10)",
|
| 71 |
-
"co": "Carbon monoxide (CO)"
|
| 72 |
-
"no2": "Nitrogen dioxide (NO2)",
|
| 73 |
-
"so2": "Sulfur dioxide (SO2)",
|
| 74 |
-
"o3": "Ozone (O3)"
|
| 75 |
},
|
| 76 |
"ru": {
|
| 77 |
"aqi_desc": {1: "Хорошее", 2: "Удовлетворительное", 3: "Среднее", 4: "Плохое", 5: "Очень плохое"},
|
| 78 |
"air_quality": "Качество воздуха",
|
| 79 |
"pm2_5": "Мелкие частицы (PM2.5)",
|
| 80 |
"pm10": "Крупные частицы (PM10)",
|
| 81 |
-
"co": "Угарный газ (CO)"
|
| 82 |
-
"no2": "Диоксид азота (NO2)",
|
| 83 |
-
"so2": "Диоксид серы (SO2)",
|
| 84 |
-
"o3": "Озон (O3)"
|
| 85 |
}
|
| 86 |
}
|
| 87 |
lang = lang if lang in translations else "en"
|
|
@@ -92,10 +86,7 @@ def get_air_quality(city: str, lang: str = "en") -> str:
|
|
| 92 |
f"😷 {t['air_quality']}: AQI {aqi} ({t['aqi_desc'].get(aqi, 'Unknown')}) {aqi_emoji}\n"
|
| 93 |
f"{t['pm2_5']}: {components['pm2_5']} µg/m³\n"
|
| 94 |
f"{t['pm10']}: {components['pm10']} µg/m³\n"
|
| 95 |
-
f"{t['co']}: {components['co']} µg/m
|
| 96 |
-
f"{t['no2']}: {components['no2']} µg/m³\n"
|
| 97 |
-
f"{t['so2']}: {components['so2']} µg/m³\n"
|
| 98 |
-
f"{t['o3']}: {components['o3']} µg/m³"
|
| 99 |
)
|
| 100 |
except Exception as e:
|
| 101 |
return f"Error fetching air quality for '{city}': {str(e)}"
|
|
@@ -121,45 +112,48 @@ def get_weather(city: str, lang: str = "en") -> str:
|
|
| 121 |
|
| 122 |
data = response.json()
|
| 123 |
temp = data["main"]["temp"]
|
| 124 |
-
|
| 125 |
-
|
| 126 |
|
| 127 |
translations = {
|
| 128 |
"en": {
|
| 129 |
-
"weather": "Weather
|
| 130 |
-
"
|
| 131 |
-
"
|
| 132 |
-
"
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
},
|
| 137 |
"ru": {
|
| 138 |
-
"weather": "Погода
|
| 139 |
-
"
|
| 140 |
-
"
|
| 141 |
-
"
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
}
|
| 146 |
}
|
| 147 |
lang = lang if lang in translations else "en"
|
| 148 |
t = translations[lang]
|
|
|
|
| 149 |
|
| 150 |
-
|
| 151 |
-
"
|
| 152 |
-
"
|
| 153 |
-
"
|
| 154 |
-
|
| 155 |
-
"7": "🌫️", # Mist
|
| 156 |
-
"800": "☀️", # Clear
|
| 157 |
-
"8": "☁️" # Clouds
|
| 158 |
-
}
|
| 159 |
-
emoji = weather_emoji.get(str(weather_id)[0], "🌤️") if weather_id != 800 else weather_emoji.get("800")
|
| 160 |
-
|
| 161 |
-
desc_trans = t.get(description, description.capitalize())
|
| 162 |
-
return f"🌤️ {t['weather']} {city}: {temp}°C, {desc_trans} {emoji}"
|
| 163 |
except Exception as e:
|
| 164 |
return f"Error fetching weather for '{city}': {str(e)}"
|
| 165 |
|
|
@@ -188,4 +182,99 @@ prompt_templates = {
|
|
| 188 |
"final_answer('YOUR ANSWER HERE')\n"
|
| 189 |
"```\n"
|
| 190 |
"Do NOT include 'thoughts', 'code', explanations, or invalid dates. "
|
| 191 |
-
"If the city is not found or
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
"air_quality": "Air quality",
|
| 69 |
"pm2_5": "Fine particles (PM2.5)",
|
| 70 |
"pm10": "Coarse particles (PM10)",
|
| 71 |
+
"co": "Carbon monoxide (CO)"
|
|
|
|
|
|
|
|
|
|
| 72 |
},
|
| 73 |
"ru": {
|
| 74 |
"aqi_desc": {1: "Хорошее", 2: "Удовлетворительное", 3: "Среднее", 4: "Плохое", 5: "Очень плохое"},
|
| 75 |
"air_quality": "Качество воздуха",
|
| 76 |
"pm2_5": "Мелкие частицы (PM2.5)",
|
| 77 |
"pm10": "Крупные частицы (PM10)",
|
| 78 |
+
"co": "Угарный газ (CO)"
|
|
|
|
|
|
|
|
|
|
| 79 |
}
|
| 80 |
}
|
| 81 |
lang = lang if lang in translations else "en"
|
|
|
|
| 86 |
f"😷 {t['air_quality']}: AQI {aqi} ({t['aqi_desc'].get(aqi, 'Unknown')}) {aqi_emoji}\n"
|
| 87 |
f"{t['pm2_5']}: {components['pm2_5']} µg/m³\n"
|
| 88 |
f"{t['pm10']}: {components['pm10']} µg/m³\n"
|
| 89 |
+
f"{t['co']}: {components['co']} µg/m³"
|
|
|
|
|
|
|
|
|
|
| 90 |
)
|
| 91 |
except Exception as e:
|
| 92 |
return f"Error fetching air quality for '{city}': {str(e)}"
|
|
|
|
| 112 |
|
| 113 |
data = response.json()
|
| 114 |
temp = data["main"]["temp"]
|
| 115 |
+
weather = data["weather"][0]["main"]
|
| 116 |
+
humidity = data["main"]["humidity"]
|
| 117 |
|
| 118 |
translations = {
|
| 119 |
"en": {
|
| 120 |
+
"weather": "Weather",
|
| 121 |
+
"temp": "Temperature",
|
| 122 |
+
"humidity": "Humidity",
|
| 123 |
+
"conditions": {
|
| 124 |
+
"Clear": "Clear ☀️",
|
| 125 |
+
"Clouds": "Cloudy ☁️",
|
| 126 |
+
"Rain": "Rain 🌧",
|
| 127 |
+
"Snow": "Snow ❄️",
|
| 128 |
+
"Thunderstorm": "Thunderstorm ⛈",
|
| 129 |
+
"Drizzle": "Drizzle 🌦",
|
| 130 |
+
"Mist": "Mist 🌫"
|
| 131 |
+
}
|
| 132 |
},
|
| 133 |
"ru": {
|
| 134 |
+
"weather": "Погода",
|
| 135 |
+
"temp": "Температура",
|
| 136 |
+
"humidity": "Влажность",
|
| 137 |
+
"conditions": {
|
| 138 |
+
"Clear": "Ясно ☀️",
|
| 139 |
+
"Clouds": "Облачно ☁️",
|
| 140 |
+
"Rain": "Дождь 🌧",
|
| 141 |
+
"Snow": "Снег ❄️",
|
| 142 |
+
"Thunderstorm": "Гроза ⛈",
|
| 143 |
+
"Drizzle": "Морось 🌦",
|
| 144 |
+
"Mist": "Туман 🌫"
|
| 145 |
+
}
|
| 146 |
}
|
| 147 |
}
|
| 148 |
lang = lang if lang in translations else "en"
|
| 149 |
t = translations[lang]
|
| 150 |
+
condition = t["conditions"].get(weather, weather)
|
| 151 |
|
| 152 |
+
return (
|
| 153 |
+
f"🌡️ {t['weather']}: {condition}\n"
|
| 154 |
+
f"{t['temp']}: {temp}°C\n"
|
| 155 |
+
f"{t['humidity']}: {humidity}%"
|
| 156 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 157 |
except Exception as e:
|
| 158 |
return f"Error fetching weather for '{city}': {str(e)}"
|
| 159 |
|
|
|
|
| 182 |
"final_answer('YOUR ANSWER HERE')\n"
|
| 183 |
"```\n"
|
| 184 |
"Do NOT include 'thoughts', 'code', explanations, or invalid dates. "
|
| 185 |
+
"If the city is not found or query is unclear, return an error via final_answer(). "
|
| 186 |
+
"NEVER generate code without ```py``` block or with invalid syntax."
|
| 187 |
+
),
|
| 188 |
+
"default": "Response: {{question}}",
|
| 189 |
+
"planning": {
|
| 190 |
+
"initial_plan": (
|
| 191 |
+
"Analyze query: {{question}}. If it contains a city, get time, air quality, and weather. "
|
| 192 |
+
"Return code:\n"
|
| 193 |
+
"```py\n"
|
| 194 |
+
"final_answer('YOUR ANSWER HERE')\n"
|
| 195 |
+
"```"
|
| 196 |
+
),
|
| 197 |
+
"update_plan_pre_messages": (
|
| 198 |
+
"Review query: {{question}}. Adjust plan. Return code:\n"
|
| 199 |
+
"```py\n"
|
| 200 |
+
"final_answer('YOUR ANSWER HERE')\n"
|
| 201 |
+
"```"
|
| 202 |
+
),
|
| 203 |
+
"update_plan_post_messages": (
|
| 204 |
+
"Review query: {{question}} and results. Adjust plan. Return code:\n"
|
| 205 |
+
"```py\n"
|
| 206 |
+
"final_answer('YOUR ANSWER HERE')\n"
|
| 207 |
+
"```"
|
| 208 |
+
),
|
| 209 |
+
},
|
| 210 |
+
"managed_agent": {
|
| 211 |
+
"execute": (
|
| 212 |
+
"Execute task: {{question}}. If it contains a city or phrases like 'сколько времени', use tools. "
|
| 213 |
+
"Return code:\n"
|
| 214 |
+
"```py\n"
|
| 215 |
+
"from langdetect import detect\n"
|
| 216 |
+
"query = '{{question}}'.strip()\n"
|
| 217 |
+
"city = query.split(' в ')[-1].strip().title() if ' в ' in query else query.title()\n"
|
| 218 |
+
"lang = detect(query) if query else 'en'\n"
|
| 219 |
+
"timezone = get_timezone_by_city(city)\n"
|
| 220 |
+
"if timezone.startswith('Error'):\n"
|
| 221 |
+
" final_answer(timezone)\n"
|
| 222 |
+
"else:\n"
|
| 223 |
+
" time_result = get_current_time_in_timezone(timezone)\n"
|
| 224 |
+
" air_result = get_air_quality(city, lang)\n"
|
| 225 |
+
" weather_result = get_weather(city, lang)\n"
|
| 226 |
+
" final_answer(f'🕒 Время в {city}: {time_result}\\n' + air_result + '\\n' + weather_result)\n"
|
| 227 |
+
"```"
|
| 228 |
+
),
|
| 229 |
+
"report": (
|
| 230 |
+
"Summarize task: {{question}}. Return code:\n"
|
| 231 |
+
"```py\n"
|
| 232 |
+
"final_answer('YOUR ANSWER HERE')\n"
|
| 233 |
+
"```"
|
| 234 |
+
),
|
| 235 |
+
"task": (
|
| 236 |
+
"Define task: {{question}}. Return code:\n"
|
| 237 |
+
"```py\n"
|
| 238 |
+
"final_answer('YOUR TASK DEFINITION HERE')\n"
|
| 239 |
+
"```"
|
| 240 |
+
),
|
| 241 |
+
},
|
| 242 |
+
"final_answer": {
|
| 243 |
+
"pre_messages": (
|
| 244 |
+
"Prepare response for: {{question}}. Return code:\n"
|
| 245 |
+
"```py\n"
|
| 246 |
+
"final_answer('YOUR ANSWER HERE')\n"
|
| 247 |
+
"```"
|
| 248 |
+
),
|
| 249 |
+
"template": "Final response: {{answer}}",
|
| 250 |
+
"post_messages": (
|
| 251 |
+
"Review response for: {{question}}. Return code:\n"
|
| 252 |
+
"```py\n"
|
| 253 |
+
"final_answer('YOUR ANSWER HERE')\n"
|
| 254 |
+
"```"
|
| 255 |
+
),
|
| 256 |
+
},
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
agent = CodeAgent(
|
| 260 |
+
model=model,
|
| 261 |
+
tools=[final_answer, get_current_time_in_timezone, get_timezone_by_city, get_air_quality, get_weather],
|
| 262 |
+
max_steps=3,
|
| 263 |
+
verbosity_level=2,
|
| 264 |
+
prompt_templates=prompt_templates,
|
| 265 |
+
)
|
| 266 |
+
|
| 267 |
+
def process_input(user_input):
|
| 268 |
+
try:
|
| 269 |
+
response = agent.run(user_input)
|
| 270 |
+
return response if response else "Error: No response received from the agent."
|
| 271 |
+
except Exception as e:
|
| 272 |
+
return f"Error: {str(e)}"
|
| 273 |
+
|
| 274 |
+
gr.Interface(
|
| 275 |
+
fn=process_input,
|
| 276 |
+
inputs="text",
|
| 277 |
+
outputs="text",
|
| 278 |
+
title="Helpful Assistant",
|
| 279 |
+
description="Hello! What city or town are you from? I can tell you the time, air quality, weather, and more!"
|
| 280 |
+
).launch()
|