Files changed (44) hide show
  1. .github/workflows/cd.yml +0 -30
  2. .github/workflows/ci.yml +0 -20
  3. .github/workflows/prod.yml +0 -22
  4. Dockerfile +0 -3
  5. backend/Dockerfile.dev +0 -3
  6. backend/app/asgi.py +0 -19
  7. backend/app/config/base.py +1 -4
  8. backend/app/config/hf_config.py +5 -5
  9. backend/app/services/leaderboard.py +3 -20
  10. backend/app/services/models.py +2 -2
  11. backend/app/utils/model_validation.py +1 -2
  12. backend/pyproject.toml +0 -3
  13. frontend/eslint.config.js +0 -4
  14. frontend/package.json +1 -4
  15. frontend/public/favicon.ico +0 -0
  16. frontend/public/hf-logo-with-title.svg +8 -64
  17. frontend/src/App.jsx +58 -10
  18. frontend/src/components/Footer/Footer.jsx +30 -0
  19. frontend/src/components/Footer/Footer.tsx +0 -133
  20. frontend/src/components/Header/Header.tsx +0 -34
  21. frontend/src/components/LanguageSelect/LanguageSelect.jsx +0 -44
  22. frontend/src/components/Navigation/{Navigation.tsx → Navigation.jsx} +6 -23
  23. frontend/src/components/shared/{AuthContainer.tsx → AuthContainer.jsx} +6 -16
  24. frontend/src/config/auth.js +2 -2
  25. frontend/src/i18n.tsx +0 -88
  26. frontend/src/index.css +0 -21
  27. frontend/src/main.jsx +1 -9
  28. frontend/src/pages/AboutPage/AboutPage.tsx +0 -363
  29. frontend/src/pages/AddModelPage/{AddModelPage.tsx → AddModelPage.jsx} +3 -10
  30. frontend/src/pages/AddModelPage/components/EvaluationQueues/EvaluationQueues.jsx +52 -142
  31. frontend/src/pages/AddModelPage/components/ModelSubmissionForm/ModelSubmissionForm.jsx +29 -152
  32. frontend/src/pages/AddModelPage/components/SubmissionGuide/SubmissionGuide.jsx +104 -266
  33. frontend/src/pages/LeaderboardPage/{LeaderboardPage.tsx → LeaderboardPage.jsx} +1 -9
  34. frontend/src/pages/LeaderboardPage/components/Leaderboard/Leaderboard.jsx +2 -2
  35. frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/SearchBar.jsx +4 -3
  36. frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/Table.jsx +3 -3
  37. frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Table/hooks/useDataProcessing.js +4 -33
  38. frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/{defaults.tsx → defaults.js} +101 -117
  39. frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/tooltips.jsx +8 -3
  40. frontend/src/pages/LeaderboardPage/components/Leaderboard/utils/columnUtils.jsx +77 -52
  41. frontend/tsconfig.app.json +0 -30
  42. frontend/tsconfig.json +0 -8
  43. frontend/tsconfig.node.json +0 -25
  44. 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}/{os.environ.get("REQUESTS_REPO", "requests")}"
23
- AGGREGATED_REPO = f"{HF_ORGANIZATION}/{os.environ.get("CONTENTS_REPO", "contents")}"
24
- VOTES_REPO = f"{HF_ORGANIZATION}/{os.environ.get("VOTES_REPO", "votes")}"
25
- OFFICIAL_PROVIDERS_REPO = f"{HF_ORGANIZATION}/{os.environ.get("OFFICIAL_PROVIDERS_REPO", "official-providers")}"
26
- RESULTS_REPO = f"{HF_ORGANIZATION}/{os.environ.get("RESULTS_REPO", "results")}"
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": data.results.get("community|bac-fr|0", 0),
390
- "normalized_score": data.normalized_results.get("community|bac-fr|0", 0)
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 > 500:
472
- error_msg = f"Model too large for {model_data['precision']} (limit: 500B)"
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 as e:
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
- "i18nifty": "^3.2.3",
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 "./components/Header/Header";
16
- import { Badge } from "@codegouvfr/react-dsfr/Badge";
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="/about" element={<AboutPage />} />
112
- {/* <Route path="/quote" element={<QuotePage />} />
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: any, hash:any) => {
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:any, path:any) => (e:any) => {
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: t("submit"),
70
  },
71
  {
72
  isActive: active === 2,
73
  linkProps: {
74
- href: "/about",
75
  target: '_self',
76
- onClick: handleNavigation(2, "/about")
77
  },
78
- text: t("about"),
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
- {t("login")}
67
  </Typography>
68
  <Typography variant="body2" color="text.secondary" align="center">
69
- {t("need")}
 
70
  </Typography>
71
  <Button
72
  variant="contained"
@@ -90,7 +89,7 @@ function AuthContainer({ actionText = "DO_ACTION" }) {
90
  px: 2,
91
  }}
92
  >
93
- {t("button")}
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
- {t("loggedin", {user: (user !== null ? user!['username'] : "inconnu")})}
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
- {t("logout")}
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: "https://fr-gouv-coordination-ia-llm-leaderboard-fr.hf.space",
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={t("title")}
33
  subtitle={
34
  <>
35
- {t("subtitle")}
 
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 COMPLETED = {
123
- STATUS: {
124
- "en": "Evaluated",
125
- "fr": "Termine"
126
- },
127
- CHIP: {
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
- EMPTY_MESSAGE: {
170
- "en": "No models in queue",
171
- "fr": "Aucun modèle en attente"
 
172
  },
173
- TITLE: {
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
- {resolveLocalizedString(column.label)}
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
- {resolveLocalizedString(waitTime)}
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} ${resolveLocalizedString(PENDING.STATUS)}`}
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} ${resolveLocalizedString(EVALUATING.STATUS)}`}
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} ${resolveLocalizedString(COMPLETED.STATUS)}`}
728
  size="small"
729
  color="success"
730
  variant="outlined"
@@ -770,30 +680,30 @@ const EvaluationQueues = ({ defaultExpanded = true }) => {
770
  ) : (
771
  <>
772
  <QueueAccordion
773
- title={resolveLocalizedString(PENDING.TITLE)}
774
  models={models.pending}
775
  status="pending"
776
- emptyMessage={resolveLocalizedString(PENDING.EMPTY_MESSAGE)}
777
  expanded={expandedQueues.has("pending")}
778
  onChange={handleQueueAccordionChange("pending")}
779
  loading={loading}
780
  />
781
 
782
  <QueueAccordion
783
- title={resolveLocalizedString(EVALUATING.TITLE)}
784
  models={models.evaluating}
785
  status="evaluating"
786
- emptyMessage={resolveLocalizedString(EVALUATING.EMPTY_MESSAGE)}
787
  expanded={expandedQueues.has("evaluating")}
788
  onChange={handleQueueAccordionChange("evaluating")}
789
  loading={loading}
790
  />
791
 
792
  <QueueAccordion
793
- title={resolveLocalizedString(COMPLETED.TITLE)}
794
  models={models.finished}
795
  status="finished"
796
- emptyMessage={resolveLocalizedString(COMPLETED.EMPTY_MESSAGE)}
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
- {resolveLocalizedString(INTERNATIONALISATION.SUBMITTED)}
336
  </Typography>
337
  </Stack>
338
 
339
  <Typography variant="body1">
340
- {resolveLocalizedString(INTERNATIONALISATION.SUBMITTED_MESSAGE.T1)} <strong>{submittedData.modelName}</strong> {resolveLocalizedString(INTERNATIONALISATION.SUBMITTED_MESSAGE.T2)}
 
341
  </Typography>
342
 
343
  <Paper
@@ -354,7 +231,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
354
  color="text.secondary"
355
  sx={{ width: 120 }}
356
  >
357
- {resolveLocalizedString(INTERNATIONALISATION.PARAMETERS.MODEL)}
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
- {resolveLocalizedString(INTERNATIONALISATION.PARAMETERS.REVISION)}
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
- {resolveLocalizedString(INTERNATIONALISATION.PARAMETERS.PRECISION)}
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
- {resolveLocalizedString(INTERNATIONALISATION.PARAMETERS.WEIGHTS)}
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
- {resolveLocalizedString(INTERNATIONALISATION.PARAMETERS.BASE)}
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
- {resolveLocalizedString(INTERNATIONALISATION.PARAMETERS.TEMPLATE)}
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
- {resolveLocalizeString(INTERNATIONALISATION.PARAMETERS.UPVOTE)}
443
- </Typography> */}
 
444
 
445
  <Stack direction="row" spacing={2}>
446
  <Button
@@ -461,7 +338,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
461
  });
462
  }}
463
  >
464
- {resolveLocalizedString(INTERNATIONALISATION.PARAMETERS.OTHER)}
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
- {resolveLocalizedString(INTERNATIONALISATION.FORM.TITLE)}
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">{resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_INFO.TITLE)}</Typography>
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={resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_INFO.NAME.LABEL)}
534
- placeholder={resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_INFO.NAME.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={resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_INFO.REVISION.LABEL)}
551
  value={formData.revision}
552
  onChange={handleChange}
553
- helperText={resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_INFO.REVISION.HELPER_TEXT)}
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">{resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_CONFIG.TITLE)}</Typography>
566
  </Stack>
567
  </Grid>
568
 
569
  <Grid item xs={12} sm={6}>
570
  <FormControl fullWidth>
571
- <InputLabel>{resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_CONFIG.TYPE.LABEL)}</InputLabel>
572
  <Select
573
  name="modelType"
574
  value={formData.modelType}
575
  onChange={handleChange}
576
- label={resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_CONFIG.TYPE.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={resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_CONFIG.TEMPLATE.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>{resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_CONFIG.PRECISION.LABEL)}</InputLabel>
617
  <Select
618
  name="precision"
619
  value={formData.precision}
620
  onChange={handleChange}
621
- label={resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_CONFIG.PRECISION.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>{resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_CONFIG.WEIGHTS.LABEL)}</InputLabel>
641
  <Select
642
  name="weightsType"
643
  value={formData.weightsType}
644
  onChange={handleChange}
645
- label={resolveLocalizedString(INTERNATIONALISATION.FORM.MODEL_CONFIG.WEIGHTS.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
- {resolveLocalizedString(INTERNATIONALISATION.FORM.REQUIRED)}
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
- resolveLocalizedString(INTERNATIONALISATION.FORM.BUTTON)
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 TITLE = {
56
- "en": "Submission guide",
57
- "fr": "Guide de soumission"
58
- }
59
- const LOCALIZED_STEPS = {
60
- STEP1: {
61
- TITLE: {
62
- "en": "Model Information",
63
- "fr": "Informations sur le modèle"
64
- },
65
- T1: {
66
- "en": "Your model should be",
67
- "fr": "Votre modèle doit être"
68
- },
69
- T2: {
70
- "en": "on the Hub and follow the",
71
- "fr": "sur le Hub et suivre le format"
72
- },
73
- T3: {
74
- "en": "format (e.g. mistralai/Mistral-7B-v0.1). Specify the",
75
- "fr": "(e.g. mistralai/Mistral-7B-v0.1). Spécifiez la"
76
- },
77
- STRONG1: {
78
- "en": "revision",
79
- "fr": "révision"
80
- },
81
- T4: {
82
- "en": "(commit hash or branch) and",
83
- "fr": "(hash de commit ou branche) et le"
84
- },
85
- STRONG2: {
86
- "en": "model type",
87
- "fr": "type de modèle"
88
- },
89
- DOCLINK: {
90
- "en": "Model uploading guide",
91
- "fr": "Guide pour le téléversement du modèle"
92
- }
93
- },
94
- STEP2: {
95
- TITLE: {
96
- "en": "Technical Details",
97
- "fr": "Details Techniques"
98
- },
99
- T1: {
100
- "en": "Make sure tour model can be",
101
- "fr": "Assurez-vous que votre modèle puisse être"
102
- },
103
- STRONG1: {
104
- "en": "loaded locally",
105
- "fr": "chargé localement"
106
- },
107
- T2: {
108
- "en": "before submitting:",
109
- "fr": "avant de soumettre"
110
- },
111
- DOCLINK: {
112
- "en": "Transformers documentation",
113
- "fr": "Documentation Transformers"
114
- }
115
- },
116
- STEP3: {
117
- TITLE: {
118
- "en": "License Requirements",
119
- "fr": "Critères de Licence"
120
- },
121
- T1: {
122
- "en": "A ",
123
- "fr": "Une "
124
- },
125
- STRONG1: {
126
- "en": "license tag",
127
- "fr": "balise de licence"
128
- },
129
- T2: {
130
- "en": "is required.",
131
- "fr": "est requise."
132
- },
133
- STRONG2: {
134
- "en": "Open licenses",
135
- "fr": "Les licences ouvertes"
136
- },
137
- T3: {
138
- "en": "(Apache, MIT, etc) are strongly recommended.",
139
- "fr": "(Apache, MIT, etc) sont fortement recommandées."
140
- },
141
- DOCLINK: {
142
- "en": "About model licenses",
143
- "fr": "A propos des licences de modèles"
144
- }
145
- },
146
- STEP4: {
147
- TITLE: {
148
- "en": "Model Card Requirements",
149
- "fr": "Critères sur la carte du modèle"
150
- },
151
- T1: {
152
- "en": "Your model card must include: ",
153
- "fr": "La carte de votre modèle doit inclure: "
154
- },
155
- STRONG1: {
156
- "en": "training details",
157
- "fr": "détails d'entrainement"
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
- {resolveLocalizedString(TITLE)}
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
- {/* <Box
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='Recherce par nom de modèle essayez "meta @architecture:llama @license:mit"'
189
  sx={{
190
  flex: 1,
191
  fontSize: "1rem",
@@ -286,7 +286,7 @@ const SearchBar = ({
286
  display: { xs: "none", md: "block" },
287
  }}
288
  >
289
- Filtres avancés
290
  </Typography>
291
  </Box>
292
  <InfoIconWithTooltip
@@ -316,7 +316,8 @@ const SearchBar = ({
316
  lineHeight: 1.5,
317
  }}
318
  >
319
- Supporte la recherche stricte et les expressions régulières Utilisez des points virgules pour plusieurs termes
 
320
  </Typography>
321
  </Box>
322
  )}
 
185
  <InputBase
186
  value={localValue}
187
  onChange={handleLocalChange}
188
+ placeholder='Search by model nametry "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 regexUse 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: "500px",
39
  backgroundColor: "background.paper",
40
  }}
41
  >
@@ -483,7 +483,7 @@ const LeaderboardTable = ({
483
  />
484
  <Paper
485
  sx={{
486
- height: "500px",
487
  minHeight: "500px",
488
  resize: "vertical",
489
  overflow: "hidden",
@@ -554,7 +554,7 @@ const LeaderboardTable = ({
554
  <Paper
555
  elevation={0}
556
  sx={{
557
- height: "500px",
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: RANK,
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: MODEL,
135
  },
136
  "model.average_score": {
137
  group: "fixed",
138
  size: COLUMN_SIZES.AVERAGE_SCORE,
139
  defaultVisible: true,
140
- label: SCORE,
141
  },
142
  },
143
  EVALUATION: {
@@ -160,108 +144,108 @@ const COLUMNS = {
160
  label: "BAC FR",
161
  },
162
  },
163
- // MODEL_INFO: {
164
- // "metadata.co2_cost": {
165
- // group: "model_info",
166
- // size: COLUMN_SIZES.CO2_COST,
167
- // defaultVisible: true,
168
- // label: "CO₂ Cost (kg)",
169
- // },
170
- // "metadata.hub_hearts": {
171
- // group: "model_info",
172
- // size: COLUMN_SIZES.HUB_HEARTS,
173
- // defaultVisible: false,
174
- // label: "Hub ❤️",
175
- // },
176
- // "model.architecture": {
177
- // group: "model_info",
178
- // size: COLUMN_SIZES.ARCHITECTURE,
179
- // defaultVisible: false,
180
- // label: "Architecture",
181
- // },
182
- // "model.precision": {
183
- // group: "model_info",
184
- // size: COLUMN_SIZES.PRECISION,
185
- // defaultVisible: false,
186
- // label: "Precision",
187
- // },
188
- // "metadata.params_billions": {
189
- // group: "model_info",
190
- // size: COLUMN_SIZES.PARAMS,
191
- // defaultVisible: false,
192
- // label: "Parameters (B)",
193
- // },
194
- // "metadata.hub_license": {
195
- // group: "model_info",
196
- // size: COLUMN_SIZES.LICENSE,
197
- // defaultVisible: false,
198
- // label: "License",
199
- // },
200
- // "model.has_chat_template": {
201
- // group: "model_info",
202
- // size: COLUMN_SIZES.CHAT_TEMPLATE,
203
- // defaultVisible: false,
204
- // label: "Chat Template",
205
- // },
206
- // },
207
- // ADDITIONAL_INFO: {
208
- // "metadata.upload_date": {
209
- // group: "additional_info",
210
- // size: COLUMN_SIZES.UPLOAD_DATE,
211
- // defaultVisible: false,
212
- // label: "Upload Date",
213
- // },
214
- // "metadata.submission_date": {
215
- // group: "additional_info",
216
- // size: COLUMN_SIZES.SUBMISSION_DATE,
217
- // defaultVisible: false,
218
- // label: "Submission Date",
219
- // },
220
- // "metadata.generation": {
221
- // group: "additional_info",
222
- // size: COLUMN_SIZES.GENERATION,
223
- // defaultVisible: false,
224
- // label: "Generation",
225
- // },
226
- // "metadata.base_model": {
227
- // group: "additional_info",
228
- // size: COLUMN_SIZES.BASE_MODEL,
229
- // defaultVisible: false,
230
- // label: "Base Model",
231
- // },
232
- // "features.is_not_available_on_hub": {
233
- // group: "additional_info",
234
- // size: COLUMN_SIZES.HUB_AVAILABILITY,
235
- // defaultVisible: false,
236
- // label: "Hub Availability",
237
- // },
238
- // "features.is_official_provider": {
239
- // group: "additional_info",
240
- // size: COLUMN_SIZES.OFFICIAL_PROVIDER,
241
- // defaultVisible: false,
242
- // label: "Only Official Providers",
243
- // },
244
- // "features.is_moe": {
245
- // group: "additional_info",
246
- // size: COLUMN_SIZES.MOE,
247
- // defaultVisible: false,
248
- // label: "Mixture of Experts",
249
- // },
250
- // "features.is_flagged": {
251
- // group: "additional_info",
252
- // size: COLUMN_SIZES.FLAG_STATUS,
253
- // defaultVisible: false,
254
- // label: "Flag Status",
255
- // },
256
- // },
257
  };
258
 
259
  // Combine all columns for backward compatibility
260
  const ALL_COLUMNS = {
261
  ...COLUMNS.FIXED,
262
  ...COLUMNS.EVALUATION,
263
- // ...COLUMNS.MODEL_INFO,
264
- // ...COLUMNS.ADDITIONAL_INFO,
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
- // "Model Information": Object.keys(COLUMNS.MODEL_INFO),
273
- // "Additional Information": Object.keys(COLUMNS.ADDITIONAL_INFO),
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("French Baccalauréat (BAC FR):", [
74
  {
75
  label: "Scope",
76
- description: "more than 700 question from the baccalauréat exam (end of high school national French exam), including the followong subjects : maths, computer science and physics-chemestry. The extracted questions are multiple choice, code completation or exact solution answer (with a tolerence degree).",
 
 
 
 
 
77
  },
78
  {
79
  label: "Scoring: Accuracy",
80
  description:
81
- "(Prefix quasi-exact match) Was the solution generated correct and in the expected format.",
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
- const { resolveLocalisedString } = useResolveLocalizedString();
286
-
287
- return (<Tooltip
288
- title={label}
289
- arrow
290
- placement="top"
291
- enterDelay={1000}
292
- componentsProps={getTooltipStyle}
293
- >
294
- <Typography
295
- className={className}
296
- sx={{
297
- fontWeight: 600,
298
- color: isSorted ? "primary.main" : "grey.700",
299
- flex: 1,
300
- transition: "max-width 0.2s ease",
301
- maxWidth: "100%",
302
- ...(label === "Rank" || label === "Type"
303
- ? {
304
- overflow: "visible",
305
- whiteSpace: "normal",
306
- textOverflow: "clip",
307
- textAlign: "center",
308
- }
309
- : {
310
- overflow: "hidden",
311
- textOverflow: "ellipsis",
312
- whiteSpace: "nowrap",
313
- }),
314
- "@media (hover: hover)": {
315
- ".MuiTableCell-root:hover &": {
316
- maxWidth: tooltip ? "calc(100% - 48px)" : "100%",
317
- },
318
- },
319
- }}
320
- >
321
- {label}
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
- (localizedModelString, totalModels, officialProvidersCount = 0, isOfficialProviderActive = false) =>
374
  ({ table }) => {
375
  return (
376
  <Box
@@ -397,7 +393,7 @@ const createModelHeader =
397
  whiteSpace: "nowrap",
398
  }}
399
  >
400
- {localizedModelString}
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: headerNames ? createHeaderCell(headerNames.rank) : "",
507
  cell: ({ row }) => {
508
  const rank =
509
  rankingMode === "static"
@@ -553,7 +546,7 @@ export const createColumns = (
553
  },
554
  {
555
  accessorKey: "id",
556
- header: createModelHeader(headerNames.model, totalModels),
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(headerNames.avg, COLUMN_TOOLTIPS.AVERAGE),
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': {