[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"article-doc:docs\u002Fapi-reference\u002Fclient-messages":3},"---\ntitle: Client Messages\ndescription: All client → Lanson messages sent over WebSocket.\n---\nMessages the client sends over the WebSocket connection.\n\n## Overview\n\n| type | Transport | Purpose |\n|---|---|---|\n| `input_audio_buffer.append` | Text frame (JSON) | Send base64-encoded PCM audio |\n| *(binary frame)* | Binary frame | Send raw PCM audio data |\n| `input_audio_buffer.flush` | Text frame (JSON) | Trigger manual flush |\n| `flush` | Text frame (JSON) | Alias for `input_audio_buffer.flush` |\n| `session.update` | Text frame (JSON) | Update session parameters |\n\n## input_audio_buffer.append\n\nSend base64-encoded PCM16LE audio data.\n\n```json\n{\n  \"type\": \"input_audio_buffer.append\",\n  \"audio\": \"\u003CPCM16LE base64>\"\n}\n```\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `type` | string | yes | Must be `\"input_audio_buffer.append\"` |\n| `audio` | string | yes | Base64-encoded PCM16LE audio data |\n\n**Errors**:\n- `invalid_audio`: `audio` is empty or not valid base64\n\n## Binary audio frames\n\nSend raw PCM binary data directly as an `ArrayBuffer`. Same effect as `input_audio_buffer.append` but without base64 encoding overhead.\n\n**Limits**:\n- Max frame size: 1 MiB (1,048,576 bytes). Exceeding this returns `audio_frame_too_large` and closes the connection (1009).\n- Frames are dropped when concurrent utterance limit is exceeded (`concurrent_utterance_limit`)\n- Frames are dropped or connection closed (1013) on upstream backpressure\n\n## input_audio_buffer.flush\n\nTrigger a manual flush of the upstream buffer, ending the current speech segment.\n\n```json\n{ \"type\": \"input_audio_buffer.flush\" }\n```\n\n`\"flush\"` is an alias with the same effect.\n\n## session.update\n\nUpdate session parameters. Can be sent at any time after connection.\n\n```json\n{\n  \"type\": \"session.update\",\n  \"language\": \"zh\",\n  \"prompt\": \"Optional context hint\"\n}\n```\n\n### Supported fields\n\n| Field | Snake-case alias | Type | Description |\n|---|---|---|---|\n| `language` | — | string | Audio language (e.g. `zh`, `en`, `auto`) |\n| `prompt` | — | string | Context hint, max 2000 characters |\n| `backend` | — | string | Upstream backend selection |\n| `sttModel` | `stt_model` | string | STT model |\n| `normalizerModel` | `normalizer_model` | string | Text normalizer model |\n| `vad` | — | boolean | Enable VAD |\n| `vadThreshold` | `vad_threshold` | number | VAD sensitivity threshold |\n| `vadSilenceMs` | `vad_silence_ms` | number | Silence duration to trigger end-of-speech |\n| `vadPrefixMs` | `vad_prefix_ms` | number | Prefix padding duration |\n| `vadMinSpeechMs` | `vad_min_speech_ms` | number | Minimum speech segment duration |\n| `vadTargetSpeechMs` | `vad_target_speech_ms` | number | Target speech segment duration |\n| `vadMaxSpeechMs` | `vad_max_speech_ms` | number | Maximum speech segment duration |\n| `vadSmartSplitWindowMs` | `vad_smart_split_window_ms` | number | Smart split window |\n\n::callout{icon=\"i-lucide-triangle-alert\" color=\"amber\"}\nTenant isolation\nAll fields not listed above are stripped before forwarding to the upstream. Identity and credential fields (`request_id`, `session_id`, `user_id`) are injected by the gateway and cannot be overridden by the client.\n::\n\n### Errors\n\n- `bad_json`: JSON parse failure\n- `bad_message`: Not a JSON object or unsupported `type`\n- `invalid_audio`: Invalid audio data\n\n## Related\n\n- [Server Events](\u002Fdocs\u002Fapi-reference\u002Fserver-events) — server-pushed events\n- [Session Configuration](\u002Fdocs\u002Frealtime\u002Fsession-configuration) — session config details\n- [Audio Input](\u002Fdocs\u002Frealtime\u002Faudio-input) — audio format reference\n",1790059118945]