3 Commits

Author SHA1 Message Date
Dobromir Popov
1b9f62f82f Merge branch 'master' of https://git.d-popov.com/popov/neuron-tai 2026-07-08 20:00:58 +03:00
Dobromir Popov
a224644247 Merge branch 'master' of https://git.d-popov.com/popov/neuron-tai 2026-07-08 20:00:56 +03:00
Dobromir Popov
91e4bcf2c9 connections 2026-07-08 19:49:52 +03:00
4 changed files with 8 additions and 1 deletions

View File

@@ -1493,6 +1493,7 @@ async function sendChat() {
renderChatStatus("stopped");
}
} else {
console.error("chat stream failed", err);
removeAssistantMessage(assistantMessage);
const error = (err && err.message) || "request failed";
chatHistory.push({ role: "error", content: error, model: selectedChatModel });

View File

@@ -3457,6 +3457,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
self.send_response(200)
self.send_header("Content-Type", "text/event-stream; charset=utf-8")
self.send_header("Cache-Control", "no-cache")
self.send_header("X-Accel-Buffering", "no")
self.end_headers()
stream_usage: dict | None = None
observed_stream_tokens = 0
@@ -3499,7 +3500,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
if usage is not None:
stream_usage = usage
except (BrokenPipeError, ConnectionResetError):
pass
client_gone = True
if self._finalize_proxy_cancel(
proxy_ctx=proxy_ctx,
server=server,
@@ -3537,6 +3538,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
route_model=route_model,
status=200,
stream=True,
client_disconnected=client_gone,
tokens=tokens,
elapsed_seconds=round(elapsed, 4),
tokens_per_sec=round(tokens / elapsed, 4) if elapsed > 0 else 0.0,
@@ -3738,6 +3740,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
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("Cache-Control", "no-cache")
self.send_header("X-Accel-Buffering", "no")
self.end_headers()
server: _TrackerHTTPServer = self.server # type: ignore[assignment]
stream_usage: dict | None = None
@@ -3811,6 +3814,7 @@ class _TrackerHandler(http.server.BaseHTTPRequestHandler):
route_model=route_model,
status=200,
stream=True,
client_disconnected=client_gone,
relay=True,
tokens=tokens,
elapsed_seconds=round(elapsed, 4),

View File

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

View File

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