Add chat-ui-htmx module: streaming chat page on Spring AI 2.0.2 with htmx and its SSE extension (vendored), MessageChatMemoryAdvisor keyed by the HTTP session, a Stop button, and the traps measured: EventSource strips one leading space per data line, model text must be HTML-escaped, a cancelled stream left the upstream connection open in 7 of 8 runs until an OkHttp interceptor calls Call.cancel (8 of 8 closed after), and the SDK push source ignores back-pressure (limitRate changes only the demand; a bounded buffer works). The model is a stub OpenAI-compatible SSE server written for the module; no real provider was run.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_017ic4b6Kg9RWSTJzyz6KP9X
This commit is contained in:
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env bash
|
||||
# Aborts a streaming request from the client side N times and asks the stub what happened to the
|
||||
# upstream HTTP stream: closed (abortedByClient) or left open. Usage: cancel-upstream.sh <chunk-delay-ms> <runs> [app args]
|
||||
source "$(dirname "$0")/lib.sh"; set +e
|
||||
DELAY=${1:-20}; RUNS=${2:-10}; shift 2
|
||||
stop_all; start_stub "$DELAY"; start_app "$@"
|
||||
echo "== chunk delay ${DELAY} ms, ${RUNS} runs, app args: ${*:-(none)}"
|
||||
closed=0; open=0
|
||||
for r in $(seq 1 "$RUNS"); do
|
||||
b=$(curl -s "localhost:$STUB_PORT/stub/stats" | sed 's/.*abortedByClient=//')
|
||||
curl -sN --max-time 1 "localhost:$APP_PORT/chat/stream?message=big%20400&turn=$r" >/dev/null
|
||||
sleep 2
|
||||
a=$(curl -s "localhost:$STUB_PORT/stub/stats" | sed 's/.*abortedByClient=//')
|
||||
if [ "$a" -gt "$b" ]; then closed=$((closed+1)); res=closed; else open=$((open+1)); res="LEFT OPEN"; fi
|
||||
echo "run $r: upstream $res"
|
||||
done
|
||||
echo "upstream closed: $closed of $RUNS, left open: $open of $RUNS"
|
||||
stop_all
|
||||
Reference in New Issue
Block a user