hermes-agent/plugins/model-providers
Adolanium 7fa084f58e fix: send Hermes Agent attribution headers to OpenCode Zen and Go
OpenCode identifies clients by request headers, the same way OpenRouter
does. Our opencode-zen and opencode-go profiles never set any, so every
request went out with the OpenAI SDK default "OpenAI/Python x.y.z"
User-Agent and OpenCode had no way to tell the traffic was Hermes Agent.

Two changes:

- Add HTTP-Referer, X-Title, and a HermesAgent User-Agent to both
  OpenCode profiles through profile.default_headers, the same path
  Fireworks uses. This covers chat_completions, codex_responses,
  auxiliary clients, model switches, and the models catalog fetch.
- Merge the same headers in build_anthropic_client for opencode.ai
  base URLs. The Anthropic Messages route (Claude on Zen, MiniMax and
  Qwen on Go) builds its client there and never sees profile headers.

Verified against the live Go relay with a real key. Both wire formats
return HTTP 200 and the requests now carry X-Title "Hermes Agent",
HTTP-Referer, and User-Agent HermesAgent/0.20.0.
2026-08-13 02:03:40 -07:00
..
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 chore(model-picker): refresh provider picker descriptions 2026-05-31 15:02:26 -07:00
anthropic fix(security): cover remaining catalog credential paths 2026-07-11 12:28:55 +05:30
arcee
…
azure-foundry feat(azure-foundry): add Microsoft Entra ID auth 2026-05-18 10:14:38 -07:00
bedrock fix(models): pass model.base_url to fetch_models in /model picker 2026-06-16 13:09:40 -07:00
copilot fix(copilot): clamp reasoning effort to the nearest supported level, not xhigh->high 2026-07-16 08:47:10 -07:00
copilot-acp fix(models): pass model.base_url to fetch_models in /model picker 2026-06-16 13:09:40 -07:00
custom fix(ollama): emit top-level reasoning_effort=none on /v1/chat/completions (#25758) 2026-07-15 06:38:28 -07:00
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 fix: map Hermes reasoning efforts onto K3's low/high/max vocabulary 2026-08-13 01:05:49 +05:30
minimax fix: route minimax m3 reasoning controls through profile 2026-06-15 07:08:43 -07:00
nous perf(sessions): resolve the titling model from the provider's live catalog 2026-08-08 17:07:21 -05:00
novita docs: update NovitaAI provider positioning (#25532) 2026-05-14 01:31:12 -07:00
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 fix: send Hermes Agent attribution headers to OpenCode Zen and Go 2026-08-13 02:03:40 -07:00
openrouter Port from PrimeIntellect-ai/prime-agent#1258: derive OpenRouter reasoning support and effort levels from catalog metadata 2026-08-12 19:44:32 -07:00
qwen-oauth perf: avoid broad message prep deepcopies 2026-07-09 14:35:14 +05:30
stepfun
…
upstage fix(upstage): collapse unknown future efforts to high; behavior-contract tests 2026-07-15 00:09:24 +05:30
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 fix(vision): proactive downgrade for providers rejecting list-type tool content (#41072) 2026-06-07 21:50:57 -07:00
zai feat(reasoning): add max and ultra effort levels (#62650) 2026-07-12 00:26:49 -07:00
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.