docker-container-test

#1047
by alozowski HF staff - opened
Files changed (32) hide show
  1. Dockerfile +1 -0
  2. backend/README.md +2 -2
  3. backend/app/api/dependencies.py +1 -1
  4. backend/app/api/endpoints/leaderboard.py +1 -1
  5. backend/app/api/endpoints/models.py +1 -1
  6. backend/app/api/endpoints/votes.py +1 -1
  7. backend/app/asgi.py +2 -2
  8. backend/app/config/hf_config.py +5 -1
  9. backend/app/core/cache.py +4 -4
  10. backend/app/core/fastapi_cache.py +1 -1
  11. backend/app/core/formatting.py +0 -104
  12. backend/app/services/hf_service.py +1 -1
  13. backend/app/services/leaderboard.py +2 -2
  14. backend/app/services/models.py +3 -11
  15. backend/app/services/votes.py +3 -2
  16. backend/app/utils/logging.py +104 -2
  17. backend/app/utils/model_validation.py +9 -65
  18. backend/pyproject.toml +2 -2
  19. backend/utils/analyze_prod_datasets.py +1 -1
  20. backend/utils/fix_wrong_model_size.py +0 -110
  21. backend/utils/sync_datasets_locally.py +1 -1
  22. frontend/src/pages/AddModelPage/components/ModelSubmissionForm/ModelSubmissionForm.js +1 -1
  23. frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/FilteredModelCount.js +5 -5
  24. frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/Filters.js +6 -6
  25. frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/QuickFilters.js +1 -1
  26. frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/hooks/useOfficialProvidersMode.js +3 -3
  27. frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/defaults.js +3 -3
  28. frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/quickFilters.js +1 -1
  29. frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/tooltips.js +1 -1
  30. frontend/src/pages/LeaderboardPage/components/Leaderboard/context/LeaderboardContext.js +7 -7
  31. frontend/src/pages/LeaderboardPage/components/Leaderboard/hooks/useDataUtils.js +5 -5
  32. frontend/src/pages/LeaderboardPage/components/Leaderboard/utils/columnUtils.js +4 -4
Dockerfile CHANGED
@@ -49,6 +49,7 @@ WORKDIR /app
49
 
50
  # Environment variables
51
  ENV HF_HOME=/app/.cache \
 
52
  HF_DATASETS_CACHE=/app/.cache \
53
  INTERNAL_API_PORT=7861 \
54
  PORT=7860 \
 
49
 
50
  # Environment variables
51
  ENV HF_HOME=/app/.cache \
52
+ TRANSFORMERS_CACHE=/app/.cache \
53
  HF_DATASETS_CACHE=/app/.cache \
54
  INTERNAL_API_PORT=7861 \
55
  PORT=7860 \
backend/README.md CHANGED
@@ -70,7 +70,7 @@ The application uses several datasets on the HuggingFace Hub:
70
  - **Format**: Main dataset containing all scores and metrics
71
  - **Updates**: Automatic after model evaluations
72
 
73
- ### 4. Official Providers Dataset (`{HF_ORGANIZATION}/official-providers`)
74
 
75
  - **Operations**:
76
  - 📥 Read-only access for highlighted models
@@ -203,7 +203,7 @@ Swagger documentation available at http://localhost:7860/docs
203
  is_merged: boolean,
204
  is_moe: boolean,
205
  is_flagged: boolean,
206
- is_official_provider: boolean
207
  },
208
  metadata: {
209
  upload_date: string,
 
70
  - **Format**: Main dataset containing all scores and metrics
71
  - **Updates**: Automatic after model evaluations
72
 
73
+ ### 4. Maintainers Highlight Dataset (`{HF_ORGANIZATION}/maintainers-highlight`)
74
 
75
  - **Operations**:
76
  - 📥 Read-only access for highlighted models
 
203
  is_merged: boolean,
204
  is_moe: boolean,
205
  is_flagged: boolean,
206
+ is_highlighted_by_maintainer: boolean
207
  },
208
  metadata: {
209
  upload_date: string,
backend/app/api/dependencies.py CHANGED
@@ -2,7 +2,7 @@ from fastapi import Depends, HTTPException
2
  import logging
3
  from app.services.models import ModelService
4
  from app.services.votes import VoteService
5
- from app.core.formatting import LogFormatter
6
 
7
  logger = logging.getLogger(__name__)
8
 
 
2
  import logging
3
  from app.services.models import ModelService
4
  from app.services.votes import VoteService
5
+ from app.utils.logging import LogFormatter
6
 
7
  logger = logging.getLogger(__name__)
8
 
backend/app/api/endpoints/leaderboard.py CHANGED
@@ -3,7 +3,7 @@ from typing import List, Dict, Any
3
  from app.services.leaderboard import LeaderboardService
4
  from app.core.fastapi_cache import cached, build_cache_key
5
  import logging
6
- from app.core.formatting import LogFormatter
7
 
8
  logger = logging.getLogger(__name__)
9
  router = APIRouter()
 
3
  from app.services.leaderboard import LeaderboardService
4
  from app.core.fastapi_cache import cached, build_cache_key
5
  import logging
6
+ from app.utils.logging import LogFormatter
7
 
8
  logger = logging.getLogger(__name__)
9
  router = APIRouter()
backend/app/api/endpoints/models.py CHANGED
@@ -4,7 +4,7 @@ import logging
4
  from app.services.models import ModelService
5
  from app.api.dependencies import get_model_service
6
  from app.core.fastapi_cache import cached
7
- from app.core.formatting import LogFormatter
8
 
9
  logger = logging.getLogger(__name__)
10
  router = APIRouter(tags=["models"])
 
4
  from app.services.models import ModelService
5
  from app.api.dependencies import get_model_service
6
  from app.core.fastapi_cache import cached
7
+ from app.utils.logging import LogFormatter
8
 
9
  logger = logging.getLogger(__name__)
10
  router = APIRouter(tags=["models"])
backend/app/api/endpoints/votes.py CHANGED
@@ -3,7 +3,7 @@ from typing import Dict, Any, List
3
  from app.services.votes import VoteService
4
  from app.core.fastapi_cache import cached, build_cache_key, invalidate_cache_key
5
  import logging
6
- from app.core.formatting import LogFormatter
7
 
8
  logger = logging.getLogger(__name__)
9
  router = APIRouter()
 
3
  from app.services.votes import VoteService
4
  from app.core.fastapi_cache import cached, build_cache_key, invalidate_cache_key
5
  import logging
6
+ from app.utils.logging import LogFormatter
7
 
8
  logger = logging.getLogger(__name__)
9
  router = APIRouter()
backend/app/asgi.py CHANGED
@@ -12,7 +12,7 @@ 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
@@ -99,7 +99,7 @@ async def startup_event():
99
  logger.info(LogFormatter.info(f" - Queue: {hf_config.QUEUE_REPO}"))
100
  logger.info(LogFormatter.info(f" - Aggregated: {hf_config.AGGREGATED_REPO}"))
101
  logger.info(LogFormatter.info(f" - Votes: {hf_config.VOTES_REPO}"))
102
- logger.info(LogFormatter.info(f" - Official Providers: {hf_config.OFFICIAL_PROVIDERS_REPO}"))
103
 
104
  # Setup cache
105
  setup_cache()
 
12
 
13
  from app.api.router import router
14
  from app.core.fastapi_cache import setup_cache
15
+ from app.utils.logging import LogFormatter
16
  from app.config import hf_config
17
 
18
  # Configure logging before anything else
 
99
  logger.info(LogFormatter.info(f" - Queue: {hf_config.QUEUE_REPO}"))
100
  logger.info(LogFormatter.info(f" - Aggregated: {hf_config.AGGREGATED_REPO}"))
101
  logger.info(LogFormatter.info(f" - Votes: {hf_config.VOTES_REPO}"))
102
+ logger.info(LogFormatter.info(f" - Maintainers Highlight: {hf_config.MAINTAINERS_HIGHLIGHT_REPO}"))
103
 
104
  # Setup cache
105
  setup_cache()
backend/app/config/hf_config.py CHANGED
@@ -1,9 +1,13 @@
 
 
 
1
  import os
2
  import logging
3
  from typing import Optional
4
  from huggingface_hub import HfApi
5
  from pathlib import Path
6
  from app.core.cache import cache_config
 
7
 
8
  logger = logging.getLogger(__name__)
9
 
@@ -22,7 +26,7 @@ API = HfApi(token=HF_TOKEN)
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
 
27
  # File paths from cache config
28
  VOTES_PATH = cache_config.votes_file
 
1
+ """
2
+ Hugging Face configuration module
3
+ """
4
  import os
5
  import logging
6
  from typing import Optional
7
  from huggingface_hub import HfApi
8
  from pathlib import Path
9
  from app.core.cache import cache_config
10
+ from app.utils.logging import LogFormatter
11
 
12
  logger = logging.getLogger(__name__)
13
 
 
26
  QUEUE_REPO = f"{HF_ORGANIZATION}/requests"
27
  AGGREGATED_REPO = f"{HF_ORGANIZATION}/contents"
28
  VOTES_REPO = f"{HF_ORGANIZATION}/votes"
29
+ MAINTAINERS_HIGHLIGHT_REPO = f"{HF_ORGANIZATION}/maintainers-highlight"
30
 
31
  # File paths from cache config
32
  VOTES_PATH = cache_config.votes_file
backend/app/core/cache.py CHANGED
@@ -3,7 +3,7 @@ import shutil
3
  from pathlib import Path
4
  from datetime import timedelta
5
  import logging
6
- from app.core.formatting import LogFormatter
7
  from app.config.base import (
8
  CACHE_ROOT,
9
  DATASETS_CACHE,
@@ -58,16 +58,16 @@ class CacheConfig:
58
  def _setup_environment(self):
59
  """Configure HuggingFace environment variables"""
60
  logger.info(LogFormatter.subsection("ENVIRONMENT SETUP"))
61
-
62
  env_vars = {
63
  "HF_HOME": str(self.cache_root),
 
64
  "HF_DATASETS_CACHE": str(self.datasets_cache)
65
  }
66
-
67
  for var, value in env_vars.items():
68
  os.environ[var] = value
69
  logger.info(LogFormatter.info(f"Set {var}={value}"))
70
-
71
 
72
  def get_cache_path(self, cache_type: str) -> Path:
73
  """Returns the path for a specific cache type"""
 
3
  from pathlib import Path
4
  from datetime import timedelta
5
  import logging
6
+ from app.utils.logging import LogFormatter
7
  from app.config.base import (
8
  CACHE_ROOT,
9
  DATASETS_CACHE,
 
58
  def _setup_environment(self):
59
  """Configure HuggingFace environment variables"""
60
  logger.info(LogFormatter.subsection("ENVIRONMENT SETUP"))
61
+
62
  env_vars = {
63
  "HF_HOME": str(self.cache_root),
64
+ "TRANSFORMERS_CACHE": str(self.models_cache),
65
  "HF_DATASETS_CACHE": str(self.datasets_cache)
66
  }
67
+
68
  for var, value in env_vars.items():
69
  os.environ[var] = value
70
  logger.info(LogFormatter.info(f"Set {var}={value}"))
 
71
 
72
  def get_cache_path(self, cache_type: str) -> Path:
73
  """Returns the path for a specific cache type"""
backend/app/core/fastapi_cache.py CHANGED
@@ -4,7 +4,7 @@ from fastapi_cache.decorator import cache
4
  from datetime import timedelta
5
  from app.config import CACHE_TTL
6
  import logging
7
- from app.core.formatting import LogFormatter
8
 
9
  logger = logging.getLogger(__name__)
10
 
 
4
  from datetime import timedelta
5
  from app.config import CACHE_TTL
6
  import logging
7
+ from app.utils.logging import LogFormatter
8
 
9
  logger = logging.getLogger(__name__)
10
 
backend/app/core/formatting.py DELETED
@@ -1,104 +0,0 @@
1
- import logging
2
- from typing import Dict, Any, List, Optional
3
-
4
- logger = logging.getLogger(__name__)
5
-
6
- class LogFormatter:
7
- """Utility class for consistent log formatting across the application"""
8
-
9
- @staticmethod
10
- def section(title: str) -> str:
11
- """Create a section header"""
12
- return f"\n{'='*20} {title.upper()} {'='*20}"
13
-
14
- @staticmethod
15
- def subsection(title: str) -> str:
16
- """Create a subsection header"""
17
- return f"\n{'─'*20} {title} {'─'*20}"
18
-
19
- @staticmethod
20
- def tree(items: Dict[str, Any], title: str = None) -> List[str]:
21
- """Create a tree view of dictionary data"""
22
- lines = []
23
- if title:
24
- lines.append(f"📊 {title}:")
25
-
26
- # Get the maximum length for alignment
27
- max_key_length = max(len(str(k)) for k in items.keys())
28
-
29
- # Format each item
30
- for i, (key, value) in enumerate(items.items()):
31
- prefix = "└──" if i == len(items) - 1 else "├──"
32
- if isinstance(value, (int, float)):
33
- value = f"{value:,}" # Add thousand separators
34
- lines.append(f"{prefix} {str(key):<{max_key_length}}: {value}")
35
-
36
- return lines
37
-
38
- @staticmethod
39
- def stats(stats: Dict[str, int], title: str = None) -> List[str]:
40
- """Format statistics with icons"""
41
- lines = []
42
- if title:
43
- lines.append(f"📊 {title}:")
44
-
45
- # Get the maximum length for alignment
46
- max_key_length = max(len(str(k)) for k in stats.keys())
47
-
48
- # Format each stat with an appropriate icon
49
- icons = {
50
- "total": "📌",
51
- "success": "✅",
52
- "error": "❌",
53
- "pending": "⏳",
54
- "processing": "⚙️",
55
- "finished": "✨",
56
- "evaluating": "🔄",
57
- "downloads": "⬇️",
58
- "files": "📁",
59
- "cached": "💾",
60
- "size": "📏",
61
- "time": "⏱️",
62
- "rate": "🚀"
63
- }
64
-
65
- # Format each item
66
- for i, (key, value) in enumerate(stats.items()):
67
- prefix = "└──" if i == len(stats) - 1 else "├──"
68
- icon = icons.get(key.lower().split('_')[0], "•")
69
- if isinstance(value, (int, float)):
70
- value = f"{value:,}" # Add thousand separators
71
- lines.append(f"{prefix} {icon} {str(key):<{max_key_length}}: {value}")
72
-
73
- return lines
74
-
75
- @staticmethod
76
- def progress_bar(current: int, total: int, width: int = 20) -> str:
77
- """Create a progress bar"""
78
- percentage = (current * 100) // total
79
- filled = "█" * (percentage * width // 100)
80
- empty = "░" * (width - len(filled))
81
- return f"{filled}{empty} {percentage:3d}%"
82
-
83
- @staticmethod
84
- def error(message: str, error: Optional[Exception] = None) -> str:
85
- """Format error message"""
86
- error_msg = f"\n❌ Error: {message}"
87
- if error:
88
- error_msg += f"\n └── Details: {str(error)}"
89
- return error_msg
90
-
91
- @staticmethod
92
- def success(message: str) -> str:
93
- """Format success message"""
94
- return f"✅ {message}"
95
-
96
- @staticmethod
97
- def warning(message: str) -> str:
98
- """Format warning message"""
99
- return f"⚠️ {message}"
100
-
101
- @staticmethod
102
- def info(message: str) -> str:
103
- """Format info message"""
104
- return f"ℹ️ {message}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
backend/app/services/hf_service.py CHANGED
@@ -2,7 +2,7 @@ from typing import Optional
2
  from huggingface_hub import HfApi
3
  from app.config import HF_TOKEN, API
4
  from app.core.cache import cache_config
5
- from app.core.formatting import LogFormatter
6
  import logging
7
 
8
  logger = logging.getLogger(__name__)
 
2
  from huggingface_hub import HfApi
3
  from app.config import HF_TOKEN, API
4
  from app.core.cache import cache_config
5
+ from app.utils.logging import LogFormatter
6
  import logging
7
 
8
  logger = logging.getLogger(__name__)
backend/app/services/leaderboard.py CHANGED
@@ -5,7 +5,7 @@ import datasets
5
  from fastapi import HTTPException
6
  import logging
7
  from app.config.base import HF_ORGANIZATION
8
- from app.core.formatting import LogFormatter
9
 
10
  logger = logging.getLogger(__name__)
11
 
@@ -143,7 +143,7 @@ class LeaderboardService:
143
  "is_merged": data.get("Merged", False),
144
  "is_moe": data.get("MoE", False),
145
  "is_flagged": data.get("Flagged", False),
146
- "is_official_provider": data.get("Official Providers", False)
147
  }
148
 
149
  metadata = {
 
5
  from fastapi import HTTPException
6
  import logging
7
  from app.config.base import HF_ORGANIZATION
8
+ from app.utils.logging import LogFormatter
9
 
10
  logger = logging.getLogger(__name__)
11
 
 
143
  "is_merged": data.get("Merged", False),
144
  "is_moe": data.get("MoE", False),
145
  "is_flagged": data.get("Flagged", False),
146
+ "is_highlighted_by_maintainer": data.get("Official Providers", False)
147
  }
148
 
149
  metadata = {
backend/app/services/models.py CHANGED
@@ -25,7 +25,7 @@ from app.services.hf_service import HuggingFaceService
25
  from app.utils.model_validation import ModelValidator
26
  from app.services.votes import VoteService
27
  from app.core.cache import cache_config
28
- from app.core.formatting import LogFormatter
29
 
30
  # Disable datasets progress bars globally
31
  disable_progress_bar()
@@ -409,14 +409,6 @@ class ModelService(HuggingFaceService):
409
  logger.info(LogFormatter.subsection("CHECKING EXISTING SUBMISSIONS"))
410
  existing_models = await self.get_models()
411
 
412
- # Call the official provider status check
413
- is_valid, error_message = await self.validator.check_official_provider_status(
414
- model_data["model_id"],
415
- existing_models
416
- )
417
- if not is_valid:
418
- raise ValueError(error_message)
419
-
420
  # Check in all statuses (pending, evaluating, finished)
421
  for status, models in existing_models.items():
422
  for model in models:
@@ -462,11 +454,11 @@ class ModelService(HuggingFaceService):
462
  if model_size is None:
463
  logger.error(LogFormatter.error("Model size validation failed", error))
464
  raise Exception(error)
465
- logger.info(LogFormatter.success(f"Model size validation passed: {model_size:.1f}B"))
466
 
467
  # Size limits based on precision
468
  if model_data["precision"] in ["float16", "bfloat16"] and model_size > 100:
469
- error_msg = f"Model too large for {model_data['precision']} (limit: 100B)"
470
  logger.error(LogFormatter.error("Size limit exceeded", error_msg))
471
  raise Exception(error_msg)
472
 
 
25
  from app.utils.model_validation import ModelValidator
26
  from app.services.votes import VoteService
27
  from app.core.cache import cache_config
28
+ from app.utils.logging import LogFormatter
29
 
30
  # Disable datasets progress bars globally
31
  disable_progress_bar()
 
409
  logger.info(LogFormatter.subsection("CHECKING EXISTING SUBMISSIONS"))
410
  existing_models = await self.get_models()
411
 
 
 
 
 
 
 
 
 
412
  # Check in all statuses (pending, evaluating, finished)
413
  for status, models in existing_models.items():
414
  for model in models:
 
454
  if model_size is None:
455
  logger.error(LogFormatter.error("Model size validation failed", error))
456
  raise Exception(error)
457
+ logger.info(LogFormatter.success(f"Model size validation passed: {model_size:.1f}GB"))
458
 
459
  # Size limits based on precision
460
  if model_data["precision"] in ["float16", "bfloat16"] and model_size > 100:
461
+ error_msg = f"Model too large for {model_data['precision']} (limit: 100GB)"
462
  logger.error(LogFormatter.error("Size limit exceeded", error_msg))
463
  raise Exception(error_msg)
464
 
backend/app/services/votes.py CHANGED
@@ -4,15 +4,16 @@ import json
4
  import logging
5
  import asyncio
6
  from pathlib import Path
 
7
  import aiohttp
8
  from huggingface_hub import HfApi
9
  import datasets
10
 
11
  from app.services.hf_service import HuggingFaceService
12
- from app.config import HF_TOKEN
13
  from app.config.hf_config import HF_ORGANIZATION
14
  from app.core.cache import cache_config
15
- from app.core.formatting import LogFormatter
16
 
17
  logger = logging.getLogger(__name__)
18
 
 
4
  import logging
5
  import asyncio
6
  from pathlib import Path
7
+ import os
8
  import aiohttp
9
  from huggingface_hub import HfApi
10
  import datasets
11
 
12
  from app.services.hf_service import HuggingFaceService
13
+ from app.config import HF_TOKEN, API
14
  from app.config.hf_config import HF_ORGANIZATION
15
  from app.core.cache import cache_config
16
+ from app.utils.logging import LogFormatter
17
 
18
  logger = logging.getLogger(__name__)
19
 
backend/app/utils/logging.py CHANGED
@@ -1,3 +1,105 @@
1
- from app.core.formatting import LogFormatter
 
 
2
 
3
- __all__ = ['LogFormatter']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import sys
3
+ from typing import Dict, Any, List, Optional
4
 
5
+ logger = logging.getLogger(__name__)
6
+
7
+ class LogFormatter:
8
+ """Utility class for consistent log formatting across the application"""
9
+
10
+ @staticmethod
11
+ def section(title: str) -> str:
12
+ """Create a section header"""
13
+ return f"\n{'='*20} {title.upper()} {'='*20}"
14
+
15
+ @staticmethod
16
+ def subsection(title: str) -> str:
17
+ """Create a subsection header"""
18
+ return f"\n{'─'*20} {title} {'─'*20}"
19
+
20
+ @staticmethod
21
+ def tree(items: Dict[str, Any], title: str = None) -> List[str]:
22
+ """Create a tree view of dictionary data"""
23
+ lines = []
24
+ if title:
25
+ lines.append(f"📊 {title}:")
26
+
27
+ # Get the maximum length for alignment
28
+ max_key_length = max(len(str(k)) for k in items.keys())
29
+
30
+ # Format each item
31
+ for i, (key, value) in enumerate(items.items()):
32
+ prefix = "└──" if i == len(items) - 1 else "├──"
33
+ if isinstance(value, (int, float)):
34
+ value = f"{value:,}" # Add thousand separators
35
+ lines.append(f"{prefix} {str(key):<{max_key_length}}: {value}")
36
+
37
+ return lines
38
+
39
+ @staticmethod
40
+ def stats(stats: Dict[str, int], title: str = None) -> List[str]:
41
+ """Format statistics with icons"""
42
+ lines = []
43
+ if title:
44
+ lines.append(f"📊 {title}:")
45
+
46
+ # Get the maximum length for alignment
47
+ max_key_length = max(len(str(k)) for k in stats.keys())
48
+
49
+ # Format each stat with an appropriate icon
50
+ icons = {
51
+ "total": "📌",
52
+ "success": "✅",
53
+ "error": "❌",
54
+ "pending": "⏳",
55
+ "processing": "⚙️",
56
+ "finished": "✨",
57
+ "evaluating": "🔄",
58
+ "downloads": "⬇️",
59
+ "files": "📁",
60
+ "cached": "💾",
61
+ "size": "📏",
62
+ "time": "⏱️",
63
+ "rate": "🚀"
64
+ }
65
+
66
+ # Format each item
67
+ for i, (key, value) in enumerate(stats.items()):
68
+ prefix = "└──" if i == len(stats) - 1 else "├──"
69
+ icon = icons.get(key.lower().split('_')[0], "•")
70
+ if isinstance(value, (int, float)):
71
+ value = f"{value:,}" # Add thousand separators
72
+ lines.append(f"{prefix} {icon} {str(key):<{max_key_length}}: {value}")
73
+
74
+ return lines
75
+
76
+ @staticmethod
77
+ def progress_bar(current: int, total: int, width: int = 20) -> str:
78
+ """Create a progress bar"""
79
+ percentage = (current * 100) // total
80
+ filled = "█" * (percentage * width // 100)
81
+ empty = "░" * (width - len(filled))
82
+ return f"{filled}{empty} {percentage:3d}%"
83
+
84
+ @staticmethod
85
+ def error(message: str, error: Optional[Exception] = None) -> str:
86
+ """Format error message"""
87
+ error_msg = f"\n❌ Error: {message}"
88
+ if error:
89
+ error_msg += f"\n └── Details: {str(error)}"
90
+ return error_msg
91
+
92
+ @staticmethod
93
+ def success(message: str) -> str:
94
+ """Format success message"""
95
+ return f"✅ {message}"
96
+
97
+ @staticmethod
98
+ def warning(message: str) -> str:
99
+ """Format warning message"""
100
+ return f"⚠️ {message}"
101
+
102
+ @staticmethod
103
+ def info(message: str) -> str:
104
+ """Format info message"""
105
+ return f"ℹ️ {message}"
backend/app/utils/model_validation.py CHANGED
@@ -1,14 +1,15 @@
1
  import json
2
  import logging
3
  import asyncio
 
4
  from typing import Tuple, Optional, Dict, Any
5
- from datasets import load_dataset
6
  from huggingface_hub import HfApi, ModelCard, hf_hub_download
7
  from huggingface_hub import hf_api
8
  from transformers import AutoConfig, AutoTokenizer
9
- from app.config.base import HF_TOKEN
10
- from app.config.hf_config import OFFICIAL_PROVIDERS_REPO
11
- from app.core.formatting import LogFormatter
12
 
13
  logger = logging.getLogger(__name__)
14
 
@@ -104,12 +105,13 @@ class ModelValidator:
104
  if adapter_meta and base_meta:
105
  adapter_size = sum(adapter_meta.parameter_count.values())
106
  base_size = sum(base_meta.parameter_count.values())
107
- model_size = adapter_size + base_size
108
  else:
109
  # For regular models, just get the model size
110
  meta = await self.get_safetensors_metadata(model_info.id, revision=revision)
111
  if meta:
112
- model_size = sum(meta.parameter_count.values()) # total params
 
113
 
114
  if model_size is None:
115
  # If model size could not be determined, return an error
@@ -117,7 +119,6 @@ class ModelValidator:
117
 
118
  # Adjust size for GPTQ models
119
  size_factor = 8 if (precision == "GPTQ" or "gptq" in model_info.id.lower()) else 1
120
- model_size = model_size / 1e9 # Convert to billions, assuming float16
121
  model_size = round(size_factor * model_size, 3)
122
 
123
  logger.info(LogFormatter.success(f"Model size: {model_size}B parameters"))
@@ -206,61 +207,4 @@ class ModelValidator:
206
  except Exception as e:
207
  if "You are trying to access a gated repo." in str(e):
208
  return True, "The model is gated and requires special access permissions.", None
209
- return False, f"The model was not found or is misconfigured on the Hub. Error: {e.args[0]}", None
210
-
211
- async def check_official_provider_status(
212
- self,
213
- model_id: str,
214
- existing_models: Dict[str, list]
215
- ) -> Tuple[bool, Optional[str]]:
216
- """
217
- Check if model is from official provider and has finished submission.
218
-
219
- Args:
220
- model_id: The model identifier (org/model-name)
221
- existing_models: Dictionary of models by status from get_models()
222
-
223
- Returns:
224
- Tuple[bool, Optional[str]]: (is_valid, error_message)
225
- """
226
- try:
227
- logger.info(LogFormatter.info(f"Checking official provider status for {model_id}"))
228
-
229
- # Get model organization
230
- model_org = model_id.split('/')[0] if '/' in model_id else None
231
-
232
- if not model_org:
233
- return True, None
234
-
235
- # Load official providers dataset
236
- dataset = load_dataset(OFFICIAL_PROVIDERS_REPO)
237
- official_providers = dataset["train"][0]["CURATED_SET"]
238
-
239
- # Check if model org is in official providers
240
- is_official = model_org in official_providers
241
-
242
- if is_official:
243
- logger.info(LogFormatter.info(f"Model organization '{model_org}' is an official provider"))
244
-
245
- # Check for finished submissions
246
- if "finished" in existing_models:
247
- for model in existing_models["finished"]:
248
- if model["name"] == model_id:
249
- error_msg = (
250
- f"Model {model_id} is an official provider model "
251
- f"with a completed evaluation. "
252
- f"To re-evaluate, please open a discussion."
253
- )
254
- logger.error(LogFormatter.error("Validation failed", error_msg))
255
- return False, error_msg
256
-
257
- logger.info(LogFormatter.success("No finished submission found for this official provider model"))
258
- else:
259
- logger.info(LogFormatter.info(f"Model organization '{model_org}' is not an official provider"))
260
-
261
- return True, None
262
-
263
- except Exception as e:
264
- error_msg = f"Failed to check official provider status: {str(e)}"
265
- logger.error(LogFormatter.error(error_msg))
266
- return False, error_msg
 
1
  import json
2
  import logging
3
  import asyncio
4
+ import re
5
  from typing import Tuple, Optional, Dict, Any
6
+ import aiohttp
7
  from huggingface_hub import HfApi, ModelCard, hf_hub_download
8
  from huggingface_hub import hf_api
9
  from transformers import AutoConfig, AutoTokenizer
10
+ from app.config.base import HF_TOKEN, API
11
+ from app.utils.logging import LogFormatter
12
+
13
 
14
  logger = logging.getLogger(__name__)
15
 
 
105
  if adapter_meta and base_meta:
106
  adapter_size = sum(adapter_meta.parameter_count.values())
107
  base_size = sum(base_meta.parameter_count.values())
108
+ model_size = (adapter_size + base_size) / (2 * 1e9) # Convert to billions, assuming float16
109
  else:
110
  # For regular models, just get the model size
111
  meta = await self.get_safetensors_metadata(model_info.id, revision=revision)
112
  if meta:
113
+ total_params = sum(meta.parameter_count.values())
114
+ model_size = total_params / (2 * 1e9) # Convert to billions, assuming float16
115
 
116
  if model_size is None:
117
  # If model size could not be determined, return an error
 
119
 
120
  # Adjust size for GPTQ models
121
  size_factor = 8 if (precision == "GPTQ" or "gptq" in model_info.id.lower()) else 1
 
122
  model_size = round(size_factor * model_size, 3)
123
 
124
  logger.info(LogFormatter.success(f"Model size: {model_size}B parameters"))
 
207
  except Exception as e:
208
  if "You are trying to access a gated repo." in str(e):
209
  return True, "The model is gated and requires special access permissions.", None
210
+ return False, f"The model was not found or is misconfigured on the Hub. Error: {e.args[0]}", None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
backend/pyproject.toml CHANGED
@@ -13,8 +13,8 @@ pandas = "^2.2.3"
13
  datasets = "^3.2.0"
14
  pyarrow = "^18.1.0"
15
  python-multipart = "^0.0.20"
16
- huggingface-hub = "^0.27.1"
17
- transformers = "4.48.0"
18
  safetensors = "^0.4.5"
19
  aiofiles = "^24.1.0"
20
  fastapi-cache2 = "^0.2.1"
 
13
  datasets = "^3.2.0"
14
  pyarrow = "^18.1.0"
15
  python-multipart = "^0.0.20"
16
+ huggingface-hub = "^0.27.0"
17
+ transformers = "^4.47.0"
18
  safetensors = "^0.4.5"
19
  aiofiles = "^24.1.0"
20
  fastapi-cache2 = "^0.2.1"
backend/utils/analyze_prod_datasets.py CHANGED
@@ -132,7 +132,7 @@ def main():
132
  "description": "User votes"
133
  },
134
  {
135
- "id": f"{HF_ORGANIZATION}/official-providers",
136
  "description": "Highlighted models"
137
  }
138
  ]
 
132
  "description": "User votes"
133
  },
134
  {
135
+ "id": f"{HF_ORGANIZATION}/maintainers-highlight",
136
  "description": "Highlighted models"
137
  }
138
  ]
backend/utils/fix_wrong_model_size.py DELETED
@@ -1,110 +0,0 @@
1
- import os
2
- import json
3
- import pytz
4
- import logging
5
- import asyncio
6
- from datetime import datetime
7
- from pathlib import Path
8
- import huggingface_hub
9
- from huggingface_hub.errors import RepositoryNotFoundError, RevisionNotFoundError
10
- from dotenv import load_dotenv
11
- from git import Repo
12
- from datetime import datetime
13
- from tqdm.auto import tqdm
14
- from tqdm.contrib.logging import logging_redirect_tqdm
15
-
16
- from app.config.hf_config import HF_TOKEN, API
17
-
18
- from app.utils.model_validation import ModelValidator
19
-
20
- huggingface_hub.logging.set_verbosity_error()
21
- huggingface_hub.utils.disable_progress_bars()
22
-
23
- logging.basicConfig(
24
- level=logging.ERROR,
25
- format='%(message)s'
26
- )
27
- logger = logging.getLogger(__name__)
28
- load_dotenv()
29
-
30
- validator = ModelValidator()
31
-
32
- def get_changed_files(repo_path, start_date, end_date):
33
- repo = Repo(repo_path)
34
- start = datetime.strptime(start_date, '%Y-%m-%d')
35
- end = datetime.strptime(end_date, '%Y-%m-%d')
36
-
37
- changed_files = set()
38
- pbar = tqdm(repo.iter_commits(), desc=f"Reading commits from {end_date} to {start_date}")
39
- for commit in pbar:
40
- commit_date = datetime.fromtimestamp(commit.committed_date)
41
- pbar.set_postfix_str(f"Commit date: {commit_date}")
42
- if start <= commit_date <= end:
43
- changed_files.update(item.a_path for item in commit.diff(commit.parents[0]))
44
-
45
- if commit_date < start:
46
- break
47
-
48
- return changed_files
49
-
50
-
51
- def read_json(repo_path, file):
52
- with open(f"{repo_path}/{file}") as file:
53
- return json.load(file)
54
-
55
-
56
- def write_json(repo_path, file, content):
57
- with open(f"{repo_path}/{file}", "w") as file:
58
- json.dump(content, file, indent=2)
59
-
60
-
61
- def main():
62
- requests_path = "/requests"
63
- start_date = "2024-12-09"
64
- end_date = "2025-01-07"
65
-
66
- changed_files = get_changed_files(requests_path, start_date, end_date)
67
-
68
- for file in tqdm(changed_files):
69
- try:
70
- request_data = read_json(requests_path, file)
71
- except FileNotFoundError as e:
72
- tqdm.write(f"File {file} not found")
73
- continue
74
-
75
- try:
76
- model_info = API.model_info(
77
- repo_id=request_data["model"],
78
- revision=request_data["revision"],
79
- token=HF_TOKEN
80
- )
81
- except (RepositoryNotFoundError, RevisionNotFoundError) as e:
82
- tqdm.write(f"Model info for {request_data["model"]} not found")
83
- continue
84
-
85
- with logging_redirect_tqdm():
86
- new_model_size, error = asyncio.run(validator.get_model_size(
87
- model_info=model_info,
88
- precision=request_data["precision"],
89
- base_model=request_data["base_model"],
90
- revision=request_data["revision"]
91
- ))
92
-
93
- if error:
94
- tqdm.write(f"Error getting model size info for {request_data["model"]}, {error}")
95
- continue
96
-
97
- old_model_size = request_data["params"]
98
- if old_model_size != new_model_size:
99
- if new_model_size > 100:
100
- tqdm.write(f"Model: {request_data["model"]}, size is more 100B: {new_model_size}")
101
-
102
- tqdm.write(f"Model: {request_data["model"]}, old size: {request_data["params"]} new size: {new_model_size}")
103
- tqdm.write(f"Updating request file {file}")
104
-
105
- request_data["params"] = new_model_size
106
- write_json(requests_path, file, content=request_data)
107
-
108
-
109
- if __name__ == "__main__":
110
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
backend/utils/sync_datasets_locally.py CHANGED
@@ -30,7 +30,7 @@ DATASET_NAMES = [
30
  "results",
31
  "requests",
32
  "contents",
33
- "official-providers",
34
  ]
35
 
36
  # Build list of datasets with their source and destination paths
 
30
  "results",
31
  "requests",
32
  "contents",
33
+ "maintainers-highlight",
34
  ]
35
 
36
  # Build list of datasets with their source and destination paths
frontend/src/pages/AddModelPage/components/ModelSubmissionForm/ModelSubmissionForm.js CHANGED
@@ -411,7 +411,7 @@ function ModelSubmissionForm({ user, isAuthenticated }) {
411
  placeholder="organization/model-name"
412
  value={formData.modelName}
413
  onChange={handleChange}
414
- helperText="Example: meta-llama/Llama-3.2-1B"
415
  InputProps={{
416
  endAdornment: (
417
  <InfoIconWithTooltip tooltip={HELP_TEXTS.modelName} />
 
411
  placeholder="organization/model-name"
412
  value={formData.modelName}
413
  onChange={handleChange}
414
+ helperText="Example: meta-llama/Llama-2-7b-hf"
415
  InputProps={{
416
  endAdornment: (
417
  <InfoIconWithTooltip tooltip={HELP_TEXTS.modelName} />
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/FilteredModelCount.js CHANGED
@@ -19,7 +19,7 @@ const useModelCount = ({ totalCount, filteredCount, data, table, loading }) => {
19
  };
20
  }
21
  const displayCount = isOfficialProviderActive
22
- ? officialOnlyCounts.officialProviders
23
  : totalCount;
24
 
25
  // Calculate total number of pinned models
@@ -46,8 +46,8 @@ const useModelCount = ({ totalCount, filteredCount, data, table, loading }) => {
46
  // Filter by official providers
47
  if (filterConfig.isOfficialProviderActive) {
48
  if (
49
- !model.features?.is_official_provider &&
50
- !model.metadata?.is_official_provider
51
  ) {
52
  return false;
53
  }
@@ -100,7 +100,7 @@ const useModelCount = ({ totalCount, filteredCount, data, table, loading }) => {
100
  typeof filter === "object" ? filter.value : filter;
101
 
102
  // Maintainer's Highlight keeps positive logic
103
- if (filterValue === "is_official_provider") {
104
  return model.features[filterValue];
105
  }
106
 
@@ -134,7 +134,7 @@ const useModelCount = ({ totalCount, filteredCount, data, table, loading }) => {
134
  data,
135
  state.filters,
136
  isOfficialProviderActive,
137
- officialOnlyCounts.officialProviders,
138
  ]);
139
  };
140
 
 
19
  };
20
  }
21
  const displayCount = isOfficialProviderActive
22
+ ? officialOnlyCounts.maintainersHighlight
23
  : totalCount;
24
 
25
  // Calculate total number of pinned models
 
46
  // Filter by official providers
47
  if (filterConfig.isOfficialProviderActive) {
48
  if (
49
+ !model.features?.is_highlighted_by_maintainer &&
50
+ !model.metadata?.is_highlighted_by_maintainer
51
  ) {
52
  return false;
53
  }
 
100
  typeof filter === "object" ? filter.value : filter;
101
 
102
  // Maintainer's Highlight keeps positive logic
103
+ if (filterValue === "is_highlighted_by_maintainer") {
104
  return model.features[filterValue];
105
  }
106
 
 
134
  data,
135
  state.filters,
136
  isOfficialProviderActive,
137
+ officialOnlyCounts.maintainersHighlight,
138
  ]);
139
  };
140
 
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/Filters.js CHANGED
@@ -781,18 +781,18 @@ const LeaderboardFilters = ({
781
  <FilterTag
782
  label={filter.label}
783
  checked={
784
- filter.value === "is_official_provider"
785
  ? isOfficialProviderActive
786
  : selectedBooleanFilters.includes(filter.value)
787
  }
788
  onChange={
789
- filter.value === "is_official_provider"
790
  ? handleOfficialProviderToggle
791
  : () => handleBooleanFilterToggle(filter.value)
792
  }
793
  count={
794
- filter.value === "is_official_provider"
795
- ? currentCounts.officialProviders
796
  : 0
797
  }
798
  showCheckbox={true}
@@ -815,7 +815,7 @@ const LeaderboardFilters = ({
815
  borderRadius: "50%",
816
  backgroundColor: (
817
  filter.value ===
818
- "is_official_provider"
819
  ? isOfficialProviderActive
820
  : selectedBooleanFilters.includes(
821
  filter.value
@@ -826,7 +826,7 @@ const LeaderboardFilters = ({
826
  }}
827
  />
828
  {(
829
- filter.value === "is_official_provider"
830
  ? isOfficialProviderActive
831
  : selectedBooleanFilters.includes(filter.value)
832
  )
 
781
  <FilterTag
782
  label={filter.label}
783
  checked={
784
+ filter.value === "is_highlighted_by_maintainer"
785
  ? isOfficialProviderActive
786
  : selectedBooleanFilters.includes(filter.value)
787
  }
788
  onChange={
789
+ filter.value === "is_highlighted_by_maintainer"
790
  ? handleOfficialProviderToggle
791
  : () => handleBooleanFilterToggle(filter.value)
792
  }
793
  count={
794
+ filter.value === "is_highlighted_by_maintainer"
795
+ ? currentCounts.maintainersHighlight
796
  : 0
797
  }
798
  showCheckbox={true}
 
815
  borderRadius: "50%",
816
  backgroundColor: (
817
  filter.value ===
818
+ "is_highlighted_by_maintainer"
819
  ? isOfficialProviderActive
820
  : selectedBooleanFilters.includes(
821
  filter.value
 
826
  }}
827
  />
828
  {(
829
+ filter.value === "is_highlighted_by_maintainer"
830
  ? isOfficialProviderActive
831
  : selectedBooleanFilters.includes(filter.value)
832
  )
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/QuickFilters.js CHANGED
@@ -206,7 +206,7 @@ const QuickFilters = ({ totalCount = 0, loading = false }) => {
206
  label={officialProvidersPreset.label}
207
  checked={isOfficialProviderActive}
208
  onChange={handleOfficialProviderToggle}
209
- count={currentCounts.officialProviders}
210
  totalCount={totalCount}
211
  showCheckbox={true}
212
  variant="secondary"
 
206
  label={officialProvidersPreset.label}
207
  checked={isOfficialProviderActive}
208
  onChange={handleOfficialProviderToggle}
209
+ count={currentCounts.maintainersHighlight}
210
  totalCount={totalCount}
211
  showCheckbox={true}
212
  variant="secondary"
frontend/src/pages/LeaderboardPage/components/Leaderboard/components/Filters/hooks/useOfficialProvidersMode.js CHANGED
@@ -23,7 +23,7 @@ export const useOfficialProvidersMode = () => {
23
 
24
  const filters = searchParams.get("filters");
25
  const isHighlighted =
26
- filters?.includes("is_official_provider") || false;
27
 
28
  // On initial load
29
  if (isInitialLoadRef.current) {
@@ -33,7 +33,7 @@ export const useOfficialProvidersMode = () => {
33
  if (isHighlighted && filters) {
34
  const initialNormalFilters = filters
35
  .split(",")
36
- .filter((f) => f !== "is_official_provider" && f !== "")
37
  .filter(Boolean);
38
  if (initialNormalFilters.length > 0) {
39
  normalFiltersRef.current = initialNormalFilters.join(",");
@@ -70,7 +70,7 @@ export const useOfficialProvidersMode = () => {
70
  const currentFiltersStr = searchParams.get("filters");
71
  const currentFilters =
72
  currentFiltersStr?.split(",").filter(Boolean) || [];
73
- const highlightFilter = "is_official_provider";
74
  const newSearchParams = new URLSearchParams(searchParams);
75
 
76
  if (currentFilters.includes(highlightFilter)) {
 
23
 
24
  const filters = searchParams.get("filters");
25
  const isHighlighted =
26
+ filters?.includes("is_highlighted_by_maintainer") || false;
27
 
28
  // On initial load
29
  if (isInitialLoadRef.current) {
 
33
  if (isHighlighted && filters) {
34
  const initialNormalFilters = filters
35
  .split(",")
36
+ .filter((f) => f !== "is_highlighted_by_maintainer" && f !== "")
37
  .filter(Boolean);
38
  if (initialNormalFilters.length > 0) {
39
  normalFiltersRef.current = initialNormalFilters.join(",");
 
70
  const currentFiltersStr = searchParams.get("filters");
71
  const currentFilters =
72
  currentFiltersStr?.split(",").filter(Boolean) || [];
73
+ const highlightFilter = "is_highlighted_by_maintainer";
74
  const newSearchParams = new URLSearchParams(searchParams);
75
 
76
  if (currentFilters.includes(highlightFilter)) {
frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/defaults.js CHANGED
@@ -59,14 +59,14 @@ const FILTERS = {
59
  hide: true,
60
  },
61
  {
62
- value: "is_official_provider",
63
  label: "Only Official Providers",
64
  hide: false,
65
  },
66
  ],
67
  HIGHLIGHT_OPTIONS: [
68
  {
69
- value: "is_official_provider",
70
  label: "Only Official Providers",
71
  },
72
  ],
@@ -237,7 +237,7 @@ const COLUMNS = {
237
  defaultVisible: false,
238
  label: "Hub Availability",
239
  },
240
- "features.is_official_provider": {
241
  group: "additional_info",
242
  size: COLUMN_SIZES.OFFICIAL_PROVIDER,
243
  defaultVisible: false,
 
59
  hide: true,
60
  },
61
  {
62
+ value: "is_highlighted_by_maintainer",
63
  label: "Only Official Providers",
64
  hide: false,
65
  },
66
  ],
67
  HIGHLIGHT_OPTIONS: [
68
  {
69
+ value: "is_highlighted_by_maintainer",
70
  label: "Only Official Providers",
71
  },
72
  ],
 
237
  defaultVisible: false,
238
  label: "Hub Availability",
239
  },
240
+ "features.is_highlighted_by_maintainer": {
241
  group: "additional_info",
242
  size: COLUMN_SIZES.OFFICIAL_PROVIDER,
243
  defaultVisible: false,
frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/quickFilters.js CHANGED
@@ -45,7 +45,7 @@ export const QUICK_FILTER_PRESETS = [
45
  shortDescription: 'Officially provided models',
46
  description: 'Models that are officially provided and maintained by official creators or organizations.',
47
  filters: {
48
- selectedBooleanFilters: ['is_official_provider']
49
  }
50
  }
51
  ];
 
45
  shortDescription: 'Officially provided models',
46
  description: 'Models that are officially provided and maintained by official creators or organizations.',
47
  filters: {
48
+ selectedBooleanFilters: ['is_highlighted_by_maintainer']
49
  }
50
  }
51
  ];
frontend/src/pages/LeaderboardPage/components/Leaderboard/constants/tooltips.js CHANGED
@@ -258,7 +258,7 @@ export const COLUMN_TOOLTIPS = {
258
  "For detailed information about our CO₂ calculation methodology, visit:",
259
  subItems: [
260
  <a
261
- href="https://huggingface.co/docs/leaderboards/open_llm_leaderboard/emissions"
262
  target="_blank"
263
  rel="noopener noreferrer"
264
  style={{ color: "#90caf9" }}
 
258
  "For detailed information about our CO₂ calculation methodology, visit:",
259
  subItems: [
260
  <a
261
+ href="https://huggingface.co/docs/hub/carbon-emissions"
262
  target="_blank"
263
  rel="noopener noreferrer"
264
  style={{ color: "#90caf9" }}
frontend/src/pages/LeaderboardPage/components/Leaderboard/context/LeaderboardContext.js CHANGED
@@ -47,7 +47,7 @@ const createInitialCounts = () => {
47
  return {
48
  modelTypes,
49
  precisions,
50
- officialProviders: 0,
51
  mixtureOfExperts: 0,
52
  flagged: 0,
53
  merged: 0,
@@ -129,7 +129,7 @@ const modelMatchesFilters = (model, filters) => {
129
  const filterValue = typeof filter === "object" ? filter.value : filter;
130
 
131
  // Maintainer's Highlight keeps positive logic
132
- if (filterValue === "is_official_provider") {
133
  return model.features[filterValue];
134
  }
135
 
@@ -187,8 +187,8 @@ const calculateModelCounts = (models) => {
187
 
188
  models.forEach((model) => {
189
  const isOfficial =
190
- model.features?.is_official_provider ||
191
- model.metadata?.is_official_provider;
192
  const countsToUpdate = [normalCounts];
193
 
194
  if (isOfficial) {
@@ -214,10 +214,10 @@ const calculateModelCounts = (models) => {
214
 
215
  // Boolean filters
216
  if (
217
- model.features?.is_official_provider ||
218
- model.metadata?.is_official_provider
219
  )
220
- counts.officialProviders++;
221
  if (model.features?.is_moe || model.metadata?.is_moe)
222
  counts.mixtureOfExperts++;
223
  if (model.features?.is_flagged || model.metadata?.is_flagged)
 
47
  return {
48
  modelTypes,
49
  precisions,
50
+ maintainersHighlight: 0,
51
  mixtureOfExperts: 0,
52
  flagged: 0,
53
  merged: 0,
 
129
  const filterValue = typeof filter === "object" ? filter.value : filter;
130
 
131
  // Maintainer's Highlight keeps positive logic
132
+ if (filterValue === "is_highlighted_by_maintainer") {
133
  return model.features[filterValue];
134
  }
135
 
 
187
 
188
  models.forEach((model) => {
189
  const isOfficial =
190
+ model.features?.is_highlighted_by_maintainer ||
191
+ model.metadata?.is_highlighted_by_maintainer;
192
  const countsToUpdate = [normalCounts];
193
 
194
  if (isOfficial) {
 
214
 
215
  // Boolean filters
216
  if (
217
+ model.features?.is_highlighted_by_maintainer ||
218
+ model.metadata?.is_highlighted_by_maintainer
219
  )
220
+ counts.maintainersHighlight++;
221
  if (model.features?.is_moe || model.metadata?.is_moe)
222
  counts.mixtureOfExperts++;
223
  if (model.features?.is_flagged || model.metadata?.is_flagged)
frontend/src/pages/LeaderboardPage/components/Leaderboard/hooks/useDataUtils.js CHANGED
@@ -58,8 +58,8 @@ export const useProcessedData = (data, averageMode, visibleColumns) => {
58
  ...item.features,
59
  is_moe: Boolean(item.features.is_moe),
60
  is_flagged: Boolean(item.features.is_flagged),
61
- is_official_provider: Boolean(
62
- item.features.is_official_provider
63
  ),
64
  is_merged: Boolean(item.features.is_merged),
65
  is_not_available_on_hub: Boolean(item.features.is_not_available_on_hub),
@@ -117,8 +117,8 @@ export const useFilteredData = (
117
  if (isOfficialProviderActive) {
118
  filteredUnpinned = filteredUnpinned.filter(
119
  (row) =>
120
- row.features?.is_official_provider ||
121
- row.metadata?.is_official_provider
122
  );
123
  }
124
 
@@ -197,7 +197,7 @@ export const useFilteredData = (
197
  typeof filter === "object" ? filter.value : filter;
198
 
199
  // Maintainer's Highlight keeps positive logic
200
- if (filterValue === "is_official_provider") {
201
  return row.features[filterValue];
202
  }
203
 
 
58
  ...item.features,
59
  is_moe: Boolean(item.features.is_moe),
60
  is_flagged: Boolean(item.features.is_flagged),
61
+ is_highlighted_by_maintainer: Boolean(
62
+ item.features.is_highlighted_by_maintainer
63
  ),
64
  is_merged: Boolean(item.features.is_merged),
65
  is_not_available_on_hub: Boolean(item.features.is_not_available_on_hub),
 
117
  if (isOfficialProviderActive) {
118
  filteredUnpinned = filteredUnpinned.filter(
119
  (row) =>
120
+ row.features?.is_highlighted_by_maintainer ||
121
+ row.metadata?.is_highlighted_by_maintainer
122
  );
123
  }
124
 
 
197
  typeof filter === "object" ? filter.value : filter;
198
 
199
  // Maintainer's Highlight keeps positive logic
200
+ if (filterValue === "is_highlighted_by_maintainer") {
201
  return row.features[filterValue];
202
  }
203
 
frontend/src/pages/LeaderboardPage/components/Leaderboard/utils/columnUtils.js CHANGED
@@ -1003,18 +1003,18 @@ export const createColumns = (
1003
  ],
1004
  },
1005
  {
1006
- accessorKey: "features.is_official_provider",
1007
  header: createHeaderCell(
1008
  "Official Providers",
1009
  "Models that are officially provided and maintained by their original creators or organizations"
1010
  ),
1011
  cell: ({ row }) => (
1012
  <BooleanValue
1013
- value={row.original.features.is_official_provider}
1014
  />
1015
  ),
1016
  size: TABLE_DEFAULTS.COLUMNS.COLUMN_SIZES[
1017
- "features.is_official_provider"
1018
  ],
1019
  enableSorting: true,
1020
  },
@@ -1061,7 +1061,7 @@ export const createColumns = (
1061
  "metadata.base_model": 10,
1062
  "model.has_chat_template": 11,
1063
  "features.is_not_available_on_hub": 12,
1064
- "features.is_official_provider": 13,
1065
  "features.is_moe": 14,
1066
  "features.is_flagged": 15,
1067
  };
 
1003
  ],
1004
  },
1005
  {
1006
+ accessorKey: "features.is_highlighted_by_maintainer",
1007
  header: createHeaderCell(
1008
  "Official Providers",
1009
  "Models that are officially provided and maintained by their original creators or organizations"
1010
  ),
1011
  cell: ({ row }) => (
1012
  <BooleanValue
1013
+ value={row.original.features.is_highlighted_by_maintainer}
1014
  />
1015
  ),
1016
  size: TABLE_DEFAULTS.COLUMNS.COLUMN_SIZES[
1017
+ "features.is_highlighted_by_maintainer"
1018
  ],
1019
  enableSorting: true,
1020
  },
 
1061
  "metadata.base_model": 10,
1062
  "model.has_chat_template": 11,
1063
  "features.is_not_available_on_hub": 12,
1064
+ "features.is_highlighted_by_maintainer": 13,
1065
  "features.is_moe": 14,
1066
  "features.is_flagged": 15,
1067
  };