Skip to main content
Send a message and stream the run as Server-Sent Events.
Same endpoint and same params as SendMessage — only the method name changes. The response is text/event-stream instead of a JSON body.

Request

Response stream

Each SSE frame carries one complete JSON-RPC response envelope in its data: line. Frames have no event: name — read data: and parse it.
Every frame’s id echoes your request id.

The four event shapes

result is a field-presence union with exactly one key.
Assistant prose is not streamed token-by-token or as append: true artifactUpdate chunks — Noorle does not produce that frame shape at all. Text accumulates server-side and is delivered whole, once, on the terminal frame: the full Message for a tool-free run, or the full text inside the terminal Task’s artifacts for a run that used a tool, handed off, or emitted a surface. A client that only accumulates append: true artifactUpdate frames waiting for progressive text will see nothing and can miss the final prose entirely.artifactUpdate does appear, but only for an A2UI surface (a chart, a form) — and always as one complete snapshot, append: false / last_chunk: true, never as an incremental chunk.
The stream always opens with a full task snapshot (TASK_STATE_WORKING), not a bare statusUpdate. Expect, in order: the initial task, zero or more statusUpdate/artifactUpdate frames as the run progresses, then a terminal task (or message, for a tool-free run) carrying the complete output. Errors mid-stream arrive as an ordinary frame carrying a JSON-RPC error instead of a result.

Reading the stream

Terminal states

The stream ends when the task reaches a terminal state. Task states are TASK_STATE_* strings — see Tasks for the full set and which four are terminal. TASK_STATE_INPUT_REQUIRED is not terminal. It means the run is parked waiting on a human — most often an approval gate. Resume with a follow-up SendMessage; see A2A overview.

Reconnecting

If the connection drops mid-run, use SubscribeToTask rather than resending the message. It replays the current snapshot and then tails live updates.