tfrere commited on
Commit
f1e551a
1 Parent(s): 126473d

add uid to context

Browse files
backend/app/services/leaderboard.py CHANGED
@@ -102,6 +102,9 @@ class LeaderboardService:
102
  model_name = data.get("fullname", "Unknown")
103
  logger.debug(LogFormatter.info(f"Transforming data for model: {model_name}"))
104
 
 
 
 
105
  evaluations = {
106
  "ifeval": {
107
  "name": "IFEval",
@@ -174,14 +177,14 @@ class LeaderboardService:
174
  "fine tuning": "fined-tuned-on-domain-specific-dataset",
175
  "fine-tuning": "fined-tuned-on-domain-specific-dataset"
176
  }
177
-
178
  mapped_type = model_type_mapping.get(model_type.lower().strip(), model_type)
179
 
180
  if mapped_type != model_type:
181
  logger.debug(LogFormatter.info(f"Model type mapped: {original_type} -> {mapped_type}"))
182
 
183
  transformed_data = {
184
- "id": data.get("eval_name"),
185
  "model": {
186
  "name": data.get("fullname"),
187
  "sha": data.get("Model sha"),
 
102
  model_name = data.get("fullname", "Unknown")
103
  logger.debug(LogFormatter.info(f"Transforming data for model: {model_name}"))
104
 
105
+ # Create unique ID combining model name, precision, sha and chat template status
106
+ unique_id = f"{data.get('fullname', 'Unknown')}_{data.get('Precision', 'Unknown')}_{data.get('Model sha', 'Unknown')}_{str(data.get('Chat Template', False))}"
107
+
108
  evaluations = {
109
  "ifeval": {
110
  "name": "IFEval",
 
177
  "fine tuning": "fined-tuned-on-domain-specific-dataset",
178
  "fine-tuning": "fined-tuned-on-domain-specific-dataset"
179
  }
180
+
181
  mapped_type = model_type_mapping.get(model_type.lower().strip(), model_type)
182
 
183
  if mapped_type != model_type:
184
  logger.debug(LogFormatter.info(f"Model type mapped: {original_type} -> {mapped_type}"))
185
 
186
  transformed_data = {
187
+ "id": unique_id,
188
  "model": {
189
  "name": data.get("fullname"),
190
  "sha": data.get("Model sha"),
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/Filters.js CHANGED
@@ -379,9 +379,12 @@ const LeaderboardFilters = ({
379
  clearTimeout(stableTimerRef.current);
380
  }
381
 
382
- // Trigger search after debounce
 
 
 
383
  stableTimerRef.current = setTimeout(() => {
384
- onParamsRangeChange(newValue);
385
  }, TABLE_DEFAULTS.DEBOUNCE.SEARCH);
386
  };
387
 
 
379
  clearTimeout(stableTimerRef.current);
380
  }
381
 
382
+ // Update URL immediately
383
+ onParamsRangeChange(newValue);
384
+
385
+ // Trigger data update after debounce
386
  stableTimerRef.current = setTimeout(() => {
387
+ actions.updateFilteredData();
388
  }, TABLE_DEFAULTS.DEBOUNCE.SEARCH);
389
  };
390
 
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/hooks/useOfficialProvidersMode.js CHANGED
@@ -117,10 +117,8 @@ export const useOfficialProvidersMode = () => {
117
  timestamp: now,
118
  };
119
 
120
- // Update URL with a slight delay
121
- setTimeout(() => {
122
- setSearchParams(newSearchParams, { replace: true });
123
- }, 0);
124
  },
125
  [searchParams, setSearchParams]
126
  );
 
117
  timestamp: now,
118
  };
119
 
120
+ // Update search params and let HashRouter handle the URL
121
+ setSearchParams(newSearchParams);
 
 
122
  },
123
  [searchParams, setSearchParams]
124
  );
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/Table.js CHANGED
@@ -259,8 +259,8 @@ const LeaderboardTable = ({
259
  const pinnedModelRows = rows.filter((row) => row.original.isPinned);
260
  // Sort pinned models according to their original order in pinnedModels
261
  return pinnedModelRows.sort((a, b) => {
262
- const aIndex = pinnedModels.indexOf(a.original.model.name);
263
- const bIndex = pinnedModels.indexOf(b.original.model.name);
264
  return aIndex - bIndex;
265
  });
266
  }, [rows, pinnedModels]);
 
259
  const pinnedModelRows = rows.filter((row) => row.original.isPinned);
260
  // Sort pinned models according to their original order in pinnedModels
261
  return pinnedModelRows.sort((a, b) => {
262
+ const aIndex = pinnedModels.indexOf(a.original.id);
263
+ const bIndex = pinnedModels.indexOf(b.original.id);
264
  return aIndex - bIndex;
265
  });
266
  }, [rows, pinnedModels]);
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/hooks/useDataProcessing.js CHANGED
@@ -119,8 +119,8 @@ export const useDataProcessing = (
119
 
120
  if (rowA.original.isPinned && rowB.original.isPinned) {
121
  return (
122
- pinnedModels.indexOf(rowA.original.model.name) -
123
- pinnedModels.indexOf(rowB.original.model.name)
124
  );
125
  }
126
 
 
119
 
120
  if (rowA.original.isPinned && rowB.original.isPinned) {
121
  return (
122
+ pinnedModels.indexOf(rowA.original.id) -
123
+ pinnedModels.indexOf(rowB.original.id)
124
  );
125
  }
126
 
frontend/src/pages/LeaderboardPage/components/Leaderboard/context/LeaderboardContext.js CHANGED
@@ -297,12 +297,12 @@ const reducer = (state, action) => {
297
  };
298
 
299
  case "TOGGLE_PINNED_MODEL":
300
- const modelName = action.payload;
301
  const pinnedModels = [...state.pinnedModels];
302
- const modelIndex = pinnedModels.indexOf(modelName);
303
 
304
  if (modelIndex === -1) {
305
- pinnedModels.push(modelName);
306
  } else {
307
  pinnedModels.splice(modelIndex, 1);
308
  }
@@ -659,25 +659,10 @@ const LeaderboardProvider = ({ children }) => {
659
  precisionsChanged ||
660
  typesChanged
661
  ) {
662
- setSearchParams(newSearchParams, { replace: true });
 
663
  }
664
- }, [
665
- state.filters.paramsRange,
666
- state.filters.booleanFilters,
667
- state.filters.search,
668
- state.filters.isOfficialProviderActive,
669
- state.filters.precisions,
670
- state.filters.types,
671
- state.pinnedModels,
672
- state.display.visibleColumns,
673
- state.display.rowSize,
674
- state.display.scoreDisplay,
675
- state.display.averageMode,
676
- state.display.rankingMode,
677
- searchParams,
678
- setSearchParams,
679
- location.state,
680
- ]);
681
 
682
  const actions = useMemo(
683
  () => ({
@@ -688,8 +673,8 @@ const LeaderboardProvider = ({ children }) => {
688
  setFilter: (key, value) => dispatch({ type: "SET_FILTER", key, value }),
689
  setDisplayOption: (key, value) =>
690
  dispatch({ type: "SET_DISPLAY_OPTION", key, value }),
691
- togglePinnedModel: (modelName) =>
692
- dispatch({ type: "TOGGLE_PINNED_MODEL", payload: modelName }),
693
  toggleOfficialProvider: () =>
694
  dispatch({ type: "TOGGLE_OFFICIAL_PROVIDER" }),
695
  toggleFiltersExpanded: () =>
@@ -707,19 +692,13 @@ const LeaderboardProvider = ({ children }) => {
707
  ].forEach((param) => {
708
  newParams.delete(param);
709
  });
710
- setSearchParams(newParams, { replace: true });
711
  },
712
  resetAll: () => {
713
  // Reset all state
714
  dispatch({ type: "RESET_ALL" });
715
  // Clear all URL params with skipUrlSync flag
716
- setSearchParams(
717
- {},
718
- {
719
- replace: true,
720
- state: { skipUrlSync: true },
721
- }
722
- );
723
  },
724
  }),
725
  [searchParams, setSearchParams]
 
297
  };
298
 
299
  case "TOGGLE_PINNED_MODEL":
300
+ const modelKey = action.payload;
301
  const pinnedModels = [...state.pinnedModels];
302
+ const modelIndex = pinnedModels.indexOf(modelKey);
303
 
304
  if (modelIndex === -1) {
305
+ pinnedModels.push(modelKey);
306
  } else {
307
  pinnedModels.splice(modelIndex, 1);
308
  }
 
659
  precisionsChanged ||
660
  typesChanged
661
  ) {
662
+ // Update search params and let HashRouter handle the URL
663
+ setSearchParams(newSearchParams);
664
  }
665
+ }, [state, searchParams, location.state]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
666
 
667
  const actions = useMemo(
668
  () => ({
 
673
  setFilter: (key, value) => dispatch({ type: "SET_FILTER", key, value }),
674
  setDisplayOption: (key, value) =>
675
  dispatch({ type: "SET_DISPLAY_OPTION", key, value }),
676
+ togglePinnedModel: (modelKey) =>
677
+ dispatch({ type: "TOGGLE_PINNED_MODEL", payload: modelKey }),
678
  toggleOfficialProvider: () =>
679
  dispatch({ type: "TOGGLE_OFFICIAL_PROVIDER" }),
680
  toggleFiltersExpanded: () =>
 
692
  ].forEach((param) => {
693
  newParams.delete(param);
694
  });
695
+ setSearchParams(newParams);
696
  },
697
  resetAll: () => {
698
  // Reset all state
699
  dispatch({ type: "RESET_ALL" });
700
  // Clear all URL params with skipUrlSync flag
701
+ setSearchParams({}, { state: { skipUrlSync: true } });
 
 
 
 
 
 
702
  },
703
  }),
704
  [searchParams, setSearchParams]
frontend/src/pages/LeaderboardPage/components/Leaderboard/hooks/useDataUtils.js CHANGED
@@ -104,12 +104,12 @@ export const useFilteredData = (
104
  isOfficialProviderActive = false
105
  ) => {
106
  return useMemo(() => {
107
- const pinnedData = processedData.filter((row) =>
108
- pinnedModels.includes(row.model.name)
109
- );
110
- const unpinnedData = processedData.filter(
111
- (row) => !pinnedModels.includes(row.model.name)
112
- );
113
 
114
  let filteredUnpinned = unpinnedData;
115
 
@@ -213,8 +213,8 @@ export const useFilteredData = (
213
 
214
  // Create ordered array of pinned models respecting pinnedModels order
215
  const orderedPinnedData = pinnedModels
216
- .map((pinnedModelName) =>
217
- pinnedData.find((item) => item.model.name === pinnedModelName)
218
  )
219
  .filter(Boolean);
220
 
@@ -223,31 +223,47 @@ export const useFilteredData = (
223
 
224
  // Sort all data by average_score for dynamic_rank
225
  const sortedByScore = [...allFilteredData].sort((a, b) => {
226
- if (a.model.average_score === null && b.model.average_score === null)
227
- return 0;
228
- if (a.model.average_score === null) return 1;
229
- if (b.model.average_score === null) return -1;
230
- return b.model.average_score - a.model.average_score;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231
  });
232
 
233
  // Create Map to store dynamic_ranks
234
  const dynamicRankMap = new Map();
235
  sortedByScore.forEach((item, index) => {
236
- dynamicRankMap.set(item.model.name, index + 1);
237
  });
238
 
239
  // Add ranks to final data
240
  const finalData = [...orderedPinnedData, ...filteredUnpinned].map(
241
- (item) => ({
242
- ...item,
243
- dynamic_rank: dynamicRankMap.get(item.model.name),
244
- rank: item.isPinned
245
- ? pinnedModels.indexOf(item.model.name) + 1
246
- : rankingMode === "static"
247
- ? item.static_rank
248
- : dynamicRankMap.get(item.model.name),
249
- isPinned: pinnedModels.includes(item.model.name),
250
- })
 
 
251
  );
252
 
253
  return finalData;
 
104
  isOfficialProviderActive = false
105
  ) => {
106
  return useMemo(() => {
107
+ const pinnedData = processedData.filter((row) => {
108
+ return pinnedModels.includes(row.id);
109
+ });
110
+ const unpinnedData = processedData.filter((row) => {
111
+ return !pinnedModels.includes(row.id);
112
+ });
113
 
114
  let filteredUnpinned = unpinnedData;
115
 
 
213
 
214
  // Create ordered array of pinned models respecting pinnedModels order
215
  const orderedPinnedData = pinnedModels
216
+ .map((pinnedModelId) =>
217
+ pinnedData.find((item) => item.id === pinnedModelId)
218
  )
219
  .filter(Boolean);
220
 
 
223
 
224
  // Sort all data by average_score for dynamic_rank
225
  const sortedByScore = [...allFilteredData].sort((a, b) => {
226
+ // Si les scores moyens sont différents, trier par score
227
+ if (a.model.average_score !== b.model.average_score) {
228
+ if (a.model.average_score === null && b.model.average_score === null)
229
+ return 0;
230
+ if (a.model.average_score === null) return 1;
231
+ if (b.model.average_score === null) return -1;
232
+ return b.model.average_score - a.model.average_score;
233
+ }
234
+
235
+ // Si les scores sont égaux, comparer le nom du modèle et la date de soumission
236
+ if (a.model.name === b.model.name) {
237
+ // Si même nom, trier par date de soumission (la plus récente d'abord)
238
+ const dateA = new Date(a.metadata?.submission_date || 0);
239
+ const dateB = new Date(b.metadata?.submission_date || 0);
240
+ return dateB - dateA;
241
+ }
242
+
243
+ // Si noms différents, trier par nom
244
+ return a.model.name.localeCompare(b.model.name);
245
  });
246
 
247
  // Create Map to store dynamic_ranks
248
  const dynamicRankMap = new Map();
249
  sortedByScore.forEach((item, index) => {
250
+ dynamicRankMap.set(item.id, index + 1);
251
  });
252
 
253
  // Add ranks to final data
254
  const finalData = [...orderedPinnedData, ...filteredUnpinned].map(
255
+ (item) => {
256
+ return {
257
+ ...item,
258
+ dynamic_rank: dynamicRankMap.get(item.id),
259
+ rank: item.isPinned
260
+ ? pinnedModels.indexOf(item.id) + 1
261
+ : rankingMode === "static"
262
+ ? item.static_rank
263
+ : dynamicRankMap.get(item.id),
264
+ isPinned: pinnedModels.includes(item.id),
265
+ };
266
+ }
267
  );
268
 
269
  return finalData;
frontend/src/pages/LeaderboardPage/components/Leaderboard/utils/columnUtils.js CHANGED
@@ -473,7 +473,7 @@ export const createColumns = (
473
  onClick={(e) => {
474
  e.stopPropagation();
475
  e.preventDefault();
476
- onTogglePin(row.original.model.name);
477
  }}
478
  sx={{
479
  padding: 0.5,
 
473
  onClick={(e) => {
474
  e.stopPropagation();
475
  e.preventDefault();
476
+ onTogglePin(row.original.id);
477
  }}
478
  sx={{
479
  padding: 0.5,