Query multiple AI platforms simultaneously
Project description
Chorus
Send one prompt to every major AI. See where they agree.
Chorus is a browser-native multi-AI consultation tool. Write one prompt, send it to ChatGPT, Claude, Gemini, Grok, Perplexity, DeepSeek, Mistral, and Copilot simultaneously — no API keys required. Uses your existing logged-in browser sessions and collects all responses into a D3 flowchart with consensus analysis, sentence-level diff, and Markdown export.
Why Chorus?
| Other tools | Chorus |
|---|---|
| Require expensive API keys | Zero API keys — uses your browser sessions |
| Compare 2-3 AIs | 8 AIs simultaneously |
| Raw text side-by-side | D3 tree + Consensus + Diff views |
| No account switching | Per-platform profile manager built in |
| Responses lost on refresh | Full history persisted to disk |
| Closed source / paid | Fully open source |
Supported Platforms
| Platform | URL used |
|---|---|
| 🟢 ChatGPT | chatgpt.com |
| 🟣 Claude | claude.ai/new |
| 🌀 Gemini | gemini.google.com |
| ✕ Grok | x.com/i/grok |
| 🔭 Perplexity | perplexity.ai |
| 🪟 Copilot | copilot.microsoft.com |
| 🔵 DeepSeek | chat.deepseek.com |
| 🔶 Mistral | chat.mistral.ai |
Features
| ⚡ Zero API keys | Playwright drives your real browser — no tokens, no billing |
| 🔀 Parallel querying | All AIs receive the prompt simultaneously via asyncio.gather |
| 📡 Live progress | WebSocket streams each AI's status (queued → typing → done) |
| 🌳 Tree view | D3.js radial tree — click any node to read the full response |
| 📋 Cards view | Side-by-side response cards with copy button |
| 🎯 Consensus view | Keyword agreement analysis — what all AIs agree on vs. split opinions |
| 🔍 Diff view | Sentence-level diff — unique insights per AI highlighted in blue |
| 🏷️ Prompt templates | 5 built-in templates to get started quickly |
| 📂 Persistent history | All sessions saved to disk — reload anytime |
| ↓ Markdown export | Download any session as a formatted .md file |
| ⚙️ Account switcher | Multiple accounts per platform, switch with one click |
| 🧭 Onboarding wizard | First-run setup guides you through logging into each platform |
| 🔁 Error recovery | Per-platform Retry and Re-login buttons — no full restart needed |
Quick Start
# 1. Install
pip install chorus-ai
# 2. Install Playwright browser
playwright install chromium
# 3. Run
chorus
Open http://localhost:4747
First run: Chorus walks you through an onboarding wizard to log in to each platform. Sessions are saved in
chorus/profiles/and reused automatically.
Adding a New Account (e.g. work Google for Gemini)
- Click the ⚙ icon next to any platform in the Send panel
- Click + Add account and enter a name (e.g.
work) - Chorus opens a fresh browser window — log in as your work account
- Close the login window — the profile is saved
- Select it from the dropdown next time you send
API
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/platforms |
List platforms + metadata |
GET |
/api/platforms/{p}/profiles |
List saved profiles |
POST |
/api/platforms/{p}/profiles/{name} |
Create profile + open for login |
POST |
/api/query |
Start a query session |
POST |
/api/sessions/{id}/retry/{platform} |
Retry a failed platform |
GET |
/api/sessions/{id} |
Session status + responses |
GET |
/api/sessions/{id}/consensus |
Consensus analysis for a session |
GET |
/api/history |
Saved session history |
DELETE |
/api/history/{id} |
Remove a history item |
GET |
/api/export/{id} |
Download session as Markdown |
WS |
/ws |
Live platform status updates |
Project Structure
chorus/
pyproject.toml
requirements.txt
chorus/
main.py # FastAPI app + session orchestration
browser.py # Playwright BrowserManager (persistent profiles)
websocket_manager.py # WebSocket broadcast
selectors.json # All CSS selectors for every platform (one file)
platforms/
base.py # BaseAI ABC
gemini.py
chatgpt.py
claude.py
perplexity.py
grok.py
copilot.py
deepseek.py
mistral.py
frontend/
index.html # Full SPA (D3, WebSocket, consensus engine)
profiles/ # Browser profiles (gitignored)
Adding a New AI Platform
- Create
chorus/platforms/myai.pyextendingBaseAI - Implement
submit_prompt()andwait_for_response() - Add selectors to
chorus/selectors.json - Register in
main.pyPLATFORMSandPLATFORM_METAdicts - That's it — the frontend picks it up automatically
Stack
- Backend: Python 3.10+, FastAPI, uvicorn
- Browser automation: Playwright (Chromium, persistent contexts)
- Frontend: Vanilla HTML/CSS/JS, D3.js v7
- Consensus: Server-side Jaccard similarity + TF keyword extraction
Contributing
See CONTRIBUTING.md. PRs welcome — especially new platform connectors, better selectors for existing platforms, and UI improvements.
License
MIT © Kabi10
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chorus_ai-1.0.0.tar.gz.
File metadata
- Download URL: chorus_ai-1.0.0.tar.gz
- Upload date:
- Size: 49.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b67d182217c3f0a64f4cc291d69a5bf8d704dab6ad5586b291d723f2d59e269
|
|
| MD5 |
71cb46c1a586c2a0f156fa79a7bc050d
|
|
| BLAKE2b-256 |
04d41079c8e5ee7d7ffec70ed8e53d92cceb243ad2fb9c5b07c72ee1f4559a8f
|
File details
Details for the file chorus_ai-1.0.0-py3-none-any.whl.
File metadata
- Download URL: chorus_ai-1.0.0-py3-none-any.whl
- Upload date:
- Size: 46.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8307684cb7e6d9b032503280161231a3a75a0b904801205b4b95089029c78d4
|
|
| MD5 |
e1c5e4f3e9026b1e27e2940fc59330d1
|
|
| BLAKE2b-256 |
c214efd65d93974e128e59cdf16b096d8a81d8a2d41bbaf90a75f6591ba7f933
|