Skip to main content
Messaging apps have no streaming text box, so a streamed model answer is best sent as a few natural bubbles, each sent as soon as it is complete, with the typing indicator on in between.
TypeScript

What reply() does

conversation.reply(input) accepts a string, a kind object (basic, buttons, …), a list of them, or a stream. With a stream it:
  1. Shows the typing indicator, and keeps showing it (channels clear it after a few seconds).
  2. Reads text out of the stream as it arrives.
  3. Cuts a bubble at each natural break (below) and sends it while the model is still writing. Bubbles go out in order.
  4. Stops refreshing typing when the stream ends, even if it failed. Typing has no “off”: it clears itself when the next message goes or after a few seconds.
It reads these streams as they are, with no adapter: Each bubble is a basic message, sent exactly as written: no markdown is rendered or stripped. Ask the model for plain text, or style text yourself in a kind object with a channel block (telegram.parse_mode, imessage.styles).

The bubble rule (for any language)

Without the SDK, apply this rule to the model’s text and send each bubble as a basic message (POST /v0/conversations/{conversation_id}/basic with {"text": ...}), one after another, showing typing (POST .../typing with {}) before you start and every 4 seconds until you finish.
  1. A bubble ends at a paragraph break (a blank line), except after a lead-in line that ends with : and between items of one list, unless the bubble is already past the channel’s soft length.
  2. Past the soft length, a bubble ends at the next sentence end (. , ! , ? or … followed by a space).
  3. Never cut inside a fenced code block, unless the bubble would pass the channel’s hard limit; then cut at the last line break or space before it.
Use the event’s ID plus the bubble’s index as each send’s Idempotency-Key (evt_...:0, evt_...:1), so retrying a failed reply never sends a bubble twice.

Showing work while the agent thinks

For tool calls, retrieval or anything slow before the first word:
Messages in one conversation go out one at a time, in the order they were accepted, across every endpoint, webhook replies and the stream, so bubbles never arrive out of order even when you send them quickly.