Stream a generator, iterable, or stream-like sequence to the app.

st.write_stream iterates through the given sequences and writes all chunks to the app. String chunks will be written using a typewriter effect. Other data types will be written using st.write.

Function signature[source]



stream (Callable, Generator, Iterable, OpenAI Stream, or LangChain Stream)

The generator or iterable to stream.


To use additional LLM libraries, you can create a wrapper to manually define a generator function and include custom output parsing.


(str or list)

The full response. If the streamed output only contains text, this is a string. Otherwise, this is a list of all the streamed objects. The return value is fully compatible as input for st.write.


You can pass an OpenAI stream as shown in our tutorial, Build a basic LLM chat app. Alternatively, you can pass a generic generator function as input:

import time
import numpy as np
import pandas as pd
import streamlit as st

Lorem ipsum dolor sit amet, **consectetur adipiscing** elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

def stream_data():
    for word in _LOREM_IPSUM.split(" "):
        yield word + " "

    yield pd.DataFrame(
        np.random.randn(5, 10),
        columns=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],

    for word in _LOREM_IPSUM.split(" "):
        yield word + " "

if st.button("Stream data"):


If your stream object is not compatible with st.write_stream, define a wrapper around your stream object to create a compatible generator function.

for chunk in unsupported_stream: yield preprocess(chunk)

For an example, see how we use Replicate with Snowflake Arctic in this code.


Still have questions?

Our forums are full of helpful information and Streamlit experts.