Spaces:
Running
Running
update front
Browse files- client/src/components/LeaderboardCard.jsx +1 -1
- client/src/components/LeaderboardFilters/LeaderboardFilters.jsx +77 -13
- client/src/components/LeaderboardSection.jsx +21 -1
- client/src/components/Logo/Logo.jsx +1 -0
- client/src/components/PageTitle/PageTitle.jsx +5 -1
- client/src/config/theme.js +5 -3
- client/src/context/LeaderboardContext.jsx +54 -40
- client/src/pages/HowToSubmitPage/HowToSubmitPage.jsx +458 -193
- client/src/pages/LeaderboardPage/LeaderboardPage.jsx +1 -14
client/src/components/LeaderboardCard.jsx
CHANGED
|
@@ -71,7 +71,7 @@ const LeaderboardCard = ({ leaderboard }) => {
|
|
| 71 |
left: 0,
|
| 72 |
right: 0,
|
| 73 |
bottom: 0,
|
| 74 |
-
backgroundColor: "rgba(0, 0, 0, 0.
|
| 75 |
pointerEvents: "none",
|
| 76 |
zIndex: 1,
|
| 77 |
},
|
|
|
|
| 71 |
left: 0,
|
| 72 |
right: 0,
|
| 73 |
bottom: 0,
|
| 74 |
+
backgroundColor: "rgba(0, 0, 0, 0.15)",
|
| 75 |
pointerEvents: "none",
|
| 76 |
zIndex: 1,
|
| 77 |
},
|
client/src/components/LeaderboardFilters/LeaderboardFilters.jsx
CHANGED
|
@@ -24,9 +24,11 @@ const LeaderboardFilters = ({ allSections }) => {
|
|
| 24 |
totalLeaderboards,
|
| 25 |
filteredCount,
|
| 26 |
filterLeaderboards,
|
|
|
|
| 27 |
} = useLeaderboard();
|
| 28 |
|
| 29 |
const [inputValue, setInputValue] = useState("");
|
|
|
|
| 30 |
const debouncedSearch = useDebounce(inputValue, 200);
|
| 31 |
|
| 32 |
// Update the search query after debounce
|
|
@@ -34,6 +36,16 @@ const LeaderboardFilters = ({ allSections }) => {
|
|
| 34 |
setSearchQuery(debouncedSearch);
|
| 35 |
}, [debouncedSearch, setSearchQuery]);
|
| 36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
// Check if any filter is active
|
| 38 |
const isFilterActive = debouncedSearch || arenaOnly;
|
| 39 |
|
|
@@ -158,18 +170,55 @@ const LeaderboardFilters = ({ allSections }) => {
|
|
| 158 |
endAdornment: (
|
| 159 |
<InputAdornment position="end">
|
| 160 |
<Stack direction="row" spacing={2} alignItems="center">
|
| 161 |
-
<
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
<Divider orientation="vertical" flexItem />
|
| 174 |
<FormControlLabel
|
| 175 |
control={
|
|
@@ -177,10 +226,25 @@ const LeaderboardFilters = ({ allSections }) => {
|
|
| 177 |
checked={arenaOnly}
|
| 178 |
onChange={(e) => setArenaOnly(e.target.checked)}
|
| 179 |
size="small"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 180 |
/>
|
| 181 |
}
|
| 182 |
label={isMobile ? "Arena only" : "Show arena only"}
|
| 183 |
-
sx={{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 184 |
/>
|
| 185 |
</Stack>
|
| 186 |
</InputAdornment>
|
|
|
|
| 24 |
totalLeaderboards,
|
| 25 |
filteredCount,
|
| 26 |
filterLeaderboards,
|
| 27 |
+
leaderboards,
|
| 28 |
} = useLeaderboard();
|
| 29 |
|
| 30 |
const [inputValue, setInputValue] = useState("");
|
| 31 |
+
const [totalArenaCount, setTotalArenaCount] = useState(0);
|
| 32 |
const debouncedSearch = useDebounce(inputValue, 200);
|
| 33 |
|
| 34 |
// Update the search query after debounce
|
|
|
|
| 36 |
setSearchQuery(debouncedSearch);
|
| 37 |
}, [debouncedSearch, setSearchQuery]);
|
| 38 |
|
| 39 |
+
// Update total arena count when toggle changes
|
| 40 |
+
React.useEffect(() => {
|
| 41 |
+
if (arenaOnly) {
|
| 42 |
+
const arenaCount = leaderboards.filter((board) =>
|
| 43 |
+
board.tags?.includes("judge:humans")
|
| 44 |
+
).length;
|
| 45 |
+
setTotalArenaCount(arenaCount);
|
| 46 |
+
}
|
| 47 |
+
}, [arenaOnly, leaderboards]);
|
| 48 |
+
|
| 49 |
// Check if any filter is active
|
| 50 |
const isFilterActive = debouncedSearch || arenaOnly;
|
| 51 |
|
|
|
|
| 170 |
endAdornment: (
|
| 171 |
<InputAdornment position="end">
|
| 172 |
<Stack direction="row" spacing={2} alignItems="center">
|
| 173 |
+
<Box sx={{ display: "flex", alignItems: "center" }}>
|
| 174 |
+
<Typography
|
| 175 |
+
variant="body2"
|
| 176 |
+
sx={{
|
| 177 |
+
color: debouncedSearch
|
| 178 |
+
? "primary.main"
|
| 179 |
+
: "text.secondary",
|
| 180 |
+
fontWeight: 500,
|
| 181 |
+
}}
|
| 182 |
+
>
|
| 183 |
+
{filteredCount}
|
| 184 |
+
</Typography>
|
| 185 |
+
<Box
|
| 186 |
+
sx={{
|
| 187 |
+
display: "flex",
|
| 188 |
+
alignItems: "center",
|
| 189 |
+
color: arenaOnly ? "secondary.main" : "text.secondary",
|
| 190 |
+
}}
|
| 191 |
+
>
|
| 192 |
+
<Typography
|
| 193 |
+
variant="body2"
|
| 194 |
+
sx={{
|
| 195 |
+
fontWeight: 500,
|
| 196 |
+
mx: 0.5,
|
| 197 |
+
}}
|
| 198 |
+
>
|
| 199 |
+
/
|
| 200 |
+
</Typography>
|
| 201 |
+
<Typography
|
| 202 |
+
variant="body2"
|
| 203 |
+
sx={{
|
| 204 |
+
fontWeight: 500,
|
| 205 |
+
}}
|
| 206 |
+
>
|
| 207 |
+
{arenaOnly ? totalArenaCount : totalLeaderboards}
|
| 208 |
+
</Typography>
|
| 209 |
+
</Box>
|
| 210 |
+
<Typography
|
| 211 |
+
variant="body2"
|
| 212 |
+
sx={{
|
| 213 |
+
color: "text.secondary",
|
| 214 |
+
fontWeight: 400,
|
| 215 |
+
ml: 0.5,
|
| 216 |
+
}}
|
| 217 |
+
>
|
| 218 |
+
leaderboards
|
| 219 |
+
</Typography>
|
| 220 |
+
</Box>
|
| 221 |
+
|
| 222 |
<Divider orientation="vertical" flexItem />
|
| 223 |
<FormControlLabel
|
| 224 |
control={
|
|
|
|
| 226 |
checked={arenaOnly}
|
| 227 |
onChange={(e) => setArenaOnly(e.target.checked)}
|
| 228 |
size="small"
|
| 229 |
+
color="secondary"
|
| 230 |
+
sx={{
|
| 231 |
+
"&.Mui-checked": {
|
| 232 |
+
color: "secondary.light",
|
| 233 |
+
"& .MuiSwitch-track": {
|
| 234 |
+
backgroundColor: "secondary.light",
|
| 235 |
+
},
|
| 236 |
+
},
|
| 237 |
+
}}
|
| 238 |
/>
|
| 239 |
}
|
| 240 |
label={isMobile ? "Arena only" : "Show arena only"}
|
| 241 |
+
sx={{
|
| 242 |
+
mr: 0,
|
| 243 |
+
"& .MuiFormControlLabel-label": {
|
| 244 |
+
color: arenaOnly ? "secondary.light" : "inherit",
|
| 245 |
+
userSelect: arenaOnly ? "none" : "auto",
|
| 246 |
+
},
|
| 247 |
+
}}
|
| 248 |
/>
|
| 249 |
</Stack>
|
| 250 |
</InputAdornment>
|
client/src/components/LeaderboardSection.jsx
CHANGED
|
@@ -22,6 +22,9 @@ const LeaderboardSection = ({ title, leaderboards }) => {
|
|
| 22 |
setExpanded(!expanded);
|
| 23 |
};
|
| 24 |
|
|
|
|
|
|
|
|
|
|
| 25 |
return (
|
| 26 |
<Box sx={{ mb: 6 }}>
|
| 27 |
<Box
|
|
@@ -95,11 +98,28 @@ const LeaderboardSection = ({ title, leaderboards }) => {
|
|
| 95 |
)}
|
| 96 |
</Box>
|
| 97 |
<Grid container spacing={3}>
|
| 98 |
-
{
|
| 99 |
<Grid item xs={12} sm={6} md={4} key={index}>
|
| 100 |
<LeaderboardCard leaderboard={leaderboard} />
|
| 101 |
</Grid>
|
| 102 |
))}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
</Grid>
|
| 104 |
<Collapse in={showAll} timeout={300}>
|
| 105 |
<Grid container spacing={3} sx={{ mt: 0 }}>
|
|
|
|
| 22 |
setExpanded(!expanded);
|
| 23 |
};
|
| 24 |
|
| 25 |
+
// Calculate how many skeletons we need
|
| 26 |
+
const skeletonsNeeded = Math.max(0, 3 - leaderboards.length);
|
| 27 |
+
|
| 28 |
return (
|
| 29 |
<Box sx={{ mb: 6 }}>
|
| 30 |
<Box
|
|
|
|
| 98 |
)}
|
| 99 |
</Box>
|
| 100 |
<Grid container spacing={3}>
|
| 101 |
+
{displayedLeaderboards.map((leaderboard, index) => (
|
| 102 |
<Grid item xs={12} sm={6} md={4} key={index}>
|
| 103 |
<LeaderboardCard leaderboard={leaderboard} />
|
| 104 |
</Grid>
|
| 105 |
))}
|
| 106 |
+
{/* Add skeletons if needed */}
|
| 107 |
+
{Array.from({ length: skeletonsNeeded }).map((_, index) => (
|
| 108 |
+
<Grid item xs={12} sm={6} md={4} key={`skeleton-${index}`}>
|
| 109 |
+
<Box
|
| 110 |
+
sx={{
|
| 111 |
+
height: "180px",
|
| 112 |
+
borderRadius: 2,
|
| 113 |
+
bgcolor: (theme) => alpha(theme.palette.primary.main, 0.15),
|
| 114 |
+
opacity: 1,
|
| 115 |
+
transition: "opacity 0.3s ease-in-out",
|
| 116 |
+
"&:hover": {
|
| 117 |
+
opacity: 0.8,
|
| 118 |
+
},
|
| 119 |
+
}}
|
| 120 |
+
/>
|
| 121 |
+
</Grid>
|
| 122 |
+
))}
|
| 123 |
</Grid>
|
| 124 |
<Collapse in={showAll} timeout={300}>
|
| 125 |
<Grid container spacing={3} sx={{ mt: 0 }}>
|
client/src/components/Logo/Logo.jsx
CHANGED
|
@@ -33,6 +33,7 @@ const Logo = () => {
|
|
| 33 |
margin: "0 auto",
|
| 34 |
position: "relative",
|
| 35 |
zIndex: 1,
|
|
|
|
| 36 |
}}
|
| 37 |
/>
|
| 38 |
</Link>
|
|
|
|
| 33 |
margin: "0 auto",
|
| 34 |
position: "relative",
|
| 35 |
zIndex: 1,
|
| 36 |
+
opacity: (theme) => (theme.palette.mode === "dark" ? 0.8 : 1),
|
| 37 |
}}
|
| 38 |
/>
|
| 39 |
</Link>
|
client/src/components/PageTitle/PageTitle.jsx
CHANGED
|
@@ -16,7 +16,7 @@ const PageTitle = () => {
|
|
| 16 |
fontWeight="900"
|
| 17 |
variant="h3"
|
| 18 |
component="h1"
|
| 19 |
-
color="
|
| 20 |
sx={{
|
| 21 |
display: "flex",
|
| 22 |
justifyContent: "center",
|
|
@@ -50,6 +50,10 @@ const PageTitle = () => {
|
|
| 50 |
left: "21px",
|
| 51 |
transform: "translateX(-50%)",
|
| 52 |
width: "13px",
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
}}
|
| 54 |
/>
|
| 55 |
)}
|
|
|
|
| 16 |
fontWeight="900"
|
| 17 |
variant="h3"
|
| 18 |
component="h1"
|
| 19 |
+
color="text.primary"
|
| 20 |
sx={{
|
| 21 |
display: "flex",
|
| 22 |
justifyContent: "center",
|
|
|
|
| 50 |
left: "21px",
|
| 51 |
transform: "translateX(-50%)",
|
| 52 |
width: "13px",
|
| 53 |
+
filter: (theme) =>
|
| 54 |
+
theme.palette.mode === "dark"
|
| 55 |
+
? "invert(1) brightness(2)"
|
| 56 |
+
: "none",
|
| 57 |
}}
|
| 58 |
/>
|
| 59 |
)}
|
client/src/config/theme.js
CHANGED
|
@@ -84,9 +84,11 @@ const getDesignTokens = (mode) => ({
|
|
| 84 |
components: {
|
| 85 |
MuiCssBaseline: {
|
| 86 |
styleOverrides: {
|
| 87 |
-
|
| 88 |
-
backgroundColor: "
|
| 89 |
-
|
|
|
|
|
|
|
| 90 |
},
|
| 91 |
},
|
| 92 |
},
|
|
|
|
| 84 |
components: {
|
| 85 |
MuiCssBaseline: {
|
| 86 |
styleOverrides: {
|
| 87 |
+
html: {
|
| 88 |
+
backgroundColor: mode === "light" ? "#f8f9fa" : "#0a0a0a",
|
| 89 |
+
},
|
| 90 |
+
body: {
|
| 91 |
+
backgroundColor: mode === "light" ? "#f8f9fa" : "#0a0a0a",
|
| 92 |
},
|
| 93 |
},
|
| 94 |
},
|
client/src/context/LeaderboardContext.jsx
CHANGED
|
@@ -21,34 +21,38 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 21 |
|
| 22 |
// Filter functions for categories
|
| 23 |
const filterByTag = useCallback((tag, boards) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
return (
|
| 25 |
-
boards?.filter(
|
| 26 |
-
(
|
| 27 |
-
board.tags?.includes(tag) || board.consolidated_tags?.includes(tag)
|
| 28 |
) || []
|
| 29 |
);
|
| 30 |
}, []);
|
| 31 |
|
| 32 |
const filterByLanguage = useCallback((boards) => {
|
| 33 |
return (
|
| 34 |
-
boards?.filter(
|
| 35 |
-
(
|
| 36 |
-
board.tags?.some((tag) => tag.startsWith("language:")) ||
|
| 37 |
-
board.consolidated_tags?.some((tag) => tag.startsWith("language:"))
|
| 38 |
) || []
|
| 39 |
);
|
| 40 |
}, []);
|
| 41 |
|
| 42 |
const filterByVision = useCallback((boards) => {
|
| 43 |
return (
|
| 44 |
-
boards?.filter(
|
| 45 |
-
(
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
) ||
|
| 49 |
-
board.consolidated_tags?.some(
|
| 50 |
-
(tag) => tag === "modality:video" || tag === "modality:image"
|
| 51 |
-
)
|
| 52 |
) || []
|
| 53 |
);
|
| 54 |
}, []);
|
|
@@ -57,10 +61,11 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 57 |
const categorizedTags = [
|
| 58 |
"eval:code",
|
| 59 |
"eval:math",
|
|
|
|
| 60 |
"modality:video",
|
| 61 |
"modality:image",
|
| 62 |
"modality:audio",
|
| 63 |
-
"modality:
|
| 64 |
"domain:financial",
|
| 65 |
"domain:medical",
|
| 66 |
"domain:legal",
|
|
@@ -68,21 +73,15 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 68 |
|
| 69 |
return (
|
| 70 |
boards?.filter((board) => {
|
| 71 |
-
if (
|
| 72 |
-
(!board.tags || board.tags.length === 0) &&
|
| 73 |
-
(!board.consolidated_tags || board.consolidated_tags.length === 0)
|
| 74 |
-
) {
|
| 75 |
return true;
|
| 76 |
}
|
| 77 |
|
| 78 |
const hasNoTagsInCategory = !board.tags?.some(
|
| 79 |
(tag) => categorizedTags.includes(tag) || tag.startsWith("language:")
|
| 80 |
);
|
| 81 |
-
const hasNoConsolidatedTagsInCategory = !board.consolidated_tags?.some(
|
| 82 |
-
(tag) => categorizedTags.includes(tag) || tag.startsWith("language:")
|
| 83 |
-
);
|
| 84 |
|
| 85 |
-
return hasNoTagsInCategory
|
| 86 |
}) || []
|
| 87 |
);
|
| 88 |
}, []);
|
|
@@ -92,6 +91,11 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 92 |
if (!leaderboards) return [];
|
| 93 |
|
| 94 |
return [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
{
|
| 96 |
id: "code",
|
| 97 |
title: "Code",
|
|
@@ -113,11 +117,6 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 113 |
title: "Audio",
|
| 114 |
data: filterByTag("modality:audio", leaderboards),
|
| 115 |
},
|
| 116 |
-
{
|
| 117 |
-
id: "agentic",
|
| 118 |
-
title: "Agentic",
|
| 119 |
-
data: filterByTag("modality:tools", leaderboards),
|
| 120 |
-
},
|
| 121 |
{
|
| 122 |
id: "financial",
|
| 123 |
title: "Financial",
|
|
@@ -133,6 +132,11 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 133 |
title: "Legal",
|
| 134 |
data: filterByTag("domain:legal", leaderboards),
|
| 135 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
{
|
| 137 |
id: "uncategorized",
|
| 138 |
title: "Uncategorized",
|
|
@@ -149,7 +153,22 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 149 |
|
| 150 |
// Get sections with data
|
| 151 |
const sections = useMemo(() => {
|
| 152 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 153 |
}, [allSections]);
|
| 154 |
|
| 155 |
// Filter leaderboards based on search query and arena toggle
|
|
@@ -169,6 +188,8 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 169 |
"test:",
|
| 170 |
"modality:",
|
| 171 |
"submission:",
|
|
|
|
|
|
|
| 172 |
];
|
| 173 |
|
| 174 |
filtered = filtered.filter((board) => {
|
|
@@ -177,12 +198,7 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 177 |
);
|
| 178 |
|
| 179 |
if (isTagSearch) {
|
| 180 |
-
return (
|
| 181 |
-
board.tags?.some((tag) => tag.toLowerCase().includes(query)) ||
|
| 182 |
-
board.consolidated_tags?.some((tag) =>
|
| 183 |
-
tag.toLowerCase().includes(query)
|
| 184 |
-
)
|
| 185 |
-
);
|
| 186 |
}
|
| 187 |
|
| 188 |
return board.card_data?.title?.toLowerCase().includes(query);
|
|
@@ -191,10 +207,8 @@ export const LeaderboardProvider = ({ children }) => {
|
|
| 191 |
|
| 192 |
// Filter arena only
|
| 193 |
if (arenaOnly) {
|
| 194 |
-
filtered = filtered.filter(
|
| 195 |
-
(
|
| 196 |
-
board.tags?.includes("judge:humans") ||
|
| 197 |
-
board.consolidated_tags?.includes("judge:humans")
|
| 198 |
);
|
| 199 |
}
|
| 200 |
|
|
|
|
| 21 |
|
| 22 |
// Filter functions for categories
|
| 23 |
const filterByTag = useCallback((tag, boards) => {
|
| 24 |
+
const searchTag = tag.toLowerCase();
|
| 25 |
+
console.log("Filtering by tag:", {
|
| 26 |
+
searchTag,
|
| 27 |
+
boards: boards?.map((board) => ({
|
| 28 |
+
id: board.id,
|
| 29 |
+
tags: board.tags,
|
| 30 |
+
matches: {
|
| 31 |
+
tags: board.tags?.some((t) => t.toLowerCase() === searchTag),
|
| 32 |
+
},
|
| 33 |
+
})),
|
| 34 |
+
});
|
| 35 |
return (
|
| 36 |
+
boards?.filter((board) =>
|
| 37 |
+
board.tags?.some((t) => t.toLowerCase() === searchTag)
|
|
|
|
| 38 |
) || []
|
| 39 |
);
|
| 40 |
}, []);
|
| 41 |
|
| 42 |
const filterByLanguage = useCallback((boards) => {
|
| 43 |
return (
|
| 44 |
+
boards?.filter((board) =>
|
| 45 |
+
board.tags?.some((tag) => tag.startsWith("language:"))
|
|
|
|
|
|
|
| 46 |
) || []
|
| 47 |
);
|
| 48 |
}, []);
|
| 49 |
|
| 50 |
const filterByVision = useCallback((boards) => {
|
| 51 |
return (
|
| 52 |
+
boards?.filter((board) =>
|
| 53 |
+
board.tags?.some(
|
| 54 |
+
(tag) => tag === "modality:video" || tag === "modality:image"
|
| 55 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
) || []
|
| 57 |
);
|
| 58 |
}, []);
|
|
|
|
| 61 |
const categorizedTags = [
|
| 62 |
"eval:code",
|
| 63 |
"eval:math",
|
| 64 |
+
"eval:safety",
|
| 65 |
"modality:video",
|
| 66 |
"modality:image",
|
| 67 |
"modality:audio",
|
| 68 |
+
"modality:agent",
|
| 69 |
"domain:financial",
|
| 70 |
"domain:medical",
|
| 71 |
"domain:legal",
|
|
|
|
| 73 |
|
| 74 |
return (
|
| 75 |
boards?.filter((board) => {
|
| 76 |
+
if (!board.tags || board.tags.length === 0) {
|
|
|
|
|
|
|
|
|
|
| 77 |
return true;
|
| 78 |
}
|
| 79 |
|
| 80 |
const hasNoTagsInCategory = !board.tags?.some(
|
| 81 |
(tag) => categorizedTags.includes(tag) || tag.startsWith("language:")
|
| 82 |
);
|
|
|
|
|
|
|
|
|
|
| 83 |
|
| 84 |
+
return hasNoTagsInCategory;
|
| 85 |
}) || []
|
| 86 |
);
|
| 87 |
}, []);
|
|
|
|
| 91 |
if (!leaderboards) return [];
|
| 92 |
|
| 93 |
return [
|
| 94 |
+
{
|
| 95 |
+
id: "agentic",
|
| 96 |
+
title: "Agentic",
|
| 97 |
+
data: filterByTag("modality:agent", leaderboards),
|
| 98 |
+
},
|
| 99 |
{
|
| 100 |
id: "code",
|
| 101 |
title: "Code",
|
|
|
|
| 117 |
title: "Audio",
|
| 118 |
data: filterByTag("modality:audio", leaderboards),
|
| 119 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 120 |
{
|
| 121 |
id: "financial",
|
| 122 |
title: "Financial",
|
|
|
|
| 132 |
title: "Legal",
|
| 133 |
data: filterByTag("domain:legal", leaderboards),
|
| 134 |
},
|
| 135 |
+
{
|
| 136 |
+
id: "safety",
|
| 137 |
+
title: "Safety",
|
| 138 |
+
data: filterByTag("eval:safety", leaderboards),
|
| 139 |
+
},
|
| 140 |
{
|
| 141 |
id: "uncategorized",
|
| 142 |
title: "Uncategorized",
|
|
|
|
| 153 |
|
| 154 |
// Get sections with data
|
| 155 |
const sections = useMemo(() => {
|
| 156 |
+
const filteredSections = allSections.filter((section) => {
|
| 157 |
+
console.log(`Section ${section.title}:`, {
|
| 158 |
+
data: section.data,
|
| 159 |
+
count: section.data.length,
|
| 160 |
+
boards: section.data.map((board) => ({
|
| 161 |
+
id: board.id,
|
| 162 |
+
tags: board.tags,
|
| 163 |
+
})),
|
| 164 |
+
});
|
| 165 |
+
return section.data.length > 0;
|
| 166 |
+
});
|
| 167 |
+
console.log(
|
| 168 |
+
"Final sections:",
|
| 169 |
+
filteredSections.map((s) => s.title)
|
| 170 |
+
);
|
| 171 |
+
return filteredSections;
|
| 172 |
}, [allSections]);
|
| 173 |
|
| 174 |
// Filter leaderboards based on search query and arena toggle
|
|
|
|
| 188 |
"test:",
|
| 189 |
"modality:",
|
| 190 |
"submission:",
|
| 191 |
+
"domain:",
|
| 192 |
+
"eval:",
|
| 193 |
];
|
| 194 |
|
| 195 |
filtered = filtered.filter((board) => {
|
|
|
|
| 198 |
);
|
| 199 |
|
| 200 |
if (isTagSearch) {
|
| 201 |
+
return board.tags?.some((tag) => tag.toLowerCase().includes(query));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 202 |
}
|
| 203 |
|
| 204 |
return board.card_data?.title?.toLowerCase().includes(query);
|
|
|
|
| 207 |
|
| 208 |
// Filter arena only
|
| 209 |
if (arenaOnly) {
|
| 210 |
+
filtered = filtered.filter((board) =>
|
| 211 |
+
board.tags?.includes("judge:humans")
|
|
|
|
|
|
|
| 212 |
);
|
| 213 |
}
|
| 214 |
|
client/src/pages/HowToSubmitPage/HowToSubmitPage.jsx
CHANGED
|
@@ -7,7 +7,12 @@ import {
|
|
| 7 |
Divider,
|
| 8 |
alpha,
|
| 9 |
Link,
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
} from "@mui/material";
|
|
|
|
| 11 |
import PageHeader from "../../components/PageHeader/PageHeader";
|
| 12 |
|
| 13 |
const StepNumber = ({ number }) => (
|
|
@@ -37,7 +42,7 @@ const Section = ({ title, children }) => (
|
|
| 37 |
elevation={0}
|
| 38 |
sx={{
|
| 39 |
border: "1px solid",
|
| 40 |
-
borderColor: "
|
| 41 |
borderRadius: 1,
|
| 42 |
overflow: "hidden",
|
| 43 |
mb: 3,
|
|
@@ -48,10 +53,7 @@ const Section = ({ title, children }) => (
|
|
| 48 |
px: 3,
|
| 49 |
py: 2,
|
| 50 |
borderBottom: "1px solid",
|
| 51 |
-
borderColor:
|
| 52 |
-
theme.palette.mode === "dark"
|
| 53 |
-
? alpha(theme.palette.divider, 0.1)
|
| 54 |
-
: "grey.200",
|
| 55 |
bgcolor: (theme) =>
|
| 56 |
theme.palette.mode === "dark"
|
| 57 |
? alpha(theme.palette.background.paper, 0.5)
|
|
@@ -86,45 +88,62 @@ const Tag = ({ children }) => (
|
|
| 86 |
</Box>
|
| 87 |
);
|
| 88 |
|
| 89 |
-
const
|
| 90 |
-
<
|
| 91 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
{title}
|
| 93 |
</Typography>
|
| 94 |
{description && (
|
| 95 |
-
<Typography variant="
|
| 96 |
{description}
|
| 97 |
</Typography>
|
| 98 |
)}
|
| 99 |
-
<
|
| 100 |
{tags.map((tag, index) => (
|
| 101 |
-
<Box key={index}>
|
| 102 |
<Tag>{tag}</Tag>
|
| 103 |
{explanations && explanations[index] && (
|
| 104 |
<Typography
|
| 105 |
-
component="span"
|
| 106 |
variant="body2"
|
| 107 |
-
sx={{
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
dangerouslySetInnerHTML={{ __html: explanations[index] }}
|
| 109 |
/>
|
| 110 |
)}
|
| 111 |
</Box>
|
| 112 |
))}
|
| 113 |
-
</
|
| 114 |
-
</
|
| 115 |
);
|
| 116 |
|
| 117 |
const CodeBlock = ({ children }) => (
|
| 118 |
<Box
|
| 119 |
sx={{
|
| 120 |
backgroundColor: (theme) =>
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
|
|
|
|
|
|
| 125 |
borderRadius: 1,
|
| 126 |
fontFamily: "monospace",
|
| 127 |
mb: 2,
|
|
|
|
| 128 |
"& .key": {
|
| 129 |
color: (theme) => theme.palette.primary.main,
|
| 130 |
},
|
|
@@ -142,10 +161,194 @@ const CodeBlock = ({ children }) => (
|
|
| 142 |
},
|
| 143 |
}}
|
| 144 |
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
{children}
|
| 146 |
</Box>
|
| 147 |
);
|
| 148 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
const HowToSubmitPage = () => {
|
| 150 |
return (
|
| 151 |
<Box sx={{ width: "100%", maxWidth: 1200, margin: "0 auto", padding: 4 }}>
|
|
@@ -160,176 +363,244 @@ const HowToSubmitPage = () => {
|
|
| 160 |
/>
|
| 161 |
|
| 162 |
<Section title="Configuration steps">
|
| 163 |
-
<
|
| 164 |
-
<
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 186 |
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 200 |
<Typography
|
| 201 |
-
variant="
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
color: "text.primary",
|
| 205 |
-
letterSpacing: "-0.01em",
|
| 206 |
-
}}
|
| 207 |
>
|
| 208 |
-
Define the type
|
| 209 |
-
</Typography>
|
| 210 |
-
</Stack>
|
| 211 |
-
<Box sx={{ pl: 7 }}>
|
| 212 |
-
<Typography variant="body2" color="text.secondary">
|
| 213 |
Add either the <strong>leaderboard</strong> or{" "}
|
| 214 |
-
<strong>arena</strong> tag
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 231 |
</Typography>
|
| 232 |
-
</
|
| 233 |
-
<
|
| 234 |
<Typography variant="body2" color="text.secondary">
|
| 235 |
Include a <strong>short_description</strong> field to
|
| 236 |
-
explain the purpose of your evaluation
|
| 237 |
</Typography>
|
| 238 |
-
</
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
<Stack spacing={3}>
|
| 242 |
-
<Stack direction="row" spacing={2} alignItems="center">
|
| 243 |
-
<StepNumber number={3} />
|
| 244 |
-
<Typography
|
| 245 |
-
variant="subtitle1"
|
| 246 |
-
sx={{
|
| 247 |
-
fontWeight: 600,
|
| 248 |
-
color: "text.primary",
|
| 249 |
-
letterSpacing: "-0.01em",
|
| 250 |
-
}}
|
| 251 |
-
>
|
| 252 |
-
Specify metadata
|
| 253 |
-
</Typography>
|
| 254 |
-
</Stack>
|
| 255 |
-
<Box sx={{ pl: 7 }}>
|
| 256 |
<Typography variant="body2" color="text.secondary">
|
| 257 |
Add <strong>metadata tags</strong> to categorize your
|
| 258 |
-
evaluation
|
| 259 |
</Typography>
|
| 260 |
-
</
|
| 261 |
-
</
|
| 262 |
-
</
|
| 263 |
-
</
|
|
|
|
| 264 |
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
}
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
<
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
<span className="punctuation"> -</span>{" "}
|
| 323 |
-
<span className="value">domain:financial</span>{" "}
|
| 324 |
-
<span className="comment">
|
| 325 |
-
# Specific domain
|
| 326 |
-
</span>
|
| 327 |
-
<br />
|
| 328 |
-
---
|
| 329 |
-
</CodeBlock>
|
| 330 |
-
</Box>
|
| 331 |
</Box>
|
| 332 |
-
</
|
| 333 |
</Section>
|
| 334 |
|
| 335 |
<Section title="What do the tags mean?">
|
|
@@ -350,8 +621,6 @@ const HowToSubmitPage = () => {
|
|
| 350 |
]}
|
| 351 |
/>
|
| 352 |
|
| 353 |
-
<Divider sx={{ my: 3 }} />
|
| 354 |
-
|
| 355 |
<TagSection
|
| 356 |
title="Test set status"
|
| 357 |
description="Arenas are not concerned by this category."
|
|
@@ -364,8 +633,6 @@ const HowToSubmitPage = () => {
|
|
| 364 |
]}
|
| 365 |
/>
|
| 366 |
|
| 367 |
-
<Divider sx={{ my: 3 }} />
|
| 368 |
-
|
| 369 |
<TagSection
|
| 370 |
title="Judges"
|
| 371 |
tags={[
|
|
@@ -382,11 +649,9 @@ const HowToSubmitPage = () => {
|
|
| 382 |
]}
|
| 383 |
/>
|
| 384 |
|
| 385 |
-
<Divider sx={{ my: 3 }} />
|
| 386 |
-
|
| 387 |
<TagSection
|
| 388 |
title="Modalities"
|
| 389 |
-
description="Can be any (or several) of the following list
|
| 390 |
tags={[
|
| 391 |
"modality:text",
|
| 392 |
"modality:image",
|
|
@@ -405,11 +670,9 @@ const HowToSubmitPage = () => {
|
|
| 405 |
]}
|
| 406 |
/>
|
| 407 |
|
| 408 |
-
<Divider sx={{ my: 3 }} />
|
| 409 |
-
|
| 410 |
<TagSection
|
| 411 |
title="Evaluation categories"
|
| 412 |
-
description="Can be any (or several) of the following list
|
| 413 |
tags={[
|
| 414 |
"eval:generation",
|
| 415 |
"eval:math",
|
|
@@ -428,25 +691,27 @@ const HowToSubmitPage = () => {
|
|
| 428 |
]}
|
| 429 |
/>
|
| 430 |
|
| 431 |
-
<Divider sx={{ my: 3 }} />
|
| 432 |
-
|
| 433 |
<TagSection
|
| 434 |
title="Language"
|
| 435 |
-
description="You can indicate the languages covered by your benchmark like so: language:mylanguage.
|
| 436 |
-
tags={["language:english", "language:french"]}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 437 |
/>
|
| 438 |
|
| 439 |
-
<Divider sx={{ my: 3 }} />
|
| 440 |
-
|
| 441 |
<TagSection
|
| 442 |
title="Domain"
|
| 443 |
description="Indicates the specific domain of the leaderboard:"
|
| 444 |
tags={["domain:financial", "domain:medical", "domain:legal"]}
|
| 445 |
/>
|
|
|
|
| 446 |
<Typography
|
| 447 |
variant="body2"
|
| 448 |
sx={{
|
| 449 |
-
mt:
|
| 450 |
color: "text.secondary",
|
| 451 |
fontSize: "0.875rem",
|
| 452 |
fontStyle: "italic",
|
|
|
|
| 7 |
Divider,
|
| 8 |
alpha,
|
| 9 |
Link,
|
| 10 |
+
Grid,
|
| 11 |
+
InputLabel,
|
| 12 |
+
Tooltip,
|
| 13 |
+
IconButton,
|
| 14 |
} from "@mui/material";
|
| 15 |
+
import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined";
|
| 16 |
import PageHeader from "../../components/PageHeader/PageHeader";
|
| 17 |
|
| 18 |
const StepNumber = ({ number }) => (
|
|
|
|
| 42 |
elevation={0}
|
| 43 |
sx={{
|
| 44 |
border: "1px solid",
|
| 45 |
+
borderColor: "divider",
|
| 46 |
borderRadius: 1,
|
| 47 |
overflow: "hidden",
|
| 48 |
mb: 3,
|
|
|
|
| 53 |
px: 3,
|
| 54 |
py: 2,
|
| 55 |
borderBottom: "1px solid",
|
| 56 |
+
borderColor: "divider",
|
|
|
|
|
|
|
|
|
|
| 57 |
bgcolor: (theme) =>
|
| 58 |
theme.palette.mode === "dark"
|
| 59 |
? alpha(theme.palette.background.paper, 0.5)
|
|
|
|
| 88 |
</Box>
|
| 89 |
);
|
| 90 |
|
| 91 |
+
const TagCard = ({ title, description, tags, explanations }) => (
|
| 92 |
+
<Paper
|
| 93 |
+
elevation={1}
|
| 94 |
+
sx={{
|
| 95 |
+
p: 3,
|
| 96 |
+
height: "100%",
|
| 97 |
+
display: "flex",
|
| 98 |
+
flexDirection: "column",
|
| 99 |
+
borderRadius: 2,
|
| 100 |
+
border: "1px solid",
|
| 101 |
+
borderColor: "grey.200",
|
| 102 |
+
}}
|
| 103 |
+
>
|
| 104 |
+
<Typography variant="h6" sx={{ fontWeight: 600, mb: 2 }}>
|
| 105 |
{title}
|
| 106 |
</Typography>
|
| 107 |
{description && (
|
| 108 |
+
<Typography variant="body2" sx={{ mb: 2, color: "text.secondary" }}>
|
| 109 |
{description}
|
| 110 |
</Typography>
|
| 111 |
)}
|
| 112 |
+
<Box sx={{ flex: 1 }}>
|
| 113 |
{tags.map((tag, index) => (
|
| 114 |
+
<Box key={index} sx={{ mb: 2 }}>
|
| 115 |
<Tag>{tag}</Tag>
|
| 116 |
{explanations && explanations[index] && (
|
| 117 |
<Typography
|
|
|
|
| 118 |
variant="body2"
|
| 119 |
+
sx={{
|
| 120 |
+
color: "text.secondary",
|
| 121 |
+
mt: 1,
|
| 122 |
+
display: "block",
|
| 123 |
+
}}
|
| 124 |
dangerouslySetInnerHTML={{ __html: explanations[index] }}
|
| 125 |
/>
|
| 126 |
)}
|
| 127 |
</Box>
|
| 128 |
))}
|
| 129 |
+
</Box>
|
| 130 |
+
</Paper>
|
| 131 |
);
|
| 132 |
|
| 133 |
const CodeBlock = ({ children }) => (
|
| 134 |
<Box
|
| 135 |
sx={{
|
| 136 |
backgroundColor: (theme) =>
|
| 137 |
+
alpha(
|
| 138 |
+
theme.palette.primary.main,
|
| 139 |
+
theme.palette.mode === "dark" ? 0.15 : 0.05
|
| 140 |
+
),
|
| 141 |
+
px: 2,
|
| 142 |
+
py: 4,
|
| 143 |
borderRadius: 1,
|
| 144 |
fontFamily: "monospace",
|
| 145 |
mb: 2,
|
| 146 |
+
position: "relative",
|
| 147 |
"& .key": {
|
| 148 |
color: (theme) => theme.palette.primary.main,
|
| 149 |
},
|
|
|
|
| 161 |
},
|
| 162 |
}}
|
| 163 |
>
|
| 164 |
+
<InputLabel
|
| 165 |
+
sx={{
|
| 166 |
+
position: "absolute",
|
| 167 |
+
right: 8,
|
| 168 |
+
top: 8,
|
| 169 |
+
fontSize: "0.75rem",
|
| 170 |
+
color: "text.secondary",
|
| 171 |
+
fontFamily: "monospace",
|
| 172 |
+
bgcolor: "background.paper",
|
| 173 |
+
px: 1,
|
| 174 |
+
py: 0.5,
|
| 175 |
+
borderRadius: 1,
|
| 176 |
+
border: "1px solid",
|
| 177 |
+
borderColor: "divider",
|
| 178 |
+
zIndex: 1,
|
| 179 |
+
}}
|
| 180 |
+
>
|
| 181 |
+
README.md
|
| 182 |
+
</InputLabel>
|
| 183 |
{children}
|
| 184 |
</Box>
|
| 185 |
);
|
| 186 |
|
| 187 |
+
const getTagEmoji = (tag) => {
|
| 188 |
+
const type = tag.split(":")[0];
|
| 189 |
+
const name = tag.split(":")[1];
|
| 190 |
+
|
| 191 |
+
const emojiMap = {
|
| 192 |
+
submission: {
|
| 193 |
+
automatic: "🤖",
|
| 194 |
+
semiautomatic: "🔄",
|
| 195 |
+
manual: "👨💻",
|
| 196 |
+
closed: "🔒",
|
| 197 |
+
},
|
| 198 |
+
test: {
|
| 199 |
+
public: "👀",
|
| 200 |
+
mix: "🔀",
|
| 201 |
+
private: "🔐",
|
| 202 |
+
rolling: "🎲",
|
| 203 |
+
},
|
| 204 |
+
judge: {
|
| 205 |
+
function: "⚙️",
|
| 206 |
+
model: "🧠",
|
| 207 |
+
humans: "👥",
|
| 208 |
+
vibe_check: "✨",
|
| 209 |
+
},
|
| 210 |
+
modality: {
|
| 211 |
+
text: "📝",
|
| 212 |
+
image: "🖼️",
|
| 213 |
+
audio: "🎵",
|
| 214 |
+
video: "🎥",
|
| 215 |
+
tools: "🛠️",
|
| 216 |
+
artefacts: "🏺",
|
| 217 |
+
},
|
| 218 |
+
eval: {
|
| 219 |
+
generation: "✨",
|
| 220 |
+
math: "🔢",
|
| 221 |
+
code: "💻",
|
| 222 |
+
performance: "⚡",
|
| 223 |
+
safety: "🛡️",
|
| 224 |
+
},
|
| 225 |
+
task: {
|
| 226 |
+
rag: "🔍",
|
| 227 |
+
},
|
| 228 |
+
language: {
|
| 229 |
+
english: "🇬🇧",
|
| 230 |
+
french: "🇫🇷",
|
| 231 |
+
whatever: "🌍",
|
| 232 |
+
},
|
| 233 |
+
domain: {
|
| 234 |
+
financial: "💰",
|
| 235 |
+
medical: "⚕️",
|
| 236 |
+
legal: "⚖️",
|
| 237 |
+
},
|
| 238 |
+
};
|
| 239 |
+
|
| 240 |
+
return emojiMap[type]?.[name] || "🏷️";
|
| 241 |
+
};
|
| 242 |
+
|
| 243 |
+
const TagItem = ({ tag, explanation }) => {
|
| 244 |
+
// Extract the name without prefix
|
| 245 |
+
const name = tag.split(":")[1];
|
| 246 |
+
const emoji = getTagEmoji(tag);
|
| 247 |
+
|
| 248 |
+
return (
|
| 249 |
+
<Paper
|
| 250 |
+
elevation={0}
|
| 251 |
+
sx={{
|
| 252 |
+
height: "100%",
|
| 253 |
+
display: "flex",
|
| 254 |
+
flexDirection: "column",
|
| 255 |
+
borderRadius: 2,
|
| 256 |
+
border: "1px solid",
|
| 257 |
+
borderColor: "divider",
|
| 258 |
+
overflow: "hidden",
|
| 259 |
+
}}
|
| 260 |
+
>
|
| 261 |
+
<Box
|
| 262 |
+
sx={{
|
| 263 |
+
bgcolor: (theme) =>
|
| 264 |
+
alpha(
|
| 265 |
+
theme.palette.primary.main,
|
| 266 |
+
theme.palette.mode === "dark" ? 0.15 : 0.05
|
| 267 |
+
),
|
| 268 |
+
py: 2,
|
| 269 |
+
px: 2,
|
| 270 |
+
borderRadius: 0,
|
| 271 |
+
mb: 2,
|
| 272 |
+
position: "relative",
|
| 273 |
+
}}
|
| 274 |
+
>
|
| 275 |
+
<Typography
|
| 276 |
+
variant="h6"
|
| 277 |
+
sx={{
|
| 278 |
+
fontWeight: 700,
|
| 279 |
+
color: "text.primary",
|
| 280 |
+
letterSpacing: "-0.02em",
|
| 281 |
+
pr: 5,
|
| 282 |
+
textTransform: "capitalize",
|
| 283 |
+
}}
|
| 284 |
+
>
|
| 285 |
+
{emoji} {name}
|
| 286 |
+
</Typography>
|
| 287 |
+
</Box>
|
| 288 |
+
<Box sx={{ px: 2, pb: 2 }}>
|
| 289 |
+
<Typography
|
| 290 |
+
variant="body2"
|
| 291 |
+
sx={{
|
| 292 |
+
color: "text.secondary",
|
| 293 |
+
mb: 2,
|
| 294 |
+
fontSize: "0.75rem",
|
| 295 |
+
}}
|
| 296 |
+
>
|
| 297 |
+
<strong>{tag.split(":")[0]}</strong>:{tag.split(":")[1]}
|
| 298 |
+
</Typography>
|
| 299 |
+
{explanation && (
|
| 300 |
+
<Typography
|
| 301 |
+
variant="body2"
|
| 302 |
+
sx={{
|
| 303 |
+
color: "text.secondary",
|
| 304 |
+
flex: 1,
|
| 305 |
+
}}
|
| 306 |
+
dangerouslySetInnerHTML={{ __html: explanation }}
|
| 307 |
+
/>
|
| 308 |
+
)}
|
| 309 |
+
</Box>
|
| 310 |
+
</Paper>
|
| 311 |
+
);
|
| 312 |
+
};
|
| 313 |
+
|
| 314 |
+
const TagSection = ({ title, description, tags, explanations }) => {
|
| 315 |
+
// Determine if this section should have 4 columns
|
| 316 |
+
const shouldHaveFourColumns = [
|
| 317 |
+
"Submission type",
|
| 318 |
+
"Test set status",
|
| 319 |
+
"Judges",
|
| 320 |
+
].includes(title);
|
| 321 |
+
|
| 322 |
+
return (
|
| 323 |
+
<Box sx={{ mb: 8 }}>
|
| 324 |
+
<Typography variant="h6" sx={{ fontWeight: 600, mb: 1 }}>
|
| 325 |
+
{title}
|
| 326 |
+
</Typography>
|
| 327 |
+
{description && (
|
| 328 |
+
<Typography variant="body1" sx={{ mb: 4, color: "text.secondary" }}>
|
| 329 |
+
{description}
|
| 330 |
+
</Typography>
|
| 331 |
+
)}
|
| 332 |
+
<Grid container spacing={2}>
|
| 333 |
+
{tags.map((tag, index) => (
|
| 334 |
+
<Grid
|
| 335 |
+
item
|
| 336 |
+
xs={12}
|
| 337 |
+
sm={6}
|
| 338 |
+
md={shouldHaveFourColumns ? 3 : 4}
|
| 339 |
+
key={index}
|
| 340 |
+
>
|
| 341 |
+
<TagItem
|
| 342 |
+
tag={tag}
|
| 343 |
+
explanation={explanations ? explanations[index] : null}
|
| 344 |
+
/>
|
| 345 |
+
</Grid>
|
| 346 |
+
))}
|
| 347 |
+
</Grid>
|
| 348 |
+
</Box>
|
| 349 |
+
);
|
| 350 |
+
};
|
| 351 |
+
|
| 352 |
const HowToSubmitPage = () => {
|
| 353 |
return (
|
| 354 |
<Box sx={{ width: "100%", maxWidth: 1200, margin: "0 auto", padding: 4 }}>
|
|
|
|
| 363 |
/>
|
| 364 |
|
| 365 |
<Section title="Configuration steps">
|
| 366 |
+
<Box sx={{ display: "flex", gap: 4 }}>
|
| 367 |
+
<Stack spacing={4} sx={{ flex: "0 0 45%" }}>
|
| 368 |
+
<Stack spacing={3}>
|
| 369 |
+
<Stack direction="row" spacing={2} alignItems="center">
|
| 370 |
+
<StepNumber number={1} />
|
| 371 |
+
<Typography
|
| 372 |
+
variant="subtitle1"
|
| 373 |
+
sx={{
|
| 374 |
+
fontWeight: 600,
|
| 375 |
+
color: "text.primary",
|
| 376 |
+
letterSpacing: "-0.01em",
|
| 377 |
+
}}
|
| 378 |
+
>
|
| 379 |
+
Create a Space
|
| 380 |
+
</Typography>
|
| 381 |
+
</Stack>
|
| 382 |
+
<Box sx={{ pl: 7 }}>
|
| 383 |
+
<Typography variant="body2" color="text.secondary">
|
| 384 |
+
Your leaderboard must be hosted on a{" "}
|
| 385 |
+
<Link
|
| 386 |
+
href="https://huggingface.co/docs/hub/spaces"
|
| 387 |
+
target="_blank"
|
| 388 |
+
rel="noopener noreferrer"
|
| 389 |
+
>
|
| 390 |
+
Hugging Face Space
|
| 391 |
+
</Link>
|
| 392 |
+
.
|
| 393 |
+
</Typography>
|
| 394 |
+
</Box>
|
| 395 |
+
</Stack>
|
| 396 |
|
| 397 |
+
<Stack spacing={3}>
|
| 398 |
+
<Stack direction="row" spacing={2} alignItems="center">
|
| 399 |
+
<StepNumber number={2} />
|
| 400 |
+
<Typography
|
| 401 |
+
variant="subtitle1"
|
| 402 |
+
sx={{
|
| 403 |
+
fontWeight: 600,
|
| 404 |
+
color: "text.primary",
|
| 405 |
+
letterSpacing: "-0.01em",
|
| 406 |
+
}}
|
| 407 |
+
>
|
| 408 |
+
Add metadata
|
| 409 |
+
</Typography>
|
| 410 |
+
</Stack>
|
| 411 |
+
<Box sx={{ pl: 7 }}>
|
| 412 |
+
<Typography
|
| 413 |
+
variant="body2"
|
| 414 |
+
color="text.secondary"
|
| 415 |
+
sx={{ mb: 2 }}
|
| 416 |
+
>
|
| 417 |
+
Like{" "}
|
| 418 |
+
<Link
|
| 419 |
+
href="https://huggingface.co/docs/hub/model-cards"
|
| 420 |
+
target="_blank"
|
| 421 |
+
rel="noopener noreferrer"
|
| 422 |
+
>
|
| 423 |
+
model cards
|
| 424 |
+
</Link>
|
| 425 |
+
, your Space's{" "}
|
| 426 |
+
<InputLabel
|
| 427 |
+
sx={{
|
| 428 |
+
display: "inline-flex",
|
| 429 |
+
fontSize: "0.75rem",
|
| 430 |
+
color: "text.secondary",
|
| 431 |
+
fontFamily: "monospace",
|
| 432 |
+
bgcolor: "background.paper",
|
| 433 |
+
px: 1,
|
| 434 |
+
py: 0.5,
|
| 435 |
+
borderRadius: 1,
|
| 436 |
+
border: "1px solid",
|
| 437 |
+
borderColor: "divider",
|
| 438 |
+
mx: 0.5,
|
| 439 |
+
}}
|
| 440 |
+
>
|
| 441 |
+
README.md
|
| 442 |
+
</InputLabel>{" "}
|
| 443 |
+
file should include specific <strong>metadata</strong> in a
|
| 444 |
+
YAML section at the top:
|
| 445 |
+
</Typography>
|
| 446 |
+
<ul
|
| 447 |
+
style={{
|
| 448 |
+
margin: 0,
|
| 449 |
+
paddingLeft: "20px",
|
| 450 |
+
color: "text.secondary",
|
| 451 |
+
}}
|
| 452 |
+
>
|
| 453 |
+
<li>
|
| 454 |
<Typography
|
| 455 |
+
variant="body2"
|
| 456 |
+
color="text.secondary"
|
| 457 |
+
sx={{ display: "flex", alignItems: "center", gap: 0.5 }}
|
|
|
|
|
|
|
|
|
|
| 458 |
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 459 |
Add either the <strong>leaderboard</strong> or{" "}
|
| 460 |
+
<strong>arena</strong> tag
|
| 461 |
+
<Tooltip
|
| 462 |
+
title={
|
| 463 |
+
<Box sx={{ p: 1, maxWidth: 300 }}>
|
| 464 |
+
<Typography
|
| 465 |
+
variant="subtitle2"
|
| 466 |
+
sx={{
|
| 467 |
+
mb: 1,
|
| 468 |
+
fontWeight: 600,
|
| 469 |
+
color: "text.secondary",
|
| 470 |
+
}}
|
| 471 |
+
>
|
| 472 |
+
Choose between:
|
| 473 |
+
</Typography>
|
| 474 |
+
<Typography
|
| 475 |
+
variant="body2"
|
| 476 |
+
component="div"
|
| 477 |
+
sx={{ mb: 1 }}
|
| 478 |
+
>
|
| 479 |
+
• <strong>arena</strong> - for human evaluations
|
| 480 |
+
<br />
|
| 481 |
+
<Box component="span" sx={{ pl: 2 }}>
|
| 482 |
+
requires <Tag>judge:humans</Tag>
|
| 483 |
+
</Box>
|
| 484 |
+
</Typography>
|
| 485 |
+
<Typography variant="body2" component="div">
|
| 486 |
+
• <strong>leaderboard</strong> - for automated
|
| 487 |
+
evaluations
|
| 488 |
+
<br />
|
| 489 |
+
<Box component="span" sx={{ pl: 2 }}>
|
| 490 |
+
with <Tag>judge:function</Tag> or{" "}
|
| 491 |
+
<Tag>judge:model</Tag>
|
| 492 |
+
</Box>
|
| 493 |
+
</Typography>
|
| 494 |
+
</Box>
|
| 495 |
+
}
|
| 496 |
+
arrow
|
| 497 |
+
placement="right"
|
| 498 |
+
componentsProps={{
|
| 499 |
+
tooltip: {
|
| 500 |
+
sx: {
|
| 501 |
+
bgcolor: "background.paper",
|
| 502 |
+
color: "text.primary",
|
| 503 |
+
"& .MuiTooltip-arrow": {
|
| 504 |
+
color: "background.paper",
|
| 505 |
+
},
|
| 506 |
+
boxShadow: (theme) => theme.shadows[2],
|
| 507 |
+
},
|
| 508 |
+
},
|
| 509 |
+
}}
|
| 510 |
+
>
|
| 511 |
+
<IconButton
|
| 512 |
+
size="small"
|
| 513 |
+
sx={{
|
| 514 |
+
p: 0.5,
|
| 515 |
+
color: "text.secondary",
|
| 516 |
+
"&:hover": {
|
| 517 |
+
color: "primary.main",
|
| 518 |
+
bgcolor: (theme) =>
|
| 519 |
+
alpha(theme.palette.primary.main, 0.1),
|
| 520 |
+
},
|
| 521 |
+
}}
|
| 522 |
+
>
|
| 523 |
+
<InfoOutlinedIcon sx={{ fontSize: "1rem" }} />
|
| 524 |
+
</IconButton>
|
| 525 |
+
</Tooltip>
|
| 526 |
</Typography>
|
| 527 |
+
</li>
|
| 528 |
+
<li>
|
| 529 |
<Typography variant="body2" color="text.secondary">
|
| 530 |
Include a <strong>short_description</strong> field to
|
| 531 |
+
explain the purpose of your evaluation
|
| 532 |
</Typography>
|
| 533 |
+
</li>
|
| 534 |
+
<li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 535 |
<Typography variant="body2" color="text.secondary">
|
| 536 |
Add <strong>metadata tags</strong> to categorize your
|
| 537 |
+
evaluation (see examples on the right)
|
| 538 |
</Typography>
|
| 539 |
+
</li>
|
| 540 |
+
</ul>
|
| 541 |
+
</Box>
|
| 542 |
+
</Stack>
|
| 543 |
+
</Stack>
|
| 544 |
|
| 545 |
+
<Box sx={{ flex: 1 }}>
|
| 546 |
+
<CodeBlock>
|
| 547 |
+
---
|
| 548 |
+
<br />
|
| 549 |
+
<span className="key">short_description</span>
|
| 550 |
+
<span className="punctuation">:</span>{" "}
|
| 551 |
+
<span className="value">
|
| 552 |
+
Evaluating LLMs on math reasoning tasks
|
| 553 |
+
</span>
|
| 554 |
+
<br />
|
| 555 |
+
<span className="key">tags</span>
|
| 556 |
+
<span className="punctuation">:</span>
|
| 557 |
+
<br />
|
| 558 |
+
<span className="punctuation"> -</span>{" "}
|
| 559 |
+
<span className="value">leaderboard</span>
|
| 560 |
+
<span className="comment">
|
| 561 |
+
#
|
| 562 |
+
Type of leaderboard
|
| 563 |
+
</span>
|
| 564 |
+
<br />
|
| 565 |
+
<span className="punctuation"> -</span>{" "}
|
| 566 |
+
<span className="value">submission:automatic</span>{" "}
|
| 567 |
+
<span className="comment"># How models are submitted</span>
|
| 568 |
+
<br />
|
| 569 |
+
<span className="punctuation"> -</span>{" "}
|
| 570 |
+
<span className="value">test:public</span>{" "}
|
| 571 |
+
<span className="comment">
|
| 572 |
+
# Test set
|
| 573 |
+
visibility
|
| 574 |
+
</span>
|
| 575 |
+
<br />
|
| 576 |
+
<span className="punctuation"> -</span>{" "}
|
| 577 |
+
<span className="value">judge:function</span>{" "}
|
| 578 |
+
<span className="comment">
|
| 579 |
+
# Evaluation method
|
| 580 |
+
</span>
|
| 581 |
+
<br />
|
| 582 |
+
<span className="punctuation"> -</span>{" "}
|
| 583 |
+
<span className="value">modality:text</span>{" "}
|
| 584 |
+
<span className="comment">
|
| 585 |
+
# Input/output type
|
| 586 |
+
</span>
|
| 587 |
+
<br />
|
| 588 |
+
<span className="punctuation"> -</span>{" "}
|
| 589 |
+
<span className="value">language:english</span>{" "}
|
| 590 |
+
<span className="comment">
|
| 591 |
+
# Language coverage
|
| 592 |
+
</span>
|
| 593 |
+
<br />
|
| 594 |
+
<span className="punctuation"> -</span>{" "}
|
| 595 |
+
<span className="value">domain:financial</span>{" "}
|
| 596 |
+
<span className="comment">
|
| 597 |
+
# Specific domain
|
| 598 |
+
</span>
|
| 599 |
+
<br />
|
| 600 |
+
---
|
| 601 |
+
</CodeBlock>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 602 |
</Box>
|
| 603 |
+
</Box>
|
| 604 |
</Section>
|
| 605 |
|
| 606 |
<Section title="What do the tags mean?">
|
|
|
|
| 621 |
]}
|
| 622 |
/>
|
| 623 |
|
|
|
|
|
|
|
| 624 |
<TagSection
|
| 625 |
title="Test set status"
|
| 626 |
description="Arenas are not concerned by this category."
|
|
|
|
| 633 |
]}
|
| 634 |
/>
|
| 635 |
|
|
|
|
|
|
|
| 636 |
<TagSection
|
| 637 |
title="Judges"
|
| 638 |
tags={[
|
|
|
|
| 649 |
]}
|
| 650 |
/>
|
| 651 |
|
|
|
|
|
|
|
| 652 |
<TagSection
|
| 653 |
title="Modalities"
|
| 654 |
+
description="Can be any (or several) of the following list"
|
| 655 |
tags={[
|
| 656 |
"modality:text",
|
| 657 |
"modality:image",
|
|
|
|
| 670 |
]}
|
| 671 |
/>
|
| 672 |
|
|
|
|
|
|
|
| 673 |
<TagSection
|
| 674 |
title="Evaluation categories"
|
| 675 |
+
description="Can be any (or several) of the following list"
|
| 676 |
tags={[
|
| 677 |
"eval:generation",
|
| 678 |
"eval:math",
|
|
|
|
| 691 |
]}
|
| 692 |
/>
|
| 693 |
|
|
|
|
|
|
|
| 694 |
<TagSection
|
| 695 |
title="Language"
|
| 696 |
+
description="You can indicate the languages covered by your benchmark like so: language:mylanguage."
|
| 697 |
+
tags={["language:english", "language:french", "language:whatever"]}
|
| 698 |
+
explanations={[
|
| 699 |
+
"",
|
| 700 |
+
"",
|
| 701 |
+
"At the moment, we do not support language codes, please use the language name in English.",
|
| 702 |
+
]}
|
| 703 |
/>
|
| 704 |
|
|
|
|
|
|
|
| 705 |
<TagSection
|
| 706 |
title="Domain"
|
| 707 |
description="Indicates the specific domain of the leaderboard:"
|
| 708 |
tags={["domain:financial", "domain:medical", "domain:legal"]}
|
| 709 |
/>
|
| 710 |
+
|
| 711 |
<Typography
|
| 712 |
variant="body2"
|
| 713 |
sx={{
|
| 714 |
+
mt: 3,
|
| 715 |
color: "text.secondary",
|
| 716 |
fontSize: "0.875rem",
|
| 717 |
fontStyle: "italic",
|
client/src/pages/LeaderboardPage/LeaderboardPage.jsx
CHANGED
|
@@ -1,23 +1,10 @@
|
|
| 1 |
import React, { useState, useEffect } from "react";
|
| 2 |
-
import {
|
| 3 |
-
Box,
|
| 4 |
-
CircularProgress,
|
| 5 |
-
Stack,
|
| 6 |
-
Button,
|
| 7 |
-
FormControlLabel,
|
| 8 |
-
Switch,
|
| 9 |
-
TextField,
|
| 10 |
-
InputAdornment,
|
| 11 |
-
Typography,
|
| 12 |
-
} from "@mui/material";
|
| 13 |
-
import SearchIcon from "@mui/icons-material/Search";
|
| 14 |
import SearchOffIcon from "@mui/icons-material/SearchOff";
|
| 15 |
import Logo from "../../components/Logo/Logo";
|
| 16 |
import PageTitle from "../../components/PageTitle/PageTitle";
|
| 17 |
-
import PageHeader from "../../components/PageHeader/PageHeader";
|
| 18 |
import LeaderboardSection from "../../components/LeaderboardSection";
|
| 19 |
import LeaderboardFilters from "../../components/LeaderboardFilters/LeaderboardFilters";
|
| 20 |
-
import { alpha } from "@mui/material/styles";
|
| 21 |
import API_URLS from "../../config/api";
|
| 22 |
import {
|
| 23 |
LeaderboardProvider,
|
|
|
|
| 1 |
import React, { useState, useEffect } from "react";
|
| 2 |
+
import { Box, CircularProgress, Typography } from "@mui/material";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
import SearchOffIcon from "@mui/icons-material/SearchOff";
|
| 4 |
import Logo from "../../components/Logo/Logo";
|
| 5 |
import PageTitle from "../../components/PageTitle/PageTitle";
|
|
|
|
| 6 |
import LeaderboardSection from "../../components/LeaderboardSection";
|
| 7 |
import LeaderboardFilters from "../../components/LeaderboardFilters/LeaderboardFilters";
|
|
|
|
| 8 |
import API_URLS from "../../config/api";
|
| 9 |
import {
|
| 10 |
LeaderboardProvider,
|