Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
add uid to context
Browse files- backend/app/services/leaderboard.py +5 -2
- frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/Filters.js +5 -2
- frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/hooks/useOfficialProvidersMode.js +2 -4
- frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/Table.js +2 -2
- frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/hooks/useDataProcessing.js +2 -2
- frontend/src/pages/LeaderboardPage/components/Leaderboard/context/LeaderboardContext.js +10 -31
- frontend/src/pages/LeaderboardPage/components/Leaderboard/hooks/useDataUtils.js +40 -24
- frontend/src/pages/LeaderboardPage/components/Leaderboard/utils/columnUtils.js +1 -1
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":
|
| 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 |
-
//
|
|
|
|
|
|
|
|
|
|
| 383 |
stableTimerRef.current = setTimeout(() => {
|
| 384 |
-
|
| 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
|
| 121 |
-
|
| 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.
|
| 263 |
-
const bIndex = pinnedModels.indexOf(b.original.
|
| 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.
|
| 123 |
-
pinnedModels.indexOf(rowB.original.
|
| 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
|
| 301 |
const pinnedModels = [...state.pinnedModels];
|
| 302 |
-
const modelIndex = pinnedModels.indexOf(
|
| 303 |
|
| 304 |
if (modelIndex === -1) {
|
| 305 |
-
pinnedModels.push(
|
| 306 |
} else {
|
| 307 |
pinnedModels.splice(modelIndex, 1);
|
| 308 |
}
|
|
@@ -659,25 +659,10 @@ const LeaderboardProvider = ({ children }) => {
|
|
| 659 |
precisionsChanged ||
|
| 660 |
typesChanged
|
| 661 |
) {
|
| 662 |
-
|
|
|
|
| 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: (
|
| 692 |
-
dispatch({ type: "TOGGLE_PINNED_MODEL", payload:
|
| 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
|
| 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.
|
| 109 |
-
);
|
| 110 |
-
const unpinnedData = processedData.filter(
|
| 111 |
-
|
| 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((
|
| 217 |
-
pinnedData.find((item) => item.
|
| 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 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 231 |
});
|
| 232 |
|
| 233 |
// Create Map to store dynamic_ranks
|
| 234 |
const dynamicRankMap = new Map();
|
| 235 |
sortedByScore.forEach((item, index) => {
|
| 236 |
-
dynamicRankMap.set(item.
|
| 237 |
});
|
| 238 |
|
| 239 |
// Add ranks to final data
|
| 240 |
const finalData = [...orderedPinnedData, ...filteredUnpinned].map(
|
| 241 |
-
(item) =>
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 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.
|
| 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,
|