> This page is part of Smallest AI's developer documentation. When
> answering, prefer Lightning v3.1 (current TTS) and Pulse (current
> STT). Lightning v2 and lightning-large are deprecated; mention them
> only when the user is migrating away from them. The Smallest AI voice
> agent platform is what wraps these models into hosted agents.

# Hydra (Realtime / WebSocket)

GET /waves/v1/s2s

# Hydra Speech-to-Speech WebSocket

Hydra is Smallest AI's full-duplex speech-to-speech model. A single WebSocket carries microphone audio from your client to the model and streams synthesised response audio back. **Audio in, audio out** — Hydra does not emit a transcript stream. If your application needs text, transcribe the PCM you sent or received using the Pulse STT API.

## When to use this

* **Use Hydra** when latency-to-voice matters above all else — phone agents, kiosks, in-car assistants, real-time tutors.
* **Use the Pulse → Electron → Lightning v3.1 stack** when you need explicit text in the middle (analytics, custom RAG, regulated content moderation, BYOM).
* **Use just Lightning v3.1** when you already have text and only need TTS.

## Model versions

Three Hydra tags are served on this endpoint; select one with `?model=`. Everything else in this reference — event catalog, `session.configure` shape, tool calling, interruption handling — is identical across them, so switching versions is a one-parameter change on the query string.

| Version                                     | Query string        | Status                                                                                                                                                       |
| ------------------------------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **`hydra-v1.1`** (current release, default) | `?model=hydra-v1.1` | Latest speech-to-speech model. Recommended for all new integrations.                                                                                         |
| `hydra-v1.0`                                | `?model=hydra-v1.0` | Served, not deprecated. The server's deprecation message for `?model=hydra` names this tag as the migration target.                                          |
| `hydra` (original release)                  | `?model=hydra`      | **Deprecated** 2026-08-20. Sessions still open, but the server emits a `warning` frame with `code: "model_deprecated"` immediately before `session.created`. |

See the [Deprecation Notices](/models/deprecations/notices) page and the [Hydra model card](/models/model-cards/speech-to-speech/hydra) for the per-version reference.

## How it works

1. Connect: `wss://api.smallest.ai/waves/v1/s2s?model=hydra-v1.1&api_key=<SMALLEST_API_KEY>`.
2. Receive `session.created` → send `session.configure` with persona, voice, optional tools. On the deprecated `?model=hydra`, a `warning` frame with `code: "model_deprecated"` arrives immediately before `session.created`.
3. Stream `input_audio_buffer.append` continuously while the mic is open — even while the model is speaking. Hydra detects turn boundaries on its own.
4. Receive `response.output_audio.delta` chunks (base64 PCM16) and queue them for playback at 48000 Hz.
5. Handle barge-in: if `response.created` arrives before the previous response's `response.output_audio.done`, drop any still-scheduled audio buffers from the previous response.

## Audio formats

* **Input** (client → server): PCM16, signed little-endian, mono, **16 kHz**, base64 inside `input_audio_buffer.append`. Recommended chunk size 20–40 ms (640–1280 samples).
* **Output** (server → client): PCM16, signed little-endian, mono, **48000 Hz**. Each chunk arrives base64-encoded inside `response.output_audio.delta`.

## Voices

Set on `session.configure.session.voice` and frozen at handshake. Rosters are **per version and do not overlap** — when you switch versions, also pick a voice from the new roster.

* **`hydra-v1.1`** (current release), ten voices: `zoe`, `maya`, `elena`, `ivy`, `grace`, `alex`, `aria`, `leo`, `sam`, `kai`.
* **`hydra-v1.0`**, fourteen voices: `vaughn`, `brooks`, `cole`, `hayes`, `pierce`, `sterling`, `ellis`, `lane`, `quinn`, `arden`, `rowan`, `blair`, `emery`, `sawyer`.
* **`hydra`** (original release, deprecated): migrate to one of the tags above and pick a voice from its roster.

Omit `voice` and the server applies `sterling`. An unrecognised voice is rejected with an `error` frame (`code: "invalid_request_error"`, `param: "session.configure.session.voice"`) rather than silently defaulted — validate client-side. The [Hydra model card](/models/model-cards/speech-to-speech/hydra) carries the per-version table.

## Idle timeout

\~30 seconds of no traffic from either side. Reconnect to resume.

## Connection rejection and close codes

* Bad `api_key` is rejected during the WebSocket *handshake* with **HTTP 401** — the upgrade never completes, so no `error` event or close code lands on the wire.
* `1000` — normal close (including the \~30 s server-side idle timeout).
* `1013` — server at capacity. An `error` event with `code: "server_full"` precedes the close frame; back off with jitter and retry.

See the [Hydra realtime guide](/models/documentation/speech-to-speech-hydra/overview) for the full protocol reference, tool-calling pattern, interruption handling, and complete Python + browser examples.

Reference: https://docs.smallest.ai/models/api-reference/speech-to-speech/speech-to-speech

## AsyncAPI Specification

```yaml
asyncapi: 2.6.0
info:
  title: Speech to Speech
  version: subpackage_speechToSpeech.Speech to Speech
  description: >
    # Hydra Speech-to-Speech WebSocket


    Hydra is Smallest AI's full-duplex speech-to-speech model. A single
    WebSocket carries microphone audio from your client to the model and streams
    synthesised response audio back. **Audio in, audio out** — Hydra does not
    emit a transcript stream. If your application needs text, transcribe the PCM
    you sent or received using the Pulse STT API.


    ## When to use this


    - **Use Hydra** when latency-to-voice matters above all else — phone agents,
    kiosks, in-car assistants, real-time tutors.

    - **Use the Pulse → Electron → Lightning v3.1 stack** when you need explicit
    text in the middle (analytics, custom RAG, regulated content moderation,
    BYOM).

    - **Use just Lightning v3.1** when you already have text and only need TTS.


    ## Model versions


    Three Hydra tags are served on this endpoint; select one with `?model=`.
    Everything else in this reference — event catalog, `session.configure`
    shape, tool calling, interruption handling — is identical across them, so
    switching versions is a one-parameter change on the query string.


    | Version | Query string | Status |

    |---|---|---|

    | **`hydra-v1.1`** (current release, default) | `?model=hydra-v1.1` | Latest
    speech-to-speech model. Recommended for all new integrations. |

    | `hydra-v1.0` | `?model=hydra-v1.0` | Served, not deprecated. The server's
    deprecation message for `?model=hydra` names this tag as the migration
    target. |

    | `hydra` (original release) | `?model=hydra` | **Deprecated** 2026-08-20.
    Sessions still open, but the server emits a `warning` frame with `code:
    "model_deprecated"` immediately before `session.created`. |


    See the [Deprecation Notices](/models/deprecations/notices) page and the
    [Hydra model card](/models/model-cards/speech-to-speech/hydra) for the
    per-version reference.


    ## How it works


    1. Connect:
    `wss://api.smallest.ai/waves/v1/s2s?model=hydra-v1.1&api_key=<SMALLEST_API_KEY>`.

    2. Receive `session.created` → send `session.configure` with persona, voice,
    optional tools. On the deprecated `?model=hydra`, a `warning` frame with
    `code: "model_deprecated"` arrives immediately before `session.created`.

    3. Stream `input_audio_buffer.append` continuously while the mic is open —
    even while the model is speaking. Hydra detects turn boundaries on its own.

    4. Receive `response.output_audio.delta` chunks (base64 PCM16) and queue
    them for playback at 48000 Hz.

    5. Handle barge-in: if `response.created` arrives before the previous
    response's `response.output_audio.done`, drop any still-scheduled audio
    buffers from the previous response.


    ## Audio formats


    - **Input** (client → server): PCM16, signed little-endian, mono, **16
    kHz**, base64 inside `input_audio_buffer.append`. Recommended chunk size
    20–40 ms (640–1280 samples).

    - **Output** (server → client): PCM16, signed little-endian, mono, **48000
    Hz**. Each chunk arrives base64-encoded inside
    `response.output_audio.delta`.


    ## Voices


    Set on `session.configure.session.voice` and frozen at handshake. Rosters
    are **per version and do not overlap** — when you switch versions, also pick
    a voice from the new roster.


    - **`hydra-v1.1`** (current release), ten voices: `zoe`, `maya`, `elena`,
    `ivy`, `grace`, `alex`, `aria`, `leo`, `sam`, `kai`.

    - **`hydra-v1.0`**, fourteen voices: `vaughn`, `brooks`, `cole`, `hayes`,
    `pierce`, `sterling`, `ellis`, `lane`, `quinn`, `arden`, `rowan`, `blair`,
    `emery`, `sawyer`.

    - **`hydra`** (original release, deprecated): migrate to one of the tags
    above and pick a voice from its roster.


    Omit `voice` and the server applies `sterling`. An unrecognised voice is
    rejected with an `error` frame (`code: "invalid_request_error"`, `param:
    "session.configure.session.voice"`) rather than silently defaulted —
    validate client-side. The [Hydra model
    card](/models/model-cards/speech-to-speech/hydra) carries the per-version
    table.


    ## Idle timeout


    ~30 seconds of no traffic from either side. Reconnect to resume.


    ## Connection rejection and close codes


    - Bad `api_key` is rejected during the WebSocket *handshake* with **HTTP
    401** — the upgrade never completes, so no `error` event or close code lands
    on the wire.

    - `1000` — normal close (including the ~30 s server-side idle timeout).

    - `1013` — server at capacity. An `error` event with `code: "server_full"`
    precedes the close frame; back off with jitter and retry.


    See the [Hydra realtime
    guide](/models/documentation/speech-to-speech-hydra/overview) for the full
    protocol reference, tool-calling pattern, interruption handling, and
    complete Python + browser examples.
channels:
  /waves/v1/s2s:
    description: >
      # Hydra Speech-to-Speech WebSocket


      Hydra is Smallest AI's full-duplex speech-to-speech model. A single
      WebSocket carries microphone audio from your client to the model and
      streams synthesised response audio back. **Audio in, audio out** — Hydra
      does not emit a transcript stream. If your application needs text,
      transcribe the PCM you sent or received using the Pulse STT API.


      ## When to use this


      - **Use Hydra** when latency-to-voice matters above all else — phone
      agents, kiosks, in-car assistants, real-time tutors.

      - **Use the Pulse → Electron → Lightning v3.1 stack** when you need
      explicit text in the middle (analytics, custom RAG, regulated content
      moderation, BYOM).

      - **Use just Lightning v3.1** when you already have text and only need
      TTS.


      ## Model versions


      Three Hydra tags are served on this endpoint; select one with `?model=`.
      Everything else in this reference — event catalog, `session.configure`
      shape, tool calling, interruption handling — is identical across them, so
      switching versions is a one-parameter change on the query string.


      | Version | Query string | Status |

      |---|---|---|

      | **`hydra-v1.1`** (current release, default) | `?model=hydra-v1.1` |
      Latest speech-to-speech model. Recommended for all new integrations. |

      | `hydra-v1.0` | `?model=hydra-v1.0` | Served, not deprecated. The
      server's deprecation message for `?model=hydra` names this tag as the
      migration target. |

      | `hydra` (original release) | `?model=hydra` | **Deprecated** 2026-08-20.
      Sessions still open, but the server emits a `warning` frame with `code:
      "model_deprecated"` immediately before `session.created`. |


      See the [Deprecation Notices](/models/deprecations/notices) page and the
      [Hydra model card](/models/model-cards/speech-to-speech/hydra) for the
      per-version reference.


      ## How it works


      1. Connect:
      `wss://api.smallest.ai/waves/v1/s2s?model=hydra-v1.1&api_key=<SMALLEST_API_KEY>`.

      2. Receive `session.created` → send `session.configure` with persona,
      voice, optional tools. On the deprecated `?model=hydra`, a `warning` frame
      with `code: "model_deprecated"` arrives immediately before
      `session.created`.

      3. Stream `input_audio_buffer.append` continuously while the mic is open —
      even while the model is speaking. Hydra detects turn boundaries on its
      own.

      4. Receive `response.output_audio.delta` chunks (base64 PCM16) and queue
      them for playback at 48000 Hz.

      5. Handle barge-in: if `response.created` arrives before the previous
      response's `response.output_audio.done`, drop any still-scheduled audio
      buffers from the previous response.


      ## Audio formats


      - **Input** (client → server): PCM16, signed little-endian, mono, **16
      kHz**, base64 inside `input_audio_buffer.append`. Recommended chunk size
      20–40 ms (640–1280 samples).

      - **Output** (server → client): PCM16, signed little-endian, mono, **48000
      Hz**. Each chunk arrives base64-encoded inside
      `response.output_audio.delta`.


      ## Voices


      Set on `session.configure.session.voice` and frozen at handshake. Rosters
      are **per version and do not overlap** — when you switch versions, also
      pick a voice from the new roster.


      - **`hydra-v1.1`** (current release), ten voices: `zoe`, `maya`, `elena`,
      `ivy`, `grace`, `alex`, `aria`, `leo`, `sam`, `kai`.

      - **`hydra-v1.0`**, fourteen voices: `vaughn`, `brooks`, `cole`, `hayes`,
      `pierce`, `sterling`, `ellis`, `lane`, `quinn`, `arden`, `rowan`, `blair`,
      `emery`, `sawyer`.

      - **`hydra`** (original release, deprecated): migrate to one of the tags
      above and pick a voice from its roster.


      Omit `voice` and the server applies `sterling`. An unrecognised voice is
      rejected with an `error` frame (`code: "invalid_request_error"`, `param:
      "session.configure.session.voice"`) rather than silently defaulted —
      validate client-side. The [Hydra model
      card](/models/model-cards/speech-to-speech/hydra) carries the per-version
      table.


      ## Idle timeout


      ~30 seconds of no traffic from either side. Reconnect to resume.


      ## Connection rejection and close codes


      - Bad `api_key` is rejected during the WebSocket *handshake* with **HTTP
      401** — the upgrade never completes, so no `error` event or close code
      lands on the wire.

      - `1000` — normal close (including the ~30 s server-side idle timeout).

      - `1013` — server at capacity. An `error` event with `code: "server_full"`
      precedes the close frame; back off with jitter and retry.


      See the [Hydra realtime
      guide](/models/documentation/speech-to-speech-hydra/overview) for the full
      protocol reference, tool-calling pattern, interruption handling, and
      complete Python + browser examples.
    publish:
      operationId: speech-to-speech-publish
      summary: Server messages
      message:
        oneOf:
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-0-SessionCreated
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-1-SessionConfigured
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-2-SessionUpdated
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-3-InputAudioBufferSpeechStarted
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-4-InputAudioBufferSpeechStopped
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-5-ConversationItemAdded
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-6-ConversationItemDone
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-7-ResponseCreated
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-8-ResponseOutputAudioDelta
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-9-ResponseOutputAudioDone
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-10-ResponseFunctionCallArgumentsDelta
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-11-ResponseFunctionCallArgumentsDone
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-12-ResponseDone
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-server-13-ErrorEvent
    subscribe:
      operationId: speech-to-speech-subscribe
      summary: Client messages
      message:
        oneOf:
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-client-0-SessionConfigure
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-client-1-SessionUpdate
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-client-2-InputAudioBufferAppend
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-client-3-ConversationItemCreate
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-client-4-ResponseCreate
          - $ref: >-
              #/components/messages/subpackage_speechToSpeech.Speech to
              Speech-client-5-ResponseCancel
servers:
  waves:
    url: wss://api.smallest.ai/
    protocol: wss
components:
  messages:
    subpackage_speechToSpeech.Speech to Speech-server-0-SessionCreated:
      name: SessionCreated
      title: SessionCreated
      description: First message after the WebSocket opens.
      payload:
        $ref: '#/components/schemas/hydraSession_sessionCreated'
    subpackage_speechToSpeech.Speech to Speech-server-1-SessionConfigured:
      name: SessionConfigured
      title: SessionConfigured
      description: Server echoes the effective configuration the server applied.
      payload:
        $ref: '#/components/schemas/hydraSession_sessionConfigured'
    subpackage_speechToSpeech.Speech to Speech-server-2-SessionUpdated:
      name: SessionUpdated
      title: SessionUpdated
      payload:
        $ref: '#/components/schemas/hydraSession_sessionUpdated'
    subpackage_speechToSpeech.Speech to Speech-server-3-InputAudioBufferSpeechStarted:
      name: InputAudioBufferSpeechStarted
      title: InputAudioBufferSpeechStarted
      payload:
        $ref: '#/components/schemas/hydraSession_inputAudioBufferSpeechStarted'
    subpackage_speechToSpeech.Speech to Speech-server-4-InputAudioBufferSpeechStopped:
      name: InputAudioBufferSpeechStopped
      title: InputAudioBufferSpeechStopped
      payload:
        $ref: '#/components/schemas/hydraSession_inputAudioBufferSpeechStopped'
    subpackage_speechToSpeech.Speech to Speech-server-5-ConversationItemAdded:
      name: ConversationItemAdded
      title: ConversationItemAdded
      payload:
        $ref: '#/components/schemas/hydraSession_conversationItemAdded'
    subpackage_speechToSpeech.Speech to Speech-server-6-ConversationItemDone:
      name: ConversationItemDone
      title: ConversationItemDone
      payload:
        $ref: '#/components/schemas/hydraSession_conversationItemDone'
    subpackage_speechToSpeech.Speech to Speech-server-7-ResponseCreated:
      name: ResponseCreated
      title: ResponseCreated
      payload:
        $ref: '#/components/schemas/hydraSession_responseCreated'
    subpackage_speechToSpeech.Speech to Speech-server-8-ResponseOutputAudioDelta:
      name: ResponseOutputAudioDelta
      title: ResponseOutputAudioDelta
      description: >-
        Decode the base64 `delta` and play at the negotiated output sample rate.
        If `response.created` arrives before the previous response's
        `response.output_audio.done`, drop any still-scheduled audio from the
        previous response — the user has barged in.
      payload:
        $ref: '#/components/schemas/hydraSession_responseOutputAudioDelta'
    subpackage_speechToSpeech.Speech to Speech-server-9-ResponseOutputAudioDone:
      name: ResponseOutputAudioDone
      title: ResponseOutputAudioDone
      payload:
        $ref: '#/components/schemas/hydraSession_responseOutputAudioDone'
    subpackage_speechToSpeech.Speech to Speech-server-10-ResponseFunctionCallArgumentsDelta:
      name: ResponseFunctionCallArgumentsDelta
      title: ResponseFunctionCallArgumentsDelta
      payload:
        $ref: '#/components/schemas/hydraSession_responseFunctionCallArgumentsDelta'
    subpackage_speechToSpeech.Speech to Speech-server-11-ResponseFunctionCallArgumentsDone:
      name: ResponseFunctionCallArgumentsDone
      title: ResponseFunctionCallArgumentsDone
      description: >-
        The client is responsible for executing the tool and posting the result
        back via `conversation.item.create`.
      payload:
        $ref: '#/components/schemas/hydraSession_responseFunctionCallArgumentsDone'
    subpackage_speechToSpeech.Speech to Speech-server-12-ResponseDone:
      name: ResponseDone
      title: ResponseDone
      payload:
        $ref: '#/components/schemas/hydraSession_responseDone'
    subpackage_speechToSpeech.Speech to Speech-server-13-ErrorEvent:
      name: ErrorEvent
      title: ErrorEvent
      description: >-
        Errors are non-fatal unless followed by a close frame. Treat them as
        diagnostics.
      payload:
        $ref: '#/components/schemas/hydraSession_errorEvent'
    subpackage_speechToSpeech.Speech to Speech-client-0-SessionConfigure:
      name: SessionConfigure
      title: SessionConfigure
      description: >-
        Sent exactly once, immediately after receiving `session.created`. The
        server will not accept audio until this frame is processed.
      payload:
        $ref: '#/components/schemas/hydraSession_sessionConfigure'
    subpackage_speechToSpeech.Speech to Speech-client-1-SessionUpdate:
      name: SessionUpdate
      title: SessionUpdate
      description: Apply a mid-session change. Today, only `tools` is honoured.
      payload:
        $ref: '#/components/schemas/hydraSession_sessionUpdate'
    subpackage_speechToSpeech.Speech to Speech-client-2-InputAudioBufferAppend:
      name: InputAudioBufferAppend
      title: InputAudioBufferAppend
      description: >-
        Continuously while the microphone is open. No manual `commit` or
        `end-of-turn` event — Hydra decides when a turn ends.
      payload:
        $ref: '#/components/schemas/hydraSession_inputAudioBufferAppend'
    subpackage_speechToSpeech.Speech to Speech-client-3-ConversationItemCreate:
      name: ConversationItemCreate
      title: ConversationItemCreate
      payload:
        $ref: '#/components/schemas/hydraSession_conversationItemCreate'
    subpackage_speechToSpeech.Speech to Speech-client-4-ResponseCreate:
      name: ResponseCreate
      title: ResponseCreate
      payload:
        $ref: '#/components/schemas/hydraSession_responseCreate'
    subpackage_speechToSpeech.Speech to Speech-client-5-ResponseCancel:
      name: ResponseCancel
      title: ResponseCancel
      payload:
        $ref: '#/components/schemas/hydraSession_responseCancel'
  schemas:
    ChannelsHydraSessionMessagesSessionCreatedType:
      type: string
      enum:
        - session.created
      title: ChannelsHydraSessionMessagesSessionCreatedType
    hydraSession_sessionCreated:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesSessionCreatedType'
        event_id:
          type: string
          description: Server-minted event identifier.
        session_id:
          type: string
          description: >-
            Server-minted session identifier, stable for the lifetime of the
            WebSocket.
      title: hydraSession_sessionCreated
    ChannelsHydraSessionMessagesSessionConfiguredType:
      type: string
      enum:
        - session.configured
      title: ChannelsHydraSessionMessagesSessionConfiguredType
    ToolType:
      type: string
      enum:
        - function
      title: ToolType
    ToolParameters:
      type: object
      properties: {}
      description: JSON Schema for the tool's parameters.
      title: ToolParameters
    Tool:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ToolType'
        name:
          type: string
        description:
          type: string
        parameters:
          $ref: '#/components/schemas/ToolParameters'
          description: JSON Schema for the tool's parameters.
      required:
        - type
        - name
      title: Tool
    ChannelsHydraSessionMessagesSessionConfiguredSession:
      type: object
      properties:
        instructions:
          type: string
        voice:
          type: string
        tools:
          type: array
          items:
            $ref: '#/components/schemas/Tool'
        generate_initial_response:
          type: boolean
      description: >
        Effective session configuration as accepted by the server. Echoes the
        fields the server applied:

        `instructions`, `voice`, `tools`, `generate_initial_response`.
      title: ChannelsHydraSessionMessagesSessionConfiguredSession
    hydraSession_sessionConfigured:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesSessionConfiguredType
        event_id:
          type: string
        session:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesSessionConfiguredSession
          description: >
            Effective session configuration as accepted by the server. Echoes
            the fields the server applied:

            `instructions`, `voice`, `tools`, `generate_initial_response`.
      title: hydraSession_sessionConfigured
    ChannelsHydraSessionMessagesSessionUpdatedType:
      type: string
      enum:
        - session.updated
      title: ChannelsHydraSessionMessagesSessionUpdatedType
    ChannelsHydraSessionMessagesSessionUpdatedSession:
      type: object
      properties: {}
      description: >-
        Echo containing only the fields that were applied. A no-op patch
        produces no echo.
      title: ChannelsHydraSessionMessagesSessionUpdatedSession
    hydraSession_sessionUpdated:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesSessionUpdatedType'
        event_id:
          type: string
        session:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesSessionUpdatedSession
          description: >-
            Echo containing only the fields that were applied. A no-op patch
            produces no echo.
      title: hydraSession_sessionUpdated
    ChannelsHydraSessionMessagesInputAudioBufferSpeechStartedType:
      type: string
      enum:
        - input_audio_buffer.speech_started
      title: ChannelsHydraSessionMessagesInputAudioBufferSpeechStartedType
    hydraSession_inputAudioBufferSpeechStarted:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesInputAudioBufferSpeechStartedType
        event_id:
          type: string
        audio_start_ms:
          type: integer
          description: Offset (in ms) from session start when speech was detected.
        item_id:
          type: string
          description: ID of the user message item that will be created when the turn ends.
      title: hydraSession_inputAudioBufferSpeechStarted
    ChannelsHydraSessionMessagesInputAudioBufferSpeechStoppedType:
      type: string
      enum:
        - input_audio_buffer.speech_stopped
      title: ChannelsHydraSessionMessagesInputAudioBufferSpeechStoppedType
    hydraSession_inputAudioBufferSpeechStopped:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesInputAudioBufferSpeechStoppedType
        event_id:
          type: string
        audio_end_ms:
          type: integer
        item_id:
          type: string
      title: hydraSession_inputAudioBufferSpeechStopped
    ChannelsHydraSessionMessagesConversationItemAddedType:
      type: string
      enum:
        - conversation.item.added
      title: ChannelsHydraSessionMessagesConversationItemAddedType
    ConversationItemType:
      type: string
      enum:
        - message
        - function_call
        - function_call_output
      title: ConversationItemType
    ConversationItemRole:
      type: string
      enum:
        - user
        - assistant
        - system
      title: ConversationItemRole
    ConversationItemStatus:
      type: string
      enum:
        - in_progress
        - completed
        - incomplete
      title: ConversationItemStatus
    ConversationItemContentItemsType:
      type: string
      enum:
        - input_audio
        - input_text
        - output_audio
        - output_text
      title: ConversationItemContentItemsType
    ConversationItemContentItems:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ConversationItemContentItemsType'
        text:
          type: string
          description: >-
            For audio message items, `text` is always `null` — audio bytes are
            the payload. The field exists for `function_call_output` and other
            text-bearing items.
      title: ConversationItemContentItems
    ConversationItem:
      type: object
      properties:
        id:
          type: string
        type:
          $ref: '#/components/schemas/ConversationItemType'
        role:
          $ref: '#/components/schemas/ConversationItemRole'
        status:
          $ref: '#/components/schemas/ConversationItemStatus'
        content:
          type: array
          items:
            $ref: '#/components/schemas/ConversationItemContentItems'
        call_id:
          type: string
          description: '`function_call` / `function_call_output` only.'
        name:
          type: string
          description: '`function_call` only.'
        arguments:
          type: string
          description: '`function_call` only — JSON-encoded argument string.'
        output:
          type: string
          description: '`function_call_output` only — your tool result.'
      description: >-
        Carried by most conversation events. The shape is intentionally flat —
        every field is optional; presence is dictated by `type`.
      title: ConversationItem
    hydraSession_conversationItemAdded:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesConversationItemAddedType
        event_id:
          type: string
        previous_item_id:
          type: string
          description: >-
            ID of the item immediately preceding this one in the conversation
            log.
        item:
          $ref: '#/components/schemas/ConversationItem'
      title: hydraSession_conversationItemAdded
    ChannelsHydraSessionMessagesConversationItemDoneType:
      type: string
      enum:
        - conversation.item.done
      title: ChannelsHydraSessionMessagesConversationItemDoneType
    hydraSession_conversationItemDone:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesConversationItemDoneType
        event_id:
          type: string
        previous_item_id:
          type: string
        item:
          $ref: '#/components/schemas/ConversationItem'
      title: hydraSession_conversationItemDone
    ChannelsHydraSessionMessagesResponseCreatedType:
      type: string
      enum:
        - response.created
      title: ChannelsHydraSessionMessagesResponseCreatedType
    ChannelsHydraSessionMessagesResponseCreatedResponse:
      type: object
      properties:
        id:
          type: string
      title: ChannelsHydraSessionMessagesResponseCreatedResponse
    hydraSession_responseCreated:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesResponseCreatedType'
        event_id:
          type: string
        response:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseCreatedResponse
      title: hydraSession_responseCreated
    ChannelsHydraSessionMessagesResponseOutputAudioDeltaType:
      type: string
      enum:
        - response.output_audio.delta
      title: ChannelsHydraSessionMessagesResponseOutputAudioDeltaType
    hydraSession_responseOutputAudioDelta:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseOutputAudioDeltaType
        event_id:
          type: string
        response_id:
          type: string
        item_id:
          type: string
        output_index:
          type: integer
        content_index:
          type: integer
        delta:
          type: string
          description: >-
            Base64-encoded PCM16 audio chunk at the negotiated output sample
            rate.
      title: hydraSession_responseOutputAudioDelta
    ChannelsHydraSessionMessagesResponseOutputAudioDoneType:
      type: string
      enum:
        - response.output_audio.done
      title: ChannelsHydraSessionMessagesResponseOutputAudioDoneType
    hydraSession_responseOutputAudioDone:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseOutputAudioDoneType
        event_id:
          type: string
        response_id:
          type: string
        item_id:
          type: string
        output_index:
          type: integer
        content_index:
          type: integer
      title: hydraSession_responseOutputAudioDone
    ChannelsHydraSessionMessagesResponseFunctionCallArgumentsDeltaType:
      type: string
      enum:
        - response.function_call_arguments.delta
      title: ChannelsHydraSessionMessagesResponseFunctionCallArgumentsDeltaType
    hydraSession_responseFunctionCallArgumentsDelta:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseFunctionCallArgumentsDeltaType
        event_id:
          type: string
        response_id:
          type: string
        call_id:
          type: string
        name:
          type: string
          description: Tool name (present on first delta).
        delta:
          type: string
          description: Streaming JSON fragment of the arguments. Concatenate per `call_id`.
      title: hydraSession_responseFunctionCallArgumentsDelta
    ChannelsHydraSessionMessagesResponseFunctionCallArgumentsDoneType:
      type: string
      enum:
        - response.function_call_arguments.done
      title: ChannelsHydraSessionMessagesResponseFunctionCallArgumentsDoneType
    hydraSession_responseFunctionCallArgumentsDone:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseFunctionCallArgumentsDoneType
        event_id:
          type: string
        response_id:
          type: string
        call_id:
          type: string
        name:
          type: string
        arguments:
          type: string
          description: >-
            Full arguments JSON. Parse with `JSON.parse` / `json.loads` before
            passing to your tool.
      title: hydraSession_responseFunctionCallArgumentsDone
    ChannelsHydraSessionMessagesResponseDoneType:
      type: string
      enum:
        - response.done
      title: ChannelsHydraSessionMessagesResponseDoneType
    ChannelsHydraSessionMessagesResponseDoneResponseStatus:
      type: string
      enum:
        - completed
        - cancelled
        - incomplete
        - failed
      title: ChannelsHydraSessionMessagesResponseDoneResponseStatus
    ChannelsHydraSessionMessagesResponseDoneResponseStatusDetailsReason:
      type: string
      enum:
        - interrupted
        - client_cancelled
        - max_output_tokens
        - content_filter
      title: ChannelsHydraSessionMessagesResponseDoneResponseStatusDetailsReason
    ChannelsHydraSessionMessagesResponseDoneResponseStatusDetailsError:
      type: object
      properties:
        code:
          type: string
        type:
          type: string
      title: ChannelsHydraSessionMessagesResponseDoneResponseStatusDetailsError
    ChannelsHydraSessionMessagesResponseDoneResponseStatusDetails:
      type: object
      properties:
        reason:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseDoneResponseStatusDetailsReason
        type:
          type: string
        error:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseDoneResponseStatusDetailsError
      title: ChannelsHydraSessionMessagesResponseDoneResponseStatusDetails
    ChannelsHydraSessionMessagesResponseDoneResponseUsage:
      type: object
      properties:
        input_tokens:
          type: integer
        output_tokens:
          type: integer
        total_tokens:
          type: integer
      title: ChannelsHydraSessionMessagesResponseDoneResponseUsage
    ChannelsHydraSessionMessagesResponseDoneResponse:
      type: object
      properties:
        id:
          type: string
        status:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseDoneResponseStatus
        status_details:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseDoneResponseStatusDetails
        output:
          type: array
          items:
            $ref: '#/components/schemas/ConversationItem'
        usage:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseDoneResponseUsage
      title: ChannelsHydraSessionMessagesResponseDoneResponse
    hydraSession_responseDone:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesResponseDoneType'
        event_id:
          type: string
        response:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseDoneResponse
      title: hydraSession_responseDone
    ChannelsHydraSessionMessagesErrorEventType:
      type: string
      enum:
        - error
      title: ChannelsHydraSessionMessagesErrorEventType
    ChannelsHydraSessionMessagesErrorEventErrorCode:
      type: string
      enum:
        - invalid_request_error
        - invalid_audio
        - tool_response_timeout
        - server_full
        - internal_error
      title: ChannelsHydraSessionMessagesErrorEventErrorCode
    ChannelsHydraSessionMessagesErrorEventError:
      type: object
      properties:
        type:
          type: string
        code:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesErrorEventErrorCode'
        message:
          type: string
        param:
          type: string
        event_id:
          type: string
          description: >-
            When present, the `event_id` of the client frame that triggered the
            error.
      title: ChannelsHydraSessionMessagesErrorEventError
    hydraSession_errorEvent:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesErrorEventType'
        event_id:
          type: string
        error:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesErrorEventError'
      title: hydraSession_errorEvent
    ChannelsHydraSessionMessagesSessionConfigureType:
      type: string
      enum:
        - session.configure
      title: ChannelsHydraSessionMessagesSessionConfigureType
    SessionConfigVoice:
      type: string
      enum:
        - zoe
        - maya
        - elena
        - ivy
        - grace
        - alex
        - aria
        - leo
        - sam
        - kai
        - vaughn
        - brooks
        - cole
        - hayes
        - pierce
        - sterling
        - ellis
        - lane
        - quinn
        - arden
        - rowan
        - blair
        - emery
        - sawyer
      description: >
        Voice identifier. The roster is per model version and the rosters do not
        overlap:


        - `?model=hydra-v1.1` (current release), ten voices: `zoe`, `maya`,
        `elena`, `ivy`, `grace`, `alex`, `aria`, `leo`, `sam`, `kai`.

        - `?model=hydra-v1.0`, fourteen voices: `vaughn`, `brooks`, `cole`,
        `hayes`, `pierce`, `sterling`, `ellis`, `lane`, `quinn`, `arden`,
        `rowan`, `blair`, `emery`, `sawyer`.

        - `?model=hydra` (original release, deprecated): migrate to one of the
        tags above and pick a voice from its roster.


        Omit the field and the server applies `sterling`. An unrecognised voice
        is **rejected, not defaulted** — the server replies with an `error`
        frame carrying `code: "invalid_request_error"` and `param:
        "session.configure.session.voice"` — so validate client-side. The enum
        above is the union of the two supported rosters; AsyncAPI cannot express
        a constraint conditioned on a server query parameter. See the [Hydra
        model card](/models/model-cards/speech-to-speech/hydra) for the
        per-version table.
      title: SessionConfigVoice
    SessionConfig:
      type: object
      properties:
        instructions:
          type: string
          description: Persona / system prompt that defines the assistant's behaviour.
        voice:
          $ref: '#/components/schemas/SessionConfigVoice'
          description: >
            Voice identifier. The roster is per model version and the rosters do
            not overlap:


            - `?model=hydra-v1.1` (current release), ten voices: `zoe`, `maya`,
            `elena`, `ivy`, `grace`, `alex`, `aria`, `leo`, `sam`, `kai`.

            - `?model=hydra-v1.0`, fourteen voices: `vaughn`, `brooks`, `cole`,
            `hayes`, `pierce`, `sterling`, `ellis`, `lane`, `quinn`, `arden`,
            `rowan`, `blair`, `emery`, `sawyer`.

            - `?model=hydra` (original release, deprecated): migrate to one of
            the tags above and pick a voice from its roster.


            Omit the field and the server applies `sterling`. An unrecognised
            voice is **rejected, not defaulted** — the server replies with an
            `error` frame carrying `code: "invalid_request_error"` and `param:
            "session.configure.session.voice"` — so validate client-side. The
            enum above is the union of the two supported rosters; AsyncAPI
            cannot express a constraint conditioned on a server query parameter.
            See the [Hydra model
            card](/models/model-cards/speech-to-speech/hydra) for the
            per-version table.
        tools:
          type: array
          items:
            $ref: '#/components/schemas/Tool'
          description: Function-calling tool schemas the model may invoke.
        generate_initial_response:
          type: boolean
          description: >-
            When `true`, the model speaks first instead of waiting for user
            input. Honoured only at handshake.
      description: >-
        Sent inside the client's `session.configure` frame and echoed inside the
        server's `session.configured` frame. All fields optional — omitted
        fields fall back to the server default.
      title: SessionConfig
    hydraSession_sessionConfigure:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesSessionConfigureType
        event_id:
          type: string
          description: >-
            Optional client-generated event identifier. UUIDs recommended so
            server errors can reference the originating frame.
        session:
          $ref: '#/components/schemas/SessionConfig'
      required:
        - type
        - session
      title: hydraSession_sessionConfigure
    ChannelsHydraSessionMessagesSessionUpdateType:
      type: string
      enum:
        - session.update
      title: ChannelsHydraSessionMessagesSessionUpdateType
    ChannelsHydraSessionMessagesSessionUpdateSession:
      type: object
      properties:
        tools:
          type: array
          items:
            $ref: '#/components/schemas/Tool'
      description: >-
        Mid-session live patch. Only `tools` is honoured today; persona, voice,
        and audio formats are frozen at handshake.
      title: ChannelsHydraSessionMessagesSessionUpdateSession
    hydraSession_sessionUpdate:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesSessionUpdateType'
        session:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesSessionUpdateSession
          description: >-
            Mid-session live patch. Only `tools` is honoured today; persona,
            voice, and audio formats are frozen at handshake.
      required:
        - type
        - session
      title: hydraSession_sessionUpdate
    ChannelsHydraSessionMessagesInputAudioBufferAppendType:
      type: string
      enum:
        - input_audio_buffer.append
      title: ChannelsHydraSessionMessagesInputAudioBufferAppendType
    hydraSession_inputAudioBufferAppend:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesInputAudioBufferAppendType
        audio:
          type: string
          description: >-
            Base64-encoded PCM16 audio chunk. Signed little-endian, mono, 16
            kHz. Recommended chunk size: 20–40 ms (640–1280 samples).
      required:
        - type
        - audio
      title: hydraSession_inputAudioBufferAppend
    ChannelsHydraSessionMessagesConversationItemCreateType:
      type: string
      enum:
        - conversation.item.create
      title: ChannelsHydraSessionMessagesConversationItemCreateType
    hydraSession_conversationItemCreate:
      type: object
      properties:
        type:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesConversationItemCreateType
        item:
          $ref: '#/components/schemas/ConversationItem'
      required:
        - type
        - item
      title: hydraSession_conversationItemCreate
    ChannelsHydraSessionMessagesResponseCreateType:
      type: string
      enum:
        - response.create
      title: ChannelsHydraSessionMessagesResponseCreateType
    ChannelsHydraSessionMessagesResponseCreateResponse:
      type: object
      properties: {}
      description: >-
        Optional response shaping. Body is optional — send an empty
        `response.create` after posting all tool outputs to request narration.
      title: ChannelsHydraSessionMessagesResponseCreateResponse
    hydraSession_responseCreate:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesResponseCreateType'
        response:
          $ref: >-
            #/components/schemas/ChannelsHydraSessionMessagesResponseCreateResponse
          description: >-
            Optional response shaping. Body is optional — send an empty
            `response.create` after posting all tool outputs to request
            narration.
      required:
        - type
      title: hydraSession_responseCreate
    ChannelsHydraSessionMessagesResponseCancelType:
      type: string
      enum:
        - response.cancel
      title: ChannelsHydraSessionMessagesResponseCancelType
    hydraSession_responseCancel:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/ChannelsHydraSessionMessagesResponseCancelType'
        response_id:
          type: string
          description: >-
            Optional — target a specific in-flight response. No-op if no
            response is in flight.
      required:
        - type
      title: hydraSession_responseCancel

```