Skip to main content
The Playground is where you compare one prompt across different models (or, per window, different prompt variants) to see what actually changes before you commit to it. The design is deliberately narrow: one shared prompt, up to three comparison windows, real execution against your own models — not a free-form chat toy.
Playground execution requires an LLM connection configured for your project — it always runs against your own connected provider, never a shared/managed key. If none is configured, you’ll see a Connect a provider banner in place of the run controls.

Opening the Playground

Navigate to Playground in the left sidebar for a blank session, or click Test in the header of a prompt’s detail view to open it pre-filled with that prompt’s text, version, and — if there’s a recent failing generation — a one-click Replay a failing trace shortcut.

The shared prompt rail

The left-hand rail holds the prompt — the single versioned artifact every comparison window runs by default. Edit it once and every window updates:
  • Single mode — one template with {{variable}} placeholders.
  • Chat mode — a system message plus a list of seed turns (few-shot examples, or the exact state a real conversation was in when it broke).
  • Tools & structured output (collapsed by default) — shared tool definitions (JSON) and an optional structured-output schema, used by every window.
A Save as new version button on the rail versions this shared prompt directly, without needing to run it first.
This panel is what gets versioned. Everything in a comparison window below it — output, cost, latency — is disposable evidence of how the prompt behaves, not the artifact itself.

Per-window override

Any window can break away from the shared prompt: click Override on a window to give it its own prompt text (a CUSTOM PROMPT badge marks it), or Reset to shared to go back to inheriting the rail. This is how you A/B two different prompt variants — not just two models — inside the same comparison.

Comparison windows

Each window is an independent run: pick a model, run it, read the result. You can have up to 3 windows open at once — beyond that stops being a comparison and starts being noise. Use the dashed Add a window tile to add one (it duplicates the active window’s connection/model/toggles, but never its results), and duplicate or remove windows from each card’s header.

Connection-aware model selection

Each window has its own connection/model picker. The model list is derived from the LLM connection you pick — you can’t accidentally select a Google model while only an OpenAI connection is configured. Switching a window’s connection resets its model to a sensible default for that connection’s provider (or keeps your current pick if it’s still valid).

Single vs. Chat mode

A page-level toggle switches every window between:
  • Single — one request in, one output out. Shows output text, token counts, cost, latency, guardrail results, and (if the prompt calls tools) an interactive tool-call panel where you can submit synthetic tool results and continue the run.
  • Chat — a live multi-turn conversation per window, seeded from the rail’s system prompt and seed turns. Non-baseline windows (window 2 and 3) show a divergence banner the moment their tool-call pattern differs from window 1’s corresponding turn — turn-by-turn, based on real transcript comparison, not a guess.

Toggles

Each window has independent Streaming and Guardrails toggles (guardrails apply your project’s configured policies to the run and show pass/fail banners), plus the temperature/max-tokens summary from the shared config.

Reading results

Non-baseline windows (2 and 3) show latency and cost as a percentage delta against window 1, so you can see at a glance whether a model is faster/cheaper or slower/pricier — never a fabricated number when the baseline hasn’t run yet. You can also run any configured evaluator against a window’s output directly from its Run Eval control.

The verdict banner

Once window 1 and the last window both have results, a verdict banner summarizes the comparison:
  • If a guardrail blocked one window’s output, the banner leads with that — a blocked output is a failure, not a saving, and isn’t treated as a valid comparison.
  • Otherwise it reports whether the outputs matched (single mode only), the latency/cost deltas, and — when the session was seeded from a prompt with known call volume — a projected daily cost delta at that volume.
  • If any window is running on an overridden (non-shared) prompt, the banner flags that the comparison isn’t a pure model comparison.
From the banner you can save the candidate window as a new prompt version, add it to a dataset, or discard it.

Run over dataset

When the session was seeded from a prompt, the verdict banner’s Run over dataset button takes you to that prompt’s Versions tab, where you run the candidate version over a full dataset and put it through the quality gate — a single Playground run is evidence, not proof.

Importing input

The left rail also includes an Import from trace control: paste a trace ID and Zespan pulls that trace’s prompt, provider, model, and config into the session, so you can reproduce a specific production call. If the session was seeded from a prompt with a recent failing generation, a Replay a failing trace shortcut does the same thing without typing an ID.

Saving your work

  • Save as new version (rail or window footer) creates a new, unlabeled draft prompt version from the shared rail or a specific window’s effective prompt. It never deploys anything — you still promote it to a label from the prompt’s Versions tab.
  • Add to dataset (per window, or from the verdict banner) records the window’s last run as a dataset item, provided that run came from an imported trace and the session was seeded from a prompt.
  • Share copies a link that encodes the active window’s prompt, provider, model, and config, so a teammate opens the same setup.
  • History keeps your last 50 runs in this browser (per project) so you can reload a previous prompt/model/config combination.
  • Reset clears all windows back to a single blank one.
Playground sessions and history are stored in your browser’s local storage, scoped to the project. They aren’t shared across devices or team members — use Share or Save as new version to hand off a result to someone else.