From 7cc241641124dab10387e9c8d47559bf4b03db7a Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Thu, 25 Jun 2026 23:00:20 -0400 Subject: [PATCH] Add AI connectivity check endpoint: GET /admin/api/ai/connectivity --- app/routers/admin_ai.py | 58 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/app/routers/admin_ai.py b/app/routers/admin_ai.py index a858583..c7ecc3a 100644 --- a/app/routers/admin_ai.py +++ b/app/routers/admin_ai.py @@ -318,3 +318,61 @@ async def update_runtime_config( is_overridden=True, message=f"Fournisseur changé à {state['provider']}, modèle {state['model']}", ) + + +# ───────────────────────────────────────────────────────────── +# GET /admin/api/ai/connectivity — test réseau vers les API AI +# ───────────────────────────────────────────────────────────── + +@router.get("/connectivity") +async def check_ai_connectivity(): + """Vérifie la connectivité réseau vers OpenRouter et Gemini.""" + results = {} + + # Test OpenRouter + t0 = time.time() + try: + async with httpx.AsyncClient(timeout=httpx.Timeout(10, connect=5)) as client: + resp = await client.get( + "https://openrouter.ai/api/v1/models", + headers={"Authorization": f"Bearer {settings.OPENROUTER_API_KEY}"} if settings.OPENROUTER_API_KEY else {}, + ) + results["openrouter"] = { + "reachable": True, + "status": resp.status_code, + "latency_ms": round((time.time() - t0) * 1000, 1), + "has_key": bool(settings.OPENROUTER_API_KEY), + } + except Exception as e: + results["openrouter"] = { + "reachable": False, + "error": str(e)[:200], + "latency_ms": round((time.time() - t0) * 1000, 1), + "has_key": bool(settings.OPENROUTER_API_KEY), + } + + # Test Gemini + t0 = time.time() + try: + async with httpx.AsyncClient(timeout=httpx.Timeout(10, connect=5)) as client: + resp = await client.get("https://generativelanguage.googleapis.com") + results["gemini"] = { + "reachable": True, + "status": resp.status_code, + "latency_ms": round((time.time() - t0) * 1000, 1), + "has_key": bool(settings.GEMINI_API_KEY), + } + except Exception as e: + results["gemini"] = { + "reachable": False, + "error": str(e)[:200], + "latency_ms": round((time.time() - t0) * 1000, 1), + "has_key": bool(settings.GEMINI_API_KEY), + } + + return { + "results": results, + "ai_enabled": settings.AI_ENABLED, + "ai_provider": runtime_ai_config.provider or settings.AI_PROVIDER, + "ai_request_timeout": settings.AI_REQUEST_TIMEOUT, + }