Melious

The Playground is a screen in the terminal UI where you pick a model, give it your own input, and see the answer without writing a request by hand.

It covers six model types: chat, decisions, transcription, rerank, embeddings, and images. Every pane can show the CLI command that sends the same request, so what you try here moves into a script without retyping it. We built it because the fastest way to learn what a decision model does with your ticket is to hand it your ticket.

Open the Playground

Run melious with no command and choose 2 Playground on the home menu, or press 2. The home menu and its other screens are on the Terminal UI page.

    1  Launch a coding tool  start an agent with Melious
  › 2  Playground            try any model on your own input
    3  Default models        choose models for every tool or one tool
    4  Settings              account, defaults, trusted folders

The Playground opens on the model picker. From a pane, m goes back to the picker, and so does esc once no text field has the focus. From the picker, esc goes back to the home menu.

Model picker

The picker shows the six model types as a row of tabs, each with the number of models your API key can use. The selected type sits in ‹ ›. Below the tabs is the model list for that type. The picker opens on Chat; here it's one → along, on Decisions:

  Melious → Playground

  Chat 36  ‹ Decisions 2 ›  Transcription 3  Rerank 1  Embeddings 7  Images 4
  ────────────────────────────────────────────────────────────────────────────
  › clef          32 q · 255 opt · €0.20 / 1M input
    clef-flash    32 q · 255 opt · €0.03 / 1M input

  ←→ type  ·  ↑↓ move  ·  / filter  ·  enter open  ·  esc back

The counts, models and prices are the ones our key saw on the day we captured this; your list depends on your account. Each row says what the catalog knows about the model: for a decision model, its limits (questions and choice options) and its input price; for chat, rerank, and embeddings models, the context length and the input price; for transcription, the price per audio minute; for images, the price per image. A value the catalog doesn't have is left out.

KeyAction
← →Change the model type
↑ ↓Move through the list
/Filter the list by model ID. enter keeps the filter, esc clears it.
enterOpen the pane for the selected model
escClear a kept filter, or go back to the home menu. While a filter is kept, the legend says esc clear filter.

The picker shows Loading models… while it fetches the model catalog. If Melious can't reach the API, it says Could not reach Melious. Press r to try again. A type with no models for your key shows No <type> models are available for your API key. instead of an empty list.

The Playground leaves guardrail models out. Their API has no documentation yet, and we'd rather not put a model in front of you that we can't explain.

Keys in every pane

All six panes share these keys. The legend at the bottom of each pane lists the ones that work right now. The screens on this page are captures from our own account at 80×32, so the models, answers, and request IDs in them are what we got on the day.

KeyAction
ctrl+rRun the request
tabMove the focus to the next field
mBack to the model picker
cShow the equivalent CLI command in a box. Any key closes it.
escLeave the text field that has the focus. With no field focused, go back to the model picker.

While a text field has focus, the letter keys type into the field, and the legend says esc leave field. Leave the field with esc to use m, c, or a pane's own letter keys.

m keeps the pane. Open the same model again and it's as you left it, input and result included. Pick another model of the same type and the pane keeps your input too, which makes comparing two models one keystroke and a run.

The result appears below the input and stays there while you change the input, so you can compare. The next run replaces it. After each run, the result heading shows the tokens (when the API reports them), the duration, and the first 8 characters of the request ID.

Requests run in the background, so the screen stays responsive while a slow model thinks. While one runs, the legend shows only esc stop, and every other key waits. esc cancels the request, and the result area says Stopped. The request was cancelled.

When a run fails, the result area says why and moves the focus to the field at fault. A problem the pane finds before sending says Not sent. Here, the Language field holds a word instead of a two-letter code:

  Melious → Playground → whisper-large-v3-turbo

    File      weekly-sync.wav
  › Language  english

  Result
  ✗ Not sent
    field language
    Use a two-letter language code, for example en or de. Leave it empty to
    detect the language.

  ctrl+r run  ·  tab next field  ·  esc leave field

An error from the API has the same shape: the HTTP status and error code in place of Not sent, the field when the API names one, the message, and the full request ID on the last line.

Decisions

The Decisions pane sends a context and a set of typed questions to a decision model through System One. It has two parts: Context, a multi-line field with the text or JSON the questions are about, and Questions, the list of questions to answer. tab switches between them. (The API and the decide command call the context the state.)

The pane opens with the focus in Context, where the list says No questions yet. Press tab, then a to add one or e for an example. After tab, the list shows the keys to start with:

  Melious → Playground → clef

    Context ──────────────────────────────────────────────────────────────────
    │ The text or JSON the questions are about
    │
    │
    ────────────────────────────────────────────────────────────────────── 0 B

  › Questions                                                          0 of 32
    No questions yet.
    a  add a question
    l  load a saved spec
    e  load an example

  a add  ·  e example  ·  tab context  ·  ? more keys

e loads the example: a refund ticket and three questions, one of each answer type. It keeps a context you've already written.

Add a question

a opens the question editor. It has three fields, and a fourth line for the key:

  • Question is what you ask the model, such as Which team should handle this?. It's required.
  • Answer is the answer type. ← → switch between Pick one, Rate on a scale, and Yes or no.
  • The last field depends on the answer type:
    • Options, for Pick one: one option per line. A meaning can follow a colon, as in logistics: the order is lost or late.
    • Levels, for Rate on a scale: one level per line, lowest first. shift+↑ and shift+↓ move the current line.
    • Yes means and No means, for Yes or no: what each answer stands for. Write both or leave both empty.

tab moves to the next field, and in Options and Levels enter starts a new line. ctrl+s keeps the question and esc drops it. A question with its options written:

  Melious → Playground → clef → New question

    Question   Which team should handle this?
    Answer     ‹ Pick one ›  Rate on a scale  Yes or no
  › Options    billing
               logistics: the order is lost or late
               support

               one per line · a meaning can follow a colon

    key which-team-should-handle-this
    used in scripts and --pick · ctrl+k to rename

  enter next line  ·  tab next field  ·  ctrl+s done  ·  esc cancel

The editor checks the question while you type. Once you've changed or left a field, a problem shows under it with a ✗: write the question, add at least 2 options, or a limit of the model, such as at most 255 options. ctrl+s doesn't keep a question that still has a problem. It shows every problem, moves the focus to the first, and says Not done yet: <PROBLEM>.

Because the questions are checked against the model's limits before anything is sent, a choice with one option fails on your screen, not on your bill.

Keys and --pick

Each question also has a key, the name it's sent under. The editor makes it from the question: lower case, the words joined by hyphens, everything but the letters a to z, digits, dots, and underscores left out, and at most 40 characters. A question with nothing left gets q1, q2, and so on, and a key another question already has gets -2, -3.

The key follows the question as you type until you rename it. ctrl+k opens the key for editing; enter keeps the new key and esc leaves the old one. A question that's already in the list keeps its key when you change its text, because a script may use it.

The screen shows your questions by their text, but scripts use the keys: the c command, a saved spec, the batch output, and --pick. For the question above, this prints only the team:

melious decide "<STATE>" --spec <NAME> --pick which-team-should-handle-this

The question list

The legend shows the keys you need most: ctrl+r ask, a add, enter edit, x delete, and ? more keys. ? opens the help, which lists every key of the pane under DECISIONS. In a 32-row terminal the help is taller than the screen, so it scrolls under its heading with ↑ ↓.

KeyAction
ctrl+rAsk the questions. Works from Context too.
↑ ↓Move through the questions
enterEdit the selected question
aAdd a question, up to the model's limit
xDelete the selected question. The pane asks Delete '<QUESTION>'? y/n under it: y deletes, any other key keeps it.
eLoad the example, while there are no questions
ctrl+sSave the questions as a spec
lLoad a saved spec. When the list has questions you haven't saved, the pane first asks Load a spec in place of the unsaved questions?: y opens the saved specs, any other key keeps the questions.
pgup pgdnScroll the answers
escFrom Context, move to the questions. From the list, go back to the model picker.

Read the answers

ctrl+r checks the request first. A problem stops it there, and the result area says Not sent and names Context or the question, such as Question 2 · How urgent is this?. Otherwise the answers appear under Answers, numbered like the questions. The example, asked:

  Melious → Playground → clef

    Context ──────────────────────────────────────────────────────────────────
    │ Ticket #4128: customer requests a refund 11 days after purchase;
    │ the order has shipped.
    │
    ───────────────────────────────────────────────────────────────────── 87 B

    Questions                                                          3 of 32
  › 1  Which resolution matches policy?  pick one · refund, credit, deny
    2  How urgent is this?               scale · routine → immediate
    3  Should a human review this?       yes or no

  Answers · 326 input tokens · 0.48 s · req 842b2d92
    1  deny                                                    63% sure
       deny    ██████████████████████████████████████░░░░░░░░░░░░   75%
       refund  █████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   17%
       credit  ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░    8%
    2  routine  (1.2 of 3: routine → immediate)                76% sure
    3  No · 0.48  ██████████████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░

  ctrl+r ask  ·  a add  ·  enter edit  ·  x delete  ·  ? more keys

How to read each answer type:

  • Pick one: the option the model picked and NN% sure, then a bar for each option with its probability, highest first. NN% sure is the model's confidence in its answer, not the bar of the picked option, so the two numbers can differ.
  • Rate on a scale: the level nearest to the score and NN% sure. In between, (1.2 of 3: routine → immediate) places the score on the scale: level 1 of 3, a fifth of the way to level 2.
  • Yes or no: Yes from 0.5 up and No below, the value, and a bar. When the question has Yes means and No means, the text for the answer shows below it.

In a terminal 110 columns or wider, each answer starts with its question's text.

Save and load specs

A spec is the set of questions, saved under a name so you can reuse it. ctrl+s in the list asks for a name and saves the spec to ~/.melious/decisions/<NAME>.json, together with the ID of the model you're using. Names use letters, digits, dots, underscores, and hyphens, up to 64 characters. If a spec with that name exists, in any letter case, the pane says A spec named <NAME> exists. Press enter again to replace it. A second enter replaces it, and esc cancels.

The spec's name shows in the top-right corner, followed by (unsaved) once you change a question. l lists the saved specs and loads the one you pick. Loading doesn't change the model: when the spec names another one, the pane says so and keeps the model you opened.

The same file works with melious decide --spec, which is the point: build the questions here, then run them from a script. Because the spec records the model, decide --spec <NAME> uses that model unless you pass --model.

Chat

Two fields: System (one line, optional) and Message (multi-line). The answer streams in as the model writes it, ↑ ↓ scroll it once you've left the fields, and the result heading shows the prompt and completion tokens.

  Melious → Playground → gemma-4-31b

    System    Answer in one sentence.

    Message ──────────────────────────────────────────────────────────────────
    │ What does a decision model do?
    │
    │
    │
    ──────────────────────────────────────────────────────────────────────────

  Result · 28 prompt tokens · 284 completion tokens · 2.93 s · req 73098d7b
    A decision model provides a structured representation of the logic, rules,
    and data used to transform inputs into a specific choice or outcome.

  ctrl+r run  ·  tab focus  ·  ↑↓ scroll  ·  c command  ·  m model
  esc back

Each run is a new conversation. The pane keeps no history — for a back-and-forth, launch an agent or use melious run in a loop.

Transcription

Two fields: File, the path to an audio file (tab completes the path), and Language, an optional two-letter ISO-639-1 code such as de. Leave Language empty and the model detects it. The transcript appears in an area you can scroll with ↑ ↓, and when the model reports the language it heard, the result heading names it.

  Melious → Playground → whisper-large-v3-turbo

    File      weekly-sync.wav
    Language  auto-detect

  Result · 0.82 s · req 32a219f2
    Hello and welcome to the weekly Sync. The build is green and we ship on
    Thursday.

  ctrl+r run  ·  tab focus  ·  ↑↓ scroll  ·  c command  ·  m model
  esc back

The tab lists only audio models that turn speech into text. Models that produce audio aren't in it.

Rerank

Two fields: Query (one line) and Documents (multi-line, one document per line, with the count under it). The result is a ranked table with the score, a bar for it, the document's position in your list, and the document.

  Melious → Playground → qwen3-reranker-4b

    Query  capital of Germany

    Documents ────────────────────────────────────────────────────────────────
    │ Paris is the capital of France.
    │ Berlin is the capital of Germany and its largest city by population.
    │ The Rhine flows through six countries.
    ────────────────────────────────────────────────────────────── 3 documents

  Result · 0.26 s · req d7adc269
    RANK   SCORE                #  DOCUMENT
       1   0.981  ████████████  2  Berlin is the capital of Germany and its l…
       2   0.000  ░░░░░░░░░░░░  3  The Rhine flows through six countries.
       3   0.000  ░░░░░░░░░░░░  1  Paris is the capital of France.

  ctrl+r run  ·  tab focus  ·  ↑↓ scroll  ·  c command  ·  m model
  esc back

Embeddings

Two to six lines of text. Move through them with ↑ ↓, edit one with enter, add one with a, and delete one with x. While you edit a line, enter or esc finishes it and tab moves on to the next. The result is the number of vectors, their dimensions, the token count, and a cosine-similarity matrix between the lines.

  Melious → Playground → bge-m3

  › Texts                                                               3 of 6
    1  The cat sat on the mat.
    2  A kitten slept on the rug by the door.
  › 3  Quarterly revenue grew by four percent.

  Result · 35 tokens · 0.40 s · req 223b9a1b
    3 vectors · 1024 dimensions
    Cosine similarity
                                        1     2     3
    1  The cat sat on the mat.       1.00  0.64  0.36
    2  A kitten slept on the rug b…  0.64  1.00  0.32
    3  Quarterly revenue grew by f…  0.36  0.32  1.00

  ctrl+r run  ·  tab focus  ·  ↑↓ move  ·  enter edit  ·  a add  ·  x delete
  c command  ·  m model  ·  esc back

That matrix is the quickest way we know to see whether a model thinks "Hamburg" is closer to "Lübeck" or to "hamburger".

Images

Four fields: Prompt (multi-line), Size (1024x1024, 1792x1024, or 1024x1792), Count (1 to 4), and Folder (the current folder when empty). ← → change the size and the count.

The Playground caps the count at 4 to keep a slip of the finger cheap; melious image goes up to 10. The pane saves each image to the folder as melious-<YYYYMMDD-HHMMSS>-<N>.<EXT> and lists the paths. It never overwrites a file: when a name exists, it adds -2, -3, and so on.

  Melious → Playground → flux-2-klein-4b

    Prompt ───────────────────────────────────────────────────────────────────
    │ A lighthouse at dusk, watercolor, soft light
    │
    ──────────────────────────────────────────────────────────────────────────

    Size    ‹ 1024x1024 ›  1792x1024  1024x1792
    Count   ‹ 1 ›  2  3  4
    Folder  out

  Result · 1 image saved · 51.23 s · req f0db94ba
    ✓ out/melious-20261019-012556-1.jpg

  ctrl+r run  ·  tab focus  ·  c command  ·  m model  ·  esc back

The Playground doesn't show the images in the terminal — open the files in your image viewer.

See the command

Press c in any pane to see the CLI command for your current input. The command quotes your text in single quotes for a POSIX shell, so you can paste it into a terminal or a script as it is, and it sends the same request. The Decisions example from above:

  Melious → Playground → clef → Command

  ╭─── Command ──────────────────────────────────────────────────────────────╮
  │ melious decide \                                                         │
  │ 'Ticket #4128: customer requests a refund 11 days after purchase;        │
  │ the order has shipped.' --model clef --choice \                          │
  │ resolution=refund,credit,deny --ask \                                    │
  │ 'resolution=Which resolution matches policy?' --score \                  │
  │ urgency=routine,same-day,immediate --ask 'urgency=How urgent is this?' \ │
  │ --noul escalate --ask 'escalate=Should a human review this?'             │
  │ melious decide batch <input.jsonl> --spec <name> -o results.jsonl        │
  │ # Save the spec with ctrl+s to use it in a batch.                        │
  ╰──────────────────────────────────────────────────────────────────────────╯

  Copy the command to run the same request from a shell or a script.

  any key close

The box breaks a long command only at a space outside the quotes and ends each broken line with \, so what you copy pastes as one command. A line break inside quotes is part of your text: the context of the example has one after purchase;, and the quotes keep it.

The commands put your text, file, or query before the flags, as in the table below; chat puts it last. When one of them starts with -, such as a query of -1 is not a capital, the command would read it as a flag, so the flags come first and -- ends them:

  │ melious rerank -f docs.txt --model qwen3-reranker-4b -- \                │
  │ '-1 is not a capital'                                                    │
  │ # docs.txt holds the documents, one on each line.                        │
PaneCommand
Decisionsmelious decide '<STATE>' --model <MODEL_ID> --spec <NAME> when the spec is saved and unchanged; otherwise the questions as --choice, --score, --noul, and --ask flags, by their keys. A JSON context becomes --state-file state.json.
Chatmelious run --model <MODEL_ID> --system '<SYSTEM>' '<MESSAGE>', without --system when that field is empty
Transcriptionmelious transcribe <FILE> --model <MODEL_ID>, plus --language <CODE> when you set one
Rerankmelious rerank '<QUERY>' -f docs.txt --model <MODEL_ID>
Embeddingsmelious embed '<TEXT_1>' '<TEXT_2>' … --model <MODEL_ID>
Imagesmelious image '<PROMPT>' --model <MODEL_ID> -n <COUNT> --size <SIZE> -o <FOLDER>

The Decisions pane also shows the batch form, for when one ticket worked and you have a thousand more:

melious decide batch <INPUT.jsonl> --spec <NAME> -o results.jsonl

Two things the commands can't carry for you. A batch needs a saved spec, so until you save one, the batch line says <name> and a note asks you to press ctrl+s; the same goes for criteria the shorthand flags can't express, such as an option with its own meaning or Yes means and No means texts. And the rerank command reads its documents from docs.txt, one per line, as its note says — the pane doesn't write that file, so put your documents in it first.

Every flag of these commands is in the command reference, and running decisions from scripts is covered in scripting and automation.

Default decision model

The Playground lets you pick any decision model. melious decide needs to know which one to use without asking, so you can set a default under Settings › Default decision model in the terminal UI, or with melious config set models.decision <MODEL_ID>. Configuration has the full selection order.

On this page