From 9b87c8bfbda176d2dc111643c44f2b92b9c91bea Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Mon, 30 Mar 2026 03:37:33 -0300 Subject: [PATCH] ai: enforce mode timeouts and accept atlasbot reply payload --- backend/atlas_portal/routes/ai.py | 12 ++++++++++-- backend/atlas_portal/settings.py | 9 +++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/backend/atlas_portal/routes/ai.py b/backend/atlas_portal/routes/ai.py index f31afea..c695d65 100644 --- a/backend/atlas_portal/routes/ai.py +++ b/backend/atlas_portal/routes/ai.py @@ -65,17 +65,25 @@ def _atlasbot_answer(message: str, mode: str, conversation_id: str) -> str: payload = {"prompt": message, "mode": mode} if conversation_id: payload["conversation_id"] = conversation_id - with httpx.Client(timeout=settings.AI_ATLASBOT_TIMEOUT_SEC) as client: + with httpx.Client(timeout=_atlasbot_timeout_sec(mode)) as client: resp = client.post(endpoint, json=payload, headers=headers) if resp.status_code != 200: return "" data = resp.json() - answer = (data.get("answer") or "").strip() + answer = (data.get("reply") or data.get("answer") or "").strip() return answer except (httpx.RequestError, ValueError): return "" +def _atlasbot_timeout_sec(mode: str) -> float: + if mode == "genius": + return settings.AI_ATLASBOT_TIMEOUT_GENIUS_SEC + if mode == "smart": + return settings.AI_ATLASBOT_TIMEOUT_SMART_SEC + return settings.AI_ATLASBOT_TIMEOUT_QUICK_SEC + + def _discover_ai_meta(profile: str) -> dict[str, str]: meta = { "node": settings.AI_NODE_NAME, diff --git a/backend/atlas_portal/settings.py b/backend/atlas_portal/settings.py index b5fde24..2c574d1 100644 --- a/backend/atlas_portal/settings.py +++ b/backend/atlas_portal/settings.py @@ -29,6 +29,15 @@ AI_CHAT_TIMEOUT_SEC = float(os.getenv("AI_CHAT_TIMEOUT_SEC", "20")) AI_ATLASBOT_ENDPOINT = os.getenv("AI_ATLASBOT_ENDPOINT", "").strip() AI_ATLASBOT_TOKEN = os.getenv("AI_ATLASBOT_TOKEN", "").strip() AI_ATLASBOT_TIMEOUT_SEC = float(os.getenv("AI_ATLASBOT_TIMEOUT_SEC", "5")) +AI_ATLASBOT_TIMEOUT_QUICK_SEC = float( + os.getenv("AI_ATLASBOT_TIMEOUT_QUICK_SEC", str(max(AI_ATLASBOT_TIMEOUT_SEC, 15))) +) +AI_ATLASBOT_TIMEOUT_SMART_SEC = float( + os.getenv("AI_ATLASBOT_TIMEOUT_SMART_SEC", str(max(AI_ATLASBOT_TIMEOUT_SEC, 45))) +) +AI_ATLASBOT_TIMEOUT_GENIUS_SEC = float( + os.getenv("AI_ATLASBOT_TIMEOUT_GENIUS_SEC", str(max(AI_ATLASBOT_TIMEOUT_SEC, 180))) +) AI_ATLASBOT_MODEL_FAST = os.getenv("AI_ATLASBOT_MODEL_FAST", "").strip() AI_ATLASBOT_MODEL_SMART = os.getenv("AI_ATLASBOT_MODEL_SMART", "").strip() AI_ATLASBOT_MODEL_GENIUS = os.getenv("AI_ATLASBOT_MODEL_GENIUS", "").strip()