Change the model without touching the app.
Your apps hold no provider key. They send one base URL and one virtual key,
and ask for a tier — standard, heavy, whatever you named it.
llmyard decides which provider and which model answers, screens the content, reserves against
a budget that survives a restart, and records what the call actually cost.
Move a route and every app that asks for that tier moves with it. No deploy, no config file in anybody's repository, no code change.
Fig. 1 · one request, end to end
- Your apps hold no provider keyThey send one base URL and one virtual key.
- Guardrail screen6 classes, off until you give one an action. A block costs nothing.
- Response cacheExact, then semantic. A hit ends here, at $0.00, using no call slot.
- Budget reserveDurable, survives a restart, downroutes at 90% instead of cutting off.
- RouterTier to model, with a failover chain, a breaker per endpoint and a 3.0× price guard.
- Cost meterThe provider's own rate, not an estimate.
- The provideropenai, anthropic, openrouter, or your own key. Real credentials live only here.
- Back to your appA byte-faithful OpenAI response, with the real cost recorded per call.
The change to your application
Two lines, and the rest is policy you set once.client = OpenAI(
base_url="https://llmyard.cc/v1",
api_key=os.environ["LLMYARD_KEY"],
)
r = client.chat.completions.create(
model="standard", # a tier you named, not a model id
messages=[...],
)
Ask for a tier and llmyard resolves it. Change which model answers
standard and every application that asks for it follows, without a deploy and
without a config file in anybody’s repository. Send a concrete
provider/model instead and it passes straight through.
What it refuses to do
The limits, on the page rather than in a support ticket.| Behaviour | When | Result |
|---|---|---|
| Refuse an expensive fallback | A fallback would cost more than 3.0× the first choice | The call fails rather than costing more than you expected |
| Downroute instead of cutting off | Spend passes 90% of the ceiling | Tiers resolve to trivial until the month rolls over |
| Refuse a project with no route | No vendor key of its own, and no platform-pool grant | 400 no models available for route |
| Charge nothing for a blocked call | A guardrail set to block matches | 403 guardrail_blocked, no call slot used |
| Charge nothing for a cache hit | Exact match, or cosine ≥ 0.95 inside the TTL | $0.00, and no call slot used |