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.

BeforeNow
Point base_url at the Optimizerwrap() your client with the Shimmy SDK
Proxy agentWorkflow (same key, same id)
Steps inferred from promptsSteps named in code
Discovery mode, per-agent creditThe Tuning Phase, paid from your Wallet
20% of savings, monthly statementPrepaid Wallet for Tuning; flat fee for managed Production
Free allowanceDev 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

bash
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_URL still work; SHIMMY_* wins when both are set.
  • Your client. wrap() returns the object you passed; every OpenAI feature keeps working.