Spaces:
Running
Running
| """GitHub Models model sync implementation. | |
| GitHub Models provides free (rate-limited) access to models from OpenAI, | |
| Meta, Mistral, DeepSeek, Cohere, and Microsoft. The catalog endpoint at | |
| https://models.github.ai/catalog/models returns all available models | |
| without requiring authentication (richer response with GITHUB_TOKEN). | |
| """ | |
| from __future__ import annotations | |
| import os | |
| from provider_sync.base import BaseSync, ModelInfo | |
| class GitHubModelsSync(BaseSync): | |
| provider_name = "github-models" | |
| models_url = "https://models.github.ai/catalog/models" | |
| requires_auth = False | |
| env_var = "GITHUB_TOKEN" | |
| def __init__(self, api_key: str | None = None, **kwargs) -> None: | |
| super().__init__(api_key, **kwargs) | |
| if not self.api_key: | |
| self.api_key = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN") | |
| def fetch_models(self) -> list[ModelInfo]: | |
| headers = self._build_auth_header() | |
| if headers: | |
| headers["Accept"] = "application/vnd.github+json" | |
| headers["X-GitHub-Api-Version"] = "2026-03-10" | |
| data = self._make_request(self.models_url, headers) | |
| if not data or not isinstance(data, list): | |
| return [] | |
| seen = set() | |
| models = [] | |
| for item in data: | |
| if not isinstance(item, dict): | |
| continue | |
| model_id = item.get("id", "") | |
| if not model_id or model_id in seen: | |
| continue | |
| seen.add(model_id) | |
| context = None | |
| limits = item.get("limits") or {} | |
| if isinstance(limits, dict): | |
| ctx = limits.get("max_input_tokens") | |
| if ctx: | |
| try: | |
| context = int(ctx) | |
| except (ValueError, TypeError): | |
| pass | |
| normalized = self.normalize_model_id(model_id) | |
| models.append(ModelInfo( | |
| id=model_id, | |
| normalized_id=normalized, | |
| is_free=True, | |
| context_length=context, | |
| metadata=item, | |
| )) | |
| return models | |
| def normalize_model_id(self, model_id: str) -> str: | |
| normalized = model_id | |
| for prefix in ("openai/", "cohere/", "deepseek/", "meta/", "microsoft/", | |
| "mistral-ai/"): | |
| if normalized.startswith(prefix): | |
| normalized = normalized[len(prefix):] | |
| break | |
| return normalized | |