DEV Community

correctover
correctover

Posted on

Your Failover Is Lying to You: Why Switching Verifying

Your Failover Is Lying to You: Why Switching ≠ Verifying

You set up failover for your LLM API. Provider A goes down, it switches to Provider B. Problem solved, right?

Wrong.

Here's what actually happens in production:

  1. Provider A returns a 500 → Failover switches to B → B returns a truncated response → Your app serves garbage to users
  2. Provider A rate-limits you → Failover switches to B → B charges 3x more for the same request → Your bill explodes
  3. Provider A returns a response → No error code → Failover stays put → But the response is a hallucinated mess → Your users get wrong answers

Failover switches. It doesn't verify.

The Problem: Failover Only Checks Transport, Not Semantics

Standard failover logic looks like this:

# Typical failover — only checks HTTP status
if response.status_code >= 500:
    switch_to_next_provider()
Enter fullscreen mode Exit fullscreen mode

This catches server crashes. It misses everything else:

  • Truncated responses (200 OK, but incomplete)
  • Schema violations (200 OK, but wrong format)
  • Cost spikes (200 OK, but 10x the price)
  • Drift between providers (200 OK, but semantically different)

A 200 status code is not a contract. It's a suggestion.

Introducing Correctover

Correctover is the correct version of failover.

Because failover switches. Correctover verifies.

It adds a 6-dimension contract validation layer on top of traditional failover:

Dimension What It Checks Example
Status HTTP-level health 5xx, timeouts
Schema Response structure Missing fields, type mismatches
Completeness Response truncation finish_reason !== "stop"
Latency Performance bounds P99 > threshold
Cost Token price anomalies Sudden price spikes
Drift Provider-to-provider variance Same prompt, different semantic output

When any dimension fails, Correctover doesn't just switch — it validates the next provider before committing, ensuring you never fall from one broken provider into another.

How It Works

from correctover import CorrectoverEngine

engine = CorrectoverEngine.create({
    "providers": [
        {"name": "openai", "api_key": "sk-...", "model": "gpt-4o"},
        {"name": "anthropic", "api_key": "sk-ant-...", "model": "claude-sonnet-4-20250514"},
    ],
    "contract": {
        "max_latency_ms": 5000,
        "require_complete_response": True,
        "schema": {"type": "object", "required": ["answer"]},
        "max_cost_per_1k_tokens": 0.03,
    }
})

result = await engine.chat("Explain quantum computing in 3 sentences")
# Every response passes 6-dimension validation before reaching your app
Enter fullscreen mode Exit fullscreen mode

The Numbers That Matter

  • P50 validation overhead: 22µs — less than one network round-trip
  • 333 fault scenarios across 16 failure categories
  • BYOK direct connection — your keys, your providers, no middleman
  • Zero token markup — we never touch, log, or proxy your API calls

Failover vs. Correctover

Failover Correctover
Detects 5xx errors
Detects truncated responses
Detects schema violations
Detects cost spikes
Detects provider drift
Validates before switching
Adds verification overhead 0ms 22µs (P50)

Failover without verification is a seatbelt that only clicks — it never checks if it's actually buckled.

Get Started

pip install correctover
Enter fullscreen mode Exit fullscreen mode
npm install correctover
Enter fullscreen mode Exit fullscreen mode

Correctover — The Correct Version of Failover

Because failover switches. Correctover verifies.

Top comments (0)