MacKov commited on
Commit
a196080
·
verified ·
1 Parent(s): eeabc39

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -122
app.py CHANGED
@@ -1,34 +1,12 @@
1
- import os
2
- import gradio as gr
3
- import requests
4
- import pandas as pd
5
- from pathlib import Path
6
-
7
- from smolagents import (
8
- CodeAgent,
9
- InferenceClientModel,
10
- DuckDuckGoSearchTool,
11
- VisitWebpageTool,
12
- PythonInterpreterTool,
13
- tool
14
- )
15
-
16
- from pypdf import PdfReader
17
-
18
- # --- Constants ---
19
- DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
20
- MODEL_ID = "mistralai/Mixtral-8x7B-Instruct-v0.1" # ← бесплатная и стабильная модель
21
-
22
- # --- Advanced Agent ---
23
  class BasicAgent:
24
  def __init__(self):
25
- print("Инициализация агента с Mixtral-8x7B...")
26
 
27
  self.model = InferenceClientModel(
28
- model_id=MODEL_ID,
29
  token=os.getenv("HF_TOKEN"),
30
  temperature=0.05,
31
- max_tokens=768, # уменьшено для экономии лимита
32
  )
33
 
34
  tools = [
@@ -37,12 +15,15 @@ class BasicAgent:
37
  PythonInterpreterTool(),
38
  ]
39
 
 
40
  @tool
41
  def download_file(url: str) -> str:
42
  """
43
  Скачивает файл по URL.
 
44
  Args:
45
  url (str): URL файла
 
46
  Returns:
47
  str: Путь или ошибка
48
  """
@@ -57,7 +38,7 @@ class BasicAgent:
57
  with open(path, "wb") as f:
58
  for chunk in r.iter_content(8192):
59
  f.write(chunk)
60
- return f"Скачано: {path.absolute()}. Теперь используй read_pdf или read_excel для анализа."
61
  except Exception as e:
62
  return f"Ошибка скачивания: {str(e)}"
63
 
@@ -65,8 +46,10 @@ class BasicAgent:
65
  def read_pdf(path: str) -> str:
66
  """
67
  Читает PDF.
 
68
  Args:
69
  path (str): Путь
 
70
  Returns:
71
  str: Текст (до 4000 символов)
72
  """
@@ -81,9 +64,11 @@ class BasicAgent:
81
  def read_excel(path: str, sheet: str = None) -> str:
82
  """
83
  Читает Excel.
 
84
  Args:
85
  path (str): Путь
86
  sheet (str, optional): Лист
 
87
  Returns:
88
  str: Таблица или ошибка
89
  """
@@ -99,31 +84,27 @@ class BasicAgent:
99
  tools=tools,
100
  model=self.model,
101
  add_base_tools=True,
102
- max_steps=12, # уменьшено — меньше запросов к API
103
  )
104
  print("Агент готов!")
105
 
106
  def __call__(self, question: str) -> str:
107
  print(f"Вопрос: {question[:120]}...")
108
 
109
- # Обрезка длинных вопросов
110
- if len(question) > 2000:
111
- question = question[:2000] + "\n[Обрезано из-за длины. Отвечай кратко.]"
112
 
113
- # Хак для файлов/аудио/видео/attached
114
  q = question.lower()
115
  if any(k in q for k in [".mp3", "audio", "recording", "voice", "youtube.com", "video", "attached", "file", "excel", "pdf", "image", "jpg", "png"]):
116
- question += "\nЕсли в вопросе упоминается файл, URL или attached — ОБЯЗАТЕЛЬНО используй download_file, затем read_pdf или read_excel. Отвечай ТОЛЬКО по содержимому файла. НЕ ПРИДУМЫВАЙ числа, имена или данные."
117
 
118
- # Хак для шахмат
119
  if "chess" in q or "image" in q or ".jpg" in q or ".png" in q:
120
- question += "\nЕсли есть URL изображения — скачай и опиши позицию или ищи похожую. НЕ ПРИДУМЫВАЙ ход."
121
 
122
  try:
123
  result = self.agent.run(question)
124
  answer = str(result).strip()
125
 
126
- # Жёсткая очистка ответа
127
  prefixes = [
128
  "Final Answer", "Final answer", "Answer:", "The answer is",
129
  "So the final answer is", "```", "boxed{", "}", "[/INST]", "</s>",
@@ -138,9 +119,7 @@ class BasicAgent:
138
  answer = answer[1:-1].strip()
139
 
140
  answer = answer.strip()
141
-
142
- # Защита от длинных/придуманных ответов
143
- if len(answer) > 250 or "придум" in answer.lower() or answer.count(",") > 15:
144
  answer = answer[:150] + "..." if len(answer) > 150 else answer
145
 
146
  print(f"Ответ: {answer[:150]}...")
@@ -149,89 +128,7 @@ class BasicAgent:
149
  except Exception as e:
150
  err_str = str(e)
151
  if "402" in err_str or "Payment Required" in err_str:
152
- return "Лимит API исчерпан. Подожди 10–15 минут или используй модель Mixtral-8x7B."
153
  err = f"Ошибка: {err_str[:200]}"
154
  print(err)
155
- return err
156
-
157
- # --- run_and_submit_all (без изменений) ---
158
- def run_and_submit_all(profile: gr.OAuthProfile | None):
159
- space_id = os.getenv("SPACE_ID")
160
- if profile:
161
- username = profile.username
162
- print(f"Вход: {username}")
163
- else:
164
- return "Войдите в HF", None
165
-
166
- api_url = DEFAULT_API_URL
167
- questions_url = f"{api_url}/questions"
168
- submit_url = f"{api_url}/submit"
169
-
170
- try:
171
- agent = BasicAgent()
172
- except Exception as e:
173
- return f"Ошибка агента: {e}", None
174
-
175
- agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
176
-
177
- try:
178
- resp = requests.get(questions_url, timeout=15)
179
- resp.raise_for_status()
180
- questions = resp.json()
181
- if not questions:
182
- return "Вопросов нет", None
183
- print(f"Вопросов: {len(questions)}")
184
- except Exception as e:
185
- return f"Ошибка вопросов: {e}", None
186
-
187
- results = []
188
- payload = []
189
- for item in questions:
190
- tid = item.get("task_id")
191
- q = item.get("question")
192
- if not tid or not q:
193
- continue
194
- try:
195
- ans = agent(q)
196
- payload.append({"task_id": tid, "submitted_answer": ans})
197
- results.append({"Task ID": tid, "Question": q, "Answer": ans})
198
- except Exception as e:
199
- results.append({"Task ID": tid, "Question": q, "Answer": f"ERROR: {e}"})
200
-
201
- if not payload:
202
- return "Нет ответов", pd.DataFrame(results)
203
-
204
- data = {"username": username.strip(), "agent_code": agent_code, "answers": payload}
205
-
206
- try:
207
- resp = requests.post(submit_url, json=data, timeout=60)
208
- resp.raise_for_status()
209
- res = resp.json()
210
- status = (
211
- f"Успех!\n"
212
- f"Пользователь: {res.get('username')}\n"
213
- f"Балл: {res.get('score', 'N/A')}% "
214
- f"({res.get('correct_count', '?')}/{res.get('total_attempted', '?')})\n"
215
- f"{res.get('message', '')}"
216
- )
217
- return status, pd.DataFrame(results)
218
- except Exception as e:
219
- return f"Ошибка отправки: {e}", pd.DataFrame(results)
220
-
221
- # --- Gradio ---
222
- with gr.Blocks() as demo:
223
- gr.Markdown("# Агент для финального задания")
224
- gr.Markdown("""
225
- 1. Клонируй и дорабатывай.
226
- 2. Войди через кнопку.
227
- 3. Нажми кнопку — увидишь score.
228
- """)
229
- gr.LoginButton()
230
- btn = gr.Button("Запустить оценку и отправить")
231
- status = gr.Textbox(label="Результат", lines=6)
232
- table = gr.DataFrame(label="Ответы", wrap=True)
233
- btn.click(run_and_submit_all, outputs=[status, table])
234
-
235
- if __name__ == "__main__":
236
- print("Запуск...")
237
- demo.launch(debug=True, share=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  class BasicAgent:
2
  def __init__(self):
3
+ print("Инициализация агента...")
4
 
5
  self.model = InferenceClientModel(
6
+ model_id="mistralai/Mixtral-8x7B-Instruct-v0.1", # ← новая модель
7
  token=os.getenv("HF_TOKEN"),
8
  temperature=0.05,
9
+ max_tokens=768,
10
  )
11
 
12
  tools = [
 
15
  PythonInterpreterTool(),
16
  ]
17
 
18
+ # Скачивание файлов (без изменений, но работает)
19
  @tool
20
  def download_file(url: str) -> str:
21
  """
22
  Скачивает файл по URL.
23
+
24
  Args:
25
  url (str): URL файла
26
+
27
  Returns:
28
  str: Путь или ошибка
29
  """
 
38
  with open(path, "wb") as f:
39
  for chunk in r.iter_content(8192):
40
  f.write(chunk)
41
+ return f"Скачано: {path.absolute()}. Анализируй."
42
  except Exception as e:
43
  return f"Ошибка скачивания: {str(e)}"
44
 
 
46
  def read_pdf(path: str) -> str:
47
  """
48
  Читает PDF.
49
+
50
  Args:
51
  path (str): Путь
52
+
53
  Returns:
54
  str: Текст (до 4000 символов)
55
  """
 
64
  def read_excel(path: str, sheet: str = None) -> str:
65
  """
66
  Читает Excel.
67
+
68
  Args:
69
  path (str): Путь
70
  sheet (str, optional): Лист
71
+
72
  Returns:
73
  str: Таблица или ошибка
74
  """
 
84
  tools=tools,
85
  model=self.model,
86
  add_base_tools=True,
87
+ max_steps=15,
88
  )
89
  print("Агент готов!")
90
 
91
  def __call__(self, question: str) -> str:
92
  print(f"Вопрос: {question[:120]}...")
93
 
94
+ if len(question) > 2500:
95
+ question = question[:2500] + "\n[Обрезано из-за длины.]"
 
96
 
 
97
  q = question.lower()
98
  if any(k in q for k in [".mp3", "audio", "recording", "voice", "youtube.com", "video", "attached", "file", "excel", "pdf", "image", "jpg", "png"]):
99
+ question += "\nЕсли есть URL или attached файл обязательно используй download_file, затем read_pdf или read_excel. Отвечай только по фактам из файла. Не придумывай."
100
 
 
101
  if "chess" in q or "image" in q or ".jpg" in q or ".png" in q:
102
+ question += "\nЕсли есть URL изображения — скачай и опиши позицию или ищи похожую. Не придумывай ход."
103
 
104
  try:
105
  result = self.agent.run(question)
106
  answer = str(result).strip()
107
 
 
108
  prefixes = [
109
  "Final Answer", "Final answer", "Answer:", "The answer is",
110
  "So the final answer is", "```", "boxed{", "}", "[/INST]", "</s>",
 
119
  answer = answer[1:-1].strip()
120
 
121
  answer = answer.strip()
122
+ if len(answer) > 300 or "придум" in answer.lower():
 
 
123
  answer = answer[:150] + "..." if len(answer) > 150 else answer
124
 
125
  print(f"Ответ: {answer[:150]}...")
 
128
  except Exception as e:
129
  err_str = str(e)
130
  if "402" in err_str or "Payment Required" in err_str:
131
+ return "Лимит API исчерпан. Смени модель на Mixtral-8x7B или подожди."
132
  err = f"Ошибка: {err_str[:200]}"
133
  print(err)
134
+ return err