Add admin AI models panel (list, test, select Mistral models)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
defc07648c
commit
13677b3ce3
4 files changed
+162
-5
No files matched your search
@@ -58,8 +58,9 @@ from database import (
|
||||
close_consultation, get_consultations_to_autoclose, get_consultation_stats,
|
||||
get_consultation_contributions, delete_consultation,
|
||||
check_ip_blacklist, record_ip_rejection, get_ip_blacklist, remove_ip_blacklist,
|
||||
set_setting,
|
||||
)
|
||||
from ai_agent import filter_idea, synthesize_ideas, check_existing_law
|
||||
from ai_agent import filter_idea, synthesize_ideas, check_existing_law, get_client, get_model
|
||||
|
||||
# ─── Logging ────────────────────────────────────────────────────────────────
|
||||
|
||||
@@ -1290,6 +1291,51 @@ def admin_regenerate_synthesis():
|
||||
return jsonify({"ok": True, "message": "Régénération lancée en arrière-plan."})
|
||||
|
||||
|
||||
@app.get("/api/admin/ai/models")
|
||||
@require_admin
|
||||
def admin_ai_models():
|
||||
"""Modèles actuellement actifs + liste de ceux accessibles avec la clé en place."""
|
||||
out = {"filter": get_model("filter"), "synthesis": get_model("synthesis"), "available": [], "error": None}
|
||||
try:
|
||||
out["available"] = sorted(m.id for m in get_client().models.list().data)
|
||||
except Exception as e:
|
||||
logger.warning("Admin — liste des modèles IA impossible : %s", type(e).__name__)
|
||||
out["error"] = f"{type(e).__name__}: {str(e)[:200]}"
|
||||
return jsonify(out)
|
||||
|
||||
|
||||
@app.post("/api/admin/ai/models")
|
||||
@require_admin
|
||||
def admin_ai_set_models():
|
||||
"""Enregistre les modèles filter/synthesis (chaîne vide → retour à l'env)."""
|
||||
body = request.get_json(silent=True) or {}
|
||||
for kind in ("filter", "synthesis"):
|
||||
if kind in body:
|
||||
v = str(body[kind] or "").strip()
|
||||
if len(v) > 100:
|
||||
return jsonify({"error": "invalid_model"}), 400
|
||||
set_setting(f"{kind}_model", v or None)
|
||||
logger.info("Admin — modèles IA mis à jour")
|
||||
return jsonify({"ok": True, "filter": get_model("filter"), "synthesis": get_model("synthesis")})
|
||||
|
||||
|
||||
@app.post("/api/admin/ai/test")
|
||||
@require_admin
|
||||
@limiter.limit("10 per minute")
|
||||
def admin_ai_test():
|
||||
"""Appel minimal (1 token) pour vérifier qu'un modèle répond avec la clé en place."""
|
||||
model = str((request.get_json(silent=True) or {}).get("model", "")).strip()
|
||||
if not model or len(model) > 100:
|
||||
return jsonify({"error": "invalid_model"}), 400
|
||||
try:
|
||||
get_client().chat.completions.create(
|
||||
model=model, max_tokens=1, messages=[{"role": "user", "content": "ping"}],
|
||||
)
|
||||
return jsonify({"ok": True})
|
||||
except Exception as e:
|
||||
return jsonify({"ok": False, "error": f"{type(e).__name__}: {str(e)[:200]}"})
|
||||
|
||||
|
||||
@app.get("/api/admin/export/csv")
|
||||
@require_admin
|
||||
def admin_export_csv():
|
||||
|
||||
Reference in new issue
Block a user