Data Processing Addendum
OpenRouter's DPA matches or exceeds the strictest native provider in scope: zero retention for prompts and completions on inference; sub-processor list versioned; SCCs for EU traffic.
Parity verifiedA reference pattern, not a product.
Every LLM provider eventually fails you — a revoked key at 2am, a zero-balance card, a regional outage. Universal Fallback wraps each provider so a single missing key or empty wallet automatically reroutes the request through OpenRouter to a mapped equivalent — or better — model. One pattern. Eighty lines. No dependency on any single vendor.
Toggle a provider into missing-key or zero-balance and watch live traffic reroute through OpenRouter. Click any request in the log to inspect the decision trace.
Three deterministic steps. No magic. Every fallback is logged with a structured decision trace.
Before any network call, llm.mjs verifies the provider's API key exists and runs a cheap balance probe. A missing key or zero balance is not an error — it's a routing signal.
const health = await checkHealth(provider);
// { healthy: false, reason: 'missing-key' }
If healthy, call the provider directly. If the call fails with a retriable error — rate limit, network blip, 5xx — we don't loop; we fall through to OpenRouter. Non-retriable errors propagate as before.
try { return await providerCall(...); }
catch (e) { if (!isRetriable(e)) throw e; }
Each native model has a curated OpenRouter equivalent — same family by default, occasionally a better tier if the native model is deprecated. One call. Same shape in, same shape out.
const orModel = MAP[provider][model].openrouter;
return openrouterGen({ model: orModel, ...rest });
llm.mjsEighty-ish lines of ECMAScript modules. No dependencies. Drop into any Node 20+ project.
Same family when possible. An upgrade tag appears when the curated OpenRouter route is a stronger sibling of a deprecated native model.
| Provider | Native model | OpenRouter route | Tier | Parity |
|---|
Twenty-four scenarios. Every one must pass before the gated deploy unlocks. A single fail blocks the merge.
Adding a fallback route adds a sub-processor. Skipping these checks is how lawyers find you.
OpenRouter's DPA matches or exceeds the strictest native provider in scope: zero retention for prompts and completions on inference; sub-processor list versioned; SCCs for EU traffic.
Parity verifiedNative providers in scope retain prompts for 0–30 days depending on opt-out. The fallback route is configured with X-OpenRouter-No-Logs: true to match the strictest tier — zero retention — uniformly.
Customer-facing sub-processor list updated to include OpenRouter, Inc. as a tier-2 inference router. Notice posted to status page; thirty-day objection window opened per DPA.
Disclosure publishedProduction rollout is feature-flagged behind llm_fallback_universal, ramped 1% → 10% → 50% → 100% across 72 hours. Auto-rollback on a 5xx parity delta > 0.5%.