Add AI connectivity check endpoint: GET /admin/api/ai/connectivity
This commit is contained in:
@@ -318,3 +318,61 @@ async def update_runtime_config(
|
|||||||
is_overridden=True,
|
is_overridden=True,
|
||||||
message=f"Fournisseur changé à {state['provider']}, modèle {state['model']}",
|
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,
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user