---
title: Use Quick Responses (AI suggestions + snippets)
---

# Use Quick Responses (AI suggestions + snippets)

## What it is

Quick Responses are the two fast-reply surfaces in Omniscio: **AI suggestion chips** (three auto-generated short replies that appear above your input whenever an agent asks a question) and **Snippets** (your own saved canned responses with usage tracking and sort order). They share the same input toolbar so you never have to choose which one to use — the chips are Claude's three best guesses at the sub-100-char reply you're about to type, and snippets are the exact phrases you type over and over. There's also the **Zap button** (⚡) which sends your single one-click preset — the literal "yes, keep going" button for when the agent just needs you to say go. All three work in sessions, SMS threads, and email replies.

## Where to find it

All three surfaces live in the message composer. The AI suggestion chips render in a fixed
120-pixel band below your input whenever an agent asks a question, and the Zap button (⚡) sits in
the input toolbar — in sessions, SMS threads and email replies alike. Your saved snippets live in
the **Quick Replies** virtual project in the sidebar, on the **Quick replies** tab, which is where
you add, edit and reorder them; the Alt+S picker reaches the same library from the composer and
from Quick Launch (Ctrl+Space). A few switches sit under Settings → Quick Replies (numbering
direction, number-key quick send, and the blank-session confirm).

## How it behaves

### How to use it

1. **Let AI chips appear automatically.** When an agent stops and asks a question, three short suggestion pills render in a fixed 120-pixel band below your input (generated by reading the last eight messages). Click one to send, or press **Alt+1**, **Alt+2**, or **Alt+3** without touching your mouse.
2. **Use Zap for one-click "go".** The ⚡ button sits in the input toolbar and sends your pre-configured Quick Reply phrase (default is your most common "keep going"-type reply). Shortcut: **Alt+Z**. Right-click the Zap button to edit the preset — the editor is a vertically-resizable textarea so the preset can be multiline; plain **Enter** inserts a newline, **Ctrl/Cmd+Enter** saves (matches the snippet editor's Body field), and any line breaks you save are preserved verbatim when Alt+Z fires. **Blank-session guard:** on a session you haven't talked to yet (no conversation), the Zap asks **"Are you sure?"** first — the bolt turns amber and a _second_ click (or Alt+Z) actually sends — so a stray click can't fire your canned reply as the session's opening message (a real accident, since there's nothing to reply to). It guards **only** blank sessions; on an active chat one click still sends. A short built-in delay means a fast double-click can't blow straight through it. Turn it off at **Settings → Quick Replies → "Confirm on a blank session"** (on by default). The multi-model **council** composer's Zap gets the identical guard. Both entry points — the bolt and Alt+Z — go through the same gate (`handleQuickReply` in [/src/renderer/src/features/sessions/useSessionPanel/useSessionSend.ts](/src/renderer/src/features/sessions/useSessionPanel/useSessionSend.ts)); the two-step state lives in [/src/renderer/src/stores/quick-reply-confirm-store.ts](/src/renderer/src/stores/quick-reply-confirm-store.ts), "blank" is [`isBlankConversationSession`](/src/renderer/src/features/sessions/empty-state-provider.ts), and the behavior is locked by invariant `blank-session-zap-confirms` in [/.claude/memory/contracts/composer-toolbar-contract.md](/.claude/memory/contracts/composer-toolbar-contract.md).
3. **Save your own Snippets.** Open the **Quick Replies** virtual project in the sidebar, switch to the **Quick replies** tab, and click **+ Add reply**. Name it, type the response text, optionally flip **Auto-submit when selected** (sends immediately instead of just inserting). Drag to reorder — the top ones are what you see first. (Previously this was managed under Settings → Quick Responses; that panel was removed on 2026-05-20 and the sidebar virtual project is now the single home.)
   - **Pin a snippet to a specific engine & model (optional).** In the reply's editor, open the **Behavior** tab → **Advanced options** and flip **Run on a specific engine & model** (off by default = use whatever the session is set to). The exact same engine/brain/model/thinking pickers you use when starting a new session appear — choose the harness, provider, model, and thinking level. When you fire that snippet **on a fresh/empty session** it runs on exactly what you pinned. When you fire it **in a chat that's already going**, it sends on that chat's current engine/model — a running chat can't switch engines mid-conversation — and shows a small note that the pin only applies to brand-new sessions. If the pinned engine isn't set up (or the model isn't available) you get a clear note and the message still sends on the default. A pinned snippet shows a small `Codex · GPT-5.6`-style tag in the list.
4. **Trigger quick replies mid-conversation.** Click the quick-reply menu icon in the input toolbar (or press **Alt+S**) and pick one. The picker opens at the root level — click a folder row to drill into it (horizontal slide animation; top bar shows back arrow + clickable breadcrumb). Search auto-flattens across every folder, prefixing each result with its breadcrumb so you can see where it lives. **Organize without leaving the picker (desktop):** drag any row to reorder it within the current level, drag it onto a folder to drop it inside, and **right-click** a folder — or empty space — to add a **New folder** in place (right-clicking a folder also offers "New folder inside …"); type the name in the inline box and press Enter. Dragging is a mouse gesture (it does nothing on touch — phones keep using the management UI and the right-click "Move to folder…" action), and it's off while a search is active. Quick replies insert the text into your input so you can edit before sending (unless auto-submit is on). The reply drops in **at your cursor as its own paragraph** — one blank line above it (when there's already text) and one blank line below — and the caret lands on the line beneath that lower blank line, so you keep typing in a fresh paragraph under the reply and it never runs into your other text. If your cursor sits in the middle of what you've typed, the trailing text moves down below the reply. (If the input was never focused — e.g. a restored draft you haven't clicked into — the reply appends at the end instead of jumping to the top.) When **auto-submit** is on there's no cursor to place, so the reply is simply joined onto any drafted text with the same single-blank-line separation and sent immediately. Use counts are tracked so the list self-sorts over time. The **same Alt+S picker is also in the Quick Launch (Ctrl+Space) composer** — drop a snippet into a brand-new session's prompt without opening that session first; an auto-submit snippet there starts the session immediately. See [quick-launch-modal.md](quick-launch-modal.md#insert-a-snippet).
5. **Fire a reply — or open a folder — by number.** With the picker open, each row (**a reply or a folder**) shows a small **number badge** — press **1**–**9** to fire that row instantly. A **reply** sends, honoring its own auto-submit-vs-edit setting exactly like clicking it (auto-submit ones send; the rest drop their text in for you to edit); a **folder opens** (drills into it), exactly like clicking it. `1` is the **bottom-most** row in the current view, counting upward — the list opens scrolled to its end with that row highlighted, so the low numbers are the ones you see first. **Prefer `1` at the top?** Flip **Settings → Quick Replies → Numbering direction** to **Top-down** — then `1` is the **top-most** row, counting down, and the picker opens scrolled to the top so the numbered rows are the ones you see. Replies and folders share one sequence in display order (a folder just takes its place in the count); dividers are skipped, and only the **bottom nine** (or **top nine** in top-down) rows get a number — on a longer list it's the on-screen ones at the numbered end. Numbers describe **what's on screen** — open a folder and that folder's contents get numbered. By default they're positional, but you can **pin** a fixed number to a _reply_ in its editor (Behavior tab → **Number key**); pins are global, so reusing a number moves it off the other reply (folders are positional only — they carry no pin), and a pinned number wins in **either** direction. **The picker sorts by these numbers so the badges read in order** — a pinned reply sits at its number's slot (`1` nearest the send box in bottom-up, or the very top row in top-down) and un-numbered replies / folders fill in at the other end. Prefer a numbered reply somewhere specific? **Drag it** there and it stays put — its badge then reads out of order, which is the deliberate override — and **right-click → "Reset position"** snaps it back to its number's slot. Your **pinned** numbers also show up in the **Quick Replies management list** — each pinned reply shows its number as a badge beside its name (only the numbers you set by hand, and only while the feature is on), so you can see and organize them to line up with the picker. Number keys fire **only when the search box is empty** (once you start typing a search the digits become part of your query, and the badges hide). Turn the whole feature off in **Settings → Quick Replies → Number-key quick send** (on by default).
6. **Copy, edit, or delete — right in the picker.** Right-click any quick reply in the Alt+S picker for **Copy** (copies its text to the clipboard), **Edit** (opens it in the Quick Replies editor), **Delete**, and — for a numbered reply you've dragged off its slot — **Reset position** (returns it to its number's place). Delete always asks first — a confirmation dialog (_Remove "X"? You can undo with Ctrl+Z._) — and in the session composer it also drops an **Undo** toast (Ctrl+Z) that restores the reply exactly as it was (position, use count, folder, tags, pin). The **Quick Launch (Ctrl+Space) picker** has the same right-click **Delete**, but as a lighter inline two-step confirm (**Delete** → **Confirm delete** / **Cancel**) with **no Undo** — that floating window closes the moment it loses focus, so the confirm step is the safety net there instead. Deleting in one place refreshes the other picker automatically. Dividers are added in the management UI (`+ Divider`); **folders** can be created either there (`+ Folder`) **or directly in the Alt+S picker** by right-clicking a folder/empty space (see step 4). Reordering and moving items into folders also works **right in the picker** by dragging (desktop) — or use the management UI / the right-click "Move to folder…" action. The picker's bottom **Manage Quick Replies** link jumps to the **Quick Replies** sidebar entry (the _Quick replies_ tab pre-selected) for full library editing — no detour through Settings. From the **Quick Launch (Ctrl+Space) picker** it does the same, but first foregrounds the main window (that floating launcher is its own window, so the link hands you back to the app on the Quick Replies tab instead of just closing).

### Attachments ride along

Anything you've attached to the composer — screenshots, PDFs, text docs — goes with the message no matter which of the three send paths fires it. **Auto-submit snippet** (Alt+S → pick → instant send), **Zap** (Alt+Z), and the regular **Enter** send all funnel through the same shared pipeline, so a screenshot pasted in before you tap Zap rides on that send the same way it would on a typed reply. If the send fails, the attachments come back: the chips reappear in the composer and the in-memory image cache restores so a retry doesn't make you re-attach. (Earlier builds dropped attachments silently on the snippet and Zap paths — fixed in 2026-04. Tests in [tests/unit/hooks/useSessionPanel-drafts.test.ts](/tests/unit/hooks/useSessionPanel-drafts.test.ts) under `useSessionPanel — pendingImages flow through all three send paths` lock this in.)

## For agents

### How it works

The three keyboard shortcuts — `sendSuggestion1|2|3`, `quickReply`, `openQuickReplies` — are declared in [/src/shared/keybindings/core.keybindings.ts](/src/shared/keybindings/core.keybindings.ts) (shortcut declarations are no longer hand-maintained in `keybindings.ts`) and default to Alt+1/2/3, Alt+Z, Alt+S (re-mappable in Settings → Keyboard). The AI chip component is [/src/renderer/src/components/ui/AiSuggestionChips.tsx](/src/renderer/src/components/ui/AiSuggestionChips.tsx) — it mounts in [/src/renderer/src/features/sessions/SessionPanel.tsx](/src/renderer/src/features/sessions/SessionPanel.tsx) (and parallel mountings in the SMS and email viewers), shows an animated skeleton while Claude generates, flashes when you click one, and fires a usage IPC so the prefetcher can cache the next batch. Quick-reply CRUD goes through [/src/main/db/queries-quick-replies.ts](/src/main/db/queries-quick-replies.ts) on the `quick_replies` table (renamed from `response_snippets` at migration v228; the table has no `is_deleted` column — deletes hard-delete) with columns: `type` (`'snippet'|'divider'|'folder'`), `parent_id` (nullable self-FK for nesting — migration v169), `label`, `text`, `auto_submit`, `display_order`, `use_count`, `last_used_at`. Right-click **copy / edit / delete** in the picker flows through the shared [/src/renderer/src/components/ui/QuickReplyContextMenu.tsx](/src/renderer/src/components/ui/QuickReplyContextMenu.tsx) — its optional `onDelete` renders a destructive Delete, and a per-item `keepOpen` flag powers the Quick Launch inline two-step confirm built by the pure [/src/renderer/src/features/quick-launch/quick-launch-snippet-menu-items.ts](/src/renderer/src/features/quick-launch/quick-launch-snippet-menu-items.ts). The composer's delete ([QuickReplyComposerControl.tsx](/src/renderer/src/features/quick-replies/components/QuickReplyComposerControl.tsx)) opens a `ConfirmDialog` and registers a verbatim-restore Undo via `QUICK_REPLY_RESTORE`; the Quick Launch delete ([QuickLaunchModal.tsx](/src/renderer/src/features/quick-launch/QuickLaunchModal.tsx)) calls `QUICK_REPLY_DELETE` directly with no undo. Behavior lock: [/.claude/memory/contracts/quick-reply-delete-undo-contract.md](/.claude/memory/contracts/quick-reply-delete-undo-contract.md). The Zap preset editor is [/src/renderer/src/components/ui/QuickReplyEditPopover.tsx](/src/renderer/src/components/ui/QuickReplyEditPopover.tsx). The text math for dropping a reply into the composer — paragraph isolation, caret placement, and the auto-submit join — lives in the side-effect-free helper [/src/renderer/src/lib/quick-reply-insert.ts](/src/renderer/src/lib/quick-reply-insert.ts) (`insertQuickReplyAtCursor` for the insert-then-edit path, `appendQuickReplyForSubmit` for the auto-submit path), unit-tested in [/tests/unit/lib/quick-reply-insert.test.ts](/tests/unit/lib/quick-reply-insert.test.ts); `handleSelectQuickReply` in [/src/renderer/src/features/sessions/useSessionPanel/useSessionSend.ts](/src/renderer/src/features/sessions/useSessionPanel/useSessionSend.ts) reads the live textarea's `selectionStart`/`selectionEnd` and feeds them to that helper, then restores the returned caret offset after React re-renders. Rate-limit-aware AI generation, cheap-provider routing, and OAuth vs API-key dual paths are all handled by the shared AI suggestion service so chips gracefully fall back to a cheaper model when Claude is throttled. The Alt+S picker stays RAM-backed after its first load. Desktop still pre-warms the
whole library into [/src/renderer/src/stores/quick-replies-store.ts](/src/renderer/src/stores/quick-replies-store.ts)
at app boot (two parallel list/tree IPCs). **Web/mobile** now boots with only a
tiny quick-reply lookup folded into the single `WEB_BOOTSTRAP` startup payload
the phone already fetches, so message-bubble latest-override logic is ready
immediately without dragging the entire picker library through mobile cold-load.
The full list/tree is then warmed in the background at idle right after boot (via
`prefetchQuickReplyLibrary` in [/src/renderer/src/lib/mobile-prefetch.ts](/src/renderer/src/lib/mobile-prefetch.ts)),
so the picker opens instantly on the phone without dragging that library through
cold-load; if it's opened before the warm lands it fetches on the spot as a
fallback. Either way it then stays in memory, and later edits stay current through the
`QUICK_REPLIES_CHANGED` push. (Behavior lock: [/.claude/memory/contracts/quick-reply-picker-open-contract.md](/.claude/memory/contracts/quick-reply-picker-open-contract.md).) A snippet's optional **engine/model pin** (`pinned_provider` / `pinned_model` / `pinned_thinking_level` columns) is applied at fire time by `applyQuickReplyEnginePin` in [/src/renderer/src/lib/quick-reply-engine-pin.ts](/src/renderer/src/lib/quick-reply-engine-pin.ts): on a blank session it sets the session's engine/model (reusing the new-session picker's `applyStartConfigToSession`) _before_ the first message spawns; on an in-progress session it leaves the engine unchanged and returns a note the composer shows. Behavior lock: [/.claude/memory/contracts/quick-reply-engine-model-contract.md](/.claude/memory/contracts/quick-reply-engine-model-contract.md). Landing page: [/docs/intro-sandbox/quick-responses.html](../intro-sandbox/quick-responses.html) — _"When an agent asks a question, Claude reads the last eight messages of the conversation and generates three practical replies — each under 100 characters. You don't type. You click."_

## Related

- [quick-launch-modal.md](quick-launch-modal.md#insert-a-snippet) — the same snippets are reachable from the Quick Launch (Ctrl+Space) composer
- [automations-and-auto-replies.md](automations-and-auto-replies.md) — Auto-replies rules can fire a snippet automatically
- Each snippet has optional auto-title + Plain Speak Latest-override toggles — see [quick-replies.md](quick-replies.md#auto-title--plain-speak-latest-override-per-snippet-opt-in).
- [session-stuck-in-needs-you.md](session-stuck-in-needs-you.md)
