Asking a single LLM gives you one perspective. Different models excel at different things. This sends your question to several models at once, has them evaluate each other anonymously (to prevent bias), and a chairman model synthesizes the best final answer. All streamed live to a battle-arena UI. Fork of Karpathy's llm-council: 16 of its 39 files diverge — the whole backend plus the arena UI — and the other 23 are his, unchanged.
Your question goes in parallel to 2–6 models. Side-by-side panels with colors and word counts. If fewer than 2 respond, it automatically retries the failed ones and then tries backup models.
Each model receives the anonymized answers ("Response A/B/C…") and produces a ranking with justification. An aggregate ranking is computed and shown as a podium with medals.
A chairman model analyzes all the answers and evaluations and synthesizes a concise final answer (3–4 paragraphs). If it fails, it retries and then tries each backup sequentially.
| Aspect | Original | This fork |
|---|---|---|
| Model selection | Hardcoded in config.py | Dynamic UI over the current free-model list |
| Number of models | Fixed (4) | Configurable 2–6 from the frontend |
| Chairman model | Fixed | Selectable separately |
| Retry/fallback | None | Full retry + backup chain |
| Error visibility | Generic | Type-specific per model (timeout, rate_limit…) |
| Language | English | Full Spanish (UI + answers) |
| UI | Basic tabs | Arena with panels, podium, timeline |
stage1_start → [stage1_retry …] → stage1_complete → stage2_start → stage2_complete → stage3_start → [stage3_retry …] → stage3_complete → title_complete → complete
Free-tier models have rate limits and outages. Stage 1: retries failures + backup models. Stage 3: the chairman retries and then tries 7 backups sequentially. Every failure returns a structured error type visible in the UI.
A separate repository packages this backend and frontend into a standalone .exe with PyInstaller: the build copies the source to a temporary workspace, points the API at the same origin, compiles the Vite bundle and ships the Python runtime inside it, so the target machine needs neither Python nor Node. ARCHITECTURE.md and NOTICE.md document the structure and the third-party components.
The repository publishes the build system, not a release. Nothing in it reproduces a clean-machine install, an update path or code signing — it is packaging source, not a shipped product.
View packaging source