hermes-agent/plugins/model-providers
kshitij b3344502f8 chore: map Axmr1 email + update stale Go routing docstring
- Add contributors/emails/Axmr1@users.noreply.github.com for CI
  attribution check (bare noreply format needs explicit mapping)
- Update opencode-zen plugin docstring: Go routing now includes
  GPT → codex_responses and Qwen → anthropic_messages (was stale,
  only listed MiniMax and GLM/Kimi)
2026-08-08 14:47:11 +05:30
..
actual fix: adapt Actual provider salvage to current main 2026-08-05 14:08:32 -07:00
ai-gateway Revert "remove Vercel AI Gateway and Vercel Sandbox (#33067)" 2026-07-29 19:48:37 -07:00
alibaba
alibaba-coding-plan
anthropic
arcee
azure-foundry
bedrock
copilot fix(copilot): clamp reasoning effort to the nearest supported level, not xhigh->high 2026-07-16 08:47:10 -07:00
copilot-acp
custom
deepinfra fix(secrets): scope tier-3 credential reads (teams_pipeline, deepinfra models, FAL/XAI/VERCEL/DAYTONA/GITHUB presence, HERMES_API_KEY display) 2026-08-02 10:04:48 -07:00
deepseek fix(deepseek): drop retired models from picker and provider defaults 2026-07-26 16:28:41 -07:00
fireworks add Hermes headers to Fireworks provider (#81321) 2026-08-07 20:56:29 +00:00
gemini fix(gemini): bump native provider aux default to gemini-3.6-flash 2026-07-28 11:54:46 -07:00
gmi fix: align gmi fallback_models ordering with curated list 2026-07-20 02:25:44 -07:00
huggingface
kilocode fix(gemini): sweep hardcoded Gemini default models to gemini-3.6-flash (#32360) 2026-07-28 18:17:56 -07:00
kimi-coding feat(kimi): discover K3 on coding endpoint 2026-07-16 13:33:02 -07:00
minimax
nous fix(cache): scope prompt_cache_key by session to stop cross-session bucket sharing 2026-08-05 12:42:46 +05:30
novita
nvidia
ollama-cloud fix(ollama-cloud): capability-gate reasoning_effort + correct disable semantics 2026-07-16 07:58:04 -07:00
openai-codex
opencode-zen chore: map Axmr1 email + update stale Go routing docstring 2026-08-08 14:47:11 +05:30
openrouter fix(cache): scope prompt_cache_key by session to stop cross-session bucket sharing 2026-08-05 12:42:46 +05:30
qwen-oauth
stepfun
upstage
vertex fix(gemini): sweep hardcoded Gemini default models to gemini-3.6-flash (#32360) 2026-07-28 18:17:56 -07:00
xai chore(xai): drop noisy default_headers comment 2026-07-27 17:47:28 -07:00
xiaomi
zai
README.md

README.md

Model Provider Plugins

Each subdirectory is a self-contained provider profile plugin. The directory layout mirrors plugins/platforms/:

plugins/model-providers/
├── openrouter/
│   ├── __init__.py      # registers the ProviderProfile
│   └── plugin.yaml      # manifest: name, kind, version, description
├── anthropic/
│   ├── __init__.py
│   └── plugin.yaml
└── ...

How discovery works

providers/__init__.py._discover_providers() scans this directory (and $HERMES_HOME/plugins/model-providers/) the first time anything calls get_provider_profile() or list_providers(). Each __init__.py is imported and expected to call providers.register_provider(profile).

User plugins at $HERMES_HOME/plugins/model-providers/<name>/ override bundled plugins of the same name — last-writer-wins in register_provider(). Drop a file there to replace a built-in.

Adding a new provider

  1. Create plugins/model-providers/<your_provider>/__init__.py:

    from providers import register_provider
    from providers.base import ProviderProfile
    
    my_provider = ProviderProfile(
        name="your-provider",
        aliases=("alias1", "alias2"),
        display_name="Your Provider",
        description="One-line description shown in the setup picker",
        signup_url="https://your-provider.example.com/keys",
        env_vars=("YOUR_PROVIDER_API_KEY", "YOUR_PROVIDER_BASE_URL"),
        base_url="https://api.your-provider.example.com/v1",
        default_aux_model="your-cheap-model",
    )
    
    register_provider(my_provider)
    
  2. Create plugins/model-providers/<your_provider>/plugin.yaml:

    name: your-provider-profile
    kind: model-provider
    version: 1.0.0
    description: Short sentence about the provider
    author: Your Name
    

Nothing else needs to change. auth.py, config.py, models.py, doctor.py, model_metadata.py, runtime_provider.py, and the chat_completions transport all auto-wire from the registry.

Non-trivial profiles

Override the ProviderProfile hooks in a subclass for per-provider quirks — see plugins/model-providers/openrouter/__init__.py for build_extra_body and build_api_kwargs_extras examples, and plugins/model-providers/gemini/__init__.py for thinking_config translation.