Skip to content

models and routing

Every model, one integration

You should not have to pick one AI vendor and live with it. AetherGrid connects to six providers behind one API, keeps a catalogue of the models each one offers, and lets you change which model serves a feature without changing your code.

providers

Adapters,
not integrations.

Anthropic, OpenAI, Google, Azure OpenAI, Experiential Labs, and any server that speaks the OpenAI format. Connect the ones you use; the rest are simply skipped. Starting with a single provider is normal.

Which providers are connected is up to you, and GET /v1/providers will tell you. Provider credentials stay on the server and are never shown back.
GET /v1/providers6 adapters · one protocolIllustrative data
slugnameadapterconfigured
anthropicAnthropicDirect adaptertrue
openaiOpenAIDirect adaptertrue
googleGoogleDirect adaptertrue
azure-openaiAzure OpenAIDeployment-scoped adapterfalse · routing skips it
experiential-labsExperiential LabsDirect adaptertrue
self-hostedSelf-hostedAny OpenAI-compatible endpointtrue

A provider you have not connected is reported as unconfigured and skipped. Starting with a single provider is normal, not a broken setup.

routing / strategies

Choose by cost, speed,
quality or balance.

Tell AetherGrid what matters for a request and it picks the model. Models it cannot actually call right now are removed first, so you are never routed to a provider you have not connected or one that is down. The response explains the choice in plain words.

explicit
Exactly the model you name. For when the choice is the point.
cost
The cheapest model that can serve the request. Uses list prices, or the cost your own traffic has measured.
latency
The model that has answered fastest for you. Measured from your own requests, not a vendor benchmark.
quality
The highest quality tier, cheapest first within it. Cost only decides between models of the same tier.
balanced
Quality first, then speed and cost together. The default for a new workspace.
routing / candidates7 eligible · 3 eliminatedIllustrative data
modeladapterp50your $/M intierstate
claude-opus-4.6anthropic1420 ms18.004 · frontiersame tier, 1420 ms at $18.00/M
gpt-5.1openai1180 ms1.504 · frontierchosen
claude-sonnet-4.5anthropic940 ms3.603 · balancedeligible
gemini-2.5-progoogle1260 ms1.503 · balancedcircuit breaker open
deepseek-v3.2self-hosted640 ms0.343 · balancedeligible
mistral-large-3self-hosted290 ms0.243 · balancedeligible
claude-haiku-4.5experiential-labs460 ms1.202 · fasteligible
gemini-2.5-flashgoogle520 ms0.362 · fastcircuit breaker open
gpt-5-miniazure-openai610 ms0.302 · fastadapter unconfigured — no credential
llama-3.3-70b-instructself-hosted330 ms0.142 · fasteligible

rules from the project's routing policy: require_tools · min_context_window 128,000 · prices and response times are illustrative

POST /v1/chat/route-preview200
{
  "primary": {
    "slug": "gpt-5.1",
    "provider": "openai"
  },
  "fallbacks": [
    { "slug": "claude-opus-4.6", "provider": "anthropic" }
  ],
  "strategy": "balanced",
  "reason": "highest tier (frontier); then speed and cost together, 1180 ms at $1.50/M",
  "considered": 7,
  "eliminated": [
    { "slug": "gemini-2.5-pro", "reason": "circuit breaker open" },
    { "slug": "gemini-2.5-flash", "reason": "circuit breaker open" },
    { "slug": "gpt-5-mini", "reason": "adapter unconfigured — no credential" }
  ]
}
No provider is called and nothing is spent. Sending the same request for real would cost about $0.005304 at 1,840 tokens in and 212 out, at the illustrative prices shown (provider price plus the service markup).

model registry

A living catalogue,
not a fixed list.

The models you can reach are records you can see, with their context sizes, abilities and what your own traffic has measured about them. When a provider adds a model, it shows up here.

GET /v1/models
Every model available to your project, with its provider, modality, status and price.
GET /v1/models/{slug}
One model in full, including what the router knows about it.
GET /v1/providers
The six adapters and whether each is configured in this deployment.
GET /v1/providers/health
Live adapter state: circuit breaker, consecutive failures, observed success rate.
POST /v1/chat/route-preview
What the router would pick, and why — without calling a provider.
GET /v1/models10 of many · project viewIllustrative data
slugprovider_slugfamilycontext_windowquality_tiertoolsstatus
claude-opus-4.6anthropicClaude200,0004 · frontiertrueavailable
gpt-5.1openaiGPT400,0004 · frontiertrueavailable
claude-sonnet-4.5anthropicClaude200,0003 · balancedtrueavailable
gemini-2.5-progoogleGemini1,000,0003 · balancedtrueprovider breaker open
deepseek-v3.2self-hostedDeepSeek128,0003 · balancedtrueavailable
mistral-large-3self-hostedMistral128,0003 · balancedtrueavailable
claude-haiku-4.5experiential-labsClaude200,0002 · fasttrueavailable
gemini-2.5-flashgoogleGemini1,000,0002 · fasttrueprovider breaker open
gpt-5-miniazure-openaiGPT400,0002 · fasttrueprovider unconfigured
llama-3.3-70b-instructself-hostedLlama128,0002 · fasttrueavailable

Context windows and tiers shown here are illustrative. A quality tier is a ranking you set to order routing preference, not a benchmark result. Your real catalogue is answered by this endpoint.

model usage pricingprovider price + 20%
modelprovideryour price / 1M inyour price / 1M out
claude-opus-5.5Anthropic$4.80$24.00
claude-sonnet-5Anthropic$2.40$12.00
gpt-6-solOpenAI$2.40$12.00
gemini-3.8-flashGoogle$0.90$4.50
claude-haiku-4.5Anthropic$1.20$6.00

AetherGrid charges the provider's own list price for hosted model usage plus a 20% service markup, applied the same way to input and output tokens. These are a few examples; the same rule covers every model in the catalogue, and every request you make shows both the provider cost and the price you pay.

failure handling

When a provider fails,
your app does not.

If a provider starts failing, AetherGrid stops sending it traffic after a few consecutive errors, sends requests to the next best model instead, and checks back later to see whether it has recovered. Your users see an answer, not an outage.

Only genuine provider failures count. A request that was itself malformed says nothing about the provider and does not affect its standing.
providers / healthlive · last hourIllustrative data
adapterconfiguredcircuit_statefailuressuccessprobe
anthropictrueclosed099.8%412 ms
openaitrueclosed099.6%388 ms
googletrueopen541.0%—
experiential-labstrueclosed099.9%296 ms
self-hostedtrueclosed0100.0%61 ms
azure-openaifalse · no credentialclosed0——

A provider that fails several times in a row is marked open and skipped; after a cooldown it is tried again, and a success marks it closed. Only genuine provider failures count, so a request that was itself malformed changes nothing. Skipping an open provider is what stops someone else's outage from becoming your slow day.

Provider health is tracked live, from your own traffic. A provider that is out for everyone is discovered within a few requests, and a recovered one is picked up again automatically.

your catalogue

Your catalogue is yours

Which models you can reach depends on which providers you connect, so the definitive list lives in your workspace rather than on this page. Sign in and open Models, or ask the API.

Both the console and GET /v1/models show the same catalogue, with availability, abilities and what your own requests have measured about each model.

GET /v1/models/{slug}200
{
  "slug":                "<model slug>",
  "provider_slug":       "<adapter>",
  "provider_model_id":   "<id the provider knows>",
  "display_name":        "…",
  "family":              "…",
  "context_window":      <tokens>,
  "max_output_tokens":   <tokens> | null,
  "input_modalities":    ["text", …],
  "supports_streaming":  true | false,
  "supports_tools":      true | false,
  "supports_vision":     true | false,
  "supports_structured_output": true | false,
  "quality_tier":        <your ranking>,
  "observed_success_rate": <measured from your requests> | null,
  "status":              "available" | "preview" | "deprecated" | "retired",
  "is_enabled":          true | false
}

The shape of one model record. The values are your workspace's, so none are printed here.