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:
| Button | What it does |
|---|---|
| Docs | Opens the API Documentation modal: a quick-start summary and the endpoint list |
| Code | Opens the Code Examples panel with the current request as cURL, Python, or JavaScript |
| New Chat | Clears 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.
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:
| Element | Behaviour |
|---|---|
| Search box | Placeholder "Search models, providers or capabilities…". Matches on all three |
| Browse rail | All 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 control | Click to cycle "Sort: Recommended" → "Sort: A–Z" → "Sort: Context" |
| Results | Grouped 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.
Deep Links
/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.
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 type | Surface |
|---|---|
| Text to image | Image |
| Speech to text | Audio file, plus Live microphone when the model supports realtime |
| Text to speech | Speech |
| Everything else | Chat |
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".
| Limit | Value |
|---|---|
| Max files per message | 10 |
| Max size per file | 50 MB |
| Max total size per message | 100 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.
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_tokensis 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.
| Value | Effect |
|---|---|
| 0.0 | Deterministic, focused |
| 0.7 | Balanced (default) |
| 1.5+ | Creative, varied |
Advanced
Expand the "Advanced" section for the remaining sampling controls. It is collapsed by default.
| Control | Range | Step | Default |
|---|---|---|---|
| Top P | 0 – 1 | 0.01 | 0.95 |
| Frequency Penalty | −2 – 2 | 0.1 | 0 |
| Presence Penalty | −2 – 2 | 0.1 | 0 |
| Seed | Any integer | N/A | Empty (placeholder "Random") |
| Stop Sequences (comma-separated) | Text | N/A | Empty |
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:
| Situation | Sub-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:
| Control | When it appears | Behaviour |
|---|---|---|
| "Thinking Mode" checkbox | The model declares a reasoning parser and is served by vLLM | On by default. "Model shows reasoning process before answering" when enabled, "Model answers directly without showing reasoning" when not |
| "Reasoning Model" indicator | A provider-served model that declares a reasoning parser | Static, not a toggle; "This model always includes reasoning in responses" |
| "Reasoning Effort" | The model declares support for it, and thinking is currently enabled | low / 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 reason | Badge | Message |
|---|---|---|
length, with an explicit Max Tokens on that request | Truncated | "The reply stopped at the Max Tokens limit of {limit}. Raise Max Tokens and regenerate for the full answer." |
length, with no Max Tokens sent | Truncated | "The reply stopped at the output length limit. Raise Max Tokens and regenerate for the full answer." |
content_filter | Filtered | "The provider stopped this reply with a content filter." |
| Anything else | Incomplete | "The reply did not finish normally. Finish reason: {reason}." |
{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.
| Parameter | Range | Step | Default |
|---|---|---|---|
| Size | 256×256, 512×512, 1024×1024, 1024×1792, 1792×1024 | N/A | 1024×1024 |
| Inference Steps | 1 – 200 | 1 | 50 |
| Guidance Scale | 0 – 20 | 0.5 | 3.5 |
| True CFG Scale | 1 – 20 | 0.5 | 1.0 |
| Seed | Any integer | N/A | Empty ("Random") |
| Negative Prompt | Text | N/A | Empty |
| Count | 1 – 10 | 1 | 1 |
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
modelvalue is the model's public identifier; the same oneGET /v1/modelsreturns.
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
- Start with a simple prompt and one variable at a time
- Iterate on the system message before touching sampling parameters
- Test the edge cases you expect in production
- 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:
- Check the system message
- Set Temperature to 0 for a reproducible baseline, and fix a Seed
- Look for a Truncated badge before assuming the model is at fault
- Review the conversation for context that is skewing the answer, and start a New Chat if the context warning has appeared