Blog

One API Key for DeepSeek, Gemini, Claude and GPT in Your Product: An OpenAI-Compatible LLM Router Setup (2026)

Short answer

If your product calls more than one model, you don't need a separate account, SDK, key and bill for each vendor. Point the official OpenAI SDK at one OpenAI-compatible gateway and pick the model per request by name:

  • One client, one key: base_url="https://api.teamorouter.com/v1" and a TeamoRouter key. DeepSeek, Gemini, Claude and GPT models all answer on /v1/chat/completions.
  • Route by task: cheap high-volume work to deepseek-flash, long documents and images to Gemini, code to Claude, general reasoning to GPT. Changing models is a string, not a new integration.
  • One balance: prepaid from $5, billed per token, no subscription. Pay by card or with USDT, USDC or ETH.

New accounts start with a $0 balance — top up before your first request. Top up from $5. If a request returns 402 (400 on the OpenAI format) with "wallet balance is insufficient", your balance is empty — your base URL and key are fine. Top up and retry.

Get one API key for every model

Why one OpenAI-compatible endpoint

Wiring each vendor directly means a DeepSeek account, a Google Cloud project, an Anthropic Console organization and an OpenAI organization — each with its own SDK, key rotation, rate limits, invoices and, in some countries, region checks. For a small team shipping a product, that's four integrations to maintain before you've compared a single answer.

With one OpenAI-compatible endpoint:

  • Your code uses one client library and one request shape.
  • Trying a different model is a config change you can A/B test.
  • Spend for every model lands in one balance, with usage you can split by key.

If you're still choosing a gateway, see the LLM gateway selection guide. This article is about wiring several models into your own product.

Which model for which task

Official prices per million tokens, from each vendor's pricing page:

Task Model ID Why Official price (input / output)
High-volume, cheap: classification, extraction, short chat deepseek-flash Lowest cost per token $0.15 / $0.60 off-peak, $0.30 / $1.20 peak (DeepSeek)
Long documents, screenshots, mixed text and images gemini-3.8-flash Fast Flash model with multimodal input $0.75 / $3.75 through December 31, 2026 (Google)
Harder long-context analysis gemini-3.1-pro-preview Gemini Pro tier $2.00 / $12.00 for prompts up to 200K tokens (Google)
Code generation, code review, agents claude-sonnet-5-5 Strong at code and tool use $2 / $10 (Anthropic)
The hardest coding tasks claude-opus-5-5 Anthropic's top generally available Opus $4 / $20
General reasoning and writing gpt-6.1-sol Close to GPT-6 Astra at lower cost $2 / $10 (OpenAI)

DeepSeek's peak hours are 01:00–04:00 and 06:00–10:00 UTC on weekdays; batch jobs scheduled outside them cost half. TeamoRouter's current prices for all of these are on the pricing page and each model page.

Python: one client, models by task

python
import os
from openai import OpenAI

client = OpenAI(base_url="https://api.teamorouter.com/v1", api_key=os.environ["TEAMO_API_KEY"])

MODELS = {
    "bulk": "deepseek-flash",
    "long_context": "gemini-3.8-flash",
    "code": "claude-sonnet-5-5",
    "reasoning": "gpt-6.1-sol",
}

def ask(task: str, prompt: str) -> str:
    response = client.chat.completions.create(
        model=MODELS[task],
        messages=[{"role": "user", "content": prompt}],
        max_tokens=1024,
    )
    return response.choices[0].message.content

print(ask("bulk", "Classify this ticket as billing, bug or feature request: 'I was charged twice.'"))
print(ask("code", "Write a Python function that retries an HTTP call with exponential backoff."))

A simple fallback. If one model is unavailable or slow for a moment, retry on another:

python
from openai import APIError

def ask_with_fallback(prompt: str, models=("claude-sonnet-5-5", "gpt-6.1-sol")) -> str:
    last_error = None
    for model in models:
        try:
            r = client.chat.completions.create(model=model, messages=[{"role": "user", "content": prompt}], timeout=60)
            return r.choices[0].message.content
        except APIError as e:
            last_error = e
    raise last_error

Node.js: same idea

javascript
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://api.teamorouter.com/v1", apiKey: process.env.TEAMO_API_KEY });

const MODELS = { bulk: "deepseek-flash", longContext: "gemini-3.8-flash", code: "claude-sonnet-5-5", reasoning: "gpt-6.1-sol" };

export async function ask(task, prompt) {
  const r = await client.chat.completions.create({
    model: MODELS[task],
    messages: [{ role: "user", content: prompt }],
    max_tokens: 1024,
  });
  return r.choices[0].message.content;
}

Streaming works the same way: pass stream: true (Node) or stream=True (Python). If part of your stack already speaks Anthropic's or Gemini's native format, the same key works there too; see the API integration guide.

Keys, usage and cost control

  • One key per service or environment. Create separate keys for production, staging and each internal tool in the dashboard. If a key leaks, you revoke one key, not everything.
  • See spend per key. The usage page can be filtered by key, so you can tell which feature or customer is driving cost.
  • Keep model names in config. Read them from environment variables so you can switch a task to a cheaper or stronger model without a redeploy.
  • Cap output. Set max_tokens per task; summaries rarely need 4,000 tokens.

Paying for usage

No subscription and no per-vendor accounts: you top up one balance from $5 and pay only for the tokens you use, by card or with USDT, USDC or ETH from any exchange or wallet (how crypto top-ups work).

FAQ

Do I need accounts with DeepSeek, Google, Anthropic and OpenAI?

No. You call every model with one TeamoRouter key; no vendor accounts or vendor API keys are involved.

Does every model work with the OpenAI SDK?

Yes, through /v1/chat/completions with the model ID as the only difference. GPT models also support the Responses API (/v1/responses).

Can I switch a task to another model without changing code?

Yes, if you read model names from configuration as in the examples. The request and response format stays the same.

How do I keep costs predictable?

Send high-volume work to the cheapest model that's good enough, cap max_tokens, schedule DeepSeek batch jobs off-peak, and watch spend per key in the dashboard.

Related

Ready to connect?Log in · top up · create an API key — three steps to start.