#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
================================================================
MULTI-IA — Poser une question à plusieurs IA et regrouper
leurs réponses dans un seul fichier.
================================================================
CE QUE FAIT CE SCRIPT
---------------------
1. Vous tapez (ou collez) votre question.
2. Le script l'envoie à chaque IA pour laquelle vous avez mis une clé.
3. Il enregistre toutes les réponses dans un fichier reponses.txt
que vous pourrez ensuite donner à Claude pour qu'il en fasse
la synthèse.
CE QU'IL VOUS FAUT (une seule fois)
-----------------------------------
- Python 3 installé sur votre ordinateur.
- La bibliothèque "requests" : ouvrez un terminal et tapez
pip install requests
- Une ou plusieurs CLÉS API (voir le fichier cles.txt ci-dessous).
Vous n'êtes pas obligée d'avoir toutes les clés : le script
interroge seulement les IA dont la clé est renseignée.
SÉCURITÉ
--------
- Vos clés ne sont JAMAIS dans ce script : elles sont dans un
fichier séparé cles.txt que vous gardez sur votre ordinateur.
- Ne partagez jamais vos clés, ne les collez nulle part en ligne.
COMMENT LANCER
--------------
Dans un terminal, placez-vous dans le dossier du script et tapez :
python multi_ia.py
================================================================
"""
import os
import json
import requests # installé via : pip install requests
# ----------------------------------------------------------------
# 1) LECTURE DES CLÉS API
# ----------------------------------------------------------------
# Le script cherche un fichier "cles.txt" dans le même dossier.
# Format attendu (une ligne par IA, vous ne remplissez que celles
# que vous avez) :
#
# openai = sk-xxxxxxxxxxxxxxxxxxxx
# anthropic = sk-ant-xxxxxxxxxxxx
# google = xxxxxxxxxxxxxxxxxxxx
# xai = xxxxxxxxxxxxxxxxxxxx
#
# Les lignes vides ou commençant par # sont ignorées.
def lire_cles(chemin="cles.txt"):
cles = {}
if not os.path.exists(chemin):
print(f"\n[!] Le fichier '{chemin}' est introuvable.")
print(" Créez-le dans le même dossier, avec vos clés.")
print(" Exemple de contenu :")
print(" openai = sk-...")
print(" anthropic = sk-ant-...")
return cles
with open(chemin, "r", encoding="utf-8") as f:
for ligne in f:
ligne = ligne.strip()
if not ligne or ligne.startswith("#") or "=" not in ligne:
continue
nom, valeur = ligne.split("=", 1)
nom = nom.strip().lower()
valeur = valeur.strip()
if valeur: # on ignore les clés vides
cles[nom] = valeur
return cles
# ----------------------------------------------------------------
# 2) FONCTIONS D'APPEL — une par fournisseur
# Chacune renvoie le texte de la réponse, ou un message d'erreur.
# ----------------------------------------------------------------
def appel_openai(question, cle, modele="gpt-4o"):
"""ChatGPT (OpenAI)."""
try:
r =
requests.post(
"
api.openai.com/v1/chat/compl…",
headers={"Authorization": f"Bearer {cle}",
"Content-Type": "application/json"},
json={"model": modele,
"messages": [{"role": "user", "content": question}]},
timeout=120,
)
r.raise_for_status()
return r.json()["choices"][0]["message"]["content"]
except Exception as e:
return f"[Erreur OpenAI : {e}]"
def appel_anthropic(question, cle, modele="claude-opus-4-8"):
"""Claude (Anthropic)."""
try:
r =
requests.post(
"
api.anthropic.com/v1/message…",
headers={"x-api-key": cle,
"anthropic-version": "2023-06-01",
"Content-Type": "application/json"},
json={"model": modele,
"max_tokens": 2000,
"messages": [{"role": "user", "content": question}]},
timeout=120,
)
r.raise_for_status()
# la réponse est une liste de blocs ; on concatène le texte
blocs = r.json().get("content", [])
return "".join(b.get("text", "") for b in blocs if b.get("type") == "text")
except Exception as e:
return f"[Erreur Anthropic : {e}]"
def appel_google(question, cle, modele="gemini-1.5-pro"):
"""Gemini (Google)."""
try:
url = (f"
generativelanguage.googleapi…"
f"models/{modele}:generateContent?key={cle}")
r =
requests.post(
url,
headers={"Content-Type": "application/json"},
json={"contents": [{"parts": [{"text": question}]}]},
timeout=120,
)
r.raise_for_status()
return r.json()["candidates"][0]["content"]["parts"][0]["text"]
except Exception as e:
return f"[Erreur Google : {e}]"
def appel_xai(question, cle, modele="grok-2-latest"):
"""Grok (xAI). API compatible avec le format OpenAI."""
try:
r =
requests.post(
"
api.x.ai/v1/chat/completions",
headers={"Authorization": f"Bearer {cle}",
"Content-Type": "application/json"},
json={"model": modele,
"messages": [{"role": "user", "content": question}]},
timeout=120,
)
r.raise_for_status()
return r.json()["choices"][0]["message"]["content"]
except Exception as e:
return f"[Erreur xAI : {e}]"
# Table de correspondance : nom dans cles.txt -> (fonction, libellé affiché)
FOURNISSEURS = {
"openai": (appel_openai, "ChatGPT (OpenAI)"),
"anthropic": (appel_anthropic, "Claude (Anthropic)"),
"google": (appel_google, "Gemini (Google)"),
"xai": (appel_xai, "Grok (xAI)"),
}
# ----------------------------------------------------------------
# 3) PROGRAMME PRINCIPAL
# ----------------------------------------------------------------
def main():
print("=" * 60)
print(" MULTI-IA — poser une question à plusieurs IA")
print("=" * 60)
cles = lire_cles()
if not cles:
print("\nAucune clé trouvée. Le script s'arrête.")
return
# Quelles IA sont disponibles ?
dispo = [nom for nom in FOURNISSEURS if nom in cles]
print("\nIA disponibles avec vos clés :")
for nom in dispo:
print(f" - {FOURNISSEURS[nom][1]}")
# Saisie de la question (sur plusieurs lignes ; ligne vide pour finir)
print("\nTapez (ou collez) votre question.")
print("Quand vous avez terminé, appuyez deux fois sur Entrée :\n")
lignes = []
while True:
try:
ligne = input()
except EOFError:
break
if ligne == "" and lignes: # ligne vide après du texte = fin
break
if ligne == "" and not lignes: # ligne vide au tout début = on ignore
continue
lignes.append(ligne)
question = "\n".join(lignes).strip()
if not question:
print("Aucune question saisie. Arrêt.")
return
# Interrogation de chaque IA
resultats = {}
for nom in dispo:
fonction, libelle = FOURNISSEURS[nom]
print(f"\n→ Interrogation de {libelle} ...")
reponse = fonction(question, cles[nom])
resultats[libelle] = reponse
print(" ✓ réponse reçue")
# Écriture du fichier de sortie
sortie = "reponses.txt"
with open(sortie, "w", encoding="utf-8") as f:
f.write("QUESTION POSÉE :\n")
f.write(question "\n\n")
f.write("=" * 60 "\n\n")
for libelle, reponse in resultats.items():
f.write(f"### RÉPONSE DE {libelle}\n\n")
f.write(reponse.strip() "\n\n")
f.write("-" * 60 "\n\n")
print(f"\n✓ Terminé. Toutes les réponses sont dans : {sortie}")
print(" Ouvrez ce fichier, ou donnez-le à Claude pour la synthèse.")
if __name__ == "__main__":
main()