website/docs/user-guide/features/provider-routing.md
When using OpenRouter as your LLM provider, Hermes Agent supports provider routing — fine-grained control over which underlying AI providers handle your requests and how they're prioritized.
OpenRouter routes requests to many providers (e.g., Anthropic, Google, AWS Bedrock, Together AI). Provider routing lets you optimize for cost, speed, quality, or enforce specific provider requirements.
:::note
Nous Portal decides routing centrally per model and does not accept caller-supplied provider preferences; Hermes never sends the provider object to Portal, so provider_routing is simply ignored there.
:::
Add a provider_routing section to your ~/.hermes/config.yaml:
provider_routing:
sort: "price" # How to rank providers
only: [] # Whitelist: only use these providers
ignore: [] # Blacklist: never use these providers
order: [] # Explicit provider priority order
require_parameters: false # Only use providers that support all parameters
data_collection: null # Control data collection ("allow" or "deny")
:::info Provider routing only applies when using OpenRouter. It has no effect on Nous Portal or direct provider connections (e.g., connecting directly to the Anthropic API). :::
sortControls how OpenRouter ranks available providers for your request.
| Value | Description |
|---|---|
"price" | Cheapest provider first |
"throughput" | Fastest tokens-per-second first |
"latency" | Lowest time-to-first-token first |
provider_routing:
sort: "price"
onlyWhitelist of provider slugs. When set, only these providers will be used. All others are excluded. Use the lowercase slug shown by OpenRouter for each provider.
provider_routing:
only:
- "anthropic"
- "google"
ignoreBlacklist of provider names. These providers will never be used, even if they offer the cheapest or fastest option.
provider_routing:
ignore:
- "together"
- "deepinfra"
orderExplicit priority order. Providers listed first are preferred. Unlisted providers are used as fallbacks.
provider_routing:
order:
- "anthropic"
- "google"
- "amazon-bedrock"
require_parametersWhen true, OpenRouter will only route to providers that support all parameters in your request (like temperature, top_p, tools, etc.). This avoids silent parameter drops.
provider_routing:
require_parameters: true
data_collectionControls whether providers can use your prompts for training. Options are "allow" or "deny".
provider_routing:
data_collection: "deny"
models)Pin a different provider set per model. Keys under models are model ids; each entry takes the same
sort / only / ignore / order / require_parameters / data_collection keys and overrides the
flat value for that model only. Anything you don't set per model falls through to the flat defaults.
provider_routing:
sort: "price" # applies to every model
models:
"openai/gpt-6-astra":
only: ["openai"] # never let a reseller serve this one
"anthropic/claude-fable-5.1":
only: ["anthropic"]
"moonshotai/kimi-k2.6":
order: ["moonshotai", "together"]
sort: "throughput"
Matching is spelling-tolerant like agent.reasoning_overrides (claude-fable-5.1 / claude-fable-5-1,
with or without the openrouter/ prefix). The override follows the model the agent is currently on, so
/model switches, fallback activation, cron jobs, and delegated subagents on another model each get their
own pins. Edit config.yaml directly for these keys: model ids contain dots, which hermes config set
reads as path separators.
Route to the cheapest available provider. Good for high-volume usage and development:
provider_routing:
sort: "price"
Prioritize low-latency providers for interactive use:
provider_routing:
sort: "latency"
Best for long-form generation where tokens-per-second matters:
provider_routing:
sort: "throughput"
Ensure all requests go through a specific provider for consistency:
provider_routing:
only:
- "anthropic"
Exclude providers you don't want to use (e.g., for data privacy):
provider_routing:
ignore:
- "together"
- "lepton"
data_collection: "deny"
Try your preferred providers first, fall back to others if unavailable:
provider_routing:
order:
- "anthropic"
- "google"
require_parameters: true
Provider routing preferences are passed to OpenRouter on agent chat requests and iteration-limit summaries via the extra_body.provider field. (extra_body is the OpenAI Python SDK argument; it becomes the top-level provider object in the JSON request.) Auxiliary tasks such as compression and title generation are configured independently under auxiliary.<task>.extra_body.
~/.hermes/config.yaml, loaded at startupThe routing config is read from config.yaml and passed as parameters when creating the AIAgent:
providers_allowed ← from provider_routing.only
providers_ignored ← from provider_routing.ignore
providers_order ← from provider_routing.order
provider_sort ← from provider_routing.sort
provider_require_parameters ← from provider_routing.require_parameters
provider_data_collection ← from provider_routing.data_collection
:::tip You can combine multiple options. For example, sort by price but exclude certain providers and require parameter support:
provider_routing:
sort: "price"
ignore: ["together"]
require_parameters: true
data_collection: "deny"
:::
When no provider_routing section is configured (the default), the aggregator uses its own default routing logic, which generally balances cost and availability automatically.
:::tip Provider Routing vs. Fallback Models Provider routing controls which sub-providers behind OpenRouter handle your requests. For automatic failover to an entirely different provider when your primary model fails, see Fallback Providers. :::