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,
|