Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
fix-auth
#2
by
rtetley
- opened
- .github/workflows/cd.yml +0 -30
- .github/workflows/ci.yml +0 -20
- .github/workflows/prod.yml +0 -22
- Dockerfile +0 -3
- backend/Dockerfile.dev +0 -3
- backend/app/asgi.py +0 -19
- backend/app/config/base.py +1 -4
- backend/app/config/hf_config.py +5 -5
- backend/app/services/leaderboard.py +3 -20
- backend/app/services/models.py +2 -2
- backend/app/utils/model_validation.py +1 -2
- backend/pyproject.toml +0 -3
- frontend/eslint.config.js +0 -4
- frontend/package.json +1 -4
- frontend/public/favicon.ico +0 -0
- frontend/public/hf-logo-with-title.svg +8 -64
- frontend/src/App.jsx +58 -10
- frontend/src/components/Footer/Footer.jsx +30 -0
- frontend/src/components/Footer/Footer.tsx +0 -133
- frontend/src/components/Header/Header.tsx +0 -34
- frontend/src/components/LanguageSelect/LanguageSelect.jsx +0 -44
- frontend/src/components/Navigation/{Navigation.tsx → Navigation.jsx} +6 -23
- frontend/src/components/shared/{AuthContainer.tsx → AuthContainer.jsx} +6 -16
- frontend/src/config/auth.js +2 -2
- frontend/src/i18n.tsx +0 -88
- frontend/src/index.css +0 -21
- frontend/src/main.jsx +1 -9
- frontend/src/pages/AboutPage/AboutPage.tsx +0 -363
- frontend/src/pages/AddModelPage/{AddModelPage.tsx → AddModelPage.jsx} +3 -10
- frontend/src/pages/AddModelPage/components/EvaluationQueues/EvaluationQueues.jsx +52 -142
- frontend/src/pages/AddModelPage/components/ModelSubmissionForm/ModelSubmissionForm.jsx +29 -152
- frontend/src/pages/AddModelPage/components/SubmissionGuide/SubmissionGuide.jsx +104 -266
- frontend/src/pages/LeaderboardPage/{LeaderboardPage.tsx → LeaderboardPage.jsx} +1 -9
- frontend/src/pages/LeaderboardPage/components/Leaderboard/Leaderboard.jsx +2 -2
- frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/SearchBar.jsx +4 -3
- frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/Table.jsx +3 -3
- frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/hooks/useDataProcessing.js +4 -33
- frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/{defaults.tsx → defaults.js} +101 -117
- frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/tooltips.jsx +8 -3
- frontend/src/pages/LeaderboardPage/components/Leaderboard/utils/columnUtils.jsx +77 -52
- frontend/tsconfig.app.json +0 -30
- frontend/tsconfig.json +0 -8
- frontend/tsconfig.node.json +0 -25
- frontend/vite.config.js +1 -5
.github/workflows/cd.yml
DELETED
@@ -1,30 +0,0 @@
|
|
1 |
-
name: Sync to Hugging Face hub
|
2 |
-
concurrency: development
|
3 |
-
on:
|
4 |
-
push:
|
5 |
-
branches: [main]
|
6 |
-
|
7 |
-
# to run this workflow manually from the Actions tab
|
8 |
-
workflow_dispatch:
|
9 |
-
|
10 |
-
jobs:
|
11 |
-
sync-to-hub:
|
12 |
-
runs-on: ubuntu-latest
|
13 |
-
environment: development
|
14 |
-
steps:
|
15 |
-
- uses: actions/checkout@v3
|
16 |
-
with:
|
17 |
-
fetch-depth: 0
|
18 |
-
lfs: true
|
19 |
-
- name: Push to hub
|
20 |
-
env:
|
21 |
-
HF_USERNAME: ${{ vars.HF_USERNAME }}
|
22 |
-
HF_ORGANIZATION: ${{ vars.HF_ORGANIZATION }}
|
23 |
-
SPACE_NAME: ${{ vars.SPACE_NAME }}
|
24 |
-
HF_TOKEN: ${{ secrets.HF_TOKEN }}
|
25 |
-
DEV_TITLE_COMMIT: "0adbd649fa2138be8f754672b975a7acde1e98d5"
|
26 |
-
run: |
|
27 |
-
git config user.name "CoordIA Bot"
|
28 |
-
git config user.email "(none)"
|
29 |
-
git cherry-pick $DEV_TITLE_COMMIT
|
30 |
-
git push -f https://$HF_USERNAME:[email protected]/spaces/$HF_ORGANIZATION/$SPACE_NAME HEAD:main
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.github/workflows/ci.yml
DELETED
@@ -1,20 +0,0 @@
|
|
1 |
-
name: Continuous integration
|
2 |
-
on: [pull_request]
|
3 |
-
jobs:
|
4 |
-
check-files-size:
|
5 |
-
runs-on: ubuntu-latest
|
6 |
-
permissions:
|
7 |
-
pull-requests: write
|
8 |
-
steps:
|
9 |
-
- name: Check out the repo
|
10 |
-
uses: actions/checkout@v4
|
11 |
-
- name: Check large files
|
12 |
-
uses: ppremk/[email protected]
|
13 |
-
with:
|
14 |
-
filesizelimit: 10485760 # this is 10MB so we can sync to HF Spaces
|
15 |
-
docker-build:
|
16 |
-
runs-on: ubuntu-latest
|
17 |
-
steps:
|
18 |
-
- name: Check out the repo
|
19 |
-
uses: actions/checkout@v4
|
20 |
-
- run: docker build .
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.github/workflows/prod.yml
DELETED
@@ -1,22 +0,0 @@
|
|
1 |
-
name: Deployment to production (Hugging Face)
|
2 |
-
concurrency: production
|
3 |
-
on:
|
4 |
-
# to run this workflow manually from the Actions tab
|
5 |
-
workflow_dispatch:
|
6 |
-
|
7 |
-
jobs:
|
8 |
-
sync-to-hub:
|
9 |
-
runs-on: ubuntu-latest
|
10 |
-
environment: production
|
11 |
-
steps:
|
12 |
-
- uses: actions/checkout@v3
|
13 |
-
with:
|
14 |
-
fetch-depth: 0
|
15 |
-
lfs: true
|
16 |
-
- name: Push to hub
|
17 |
-
env:
|
18 |
-
HF_USERNAME: ${{ vars.HF_USERNAME }}
|
19 |
-
HF_ORGANIZATION: ${{ vars.HF_ORGANIZATION }}
|
20 |
-
SPACE_NAME: ${{ vars.SPACE_NAME }}
|
21 |
-
HF_TOKEN: ${{ secrets.HF_TOKEN }}
|
22 |
-
run: git push -f https://$HF_USERNAME:[email protected]/spaces/$HF_ORGANIZATION/$SPACE_NAME HEAD:main
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dockerfile
CHANGED
@@ -17,9 +17,6 @@ RUN useradd -m -u 1000 user
|
|
17 |
# Install poetry
|
18 |
RUN pip install poetry
|
19 |
|
20 |
-
# Install PyTorch
|
21 |
-
RUN pip install torch
|
22 |
-
|
23 |
# Create and configure cache directory
|
24 |
RUN mkdir -p /app/.cache && \
|
25 |
chown -R user:user /app
|
|
|
17 |
# Install poetry
|
18 |
RUN pip install poetry
|
19 |
|
|
|
|
|
|
|
20 |
# Create and configure cache directory
|
21 |
RUN mkdir -p /app/.cache && \
|
22 |
chown -R user:user /app
|
backend/Dockerfile.dev
CHANGED
@@ -10,9 +10,6 @@ RUN apt-get update && apt-get install -y \
|
|
10 |
# Install poetry
|
11 |
RUN pip install poetry
|
12 |
|
13 |
-
# Install PyTorch
|
14 |
-
RUN pip install torch
|
15 |
-
|
16 |
# Copy Poetry configuration files
|
17 |
COPY pyproject.toml poetry.lock* ./
|
18 |
|
|
|
10 |
# Install poetry
|
11 |
RUN pip install poetry
|
12 |
|
|
|
|
|
|
|
13 |
# Copy Poetry configuration files
|
14 |
COPY pyproject.toml poetry.lock* ./
|
15 |
|
backend/app/asgi.py
CHANGED
@@ -9,12 +9,10 @@ from fastapi import FastAPI
|
|
9 |
from fastapi.middleware.cors import CORSMiddleware
|
10 |
from fastapi.middleware.gzip import GZipMiddleware
|
11 |
import sys
|
12 |
-
import sentry_sdk
|
13 |
|
14 |
from app.api.router import router
|
15 |
from app.core.fastapi_cache import setup_cache
|
16 |
from app.core.formatting import LogFormatter
|
17 |
-
from app.config.base import SENTRY_DSN
|
18 |
from app.config import hf_config
|
19 |
|
20 |
# Configure logging before anything else
|
@@ -65,23 +63,6 @@ LOGGING_CONFIG = {
|
|
65 |
logging.config.dictConfig(LOGGING_CONFIG)
|
66 |
logger = logging.getLogger("app")
|
67 |
|
68 |
-
if SENTRY_DSN is not None:
|
69 |
-
sentry_sdk.init(
|
70 |
-
dsn=SENTRY_DSN,
|
71 |
-
# Add data like request headers and IP for users,
|
72 |
-
# see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info
|
73 |
-
send_default_pii=False,
|
74 |
-
# Set traces_sample_rate to 1.0 to capture 100%
|
75 |
-
# of transactions for tracing.
|
76 |
-
traces_sample_rate=1.0,
|
77 |
-
_experiments={
|
78 |
-
# Set continuous_profiling_auto_start to True
|
79 |
-
# to automatically start the profiler on when
|
80 |
-
# possible.
|
81 |
-
"continuous_profiling_auto_start": True,
|
82 |
-
},
|
83 |
-
)
|
84 |
-
|
85 |
# Create FastAPI application
|
86 |
app = FastAPI(
|
87 |
title="Open LLM Leaderboard",
|
|
|
9 |
from fastapi.middleware.cors import CORSMiddleware
|
10 |
from fastapi.middleware.gzip import GZipMiddleware
|
11 |
import sys
|
|
|
12 |
|
13 |
from app.api.router import router
|
14 |
from app.core.fastapi_cache import setup_cache
|
15 |
from app.core.formatting import LogFormatter
|
|
|
16 |
from app.config import hf_config
|
17 |
|
18 |
# Configure logging before anything else
|
|
|
63 |
logging.config.dictConfig(LOGGING_CONFIG)
|
64 |
logger = logging.getLogger("app")
|
65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
# Create FastAPI application
|
67 |
app = FastAPI(
|
68 |
title="Open LLM Leaderboard",
|
backend/app/config/base.py
CHANGED
@@ -32,7 +32,4 @@ DATASETS_CACHE = CACHE_ROOT / "datasets"
|
|
32 |
MODELS_CACHE = CACHE_ROOT / "models"
|
33 |
VOTES_CACHE = CACHE_ROOT / "votes"
|
34 |
EVAL_CACHE = CACHE_ROOT / "eval-queue"
|
35 |
-
RESULTS_CACHE = CACHE_ROOT / "results"
|
36 |
-
|
37 |
-
# Monitoring
|
38 |
-
SENTRY_DSN = os.environ.get("SENTRY_DSN")
|
|
|
32 |
MODELS_CACHE = CACHE_ROOT / "models"
|
33 |
VOTES_CACHE = CACHE_ROOT / "votes"
|
34 |
EVAL_CACHE = CACHE_ROOT / "eval-queue"
|
35 |
+
RESULTS_CACHE = CACHE_ROOT / "results"
|
|
|
|
|
|
backend/app/config/hf_config.py
CHANGED
@@ -19,11 +19,11 @@ if not HF_TOKEN:
|
|
19 |
API = HfApi(token=HF_TOKEN)
|
20 |
|
21 |
# Repository configuration
|
22 |
-
QUEUE_REPO = f"{HF_ORGANIZATION}/
|
23 |
-
AGGREGATED_REPO = f"{HF_ORGANIZATION}/
|
24 |
-
VOTES_REPO = f"{HF_ORGANIZATION}/
|
25 |
-
OFFICIAL_PROVIDERS_REPO = f"{HF_ORGANIZATION}/
|
26 |
-
RESULTS_REPO = f"{HF_ORGANIZATION}/
|
27 |
|
28 |
# File paths from cache config
|
29 |
VOTES_PATH = cache_config.votes_file
|
|
|
19 |
API = HfApi(token=HF_TOKEN)
|
20 |
|
21 |
# Repository configuration
|
22 |
+
QUEUE_REPO = f"{HF_ORGANIZATION}/requests"
|
23 |
+
AGGREGATED_REPO = f"{HF_ORGANIZATION}/contents"
|
24 |
+
VOTES_REPO = f"{HF_ORGANIZATION}/votes"
|
25 |
+
OFFICIAL_PROVIDERS_REPO = f"{HF_ORGANIZATION}/official-providers"
|
26 |
+
RESULTS_REPO = f"{HF_ORGANIZATION}/results"
|
27 |
|
28 |
# File paths from cache config
|
29 |
VOTES_PATH = cache_config.votes_file
|
backend/app/services/leaderboard.py
CHANGED
@@ -17,7 +17,6 @@ import dateutil
|
|
17 |
import numpy as np
|
18 |
from huggingface_hub import snapshot_download
|
19 |
from app.services.models import ModelService
|
20 |
-
import time
|
21 |
|
22 |
from app.config import (
|
23 |
RESULTS_CACHE,
|
@@ -95,7 +94,6 @@ class Tasks(Enum):
|
|
95 |
# task2 = Task("BAC-fr", "metric_name", "BAC-fr")
|
96 |
task0 = Task("community|gpqa-fr|0", "acc", "norm_acc", "GPQA-fr") # On pourrait vouloir mettre "Connaissances"
|
97 |
task1 = Task("community|ifeval-fr|0", "norm_acc", "norm_acc", "IFEval-fr") # FIXME norm_acc should be acc # et "Suivi d'instructions"
|
98 |
-
task2 = Task("community|bac-fr|0", "bac-fr-qem", "bac-fr-qem", "bac-fr") # et "Suivi d'instructions"
|
99 |
|
100 |
def is_model_on_hub(model_name: str, revision: str, token: str = None, trust_remote_code=False, test_tokenizer=False) -> tuple[bool, str]:
|
101 |
"""Checks if the model model_name is on the hub, and whether it (and its tokenizer) can be loaded with AutoClasses."""
|
@@ -229,12 +227,8 @@ class EvalResult:
|
|
229 |
)
|
230 |
|
231 |
class LeaderboardService:
|
232 |
-
|
233 |
def __init__(self):
|
234 |
self.model_service = ModelService()
|
235 |
-
self.cached_raw_data = None
|
236 |
-
self.last_cache_update = 0
|
237 |
-
self.cache_ttl = cache_config.cache_ttl.total_seconds()
|
238 |
pass
|
239 |
|
240 |
async def get_raw_eval_results(self, results_path: str, requests_path: str) -> list[EvalResult]:
|
@@ -274,24 +268,13 @@ class LeaderboardService:
|
|
274 |
|
275 |
|
276 |
async def fetch_raw_data(self) -> List[EvalResult]:
|
277 |
-
|
278 |
-
# Check if cache needs refresh
|
279 |
-
current_time = time.time()
|
280 |
-
cache_age = current_time - self.last_cache_update
|
281 |
-
if not self.cached_raw_data:
|
282 |
-
return await self._refresh_raw_data()
|
283 |
-
elif cache_age > self.cache_ttl:
|
284 |
-
return await self._refresh_raw_data()
|
285 |
-
else:
|
286 |
-
return self.cached_raw_data
|
287 |
-
|
288 |
-
async def _refresh_raw_data(self) -> List[EvalResult]:
|
289 |
"""Fetch raw leaderboard data from HuggingFace dataset"""
|
290 |
try:
|
291 |
logger.info(LogFormatter.section("FETCHING LEADERBOARD DATA"))
|
292 |
logger.info(LogFormatter.info(f"Loading dataset from {HF_ORGANIZATION}/contents"))
|
293 |
print("GETTING FROM %s" % HF_ORGANIZATION)
|
294 |
|
|
|
295 |
snapshot_download(
|
296 |
repo_id=RESULTS_REPO,
|
297 |
local_dir=RESULTS_CACHE,
|
@@ -386,8 +369,8 @@ class LeaderboardService:
|
|
386 |
},
|
387 |
"bac_fr": {
|
388 |
"name": "BAC FR",
|
389 |
-
"value":
|
390 |
-
"normalized_score":
|
391 |
}
|
392 |
}
|
393 |
|
|
|
17 |
import numpy as np
|
18 |
from huggingface_hub import snapshot_download
|
19 |
from app.services.models import ModelService
|
|
|
20 |
|
21 |
from app.config import (
|
22 |
RESULTS_CACHE,
|
|
|
94 |
# task2 = Task("BAC-fr", "metric_name", "BAC-fr")
|
95 |
task0 = Task("community|gpqa-fr|0", "acc", "norm_acc", "GPQA-fr") # On pourrait vouloir mettre "Connaissances"
|
96 |
task1 = Task("community|ifeval-fr|0", "norm_acc", "norm_acc", "IFEval-fr") # FIXME norm_acc should be acc # et "Suivi d'instructions"
|
|
|
97 |
|
98 |
def is_model_on_hub(model_name: str, revision: str, token: str = None, trust_remote_code=False, test_tokenizer=False) -> tuple[bool, str]:
|
99 |
"""Checks if the model model_name is on the hub, and whether it (and its tokenizer) can be loaded with AutoClasses."""
|
|
|
227 |
)
|
228 |
|
229 |
class LeaderboardService:
|
|
|
230 |
def __init__(self):
|
231 |
self.model_service = ModelService()
|
|
|
|
|
|
|
232 |
pass
|
233 |
|
234 |
async def get_raw_eval_results(self, results_path: str, requests_path: str) -> list[EvalResult]:
|
|
|
268 |
|
269 |
|
270 |
async def fetch_raw_data(self) -> List[EvalResult]:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
271 |
"""Fetch raw leaderboard data from HuggingFace dataset"""
|
272 |
try:
|
273 |
logger.info(LogFormatter.section("FETCHING LEADERBOARD DATA"))
|
274 |
logger.info(LogFormatter.info(f"Loading dataset from {HF_ORGANIZATION}/contents"))
|
275 |
print("GETTING FROM %s" % HF_ORGANIZATION)
|
276 |
|
277 |
+
# TODO: cache
|
278 |
snapshot_download(
|
279 |
repo_id=RESULTS_REPO,
|
280 |
local_dir=RESULTS_CACHE,
|
|
|
369 |
},
|
370 |
"bac_fr": {
|
371 |
"name": "BAC FR",
|
372 |
+
"value": 0, # FIXME
|
373 |
+
"normalized_score": 0 # FIXME
|
374 |
}
|
375 |
}
|
376 |
|
backend/app/services/models.py
CHANGED
@@ -468,8 +468,8 @@ class ModelService(HuggingFaceService):
|
|
468 |
logger.info(LogFormatter.success(f"Model size validation passed: {model_size:.1f}B"))
|
469 |
|
470 |
# Size limits based on precision
|
471 |
-
if model_data["precision"] in ["float16", "bfloat16"] and model_size >
|
472 |
-
error_msg = f"Model too large for {model_data['precision']} (limit:
|
473 |
logger.error(LogFormatter.error("Size limit exceeded", error_msg))
|
474 |
raise Exception(error_msg)
|
475 |
|
|
|
468 |
logger.info(LogFormatter.success(f"Model size validation passed: {model_size:.1f}B"))
|
469 |
|
470 |
# Size limits based on precision
|
471 |
+
if model_data["precision"] in ["float16", "bfloat16"] and model_size > 100:
|
472 |
+
error_msg = f"Model too large for {model_data['precision']} (limit: 100B)"
|
473 |
logger.error(LogFormatter.error("Size limit exceeded", error_msg))
|
474 |
raise Exception(error_msg)
|
475 |
|
backend/app/utils/model_validation.py
CHANGED
@@ -196,8 +196,7 @@ class ModelValidator:
|
|
196 |
)
|
197 |
except ValueError as e:
|
198 |
return False, f"The tokenizer is not available in an official Transformers release: {e}", None
|
199 |
-
except Exception
|
200 |
-
logger.error("The tokenizer cannot be loaded", e)
|
201 |
return False, "The tokenizer cannot be loaded. Ensure the tokenizer class is part of a stable Transformers release and correctly configured.", None
|
202 |
|
203 |
return True, None, config
|
|
|
196 |
)
|
197 |
except ValueError as e:
|
198 |
return False, f"The tokenizer is not available in an official Transformers release: {e}", None
|
199 |
+
except Exception:
|
|
|
200 |
return False, "The tokenizer cannot be loaded. Ensure the tokenizer class is part of a stable Transformers release and correctly configured.", None
|
201 |
|
202 |
return True, None, config
|
backend/pyproject.toml
CHANGED
@@ -19,9 +19,6 @@ safetensors = "^0.4.5"
|
|
19 |
aiofiles = "^24.1.0"
|
20 |
fastapi-cache2 = "^0.2.1"
|
21 |
python-dotenv = "^1.0.1"
|
22 |
-
sentry-sdk = {extras = ["fastapi"], version = "^2.20.0"}
|
23 |
-
protobuf = "^5.29.3"
|
24 |
-
sentencepiece = "^0.2.0"
|
25 |
|
26 |
[tool.poetry.group.dev.dependencies]
|
27 |
pytest = "^8.3.4"
|
|
|
19 |
aiofiles = "^24.1.0"
|
20 |
fastapi-cache2 = "^0.2.1"
|
21 |
python-dotenv = "^1.0.1"
|
|
|
|
|
|
|
22 |
|
23 |
[tool.poetry.group.dev.dependencies]
|
24 |
pytest = "^8.3.4"
|
frontend/eslint.config.js
CHANGED
@@ -24,10 +24,6 @@ export default [
|
|
24 |
'react-refresh': reactRefresh,
|
25 |
},
|
26 |
rules: {
|
27 |
-
"@typescript-eslint/no-unused-vars": [
|
28 |
-
"error",
|
29 |
-
{ varsIgnorePattern: "^i18n$" },
|
30 |
-
],
|
31 |
...js.configs.recommended.rules,
|
32 |
...react.configs.recommended.rules,
|
33 |
...react.configs['jsx-runtime'].rules,
|
|
|
24 |
'react-refresh': reactRefresh,
|
25 |
},
|
26 |
rules: {
|
|
|
|
|
|
|
|
|
27 |
...js.configs.recommended.rules,
|
28 |
...react.configs.recommended.rules,
|
29 |
...react.configs['jsx-runtime'].rules,
|
frontend/package.json
CHANGED
@@ -41,9 +41,6 @@
|
|
41 |
"eslint-plugin-react-hooks": "^5.0.0",
|
42 |
"eslint-plugin-react-refresh": "^0.4.16",
|
43 |
"globals": "^15.14.0",
|
44 |
-
"
|
45 |
-
"typescript": "^5.7.3",
|
46 |
-
"vite": "^6.0.5",
|
47 |
-
"vite-tsconfig-paths": "^5.1.4"
|
48 |
}
|
49 |
}
|
|
|
41 |
"eslint-plugin-react-hooks": "^5.0.0",
|
42 |
"eslint-plugin-react-refresh": "^0.4.16",
|
43 |
"globals": "^15.14.0",
|
44 |
+
"vite": "^6.0.5"
|
|
|
|
|
|
|
45 |
}
|
46 |
}
|
frontend/public/favicon.ico
DELETED
Binary file (7.41 kB)
|
|
frontend/public/hf-logo-with-title.svg
CHANGED
|
|
frontend/src/App.jsx
CHANGED
@@ -6,21 +6,20 @@ import {
|
|
6 |
useSearchParams,
|
7 |
useLocation,
|
8 |
} from "react-router-dom";
|
|
|
9 |
import { Box, CssBaseline } from "@mui/material";
|
|
|
10 |
import Navigation from "./components/Navigation/Navigation";
|
11 |
import LeaderboardPage from "./pages/LeaderboardPage/LeaderboardPage";
|
12 |
import AddModelPage from "./pages/AddModelPage/AddModelPage";
|
13 |
import QuotePage from "./pages/QuotePage/QuotePage";
|
14 |
import VoteModelPage from "./pages/VoteModelPage/VoteModelPage";
|
15 |
-
import Header from "
|
16 |
-
import {
|
17 |
-
import Footer from "./components/Footer/Footer";
|
18 |
import MuiDsfrThemeProvider from "@codegouvfr/react-dsfr/mui";
|
19 |
import { headerFooterDisplayItem } from "@codegouvfr/react-dsfr/Display";
|
20 |
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
21 |
-
import { LanguageSelect } from "./components/LanguageSelect/LanguageSelect";
|
22 |
import LeaderboardProvider from "./pages/LeaderboardPage/components/Leaderboard/context/LeaderboardContext";
|
23 |
-
import AboutPage from "pages/AboutPage/AboutPage";
|
24 |
const queryClient = new QueryClient({
|
25 |
defaultOptions: {
|
26 |
queries: {
|
@@ -94,7 +93,21 @@ function App() {
|
|
94 |
color: "text.primary",
|
95 |
}}
|
96 |
>
|
97 |
-
<Header
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
<Box
|
99 |
sx={{
|
100 |
flex: 1,
|
@@ -108,12 +121,47 @@ function App() {
|
|
108 |
<Routes>
|
109 |
<Route path="/" element={<LeaderboardPage />} />
|
110 |
<Route path="/add" element={<AddModelPage />} />
|
111 |
-
<Route path="/
|
112 |
-
|
113 |
-
<Route path="/vote" element={<VoteModelPage />} /> */}
|
114 |
</Routes>
|
115 |
</Box>
|
116 |
-
<Footer
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
</Box>
|
118 |
</LeaderboardProvider>
|
119 |
</Router>
|
|
|
6 |
useSearchParams,
|
7 |
useLocation,
|
8 |
} from "react-router-dom";
|
9 |
+
import { ThemeProvider } from "@mui/material/styles";
|
10 |
import { Box, CssBaseline } from "@mui/material";
|
11 |
+
// import Navigation from "./components/Navigation/Navigation";
|
12 |
import Navigation from "./components/Navigation/Navigation";
|
13 |
import LeaderboardPage from "./pages/LeaderboardPage/LeaderboardPage";
|
14 |
import AddModelPage from "./pages/AddModelPage/AddModelPage";
|
15 |
import QuotePage from "./pages/QuotePage/QuotePage";
|
16 |
import VoteModelPage from "./pages/VoteModelPage/VoteModelPage";
|
17 |
+
import { Header } from "@codegouvfr/react-dsfr/Header";
|
18 |
+
import { Footer } from "@codegouvfr/react-dsfr/Footer";
|
|
|
19 |
import MuiDsfrThemeProvider from "@codegouvfr/react-dsfr/mui";
|
20 |
import { headerFooterDisplayItem } from "@codegouvfr/react-dsfr/Display";
|
21 |
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
|
22 |
import LeaderboardProvider from "./pages/LeaderboardPage/components/Leaderboard/context/LeaderboardContext";
|
|
|
23 |
const queryClient = new QueryClient({
|
24 |
defaultOptions: {
|
25 |
queries: {
|
|
|
93 |
color: "text.primary",
|
94 |
}}
|
95 |
>
|
96 |
+
<Header
|
97 |
+
brandTop={<>République <br/> française</>}
|
98 |
+
homeLinkProps={{
|
99 |
+
href: '/',
|
100 |
+
title: 'Accueil - Nom de l’entité (ministère, secrétariat d‘état, gouvernement)'
|
101 |
+
}}
|
102 |
+
quickAccessItems={[
|
103 |
+
// other quick access items...
|
104 |
+
headerFooterDisplayItem
|
105 |
+
]}
|
106 |
+
id="fr-header-simple-header-with-service-title-and-tagline"
|
107 |
+
serviceTagline="Tableau de référence pour les grands modèles de langages en français"
|
108 |
+
serviceTitle="Leaderboard des GML pour le français"
|
109 |
+
navigation={<Navigation />}
|
110 |
+
/>
|
111 |
<Box
|
112 |
sx={{
|
113 |
flex: 1,
|
|
|
121 |
<Routes>
|
122 |
<Route path="/" element={<LeaderboardPage />} />
|
123 |
<Route path="/add" element={<AddModelPage />} />
|
124 |
+
<Route path="/quote" element={<QuotePage />} />
|
125 |
+
<Route path="/vote" element={<VoteModelPage />} />
|
|
|
126 |
</Routes>
|
127 |
</Box>
|
128 |
+
<Footer
|
129 |
+
accessibility="fully compliant"
|
130 |
+
contentDescription="
|
131 |
+
L'évaluation des systèmes d'IA est un enjeu stratégique sur lequel la France s'est historiquement démarquée.
|
132 |
+
|
133 |
+
Ce classement, ou leaderboard, s'inspire directement de l'Open LLM Leaderboard et permet de comparer différents modèles d'IA génératifs à l'aide de jeux de données spécifiquement adaptés aux environnements et à la culture francophones.
|
134 |
+
"
|
135 |
+
partnersLogos={{
|
136 |
+
sub: [
|
137 |
+
{
|
138 |
+
alt: 'Logo Inria',
|
139 |
+
href: '#',
|
140 |
+
imgUrl: '/inr_logo_rouge.png'
|
141 |
+
},
|
142 |
+
{
|
143 |
+
alt: 'Logo CNRS',
|
144 |
+
href: '#',
|
145 |
+
imgUrl: '/LOGO_CNRS_BLEU.png'
|
146 |
+
},
|
147 |
+
{
|
148 |
+
alt: 'Logo LNE',
|
149 |
+
href: '#',
|
150 |
+
imgUrl: '/logo-lne.svgz'
|
151 |
+
},
|
152 |
+
{
|
153 |
+
alt: 'Logo DGE',
|
154 |
+
href: '#',
|
155 |
+
imgUrl: '/logo_DGE.png'
|
156 |
+
},
|
157 |
+
{
|
158 |
+
alt: 'Logo huggingface',
|
159 |
+
href: '#',
|
160 |
+
imgUrl: '/hf-logo-with-title.svg'
|
161 |
+
}
|
162 |
+
]
|
163 |
+
}}
|
164 |
+
/>
|
165 |
</Box>
|
166 |
</LeaderboardProvider>
|
167 |
</Router>
|
frontend/src/components/Footer/Footer.jsx
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from "react";
|
2 |
+
import { Box, Typography, Link } from "@mui/material";
|
3 |
+
|
4 |
+
const Footer = () => {
|
5 |
+
return (
|
6 |
+
<Box
|
7 |
+
component="footer"
|
8 |
+
sx={{
|
9 |
+
width: "100%",
|
10 |
+
py: 4,
|
11 |
+
textAlign: "center",
|
12 |
+
}}
|
13 |
+
>
|
14 |
+
<Typography variant="body2" color="text.secondary" sx={{ mx: 4 }}>
|
15 |
+
© 2024 Hugging Face - Open LLM Leaderboard - Made with 🤗 by the HF team
|
16 |
+
-{" "}
|
17 |
+
<Link
|
18 |
+
href="https://huggingface.co"
|
19 |
+
target="_blank"
|
20 |
+
rel="noopener noreferrer"
|
21 |
+
color="inherit"
|
22 |
+
>
|
23 |
+
huggingface.co
|
24 |
+
</Link>
|
25 |
+
</Typography>
|
26 |
+
</Box>
|
27 |
+
);
|
28 |
+
};
|
29 |
+
|
30 |
+
export default Footer;
|
frontend/src/components/Footer/Footer.tsx
DELETED
@@ -1,133 +0,0 @@
|
|
1 |
-
import {addFooterTranslations, Footer,} from "@codegouvfr/react-dsfr/Footer";
|
2 |
-
import {CallOut} from "@codegouvfr/react-dsfr/CallOut";
|
3 |
-
import {Highlight} from "@codegouvfr/react-dsfr/Highlight";
|
4 |
-
import { Alert } from "@codegouvfr/react-dsfr/Alert";
|
5 |
-
// import { Box, Typography, Link } from "@mui/material";
|
6 |
-
|
7 |
-
const footer = () => {
|
8 |
-
|
9 |
-
// const callout = <Alert
|
10 |
-
// severity="warning"
|
11 |
-
// description="
|
12 |
-
// Ce leaderboard compare les modèles de language adaptés à la langue française, sur des jeux de données en français, adaptés aux spécificités culturelles de la francophonie. C'est d'abord un projet de recherche collaboratif, et nous espérons recevoir de nombreuses contributions pour l'améliorer au fil du temps!
|
13 |
-
// Le leaderboard n'est que dans sa toute première version, et sera amené à évoluer régulièrement, avec de nouveaux jeux de données, de nouvelles métriques, et, on l'espère, beaucoup de nouveaux modèles ouverts soumis par la communauté! Dans sa version initiale, nous avons couvert un panel de modèles ouverts, entrainés sur du français, de différentes tailles et origines.
|
14 |
-
// Note: Les données d'évaluation ont été pour l'instant gardées confidentielles, pour préserver l'intégrité et la validité des résultats, et éviter les manipulations du classement.
|
15 |
-
// "
|
16 |
-
// small
|
17 |
-
// />
|
18 |
-
const callout = <Highlight
|
19 |
-
size="sm"
|
20 |
-
classes={{
|
21 |
-
root: 'fr-highlight--orange-terre-battue'
|
22 |
-
}}>
|
23 |
-
Ce leaderboard compare les modèles de langage adaptés à la langue française, sur des jeux de données en français, adaptés aux spécificités culturelles de la francophonie. C'est d'abord un projet de recherche collaboratif, et nous espérons recevoir de nombreuses contributions pour l'améliorer au fil du temps !
|
24 |
-
Le leaderboard n'est que dans sa toute première version, et sera amené à évoluer régulièrement, avec de nouveaux jeux de données, de nouvelles métriques, et, nous l'espérons, beaucoup de nouveaux modèles ouverts soumis par la communauté ! Dans sa version initiale, nous avons couvert un panel de modèles ouverts, entraînés sur du français, de différentes tailles et origines.
|
25 |
-
Note : les données d'évaluation ont été pour l'instant gardées confidentielles, pour préserver l'intégrité et la validité des résultats, et éviter les manipulations du classement.
|
26 |
-
</Highlight>
|
27 |
-
|
28 |
-
return <Footer
|
29 |
-
style={{"boxShadow": "none"}}
|
30 |
-
accessibility="fully compliant"
|
31 |
-
contentDescription={callout}
|
32 |
-
classes={{
|
33 |
-
logo: "logo_footer",
|
34 |
-
contentLink: "content_link",
|
35 |
-
content: "foot_content"
|
36 |
-
}}
|
37 |
-
license={""}
|
38 |
-
linkList={undefined}
|
39 |
-
partnersLogos={{
|
40 |
-
sub: [
|
41 |
-
{
|
42 |
-
alt: 'Logo Inria',
|
43 |
-
imgUrl: '/inr_logo_rouge.png',
|
44 |
-
linkProps: {
|
45 |
-
href: "https://inria.fr/fr",
|
46 |
-
title: "Lien vers le site Inria"
|
47 |
-
}
|
48 |
-
},
|
49 |
-
{
|
50 |
-
alt: 'Logo CNRS',
|
51 |
-
imgUrl: '/LOGO_CNRS_BLEU.png',
|
52 |
-
linkProps: {
|
53 |
-
href: "https://www.cnrs.fr/fr",
|
54 |
-
title: "Lien vers le site CNRS"
|
55 |
-
}
|
56 |
-
},
|
57 |
-
{
|
58 |
-
alt: 'Logo LNE',
|
59 |
-
imgUrl: '/logo-lne.svgz',
|
60 |
-
linkProps: {
|
61 |
-
href: "https://www.lne.fr/fr",
|
62 |
-
title: "Lien vers le site LNE"
|
63 |
-
}
|
64 |
-
},
|
65 |
-
{
|
66 |
-
alt: 'Logo DGE',
|
67 |
-
imgUrl: '/logo_DGE.png',
|
68 |
-
linkProps: {
|
69 |
-
href: "https://www.entreprises.gouv.fr/",
|
70 |
-
title: "Lien vers le site DGE"
|
71 |
-
}
|
72 |
-
},
|
73 |
-
{
|
74 |
-
alt: 'Logo huggingface',
|
75 |
-
imgUrl: '/hf-logo-with-title.svg',
|
76 |
-
linkProps: {
|
77 |
-
href: "https://huggingface.co/",
|
78 |
-
title: "Lien vers le site huggingface"
|
79 |
-
}
|
80 |
-
}
|
81 |
-
]
|
82 |
-
}}
|
83 |
-
websiteMapLinkProps={undefined}
|
84 |
-
/>
|
85 |
-
}
|
86 |
-
|
87 |
-
addFooterTranslations({
|
88 |
-
lang: "en",
|
89 |
-
messages: {
|
90 |
-
accessibility: "Accessibility",
|
91 |
-
"fully compliant": "Partially compliant",
|
92 |
-
|
93 |
-
}
|
94 |
-
});
|
95 |
-
|
96 |
-
|
97 |
-
addFooterTranslations({
|
98 |
-
lang: "fr",
|
99 |
-
messages: {
|
100 |
-
accessibility: "Accesibilité",
|
101 |
-
"fully compliant": "Partielle",
|
102 |
-
|
103 |
-
}
|
104 |
-
});
|
105 |
-
|
106 |
-
// const Footer = () => {
|
107 |
-
// return (
|
108 |
-
// <Box
|
109 |
-
// component="footer"
|
110 |
-
// sx={{
|
111 |
-
// width: "100%",
|
112 |
-
// py: 4,
|
113 |
-
// textAlign: "center",
|
114 |
-
// }}
|
115 |
-
// >
|
116 |
-
// <Typography variant="body2" color="text.secondary" sx={{ mx: 4 }}>
|
117 |
-
// © 2024 Hugging Face - Open LLM Leaderboard - Made with 🤗 by the HF team
|
118 |
-
// -{" "}
|
119 |
-
// <Link
|
120 |
-
// href="https://huggingface.co"
|
121 |
-
// target="_blank"
|
122 |
-
// rel="noopener noreferrer"
|
123 |
-
// color="inherit"
|
124 |
-
// >
|
125 |
-
// huggingface.co
|
126 |
-
// </Link>
|
127 |
-
// </Typography>
|
128 |
-
// </Box>
|
129 |
-
// );
|
130 |
-
// };
|
131 |
-
|
132 |
-
|
133 |
-
export default footer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/src/components/Header/Header.tsx
DELETED
@@ -1,34 +0,0 @@
|
|
1 |
-
import { Header } from "@codegouvfr/react-dsfr/Header";
|
2 |
-
import { headerFooterDisplayItem } from "@codegouvfr/react-dsfr/Display";
|
3 |
-
import { LanguageSelect } from "../LanguageSelect/LanguageSelect";
|
4 |
-
import Navigation from "../Navigation/Navigation";
|
5 |
-
import { Badge } from "@codegouvfr/react-dsfr/Badge";
|
6 |
-
import { useTranslation, declareComponentKeys } from "i18n";
|
7 |
-
|
8 |
-
const header = () => {
|
9 |
-
const {t} = useTranslation({header});
|
10 |
-
return <Header
|
11 |
-
brandTop={<>République <br/> française</>}
|
12 |
-
homeLinkProps={{
|
13 |
-
href: '/',
|
14 |
-
title: 'Accueil - Nom de l’entité (ministère, secrétariat d‘état, gouvernement)'
|
15 |
-
}}
|
16 |
-
quickAccessItems={[
|
17 |
-
// other quick access items...
|
18 |
-
headerFooterDisplayItem,
|
19 |
-
<LanguageSelect />
|
20 |
-
]}
|
21 |
-
id="fr-header-simple-header-with-service-title-and-tagline"
|
22 |
-
serviceTagline={t("tagline")}
|
23 |
-
serviceTitle={<>{t("service")}{' '}<Badge as="span" noIcon severity="success">Beta</Badge></>}
|
24 |
-
navigation={<Navigation />}
|
25 |
-
/>
|
26 |
-
}
|
27 |
-
|
28 |
-
const { i18n } = declareComponentKeys<
|
29 |
-
| "tagline"
|
30 |
-
| "service"
|
31 |
-
>()({ header });
|
32 |
-
export type I18n = typeof i18n;
|
33 |
-
|
34 |
-
export default header;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/src/components/LanguageSelect/LanguageSelect.jsx
DELETED
@@ -1,44 +0,0 @@
|
|
1 |
-
import React from 'react';import {
|
2 |
-
LanguageSelect as LanguageSelect_base,
|
3 |
-
addLanguageSelectTranslations
|
4 |
-
} from "@codegouvfr/react-dsfr/LanguageSelect";
|
5 |
-
|
6 |
-
import { useLang, languages} from "i18n";
|
7 |
-
|
8 |
-
// NOTE: This component can be used inside or outside of the Header component.
|
9 |
-
export function LanguageSelect(props) {
|
10 |
-
|
11 |
-
const { id } = props;
|
12 |
-
|
13 |
-
const { lang, setLang } = useLang();
|
14 |
-
|
15 |
-
return (
|
16 |
-
<LanguageSelect_base
|
17 |
-
id={id}
|
18 |
-
supportedLangs={languages}
|
19 |
-
lang={lang} // "en" or "fr"
|
20 |
-
setLang={setLang}
|
21 |
-
fullNameByLang={{
|
22 |
-
en: "English",
|
23 |
-
fr: "Français"
|
24 |
-
}}
|
25 |
-
/>
|
26 |
-
);
|
27 |
-
|
28 |
-
}
|
29 |
-
|
30 |
-
languages.forEach(lang =>
|
31 |
-
addLanguageSelectTranslations({
|
32 |
-
lang: lang,
|
33 |
-
messages: {
|
34 |
-
"select language": (() => {
|
35 |
-
switch (lang) {
|
36 |
-
case "en": return "Select language";
|
37 |
-
/* spell-checker: disable */
|
38 |
-
case "fr": return "Choisir la langue";
|
39 |
-
/* spell-checker: enable */
|
40 |
-
}
|
41 |
-
})()
|
42 |
-
}
|
43 |
-
})
|
44 |
-
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/src/components/Navigation/{Navigation.tsx → Navigation.jsx}
RENAMED
@@ -1,17 +1,15 @@
|
|
1 |
import React, { useState } from "react";
|
2 |
import { useLocation, useNavigate, useSearchParams } from "react-router-dom";
|
3 |
import {MainNavigation} from "@codegouvfr/react-dsfr/MainNavigation";
|
4 |
-
import { useTranslation, declareComponentKeys } from "i18n";
|
5 |
|
6 |
const Navigation = () => {
|
7 |
const location = useLocation();
|
8 |
const navigate = useNavigate();
|
9 |
const [active, setActive] = useState(0);
|
10 |
const [searchParams] = useSearchParams();
|
11 |
-
const {t} = useTranslation({Navigation});
|
12 |
|
13 |
// Function to sync URL with parent HF page
|
14 |
-
const syncUrlWithParent = (queryString
|
15 |
// Check if we're in an HF Space iframe
|
16 |
const isHFSpace = window.location !== window.parent.location;
|
17 |
if (isHFSpace) {
|
@@ -31,7 +29,7 @@ const Navigation = () => {
|
|
31 |
}
|
32 |
};
|
33 |
|
34 |
-
const handleNavigation = (index
|
35 |
e.preventDefault();
|
36 |
const searchString = searchParams.toString();
|
37 |
const queryString = searchString ? `?${searchString}` : "";
|
@@ -66,26 +64,17 @@ const Navigation = () => {
|
|
66 |
target: '_self',
|
67 |
onClick: handleNavigation(1, "/add")
|
68 |
},
|
69 |
-
text:
|
70 |
},
|
71 |
{
|
72 |
isActive: active === 2,
|
73 |
linkProps: {
|
74 |
-
href: "/
|
75 |
target: '_self',
|
76 |
-
onClick: handleNavigation(2, "/
|
77 |
},
|
78 |
-
text:
|
79 |
},
|
80 |
-
// {
|
81 |
-
// isActive: active === 2,
|
82 |
-
// linkProps: {
|
83 |
-
// href: "/vote",
|
84 |
-
// target: '_self',
|
85 |
-
// onClick: handleNavigation(2, "/vote")
|
86 |
-
// },
|
87 |
-
// text: "Vote for next model",
|
88 |
-
// },
|
89 |
]}
|
90 |
/>
|
91 |
);
|
@@ -215,10 +204,4 @@ const Navigation = () => {
|
|
215 |
// );
|
216 |
};
|
217 |
|
218 |
-
const { i18n } = declareComponentKeys<
|
219 |
-
| "submit"
|
220 |
-
| "about"
|
221 |
-
>()({ Navigation });
|
222 |
-
export type I18n = typeof i18n;
|
223 |
-
|
224 |
export default Navigation;
|
|
|
1 |
import React, { useState } from "react";
|
2 |
import { useLocation, useNavigate, useSearchParams } from "react-router-dom";
|
3 |
import {MainNavigation} from "@codegouvfr/react-dsfr/MainNavigation";
|
|
|
4 |
|
5 |
const Navigation = () => {
|
6 |
const location = useLocation();
|
7 |
const navigate = useNavigate();
|
8 |
const [active, setActive] = useState(0);
|
9 |
const [searchParams] = useSearchParams();
|
|
|
10 |
|
11 |
// Function to sync URL with parent HF page
|
12 |
+
const syncUrlWithParent = (queryString, hash) => {
|
13 |
// Check if we're in an HF Space iframe
|
14 |
const isHFSpace = window.location !== window.parent.location;
|
15 |
if (isHFSpace) {
|
|
|
29 |
}
|
30 |
};
|
31 |
|
32 |
+
const handleNavigation = (index, path) => (e) => {
|
33 |
e.preventDefault();
|
34 |
const searchString = searchParams.toString();
|
35 |
const queryString = searchString ? `?${searchString}` : "";
|
|
|
64 |
target: '_self',
|
65 |
onClick: handleNavigation(1, "/add")
|
66 |
},
|
67 |
+
text: "Submit model",
|
68 |
},
|
69 |
{
|
70 |
isActive: active === 2,
|
71 |
linkProps: {
|
72 |
+
href: "/vote",
|
73 |
target: '_self',
|
74 |
+
onClick: handleNavigation(2, "/vote")
|
75 |
},
|
76 |
+
text: "Vote for next model",
|
77 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
]}
|
79 |
/>
|
80 |
);
|
|
|
204 |
// );
|
205 |
};
|
206 |
|
|
|
|
|
|
|
|
|
|
|
|
|
207 |
export default Navigation;
|
frontend/src/components/shared/{AuthContainer.tsx → AuthContainer.jsx}
RENAMED
@@ -12,12 +12,10 @@ import HFLogo from "../Logo/HFLogo";
|
|
12 |
import { useAuth } from "../../hooks/useAuth";
|
13 |
import LogoutIcon from "@mui/icons-material/Logout";
|
14 |
import { useNavigate } from "react-router-dom";
|
15 |
-
import { useTranslation, declareComponentKeys } from "i18n";
|
16 |
|
17 |
function AuthContainer({ actionText = "DO_ACTION" }) {
|
18 |
const { isAuthenticated, user, login, logout, loading } = useAuth();
|
19 |
const navigate = useNavigate();
|
20 |
-
const {t} = useTranslation({AuthContainer});
|
21 |
|
22 |
const handleLogout = () => {
|
23 |
if (isAuthenticated && logout) {
|
@@ -63,10 +61,11 @@ function AuthContainer({ actionText = "DO_ACTION" }) {
|
|
63 |
}}
|
64 |
>
|
65 |
<Typography variant="h6" align="center">
|
66 |
-
{
|
67 |
</Typography>
|
68 |
<Typography variant="body2" color="text.secondary" align="center">
|
69 |
-
{
|
|
|
70 |
</Typography>
|
71 |
<Button
|
72 |
variant="contained"
|
@@ -90,7 +89,7 @@ function AuthContainer({ actionText = "DO_ACTION" }) {
|
|
90 |
px: 2,
|
91 |
}}
|
92 |
>
|
93 |
-
|
94 |
</Button>
|
95 |
</Paper>
|
96 |
);
|
@@ -109,7 +108,7 @@ function AuthContainer({ actionText = "DO_ACTION" }) {
|
|
109 |
>
|
110 |
<Stack direction="row" spacing={1} alignItems="center">
|
111 |
<Typography variant="body1">
|
112 |
-
|
113 |
</Typography>
|
114 |
<Chip
|
115 |
label={`Ready to ${actionText}`}
|
@@ -130,20 +129,11 @@ function AuthContainer({ actionText = "DO_ACTION" }) {
|
|
130 |
fontSize: "0.9375rem",
|
131 |
}}
|
132 |
>
|
133 |
-
|
134 |
</Button>
|
135 |
</Stack>
|
136 |
</Paper>
|
137 |
);
|
138 |
}
|
139 |
|
140 |
-
const { i18n } = declareComponentKeys<
|
141 |
-
| "login"
|
142 |
-
| "need"
|
143 |
-
| "logout"
|
144 |
-
| "button"
|
145 |
-
| { K: "loggedin"; P: { user: string; }; R: JSX.Element }
|
146 |
-
>()({ AuthContainer });
|
147 |
-
export type I18n = typeof i18n;
|
148 |
-
|
149 |
export default AuthContainer;
|
|
|
12 |
import { useAuth } from "../../hooks/useAuth";
|
13 |
import LogoutIcon from "@mui/icons-material/Logout";
|
14 |
import { useNavigate } from "react-router-dom";
|
|
|
15 |
|
16 |
function AuthContainer({ actionText = "DO_ACTION" }) {
|
17 |
const { isAuthenticated, user, login, logout, loading } = useAuth();
|
18 |
const navigate = useNavigate();
|
|
|
19 |
|
20 |
const handleLogout = () => {
|
21 |
if (isAuthenticated && logout) {
|
|
|
61 |
}}
|
62 |
>
|
63 |
<Typography variant="h6" align="center">
|
64 |
+
Login to {actionText}
|
65 |
</Typography>
|
66 |
<Typography variant="body2" color="text.secondary" align="center">
|
67 |
+
You need to be logged in with your Hugging Face account to{" "}
|
68 |
+
{actionText.toLowerCase()}
|
69 |
</Typography>
|
70 |
<Button
|
71 |
variant="contained"
|
|
|
89 |
px: 2,
|
90 |
}}
|
91 |
>
|
92 |
+
Sign in with Hugging Face
|
93 |
</Button>
|
94 |
</Paper>
|
95 |
);
|
|
|
108 |
>
|
109 |
<Stack direction="row" spacing={1} alignItems="center">
|
110 |
<Typography variant="body1">
|
111 |
+
Connected as <strong>{user?.username}</strong>
|
112 |
</Typography>
|
113 |
<Chip
|
114 |
label={`Ready to ${actionText}`}
|
|
|
129 |
fontSize: "0.9375rem",
|
130 |
}}
|
131 |
>
|
132 |
+
Logout
|
133 |
</Button>
|
134 |
</Stack>
|
135 |
</Paper>
|
136 |
);
|
137 |
}
|
138 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
export default AuthContainer;
|
frontend/src/config/auth.js
CHANGED
@@ -2,6 +2,6 @@ export const HF_CONFIG = {
|
|
2 |
CLIENT_ID: "b78fb86a-a94f-4f18-b0de-c559486ff756",
|
3 |
STORAGE_KEY: "hf_oauth",
|
4 |
SCOPE: "openid profile",
|
5 |
-
PROD_URL: "
|
6 |
DEV_URL: "http://localhost:7860"
|
7 |
-
};
|
|
|
2 |
CLIENT_ID: "b78fb86a-a94f-4f18-b0de-c559486ff756",
|
3 |
STORAGE_KEY: "hf_oauth",
|
4 |
SCOPE: "openid profile",
|
5 |
+
PROD_URL: "",
|
6 |
DEV_URL: "http://localhost:7860"
|
7 |
+
};
|
frontend/src/i18n.tsx
DELETED
@@ -1,88 +0,0 @@
|
|
1 |
-
import { createI18nApi, declareComponentKeys } from "i18nifty";
|
2 |
-
import { Typography } from "@mui/material";
|
3 |
-
export {declareComponentKeys};
|
4 |
-
|
5 |
-
//List the languages you with to support
|
6 |
-
export const languages = ["en", "fr"] as const;
|
7 |
-
|
8 |
-
//If the user's browser language doesn't match any
|
9 |
-
//of the languages above specify the language to fallback to:
|
10 |
-
export const fallbackLanguage = "en";
|
11 |
-
|
12 |
-
export type Language = typeof languages[number];
|
13 |
-
|
14 |
-
export type LocalizedString = Parameters<typeof resolveLocalizedString>[0];
|
15 |
-
|
16 |
-
export const {
|
17 |
-
useTranslation,
|
18 |
-
resolveLocalizedString,
|
19 |
-
useLang,
|
20 |
-
$lang,
|
21 |
-
useResolveLocalizedString,
|
22 |
-
/** For use outside of React */
|
23 |
-
getTranslation,
|
24 |
-
} = createI18nApi<
|
25 |
-
| import ("pages/AddModelPage/AddModelPage").I18n
|
26 |
-
| import ("components/Header/Header").I18n
|
27 |
-
| import ("components/Navigation/Navigation").I18n
|
28 |
-
| import ("components/shared/AuthContainer").I18n
|
29 |
-
>()(
|
30 |
-
{
|
31 |
-
languages,
|
32 |
-
fallbackLanguage
|
33 |
-
},
|
34 |
-
{
|
35 |
-
"en": {
|
36 |
-
"header": {
|
37 |
-
"tagline": "Benchmark for large language models in French",
|
38 |
-
"service": "LLM leaderboard for the French language"
|
39 |
-
},
|
40 |
-
"Navigation": {
|
41 |
-
"submit": "Submit",
|
42 |
-
"about": "About"
|
43 |
-
},
|
44 |
-
"AddModelPage": {
|
45 |
-
"title": "Submit a model for evaluation",
|
46 |
-
"subtitle": "Add your model to the LLM leaderboard for the French language."
|
47 |
-
},
|
48 |
-
"AuthContainer": {
|
49 |
-
"login": "Login to submit a model",
|
50 |
-
"need": "You need to be logged in with your Hugging Face account to submit a model",
|
51 |
-
"logout": "Logout",
|
52 |
-
"button": "Sign in with Hugging Face",
|
53 |
-
"loggedin": ({user}) => (
|
54 |
-
<Typography variant="body1">
|
55 |
-
Connected as <strong>{user}</strong>
|
56 |
-
</Typography>
|
57 |
-
)
|
58 |
-
}
|
59 |
-
},
|
60 |
-
/* spell-checker: disable */
|
61 |
-
"fr": {
|
62 |
-
"header": {
|
63 |
-
"tagline": "Comparaison de modèles d'IA génératifs sur des jeux de données adaptés à la langue française",
|
64 |
-
"service": "Leaderboard des modèles de langage pour le français"
|
65 |
-
},
|
66 |
-
"Navigation": {
|
67 |
-
"submit": "Soumettre",
|
68 |
-
"about": "A propos"
|
69 |
-
},
|
70 |
-
"AddModelPage": {
|
71 |
-
"title": "Soumettre un modele a l'evaluation",
|
72 |
-
"subtitle": "Ajoutez votre modele au leaderboard des modeles de langage pour le francais"
|
73 |
-
},
|
74 |
-
"AuthContainer": {
|
75 |
-
"login": "Se connecter pour soumettre un modele",
|
76 |
-
"need": "Il vous faut vous connecter avec votre compte Hugging Face pour soumettre un modele",
|
77 |
-
"logout": "Se deconnecter",
|
78 |
-
"button": "Se connecter avec Hugging Face",
|
79 |
-
"loggedin": ({user}) => (
|
80 |
-
<Typography variant="body1">
|
81 |
-
Connecte en tant que <strong>{user}</strong>
|
82 |
-
</Typography>
|
83 |
-
)
|
84 |
-
}
|
85 |
-
}
|
86 |
-
/* spell-checker: enable */
|
87 |
-
}
|
88 |
-
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/src/index.css
CHANGED
@@ -54,27 +54,6 @@ button:focus-visible {
|
|
54 |
outline: 4px auto -webkit-focus-ring-color;
|
55 |
}
|
56 |
|
57 |
-
.logo_footer {
|
58 |
-
box-shadow: none !important;
|
59 |
-
height: 5rem !important;
|
60 |
-
}
|
61 |
-
|
62 |
-
.content_link {
|
63 |
-
display: none;
|
64 |
-
}
|
65 |
-
|
66 |
-
.foot_content {
|
67 |
-
margin-top: 3rem;
|
68 |
-
}
|
69 |
-
|
70 |
-
@media (min-width: 62rem) {
|
71 |
-
.foot_content {
|
72 |
-
margin-top: 0;
|
73 |
-
flex-basis: 100%;
|
74 |
-
max-width: 60rem;
|
75 |
-
}
|
76 |
-
}
|
77 |
-
|
78 |
@media (prefers-color-scheme: light) {
|
79 |
:root {
|
80 |
color: #213547;
|
|
|
54 |
outline: 4px auto -webkit-focus-ring-color;
|
55 |
}
|
56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
@media (prefers-color-scheme: light) {
|
58 |
:root {
|
59 |
color: #213547;
|
frontend/src/main.jsx
CHANGED
@@ -2,16 +2,8 @@ import { StrictMode } from 'react'
|
|
2 |
import { createRoot } from 'react-dom/client'
|
3 |
import './index.css'
|
4 |
import App from './App.jsx'
|
5 |
-
import { useLang } from "i18n";
|
6 |
import { startReactDsfr } from "@codegouvfr/react-dsfr/spa";
|
7 |
-
|
8 |
-
startReactDsfr({
|
9 |
-
defaultColorScheme: "system",
|
10 |
-
useLang: function useLangDsfr() {
|
11 |
-
const { lang } = useLang();
|
12 |
-
return lang;
|
13 |
-
}
|
14 |
-
});
|
15 |
|
16 |
createRoot(document.getElementById('root')).render(
|
17 |
<StrictMode>
|
|
|
2 |
import { createRoot } from 'react-dom/client'
|
3 |
import './index.css'
|
4 |
import App from './App.jsx'
|
|
|
5 |
import { startReactDsfr } from "@codegouvfr/react-dsfr/spa";
|
6 |
+
startReactDsfr({ defaultColorScheme: "system" });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
8 |
createRoot(document.getElementById('root')).render(
|
9 |
<StrictMode>
|
frontend/src/pages/AboutPage/AboutPage.tsx
DELETED
@@ -1,363 +0,0 @@
|
|
1 |
-
import PageHeader from "components/shared/PageHeader";
|
2 |
-
import { Box, Typography, Paper, List, ListItem, ListItemIcon } from "@mui/material";
|
3 |
-
import { LocalizedString, useResolveLocalizedString } from "i18n";
|
4 |
-
import FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';
|
5 |
-
import NavigateNextIcon from '@mui/icons-material/NavigateNext';
|
6 |
-
|
7 |
-
const TEXT = {
|
8 |
-
TITLE: {
|
9 |
-
"en": "About",
|
10 |
-
"fr": "A propos"
|
11 |
-
},
|
12 |
-
PARAGRAPH1: {
|
13 |
-
"en": "As LLMs capabilities improve, so do the social and economic stakes around this technology. Governments and institutions now have a vested interest in understanding AI technologies to assess whether and how they can benefit their economies, industries, and society as a whole.",
|
14 |
-
"fr": "À mesure que les modèles de langage progressent, leurs enjeux économiques et sociétaux prennent de plus en plus d’ampleur. Les gouvernements et institutions doivent désormais s’approprier ces technologies pour en comprendre les implications et évaluer comment elles peuvent contribuer à leurs économies, leurs industries et à la société dans son ensemble."
|
15 |
-
},
|
16 |
-
PARAGRAPH2: {
|
17 |
-
"en": "In this light, the French Coordination Nationale de l'IA, Ministère de l'Éducation nationale, Inria, LNE, and GENCI collaborated with Hugging Face to build a new LLM reference leaderboard for models in the French language, providing a comprehensive and transparent assessment of their performance, capabilities, and limitations.",
|
18 |
-
"fr": "C’est dans cette dynamique que la Coordination Nationale pour l’IA, le Ministère de l’Éducation nationale, Inria, le LNE et GENCI ont collaboré avec Hugging Face pour créer un leaderboard de référence dédié aux modèles de langage en français. Cet outil offre une évaluation de leurs performances, de leurs capacités et aussi de leurs limites."
|
19 |
-
},
|
20 |
-
PARAGRAPH3: {
|
21 |
-
"en": "The collaboration focused on a range of tasks and evaluation metrics, either entirely new or culturally adapted to be specific to the French language and cultural context.",
|
22 |
-
"fr": "La collaboration s’est concentrée sur un ensemble de tâches et d’indicateurs d’évaluation (benchmarks), soit entièrement nouveaux, soit adaptés pour prendre en compte les spécificités linguistiques et culturelles du français."
|
23 |
-
},
|
24 |
-
BUTS: {
|
25 |
-
TITRE: {
|
26 |
-
"en": "Goals",
|
27 |
-
"fr": "Objectifs"
|
28 |
-
},
|
29 |
-
BUT1: {
|
30 |
-
"en": "Improve LLM evaluation and comparison by providing a standardized leaderboard, allowing researchers, developers, and industry stakeholders to benchmark different models on a level playing field, enabling informed decision-making and fostering innovation.",
|
31 |
-
"fr": "Améliorer l’évaluation et la comparaison des modèles de langage, en mettant à disposition un leaderboard standardisé, permettant aux chercheurs, développeurs et industriels de comparer leurs performances sur une base équitable, favorisant ainsi une prise de décision éclairée et stimulant l’innovation."
|
32 |
-
},
|
33 |
-
BUT2: {
|
34 |
-
"en": "Promote the French language and culture by encouraging better integration of French into all AI models. By structuring evaluation around French-language tasks, we hope to incentivize model developers, including international ones, to incorporate more French-language data into their training datasets. In doing so, we also aim to enhance the overall capabilities of these models, improving their performance not just in French, but in multilingual tasks more broadly.",
|
35 |
-
"fr": "Promouvoir la langue et la culture françaises, en encourageant une meilleure intégration du français dans tous les modèles d’IA. En structurant l’évaluation autour de tâches spécifiques en français, nous espérons inciter les développeurs, y compris internationaux, à intégrer davantage de corpus francophones dans leurs données d’entraînement. En retour, cela permettra d’améliorer leurs performances, non seulement en français, mais aussi dans les tâches multilingues de manière plus large."
|
36 |
-
},
|
37 |
-
BUT3: {
|
38 |
-
"en": "Support AI research and development in France and French-speaking countries, encouraging researchers and developers to contribute to the advancement of more accurate, efficient, and effective LLMs.",
|
39 |
-
"fr": "Soutenir la recherche et le développement en IA en France et dans les pays francophones, en encourageant les chercheurs et développeurs à contribuer à l’amélioration des modèles de langage, en les rendant plus précis, efficaces et performants."
|
40 |
-
}
|
41 |
-
},
|
42 |
-
DATASETS: {
|
43 |
-
TITRE: {
|
44 |
-
"en": "The datasets considered include",
|
45 |
-
"fr": "Jeux de données utilisés"
|
46 |
-
},
|
47 |
-
DATASET1: {
|
48 |
-
"en": "GPQA (PhD-level knowledge assessment, professionally translated by Inria),",
|
49 |
-
"fr": "GPQA : évaluation des connaissances au niveau doctorat, traduit par Inria."
|
50 |
-
},
|
51 |
-
DATASET2: {
|
52 |
-
"en": "IFEval (LLMs’ ability to follow instructions, professionally culturally adapted by Inria),",
|
53 |
-
"fr": "IFEval : capacité des modèles à suivre des instructions, traduit et adapté culturellement par Inria."
|
54 |
-
},
|
55 |
-
DATASET3: {
|
56 |
-
"en": "A new dataset built from Baccalauréat (end of French high school exam) data, provided by the Ministère de l'Éducation nationale, extracted and curated by LNE and Inria.",
|
57 |
-
"fr": "Un jeu de données inédit construit à partir des sujets du Baccalauréat (examen de fin d’études secondaires en France), fourni par le Ministère de l’Éducation nationale et extrait par LNE et Inria."
|
58 |
-
},
|
59 |
-
FOOTER: {
|
60 |
-
"en": "GENCI engineers have already conducted evaluations on the French National Jean Zay supercluster, to ensure the robustness of the leaderboard, with researchers providing technical expertise at every step.",
|
61 |
-
"fr": "Les ingénieurs de GENCI ont déjà réalisé des évaluations sur le supercalculateur national Jean Zay, afin d’assurer la robustesse du leaderboard, avec le soutien technique de chercheurs d’Hugging Face à chaque étape du processus."
|
62 |
-
}
|
63 |
-
},
|
64 |
-
APPROCHE: {
|
65 |
-
TITRE: {
|
66 |
-
"en": "The Leaderboard Approach",
|
67 |
-
"fr": "Approche du Leaderboard"
|
68 |
-
},
|
69 |
-
P1: {
|
70 |
-
"en": "This is just the first iteration of the leaderboard, and new versions will follow as we enrich it with additional benchmarks and evaluation methods.",
|
71 |
-
"fr": "Cette première version du leaderboard marque le début d’un projet évolutif : de nouvelles versions verront le jour, enrichies avec de nouveaux benchmarks et méthodes d’évaluation."
|
72 |
-
},
|
73 |
-
P2: {
|
74 |
-
"en": "To ensure the robustness of the leaderboard, we first conducted internal evaluations on a selection of models. However, we want to maintain the spirit of the leaderboard: developers (you!) should submit your own models.",
|
75 |
-
"fr": "Pour garantir la solidité et la fiabilité de l’outil, nous avons dans un premier temps réalisé des évaluations internes sur une sélection de modèles. Toutefois, nous souhaitons rester fidèles à l’esprit du leaderboard et encourager les développeurs (vous !) à soumettre leurs propres modèles."
|
76 |
-
},
|
77 |
-
P3: {
|
78 |
-
"en": "Once we reach a sufficient number of submissions, we will add the results to the official ranking. Please bear with us—since evaluations are conducted using public computing resources (thanks to the incredible work of GENCI on the Jean Zay supercomputer), model evaluations might take some time.",
|
79 |
-
"fr": "Une fois qu’un nombre suffisant de modèles aura été soumis, nous ajouterons les résultats au classement officiel. Merci pour votre patience : les évaluations sont réalisées sur des ressources de calcul publiques (grâce au travail remarquable du GENCI sur le supercalculateur Jean Zay), ce qui peut nécessiter un certain délai pour traiter les soumissions."
|
80 |
-
},
|
81 |
-
P4: {
|
82 |
-
"en": "Finally, it is important to note that this is an OpenLLM leaderboard —we will only evaluate open-source models.",
|
83 |
-
"fr": "Enfin, il est important de préciser que ce leaderboard est un OpenLLM leaderboard : seuls les modèles open source seront évalués."
|
84 |
-
},
|
85 |
-
},
|
86 |
-
ACTEURS: {
|
87 |
-
TITRE: {
|
88 |
-
"en": "Stakeholders and contribution",
|
89 |
-
"fr": "Les acteurs du projet"
|
90 |
-
},
|
91 |
-
P1: {
|
92 |
-
"en": "This leaderboard is the result of a collaborative effort between several key organizations, each playing a crucial role in its development and execution:",
|
93 |
-
"fr": "Ce leaderboard est le fruit d’une mobilisation collective impliquant plusieurs partenaires clés :"
|
94 |
-
},
|
95 |
-
I1: {
|
96 |
-
"en": "Coordination Nationale pour l’IA (CNIA): As the entity leading France’s national AI strategy, the national coordination for AI structured the leaderboard project, establishing it as a key deliverable within the Trustworthy AI pillar of the national strategy. It coordinated the various partners and contributed to the selection of strategic benchmarks, including the integration of Baccalauréat exam data, creating a unique benchmark for French-language AI models.",
|
97 |
-
"fr": "Coordination Nationale pour l’IA (CNIA) : au pilotage de la stratégie nationale pour l’IA, la CNIA a structuré le projet du leaderboard, en l’inscrivant comme un livrable clé de l’axe IA de confiance de la stratégie française. Elle a coordonné les partenaires et contribué à l’identification des benchmarks stratégiques, dont l’intégration des données du Baccalauréat pour un benchmark inédit en français."
|
98 |
-
},
|
99 |
-
I2: {
|
100 |
-
"en": "Inria: Led the operational management of the project, including mobilizing a specialized translation provider to ensure high-quality linguistic adaptation. INRIA engineers also worked on data extraction from Baccalauréat exams and contributed to the backend/frontend development of the leaderboard.",
|
101 |
-
"fr": "Inria : pilotage opérationnel du projet, avec le recours à un prestataire de traduction spécialisé pour garantir une adaptation linguistique optimale. Des ingénieurs ont également été mobilisés pour l’extraction des données du Baccalauréat, ainsi que pour le développement et la consolidation du back-end/front-end de la plateforme."
|
102 |
-
},
|
103 |
-
I3: {
|
104 |
-
"en": "GENCI: Conducted test evaluations on the French National Jean Zay supercomputer, ensuring the robustness of the results. So far, evaluations have been performed on a dozen models of various sizes, a crucial element for ensuring the leaderboard's reliability. This includes models such as Mistral Large, Llama 70B, as well as smaller models, including trending models like Qwen.",
|
105 |
-
"fr": "GENCI : réalisation des évaluations tests sur le supercalculateur national Jean Zay, garantissant la robustesse des résultats. Nous avons d’ores et déjà évalué une dizaine de modèles de tailles variées, un élément clé pour assurer la fiabilité du leaderboard. Cela inclut des modèles comme Mistral Large, Llama 70B, ainsi que des modèles plus légers, notamment des modèles en forte croissance comme Qwen."
|
106 |
-
},
|
107 |
-
I4: {
|
108 |
-
"en": "LNE (Laboratoire National de Métrologie et d’Essais): Conducted data verification and extraction, essential for building the final benchmarks.",
|
109 |
-
"fr": "LNE (Laboratoire National de Métrologie et d’Essais) : travail de vérification et d’extraction des données pertinentes, essentiel pour la création des benchmarks finaux."
|
110 |
-
},
|
111 |
-
I5: {
|
112 |
-
"en": "Ministère de l’Éducation nationale: Provided access to Baccalauréat data, enabling the creation of an unprecedented dataset that serves as a valuable benchmark",
|
113 |
-
"fr": "Ministère de l’Éducation nationale : mise à disposition des données du Baccalauréat, ayant permis de construire un jeu de données inédit, qui constitue un benchmark de référence."
|
114 |
-
},
|
115 |
-
I6: {
|
116 |
-
"en": "And of course Hugging Face: Hosting the evaluation platform and provided technical expertise all along the way.",
|
117 |
-
"fr": "Et bien sûr Hugging Face : hébergement de la plateforme d’évaluation et expertise technique tout au long du projet."
|
118 |
-
},
|
119 |
-
},
|
120 |
-
}
|
121 |
-
|
122 |
-
const AboutPage = () => {
|
123 |
-
|
124 |
-
const {resolveLocalizedString} = useResolveLocalizedString();
|
125 |
-
|
126 |
-
return (
|
127 |
-
<Box sx={{ width: "100%", maxWidth: 1200, margin: "0 auto", padding: 4 }}>
|
128 |
-
<Box
|
129 |
-
sx={{
|
130 |
-
width: "100%",
|
131 |
-
ph: 2,
|
132 |
-
display: "flex",
|
133 |
-
flexDirection: "column",
|
134 |
-
}}
|
135 |
-
>
|
136 |
-
|
137 |
-
<PageHeader
|
138 |
-
title={resolveLocalizedString(TEXT.TITLE)}
|
139 |
-
subtitle=""
|
140 |
-
/>
|
141 |
-
|
142 |
-
<Paper
|
143 |
-
elevation={0}
|
144 |
-
sx={{
|
145 |
-
p: 3,
|
146 |
-
border: "1px solid",
|
147 |
-
borderColor: "grey.200",
|
148 |
-
backgroundColor: "transparent",
|
149 |
-
borderRadius: 2,
|
150 |
-
mb: 6
|
151 |
-
}}
|
152 |
-
>
|
153 |
-
<Box sx={{mb: 2}}>
|
154 |
-
<Typography variant="body1">
|
155 |
-
{resolveLocalizedString(TEXT.PARAGRAPH1)}
|
156 |
-
</Typography>
|
157 |
-
<br/>
|
158 |
-
<Typography variant="body1">
|
159 |
-
{resolveLocalizedString(TEXT.PARAGRAPH2)}
|
160 |
-
</Typography>
|
161 |
-
<br/>
|
162 |
-
<Typography variant="body1">
|
163 |
-
{resolveLocalizedString(TEXT.PARAGRAPH3)}
|
164 |
-
</Typography>
|
165 |
-
</Box>
|
166 |
-
|
167 |
-
</Paper>
|
168 |
-
|
169 |
-
<Paper
|
170 |
-
elevation={1}
|
171 |
-
sx={{
|
172 |
-
p: 3,
|
173 |
-
border: "1px solid",
|
174 |
-
borderColor: "grey.200",
|
175 |
-
backgroundColor: "transparent",
|
176 |
-
borderRadius: 2,
|
177 |
-
mb: 6
|
178 |
-
}}
|
179 |
-
>
|
180 |
-
<Box sx={{mb: 2}}>
|
181 |
-
<Typography variant="h6">
|
182 |
-
{resolveLocalizedString(TEXT.BUTS.TITRE)}
|
183 |
-
</Typography>
|
184 |
-
<Typography variant="body1">
|
185 |
-
<List>
|
186 |
-
<ListItem>
|
187 |
-
<ListItemIcon>
|
188 |
-
<NavigateNextIcon/>
|
189 |
-
</ListItemIcon>
|
190 |
-
{resolveLocalizedString(TEXT.BUTS.BUT1)}
|
191 |
-
</ListItem>
|
192 |
-
<ListItem>
|
193 |
-
<ListItemIcon>
|
194 |
-
<NavigateNextIcon/>
|
195 |
-
</ListItemIcon>
|
196 |
-
{resolveLocalizedString(TEXT.BUTS.BUT2)}
|
197 |
-
</ListItem>
|
198 |
-
<ListItem>
|
199 |
-
<ListItemIcon>
|
200 |
-
<NavigateNextIcon/>
|
201 |
-
</ListItemIcon>
|
202 |
-
{resolveLocalizedString(TEXT.BUTS.BUT3)}
|
203 |
-
</ListItem>
|
204 |
-
</List>
|
205 |
-
|
206 |
-
</Typography>
|
207 |
-
</Box>
|
208 |
-
|
209 |
-
</Paper>
|
210 |
-
|
211 |
-
<Paper
|
212 |
-
elevation={0}
|
213 |
-
sx={{
|
214 |
-
p: 3,
|
215 |
-
border: "1px solid",
|
216 |
-
borderColor: "grey.200",
|
217 |
-
backgroundColor: "transparent",
|
218 |
-
borderRadius: 2,
|
219 |
-
mb: 6
|
220 |
-
}}
|
221 |
-
>
|
222 |
-
<Box sx={{mb: 2}}>
|
223 |
-
<Typography variant="h6">
|
224 |
-
{resolveLocalizedString(TEXT.DATASETS.TITRE)}
|
225 |
-
</Typography>
|
226 |
-
<Typography variant="body1">
|
227 |
-
<List>
|
228 |
-
<ListItem>
|
229 |
-
<ListItemIcon>
|
230 |
-
<NavigateNextIcon/>
|
231 |
-
</ListItemIcon>
|
232 |
-
{resolveLocalizedString(TEXT.DATASETS.DATASET1)}
|
233 |
-
</ListItem>
|
234 |
-
<ListItem>
|
235 |
-
<ListItemIcon>
|
236 |
-
<NavigateNextIcon/>
|
237 |
-
</ListItemIcon>
|
238 |
-
{resolveLocalizedString(TEXT.DATASETS.DATASET2)}
|
239 |
-
</ListItem>
|
240 |
-
<ListItem>
|
241 |
-
<ListItemIcon>
|
242 |
-
<NavigateNextIcon/>
|
243 |
-
</ListItemIcon>
|
244 |
-
{resolveLocalizedString(TEXT.DATASETS.DATASET3)}
|
245 |
-
</ListItem>
|
246 |
-
</List>
|
247 |
-
</Typography>
|
248 |
-
<br/>
|
249 |
-
<Typography variant="body1">
|
250 |
-
{resolveLocalizedString(TEXT.DATASETS.FOOTER)}
|
251 |
-
</Typography>
|
252 |
-
</Box>
|
253 |
-
|
254 |
-
</Paper>
|
255 |
-
|
256 |
-
<Paper
|
257 |
-
elevation={1}
|
258 |
-
sx={{
|
259 |
-
p: 3,
|
260 |
-
border: "1px solid",
|
261 |
-
borderColor: "grey.200",
|
262 |
-
backgroundColor: "transparent",
|
263 |
-
borderRadius: 2,
|
264 |
-
mb: 6
|
265 |
-
}}
|
266 |
-
>
|
267 |
-
<Box sx={{mb: 2}}>
|
268 |
-
<Typography variant="h6">
|
269 |
-
{resolveLocalizedString(TEXT.APPROCHE.TITRE)}
|
270 |
-
</Typography>
|
271 |
-
<br/>
|
272 |
-
<Typography variant="body1">
|
273 |
-
{resolveLocalizedString(TEXT.APPROCHE.P1)}
|
274 |
-
</Typography>
|
275 |
-
<br/>
|
276 |
-
<Typography variant="body1">
|
277 |
-
{resolveLocalizedString(TEXT.APPROCHE.P2)}
|
278 |
-
</Typography>
|
279 |
-
<br/>
|
280 |
-
<Typography variant="body1">
|
281 |
-
{resolveLocalizedString(TEXT.APPROCHE.P3)}
|
282 |
-
</Typography>
|
283 |
-
<br/>
|
284 |
-
<Typography variant="body1">
|
285 |
-
{resolveLocalizedString(TEXT.APPROCHE.P4)}
|
286 |
-
</Typography>
|
287 |
-
</Box>
|
288 |
-
|
289 |
-
</Paper>
|
290 |
-
|
291 |
-
<Paper
|
292 |
-
elevation={0}
|
293 |
-
sx={{
|
294 |
-
p: 3,
|
295 |
-
border: "1px solid",
|
296 |
-
borderColor: "grey.200",
|
297 |
-
backgroundColor: "transparent",
|
298 |
-
borderRadius: 2,
|
299 |
-
mb: 6
|
300 |
-
}}
|
301 |
-
>
|
302 |
-
<Box sx={{mb: 2}}>
|
303 |
-
<Typography variant="h6">
|
304 |
-
{resolveLocalizedString(TEXT.ACTEURS.TITRE)}
|
305 |
-
</Typography>
|
306 |
-
<br/>
|
307 |
-
<Typography variant="body1">
|
308 |
-
{resolveLocalizedString(TEXT.ACTEURS.P1)}
|
309 |
-
</Typography>
|
310 |
-
<br/>
|
311 |
-
<Typography variant="body1">
|
312 |
-
<List>
|
313 |
-
<ListItem>
|
314 |
-
<ListItemIcon>
|
315 |
-
<NavigateNextIcon/>
|
316 |
-
</ListItemIcon>
|
317 |
-
{resolveLocalizedString(TEXT.ACTEURS.I1)}
|
318 |
-
</ListItem>
|
319 |
-
<ListItem>
|
320 |
-
<ListItemIcon>
|
321 |
-
<NavigateNextIcon/>
|
322 |
-
</ListItemIcon>
|
323 |
-
{resolveLocalizedString(TEXT.ACTEURS.I2)}
|
324 |
-
</ListItem>
|
325 |
-
<ListItem>
|
326 |
-
<ListItemIcon>
|
327 |
-
<NavigateNextIcon/>
|
328 |
-
</ListItemIcon>
|
329 |
-
{resolveLocalizedString(TEXT.ACTEURS.I3)}
|
330 |
-
</ListItem>
|
331 |
-
<ListItem>
|
332 |
-
<ListItemIcon>
|
333 |
-
<NavigateNextIcon/>
|
334 |
-
</ListItemIcon>
|
335 |
-
{resolveLocalizedString(TEXT.ACTEURS.I4)}
|
336 |
-
</ListItem>
|
337 |
-
<ListItem>
|
338 |
-
<ListItemIcon>
|
339 |
-
<NavigateNextIcon/>
|
340 |
-
</ListItemIcon>
|
341 |
-
{resolveLocalizedString(TEXT.ACTEURS.I5)}
|
342 |
-
</ListItem>
|
343 |
-
<ListItem>
|
344 |
-
<ListItemIcon>
|
345 |
-
<NavigateNextIcon/>
|
346 |
-
</ListItemIcon>
|
347 |
-
{resolveLocalizedString(TEXT.ACTEURS.I6)}
|
348 |
-
</ListItem>
|
349 |
-
</List>
|
350 |
-
|
351 |
-
</Typography>
|
352 |
-
</Box>
|
353 |
-
|
354 |
-
</Paper>
|
355 |
-
|
356 |
-
|
357 |
-
</Box>
|
358 |
-
</Box>
|
359 |
-
|
360 |
-
);
|
361 |
-
};
|
362 |
-
|
363 |
-
export default AboutPage;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/src/pages/AddModelPage/{AddModelPage.tsx → AddModelPage.jsx}
RENAMED
@@ -5,11 +5,9 @@ import PageHeader from "../../components/shared/PageHeader";
|
|
5 |
import EvaluationQueues from "./components/EvaluationQueues/EvaluationQueues";
|
6 |
import ModelSubmissionForm from "./components/ModelSubmissionForm/ModelSubmissionForm";
|
7 |
import SubmissionGuide from "./components/SubmissionGuide/SubmissionGuide";
|
8 |
-
import { useTranslation, declareComponentKeys } from "i18n";
|
9 |
|
10 |
function AddModelPage() {
|
11 |
const { isAuthenticated, loading, user } = useAuth();
|
12 |
-
const {t} = useTranslation({AddModelPage});
|
13 |
|
14 |
if (loading) {
|
15 |
return (
|
@@ -29,10 +27,11 @@ function AddModelPage() {
|
|
29 |
return (
|
30 |
<Box sx={{ width: "100%", maxWidth: 1200, margin: "0 auto", padding: 4 }}>
|
31 |
<PageHeader
|
32 |
-
title=
|
33 |
subtitle={
|
34 |
<>
|
35 |
-
{
|
|
|
36 |
</>
|
37 |
}
|
38 |
/>
|
@@ -46,10 +45,4 @@ function AddModelPage() {
|
|
46 |
);
|
47 |
}
|
48 |
|
49 |
-
const { i18n } = declareComponentKeys<
|
50 |
-
| "title"
|
51 |
-
| "subtitle"
|
52 |
-
>()({ AddModelPage });
|
53 |
-
export type I18n = typeof i18n;
|
54 |
-
|
55 |
export default AddModelPage;
|
|
|
5 |
import EvaluationQueues from "./components/EvaluationQueues/EvaluationQueues";
|
6 |
import ModelSubmissionForm from "./components/ModelSubmissionForm/ModelSubmissionForm";
|
7 |
import SubmissionGuide from "./components/SubmissionGuide/SubmissionGuide";
|
|
|
8 |
|
9 |
function AddModelPage() {
|
10 |
const { isAuthenticated, loading, user } = useAuth();
|
|
|
11 |
|
12 |
if (loading) {
|
13 |
return (
|
|
|
27 |
return (
|
28 |
<Box sx={{ width: "100%", maxWidth: 1200, margin: "0 auto", padding: 4 }}>
|
29 |
<PageHeader
|
30 |
+
title="Submit a Model for Evaluation"
|
31 |
subtitle={
|
32 |
<>
|
33 |
+
Add <span style={{ fontWeight: 600 }}>your</span> model to the Open
|
34 |
+
LLM Leaderboard
|
35 |
</>
|
36 |
}
|
37 |
/>
|
|
|
45 |
);
|
46 |
}
|
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
export default AddModelPage;
|
frontend/src/pages/AddModelPage/components/EvaluationQueues/EvaluationQueues.jsx
CHANGED
@@ -25,176 +25,82 @@ import AutorenewIcon from "@mui/icons-material/Autorenew";
|
|
25 |
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
|
26 |
import OpenInNewIcon from "@mui/icons-material/OpenInNew";
|
27 |
import { useVirtualizer } from "@tanstack/react-virtual";
|
28 |
-
import { resolveLocalizedString, useResolveLocalizedString } from "i18n";
|
29 |
|
30 |
// Function to format wait time
|
31 |
const formatWaitTime = (waitTimeStr) => {
|
32 |
const seconds = parseFloat(waitTimeStr.replace("s", ""));
|
33 |
|
34 |
if (seconds < 60) {
|
35 |
-
return
|
36 |
-
"en": "just now",
|
37 |
-
"fr": "a l'instant"
|
38 |
-
};
|
39 |
}
|
40 |
|
41 |
const minutes = Math.floor(seconds / 60);
|
42 |
if (minutes < 60) {
|
43 |
-
return {
|
44 |
-
"en": `${minutes}m ago`,
|
45 |
-
"fr": `il y a ${minutes}m`
|
46 |
-
};
|
47 |
}
|
48 |
|
49 |
const hours = Math.floor(minutes / 60);
|
50 |
if (hours < 24) {
|
51 |
-
return {
|
52 |
-
"en": `${hours}h ago`,
|
53 |
-
"fr": `il y a ${hours}h`
|
54 |
-
};
|
55 |
}
|
56 |
|
57 |
const days = Math.floor(hours / 24);
|
58 |
-
return {
|
59 |
-
"en": `${days}d ago`,
|
60 |
-
"fr": `il y a${days}j`
|
61 |
-
};
|
62 |
};
|
63 |
|
64 |
// Column definitions with their properties
|
65 |
const columns = [
|
66 |
{
|
67 |
id: "model",
|
68 |
-
label:
|
69 |
-
"en": "Model",
|
70 |
-
"fr": "Modèle"
|
71 |
-
},
|
72 |
width: "35%",
|
73 |
align: "left",
|
74 |
},
|
75 |
{
|
76 |
id: "submitter",
|
77 |
-
label:
|
78 |
-
"en": "Submitted by",
|
79 |
-
"fr": "Soumis par",
|
80 |
-
},
|
81 |
width: "15%",
|
82 |
align: "left",
|
83 |
},
|
84 |
{
|
85 |
id: "wait_time",
|
86 |
-
label:
|
87 |
-
"en": "Submitted",
|
88 |
-
"fr": "Soumis"
|
89 |
-
},
|
90 |
width: "12%",
|
91 |
align: "center",
|
92 |
},
|
93 |
{
|
94 |
id: "precision",
|
95 |
-
label:
|
96 |
-
"en": "Precision",
|
97 |
-
"fr": "Precision"
|
98 |
-
},
|
99 |
width: "13%",
|
100 |
align: "center",
|
101 |
},
|
102 |
{
|
103 |
id: "revision",
|
104 |
-
label:
|
105 |
-
"en":"Revision",
|
106 |
-
"fr": "Revision"
|
107 |
-
},
|
108 |
width: "12%",
|
109 |
align: "center",
|
110 |
},
|
111 |
{
|
112 |
id: "status",
|
113 |
-
label:
|
114 |
-
"en": "Status",
|
115 |
-
"fr": "Statut"
|
116 |
-
},
|
117 |
width: "13%",
|
118 |
align: "center",
|
119 |
},
|
120 |
];
|
121 |
|
122 |
-
const
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
"en": "Completed",
|
129 |
-
"fr": "Terminé"
|
130 |
-
},
|
131 |
-
EMPTY_MESSAGE: {
|
132 |
-
"en": "No models evaluated",
|
133 |
-
"fr": "Aucun modèle n'a ete evalue"
|
134 |
-
},
|
135 |
-
TITLE: {
|
136 |
-
"en": "Recently evaluated models",
|
137 |
-
"fr": "Modèles évalues récemment"
|
138 |
-
}
|
139 |
-
}
|
140 |
-
|
141 |
-
const EVALUATING = {
|
142 |
-
STATUS: {
|
143 |
-
"en": "Evaluating",
|
144 |
-
"fr": "En cours d'évaluation"
|
145 |
-
},
|
146 |
-
CHIP: {
|
147 |
-
"en": "Evaluating",
|
148 |
-
"fr": "En cours d'évaluation"
|
149 |
-
},
|
150 |
-
EMPTY_MESSAGE: {
|
151 |
-
"en": "No models being evaluated",
|
152 |
-
"fr": "Aucun modèle en cours d'évaluation"
|
153 |
-
},
|
154 |
-
TITLE: {
|
155 |
-
"en": "Models being evaluated",
|
156 |
-
"fr": "Modèles en cours d'évaluation"
|
157 |
-
}
|
158 |
-
}
|
159 |
-
|
160 |
-
const PENDING = {
|
161 |
-
STATUS: {
|
162 |
-
"en": "In Queue",
|
163 |
-
"fr": "En attente"
|
164 |
-
},
|
165 |
-
CHIP: {
|
166 |
-
"en": "Pending",
|
167 |
-
"fr": "En attente"
|
168 |
},
|
169 |
-
|
170 |
-
|
171 |
-
|
|
|
172 |
},
|
173 |
-
|
174 |
-
"en": "Models in queue",
|
175 |
-
"fr": "Modèles en attente"
|
176 |
-
}
|
177 |
-
|
178 |
-
}
|
179 |
-
|
180 |
-
const StatusChip = ({ status }) => {
|
181 |
-
const {resolveLocalizedString} = useResolveLocalizedString();
|
182 |
-
const statusConfig = {
|
183 |
-
finished: {
|
184 |
-
icon: <CheckCircleIcon />,
|
185 |
-
label: resolveLocalizedString(COMPLETED.CHIP),
|
186 |
-
color: "success",
|
187 |
-
},
|
188 |
-
evaluating: {
|
189 |
-
icon: <AutorenewIcon />,
|
190 |
-
label: resolveLocalizedString(EVALUATING.CHIP),
|
191 |
-
color: "warning",
|
192 |
-
},
|
193 |
-
pending: {
|
194 |
-
icon: <PendingIcon />,
|
195 |
-
label: resolveLocalizedString(PENDING.CHIP),
|
196 |
-
color: "info"
|
197 |
-
},
|
198 |
};
|
199 |
|
200 |
const config = statusConfig[status] || statusConfig.pending;
|
@@ -275,7 +181,7 @@ const ModelTable = ({ models, emptyMessage, status }) => {
|
|
275 |
padding: "12px 16px",
|
276 |
}}
|
277 |
>
|
278 |
-
{
|
279 |
</TableCell>
|
280 |
))}
|
281 |
</TableRow>
|
@@ -329,7 +235,27 @@ const ModelTable = ({ models, emptyMessage, status }) => {
|
|
329 |
alignItems: "center",
|
330 |
}}
|
331 |
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
332 |
{model.name}
|
|
|
|
|
333 |
</TableCell>
|
334 |
<TableCell
|
335 |
component="div"
|
@@ -372,7 +298,7 @@ const ModelTable = ({ models, emptyMessage, status }) => {
|
|
372 |
}}
|
373 |
>
|
374 |
<AccessTimeIcon sx={{ fontSize: "0.9rem" }} />
|
375 |
-
{
|
376 |
</Typography>
|
377 |
</Tooltip>
|
378 |
</TableCell>
|
@@ -434,21 +360,6 @@ const ModelTable = ({ models, emptyMessage, status }) => {
|
|
434 |
);
|
435 |
};
|
436 |
|
437 |
-
const QUEUE_STATUS = {
|
438 |
-
EVALUATED: {
|
439 |
-
"en": "Evaluated",
|
440 |
-
"fr": "Evalues"
|
441 |
-
},
|
442 |
-
EVALUATING: {
|
443 |
-
"en": "Evaluating",
|
444 |
-
"fr": "En cours d'evaluation"
|
445 |
-
},
|
446 |
-
PENDING: {
|
447 |
-
"en": "In Queue",
|
448 |
-
"fr": "En Attente"
|
449 |
-
},
|
450 |
-
}
|
451 |
-
|
452 |
const QueueAccordion = ({
|
453 |
title,
|
454 |
models,
|
@@ -552,7 +463,6 @@ const EvaluationQueues = ({ defaultExpanded = true }) => {
|
|
552 |
});
|
553 |
const [loading, setLoading] = useState(true);
|
554 |
const [error, setError] = useState(null);
|
555 |
-
const {resolveLocalizedString} = useResolveLocalizedString();
|
556 |
|
557 |
useEffect(() => {
|
558 |
const fetchModels = async () => {
|
@@ -686,7 +596,7 @@ const EvaluationQueues = ({ defaultExpanded = true }) => {
|
|
686 |
}}
|
687 |
>
|
688 |
<Chip
|
689 |
-
label={`${models.pending.length}
|
690 |
size="small"
|
691 |
color="info"
|
692 |
variant="outlined"
|
@@ -705,7 +615,7 @@ const EvaluationQueues = ({ defaultExpanded = true }) => {
|
|
705 |
}}
|
706 |
/>
|
707 |
<Chip
|
708 |
-
label={`${models.evaluating.length}
|
709 |
size="small"
|
710 |
color="warning"
|
711 |
variant="outlined"
|
@@ -724,7 +634,7 @@ const EvaluationQueues = ({ defaultExpanded = true }) => {
|
|
724 |
}}
|
725 |
/>
|
726 |
<Chip
|
727 |
-
label={`${models.finished.length}
|
728 |
size="small"
|
729 |
color="success"
|
730 |
variant="outlined"
|
@@ -770,30 +680,30 @@ const EvaluationQueues = ({ defaultExpanded = true }) => {
|
|
770 |
) : (
|
771 |
<>
|
772 |
<QueueAccordion
|
773 |
-
title=
|
774 |
models={models.pending}
|
775 |
status="pending"
|
776 |
-
emptyMessage=
|
777 |
expanded={expandedQueues.has("pending")}
|
778 |
onChange={handleQueueAccordionChange("pending")}
|
779 |
loading={loading}
|
780 |
/>
|
781 |
|
782 |
<QueueAccordion
|
783 |
-
title=
|
784 |
models={models.evaluating}
|
785 |
status="evaluating"
|
786 |
-
emptyMessage=
|
787 |
expanded={expandedQueues.has("evaluating")}
|
788 |
onChange={handleQueueAccordionChange("evaluating")}
|
789 |
loading={loading}
|
790 |
/>
|
791 |
|
792 |
<QueueAccordion
|
793 |
-
title=
|
794 |
models={models.finished}
|
795 |
status="finished"
|
796 |
-
emptyMessage=
|
797 |
expanded={expandedQueues.has("finished")}
|
798 |
onChange={handleQueueAccordionChange("finished")}
|
799 |
loading={loading}
|
|
|
25 |
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
|
26 |
import OpenInNewIcon from "@mui/icons-material/OpenInNew";
|
27 |
import { useVirtualizer } from "@tanstack/react-virtual";
|
|
|
28 |
|
29 |
// Function to format wait time
|
30 |
const formatWaitTime = (waitTimeStr) => {
|
31 |
const seconds = parseFloat(waitTimeStr.replace("s", ""));
|
32 |
|
33 |
if (seconds < 60) {
|
34 |
+
return "just now";
|
|
|
|
|
|
|
35 |
}
|
36 |
|
37 |
const minutes = Math.floor(seconds / 60);
|
38 |
if (minutes < 60) {
|
39 |
+
return `${minutes}m ago`;
|
|
|
|
|
|
|
40 |
}
|
41 |
|
42 |
const hours = Math.floor(minutes / 60);
|
43 |
if (hours < 24) {
|
44 |
+
return `${hours}h ago`;
|
|
|
|
|
|
|
45 |
}
|
46 |
|
47 |
const days = Math.floor(hours / 24);
|
48 |
+
return `${days}d ago`;
|
|
|
|
|
|
|
49 |
};
|
50 |
|
51 |
// Column definitions with their properties
|
52 |
const columns = [
|
53 |
{
|
54 |
id: "model",
|
55 |
+
label: "Model",
|
|
|
|
|
|
|
56 |
width: "35%",
|
57 |
align: "left",
|
58 |
},
|
59 |
{
|
60 |
id: "submitter",
|
61 |
+
label: "Submitted by",
|
|
|
|
|
|
|
62 |
width: "15%",
|
63 |
align: "left",
|
64 |
},
|
65 |
{
|
66 |
id: "wait_time",
|
67 |
+
label: "Submitted",
|
|
|
|
|
|
|
68 |
width: "12%",
|
69 |
align: "center",
|
70 |
},
|
71 |
{
|
72 |
id: "precision",
|
73 |
+
label: "Precision",
|
|
|
|
|
|
|
74 |
width: "13%",
|
75 |
align: "center",
|
76 |
},
|
77 |
{
|
78 |
id: "revision",
|
79 |
+
label: "Revision",
|
|
|
|
|
|
|
80 |
width: "12%",
|
81 |
align: "center",
|
82 |
},
|
83 |
{
|
84 |
id: "status",
|
85 |
+
label: "Status",
|
|
|
|
|
|
|
86 |
width: "13%",
|
87 |
align: "center",
|
88 |
},
|
89 |
];
|
90 |
|
91 |
+
const StatusChip = ({ status }) => {
|
92 |
+
const statusConfig = {
|
93 |
+
finished: {
|
94 |
+
icon: <CheckCircleIcon />,
|
95 |
+
label: "Completed",
|
96 |
+
color: "success",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
},
|
98 |
+
evaluating: {
|
99 |
+
icon: <AutorenewIcon />,
|
100 |
+
label: "Evaluating",
|
101 |
+
color: "warning",
|
102 |
},
|
103 |
+
pending: { icon: <PendingIcon />, label: "Pending", color: "info" },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
};
|
105 |
|
106 |
const config = statusConfig[status] || statusConfig.pending;
|
|
|
181 |
padding: "12px 16px",
|
182 |
}}
|
183 |
>
|
184 |
+
{column.label}
|
185 |
</TableCell>
|
186 |
))}
|
187 |
</TableRow>
|
|
|
235 |
alignItems: "center",
|
236 |
}}
|
237 |
>
|
238 |
+
<Link
|
239 |
+
href={`https://huggingface.co/${model.name}`}
|
240 |
+
target="_blank"
|
241 |
+
rel="noopener noreferrer"
|
242 |
+
sx={{
|
243 |
+
textDecoration: "none",
|
244 |
+
overflow: "hidden",
|
245 |
+
textOverflow: "ellipsis",
|
246 |
+
whiteSpace: "nowrap",
|
247 |
+
display: "flex",
|
248 |
+
alignItems: "center",
|
249 |
+
gap: 0.5,
|
250 |
+
"& .MuiSvgIcon-root": {
|
251 |
+
fontSize: "1rem",
|
252 |
+
opacity: 0.6,
|
253 |
+
},
|
254 |
+
}}
|
255 |
+
>
|
256 |
{model.name}
|
257 |
+
<OpenInNewIcon />
|
258 |
+
</Link>
|
259 |
</TableCell>
|
260 |
<TableCell
|
261 |
component="div"
|
|
|
298 |
}}
|
299 |
>
|
300 |
<AccessTimeIcon sx={{ fontSize: "0.9rem" }} />
|
301 |
+
{waitTime}
|
302 |
</Typography>
|
303 |
</Tooltip>
|
304 |
</TableCell>
|
|
|
360 |
);
|
361 |
};
|
362 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
363 |
const QueueAccordion = ({
|
364 |
title,
|
365 |
models,
|
|
|
463 |
});
|
464 |
const [loading, setLoading] = useState(true);
|
465 |
const [error, setError] = useState(null);
|
|
|
466 |
|
467 |
useEffect(() => {
|
468 |
const fetchModels = async () => {
|
|
|
596 |
}}
|
597 |
>
|
598 |
<Chip
|
599 |
+
label={`${models.pending.length} In Queue`}
|
600 |
size="small"
|
601 |
color="info"
|
602 |
variant="outlined"
|
|
|
615 |
}}
|
616 |
/>
|
617 |
<Chip
|
618 |
+
label={`${models.evaluating.length} Evaluating`}
|
619 |
size="small"
|
620 |
color="warning"
|
621 |
variant="outlined"
|
|
|
634 |
}}
|
635 |
/>
|
636 |
<Chip
|
637 |
+
label={`${models.finished.length} Evaluated`}
|
638 |
size="small"
|
639 |
color="success"
|
640 |
variant="outlined"
|
|
|
680 |
) : (
|
681 |
<>
|
682 |
<QueueAccordion
|
683 |
+
title="Models in queue"
|
684 |
models={models.pending}
|
685 |
status="pending"
|
686 |
+
emptyMessage="No models in queue"
|
687 |
expanded={expandedQueues.has("pending")}
|
688 |
onChange={handleQueueAccordionChange("pending")}
|
689 |
loading={loading}
|
690 |
/>
|
691 |
|
692 |
<QueueAccordion
|
693 |
+
title="Models being evaluated"
|
694 |
models={models.evaluating}
|
695 |
status="evaluating"
|
696 |
+
emptyMessage="No models currently being evaluated"
|
697 |
expanded={expandedQueues.has("evaluating")}
|
698 |
onChange={handleQueueAccordionChange("evaluating")}
|
699 |
loading={loading}
|
700 |
/>
|
701 |
|
702 |
<QueueAccordion
|
703 |
+
title="Recently evaluated models"
|
704 |
models={models.finished}
|
705 |
status="finished"
|
706 |
+
emptyMessage="No models have been evaluated recently"
|
707 |
expanded={expandedQueues.has("finished")}
|
708 |
onChange={handleQueueAccordionChange("finished")}
|
709 |
loading={loading}
|
frontend/src/pages/AddModelPage/components/ModelSubmissionForm/ModelSubmissionForm.jsx
CHANGED
@@ -24,7 +24,6 @@ import InfoIconWithTooltip from "../../../../components/shared/InfoIconWithToolt
|
|
24 |
import { MODEL_TYPES } from "../../../LeaderboardPage/components/Leaderboard/constants/modelTypes";
|
25 |
import { SUBMISSION_PRECISIONS } from "../../../LeaderboardPage/components/Leaderboard/constants/defaults";
|
26 |
import AuthContainer from "../../../../components/shared/AuthContainer";
|
27 |
-
import { useResolveLocalizedString } from "i18n";
|
28 |
|
29 |
const WEIGHT_TYPES = [
|
30 |
{ value: "Original", label: "Original" },
|
@@ -122,127 +121,6 @@ const HELP_TEXTS = {
|
|
122 |
),
|
123 |
};
|
124 |
|
125 |
-
const INTERNATIONALISATION = {
|
126 |
-
SUBMITTED: {
|
127 |
-
"en": "Model submitted successfully !",
|
128 |
-
"fr": "Modèle soumis avec succes !"
|
129 |
-
},
|
130 |
-
SUBMITTED_MESSAGE: {
|
131 |
-
T1: {
|
132 |
-
"en": "Your model",
|
133 |
-
"fr": "Votre modèle"
|
134 |
-
},
|
135 |
-
T2: {
|
136 |
-
"en": "has been added to the evaluation queue with the following parameters: ",
|
137 |
-
"fr": "a été ajoute à la queue d'évaluation avec les paramètres suivants: "
|
138 |
-
}
|
139 |
-
},
|
140 |
-
PARAMETERS: {
|
141 |
-
MODEL: {
|
142 |
-
"en": "Model:",
|
143 |
-
"fr": "Modèle:"
|
144 |
-
},
|
145 |
-
REVISION: {
|
146 |
-
"en": "Revision:",
|
147 |
-
"fr": "Révision:"
|
148 |
-
},
|
149 |
-
PRECISION: {
|
150 |
-
"en": "Precision:",
|
151 |
-
"fr": "Précision:"
|
152 |
-
},
|
153 |
-
WEIGHTS: {
|
154 |
-
"en": "Weight type:",
|
155 |
-
"fr": "Pondération:"
|
156 |
-
},
|
157 |
-
BASE: {
|
158 |
-
"en": "Base model:",
|
159 |
-
"fr": "Modèle de base:"
|
160 |
-
},
|
161 |
-
TEMPLATE: {
|
162 |
-
"en": "Chat template:",
|
163 |
-
"fr": "Template de chat:"
|
164 |
-
},
|
165 |
-
UPVOTE: {
|
166 |
-
"en": "An automatic upvote has been added to your model to help with prioritization.",
|
167 |
-
"fr": "Un upvote automatique a ete rajoute a votre modèle pour aider a la priorization."
|
168 |
-
},
|
169 |
-
OTHER: {
|
170 |
-
"en": "Submit another model",
|
171 |
-
"fr": "Soumettre un autre modèle"
|
172 |
-
}
|
173 |
-
},
|
174 |
-
FORM: {
|
175 |
-
TITLE: {
|
176 |
-
"en": "Model Submission Form",
|
177 |
-
"fr": "Formulaire pour soumettre un modèle"
|
178 |
-
},
|
179 |
-
MODEL_INFO: {
|
180 |
-
TITLE: {
|
181 |
-
"en": "Model Information",
|
182 |
-
"fr": "Informations sur le modèle"
|
183 |
-
},
|
184 |
-
NAME: {
|
185 |
-
LABEL: {
|
186 |
-
"en": "Model Name",
|
187 |
-
"fr": "Nom du modèle"
|
188 |
-
},
|
189 |
-
PLACEHOLDER: {
|
190 |
-
"en": "organization/model-name",
|
191 |
-
"fr": "organisation/nom-de-modele"
|
192 |
-
}
|
193 |
-
},
|
194 |
-
REVISION: {
|
195 |
-
LABEL: {
|
196 |
-
"en": "Revision commit",
|
197 |
-
"fr": "Commit de la révision"
|
198 |
-
},
|
199 |
-
HELPER_TEXT: {
|
200 |
-
"en": "Default: main",
|
201 |
-
"fr": "Defaut: main"
|
202 |
-
}
|
203 |
-
}
|
204 |
-
},
|
205 |
-
MODEL_CONFIG: {
|
206 |
-
TITLE: {
|
207 |
-
"en": "Model Configuration",
|
208 |
-
"fr": "Configuration du modèle"
|
209 |
-
},
|
210 |
-
TYPE: {
|
211 |
-
LABEL: {
|
212 |
-
"en": "Model Type",
|
213 |
-
"fr": "Type de modèle"
|
214 |
-
},
|
215 |
-
},
|
216 |
-
TEMPLATE: {
|
217 |
-
LABEL: {
|
218 |
-
"en": "Use chat template",
|
219 |
-
"fr": "Utiliser un template de chat"
|
220 |
-
}
|
221 |
-
},
|
222 |
-
PRECISION: {
|
223 |
-
LABEL: {
|
224 |
-
"en": "Precision",
|
225 |
-
"fr": "Précision"
|
226 |
-
}
|
227 |
-
},
|
228 |
-
WEIGHTS: {
|
229 |
-
LABEL: {
|
230 |
-
"en": "Weights Type",
|
231 |
-
"fr": "Pondération"
|
232 |
-
}
|
233 |
-
}
|
234 |
-
},
|
235 |
-
REQUIRED: {
|
236 |
-
"en": "All fields marked with * are required",
|
237 |
-
"fr": "Tous les champs marques par une * sont requis"
|
238 |
-
},
|
239 |
-
BUTTON: {
|
240 |
-
"en": "Submit",
|
241 |
-
"fr": "Soumettre"
|
242 |
-
}
|
243 |
-
}
|
244 |
-
}
|
245 |
-
|
246 |
// Convert MODEL_TYPES to format expected by Select component
|
247 |
const modelTypeOptions = Object.entries(MODEL_TYPES).map(
|
248 |
([value, { icon, label }]) => ({
|
@@ -275,8 +153,6 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
275 |
}));
|
276 |
};
|
277 |
|
278 |
-
const {resolveLocalizedString} = useResolveLocalizedString();
|
279 |
-
|
280 |
const handleSubmit = async (e) => {
|
281 |
e.preventDefault();
|
282 |
setError(null);
|
@@ -332,12 +208,13 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
332 |
variant="h5"
|
333 |
sx={{ fontWeight: 600, color: "success.800" }}
|
334 |
>
|
335 |
-
|
336 |
</Typography>
|
337 |
</Stack>
|
338 |
|
339 |
<Typography variant="body1">
|
340 |
-
|
|
|
341 |
</Typography>
|
342 |
|
343 |
<Paper
|
@@ -354,7 +231,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
354 |
color="text.secondary"
|
355 |
sx={{ width: 120 }}
|
356 |
>
|
357 |
-
|
358 |
</Typography>
|
359 |
<Typography variant="body2" sx={{ fontFamily: "monospace" }}>
|
360 |
{submittedData.modelName}
|
@@ -378,7 +255,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
378 |
color="text.secondary"
|
379 |
sx={{ width: 120 }}
|
380 |
>
|
381 |
-
|
382 |
</Typography>
|
383 |
<Typography variant="body2" sx={{ fontFamily: "monospace" }}>
|
384 |
{submittedData.revision}
|
@@ -390,7 +267,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
390 |
color="text.secondary"
|
391 |
sx={{ width: 120 }}
|
392 |
>
|
393 |
-
|
394 |
</Typography>
|
395 |
<Typography variant="body2">
|
396 |
{submittedData.precision}
|
@@ -402,7 +279,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
402 |
color="text.secondary"
|
403 |
sx={{ width: 120 }}
|
404 |
>
|
405 |
-
|
406 |
</Typography>
|
407 |
<Typography variant="body2">
|
408 |
{submittedData.weightsType}
|
@@ -415,7 +292,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
415 |
color="text.secondary"
|
416 |
sx={{ width: 120 }}
|
417 |
>
|
418 |
-
|
419 |
</Typography>
|
420 |
<Typography variant="body2">
|
421 |
{submittedData.baseModel}
|
@@ -428,7 +305,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
428 |
color="text.secondary"
|
429 |
sx={{ width: 120 }}
|
430 |
>
|
431 |
-
|
432 |
</Typography>
|
433 |
<Typography variant="body2">
|
434 |
{submittedData.useChatTemplate ? "Yes" : "No"}
|
@@ -437,10 +314,10 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
437 |
</Stack>
|
438 |
</Paper>
|
439 |
|
440 |
-
{/* TODO: UNCOMMENT WHEN VOTES ARE BACK
|
441 |
<Typography variant="body2" color="text.secondary">
|
442 |
-
|
443 |
-
|
|
|
444 |
|
445 |
<Stack direction="row" spacing={2}>
|
446 |
<Button
|
@@ -461,7 +338,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
461 |
});
|
462 |
}}
|
463 |
>
|
464 |
-
|
465 |
</Button>
|
466 |
</Stack>
|
467 |
</Stack>
|
@@ -510,7 +387,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
510 |
variant="h6"
|
511 |
sx={{ fontWeight: 600, color: "text.primary" }}
|
512 |
>
|
513 |
-
|
514 |
</Typography>
|
515 |
</Box>
|
516 |
|
@@ -520,7 +397,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
520 |
{/* Model Information */}
|
521 |
<Grid item xs={12}>
|
522 |
<Stack direction="row" spacing={1} alignItems="center">
|
523 |
-
<Typography variant="h6">
|
524 |
<InfoIconWithTooltip tooltip={HELP_TEXTS.modelName} />
|
525 |
</Stack>
|
526 |
</Grid>
|
@@ -530,8 +407,8 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
530 |
required
|
531 |
fullWidth
|
532 |
name="modelName"
|
533 |
-
label=
|
534 |
-
placeholder=
|
535 |
value={formData.modelName}
|
536 |
onChange={handleChange}
|
537 |
helperText="Example: meta-llama/Llama-3.2-1B"
|
@@ -547,10 +424,10 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
547 |
<TextField
|
548 |
fullWidth
|
549 |
name="revision"
|
550 |
-
label=
|
551 |
value={formData.revision}
|
552 |
onChange={handleChange}
|
553 |
-
helperText=
|
554 |
InputProps={{
|
555 |
endAdornment: (
|
556 |
<InfoIconWithTooltip tooltip={HELP_TEXTS.revision} />
|
@@ -562,18 +439,18 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
562 |
{/* Model Configuration */}
|
563 |
<Grid item xs={12}>
|
564 |
<Stack direction="row" spacing={1} alignItems="center">
|
565 |
-
<Typography variant="h6">
|
566 |
</Stack>
|
567 |
</Grid>
|
568 |
|
569 |
<Grid item xs={12} sm={6}>
|
570 |
<FormControl fullWidth>
|
571 |
-
<InputLabel>
|
572 |
<Select
|
573 |
name="modelType"
|
574 |
value={formData.modelType}
|
575 |
onChange={handleChange}
|
576 |
-
label=
|
577 |
endAdornment={
|
578 |
<InfoIconWithTooltip
|
579 |
tooltip={HELP_TEXTS.modelType}
|
@@ -605,7 +482,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
605 |
onChange={handleChange}
|
606 |
/>
|
607 |
}
|
608 |
-
label=
|
609 |
/>
|
610 |
<InfoIconWithTooltip tooltip={HELP_TEXTS.chatTemplate} />
|
611 |
</Stack>
|
@@ -613,12 +490,12 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
613 |
|
614 |
<Grid item xs={12} sm={6}>
|
615 |
<FormControl fullWidth>
|
616 |
-
<InputLabel>
|
617 |
<Select
|
618 |
name="precision"
|
619 |
value={formData.precision}
|
620 |
onChange={handleChange}
|
621 |
-
label=
|
622 |
endAdornment={
|
623 |
<InfoIconWithTooltip
|
624 |
tooltip={HELP_TEXTS.precision}
|
@@ -637,12 +514,12 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
637 |
|
638 |
<Grid item xs={12} sm={6}>
|
639 |
<FormControl fullWidth>
|
640 |
-
<InputLabel>
|
641 |
<Select
|
642 |
name="weightsType"
|
643 |
value={formData.weightsType}
|
644 |
onChange={handleChange}
|
645 |
-
label=
|
646 |
endAdornment={
|
647 |
<InfoIconWithTooltip
|
648 |
tooltip={HELP_TEXTS.weightsType}
|
@@ -691,7 +568,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
691 |
}}
|
692 |
>
|
693 |
<Typography variant="body2" color="text.secondary">
|
694 |
-
|
695 |
</Typography>
|
696 |
<Button
|
697 |
type="submit"
|
@@ -706,7 +583,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
|
|
706 |
{submitting ? (
|
707 |
<CircularProgress size={24} color="inherit" />
|
708 |
) : (
|
709 |
-
|
710 |
)}
|
711 |
</Button>
|
712 |
</Box>
|
|
|
24 |
import { MODEL_TYPES } from "../../../LeaderboardPage/components/Leaderboard/constants/modelTypes";
|
25 |
import { SUBMISSION_PRECISIONS } from "../../../LeaderboardPage/components/Leaderboard/constants/defaults";
|
26 |
import AuthContainer from "../../../../components/shared/AuthContainer";
|
|
|
27 |
|
28 |
const WEIGHT_TYPES = [
|
29 |
{ value: "Original", label: "Original" },
|
|
|
121 |
),
|
122 |
};
|
123 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
// Convert MODEL_TYPES to format expected by Select component
|
125 |
const modelTypeOptions = Object.entries(MODEL_TYPES).map(
|
126 |
([value, { icon, label }]) => ({
|
|
|
153 |
}));
|
154 |
};
|
155 |
|
|
|
|
|
156 |
const handleSubmit = async (e) => {
|
157 |
e.preventDefault();
|
158 |
setError(null);
|
|
|
208 |
variant="h5"
|
209 |
sx={{ fontWeight: 600, color: "success.800" }}
|
210 |
>
|
211 |
+
Model submitted successfully!
|
212 |
</Typography>
|
213 |
</Stack>
|
214 |
|
215 |
<Typography variant="body1">
|
216 |
+
Your model <strong>{submittedData.modelName}</strong> has been added
|
217 |
+
to the evaluation queue with the following parameters:
|
218 |
</Typography>
|
219 |
|
220 |
<Paper
|
|
|
231 |
color="text.secondary"
|
232 |
sx={{ width: 120 }}
|
233 |
>
|
234 |
+
Model:
|
235 |
</Typography>
|
236 |
<Typography variant="body2" sx={{ fontFamily: "monospace" }}>
|
237 |
{submittedData.modelName}
|
|
|
255 |
color="text.secondary"
|
256 |
sx={{ width: 120 }}
|
257 |
>
|
258 |
+
Revision:
|
259 |
</Typography>
|
260 |
<Typography variant="body2" sx={{ fontFamily: "monospace" }}>
|
261 |
{submittedData.revision}
|
|
|
267 |
color="text.secondary"
|
268 |
sx={{ width: 120 }}
|
269 |
>
|
270 |
+
Precision:
|
271 |
</Typography>
|
272 |
<Typography variant="body2">
|
273 |
{submittedData.precision}
|
|
|
279 |
color="text.secondary"
|
280 |
sx={{ width: 120 }}
|
281 |
>
|
282 |
+
Weight type:
|
283 |
</Typography>
|
284 |
<Typography variant="body2">
|
285 |
{submittedData.weightsType}
|
|
|
292 |
color="text.secondary"
|
293 |
sx={{ width: 120 }}
|
294 |
>
|
295 |
+
Base model:
|
296 |
</Typography>
|
297 |
<Typography variant="body2">
|
298 |
{submittedData.baseModel}
|
|
|
305 |
color="text.secondary"
|
306 |
sx={{ width: 120 }}
|
307 |
>
|
308 |
+
Chat template:
|
309 |
</Typography>
|
310 |
<Typography variant="body2">
|
311 |
{submittedData.useChatTemplate ? "Yes" : "No"}
|
|
|
314 |
</Stack>
|
315 |
</Paper>
|
316 |
|
|
|
317 |
<Typography variant="body2" color="text.secondary">
|
318 |
+
An automatic upvote has been added to your model to help with
|
319 |
+
prioritization.
|
320 |
+
</Typography>
|
321 |
|
322 |
<Stack direction="row" spacing={2}>
|
323 |
<Button
|
|
|
338 |
});
|
339 |
}}
|
340 |
>
|
341 |
+
Submit another model
|
342 |
</Button>
|
343 |
</Stack>
|
344 |
</Stack>
|
|
|
387 |
variant="h6"
|
388 |
sx={{ fontWeight: 600, color: "text.primary" }}
|
389 |
>
|
390 |
+
Model Submission Form
|
391 |
</Typography>
|
392 |
</Box>
|
393 |
|
|
|
397 |
{/* Model Information */}
|
398 |
<Grid item xs={12}>
|
399 |
<Stack direction="row" spacing={1} alignItems="center">
|
400 |
+
<Typography variant="h6">Model Information</Typography>
|
401 |
<InfoIconWithTooltip tooltip={HELP_TEXTS.modelName} />
|
402 |
</Stack>
|
403 |
</Grid>
|
|
|
407 |
required
|
408 |
fullWidth
|
409 |
name="modelName"
|
410 |
+
label="Model Name"
|
411 |
+
placeholder="organization/model-name"
|
412 |
value={formData.modelName}
|
413 |
onChange={handleChange}
|
414 |
helperText="Example: meta-llama/Llama-3.2-1B"
|
|
|
424 |
<TextField
|
425 |
fullWidth
|
426 |
name="revision"
|
427 |
+
label="Revision commit"
|
428 |
value={formData.revision}
|
429 |
onChange={handleChange}
|
430 |
+
helperText="Default: main"
|
431 |
InputProps={{
|
432 |
endAdornment: (
|
433 |
<InfoIconWithTooltip tooltip={HELP_TEXTS.revision} />
|
|
|
439 |
{/* Model Configuration */}
|
440 |
<Grid item xs={12}>
|
441 |
<Stack direction="row" spacing={1} alignItems="center">
|
442 |
+
<Typography variant="h6">Model Configuration</Typography>
|
443 |
</Stack>
|
444 |
</Grid>
|
445 |
|
446 |
<Grid item xs={12} sm={6}>
|
447 |
<FormControl fullWidth>
|
448 |
+
<InputLabel>Model Type</InputLabel>
|
449 |
<Select
|
450 |
name="modelType"
|
451 |
value={formData.modelType}
|
452 |
onChange={handleChange}
|
453 |
+
label="Model Type"
|
454 |
endAdornment={
|
455 |
<InfoIconWithTooltip
|
456 |
tooltip={HELP_TEXTS.modelType}
|
|
|
482 |
onChange={handleChange}
|
483 |
/>
|
484 |
}
|
485 |
+
label="Use Chat Template"
|
486 |
/>
|
487 |
<InfoIconWithTooltip tooltip={HELP_TEXTS.chatTemplate} />
|
488 |
</Stack>
|
|
|
490 |
|
491 |
<Grid item xs={12} sm={6}>
|
492 |
<FormControl fullWidth>
|
493 |
+
<InputLabel>Precision</InputLabel>
|
494 |
<Select
|
495 |
name="precision"
|
496 |
value={formData.precision}
|
497 |
onChange={handleChange}
|
498 |
+
label="Precision"
|
499 |
endAdornment={
|
500 |
<InfoIconWithTooltip
|
501 |
tooltip={HELP_TEXTS.precision}
|
|
|
514 |
|
515 |
<Grid item xs={12} sm={6}>
|
516 |
<FormControl fullWidth>
|
517 |
+
<InputLabel>Weights Type</InputLabel>
|
518 |
<Select
|
519 |
name="weightsType"
|
520 |
value={formData.weightsType}
|
521 |
onChange={handleChange}
|
522 |
+
label="Weights Type"
|
523 |
endAdornment={
|
524 |
<InfoIconWithTooltip
|
525 |
tooltip={HELP_TEXTS.weightsType}
|
|
|
568 |
}}
|
569 |
>
|
570 |
<Typography variant="body2" color="text.secondary">
|
571 |
+
All fields marked with * are required
|
572 |
</Typography>
|
573 |
<Button
|
574 |
type="submit"
|
|
|
583 |
{submitting ? (
|
584 |
<CircularProgress size={24} color="inherit" />
|
585 |
) : (
|
586 |
+
"Submit"
|
587 |
)}
|
588 |
</Button>
|
589 |
</Box>
|
frontend/src/pages/AddModelPage/components/SubmissionGuide/SubmissionGuide.jsx
CHANGED
@@ -2,7 +2,6 @@ import React, { useState, useEffect } from "react";
|
|
2 |
import { useLocation, useNavigate } from "react-router-dom";
|
3 |
import { Box, Paper, Typography, Button, Stack, Collapse } from "@mui/material";
|
4 |
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
|
5 |
-
import { useResolveLocalizedString } from "i18n";
|
6 |
|
7 |
const DocLink = ({ href, children }) => (
|
8 |
<Button
|
@@ -16,7 +15,6 @@ const DocLink = ({ href, children }) => (
|
|
16 |
color: "primary.main",
|
17 |
fontSize: "0.875rem",
|
18 |
p: 0,
|
19 |
-
width: "fit-content",
|
20 |
minWidth: "auto",
|
21 |
justifyContent: "flex-start",
|
22 |
"&:hover": {
|
@@ -52,166 +50,109 @@ const StepNumber = ({ number }) => (
|
|
52 |
</Box>
|
53 |
);
|
54 |
|
55 |
-
const
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
"
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
},
|
159 |
-
STRONG2: {
|
160 |
-
"en": "dataset information",
|
161 |
-
"fr": "information sur le jeux de donnees"
|
162 |
-
},
|
163 |
-
T2: {
|
164 |
-
"en": "intended use, limitations, and",
|
165 |
-
"fr": "usage prévu, limites, et"
|
166 |
-
},
|
167 |
-
STRONG3: {
|
168 |
-
"en": "performance metrics",
|
169 |
-
"fr": "métriques de performance"
|
170 |
-
},
|
171 |
-
DOCLINK: {
|
172 |
-
"en": "Model cards guide",
|
173 |
-
"fr": "Guide sur les cartes de modèles"
|
174 |
-
}
|
175 |
-
},
|
176 |
-
STEP5: {
|
177 |
-
TITLE: {
|
178 |
-
"en": "Final Checklist",
|
179 |
-
"fr": "Checklist finale"
|
180 |
-
},
|
181 |
-
T1: {
|
182 |
-
"en": "Ensure your model is ",
|
183 |
-
"fr": "Vérifiez que votre modèle est "
|
184 |
-
},
|
185 |
-
T2: {
|
186 |
-
"en": "uses ",
|
187 |
-
"fr": "utilise le format "
|
188 |
-
},
|
189 |
-
T3: {
|
190 |
-
"en": "format, has a ",
|
191 |
-
"fr": "a une"
|
192 |
-
},
|
193 |
-
STRONG1: {
|
194 |
-
"en": "license tag",
|
195 |
-
"fr": "balise de licence"
|
196 |
-
},
|
197 |
-
T4: {
|
198 |
-
"en": "and ",
|
199 |
-
"fr": "et "
|
200 |
-
},
|
201 |
-
STRONG2: {
|
202 |
-
"en": "loads correctly",
|
203 |
-
"fr": "chargé correctement"
|
204 |
-
},
|
205 |
-
T5: {
|
206 |
-
"en": "with the provided code",
|
207 |
-
"fr": "avec le code fourni"
|
208 |
-
},
|
209 |
-
DOCLINK: {
|
210 |
-
"en": "Sharing best practices",
|
211 |
-
"fr": "Bonnes pratiques de partage"
|
212 |
-
}
|
213 |
-
}
|
214 |
-
}
|
215 |
|
216 |
function SubmissionGuide() {
|
217 |
const location = useLocation();
|
@@ -220,7 +161,6 @@ function SubmissionGuide() {
|
|
220 |
// Initialize state directly with URL value
|
221 |
const initialExpanded = !new URLSearchParams(location.search).get("guide");
|
222 |
const [expanded, setExpanded] = useState(initialExpanded);
|
223 |
-
const {resolveLocalizedString} = useResolveLocalizedString();
|
224 |
|
225 |
// Sync expanded state with URL changes after initial render
|
226 |
useEffect(() => {
|
@@ -242,108 +182,6 @@ function SubmissionGuide() {
|
|
242 |
navigate({ search: params.toString() }, { replace: true });
|
243 |
};
|
244 |
|
245 |
-
const TUTORIAL_STEPS = [
|
246 |
-
{
|
247 |
-
title: resolveLocalizedString(LOCALIZED_STEPS.STEP1.TITLE),
|
248 |
-
content: (
|
249 |
-
<Stack spacing={2}>
|
250 |
-
<Typography variant="body2" color="text.secondary">
|
251 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP1.T1)} <strong>public</strong> {resolveLocalizedString(LOCALIZED_STEPS.STEP1.T2)} {" "}
|
252 |
-
<strong>username/model-id</strong> {resolveLocalizedString(LOCALIZED_STEPS.STEP1.T3)} <strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP1.STRONG1)}</strong>{" "}
|
253 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP1.T4)} <strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP1.STRONG2)}</strong>.
|
254 |
-
</Typography>
|
255 |
-
<DocLink href="https://huggingface.co/docs/hub/models-uploading">
|
256 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP1.DOCLINK)}
|
257 |
-
</DocLink>
|
258 |
-
</Stack>
|
259 |
-
),
|
260 |
-
},
|
261 |
-
{
|
262 |
-
title: "Technical Details",
|
263 |
-
content: (
|
264 |
-
<Stack spacing={2}>
|
265 |
-
<Typography variant="body2" color="text.secondary">
|
266 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP2.T1)} <strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP2.STRONG1)}</strong> {resolveLocalizedString(LOCALIZED_STEPS.STEP2.T2)}
|
267 |
-
</Typography>
|
268 |
-
<Box
|
269 |
-
sx={{
|
270 |
-
p: 2,
|
271 |
-
bgcolor: (theme) =>
|
272 |
-
theme.palette.mode === "dark" ? "grey.50" : "grey.900",
|
273 |
-
borderRadius: 1,
|
274 |
-
"& pre": {
|
275 |
-
m: 0,
|
276 |
-
p: 0,
|
277 |
-
fontFamily: "monospace",
|
278 |
-
fontSize: "0.875rem",
|
279 |
-
color: (theme) =>
|
280 |
-
theme.palette.mode === "dark" ? "grey.900" : "grey.50",
|
281 |
-
},
|
282 |
-
}}
|
283 |
-
>
|
284 |
-
<pre>
|
285 |
-
{`from transformers import AutoConfig, AutoModel, AutoTokenizer
|
286 |
-
|
287 |
-
config = AutoConfig.from_pretrained("your-username/your-model", revision="main")
|
288 |
-
model = AutoModel.from_pretrained("your-username/your-model", revision="main")
|
289 |
-
tokenizer = AutoTokenizer.from_pretrained("your-username/your-model", revision="main")`}
|
290 |
-
</pre>
|
291 |
-
</Box>
|
292 |
-
<DocLink href="https://huggingface.co/docs/transformers/installation">
|
293 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP2.DOCLINK)}
|
294 |
-
</DocLink>
|
295 |
-
</Stack>
|
296 |
-
),
|
297 |
-
},
|
298 |
-
{
|
299 |
-
title: resolveLocalizedString(LOCALIZED_STEPS.STEP3.TITLE),
|
300 |
-
content: (
|
301 |
-
<Stack spacing={2}>
|
302 |
-
<Typography variant="body2" color="text.secondary">
|
303 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP3.T1)}<strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP3.STRONG1)}</strong> {resolveLocalizedString(LOCALIZED_STEPS.STEP3.T2)}{" "}
|
304 |
-
<strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP3.STRONG2)}</strong> {resolveLocalizedString(LOCALIZED_STEPS.STEP3.T3)}
|
305 |
-
</Typography>
|
306 |
-
<DocLink href="https://huggingface.co/docs/hub/repositories-licenses">
|
307 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP3.DOCLINK)}
|
308 |
-
</DocLink>
|
309 |
-
</Stack>
|
310 |
-
),
|
311 |
-
},
|
312 |
-
{
|
313 |
-
title: resolveLocalizedString(LOCALIZED_STEPS.STEP4.TITLE),
|
314 |
-
content: (
|
315 |
-
<Stack spacing={2}>
|
316 |
-
<Typography variant="body2" color="text.secondary">
|
317 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP4.T1)}<strong>architecture</strong>,{" "}
|
318 |
-
<strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP4.STRONG1)}</strong>,{" "}
|
319 |
-
<strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP4.STRONG2)}</strong>, {resolveLocalizedString(LOCALIZED_STEPS.STEP4.T2)}{" "}
|
320 |
-
<strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP4.STRONG3)}</strong>.
|
321 |
-
</Typography>
|
322 |
-
<DocLink href="https://huggingface.co/docs/hub/model-cards">
|
323 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP4.DOCLINK)}
|
324 |
-
</DocLink>
|
325 |
-
</Stack>
|
326 |
-
),
|
327 |
-
},
|
328 |
-
{
|
329 |
-
title: resolveLocalizedString(LOCALIZED_STEPS.STEP5.TITLE),
|
330 |
-
content: (
|
331 |
-
<Stack spacing={2}>
|
332 |
-
<Typography variant="body2" color="text.secondary">
|
333 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP5.T1)}<strong>public</strong>, {resolveLocalizedString(LOCALIZED_STEPS.STEP5.T2)}{" "}
|
334 |
-
<strong>safetensors</strong> {resolveLocalizedString(LOCALIZED_STEPS.STEP5.T3)}{" "}
|
335 |
-
<strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP5.STRONG1)}</strong>, {resolveLocalizedString(LOCALIZED_STEPS.STEP5.T4)} <strong>{resolveLocalizedString(LOCALIZED_STEPS.STEP5.STRONG2)}</strong>{" "}
|
336 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP5.T5)}.
|
337 |
-
</Typography>
|
338 |
-
<DocLink href="https://huggingface.co/docs/hub/repositories-getting-started">
|
339 |
-
{resolveLocalizedString(LOCALIZED_STEPS.STEP5.DOCLINK)}
|
340 |
-
</DocLink>
|
341 |
-
</Stack>
|
342 |
-
),
|
343 |
-
},
|
344 |
-
];
|
345 |
-
|
346 |
-
|
347 |
return (
|
348 |
<Paper
|
349 |
elevation={0}
|
@@ -379,7 +217,7 @@ function SubmissionGuide() {
|
|
379 |
variant="h6"
|
380 |
sx={{ fontWeight: 600, color: "text.primary" }}
|
381 |
>
|
382 |
-
|
383 |
</Typography>
|
384 |
<ExpandMoreIcon
|
385 |
sx={{
|
|
|
2 |
import { useLocation, useNavigate } from "react-router-dom";
|
3 |
import { Box, Paper, Typography, Button, Stack, Collapse } from "@mui/material";
|
4 |
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
|
|
|
5 |
|
6 |
const DocLink = ({ href, children }) => (
|
7 |
<Button
|
|
|
15 |
color: "primary.main",
|
16 |
fontSize: "0.875rem",
|
17 |
p: 0,
|
|
|
18 |
minWidth: "auto",
|
19 |
justifyContent: "flex-start",
|
20 |
"&:hover": {
|
|
|
50 |
</Box>
|
51 |
);
|
52 |
|
53 |
+
const TUTORIAL_STEPS = [
|
54 |
+
{
|
55 |
+
title: "Model Information",
|
56 |
+
content: (
|
57 |
+
<Stack spacing={2}>
|
58 |
+
<Typography variant="body2" color="text.secondary">
|
59 |
+
Your model should be <strong>public</strong> on the Hub and follow the{" "}
|
60 |
+
<strong>username/model-id</strong> format (e.g.
|
61 |
+
mistralai/Mistral-7B-v0.1). Specify the <strong>revision</strong>{" "}
|
62 |
+
(commit hash or branch) and <strong>model type</strong>.
|
63 |
+
</Typography>
|
64 |
+
<DocLink href="https://huggingface.co/docs/hub/models-uploading">
|
65 |
+
Model uploading guide
|
66 |
+
</DocLink>
|
67 |
+
</Stack>
|
68 |
+
),
|
69 |
+
},
|
70 |
+
{
|
71 |
+
title: "Technical Details",
|
72 |
+
content: (
|
73 |
+
<Stack spacing={2}>
|
74 |
+
<Typography variant="body2" color="text.secondary">
|
75 |
+
Make sure your model can be <strong>loaded locally</strong> before
|
76 |
+
submitting:
|
77 |
+
</Typography>
|
78 |
+
<Box
|
79 |
+
sx={{
|
80 |
+
p: 2,
|
81 |
+
bgcolor: (theme) =>
|
82 |
+
theme.palette.mode === "dark" ? "grey.50" : "grey.900",
|
83 |
+
borderRadius: 1,
|
84 |
+
"& pre": {
|
85 |
+
m: 0,
|
86 |
+
p: 0,
|
87 |
+
fontFamily: "monospace",
|
88 |
+
fontSize: "0.875rem",
|
89 |
+
color: (theme) =>
|
90 |
+
theme.palette.mode === "dark" ? "grey.900" : "grey.50",
|
91 |
+
},
|
92 |
+
}}
|
93 |
+
>
|
94 |
+
<pre>
|
95 |
+
{`from transformers import AutoConfig, AutoModel, AutoTokenizer
|
96 |
+
|
97 |
+
config = AutoConfig.from_pretrained("your-username/your-model", revision="main")
|
98 |
+
model = AutoModel.from_pretrained("your-username/your-model", revision="main")
|
99 |
+
tokenizer = AutoTokenizer.from_pretrained("your-username/your-model", revision="main")`}
|
100 |
+
</pre>
|
101 |
+
</Box>
|
102 |
+
<DocLink href="https://huggingface.co/docs/transformers/installation">
|
103 |
+
Transformers documentation
|
104 |
+
</DocLink>
|
105 |
+
</Stack>
|
106 |
+
),
|
107 |
+
},
|
108 |
+
{
|
109 |
+
title: "License Requirements",
|
110 |
+
content: (
|
111 |
+
<Stack spacing={2}>
|
112 |
+
<Typography variant="body2" color="text.secondary">
|
113 |
+
A <strong>license tag</strong> is required.{" "}
|
114 |
+
<strong>Open licenses</strong> (Apache, MIT, etc) are strongly
|
115 |
+
recommended.
|
116 |
+
</Typography>
|
117 |
+
<DocLink href="https://huggingface.co/docs/hub/repositories-licenses">
|
118 |
+
About model licenses
|
119 |
+
</DocLink>
|
120 |
+
</Stack>
|
121 |
+
),
|
122 |
+
},
|
123 |
+
{
|
124 |
+
title: "Model Card Requirements",
|
125 |
+
content: (
|
126 |
+
<Stack spacing={2}>
|
127 |
+
<Typography variant="body2" color="text.secondary">
|
128 |
+
Your model card must include: <strong>architecture</strong>,{" "}
|
129 |
+
<strong>training details</strong>,{" "}
|
130 |
+
<strong>dataset information</strong>, intended use, limitations, and{" "}
|
131 |
+
<strong>performance metrics</strong>.
|
132 |
+
</Typography>
|
133 |
+
<DocLink href="https://huggingface.co/docs/hub/model-cards">
|
134 |
+
Model cards guide
|
135 |
+
</DocLink>
|
136 |
+
</Stack>
|
137 |
+
),
|
138 |
+
},
|
139 |
+
{
|
140 |
+
title: "Final Checklist",
|
141 |
+
content: (
|
142 |
+
<Stack spacing={2}>
|
143 |
+
<Typography variant="body2" color="text.secondary">
|
144 |
+
Ensure your model is <strong>public</strong>, uses{" "}
|
145 |
+
<strong>safetensors</strong> format, has a{" "}
|
146 |
+
<strong>license tag</strong>, and <strong>loads correctly</strong>{" "}
|
147 |
+
with the provided code.
|
148 |
+
</Typography>
|
149 |
+
<DocLink href="https://huggingface.co/docs/hub/repositories-getting-started">
|
150 |
+
Sharing best practices
|
151 |
+
</DocLink>
|
152 |
+
</Stack>
|
153 |
+
),
|
154 |
+
},
|
155 |
+
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
156 |
|
157 |
function SubmissionGuide() {
|
158 |
const location = useLocation();
|
|
|
161 |
// Initialize state directly with URL value
|
162 |
const initialExpanded = !new URLSearchParams(location.search).get("guide");
|
163 |
const [expanded, setExpanded] = useState(initialExpanded);
|
|
|
164 |
|
165 |
// Sync expanded state with URL changes after initial render
|
166 |
useEffect(() => {
|
|
|
182 |
navigate({ search: params.toString() }, { replace: true });
|
183 |
};
|
184 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
185 |
return (
|
186 |
<Paper
|
187 |
elevation={0}
|
|
|
217 |
variant="h6"
|
218 |
sx={{ fontWeight: 600, color: "text.primary" }}
|
219 |
>
|
220 |
+
Submission Guide
|
221 |
</Typography>
|
222 |
<ExpandMoreIcon
|
223 |
sx={{
|
frontend/src/pages/LeaderboardPage/{LeaderboardPage.tsx → LeaderboardPage.jsx}
RENAMED
@@ -2,9 +2,9 @@ import { useEffect } from "react";
|
|
2 |
import Leaderboard from "./components/Leaderboard/Leaderboard";
|
3 |
import { Box } from "@mui/material";
|
4 |
import PageHeader from "../../components/shared/PageHeader";
|
|
|
5 |
import { useLeaderboardData } from "./components/Leaderboard/hooks/useLeaderboardData";
|
6 |
import { useLeaderboard } from "./components/Leaderboard/context/LeaderboardContext";
|
7 |
-
import { declareComponentKeys } from "i18nifty";
|
8 |
|
9 |
function LeaderboardPage() {
|
10 |
const { data, isLoading, error } = useLeaderboardData();
|
@@ -34,7 +34,6 @@ function LeaderboardPage() {
|
|
34 |
</Box> */}
|
35 |
<PageHeader
|
36 |
title="Leaderboard"
|
37 |
-
subtitle={""}
|
38 |
// subtitle={
|
39 |
// <>
|
40 |
// Comparer les grands modèles de langages {" "}
|
@@ -48,11 +47,4 @@ function LeaderboardPage() {
|
|
48 |
);
|
49 |
}
|
50 |
|
51 |
-
const { i18n } = declareComponentKeys<
|
52 |
-
| { K: "greating"; P: { who: string; } }
|
53 |
-
| "how are you"
|
54 |
-
| { K: "learn more"; P: { href: string; }; R: JSX.Element }
|
55 |
-
>()({ LeaderboardPage });
|
56 |
-
export type I18n = typeof i18n;
|
57 |
-
|
58 |
export default LeaderboardPage;
|
|
|
2 |
import Leaderboard from "./components/Leaderboard/Leaderboard";
|
3 |
import { Box } from "@mui/material";
|
4 |
import PageHeader from "../../components/shared/PageHeader";
|
5 |
+
import Logo from "../../components/Logo/Logo";
|
6 |
import { useLeaderboardData } from "./components/Leaderboard/hooks/useLeaderboardData";
|
7 |
import { useLeaderboard } from "./components/Leaderboard/context/LeaderboardContext";
|
|
|
8 |
|
9 |
function LeaderboardPage() {
|
10 |
const { data, isLoading, error } = useLeaderboardData();
|
|
|
34 |
</Box> */}
|
35 |
<PageHeader
|
36 |
title="Leaderboard"
|
|
|
37 |
// subtitle={
|
38 |
// <>
|
39 |
// Comparer les grands modèles de langages {" "}
|
|
|
47 |
);
|
48 |
}
|
49 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
export default LeaderboardPage;
|
frontend/src/pages/LeaderboardPage/components/Leaderboard/Leaderboard.jsx
CHANGED
@@ -395,7 +395,7 @@ const Leaderboard = () => {
|
|
395 |
alignItems: "center",
|
396 |
}}
|
397 |
>
|
398 |
-
|
399 |
sx={{
|
400 |
width: {
|
401 |
xs: "100%",
|
@@ -421,7 +421,7 @@ const Leaderboard = () => {
|
|
421 |
/>
|
422 |
)}
|
423 |
</Box>
|
424 |
-
</Box>
|
425 |
|
426 |
<Box
|
427 |
sx={{
|
|
|
395 |
alignItems: "center",
|
396 |
}}
|
397 |
>
|
398 |
+
<Box
|
399 |
sx={{
|
400 |
width: {
|
401 |
xs: "100%",
|
|
|
421 |
/>
|
422 |
)}
|
423 |
</Box>
|
424 |
+
</Box>
|
425 |
|
426 |
<Box
|
427 |
sx={{
|
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/SearchBar.jsx
CHANGED
@@ -185,7 +185,7 @@ const SearchBar = ({
|
|
185 |
<InputBase
|
186 |
value={localValue}
|
187 |
onChange={handleLocalChange}
|
188 |
-
placeholder='
|
189 |
sx={{
|
190 |
flex: 1,
|
191 |
fontSize: "1rem",
|
@@ -286,7 +286,7 @@ const SearchBar = ({
|
|
286 |
display: { xs: "none", md: "block" },
|
287 |
}}
|
288 |
>
|
289 |
-
|
290 |
</Typography>
|
291 |
</Box>
|
292 |
<InfoIconWithTooltip
|
@@ -316,7 +316,8 @@ const SearchBar = ({
|
|
316 |
lineHeight: 1.5,
|
317 |
}}
|
318 |
>
|
319 |
-
|
|
|
320 |
</Typography>
|
321 |
</Box>
|
322 |
)}
|
|
|
185 |
<InputBase
|
186 |
value={localValue}
|
187 |
onChange={handleLocalChange}
|
188 |
+
placeholder='Search by model name • try "meta @architecture:llama @license:mit"'
|
189 |
sx={{
|
190 |
flex: 1,
|
191 |
fontSize: "1rem",
|
|
|
286 |
display: { xs: "none", md: "block" },
|
287 |
}}
|
288 |
>
|
289 |
+
Advanced Filters
|
290 |
</Typography>
|
291 |
</Box>
|
292 |
<InfoIconWithTooltip
|
|
|
316 |
lineHeight: 1.5,
|
317 |
}}
|
318 |
>
|
319 |
+
Supports strict search and regex • Use semicolons for multiple
|
320 |
+
terms
|
321 |
</Typography>
|
322 |
</Box>
|
323 |
)}
|
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/Table.jsx
CHANGED
@@ -35,7 +35,7 @@ const NoResultsFound = () => (
|
|
35 |
justifyContent: "center",
|
36 |
py: 8,
|
37 |
textAlign: "center",
|
38 |
-
height: "
|
39 |
backgroundColor: "background.paper",
|
40 |
}}
|
41 |
>
|
@@ -483,7 +483,7 @@ const LeaderboardTable = ({
|
|
483 |
/>
|
484 |
<Paper
|
485 |
sx={{
|
486 |
-
height: "
|
487 |
minHeight: "500px",
|
488 |
resize: "vertical",
|
489 |
overflow: "hidden",
|
@@ -554,7 +554,7 @@ const LeaderboardTable = ({
|
|
554 |
<Paper
|
555 |
elevation={0}
|
556 |
sx={{
|
557 |
-
height: "
|
558 |
minHeight: "500px",
|
559 |
resize: "vertical",
|
560 |
overflow: "hidden",
|
|
|
35 |
justifyContent: "center",
|
36 |
py: 8,
|
37 |
textAlign: "center",
|
38 |
+
height: "100%",
|
39 |
backgroundColor: "background.paper",
|
40 |
}}
|
41 |
>
|
|
|
483 |
/>
|
484 |
<Paper
|
485 |
sx={{
|
486 |
+
height: "calc(100vh - 380px)",
|
487 |
minHeight: "500px",
|
488 |
resize: "vertical",
|
489 |
overflow: "hidden",
|
|
|
554 |
<Paper
|
555 |
elevation={0}
|
556 |
sx={{
|
557 |
+
height: "calc(100vh - 380px)",
|
558 |
minHeight: "500px",
|
559 |
resize: "vertical",
|
560 |
overflow: "hidden",
|
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/hooks/useDataProcessing.js
CHANGED
@@ -13,23 +13,6 @@ import {
|
|
13 |
useFilteredData,
|
14 |
useColumnVisibility,
|
15 |
} from "../../../hooks/useDataUtils";
|
16 |
-
import { useResolveLocalizedString, useLang } from "i18n";
|
17 |
-
import header from "components/Header/Header";
|
18 |
-
|
19 |
-
const INT = {
|
20 |
-
RANK: {
|
21 |
-
"en": "Rank",
|
22 |
-
"fr": "Rang"
|
23 |
-
},
|
24 |
-
MODEL: {
|
25 |
-
"en": "Model",
|
26 |
-
"fr": "Modèle"
|
27 |
-
},
|
28 |
-
AVG: {
|
29 |
-
"en": "Average",
|
30 |
-
"fr": "Moyenne"
|
31 |
-
},
|
32 |
-
}
|
33 |
|
34 |
export const useDataProcessing = (
|
35 |
data,
|
@@ -53,8 +36,6 @@ export const useDataProcessing = (
|
|
53 |
const getColorForValue = useColorGenerator(minAverage, maxAverage);
|
54 |
const processedData = useProcessedData(data, averageMode, visibleColumns);
|
55 |
const columnVisibility = useColumnVisibility(visibleColumns);
|
56 |
-
const {resolveLocalizedString} = useResolveLocalizedString();
|
57 |
-
const {lang, setLang} = useLang();
|
58 |
|
59 |
// Memoize filters
|
60 |
const filterConfig = useMemo(
|
@@ -95,16 +76,8 @@ export const useDataProcessing = (
|
|
95 |
|
96 |
// Memoize columns creation
|
97 |
const columns = useMemo(
|
98 |
-
() =>
|
99 |
-
|
100 |
-
const headerNames = {
|
101 |
-
rank: resolveLocalizedString(INT.RANK),
|
102 |
-
model: resolveLocalizedString(INT.MODEL),
|
103 |
-
avg: resolveLocalizedString(INT.AVG),
|
104 |
-
}
|
105 |
-
|
106 |
-
return createColumns(
|
107 |
-
headerNames,
|
108 |
getColorForValue,
|
109 |
scoreDisplay,
|
110 |
columnVisibility,
|
@@ -112,9 +85,8 @@ export const useDataProcessing = (
|
|
112 |
averageMode,
|
113 |
searchValue,
|
114 |
rankingMode,
|
115 |
-
onTogglePin
|
116 |
-
)
|
117 |
-
},
|
118 |
[
|
119 |
getColorForValue,
|
120 |
scoreDisplay,
|
@@ -124,7 +96,6 @@ export const useDataProcessing = (
|
|
124 |
searchValue,
|
125 |
rankingMode,
|
126 |
onTogglePin,
|
127 |
-
lang
|
128 |
]
|
129 |
);
|
130 |
|
|
|
13 |
useFilteredData,
|
14 |
useColumnVisibility,
|
15 |
} from "../../../hooks/useDataUtils";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
export const useDataProcessing = (
|
18 |
data,
|
|
|
36 |
const getColorForValue = useColorGenerator(minAverage, maxAverage);
|
37 |
const processedData = useProcessedData(data, averageMode, visibleColumns);
|
38 |
const columnVisibility = useColumnVisibility(visibleColumns);
|
|
|
|
|
39 |
|
40 |
// Memoize filters
|
41 |
const filterConfig = useMemo(
|
|
|
76 |
|
77 |
// Memoize columns creation
|
78 |
const columns = useMemo(
|
79 |
+
() =>
|
80 |
+
createColumns(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
getColorForValue,
|
82 |
scoreDisplay,
|
83 |
columnVisibility,
|
|
|
85 |
averageMode,
|
86 |
searchValue,
|
87 |
rankingMode,
|
88 |
+
onTogglePin
|
89 |
+
),
|
|
|
90 |
[
|
91 |
getColorForValue,
|
92 |
scoreDisplay,
|
|
|
96 |
searchValue,
|
97 |
rankingMode,
|
98 |
onTogglePin,
|
|
|
99 |
]
|
100 |
);
|
101 |
|
frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/{defaults.tsx → defaults.js}
RENAMED
@@ -1,5 +1,4 @@
|
|
1 |
import { MODEL_TYPE_ORDER } from "./modelTypes";
|
2 |
-
import { LocalizedString, resolveLocalizedString } from "i18n";
|
3 |
|
4 |
// Time constants (in milliseconds)
|
5 |
const TIME = {
|
@@ -97,21 +96,6 @@ const COLUMN_SIZES = {
|
|
97 |
CHAT_TEMPLATE: 140,
|
98 |
};
|
99 |
|
100 |
-
const RANK : LocalizedString = {
|
101 |
-
"en": "Rank",
|
102 |
-
"fr": "Rang"
|
103 |
-
}
|
104 |
-
|
105 |
-
const MODEL : LocalizedString = {
|
106 |
-
"en": "Model",
|
107 |
-
"fr": "Modèle"
|
108 |
-
}
|
109 |
-
|
110 |
-
const SCORE : LocalizedString = {
|
111 |
-
"en": "Average Score",
|
112 |
-
"fr": "Score moyen"
|
113 |
-
}
|
114 |
-
|
115 |
// Column definitions with organized structure
|
116 |
const COLUMNS = {
|
117 |
FIXED: {
|
@@ -119,7 +103,7 @@ const COLUMNS = {
|
|
119 |
group: "fixed",
|
120 |
size: COLUMN_SIZES.RANK,
|
121 |
defaultVisible: true,
|
122 |
-
label:
|
123 |
},
|
124 |
"model.type_icon": {
|
125 |
group: "fixed",
|
@@ -131,13 +115,13 @@ const COLUMNS = {
|
|
131 |
group: "fixed",
|
132 |
size: COLUMN_SIZES.MODEL,
|
133 |
defaultVisible: true,
|
134 |
-
label:
|
135 |
},
|
136 |
"model.average_score": {
|
137 |
group: "fixed",
|
138 |
size: COLUMN_SIZES.AVERAGE_SCORE,
|
139 |
defaultVisible: true,
|
140 |
-
label:
|
141 |
},
|
142 |
},
|
143 |
EVALUATION: {
|
@@ -160,108 +144,108 @@ const COLUMNS = {
|
|
160 |
label: "BAC FR",
|
161 |
},
|
162 |
},
|
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 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
};
|
258 |
|
259 |
// Combine all columns for backward compatibility
|
260 |
const ALL_COLUMNS = {
|
261 |
...COLUMNS.FIXED,
|
262 |
...COLUMNS.EVALUATION,
|
263 |
-
|
264 |
-
|
265 |
};
|
266 |
|
267 |
// Column definitions for external use (maintaining the same interface)
|
@@ -269,8 +253,8 @@ const COLUMN_DEFINITIONS = {
|
|
269 |
ALL_COLUMNS,
|
270 |
COLUMN_GROUPS: {
|
271 |
"Evaluation Scores": Object.keys(COLUMNS.EVALUATION),
|
272 |
-
|
273 |
-
|
274 |
},
|
275 |
COLUMN_LABELS: Object.entries(ALL_COLUMNS).reduce((acc, [key, value]) => {
|
276 |
acc[key] = value.label;
|
|
|
1 |
import { MODEL_TYPE_ORDER } from "./modelTypes";
|
|
|
2 |
|
3 |
// Time constants (in milliseconds)
|
4 |
const TIME = {
|
|
|
96 |
CHAT_TEMPLATE: 140,
|
97 |
};
|
98 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
// Column definitions with organized structure
|
100 |
const COLUMNS = {
|
101 |
FIXED: {
|
|
|
103 |
group: "fixed",
|
104 |
size: COLUMN_SIZES.RANK,
|
105 |
defaultVisible: true,
|
106 |
+
label: "Rank",
|
107 |
},
|
108 |
"model.type_icon": {
|
109 |
group: "fixed",
|
|
|
115 |
group: "fixed",
|
116 |
size: COLUMN_SIZES.MODEL,
|
117 |
defaultVisible: true,
|
118 |
+
label: "Model",
|
119 |
},
|
120 |
"model.average_score": {
|
121 |
group: "fixed",
|
122 |
size: COLUMN_SIZES.AVERAGE_SCORE,
|
123 |
defaultVisible: true,
|
124 |
+
label: "Average Score",
|
125 |
},
|
126 |
},
|
127 |
EVALUATION: {
|
|
|
144 |
label: "BAC FR",
|
145 |
},
|
146 |
},
|
147 |
+
MODEL_INFO: {
|
148 |
+
"metadata.co2_cost": {
|
149 |
+
group: "model_info",
|
150 |
+
size: COLUMN_SIZES.CO2_COST,
|
151 |
+
defaultVisible: true,
|
152 |
+
label: "CO₂ Cost (kg)",
|
153 |
+
},
|
154 |
+
"metadata.hub_hearts": {
|
155 |
+
group: "model_info",
|
156 |
+
size: COLUMN_SIZES.HUB_HEARTS,
|
157 |
+
defaultVisible: false,
|
158 |
+
label: "Hub ❤️",
|
159 |
+
},
|
160 |
+
"model.architecture": {
|
161 |
+
group: "model_info",
|
162 |
+
size: COLUMN_SIZES.ARCHITECTURE,
|
163 |
+
defaultVisible: false,
|
164 |
+
label: "Architecture",
|
165 |
+
},
|
166 |
+
"model.precision": {
|
167 |
+
group: "model_info",
|
168 |
+
size: COLUMN_SIZES.PRECISION,
|
169 |
+
defaultVisible: false,
|
170 |
+
label: "Precision",
|
171 |
+
},
|
172 |
+
"metadata.params_billions": {
|
173 |
+
group: "model_info",
|
174 |
+
size: COLUMN_SIZES.PARAMS,
|
175 |
+
defaultVisible: false,
|
176 |
+
label: "Parameters (B)",
|
177 |
+
},
|
178 |
+
"metadata.hub_license": {
|
179 |
+
group: "model_info",
|
180 |
+
size: COLUMN_SIZES.LICENSE,
|
181 |
+
defaultVisible: false,
|
182 |
+
label: "License",
|
183 |
+
},
|
184 |
+
"model.has_chat_template": {
|
185 |
+
group: "model_info",
|
186 |
+
size: COLUMN_SIZES.CHAT_TEMPLATE,
|
187 |
+
defaultVisible: false,
|
188 |
+
label: "Chat Template",
|
189 |
+
},
|
190 |
+
},
|
191 |
+
ADDITIONAL_INFO: {
|
192 |
+
"metadata.upload_date": {
|
193 |
+
group: "additional_info",
|
194 |
+
size: COLUMN_SIZES.UPLOAD_DATE,
|
195 |
+
defaultVisible: false,
|
196 |
+
label: "Upload Date",
|
197 |
+
},
|
198 |
+
"metadata.submission_date": {
|
199 |
+
group: "additional_info",
|
200 |
+
size: COLUMN_SIZES.SUBMISSION_DATE,
|
201 |
+
defaultVisible: false,
|
202 |
+
label: "Submission Date",
|
203 |
+
},
|
204 |
+
"metadata.generation": {
|
205 |
+
group: "additional_info",
|
206 |
+
size: COLUMN_SIZES.GENERATION,
|
207 |
+
defaultVisible: false,
|
208 |
+
label: "Generation",
|
209 |
+
},
|
210 |
+
"metadata.base_model": {
|
211 |
+
group: "additional_info",
|
212 |
+
size: COLUMN_SIZES.BASE_MODEL,
|
213 |
+
defaultVisible: false,
|
214 |
+
label: "Base Model",
|
215 |
+
},
|
216 |
+
"features.is_not_available_on_hub": {
|
217 |
+
group: "additional_info",
|
218 |
+
size: COLUMN_SIZES.HUB_AVAILABILITY,
|
219 |
+
defaultVisible: false,
|
220 |
+
label: "Hub Availability",
|
221 |
+
},
|
222 |
+
"features.is_official_provider": {
|
223 |
+
group: "additional_info",
|
224 |
+
size: COLUMN_SIZES.OFFICIAL_PROVIDER,
|
225 |
+
defaultVisible: false,
|
226 |
+
label: "Only Official Providers",
|
227 |
+
},
|
228 |
+
"features.is_moe": {
|
229 |
+
group: "additional_info",
|
230 |
+
size: COLUMN_SIZES.MOE,
|
231 |
+
defaultVisible: false,
|
232 |
+
label: "Mixture of Experts",
|
233 |
+
},
|
234 |
+
"features.is_flagged": {
|
235 |
+
group: "additional_info",
|
236 |
+
size: COLUMN_SIZES.FLAG_STATUS,
|
237 |
+
defaultVisible: false,
|
238 |
+
label: "Flag Status",
|
239 |
+
},
|
240 |
+
},
|
241 |
};
|
242 |
|
243 |
// Combine all columns for backward compatibility
|
244 |
const ALL_COLUMNS = {
|
245 |
...COLUMNS.FIXED,
|
246 |
...COLUMNS.EVALUATION,
|
247 |
+
...COLUMNS.MODEL_INFO,
|
248 |
+
...COLUMNS.ADDITIONAL_INFO,
|
249 |
};
|
250 |
|
251 |
// Column definitions for external use (maintaining the same interface)
|
|
|
253 |
ALL_COLUMNS,
|
254 |
COLUMN_GROUPS: {
|
255 |
"Evaluation Scores": Object.keys(COLUMNS.EVALUATION),
|
256 |
+
"Model Information": Object.keys(COLUMNS.MODEL_INFO),
|
257 |
+
"Additional Information": Object.keys(COLUMNS.ADDITIONAL_INFO),
|
258 |
},
|
259 |
COLUMN_LABELS: Object.entries(ALL_COLUMNS).reduce((acc, [key, value]) => {
|
260 |
acc[key] = value.label;
|
frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/tooltips.jsx
CHANGED
@@ -70,15 +70,20 @@ export const COLUMN_TOOLTIPS = {
|
|
70 |
},
|
71 |
]),
|
72 |
|
73 |
-
BACFR: createTooltipContent("
|
74 |
{
|
75 |
label: "Scope",
|
76 |
-
description: "
|
|
|
|
|
|
|
|
|
|
|
77 |
},
|
78 |
{
|
79 |
label: "Scoring: Accuracy",
|
80 |
description:
|
81 |
-
"
|
82 |
},
|
83 |
]),
|
84 |
|
|
|
70 |
},
|
71 |
]),
|
72 |
|
73 |
+
BACFR: createTooltipContent("Multistep Soft Reasoning (MuSR):", [
|
74 |
{
|
75 |
label: "Scope",
|
76 |
+
description: "Reasoning and understanding on/of long texts",
|
77 |
+
subItems: [
|
78 |
+
"Language understanding",
|
79 |
+
"Reasoning capabilities",
|
80 |
+
"Long context reasoning",
|
81 |
+
],
|
82 |
},
|
83 |
{
|
84 |
label: "Scoring: Accuracy",
|
85 |
description:
|
86 |
+
"Was the correct choice selected among the options.",
|
87 |
},
|
88 |
]),
|
89 |
|
frontend/src/pages/LeaderboardPage/components/Leaderboard/utils/columnUtils.jsx
CHANGED
@@ -18,7 +18,6 @@ import {
|
|
18 |
import OpenInNewIcon from "@mui/icons-material/OpenInNew";
|
19 |
import { alpha } from "@mui/material/styles";
|
20 |
import InfoIconWithTooltip from "../../../../../components/shared/InfoIconWithTooltip";
|
21 |
-
import { useResolveLocalizedString } from "i18n";
|
22 |
|
23 |
const DatabaseIcon = () => (
|
24 |
<svg
|
@@ -280,48 +279,45 @@ const getDetailsUrl = (modelName) => {
|
|
280 |
return `https://huggingface.co/datasets/open-llm-leaderboard/${formattedName}-details`;
|
281 |
};
|
282 |
|
283 |
-
const HeaderLabel = ({ label, tooltip, className, isSorted }) =>
|
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 |
-
</Typography>
|
323 |
-
</Tooltip>);
|
324 |
-
};
|
325 |
|
326 |
const InfoIcon = ({ tooltip }) => (
|
327 |
<Box
|
@@ -370,7 +366,7 @@ const createHeaderCell = (label, tooltip) => (header) =>
|
|
370 |
);
|
371 |
|
372 |
const createModelHeader =
|
373 |
-
(
|
374 |
({ table }) => {
|
375 |
return (
|
376 |
<Box
|
@@ -397,7 +393,7 @@ const createModelHeader =
|
|
397 |
whiteSpace: "nowrap",
|
398 |
}}
|
399 |
>
|
400 |
-
|
401 |
</Typography>
|
402 |
</Box>
|
403 |
</Box>
|
@@ -445,7 +441,6 @@ const BooleanValue = ({ value }) => {
|
|
445 |
};
|
446 |
|
447 |
export const createColumns = (
|
448 |
-
headerNames,
|
449 |
getColorForValue,
|
450 |
scoreDisplay = "normalized",
|
451 |
columnVisibility = {},
|
@@ -454,14 +449,12 @@ export const createColumns = (
|
|
454 |
searchValue = "",
|
455 |
rankingMode = "static",
|
456 |
onTogglePin,
|
457 |
-
hasPinnedRows = false
|
458 |
) => {
|
459 |
// Ajuster les tailles des colonnes en fonction de la présence de lignes épinglées
|
460 |
const getColumnSize = (defaultSize) =>
|
461 |
hasPinnedRows ? "auto" : `${defaultSize}px`;
|
462 |
|
463 |
-
console.log(headerNames)
|
464 |
-
|
465 |
const baseColumns = [
|
466 |
{
|
467 |
accessorKey: "isPinned",
|
@@ -503,7 +496,7 @@ export const createColumns = (
|
|
503 |
},
|
504 |
{
|
505 |
accessorKey: "rank",
|
506 |
-
header:
|
507 |
cell: ({ row }) => {
|
508 |
const rank =
|
509 |
rankingMode === "static"
|
@@ -553,7 +546,7 @@ export const createColumns = (
|
|
553 |
},
|
554 |
{
|
555 |
accessorKey: "id",
|
556 |
-
header: createModelHeader(
|
557 |
cell: ({ row }) => {
|
558 |
const textSearch = extractTextSearch(searchValue);
|
559 |
const modelName = row.original.model.name;
|
@@ -607,6 +600,38 @@ export const createColumns = (
|
|
607 |
}}
|
608 |
>
|
609 |
<HighlightedText text={modelName} searchValue={textSearch} />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
610 |
</Link>
|
611 |
</Box>
|
612 |
</Box>
|
@@ -616,7 +641,7 @@ export const createColumns = (
|
|
616 |
},
|
617 |
{
|
618 |
accessorKey: "model.average_score",
|
619 |
-
header: createHeaderCell(
|
620 |
cell: ({ row, getValue }) =>
|
621 |
createScoreCell(getValue, row, "model.average_score"),
|
622 |
size: TABLE_DEFAULTS.COLUMNS.COLUMN_SIZES["model.average_score"],
|
|
|
18 |
import OpenInNewIcon from "@mui/icons-material/OpenInNew";
|
19 |
import { alpha } from "@mui/material/styles";
|
20 |
import InfoIconWithTooltip from "../../../../../components/shared/InfoIconWithTooltip";
|
|
|
21 |
|
22 |
const DatabaseIcon = () => (
|
23 |
<svg
|
|
|
279 |
return `https://huggingface.co/datasets/open-llm-leaderboard/${formattedName}-details`;
|
280 |
};
|
281 |
|
282 |
+
const HeaderLabel = ({ label, tooltip, className, isSorted }) => (
|
283 |
+
<Tooltip
|
284 |
+
title={label}
|
285 |
+
arrow
|
286 |
+
placement="top"
|
287 |
+
enterDelay={1000}
|
288 |
+
componentsProps={getTooltipStyle}
|
289 |
+
>
|
290 |
+
<Typography
|
291 |
+
className={className}
|
292 |
+
sx={{
|
293 |
+
fontWeight: 600,
|
294 |
+
color: isSorted ? "primary.main" : "grey.700",
|
295 |
+
flex: 1,
|
296 |
+
transition: "max-width 0.2s ease",
|
297 |
+
maxWidth: "100%",
|
298 |
+
...(label === "Rank" || label === "Type"
|
299 |
+
? {
|
300 |
+
overflow: "visible",
|
301 |
+
whiteSpace: "normal",
|
302 |
+
textOverflow: "clip",
|
303 |
+
textAlign: "center",
|
304 |
+
}
|
305 |
+
: {
|
306 |
+
overflow: "hidden",
|
307 |
+
textOverflow: "ellipsis",
|
308 |
+
whiteSpace: "nowrap",
|
309 |
+
}),
|
310 |
+
"@media (hover: hover)": {
|
311 |
+
".MuiTableCell-root:hover &": {
|
312 |
+
maxWidth: tooltip ? "calc(100% - 48px)" : "100%",
|
313 |
+
},
|
314 |
+
},
|
315 |
+
}}
|
316 |
+
>
|
317 |
+
{label}
|
318 |
+
</Typography>
|
319 |
+
</Tooltip>
|
320 |
+
);
|
|
|
|
|
|
|
321 |
|
322 |
const InfoIcon = ({ tooltip }) => (
|
323 |
<Box
|
|
|
366 |
);
|
367 |
|
368 |
const createModelHeader =
|
369 |
+
(totalModels, officialProvidersCount = 0, isOfficialProviderActive = false) =>
|
370 |
({ table }) => {
|
371 |
return (
|
372 |
<Box
|
|
|
393 |
whiteSpace: "nowrap",
|
394 |
}}
|
395 |
>
|
396 |
+
Model
|
397 |
</Typography>
|
398 |
</Box>
|
399 |
</Box>
|
|
|
441 |
};
|
442 |
|
443 |
export const createColumns = (
|
|
|
444 |
getColorForValue,
|
445 |
scoreDisplay = "normalized",
|
446 |
columnVisibility = {},
|
|
|
449 |
searchValue = "",
|
450 |
rankingMode = "static",
|
451 |
onTogglePin,
|
452 |
+
hasPinnedRows = false
|
453 |
) => {
|
454 |
// Ajuster les tailles des colonnes en fonction de la présence de lignes épinglées
|
455 |
const getColumnSize = (defaultSize) =>
|
456 |
hasPinnedRows ? "auto" : `${defaultSize}px`;
|
457 |
|
|
|
|
|
458 |
const baseColumns = [
|
459 |
{
|
460 |
accessorKey: "isPinned",
|
|
|
496 |
},
|
497 |
{
|
498 |
accessorKey: "rank",
|
499 |
+
header: createHeaderCell("Rank"),
|
500 |
cell: ({ row }) => {
|
501 |
const rank =
|
502 |
rankingMode === "static"
|
|
|
546 |
},
|
547 |
{
|
548 |
accessorKey: "id",
|
549 |
+
header: createModelHeader(totalModels),
|
550 |
cell: ({ row }) => {
|
551 |
const textSearch = extractTextSearch(searchValue);
|
552 |
const modelName = row.original.model.name;
|
|
|
600 |
}}
|
601 |
>
|
602 |
<HighlightedText text={modelName} searchValue={textSearch} />
|
603 |
+
<OpenInNewIcon
|
604 |
+
sx={{
|
605 |
+
fontSize: "0.75rem",
|
606 |
+
opacity: 0.6,
|
607 |
+
transition: "opacity 0.2s ease-in-out",
|
608 |
+
ml: 0.5,
|
609 |
+
flexShrink: 0,
|
610 |
+
}}
|
611 |
+
/>
|
612 |
+
</Link>
|
613 |
+
<Link
|
614 |
+
href={getDetailsUrl(modelName)}
|
615 |
+
target="_blank"
|
616 |
+
rel="noopener noreferrer"
|
617 |
+
aria-label={`View detailed evaluation results for ${modelName}`}
|
618 |
+
title={TABLE_TOOLTIPS.EVAL_RESULTS(modelName)}
|
619 |
+
sx={{
|
620 |
+
textDecoration: "none",
|
621 |
+
"&:hover": {
|
622 |
+
textDecoration: "underline",
|
623 |
+
"& svg": {
|
624 |
+
color: "text.primary",
|
625 |
+
},
|
626 |
+
},
|
627 |
+
display: "flex",
|
628 |
+
alignItems: "center",
|
629 |
+
color: "text.secondary",
|
630 |
+
flexShrink: 0,
|
631 |
+
mr: 0,
|
632 |
+
}}
|
633 |
+
>
|
634 |
+
<DatabaseIcon />
|
635 |
</Link>
|
636 |
</Box>
|
637 |
</Box>
|
|
|
641 |
},
|
642 |
{
|
643 |
accessorKey: "model.average_score",
|
644 |
+
header: createHeaderCell("Average", COLUMN_TOOLTIPS.AVERAGE),
|
645 |
cell: ({ row, getValue }) =>
|
646 |
createScoreCell(getValue, row, "model.average_score"),
|
647 |
size: TABLE_DEFAULTS.COLUMNS.COLUMN_SIZES["model.average_score"],
|
frontend/tsconfig.app.json
DELETED
@@ -1,30 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"compilerOptions": {
|
3 |
-
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
4 |
-
"target": "ES2020",
|
5 |
-
"useDefineForClassFields": true,
|
6 |
-
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
7 |
-
"module": "ESNext",
|
8 |
-
"skipLibCheck": true,
|
9 |
-
"baseUrl": "src",
|
10 |
-
|
11 |
-
/* Bundler mode */
|
12 |
-
"moduleResolution": "bundler",
|
13 |
-
"allowImportingTsExtensions": true,
|
14 |
-
"isolatedModules": true,
|
15 |
-
"moduleDetection": "force",
|
16 |
-
"noEmit": true,
|
17 |
-
"jsx": "react-jsx",
|
18 |
-
"allowJs": true,
|
19 |
-
|
20 |
-
/* Linting */
|
21 |
-
"strict": true,
|
22 |
-
"noImplicitAny": false,
|
23 |
-
"noUnusedLocals": true,
|
24 |
-
"noUnusedParameters": true,
|
25 |
-
"noFallthroughCasesInSwitch": true,
|
26 |
-
"noUncheckedSideEffectImports": true
|
27 |
-
},
|
28 |
-
"include": ["src"]
|
29 |
-
}
|
30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/tsconfig.json
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"files": [],
|
3 |
-
"references": [
|
4 |
-
{ "path": "./tsconfig.app.json" },
|
5 |
-
{ "path": "./tsconfig.node.json" }
|
6 |
-
]
|
7 |
-
}
|
8 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/tsconfig.node.json
DELETED
@@ -1,25 +0,0 @@
|
|
1 |
-
{
|
2 |
-
"compilerOptions": {
|
3 |
-
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
4 |
-
"target": "ES2022",
|
5 |
-
"lib": ["ES2023"],
|
6 |
-
"module": "ESNext",
|
7 |
-
"skipLibCheck": true,
|
8 |
-
|
9 |
-
/* Bundler mode */
|
10 |
-
"moduleResolution": "bundler",
|
11 |
-
"allowImportingTsExtensions": true,
|
12 |
-
"isolatedModules": true,
|
13 |
-
"moduleDetection": "force",
|
14 |
-
"noEmit": true,
|
15 |
-
|
16 |
-
/* Linting */
|
17 |
-
"strict": true,
|
18 |
-
"noUnusedLocals": true,
|
19 |
-
"noUnusedParameters": true,
|
20 |
-
"noFallthroughCasesInSwitch": true,
|
21 |
-
"noUncheckedSideEffectImports": true
|
22 |
-
},
|
23 |
-
"include": ["vite.config.ts"]
|
24 |
-
}
|
25 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/vite.config.js
CHANGED
@@ -1,13 +1,9 @@
|
|
1 |
import { defineConfig } from 'vite'
|
2 |
-
import tsconfigPaths from "vite-tsconfig-paths";
|
3 |
import react from '@vitejs/plugin-react'
|
4 |
|
5 |
// https://vite.dev/config/
|
6 |
export default defineConfig({
|
7 |
-
plugins: [
|
8 |
-
react(),
|
9 |
-
tsconfigPaths()
|
10 |
-
],
|
11 |
server: {
|
12 |
proxy: {
|
13 |
'/api': {
|
|
|
1 |
import { defineConfig } from 'vite'
|
|
|
2 |
import react from '@vitejs/plugin-react'
|
3 |
|
4 |
// https://vite.dev/config/
|
5 |
export default defineConfig({
|
6 |
+
plugins: [react()],
|
|
|
|
|
|
|
7 |
server: {
|
8 |
proxy: {
|
9 |
'/api': {
|