Multi-Provider Setup¶
This example demonstrates how to use multiple LLM providers with nagents for fallback, comparison, and specialized use cases.
Overview¶
flowchart TB
subgraph Providers
O[OpenAI]
A[Anthropic]
G[Google Gemini]
end
Agent --> |Primary| O
Agent --> |Fallback| A
Agent --> |Specialized| G
O --> Response
A --> Response
G --> Response
Provider Comparison¶
| Provider | Best For | Streaming | Tool Calling |
|---|---|---|---|
| OpenAI | General tasks, code | Yes | Yes |
| Anthropic | Analysis, writing | Yes | Yes |
| Google Gemini | Multimodal, long context | Yes | Yes |
Basic Multi-Provider Setup¶
Create agents with different providers for different purposes:
Fallback Pattern¶
Implement automatic fallback when a provider fails:
- Providers are tried in order - put your preferred/cheapest provider first
- Iterate through providers until one succeeds
- Only print fallback message if there are more providers to try
Provider Router¶
Route requests to different providers based on task type:
provider_router.py
from enum import Enum
from pathlib import Path
from nagents import Agent, SessionManager
from nagents.providers import AnthropicProvider, GoogleProvider, OpenAIProvider
class TaskType(Enum):
CODE = "code"
ANALYSIS = "analysis"
CREATIVE = "creative"
GENERAL = "general"
class ProviderRouter:
"""Route requests to optimal providers based on task type."""
def __init__(self, session_manager: SessionManager):
self.session_manager = session_manager
self._agents: dict[TaskType, Agent] = {}
def _get_agent(self, task_type: TaskType) -> Agent:
if task_type not in self._agents:
self._agents[task_type] = self._create_agent(task_type)
return self._agents[task_type]
def _create_agent(self, task_type: TaskType) -> Agent:
configs = {
TaskType.CODE: {
"provider": OpenAIProvider(model="gpt-4o"),
"system_prompt": "You are an expert programmer.",
},
TaskType.ANALYSIS: {
"provider": AnthropicProvider(model="claude-sonnet-4-20250514"),
"system_prompt": "You are a thorough analyst.",
},
TaskType.CREATIVE: {
"provider": AnthropicProvider(model="claude-sonnet-4-20250514"),
"system_prompt": "You are a creative writer.",
},
TaskType.GENERAL: {
"provider": GoogleProvider(model="gemini-2.0-flash"),
"system_prompt": "You are a helpful assistant.",
},
}
config = configs[task_type]
return Agent(
provider=config["provider"],
session_manager=self.session_manager,
system_prompt=config["system_prompt"],
)
async def run(self, message: str, task_type: TaskType):
agent = self._get_agent(task_type)
async for event in agent.run(message):
yield event
async def main():
session_manager = SessionManager(Path("sessions.db"))
router = ProviderRouter(session_manager)
# Code task -> OpenAI
print("Code task:")
async for event in router.run(
"Write a Python function to calculate fibonacci numbers",
TaskType.CODE,
):
if event.type == "text_delta":
print(event.content, end="")
print("\n\nAnalysis task:")
# Analysis task -> Anthropic
async for event in router.run(
"Analyze the pros and cons of microservices architecture",
TaskType.ANALYSIS,
):
if event.type == "text_delta":
print(event.content, end="")
Parallel Provider Comparison¶
Compare responses from multiple providers simultaneously:
return_exceptions=Trueensures one failure doesn't cancel others
Best Practices¶
Cost Optimization
Route simpler tasks to cheaper providers:
API Key Management
Store API keys securely and validate they exist:
import os
def get_available_providers() -> list[Provider]:
providers = []
if key := os.environ.get("OPENAI_API_KEY"):
providers.append(OpenAIProvider(api_key=key, model="gpt-4o-mini"))
if key := os.environ.get("ANTHROPIC_API_KEY"):
providers.append(AnthropicProvider(api_key=key, model="claude-sonnet-4-20250514"))
if key := os.environ.get("GOOGLE_API_KEY"):
providers.append(GoogleProvider(api_key=key, model="gemini-2.0-flash"))
if not providers:
raise ValueError("No API keys configured!")
return providers
Session Sharing
The same SessionManager can be shared across multiple agents. Sessions are isolated by ID, so different agents can maintain separate conversation histories.
Next Steps¶
- Learn about Tool Usage to extend agent capabilities
- Explore the Providers Guide for detailed provider documentation
- Check Configuration for environment setup