ArslanFOX commited on
Commit
38fc74a
·
verified ·
1 Parent(s): 53f202a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -54
app.py CHANGED
@@ -1,25 +1,26 @@
1
  import os
 
 
 
 
2
  import datetime
3
  import pytz
4
- import requests
5
- from dotenv import load_dotenv
6
- from langdetect import detect
7
  from geopy.geocoders import Nominatim
8
  from timezonefinder import TimezoneFinder
9
- import gradio as gr
10
- from smolagents import CodeAgent, HfApiModel, tool
11
-
12
- load_dotenv()
13
 
14
  @tool
15
  def get_timezone_by_city(city: str) -> str:
16
- """Get timezone for a city.
 
17
 
18
  Args:
19
  city (str): City name.
20
 
21
  Returns:
22
- str: Timezone or error message.
23
  """
24
  try:
25
  geolocator = Nominatim(user_agent="smolagents_bot")
@@ -27,20 +28,21 @@ def get_timezone_by_city(city: str) -> str:
27
  if not location:
28
  return f"❌ Город '{city}' не найден."
29
  tf = TimezoneFinder()
30
- tz = tf.timezone_at(lat=location.latitude, lng=location.longitude)
31
- return tz or f"❌ Часовой пояс не найден."
32
  except Exception as e:
33
- return f"❌ Ошибка пояса: {str(e)}"
34
 
35
  @tool
36
  def get_current_time_in_timezone(timezone: str) -> str:
37
- """Get local time for timezone.
 
38
 
39
  Args:
40
  timezone (str): Timezone name.
41
 
42
  Returns:
43
- str: Current time or error.
44
  """
45
  try:
46
  tz = pytz.timezone(timezone)
@@ -50,7 +52,8 @@ def get_current_time_in_timezone(timezone: str) -> str:
50
 
51
  @tool
52
  def get_air_quality(city: str, lang: str = "en") -> str:
53
- """Air quality with translation.
 
54
 
55
  Args:
56
  city (str): City name.
@@ -64,12 +67,14 @@ def get_air_quality(city: str, lang: str = "en") -> str:
64
  location = geolocator.geocode(city, language="en")
65
  if not location:
66
  return f"❌ Город '{city}' не найден."
 
67
  api_key = os.environ["OPENWEATHERMAP_API_KEY"]
68
- url = (
69
- f"http://api.openweathermap.org/data/2.5/air_pollution"
70
- f"?lat={location.latitude}&lon={location.longitude}&appid={api_key}"
71
- )
72
- data = requests.get(url).json()
 
73
  aqi = data["list"][0]["main"]["aqi"]
74
  c = data["list"][0]["components"]
75
 
@@ -79,23 +84,24 @@ def get_air_quality(city: str, lang: str = "en") -> str:
79
  "aqi_desc": {1: "Good", 2: "Fair", 3: "Moderate", 4: "Poor", 5: "Very Poor"},
80
  "pm2_5": "Fine particles (PM2.5)",
81
  "pm10": "Coarse particles (PM10)",
82
- "co": "Carbon monoxide (CO)",
83
  },
84
  "ru": {
85
  "title": "😷 Качество воздуха",
86
  "aqi_desc": {1: "Хорошее", 2: "Удовлетворительное", 3: "Среднее", 4: "Плохое", 5: "Очень плохое"},
87
  "pm2_5": "Мелкодисперсные частицы (PM2.5)",
88
  "pm10": "Крупнодисперсные частицы (PM10)",
89
- "co": "Угарный газ (CO)",
90
  },
91
  "hi": {
92
  "title": "😷 वायु गुणवत्ता",
93
  "aqi_desc": {1: "अच्छा", 2: "संतोषजनक", 3: "मध्यम", 4: "खराब", 5: "बहुत खराब"},
94
  "pm2_5": "सूक्ष्म कण (PM2.5)",
95
  "pm10": "मोटे कण (PM10)",
96
- "co": "कार्बन मोनोऑक्साइड (CO)",
97
  }
98
  }
 
99
  t = translations.get(lang, translations["en"])
100
  emoji = "🌱" if aqi <= 2 else "😷" if aqi <= 4 else "☣️"
101
 
@@ -106,11 +112,12 @@ def get_air_quality(city: str, lang: str = "en") -> str:
106
  f"{t['co']}: {c['co']} µg/m³"
107
  )
108
  except Exception as e:
109
- return f"❌ Ошибка воздуха: {str(e)}"
110
 
111
  @tool
112
  def get_weather(city: str, lang: str = "en") -> str:
113
- """Weather with translation.
 
114
 
115
  Args:
116
  city (str): City name.
@@ -124,14 +131,15 @@ def get_weather(city: str, lang: str = "en") -> str:
124
  location = geolocator.geocode(city, language="en")
125
  if not location:
126
  return f"❌ Город '{city}' не найден."
 
127
  api_key = os.environ["OPENWEATHERMAP_API_KEY"]
128
- url = (
129
- f"http://api.openweathermap.org/data/2.5/weather"
130
- f"?lat={location.latitude}&lon={location.longitude}"
131
- f"&appid={api_key}&units=metric"
132
- )
133
- data = requests.get(url).json()
134
- w = data["weather"][0]["main"]
135
  temp = data["main"]["temp"]
136
  humidity = data["main"]["humidity"]
137
 
@@ -142,8 +150,7 @@ def get_weather(city: str, lang: str = "en") -> str:
142
  "humidity": "Humidity",
143
  "conditions": {
144
  "Clear": "Clear ☀️", "Clouds": "Cloudy ☁️", "Rain": "Rain 🌧",
145
- "Snow": "Snow ❄️", "Thunderstorm": "Storm ⛈", "Drizzle": "Drizzle 🌦",
146
- "Mist": "Mist 🌫", "Haze": "Haze 🌫"
147
  }
148
  },
149
  "ru": {
@@ -152,8 +159,7 @@ def get_weather(city: str, lang: str = "en") -> str:
152
  "humidity": "Влажность",
153
  "conditions": {
154
  "Clear": "Ясно ☀️", "Clouds": "Облачно ☁️", "Rain": "Дождь 🌧",
155
- "Snow": "Снег ❄️", "Thunderstorm": "Гроза ⛈", "Drizzle": "Морось 🌦",
156
- "Mist": "Туман 🌫", "Haze": "Дымка 🌫"
157
  }
158
  },
159
  "hi": {
@@ -162,13 +168,13 @@ def get_weather(city: str, lang: str = "en") -> str:
162
  "humidity": "नमी",
163
  "conditions": {
164
  "Clear": "साफ ☀️", "Clouds": "बादल ☁️", "Rain": "बारिश 🌧",
165
- "Snow": "बर्फ ❄️", "Thunderstorm": "तूफान ⛈", "Drizzle": "बूंदाबांदी 🌦",
166
- "Mist": "कोहरा 🌫", "Haze": "धुंध 🌫"
167
  }
168
  }
169
  }
 
170
  t = translations.get(lang, translations["en"])
171
- desc = t["conditions"].get(w, w)
172
 
173
  return (
174
  f"{t['title']}: {desc}\n"
@@ -181,29 +187,29 @@ def get_weather(city: str, lang: str = "en") -> str:
181
  @tool
182
  def final_answer(answer: str) -> str:
183
  """
184
- Return the final answer string to the user.
185
 
186
  Args:
187
- answer (str): The final response to display.
188
 
189
  Returns:
190
- str: The same response passed in.
191
  """
192
  return answer
193
 
194
  model = HfApiModel(
195
  max_tokens=1000,
196
  temperature=0.5,
197
- model_id="mistralai/Mixtral-8x7B-Instruct-v0.1"
198
  )
199
 
200
  system_prompt = (
201
- "Ты помощник. Используй только функции: "
202
- "`get_timezone_by_city`, `get_current_time_in_timezone`, `get_air_quality`, "
203
- "`get_weather`, `final_answer`. Передавай `lang = variables['lang']`. "
204
- "Ответ в формате:\n"
205
  "```py\nfinal_answer('...')\n```<end_code>\n"
206
- "❌ Без пояснений, markdown, JSON."
207
  )
208
 
209
  prompt_templates = {
@@ -215,7 +221,7 @@ prompt_templates = {
215
  "task": "```py\nfinal_answer('Not implemented')\n```"
216
  },
217
  "planning": {
218
- "initial_plan": "```py\nfinal_answer('Plan')\n```",
219
  "update_plan_pre_messages": "```py\nfinal_answer('Plan updated')\n```",
220
  "update_plan_post_messages": "```py\nfinal_answer('Plan adjusted')\n```"
221
  },
@@ -231,7 +237,7 @@ agent = CodeAgent(
231
  tools=[get_timezone_by_city, get_current_time_in_timezone, get_air_quality, get_weather, final_answer],
232
  prompt_templates=prompt_templates,
233
  max_steps=3,
234
- verbosity_level=2
235
  )
236
 
237
  def process_input(user_input):
@@ -239,16 +245,15 @@ def process_input(user_input):
239
  lang = detect(user_input)
240
  lang = lang if lang in ["en", "ru", "hi"] else "en"
241
  agent.variables = {"lang": lang}
242
- return agent.run(user_input) or "❌ Агент не ответил."
243
  except Exception as e:
244
  return f"❌ Ошибка: {str(e)}"
245
 
246
-
247
  if __name__ == "__main__":
248
  gr.Interface(
249
  fn=process_input,
250
  inputs="text",
251
  outputs="text",
252
- title="🦊 Умный ассистент",
253
- description="Напиши город узнаешь время, погоду и качество воздуха"
254
  ).launch()
 
1
  import os
2
+ from dotenv import load_dotenv
3
+ load_dotenv()
4
+
5
+ from smolagents import CodeAgent, HfApiModel, tool
6
  import datetime
7
  import pytz
8
+ import gradio as gr
 
 
9
  from geopy.geocoders import Nominatim
10
  from timezonefinder import TimezoneFinder
11
+ import requests
12
+ from langdetect import detect
 
 
13
 
14
  @tool
15
  def get_timezone_by_city(city: str) -> str:
16
+ """
17
+ Get timezone for a city.
18
 
19
  Args:
20
  city (str): City name.
21
 
22
  Returns:
23
+ str: Timezone name or error.
24
  """
25
  try:
26
  geolocator = Nominatim(user_agent="smolagents_bot")
 
28
  if not location:
29
  return f"❌ Город '{city}' не найден."
30
  tf = TimezoneFinder()
31
+ timezone = tf.timezone_at(lat=location.latitude, lng=location.longitude)
32
+ return timezone or f"❌ Часовой пояс не определён."
33
  except Exception as e:
34
+ return f"❌ Ошибка определения пояса: {str(e)}"
35
 
36
  @tool
37
  def get_current_time_in_timezone(timezone: str) -> str:
38
+ """
39
+ Get current time in given timezone.
40
 
41
  Args:
42
  timezone (str): Timezone name.
43
 
44
  Returns:
45
+ str: Local time or error.
46
  """
47
  try:
48
  tz = pytz.timezone(timezone)
 
52
 
53
  @tool
54
  def get_air_quality(city: str, lang: str = "en") -> str:
55
+ """
56
+ Air quality in city with translations.
57
 
58
  Args:
59
  city (str): City name.
 
67
  location = geolocator.geocode(city, language="en")
68
  if not location:
69
  return f"❌ Город '{city}' не найден."
70
+
71
  api_key = os.environ["OPENWEATHERMAP_API_KEY"]
72
+ url = f"http://api.openweathermap.org/data/2.5/air_pollution?lat={location.latitude}&lon={location.longitude}&appid={api_key}"
73
+ response = requests.get(url)
74
+ if response.status_code != 200:
75
+ return f"❌ Ошибка API: {response.status_code}"
76
+
77
+ data = response.json()
78
  aqi = data["list"][0]["main"]["aqi"]
79
  c = data["list"][0]["components"]
80
 
 
84
  "aqi_desc": {1: "Good", 2: "Fair", 3: "Moderate", 4: "Poor", 5: "Very Poor"},
85
  "pm2_5": "Fine particles (PM2.5)",
86
  "pm10": "Coarse particles (PM10)",
87
+ "co": "Carbon monoxide (CO)"
88
  },
89
  "ru": {
90
  "title": "😷 Качество воздуха",
91
  "aqi_desc": {1: "Хорошее", 2: "Удовлетворительное", 3: "Среднее", 4: "Плохое", 5: "Очень плохое"},
92
  "pm2_5": "Мелкодисперсные частицы (PM2.5)",
93
  "pm10": "Крупнодисперсные частицы (PM10)",
94
+ "co": "Угарный газ (CO)"
95
  },
96
  "hi": {
97
  "title": "😷 वायु गुणवत्ता",
98
  "aqi_desc": {1: "अच्छा", 2: "संतोषजनक", 3: "मध्यम", 4: "खराब", 5: "बहुत खराब"},
99
  "pm2_5": "सूक्ष्म कण (PM2.5)",
100
  "pm10": "मोटे कण (PM10)",
101
+ "co": "कार्बन मोनोऑक्साइड (CO)"
102
  }
103
  }
104
+
105
  t = translations.get(lang, translations["en"])
106
  emoji = "🌱" if aqi <= 2 else "😷" if aqi <= 4 else "☣️"
107
 
 
112
  f"{t['co']}: {c['co']} µg/m³"
113
  )
114
  except Exception as e:
115
+ return f"❌ Ошибка качества воздуха: {str(e)}"
116
 
117
  @tool
118
  def get_weather(city: str, lang: str = "en") -> str:
119
+ """
120
+ Weather info for a city with translations.
121
 
122
  Args:
123
  city (str): City name.
 
131
  location = geolocator.geocode(city, language="en")
132
  if not location:
133
  return f"❌ Город '{city}' не найден."
134
+
135
  api_key = os.environ["OPENWEATHERMAP_API_KEY"]
136
+ url = f"http://api.openweathermap.org/data/2.5/weather?lat={location.latitude}&lon={location.longitude}&appid={api_key}&units=metric"
137
+ response = requests.get(url)
138
+ if response.status_code != 200:
139
+ return f"❌ Ошибка API: {response.status_code}"
140
+
141
+ data = response.json()
142
+ condition = data["weather"][0]["main"]
143
  temp = data["main"]["temp"]
144
  humidity = data["main"]["humidity"]
145
 
 
150
  "humidity": "Humidity",
151
  "conditions": {
152
  "Clear": "Clear ☀️", "Clouds": "Cloudy ☁️", "Rain": "Rain 🌧",
153
+ "Snow": "Snow ❄️", "Thunderstorm": "Storm ⛈", "Drizzle": "Drizzle 🌦", "Mist": "Mist 🌫", "Haze": "Haze 🌫"
 
154
  }
155
  },
156
  "ru": {
 
159
  "humidity": "Влажность",
160
  "conditions": {
161
  "Clear": "Ясно ☀️", "Clouds": "Облачно ☁️", "Rain": "Дождь 🌧",
162
+ "Snow": "Снег ❄️", "Thunderstorm": "Гроза ⛈", "Drizzle": "Морось 🌦", "Mist": "Туман 🌫", "Haze": "Дымка 🌫"
 
163
  }
164
  },
165
  "hi": {
 
168
  "humidity": "नमी",
169
  "conditions": {
170
  "Clear": "साफ ☀️", "Clouds": "बादल ☁️", "Rain": "बारिश 🌧",
171
+ "Snow": "बर्फ ❄️", "Thunderstorm": "तूफान ⛈", "Drizzle": "बूंदाबांदी 🌦", "Mist": "कोहरा 🌫", "Haze": "धुंध 🌫"
 
172
  }
173
  }
174
  }
175
+
176
  t = translations.get(lang, translations["en"])
177
+ desc = t["conditions"].get(condition, condition)
178
 
179
  return (
180
  f"{t['title']}: {desc}\n"
 
187
  @tool
188
  def final_answer(answer: str) -> str:
189
  """
190
+ Return final response.
191
 
192
  Args:
193
+ answer (str): The output.
194
 
195
  Returns:
196
+ str: Same as input.
197
  """
198
  return answer
199
 
200
  model = HfApiModel(
201
  max_tokens=1000,
202
  temperature=0.5,
203
+ model_id='mistralai/Mixtral-8x7B-Instruct-v0.1',
204
  )
205
 
206
  system_prompt = (
207
+ "Ты полезный ассистент. Используй только функции: "
208
+ "`get_timezone_by_city`, `get_current_time_in_timezone`, `get_air_quality`, `get_weather`, `final_answer`. "
209
+ "В начале всегда указывай: `lang = variables['lang']` и передавай его в функции. "
210
+ "Ответ должен быть только на языке пользователя. Возвращай только код внутри блока:\n"
211
  "```py\nfinal_answer('...')\n```<end_code>\n"
212
+ "❌ Никаких пояснений, комментариев, JSON, markdown, описаний вне кода."
213
  )
214
 
215
  prompt_templates = {
 
221
  "task": "```py\nfinal_answer('Not implemented')\n```"
222
  },
223
  "planning": {
224
+ "initial_plan": "```py\nfinal_answer('Plan not needed')\n```",
225
  "update_plan_pre_messages": "```py\nfinal_answer('Plan updated')\n```",
226
  "update_plan_post_messages": "```py\nfinal_answer('Plan adjusted')\n```"
227
  },
 
237
  tools=[get_timezone_by_city, get_current_time_in_timezone, get_air_quality, get_weather, final_answer],
238
  prompt_templates=prompt_templates,
239
  max_steps=3,
240
+ verbosity_level=2,
241
  )
242
 
243
  def process_input(user_input):
 
245
  lang = detect(user_input)
246
  lang = lang if lang in ["en", "ru", "hi"] else "en"
247
  agent.variables = {"lang": lang}
248
+ return agent.run(user_input) or "❌ Нет ответа от агента."
249
  except Exception as e:
250
  return f"❌ Ошибка: {str(e)}"
251
 
 
252
  if __name__ == "__main__":
253
  gr.Interface(
254
  fn=process_input,
255
  inputs="text",
256
  outputs="text",
257
+ title="🦊 Помощник по городу",
258
+ description="Напиши город, и я покажу тебе время, воздух и погоду"
259
  ).launch()