ask_all
Send one prompt to multiple AI models in parallel and compare their labeled answers side by side. Add discussion rounds to surface disagreement and refine the council's conclusions.
Instructions
Ask several members the SAME prompt in parallel, returning their answers side by side and labeled by model.
By default every configured member answers. Pass models to ask only some of
them; the schema lists the valid ids.
rounds (1-3, default 1) runs a real discussion. With rounds=2 the members
first answer independently, then each is asked again — this time carrying the
question plus every answer from round 1, its own and the others', verbatim — and
asked to revise. Members are stateless, so carrying the previous round back to
them is the whole mechanism: without it a second round is just the same question
asked twice. The transcript returns round by round, so you can see who moved and
who held their ground.
One round is a survey of opinion. Two is worth the extra latency and tokens when the answers are likely to disagree and the disagreement is the interesting part.
rounds is chosen before anything has been asked, which is the one thing wrong
with it: you commit to a second round without having read the first, and a
council that turns out to agree costs exactly what one still arguing would. When
you would rather look first, ask with rounds=1 and then call revise with the
answers — it runs one more round on demand, as many times as you judge it worth,
and it has no ceiling. Reading before you buy is usually the cheaper of the two:
one more round is another full call per member, while revise costs you only the
answers written back into it.
guests seats answers you already have. If you spawned a subagent on this same
question, or formed your own view first, pass it here as {label, text} and it
joins the table: it appears in round 1 beside the members, and from round 2 the
members are shown it verbatim and argue with it. This is the difference between
an answer that is in the discussion and one that is merely next to it — without
it, the models never learn your subagent had an opinion. Pass the text verbatim,
not a summary; a summary is not what you want critiqued.
A guest speaks once and does not revise, so it appears in round 1 only. The transcript says so, and says it is not a retraction. From round 2 the members are told to answer its strongest point rather than pass over it: a seat that cannot restate itself is the one a discussion drops by default, and dropping it reads in the transcript exactly like answering it.
steelman seats a standing objection. A council mostly agrees, and its agreement
is the least informative thing it produces — the strongest case against a plan is
not volunteered by members who think the plan is fine. Pass {} and one member
writes that case each round, against whatever the table has converged on, and it
goes back to everyone as an ordinary anonymous answer:
ask_all(prompt, rounds=3, steelman={})Note what is and is not assigned. No member is told to argue a side it does not
hold, so what the members say is still what they think; the assignment lives in
one extra call they are not told about, and they answer it as they answer any
other seat. It speaks every round rather than once, because an objection that
cannot reply to its own rebuttal is quoted rather than represented, and by the
third round the table is arguing with its paraphrase of it. tenure buys fewer
rounds than that, and when the seat is retired early the transcript says it was
retired by configuration rather than answered — an unexplained silence reads as a
position abandoned. You are told what the seat was and who wrote it; the members
are not, because a model that knows an argument was commissioned discounts it
instead of answering it. Read what it says as the strongest objection this
council can produce to order, never as evidence that anyone holds it.
Members may carry different weights — how much this council trusts each one. When they do, every answer is labeled with its weight and the transcript ends with the ranking and how to read it. The members are never told each other's weights; a model told it is outranked stops arguing, and its dissent is what you came for.
materials hands the council the thing the question is about — a spec, a log, a diff, a screenshot — instead of you pasting it into prompt. Give {path, label} for a file, or {text, label} for something with no file behind it. Prefer a path: the members are then handed the file's exact bytes rather than your reproduction of them, you do not spend a copy of the whole document writing this call, and every member and every round get an identical copy, which is both what makes their answers comparable and what an endpoint's cache can match. Images go this way too, and are the case that matters most: describe a screenshot in prose and every member inherits the same description, so anything you misread is misread by the whole council at once. It is carried into every round for you, so a discussion
about one document costs you the path once.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| guests | No | ||
| models | No | ||
| prompt | Yes | ||
| rounds | No | ||
| system | No | ||
| steelman | No | ||
| materials | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |