LLM Providers
源码版本v2026.7.20
职责
把「provider 名(nvidia、kimi、openai、openrouter…)」翻译成「具体的 hostname、消息预处理、extra_body、模型列表」。Hermes 不用继承体系做 provider 抽象,而是用 ProviderProfile 数据类 + 一组钩子,profile 作为插件注册,实现「声明即接入」。支持 Nous Portal、OpenRouter、OpenAI 及自定义 endpoint。
关键文件
OMIT_TEMPERATURE:21— 哨兵对象,表示「不发送 temperature」@dataclass ProviderProfile:38-88— provider 元数据(name、aliases、base_url、auth、temperature 策略…)get_hostname / prepare_messages:98-118— 钩子:请求走哪个主机、消息怎么预处理build_extra_body:119-175— 钩子:provider 专属请求体字段fetch_models:175-232— 钩子:拉取该 provider 可用模型列表模块文档:9-28— 描述懒发现机制(首次调用才扫描插件)register_provider:53-65— 注册一个 profileget_provider_profile:65-76— 按 name 或 alias 查询list_providers:76-91— 列出全部 profileplugins/model-providers/ 目录— 实际 profile 定义(每个 provider 一个子目录)
数据流
init_agent:276拿到用户配置的 provider 名。- 调
get_provider_profile:65(首次触发懒发现:扫描plugins/model-providers/<name>/,导入并register_provider)。 - 拿到
ProviderProfile后:get_hostname(providers/base.py:98)定请求主机prepare_messages(providers/base.py:111)预处理build_turn_context:268产出的api_messagesbuild_extra_body(providers/base.py:119)加 provider 专属字段- temperature 按 profile 策略(None / OMIT_TEMPERATURE / 具体值)
- 主循环用组装好的请求调用 provider API(
重试子循环:1227)。 - 自定义 provider 的 extra_body 合并在
_merge_custom_provider_extra_body:257完成。
小结
Provider 抽象的关键词是「profile + 钩子」而非「继承」。新增 provider 只需在 plugins/model-providers/ 建个子目录、声明一个 ProviderProfile 并 register_provider,无需改 base。懒发现保证启动快、按需加载。