Anonumous commited on
Commit
2d440ee
·
1 Parent(s): 592be3d

Update code base and add ruff format

Browse files
README.md CHANGED
@@ -1,25 +1,14 @@
1
- ---
2
- title: DeathMath Leaderboard
3
- emoji: 🔢
4
- colorFrom: indigo
5
- colorTo: purple
6
- sdk: gradio
7
- sdk_version: "4.20.0"
8
- app_file: app.py
9
- pinned: false
10
- hf_oauth: true
11
- ---
12
- app_file: app.py
13
  # DeathMath Leaderboard
14
 
15
  DeathMath - это бенчмарк для оценки способности моделей решать сложные математические и физические задачи на русском языке.
16
 
17
  ## Текущий лидерборд
18
 
19
- Последнее обновление: 2025-04-20 16:33:11
20
 
21
  | Модель | Общий балл | Математика | Физика | Токены | Время оценки |
22
  |--------|------------|------------|---------|---------|--------------|
 
23
  | o3-mini-high | 0.601 | 0.847 | 0.355 | 2,455,126 | 4015.4s |
24
  | o4-mini-high | 0.591 | 0.863 | 0.318 | 1,898,964 | 4623.6s |
25
  | Gemini 2.5 Pro Preview | 0.586 | 0.800 | 0.373 | 1,394,299 | 4533.2s |
@@ -31,12 +20,8 @@ DeathMath - это бенчмарк для оценки способности
31
  | Gemma 3 12B | 0.298 | 0.442 | 0.155 | 441,055 | 3916.3s |
32
  | Qwen2.5 72B Instruct | 0.278 | 0.384 | 0.173 | 366,729 | 2460.1s |
33
  | gpt-4o | 0.262 | 0.405 | 0.118 | 468,809 | 1078.4s |
34
- | GigaChat-2-Max | 0.250 | 0.326 | 0.173 | 220,487 | 1006.2s |
35
- | GigaChat-2-Pro | 0.209 | 0.326 | 0.091 | 212,196 | 1002.6s |
36
- | GigaChat-Max | 0.139 | 0.179 | 0.100 | 201,090 | 978.8s |
37
  | DeepSeek V3 0324 | 0.132 | 0.174 | 0.091 | 359,162 | 4257.7s |
38
  | Gemma 3 4B | 0.124 | 0.221 | 0.027 | 572,095 | 1682.7s |
39
- | GigaChat-2 | 0.094 | 0.142 | 0.045 | 299,747 | 834.7s |
40
 
41
  ## Как принять участие в бенчмарке
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  # DeathMath Leaderboard
2
 
3
  DeathMath - это бенчмарк для оценки способности моделей решать сложные математические и физические задачи на русском языке.
4
 
5
  ## Текущий лидерборд
6
 
7
+ Последнее обновление: 2025-04-20 20:46:25
8
 
9
  | Модель | Общий балл | Математика | Физика | Токены | Время оценки |
10
  |--------|------------|------------|---------|---------|--------------|
11
+ | o3 | 0.621 | 0.868 | 0.373 | 1,251,746 | 4609.1s |
12
  | o3-mini-high | 0.601 | 0.847 | 0.355 | 2,455,126 | 4015.4s |
13
  | o4-mini-high | 0.591 | 0.863 | 0.318 | 1,898,964 | 4623.6s |
14
  | Gemini 2.5 Pro Preview | 0.586 | 0.800 | 0.373 | 1,394,299 | 4533.2s |
 
20
  | Gemma 3 12B | 0.298 | 0.442 | 0.155 | 441,055 | 3916.3s |
21
  | Qwen2.5 72B Instruct | 0.278 | 0.384 | 0.173 | 366,729 | 2460.1s |
22
  | gpt-4o | 0.262 | 0.405 | 0.118 | 468,809 | 1078.4s |
 
 
 
23
  | DeepSeek V3 0324 | 0.132 | 0.174 | 0.091 | 359,162 | 4257.7s |
24
  | Gemma 3 4B | 0.124 | 0.221 | 0.027 | 572,095 | 1682.7s |
 
25
 
26
  ## Как принять участие в бенчмарке
27
 
app.py CHANGED
@@ -1,7 +1,8 @@
1
  import logging
2
  import os
 
3
  os.makedirs("tmp", exist_ok=True)
4
- os.environ['TMP_DIR'] = "tmp"
5
  import subprocess
6
  import shutil
7
  import glob
@@ -14,6 +15,7 @@ from gradio_space_ci import enable_space_ci
14
  import json
15
  from io import BytesIO
16
 
 
17
  def handle_file_upload(file):
18
  file_path = file.name.split("/")[-1] if "/" in file.name else file.name
19
  logging.info("File uploaded: %s", file_path)
@@ -21,29 +23,30 @@ def handle_file_upload(file):
21
  v = json.load(f)
22
  return v, file_path
23
 
 
24
  def submit_file(v, file_path, mn, profile: gr.OAuthProfile | None):
25
  """
26
  Обрабатывает загрузку файлов с результатами пользовательских моделей
27
-
28
  Args:
29
  v: Загруженные данные результатов из JSON
30
  file_path: Путь к загруженному файлу
31
  mn: Имя модели, указанное пользователем
32
  profile: Профиль пользователя HuggingFace
33
-
34
  Returns:
35
  str: Сообщение об успехе или ошибке
36
  """
37
  if profile is None:
38
  return "Hub Login Required: Войдите в HuggingFace, чтобы загрузить результаты"
39
-
40
  try:
41
  # Проверяем наличие обязательных полей
42
  required_fields = ["score", "math_score", "physics_score"]
43
  for field in required_fields:
44
  if field not in v:
45
  return f"Error: Отсутствует обязательное поле '{field}' в JSON файле"
46
-
47
  # Создаем новый объект для сохранения в базе данных
48
  new_file = {
49
  "model_name": profile.username + "/" + mn,
@@ -52,22 +55,24 @@ def submit_file(v, file_path, mn, profile: gr.OAuthProfile | None):
52
  "physics_score": float(v["physics_score"]),
53
  "total_tokens": int(v.get("total_tokens", 0)),
54
  "evaluation_time": float(v.get("evaluation_time", 0.0)),
55
- "system_prompt": v.get("system_prompt", "Вы - полезный помощник по математике и физике. Ответьте на русском языке.")
 
 
56
  }
57
-
58
  # Проверка значений на корректность
59
- if not (0 <= new_file["score"] <= 1 and
60
- 0 <= new_file["math_score"] <= 1 and
61
- 0 <= new_file["physics_score"] <= 1):
62
  return "Error: Все значения оценок должны быть в диапазоне от 0 до 1"
63
-
64
  # Создаем уникальное имя файла на основе username и имени модели
65
  safe_filename = profile.username + "_" + mn.replace("/", "_").replace(" ", "_") + ".json"
66
-
67
  # Создаем JSON в памяти и загружаем его в репозиторий
68
  buf = BytesIO()
69
- buf.write(json.dumps(new_file, ensure_ascii=False).encode('utf-8'))
70
-
71
  # Загружаем файл в репозиторий
72
  API.upload_file(
73
  path_or_fileobj=buf,
@@ -75,24 +80,21 @@ def submit_file(v, file_path, mn, profile: gr.OAuthProfile | None):
75
  repo_id="Vikhrmodels/DeathMath-leaderboard-data",
76
  repo_type="dataset",
77
  )
78
-
79
  # Устанавливаем флаг для обновления лидерборда
80
  os.environ[RESET_JUDGEMENT_ENV] = "1"
81
-
82
  # Логируем успешную загрузку
83
  logging.info(f"Successfully uploaded model results: {new_file['model_name']}")
84
-
85
  return f"Success! Результаты модели '{mn}' успешно отправлены в лидерборд DeathMath."
86
-
87
  except Exception as e:
88
  logging.error(f"Error submitting file: {e}")
89
  return f"Error: Произошла ошибка при отправке файла: {str(e)}"
90
 
91
- from src.display.about import (
92
- INTRODUCTION_TEXT,
93
- TITLE,
94
- LLM_BENCHMARKS_TEXT
95
- )
96
  from src.display.css_html_js import custom_css
97
  from src.display.utils import (
98
  AutoEvalColumn,
@@ -113,33 +115,36 @@ enable_space_ci()
113
 
114
  # download_openbench()
115
 
 
116
  def restart_space():
117
  API.restart_space(repo_id=REPO_ID)
118
  download_openbench()
119
 
 
120
  def update_plot(selected_models):
121
  return create_plot(selected_models)
122
 
 
123
  def build_demo():
124
  """
125
  Строит интерфейс лидерборда DeathMath
126
  """
127
  # Загружаем данные для лидерборда
128
  download_openbench()
129
-
130
  # Создаем интерфейс с настройками темы
131
  demo = gr.Blocks(
132
- title="DeathMath Leaderboard",
133
  css=custom_css,
134
  theme=gr.themes.Default(
135
  primary_hue="indigo",
136
  secondary_hue="purple",
137
- )
138
  )
139
-
140
  # Получаем данные для лидерборда
141
  leaderboard_df = build_leadearboard_df()
142
-
143
  # Строим интерфейс
144
  with demo:
145
  # Заголовок и введение
@@ -151,7 +156,7 @@ def build_demo():
151
  # Вкладка лидерборда
152
  with gr.TabItem("🏅 Лидерборд", elem_id="llm-benchmark-tab-table", id=0):
153
  gr.Markdown("### Таблица результатов моделей DeathMath")
154
-
155
  # Таблица с результатами
156
  Leaderboard(
157
  value=leaderboard_df,
@@ -170,33 +175,25 @@ def build_demo():
170
  with gr.TabItem("🚀 Отправить результаты", elem_id="submit-tab", id=1):
171
  with gr.Row():
172
  gr.Markdown(LLM_BENCHMARKS_TEXT, elem_classes="markdown-text")
173
-
174
  with gr.Column():
175
  model_name_textbox = gr.Textbox(label="Название модели")
176
  file_output = gr.File(label="Перетащите JSON файл с результатами сюда", type="filepath")
177
  uploaded_file = gr.State()
178
  file_path = gr.State()
179
-
180
  with gr.Row():
181
  with gr.Column():
182
  out = gr.Textbox("Здесь будет показан статус отправки")
183
  with gr.Column():
184
  login_button = gr.LoginButton(elem_id="oauth-button")
185
-
186
- submit_button = gr.Button("Отправить результаты", elem_id="submit_button", variant='primary')
187
-
188
  # Обработчики событий
189
- file_output.upload(
190
- handle_file_upload,
191
- file_output,
192
- [uploaded_file, file_path]
193
- )
194
 
195
- submit_button.click(
196
- submit_file,
197
- [uploaded_file, file_path, model_name_textbox],
198
- [out]
199
- )
200
 
201
  # Вкладка с аналитикой
202
  with gr.TabItem("📊 Аналитика", elem_id="analytics-tab", id=2):
@@ -205,9 +202,11 @@ def build_demo():
205
  model_dropdown = gr.Dropdown(
206
  choices=leaderboard_df["model"].tolist(),
207
  label="Модели",
208
- value=leaderboard_df["model"].tolist()[:5] if len(leaderboard_df) >= 5 else leaderboard_df["model"].tolist(),
 
 
209
  multiselect=True,
210
- info="Выберите модели для сравнения"
211
  )
212
  else:
213
  model_dropdown = gr.Dropdown(
@@ -215,31 +214,24 @@ def build_demo():
215
  label="Модели",
216
  value=["example/model-1", "example/model-2"],
217
  multiselect=True,
218
- info="Выберите модели для сравнения"
219
  )
220
-
221
  # Вкладки для разных типов визуализации
222
  with gr.Tabs():
223
  with gr.TabItem("Столбчатая диаграмма"):
224
  bar_plot = gr.Plot(create_plot(model_dropdown.value))
225
-
226
  with gr.TabItem("Радарная диаграмма"):
227
  from src.radial.radial import create_radar_plot
 
228
  radar_plot = gr.Plot(create_radar_plot(model_dropdown.value))
229
-
230
  # Обновление графиков при изменении выбранных моделей
231
- model_dropdown.change(
232
- fn=create_plot,
233
- inputs=[model_dropdown],
234
- outputs=[bar_plot]
235
- )
236
-
237
- model_dropdown.change(
238
- fn=create_radar_plot,
239
- inputs=[model_dropdown],
240
- outputs=[radar_plot]
241
- )
242
-
243
  return demo
244
 
245
 
@@ -252,58 +244,62 @@ def update_board():
252
  logging.info("Updating the leaderboard: %s", need_reset)
253
  if need_reset != "1":
254
  return
255
-
256
  os.environ[RESET_JUDGEMENT_ENV] = "0"
257
-
258
  try:
259
  # Загружаем актуальные данные из репозитория
260
  download_dataset("Vikhrmodels/DeathMath-leaderboard-data", "m_data")
261
  logging.info("Successfully downloaded model evaluation data")
262
-
263
  # Собираем данные из всех файлов моделей
264
  data_list = []
265
  seen_models = set() # Для отслеживания дубликатов
266
-
267
  for file in glob.glob("./m_data/model_data/external/*.json"):
268
  try:
269
  with open(file) as f:
270
  data = json.load(f)
271
-
272
  # Проверяем наличие необходимых полей
273
  model_name = data.get("model_name", "")
274
  if not model_name:
275
  logging.error(f"Failed to parse {file}: 'model_name' not found")
276
  continue
277
-
278
  # Предотвращаем дублирование моделей
279
  model_base_name = model_name.split("/")[-1].split("_v")[0]
280
  if model_base_name in seen_models:
281
  logging.info(f"Skipping duplicate model: {model_name}")
282
  continue
283
-
284
  seen_models.add(model_base_name)
285
-
286
  # Добавляем модель в список
287
- data_list.append({
288
- "model_name": model_name,
289
- "score": float(data.get("score", 0.0)),
290
- "math_score": float(data.get("math_score", 0.0)),
291
- "physics_score": float(data.get("physics_score", 0.0)),
292
- "total_tokens": int(data.get("total_tokens", 0)),
293
- "evaluation_time": float(data.get("evaluation_time", 0.0)),
294
- "system_prompt": data.get("system_prompt",
295
- "Вы - полезный помощник по математике и физике. Ответьте на русском языке.")
296
- })
297
-
 
 
 
 
298
  except Exception as e:
299
  logging.error(f"Failed to process file {file}: {e}")
300
  continue
301
-
302
  # Если есть данные, сортируем их по общему баллу и сохраняем
303
  if data_list:
304
  # Сортируем по общему баллу
305
  data_list.sort(key=lambda x: x["score"], reverse=True)
306
-
307
  # Сохраняем обновленный лидерборд
308
  with open("genned.json", "w", encoding="utf-8") as f:
309
  json.dump(data_list, f, ensure_ascii=False, indent=2)
@@ -316,10 +312,10 @@ def update_board():
316
  repo_type="dataset",
317
  )
318
  logging.info(f"Updated leaderboard with {len(data_list)} models")
319
-
320
  # Генерируем README с таблицей лидерборда
321
  update_readme(data_list)
322
-
323
  except Exception as e:
324
  logging.error(f"Error updating leaderboard: {e}")
325
 
@@ -331,24 +327,24 @@ def update_readme(data_list):
331
  try:
332
  import pandas as pd
333
  from datetime import datetime
334
-
335
  # Создаем DataFrame для удобного форматирования таблицы
336
  df = pd.DataFrame(data_list)
337
-
338
  # Форматируем числовые колонки
339
  for col in ["score", "math_score", "physics_score"]:
340
  if col in df.columns:
341
  df[col] = df[col].apply(lambda x: f"{x:.3f}")
342
-
343
  if "total_tokens" in df.columns:
344
  df["total_tokens"] = df["total_tokens"].apply(lambda x: f"{int(x):,}")
345
-
346
  if "evaluation_time" in df.columns:
347
  df["evaluation_time"] = df["evaluation_time"].apply(lambda x: f"{x:.1f}s")
348
-
349
  # Создаем содержимое README
350
  current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
351
-
352
  readme_content = f"""---
353
  title: DeathMath Leaderboard
354
  emoji: 🔢
@@ -416,9 +412,9 @@ DeathMath - это бенчмарк для оценки способности
416
  repo_id="Vikhrmodels/DeathMath-leaderboard-metainfo",
417
  repo_type="dataset",
418
  )
419
-
420
  logging.info("Updated README with leaderboard table")
421
-
422
  except Exception as e:
423
  logging.error(f"Failed to update README: {e}")
424
 
@@ -438,13 +434,14 @@ def update_board_():
438
  logging.info(f"Removed old file: {old_file}")
439
  except Exception as e:
440
  logging.error(f"Error removing old file {old_file}: {e}")
441
-
442
  # Вызываем основную функцию обновления
443
  update_board()
444
-
445
  except Exception as e:
446
  logging.error(f"Error in update_board_(): {e}")
447
 
 
448
  if __name__ == "__main__":
449
  os.environ[RESET_JUDGEMENT_ENV] = "1"
450
 
 
1
  import logging
2
  import os
3
+
4
  os.makedirs("tmp", exist_ok=True)
5
+ os.environ["TMP_DIR"] = "tmp"
6
  import subprocess
7
  import shutil
8
  import glob
 
15
  import json
16
  from io import BytesIO
17
 
18
+
19
  def handle_file_upload(file):
20
  file_path = file.name.split("/")[-1] if "/" in file.name else file.name
21
  logging.info("File uploaded: %s", file_path)
 
23
  v = json.load(f)
24
  return v, file_path
25
 
26
+
27
  def submit_file(v, file_path, mn, profile: gr.OAuthProfile | None):
28
  """
29
  Обрабатывает загрузку файлов с результатами пользовательских моделей
30
+
31
  Args:
32
  v: Загруженные данные результатов из JSON
33
  file_path: Путь к загруженному файлу
34
  mn: Имя модели, указанное пользователем
35
  profile: Профиль пользователя HuggingFace
36
+
37
  Returns:
38
  str: Сообщение об успехе или ошибке
39
  """
40
  if profile is None:
41
  return "Hub Login Required: Войдите в HuggingFace, чтобы загрузить результаты"
42
+
43
  try:
44
  # Проверяем наличие обязательных полей
45
  required_fields = ["score", "math_score", "physics_score"]
46
  for field in required_fields:
47
  if field not in v:
48
  return f"Error: Отсутствует обязательное поле '{field}' в JSON файле"
49
+
50
  # Создаем новый объект для сохранения в базе данных
51
  new_file = {
52
  "model_name": profile.username + "/" + mn,
 
55
  "physics_score": float(v["physics_score"]),
56
  "total_tokens": int(v.get("total_tokens", 0)),
57
  "evaluation_time": float(v.get("evaluation_time", 0.0)),
58
+ "system_prompt": v.get(
59
+ "system_prompt", "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
60
+ ),
61
  }
62
+
63
  # Проверка значений на корректность
64
+ if not (
65
+ 0 <= new_file["score"] <= 1 and 0 <= new_file["math_score"] <= 1 and 0 <= new_file["physics_score"] <= 1
66
+ ):
67
  return "Error: Все значения оценок должны быть в диапазоне от 0 до 1"
68
+
69
  # Создаем уникальное имя файла на основе username и имени модели
70
  safe_filename = profile.username + "_" + mn.replace("/", "_").replace(" ", "_") + ".json"
71
+
72
  # Создаем JSON в памяти и загружаем его в репозиторий
73
  buf = BytesIO()
74
+ buf.write(json.dumps(new_file, ensure_ascii=False).encode("utf-8"))
75
+
76
  # Загружаем файл в репозиторий
77
  API.upload_file(
78
  path_or_fileobj=buf,
 
80
  repo_id="Vikhrmodels/DeathMath-leaderboard-data",
81
  repo_type="dataset",
82
  )
83
+
84
  # Устанавливаем флаг для обновления лидерборда
85
  os.environ[RESET_JUDGEMENT_ENV] = "1"
86
+
87
  # Логируем успешную загрузку
88
  logging.info(f"Successfully uploaded model results: {new_file['model_name']}")
89
+
90
  return f"Success! Результаты модели '{mn}' успешно отправлены в лидерборд DeathMath."
91
+
92
  except Exception as e:
93
  logging.error(f"Error submitting file: {e}")
94
  return f"Error: Произошла ошибка при отправке файла: {str(e)}"
95
 
96
+
97
+ from src.display.about import INTRODUCTION_TEXT, TITLE, LLM_BENCHMARKS_TEXT
 
 
 
98
  from src.display.css_html_js import custom_css
99
  from src.display.utils import (
100
  AutoEvalColumn,
 
115
 
116
  # download_openbench()
117
 
118
+
119
  def restart_space():
120
  API.restart_space(repo_id=REPO_ID)
121
  download_openbench()
122
 
123
+
124
  def update_plot(selected_models):
125
  return create_plot(selected_models)
126
 
127
+
128
  def build_demo():
129
  """
130
  Строит интерфейс лидерборда DeathMath
131
  """
132
  # Загружаем данные для лидерборда
133
  download_openbench()
134
+
135
  # Создаем интерфейс с настройками темы
136
  demo = gr.Blocks(
137
+ title="DeathMath Leaderboard",
138
  css=custom_css,
139
  theme=gr.themes.Default(
140
  primary_hue="indigo",
141
  secondary_hue="purple",
142
+ ),
143
  )
144
+
145
  # Получаем данные для лидерборда
146
  leaderboard_df = build_leadearboard_df()
147
+
148
  # Строим интерфейс
149
  with demo:
150
  # Заголовок и введение
 
156
  # Вкладка лидерборда
157
  with gr.TabItem("🏅 Лидерборд", elem_id="llm-benchmark-tab-table", id=0):
158
  gr.Markdown("### Таблица результатов моделей DeathMath")
159
+
160
  # Таблица с результатами
161
  Leaderboard(
162
  value=leaderboard_df,
 
175
  with gr.TabItem("🚀 Отправить результаты", elem_id="submit-tab", id=1):
176
  with gr.Row():
177
  gr.Markdown(LLM_BENCHMARKS_TEXT, elem_classes="markdown-text")
178
+
179
  with gr.Column():
180
  model_name_textbox = gr.Textbox(label="Название модели")
181
  file_output = gr.File(label="Перетащите JSON файл с результатами сюда", type="filepath")
182
  uploaded_file = gr.State()
183
  file_path = gr.State()
184
+
185
  with gr.Row():
186
  with gr.Column():
187
  out = gr.Textbox("Здесь будет показан статус отправки")
188
  with gr.Column():
189
  login_button = gr.LoginButton(elem_id="oauth-button")
190
+
191
+ submit_button = gr.Button("Отправить результаты", elem_id="submit_button", variant="primary")
192
+
193
  # Обработчики событий
194
+ file_output.upload(handle_file_upload, file_output, [uploaded_file, file_path])
 
 
 
 
195
 
196
+ submit_button.click(submit_file, [uploaded_file, file_path, model_name_textbox], [out])
 
 
 
 
197
 
198
  # Вкладка с аналитикой
199
  with gr.TabItem("📊 Аналитика", elem_id="analytics-tab", id=2):
 
202
  model_dropdown = gr.Dropdown(
203
  choices=leaderboard_df["model"].tolist(),
204
  label="Модели",
205
+ value=leaderboard_df["model"].tolist()[:5]
206
+ if len(leaderboard_df) >= 5
207
+ else leaderboard_df["model"].tolist(),
208
  multiselect=True,
209
+ info="Выберите модели для сравнения",
210
  )
211
  else:
212
  model_dropdown = gr.Dropdown(
 
214
  label="Модели",
215
  value=["example/model-1", "example/model-2"],
216
  multiselect=True,
217
+ info="Выберите модели для сравнения",
218
  )
219
+
220
  # Вкладки для разных типов визуализации
221
  with gr.Tabs():
222
  with gr.TabItem("Столбчатая диаграмма"):
223
  bar_plot = gr.Plot(create_plot(model_dropdown.value))
224
+
225
  with gr.TabItem("Радарная диаграмма"):
226
  from src.radial.radial import create_radar_plot
227
+
228
  radar_plot = gr.Plot(create_radar_plot(model_dropdown.value))
229
+
230
  # Обновление графиков при изменении выбранных моделей
231
+ model_dropdown.change(fn=create_plot, inputs=[model_dropdown], outputs=[bar_plot])
232
+
233
+ model_dropdown.change(fn=create_radar_plot, inputs=[model_dropdown], outputs=[radar_plot])
234
+
 
 
 
 
 
 
 
 
235
  return demo
236
 
237
 
 
244
  logging.info("Updating the leaderboard: %s", need_reset)
245
  if need_reset != "1":
246
  return
247
+
248
  os.environ[RESET_JUDGEMENT_ENV] = "0"
249
+
250
  try:
251
  # Загружаем актуальные данные из репозитория
252
  download_dataset("Vikhrmodels/DeathMath-leaderboard-data", "m_data")
253
  logging.info("Successfully downloaded model evaluation data")
254
+
255
  # Собираем данные из всех файлов моделей
256
  data_list = []
257
  seen_models = set() # Для отслеживания дубликатов
258
+
259
  for file in glob.glob("./m_data/model_data/external/*.json"):
260
  try:
261
  with open(file) as f:
262
  data = json.load(f)
263
+
264
  # Проверяем наличие необходимых полей
265
  model_name = data.get("model_name", "")
266
  if not model_name:
267
  logging.error(f"Failed to parse {file}: 'model_name' not found")
268
  continue
269
+
270
  # Предотвращаем дублирование моделей
271
  model_base_name = model_name.split("/")[-1].split("_v")[0]
272
  if model_base_name in seen_models:
273
  logging.info(f"Skipping duplicate model: {model_name}")
274
  continue
275
+
276
  seen_models.add(model_base_name)
277
+
278
  # Добавляем модель в список
279
+ data_list.append(
280
+ {
281
+ "model_name": model_name,
282
+ "score": float(data.get("score", 0.0)),
283
+ "math_score": float(data.get("math_score", 0.0)),
284
+ "physics_score": float(data.get("physics_score", 0.0)),
285
+ "total_tokens": int(data.get("total_tokens", 0)),
286
+ "evaluation_time": float(data.get("evaluation_time", 0.0)),
287
+ "system_prompt": data.get(
288
+ "system_prompt",
289
+ "Вы - полезный помощник по математике и физике. Ответьте на русском языке.",
290
+ ),
291
+ }
292
+ )
293
+
294
  except Exception as e:
295
  logging.error(f"Failed to process file {file}: {e}")
296
  continue
297
+
298
  # Если есть данные, сортируем их по общему баллу и сохраняем
299
  if data_list:
300
  # Сортируем по общему баллу
301
  data_list.sort(key=lambda x: x["score"], reverse=True)
302
+
303
  # Сохраняем обновленный лидерборд
304
  with open("genned.json", "w", encoding="utf-8") as f:
305
  json.dump(data_list, f, ensure_ascii=False, indent=2)
 
312
  repo_type="dataset",
313
  )
314
  logging.info(f"Updated leaderboard with {len(data_list)} models")
315
+
316
  # Генерируем README с таблицей лидерборда
317
  update_readme(data_list)
318
+
319
  except Exception as e:
320
  logging.error(f"Error updating leaderboard: {e}")
321
 
 
327
  try:
328
  import pandas as pd
329
  from datetime import datetime
330
+
331
  # Создаем DataFrame для удобного форматирования таблицы
332
  df = pd.DataFrame(data_list)
333
+
334
  # Форматируем числовые колонки
335
  for col in ["score", "math_score", "physics_score"]:
336
  if col in df.columns:
337
  df[col] = df[col].apply(lambda x: f"{x:.3f}")
338
+
339
  if "total_tokens" in df.columns:
340
  df["total_tokens"] = df["total_tokens"].apply(lambda x: f"{int(x):,}")
341
+
342
  if "evaluation_time" in df.columns:
343
  df["evaluation_time"] = df["evaluation_time"].apply(lambda x: f"{x:.1f}s")
344
+
345
  # Создаем содержимое README
346
  current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
347
+
348
  readme_content = f"""---
349
  title: DeathMath Leaderboard
350
  emoji: 🔢
 
412
  repo_id="Vikhrmodels/DeathMath-leaderboard-metainfo",
413
  repo_type="dataset",
414
  )
415
+
416
  logging.info("Updated README with leaderboard table")
417
+
418
  except Exception as e:
419
  logging.error(f"Failed to update README: {e}")
420
 
 
434
  logging.info(f"Removed old file: {old_file}")
435
  except Exception as e:
436
  logging.error(f"Error removing old file {old_file}: {e}")
437
+
438
  # Вызываем основную функцию обновления
439
  update_board()
440
+
441
  except Exception as e:
442
  logging.error(f"Error in update_board_(): {e}")
443
 
444
+
445
  if __name__ == "__main__":
446
  os.environ[RESET_JUDGEMENT_ENV] = "1"
447
 
generate_initial_leaderboard.py CHANGED
@@ -18,10 +18,7 @@ from datetime import datetime
18
  logging.basicConfig(
19
  level=logging.INFO,
20
  format="%(asctime)s - %(levelname)s - %(message)s",
21
- handlers=[
22
- logging.FileHandler("leaderboard_generation.log"),
23
- logging.StreamHandler()
24
- ]
25
  )
26
  logger = logging.getLogger(__name__)
27
 
@@ -29,15 +26,16 @@ logger = logging.getLogger(__name__)
29
  REPO_ID = "Vikhrmodels/DeathMath-leaderboard-data"
30
  METAINFO_REPO_ID = "Vikhrmodels/DeathMath-leaderboard-metainfo"
31
 
 
32
  def setup_repositories(token):
33
  """
34
  Создает необходимые репозитории на HuggingFace Hub, если они еще не существуют.
35
-
36
  Args:
37
  token (str): Токен для доступа к HuggingFace Hub
38
  """
39
  api = HfApi(token=token)
40
-
41
  try:
42
  # Проверка и создание репозитория для данных лидерборда
43
  try:
@@ -46,7 +44,7 @@ def setup_repositories(token):
46
  except Exception:
47
  logger.info(f"Создание репозитория для данных лидерборда: {REPO_ID}")
48
  create_repo(repo_id=REPO_ID, repo_type="dataset", token=token)
49
-
50
  # Проверка и создание репозитория для метаданных лидерборда
51
  try:
52
  api.repo_info(repo_id=METAINFO_REPO_ID, repo_type="dataset")
@@ -54,41 +52,42 @@ def setup_repositories(token):
54
  except Exception:
55
  logger.info(f"Создание репозитория для метаданных лидерборда: {METAINFO_REPO_ID}")
56
  create_repo(repo_id=METAINFO_REPO_ID, repo_type="dataset", token=token)
57
-
58
  return api
59
  except Exception as e:
60
  logger.error(f"Ошибка при создании репозиториев: {e}")
61
  raise
62
 
 
63
  def load_results(results_file):
64
  """
65
  Загружает результаты из JSON файла и удаляет дубликаты.
66
-
67
  Args:
68
  results_file (str): Путь к файлу с результатами
69
-
70
  Returns:
71
  list: Список записей для лидерборда без дубликатов
72
  """
73
  try:
74
  with open(results_file, "r", encoding="utf-8") as f:
75
  data = json.load(f)
76
-
77
  leaderboard_entries = []
78
  seen_models = set() # Множество для отслеживания уже обработанных моделей
79
-
80
  for key, value in data.items():
81
  if "_Combined_" in key: # берем только комбинированные результаты
82
  model_name = value["model_name"]
83
-
84
  # Пропускаем модель, если она уже была добавлена
85
  if model_name in seen_models:
86
  logger.info(f"Пропускаем дублирующуюся модель: {model_name}")
87
  continue
88
-
89
  # Добавляем модель во множество обработанных
90
  seen_models.add(model_name)
91
-
92
  leaderboard_entry = {
93
  "model_name": model_name,
94
  "score": value["score"],
@@ -96,113 +95,119 @@ def load_results(results_file):
96
  "physics_score": value["physics_score"],
97
  "total_tokens": value["total_tokens"],
98
  "evaluation_time": value["evaluation_time"],
99
- "system_prompt": value.get("system_prompt",
100
- "Вы - полезный помощник по математике и физике. Ответьте на русском языке.")
 
101
  }
102
  leaderboard_entries.append(leaderboard_entry)
103
-
104
  # Сортировка по общему баллу
105
  leaderboard_entries.sort(key=lambda x: x["score"], reverse=True)
106
  logger.info(f"Загружено {len(leaderboard_entries)} уникальных моделей после удаления дубликатов")
107
  return leaderboard_entries
108
-
109
  except Exception as e:
110
  logger.error(f"Ошибка при загрузке результатов: {e}")
111
  raise
112
 
 
113
  def prepare_directory_structure():
114
  """
115
  Создает необходимую структуру директорий для внешних моделей.
116
-
117
  Returns:
118
  str: Путь к временной директории с подготовленной структурой
119
  """
120
  temp_dir = Path("./temp_leaderboard")
121
  model_data_dir = temp_dir / "model_data" / "external"
122
-
123
  # Очистка и создание директорий
124
  if temp_dir.exists():
125
  import shutil
 
126
  shutil.rmtree(temp_dir)
127
-
128
  model_data_dir.mkdir(parents=True, exist_ok=True)
129
-
130
  return str(temp_dir)
131
 
 
132
  def upload_model_files(api, leaderboard_entries, temp_dir):
133
  """
134
  Загружает файлы моделей в репозиторий данных лидерборда.
135
-
136
  Args:
137
  api (HfApi): Экземпляр API для взаимодействия с HuggingFace
138
  leaderboard_entries (list): Список записей для лидерборда
139
  temp_dir (str): Путь к временной директории
140
  """
141
  model_data_dir = os.path.join(temp_dir, "model_data", "external")
142
-
143
  for entry in leaderboard_entries:
144
  model_name = entry["model_name"]
145
  safe_filename = model_name.replace("/", "_").replace(" ", "_")
146
  file_path = os.path.join(model_data_dir, f"{safe_filename}.json")
147
-
148
  with open(file_path, "w", encoding="utf-8") as f:
149
  json.dump(entry, f, ensure_ascii=False, indent=2)
150
-
151
  # Загрузка файла модели в репозиторий
152
  api.upload_file(
153
  path_or_fileobj=file_path,
154
  path_in_repo=f"model_data/external/{safe_filename}.json",
155
  repo_id=REPO_ID,
156
- repo_type="dataset"
157
  )
158
  logger.info(f"Загружен файл модели: {safe_filename}.json")
159
 
 
160
  def generate_leaderboard_json(leaderboard_entries):
161
  """
162
  Создает JSON файл с данными лидерборда.
163
-
164
  Args:
165
  leaderboard_entries (list): Список записей для лидерборда
166
-
167
  Returns:
168
  str: Путь к созданному JSON файлу
169
  """
170
  leaderboard_file = "leaderboard.json"
171
-
172
  with open(leaderboard_file, "w", encoding="utf-8") as f:
173
  json.dump(leaderboard_entries, f, ensure_ascii=False, indent=2)
174
-
175
  return leaderboard_file
176
 
 
177
  def generate_readme(leaderboard_entries):
178
  """
179
  Генерирует README.md с информацией о лидерборде.
180
-
181
  Args:
182
  leaderboard_entries (list): Список записей для лидерборда
183
-
184
  Returns:
185
  str: Путь к созданному README файлу
186
  """
187
  readme_file = "README.md"
188
-
189
  # Создаем DataFrame для удобного форматирования таблицы
190
  df = pd.DataFrame(leaderboard_entries)
191
-
192
  # Форматируем числовые колонки
193
  for col in ["score", "math_score", "physics_score"]:
194
  if col in df.columns:
195
  df[col] = df[col].apply(lambda x: f"{x:.3f}")
196
-
197
  if "total_tokens" in df.columns:
198
  df["total_tokens"] = df["total_tokens"].apply(lambda x: f"{int(x):,}")
199
-
200
  if "evaluation_time" in df.columns:
201
  df["evaluation_time"] = df["evaluation_time"].apply(lambda x: f"{x:.1f}s")
202
-
203
  # Создаем содержимое README
204
  current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
205
-
206
  readme_content = f"""# DeathMath Leaderboard
207
 
208
  DeathMath - это бенчмарк для оценки способности моделей решать сложные математические и физические задачи на русском языке.
@@ -249,13 +254,14 @@ DeathMath - это бенчмарк для оценки способности
249
 
250
  with open(readme_file, "w", encoding="utf-8") as f:
251
  f.write(readme_content)
252
-
253
  return readme_file
254
 
 
255
  def upload_leaderboard_files(api, leaderboard_file, readme_file):
256
  """
257
  Загружает файлы лидерборда в репозиторий метаданных.
258
-
259
  Args:
260
  api (HfApi): Экземпляр API для взаимодействия с HuggingFace
261
  leaderboard_file (str): Путь к JSON файлу лидерборда
@@ -263,67 +269,66 @@ def upload_leaderboard_files(api, leaderboard_file, readme_file):
263
  """
264
  # Загрузка JSON лидерборда
265
  api.upload_file(
266
- path_or_fileobj=leaderboard_file,
267
- path_in_repo="leaderboard.json",
268
- repo_id=METAINFO_REPO_ID,
269
- repo_type="dataset"
270
  )
271
  logger.info(f"Загружен файл лидерборда: leaderboard.json в {METAINFO_REPO_ID}")
272
-
273
  # Загрузка README
274
  api.upload_file(
275
- path_or_fileobj=readme_file,
276
- path_in_repo="README.md",
277
- repo_id=METAINFO_REPO_ID,
278
- repo_type="dataset"
279
  )
280
  logger.info(f"Загружен README: README.md в {METAINFO_REPO_ID}")
281
 
 
282
  def main():
283
  # Парсинг аргументов командной строки
284
  parser = argparse.ArgumentParser(description="Генерация первоначального лидерборда DeathMath")
285
- parser.add_argument("--results", default="../results/leaderboard_results.json",
286
- help="Путь к файлу с результатами (по умолчанию: ../results/leaderboard_results.json)")
 
 
 
287
  parser.add_argument("--token", required=True, help="Токен для доступа к HuggingFace Hub")
288
-
289
  args = parser.parse_args()
290
-
291
  try:
292
  logger.info("Начинаем генерацию лидерборда DeathMath")
293
-
294
  # Настраиваем репозитории
295
  api = setup_repositories(args.token)
296
  logger.info("Репозитории успешно настроены")
297
-
298
  # Загружаем результаты
299
  leaderboard_entries = load_results(args.results)
300
  logger.info(f"Загружено {len(leaderboard_entries)} записей для лидерборда")
301
-
302
  # Подготавливаем структуру директорий
303
  temp_dir = prepare_directory_structure()
304
  logger.info(f"Создана временная директория: {temp_dir}")
305
-
306
  # Загружаем файлы моделей
307
  upload_model_files(api, leaderboard_entries, temp_dir)
308
  logger.info("Файлы моделей успешно загружены")
309
-
310
  # Генерируем JSON лидерборда
311
  leaderboard_file = generate_leaderboard_json(leaderboard_entries)
312
  logger.info(f"Создан файл лидерборда: {leaderboard_file}")
313
-
314
  # Генерируем README
315
  readme_file = generate_readme(leaderboard_entries)
316
  logger.info(f"Создан README: {readme_file}")
317
-
318
  # Загружаем файлы лидерборда
319
  upload_leaderboard_files(api, leaderboard_file, readme_file)
320
  logger.info("Файлы лидерборда успешно загружены")
321
-
322
  logger.info("Генерация лидерборда успешно завершена!")
323
-
324
  except Exception as e:
325
  logger.error(f"Ошибка при генерации лидерборда: {e}")
326
  raise
327
 
 
328
  if __name__ == "__main__":
329
- main()
 
18
  logging.basicConfig(
19
  level=logging.INFO,
20
  format="%(asctime)s - %(levelname)s - %(message)s",
21
+ handlers=[logging.FileHandler("leaderboard_generation.log"), logging.StreamHandler()],
 
 
 
22
  )
23
  logger = logging.getLogger(__name__)
24
 
 
26
  REPO_ID = "Vikhrmodels/DeathMath-leaderboard-data"
27
  METAINFO_REPO_ID = "Vikhrmodels/DeathMath-leaderboard-metainfo"
28
 
29
+
30
  def setup_repositories(token):
31
  """
32
  Создает необходимые репозитории на HuggingFace Hub, если они еще не существуют.
33
+
34
  Args:
35
  token (str): Токен для доступа к HuggingFace Hub
36
  """
37
  api = HfApi(token=token)
38
+
39
  try:
40
  # Проверка и создание репозитория для данных лидерборда
41
  try:
 
44
  except Exception:
45
  logger.info(f"Создание репозитория для данных лидерборда: {REPO_ID}")
46
  create_repo(repo_id=REPO_ID, repo_type="dataset", token=token)
47
+
48
  # Проверка и создание репозитория для метаданных лидерборда
49
  try:
50
  api.repo_info(repo_id=METAINFO_REPO_ID, repo_type="dataset")
 
52
  except Exception:
53
  logger.info(f"Создание репозитория для метаданных лидерборда: {METAINFO_REPO_ID}")
54
  create_repo(repo_id=METAINFO_REPO_ID, repo_type="dataset", token=token)
55
+
56
  return api
57
  except Exception as e:
58
  logger.error(f"Ошибка при создании репозиториев: {e}")
59
  raise
60
 
61
+
62
  def load_results(results_file):
63
  """
64
  Загружает результаты из JSON файла и удаляет дубликаты.
65
+
66
  Args:
67
  results_file (str): Путь к файлу с результатами
68
+
69
  Returns:
70
  list: Список записей для лидерборда без дубликатов
71
  """
72
  try:
73
  with open(results_file, "r", encoding="utf-8") as f:
74
  data = json.load(f)
75
+
76
  leaderboard_entries = []
77
  seen_models = set() # Множество для отслеживания уже обработанных моделей
78
+
79
  for key, value in data.items():
80
  if "_Combined_" in key: # берем только комбинированные результаты
81
  model_name = value["model_name"]
82
+
83
  # Пропускаем модель, если она уже была добавлена
84
  if model_name in seen_models:
85
  logger.info(f"Пропускаем дублирующуюся модель: {model_name}")
86
  continue
87
+
88
  # Добавляем модель во множество обработанных
89
  seen_models.add(model_name)
90
+
91
  leaderboard_entry = {
92
  "model_name": model_name,
93
  "score": value["score"],
 
95
  "physics_score": value["physics_score"],
96
  "total_tokens": value["total_tokens"],
97
  "evaluation_time": value["evaluation_time"],
98
+ "system_prompt": value.get(
99
+ "system_prompt", "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
100
+ ),
101
  }
102
  leaderboard_entries.append(leaderboard_entry)
103
+
104
  # Сортировка по общему баллу
105
  leaderboard_entries.sort(key=lambda x: x["score"], reverse=True)
106
  logger.info(f"Загружено {len(leaderboard_entries)} уникальных моделей после удаления дубликатов")
107
  return leaderboard_entries
108
+
109
  except Exception as e:
110
  logger.error(f"Ошибка при загрузке результатов: {e}")
111
  raise
112
 
113
+
114
  def prepare_directory_structure():
115
  """
116
  Создает необходимую структуру директорий для внешних моделей.
117
+
118
  Returns:
119
  str: Путь к временной директории с подготовленной структурой
120
  """
121
  temp_dir = Path("./temp_leaderboard")
122
  model_data_dir = temp_dir / "model_data" / "external"
123
+
124
  # Очистка и создание директорий
125
  if temp_dir.exists():
126
  import shutil
127
+
128
  shutil.rmtree(temp_dir)
129
+
130
  model_data_dir.mkdir(parents=True, exist_ok=True)
131
+
132
  return str(temp_dir)
133
 
134
+
135
  def upload_model_files(api, leaderboard_entries, temp_dir):
136
  """
137
  Загружает файлы моделей в репозиторий данных лидерборда.
138
+
139
  Args:
140
  api (HfApi): Экземпляр API для взаимодействия с HuggingFace
141
  leaderboard_entries (list): Список записей для лидерборда
142
  temp_dir (str): Путь к временной директории
143
  """
144
  model_data_dir = os.path.join(temp_dir, "model_data", "external")
145
+
146
  for entry in leaderboard_entries:
147
  model_name = entry["model_name"]
148
  safe_filename = model_name.replace("/", "_").replace(" ", "_")
149
  file_path = os.path.join(model_data_dir, f"{safe_filename}.json")
150
+
151
  with open(file_path, "w", encoding="utf-8") as f:
152
  json.dump(entry, f, ensure_ascii=False, indent=2)
153
+
154
  # Загрузка файла модели в репозиторий
155
  api.upload_file(
156
  path_or_fileobj=file_path,
157
  path_in_repo=f"model_data/external/{safe_filename}.json",
158
  repo_id=REPO_ID,
159
+ repo_type="dataset",
160
  )
161
  logger.info(f"Загружен файл модели: {safe_filename}.json")
162
 
163
+
164
  def generate_leaderboard_json(leaderboard_entries):
165
  """
166
  Создает JSON файл с данными лидерборда.
167
+
168
  Args:
169
  leaderboard_entries (list): Список записей для лидерборда
170
+
171
  Returns:
172
  str: Путь к созданному JSON файлу
173
  """
174
  leaderboard_file = "leaderboard.json"
175
+
176
  with open(leaderboard_file, "w", encoding="utf-8") as f:
177
  json.dump(leaderboard_entries, f, ensure_ascii=False, indent=2)
178
+
179
  return leaderboard_file
180
 
181
+
182
  def generate_readme(leaderboard_entries):
183
  """
184
  Генерирует README.md с информацией о лидерборде.
185
+
186
  Args:
187
  leaderboard_entries (list): Список записей для лидерборда
188
+
189
  Returns:
190
  str: Путь к созданному README файлу
191
  """
192
  readme_file = "README.md"
193
+
194
  # Создаем DataFrame для удобного форматирования таблицы
195
  df = pd.DataFrame(leaderboard_entries)
196
+
197
  # Форматируем числовые колонки
198
  for col in ["score", "math_score", "physics_score"]:
199
  if col in df.columns:
200
  df[col] = df[col].apply(lambda x: f"{x:.3f}")
201
+
202
  if "total_tokens" in df.columns:
203
  df["total_tokens"] = df["total_tokens"].apply(lambda x: f"{int(x):,}")
204
+
205
  if "evaluation_time" in df.columns:
206
  df["evaluation_time"] = df["evaluation_time"].apply(lambda x: f"{x:.1f}s")
207
+
208
  # Создаем содержимое README
209
  current_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
210
+
211
  readme_content = f"""# DeathMath Leaderboard
212
 
213
  DeathMath - это бенчмарк для оценки способности моделей решать сложные математические и физические задачи на русском языке.
 
254
 
255
  with open(readme_file, "w", encoding="utf-8") as f:
256
  f.write(readme_content)
257
+
258
  return readme_file
259
 
260
+
261
  def upload_leaderboard_files(api, leaderboard_file, readme_file):
262
  """
263
  Загружает файлы лидерборда в репозиторий метаданных.
264
+
265
  Args:
266
  api (HfApi): Экземпляр API для взаимодействия с HuggingFace
267
  leaderboard_file (str): Путь к JSON файлу лидерборда
 
269
  """
270
  # Загрузка JSON лидерборда
271
  api.upload_file(
272
+ path_or_fileobj=leaderboard_file, path_in_repo="leaderboard.json", repo_id=METAINFO_REPO_ID, repo_type="dataset"
 
 
 
273
  )
274
  logger.info(f"Загружен файл лидерборда: leaderboard.json в {METAINFO_REPO_ID}")
275
+
276
  # Загрузка README
277
  api.upload_file(
278
+ path_or_fileobj=readme_file, path_in_repo="README.md", repo_id=METAINFO_REPO_ID, repo_type="dataset"
 
 
 
279
  )
280
  logger.info(f"Загружен README: README.md в {METAINFO_REPO_ID}")
281
 
282
+
283
  def main():
284
  # Парсинг аргументов командной строки
285
  parser = argparse.ArgumentParser(description="Генерация первоначального лидерборда DeathMath")
286
+ parser.add_argument(
287
+ "--results",
288
+ default="../results/leaderboard_results.json",
289
+ help="Путь к файлу с результатами (по умолчанию: ../results/leaderboard_results.json)",
290
+ )
291
  parser.add_argument("--token", required=True, help="Токен для доступа к HuggingFace Hub")
292
+
293
  args = parser.parse_args()
294
+
295
  try:
296
  logger.info("Начинаем генерацию лидерборда DeathMath")
297
+
298
  # Настраиваем репозитории
299
  api = setup_repositories(args.token)
300
  logger.info("Репозитории успешно настроены")
301
+
302
  # Загружаем результаты
303
  leaderboard_entries = load_results(args.results)
304
  logger.info(f"Загружено {len(leaderboard_entries)} записей для лидерборда")
305
+
306
  # Подготавливаем структуру директорий
307
  temp_dir = prepare_directory_structure()
308
  logger.info(f"Создана временная директория: {temp_dir}")
309
+
310
  # Загружаем файлы моделей
311
  upload_model_files(api, leaderboard_entries, temp_dir)
312
  logger.info("Файлы моделей успешно загружены")
313
+
314
  # Генерируем JSON лидерборда
315
  leaderboard_file = generate_leaderboard_json(leaderboard_entries)
316
  logger.info(f"Создан файл лидерборда: {leaderboard_file}")
317
+
318
  # Генерируем README
319
  readme_file = generate_readme(leaderboard_entries)
320
  logger.info(f"Создан README: {readme_file}")
321
+
322
  # Загружаем файлы лидерборда
323
  upload_leaderboard_files(api, leaderboard_file, readme_file)
324
  logger.info("Файлы лидерборда успешно загружены")
325
+
326
  logger.info("Генерация лидерборда успешно завершена!")
327
+
328
  except Exception as e:
329
  logger.error(f"Ошибка при генерации лидерборда: {e}")
330
  raise
331
 
332
+
333
  if __name__ == "__main__":
334
+ main()
leaderboard.json CHANGED
@@ -1,4 +1,13 @@
1
  [
 
 
 
 
 
 
 
 
 
2
  {
3
  "model_name": "o3-mini-high",
4
  "score": 0.600956937799043,
@@ -98,33 +107,6 @@
98
  "evaluation_time": 1078.4077816009521,
99
  "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
100
  },
101
- {
102
- "model_name": "GigaChat-2-Max",
103
- "score": 0.24952153110047848,
104
- "math_score": 0.3263157894736842,
105
- "physics_score": 0.17272727272727273,
106
- "total_tokens": 220487,
107
- "evaluation_time": 1006.1656014919281,
108
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
109
- },
110
- {
111
- "model_name": "GigaChat-2-Pro",
112
- "score": 0.20861244019138758,
113
- "math_score": 0.3263157894736842,
114
- "physics_score": 0.09090909090909091,
115
- "total_tokens": 212196,
116
- "evaluation_time": 1002.5515208244324,
117
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
118
- },
119
- {
120
- "model_name": "GigaChat-Max",
121
- "score": 0.1394736842105263,
122
- "math_score": 0.17894736842105263,
123
- "physics_score": 0.1,
124
- "total_tokens": 201090,
125
- "evaluation_time": 978.7567253112793,
126
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
127
- },
128
  {
129
  "model_name": "DeepSeek V3 0324",
130
  "score": 0.13229665071770336,
@@ -142,14 +124,5 @@
142
  "total_tokens": 572095,
143
  "evaluation_time": 1682.6655840873718,
144
  "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
145
- },
146
- {
147
- "model_name": "GigaChat-2",
148
- "score": 0.0937799043062201,
149
- "math_score": 0.14210526315789473,
150
- "physics_score": 0.045454545454545456,
151
- "total_tokens": 299747,
152
- "evaluation_time": 834.6775443553925,
153
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
154
  }
155
  ]
 
1
  [
2
+ {
3
+ "model_name": "o3",
4
+ "score": 0.6205741626794259,
5
+ "math_score": 0.868421052631579,
6
+ "physics_score": 0.37272727272727274,
7
+ "total_tokens": 1251746,
8
+ "evaluation_time": 4609.068037748337,
9
+ "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
10
+ },
11
  {
12
  "model_name": "o3-mini-high",
13
  "score": 0.600956937799043,
 
107
  "evaluation_time": 1078.4077816009521,
108
  "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
109
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  {
111
  "model_name": "DeepSeek V3 0324",
112
  "score": 0.13229665071770336,
 
124
  "total_tokens": 572095,
125
  "evaluation_time": 1682.6655840873718,
126
  "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
 
 
 
 
 
 
 
 
 
127
  }
128
  ]
pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
  [tool.ruff]
2
  line-length = 120
3
- target-version = "py312"
4
  include = ["*.py", "*.pyi", "**/pyproject.toml", "*.ipynb"]
5
  ignore=["I","EM","FBT","TRY003","S101","D101","D102","D103","D104","D105","G004","D107","FA102"]
6
  fixable=["ALL"]
@@ -27,7 +27,7 @@ authors = []
27
  readme = "README.md"
28
 
29
  [tool.poetry.dependencies]
30
- python = "3.12.1"
31
  apscheduler = "3.10.1"
32
  black = "23.11.0"
33
  click = "8.1.3"
 
1
  [tool.ruff]
2
  line-length = 120
3
+ target-version = "py313"
4
  include = ["*.py", "*.pyi", "**/pyproject.toml", "*.ipynb"]
5
  ignore=["I","EM","FBT","TRY003","S101","D101","D102","D103","D104","D105","G004","D107","FA102"]
6
  fixable=["ALL"]
 
27
  readme = "README.md"
28
 
29
  [tool.poetry.dependencies]
30
+ python = "3.13.3"
31
  apscheduler = "3.10.1"
32
  black = "23.11.0"
33
  click = "8.1.3"
temp_leaderboard/model_data/external/Claude_3.5_Sonnet.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "Claude 3.5 Sonnet",
3
- "score": 0.33851674641148327,
4
- "math_score": 0.43157894736842106,
5
- "physics_score": 0.24545454545454545,
6
- "total_tokens": 222241,
7
- "evaluation_time": 670.5163931846619,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/Claude_3.7_Sonnet.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "Claude 3.7 Sonnet",
3
- "score": 0.36770334928229664,
4
- "math_score": 0.5263157894736842,
5
- "physics_score": 0.20909090909090908,
6
- "total_tokens": 398016,
7
- "evaluation_time": 1095.7695870399475,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/DeepSeek_V3_0324.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "DeepSeek V3 0324",
3
- "score": 0.13229665071770336,
4
- "math_score": 0.1736842105263158,
5
- "physics_score": 0.09090909090909091,
6
- "total_tokens": 359162,
7
- "evaluation_time": 4257.714092254639,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/Gemini_2.0_Flash.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "Gemini 2.0 Flash",
3
- "score": 0.4217703349282297,
4
- "math_score": 0.5526315789473685,
5
- "physics_score": 0.2909090909090909,
6
- "total_tokens": 731337,
7
- "evaluation_time": 857.6413371562958,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/Gemini_2.5_Pro_Preview.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "Gemini 2.5 Pro Preview",
3
- "score": 0.5863636363636364,
4
- "math_score": 0.8,
5
- "physics_score": 0.37272727272727274,
6
- "total_tokens": 1394299,
7
- "evaluation_time": 4533.155055761337,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/Gemma_3_12B.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "Gemma 3 12B",
3
- "score": 0.29832535885167466,
4
- "math_score": 0.4421052631578947,
5
- "physics_score": 0.15454545454545454,
6
- "total_tokens": 441055,
7
- "evaluation_time": 3916.2552330493927,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/Gemma_3_27B.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "Gemma 3 27B",
3
- "score": 0.32057416267942584,
4
- "math_score": 0.46842105263157896,
5
- "physics_score": 0.17272727272727273,
6
- "total_tokens": 357617,
7
- "evaluation_time": 2030.33176279068,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/Gemma_3_4B.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "Gemma 3 4B",
3
- "score": 0.12416267942583732,
4
- "math_score": 0.22105263157894736,
5
- "physics_score": 0.02727272727272727,
6
- "total_tokens": 572095,
7
- "evaluation_time": 1682.6655840873718,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/GigaChat-2-Max.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "GigaChat-2-Max",
3
- "score": 0.24952153110047848,
4
- "math_score": 0.3263157894736842,
5
- "physics_score": 0.17272727272727273,
6
- "total_tokens": 220487,
7
- "evaluation_time": 1006.1656014919281,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/GigaChat-2-Pro.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "GigaChat-2-Pro",
3
- "score": 0.20861244019138758,
4
- "math_score": 0.3263157894736842,
5
- "physics_score": 0.09090909090909091,
6
- "total_tokens": 212196,
7
- "evaluation_time": 1002.5515208244324,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/GigaChat-2.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "GigaChat-2",
3
- "score": 0.0937799043062201,
4
- "math_score": 0.14210526315789473,
5
- "physics_score": 0.045454545454545456,
6
- "total_tokens": 299747,
7
- "evaluation_time": 834.6775443553925,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/GigaChat-Max.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "GigaChat-Max",
3
- "score": 0.1394736842105263,
4
- "math_score": 0.17894736842105263,
5
- "physics_score": 0.1,
6
- "total_tokens": 201090,
7
- "evaluation_time": 978.7567253112793,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/Qwen2.5_72B_Instruct.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "Qwen2.5 72B Instruct",
3
- "score": 0.2784688995215311,
4
- "math_score": 0.38421052631578945,
5
- "physics_score": 0.17272727272727273,
6
- "total_tokens": 366729,
7
- "evaluation_time": 2460.056980371475,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/gpt-4.1.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "gpt-4.1",
3
- "score": 0.3861244019138756,
4
- "math_score": 0.5631578947368421,
5
- "physics_score": 0.20909090909090908,
6
- "total_tokens": 405803,
7
- "evaluation_time": 1918.7988040447235,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/gpt-4o.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "gpt-4o",
3
- "score": 0.2617224880382775,
4
- "math_score": 0.4052631578947368,
5
- "physics_score": 0.11818181818181818,
6
- "total_tokens": 468809,
7
- "evaluation_time": 1078.4077816009521,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/o3-mini-high.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "o3-mini-high",
3
- "score": 0.600956937799043,
4
- "math_score": 0.8473684210526315,
5
- "physics_score": 0.35454545454545455,
6
- "total_tokens": 2455126,
7
- "evaluation_time": 4015.4359402656555,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }
 
 
 
 
 
 
 
 
 
 
temp_leaderboard/model_data/external/o4-mini-high.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "model_name": "o4-mini-high",
3
- "score": 0.5906698564593301,
4
- "math_score": 0.8631578947368421,
5
- "physics_score": 0.3181818181818182,
6
- "total_tokens": 1898964,
7
- "evaluation_time": 4623.6044108867645,
8
- "system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
9
- }