From a2deb0fcd523fae72fe26d9485069dfddcc72bd4 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Mon, 30 Mar 2026 02:52:54 -0300 Subject: [PATCH] ai: align web chat modes with atlasbot and remove stock path --- backend/atlas_portal/routes/ai.py | 52 ++++++------------------------- backend/atlas_portal/settings.py | 1 + frontend/src/views/AiView.vue | 2 +- 3 files changed, 12 insertions(+), 43 deletions(-) diff --git a/backend/atlas_portal/routes/ai.py b/backend/atlas_portal/routes/ai.py index b0ffef2..f31afea 100644 --- a/backend/atlas_portal/routes/ai.py +++ b/backend/atlas_portal/routes/ai.py @@ -18,7 +18,6 @@ def register(app) -> None: def ai_chat() -> Any: payload = request.get_json(silent=True) or {} user_message = (payload.get("message") or "").strip() - history = payload.get("history") or [] profile = (payload.get("profile") or payload.get("mode") or "atlas-quick").strip().lower() conversation_id = payload.get("conversation_id") if isinstance(payload.get("conversation_id"), str) else "" @@ -26,13 +25,13 @@ def register(app) -> None: return jsonify({"error": "message required"}), 400 started = time.time() - if profile in {"stock", "stock-ai", "stock_ai"}: - reply = _stock_answer(user_message, history) - source = "stock" - else: - mode = "smart" if profile in {"atlas-smart", "smart"} else "quick" - reply = _atlasbot_answer(user_message, mode, conversation_id) - source = f"atlas-{mode}" + mode = "quick" + if profile in {"atlas-smart", "smart"}: + mode = "smart" + elif profile in {"atlas-genius", "genius"}: + mode = "genius" + reply = _atlasbot_answer(user_message, mode, conversation_id) + source = f"atlas-{mode}" if reply: elapsed_ms = int((time.time() - started) * 1000) return jsonify({"reply": reply, "latency_ms": elapsed_ms, "source": source}) @@ -76,37 +75,6 @@ def _atlasbot_answer(message: str, mode: str, conversation_id: str) -> str: except (httpx.RequestError, ValueError): return "" -def _stock_answer(message: str, history: list[dict[str, Any]]) -> str: - body = { - "model": settings.AI_CHAT_MODEL, - "messages": _build_messages(message, history), - "stream": False, - } - try: - with httpx.Client(timeout=settings.AI_CHAT_TIMEOUT_SEC) as client: - resp = client.post(f"{settings.AI_CHAT_API}/api/chat", json=body) - resp.raise_for_status() - data = resp.json() - except (httpx.RequestError, ValueError): - return "" - message_data = data.get("message") if isinstance(data, dict) else None - if isinstance(message_data, dict) and message_data.get("content"): - return str(message_data["content"]).strip() - if isinstance(data, dict) and data.get("response"): - return str(data["response"]).strip() - return "" - - -def _build_messages(message: str, history: list[dict[str, Any]]) -> list[dict[str, str]]: - messages = [{"role": "system", "content": settings.AI_CHAT_SYSTEM_PROMPT}] - for entry in history: - role = entry.get("role") - content = entry.get("content") - if role in {"user", "assistant"} and isinstance(content, str) and content.strip(): - messages.append({"role": role, "content": content}) - messages.append({"role": "user", "content": message}) - return messages - def _discover_ai_meta(profile: str) -> dict[str, str]: meta = { @@ -119,12 +87,12 @@ def _discover_ai_meta(profile: str) -> dict[str, str]: if profile in {"atlas-smart", "smart"}: meta["model"] = settings.AI_ATLASBOT_MODEL_SMART or settings.AI_CHAT_MODEL meta["endpoint"] = "/api/ai/chat" + elif profile in {"atlas-genius", "genius"}: + meta["model"] = settings.AI_ATLASBOT_MODEL_GENIUS or settings.AI_CHAT_MODEL + meta["endpoint"] = "/api/ai/chat" elif profile in {"atlas-quick", "quick"}: meta["model"] = settings.AI_ATLASBOT_MODEL_FAST or settings.AI_CHAT_MODEL meta["endpoint"] = "/api/ai/chat" - elif profile in {"stock", "stock-ai", "stock_ai"}: - meta["model"] = settings.AI_CHAT_MODEL - meta["endpoint"] = "/api/ai/chat" sa_path = Path("/var/run/secrets/kubernetes.io/serviceaccount") token_path = sa_path / "token" diff --git a/backend/atlas_portal/settings.py b/backend/atlas_portal/settings.py index a35a922..b5fde24 100644 --- a/backend/atlas_portal/settings.py +++ b/backend/atlas_portal/settings.py @@ -31,6 +31,7 @@ AI_ATLASBOT_TOKEN = os.getenv("AI_ATLASBOT_TOKEN", "").strip() AI_ATLASBOT_TIMEOUT_SEC = float(os.getenv("AI_ATLASBOT_TIMEOUT_SEC", "5")) 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() AI_NODE_NAME = os.getenv("AI_CHAT_NODE_NAME") or os.getenv("AI_NODE_NAME") or "ai-cluster" AI_GPU_DESC = os.getenv("AI_CHAT_GPU_DESC") or "local GPU (dynamic)" AI_PUBLIC_ENDPOINT = os.getenv("AI_PUBLIC_CHAT_ENDPOINT", "https://chat.ai.bstein.dev/api/chat") diff --git a/frontend/src/views/AiView.vue b/frontend/src/views/AiView.vue index 75421b9..9160be5 100644 --- a/frontend/src/views/AiView.vue +++ b/frontend/src/views/AiView.vue @@ -87,7 +87,7 @@ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); const profiles = [ { id: "atlas-quick", label: "Atlas Quick" }, { id: "atlas-smart", label: "Atlas Smart" }, - { id: "stock-ai", label: "Stock AI" }, + { id: "atlas-genius", label: "Atlas Genius" }, ]; const activeProfile = ref("atlas-quick"); const profileState = reactive(