AIR

Example: manual provider selection

python
import asyncio
import os
 
from air import AIR, ChatRequest, Message, Role
from air.providers.gemini import GeminiProvider
from air.providers.groq import GroqProvider
 
 
async def main():
    air = AIR()
    air.add_provider(GeminiProvider(api_key=os.environ["GEMINI_API_KEY"], model="gemini-2.5-flash"), priority=1)
    air.add_provider(GroqProvider(api_key=os.environ["GROQ_API_KEY"], model="llama-3.3-70b-versatile"), priority=2)
 
    # Force Groq for this one request, regardless of priority order.
    request = ChatRequest(messages=[Message(role=Role.USER, content="Hello")], provider="groq")
    response = await air.chat(request)
    print(response.provider)  # "groq"
 
    # Same idea through a session, using the provider= keyword instead of ChatRequest.provider.
    session = air.session("user-123")
    response = await session.chat("Hello again", provider="groq")
    print(response.provider)  # "groq"
 
 
if __name__ == "__main__":
    asyncio.run(main())

Explicit provider selection (ChatRequest.provider or Session.chat(..., provider=...)) always uses that provider directly and never falls back to another one. If the name is not registered, ProviderNotFoundError is raised. See ../core/routing.md.