One URL. Every provider.
Point the base URL at Hopscotch. Anthropic, OpenAI, Google, and the rest of the catalog answer on it. Keep the client you already have.
Nothing is translated away.
Everything your client can already do keeps working. You name the model. Headers name which upstream answered.
Streaming
Server-sent events in the shape your client already parses. The first content token is also the point after which we stop rerouting.
Tools
Tool and function calls go out as written and come back as written. We do not rewrite arguments to suit an upstream.
Effort
Models that take a reasoning effort take it here, low through max, on the same parameter for every vendor that supports one.
Structured output
Schema-constrained responses pass through to the provider that enforces them, and the response comes back on the same envelope.
Aliases
A short slug points at the current version. Name the exact one instead and you are pinned until you say otherwise.
Errors
One error shape, ours. You never have to special-case an upstream's code to find out what went wrong.
Test against the live endpoint, not a sandbox.
The playground signs with your key, draws on your balance, obeys your caps, and lands in your requests log like anything else. An answer you accept here is an answer you can expect from your own code, because it came back through the same gateway on the same terms.
Nothing in it is a playground-only convenience: every control maps to a parameter you would send yourself, which is what makes the result worth trusting. What it saves you is the round trip through your own code to find out whether a model answers the way you hoped.
▍System prompt
The instruction that ships with every message. Edit it here and watch the shape of the answer move before it is anywhere near your codebase.
Max output tokens
The ceiling on the reply, which is also the ceiling on what the reply can cost you.
Temperature
Set it where the work needs it. The playground sends the same parameter your client would.
Effort
For models that reason, low through max. Reasoning tokens bill as completion, so the dial has a price attached.
Stream
On or off, and the difference matters: once the first content token has flushed, a route can no longer fail over.
models[] fallback
Try the chain from here. Name the order, watch which one answers, then keep it as a route.
Leave with the call you tested.
The panel writes out the request you just made, in the shape your SDK expects. Paste it in and there is no gap between what you tried and what runs.
client.chat.completions.create(
model="anthropic/claude-sonnet-5",
messages=[
{"role": "system", "content": "Answer in one paragraph."},
{"role": "user", "content": "ship it"},
],
max_tokens=1024,
temperature=0.7,
stream=True,
)It tells you where it has been.
The body is the schema you expect. The headers carry what a gateway knows and a provider cannot: which model actually served you, how many hops it took to get there, how the call ended, and what it drew from the balance.
The same four facts are on every row of the requests log, so debugging from a header and debugging from the dashboard are the same exercise.