> 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.

# TTS: latency measurement caveat + legacy /streaming-tts/stream artifacts retired

> Two related updates to the TTS docs.

Two related updates to the TTS docs.

**Latency measurement caveat added to the Lightning v3.1 + Pro model cards.** The published \~200 ms TTFB is measured from a client in the same AWS region as the inference pool (India `ap-south-1`, USA `us-west-2`, geo-routed). Client-to-server RTT adds on top. A naive TTFB test from a laptop far from either region typically reports 500-800 ms because RTT dominates synthesis time. Callout now spells this out next to the number so readers know to test from their production network position, not their dev machine.

**Legacy `/waves/v1/streaming-tts/stream` artifacts retired.** The `lightning-tts-ws.mdx` API-reference page and the `stream-tts-ws.yaml` AsyncAPI + overrides are removed. Both predated the unified `/waves/v1/tts/live` split and documented the SSE transport with the WebSocket envelope shape, which was contradictory. The unified endpoint has been the documented and supported path for a while; these files were dormant. Generator wiring, spec-drift allow-list, and nav-ignore lists updated accordingly.

**Canonical TTS response shapes** on `/waves/v1/tts/live`, now documented on `stream-tts.mdx` with the exact wire fields (session/request IDs on WS, `status` + `done` on SSE) plus a porting callout so a WebSocket parser doesn't silently drop SSE frames.

* WebSocket chunks: `{"session_id","request_id","status":"chunk","data":{"audio":"..."}}`.
* WebSocket terminator: `{"session_id","request_id","status":"complete"}`. **No `message`, no `done`.** Detect completion with `status == "complete"`.
* SSE chunks: `{"audio":"...","done":false,"status":"206"}`.
* SSE terminator: `{"status":"200","done":true}`. **`done` is on every frame** (`false` on chunks, `true` on terminator). Check `done == true`, not `"done" in msg`.

The two shapes are not interchangeable. A parser written for the WebSocket envelope will silently drop every SSE frame because `msg["data"]` is undefined.