Migration

Migrating from LiteLLM to Busbar

If your app already talks to a LiteLLM proxy, it's already speaking OpenAI-shaped HTTP to a base_url. Busbar is OpenAI-compatible on the same routes (/v1/chat/completions, /v1/messages, and more), so for most teams migration is a single line: point your SDK's base_url at Busbar instead of the LiteLLM proxy. Nothing about your request bodies changes. The difference is what sits behind that URL: one static Rust binary you run in your own infrastructure, with a fault-attributed circuit breaker, in-flight failover, and lossless translation across six wire protocols. Every claim about LiteLLM below is cited to their own documentation; every claim about Busbar is ours.

The change

A LiteLLM proxy serves on http://0.0.0.0:4000 by default, and you point an OpenAI client at it [1]. Busbar serves on :8080. So the migration is usually this:

# Before — pointing at a LiteLLM proxy
client = openai.OpenAI(
    api_key="anything",
    base_url="http://0.0.0.0:4000",   # LiteLLM proxy
)

# After — pointing at Busbar
client = openai.OpenAI(
    api_key="unused",                 # or a Busbar virtual key, if governance is on
    base_url="http://localhost:8080", # Busbar
)

The model string in your request stays a name you control — you map it to a provider and model in Busbar's config.yaml, exactly as you mapped it in LiteLLM's model_list. No request body changes, no SDK swap.

Config mapping

ConceptLiteLLMBusbar equivalent
Providers & models model_list entries mapping a public model name to a provider + litellm_params [2] providers + models in config.yaml; the shipped providers.yaml catalog carries protocol, base_url, and error maps [6]
Keys / budgets Virtual keys with max budget, budget duration, TPM/RPM, and parallel-request limits; stored in PostgreSQL via DATABASE_URL [3] Virtual keys minted via POST /api/v1/admin/keys with per-key budgets, RPM/TPM, and pool ACLs; optional embedded SQLite (db_path), no external database [6]
Routing / fallbacks Router with retry-based fallbacks, allowed_fails, and a cooldown_time timer; Redis to share cooldown state across instances [4] Pools with weighted balancing and a fault-attributed breaker; failover happens in-flight, before the first byte, and all state lives in the binary [7]
Observability Bundled admin UI, plus callbacks/logging integrations [2] Prometheus /metrics, OTLP, and a /stats admin snapshot; point the Grafana you already run at it [6]

What you gain by moving

Honest gotchas / what to check

Convert your config.yaml

Paste your whole LiteLLM config.yamlmodel_list, router_settings (including fallbacks), and general_settings — and get a Busbar config.yaml starting point: providers, models, failover pools, and a breaker. It runs entirely in your browser; nothing is sent anywhere. Review the result against the config docs (a custom base_url for a known provider lives in providers.yaml; the shipped catalog already carries protocol + base URL).

Next steps

Build a config to generate your config.yaml from your provider list, read Busbar vs LiteLLM for the full architectural comparison, or get started in five minutes.

References

Facts about LiteLLM checked against docs.litellm.ai on July 18, 2026. If something here is out of date, tell us and we'll fix it.

  1. LiteLLM proxy client usage: default http://0.0.0.0:4000 base URL and OpenAI SDK example.
  2. LiteLLM proxy config: model_list, litellm_params, callbacks, and the admin UI.
  3. LiteLLM virtual keys: budgets, budget duration, TPM/RPM and parallel-request limits, and the PostgreSQL requirement via DATABASE_URL.
  4. LiteLLM routing and fallbacks: retry-based fallbacks, allowed_fails, cooldown_time, and Redis for cross-instance cooldown state.
  5. LiteLLM production guide: Uvicorn workers and PostgreSQL.
  6. Busbar getting started: config.yaml, providers.yaml catalog, virtual keys via the admin API, and observability endpoints.
  7. Busbar circuit breaker: fault attribution, per-lane state, and in-flight failover.