Start an audit
In-path gateway for AI agents

One endpoint, every model, and a bill that keeps getting smaller.

Point your agents at Operant, one base URL and no code changes. It forwards every call, prices every turn, and then quietly adapts: caches what repeats, drops what is stale, and moves the work it has learned onto cheaper models carrying the right skill.
3
Automatic levers: cache, compression, routing
0
Changes to prompts, tools or SDKs
1
Base URL to change, both wires
OpenAI
Anthropic
Google
OpenAI
Anthropic
Google
OpenAI
Anthropic
Google
OpenAI
Anthropic
Google

One ordered rule list, every routing decision

Route on the attributes your request already carries: plan, priority, and workflow. Escalations hold the frontier model. Free-plan traffic drops a tier, with a failover chain behind it.

curl 'https://app.operantlabs.com/api/routers' \ -H "Authorization: Bearer $STRATA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "displayName": "User-Aware", "routes": [ { "condition": { "cel_expression": "language == \"es\"" }, "route": { "variants": [ { "variant": { "modelId": "openai/gpt-5.2" }, "weight": 100 } ] } }, { "condition": { "cel_expression": "plan == \"free\"" }, "route": { "variants": [ { "variant": { "modelId": "anthropic/claude-haiku-4-5" }, "weight": 100 } ] } } ], "defaultRoute": { "variants": [ { "variant": { "modelId": "anthropic/claude-sonnet-4-6" }, "weight": 100 } ] } }'

Pay for work. Not for waste.

A gateway fee is not where your money goes. A model call costs tokens times price per token. Cache shaping and compression cut the tokens; learned routing cuts the price. They are independent levers, and they multiply. Agents re-send the whole conversation every turn, and a provider will bill that re-used prefix at about 0.1x, but only if the request marks where the prefix ends. Most agents do not. Operant places the cache_control breakpoints itself: after the stable tools and system block, and at the tail of the history. Additive only, so no reordering, no content change, and callers that already set breakpoints are left untouched. Measured, not assumed: the ledger attributes exactly the tokens read from cache because of those breakpoints.

View pricing
Operant
0.1x
billed on the re-used prefix
No breakpoints set
10x on repeats

Route by what the task is, not by what it costs.

Pass plan, priority, or task category as metadata. CEL rules on a named router evaluate in order. The first match wins and picks the smallest model that can do the work. Work that keeps recurring moves to a cheaper model carrying the skill it needs. That rule runs in shadow first, is replayed against the frontier answers, and takes traffic only once the gate passes and you ratify it. Change a rule without a deploy.

  • Your CEL rules and the learned rules sit in the same router, evaluated top-down, first match wins
  • Sticky weighted variants underneath, with the frontier model as the failover on every rule
  • Change routing without a deploy. One click demotes a learned rule back to shadow
Read routing docs
rules, first match wins
metadata.task == "plan"
Claude Opus
metadata.task == "extract"
Claude Haiku
pattern == "compliance-report"
Haiku + skill, gate 100%
default: Claude Sonnet 4.6, failover Opus

Change one line. Keep your entire codebase.

Point your base URL at app.operantlabs.com and swap in an Operant key. Operant speaks the Anthropic and OpenAI wires, so whatever already talks to a model can talk to Operant. Address a router by name, as router/standard, and the gateway chooses the model per turn, with deep, standard and fast seeded on day one. Streaming is preserved. Operant observes only until you turn on a lever.

  • OpenAI SDK: set base_url to https://app.operantlabs.com/v1
  • Anthropic SDK: set ANTHROPIC_BASE_URL to https://app.operantlabs.com
Migration guide
client.py
from openai import OpenAI
client = OpenAI(
base_url="https://api.openai.com/v1"
base_url="https://app.operantlabs.com/v1"
)

A/B test cheaper models on live traffic. No deploys.

Split traffic between the frontier model and a cheaper routed variant. Sticky by user_id, with per-variant failover. The eval gate replays held-out exemplars and picks the winner: 12 of 12 at parity judged by claude-opus-4-8, cost per conversation $0.55 against $0.14, a saving of $0.41 or 75 percent. Ramp it to 100%, or demote in one click.

A/B testing docs
Live split · sticky user_id
claude-sonnet-4-6
50%
claude-haiku-4-5 + skill
50%
$/conv
/
Eval pass
/
Saved
$0.41
/
*Illustrative. Live numbers come from your own ledger.

What it cost. What it would have cost.

Every call through the gateway carries a POTENTIAL / ACTUAL / SAVED decomposition. POTENTIAL is what the work would have cost without Operant, and ACTUAL is what it cost. SAVED is the difference, split by lever. Rolled up, one conversation reads: without Operant it would have cost $2.41; it cost $0.87, which is $1.54 saved, or 64 percent. The assumptions are explicit, so an independent party can recompute them. Spend charts are not proof. Arithmetic is.

  • Every call, every provider, every route, grouped and priced per conversation. One ledger.
  • Counterfactuals are stated estimates: the same tokens, priced at the model the agent asked for
Explore the ledger
Your app
Gateway
Ledger
One ledger entry
{
"model": "router/support-agent",
"potentialUsd": 0.0412,
"actualUsd": 0.0121,
"savedUsd": 0.0291,
"levers": ["routing", "cache"],
"reason": "learned rule · skill v3"
}

Your coding agent. Every model. A smaller bill.

A coding agent session is not one conversation. It is a main thread, a handful of sub-agents, and the sidecar calls the harness makes on its own: title, permission classifier, compaction. Operant captures the whole tree from what the harness already sends, with no wire change. Point one env var at the gateway and Claude Code works as before, call for call: plan steps go up to the deep model, mechanical steps to the fast one, and the rest falls through.

  • Lineage is inferred from the delegated prompt crossing the wire twice, labeled as such, no harness fork needed
  • Across 296 coding sessions an Explore-style sub-agent thread recurs in 71% of them
Explore coding agents
task-family routing
task = plan
claude-opus-4-8
task = classify
claude-haiku-4-5
task = evaluate
claude-haiku-4-5 + mask
default → claude-sonnet-4-6

From support agents to coding agents. One endpoint, every pattern.

Production-ready out of the box

Routing is just the start. Everything a production data path needs is already in the gateway.

Per-call observability

Every call logs the model, the rule that chose it, TTFT, and token cost. It also logs what the call would have cost without Operant.

Queryable cost API

Pull conversations, clusters, cache health, and ledger totals from the gateway JSON API. Send them to your warehouse.

Cache engagement

Operant places the cache_control breakpoints your app never set. Additive only: no reordering, no content change, and callers that already set breakpoints are left untouched.

Shadow, eval gate, ratify

The gate replays held-out exemplars through the candidate and asks a judge model for parity against the answers the frontier model gave. One click demotes a rule back to shadow.

Named routers

Set the model field to a router name such as router/standard. One ordered list holds the CEL rules you write and the rules Cortex learns, evaluated top-down, first match wins.

Full SSE streaming

Server-sent events pass through on every model and every provider. Your client sees the stream it expects.

Bring your own keys

Store your provider keys for each organization, or run the whole gateway in your own VPC. Your keys, your data.

OpenAI + Anthropic SDK compatible

Operant is a drop-in for both SDKs. Change one base URL. The reserved router/default passes bare model ids through byte-identical.

What a gateway does, and what it leaves on the table

Capability
Direct provider APIs
Operant
Gateways and routers
Models reachable
One provider per key
Every model your provider keys already reach
Many, behind one API
Install cost
Rewrite per provider
One base URL, observe-only
One base URL
Cache engagement
Off unless you code it
Placed and measured per call
Varies by vendor
Cache-aware routing
Not applicable
Prices the per-model cache a model switch would forfeit
Varies by vendor
Learned skills
Not applicable
Versioned, with provenance
Varies by vendor
KV-safe compression
Not applicable
Cache-cooperating, on a rule
Varies by vendor
Per-call cost ledger
Provider invoice only
Per call, per lever, stated as estimates
Spend charts
SDK compatibility
Native
OpenAI and Anthropic, byte-identical passthrough
Varies by vendor
Change control
None
Manual and learned; shadow, then gate, then ratify
Varies by vendor
Weights you own
Hosted endpoints only
Phase 4 Proven skills distilled into models served in your VPC
Hosted models only
This column describes gateways, routers and observability tools as a class. Cells in that column are not verified against any one vendor's current documentation. Nothing here is a claim about the current pricing of one vendor.

Gateway fees are not where your money goes

A gateway fee is a rounding error next to the four leaks below it. First, you pay full price for prompt text that repeats, because the cache discount was never turned on. Second, a model switch throws away a warm prefix that is worth more than the switch saves. Third, the same tasks come back, and a frontier model solves them again from the start. Fourth, stale tool output goes out again and gets billed again on every turn. Operant closes all four leaks. It prices each one for you before it changes anything.
What structural waste costs a $60k-per-month bill, and what the levers give back.

Where the money actually leaks

Structural waste (per year) $252KRecovered by the four levers $176K
This example uses a $60k-per-month bill. It assumes 35% structural waste. It assumes the levers that ship today recover 70% of that waste. Both shares are stated assumptions. They are not measured averages. Your two-week audit replaces them with your own numbers, per call.

Every call carries what it cost, what the same work would have cost without Operant, and the difference. A CFO can recompute the arithmetic. It is not a dashboard.

The per-call ledger in the Operant console · demo dataset

FAQ

One line changes. Point your base URL at Operant. This works for OpenAI- and Anthropic-based setups. The core change is updating your base_url and API key, while your existing request structure stays the same.
Router provides access to hundreds of models from leading providers, such as OpenAI, Anthropic, Google, and many more. You can see the full model list here.
You pay your providers directly, at their rates. Operant adds a platform fee sized to your spend. It also takes a capped share of the savings that the ledger verifies. The cap means you keep the large majority. Design partners pay nothing for about six months. In exchange they give a named case study. You can read the current terms here.
Operant adds no limits of its own. The default route of a router carries weighted variants, each with its own failover. So a provider limit falls through to the next variant. Your users do not see it.
A unified endpoint and fallback are table stakes. The difference is what happens to the bill after week one. A gateway moves your traffic. Operant reduces what that traffic costs, and it shows the arithmetic. It clusters the tasks that you repeat. It prices the cache that a model switch would destroy, before it switches. It drafts a skill from your own successful traces, so a cheaper model matches the incumbent. It masks stale tool output, and the cached prefix stays intact. Nothing goes live until it clears an eval gate on held-out traffic and a person ratifies it.

Your prompt, then Operant, then the cheapest model that passed the gate.

The ladder is the product. Your code never changes. It starts with a two-week waste audit: one base URL, observe-only, and your waste report in 48 hours. You can disconnect in a minute.
Copyright © 2026 Operant