MemoDocumentation
EN

Streaming Responses

  • Token-by-Token Rendering: Watch the AI "type" its responses in real-time.
  • Thinking State: A pulsing "Memo is thinking..." status provides visual feedback before the first token arrives.
  • Cursor UI: A blinking terminal-style cursor (▊) follows the stream.
  • Never looks frozen (v4.6.0): while a turn runs, a progress line at the bottom shows the current phase and an elapsed timer that ticks every second ("The model is thinking · 0:45"), and keeps moving after a tool finishes. If nothing at all has arrived for 30 seconds it turns into an orange "no word from the server" warning. The backend sends a heartbeat chunk after every 10 quiet seconds, so a long silent thinking phase is not mistaken for a dropped connection.
  • Ended by silence, not length (v4.6.0): a plain chat reply is cut only after 300 seconds with nothing arriving (the wait for the first word included) or a 30-minute safety cap — not at a fixed 300 s total, which used to cut still-flowing long answers and save them as "stopped". A timeout is marked as such and the text received so far is kept. Agent turns keep their own 1200 s budget.
  • Context ring (v4.6.0): a ring in the engine strip at the foot of the chat shows how full the model's context window is (amber, then red as it nears the compact point); tapping it opens a popover with used / window, a segmented bar, a row each for messages, summarized earlier conversation, system prompt, memory, skills, tool definitions and the new message, the free space and the auto-compact buffer — and, for a Subscriptions model, the account's usage meters (5-hour session and weekly for Codex/Claude, the model's own figure for Antigravity) with time to refill. The size is the provider's own prompt + reply token count when reported (the parts are scaled to it), else a ~ estimate. GET /api/context.
  • Auto-compact at 90% on every provider (v4.6.0): once the whole prompt — system prompt, tool schema, history and the new message — reaches CompactThresholdPct (default 90; a saved 60 is migrated) of the model's real window, or the provider's own count from the previous turn is already there, the oldest ~60% of the history is condensed into one summary message and the rest stays verbatim. The same rule for local, API and Subscriptions models (Minimal Mode skips it: it promises no Memo-initiated model calls). The agent tool schema is now taken off the history's share on API turns too.
  • Readable provider errors (v4.6.0): a failed request is explained in a sentence in the UI language with the HTTP status as a small tag — safety refusal, used-up allowance, rate limit, wrong/expired key (Subscriptions: "sign in again"), forbidden, unknown model, conversation too long, timeout, provider down, no network, other refusals — instead of ⚠️ [custom] status 400: … request ID …. Applied where a failure becomes something a person reads (the SSE chunk and the saved message), so the quota card, the task loop and retries still see the raw text; the raw text is logged.
  • Other chats that are still working show the same small spinner (and a "just finished" mark) in the sidebar — background tasks, WhatsApp/Telegram replies and a second browser tab included.
  • Images in chat are stored on the server and loaded through it, so they show up in the web build and on phones too, not only in the desktop app next to the server.

Source document