This release is a pre-release and may not be stable for production use.
quorumdeck
A terminal console for running several AI agents — on different models, from different providers — side by side in one session.
Most terminal LLM clients give you one model at a time and a dropdown to switch.
quorumdeck starts from the opposite premise: the interesting thing is what happens
when a Claude agent, a GPT agent and a local Llama agent all answer the same
question at once, and you can see the answers, the latency and the cost next to
each other.
Bring your own model. Bring several.
┌─ Claude · anthropic/claude-opus-5 ─┬─ GPT · openai/gpt-5 ───────────────┐
│ › Design a token bucket limiter │ › Design a token bucket limiter │
│ │ │
│ Use a monotonic clock and lazy │ A token bucket needs four pieces │
│ refill rather than a background…▌ │ of state: capacity, tokens,…▌ │
│ │ │
│ 1204→318 tok · $0.0089 · 4.1s │ 1204→402 tok · $0.0051 · 2.8s │
└────────────────────────────────────┴────────────────────────────────────┘
ready · fanout × 2 · 1922 tok · $0.01
Status: alpha (0.1). The
singleandfanoutpatterns work end to end.debate,pipelineandjudgevalidate in config but are not implemented yet — see ROADMAP.md.
Why this exists
| Compare honestly | Same prompt, same moment, same screen. Per-agent tokens, cost and wall-clock, so "which model should we use for this" stops being a vibe. |
| One bill, many providers | 100+ backends through LiteLLM — Anthropic, OpenAI, Gemini, Bedrock, Groq, Mistral, OpenRouter, Ollama, anything OpenAI-shaped. |
| Agents as config | A deck is a YAML file you commit next to the code it is about. Share a deck, not a screenshot. |
| Keys stay out of the repo | Credentials live in the OS keychain (or the environment). agents.yaml is safe to check in. |
Install
Requires Python 3.11+.
# Run without installing
uvx quorumdeck@0.1.0a1
# Or install
uv tool install quorumdeck --prerelease=allow # or: pipx install --pip-args=--pre quorumdeck
Releases are pre-1.0 alphas for now, so installers need to be told to accept
them. Once the orchestration patterns below are all implemented, 0.1.0 proper
drops the extra flag.
Quick start
deck config init # writes ~/.config/quorumdeck/agents.yaml
deck keys set anthropic # prompts; stored in the OS keychain
deck # launch the TUI
One-shot, no UI — pipes and scripts welcome:
deck run "Explain this stack trace" < trace.txt
deck run --pattern fanout "Which index would you add here?"
Configuring a deck
agents.yaml is the whole interface. Precedence: --config → ./quorumdeck.yaml
→ ~/.config/quorumdeck/agents.yaml.
version: 1
deck:
pattern: fanout # single | fanout | debate | pipeline | judge
title: Compare
defaults:
temperature: 0.7
timeout_s: 120
agents:
- id: claude
name: Claude
model: anthropic/claude-opus-5
system_prompt: Answer concisely. Show the tradeoff, not just the answer.
- id: gpt
name: GPT
model: openai/gpt-5
- id: local
name: Local
model: ollama/llama3.3
api_base: http://localhost:11434
Model ids are LiteLLM ids: provider/model. More in examples/.
Orchestration patterns
| Pattern | What one prompt means | Status |
|---|---|---|
single |
One agent answers. Ordinary chat. | ✅ shipped |
fanout |
Every agent answers the same prompt in parallel, side by side. | ✅ shipped |
debate |
One agent answers, another critiques, the first revises, for rounds. |
🚧 0.2 |
pipeline |
A planner decomposes the task; worker agents execute the steps. |
🚧 0.2 |
judge |
Agents answer, then a designated judge merges or scores. |
🚧 0.2 |
Unimplemented patterns are rejected at runtime with a clear message rather than silently falling back — the config schema is stable ahead of the runtime on purpose.
Keys
deck keys list # where each provider's key comes from
deck keys set openai # store in the OS keychain (never echoed)
deck keys rm openai
Environment variables (ANTHROPIC_API_KEY, OPENAI_API_KEY, …) always win over
the keychain, so CI and containers work without a keyring backend. Local backends
like Ollama and credential-chain backends like Bedrock need no key at all.
Keyboard
| Key | Action |
|---|---|
enter |
Send |
ctrl+l |
Clear panels |
ctrl+s |
Save session to ~/.local/share/quorumdeck/sessions/ |
f1 / ? |
Help |
ctrl+q |
Quit |
Architecture
The layering is the load-bearing decision, not an aesthetic one:
src/quorumdeck/
core/ agent · orchestrator · session · events · messages · costs
providers/ base (the port) · litellm_provider (the only adapter today)
config/ schema (pydantic) · loader · secrets (keychain)
tui/ app · widgets · screens
cli.py
Two rules hold it together, and both are enforced by the test suite:
core/imports no vendor SDK and no UI framework. It is pure async Python over its own event vocabulary, which is why every orchestration pattern is testable against a scripted fake provider with no network.tui/imports no provider. It consumescoreevents. Adding a backend never touches the UI; adding a UI never touches a backend.
If LiteLLM turns out to be the wrong engine, replacing it means writing one new
module in providers/ that satisfies the Provider protocol — roughly 80 lines —
and changing nothing else.
Development
uv sync
uv run pytest
uv run ruff check .
uv run textual run --dev quorumdeck.tui.app:QuorumDeckApp # with devtools
Contributions welcome — see CONTRIBUTING.md. The most useful places to start are listed in ROADMAP.md.
License
MIT. See LICENSE.
Metadata
Release files for quorumdeck 0.1.0a1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| quorumdeck-0.1.0a1.tar.gz | 219.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| quorumdeck-0.1.0a1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 250.6 kB
Release files / quorumdeck-0.1.0a1.tar.gz
| Download URL | quorumdeck-0.1.0a1.tar.gz |
|---|---|
| Size | 219.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0a5b259b5fc98a1669c844797436fb645a2ba727c32a6fdb54a4a4652faa223b
|
|
BLAKE2b-256 checksum How to use checksums |
a1178c54e94889452e756581e79f0f7f6ff26c365592e382a32a8bc889a58d04
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency logRelease files / quorumdeck-0.1.0a1-py3-none-any.whl
| Download URL | quorumdeck-0.1.0a1-py3-none-any.whl |
|---|---|
| Size | 31.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8f9d18812c372e2fc206814280a40735da6bb97b5e4d94bc23090a9cc4e9e61b
|
|
BLAKE2b-256 checksum How to use checksums |
72c421dbe28f103a031e031b6d40b5c80b8a677dc04dca0113de1ec128a081ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 15, 2026.
Transparency log