diff --git a/src/assets/images/hf-logo.svg b/src/assets/images/hf-logo.svg new file mode 100644 index 0000000..ab959d1 --- /dev/null +++ b/src/assets/images/hf-logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/data/mockData.ts b/src/data/mockData.ts index fc8e215..0a422e9 100644 --- a/src/data/mockData.ts +++ b/src/data/mockData.ts @@ -231,6 +231,8 @@ const routerMetadata: Record< modelPool: string[]; paperUrl?: string; githubUrl?: string; + websiteUrl?: string; + huggingfaceUrl?: string; } > = { RouterDC: { @@ -239,16 +241,18 @@ const routerMetadata: Record< description: 'Dual contrastive learning-based router with cost optimization', affiliation: 'SUSTech', modelPool: ['GPT-3.5', 'Claude-2', 'Gemini-Pro', 'Llama-2-13B'], - paperUrl: 'https://arxiv.org/abs/2024.xxxxx', - githubUrl: 'https://github.com/example/routerdc', + paperUrl: 'https://arxiv.org/abs/2409.19886', + websiteUrl: 'https://arxiv.org/abs/2409.19886', + githubUrl: 'https://github.com/shuhao02/RouterDC', }, azure: { - name: 'Azure', + name: 'Azure-Router', type: 'closed-source', description: "Microsoft Azure's model routing service", affiliation: 'Microsoft', modelPool: ['GPT-4', 'GPT-3.5', 'GPT-4-Turbo'], - paperUrl: 'https://azure.microsoft.com/en-us/products/ai-services/openai-service', + paperUrl: 'https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/model-router', + websiteUrl: 'https://ai.azure.com/catalog/models/model-router', githubUrl: undefined, }, carrot: { @@ -257,8 +261,10 @@ const routerMetadata: Record< description: 'Cost-aware routing with dual contrastive learning approach', affiliation: 'UMich', modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B'], - paperUrl: 'https://arxiv.org/abs/2024.xxxxx', - githubUrl: 'https://github.com/example/carrot', + paperUrl: 'https://arxiv.org/abs/2502.03261', + websiteUrl: 'https://arxiv.org/abs/2502.03261', + githubUrl: 'https://github.com/somerstep/CARROT', + huggingfaceUrl: 'https://huggingface.co/CARROT-LLM-Routing', }, gpt5: { name: 'GPT-5', @@ -266,7 +272,8 @@ const routerMetadata: Record< description: "OpenAI's internal routing system for GPT model family", affiliation: 'OpenAI', modelPool: ['GPT-5', 'GPT-4', 'GPT-3.5'], - paperUrl: 'https://openai.com/research/gpt-5', + paperUrl: 'https://openai.com/index/introducing-gpt-5/', + websiteUrl: 'https://openai.com/index/introducing-gpt-5/', githubUrl: undefined, }, graphrouter: { @@ -275,8 +282,9 @@ const routerMetadata: Record< description: 'Graph neural network-based routing with semantic understanding', affiliation: 'UIUC', modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B', 'Mixtral-8x7B'], - paperUrl: 'https://arxiv.org/abs/2024.xxxxx', - githubUrl: 'https://github.com/example/graphrouter', + paperUrl: 'https://arxiv.org/abs/2410.03834', + websiteUrl: 'https://arxiv.org/abs/2410.03834', + githubUrl: 'https://github.com/ulab-uiuc/GraphRouter', }, mirt_bert: { name: 'MIRT-BERT', @@ -284,8 +292,9 @@ const routerMetadata: Record< description: 'Multi-item response theory with BERT embeddings', affiliation: 'USTC', modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B'], - paperUrl: 'https://arxiv.org/abs/2024.xxxxx', - githubUrl: 'https://github.com/example/mirt-bert', + paperUrl: 'https://arxiv.org/pdf/2506.01048', + websiteUrl: 'https://arxiv.org/pdf/2506.01048', + githubUrl: 'https://github.com/Mercidaiha/IRT-Router', }, nirt_bert: { name: 'NIRT-BERT', @@ -293,8 +302,9 @@ const routerMetadata: Record< description: 'Neural item response theory with BERT-based routing', affiliation: 'USTC', modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B'], - paperUrl: 'https://arxiv.org/abs/2024.xxxxx', - githubUrl: 'https://github.com/example/nirt-bert', + paperUrl: 'https://arxiv.org/pdf/2506.01048', + websiteUrl: 'https://arxiv.org/pdf/2506.01048', + githubUrl: 'https://github.com/Mercidaiha/IRT-Router', }, notdiamond: { name: 'NotDiamond', @@ -302,7 +312,8 @@ const routerMetadata: Record< description: 'Closed-source routing service with access to 60+ models', affiliation: 'NotDiamond', modelPool: ['GPT-4', 'Claude-3', 'Gemini-Pro', 'Llama-2-70B', 'Mixtral-8x7B', 'Qwen-72B'], - paperUrl: 'https://notdiamond.ai', + paperUrl: 'https://www.notdiamond.ai/', + websiteUrl: 'https://www.notdiamond.ai/', githubUrl: undefined, }, routellm: { @@ -311,8 +322,10 @@ const routerMetadata: Record< description: 'Binary selection between strong and weak models', affiliation: 'Berkeley', modelPool: ['GPT-4', 'GPT-3.5'], - paperUrl: 'https://arxiv.org/abs/2024.xxxxx', - githubUrl: 'https://github.com/example/routellm', + paperUrl: 'https://arxiv.org/abs/2406.18665', + websiteUrl: 'https://arxiv.org/abs/2406.18665', + githubUrl: 'https://github.com/lm-sys/RouteLLM', + huggingfaceUrl: 'https://huggingface.co/routellm', }, routerbench_knn: { name: 'RouterBench-KNN', @@ -321,7 +334,9 @@ const routerMetadata: Record< affiliation: 'Martian', modelPool: ['GPT-4', 'GPT-3.5', 'Claude-3'], paperUrl: 'https://arxiv.org/pdf/2403.12031', + websiteUrl: 'https://arxiv.org/pdf/2403.12031', githubUrl: 'https://github.com/withmartian/routerbench', + huggingfaceUrl: 'https://huggingface.co/datasets/withmartian/routerbench', }, routerbench_mlp: { name: 'RouterBench-MLP', @@ -329,8 +344,10 @@ const routerMetadata: Record< description: 'Multi-Layer Perceptron-based router benchmark', affiliation: 'Martian', modelPool: ['GPT-4', 'GPT-3.5', 'Claude-3'], - paperUrl: 'https://arxiv.org/abs/2024.xxxxx', - githubUrl: 'https://github.com/example/routerbench-mlp', + paperUrl: 'https://arxiv.org/pdf/2403.12031', + websiteUrl: 'https://arxiv.org/pdf/2403.12031', + githubUrl: 'https://github.com/withmartian/routerbench', + huggingfaceUrl: 'https://huggingface.co/datasets/withmartian/routerbench', }, vllm: { name: 'vLLM-SR', @@ -338,17 +355,21 @@ const routerMetadata: Record< description: 'vLLM-based routing service', affiliation: 'vLLM SR Team', modelPool: ['GPT-4', 'GPT-3.5'], - paperUrl: 'https://vllm.ai', + paperUrl: 'https://vllm-semantic-router.com/', + websiteUrl: 'https://vllm-semantic-router.com/', githubUrl: 'https://github.com/vllm-project/semantic-router', + huggingfaceUrl: 'https://huggingface.co/llm-semantic-router', }, chayan: { name: 'Chayan', type: 'open-source', description: 'Chayan-based routing service', - affiliation: 'Adaptive Classifier ', + affiliation: 'Adaptive Classifier', modelPool: ['GPT-4', 'GPT-3.5'], - paperUrl: 'https://arxiv.org/abs/2024.xxxxx', - githubUrl: 'https://huggingface.co/adaptive-classifier/chayan', + paperUrl: 'https://huggingface.co/adaptive-classifier/chayan', + websiteUrl: 'https://huggingface.co/adaptive-classifier/chayan', + githubUrl: undefined, + huggingfaceUrl: 'https://huggingface.co/adaptive-classifier/chayan', } }; diff --git a/src/pages/LeaderboardPage.css b/src/pages/LeaderboardPage.css index dc1634d..04a1c74 100644 --- a/src/pages/LeaderboardPage.css +++ b/src/pages/LeaderboardPage.css @@ -36,7 +36,7 @@ .leaderboard-page .page-subtitle { font-size: 1.2rem; color: #666; - max-width: 600px; + max-width: 800px; margin: 0 auto; text-shadow: none; } @@ -327,7 +327,7 @@ /* Actual text wrapping */ .router-name, .affiliation { - white-space: normal !important; + white-space: normal; overflow-wrap: break-word; word-break: break-word; } @@ -345,6 +345,48 @@ gap: 0.25rem; } +.router-link-badges { + display: flex; + flex-wrap: wrap; + gap: 0.35rem; +} + +.router-link-pill { + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 24px; + padding: 0; + border-radius: 999px; + text-decoration: none; + color: #1f2937; + background: #e5e7eb; + transition: background 0.2s ease, color 0.2s ease, transform 0.2s ease; +} + +.router-link-pill.github { + background: rgba(15, 23, 42, 0.08); + color: #111827; +} + +.router-link-pill.huggingface { + background: rgba(250, 204, 21, 0.3); + color: #92400e; +} + +.router-link-pill:hover { + background: #2563eb; + color: #ffffff; + transform: translateY(-1px); +} + +.router-link-pill .hf-logo { + width: 18px; + height: 18px; + display: inline-block; +} + .router-name { font-size: 1rem; font-weight: 600; @@ -352,6 +394,47 @@ color: #1f2937; } +.router-name-link { + text-decoration: none; + color: inherit; + transition: color 0.2s ease; +} + +.router-name-link:hover { + color: #2563eb; +} + +.router-name-link .router-name { + margin: 0; + transition: color 0.2s ease; + display: inline; + text-decoration: none; + position: relative; +} + +.router-name-link .router-name::after { + content: ''; + position: absolute; + left: 0; + bottom: -0.15rem; + width: 100%; + height: 2px; + background: #2563eb; + opacity: 0; + transform: scaleX(0.85); + transform-origin: left; + transition: opacity 0.2s ease, transform 0.2s ease; +} + +.router-name-link:hover .router-name { + color: #1d4ed8; +} + +.router-name-link:hover .router-name::after { + opacity: 1; + transform: scaleX(1); +} + .router-description { font-size: 0.8rem; color: #6b7280; diff --git a/src/pages/LeaderboardPage.tsx b/src/pages/LeaderboardPage.tsx index 64af75f..8637177 100644 --- a/src/pages/LeaderboardPage.tsx +++ b/src/pages/LeaderboardPage.tsx @@ -1,5 +1,5 @@ import React, { useState, useMemo } from 'react'; -import { Trophy, Search, Medal } from 'lucide-react'; +import { Trophy, Search, Medal, Github } from 'lucide-react'; import { Router } from '../types'; import { routers } from '../data/mockData'; import SpiderChart from '../components/SpiderChart'; @@ -7,6 +7,7 @@ import DeferralCurve from '../components/DeferralCurve'; import './LeaderboardPage.css'; import 'katex/dist/katex.min.css'; import { InlineMath, BlockMath } from 'react-katex'; +import huggingFaceLogo from '../assets/images/hf-logo.svg'; const LeaderboardPage: React.FC = () => { const [searchTerm, setSearchTerm] = useState(''); @@ -228,13 +229,52 @@ const LeaderboardPage: React.FC = () => {
- {filteredAndSortedRouters.map((router, index) => ( -
+ {filteredAndSortedRouters.map((router, index) => { + const primaryLink = router.websiteUrl || router.paperUrl || router.githubUrl; + return ( +
{renderRankBadge(index + 1)}
-

{router.name}

+ {primaryLink ? ( + +

{router.name}

+
+ ) : ( +

{router.name}

+ )} + {(router.githubUrl || router.huggingfaceUrl) && ( +
+ {router.githubUrl && ( + + + + )} + {router.huggingfaceUrl && ( + + Hugging Face logo + + )} +
+ )}
@@ -314,8 +354,9 @@ const LeaderboardPage: React.FC = () => {
-
- ))} + + ); + })} diff --git a/src/types/index.ts b/src/types/index.ts index cafbbf5..ed0e323 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -18,6 +18,8 @@ export interface Router { modelPool: string[]; paperUrl?: string; githubUrl?: string; + websiteUrl?: string; + huggingfaceUrl?: string; } export interface DatasetInfo {