#!/usr/bin/env python """05 -- streaming output from a generator, with progress. Yielding from the handler streams partial results to the browser. This is the pattern behind token-by-token LLM output (see 07_chat_local_llm.py). """ import time import gradio as gr from _common import launch TEXT = ("Streaming works by yielding instead of returning. " "Gradio keeps the connection open and pushes each yielded value.") def stream(sentence, delay, progress=gr.Progress()): words = (sentence or TEXT).split() acc = [] for i, w in enumerate(words): acc.append(w) progress((i + 1) / len(words), desc="streaming") time.sleep(float(delay)) yield " ".join(acc) with gr.Blocks(title="Streaming") as demo: gr.Markdown("## Streaming a generator") inp = gr.Textbox(label="Sentence", value=TEXT, lines=2) delay = gr.Slider(0.0, 0.5, value=0.08, step=0.01, label="Delay per word (s)") out = gr.Textbox(label="Streamed output", lines=4) gr.Button("Stream", variant="primary").click( stream, [inp, delay], out, api_name="stream") if __name__ == "__main__": launch(demo)