Release migration#
DeviceIOHub rename#
Update services/xr-media-hub/ to services/device-io-hub/, the
xr-media-hub distribution to device-io-hub, and the xr_media_hub import
and command to device_io_hub. Rename xr_media_hub.yaml to
device_io_hub.yaml and XR_MEDIA_HUB_NO_WEB_CLIENT to
DEVICE_IO_HUB_NO_WEB_CLIENT. The rename has no compatibility aliases.
Consumer model readiness#
Workers can report ready without STT, TTS, LLM, or VLM availability. Consumer
workers no longer poll model health at startup. VoiceAgent waits only for
explicitly supplied probes; it no longer adds STT and TTS probes. Start the
shared model-server stack and wait for its launcher to return first. Server
wrappers retain model startup and reuse checks.
Simple VLM retains its streaming image warmup, and XR Render retains its LLM warmup, including for hosted LLMs. Tea making retains its RAG capability probe and embedding health checks.
Endpoint readiness and health_path settings still control explicit health()
calls, but do not enable automatic worker polling. Out-of-tree applications
that require the former behavior can explicitly pass
probes={"stt": stt.health, "tts": tts.health} to VoiceAgent.
Operator-visible runtime changes#
A
VoiceOutputsent with bothresponse_idandfinal=Truenow closes that response key even when the response contains only one message. Later output from the same participant and producer with thatresponse_idis dropped, and the voice runtime warns once while the key remains among its 1,024 most recent closures. Use a new identifier for each inbound query, such asctx.metadata.message_id, or omitresponse_idfor a finite one-message response.DeviceIOHub now waits for the hub to acknowledge shared-memory attachment before connecting the LiveKit room or creating its ready file. Missing segments trigger bounded recreation; incompatible layouts and acknowledgement timeouts fail startup. Check the registration error in the hub logs rather than treating a running process as ready.
DeviceIOHub no longer falls back to embedded LiveKit development credentials. Set
api_keyandapi_secretindevice_io_hub.yaml, or injectLIVEKIT_API_KEYandLIVEKIT_API_SECRETthrough the environment.Boolean service settings now require YAML booleans or the strings
true,false,yes,no,on,off,1, or0(case-insensitive). Numeric1/0, null values, and arbitrary strings now fail at startup instead of being interpreted by Python truthiness. This applies to vLLM eager, tool, and scheduling flags, Nemotron-Omni BF16 selection, voice-gatelistening_chime, lab-monitoringcapture_marker_scans, and tea-workflowcomplete_on_skip.Return audio is paced before IPC by the built-in voice transport and bounded independently for each participant in DeviceIOHub.
return_audio_max_buffer_sdefaults to 3 seconds; a custom or faulty producer that exceeds the queued-audio duration limit loses its oldest queued frames. The built-in voice transport requires at least0.12to maintain its 120 ms reserve. Increase the value for intentionally bursty custom producers, or decrease it for a tighter memory and latency bound when using a compatible custom producer.
Local speech service#
The local speech service changed from Piper to Pocket TTS with no compatibility
alias. Replace the piper_tts model preset, piper_tts_server command, and
services/piper-tts/ path with pocket_tts, pocket_tts_server, and
services/pocket-tts/. Pocket TTS voice names differ from Piper voice names;
the checked-in profiles use the CC0 bill_boerst voice.
Pocket TTS now selects a GPU automatically by default, and the checked-in
model-server profiles require CUDA on GPU 0. Set device: cpu for CPU-only
execution or cuda_visible_devices to change GPU placement. CUDA warmup runs
within startup_timeout_s, so increase that timeout when cold initialization
exceeds 600 seconds. The service now resolves the PyPI Torch build instead of
the CPU-only index; Linux environments therefore include the CUDA library
footprint even when execution falls back to CPU.
Removed SDK compatibility surfaces#
This release removes deprecated SDK aliases and the standalone Pipecat compatibility package. Update out-of-tree code as follows:
Removed surface |
Replacement |
|---|---|
|
Import |
|
Put application behavior in an |
|
Configure |
|
Construct |
|
Configure |
|
Import the unchanged tuning model from |
|
Subscribe to the application query topic carrying |
|
Subscribe to application topics carrying |
|
Publish a finite |
|
Configure |
|
Construct services through |
|
Pass additional readiness callables through |
|
Let |
|
|
|
Import public names directly from |
|
Select with |
|
Select with |
Recorded |
Use |
|
Subtract the offset in the caller and use |
|
Read the canonical exported-frame location from |
|
Initialize |
Implicit development credentials from |
Pass a |
Pipecat remains an internal implementation detail of xr-ai-voice; applications
no longer assemble or subclass its frame processors.
The source directories now match their Python imports:
agent-sdk/xr-ai-hub-client/ became agent-sdk/xr-ai-hub/ and
agent-sdk/xr-ai-agent-runtime/ became agent-sdk/xr-ai-runtime/. Distribution
names remain xr-ai-hub-client and xr-ai-agent-runtime, so package dependency
names do not change.
If upgrading a checkout that already downloaded model weights, follow the model-cache migration to reuse the ignored caches rather than downloading them again.