Compare commits
3 Commits
1ecc599f7f
...
1b9f62f82f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b9f62f82f | ||
|
|
a224644247 | ||
|
|
91e4bcf2c9 |
@@ -1493,6 +1493,7 @@ async function sendChat() {
|
|||||||
renderChatStatus("stopped");
|
renderChatStatus("stopped");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
console.error("chat stream failed", err);
|
||||||
removeAssistantMessage(assistantMessage);
|
removeAssistantMessage(assistantMessage);
|
||||||
const error = (err && err.message) || "request failed";
|
const error = (err && err.message) || "request failed";
|
||||||
chatHistory.push({ role: "error", content: error, model: selectedChatModel });
|
chatHistory.push({ role: "error", content: error, model: selectedChatModel });
|
||||||
|
|||||||
@@ -3457,6 +3457,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
|
||||||
@@ -3499,7 +3500,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,
|
||||||
@@ -3537,6 +3538,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,
|
||||||
@@ -3738,6 +3740,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
|
||||||
@@ -3811,6 +3814,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),
|
||||||
|
|||||||
@@ -49,6 +49,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 '=== "[DONE]"' in html
|
assert '=== "[DONE]"' in html
|
||||||
|
assert 'console.error("chat stream failed", err)' in html
|
||||||
|
|
||||||
|
|
||||||
def test_dashboard_served_by_follower():
|
def test_dashboard_served_by_follower():
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user