Event Streaming

July 20, 2026 ยท View on GitHub

stream_prompt() starts a prompt and returns events as they arrive.

Basic Pattern

let mut events = sdk
    .stream_prompt("Explain closures in one sentence.", PromptOptions::default())
    .await?;

while let Some(event) = events.recv().await {
    let event = event?;
    if let Some(delta) = event.text_delta() {
        print!("{delta}");
    }
}

Dropping the receiver cancels that stream's in-flight prompt wait. The transport also removes its pending request ID immediately, so abandoned streams do not accumulate request state in long-lived hosts.

Event Types

  • message_update: token or text delta.
  • message_end: final message content.
  • tool_start: a tool started.
  • tool_update: streaming tool output.
  • tool_end: a tool completed.
  • permission_request: host approval is required.
  • error: agent or transport error.

Handling Permissions While Streaming

while let Some(event) = events.recv().await {
    let event = event?;
    if event.event_type == "permission_request" {
        if let Some(request_id) = event.request_id() {
            sdk.permission_response(request_id, "allow_once").await?;
        }
    }
}

Production hosts should route permission requests to a human, policy engine, or trusted automation boundary.

Collecting Final Text

Use Agent and Run when you want streaming and a final result:

let mut run = agent.send("Summarize this repository.").await?;
while let Some(event) = run.next().await {
    println!("{:?}", event?);
}
let result = run.wait().await?;
println!("{}", result.text);