Ajout génération de messages par IA via l'abonnement ChatGPT

- Provider chatgpt de LiteLLM (Sign in with ChatGPT, sans clé API)
- Module ia.py : login device-code, token local portable (.chatgpt/), génération streaming
- Routes /api/message, /api/ia/login, /api/ia/status
- UI : boutons Générer/Peaufiner par prospect, connexion ChatGPT + modèle IA dans les Paramètres
This commit is contained in:
jerem
2026-06-13 16:25:41 +02:00
parent 02180f1c7b
commit 328bf29d59
5 changed files with 344 additions and 5 deletions

39
app.py
View File

@@ -12,6 +12,7 @@ from flask import Flask, Response, jsonify, request, send_file, stream_with_cont
import excel
import extractor
import ia
import scraper
import trajet
@@ -42,6 +43,7 @@ CONFIG_DEFAUT = {
"Seriez-vous disponible pour en échanger ?\n\n"
"Bien cordialement,"
),
"ia_modele": ia.MODELE_DEFAUT,
}
app = Flask(__name__, static_folder="static")
@@ -309,7 +311,7 @@ def api_config_lire():
def api_config_ecrire():
donnees = request.get_json(silent=True) or {}
config = lire_config()
for cle in ("adresse_depart", "modele_message"):
for cle in ("adresse_depart", "modele_message", "ia_modele"):
if cle in donnees:
config[cle] = str(donnees[cle])
for cle in ("conso_l_100km", "prix_carburant", "cout_peage_km"):
@@ -327,6 +329,41 @@ def api_config_ecrire():
return jsonify({"ok": True, "config": config})
@app.get("/api/ia/status")
def api_ia_status():
return jsonify(ia.statut_login())
@app.post("/api/ia/login")
def api_ia_login():
try:
return jsonify(ia.lancer_login())
except Exception as e:
return jsonify({"error": "login", "message": f"Échec du démarrage de la connexion : {e}"}), 502
@app.post("/api/message")
def api_message():
donnees = request.get_json(silent=True) or {}
prospect = donnees.get("prospect") or {}
mode = donnees.get("mode") or "generer"
if not prospect.get("Nom du prospect"):
return jsonify({"error": "prospect_vide", "message": "Prospect sans nom."}), 400
config = lire_config()
try:
message = ia.generer_message(
prospect, config.get("modele_message", ""), mode,
nom_modele=config.get("ia_modele") or ia.MODELE_DEFAUT,
)
return jsonify({"message": message})
except ia.IANonConnecte as e:
return jsonify({"error": "non_connecte", "message": str(e)}), 401
except ia.IAErreur as e:
return jsonify({"error": "ia", "message": str(e)}), 502
except Exception as e:
return jsonify({"error": "erreur", "message": f"Échec de la génération : {e}"}), 500
@app.get("/api/distance/<int:idx>")
def api_distance(idx):
lignes = lire_prospects()