Policy-enforced model lanes for omp: route a session through $0-only or zero-data-retention models, per project, with size tiers.
The guarantee is not a convention. Every request carries OpenRouter provider-routing preferences, so a request that cannot satisfy the lane fails at the router instead of quietly falling back to a model that logs your prompts or bills your card.
| Lane | provider sent with every request |
Meaning |
|---|---|---|
free |
max_price: {prompt: 0, completion: 0} |
$0 or the request fails. Prompts may be logged/trained on. |
free-zdr |
+ zdr: true, data_collection: deny |
$0 and no prompt retention. |
zdr |
zdr: true, data_collection: deny, sort: price |
No prompt retention, free-first, then the cheapest ZDR endpoints. |
Membership is derived from live data — /api/v1/models for pricing and capabilities,
/api/v1/endpoints/zdr for the authoritative ZDR endpoint list — never hardcoded.
Free :free variants are additionally probed against their own endpoints feed, because
the model list keeps advertising retired ones.
Expect free-zdr to be small: free and contractually non-retaining is rare (one
tool-capable text model at the time of writing). zdr is the practical everyday lane —
same privacy guarantee, ~$0.07/Mtok, two dozen models.
Each lane member is tagged small / medium / large from two independent signals —
parameter count parsed from the model id, and a curated capability tier — taking whichever
says "more capable".
Tiers are selectable three ways:
omp --model zdr-small # the [lane-size] name tag is a fuzzy selector
/lane zdr large # in-session switch
Ctrl+P # cycles smol -> default -> slow == small -> medium -> largeRoles map to tiers: plan/slow = large, default/task = medium,
smol/commit/tiny/advisor = small.
omp plugin link . # not published to npm; link the checkout
ln -sf "$PWD/src/cli.ts" ~/.bun/bin/omp-lane
omp-lane refresh # fetch live data, write configrefresh writes:
~/.omp/agent/models.yml— a managed block ofproviders.openrouter.modelOverridesgiving each lane member its[lane-size]name tag and its policy. This is what makesomp --model zdr-smallwork from a cold start, before any session exists.~/.omp/overlays/{free,free-zdr,zdr}.yml— role wiring, fallback chains, and a hardenabledModelsallow-list, foromp --config.~/.omp/cache/omp-lane.json— the lane data the extension reads (24 h TTL).
omp-lane run zdr # session in the zdr lane (overlay + --lane)
omp --lane zdr # lane without the overlay's allow-list
OMP_LANE=zdr omp # same, via env
omp-lane pin zdr ~/sites/project # writes <dir>/.omp/lane; every session there is in-lane
omp-lane ls zdr # lane membership from cacheIn session:
/lane status: lane, tier, model, policy, data age
/lane zdr small switch lane and/or tier
/lane list [lane] membership with tiers and prices
/lane pin [lane] pin the current directory
/lane refresh refetch live data
/lane off disable for this session
Lane resolution, highest precedence first: --lane flag, /lane, OMP_LANE,
<cwd>/.omp/lane, ~/.omp/lane.
before_provider_requestmerges the lane policy into the OpenRouter request body. This covers any OpenRouter model, including ones the catalog gained after the last refresh — the models.yml overrides are for cold-start selection, not for the guarantee.- An explicitly chosen model is respected when it can honor the lane (any OpenRouter model,
or a local engine where nothing leaves the machine). A model that cannot — Anthropic,
Cursor, Copilot — is switched back to the lane at
turn_start, with a warning. - Local engines (
lm-studio,llama.cpp,ollama) are the tail of every fallback chain: free, and private by construction.
$ omp --model openrouter/deepseek/deepseek-v4-flash -p 'say OK'
OK
$ OMP_LANE=free omp --model openrouter/deepseek/deepseek-v4-flash -p 'say OK'
404 No endpoints found that satisfy the max price for this request
Same model, same config; the only difference is the lane. The zdr lane produces the
analogous 404 No endpoints available matching your guardrail restrictions and data policy
when a model has no zero-retention endpoint.
src/lanes.ts lane definitions, live OpenRouter data, tiering, caching
src/extension.ts request-time enforcement, /lane command, model switching
src/cli.ts refresh / ls / run / pin — the static config half