LLM Providers
Responsabilité
Traduire « nom de provider (nvidia, kimi, openai, openrouter…) » en « hostname concret, prétraitement des messages, extra_body, liste de modèles ». Hermes n'utilise pas une hiérarchie d'héritage pour abstraire les providers, mais une dataclass ProviderProfile + un ensemble de hooks ; le profil est enregistré comme plugin, ce qui se traduit par « déclarer c'est câbler ». Prend en charge Nous Portal, OpenRouter, OpenAI et endpoints personnalisés.
Fichiers clés
OMIT_TEMPERATURE:21— objet sentinelle signifiant « ne pas envoyer temperature »@dataclass ProviderProfile:38-88— métadonnées du provider (name, aliases, base_url, auth, stratégie temperature…)get_hostname / prepare_messages:98-118— hooks : quel hôte pour la requête, comment prétraiter les messagesbuild_extra_body:119-175— hook : champs propres au provider dans le corps de requêtefetch_models:175-232— hook : récupère la liste des modèles disponibles du providerdoc module:9-28— décrit le mécanisme de découverte paresseuse (scan des plugins au premier appel)register_provider:53-65— enregistre un profilget_provider_profile:65-76— requête par nom ou aliaslist_providers:76-91— liste tous les profilsrépertoire plugins/model-providers/— définitions réelles des profils (un sous-répertoire par provider)
Flux de données
init_agent:276récupère le nom de provider configuré par l'utilisateur.- Appelle
get_provider_profile:65(premier appel déclenche la découverte paresseuse : scan deplugins/model-providers/<name>/, import etregister_provider). - Après obtention du
ProviderProfile:get_hostname(providers/base.py:98) fixe l'hôte de requêteprepare_messages(providers/base.py:111) prétraite lesapi_messagesproduits parbuild_turn_context:268build_extra_body(providers/base.py:119) ajoute les champs propres au provider- temperature suit la stratégie du profil (None / OMIT_TEMPERATURE / valeur concrète)
- La boucle principale appelle l'API du provider avec la requête assemblée (
sous-boucle de retry:1227). - L'extra_body des providers personnalisés est fusionné dans
_merge_custom_provider_extra_body:257.
Résumé
Les mots-clés de l'abstraction provider sont « profil + hooks » plutôt qu'« héritage ». Ajouter un provider consiste à créer un sous-répertoire dans plugins/model-providers/, déclarer un ProviderProfile et appeler register_provider, sans toucher à la base. La découverte paresseuse garantit un démarrage rapide et un chargement à la demande.