connections

This commit is contained in:
Dobromir Popov
2026-07-08 19:49:52 +03:00
parent f0dc3bd93f
commit 91e4bcf2c9
4 changed files with 8 additions and 1 deletions

View File

@@ -1316,6 +1316,7 @@ async function sendChat() {
persistActiveChatSession(); persistActiveChatSession();
renderChatStatus("done"); renderChatStatus("done");
} catch (err) { } catch (err) {
console.error("chat stream failed", err);
assistantMessage.role = "error"; assistantMessage.role = "error";
assistantMessage.content = err && err.message ? err.message : "request failed"; assistantMessage.content = err && err.message ? err.message : "request failed";
renderChatHistory(); renderChatHistory();

View File

@@ -3312,6 +3312,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
self.send_response(200) self.send_response(200)
self.send_header("Content-Type", "text/event-stream; charset=utf-8") self.send_header("Content-Type", "text/event-stream; charset=utf-8")
self.send_header("Cache-Control", "no-cache") self.send_header("Cache-Control", "no-cache")
self.send_header("X-Accel-Buffering", "no")
self.end_headers() self.end_headers()
stream_usage: dict | None = None stream_usage: dict | None = None
observed_stream_tokens = 0 observed_stream_tokens = 0
@@ -3354,7 +3355,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
if usage is not None: if usage is not None:
stream_usage = usage stream_usage = usage
except (BrokenPipeError, ConnectionResetError): except (BrokenPipeError, ConnectionResetError):
pass client_gone = True
if self._finalize_proxy_cancel( if self._finalize_proxy_cancel(
proxy_ctx=proxy_ctx, proxy_ctx=proxy_ctx,
server=server, server=server,
@@ -3392,6 +3393,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
route_model=route_model, route_model=route_model,
status=200, status=200,
stream=True, stream=True,
client_disconnected=client_gone,
tokens=tokens, tokens=tokens,
elapsed_seconds=round(elapsed, 4), elapsed_seconds=round(elapsed, 4),
tokens_per_sec=round(tokens / elapsed, 4) if elapsed > 0 else 0.0, tokens_per_sec=round(tokens / elapsed, 4) if elapsed > 0 else 0.0,
@@ -3584,6 +3586,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
self.send_response(int(first.get("status", 200))) self.send_response(int(first.get("status", 200)))
self.send_header("Content-Type", headers.get("Content-Type", "text/event-stream; charset=utf-8")) self.send_header("Content-Type", headers.get("Content-Type", "text/event-stream; charset=utf-8"))
self.send_header("Cache-Control", "no-cache") self.send_header("Cache-Control", "no-cache")
self.send_header("X-Accel-Buffering", "no")
self.end_headers() self.end_headers()
server: _TrackerHTTPServer = self.server # type: ignore[assignment] server: _TrackerHTTPServer = self.server # type: ignore[assignment]
stream_usage: dict | None = None stream_usage: dict | None = None
@@ -3657,6 +3660,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
route_model=route_model, route_model=route_model,
status=200, status=200,
stream=True, stream=True,
client_disconnected=client_gone,
relay=True, relay=True,
tokens=tokens, tokens=tokens,
elapsed_seconds=round(elapsed, 4), elapsed_seconds=round(elapsed, 4),

View File

@@ -46,6 +46,7 @@ def test_dashboard_chat_uses_streaming_fetch():
assert "stream: true" in html assert "stream: true" in html
assert ".body.getReader()" in html assert ".body.getReader()" in html
assert 'data === "[DONE]"' in html assert 'data === "[DONE]"' in html
assert 'console.error("chat stream failed", err)' in html
def test_dashboard_served_by_follower(): def test_dashboard_served_by_follower():

View File

@@ -467,6 +467,7 @@ def test_tracker_logs_stream_progress_before_request_completes():
method="POST", method="POST",
) )
response = urllib.request.urlopen(req, timeout=3.0) response = urllib.request.urlopen(req, timeout=3.0)
assert response.headers["X-Accel-Buffering"] == "no"
first_line = response.readline() first_line = response.readline()
assert first_line.startswith(b"data:") assert first_line.startswith(b"data:")
assert chunk_sent.wait(timeout=1.0) assert chunk_sent.wait(timeout=1.0)