Public Access
maj auto 2
This commit is contained in:
1 parent
db2b137d6b
commit
98bd4d7fbf
5 files changed
+142
-73
No files matched your search
+45
-19
@@ -9,6 +9,7 @@ from modules.ai_engine import local_client, interroger_gemini_cascade, appeler_g
|
||||
from modules.ui_components import render_user_msg, render_ai_msg, render_sidebar
|
||||
|
||||
async def handle_chat_request(request, session):
|
||||
start_time = time.time()
|
||||
try:
|
||||
form = await request.form()
|
||||
prompt = form.get("prompt", "")
|
||||
@@ -17,22 +18,8 @@ async def handle_chat_request(request, session):
|
||||
session['current_chat_id'] = chat_id
|
||||
|
||||
history = load_history()
|
||||
|
||||
sec_prompt = f"""Analyse et route cette demande. Si recherche web nécessaire ("va sur", "site", "historique", "version", "cherche", etc.) -> choisis "gemini". Si code/technique -> "groq". Sinon -> "local".
|
||||
Renvoie STRICTEMENT un JSON : {{"intention": "...", "fournisseur": "gemini|groq|local"}}
|
||||
Requête : {prompt}"""
|
||||
|
||||
router_res = local_client.chat.completions.create(model="qwen2.5:3b", messages=[{"role": "system", "content": "JSON uniquement."}, {"role": "user", "content": sec_prompt}], temperature=0.1)
|
||||
decision = nettoyer_decision_router(router_res.choices[0].message.content)
|
||||
intention, fournisseur = decision.get('intention', 'Analyse'), decision.get('fournisseur', 'gemini').lower()
|
||||
|
||||
urls = re.findall(r'https?://[^\s]+', prompt)
|
||||
mots_cles = ["cherche", "recherche", "sur internet", "sur le web", "sur le net", "va sur", "trouve", "site", "donne", "historique", "version"]
|
||||
if any(m in prompt.lower() for m in mots_cles):
|
||||
urls.extend(rechercher_sur_google(prompt))
|
||||
|
||||
web_text = extraire_contenu_urls(list(set(urls))) if urls else ""
|
||||
|
||||
# Extraction des fichiers
|
||||
file_summary = []
|
||||
file_names = []
|
||||
for f in files[:10]:
|
||||
@@ -41,10 +28,37 @@ async def handle_chat_request(request, session):
|
||||
content = await f.read()
|
||||
file_summary.append(f"\n--- Fichier: {f.filename} ---\n{content.decode('utf-8', errors='ignore')}")
|
||||
|
||||
liste_fichiers_str = ', '.join(file_names) if file_names else 'Aucun fichier'
|
||||
|
||||
sec_prompt = f"""Tu es l'Aiguilleur système.
|
||||
RÈGLES STRICTES DE ROUTAGE :
|
||||
1. "gemini" : OBLIGATOIRE si des fichiers sont joints à analyser (ex: {liste_fichiers_str}), ou pour des requêtes de rédaction complexe, comparaisons, ou recherche web.
|
||||
2. "groq" : Pour le code, la programmation, l'architecture système ou les mathématiques.
|
||||
3. "local" : UNIQUEMENT pour les salutations, blagues ou questions très simples sans fichiers. NE JAMAIS utiliser pour analyser des documents.
|
||||
Renvoie STRICTEMENT un JSON : {{"intention": "Résumé de l'intention...", "fournisseur": "gemini|groq|local"}}
|
||||
Requête : {prompt}"""
|
||||
|
||||
router_res = local_client.chat.completions.create(model="qwen2.5:3b", messages=[{"role": "system", "content": "JSON uniquement."}, {"role": "user", "content": sec_prompt}], temperature=0.1)
|
||||
decision = nettoyer_decision_router(router_res.choices[0].message.content)
|
||||
intention, fournisseur = decision.get('intention', 'Analyse'), decision.get('fournisseur', 'gemini').lower()
|
||||
|
||||
# 🛡️ PROTECTION HARDCODÉE : Si des fichiers sont présents, forcer Gemini
|
||||
if file_names:
|
||||
fournisseur = "gemini"
|
||||
intention += " (Forcé Gemini via Sécurité)"
|
||||
|
||||
urls = re.findall(r'https?://[^\s]+', prompt)
|
||||
mots_cles = ["cherche", "recherche", "sur internet", "sur le web", "sur le net", "va sur", "trouve", "site", "donne", "historique", "version"]
|
||||
if any(m in prompt.lower() for m in mots_cles):
|
||||
urls.extend(rechercher_sur_google(prompt))
|
||||
|
||||
web_text = extraire_contenu_urls(list(set(urls))) if urls else ""
|
||||
|
||||
full_prompt = prompt + ("\n" + "\n".join(file_summary) if file_summary else "")
|
||||
if web_text:
|
||||
full_prompt += f"\n\n[Contexte web extrait :\n{web_text}\nUtilise ces informations pour répondre précisément.]"
|
||||
|
||||
# Routage avec Fallback robuste
|
||||
if fournisseur == "gemini":
|
||||
try:
|
||||
reponse, modele = interroger_gemini_cascade(full_prompt)
|
||||
@@ -53,7 +67,13 @@ async def handle_chat_request(request, session):
|
||||
reponse, couleur, fournisseur_nom, modele = appeler_groq_api(full_prompt)
|
||||
fournisseur_nom, intention = "GROQ (Secours)", intention + " (Secours)"
|
||||
elif fournisseur == "groq":
|
||||
reponse, couleur, fournisseur_nom, modele = appeler_groq_api(full_prompt)
|
||||
try:
|
||||
reponse, couleur, fournisseur_nom, modele = appeler_groq_api(full_prompt)
|
||||
except Exception as e:
|
||||
# 🛡️ FALLBACK GROQ -> GEMINI EN CAS DE DÉPASSEMENT DE CONTEXTE OU ERREUR
|
||||
reponse, modele = interroger_gemini_cascade(full_prompt)
|
||||
couleur, fournisseur_nom = "#3b82f6", "GOOGLE GEMINI"
|
||||
intention += " (Secours suite Erreur Groq)"
|
||||
else:
|
||||
res_local = local_client.chat.completions.create(model="qwen2.5:3b", messages=[{"role": "system", "content": "Réponds en français."}, {"role": "user", "content": full_prompt}])
|
||||
reponse, couleur, fournisseur_nom, modele = res_local.choices[0].message.content, "#10b981", "SERVEUR LOCAL", "qwen2.5:3b"
|
||||
@@ -61,12 +81,18 @@ async def handle_chat_request(request, session):
|
||||
if chat_id not in history:
|
||||
history[chat_id] = {"title": (prompt[:30] if prompt else "Discussion") + "...", "pinned": False, "timestamp": time.time(), "messages": []}
|
||||
|
||||
display_msg = prompt + (f"\n📎 [Fichiers: {', '.join(file_names)}]" if file_names else "")
|
||||
execution_time = round(time.time() - start_time, 1)
|
||||
|
||||
display_msg = prompt
|
||||
if file_names:
|
||||
display_msg += f"\n\n📎 **Fichiers joints :** {', '.join(file_names)}"
|
||||
display_msg += "\n> *🗑️ Note : Fichiers traités de manière éphémère en mémoire vive et détruits instantanément après analyse conformément aux règles de confidentialité.*"
|
||||
|
||||
history[chat_id]['messages'].append({"role": "user", "content": display_msg})
|
||||
history[chat_id]['messages'].append({"role": "ai", "content": reponse, "intention": intention, "fournisseur": fournisseur_nom, "modele": modele, "couleur": couleur})
|
||||
history[chat_id]['messages'].append({"role": "ai", "content": reponse, "intention": intention, "fournisseur": fournisseur_nom, "modele": modele, "couleur": couleur, "execution_time": execution_time})
|
||||
save_history(history)
|
||||
|
||||
return render_user_msg(display_msg), render_ai_msg(reponse, intention, fournisseur_nom, modele, couleur), Script("renderMarkdown();"), render_sidebar()
|
||||
return render_user_msg(display_msg), render_ai_msg(reponse, intention, fournisseur_nom, modele, couleur, execution_time), Script("renderMarkdown();"), render_sidebar()
|
||||
|
||||
except Exception as e:
|
||||
return Div(f"Erreur : {e}", style="color:red; background:#300; padding:15px; border-radius:10px;")
|
||||
Reference in new issue
Block a user