Skip to content

strands.bidi.types

Content-related type definitions for bidirectional streaming.

A complete text or image block supplied by a user.

A complete text, image, or tool result block.

An audio delta for the live input stream.

Dictionary form of one user content block.

Dictionary form of one text, image, or tool result block.

Dictionary form of an audio delta.

@dataclass
class BidiMessage()

Defined in: src/strands/bidi/types/content.py:33

An input message containing ordered content blocks.

Callers must supply at least one block when sending and must not mix tool results with user text or images. Send streaming deltas individually.

Attributes:

  • content - Ordered list of complete content blocks.
class BidiContentMetadata(TypedDict)

Defined in: src/strands/bidi/types/content.py:46

Streamed content metadata stored under a message’s metadata.custom.bidi.

Attributes:

  • kind - Identifies the message as text, reasoning, or a transcript.
  • status - Whether the content is pending, complete, or incomplete.

Agent-related type definitions for bidirectional streaming.

This module defines the types used for BidiAgent.

User input accepted by BidiAgent.send() and returned by input streams.

Supported forms:

  • Text: a string, TextBlock, or a dictionary with a text key.
  • Image: ImageBlock or a dictionary with an image key.
  • Streaming audio: AudioDelta or a dictionary with an audio_delta key.
  • Grouped content: a nonempty list of strings, text/image blocks, or their dictionary forms.

A list forms one user message and preserves block order. Send audio deltas individually, outside these lists.

Media input types for bidirectional streaming.

@dataclass
class AudioDelta()

Defined in: src/strands/bidi/types/media.py:15

Audio samples to append to the live input stream.

Sending a delta does not explicitly end the user’s turn.

Attributes:

  • format - Audio format.
  • source - Source containing the audio samples.
def to_dict() -> _AudioDeltaData

Defined in: src/strands/bidi/types/media.py:28

Return the dictionary form of this delta.

Protocols for bidirectional input and output streams.

The protocols separate input and output concerns into independent callables with lifecycle methods managed by BidiAgent.run().

@runtime_checkable
class InputStream(Protocol)

Defined in: src/strands/bidi/types/io.py:18

Callable input stream managed by a bidirectional agent.

An input stream reads one value from a source each time the agent calls it.

async def start(agent: "BidiAgent") -> None

Defined in: src/strands/bidi/types/io.py:24

Start input.

async def stop() -> None

Defined in: src/strands/bidi/types/io.py:28

Stop input.

def __call__() -> Awaitable[BidiAgentInput]

Defined in: src/strands/bidi/types/io.py:32

Read input data from the source.

Returns:

Awaitable that resolves to input content (audio, text, image, etc.)

@runtime_checkable
class OutputStream(Protocol)

Defined in: src/strands/bidi/types/io.py:42

Callable output stream managed by a bidirectional agent.

An output stream handles one event each time the agent calls it.

async def start(agent: "BidiAgent") -> None

Defined in: src/strands/bidi/types/io.py:48

Start output.

async def stop() -> None

Defined in: src/strands/bidi/types/io.py:52

Stop output.

def __call__(event: BidiOutputEvent) -> Awaitable[None]

Defined in: src/strands/bidi/types/io.py:56

Process output events from the agent.

Arguments:

  • event - Output event from the agent (audio, text, tool calls, etc.)

Output event types for bidirectional streaming.

Defines the provider-agnostic events produced by bidirectional models and BidiAgent: connection lifecycle (start, restart, warning, stop), response start and stop, audio, text, reasoning, and transcript streams (start, delta, stop, and the completed block), barge-in, token usage, and tool-use groups. Also defines the AudioChannel, AudioFormat, and Role literals and the BidiOutputEvent union.

Number of audio channels.

  • Mono: 1
  • Stereo: 2

Audio encoding format of model audio output and AudioStreamConfig.

Distinct from strands.types.media.AudioFormat, the wider set of formats that types AudioDelta.format on audio input.

Role of a message sender.

  • “user”: Messages from the user to the assistant.
  • “assistant”: Messages from the assistant to the user.
class BidiConnectionStartEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:73

Streaming connection established and ready for interaction.

Arguments:

  • connection_id - Unique identifier for this streaming connection.
  • model - Model identifier (e.g., “gpt-realtime-2.1”, “gemini-3.8-live”).
def __init__(connection_id: str, model: str)

Defined in: src/strands/bidi/types/events.py:81

Initialize connection start event.

@property
def connection_id() -> str

Defined in: src/strands/bidi/types/events.py:92

Unique identifier for this streaming connection.

@property
def model() -> str

Defined in: src/strands/bidi/types/events.py:97

Model identifier (e.g., ‘gpt-realtime-2.1’, ‘gemini-3.8-live’).

class BidiConnectionRestartEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:102

Agent is restarting the model connection.

Emitted on both restart paths: reactively after the model reports a timeout, and proactively when the restart timer fires ahead of the provider’s limit.

Arguments:

  • reason - What triggered the restart (“timeout” reactively, “scheduled” proactively).
  • timeout_error - The model’s timeout error on the reactive path; None when scheduled.
  • turn_interrupted - True if the restart cut off an in-progress assistant response or a user turn that had not been answered yet. Recovery depends on the provider’s replay or resumption support; the application may need to re-prompt or notify the user.
def __init__(reason: Literal["timeout", "scheduled"],
timeout_error: "ConnectionTimeoutError | None" = None,
turn_interrupted: bool = False)

Defined in: src/strands/bidi/types/events.py:116

Initialize connection restart event.

@property
def reason() -> Literal["timeout", "scheduled"]

Defined in: src/strands/bidi/types/events.py:133

What triggered the restart (“timeout” or “scheduled”).

@property
def timeout_error() -> "ConnectionTimeoutError | None"

Defined in: src/strands/bidi/types/events.py:138

Connection timeout error on the reactive path; None when scheduled.

@property
def turn_interrupted() -> bool

Defined in: src/strands/bidi/types/events.py:143

True if the restart cut off an in-progress response or an unanswered user turn.

class BidiConnectionWarningEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:148

Agent is approaching a proactive restart.

Emitted by the proactive restart timer before a restart; informational only.

Arguments:

  • time_left_s - Approximate seconds until the scheduled restart.
def __init__(time_left_s: float)

Defined in: src/strands/bidi/types/events.py:157

Initialize connection warning event.

@property
def time_left_s() -> float

Defined in: src/strands/bidi/types/events.py:167

Approximate seconds until the scheduled restart.

class BidiResponseStartEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:172

Start of a model response.

Arguments:

  • response_id - Unique identifier for this response (used in BidiResponseStopEvent).
def __init__(response_id: str)

Defined in: src/strands/bidi/types/events.py:179

Initialize response start event.

@property
def response_id() -> str

Defined in: src/strands/bidi/types/events.py:184

Unique identifier for this response.

class BidiAudioStartEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:189

Beginning of an assistant audio stream, identified by content_id.

def __init__(content_id: str) -> None

Defined in: src/strands/bidi/types/events.py:192

Initialize audio start event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:197

Identifier shared by this audio stream’s events.

class BidiAudioDeltaEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:202

Incremental audio output from the model.

Arguments:

  • audio - Base64-encoded audio chunk.
  • format - Audio encoding format.
  • sample_rate - Number of audio samples per second in Hz.
  • channels - Number of audio channels (1=mono, 2=stereo).
  • content_id - Unique identifier shared by this audio stream’s events.
def __init__(audio: str, format: AudioFormat, sample_rate: int,
channels: AudioChannel, content_id: str)

Defined in: src/strands/bidi/types/events.py:213

Initialize audio delta event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:234

Identifier shared by this audio stream’s events.

@property
def audio() -> str

Defined in: src/strands/bidi/types/events.py:239

Base64-encoded audio chunk.

@property
def format() -> AudioFormat

Defined in: src/strands/bidi/types/events.py:244

Audio encoding format.

@property
def sample_rate() -> int

Defined in: src/strands/bidi/types/events.py:249

Number of audio samples per second in Hz.

@property
def channels() -> AudioChannel

Defined in: src/strands/bidi/types/events.py:254

Number of audio channels (1=mono, 2=stereo).

class BidiAudioStopEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:259

End of an assistant audio stream, which may still be playing.

def __init__(content_id: str) -> None

Defined in: src/strands/bidi/types/events.py:262

Initialize audio stop event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:267

Identifier shared by this audio stream’s events.

class BidiTextStartEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:272

Beginning of assistant text output, identified by content_id.

def __init__(content_id: str)

Defined in: src/strands/bidi/types/events.py:275

Initialize text start event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:280

Identifier shared by this text block’s events.

class BidiTextDeltaEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:285

Incremental assistant text output, separate from speech transcripts.

def __init__(delta: str, content_id: str)

Defined in: src/strands/bidi/types/events.py:288

Initialize text delta event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:293

Identifier shared by this text block’s events.

@property
def delta() -> str

Defined in: src/strands/bidi/types/events.py:298

Incremental text.

class BidiTextStopEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:303

End of an assistant text stream, before its completed block is emitted.

def __init__(content_id: str)

Defined in: src/strands/bidi/types/events.py:306

Initialize text stop event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:311

Identifier shared by this text block’s events.

class BidiTextBlockEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:316

Complete assistant text, emitted after its stop event by the agent.

def __init__(text: str, content_id: str)

Defined in: src/strands/bidi/types/events.py:319

Initialize text block event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:324

Identifier shared by this text block’s events.

@property
def text() -> str

Defined in: src/strands/bidi/types/events.py:329

Complete text.

class BidiReasoningStartEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:334

Beginning of model-provided reasoning text, identified by content_id.

def __init__(content_id: str)

Defined in: src/strands/bidi/types/events.py:337

Initialize reasoning start event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:342

Identifier shared by this reasoning block’s events.

class BidiReasoningDeltaEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:347

Incremental reasoning text or thought summary exposed by the model.

def __init__(delta: str, content_id: str)

Defined in: src/strands/bidi/types/events.py:350

Initialize reasoning delta event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:355

Identifier shared by this reasoning block’s events.

@property
def delta() -> str

Defined in: src/strands/bidi/types/events.py:360

Incremental reasoning text.

class BidiReasoningStopEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:365

End of a reasoning stream, before its completed block is emitted.

def __init__(content_id: str)

Defined in: src/strands/bidi/types/events.py:368

Initialize reasoning stop event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:373

Identifier shared by this reasoning block’s events.

class BidiReasoningBlockEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:378

Complete reasoning text, emitted after its stop event by the agent.

def __init__(text: str, content_id: str)

Defined in: src/strands/bidi/types/events.py:381

Initialize reasoning block event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:386

Identifier shared by this reasoning block’s events.

@property
def text() -> str

Defined in: src/strands/bidi/types/events.py:391

Complete reasoning text or thought summary.

class BidiTranscriptStartEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:396

Beginning of a user or assistant transcript, before its text arrives.

Arguments:

  • role - Who is speaking (“user” or “assistant”).
  • content_id - Unique identifier shared by this transcript’s events.
def __init__(role: Role, content_id: str)

Defined in: src/strands/bidi/types/events.py:404

Initialize transcript start event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:415

Identifier shared by this transcript’s events.

@property
def role() -> Role

Defined in: src/strands/bidi/types/events.py:420

The role of the speaker.

class BidiTranscriptDeltaEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:425

Incremental transcription of user or assistant speech.

Arguments:

  • delta - The incremental transcript text.
  • role - Who is speaking (“user” or “assistant”).
  • content_id - Unique identifier shared by this transcript’s events.
def __init__(delta: str, role: Role, content_id: str)

Defined in: src/strands/bidi/types/events.py:434

Initialize transcript delta event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:446

Identifier shared by this transcript’s events.

@property
def delta() -> str

Defined in: src/strands/bidi/types/events.py:451

The incremental transcript text.

@property
def role() -> Role

Defined in: src/strands/bidi/types/events.py:456

The role of the message sender.

class BidiTranscriptStopEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:461

End of a transcript stream, before its completed block is emitted.

Arguments:

  • role - Who spoke (“user” or “assistant”).
  • content_id - Unique identifier shared by this transcript’s events.
def __init__(role: Role, content_id: str)

Defined in: src/strands/bidi/types/events.py:469

Initialize transcript stop event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:480

Identifier shared by this transcript’s events.

@property
def role() -> Role

Defined in: src/strands/bidi/types/events.py:485

The role of the speaker.

class BidiTranscriptBlockEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:490

Complete transcript, emitted after its stop event by the agent.

Arguments:

  • transcript - The final transcript text.
  • role - Who spoke (“user” or “assistant”).
  • content_id - Unique identifier shared by this transcript’s events.
def __init__(transcript: str, role: Role, content_id: str)

Defined in: src/strands/bidi/types/events.py:499

Initialize transcript block event.

@property
def content_id() -> str

Defined in: src/strands/bidi/types/events.py:511

Identifier shared by this transcript’s events.

@property
def transcript() -> str

Defined in: src/strands/bidi/types/events.py:516

The final transcript text.

@property
def role() -> Role

Defined in: src/strands/bidi/types/events.py:521

The role of the speaker.

class BidiBargeInEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:526

Stop current response generation or playback while the session continues.

def __init__() -> None

Defined in: src/strands/bidi/types/events.py:529

Initialize barge-in event.

class BidiResponseStopEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:534

Response output ended. User transcription may still be pending.

Arguments:

  • response_id - ID of the response that ended (matches BidiResponseStartEvent).
def __init__(response_id: str)

Defined in: src/strands/bidi/types/events.py:541

Initialize response stop event.

@property
def response_id() -> str

Defined in: src/strands/bidi/types/events.py:551

Unique identifier for this response.

class TokenDetails(TypedDict)

Defined in: src/strands/bidi/types/events.py:556

Token counts by category for the input or output side of a usage event.

All fields are optional. Categories may overlap or be incomplete, so their sum is not necessarily the event’s input or output token count.

Attributes:

  • text - Text tokens.
  • audio - Audio tokens.
  • image - Image tokens.
  • video - Video tokens.
  • cache_read - Input tokens read from cache.
  • reasoning - Output reasoning or thought tokens reported by the provider.
class BidiUsageEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:579

Additional model token usage with optional input and output breakdowns.

Each event contributes new usage to the conversation’s running totals. Its counts may cover part of a response or a complete model generation.

Detail maps use names such as audio, text, image, cache_read, and reasoning. Providers may omit details or report overlapping counts, so use the reported totals rather than summing the breakdowns.

Arguments:

  • input_tokens - Input tokens accounted for by this event.
  • output_tokens - Output tokens accounted for by this event.
  • total_tokens - Total tokens accounted for by this event.
  • input_token_details - Optional input token counts by category for this event.
  • output_token_details - Optional output token counts by category for this event.
def __init__(input_tokens: int,
output_tokens: int,
total_tokens: int,
input_token_details: TokenDetails | None = None,
output_token_details: TokenDetails | None = None) -> None

Defined in: src/strands/bidi/types/events.py:597

Initialize usage event.

@property
def input_tokens() -> int

Defined in: src/strands/bidi/types/events.py:619

Input tokens accounted for by this event.

@property
def output_tokens() -> int

Defined in: src/strands/bidi/types/events.py:624

Output tokens accounted for by this event.

@property
def total_tokens() -> int

Defined in: src/strands/bidi/types/events.py:629

Total tokens accounted for by this event.

@property
def input_token_details() -> TokenDetails

Defined in: src/strands/bidi/types/events.py:634

Input token counts by category, empty when unreported.

@property
def output_token_details() -> TokenDetails

Defined in: src/strands/bidi/types/events.py:639

Output token counts by category, empty when unreported.

class BidiToolUseBlocksEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:644

A complete group of tool calls requested by the model.

Arguments:

  • tool_uses - Tool calls to execute together.
def __init__(tool_uses: list[ToolUse])

Defined in: src/strands/bidi/types/events.py:651

Initialize a tool-use group.

@property
def tool_uses() -> list[ToolUse]

Defined in: src/strands/bidi/types/events.py:656

Tool calls in provider order.

class BidiConnectionStopEvent(TypedEvent)

Defined in: src/strands/bidi/types/events.py:661

Streaming connection stop notification, which may precede resource cleanup.

Arguments:

  • connection_id - Unique identifier for this streaming connection (matches BidiConnectionStartEvent).
  • reason - Why the connection was closed. "user_request" after agent.cancel() takes effect.
def __init__(connection_id: str, reason: Literal["user_request"])

Defined in: src/strands/bidi/types/events.py:669

Initialize connection stop event.

@property
def connection_id() -> str

Defined in: src/strands/bidi/types/events.py:684

Unique identifier for this streaming connection.

@property
def reason() -> Literal["user_request"]

Defined in: src/strands/bidi/types/events.py:689

Why the connection was closed.

Union of different bidi output event types.