Structured Streamer
struct_strm (structured streamer) is a Python package that makes it easy to stream partial json generated by LLMs into valid json responses. This enables partial rendering of UI components without needing to wait for a full response, drastically reducing the time to the first word on the user's screen.
Why Use Structured Streamer?
JSON format is the standard when dealing with structured responses from LLMs. In the early days of LLM structured generation we had to validate the JSON response only after the whole JSON response had been returned. Modern approaches use constrained decoding to ensure that only valid json is returned, eliminating the need for post generation validation, and allowing us to use the response imediately. However, the streamed json response is incomplete, so it can't be parsed using traditional methods. This library aims to make it easier to handle this partially generated json to provide a better end user experience.
See the benchmarks section in the docs for more details about how this library can speed up your structured response processing.
You can learn more about constrained decoding and context free grammar here: XGrammar - Achieving Efficient, Flexible, and Portable Structured Generation with XGrammar
Installation
pip install struct-strm
Dependency Requirements and Comparison with Similar Libraries
struct-strm is lightweight by design and has minimal dependencies compared to other structured-output libraries.
Dependencies:
- Built-in support for dataclasses — no need for Pydantic or any third-party model framework.
- Compatible with any OpenAI/Ollama-style async streaming client.
Compared to other libraries:
- Unlike libraries such as instructor, which validate responses only after full completion, struct-strm focuses on incremental JSON streaming - making it better suited for real-time or UI-driven applications.
- No extra heavy dependencies or post-generation validation layers - only what’s required for structured streaming.
Main Features
The primary feature is to wrap LLM outputs to produce valid incremental JSON from partial invalid JSON based on user provided structures. Effectively this acts as a wrapper for your LLM calls. Due to the nature of this library (it is primarily inteded for use in web servers), it is expected that it will be used in async workflows, and is async first.
The library also provides simple HTML templates that serve as examples of how you can integrate the streams in your own components.
Due to the nature of partial json streaming, there can be "wrong" ways to stream responses that are not effective for partial rendering of responeses in the UI. The library also provides examples of tested ways to apply the library to get good results.
High Level Flow
Example Component
This is an example of a form component being incrementally rendered. By using a structured query response from an LLM, in this case a form with form field names and field placeholders, we can stream the form results directly to a HTML component. This drastically reduces the time to first token, and the precieved time that a user needs to wait. More advanced components are under development.
from stuct_strm import parse_openai
from pydantic import BaseModel
from openai import AsyncOpenAI
...
class DefaultFormItem(BaseModel):
field_name: str = ""
field_placeholder: str = ""
class DefaultFormStruct(BaseModel):
form_fields: List[DefaultFormItem] = []
stream_response = client.beta.chat.completions.stream(
model="gpt-4.1",
messages=messages,
response_format=DefaultFormStruct,
temperature=0.0,
)
form_struct_response = parse_openai(DefaultFormStruct, stream_response)
async for instance in form_struct_response:
async for formstruct in instance:
print(formstruct)
Fully formed python classes are returned:
>>> DefaultFormStruct(form_fields=[DefaultFormItem(field_name="fruits", field_placeholder="")])
>>> DefaultFormStruct(form_fields=[DefaultFormItem(field_name="fruits", field_placeholder="apple ")])
>>> DefaultFormStruct(form_fields=[DefaultFormItem(field_name="fruits", field_placeholder="apple orange strawberry")])
>>> etc....
And the corresponding incomplete json string streams would have looked like:
>>> "{"form_fields": [{"field_name": "fruits"
>>> "{"form_fields": [{"field_name": "fruits", "field_placeholder": "apple "
>>> "{"form_fields": [{"field_name": "fruits", "field_placeholder": "apple orange strawberry"}
>>> etc...
Component Streaming
The structured responses can then be easily used to generate incrementally rendered web components.
For example this form:
Or we can return data in a grid in more interesting ways.
For example this rubric:
Other
I started struct_strm to support another project I'm working on to provide an easy entrypoint for Teachers to use LLM tools in their workflows. Check it out if you're interested - Teachers PET
Metadata
Release files for struct-strm 0.0.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| struct_strm-0.0.14.tar.gz | 21.1 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| struct_strm-0.0.14-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 60.5 kB
Release files / struct_strm-0.0.14.tar.gz
| Download URL | struct_strm-0.0.14.tar.gz |
|---|---|
| Size | 21.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2e75554a97925d2da87c4f2ffcb5b2953f5d2b43b873e0af6a09785ce40fa71e
|
|
BLAKE2b-256 checksum How to use checksums |
b4c0554e70473f982fa0576db4db1aa357a7fbd158ad7117130d1d8a674969a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 16, 2025.
Transparency logRelease files / struct_strm-0.0.14-py3-none-any.whl
| Download URL | struct_strm-0.0.14-py3-none-any.whl |
|---|---|
| Size | 39.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
631e49602d6563f96e527b37e7c43a582f2212084589baec5651fcece34abf2b
|
|
BLAKE2b-256 checksum How to use checksums |
39778c39a396a7f5ed1a72b8bce071c4c47bedd4757f610bd60990003655daa2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 16, 2025.
Transparency logSecurity for struct-strm 0.0.14
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for struct_strm-0.0.14.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 16, 2025.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.