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。懶發現保證啟動快、按需載入。