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— profile を一つ登録get_provider_profile:65-76— name または alias で照合list_providers:76-91— 全 profile を一覧plugins/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_messagesを前処理build_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 を修正する必要はない。遅延発見が起動を速く保ち、必要に応じてロードする。