LLM Providers
源码版本v2026.7.20
Responsabilidad
Traducir «nombre de provider (nvidia, kimi, openai, openrouter…)» a «hostname concreto, preprocesamiento de mensajes, extra_body, lista de modelos». Hermes no usa herencia para abstraer los providers, sino un dataclass ProviderProfile + un conjunto de hooks; el profile se registra como plugin, logrando «declarar = integrar». Soporta Nous Portal, OpenRouter, OpenAI y endpoints personalizados.
Archivos clave
OMIT_TEMPERATURE:21— objeto centinela que indica «no enviar temperature»@dataclass ProviderProfile:38-88— metadatos del provider (name, aliases, base_url, auth, política de temperature…)get_hostname / prepare_messages:98-118— hooks: a qué host va la petición, cómo se preprocesan los mensajesbuild_extra_body:119-175— hook: campos del body específicos del providerfetch_models:175-232— hook: lista de modelos disponibles para ese providerdoc del módulo:9-28— describe el mecanismo de descubrimiento perezoso (escanea plugins solo en la primera llamada)register_provider:53-65— registra un profileget_provider_profile:65-76— consulta por name o aliaslist_providers:76-91— lista todos los profilesdirectorio plugins/model-providers/— definiciones reales de profiles (un subdirectorio por provider)
Flujo de datos
init_agent:276recibe el nombre de provider configurado por el usuario.- Llama a
get_provider_profile:65(lo que dispara el descubrimiento perezoso la primera vez: escaneaplugins/model-providers/<name>/, lo importa y llama aregister_provider). - Una vez obtenido el
ProviderProfile:get_hostname(providers/base.py:98) fija el host de la peticiónprepare_messages(providers/base.py:111) preprocesa losapi_messagesproducidos porbuild_turn_context:268build_extra_body(providers/base.py:119) añade campos específicos del provider- la temperature sigue la política del profile (None / OMIT_TEMPERATURE / valor concreto)
- El bucle principal usa la petición ensamblada para llamar a la API del provider (
subbucle de reintentos:1227). - El
extra_bodyde un provider personalizado se fusiona en_merge_custom_provider_extra_body:257.
Resumen
La abstracción de provider se resume en «profile + hooks», no «herencia». Añadir un provider solo requiere crear un subdirectorio en plugins/model-providers/, declarar un ProviderProfile y llamar a register_provider, sin tocar la base. El descubrimiento perezoso mantiene el arranque rápido y la carga bajo demanda.