Skip to content

feat(providers): ElevenLabs scribe_v2_realtime streaming transcription (RFC-0034 P2) - #184

Merged
eric8810 merged 2 commits into
masterfrom
rfc-0034/elevenlabs-realtime
Sep 15, 2026
Merged

eric8810 merged 2 commits into
masterfrom
rfc-0034/elevenlabs-realtime

Conversation

@eric8810

Copy link
Copy Markdown
Contributor

Implements P2 of RFC-0034: ElevenLabs scribe_v2_realtime streaming transcription (do_stream on ElevenLabsTranscriptionModel, behind the existing realtime feature).

Stacked on #183 (P1, WS proxy) — until that merges, this diff includes P1's commits; it collapses to the P2 delta afterwards. P3 (Cartesia) is deferred with explicit restart triggers (RFC-0034 §4/D6); the gate comment in cartesia.rs records it.

What lands

  • Gating symmetric to OpenAI: scribe_v2_realtime*do_stream; everything else → do_generate. do_generate now rejects realtime IDs with a clear message instead of posting them to the batch REST endpoint.
  • Wire shape per the public API reference (2026-09), pinned field-by-field by 8 mock-server tests: config on the URL query (commit_strategy=manual fixed, D3; languageCode/includeTimestamps the only provider options, D5), xi-api-key handshake header, base64 input_audio_chunk frames with sample_rate, commit:true riding the last real chunk (hold-one-chunk pipeline; empty stream commits an empty chunk), partial_transcriptTranscriptPartial (replace semantics), committed_transcript[_with_timestamps]TranscriptFinal + Finish (word segments, spacing dropped), client close(1000) after the final.
  • Termination guarantee: the server never closes after a commit, so a settle window (chunk_ms, 5 s default) bounds the wait with an empty Finish — mirroring Align the request pipeline with the AI SDK #164's terminal-fuse principle.
  • Error taxonomy: the 14 documented event names classified — rate_limited/queue_overflow/resource_exhausted retryable, the rest terminal; raw event preserved in response_body.
  • Non-pcm/ulaw input formats fail fast without connecting.

Verification

  • 8 tests in aimux-providers/tests/elevenlabs_realtime_stream_test.rs (happy path with query/header/chunk-frame assertions, timestamps variant, empty-audio commit, 4-way error classification, silent-server settle, mid-session abort, symmetric gating, format rejection). Workspace clippy clean.
  • Live-API smoke pending (no key at implementation time) — same posture as RFC-0028 D4; flagged in the do_stream doc comment. Smoke through a proxy also closes P1's untested wss+rustls branch.

Closes the P2 scope of #178.

…n (RFC-0034 P2)

ElevenLabsTranscriptionModel gains do_stream behind the existing
'realtime' feature, gated on scribe_v2_realtime* (inverse gating in
do_generate rejects realtime IDs with a clear message instead of
posting them to the batch endpoint).

Wire shape per the public API reference (2026-09), pinned
field-by-field by local mock-server tests:
- config travels on the URL query (model_id, audio_format
  pcm_{rate}/ulaw_{rate}, commit_strategy=manual, optional
  language_code/include_timestamps from providerOptions.elevenlabs);
  xi-api-key rides the WS handshake headers
- audio: base64 in input_audio_chunk JSON with sample_rate; a
  hold-one-chunk pipeline puts commit:true on the LAST real chunk (an
  empty stream commits a single empty chunk); audio waits for
  session_started
- partial_transcript -> TranscriptPartial (replace semantics),
  committed_transcript[_with_timestamps] -> TranscriptFinal + Finish
  (segments from words, spacing entries dropped), then client
  close(1000)
- 14 documented error event names classified: rate_limited /
  queue_overflow / resource_exhausted retry, the rest terminal
- the server never closes after commit, so a settle window (chunk_ms,
  5s default) bounds the wait with an empty Finish — the stream always
  terminates
- non-pcm/ulaw input formats fail fast without connecting

Live-API smoke pending (no key at implementation time) — same posture
as RFC-0028 D4; the do_stream doc comment says so.

Also: cartesia.rs gate comment now records the P3 deferral (RFC-0034
D6); RFC status/plan rows updated.
@eric8810
eric8810 force-pushed the rfc-0034/elevenlabs-realtime branch from 9c2afbf to 6eb5351 Compare September 15, 2026 04:24
@eric8810
eric8810 merged commit d66e195 into master Sep 15, 2026
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant