LLM Providers
源码版本v2026.7.20
Verantwortung
Übersetzt einen «Provider-Namen (nvidia, kimi, openai, openrouter …)» in «konkreten Hostnamen, Nachrichten-Vorverarbeitung, extra_body, Modellliste». Hermes abstrahiert Provider nicht über Vererbung, sondern über die ProviderProfile-Dataclass + einen Satz Hooks; das Profil wird als Plugin registriert – «deklarieren heißt anbinden». Unterstützt werden Nous Portal, OpenRouter, OpenAI und eigene Endpunkte.
Schlüsseldateien
OMIT_TEMPERATURE:21— Sentinel-Objekt, bedeutet «temperature nicht senden»@dataclass ProviderProfile:38-88— Provider-Metadaten (name, aliases, base_url, auth, temperature-Strategie …)get_hostname / prepare_messages:98-118— Hooks: welcher Host bedient den Request, wie werden Nachrichten vorverarbeitetbuild_extra_body:119-175— Hook: provider-spezifische Request-Body-Felderfetch_models:175-232— Hook: holt die für diesen Provider verfügbare ModelllisteModul-Dokumentation:9-28— beschreibt den Lazy-Discovery-Mechanismus (Scan erst beim ersten Aufruf)register_provider:53-65— registriert ein Profilget_provider_profile:65-76— Lookup nach Name oder Aliaslist_providers:76-91— listet alle Profileplugins/model-providers/-Verzeichnis— tatsächliche Profildefinitionen (ein Unterverzeichnis pro Provider)
Datenfluss
init_agent:276erhält den konfigurierten Provider-Namen.- Aufruf von
get_provider_profile:65(löst beim ersten Mal Lazy-Discovery aus: Scan vonplugins/model-providers/<name>/, Import undregister_provider). - Nach Erhalt des
ProviderProfile:get_hostname(providers/base.py:98) bestimmt den Anfrage-Hostprepare_messages(providers/base.py:111) präpariert dieapi_messagesausbuild_turn_context:268build_extra_body(providers/base.py:119) fügt provider-spezifische Felder hinzutemperaturefolgt der Profil-Strategie (None / OMIT_TEMPERATURE / konkreter Wert)
- Die Hauptschleife ruft mit dem zusammengebauten Request die Provider-API auf (
Wiederholungs-Teilschleife:1227). - Der
extra_bodyeines Custom-Providers wird in_merge_custom_provider_extra_body:257gemergt.
Zusammenfassung
Leitgedanke der Provider-Abstraktion ist «Profil + Hooks» statt «Vererbung». Ein neuer Provider bedeutet nur ein Unterverzeichnis in plugins/model-providers/, in dem ein ProviderProfile deklariert und per register_provider angemeldet wird – ohne Änderung an base. Lazy-Discovery hält den Start schnell und lädt nach Bedarf.