What actually changes
That is the whole migration for most codebases. Your SDK, your request shapes, your
streaming code, your retry logic and your tool definitions all stay exactly as they are.
You can leave the model ids alone at first
A finite list of stock ids that SDKs commonly ship hard-coded —gpt-4o,
claude-sonnet-4-5, o3, codex and others — resolve to catalog models, so an app you
have not fully audited keeps working the moment you flip the base URL.
Treat that as a bridge, not a destination. Move to catalog ids before you depend on
specific behavior: the compatibility mapping points at whichever model is the right landing
spot today, and it can move. See Model routing.
Find what you're actually sending
Check these five things
1
Model capabilities
Vision, documents, tools and structured output are per-model. Read
capabilities and supported_parameters off
GET /v1/models for the ids you plan to use — a capability the
model cannot guarantee is a 422, not a silent downgrade.2
Output ceilings on reasoning models
Hidden reasoning counts against
max_tokens. A ceiling tuned for a non-reasoning model
can be consumed entirely by thinking. See Reasoning.3
Rate limits and concurrency
Published per plan on Plans & limits. If you are moving a fleet, size against
the concurrency figure, not just requests/min — that is the axis parallel agents
hit first.
4
Your retry logic
429 carries retry-after; 5xx is transient and worth retrying with backoff; other
4xx never are. If you hand-rolled an HTTP client, check it honors retry-after — the
official SDKs already do. See Errors.5
Response headers
Usage and limit state ride on
x-sideren-* and x-ratelimit-* headers. If you had dashboards
reading a previous provider’s headers, repoint them. See Headers.Things that behave differently
- Usage is in credits. Every plan gives you credits. A request takes the credits for the model that served it, and higher plans add models. The dashboard shows what each request used. Plans & limits
- Saturation waits instead of failing. A request that would have been shed under load takes a place in line, so allow headroom in client timeouts. Reliability
- Model ids are not versioned in the URL. Models are added and retired without an API version bump. Pin ids, and read the catalog at runtime if you need to know what exists.
- Prompt caching depends on the model. Where a model caches input, repeated context uses fewer credits; where it does not, it counts as ordinary input. Prompt caching
Cut over safely
1
Run both in parallel
Point a copy of your service at the gateway with a separate key, replay real traffic
shapes through it, and diff the outputs you care about.
2
Start on a low-stakes path
Move background jobs, summarization, or an internal tool first. Keep the user-facing
path on the old provider until the numbers agree.
3
Watch the monthly usage header
x-sideren-monthly-used-percent is how much of this month’s credits you have used.
Alert on it before it reaches 100: past that, new requests
stop with a 402 until the cycle renews, unless you
upgrade or switch to purchased credit.4
Then flip the base URL
One environment variable, no code change — which also makes the rollback one
environment variable.
Coding agents
If what you are migrating is a coding agent rather than an app, skip all of the above:npx sideren unset reverses it from timestamped backups. See the
setup helper.