LLM Council
App locale qui fait débattre 4 intelligences artificielles sur ta question pour donner la meilleure réponse possible.
À quoi ça sert
Une seule IA peut se tromper, halluciner, ou être biaisée par son entraînement. En posant la même question à 4 modèles différents (OpenAI, Anthropic, Google, xAI) et en les faisant s'autoévaluer en aveugle, tu obtiens une réponse plus solide qu'avec un seul.
Décisions stratégiques
M&A, pricing, positionnement marché. 4 avis croisés valent mieux qu'une voix unique.
Sujets techniques pointus
Architecture, choix de stack, debug obscur. Les modèles ont chacun des forces différentes.
Anti-hallucination
Si un modèle invente une stat, les 3 autres le dénoncent au Stage 2 (review croisée).
Comment ça marche, en 3 étapes
Tu poses ta question
Elle est envoyée en parallèle aux 4 modèles. Chacun répond indépendamment, sans voir ce que les autres écrivent.
Pourquoi: éviter que les réponses se contaminent mutuellement.
Les modèles se notent en aveugle
Chaque modèle voit les réponses des autres SANS savoir qui les a écrites, puis les classe par qualité (précision, profondeur).
Pourquoi: l'anonymisation empêche un modèle de favoriser sa propre famille. Le jugement est forcé d'être objectif.
Le Chairman synthétise
Un des 4 modèles est désigné Chairman (par défaut Claude Sonnet 4.5). Il lit toutes les réponses ET les notes, puis produit la réponse finale.
Pourquoi: tu obtiens une seule réponse cohérente plutôt que 4 morceaux à recoller.
Lancer l'app
Première fois sur ce Mac
Ouvre l'app Terminal (Cmd+Espace, tape "Terminal", Entrée). Colle cette commande, puis Entrée:
cd ~/Desktop/CLAUDE/llm-council && ./start.sh
Le script fait 4 choses automatiquement:
- Nettoie les anciennes sessions qui traîneraient en mémoire (process zombies)
- Vérifie que les 4 modèles + le Chairman existent vraiment sur OpenRouter (sinon il s'arrête avec un message clair)
- Lance le backend (le cerveau de l'app) sur le port 8001
- Lance le frontend (l'interface visuelle) sur le port 5173
Puis ouvre http://localhost:5173 dans Safari ou Chrome. C'est l'interface de chat.
Le tout premier lancement prend 20-30 secondes (uvicorn et vite démarrent). Les fois suivantes c'est instantané.
Arrêter l'app
Dans le terminal où l'app tourne, appuie sur les touches du clavier Control + C ensemble, comme tu appuierais sur Cmd + S pour sauvegarder.
Ne tape PAS le texte "Ctrl+C" suivi de Entrée. C'est une combinaison de touches physiques, pas une commande à taper. Si tu tapes "Ctrl+C", zsh te répond "command not found".
Le Control+C coupe backend et frontend en même temps. Si ça ne s'arrête pas (rare), lance dans un autre terminal:
llmkill
(installation détaillée dans la section troubleshooting ci-dessous)
Si ça plante
"Address already in use" sur le port 8001 au démarrage
Cause: un ancien backend tourne encore en mémoire. Tu as probablement fermé une fenêtre Terminal sans faire Control+C avant. Il occupe toujours le port 8001, un peu comme une ligne téléphonique squattée.
Fix automatique: le start.sh de ce repo nettoie tout seul avant de démarrer. Si tu vois encore l'erreur, lance:
llmkill && ./start.sh
Si tu n'as pas installé llmkill, utilise la version longue:
pkill -9 -f "python -m backend.main"; pkill -9 -f "vite"; sleep 1 && ./start.sh
Stage 3 affiche "Unable to generate final synthesis"
Cause: le modèle Chairman a planté. La raison la plus fréquente: son slug (identifiant) sur OpenRouter a été retiré ou renommé (surtout pour les modèles "preview").
Fix: lance le script de vérification des slugs:
cd ~/Desktop/CLAUDE/llm-council && uv run check-models.py
S'il indique MANQUE pour un modèle, édite backend/config.py et remplace le slug par un des candidats valides que le script te propose.
Seulement 2 modèles répondent au Stage 1 sur 4
Même cause que ci-dessus: 2 slugs sont obsolètes côté config. Le script check-models.py les identifie en quelques secondes.
Depuis la dernière mise à jour de ce repo, check-models.py tourne automatiquement à chaque ./start.sh et bloque le démarrage si un slug est cassé. Donc ce problème ne devrait plus arriver.
"Repository not found" sur un repo GitHub public
Cause: ton Mac envoie des identifiants GitHub d'un ancien compte (jowideweb suspendu). GitHub ne dit pas "non autorisé", il fait poliment semblant que le repo n'existe pas.
Fix:
gh auth logout --user jowideweb
gh auth status
Vérifie qu'il ne reste que dimjohn en compte actif.
"command not found: Ctrl+C"
Cause: tu as tapé "Ctrl+C" au clavier puis Entrée. Le shell pense que c'est une commande.
Fix: ce n'est pas une commande, c'est une combinaison de touches. Appuie sur la touche Control du clavier et garde-la enfoncée, puis appuie sur C. Relâche les deux. C'est tout.
Installer "llmkill" pour tuer les zombies depuis n'importe quel terminal
Une seule commande à coller dans Terminal (sélectionne tout du cat à installe."):
cat >> ~/.zshrc << 'EOF'
# Tue les process LLM Council
llmkill() {
pkill -9 -f "python -m backend.main" 2>/dev/null
pkill -9 -f "vite" 2>/dev/null
pkill -9 -f "npm run dev" 2>/dev/null
echo "LLM Council process killed."
}
EOF
source ~/.zshrc && echo "llmkill installe."
Après ça, tape llmkill depuis n'importe quel terminal pour nettoyer en un mot.
Changer les modèles du conseil
Édite backend/config.py (clic droit sur le fichier dans Finder, "Ouvrir avec" TextEdit ou VS Code). Tu y trouves la liste:
COUNCIL_MODELS = [
"openai/gpt-5.1",
"anthropic/claude-sonnet-4.5",
"google/gemini-3.1-pro-preview",
"x-ai/grok-4.20",
]
CHAIRMAN_MODEL = "anthropic/claude-sonnet-4.5"
Configs testées au 2026-05-29
| Use case | Suggestion |
|---|---|
| Qualité max | GPT 5.1 + Claude Sonnet 4.5 + Gemini 3.1 Pro + Grok 4.20 |
| Cost-efficient | GPT 5.1 + Claude Sonnet 4.5 + Gemini 2.5 Pro + DeepSeek v3.1 |
| Chairman fiable | anthropic/claude-sonnet-4.5 (GA, pas preview) |
Trouver les slugs disponibles
Pour lister les modèles d'une famille (remplace gemini par claude, gpt, grok, deepseek):
curl -s https://openrouter.ai/api/v1/models | python3 -c "import json,sys; [print(m['id']) for m in json.load(sys.stdin)['data']]" | grep -i gemini
Après avoir édité config.py, relance ./start.sh. Le pre-flight check te confirme que les nouveaux slugs sont valides avant de démarrer.
Mises à jour
Vérifier que les modèles existent toujours
OpenRouter retire et renomme régulièrement des modèles, surtout les "preview". Le script check-models.py tourne automatiquement à chaque ./start.sh et bloque le démarrage si un slug a sauté.
Pour le lancer à la main (sans démarrer l'app):
cd ~/Desktop/CLAUDE/llm-council && uv run check-models.py
Récupérer les nouveautés du repo upstream (Karpathy)
Si Karpathy publie une amélioration sur son repo:
cd ~/Desktop/CLAUDE/llm-council
git remote add upstream https://github.com/karpathy/llm-council.git
git fetch upstream
git merge upstream/master
La première ligne (git remote add) ne se fait qu'une fois. Les fois suivantes, juste fetch + merge.
Si Git signale un conflit avec tes modifs perso (config.py, start.sh), garde tes versions: git checkout --ours backend/config.py start.sh.
Le projet est marqué "vibe coded, non supporté". Tu peux pull les updates s'il y en a, mais ne t'attends pas à des fixes réguliers. C'est sain de considérer ton fork comme la version de référence.
Glossaire pour non-dev
- Terminal
- L'app Mac où tu tapes des commandes texte au lieu de cliquer. Cmd+Espace puis "Terminal" pour l'ouvrir.
- Backend
- Le "cerveau" de l'app. C'est lui qui appelle les modèles OpenRouter. Tourne sur le port 8001. Pas d'interface visible.
- Frontend
- L'interface visuelle dans le navigateur (boutons, chat, tabs des réponses). Tourne sur le port 5173.
- Port
- Un numéro qui identifie une "ligne de communication" entre programmes sur ton Mac. 8001 et 5173 sont les lignes utilisées par cette app. Si un autre programme y parle déjà, conflit.
- Slug
- L'identifiant technique unique d'un modèle. Exemple:
openai/gpt-5.1est le slug de GPT 5.1 sur OpenRouter. Il faut le bon slug exact, sinon l'app ne sait pas à qui parler. - API key (clé API, token)
- Un mot de passe spécial qui prouve à un service (OpenRouter, GitHub, etc.) que c'est bien toi qui demandes. À garder secret comme un mot de passe normal.
- OpenRouter
- Service qui te donne accès à plein de modèles (OpenAI, Anthropic, Google, xAI, DeepSeek) avec une seule clé API. L'app utilise ta clé pour leur parler à tous.
- Process zombie
- Programme que tu croyais arrêté mais qui tourne encore en mémoire. Sur Mac il continue d'occuper son port même si tu as fermé le terminal. Solution:
pkilloullmkill. - uv
- Outil qui installe les dépendances Python (le backend).
uv syncinstalle tout ce qu'il faut. - npm
- Équivalent de
uvmais pour JavaScript (le frontend).npm installinstalle les dépendances. - git
- Système qui suit les versions du code.
git pullrécupère les changements des autres,git pushenvoie les tiens. - GitHub
- Plateforme qui héberge les repos git. Le "Google Drive du code".
- Fork
- Copie perso d'un repo public pour y faire tes modifs sans toucher l'original. Tu as forké
karpathy/llm-councilenabovefear/llm-council. - Stage 1 / Stage 2 / Stage 3
- Les 3 étapes de la réponse. Stage 1 = les 4 modèles répondent. Stage 2 = ils se notent en aveugle. Stage 3 = le Chairman synthétise.