Developer tool

Smart Fallback Config Generator

Choose a primary model, backups and what should trigger a switch. Copy the result straight into your app.

Failure triggers

// Generated by Token Terminal — fallback chain (OPENAI_API_KEY, ANTHROPIC_API_KEY)
import OpenAI from "openai";

const TIERS = [
  {
    "provider": "OpenAI",
    "model": "gpt-6.1-terra-pro",
    "baseURL": "https://api.openai.com/v1",
    "apiKeyEnv": "OPENAI_API_KEY"
  },
  {
    "provider": "Anthropic",
    "model": "claude-haiku-5-5",
    "baseURL": "https://api.anthropic.com/v1/",
    "apiKeyEnv": "ANTHROPIC_API_KEY"
  }
];
const TIMEOUT_MS = 15000;
const RETRIES_PER_MODEL = 1;

const clients = TIERS.map((tier) => new OpenAI({ baseURL: tier.baseURL, apiKey: process.env[tier.apiKeyEnv] }));

function shouldFallback(err: any): boolean {
  const status = err?.status ?? err?.response?.status;
  if (status === 429) return true; // rate limited
  if (status >= 500 || err?.code === "ECONNRESET") return true; // provider outage
  if (err?.name === "AbortError" || err?.name === "APIConnectionTimeoutError") return true; // latency timeout
  return false;
}

export async function complete(messages: OpenAI.Chat.ChatCompletionMessageParam[]) {
  let lastErr: unknown;
  for (const [i, tier] of TIERS.entries()) {
    for (let attempt = 0; attempt <= RETRIES_PER_MODEL; attempt++) {
      try {
        const client = clients[i];
        if (!client) throw new Error("Missing client for fallback tier");
        return await client.chat.completions.create({ model: tier.model, messages }, { timeout: TIMEOUT_MS });
      } catch (err) {
        lastErr = err;
        if (!shouldFallback(err)) throw err;
      }
    }
  }
  throw lastErr;
}
Help