Providers

Veska automatically detects the right provider based on the model name you pass. You never need to import or configure providers directly.

How it works

Just pass a model name to your Agent or Orchestrator. Veska figures out the rest:

auto_detect.py
from veska import Agent

# Veska detects this is a Claude model → uses Anthropic API
agent = Agent(
    name="researcher",
    system_prompt="You do deep research.",
    model="claude-sonnet-4-6",
)

# Veska detects this is an OpenAI model → uses OpenAI API
agent = Agent(
    name="formatter",
    system_prompt="You format text.",
    model="gpt-4o",
)

Supported models

Claude (Anthropic)

Any model starting with claude. Supports extended thinking on compatible models.

claude-sonnet-4-6claude-opus-4-6claude-haiku-4-5-20251001

OpenAI

Any model starting with gpt, o1, o3, or o4.

gpt-4ogpt-4o-minio3-mini

API keys

Pass the key directly, or set it in your environment:

api_keys.py
from veska import Agent

# Option 1: Pass directly
agent = Agent(
    name="assistant",
    model="claude-sonnet-4-6",
    api_key="sk-ant-...",
)

# Option 2: Set in .env (recommended)
# ANTHROPIC_API_KEY=sk-ant-...   (for Claude models)
# OPENAI_API_KEY=sk-...          (for OpenAI models)
agent = Agent(
    name="assistant",
    model="claude-sonnet-4-6",   # reads ANTHROPIC_API_KEY from .env
)

Per-agent models

Different agents can use different models:

per_agent.py
from veska import Agent

# Use a more capable model for complex reasoning
researcher = Agent(
    name="researcher",
    system_prompt="You do deep research.",
    model="claude-opus-4-6",
)

# Use a faster, cheaper model for simple tasks
formatter = Agent(
    name="formatter",
    system_prompt="You format text.",
    model="gpt-4o-mini",
)

Default model

If you don't pass a model, Veska defaults to claude-sonnet-4-6:

default.py
from veska import Agent

# Uses claude-sonnet-4-6 by default
agent = Agent(
    name="assistant",
    system_prompt="You are helpful.",
)