AgentFieldbuild

Models

100+ LLMs via LiteLLM: model-agnostic configuration, cost controls, and rate limiting

100+ models — same code, any provider

Use any LLM. Switch models per-call. Set cost caps. Auto-retry on rate limits. AgentField is model-agnostic -- the Python SDK routes through LiteLLM for 100+ models from every major provider, TypeScript uses the Vercel AI SDK, and Go uses OpenAI-compatible HTTP APIs directly.

from agentfield import Agent, AIConfig, HarnessConfig

# Agent-level config — defaults for all .ai() calls
app = Agent(
    node_id="production-agent",
    ai_config=AIConfig(
        model="anthropic/claude-sonnet-4-20250514",       # default model
        fallback_models=[                                  # auto-failover chain
            "openai/gpt-4o",
            "deepseek/deepseek-chat",
        ],
        max_cost_per_call=0.05,                            # hard cap per call
        daily_budget=10.00,                                # daily spend limit
        enable_rate_limit_retry=True,                      # auto-retry with backoff
        rate_limit_max_retries=10,
        auto_inject_memory=["user_prefs", "conversation"], # inject memory into prompts
    ),
    # Harness uses a DIFFERENT config — coding agents have their own limits.
    # No provider/model: runs AForge, the default harness, on its own model.
    harness_config=HarnessConfig(
        max_turns=30,              # AForge bounds a run by iterations, not dollars
    ),
)

# Per-call model override — no agent reconfiguration needed
category = await app.ai(
    user=ticket_text,
    schema=TicketCategory,
    model="openai/gpt-4o-mini",   # cheap model for fast classification
)

analysis = await app.ai(
    user=ticket_text,
    schema=DeepAnalysis,
    model="anthropic/claude-sonnet-4-20250514",  # powerful model for reasoning
    temperature=0.0,                              # deterministic
)

# Local models — zero data leaves your machine
local_app = Agent(
    node_id="local-agent",
    ai_config=AIConfig(
        model="ollama/llama3",
        api_base="http://localhost:11434",
    ),
)
ProviderPython (LiteLLM)TypeScript (Vercel AI)Go (HTTP)
OpenAIopenai/gpt-4oopenai providerDefault
Anthropicanthropic/claude-sonnet-4-20250514anthropic providerVia OpenRouter
Google Geminigemini/gemini-2.5-progoogle providerVia OpenRouter
Mistralmistral/mistral-large-latestmistral providerVia OpenRouter
DeepSeekdeepseek/deepseek-chatdeepseek providerVia OpenRouter
Groqgroq/llama-3.1-70bgroq providerVia OpenRouter
xAIxai/grok-2xai providerVia OpenRouter
Coherecohere/command-r-pluscohere providerVia OpenRouter
OpenRouteropenrouter/...openrouter providerNative
Ollamaollama/llama3ollama providerNative
Azure OpenAIazure/gpt-4oVia OpenAI adapterVia URL
AWS Bedrockbedrock/...N/AN/A

What just happened

The example set a default model once and then overrode it only where the task changed. That is the practical pattern this page should teach: keep one baseline model for most calls, then switch to a cheaper or stronger model per execution instead of rebuilding your agent around provider-specific clients.

{
  "default_model": "gpt-4o",
  "classification_override": "gpt-4o-mini",
  "analysis_override": "anthropic/claude-sonnet-4-20250514"
}

Configuration Examples

Minimal Setup

from agentfield import Agent, AIConfig

# Uses OPENAI_API_KEY from environment
app = Agent(
    node_id="my-agent",
    ai_config=AIConfig(model="openai/gpt-4o"),
)

Cost-Conscious Production

app = Agent(
    node_id="production-agent",
    ai_config=AIConfig(
        model="openai/gpt-4o-mini",
        max_cost_per_call=0.05,
        daily_budget=10.00,
        fallback_models=["openrouter/google/gemini-2.5-flash"],
        enable_rate_limit_retry=True,
        rate_limit_max_retries=10,
        max_tokens=2000,
    ),
)

Multi-Provider Resilience

app = Agent(
    node_id="resilient-agent",
    ai_config=AIConfig(
        model="anthropic/claude-sonnet-4-20250514",
        fallback_models=[
            "openai/gpt-4o",
            "openrouter/google/gemini-2.5-pro",
            "deepseek/deepseek-chat",
        ],
        timeout=30,
        retry_attempts=3,
    ),
)

Local Models with Ollama

app = Agent(
    node_id="local-agent",
    ai_config=AIConfig(
        model="ollama/llama3",
        api_base="http://localhost:11434",
    ),
)

TypeScript with Anthropic

const app = new Agent({
  nodeId: 'my-agent',
  aiConfig: {
    provider: 'anthropic',
    model: 'claude-sonnet-4-20250514',
    apiKey: process.env.ANTHROPIC_API_KEY,
    temperature: 0.3,
    maxTokens: 4096,
  },
});

Go with OpenRouter

config := &ai.Config{
    APIKey:  os.Getenv("OPENROUTER_API_KEY"),
    BaseURL: "https://openrouter.ai/api/v1",
    Model:   "anthropic/claude-sonnet-4-20250514",
}

client, _ := ai.NewClient(config)
Model Selection Guide
Use CaseRecommendedWhy
General tasksopenai/gpt-4oGood balance of capability and cost
Fast classificationopenai/gpt-4o-mini10x cheaper, fast
Deep reasoninganthropic/claude-sonnet-4-20250514Best for code and analysis
Long contextopenrouter/google/gemini-2.5-pro2M token context window
Budget-friendlydeepseek/deepseek-chatStrong capability at low cost
Local/privateollama/llama3No data leaves your machine
Maximum qualityanthropic/claude-opus-4-20250514Best reasoning, highest cost
AIConfig (Python)

The AIConfig class controls all LLM behavior. Set defaults at agent construction time, override per-call.

Core Fields

FieldTypeDefaultDescription
modelstr"gpt-4o"Default model (use provider/model format for LiteLLM)
temperaturefloat?NoneCreativity (0.0-2.0). None = model default
max_tokensint?NoneMaximum response tokens. None = model default
top_pfloat?NoneNucleus sampling (0.0-1.0). None = model default
streambool?NoneEnable streaming. None = model default
response_formatstr"auto""auto", "json", or "text"

API Configuration

FieldTypeDefaultDescription
api_keystr?NoneAPI key (overrides env vars)
api_basestr?NoneCustom API base URL
api_versionstr?NoneAPI version (for Azure)
organizationstr?NoneOrganization ID (for OpenAI)
litellm_paramsdict{}Additional LiteLLM parameters

Multimodal Models

FieldTypeDefaultDescription
vision_modelstr"dall-e-3"Model for image generation
audio_modelstr"tts-1"Model for speech generation
video_modelstr"fal-ai/minimax-video/image-to-video"Model for video generation
image_qualitystr"high""low" or "high"
audio_formatstr"wav"Default audio format
fal_api_keystr?NoneFal.ai API key (or FAL_KEY env var)

Cost Controls

FieldTypeDefaultDescription
max_cost_per_callfloat?NoneMaximum cost per AI call in USD
daily_budgetfloat?NoneDaily budget for AI calls in USD

Rate Limiting

FieldTypeDefaultDescription
enable_rate_limit_retryboolTrueAuto-retry on rate limit errors
rate_limit_max_retriesint5Maximum retry attempts
rate_limit_base_delayfloat0.5Base delay for exponential backoff (seconds)
rate_limit_max_delayfloat30.0Maximum backoff delay (seconds)
rate_limit_jitter_factorfloat0.25Randomization factor (+/- 25%)
rate_limit_circuit_breaker_thresholdint5Consecutive failures before circuit opens
rate_limit_circuit_breaker_timeoutint30Circuit breaker timeout (seconds)

Resilience

FieldTypeDefaultDescription
fallback_modelslist[str][]Models to try if primary fails
timeoutint?NoneCall timeout in seconds
retry_attemptsint?NoneRetry attempts for failed calls
retry_delayfloat1.0Delay between retries (seconds)

Context Management

FieldTypeDefaultDescription
max_input_tokensint?NoneMax input tokens (overrides auto-detection)
preserve_contextboolTruePreserve conversation context
context_windowint10Previous messages to include
auto_inject_memorylist[str][]Memory scopes to auto-inject
AIConfig (TypeScript)

The TypeScript SDK uses the Vercel AI SDK and requires an explicit provider.

FieldTypeDefaultDescription
providerstring"openai""openai", "anthropic", "google", "mistral", "groq", "xai", "deepseek", "cohere", "openrouter", "ollama"
modelstring?"gpt-4o"Model name
embeddingModelstring?NoneEmbedding model
apiKeystring?NoneAPI key
baseUrlstring?NoneCustom base URL
temperaturenumber?NoneCreativity (0.0-2.0)
maxTokensnumber?NoneMaximum response tokens
enableRateLimitRetrybooltrueAuto-retry on rate limits
rateLimitMaxRetriesnumber20Maximum retry attempts
rateLimitBaseDelaynumber1.0Base delay (seconds)
rateLimitMaxDelaynumber300.0Maximum delay (seconds)
rateLimitJitterFactornumber0.25Randomization factor (+/- 25%)
rateLimitCircuitBreakerThresholdnumber10Consecutive failures before circuit opens
rateLimitCircuitBreakerTimeoutnumber300Circuit breaker timeout (seconds)
Config (Go)

The Go SDK uses a simple config struct for OpenAI-compatible APIs.

FieldTypeDefaultDescription
APIKeystringOPENAI_API_KEY envAPI key
BaseURLstringhttps://api.openai.com/v1API endpoint
Modelstring"gpt-4o"Default model
Temperaturefloat640.7Creativity
MaxTokensint4096Maximum tokens
Timeouttime.Duration30sHTTP timeout
SiteURLstring""OpenRouter site URL
SiteNamestring""OpenRouter site name

The Go SDK auto-detects OpenRouter from the OPENROUTER_API_KEY environment variable.

Environment Variables

Set API keys via environment variables. The SDK picks them up automatically.

VariableProvider
OPENAI_API_KEYOpenAI
ANTHROPIC_API_KEYAnthropic
GOOGLE_API_KEYGoogle Gemini
MISTRAL_API_KEYMistral
DEEPSEEK_API_KEYDeepSeek
GROQ_API_KEYGroq
XAI_API_KEYxAI
COHERE_API_KEYCohere
OPENROUTER_API_KEYOpenRouter
AZURE_OPENAI_API_KEYAzure OpenAI
FAL_KEYFal.ai (media generation)