# Streaming

> How does streaming work in Windmill? Stream job results via SSE, webhooks, HTTP routes and AI agents.

Windmill supports streaming data from jobs in several ways. Runnables can return streams (any `AsyncGenerator<string>` in TypeScript, `iter` in Python, or an AI agent step), and Windmill provides multiple ways to consume them.

## Job result streaming

Scripts in Python and TypeScript can stream back results as a text stream. The stream exists while the job is running, and the full content becomes the result once the job completes.

## AI agent streaming

AI agent steps support streaming token deltas, tool calls and tool results as structured JSON payloads.

## Consuming a stream

### Webhook SSE stream

Runnables are associated with SSE stream webhook endpoints that trigger the job and return a Server-Sent Events stream.

### HTTP trigger SSE stream

HTTP routes can be configured in Sync SSE mode to return a Server-Sent Events stream when the bound runnable returns a stream.
