Two ways to call an LLM
There are two honest ways to reach a model API: call the provider directly with their SDK and their key, or route the request through a gateway that sits in front of many providers behind one contract. Neither is wrong — they trade off differently depending on how many providers you actually use and what you need beyond a single request-response.
Direct calls are simpler when you only ever use one provider. A gateway earns its keep once you're juggling more than one — different SDKs, different keys, different dashboards for cost and latency.
Direct vs. gateway, side by side
| Dimension | Direct to each provider | Through one gateway |
|---|---|---|
| Auth | One API key per provider, managed separately | One key (sk-ar-v1-…) for every provider |
| SDKs | Each provider's own SDK and request dialect | One OpenAI-compatible endpoint (plus /messages and /responses) |
| Failover | You write retry/fallback logic yourself, per SDK | Automatic failover to a healthy upstream is built into routing |
| Billing | A separate invoice and balance per provider account | One balance across providers — or $0-markup BYOK on keys you already pay for |
| Audit log | Scattered across each provider's own dashboard, if one exists | One per-request log — cost, latency, tokens — across every provider |
| Switching cost | Re-integrate a new SDK, auth scheme, and error handling | Edit a provider/model id string; same key, same endpoint |
What you keep either way
The comparison above only holds if the gateway doesn't trade one lock-in for another. AnyRouter's contract is the standard OpenAI-compatible surface, so the client code you write is the same code you'd write calling a provider directly — just pointed at one URL instead of many:
from openai import OpenAI
client = OpenAI(
base_url="https://anyrouter.dev/api/v1",
api_key="sk-ar-v1-...",
)
resp = client.chat.completions.create(
model="openai/gpt-5.5", # or anthropic/claude-opus-4-8, google/gemini-2.5-pro
messages=[{"role": "user", "content": "Hello"}],
)Nothing about that call is proprietary to AnyRouter — the same client library talks to any OpenAI-compatible endpoint, including the provider's own.
When calling direct still makes sense
If a project talks to exactly one provider and never needs failover, a per-provider audit log, or a shared balance across models, calling that provider directly is simpler — one fewer hop, one fewer account to reason about. The gateway earns its complexity back the moment a second provider, a fallback path, or a single cost view across models enters the picture.

Keep calling providers directly, or route them through one key and one audit log.
Get a key freeRoute your first request in 2 minutes
Start free with your own keys, or top up and pay per token. Get $4/mo in credits and free models on Go — $2/mo, or free when you donate a provider key.
Start free