From 808c9d3d132bd76af56469e21ea7fc4fb2a3ba72 Mon Sep 17 00:00:00 2001 From: "Abiba (pi)" Date: Sat, 16 May 2026 22:12:21 +0000 Subject: [PATCH] Router: 300s timeout, gpu_decr bugfix. Dashboard: Bootstrap 5 modern redesign with KPI stats, equal-height cards, queue ring. Nginx: 600s timeout. --- dashboard/dashboard.py | 360 +++++++++++++++++------------------------ nginx/nginx.conf | 2 +- router/router.py | 7 +- 3 files changed, 156 insertions(+), 213 deletions(-) diff --git a/dashboard/dashboard.py b/dashboard/dashboard.py index b8f218f..a1e5ee6 100644 --- a/dashboard/dashboard.py +++ b/dashboard/dashboard.py @@ -1,10 +1,9 @@ -"""SyslogAI Harness Dashboard.""" +"""SyslogAI Harness Dashboard — Modern Design.""" import os, json, time, queue, threading import requests from flask import Flask, request, render_template_string, Response, stream_with_context ROUTER_METRICS = os.environ.get("ROUTER_METRICS_URL", "http://router:9000/metrics") - app = Flask(__name__) sse_subscribers = []; sse_lock = threading.Lock() @@ -20,239 +19,182 @@ def broadcast_loop(): time.sleep(3) data = fetch_state(); payload = json.dumps(data) with sse_lock: - dead = [] - for q in sse_subscribers: - try: q.put(payload) - except Exception: dead.append(q) + dead = [q for q in sse_subscribers if not q.put(payload)] for q in dead: sse_subscribers.remove(q) - threading.Thread(target=broadcast_loop, daemon=True).start() DASHBOARD_HTML = r""" - + - - -SyslogAI Harness - Syslog Solution LLC + +SyslogAI Harness + -
-

SyslogAI Harness

-
- - connecting... - - 0 requests + + +
+
+
⚡ SyslogAI Harness
+
+ + live · +
+
+
+
0
Requests
+
0
Active
+
0
Agents
-
- -
-
GPU Health
-
Loading...
-
- -
-
Queue Status
-
-
Loading...
+ +
+ +
Loading...
+
Loading...
+
Loading...
+ + +
Queue Status
+
Model Distribution
+
Agent Activity
+ + +
+ Usage Over Time +
+ + +
-
-
-
Model Distribution
-
-
-
-
-
Agent Activity
-
-
-
- -
-
- Usage Over Time -
- - - -
-
-
-
Loading...
-
-
-
- -
-
Live Request Stream
-
- - - -
TimeAgentModelReasonTier
Waiting for data...
-
-
+
+
GPU Metrics
+ + +
Live Stream
+
+ + +
TimeAgentModelReasonTier
+
+ """ -@app.route("/") +@app.route("/") def dashboard(): return render_template_string(DASHBOARD_HTML) @app.route("/api/state") diff --git a/nginx/nginx.conf b/nginx/nginx.conf index fc101ee..c5363ff 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -32,7 +32,7 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Authorization $http_authorization; proxy_connect_timeout 10s; - proxy_read_timeout 300s; + proxy_read_timeout 600s; proxy_buffering off; } diff --git a/router/router.py b/router/router.py index 2af7acd..ffdceb8 100644 --- a/router/router.py +++ b/router/router.py @@ -210,7 +210,7 @@ def chat(): except Exception: pass start = time.time() resp = requests.post(url+"/chat/completions", json=rd, - headers={"Content-Type":"application/json","Authorization":"Bearer not-needed"}, timeout=120, stream=is_stream) + headers={"Content-Type":"application/json","Authorization":"Bearer not-needed"}, timeout=300, stream=is_stream) lat = int((time.time()-start)*1000) gpu_decr(model) # Release slot @@ -229,8 +229,9 @@ def chat(): data["routing"] = {"model":model,"reason":reason,"gpu":url,"tier":tier,"agent":agent,"latency_ms":lat,"active_gpu":gpu_active_count(model)} bcast() return jsonify(data) - except requests.Timeout: - gpu_decr(model if 'model' in dir() else "unknown") + except requests.Timeout: + try: gpu_decr(model) + except: pass return jsonify({"error":"timeout"}), 504 except Exception as e: log.error("Error: %s\n%s", e, traceback.format_exc())