An AI application can be perfectly healthy while its LLM provider is having a bad day.

Your servers are running. Your database is healthy. Your network is functioning. Your application is accepting requests.

And yet users are receiving errors because the model provider returned a 503, exceeded a rate limit, or simply stopped responding within an acceptable time.

This is one of the fundamental reliability problems in production AI systems.

A single-provider architecture looks like this:

Application
     │
     ▼
Provider A
     │
     X
   failure

A multi-provider architecture introduces another path:

Application
     │
     ▼
 AI Gateway
     │
     ▼
 Provider A
     │
     X
   failure
     │
     ▼
 Provider B
     │
     ✓
  response

The mechanism that moves a request from an unhealthy primary provider to an alternative is called LLM provider failover.

It is one of the most important reliability capabilities of an AI gateway.

If you’re new to the architecture, start with our guide to what an AI gateway is. For the broader reasoning behind using multiple providers, see why AI applications shouldn’t depend on one LLM provider. For the routing layer that makes these decisions, see how multi-provider LLM routing works.


What is LLM provider failover?

LLM provider failover is the process of automatically sending a request to an alternative provider when the preferred provider cannot successfully process it.

The simplest implementation looks like this:

Request
   │
   ▼
Provider A
   │
   ├── Success → return response
   │
   └── Failure
         │
         ▼
      Provider B
         │
         └── Success → return response

The application doesn’t necessarily need to know that the request was redirected.

The gateway handles the provider failure internally and returns the successful response to the application.

This is fundamentally different from simply retrying the same API call.


Retry vs failover

These two concepts are often confused.

Retry

A retry sends the request again to the same provider.

Application
     │
     ▼
Provider A
     │
   503
     │
     ▼
Provider A
     │
   200

A retry is useful when the failure is transient.

For example, a provider might temporarily return a server error and succeed a few hundred milliseconds later.

Failover

Failover changes the destination.

Application
     │
     ▼
Provider A
     │
   503
     │
     ▼
Provider B
     │
   200

The assumption is that Provider A may remain unavailable, so repeatedly hitting it isn’t useful.

A production AI gateway can use both:

Provider A
    │
    ├── transient failure
    │       │
    │       └── retry
    │
    └── persistent failure
            │
            ▼
        Provider B

The correct policy depends on the type of failure.


Why provider failover matters

The underlying reason is simple:

An external AI provider is an external dependency.

Your application doesn’t control its:

  • infrastructure
  • capacity
  • regional availability
  • rate limits
  • deployments
  • network paths
  • model availability
  • incident response

If your application has only one path to an AI provider, that provider becomes a single point of failure.

This is particularly important as AI becomes a critical component of production applications.

A provider outage can mean:

  • a chatbot stops responding
  • an AI coding assistant becomes unavailable
  • an agent workflow gets stuck
  • an automated support system stops processing requests
  • an AI-powered SaaS feature starts returning errors

Recent AI gateway architectures increasingly treat failover, retries, health-aware routing, and circuit breakers as separate but complementary reliability mechanisms.


What can trigger failover?

A gateway should not fail over blindly on every error.

Some errors indicate that the provider is temporarily unavailable.

Others indicate that the request itself is invalid and will fail regardless of which provider receives it.

Common failover candidates include:

HTTP 500

Internal provider error.

HTTP 502

Bad gateway or upstream failure.

HTTP 503

Service unavailable.

HTTP 504

Gateway timeout.

Connection failure

The gateway cannot establish a connection to the provider.

Request timeout

The provider doesn’t respond within the configured timeout.

Rate limiting

A 429 response may indicate that the current provider or API key has reached a limit.

Whether a 429 should trigger immediate failover depends on the provider’s rate-limit semantics and the application’s policy.

Some gateway implementations explicitly use server-side errors and connection failures as retry/fallback triggers, while others add configurable handling for rate limits and quotas.


What should not trigger failover?

This is equally important.

Consider:

HTTP 400
Invalid request

Sending the same malformed request to another provider is unlikely to solve anything.

Similarly:

HTTP 401
Invalid authentication

If the gateway is using the same invalid credential against another endpoint, blindly retrying may simply create more failures.

Other examples include:

  • malformed requests
  • invalid parameters
  • unsupported operations
  • invalid model configuration
  • application-level validation errors

A good failover system therefore needs an error classification policy.

Conceptually:

                 Provider response
                        │
                        ▼
                  Error classifier
                        │
          ┌─────────────┼─────────────┐
          ▼             ▼             ▼
       Retryable      Failover      Non-retryable
          │             │             │
          ▼             ▼             ▼
        Retry       Next provider    Return error

This prevents failover from becoming an expensive form of blind retrying.


The basic failover chain

The simplest production configuration is an ordered provider chain:

Primary
   │
   ▼
OpenAI
   │
   ▼ failure
Anthropic
   │
   ▼ failure
Gemini

The gateway attempts the first provider.

If the failure qualifies for failover, it moves to the next provider.

For example:

Request
   │
   ▼
OpenAI
   │
   └── 503
        │
        ▼
    Anthropic
        │
        └── 200
             │
             ▼
          Response

This can be configured at several levels.


Provider-level failover

Provider-level failover changes the provider while preserving the requested model semantics where possible.

Requested model
      │
      ▼
Provider A
      │
      X
      │
      ▼
Provider B

This is useful when the same or compatible model capability is available through multiple providers.


Model-level fallback

Sometimes the requested model itself isn’t available.

The gateway can instead fall back to another model.

For example:

Primary:
Model A

Fallback:
Model B

Emergency:
Model C

The flow becomes:

Request
   │
   ▼
Model A
   │
   X
   │
   ▼
Model B
   │
   ✓

This introduces a critical product decision:

How much model behavior are you willing to trade for availability?

A fallback model may be cheaper or more available but produce different output quality.

Therefore, model fallback should normally be an explicit policy rather than an automatic assumption.


Provider failover and model routing are related

Failover is a special case of routing.

Normal routing asks:

Which provider should receive this request?

Failover asks:

Which provider should receive this request after the preferred provider failed?

The two systems therefore work together.

                   Request
                      │
                      ▼
                  Router
                      │
                preferred
                      │
                      ▼
                  Provider A
                      │
                    fail
                      │
                      ▼
                 Failover
                      │
                      ▼
                  Provider B

Our previous article, How Multi-Provider LLM Routing Works, goes deeper into priority, weighted, cost, latency, and health-based routing.

Failover is what happens when the normal routing decision can no longer successfully serve the request.


Why circuit breakers matter

Imagine Provider A is completely down.

Without a circuit breaker:

Request 1 → Provider A → 503
Request 2 → Provider A → 503
Request 3 → Provider A → 503
Request 4 → Provider A → 503
Request 5 → Provider A → 503
...

Every request wastes time contacting the same unhealthy dependency.

A circuit breaker changes the behavior.

Provider A
    │
    ├── failure
    ├── failure
    ├── failure
    └── failure
          │
          ▼
      Circuit OPEN
          │
          ▼
      Skip provider

The router can immediately select another healthy provider.

Circuit breakers therefore reduce both:

  • unnecessary upstream traffic
  • latency caused by repeatedly waiting for an unhealthy provider

Modern gateway implementations commonly combine failover with circuit-breaking or cooldown mechanisms so an unhealthy provider is temporarily removed from the routing pool.


The three states of a circuit breaker

A typical circuit breaker has three states.

Closed

The provider is healthy.

Requests flow normally.

Router → Provider

Open

The provider has crossed a failure threshold.

Requests are blocked.

Router ─X→ Provider

Traffic is redirected elsewhere.

Half-open

After a cooldown period, the gateway tests the provider.

             cooldown
OPEN ──────────────────► HALF-OPEN
                           │
                     ┌─────┴─────┐
                     ▼           ▼
                  success      failure
                     │           │
                     ▼           ▼
                  CLOSED       OPEN

This allows the provider to recover without requiring manual intervention.


Choosing a failure threshold

A circuit breaker needs a definition of “unhealthy.”

A simple implementation might open after:

5 consecutive failures

But consecutive failures aren’t always enough.

Consider a high-volume provider receiving 10,000 requests per second.

Five failures might be statistically insignificant.

Another system may receive only 20 requests per minute, where five failures are a major signal.

More sophisticated systems can use:

  • failure percentage
  • rolling windows
  • minimum request counts
  • consecutive failures
  • error types
  • latency thresholds

For example:

Open circuit when:

requests >= 20
AND
failure rate > 50%

The correct threshold depends on traffic patterns and reliability requirements.


Cooldowns and recovery

Opening a circuit isn’t enough.

The system also needs to determine when the provider should be tested again.

A simple strategy is:

Circuit opens
     │
     ▼
30-second cooldown
     │
     ▼
Probe provider
     │
     ├── success → close circuit
     │
     └── failure → extend cooldown

Some systems use progressively longer cooldowns after repeated failures.

This prevents a persistently unhealthy provider from consuming excessive resources while still allowing automatic recovery.


What happens during streaming?

Streaming makes failover considerably harder.

Consider a streaming response:

Request
   │
   ▼
Provider A
   │
   ├── token
   ├── token
   ├── token
   ├── token
   └── connection lost

At this point, the application has already received part of the response.

Simply restarting the request against Provider B can produce:

Partial response from A
+
New response from B

The results may not combine cleanly.

This is one of the hardest cases in LLM failover.

A gateway needs to decide whether it can safely:

  • retry the request
  • restart generation
  • resume generation
  • continue from partial output
  • return the partial response
  • report the failure

Streaming failover therefore requires considerably more careful semantics than ordinary request/response failover.


The idempotency problem

Retries and failover can also create duplicate side effects.

This matters particularly for AI agents.

Imagine an agent invokes a tool:

LLM
 │
 ▼
create_invoice()
 │
 ▼
Invoice created

The provider connection fails before the gateway receives the final response.

If the gateway blindly retries:

Retry
  │
  ▼
create_invoice()
  │
  ▼
Invoice created AGAIN

The user may now have two invoices.

The LLM request itself may be safe to repeat, but the tools invoked by the model may not be.

Therefore, production failover needs to consider:

  • idempotency keys
  • tool execution state
  • external side effects
  • transaction boundaries
  • agent state

This is particularly important for agentic AI systems.


Failover across independent failure domains

Not all provider redundancy provides the same level of resilience.

Consider:

Provider A
Provider A backup
Provider A backup #2

If all three endpoints depend on the same underlying infrastructure, the redundancy may be weaker than it appears.

A stronger architecture might distribute dependencies across:

Provider A
     │
     └── Region US

Provider B
     │
     └── Region EU

Provider C
     │
     └── Region APAC

The goal is to reduce correlated failures.

This becomes especially important for applications with strict availability requirements.


Health-aware failover

Static failover chains are useful:

A → B → C

But they don’t tell you whether B is currently healthy.

A health-aware gateway maintains routing state:

Provider A
Healthy

Provider B
Unhealthy

Provider C
Healthy

The failover decision then becomes:

A fails
 │
 ▼
Is B healthy?
 │
 ├── No
 │    │
 │    ▼
 │   C
 │
 └── Yes
      │
      ▼
      B

This prevents the gateway from failing over directly into another failure.

Health can be derived from:

  • recent request outcomes
  • latency
  • rate-limit responses
  • active health checks
  • circuit-breaker state

Failover should be observable

Automatic failover is valuable only if operators can understand what happened.

A useful request trace might show:

Request ID: req_123

19:42:10.001
Selected: Provider A

19:42:11.204
Provider A → HTTP 503

19:42:11.205
Circuit threshold updated

19:42:11.206
Selected: Provider B

19:42:11.531
Provider B → HTTP 200

19:42:11.532
Response returned

This allows engineers to distinguish:

Application failure

from:

Provider failure successfully absorbed by gateway

That distinction is essential for production operations.

Useful metrics include:

  • failover count
  • failover rate
  • provider failure rate
  • circuit-open events
  • recovery events
  • fallback success rate
  • fallback latency
  • requests per provider

Measuring failover effectiveness

A gateway should not simply report:

Provider A failed 1,000 times.

The more useful question is:

How many user-visible failures did failover prevent?

For example:

Total requests:             1,000,000

Primary failures:              8,000

Successful failovers:          7,650

User-visible failures:           350

That means the failover mechanism recovered the majority of primary-provider failures.

This is a much more meaningful reliability metric.

You can calculate:

Failover recovery rate =
successful failovers / eligible failures

In this example:

7,650 / 8,000 = 95.6%

The exact metric definitions should be carefully documented because not every provider error is necessarily eligible for failover.


A complete failover architecture

Putting the pieces together:

                         AI Application
                                │
                                ▼
                         Authentication
                                │
                                ▼
                           AI Gateway
                                │
                                ▼
                             Router
                                │
                    ┌───────────┴───────────┐
                    │                       │
               Routing state           Policy engine
                    │
                    ▼
               Provider A
                    │
              ┌─────┴─────┐
              │            │
           success       failure
              │            │
              ▼            ▼
           response     Classifier
                           │
                    ┌──────┴──────┐
                    │             │
                retryable    non-retryable
                    │             │
                    ▼             ▼
                 Failover      return error
                    │
                    ▼
               Circuit state
                    │
                    ▼
               Provider B
                    │
                    ▼
                 response

The gateway is effectively coordinating several systems:

  1. routing
  2. error classification
  3. retries
  4. failover
  5. circuit breaking
  6. health tracking
  7. observability

This is why production failover is more complicated than adding a second API endpoint.


A practical failover policy

A reasonable starting policy might look like:

Provider selection:
    Priority + health

Retry:
    transient network errors
    selected 5xx responses

Failover:
    persistent 5xx
    timeout
    connection failure
    configured 429 responses

No failover:
    invalid request
    invalid parameters
    unsupported operation

Circuit breaker:
    rolling failure threshold

Recovery:
    cooldown + half-open probe

The exact configuration should be determined by the workload.

A customer-facing conversational application may prioritize latency.

A financial workflow may prioritize correctness and avoid aggressive retries.

A batch workload may tolerate longer failover chains.


Failover is not a substitute for good provider selection

Failover should be the safety net, not the primary routing strategy.

A better architecture is:

              Normal traffic
                   │
                   ▼
              Smart routing
                   │
                   ▼
             Healthy provider
                   │
                failure
                   │
                   ▼
                Failover
                   │
                   ▼
             Backup provider

The router should already prefer healthy providers.

Failover handles the cases where the selected provider becomes unhealthy after the routing decision.

This distinction keeps the normal path efficient while preserving resilience.


AI gateway failover vs application-level failover

One option is to implement failover separately inside every application.

Application A
 ├── Provider A
 ├── Provider B
 └── failover logic

Application B
 ├── Provider A
 ├── Provider B
 └── failover logic

Application C
 ├── Provider A
 ├── Provider B
 └── failover logic

This creates duplicated infrastructure logic.

A gateway centralizes it:

Application A ─┐
Application B ─┼──► AI Gateway ──► Providers
Application C ─┘

Now one reliability policy can be applied consistently across applications.

This is one of the central architectural arguments for using an AI gateway.


The SaaS perspective

For teams using AI as infrastructure rather than building infrastructure themselves, the gateway can turn failover from an engineering project into a managed capability.

Instead of every engineering team implementing:

retry logic
+
provider adapters
+
health checks
+
circuit breakers
+
fallback policies
+
provider metrics

the AI gateway can provide these centrally.

The application simply sends requests through a stable interface.

Application
     │
     ▼
Managed AI Gateway
     │
     ├── routing
     ├── failover
     ├── health
     ├── observability
     └── cost controls
            │
            ▼
       AI providers

This is particularly attractive when an organization has multiple AI applications or when AI availability is part of the product’s customer-facing SLA.


What good failover looks like

The best failover is invisible to the end user.

Ideally:

Provider A fails
       │
       ▼
Gateway detects failure
       │
       ▼
Provider B selected
       │
       ▼
Response returned
       │
       ▼
User sees normal response

Meanwhile, operators can see:

Provider A
↓
503 spike
↓
circuit opened
↓
traffic shifted
↓
Provider B serving
↓
Provider A recovered
↓
traffic restored

This is the goal of production AI reliability:

the infrastructure absorbs provider failures instead of passing them directly to users.


Conclusion

LLM provider failover is the mechanism that allows an AI application to continue operating when its preferred model provider cannot successfully serve a request.

A production implementation needs more than a list of backup providers.

It needs to understand:

  • which errors are retryable
  • which failures should trigger failover
  • when to stop retrying
  • how to detect unhealthy providers
  • when to open a circuit
  • how long to wait before recovery
  • whether streaming responses can be safely retried
  • whether model fallback is acceptable
  • how to preserve request semantics
  • how to observe and measure failover

The basic architecture is:

Request
   │
   ▼
Router
   │
   ▼
Primary Provider
   │
   ├── success ──────────────► Response
   │
   └── failure
         │
         ▼
     Classify error
         │
         ▼
     Retry / Failover
         │
         ▼
     Healthy Provider
         │
         ▼
       Response

The broader principle is straightforward:

If an AI provider is an external dependency, provider failure should be treated as an expected infrastructure condition—not an exceptional application failure.

That is the role of an AI gateway’s reliability layer.

Updated: