Skip to content
donutchat.com

Progress and stopping

Show what your bot is doing without extra messages, report the real outcome, and stop work only when your bot can actually stop it. The first section describes what DonutChat does for every bot; the rest is guidance for your integration.

DonutChat shows the progress of a bot’s thread reply by itself:

  • While the reply is GN, the iPhone, Android and web apps show Working… under it. While the latest step your bot reported is active or retrying and less than 30 seconds old, they show that step instead, such as Searching…. After 30 seconds without new text or a new report, the line reads Taking longer than usual…. After OK it shows Finished · time, and after FL it shows Response interrupted. Selecting the line opens Response activity.
  • The desktop app shows one progress line, such as Thinking… or Searching…, while the reply has no text yet. Once text arrives, it shows only the text.
  • In every app, the thread link under the top-level message shows 👀 while a bot is writing, 👍 for a bot answer you haven’t read and ⚠️ when the latest bot reply was interrupted.

Your bot reports steps with POST /bots/v1/thread-replies/activity while the reply is GN. Each step is one of a fixed set of actions, such as search or tests, with a status such as active or completed; free text isn’t accepted. Response activity lists the steps. Report progress has the actions and the request format.

While your bot prepares a top-level message, POST /bots/v1/typing shows that it’s typing, with an optional status_text of up to 80 bytes. Send it again every few seconds while you work; on iPhone the indicator disappears about 10 seconds after the last one.

The iPhone, Android and web apps are available in English, Spanish, French, Japanese and Korean, and DonutChat’s labels follow each reader’s app language. The desktop app is in English. Your bot’s text appears exactly as you send it.

DonutChat has no Stop button for bot replies and no API for canceling a bot’s work. If your bot supports stopping, it has to receive and handle the request itself. Whether a stop request reaches your bot depends on its trigger mode:

Trigger modestop as a thread reply@yourbot stop as a thread reply
When mentionedNot deliveredDelivered
All human messagesDeliveredDelivered
Manual onlyNot deliveredNot delivered
  • Card buttons stay disabled while a reply is GN, so a Stop button in a reply that’s still being written can’t be tapped. A tap on a finished card posts an ordinary thread reply in the person’s name that @mentions the bot.
  • Reaction events arrive in every trigger mode, but only for reactions on top-level messages, not on thread replies. Removing a reaction sends reaction.remove.
  • Use one GN reply per request and update it in place. Don’t post a message for each step, a large status card, a restatement of the request or a list of tools.
  • Don’t write Working… into the reply: DonutChat already shows it. Report steps as activity instead.
  • Never replace answer text with status text. Let the partial answer grow in place.
  • While text streams, send about 2–4 updates per second. During a long step with no new text, report the step rather than adding filler, and report it again about every 20 seconds with a higher sequence, so the line doesn’t change to Taking longer than usual….
  • Finish with OK only when the work succeeded.
  • Finish with FL after a failure, a timeout or a stop, and give the reason in one short sentence. People see Response interrupted, so the reason has to be in the text.
  • Never leave a reply in GN after the work has ended. If you can’t tell whether it finished, say that the result is unknown.
  • Keep the partial answer when a request fails or stops, and don’t claim that completed actions were undone.

Offer stopping only if your bot can cancel the work itself: queued requests, the agent run, tool calls and streaming. A prompt, a card or a reaction stops nothing on its own.

  • Tell people how to stop, once. For example: To stop, reply “@yourbot stop”. With All human messages, a plain stop works too.
  • Check who’s asking. Act on a stop request only from the person who made the request, or someone you allow, by comparing sender.id. Card responses are ordinary text that anyone in the chat can type, so check the sender, not the text.
  • Stop only that person’s work. Cancel their active and queued requests to your bot in that thread. Leave other people, threads, chats and bots alone.
  • Handle it right away. Process stop requests ahead of queued work, and never pass them to the agent as a new task.
  • Recognize real requests only. Quoted text, code, tool output and negations such as “don’t stop” aren’t stop requests. Recognize stop phrases in every language you support.
  • Make repeats harmless. A second stop changes nothing, and a late stop doesn’t cancel a newer request.
  • Confirm honestly. While cancellation is in progress, add a short last line such as “Stopping…” under the partial answer. Change it to “Stopped” only after the work has stopped, then finish the reply with FL. If nothing was running, say so.
  • Drop late output. DonutChat ignores GN updates after FL, but a late OK or FL still replaces the text, so discard anything a stopped run produces.

If you also accept a reaction as a stop request, keep it as a second option, and choose an emoji that people can send from every app, such as ❌. For example, the desktop app’s reaction picker has no ⏹️. Reactions work only on top-level messages, such as the message that started the request. Accept only the emoji you document, check reactor.id, and don’t resume work when the reaction is removed.

Use these for typing status text and short notices in your bot’s replies; don’t put Working… in reply text. Write in the requester’s language: their stated preference, otherwise the language of their request, and English only when you can’t tell. The last row lists stop requests to recognize; they’re examples, not exact matches.

enesfrjako
Working…Procesando…Traitement en cours…処理中…처리 중…
Stopping…Deteniendo…Arrêt en cours…停止中…중지 중…
StoppedDetenidoArrêté停止しました중지됨
Stopped your running and queued requests.Se han detenido tus solicitudes en curso y en espera.Vos demandes en cours et en attente ont été arrêtées.実行中・待機中のリクエストを停止しました。진행·대기 중인 요청을 중지했어요.
No requests are running or queued.No hay solicitudes en curso ni en espera.Aucune demande en cours ou en attente.実行中・待機中のリクエストはありません。진행·대기 중인 요청이 없어요.
To stop, reply “@yourbot stop”.Para detenerlo, responde “@yourbot detente”.Pour arrêter, répondez « @yourbot arrête ».止めるには「@yourbot 止めて」と返信してください。멈추려면 “@yourbot 멈춰줘”라고 답장하세요.
stop · cancel · stop alldetente · cancela · detén todoarrête · annule · arrête tout止めて · 停止して · 全部止めて멈춰줘 · 그만해 · 모두 멈춰

Paste this into your agent’s instructions. It shapes what the agent writes; it doesn’t give anyone a way to stop the agent.

Keep progress quiet. Don't post status updates, restate the request or list
your tools: the chat app already shows that you're working.
Reply in the requester's language (English, Spanish, French, Japanese or
Korean); use English only when you can't tell.
Don't claim that work was stopped, canceled or undone unless the system has
confirmed it. If something failed, say so in one short sentence.
Don't offer Stop buttons or emoji shortcuts; stopping is handled outside
your replies.