# Conversations — how a turn runs

What happens when you send a message: streaming, mid-turn tool calls, a durable cancel, attachments, search, and reading the metrics behind each reply.

Status: Shipped

A conversation is a back-and-forth with one of your agents. You send a message;
the agent streams its reply token by token, and along the way it may call tools
and keep going with what they return — all before it hands you a finished answer.

## Why it matters

This is where _constructor, not chatbot_ shows. A turn isn't a single
request-and-response: the model can reach for the current time, ask you a
question, fetch a URL, or recall a saved note in the middle of an answer, fold
the result back in, and continue. And because turns are durable, they don't
depend on you staying on the screen.

## What a turn does

- **Streams as it goes** — you watch tokens appear rather than waiting on a
  spinner for a wall of text.
- **Calls tools mid-turn** — when the model asks for one or more tools, they run
  (several in parallel when it asks for several), their results are fed back, and
  the model continues in the same turn. This repeats until an answer needs no
  more tools.
- **Keeps running in the background** — turns run off the UI, so leaving the
  conversation, opening another, or backgrounding the app doesn't stop them, and
  more than one conversation can generate at once. This is a feature in its own
  right; see [Background turns](/docs/features/background-turns).
- **Survives a restart** — a turn cut short by a crash or a kill is re-queued
  when the app starts again.

![A finished reply with its reasoning and per-message metrics](/images/conversation.png)

## Cancelling

Stop a running turn with the stop control. Cancellation is durable: the partial
answer produced so far is kept, and the stop sticks even across a restart. The
flip side is deliberate — because turns are decoupled from the screen, navigating
away or backgrounding does _not_ cancel a turn. Only an explicit stop, or the
turn finishing, ends it.

## When the provider fails

A provider can give up on a reply partway, for example when it is overloaded.
What happens next depends on whether any of the answer had appeared yet:

- **Some of the answer had appeared** — it stays, with a note under it saying the
  reply was cut off and why. Send your next message as usual and the model
  receives its partial answer, marked as unfinished. Or retry, which sends the
  same request again and replaces the partial answer.
- **Nothing but reasoning, or nothing at all, had appeared** — the reply shows
  the provider's error, with a retry button.

Retrying is never automatic once the request reached the provider: a second
attempt is a new request, and the provider may charge for both.

Some failures are visible before you send. When the agent's provider, or one of
its tools or filter models, needs a secret this device doesn't hold, a banner
above the chat names each one, linked to where you add it — see
[Saved secrets](/docs/features/providers#saved-secrets). Starting a conversation with an
agent that has no model, or whose provider isn't on this device, opens the page
read-only with every problem the agent has and an **Edit agent** link.

## Changing the model

Open the usage strip at the top of the conversation to see its provider, model
and reasoning settings. The **Change model** button beside the model runs the
conversation on another provider or model, or with other generation settings.
The change applies from the next turn on, to this conversation only: the agent
itself keeps its own model. Each reply's metrics name
the model that wrote it, so a conversation that switched still says which model
said what. The model can't be changed while a reply is being written: the
button dims until it finishes, and tapping it says why.

To adjust more than the model before a conversation starts, tap **Customize
agent** on a new conversation. The conversation's title and the agent's
settings — its name, prompt, tools, model and parameters — open above the
composer, and whatever you had typed comes along. Your first message starts the
conversation with the agent as you left it; the agent itself stays as it was. A
title or an agent name set here tells the conversation apart in the list from
others started with the same agent. Sending waits until the settings have no
problems left, and each problem is marked where it sits.

## Attachments

You can attach an image when the model supports vision, and a text file when the
model advertises file input — the attach button only appears when the model
accepts one or the other. See [Attachments](/docs/features/attachments) for the full list
of supported formats, camera capture, and how the bytes reach the model. When an
on-device model wrote a reply without seeing the conversation's images, a note
under the reply says how many and why — see
[On-device models](/docs/features/embedded-models#when-the-vision-projector-loads).

## The composer

The message box is a bordered field with an action bar beneath it: attach on the
left, send on the right. **Enter** sends on desktop and inserts a newline on
mobile (Shift+Enter does the opposite), and a swap button flips that if you
prefer. The swap only applies to a physical keyboard, so a phone shows it only
while one is connected; the on-screen keyboard's Enter always starts a new
line. A preview toggle renders your draft as Markdown so you can check tables
and code blocks before sending, and the field is spell-checked — see
[Spell checking](/docs/features/spell-check).

**Page Up** and **Page Down** scroll the conversation a screen at a time, even
while you are typing in the composer.

When the agent has tools that build or wire up other agents, tools, providers,
models, secrets or constants, or that continue another conversation, typing
**@** opens a list of the ones it can reach.
Models appear once you type **@model:**, since listing them asks every provider. Pick
one with the arrow keys and Enter, or tap it, and a link to it lands in your
message, so the agent works on exactly the entry you meant. Start with a kind
and a colon, such as **@agent:** or **@secret:work**, to list only that kind.
Kinds the agent has no tool for are listed greyed out. Escape closes the list.

## Drafts

A message you type but don't send is kept. Leave the conversation, switch to
another app, or come back tomorrow: the text is waiting in the composer with the
cursor where you stopped, and anything you had attached to it is still staged. A
conversation you never sent the first message in keeps its draft too. Sending
clears it.

Drafts also travel with your sync setup. Start a message on your laptop and the
phone shows it above the field — "Unsent draft from Laptop", with what it says
and when you touched it — for you to bring in with **Use here** or drop with
**Discard**. It's offered, never inserted for you: nothing should move text
under your cursor while you are typing. **Use here** adds it to whatever is
already in the box rather than replacing it, and **Discard** removes that draft
on every device. Conversations holding an unsent draft are marked as such on the
conversation list, and an agent holding one for a conversation you haven't
started yet is marked on the agent list, so a half-written message is easy to
find again.

Worth knowing: with sync configured, an unsent draft reaches your sync server
like the rest of a conversation's content. Without sync, drafts stay on the
device that typed them.

## Finding and reading

- **Search** the conversation list by title, agent name, or something said inside
  a conversation (the matched fragment is shown under the hit), and use
  find-in-conversation to scroll between and highlight matches within a thread.
- **Title** a conversation yourself on its edit page, where the name of its
  agent can be changed for that conversation too, or let titles and summaries
  be generated for you — by a second model after the reply, or by the agent's own
  model through a [conversation title tool](/docs/features/tools). An agent with that tool
  is left to it: the second model skips its conversations unless you turn off
  "Skip conversations whose agent sets the title" in the titles & summaries
  settings.
- **Show raw Markdown** from the conversation menu to see exactly what was written,
  source and all — one switch for the whole thread: messages, thinking blocks, tool
  results, and generated summaries.
- **Open a link** in a reply or a tool result — written links and bare URLs are both
  tappable, and each asks first, showing the address it would open, letting you copy
  it, and flagging link text that is itself a URL pointing somewhere else. Only web,
  mail, and phone links open: the target comes from the model or a tool, so it is
  your call.
- **Quote a passage** you have selected — anywhere in the thread, a reply or your
  own earlier message — from the selection toolbar. It lands in the composer as a
  Markdown blockquote, carrying the source Markdown rather than the rendered
  words, with the cursor on a blank line under it. Quote again to stack a second
  passage below the first. A quote in a reply has a copy button of its own, which
  copies what it quotes without its `>` markers, a quote nested inside it still
  marked.
- **Copy part of a table or a code block** and it still pastes as Markdown: the cells
  come back as a table of their own, under the headings and alignment of the columns
  they came from, and the lines of code come back inside a fence tagged with the
  block's language. Selecting inside a single cell just gives you its words.
- **Read the metrics** behind a reply — expand a message for its timing and token
  counts, including cached prompt tokens, a prompt/output cost split where the
  provider reports it, which device and compute backend produced it, and, for an
  [in-app model](/docs/features/embedded-models#how-much-memory-a-model-takes), the memory it took.

## What it doesn't do yet

The app ships on Android (Google Play) and on Linux desktop as an
[AppImage](/#linux); there is no macOS or Windows build. See
[Background turns](/docs/features/background-turns) for the platform limits on very long
turns while the app is in the background.

More in [Features](/docs/features): [Providers — bring your own LLM](/docs/features/providers) · [On-device models — run fully offline](/docs/features/embedded-models) · [Agents — the thing you build](/docs/features/agents) · [Tools — giving an agent more than the model knows](/docs/features/tools) · [Workspaces — keep your work in scopes](/docs/features/workspaces) · [Attachments — images and files in a message](/docs/features/attachments) · [Context management — what the model still sees](/docs/features/context-management) · [Background turns — replies that keep running](/docs/features/background-turns) · [Local-first & private by design](/docs/features/local-first) · [Sync — your data across your devices](/docs/features/sync) · [Sharing — move agents, tools and providers as a file](/docs/features/sharing) · [Marketplace — find and publish shared agents, tools and providers](/docs/features/marketplace) · [Running a Couchbase Edge Server](/docs/features/couchbase-edge-server) · [Spell checking — catch typos while you write](/docs/features/spell-check)

---

[Bring Your LM](/) · [Docs](/docs/features) · [Marketplace](/marketplace)

[Articles](/articles) · [Releases](/releases) · [Bundle Format](/marketplace/bundle-format) · [Marketplace Terms](/terms) · [App Privacy](/privacy) · [Website Privacy](/website-privacy) · [Open Source](/open-source) · [llms.txt](/llms.txt)
