akhaliq HF Staff commited on
Commit
0195d91
·
1 Parent(s): b35d8de

feat: implement dynamic stream timeout to improve response handling responsiveness

Browse files
Files changed (1) hide show
  1. index.html +7 -4
index.html CHANGED
@@ -536,15 +536,17 @@
536
 
537
  const iterator = submission[Symbol.asyncIterator]();
538
  let streamDone = false;
 
539
 
540
  while (!streamDone) {
541
- // Race each iterator.next() against a 30s idle timeout.
542
- // The Gradio client's iterator may hang forever after the
543
- // last event, so this guarantees we always break out.
 
544
  const result = await Promise.race([
545
  iterator.next(),
546
  new Promise(resolve =>
547
- setTimeout(() => resolve({ value: undefined, done: true }), 30000)
548
  )
549
  ]);
550
 
@@ -556,6 +558,7 @@
556
  const event = result.value;
557
 
558
  if (event.type === "data") {
 
559
  typingIndicatorWrapper.style.display = 'none';
560
  typingIndicator.style.display = 'none';
561
  fullResponse = event.data[0];
 
536
 
537
  const iterator = submission[Symbol.asyncIterator]();
538
  let streamDone = false;
539
+ let hasReceivedData = false;
540
 
541
  while (!streamDone) {
542
+ // Dynamic timeout: 60s before first data (queue/connection wait),
543
+ // 2s after first data (idle = stream finished, since tokens
544
+ // arrive every few hundred ms during generation).
545
+ const idleTimeout = hasReceivedData ? 2000 : 60000;
546
  const result = await Promise.race([
547
  iterator.next(),
548
  new Promise(resolve =>
549
+ setTimeout(() => resolve({ value: undefined, done: true }), idleTimeout)
550
  )
551
  ]);
552
 
 
558
  const event = result.value;
559
 
560
  if (event.type === "data") {
561
+ hasReceivedData = true;
562
  typingIndicatorWrapper.style.display = 'none';
563
  typingIndicator.style.display = 'none';
564
  fullResponse = event.data[0];