---
title: Multi-Model Council — asking, verdicts and cost (part 2)
---

# Multi-Model Council — asking, verdicts and cost (part 2)

## What it is

This is part 2 of the [Multi-Model Council](multi-model-council.md) page. It covers what happens once a council exists and you put a question to it.

## Where to find it

Inside an open council, and from a session's own question box — both described below.

## How it behaves

### Asking the council from a session's question

When a coding session asks you a multiple-choice question — the lettered **A / B / C** options of the question widget — you often can't tell which option is right, and picking the recommended one blind is how a bad choice gets locked in. The question widget therefore carries an **Ask the Council** button that hands that exact question to a council for a second opinion.

Clicking it:

1. **Packages the question.** Every question in the widget (a widget can hold several) and **every option in full** — the letter _and_ its whole text, never just "A" — plus recent conversation from that session so the panel can see the reasoning the agent already gave for each option. The packet is capped at 16 000 characters, trimming the conversation first so no question or option is ever cut.
2. **Opens a council in the standalone AI Council.** Always the project-less one, never a council inside your project — which matters, because an in-project council is [always an agent with full file access](#orchestrator-agent-mode) and would go and _do_ the work instead of advising. If the standalone AI Council isn't available for any reason, Omniscio creates **nothing at all** and tells you so, rather than falling back to the kind that can edit files.
   - **First time?** If you've never set up a council — or have no usable template — the [guided setup wizard](#guided-setup-wizard) opens first so you can pick your panel. Your question is held while you set up and asked the moment the council exists, so you never have to go back and click the button again.
3. **Asks the question once.** Exactly one paid turn per click, however fast you click or however the panel re-renders.
4. **Leaves your session alone.** The question stays unanswered and the session keeps waiting — asking the council is not answering the question, and anything you'd already selected or typed is preserved.

The council then debates it like any other question. When the verdict lands, use **Send verdict to session** in that turn's [⋯ menu](#per-turn-actions-menu) to hand the answer back to the waiting session in one click. The link between the two survives restarting Omniscio, so you can come back to a council days later and still return its verdict to the session that asked.

### If the council needs more information

A debate-only council has no way to stop and ask you something — the judge is instructed to produce a final answer, and your session is sitting there waiting on one. So the packet tells the panel what to do when it is short of a decisive fact: **name in one line what it would need to be sure, state the assumption it is making instead, and still commit to an option.** You get "assuming you're on Postgres, B — tell me if it's SQLite and I'd say A", never a vague "it depends" or a silent guess.

If you want to supply the missing detail, just type it into the council's own composer as a follow-up. The council replays your original question, every option and the captured conversation into that next turn, so nothing is lost and you don't have to repeat yourself — you can answer in a few words. (You can't type while a turn is running; one debate at a time. Wait for the verdict, then reply.)

What it can't do is go back and fetch more from your session — the conversation it sees is a one-shot snapshot taken when you clicked. If the panel wants to see an actual file or error message, paste it in yourself.

A few things to know:

- **It costs money**, like any council question, and counts toward the same daily cap.
- **Each ask opens its own council**, so two questions never collide and one question's debate never contaminates another's.
- **Your conversation goes to the models on your panel**, which may include non-Anthropic ones. It passes through the same scrubbing every council question already does.
- **There is no keyboard shortcut**, deliberately: in the question widget every letter key picks an option, Space picks the recommended one, and Ctrl+Enter sends.

### What a verdict shows

A finished turn shows four things, and nothing else:

- **The verdict itself**, in full and up front — never truncated, never behind a "read more". While the judge is still writing it, it streams in live.
- **"Refining with the panel…"** — a spinner beneath the answer while the verdict is _provisional_: the answer is settled but the panel is still double-checking it, so the wording can still change.
- **Show reasoning** — one collapsed toggle holding the evaluator's analysis of the panel and the judge's own reasoning for weighing them as it did. Collapsed by default, because the answer is usually all you want.
- **What it cost** — "This question cost about $0.04." Hidden while a verdict is still being refined, since the figure isn't final until the turn is.

**There is deliberately no row of buttons under the verdict.** Everything you can _do_ with a turn — copy it, share it, re-run it, export it, send its verdict back to the session that asked — lives in the [⋯ menu](#per-turn-actions-menu) instead, so the answer stays uncluttered.

That menu sits in the **top-right corner of the answer**, and on a desktop it stays invisible until you hover over the answer (or reach it with the keyboard). On a phone it is always visible. If you have ever wondered where the actions went, that is why.

Two actions that used to sit under the verdict are gone on purpose, and should not be reinstated without a reason: **Open as a Claude session** was removed because a council running inside a project already _is_ an agent, and **Send to Writer** went when the native Writer integration was dropped.

### Per-turn actions menu

Every answered turn carries an ellipsis (**⋯**) button in its top-right corner — hidden until you hover the turn on desktop, always shown on touch. It opens a menu of six actions scoped to that one turn (its question, every panelist answer, and the verdict):

- **Copy Markdown.** Copies the whole turn as plain Markdown — question, each answer under its model heading, and the verdict.
- **Copy Formatted.** Copies the same content as rich text (HTML) so it pastes with formatting into docs and email; falls back to Markdown if the browser can't offer rich text.
- **Copy link.** Copies a private `omniscio://` deep link that reopens Omniscio and scrolls straight to this turn. It only works inside the app on this machine — nothing is published.
- **Share link.** Publishes the turn as a public web page (a read-only snapshot — not forkable, not live-updating) and gives you a URL anyone can open. This is the only action that leaves your machine.
- **Re-run from here.** Drops the turn's question back into the composer so you can tweak the wording and ask again. It does **not** auto-send — you stay in control of the edit. (Only shown while the composer is available.)
- **Send verdict to session.** Sends the judge's verdict back into the session that asked this council the question. Only appears when this council was started from a session (see [Asking the council from a session's question](#asking-the-council-from-a-sessions-question)) **and** the turn actually produced a verdict — a cancelled, failed or still-running turn has nothing to send. The session receives the verdict framed as the council's answer; your chat bubble shows a short one-line preview rather than the whole wall of text.
- **Export ›.** A submenu that saves the turn as a **Word (.docx)** or **PDF** file, or publishes it to a new **Google Doc**. Word and Google Docs entries appear only when those features are enabled in Settings.

**Settled-gating.** Sharing or exporting an empty turn would produce a blank page, so **Share link** and **Export** stay disabled (with an explanatory tooltip) until the turn actually has content — an answer or a verdict. Copy, Copy link, and Re-run stay available the whole time, since they're useful even mid-run.

There is no public help-site page for this menu — the AI Council itself is a hidden Labs feature (`AMC_SHOW_MULTI_MODEL_COUNCIL=1`), so this library page is its home.

### Debate mode

Set **Debate rounds** (1–4) in the Edit panel for a council to enable multi-round debate:

- **1 round (default):** Each model answers the question once in isolation, then the judge synthesizes their answers — today's standard behavior.
- **2–4 rounds:** After the first isolated round, each subsequent round re-prompts every panelist with the other panelists' previous-round answers so they can refine or respond to each other. The judge synthesizes from the _final_ round only. Answers in the verdict are grouped by round so you can follow how opinions evolved.

The rounds setting is persisted per council and editable at any time via the gated `COUNCIL_UPDATE_ROUNDS` channel.

### Attaching files

Click the **paperclip** (`data-ui-anchor="council-attach-files"`) next to the question composer — or **drag files anywhere onto the council panel** — to attach one or more files to a question. Text files are inlined as a reference block that every panelist and the judge can see when answering that question; **images are sent natively as vision content** (Anthropic base64 image blocks; OpenAI-compatible providers get the same images as `image_url` data URLs).

A few things to know:

- **Text + images only.** Text/code files and PNG, JPEG, GIF, and WebP images are accepted. Everything else — office documents, PDFs, and other binaries (including BMP/SVG) — is **skipped with a notice naming the file**, because a council turn ships text and image blocks, never a saved file path an agent could `Read`. This is the one place Omniscio is stricter than the main session composer, which _does_ take Office/PDF and extracts them server-side. To bring a spreadsheet to a council, ask in a project session instead, or paste the relevant rows as text. Each image is capped at 5 MB (the Anthropic per-image limit) and at most **5 images** ride one question — extras are listed by name so the panel knows they exist.
- **Whether a file is text is decided by its type, not its bytes.** The council checks the declared MIME (or the extension when the OS reports none) rather than scanning for binary markers — a byte scan wrongly rejected UTF-16 text and wrongly accepted binaries as garbled text.
- **Drag-and-drop.** The whole panel is a drop target, with the same dashed accent overlay the session composer shows. Dropped files run the identical validation and produce the identical notices as the paperclip.
- **Screenshot button.** When "Show screenshot button" is enabled in Settings, a camera button (`data-ui-anchor="council-screenshot-button"`) captures the Omniscio window and attaches it as a real PNG image attachment.
- **Agent panelists are text-only.** A panelist running as an agent (a spawned CLI session) receives the text reference block but not the images — there is no image channel into a CLI prompt.
- **Capped for safety.** Each text file is trimmed to 16 000 characters; the combined total across all attached files is capped at 48 000 characters. Content beyond those limits is replaced with `[…truncated]`.
- **Per-question scope.** The files ground that one question only. Follow-up questions in the same council do not inherit the attachments — each question starts fresh.
- **Verdict acknowledgement.** When a turn used attachments the verdict footer shows "Grounded in: …" listing the filenames so you can see at a glance which files informed the answer.
- **Chips in the composer.** Each attached file appears as a chip (`data-ui-anchor="council-attachment-chip"`) you can remove before asking.

### Conversation memory model

On a follow-up question the council "remembers" the conversation — but not through each other. Each member model sees the prior **judge verdicts** as the assistant turns in its conversation history, never the other members' raw responses. This keeps cross-model contamination out of the follow-up reasoning and makes the memory model predictable: what the council collectively "said" is always the judge's synthesized answer.

### Cost model

All council spending is recorded under a single cost-source label `'multi-model-council'`, regardless of which models ran. A configurable daily dollar cap is checked before each turn starts: if today's total would exceed the cap, the turn is rejected with a user-facing message. The cap check **fails open** on a database read error — the turn proceeds rather than blocking the user on an infrastructure hiccup.

Knowledge (plain-API) panelists log their spend directly under this label via `llmProviderService.chat`. **Agent panelists meter into their spawned session's `sessions.cost_usd`** (the NDJSON turn engine, not `api_cost_log`), so on completion `runAgentPanelist` reads that finished session cost and logs it once into the same `'multi-model-council'` ledger via `trackApiCostRaw`, keyed by an idempotent `operationId` of `'council-agent:<sessionId>'` (`ON CONFLICT(operation_id) DO NOTHING` makes a re-delivered capture a no-op — never double-counted). This is the single source of truth: because both the turn total (`turnCost()`) and the daily cap read `getTodayCostByLabel('multi-model-council')`, the agent's real cost now flows into the verdict footer ("This question cost about $X") and the cap automatically — no separate per-member sum is added anywhere (the council-table `costMicroUsd` on `insertMemberResponse` is display-only and never touches `api_cost_log`). The cost write lands synchronously before the session's terminal `SESSION_STATUS_CHANGED` push that completion waits on, so the read is race-free.

A **spend readout** at the bottom of the council panel shows today's spend vs the cap (sourced from `COUNCIL_COST_TODAY`). It appears **only when there is real metered spend** — i.e. pay-as-you-go API-key billing. Because subscription answers are recorded at $0 (see the auth-source note above), a pure-subscription user's today-total stays $0 and the readout is hidden entirely (and such a user can never approach the cap, so nothing is lost). When it does show, the thresholds are never color-alone: at 80 % of the cap it turns amber with a warning icon and "approaching the daily cap"; at 100 % it turns red and says the cap is reached and questions are paused until tomorrow.

Configure the cap (and which models to use as members / judge) in **Settings → Council**. The **Edit panel** editor inside each council also lets you change the judge model for that council specifically, independently of the global default in Settings.

### Feature gating

Every IPC handler asserts the feature is enabled via `isUnreleasedFeatureVisible('multi-model-council', ...)` before doing any work. The renderer navigation and settings panel gate via `isUnreleasedFeatureVisibleInRenderer`. Flip the feature to `'shipped'` in `UNRELEASED_FEATURES` to release it for all users without a code change. See Omniscio’s unreleased-feature (“Lab”) gate for the gating mechanics.

## For agents

### Where the code lives

| Layer                | Path                                                                                                                                                                                                                                                                                   |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Orchestrator         | `src/main/services/council/council-service.ts` (`runCouncilTurnCore`, `startCouncilTurn`, `cancelCouncilTurn`)                                                                                                                                                                         |
| Prompts / parse      | `src/main/services/council/council-prompts.ts`                                                                                                                                                                                                                                         |
| Agent panelists      | `src/main/services/council/council-agent-spawn.ts`, `council-project-resolve.ts`, `council-agent-answer.ts`                                                                                                                                                                            |
| Cost cap             | `src/main/services/council/council-cost-cap.ts`                                                                                                                                                                                                                                        |
| DB queries           | `src/main/db/queries-council.ts` + the `council*` tables migration                                                                                                                                                                                                                     |
| IPC handlers         | `src/main/ipc/council-handlers.ts` (includes `COUNCIL_COST_TODAY`, `COUNCIL_UPDATE_JUDGE`, `COUNCIL_CANCEL`)                                                                                                                                                                           |
| IPC channels / types | `src/shared/ipc-channels/council.ts`, `src/shared/ipc-schemas/council.ts`, `src/shared/push-event-schemas/council.ts`, `src/shared/types/council.ts`                                                                                                                                   |
| UI                   | `src/renderer/src/features/multi-model-council/CouncilSessionPanel.tsx`, `CouncilSessionConfigBar.tsx`, `CouncilTurnView.tsx`, `CouncilVerdict.tsx`                                                                                                                                    |
| Setup wizard         | `src/renderer/src/features/multi-model-council/CouncilSetupWizard.tsx`, `council-setup-wizard-steps.tsx`, `council-wizard-config.ts`                                                                                                                                                   |
| Renderer store       | `src/renderer/src/stores/council-store.ts`                                                                                                                                                                                                                                             |
| Settings             | No dedicated Settings page — council config lives in-panel via `src/renderer/src/features/multi-model-council/CouncilSessionConfigBar.tsx`                                                                                                                                             |
| Standalone surface   | `COUNCIL_PROJECT_ID = '__council__'` in `src/shared/virtual-project-ids.ts`, seeded by `src/main/services/ensure/ensure-council-project.ts`                                                                                                                                            |
| Ask from a session   | `src/renderer/src/lib/council-launch.ts` (the ONE fail-closed launcher, shared with the Prompt Tools row), `council-ask-payload.ts` (the pure packet builder), the button in `src/renderer/src/components/ui/QuestionWidget.tsx`, and the `seededQuestion` slice in `council-store.ts` |
| Return the verdict   | `src/renderer/src/features/multi-model-council/CouncilTurnActionsMenu.tsx`; the origin is the council session's own `parentSessionId`, set from the optional `originSessionId` on `COUNCIL_SESSION_CREATE`                                                                             |

Tests: `tests/unit/council/` (service, prompts, cost-cap), `tests/unit/db/` (schema, store), `tests/unit/stores/council-store.test.ts`, `tests/e2e/ui/council.spec.ts`.

## Related

- [Multi-Model Council](multi-model-council.md) — the overview page this continues.
- [ai-spend-alerts.md](ai-spend-alerts.md) — being told when spending crosses a line you set.
- [attach-a-file.md](attach-a-file.md) — attaching a file to a normal session instead.

