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()
|