Migrating
From the Optimizer — a base_url swap billed on savings — to Shimmy.
What changed
The Optimizer sat in front of your production traffic and searched for cheaper
models while it served it, for a share of what it saved. Shimmy does the search before you ship: in a Tuning Phase, on its own keys, ending in a Report and a shimmy.lock. Production is then yours to run — with Shimmy in the path, or
without it.
| Before | Now |
|---|---|
Point base_url at the Optimizer | wrap() your client with the Shimmy SDK |
| Proxy agent | Workflow (same key, same id) |
| Steps inferred from prompts | Steps named in code |
| Discovery mode, per-agent credit | The Tuning Phase, paid from your Wallet |
| 20% of savings, monthly statement | Prepaid Wallet for Tuning; flat fee for managed Production |
| Free allowance | Dev allowance (your remaining free allowance became it) |
Your keys, Workflows, settled Steps and history are all still there.
Moving over
1. Install the SDK and wrap your client
npm install @rfa-labs/shimmy const shimmy = new Shimmy();
const openai = shimmy.wrap(new OpenAI()); // instead of setting baseURL wrap() points the client at Shimmy and signs it in with your SHIMMY_API_KEY.
Remove your own base_url override. The direct /v1/chat/completions endpoint
still answers, but only the SDK sends the Phase: a call without one keeps the
Optimizer’s old behavior — routed and searched as it served — and is billed like
Dev, from the Dev allowance and then the Wallet.
2. Name your Steps
await shimmy.step('classify', { kind: 'classification' }, () => /* … */); Where the Optimizer inferred a Step from your prompt, Shimmy keys everything on the name. Naming a Step gives it a new identity, so its search starts again in Tuning — usually a few runs. The old, inferred Step stays in the Report with whatever it settled on; once the named one has settled, exclude the old one on the Workflow’s Steps tab.
3. Choose your Phases
SHIMMY_PHASE=dev # local development and CI
SHIMMY_PHASE=tuning # an eval run or staging, until the Report is ready
SHIMMY_PHASE=production # what you ship 4. Choose how to run Production
Start a managed subscription to keep drift
detection and failover, or export shimmy.lock and go passthrough. Managed Production runs on your own
provider keys — store them under Settings → provider keys instead of sending x-provider-key per request.
What doesn’t change
- The wire field. Annotations still ride under
optimizer. OPTIMIZER_API_KEY/OPTIMIZER_BASE_URLstill work;SHIMMY_*wins when both are set.- Your client.
wrap()returns the object you passed; every OpenAI feature keeps working.