Skip to main content

Playground

Test and experiment with models directly in your browser, then export the equivalent API call.

Interface Overview

The page opens under the eyebrow Inference with the heading Playground. Three controls sit in the header:

ButtonWhat it does
DocsOpens the API Documentation modal: a quick-start summary and the endpoint list
CodeOpens the Code Examples panel with the current request as cURL, Python, or JavaScript
New ChatClears the conversation and starts fresh. Shown on the chat and image surfaces only

Below the header, a left column holds the model card and the parameters for the current surface, and the main column holds the conversation, prompt, or audio workspace.

The Output Notice

A standing line sits under the workspace, next to the composer:

Models can make mistakes. Verify important information.

It appears on every Playground surface — chat, image, speech, transcription and live microphone — and it is not dismissible. It states a permanent property of model output rather than reporting a problem, so it is quieter than the amber notices the Playground raises when something has actually gone wrong, and it stays put across model and mode changes.

Choosing a Model

The model card shows the model you are working with. Click Change or the card itself to open the model picker.

note

No keyboard shortcut opens the model picker. ⌘K / Ctrl+K opens the portal's global search, which is a different dialog.

The Model Picker

The picker is a full command-palette dialog, not a dropdown. It contains:

ElementBehaviour
Search boxPlaceholder "Search models, providers or capabilities…". Matches on all three
Browse railAll models, Chat, Image, Audio, each with a count. Shown only when at least two of those categories exist in your catalog
Count line"{shown} of {total} models", announced to screen readers as it changes
Sort controlClick to cycle "Sort: Recommended""Sort: A–Z""Sort: Context"
ResultsGrouped by modality: Chat, Image generation, Speech to text, Text to speech, Live audio

Chat models show their context window in the right-hand column; models on other surfaces show a dash.

Navigate with ↑ and ↓, select with ↵, and close with esc. The same hints appear along the footer. You can also dismiss the dialog with the ✕ (labelled "Close model picker") or by clicking outside it. A drag that begins inside the dialog and ends outside does not dismiss it, so selecting text near the edge is safe.

If nothing matches, the picker offers a Clear filters button.

Models Being Updated

A model whose deployment is mid-rollout carries an amber "Updating" pill and cannot be selected. Its tooltip reads "This model is being updated. Try again in a moment." These rows are also skipped by arrow-key navigation. Try again once the rollout finishes.

Which Models Appear

Only deployed models appear, and only those with a Playground surface. Embedding models and other non-generative types are filtered out of the picker entirely; call those directly from the API instead.

/playground?model= preselects a model. The value can be a model id or a model name.

When the link cannot be honoured, an amber banner explains why and a usable model is selected for you:

  • The model is not deployed, or does not exist: "No deployed model matches "{model}". A model you can try is selected below."
  • The model exists but its type has no Playground surface: ""{model}" is a {type} model and has no Playground surface. Call it directly at {endpoint}. A model you can try is selected below."

The banner clears as soon as you pick a model yourself.

note

The retired /playground-stt route redirects permanently to /playground and forwards any ?model= value, so old bookmarks keep working.

Surfaces

The Playground has no surface tabs. The selected model's type decides which surface you get.

Model typeSurface
Text to imageImage
Speech to textAudio file, plus Live microphone when the model supports realtime
Text to speechSpeech
Everything elseChat

The Mode Switch

Most models offer exactly one modality, and a read-only badge names it: Chat, Image generation, Speech to text, Text to speech or Live audio.

A "Mode" switch appears only when one model offers more than one. Today that means a speech-to-text model that also supports realtime, which offers:

  • "Audio file": "Upload or record an audio file, then get the full transcript back."
  • "Live microphone": "Stream your microphone and watch the transcript appear as you speak."

Switching surfaces is announced to screen readers as "The Playground switched to {mode}."

Both audio modes, and the text-to-speech surface, are documented in full on Playground Audio.

Chat Surface

System Prompt

The "System Prompt" card shows the current instruction, or "No system prompt set" when there is none. Click it to open the "System Message" modal ("Define the model's behavior, tone, response style, and capabilities.") and save with Save system message or discard with Cancel.

Conversation

Type into the composer (placeholder "Type your message... (Press Enter to send)") and press Enter to send; Shift+Enter inserts a newline. Responses stream in by default and the conversation keeps its context across turns.

Message Actions

Hover over any message to reveal inline actions:

  • Copy: copy the message content to the clipboard
  • Regenerate (assistant messages): discard the current response and generate a new one for the previous user prompt
  • Edit (user messages): open the prompt inline for editing; sending replaces the original message and regenerates everything that came after it

Regenerate and Edit are available on the chat surface only. These actions affect the live session only; they do not modify any saved conversation history.

Cancelling a Response

Click Stop while a streaming response is in flight. The partial text that already arrived stays visible and gains a "Cancelled" badge, so you can read what was generated before the cancel. Navigating away during a stream also cancels the request, sending a real client-disconnect upstream.

Cancelled responses are billed for the tokens already produced. See Cancelling a Stream.

File Attachments

The attach button appears only for models whose capabilities include vision. When the model does not, the button is disabled and its tooltip reads "This model does not support file attachments".

LimitValue
Max files per message10
Max size per file50 MB
Max total size per message100 MB

Images and PDF documents — the same rule on every model. That is what the upload menu now says, whichever engine serves the model. Any other document type is refused in the picker, before the upload, and no attachment chip is added.

One capability, both kinds of attachment

The platform converts a PDF into page images before it reaches any engine, so "can this model read a page image" is the same question as "can this model take an attachment" — and vision is the capability that answers it, for images and documents alike.

Before this release the picker skipped the PDF-only check for models served by an external OpenAI-compatible provider: it accepted any file type and the provider then rejected the request. Those models now follow the same PDF-only rule, and the upload menu no longer advertises document types the platform cannot send.

Attach files, type your message, and send; the model receives both. A document that gets past the picker is still refused by the API — see Document attachments.

Parameters

Max Tokens

Caps the length of the reply. The default is 4096.

  • The control appears only when the model publishes a context window. If it does not, max_tokens is left off the request entirely and the model's own default applies.
  • A typed value is kept: it is rounded to a whole number and clamped into the valid range. It is not snapped to a coarse slider step, so the number you type is the number that is sent.
  • Changing model re-clamps the value to the new model's limit.
  • The line under the field shows "{remaining} left of {total}" once the conversation has consumed part of the context window.

When your stored setting is larger than the context left in the conversation, an amber line appears:

Your setting of {requested} tokens is above the context left in this conversation, so the request will use {limit}.

The request still goes through; it just uses the smaller figure.

Temperature

Controls randomness. Range 0 to 2, step 0.1, default 0.7.

ValueEffect
0.0Deterministic, focused
0.7Balanced (default)
1.5+Creative, varied

Advanced

Expand the "Advanced" section for the remaining sampling controls. It is collapsed by default.

ControlRangeStepDefault
Top P0 – 10.010.95
Frequency Penalty−2 – 20.10
Presence Penalty−2 – 20.10
SeedAny integerN/AEmpty (placeholder "Random")
Stop Sequences (comma-separated)TextN/AEmpty

Playground Advanced explains when to reach for each of these.

Request Mode

The "Request Mode" card holds two mutually exclusive checkboxes:

  • "Stream": on by default. Receive the response in real-time chunks.
  • "Background": process as a background job and track it from Jobs.

With both cleared, the request is a plain synchronous call.

Each row carries a sub-line that names the real reason it is unavailable, capability first:

SituationSub-line
The model cannot stream"This model does not support streaming"
The model cannot run async"This model does not support async"
Background is on, so Stream is blocked"Turn off Background to stream the response."
Stream is on, so Background is blocked"Turn off Stream to run this as a background job."
Stream is available"Receive the response in real-time chunks"
Background is available"Process as a background job and track it from Jobs."

A capability limit always wins over the mutual exclusion, so you never see "turn off the other one" for something the model could not do anyway.

Reasoning Controls

Three related controls appear depending on the model:

ControlWhen it appearsBehaviour
"Thinking Mode" checkboxThe model declares a reasoning parser and is served by vLLMOn by default. "Model shows reasoning process before answering" when enabled, "Model answers directly without showing reasoning" when not
"Reasoning Model" indicatorA provider-served model that declares a reasoning parserStatic, not a toggle; "This model always includes reasoning in responses"
"Reasoning Effort"The model declares support for it, and thinking is currently enabledlow / medium / high, default medium. "Low = faster, High = deeper analysis"

When reasoning is returned, the Playground renders it as a collapsible Thinking Process panel above the answer. The panel fills in live during streaming, so the reasoning builds up in its own block rather than mixing into the final answer. Some models put their entire answer in the reasoning channel with no content value; the Playground renders it either way, in both streaming and non-streaming modes.

Reasoning effort maps directly onto the API parameter:

{
"model": "your-chat-model",
"messages": [{"role": "user", "content": "Explain the Monty Hall problem."}],
"reasoning_effort": "high"
}

Invalid values are rejected with a 400 (Input should be 'none', 'low', 'medium' or 'high'). none is accepted by the schema but rejected at request time by some reasoning models; stick to the three levels the UI offers.

Reasoning effort is reset to medium whenever you change model.

Why a Reply Stopped

When a reply does not end normally, the Playground says so with a badge and a one-line explanation under the message. A reply that stops normally shows nothing at all.

Finish reasonBadgeMessage
length, with an explicit Max Tokens on that requestTruncated"The reply stopped at the Max Tokens limit of {limit}. Raise Max Tokens and regenerate for the full answer."
length, with no Max Tokens sentTruncated"The reply stopped at the output length limit. Raise Max Tokens and regenerate for the full answer."
content_filterFiltered"The provider stopped this reply with a content filter."
Anything elseIncomplete"The reply did not finish normally. Finish reason: {reason}."
info

{limit} is the Max Tokens value that request carried, not whatever the slider says now. If you raise the slider and re-read an older message, its explanation still reports the figure that actually truncated it.

A reasoning model that spends its whole budget on reasoning shows a dedicated note instead: "The model used all available tokens for reasoning. Increase Max Tokens or disable Thinking Mode for a direct response."

Image Surface

Selecting a text-to-image model switches the workspace to image generation. Describe the image in the composer and click Generate.

ParameterRangeStepDefault
Size256×256, 512×512, 1024×1024, 1024×1792, 1792×1024N/A1024×1024
Inference Steps1 – 200150
Guidance Scale0 – 200.53.5
True CFG Scale1 – 200.51.0
SeedAny integerN/AEmpty ("Random")
Negative PromptTextN/AEmpty
Count1 – 1011

True CFG Scale is the switch that makes the negative prompt take effect: "1.0 = off. Above 1.0 activates negative prompt (doubles inference time)." Leave it at 1.0 unless you actually need the negative prompt, since raising it roughly doubles generation time.

Generated images appear inline and can be downloaded individually. If the model rewrote your prompt, the result is shown under Revised prompt.

Image generation is a one-shot flow; there is no edit or regenerate action, and no Request Mode card. See the Image Generation guide for the API equivalent.

Audio Surfaces

Transcription, speech synthesis and live microphone transcription each have their own workspace. They are documented on their own page: Playground Audio.

Two controls there are worth knowing about from here, because both are driven by what the model declares rather than by a setting you can turn on:

  • A Task selector on the transcription surface switches between transcribing and translating to English. It appears only on speech-to-text models that can translate.
  • A streaming toggle on the speech surface is enabled only on text-to-speech models that declare incremental synthesis. It is shown but disabled on the others, so you can see which models offer it.

The Mode switch above is a different thing: it chooses between two surfaces of one model, while these are fields of one request.

Code Examples Panel

Click Code to slide out the "Code Examples" panel, which renders your current request as working code.

  • Tabs are cURL, Python and JavaScript, in that order. Python is selected by default.
  • Copy flips to "Copied!" for a moment after a successful copy.
  • The key is always the literal placeholder YOUR_API_KEY. Substitute a real key from API Keys before running the snippet.
  • The model value is the model's public identifier; the same one GET /v1/models returns.

The host in the snippet is whichever base URL your operator configured. By default that is the relative path /v1, with no hostname at all, so the snippet works unchanged from the portal's own origin but needs your API base URL filling in before it runs anywhere else.

from openai import OpenAI

client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.bulutistan.ai/v1" # your API base URL
)

response = client.chat.completions.create(
model="your-chat-model",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
],
temperature=0.7,
max_tokens=1024
)
curl https://api.bulutistan.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "your-chat-model",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
],
"temperature": 0.7,
"max_tokens": 1024
}'

API Documentation Modal

Click Docs to open "API Documentation" ("Quick start guide"). It covers:

  • Quick Start: create an API key, install the SDK, send your first request
  • API Endpoints: chat completions, completions, models, embeddings, audio transcriptions, audio translations, audio speech, and the realtime transcription WebSocket
  • Example Code: a copyable SDK snippet

A View Full Documentation link at the bottom opens this documentation site in a new tab.

The modal traps focus while it is open and restores it to the button you came from. Close it with Escape, the ✕, or a click on the backdrop.

Tips

Testing Prompts

  1. Start with a simple prompt and one variable at a time
  2. Iterate on the system message before touching sampling parameters
  3. Test the edge cases you expect in production
  4. Copy the Code panel snippet once a configuration works

Comparing Models

Open the Playground in several browser tabs and run the same prompt against a different model in each. Response quality, latency, and truncation behaviour are all easier to judge side by side.

Debugging

If a response looks wrong:

  1. Check the system message
  2. Set Temperature to 0 for a reproducible baseline, and fix a Seed
  3. Look for a Truncated badge before assuming the model is at fault
  4. Review the conversation for context that is skewing the answer, and start a New Chat if the context warning has appeared