pub struct StreamEventMessage {
pub event: Value,
pub parent_tool_use_id: Option<String>,
pub uuid: String,
pub session_id: String,
pub ttft_ms: Option<u64>,
pub user_message_uuid: Option<String>,
pub user_message_uuids: Vec<String>,
pub resume_reason: Option<String>,
pub thinking_display: Option<String>,
pub abandoned_blocks: Option<AbandonedBlocks>,
pub api_message_id: Option<String>,
pub text_runs_joined: Option<bool>,
}Fields§
§event: Value§parent_tool_use_id: Option<String>§uuid: String§session_id: String§ttft_ms: Option<u64>§user_message_uuid: Option<String>Client uuid of the user message that triggered this turn, stamped on the turn’s first non-ping stream event so a consumer can bind the reply stream to the send it answers. Since CLI 2.1.269 the turn’s first complete assistant message is stamped too, independently, so the same uuid may appear on both frames. Absent on later stream events, on synthetic/scheduled turns, and from CLIs before 2.1.259.
user_message_uuids: Vec<String>Client uuids of every user message whose prompt this turn has consumed
so far, in consumption order. Always contains user_message_uuid; at
most 64 entries. Present exactly when user_message_uuid is; absent
from CLIs before 2.1.259 (fall back to user_message_uuid).
resume_reason: Option<String>Why this frame’s turn is the automatic re-run of a turn a worker
restart interrupted: the host’s CLAUDE_CODE_RESUME_REASON when it set
one, else interrupted_turn. Stamped on the same reply frames as
user_message_uuid, so a consumer can tell the re-run’s first reply
from the interrupted attempt’s. Absent on every other turn, on
thinking_tokens frames, and from CLIs before 2.1.268.
thinking_display: Option<String>The thinking.display value Claude Code put in the API request body
for the response this event belongs to — i.e. which display the
thinking text was requested with, not how to show it. Set on
message_start, on a thinking block’s content_block_start and on
thinking_delta events when the request body had a display; absent
on every other event, on Remote Control sessions and from CLIs before
2.1.283. Two responses of one turn can differ. Marked @internal
upstream, so treat the value set as open.
abandoned_blocks: Option<AbandonedBlocks>Set on a message_stop that Claude Code produced itself after it
stopped reading a response because the API’s stream failed, stalled
or ended early: that response’s content blocks from
AbandonedBlocks::from_block_index up have no assistant message and
never will, so a consumer that drew them from stream events can remove
them. Absent on every other message_stop, on Remote Control sessions
and from CLIs before 2.1.292. Marked @internal upstream.
api_message_id: Option<String>The API’s id (msg_…) of the response this event belongs to:
event.message.id on its message_start, message.id on its
assistant messages. Not a message uuid. Set on every event from a
response’s message_start to its message_stop, so a consumer that
missed the message_start can still tell responses apart; a replayed
message_start can make two responses share an id. Absent on pings,
on Remote Control sessions, on some plugin-produced events and from
CLIs before 2.1.295. An absent key states nothing about which
response the event belongs to. Marked @internal upstream.
text_runs_joined: Option<bool>Always true when present. Set on a response’s message_start when
CLAUDE_CODE_WEBSEARCH_CITATIONS is on in a non-interactive session:
each run of adjacent text blocks then arrives as one assistant message
with one joined text block, whose non-web_search_result_location
citations carry span_start/span_end (Unicode code points, end
exclusive) into the joined text. The content_block_* events still
show each block by its own index. Absent from CLIs before 2.1.295.
Marked @internal upstream.