LLM Council explained: what it is and when to use it

LLM Council is the name of Andrej Karpathy’s open-source project that runs the same query through multiple language models at once, and it’s also become shorthand for the broader pattern of using a panel of LLMs instead of betting on one. If you searched for “llm-council,” you might be looking for the project, the pattern, or both.
The honest engineering question buried in that search is whether running a council actually produces better answers than picking a strong single model and prompting it well, and that’s the question I want to answer here.
I’ve been running council-style setups in production-adjacent experiments for about six months. Sometimes the gain is real and measurable. Other times the extra cost and latency buy nothing the best single model didn’t already give me. The pattern is useful but it’s not the default upgrade some of the posts I’ve read make it sound like.
What follows is what the pattern actually is, what Karpathy’s project does specifically, when running a council beats running one model well, and the trade-offs that don’t show up in the demos.
Quick answer: what is an LLM Council?
An LLM Council is a multi-model setup where the same query is sent to two or more large language models in parallel and the responses are either compared side-by-side or synthesized into a single answer by a moderator model. The pattern reduces single-model failure risk, surfaces disagreement as a signal, and tends to outperform any individual model on reasoning-heavy tasks. The cost is N times the model calls, latency limited by the slowest model in the panel, and a more complex evaluation story than running a single model well.
What an LLM Council actually is
The simplest LLM Council is three things. A set of models. A prompt. A way to look at multiple responses to the same prompt.
You can run that on the back of an afternoon. Send the user’s query to Claude, GPT, and Gemini at the same time, print the three responses next to each other, decide which one you like best. That’s a working council. No framework needed.
Most production interest in the pattern is one step past that. Instead of showing the user three answers, you add a fourth model whose job is to read the three answers and produce a synthesized response that draws from the best of each. That fourth model is sometimes called the moderator, sometimes the synthesizer, and it’s where the real engineering happens. Bad synthesis prompts produce worse answers than any individual council member. Good synthesis prompts can produce answers that beat every member of the panel.
The word “council” is doing the lifting here because it implies deliberation. The models aren’t just voting on a final answer. They’re each contributing a perspective that the synthesis step weighs and combines. That framing matters because the pattern only pays off when the panel members actually disagree in informative ways. Three near-identical responses synthesized together produce a near-identical response. The diversity of the panel is what generates the upside.
Karpathy’s llm-council project, specifically
The llm-council GitHub project from Andrej Karpathy is a small, deliberately simple web app that implements the pattern as a UI. You configure the models you want on the panel, type a question, and the app sends the query to each model in parallel. Responses stream in side by side. There’s an optional synthesis step that calls one more model to produce a combined answer.
What makes the project worth looking at, even if you don’t run it yourself, is how stripped down it is. There’s no framework, no orchestration layer, no plugin system. It’s the pattern reduced to its essentials: parallel API calls, side-by-side display, optional synthesis. Anyone reading the source can map the code to the concept in under twenty minutes.
That minimalism is the point. The llm-council repo is closer to a reference implementation than a production tool. Karpathy’s pattern of shipping small, readable projects (nanoGPT, micrograd, llm.c) makes the code itself the documentation. If you want to understand the council pattern, reading the llm-council source is faster than reading three blog posts about it.
If you want to actually deploy a council in production, you’ll outgrow the repo quickly. Production needs cost tracking, retries, error handling on individual panel members, streaming UX for long synthesis steps, eval harnesses, and probably caching. The repo doesn’t pretend to give you any of that. But the core pattern is right there to copy.
When an LLM Council actually helps
Council setups pay off on a narrow but real slice of workloads. The clearest case is reasoning-heavy questions where models disagree usefully: hard math problems, code review of subtle bugs, analysis tasks where the right answer requires combining evidence. On those queries, different models often arrive at different chains of reasoning, and the synthesis step can pull the strongest steps from each. The lift over the best individual model isn’t huge (single-digit percent in the evaluations I’ve run) but it’s reproducible.
A close second is high-stakes decisions where a confident wrong answer creates real consequences. Medical triage assistants, legal document review, financial analysis. What the council pattern buys you here isn’t only better answers, it’s an explicit disagreement-detection layer. When the panel members diverge, you can route to a human instead of returning either answer. That’s a safety feature single-model setups can’t easily replicate, and it shows up in audit reviews as a real signal of conservative design.
Creative tasks benefit for a different reason. Brainstorming, naming, alternative phrasings, design exploration; the value comes from showing the user multiple distinct responses rather than synthesizing them. The synthesis step gets skipped, the side-by-side display is the product, and the user picks. That’s not really a “council” so much as parallel sampling with diversity, but the pattern lives in the same code.
The last good fit is hallucination detection on factual queries. When two models confidently disagree about a factual claim, the disagreement itself is signal. A simple cross-model check before answering catches a meaningful share of hallucinations that single-model verification misses, and it’s cheap to implement relative to the alternatives (RAG, citation enforcement, dedicated verifier models).
When an LLM Council is the wrong answer
The same pattern hurts more than it helps on a different slice of workloads. The shift in the math is the same in each case: the cost of running multiple models always lands, but the quality lift only shows up when the workload generates useful disagreement among them.
The clearest no-fit is simple lookups. Queries like “what’s our refund policy” or “summarize this 200-word document” get answered correctly by any strong single model, and a council just adds latency and cost on top. The pattern’s value comes from disagreement, and easy queries don’t generate any. Same logic applies to latency-sensitive UX: a user-facing chat with a 200ms target can’t afford to wait for three model calls plus a synthesis, even when those calls run in parallel. The slowest model in the panel sets the floor.
Cost-constrained workloads run into the same wall from a different direction. Three model calls per query is three times the API bill, and the synthesis step makes it four. At consumer-product scale (millions of queries a day), that math just doesn’t pencil out. Council patterns belong on medium-volume, accuracy-sensitive workloads, not on high-volume general traffic.
The final failure mode is the one teams adopt the pattern and then catch themselves making: homogeneous panels that don’t actually generate diversity. Running the same query through three near-identical models (three GPT-4 variants, for instance) produces near-identical responses, which the synthesis step then averages into a near-identical answer. The diversity has to be real for the pattern to work at all. Mix model families. Mix sizes. Mix providers. A council of three OpenAI models is just expensive sampling.
How to build an LLM Council in practice
If the workload looks like a fit, the build is straightforward. A working LLM Council comes down to three pieces: a panel of diverse models, a parallel-call layer, and a synthesis prompt for combining the responses.
The panel is where the design decisions live. Pick models from different families so the responses actually diverge: Claude, GPT, and Gemini cover three different training pipelines and produce real diversity, and adding an open model like Llama or Mistral extends the range further. The trap to avoid is stacking three models from the same provider, because the diversity gain disappears and you’re paying for samples that mostly agree.
Once the panel is decided, the parallel-call layer is straightforward engineering. The simplest implementation is asyncio in Python or Promise.all in TypeScript. Each model gets the same prompt, you collect responses as they arrive, and total wall-clock time is determined by whichever panel member responds last.
import asyncio
import anthropic, openai
async def call_panel(prompt: str):
claude = anthropic.AsyncAnthropic()
gpt = openai.AsyncOpenAI()
claude_resp, gpt_resp = await asyncio.gather(
claude.messages.create(
model="claude-sonnet-4.6",
messages=[{"role": "user", "content": prompt}],
max_tokens=1024,
),
gpt.chat.completions.create(
model="gpt-5",
messages=[{"role": "user", "content": prompt}],
),
)
return {
"claude": claude_resp.content[0].text,
"gpt": gpt_resp.choices[0].message.content,
}For the synthesis step, the prompt is where the engineering lives. You’re asking a model to read multiple responses and produce a final answer. The prompt needs to instruct the synthesizer to identify disagreements, weigh evidence rather than just average, and flag uncertainty when the panel diverges. A weak synthesis prompt (“combine these answers”) produces mush. A strong one (“identify points of agreement, explain disagreements, then produce a single answer that draws from the strongest reasoning in any of the responses”) produces real lift.
The model doing the synthesis should be at least as capable as the panel members. Using a weaker model to synthesize stronger ones loses the gain. I usually use Claude or GPT in their flagship sizes for synthesis even when the panel includes smaller models.
Council variations worth knowing
The basic parallel-and-synthesize council is the simplest pattern, but it’s not the only one. A few variations show up in production setups.
The specialized council is the variation that moves furthest from the basic pattern. Instead of asking every panel member the same question, you assign different models to different aspects: one handles fact-checking, another handles code analysis, another handles tone. The synthesis combines their domain-specific outputs into a single response. It’s more setup than the basic version, but on multi-aspect tasks it consistently outperforms the parallel one.
Where the specialized council restructures the panel, the debate council restructures the conversation. Panel members critique each other’s responses across multiple rounds before synthesis: Model A answers, models B and C critique A’s response, A revises based on the critique, and the cycle repeats. The debate pattern is significantly heavier on model calls per query, but it produces stronger reasoning on hard problems. Du et al.’s 2023 paper on multi-agent debate documented real gains on math and reasoning benchmarks, and the pattern has been refined since.
Both of those variations pay for capability with more model calls per query. The routing council goes the other direction: it tries to reduce the cost by deciding when the full panel is actually needed. A small fast model reads the query first and decides which panel members to involve, sending simple queries to one model and fanning out to the full panel only when the query needs the depth. This is the pattern most production deployments converge on once the cost of always-fan-out becomes uncomfortable, and it’s the realistic way to make council patterns financially viable at higher traffic.
Cost and latency, in concrete numbers
A three-model parallel council with a synthesis step costs roughly 4 to 5 times what a single-model query costs, depending on how long the synthesis output runs. At current API prices, a query that costs $0.01 against a single strong model costs $0.04 to $0.05 against a council.
Latency depends on which models are in the panel. If the slowest panel member takes 4 seconds and the synthesis takes 2 seconds, total wall clock is 6 seconds. That’s roughly 3x the single-model latency. Streaming the synthesis output to the user helps mask the wait but doesn’t eliminate it.
For a workload doing 100K queries a month, single-model costs land around $1K. Council costs land around $4K to $5K. Whether that’s worth it depends entirely on the quality lift on the queries that matter to you. If the council is right 5% more often on the queries where being right actually counts, the math probably works. If the lift is in the noise on your eval set, you’re paying for nothing.
The bias to watch out for is letting the impressive side-by-side display in the UI convince you the pattern is helping when the eval numbers don’t move. Always run a controlled eval before committing to a council in production.
FAQ
If you’ve run a real eval comparing a council to a strong single model on a workload that matters to you, the numbers nobody publishes are the most useful contribution to this conversation. There’s plenty of pattern explanation in this space and very little measurement-grounded reporting. Whether the council beat the baseline, by how much, on what kind of queries, and what it cost – that’s the data the next wave of practitioners will use to decide.