Stage 1 is the council’s opening round: every model on the council receives the user’s raw question at the same time, answers independently, and returns its response. No model sees any other model’s answer during this stage. The result is a set of uninfluenced, diverse first opinions that Stage 2 will evaluate and rank.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/karpathy/llm-council/llms.txt
Use this file to discover all available pages before exploring further.
How Parallel Querying Works
The entry point for Stage 1 isstage1_collect_responses in council.py. It wraps the user’s text in an OpenAI-compatible message object and hands the list of COUNCIL_MODELS to query_models_parallel:
query_models_parallel in openrouter.py creates one async task per model and awaits them all at once with asyncio.gather():
asyncio.gather() runs every coroutine concurrently, the total latency for Stage 1 is roughly equal to the slowest model, not the sum of all model latencies.
The Individual Model Call
Each task in the gather pool is a call toquery_model, which posts to the OpenRouter API and extracts the message content:
except block catches the exception, logs it, and returns None.
Handling Failures
None responses are filtered out in stage1_collect_responses before anything is added to stage1_results. This means a slow or unavailable model simply does not appear in the Stage 1 output; it does not block the models that did respond. The downstream stages (anonymization, ranking, synthesis) only operate on the successful subset.
The one hard-stop condition is when the filtered list is completely empty — meaning every configured model failed. In that case, run_full_council short-circuits and returns an error response before Stage 2 is attempted.
Stage 1 Response Format
Each successful entry instage1_results is a plain dictionary:
stage1_results list is passed unchanged to both Stage 2 (for anonymized ranking) and Stage 3 (for the Chairman’s context).
Council Model Configuration
The list of council members comes fromCOUNCIL_MODELS in config.py:
Frontend: Tab View of Responses
TheStage1 React component renders one tab per successful response. Clicking a tab shows the full text of that model’s answer, rendered as Markdown via ReactMarkdown. The tab label is the short model name (the segment after the / in the OpenRouter identifier, e.g. gpt-5.1), while the full identifier is shown as a subheading above the response body.
Model identities are fully visible in the Stage 1 tab view. Anonymization only takes effect when the Stage 1 results are handed off to Stage 2. Users reading Stage 1 tabs always know which model produced which response.