Sending & receiving messages
Generation runs through a single FIFO queue and Loach exposes whatever the provider reports. Most message-level oddities trace back to one of those two facts.
My new message is stuck on “waiting”
You sent a prompt in one chat but it shows a spinner without streaming anything.
Loach runs one generation at a time across all chats. If another chat is busy, your message is parked in a FIFO queue, and the chat shows a Waiting for other chats to finish… card.
- Wait for the current generation to finish, or
- Click Respond now on that card. This cancels the current runner (keeping what it wrote so far) and starts yours. Cancel on the same card withdraws your prompt instead.
- If nothing seems to be generating, the running chat may be paused on a tool approval card. The waiting card then reads Waiting for your approval of a tool call in “…” and offers Go to it - answer the card there. See Tools, MCP & folders for replies stuck on Waiting for your approval….
- While Private Chat is open, queued regular chats don’t start; close it and they carry on.
See Concurrency & queue for the full rules.
The reply stopped halfway and shows an error
A streaming reply errored, and the bubble ends with an italic error line starting with ⚠.
Whatever streamed before the failure is kept - open the message’s … menu and use Copy message if you want to preserve it. To get a full answer, send the same prompt again, or click Regenerate in the same menu if it’s there (it’s offered on the last reply only). If errors repeat, see Providers & connections or Performance & VRAM.
An error line saying the reply stopped mid-reply means the server itself broke off partway: Ollama’s model runner crashed or ran out of memory, or an OpenAI-compatible server sent an error in the middle of the stream. The text after the colon is the reason, when the server gave one.
A reply you stopped yourself, or one cut short by Respond now, also keeps its partial text but gets no error line.
I see no “thinking” trace even though the model supports reasoning
A reasoning model is selected but no thinking block appears above the answer.
- Open the Parameters panel (Ctrl + Shift + P) and confirm the Thinking toggle is on for this chat. If it starts off in every new chat, check Settings → Features → Thinking and the model’s Allow thinking step switch on its page under Models.
- Make sure the model actually advertises the
thinkingcapability - when it doesn’t, the Thinking row in the panel is disabled with This model doesn’t support a thinking step. Many tags of the same base model differ on this. - The Thinking toggle is Ollama-only. In a chat on an OpenAI-compatible provider it’s disabled and reads off; a thinking block still appears there only if the server streams its reasoning as a separate
reasoning_contentorreasoningfield (some DeepSeek, vLLM, llama.cpp and OpenRouter setups do, and so does Ollama’s own/v1endpoint).
A formula shows as raw TeX instead of rendering
The reply contains \frac{a}{b} or similar and you see the source, not typeset math.
Which case it is:
- Broken TeX renders as its own source on purpose, with the parse error on hover - that keeps a half-typed formula quiet while it streams rather than flashing an error. Hover it to see what KaTeX objected to.
$…$didn’t typeset. Single dollars are treated as currency unless the span reads as math: it has to hug both delimiters, stay on one line and under 200 characters, not follow a word character, and not be chased by a digit. “$5 and $10” and “US$5” stay prose by design. Ask the model for$$…$$,\(…\)or a```mathfence if you need the ambiguous case.- Nothing renders at all. Math is always on, with no setting to find, so this is more likely a delimiter the model didn’t emit - check the raw text via Copy message. Math inside backticks or a code fence (such as
```latex) stays code on purpose; only```mathfences typeset.
See LaTeX math for the full rules.
The metrics chip is missing or doesn’t match my provider
A reply has no tokens-per-second chip, or its token count or speed doesn’t line up with what the backend or your provider’s dashboard reports.
- No chip at all. The chip appears only once a reply finishes. Replies you stopped, ones cut short by Respond now, and ones that ended in an error don’t get one.
- Different token count. The chip counts completion tokens only - not the prompt. Ollama reports the count itself; OpenAI-compatible endpoints only do so when they honour Loach’s request for a usage report. Older proxies ignore it, and Loach then counts streamed chunks as an approximation.
- Different speed. When the backend reports no timing of its own (always the case on OpenAI-compatible endpoints), the rate is worked out from the wall clock, so it includes model loading and prompt processing.
See Generation stats for what each number means.
Compact context is greyed out or won’t run
The Compact context button in the context-usage popover is disabled, or compacting shows an error.
- Greyed out. The button needs at least six messages that haven’t been compacted yet and a quarter of the context window in use.
/compactonly needs the six messages. - “Chat is busy”. Wait for the chat’s reply to finish (or for its queued prompt to run) first. Only one chat compacts at a time.
- “Compaction failed”. The summary is written by the chat’s own model, so provider errors apply; a summary that takes more than three minutes is abandoned. Nothing in the chat changes, so you can try again - or, on an Ollama chat, Expand context window in the same popover instead.
See Context & compaction.
Replies are off-topic, repetitive, or too short
The model is technically responding but the quality is poor.
Open the Parameters panel. Temperature, Max Tokens and Repeat Penalty only appear in its Advanced view:
- Lower Temperature for more focused answers, raise it for more variety.
- Raise Max Tokens if the answer keeps cutting off.
- Raise Context Length if the model is forgetting earlier turns. A longer context uses more VRAM.
- Increase Repeat Penalty (default 1.1; try up to 1.3) if the model loops. On an OpenAI-compatible chat, Repeat Penalty is ignored and Context Length isn’t sent - the server decides, and Loach only sizes the context bar and Library sources by it, assuming 32k until you set the model’s real window - so use Frequency Penalty for loops instead.
- Click Reset to defaults (or Reset to model defaults) below the sliders to discard per-chat overrides and fall back to the model’s and app defaults.
Check the chat’s instructions too: in a Space with its own instructions, the chat’s Additional instructions are ignored. See Per-chat instructions.
An HTML preview shows the page but nothing on it works
In the code canvas, buttons, games or animations on a previewed page do nothing.
Previews open with the page’s scripts off - markup and styles only - and the bar above the page reads Offline sandbox · scripts off. Click Run scripts to turn them on for that page; another code block, or an edit to this one, starts with them off again. On macOS and Linux the preview runs on Loach’s own thread, so a script that never ends freezes the whole app until you quit it - only run pages you’re willing to restart for. While the reply is still streaming, the preview reads The preview appears when the code finishes generating. and Run scripts stays disabled until it’s done.
If the page still misbehaves with scripts on:
- It may load a library or stylesheet from the web (a CDN
<script src>, Tailwind, Chart.js). Previews are offline, so nothing from the web arrives - ask the model for a self-contained page. - Pop-ups and dialogs such as
alert()do nothing, and forms don’t submit.
See HTML preview.
A message starting with / ran a command instead of sending
You typed a message that begins with /, and a command ran - or a Command failed notice appeared - instead of the message going to the model.
When the first word after the / is a slash command, Enter runs the command rather than sending. A command that fails - /new idea answers /new doesn’t take arguments. - leaves your text in the message box to fix. Anything else that starts with /, such as a path like /etc/hosts, is sent as a normal message, and so is text that starts with // or with / and a space (a // comment): those never open the command palette. To send text that begins with a command name, put a word before the slash.