Product Use cases Compare Pricing Docs Blog
Read the docs Join the waitlist
compare · litellm

unhardcoded vs LiteLLM.

It comes down to where the routing decision lives. LiteLLM is an open proxy you run, with the routing wired in your config or SDK. unhardcoded keeps the open, self-host property but moves the decision into a policy sent with the call and recorded in a trace.

at a glance

Same open spirit, a different open object.

Both run entirely over your own provider keys, with no third party in the request path. The difference is where the decision lives: in a proxy config you operate, or in a policy the request carries.

unhardcodedLiteLLM
Where the route is decidedSent with the call (policy_ir)Wired in proxy config (YAML)
Provider keys & billingYour keys, your pricingYour keys, your pricing
Choosing a modelCheapest that clears your rulesConfig routing: cost, latency, order
Quality floorEnforced per call, fails loudNo native quality gate
Decision auditReplayable by fingerprintBuilt-in logging, no per-decision replay
Open & self-hostOpen policy_ir, self-host freeOpen proxy, self-host free

Figures and cells throughout this page are illustrative. See the full grid on the compare hub.

where the decision lives

A config you operate, or a policy the request carries.

LiteLLM is the open-source workhorse: one OpenAI-compatible endpoint over your keys, with routing and fallbacks you wire in config. unhardcoded keeps that open, self-host property but moves the route out of config and into a policy sent with the call — so every decision is enforced per request and recorded.

LiteLLM open gateway

You operate the proxy and wire the routing order. The fallback chain is config you maintain, out of band from any single request. To answer "why this model?", you reconstruct it from logs.

unhardcoded open decision language

Your backend sends a policy_ir with the call. The router runs filter → rank → select → fallback against a live catalog, picks the cheapest model that clears your floor, and writes a replayable trace.

trace · req-204815 200 OK
selectedgemini-3.5-flash
reasonscore 0.54 ≥ floor, tools ✓, cheapest survivor
rejecteddeepseek-v4-flash · score 0.42 < floor 0.5
cost$0.018 · ↓71% vs gpt-5.5 baseline · illustrative
policyfingerprint 301140696-1054914287 · sigma-pol/v1

The floor is the catalog field bench_intelligence, surfaced as a 0..1 score — inspect it with GET /x/fields or preview a pick with POST /x/rank before production.

which one fits

When LiteLLM, and when unhardcoded.

They solve adjacent problems. The split is about who operates the routing, and whether you need the decision itself to be auditable.

Choose LiteLLM when

You want an open, self-hosted proxy and are happy to operate it and wire the routing yourself. Owning the request path and configuring fallbacks by hand is the point.

Choose unhardcoded when

You want the decision as a portable, auditable policy — without operating routing infra — and a trace you can replay when someone asks why a model was used. See where that pays off in cut model spend.

use them together

They can sit in the same stack.

This is not either-or. unhardcoded can be the decision layer while you keep an open proxy where it fits — both bring-your-own-keys, so neither stands between you and your providers.

See what's open in unhardcoded — the policy_ir language, encoding, and conformance tests

More side-by-sides on the compare hub · economics on pricing.

Keep the proxy if you like it. Make the decision auditable.

Move the route out of config and into a policy sent with the call — over your own keys, traced every time. Join the waitlist to try it.

No SDK rewriteYour provider keysOpen policy_irEvery run traced