Quorum enables simultaneous conversations with multiple Large Language Models, allowing you to compare responses, synthesize insights, and leverage the strengths of different AI providers in a single interface.
Note: Quorum is designed to be self-hosted β you bring your own API keys and run it locally or on a server only you can reach. The
/api/llmendpoint has no auth or rate-limiting, so don't expose a Quorum instance to the public internet without adding those yourself.
- π€ Multi-Model Conversations - Query multiple LLMs simultaneously
- π Response Synthesis - AI-powered synthesis of multiple model responses
- π° Cost Tracking - Real-time cost estimation for API usage
- π¨ Intuitive UI - Clean, responsive interface with model-specific color coding
- β‘ Latest Models - Support for cutting-edge models from all major providers
- ποΈ Customizable - Adjustable temperature and system prompts
Quorum currently ships configs for 80+ models across 10+ providers. A few highlights:
- Anthropic β Claude Fable 5, Mythos 5, Opus 4.8, Sonnet 4.6, Haiku 4.5
- OpenAI β GPT-5.5, GPT-5.4 (+ Mini/Nano), o3, o4-mini
- Google β Gemini 3.1 Pro, 3.5 Flash, 2.5 Pro/Flash
- xAI β Grok 4.3, Grok 4.20 Beta, Grok 4
- Meta β Llama 4 Maverick, Llama 4 Scout (via DeepInfra)
- DeepSeek β V4 Pro/Flash, V3.2 Exp, R1 (via DeepInfra)
- Qwen β Qwen3.5 / Qwen3.6 family (via DeepInfra)
- Moonshot β Kimi K2.6, K2.5 (via DeepInfra)
- Zhipu AI β GLM-5.1, GLM-4.7 (via DeepInfra)
- Open source β Gemma, Mistral, GPT-OSS (via DeepInfra)
The full registry β including pricing, context windows, and provider routing β lives in lib/llm.js. To add or update a model, edit modelConfigs there.
- Node.js 18+
- npm or yarn
- API keys for the providers you want to use
- Clone the repository:
git clone https://github.com/tap2k/quorum.git
cd quorum- Install dependencies:
npm install- Set up environment variables:
cp .env.example .env- Add your API keys to
.env. You only need keys for the providers whose models you actually plan to use:
ANTHROPIC_API_KEY=your_anthropic_key
OPENAI_API_KEY=your_openai_key
GOOGLE_API_KEY=your_google_key
XAI_API_KEY=your_xai_key
DEEPINFRA_API_KEY=your_deepinfra_key # gateway for Meta, DeepSeek, Qwen, Moonshot, Zhipu, Gemma, Mistral, GPT-OSS
# Optional
NEXT_PUBLIC_SITE_URL=http://localhost:3000
DEBUG_LLM=1 # log reasoning/thinking output to server console- Start the development server:
npm run dev- Select models by clicking on them in the model bar
- Type your message and press Enter
- View responses from all selected models side-by-side
- Compare different perspectives and approaches
- Click "Synthesize" after receiving multiple responses
- An AI model will analyze and combine insights from all responses
- Useful for getting a balanced, comprehensive answer
- System Prompt: Click "System Prompt" to set custom instructions
- Temperature: Adjust creativity/randomness (0 = focused, 1 = creative)
- Synthesis Model: Choose which model synthesizes responses
- Individual response costs shown next to model names
- Total conversation cost displayed in header
- Costs estimated based on token usage
Handles all LLM operations:
action: 'chat'- Single model conversationaction: 'multi-chat'- Multiple models in parallelaction: 'synthesize'- Synthesize multiple responses
quorum/
βββ pages/
β βββ index.js # Main UI and conversation logic
β βββ api/
β βββ llm.js # API endpoint for LLM calls
βββ lib/
β βββ llm.js # LLM service and model registry
βββ styles/
β βββ globals.css # Tailwind CSS styles
βββ public/ # Static assets
βββ next.config.mjs
βββ eslint.config.mjs
βββ postcss.config.mjs
βββ jsconfig.json
βββ package.json
βββ AGENTS.md # Codebase guide (also linked from CLAUDE.md)
βββ LICENSE
βββ README.md
Edit lib/llm.js and add to modelConfigs:
'model-id': {
provider: 'provider-name',
modelName: 'api-model-name',
displayName: 'Display Name',
color: '#HexColor',
cost: { input: 0.00, output: 0.00 }, // per million tokens
}Reasoning models (OpenAI o-series, GPT-5+, Claude Fable 5, Mythos 5, Opus 4.8/4.7, and others) don't accept a custom temperature and instead use a reasoning_effort parameter. lib/llm.js handles these per-model differences automatically β you can leave the temperature slider in the UI and the right thing will happen.
# Run development server
npm run dev
# Build for production
npm run build
# Start production server
npm run start
# Run linter
npm run lint- "Field required": Check if the model expects different parameter names
- "Temperature not supported": Some models only support default temperature
- "API key not configured": Ensure the corresponding API key is set in
.env
Costs are estimated using character count (1 token β 4 characters). For exact costs, refer to provider documentation.
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
MIT License - see LICENSE file for details
Built with:
- Next.js - React framework
- Tailwind CSS - Styling
- Provider APIs: Anthropic, OpenAI, Google, xAI, DeepInfra
For issues, questions, or suggestions, please open an issue on GitHub.