Skip to content

Commit 2b68ddb

Browse files
authored
Add leaderboard hyperlinks (#21)
* Added link to paper in nav bar * updated instructions for submitting to just go to project page and follow readme * Made text on hero section lighter, rephrased cta button 'get started' text * Made subtitles one liner * Added logo and rescaled 0-100 * fixed metrics range, and dangling word * Changed commercial/academic -> closed/open source. Added Chayan to leaderboard * Fixed col width * changed vllm affiliation to vllm sr team * Fixed premature scrollbar on loaderboard * added text wrapping to leaderboard affiliations * Added two new metrics accuracy and cost/1k query * Added eval metric explanation * spelling * Added website links to all routers and removed dangling word from leaderboard page
1 parent fd7ef37 commit 2b68ddb

5 files changed

Lines changed: 185 additions & 30 deletions

File tree

‎src/assets/images/hf-logo.svg‎

Lines changed: 8 additions & 0 deletions
Loading

‎src/data/mockData.ts‎

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ const routerMetadata: Record<
231231
modelPool: string[];
232232
paperUrl?: string;
233233
githubUrl?: string;
234+
websiteUrl?: string;
235+
huggingfaceUrl?: string;
234236
}
235237
> = {
236238
RouterDC: {
@@ -239,16 +241,18 @@ const routerMetadata: Record<
239241
description: 'Dual contrastive learning-based router with cost optimization',
240242
affiliation: 'SUSTech',
241243
modelPool: ['GPT-3.5', 'Claude-2', 'Gemini-Pro', 'Llama-2-13B'],
242-
paperUrl: 'https://arxiv.org/abs/2024.xxxxx',
243-
githubUrl: 'https://github.com/example/routerdc',
244+
paperUrl: 'https://arxiv.org/abs/2409.19886',
245+
websiteUrl: 'https://arxiv.org/abs/2409.19886',
246+
githubUrl: 'https://github.com/shuhao02/RouterDC',
244247
},
245248
azure: {
246-
name: 'Azure',
249+
name: 'Azure-Router',
247250
type: 'closed-source',
248251
description: "Microsoft Azure's model routing service",
249252
affiliation: 'Microsoft',
250253
modelPool: ['GPT-4', 'GPT-3.5', 'GPT-4-Turbo'],
251-
paperUrl: 'https://azure.microsoft.com/en-us/products/ai-services/openai-service',
254+
paperUrl: 'https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/model-router',
255+
websiteUrl: 'https://ai.azure.com/catalog/models/model-router',
252256
githubUrl: undefined,
253257
},
254258
carrot: {
@@ -257,16 +261,19 @@ const routerMetadata: Record<
257261
description: 'Cost-aware routing with dual contrastive learning approach',
258262
affiliation: 'UMich',
259263
modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B'],
260-
paperUrl: 'https://arxiv.org/abs/2024.xxxxx',
261-
githubUrl: 'https://github.com/example/carrot',
264+
paperUrl: 'https://arxiv.org/abs/2502.03261',
265+
websiteUrl: 'https://arxiv.org/abs/2502.03261',
266+
githubUrl: 'https://github.com/somerstep/CARROT',
267+
huggingfaceUrl: 'https://huggingface.co/CARROT-LLM-Routing',
262268
},
263269
gpt5: {
264270
name: 'GPT-5',
265271
type: 'closed-source',
266272
description: "OpenAI's internal routing system for GPT model family",
267273
affiliation: 'OpenAI',
268274
modelPool: ['GPT-5', 'GPT-4', 'GPT-3.5'],
269-
paperUrl: 'https://openai.com/research/gpt-5',
275+
paperUrl: 'https://openai.com/index/introducing-gpt-5/',
276+
websiteUrl: 'https://openai.com/index/introducing-gpt-5/',
270277
githubUrl: undefined,
271278
},
272279
graphrouter: {
@@ -275,34 +282,38 @@ const routerMetadata: Record<
275282
description: 'Graph neural network-based routing with semantic understanding',
276283
affiliation: 'UIUC',
277284
modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B', 'Mixtral-8x7B'],
278-
paperUrl: 'https://arxiv.org/abs/2024.xxxxx',
279-
githubUrl: 'https://github.com/example/graphrouter',
285+
paperUrl: 'https://arxiv.org/abs/2410.03834',
286+
websiteUrl: 'https://arxiv.org/abs/2410.03834',
287+
githubUrl: 'https://github.com/ulab-uiuc/GraphRouter',
280288
},
281289
mirt_bert: {
282290
name: 'MIRT-BERT',
283291
type: 'open-source',
284292
description: 'Multi-item response theory with BERT embeddings',
285293
affiliation: 'USTC',
286294
modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B'],
287-
paperUrl: 'https://arxiv.org/abs/2024.xxxxx',
288-
githubUrl: 'https://github.com/example/mirt-bert',
295+
paperUrl: 'https://arxiv.org/pdf/2506.01048',
296+
websiteUrl: 'https://arxiv.org/pdf/2506.01048',
297+
githubUrl: 'https://github.com/Mercidaiha/IRT-Router',
289298
},
290299
nirt_bert: {
291300
name: 'NIRT-BERT',
292301
type: 'open-source',
293302
description: 'Neural item response theory with BERT-based routing',
294303
affiliation: 'USTC',
295304
modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B'],
296-
paperUrl: 'https://arxiv.org/abs/2024.xxxxx',
297-
githubUrl: 'https://github.com/example/nirt-bert',
305+
paperUrl: 'https://arxiv.org/pdf/2506.01048',
306+
websiteUrl: 'https://arxiv.org/pdf/2506.01048',
307+
githubUrl: 'https://github.com/Mercidaiha/IRT-Router',
298308
},
299309
notdiamond: {
300310
name: 'NotDiamond',
301311
type: 'closed-source',
302312
description: 'Closed-source routing service with access to 60+ models',
303313
affiliation: 'NotDiamond',
304314
modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B', 'Mixtral-8x7B', 'Qwen-72B'],
305-
paperUrl: 'https://notdiamond.ai',
315+
paperUrl: 'https://www.notdiamond.ai/',
316+
websiteUrl: 'https://www.notdiamond.ai/',
306317
githubUrl: undefined,
307318
},
308319
routellm: {
@@ -311,8 +322,10 @@ const routerMetadata: Record<
311322
description: 'Binary selection between strong and weak models',
312323
affiliation: 'Berkeley',
313324
modelPool: ['GPT-4', 'GPT-3.5'],
314-
paperUrl: 'https://arxiv.org/abs/2024.xxxxx',
315-
githubUrl: 'https://github.com/example/routellm',
325+
paperUrl: 'https://arxiv.org/abs/2406.18665',
326+
websiteUrl: 'https://arxiv.org/abs/2406.18665',
327+
githubUrl: 'https://github.com/lm-sys/RouteLLM',
328+
huggingfaceUrl: 'https://huggingface.co/routellm',
316329
},
317330
routerbench_knn: {
318331
name: 'RouterBench-KNN',
@@ -321,34 +334,42 @@ const routerMetadata: Record<
321334
affiliation: 'Martian',
322335
modelPool: ['GPT-4', 'GPT-3.5', 'Claude-3'],
323336
paperUrl: 'https://arxiv.org/pdf/2403.12031',
337+
websiteUrl: 'https://arxiv.org/pdf/2403.12031',
324338
githubUrl: 'https://github.com/withmartian/routerbench',
339+
huggingfaceUrl: 'https://huggingface.co/datasets/withmartian/routerbench',
325340
},
326341
routerbench_mlp: {
327342
name: 'RouterBench-MLP',
328343
type: 'open-source',
329344
description: 'Multi-Layer Perceptron-based router benchmark',
330345
affiliation: 'Martian',
331346
modelPool: ['GPT-4', 'GPT-3.5', 'Claude-3'],
332-
paperUrl: 'https://arxiv.org/abs/2024.xxxxx',
333-
githubUrl: 'https://github.com/example/routerbench-mlp',
347+
paperUrl: 'https://arxiv.org/pdf/2403.12031',
348+
websiteUrl: 'https://arxiv.org/pdf/2403.12031',
349+
githubUrl: 'https://github.com/withmartian/routerbench',
350+
huggingfaceUrl: 'https://huggingface.co/datasets/withmartian/routerbench',
334351
},
335352
vllm: {
336353
name: 'vLLM-SR',
337354
type: 'open-source',
338355
description: 'vLLM-based routing service',
339356
affiliation: 'vLLM SR Team',
340357
modelPool: ['GPT-4', 'GPT-3.5'],
341-
paperUrl: 'https://vllm.ai',
358+
paperUrl: 'https://vllm-semantic-router.com/',
359+
websiteUrl: 'https://vllm-semantic-router.com/',
342360
githubUrl: 'https://github.com/vllm-project/semantic-router',
361+
huggingfaceUrl: 'https://huggingface.co/llm-semantic-router',
343362
},
344363
chayan: {
345364
name: 'Chayan',
346365
type: 'open-source',
347366
description: 'Chayan-based routing service',
348-
affiliation: 'Adaptive Classifier ',
367+
affiliation: 'Adaptive Classifier',
349368
modelPool: ['GPT-4', 'GPT-3.5'],
350-
paperUrl: 'https://arxiv.org/abs/2024.xxxxx',
351-
githubUrl: 'https://huggingface.co/adaptive-classifier/chayan',
369+
paperUrl: 'https://huggingface.co/adaptive-classifier/chayan',
370+
websiteUrl: 'https://huggingface.co/adaptive-classifier/chayan',
371+
githubUrl: undefined,
372+
huggingfaceUrl: 'https://huggingface.co/adaptive-classifier/chayan',
352373
}
353374
};
354375

‎src/pages/LeaderboardPage.css‎

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
.leaderboard-page .page-subtitle {
3737
font-size: 1.2rem;
3838
color: #666;
39-
max-width: 600px;
39+
max-width: 800px;
4040
margin: 0 auto;
4141
text-shadow: none;
4242
}
@@ -327,7 +327,7 @@
327327
/* Actual text wrapping */
328328
.router-name,
329329
.affiliation {
330-
white-space: normal !important;
330+
white-space: normal;
331331
overflow-wrap: break-word;
332332
word-break: break-word;
333333
}
@@ -345,13 +345,96 @@
345345
gap: 0.25rem;
346346
}
347347

348+
.router-link-badges {
349+
display: flex;
350+
flex-wrap: wrap;
351+
gap: 0.35rem;
352+
}
353+
354+
.router-link-pill {
355+
display: inline-flex;
356+
align-items: center;
357+
justify-content: center;
358+
width: 32px;
359+
height: 24px;
360+
padding: 0;
361+
border-radius: 999px;
362+
text-decoration: none;
363+
color: #1f2937;
364+
background: #e5e7eb;
365+
transition: background 0.2s ease, color 0.2s ease, transform 0.2s ease;
366+
}
367+
368+
.router-link-pill.github {
369+
background: rgba(15, 23, 42, 0.08);
370+
color: #111827;
371+
}
372+
373+
.router-link-pill.huggingface {
374+
background: rgba(250, 204, 21, 0.3);
375+
color: #92400e;
376+
}
377+
378+
.router-link-pill:hover {
379+
background: #2563eb;
380+
color: #ffffff;
381+
transform: translateY(-1px);
382+
}
383+
384+
.router-link-pill .hf-logo {
385+
width: 18px;
386+
height: 18px;
387+
display: inline-block;
388+
}
389+
348390
.router-name {
349391
font-size: 1rem;
350392
font-weight: 600;
351393
margin: 0;
352394
color: #1f2937;
353395
}
354396

397+
.router-name-link {
398+
text-decoration: none;
399+
color: inherit;
400+
transition: color 0.2s ease;
401+
}
402+
403+
.router-name-link:hover {
404+
color: #2563eb;
405+
}
406+
407+
.router-name-link .router-name {
408+
margin: 0;
409+
transition: color 0.2s ease;
410+
display: inline;
411+
text-decoration: none;
412+
position: relative;
413+
}
414+
415+
.router-name-link .router-name::after {
416+
content: '';
417+
position: absolute;
418+
left: 0;
419+
bottom: -0.15rem;
420+
width: 100%;
421+
height: 2px;
422+
background: #2563eb;
423+
opacity: 0;
424+
transform: scaleX(0.85);
425+
transform-origin: left;
426+
transition: opacity 0.2s ease, transform 0.2s ease;
427+
}
428+
429+
.router-name-link:hover .router-name {
430+
color: #1d4ed8;
431+
}
432+
433+
.router-name-link:hover .router-name::after {
434+
opacity: 1;
435+
transform: scaleX(1);
436+
}
437+
355438
.router-description {
356439
font-size: 0.8rem;
357440
color: #6b7280;

‎src/pages/LeaderboardPage.tsx‎

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import React, { useState, useMemo } from 'react';
2-
import { Trophy, Search, Medal } from 'lucide-react';
2+
import { Trophy, Search, Medal, Github } from 'lucide-react';
33
import { Router } from '../types';
44
import { routers } from '../data/mockData';
55
import SpiderChart from '../components/SpiderChart';
66
import DeferralCurve from '../components/DeferralCurve';
77
import './LeaderboardPage.css';
88
import 'katex/dist/katex.min.css';
99
import { InlineMath, BlockMath } from 'react-katex';
10+
import huggingFaceLogo from '../assets/images/hf-logo.svg';
1011

1112
const LeaderboardPage: React.FC = () => {
1213
const [searchTerm, setSearchTerm] = useState('');
@@ -228,13 +229,52 @@ const LeaderboardPage: React.FC = () => {
228229
</div>
229230

230231
<div className="leaderboard-body">
231-
{filteredAndSortedRouters.map((router, index) => (
232-
<div key={router.id} className="leaderboard-row">
232+
{filteredAndSortedRouters.map((router, index) => {
233+
const primaryLink = router.websiteUrl || router.paperUrl || router.githubUrl;
234+
return (
235+
<div key={router.id} className="leaderboard-row">
233236
<div className="rank-col">{renderRankBadge(index + 1)}</div>
234237

235238
<div className="name-col">
236239
<div className="router-info">
237-
<h3 className="router-name">{router.name}</h3>
240+
{primaryLink ? (
241+
<a
242+
href={primaryLink}
243+
target="_blank"
244+
rel="noopener noreferrer"
245+
className="router-name-link"
246+
>
247+
<h3 className="router-name">{router.name}</h3>
248+
</a>
249+
) : (
250+
<h3 className="router-name">{router.name}</h3>
251+
)}
252+
{(router.githubUrl || router.huggingfaceUrl) && (
253+
<div className="router-link-badges">
254+
{router.githubUrl && (
255+
<a
256+
href={router.githubUrl}
257+
target="_blank"
258+
rel="noopener noreferrer"
259+
className="router-link-pill github"
260+
aria-label={`${router.name} GitHub repository`}
261+
>
262+
<Github size={14} />
263+
</a>
264+
)}
265+
{router.huggingfaceUrl && (
266+
<a
267+
href={router.huggingfaceUrl}
268+
target="_blank"
269+
rel="noopener noreferrer"
270+
className="router-link-pill huggingface"
271+
aria-label={`${router.name} Hugging Face card`}
272+
>
273+
<img src={huggingFaceLogo} alt="Hugging Face logo" className="hf-logo" />
274+
</a>
275+
)}
276+
</div>
277+
)}
238278
</div>
239279
</div>
240280

@@ -314,8 +354,9 @@ const LeaderboardPage: React.FC = () => {
314354
</div>
315355
</div>
316356

317-
</div>
318-
))}
357+
</div>
358+
);
359+
})}
319360
</div>
320361
</div>
321362

‎src/types/index.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ export interface Router {
1818
modelPool: string[];
1919
paperUrl?: string;
2020
githubUrl?: string;
21+
websiteUrl?: string;
22+
huggingfaceUrl?: string;
2123
}
2224

2325
export interface DatasetInfo {

0 commit comments

Comments
 (0)