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.