Skip to main content
Aurora supports multiple LLM providers for its AI agents. At least one provider API key is required.

Supported Providers

  • OpenRouter (recommended) - Access multiple models through a single API
  • OpenAI - GPT models (GPT-4o, GPT-5.2, etc.)
  • Anthropic - Claude models (Claude 3.5 Sonnet, etc.)
  • Google AI - Gemini models (Gemini Pro, Ultra, etc.)

Quick Start

# Get an OpenRouter API key (recommended)
# Visit: https://openrouter.ai/keys

# Add to .env
OPENROUTER_API_KEY=sk-or-v1-...
LLM_PROVIDER_MODE=openrouter

# Restart Aurora
make down
make prod-prebuilt

Configuration

Environment Variables

LLM_PROVIDER_MODE
string
default:"openrouter"
Default LLM provider to use.Options: openrouter, openai, anthropic, google
AGENT_RECURSION_LIMIT
number
default:"240"
Maximum recursion depth for agent workflows. Prevents infinite loops.
OpenRouter provides access to multiple LLM models through a unified API.

Setup

  1. Get an API key: https://openrouter.ai/keys
  2. Add to .env:
    OPENROUTER_API_KEY=sk-or-v1-...
    LLM_PROVIDER_MODE=openrouter
    

Benefits

  • Single API for multiple models (GPT, Claude, Gemini, etc.)
  • Automatic routing to cheapest/fastest provider
  • Fallback support if a model is unavailable
  • Usage tracking and billing

Supported Models

OpenRouter supports 100+ models including:
  • OpenAI: GPT-4o, GPT-5.2, GPT-3.5
  • Anthropic: Claude 3.5 Sonnet, Claude 3 Opus
  • Google: Gemini Pro, Gemini Ultra
  • Meta: Llama 3, Llama 2
  • Mistral: Mixtral, Mistral Large
  • Many more: Cohere, AI21, etc.
See full list: https://openrouter.ai/models

Usage

from chat.backend.agent.providers import get_registry

registry = get_registry()
provider = registry.get_provider("openrouter")

# Use any OpenRouter-supported model
chat_model = provider.get_chat_model("openai/gpt-5.2")
response = chat_model.invoke("Hello, world!")

Cost Optimization

OpenRouter automatically routes to the cheapest available model:
# Use cost-optimized routing
chat_model = provider.get_chat_model("openai/gpt-5.2:auto")

OpenAI

Direct integration with OpenAI’s API.

Setup

  1. Get an API key: https://platform.openai.com/api-keys
  2. Add to .env:
    OPENAI_API_KEY=sk-...
    LLM_PROVIDER_MODE=openai
    

Supported Models

  • GPT-4o: Latest GPT-4 optimization
  • GPT-5.2: Next-generation model (when available)
  • GPT-3.5: Faster, cheaper model

Usage

from chat.backend.agent.providers import get_registry

registry = get_registry()
provider = registry.get_provider("openai")

chat_model = provider.get_chat_model("gpt-5.2")
response = chat_model.invoke("Explain quantum computing")

Configuration

# .env
OPENAI_API_KEY=sk-...
LLM_PROVIDER_MODE=openai

# Optional: Use OpenAI organization
OPENAI_ORGANIZATION=org-...

Anthropic

Integration with Anthropic’s Claude models.

Setup

  1. Get an API key: https://console.anthropic.com/
  2. Add to .env:
    ANTHROPIC_API_KEY=sk-ant-...
    LLM_PROVIDER_MODE=anthropic
    

Supported Models

  • Claude 3.5 Sonnet: Best balance of performance and speed
  • Claude 3 Opus: Most capable model
  • Claude 3 Haiku: Fastest, most affordable

Usage

from chat.backend.agent.providers import get_registry

registry = get_registry()
provider = registry.get_provider("anthropic")

chat_model = provider.get_chat_model("claude-3-5-sonnet-20240620")
response = chat_model.invoke("Write a Python function to sort a list")

Configuration

# .env
ANTHROPIC_API_KEY=sk-ant-...
LLM_PROVIDER_MODE=anthropic

Google AI (Gemini)

Integration with Google’s Gemini models.

Setup

  1. Get an API key: https://aistudio.google.com/app/apikey
  2. Add to .env:
    GOOGLE_AI_API_KEY=AIza...
    LLM_PROVIDER_MODE=google
    

Supported Models

  • Gemini Pro: Balanced performance
  • Gemini Ultra: Most capable (when available)
  • Gemini Nano: On-device model

Usage

from chat.backend.agent.providers import get_registry

registry = get_registry()
provider = registry.get_provider("google")

chat_model = provider.get_chat_model("gemini-pro")
response = chat_model.invoke("What is machine learning?")

Configuration

# .env
GOOGLE_AI_API_KEY=AIza...
LLM_PROVIDER_MODE=google

# Optional: Disable thinking mode
GEMINI_DISABLE_THINKING=true

Multi-Provider Setup

You can configure multiple providers and switch between them:
# .env
OPENROUTER_API_KEY=sk-or-v1-...
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GOOGLE_AI_API_KEY=AIza...

# Default provider
LLM_PROVIDER_MODE=openrouter
Switch providers at runtime:
from chat.backend.agent.providers import get_registry

registry = get_registry()

# Use OpenRouter
openrouter = registry.get_provider("openrouter")
model1 = openrouter.get_chat_model("openai/gpt-5.2")

# Use OpenAI directly
openai = registry.get_provider("openai")
model2 = openai.get_chat_model("gpt-5.2")

# Use Anthropic
anthropic = registry.get_provider("anthropic")
model3 = anthropic.get_chat_model("claude-3-5-sonnet-20240620")

API Endpoints

Check Available Providers

curl http://localhost:5080/api/llm-config/available-providers
Response:
{
  "success": true,
  "provider_mode": "openrouter",
  "providers": {
    "openrouter": {"available": true, "configured": true},
    "openai": {"available": true, "configured": true},
    "anthropic": {"available": false, "configured": false},
    "google": {"available": false, "configured": false}
  }
}

Get Provider Details

curl http://localhost:5080/api/llm-config/provider-details
Response:
{
  "success": true,
  "providers": [
    {
      "name": "openrouter",
      "available": true,
      "supported_models": [
        "openai/gpt-5.2",
        "openai/gpt-4o",
        "anthropic/claude-3-5-sonnet",
        "..."
      ],
      "total_models": 120
    }
  ]
}

Test Provider

curl -X POST http://localhost:5080/api/llm-config/test-provider \
  -H "Content-Type: application/json" \
  -d '{"provider": "openai", "model": "gpt-5.2"}'
Response:
{
  "success": true,
  "provider": "openai",
  "available": true,
  "message": "Provider 'openai' is configured and ready to use"
}

Get Supported Models

# All models
curl http://localhost:5080/api/llm-config/supported-models

# Filter by provider
curl "http://localhost:5080/api/llm-config/supported-models?provider=openai"

Model Mapping

Aurora automatically maps model names across providers:
from chat.backend.agent.model_mapper import ModelMapper

# Detect provider from model name
provider = ModelMapper.detect_provider("gpt-5.2")
print(provider)  # "openai"

# Get native name for a provider
native_name = ModelMapper.get_native_name("gpt-5.2", "openrouter")
print(native_name)  # "openai/gpt-5.2"

# Get supported models for a provider
models = ModelMapper.get_supported_models_for_provider("anthropic")
print(models)  # ["claude-3-5-sonnet-20240620", "claude-3-opus-20240229", ...]

Cost Optimization

RCA Cost Optimization

RCA_OPTIMIZE_COSTS
boolean
default:"false"
Enable cost optimization for root cause analysis.When enabled, Aurora uses cheaper models for preliminary analysis and more capable models only when needed.
# .env
RCA_OPTIMIZE_COSTS=true

Model Selection Strategy

  1. Fast tasks: Use GPT-3.5 or Claude Haiku
  2. Standard tasks: Use GPT-4o or Claude Sonnet
  3. Complex reasoning: Use GPT-5.2 or Claude Opus
# Example: Tiered model usage
def get_model_for_task(complexity: str):
    if complexity == "simple":
        return "openai/gpt-3.5-turbo"  # Cheap, fast
    elif complexity == "standard":
        return "openai/gpt-4o"  # Balanced
    else:
        return "openai/gpt-5.2"  # Most capable

Troubleshooting

Provider Not Available

# Check which providers are configured
curl http://localhost:5080/api/llm-config/available-providers

# Verify API key is set
docker exec aurora-server-1 printenv | grep API_KEY

# Test provider
curl -X POST http://localhost:5080/api/llm-config/test-provider \
  -H "Content-Type: application/json" \
  -d '{"provider": "openai"}'

API Key Invalid

# Check API key format
echo $OPENROUTER_API_KEY  # Should start with sk-or-v1-
echo $OPENAI_API_KEY      # Should start with sk-
echo $ANTHROPIC_API_KEY   # Should start with sk-ant-
echo $GOOGLE_AI_API_KEY   # Should start with AIza

# Test key directly
curl https://openrouter.ai/api/v1/auth/key \
  -H "Authorization: Bearer $OPENROUTER_API_KEY"

Rate Limits

If you hit rate limits:
  1. Use multiple providers as fallbacks
  2. Implement retry logic with exponential backoff
  3. Upgrade API plan for higher limits
  4. Use OpenRouter for automatic rate limit handling

Model Not Found

# Check model name is correct
curl "http://localhost:5080/api/llm-config/model-info?model=gpt-5.2"

# List supported models
curl "http://localhost:5080/api/llm-config/supported-models?provider=openai"

Best Practices

  1. Use OpenRouter for simplicity and reliability
  2. Configure multiple providers as fallbacks
  3. Test provider connectivity before deploying
  4. Monitor usage and costs regularly
  5. Rotate API keys periodically
  6. Use environment variables (never commit keys)
  7. Enable RCA cost optimization in production
  8. Set appropriate recursion limits to prevent runaway costs

Security

Never commit API keys to version control. Always use environment variables and .env files.
# Good: .env file (gitignored)
OPENROUTER_API_KEY=sk-or-v1-...

# Bad: Hardcoded in code
api_key = "sk-or-v1-..."  # NEVER DO THIS

Key Rotation

# 1. Generate new API key from provider
# 2. Update .env
OPENROUTER_API_KEY=sk-or-v1-NEW_KEY

# 3. Restart Aurora
make down
make prod-prebuilt

# 4. Verify new key works
curl -X POST http://localhost:5080/api/llm-config/test-provider \
  -d '{"provider": "openrouter"}'

# 5. Revoke old key from provider dashboard

Access Control

  • Restrict API keys to specific IP addresses (if supported)
  • Use separate keys for development and production
  • Monitor usage for unusual activity
  • Set spending limits on provider dashboards

Build docs developers (and LLMs) love