Point your client at the proxy
Set the base URL of your OpenAI or Anthropic SDK to the proxy. Your API keys pass straight through.
// jev-swap shadow proxy
A local proxy between your app and OpenAI or Anthropic. Every request is forwarded unchanged; decision calls are also sent to Jev in parallel, and a live dashboard shows how the two compare on your real traffic.
Runs on your machine. Your traffic never goes anywhere it doesn't already go, plus Jev.
// how it works
Set the base URL of your OpenAI or Anthropic SDK to the proxy. Your API keys pass straight through.
Every request goes to your provider unchanged and your app gets its response. Requests that match a scanned decision call are also sent to Jev, in parallel.
Once a call has enough mirrored samples and a confidence threshold meets your accuracy target, apply that threshold to the generated Jev module in one click.
// the live dashboard
proxy-samples.jsonl in the format jev-swap shadow reads.// run it
$ npx jev-swap scan ./your-app # find the decision calls to mirror $ npx jev-swap convert $ npx jev-swap proxy --llm-price-in 2 --llm-price-out 10 # point your app at it; API keys pass through untouched OPENAI_BASE_URL=http://localhost:8787/openai/v1 ANTHROPIC_BASE_URL=http://localhost:8787/anthropic
The proxy runs locally on port 8787 (change it with --port) and serves its dashboard at http://localhost:8787/. Mirroring to Jev needs a TypeSafe API key in TYPESAFE_API_KEY.
No. Every request is forwarded to your provider unchanged and your app gets the provider's response. Jev only sees a copy of the decision calls, in parallel.
Ones that match a call from jev-swap scan, by output schema, enum values or yes/no prompt text. Two calls with identical schemas or prompts both match the first one scanned.
Streaming requests are forwarded but not mirrored.
The last user message as its state, plus the typed questions for that call.
No. proxy-samples.jsonl contains your users' inputs: keep it out of version control.