Agent → Model Routing

Each agent can be assigned a specific provider and model, with a sequential fallback chain for reliability.

Basic Routing

[agents.Sisyphus]
provider = "anthropic"
model = "claude-sonnet-4-6"
fallbacks = [
    { provider = "openai", model = "gpt-4o" },
    { provider = "deepseek", model = "deepseek-v4-flash" }
]

The router tries providers in order: primary → first fallback → second fallback → ... → Mock (always available).

Agent Routing Fields

FieldRequiredDescription
providerYesPrimary provider name (must match a [providers.*] key)
modelNoModel override (falls back to provider's default_model)
fallbacksNoOrdered fallback chain if primary fails
llm_preferencesNo"Any", "LocalOnly", "CloudOnly", or "Provider(name)"
max_sensitivityNoMax data sensitivity: "Low", "Medium", "High"
temperatureNoOverride per-agent temperature
max_tokensNoOverride per-agent max tokens
variantNoSelect a named variant from the model catalog
retry_policyNoRetry settings for transient errors

LLM Preferences

PreferenceBehavior
AnyStandard routing (primary → fallbacks)
LocalOnlyForce Ollama if available, error if unreachable
CloudOnlyForce default_provider if it's a cloud provider
Provider(name)Use the named provider directly

Privacy-Sensitive Routing

When max_sensitivity is set to "Medium" or "High", Zen enforces local-only routing for sensitive data:

  • Private/Confidential data is never sent to cloud providers
  • If no local LLM is available, the agent returns an error instead of falling back to cloud
# Private data — local-only enforced
[agents.Metis]
provider = "deepseek"
model = "deepseek-v4-flash"
fallbacks = [{ provider = "ollama", model = "qwen3.6:35b-mlx" }]
max_sensitivity = "Medium"

# Public data — can use any provider
[agents.Explore]
provider = "anthropic"
model = "claude-haiku-4-5"
fallbacks = [{ provider = "openai", model = "gpt-4o-mini" }]
llm_preferences = "CloudOnly"

Fallback Chain

Each fallback step can specify:

FieldDescription
providerProvider name for this fallback step
modelOverride model (optional, uses provider's default if omitted)
timeout_secsTimeout for this step (optional)
variantVariant name for this step's model (optional)
[agents.dispatch]
provider = "anthropic"
model = "claude-sonnet-4-6"
fallbacks = [
    { provider = "openai", model = "gpt-4o", timeout_secs = 30 },
    { provider = "ollama", model = "qwen3.6:35b-mlx" }
]
retry_policy = { max_retries = 3, timeout_secs = 30 }

Complete Agent Configuration Examples

Orchestrator Tier (requires capable models)

[agents.Sisyphus]
provider = "anthropic"
model = "claude-sonnet-4-6"
fallbacks = [
    { provider = "openai", model = "gpt-4o" },
    { provider = "deepseek", model = "deepseek-v4-flash" }
]
llm_preferences = "Any"
max_sensitivity = "High"

Knowledge Pipeline (local-first)

[agents.notion_extraction]
provider = "ollama"
model = "qwen3.6:35b-mlx"
fallbacks = [
    { provider = "deepseek", model = "deepseek-v4-flash" },
    { provider = "openai", model = "gpt-4o-mini" }
]

Fast Explorer (cost-optimized)

[agents.Explore]
provider = "anthropic"
model = "claude-haiku-4-5"
fallbacks = [{ provider = "openai", model = "gpt-4o-mini" }]
llm_preferences = "CloudOnly"
max_sensitivity = "Low"

Privacy-Sensitive Analyst

[agents.Hermes]
provider = "deepseek"
model = "deepseek-v4-flash"
fallbacks = [
    { provider = "openai", model = "gpt-4o-mini" },
    { provider = "ollama", model = "qwen3.6:35b-mlx" }
]
llm_preferences = "Any"
max_sensitivity = "High"

Next: Environment Variable Overrides