Sample configuration reference#
This reference is generated directly from configuration files under each
installed top-level sample’s yaml/ directory in agent-samples/ or
model-server-samples/, and from configuration files
beside a direct capability subproject. Adding a file in either location enrolls
it automatically. Values are sample- and hardware-specific examples, not
universal defaults. Keep field guidance beside the value as a source comment;
the generated page preserves those comments verbatim.
Refer to the generated Python API reference for public typed model configuration fields. Operational choices, credentials, and deployment workflows remain in the handwritten guides.
To change a sample parameter:
Start in
agent-samples/<sample>/ormodel-server-samples/<sample>/and find the owning file in that sample’s README or published guide.Edit the checked-in YAML or JSON value, preserving its documented type. Resolve relative paths from the file that declares them unless the sample guide documents different precedence.
Restart the sample process that owns the file. Sample configuration is not hot-reloaded.
If the edit changes a persistent model server, stop and restart the shared model stack. Refer to Customizing model servers for that workflow.
lab-instrument-monitoring#
yaml/device_io_hub.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Development-only placeholders. For deployed setups, replace both values or
# remove them and set LIVEKIT_API_KEY and LIVEKIT_API_SECRET in the environment.
api_key: devkey
api_secret: devsecret-xr-livekit-prototype-2026
room_name: xr-room
lk_port_ws: 7880
lk_port_tcp: 7881
lk_port_udp: 7882
enable_web_server: true
web_server_port: 8080
web_client_dir: ../../../client-samples/web
enable_token_server: true
yaml/device_map.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
devices:
qr_code:
device-1: Device1
device-2: Device2
device-3: Device3
device-4: Device4
device-5: Device5
aruco:
"0": Device1
"1": Device2
"2": Device3
"3": Device4
"4": Device5
yaml/lab_instrument_monitoring_worker.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
voice_gate_yaml: voice_gate.yaml
device_map_yaml: device_map.yaml
artifacts_dir: ../artifacts
capture_marker_scans: false
web_events_host: 127.0.0.1
web_events_port: 8092
web_events_max_events: 5000
monitor_interval_s: 5.0
instrument_monitor_interval_s: 5.0
instrument_state_interval_s: 10.0
instrument_lost_after_s: 30.0
monitor_history_size: 20
frame_max_age_s: 5.0
frame_timeout_s: 5.0
silero_threshold: 0.5
silence_duration: 0.4
min_speech: 0.1
idle_timeout_secs: 0
yaml/models.json#
{
"models": {
"llm": {
"adapter": {"preset": "nemotron_omni"},
"endpoint": {"base_url": "http://localhost:8108"}
},
"vlm": {
"adapter": {"preset": "cosmos3_nano_reasoner"},
"endpoint": {"base_url": "http://localhost:8100"}
},
"stt": {
"adapter": {"preset": "parakeet_stt"},
"endpoint": {"base_url": "http://localhost:8103"}
},
"tts": {
"adapter": {"preset": "pocket_tts"},
"endpoint": {"base_url": "http://localhost:8105"}
}
}
}
yaml/voice_gate.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Every final microphone transcript is recorded before this gate. Only accepted
# turns are sent to the foreground agent.
magic_phrases:
- agent
- hey agent
listening_chime: true
followup_grace_s: 5.0
simple-vlm-example#
yaml/device_io_hub.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# DeviceIOHub configuration for the simple-vlm-example sample.
# Paths are relative to this file's directory.
# See services/device-io-hub/device_io_hub.yaml for all available options.
# ── LiveKit server ────────────────────────────────────────────────────────────
# Development-only placeholders. For deployed setups, replace both values or
# remove them and set LIVEKIT_API_KEY and LIVEKIT_API_SECRET in the environment.
api_key: devkey
api_secret: devsecret-xr-livekit-prototype-2026
room_name: xr-room
lk_port_ws: 7880
lk_port_tcp: 7881
lk_port_udp: 7882
# Cloud VMs behind NAT may need STUN-based public-IP discovery. Also skip
# validation when the NAT does not support LiveKit's public-IP self-ping.
# lk_use_external_ip: true
# lk_skip_external_ip_validation: true
# ── Web client server ─────────────────────────────────────────────────────────
enable_web_server: true
web_server_port: 8080
web_client_dir: ../../../client-samples/web
# ── Optional: token server ────────────────────────────────────────────────────
enable_token_server: true
# Change if another service holds port 8000 (e.g. iphlpsvc under WSL2 mirrored
# networking; see the note in services/device-io-hub/device_io_hub.yaml).
# token_server_port: 8000
yaml/media_capture.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Opt-in server-side capture for Simple VLM. Each participant gets a
# timestamped bundle with fast-start H.264/AAC-LC .mp4 video, retained raw media,
# and the exact inbound/outbound data timeline.
hub_sub_addr: ipc:///tmp/xr_hub_pub
hub_push_addr: ipc:///tmp/xr_hub_in
out_dir: ~/.local/share/xr-ai/captures/simple-vlm-example
profile: demo
session_mode: participant
sample_fps: 30.0
bitrate: 6000000
gpu_id: 0
frame_queue_size: 2
encoder_workers: 2
audio_sample_rate: 48000
overlay_seconds: 12.0
overlay_lines: 4
max_total_bytes: 10737418240
yaml/models.json#
{
"models": {
"stt": {
"adapter": {"preset": "parakeet_stt"},
"endpoint": {"base_url": "http://localhost:8103"}
},
"vlm": {
"adapter": {"preset": "cosmos3_nano_reasoner"},
"endpoint": {"base_url": "http://localhost:8100"}
},
"tts": {
"adapter": {"preset": "pocket_tts"},
"endpoint": {"base_url": "http://localhost:8105"}
}
}
}
yaml/simple_vlm_example_worker.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Simple VLM example worker configuration.
# Auto-discovered by the launcher and passed as --config to the worker process.
# Path to the voice-gate config (resolved relative to this file's
# directory). Owns the magic-phrase / follow-up / listening-chime knobs.
voice_gate_yaml: voice_gate.yaml
# The worker uses its packaged prompts/system.txt by default. Set
# system_prompt or system_prompt_file here only to override it.
# Frame freshness — tune if the agent sees stale frames.
frame_max_age_s: 5.0 # frame older than this is considered stale
frame_timeout_s: 5.0 # give up waiting for a fresh frame after this many seconds
# Voice Activity Detection — Silero VAD (ONNX backend).
# Tune if STT triggers too early or misses speech.
silero_threshold: 0.5 # Silero speech-probability gate (0..1); lower = more sensitive
silence_duration: 0.4 # seconds of silence that ends an utterance
min_speech: 0.1 # minimum seconds of speech before STT is called
# ── Idle timeout ──────────────────────────────────────────────────────────
# Auto-cancel the voice pipeline after this many seconds with no user/bot
# speech. DISABLED by default (0 = off) — a quiet session stays connected
# indefinitely, which is what XR sessions usually want. Set a positive value
# (e.g. 300 for 5 min) to opt in; the worker then tears the pipeline down
# after that long idle. Applied by VoiceAgent.
idle_timeout_secs: 0
yaml/voice_gate.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Voice-gate (speech-input opt-in) configuration for simple-vlm-example.
# Consumed by xr_ai_voicegate.VoiceGate inside the unified pipecat pipeline.
#
# Magic phrases are sentence-boundary opt-ins: an STT transcript must begin
# with one of these or contain one after '.', '?', or '!' followed by
# whitespace or a closing quote. Matching is case-insensitive. Text through
# the matched phrase is stripped before the agent sees the query; commas and
# other mid-sentence mentions do not match. The same stripped tail is used for
# early global-STOP detection; the complete final transcript still determines
# whether a stop-like opening is a global stop or a scoped agent command.
magic_phrases:
- "agent"
- "hey agent"
# Audible "I heard you" feedback. When true (and magic_phrases is
# non-empty), a short two-tone chime plays the moment a phrase matches —
# before STT+VLM finish — so the user knows the agent is processing.
listening_chime: false
# Follow-up grace window. After a successful magic-phrase match, the
# next utterance from the same participant within this many seconds
# bypasses the gate so "hey agent" → pause → "what am I looking at?"
# works as one natural interaction. Set to 0 to disable.
followup_grace_s: 5.0
tea-making-sample#
yaml/device_io_hub.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Development-only placeholders. For deployed setups, replace both values or
# remove them and set LIVEKIT_API_KEY and LIVEKIT_API_SECRET in the environment.
api_key: devkey
api_secret: devsecret-xr-livekit-prototype-2026
room_name: xr-room
lk_port_ws: 7880
lk_port_tcp: 7881
lk_port_udp: 7882
enable_web_server: true
web_server_port: 8080
web_client_dir: ../../../client-samples/web
enable_token_server: true
yaml/models.local.json#
{
"models": {
"llm": {
"adapter": {"preset": "nemotron_omni"},
"endpoint": {"base_url": "http://localhost:8108"}
},
"vlm": {
"category": "vlm",
"adapter": {
"kind": "openai_compat",
"model_name": "llm",
"reasoning_field": "reasoning_content",
"capabilities": {"streaming": true, "vision": true},
"default_extras": {
"max_tokens": 128,
"temperature": 0.0,
"chat_template_kwargs": {"enable_thinking": false}
}
},
"endpoint": {"base_url": "http://localhost:8108"}
},
"stt": {
"adapter": {"preset": "parakeet_stt"},
"endpoint": {"base_url": "http://localhost:8103"}
},
"embedding": {
"adapter": {"preset": "nemotron_embedding"},
"endpoint": {"base_url": "http://localhost:8109"}
},
"tts": {
"adapter": {"preset": "pocket_tts"},
"endpoint": {"base_url": "http://localhost:8105"}
}
}
}
yaml/rag_service.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
endpoint: tcp://0.0.0.0:8340
documents_dir: ../rag-documents
models_config: models.local.json
embedding_role: embedding
cache_dir: ../../../models/tea-making-rag-cache
chunk_size: 700
overlap: 100
embedding_dim: 768
batch_size: 16
min_score: 0.3
yaml/tea_making_worker.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# The launcher materializes these paths for runtime path resolution.
models_config: models.local.json
workflow_config: workflow.yaml
voice_gate_yaml: voice_gate.yaml
# Choose one to replace the idle and explicit background-action instructions.
# Active tea guidance comes from the focused step policies in workflow.yaml.
# foreground_prompt: <inline shared foreground instructions>
# foreground_prompt_file: ../worker/tea_making_worker/prompts/foreground_prompt.txt
rag_endpoint: tcp://127.0.0.1:8340
artifacts_dir: ../artifacts
web_events_host: 127.0.0.1
web_events_port: 8092
web_events_max_events: 5000
frame_max_age_s: 3.0
frame_timeout_s: 5.0
vlm_timeout_s: 15.0
change_watch_interval_s: 2.0
transcript_summary_interval_s: 120.0
video_log_interval_s: 2.0
background_history_size: 50
change_watch_default_instruction: >-
important changes involving people, objects, actions, or possible hazards
silero_threshold: 0.3
silence_duration: 1.2
min_speech: 0.15
idle_timeout_secs: 0
yaml/voice_gate.always-on.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
magic_phrases: []
listening_chime: false
followup_grace_s: 0.0
yaml/voice_gate.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
magic_phrases:
- agent
- hey agent
listening_chime: true
followup_grace_s: 5.0
yaml/workflow.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
task:
name: tea making
start_step: identify
foreground_prompt: This workflow guides tea making.
complete_message: Tea guidance complete. Enjoy your tea.
state:
tea_name:
type: string
description: Tea name from the current caption.
target_temperature_c:
type: number
description: Brewing temperature in Celsius.
steep_duration_s:
type: integer
description: Steep duration in seconds.
guidance_source:
type: string
description: Package or retrieved source.
tea_ready:
type: boolean
description: True only when all preceding fields are supported.
water_filled:
type: boolean
description: Whether water is visibly in the heating vessel.
initial: false
heating_started:
type: boolean
description: Whether a heater-on indicator or unit-bearing temperature was seen.
initial: false
steeping_started_at_us:
type: integer
description: Start time returned by clock__now.
steeping_started:
type: boolean
description: Whether tea is immersed and its start time is recorded.
initial: false
steeping_complete:
type: boolean
description: Whether the fresh timer result is expired.
initial: false
steps:
- id: identify
title: Identify the tea
reads: []
writes: [tea_name, target_temperature_c, steep_duration_s, guidance_source, tea_ready]
trigger:
function: current_view
interval_s: 1.5
arguments:
question: >-
Read the front label brand and tea/blend name, plus visible brewing
temperature/time. Ignore slogans, claims, bag count, weight, and
badges. Transcribe exactly; never infer. If no brand or tea/blend is
legible, say label unreadable.
result_field: answer
evidence:
pattern: "^accepted$"
consecutive: 1
agent:
prompt: >-
Identify tea only from the current caption, never state or RAG.
If the tea name is unreadable, commit empty updates; do not retrieve or
write placeholder values. Prefer
visible values. If temperature/time is missing,
call rag_lookup once with "<exact name> water temperature steep time",
top_k 2; accept only a section naming it. If every writable field is
supported, commit all with tea_ready true. Otherwise commit nothing;
never write tea_ready false.
tools: [rag_lookup]
voice:
prompt: >-
Tea identity comes only from state tea_name or current_view, never RAG.
tea_ready means the tea instructions were identified, not that the
drink has been prepared.
If the exact name is unknown, inspect the current frame. Retrieve only
missing temperature or duration after the exact name is known. Never
replace package values. Answer only what was asked.
tools: [current_view, rag_lookup]
complete_when: {tea_ready: true}
next: fill_water
state_on_skip:
tea_name: generic tea
target_temperature_c: 93
steep_duration_s: 180
guidance_source: generic fallback
tea_ready: true
messages:
enter: Hold the tea package or tag in view so I can read it.
complete: I found the tea instructions. Say next when ready.
skip: I will use generic tea defaults.
- id: fill_water
title: Fill the heating vessel
reads: [tea_name, target_temperature_c, steep_duration_s]
writes: [water_filled]
trigger:
function: current_view
interval_s: 2
arguments:
question: >-
Describe the visible interior and contents of the kettle or pot.
State whether water is visible inside and what supports that reading.
If the contents are unclear, say so. Never infer.
result_field: answer
evidence:
pattern: "^accepted$"
consecutive: 2
agent:
prompt: >-
Judge the fresh caption semantically without requiring particular
words. Set water_filled true when it reasonably shows water inside the
vessel. Otherwise commit empty updates and message.
tools: []
voice:
prompt: >-
Give instructions or verify with current_view. A user report is not
visual confirmation. Confirm filled only from state water_filled or a
current view showing the vessel interior and concrete water cues;
otherwise say it is not yet visually confirmed.
tools: [current_view]
complete_when: {water_filled: true}
next: heat_water
state_on_skip: {water_filled: true}
messages:
enter: Fill a kettle or pot with fresh water and keep it in view.
complete: The vessel has water. Say next when ready.
skip: I will assume the vessel is filled.
- id: heat_water
title: Heat the water
reads: [tea_name, target_temperature_c, steep_duration_s]
writes: [heating_started]
trigger:
function: current_view
interval_s: 2
arguments:
question: >-
Describe the visible kettle or thermometer display and transcribe its
current numeric reading and unit. If either is unclear, say so. Do not
confuse a printed target temperature with the current reading.
result_field: answer
evidence:
pattern: "^accepted$"
consecutive: 2
agent:
prompt: >-
This step detects that heating is underway; it does not wait for the tea
target temperature. Ignore target_temperature_c when deciding this
step. For every fresh current reading with an explicit Celsius or
Fahrenheit unit, first call temperature__threshold with that exact
reading and a threshold_c of 50. If its above result is true, commit
heating_started true. If above is false, commit empty updates and
message with rejected evidence. For a target value, ambiguous unit,
missing reading, or unclear current-versus-target value, do not call the
tool; commit empty updates and message with unknown evidence so it does
not erase a prior confirmed reading.
tools: [temperature__threshold]
voice:
prompt: >-
Explain target from state. For a reading, call current_view and
repeat the visible number and unit; do not verify. For hot-enough
checks, call current_view, then temperature__verify only with an exact
number and Celsius or Fahrenheit unit. Report result. If missing,
say the reading is unavailable.
tools: [current_view, temperature__verify]
complete_when: {heating_started: true}
next: start_steeping
state_on_skip: {heating_started: true}
messages:
enter: Heat the water to {{ target_temperature_c | temperature_c }}.
complete: Heating is underway. Wait for the water to reach the target temperature.
skip: I will assume heating has started.
- id: start_steeping
title: Start steeping
reads: [tea_name, target_temperature_c, steep_duration_s]
writes: [steeping_started_at_us, steeping_started]
trigger:
function: current_view
interval_s: 2
arguments:
question: >-
Look for two separately visible facts in one vessel: a water surface
or level; and a tea bag, infuser, or leaves entering or immersed in
that water. If either water or tea-water contact is not visible, say
it is unconfirmed. Note hazards.
result_field: answer
evidence:
pattern: "^accepted$"
consecutive: 2
agent:
prompt: >-
Judge when steeping starts, not when it finishes. Treat unconfirmed,
unknown, unclear, or missing visual evidence as a hard stop: do not call
clock__now, and commit empty updates and message with unknown evidence.
Only when the fresh caption explicitly confirms both visible liquid and
tea visibly contacting that liquid inside the same vessel, first call
clock__now. Nearby, above, or outside the liquid does not count. Then
commit exactly its epoch_us as steeping_started_at_us with
steeping_started true. For any other caption, do not infer contact from
context or prior state; commit empty updates and message. Never invent or
replace a start time.
tools: [clock__now]
voice:
prompt: >-
Give instructions or verify with current_view. A report or tea item in
a vessel is not confirmation. Require both visible water and visible
tea-water contact. The observation loop, not this answer, starts the
timer.
tools: [current_view]
complete_when: {steeping_started: true}
next: steep_timer
complete_on_skip: true
state_on_skip: {steeping_started: true}
messages:
enter: Put the tea in the water; I will start the timer when I see it immersed.
complete: Steeping timer started. Say next to monitor it.
skip: Steeping detection and the timer were skipped.
- id: steep_timer
title: Wait for steeping
reads:
[tea_name, target_temperature_c, steeping_started_at_us, steep_duration_s]
writes: [steeping_complete]
trigger:
function: clock__timer
interval_s: 1
arguments:
started_at_us: $state.steeping_started_at_us
duration_s: $state.steep_duration_s
agent:
prompt: >-
Copy the fresh clock__timer expired boolean: set steeping_complete true
only when expired is true. While false, commit empty updates/message.
Never infer from elapsed text, wall time, or prior state.
tools: []
voice:
prompt: >-
Call clock__timer for every timer or completion question. Report only
its fresh remaining time or completion; never calculate from state,
prior answers, or wall-clock time.
tools: [clock__timer]
complete_when: {steeping_complete: true}
next: null
state_on_skip: {steeping_complete: true}
messages:
enter: Steep for {{ steep_duration_s | duration }}.
complete: Steeping is complete. Remove the tea, then say next to finish.
skip: Timer skipped; remove the tea when it tastes right.
xr-render-demo#
scene/scene_service.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Sample-local scene process reference configuration.
# LOVR_BIN in the environment takes priority over lovr_bin.
# lovr_bin: /home/you/hub/lovr/build/bin/lovr
xr_app_dir: ./lovr
endpoint: tcp://0.0.0.0:8320
scene_socket: ipc:///tmp/xr_render_scene
cloudxr_env_file: ~/.cloudxr/run/cloudxr.env
yaml/cloudxr_runtime.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# CloudXR runtime configuration.
# Full docs: python -m isaacteleop.cloudxr --help
# Directory where CloudXR stores runtime state, certs, and logs (default: ~/.cloudxr).
cloudxr_install_dir: ~/.cloudxr
# Set to true to accept the NVIDIA CloudXR EULA non-interactively.
# EULA: https://github.com/NVIDIA/IsaacTeleop/blob/main/deps/cloudxr/CLOUDXR_LICENSE
# Once accepted the marker is written to <cloudxr_install_dir>/run/eula_accepted
# and this flag is no longer checked.
accept_eula: true
# CloudXR env overrides applied before the native service starts.
# NV_DEVICE_PROFILE selects the client type:
# auto-webrtc: WebRTC / web XR clients (default)
# auto-native: native iOS / visionOS clients (set this to use the native apps)
# Device-specific values also accepted: apple-vision-pro | ipad-pro | quest3
cloudxr_env:
NV_DEVICE_PROFILE: auto-webrtc
# Physical GPU (nvidia-smi index) the CloudXR compositor pins to. Translated
# to PCI bus selectors for Vulkan, CUDA, and Mesa, set on this process's
# environment, and appended to cloudxr.env so the scene process picks them up
# when it sources the file (and LOVR inherits from the scene spawn env).
gpu_index: 0
# ── Network ports (CloudXR owns these — do not conflict with LiveKit) ─────────
# CloudXR native service: localhost:49100 (internal, not exposed)
# WSS proxy (TLS): 0.0.0.0:48322 (XR clients connect here)
yaml/device_io_hub.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# DeviceIOHub configuration for the xr-render-demo sample.
# Paths are relative to this file's directory.
# See services/device-io-hub/device_io_hub.yaml for all available options.
# ── LiveKit server ────────────────────────────────────────────────────────────
# Development-only placeholders. For deployed setups, replace both values or
# remove them and set LIVEKIT_API_KEY and LIVEKIT_API_SECRET in the environment.
api_key: devkey
api_secret: devsecret-xr-livekit-prototype-2026
room_name: xr-room
lk_port_ws: 7880
lk_port_tcp: 7881
lk_port_udp: 7882
# Cloud VMs behind NAT may need STUN-based public-IP discovery. Also skip
# validation when the NAT does not support LiveKit's public-IP self-ping.
# lk_use_external_ip: true
# lk_skip_external_ip_validation: true
# ── Web client server ─────────────────────────────────────────────────────────
# The page serves both stacks: LiveKit (agent audio/data over the WSS proxy on
# this port) AND CloudXR (one-tap Launch XR → WebXR over wss://<host>:48322).
# Because both live in the same JS context, entering XR does not drop the
# agent connection.
enable_web_server: true
web_server_port: 8080
web_client_dir: ../../../client-samples/web-xr
# ── Optional: token server ────────────────────────────────────────────────────
enable_token_server: true
# Change if another service holds port 8000 (e.g. iphlpsvc under WSL2 mirrored
# networking; see the note in services/device-io-hub/device_io_hub.yaml).
# token_server_port: 8000
# ── Video recording ──────────────────────────────────────────────────────────
# Disabled: xr-render-demo obtains current frames through LiveFrameSource.
# Enable this and set recordings_dir in video_memory_service.yaml for history.
video_recording:
enabled: false
yaml/media_capture.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Opt-in server-side capture for the XR render demo. Each participant gets
# a timestamped bundle with composited H.264/AAC-LC .mp4 video, retained raw
# media, and the exact inbound/outbound data timeline.
hub_sub_addr: ipc:///tmp/xr_hub_pub
hub_push_addr: ipc:///tmp/xr_hub_in
out_dir: ~/.local/share/xr-ai/captures/xr-render-demo
profile: demo
session_mode: participant
sample_fps: 30.0
bitrate: 6000000
gpu_id: 0
frame_queue_size: 2
encoder_workers: 2
audio_sample_rate: 48000
overlay_seconds: 12.0
overlay_lines: 4
max_total_bytes: 10737418240
yaml/models.json#
{
"models": {
"llm": {
"adapter": {"preset": "nemotron_omni"},
"endpoint": {"base_url": "http://localhost:8108"}
},
"agent_llm": {
"adapter": {"preset": "nemotron_omni"},
"endpoint": {"base_url": "http://localhost:8108"}
},
"stt": {
"adapter": {"preset": "parakeet_stt"},
"endpoint": {"base_url": "http://localhost:8103"}
},
"tts": {
"adapter": {"preset": "pocket_tts"},
"endpoint": {"base_url": "http://localhost:8105"}
},
"vlm": {
"adapter": {"preset": "cosmos3_nano_reasoner"},
"endpoint": {"base_url": "http://localhost:8100"}
}
}
}
yaml/openxr_service.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
endpoint: tcp://0.0.0.0:8330
cloudxr_env_file: ~/.cloudxr/run/cloudxr.env
# Test hook: the eval live drivers need a simulated head pose; flip to true
# while running them. The injected pose overrides real tracking for every
# client until cleared, so it must never ship enabled.
allow_sim_pose: false
yaml/video_memory_service.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
endpoint: tcp://0.0.0.0:8310
out_dir: /tmp/xr_video_queries/xr-render-demo
gpu_id: 0
yaml/voice_gate.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# xr-render-demo voice gate configuration.
#
# magic_phrases — wake-word gate. Empty list (the current default) DISABLES
# the gate: every STT transcript is dispatched to the agent
# (always-on, no wake word). To require a "hey agent" / "agent"
# wake word instead, set:
# magic_phrases:
# - "agent"
# - "hey agent"
# (matches the simple-vlm-example default). Strict-prefix match.
# listening_chime — when true AND magic_phrases is non-empty, a short two-tone
# chime plays on fresh magic-phrase matches. Inert while
# magic_phrases is empty (no match can occur).
# followup_grace_s — seconds after a phrase match during which the next
# utterance from the same participant bypasses the gate.
magic_phrases: [] # always-on; see note above to enable a wake word
listening_chime: true
followup_grace_s: 5.0
yaml/xr_render_demo_worker.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# xr-render-demo worker configuration.
# Paths resolve relative to this file's directory.
# ── Voice gate ────────────────────────────────────────────────────────────────
# Magic-phrase opt-in gate; see voice_gate.yaml for the schema. Ships with
# `magic_phrases: []` (always-on) to preserve the pre-migration behavior;
# operators populate the list to enable wake-word gating.
voice_gate_yaml: voice_gate.yaml
# ── Native capability services ───────────────────────────────────────────────
scene_endpoint: tcp://127.0.0.1:8320
openxr_endpoint: tcp://127.0.0.1:8330
video_memory_endpoint: tcp://127.0.0.1:8310
# Past-moment questions ("what was I holding a moment ago?") need recorded
# video: enable video_recording in device_io_hub.yaml and set recordings_dir
# in video_memory_service.yaml, then turn this on. Off, vision_agent answers
# from the live camera only.
video_history_enabled: false
text_memory_dir: /dev/shm/xr-ai/text-memory
# ── Voice activity detection (Silero VAD, ONNX backend) ──────────────────────
# silence_duration: seconds of trailing silence that ends an utterance.
# min_speech: minimum cumulative speech before STT fires (filters short blips).
# silero_threshold: speech-probability gate (0..1). Lower = more sensitive
# (catches quieter/faster speech). Default 0.5 often misses the onset of a
# word; 0.3 captures it earlier.
silence_duration: 0.8
min_speech: 0.15
silero_threshold: 0.3
# ── Idle timeout ──────────────────────────────────────────────────────────
# Auto-cancel the voice pipeline after this many seconds with no user/bot
# speech. DISABLED by default (0 = off) — a quiet session stays connected
# indefinitely, which is what XR sessions usually want. Set a positive value
# (e.g. 300 for 5 min) to opt in; the worker then tears the pipeline down
# after that long idle. VoiceAgent owns the timeout.
idle_timeout_secs: 0
model-servers#
yaml/96G_blackwell/embedding_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
model: nvidia/llama-nemotron-embed-1b-v2
host: "0.0.0.0"
port: 8109
served_model_name: embed
model_cache: ../../../../models
max_num_seqs: 32
max_model_len: 8192
# Pooling models have no generation KV cache; retain a total-memory fraction.
gpu_memory_utilization: 0.08
enforce_eager: true
vllm_backend: docker
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
yaml/96G_blackwell/nemotron_omni_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Nemotron-3-Nano-Omni — single Blackwell 96 GB.
# NVFP4 is selected automatically. Leave moe_backend unset so vLLM can select
# a compatible kernel for the checkpoint and hardware. This standalone Omni
# stack leaves the remainder of the GPU for STT, rendering, and runtime overhead.
host: "0.0.0.0"
port: 8108
hf_token: ""
model_cache: ../../../../models
max_num_seqs: 8
tensor_parallel_size: 1
max_model_len: 32768
# The fraction is the startup admission threshold. The explicit bytes
# independently bound the resident cache; vLLM reports its token capacity and
# maximum concurrency at startup.
gpu_memory_utilization: 0.35
kv_cache_memory_bytes: 2147483648
enforce_eager: false
video_pruning_rate: 0.5
video_fps: 2
video_num_frames: 64
vllm_backend: docker
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
yaml/96G_blackwell/nim_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted Nemotron-3-Nano-Omni NIM (serves both the `llm` and
# `agent_llm` roles). This matches the model family used by the default local
# deployment. Swap in any compatible NIM from https://catalog.ngc.nvidia.com.
# For sample configuration, refer to
# https://nvidia.github.io/xr-ai/latest/guides/customizing-model-servers.html
# Verify startup and memory use on the target 96 GB Blackwell GPU before
# deployment.
image: nvcr.io/nim/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:2.0.4-variant
http_port: 8110
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_MAX_MODEL_LEN: "32768"
# Match the local Omni deployment's reasoning and tool-call parsers.
NIM_PASSTHROUGH_ARGS: "--gpu-memory-utilization 0.4 --enable-auto-tool-choice --tool-call-parser qwen3_coder --reasoning-parser nemotron_v3"
yaml/96G_blackwell/nim_stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted NIM: Riva ASR (parakeet). Workers reach the gRPC port via the
# riva_grpc model kind; http_port serves /v1/health/ready only.
# UNTESTED ESTIMATE for this GPU profile; validated values are dual_48G_ada's.
image: nvcr.io/nim/nvidia/parakeet-tdt-0.6b-v2:1.2.0
http_port: 9010
grpc_port: 50051
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
# Single-process inference: the default multiprocessing mode runs two
# CUDA processes; one is plenty for demo traffic. ~14 GB VRAM either way.
NIM_USE_MULTIPROCESSING_FOR_INFERENCE: "false"
yaml/96G_blackwell/nim_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted NIM: Riva TTS (magpie). Workers reach the gRPC port via the
# riva_grpc model kind; http_port serves /v1/health/ready only.
# UNTESTED ESTIMATE for this GPU profile; validated values are dual_48G_ada's.
image: nvcr.io/nim/nvidia/magpie-tts-multilingual:1.9.0
http_port: 9011
grpc_port: 50052
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
yaml/96G_blackwell/nim_vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted NIM: Cosmos3-Nano Reasoner VLM.
# Swap in any vision NIM from https://catalog.ngc.nvidia.com, but check its
# engine accepts a full image prompt: the nemotron-nano-vl NIM builds a
# 3200-token input cap on this class of GPU, below its own ~3330-token
# per-image cost, so every image request 500s.
# For sample configuration, refer to
# https://nvidia.github.io/xr-ai/latest/guides/customizing-model-servers.html
# UNTESTED ESTIMATE for this GPU profile; validated values are dual_48G_ada's.
image: nvcr.io/nim/nvidia/cosmos3-reasoner:1.7.0
http_port: 8100
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
# Nano is the smaller model served as nvidia/cosmos3-nano-reasoner.
NIM_MODEL_SIZE: "nano"
NIM_MAX_MODEL_LEN: "16384"
# Fraction of total GPU memory despite the PERCENT name (0..1]; leaves
# headroom for whatever shares the GPU.
NIM_KVCACHE_PERCENT: "0.2"
yaml/96G_blackwell/pocket_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Shared GPU Pocket TTS service. bill_boerst is a CC0 Voice-Zero recording.
voice: bill_boerst
language: english
device: cuda
cuda_visible_devices: "0"
port: 8105
startup_timeout_s: 600
model_cache: ../../../../models
yaml/96G_blackwell/stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# STT server — single Blackwell 96 GB.
model: nvidia/parakeet-tdt-0.6b-v3
device: auto
port: 8103
host: "0.0.0.0"
startup_timeout_s: 600
model_cache: ../../../../models
yaml/96G_blackwell/vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# VLM server — single Blackwell 96 GB.
#
# vlm is THIRD in load order: STT → Omni → vlm. The Reasoner weights were
# measured at 16.8 GiB. The 0.23 fraction is the startup admission threshold;
# the explicit 1.5 GiB allocation bounds the KV cache independently.
# hf_overrides selects the Reasoner runtime; details are documented in
# docs/source/components/ai-services.md#per-server-notes.
model: nvidia/Cosmos3-Nano
hf_overrides:
architectures:
- Cosmos3ForConditionalGeneration
hf_token: ""
port: 8100
host: "0.0.0.0"
model_cache: ../../../../models
gpu_memory_utilization: 0.23
kv_cache_memory_bytes: 1610612736
max_model_len: 8192
max_num_seqs: 4
enforce_eager: true
async_scheduling: true
mm_encoder_tp_mode: data
max_videos_per_prompt: 0
# Increasing max_model_len also requires recalculating the fixed KV cache and
# cold-start validation on the target profile.
max_images_per_prompt: 4
# vLLM runtime: pip (this wrapper's venv) or docker (NGC nvcr.io/nvidia/vllm).
# See services/vlm-server/vlm_server.yaml for the full toggle docs.
vllm_backend: docker
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
yaml/dual_48G_ada/embedding_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
model: nvidia/llama-nemotron-embed-1b-v2
host: "0.0.0.0"
port: 8109
served_model_name: embed
model_cache: ../../../../models
cuda_visible_devices: "0"
max_num_seqs: 32
max_model_len: 8192
# Pooling models have no generation KV cache; retain a total-memory fraction.
gpu_memory_utilization: 0.08
enforce_eager: true
vllm_backend: docker
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
yaml/dual_48G_ada/nemotron_omni_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Nemotron-3-Nano-Omni — dual 48 GB Ada configuration.
# Cosmos remains on GPU 0; FP8 Omni replaces Nano on GPU 1 beside STT.
host: "0.0.0.0"
port: 8108
hf_token: ""
model_cache: ../../../../models
cuda_visible_devices: "1"
max_num_seqs: 8
tensor_parallel_size: 1
max_model_len: 32768
# The fraction is the startup admission threshold. The explicit bytes
# independently bound the resident cache; vLLM reports its token capacity and
# maximum concurrency at startup.
gpu_memory_utilization: 0.78
kv_cache_memory_bytes: 2147483648
enforce_eager: false
video_pruning_rate: 0.5
video_fps: 2
video_num_frames: 64
vllm_backend: docker
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
yaml/dual_48G_ada/nim_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted Nemotron-3-Nano-Omni NIM (serves both the `llm` and
# `agent_llm` roles). This matches the model family used by the default local
# deployment. Swap in any compatible NIM from https://catalog.ngc.nvidia.com.
# For sample configuration, refer to
# https://nvidia.github.io/xr-ai/latest/guides/customizing-model-servers.html
# RTX Ada is not listed for this Omni NIM; verify startup and memory use on
# target hardware before deployment.
image: nvcr.io/nim/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:2.0.4-variant
http_port: 8110
nim_cache: ../../../../models/nim
cuda_visible_devices: "1"
env:
NIM_MAX_MODEL_LEN: "32768"
# Match the local Omni deployment's reasoning and tool-call parsers.
NIM_PASSTHROUGH_ARGS: "--gpu-memory-utilization 0.8 --enable-auto-tool-choice --tool-call-parser qwen3_coder --reasoning-parser nemotron_v3"
yaml/dual_48G_ada/nim_stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted NIM: Riva ASR (parakeet). Workers reach the gRPC port via the
# riva_grpc model kind; http_port serves /v1/health/ready only.
image: nvcr.io/nim/nvidia/parakeet-tdt-0.6b-v2:1.2.0
http_port: 9010
grpc_port: 50051
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
# Single-process inference: the default multiprocessing mode runs two
# CUDA processes; one is plenty for demo traffic. ~14 GB VRAM either way.
NIM_USE_MULTIPROCESSING_FOR_INFERENCE: "false"
yaml/dual_48G_ada/nim_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted NIM: Riva TTS (magpie). Workers reach the gRPC port via the
# riva_grpc model kind; http_port serves /v1/health/ready only.
image: nvcr.io/nim/nvidia/magpie-tts-multilingual:1.9.0
http_port: 9011
grpc_port: 50052
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
yaml/dual_48G_ada/nim_vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted NIM: Cosmos3-Nano Reasoner VLM.
# Swap in any vision NIM from https://catalog.ngc.nvidia.com, but check its
# engine accepts a full image prompt: the nemotron-nano-vl NIM builds a
# 3200-token input cap on this class of GPU, below its own ~3330-token
# per-image cost, so every image request 500s.
# For sample configuration, refer to
# https://nvidia.github.io/xr-ai/latest/guides/customizing-model-servers.html
# GPU 0 with the embedding server and a demo's CloudXR + LOVR; the
# Nemotron NIM and local STT share GPU 1.
image: nvcr.io/nim/nvidia/cosmos3-reasoner:1.7.0
http_port: 8100
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
# Nano is the smaller model served as nvidia/cosmos3-nano-reasoner.
NIM_MODEL_SIZE: "nano"
NIM_MAX_MODEL_LEN: "16384"
# Fraction of total GPU memory despite the PERCENT name (0..1]; leaves
# headroom for whatever shares the GPU.
NIM_KVCACHE_PERCENT: "0.7"
yaml/dual_48G_ada/pocket_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Shared GPU Pocket TTS service. bill_boerst is a CC0 Voice-Zero recording.
voice: bill_boerst
language: english
device: cuda
cuda_visible_devices: "0"
port: 8105
startup_timeout_s: 600
model_cache: ../../../../models
yaml/dual_48G_ada/stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# STT server configuration — nvidia/parakeet-tdt-0.6b-v3.
# Auto-discovered by xr-ai-launcher and passed as --config to stt_server.
# OpenAI-compatible API at http://localhost:8103/v1
# NeMo model name.
# nvidia/parakeet-tdt-0.6b-v3 — 0.6B TDT model; CC-BY-4.0; ~1.5 GB VRAM; English only
# nvidia/parakeet-rnnt-1.1b — stronger, larger; same CC-BY-4.0 license
model: nvidia/parakeet-tdt-0.6b-v3
# Inference device: "cuda", "cpu", or "auto" (CUDA if available, else CPU).
device: auto
# GPU 1 only — VLM, embedding, and Pocket TTS share GPU 0.
cuda_visible_devices: "1"
port: 8103
host: "0.0.0.0"
startup_timeout_s: 600
# NeMo + HuggingFace weight cache — resolved relative to this YAML file.
model_cache: ../../../../models
yaml/dual_48G_ada/vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# VLM server configuration — Cosmos3 Nano Reasoner.
# Auto-discovered by xr-ai-launcher and passed as --config to vlm_server.
# OpenAI-compatible API at http://localhost:8100/v1 (accepts image_url in messages)
# hf_overrides selects the Reasoner runtime; details are documented in
# docs/source/components/ai-services.md#per-server-notes.
# Cosmos-Reason1 compatibility uses nvidia/Cosmos-Reason1-7B with the
# cosmos_vlm client preset.
model: nvidia/Cosmos3-Nano
hf_overrides:
architectures:
- Cosmos3ForConditionalGeneration
# HuggingFace token — optional for this public model and required for gated
# alternatives.
# !! Do not commit this file with a real token !!
hf_token: ""
port: 8100
host: "0.0.0.0"
cuda_visible_devices: "0" # share GPU 0 with embeddings; Nemotron/STT use GPU 1
model_cache: ../../../../models
# The Reasoner weights were measured at 16.8 GiB. The 0.47 fraction is the
# startup admission threshold; the explicit 1.5 GiB allocation bounds the KV
# cache independently.
gpu_memory_utilization: 0.47
kv_cache_memory_bytes: 1610612736
max_model_len: 8192
enforce_eager: true
async_scheduling: true
mm_encoder_tp_mode: data
max_videos_per_prompt: 0
# Increasing max_model_len also requires recalculating the fixed KV cache and
# cold-start validation on the target profile.
max_images_per_prompt: 4
# vLLM runtime: pip (this wrapper's venv) or docker (NGC nvcr.io/nvidia/vllm).
# See services/vlm-server/vlm_server.yaml for the full toggle docs.
vllm_backend: docker
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
yaml/models.default.json#
{
"models": {
"stt": {
"adapter": {
"preset": "parakeet_stt"
},
"endpoint": {
"base_url": "http://localhost:8103",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "stt"
}
},
"tts": {
"adapter": {
"preset": "pocket_tts"
},
"endpoint": {
"base_url": "http://localhost:8105",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "tts"
}
},
"llm": {
"adapter": {
"preset": "nemotron_omni"
},
"endpoint": {
"base_url": "http://localhost:8108",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "omni"
}
},
"agent_llm": {
"adapter": {
"preset": "nemotron_omni"
},
"endpoint": {
"base_url": "http://localhost:8108",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "omni"
}
},
"vlm": {
"adapter": {
"preset": "cosmos3_nano_reasoner"
},
"endpoint": {
"base_url": "http://localhost:8100",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "vlm"
}
},
"embedding": {
"adapter": {
"preset": "nemotron_embedding"
},
"endpoint": {
"base_url": "http://localhost:8109",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "embedding"
}
}
}
}
yaml/models.vlm_llm_nim.json#
{
"models": {
"stt": {
"adapter": {
"preset": "parakeet_stt"
},
"endpoint": {
"base_url": "http://localhost:8103",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "stt"
}
},
"tts": {
"adapter": {
"preset": "pocket_tts"
},
"endpoint": {
"base_url": "http://localhost:8105",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "tts"
}
},
"llm": {
"adapter": {
"preset": "nemotron_omni",
"model_name": "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning",
"reasoning_field": "reasoning"
},
"endpoint": {
"base_url": "http://localhost:8110",
"readiness": "health",
"health_path": "/v1/health/ready"
},
"deployment": {
"ownership": "managed",
"service": "llm-nim",
"credentials": [
"NGC_API_KEY"
]
}
},
"vlm": {
"category": "vlm",
"adapter": {
"kind": "openai_compat",
"model_name": "nvidia/cosmos3-nano-reasoner",
"capabilities": {
"streaming": true,
"vision": true,
"video": true
}
},
"endpoint": {
"base_url": "http://localhost:8100",
"readiness": "health",
"health_path": "/v1/health/ready"
},
"deployment": {
"ownership": "managed",
"service": "vlm-nim",
"credentials": [
"NGC_API_KEY"
]
}
},
"embedding": {
"adapter": {
"preset": "nemotron_embedding"
},
"endpoint": {
"base_url": "http://localhost:8109",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "embedding"
}
}
}
}
yaml/spark/embedding_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
model: nvidia/llama-nemotron-embed-1b-v2
host: "0.0.0.0"
port: 8109
served_model_name: embed
model_cache: ../../../../models
max_num_seqs: 32
max_model_len: 8192
# Pooling models have no generation KV cache; retain a total-memory fraction.
gpu_memory_utilization: 0.08
enforce_eager: true
vllm_backend: docker
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
# Prefetch and sync the snapshot before CUDA initialization, then retry once
# only if the driver rejects a CUDA allocation without an OOM-killed container.
spark_uma: true
yaml/spark/nemotron_omni_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Nemotron-3-Nano-Omni — DGX Spark (GB10).
# The NVFP4 model shares unified memory with the rest of the stack. vLLM's
# fractional profiler is unreliable while cold checkpoint reads change the
# filesystem page cache, so reserve 2 GiB explicitly for the 32K hybrid
# Mamba/attention cache. NGC 26.08 limits Nemotron Nano V3 on DGX Spark to
# four concurrent sequences.
# gpu_memory_utilization remains the vLLM startup admission threshold; it does
# not size the cache when the byte value is set.
# vLLM reports the resulting token capacity and maximum concurrency at startup.
host: "0.0.0.0"
port: 8108
hf_token: ""
model_cache: ../../../../models
max_num_seqs: 4
tensor_parallel_size: 1
max_model_len: 32768
gpu_memory_utilization: 0.25
kv_cache_memory_bytes: 2147483648
enforce_eager: false
video_pruning_rate: 0.5
video_fps: 2
video_num_frames: 64
vllm_backend: docker
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
# Prefetch and sync the snapshot before CUDA initialization, then retry once
# only if the driver rejects a CUDA allocation without an OOM-killed container.
spark_uma: true
yaml/spark/nim_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted Nemotron-3-Nano-Omni NIM (serves both the `llm` and
# `agent_llm` roles). This matches the model family used by the default local
# deployment. Swap in any compatible NIM from https://catalog.ngc.nvidia.com.
# For sample configuration, refer to
# https://nvidia.github.io/xr-ai/latest/guides/customizing-model-servers.html
# GB10 is not listed for this Omni NIM; verify startup and memory use on target
# hardware before deployment.
image: nvcr.io/nim/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:2.0.4-variant
http_port: 8110
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_MAX_MODEL_LEN: "32768"
# Match the local Omni deployment's reasoning and tool-call parsers.
NIM_PASSTHROUGH_ARGS: "--gpu-memory-utilization 0.35 --enable-auto-tool-choice --tool-call-parser qwen3_coder --reasoning-parser nemotron_v3"
yaml/spark/nim_stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted NIM: Riva ASR (parakeet). Workers reach the gRPC port via the
# riva_grpc model kind; http_port serves /v1/health/ready only.
# UNTESTED ESTIMATE for this GPU profile; validated values are dual_48G_ada's.
image: nvcr.io/nim/nvidia/parakeet-tdt-0.6b-v2:1.2.0
http_port: 9010
grpc_port: 50051
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
# Single-process inference: the default multiprocessing mode runs two
# CUDA processes; one is plenty for demo traffic. ~14 GB VRAM either way.
NIM_USE_MULTIPROCESSING_FOR_INFERENCE: "false"
yaml/spark/nim_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted NIM: Riva TTS (magpie). Workers reach the gRPC port via the
# riva_grpc model kind; http_port serves /v1/health/ready only.
# UNTESTED ESTIMATE for this GPU profile; validated values are dual_48G_ada's.
image: nvcr.io/nim/nvidia/magpie-tts-multilingual:1.9.0
http_port: 9011
grpc_port: 50052
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
yaml/spark/nim_vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Self-hosted NIM: Cosmos3-Nano Reasoner VLM.
# Swap in any vision NIM from https://catalog.ngc.nvidia.com, but check its
# engine accepts a full image prompt: the nemotron-nano-vl NIM builds a
# 3200-token input cap on this class of GPU, below its own ~3330-token
# per-image cost, so every image request 500s.
# For sample configuration, refer to
# https://nvidia.github.io/xr-ai/latest/guides/customizing-model-servers.html
# UNTESTED ESTIMATE for this GPU profile; validated values are dual_48G_ada's.
image: nvcr.io/nim/nvidia/cosmos3-reasoner:1.7.0
http_port: 8100
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
# Nano is the smaller model served as nvidia/cosmos3-nano-reasoner.
NIM_MODEL_SIZE: "nano"
NIM_MAX_MODEL_LEN: "16384"
# Fraction of total GPU memory despite the PERCENT name (0..1]; leaves
# headroom for whatever shares the GPU.
NIM_KVCACHE_PERCENT: "0.15"
yaml/spark/pocket_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Shared GPU Pocket TTS service. bill_boerst is a CC0 Voice-Zero recording.
voice: bill_boerst
language: english
device: cuda
cuda_visible_devices: "0"
port: 8105
startup_timeout_s: 600
model_cache: ../../../../models
yaml/spark/stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# STT server — DGX Spark (1× Blackwell, 128 GB).
model: nvidia/parakeet-tdt-0.6b-v3
device: auto
port: 8103
host: "0.0.0.0"
startup_timeout_s: 600
model_cache: ../../../../models
yaml/spark/vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# VLM server — DGX Spark (GB10, ~120 GiB GPU-visible unified memory).
#
# vlm is THIRD in load order: STT → Omni → vlm.
# free_at_startup ≈ 120 − 30 (Omni) − 2 (STT) ≈ 88 GiB.
# Cosmos3 requires about 1.12 GiB of KV cache for one 8,192-token request.
# Pin 1.5 GiB because vLLM's fractional memory profiler can misattribute
# filesystem page-cache changes as model overhead on unified-memory systems.
# Keep four sequences for concurrent shorter requests. The fixed cache is
# shared, so concurrent maximum-length requests can queue, preempt, or
# recompute when their aggregate token demand exceeds its capacity.
# The 0.20 utilization remains vLLM's startup admission threshold; the fixed
# byte value controls the KV-cache allocation.
# hf_overrides selects the Reasoner runtime; details are documented in
# docs/source/components/ai-services.md#per-server-notes.
model: nvidia/Cosmos3-Nano
hf_overrides:
architectures:
- Cosmos3ForConditionalGeneration
hf_token: ""
port: 8100
host: "0.0.0.0"
model_cache: ../../../../models
gpu_memory_utilization: 0.20
kv_cache_memory_bytes: 1610612736
max_model_len: 8192
max_num_seqs: 4
enforce_eager: true
async_scheduling: true
mm_encoder_tp_mode: data
max_videos_per_prompt: 0
# Increasing max_model_len also requires recalculating the fixed KV cache and
# cold-start validation on the target profile.
max_images_per_prompt: 4
# vLLM runtime: pip (this wrapper's venv) or docker (NGC nvcr.io/nvidia/vllm).
# See services/vlm-server/vlm_server.yaml for the full toggle docs.
vllm_backend: docker
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
# Prefetch and sync the snapshot before CUDA initialization, then retry once
# only if the driver rejects a CUDA allocation without an OOM-killed container.
spark_uma: true
model-servers-nim#
yaml/96G_blackwell/embedding_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Bridges XR AI's query:/passage: prefixes to NIM's asymmetric embedding API.
# Port 8119 is the native NIM; port 8109 is the SDK-compatible endpoint.
model: nvidia/llama-nemotron-embed-1b-v2
base_url: http://localhost:8119
host: "0.0.0.0"
port: 8109
yaml/96G_blackwell/llm_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Keep the original model-servers HTTP contract; NIM uses a separate backend port.
kind: chat
alias: llm
model: nvidia/nemotron-3-nano-omni-30b-a3b-reasoning
base_url: http://localhost:8118
health_path: /v1/health/ready
reasoning_field: reasoning
host: "0.0.0.0"
port: 8108
default_extras:
chat_template_kwargs:
enable_thinking: false
yaml/96G_blackwell/models.json#
{
"models": {
"stt": {
"adapter": {
"preset": "parakeet_stt"
},
"endpoint": {
"base_url": "http://localhost:8103",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "stt-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"tts": {
"adapter": {
"preset": "pocket_tts"
},
"endpoint": {
"base_url": "http://localhost:8105",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "tts-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"llm": {
"adapter": {
"preset": "nemotron_omni"
},
"endpoint": {
"base_url": "http://localhost:8108",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "llm-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"agent_llm": {
"adapter": {
"preset": "nemotron_omni"
},
"endpoint": {
"base_url": "http://localhost:8108",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "llm-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"vlm": {
"adapter": {
"preset": "cosmos3_nano_reasoner"
},
"endpoint": {
"base_url": "http://localhost:8100",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "vlm-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"embedding": {
"adapter": {
"preset": "nemotron_embedding"
},
"endpoint": {
"base_url": "http://localhost:8109",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "embedding",
"credentials": [
"NGC_API_KEY"
]
}
}
}
}
yaml/96G_blackwell/nim_embedding_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Same text embedding model as model-servers (not the distinct VL model).
# Keep a single instance; NIM budgets are engine-specific, not vLLM fractions.
# https://docs.nvidia.com/nim/nemo-retriever/text-embedding/1.13.0/environment-variables.html
image: nvcr.io/nim/nvidia/llama-nemotron-embed-1b-v2:1.13.0@sha256:3c22c0bd8d36dcdee4c46ff371951bb83ec537361db5d6b5737b5c4ecbec92ae
container_name: xr-ai-model-servers-nim-embedding
http_port: 8119
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_NUM_MODEL_INSTANCES: "1"
NIM_NUM_TOKENIZERS: "1"
NIM_TRITON_PERFORMANCE_MODE: "latency"
# Explicit FP8 TensorRT (~3 GiB) engine.
NIM_MODEL_PROFILE: "ee7364e4eba4df47443ed9df08f50d9551b529f7e12063cb9b7891fcec8b4e5c"
yaml/96G_blackwell/nim_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Generic NVFP4, TP=1 profile from this image's model_manifest.yaml.
# Pin precision: an automatically selected BF16 profile cannot share this GPU.
# https://docs.nvidia.com/nim/vision-language-models/2.0.4-variant/support-matrix.html
image: nvcr.io/nim/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:2.0.4-variant@sha256:8b7dc7fe5f18522bbaeb594d52afdd41b00a562d0887ba25a7ac850e51384f18
container_name: xr-ai-model-servers-nim-omni
http_port: 8118
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_MODEL_PROFILE: "d62eaa66527fa3c35dc50bce594f4622a16b183066fcece982ea532d5ae60196"
NIM_MAX_MODEL_LEN: "32768"
NIM_PASSTHROUGH_ARGS: >-
--gpu-memory-utilization 0.35
--max-num-seqs 4
--enforce-eager
--enable-auto-tool-choice
--tool-call-parser qwen3_coder
--reasoning-parser nemotron_v3
yaml/96G_blackwell/nim_stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# type=multi selects parakeet-tdt-0.6b-v3, preserving the original STT model.
# The English-only default would select v2. Budget about 14 GB for this NIM.
# https://docs.nvidia.com/nim/speech/26.02.0/about/release-notes.html
image: nvcr.io/nim/nvidia/parakeet-0.6b-tdt:1.3.0@sha256:0a5b5246146d0cc9e6421812dd535e64081e7a62a92c0436563ad7bfe227df06
container_name: xr-ai-model-servers-nim-stt
http_port: 9010
grpc_port: 50051
# Downloads and compiled repositories persist in separate per-container subdirectories.
# The launcher manages NIM_CACHE_PATH, NIM_EXPORT_PATH, NIM_WORKSPACE, and
# NIM_DISABLE_MODEL_DOWNLOAD; do not override those settings in env.
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_TAGS_SELECTOR: "type=multi"
NIM_USE_MULTIPROCESSING_FOR_INFERENCE: "false"
yaml/96G_blackwell/nim_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Uses the sample-local Riva launcher to export and reuse compiled engines.
# The pinned manifest provides batch sizes 8, 32, and 64; reserve about 13 GiB.
# Pin the digest: older documentation for this tag lists an absent bs=1 profile.
# https://docs.nvidia.com/nim/speech/latest/reference/support-matrix/tts.html
image: nvcr.io/nim/nvidia/magpie-tts-multilingual:1.10.0@sha256:72a18be0070be31fe84fda4d5ee97c50b71da99272e405bc6ced7557e1b9da54
container_name: xr-ai-model-servers-nim-tts
http_port: 9011
grpc_port: 50052
# Downloads and compiled repositories persist in separate per-container subdirectories.
# The launcher manages NIM_CACHE_PATH, NIM_EXPORT_PATH, NIM_WORKSPACE, and
# NIM_DISABLE_MODEL_DOWNLOAD; do not override those settings in env.
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_TAGS_SELECTOR: "batch_size=8"
yaml/96G_blackwell/nim_vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Cosmos3 Nano Reasoner, preserving the original sample's model size.
# Both controls are set because the image's inference.py supplies engine extra
# args in addition to nimlib's NIM_KVCACHE_PERCENT defaults. These are fractions
# of total GPU memory for weights + runtime + cache, not fractions of free VRAM.
image: nvcr.io/nim/nvidia/cosmos3-reasoner:1.7.0@sha256:19add3edaaa77c4030c75eb27d30939c29ca93807bb7af10a1876f05d520026c
container_name: xr-ai-model-servers-nim-cosmos
http_port: 8110
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_MODEL_SIZE: "nano"
NIM_MAX_MODEL_LEN: "8192"
NIM_MAX_NUM_SEQS: "4"
NIM_MAX_IMAGES_PER_PROMPT: "4"
NIM_MAX_VIDEOS_PER_PROMPT: "0"
NIM_GPU_MEMORY_UTILIZATION: "0.24"
NIM_KVCACHE_PERCENT: "0.24"
NIM_DISABLE_CUDA_GRAPH: "1"
NIM_COMPILATION_CONFIG: '{"cudagraph_mode": "NONE", "compile_mm_encoder": false}'
yaml/96G_blackwell/stt_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Preserve the original Parakeet HTTP endpoint using the typed Riva client.
kind: stt
alias: stt
base_url: localhost:50051
health_url: http://localhost:9010/v1/health/ready
# The pinned multilingual NIM advertises English as en-GB, not en-US.
language: en-GB
host: "0.0.0.0"
port: 8103
yaml/96G_blackwell/tts_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# The Pocket-compatible HTTP endpoint synthesizes Magpie audio through Riva.
alias: magpie
base_url: localhost:50052
health_url: http://localhost:9011/v1/health/ready
language: en-US
voice: Magpie-Multilingual.EN-US.Aria
sample_rate: 44100
# Added silence after each nonempty synthesis, including streamed audio (0 disables).
post_synthesis_pause_ms: 300
host: "0.0.0.0"
port: 8105
yaml/96G_blackwell/vlm_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Keep the original model-servers HTTP contract; NIM uses a separate backend port.
kind: chat
alias: vlm
model: nvidia/cosmos3-nano-reasoner
base_url: http://localhost:8110
health_path: /v1/health/ready
reasoning_field: reasoning
host: "0.0.0.0"
port: 8100
default_extras:
chat_template_kwargs:
enable_thinking: false
yaml/dual_48G_ada/embedding_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Bridges XR AI's query:/passage: prefixes to NIM's asymmetric embedding API.
# Port 8119 is the native NIM; port 8109 is the SDK-compatible endpoint.
model: nvidia/llama-nemotron-embed-1b-v2
base_url: http://localhost:8119
host: "0.0.0.0"
port: 8109
yaml/dual_48G_ada/llm_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Keep the original model-servers HTTP contract; NIM uses a separate backend port.
kind: chat
alias: llm
model: nvidia/nemotron-3-nano-omni-30b-a3b-reasoning
base_url: http://localhost:8118
health_path: /v1/health/ready
reasoning_field: reasoning
host: "0.0.0.0"
port: 8108
default_extras:
chat_template_kwargs:
enable_thinking: false
yaml/dual_48G_ada/models.json#
{
"models": {
"stt": {
"adapter": {
"preset": "parakeet_stt"
},
"endpoint": {
"base_url": "http://localhost:8103",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "stt-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"tts": {
"adapter": {
"preset": "pocket_tts"
},
"endpoint": {
"base_url": "http://localhost:8105",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "tts-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"llm": {
"adapter": {
"preset": "nemotron_omni"
},
"endpoint": {
"base_url": "http://localhost:8108",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "llm-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"agent_llm": {
"adapter": {
"preset": "nemotron_omni"
},
"endpoint": {
"base_url": "http://localhost:8108",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "llm-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"vlm": {
"adapter": {
"preset": "cosmos3_nano_reasoner"
},
"endpoint": {
"base_url": "http://localhost:8100",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "vlm-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"embedding": {
"adapter": {
"preset": "nemotron_embedding"
},
"endpoint": {
"base_url": "http://localhost:8109",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "embedding",
"credentials": [
"NGC_API_KEY"
]
}
}
}
}
yaml/dual_48G_ada/nim_embedding_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Same text embedding model as model-servers (not the distinct VL model).
# Keep a single instance; NIM budgets are engine-specific, not vLLM fractions.
# https://docs.nvidia.com/nim/nemo-retriever/text-embedding/1.13.0/environment-variables.html
image: nvcr.io/nim/nvidia/llama-nemotron-embed-1b-v2:1.13.0@sha256:3c22c0bd8d36dcdee4c46ff371951bb83ec537361db5d6b5737b5c4ecbec92ae
container_name: xr-ai-model-servers-nim-embedding
http_port: 8119
nim_cache: ../../../../models/nim
cuda_visible_devices: "1"
env:
NIM_NUM_MODEL_INSTANCES: "1"
NIM_NUM_TOKENIZERS: "1"
NIM_TRITON_PERFORMANCE_MODE: "latency"
# Explicit FP8 TensorRT (~3 GiB) engine.
NIM_MODEL_PROFILE: "932a4fc51d25c06b69742d00261f0e9048482bf49a188074bca930fbbad60100"
yaml/dual_48G_ada/nim_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Generic FP8, TP=1 profile from this image's model_manifest.yaml.
# Pin precision: an automatically selected BF16 profile cannot share this GPU.
# https://docs.nvidia.com/nim/vision-language-models/2.0.4-variant/support-matrix.html
image: nvcr.io/nim/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:2.0.4-variant@sha256:8b7dc7fe5f18522bbaeb594d52afdd41b00a562d0887ba25a7ac850e51384f18
container_name: xr-ai-model-servers-nim-omni
http_port: 8118
nim_cache: ../../../../models/nim
cuda_visible_devices: "1"
env:
NIM_MODEL_PROFILE: "ad007e6782cb8319932334129d428d9079517a5a2bfc53777074ab9a670ab89f"
NIM_MAX_MODEL_LEN: "32768"
NIM_PASSTHROUGH_ARGS: >-
--gpu-memory-utilization 0.80
--max-num-seqs 4
--enforce-eager
--enable-auto-tool-choice
--tool-call-parser qwen3_coder
--reasoning-parser nemotron_v3
yaml/dual_48G_ada/nim_stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# type=multi selects parakeet-tdt-0.6b-v3, preserving the original STT model.
# The English-only default would select v2. Budget about 14 GB for this NIM.
# https://docs.nvidia.com/nim/speech/26.02.0/about/release-notes.html
image: nvcr.io/nim/nvidia/parakeet-0.6b-tdt:1.3.0@sha256:0a5b5246146d0cc9e6421812dd535e64081e7a62a92c0436563ad7bfe227df06
container_name: xr-ai-model-servers-nim-stt
http_port: 9010
grpc_port: 50051
# Downloads and compiled repositories persist in separate per-container subdirectories.
# The launcher manages NIM_CACHE_PATH, NIM_EXPORT_PATH, NIM_WORKSPACE, and
# NIM_DISABLE_MODEL_DOWNLOAD; do not override those settings in env.
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_TAGS_SELECTOR: "type=multi"
NIM_USE_MULTIPROCESSING_FOR_INFERENCE: "false"
yaml/dual_48G_ada/nim_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Uses the sample-local Riva launcher to export and reuse compiled engines.
# The pinned manifest provides batch sizes 8, 32, and 64; reserve about 13 GiB.
# Pin the digest: older documentation for this tag lists an absent bs=1 profile.
# https://docs.nvidia.com/nim/speech/latest/reference/support-matrix/tts.html
image: nvcr.io/nim/nvidia/magpie-tts-multilingual:1.10.0@sha256:72a18be0070be31fe84fda4d5ee97c50b71da99272e405bc6ced7557e1b9da54
container_name: xr-ai-model-servers-nim-tts
http_port: 9011
grpc_port: 50052
# Downloads and compiled repositories persist in separate per-container subdirectories.
# The launcher manages NIM_CACHE_PATH, NIM_EXPORT_PATH, NIM_WORKSPACE, and
# NIM_DISABLE_MODEL_DOWNLOAD; do not override those settings in env.
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_TAGS_SELECTOR: "batch_size=8"
yaml/dual_48G_ada/nim_vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Cosmos3 Nano Reasoner, preserving the original sample's model size.
# Both controls are set because the image's inference.py supplies engine extra
# args in addition to nimlib's NIM_KVCACHE_PERCENT defaults. These are fractions
# of total GPU memory for weights + runtime + cache, not fractions of free VRAM.
image: nvcr.io/nim/nvidia/cosmos3-reasoner:1.7.0@sha256:19add3edaaa77c4030c75eb27d30939c29ca93807bb7af10a1876f05d520026c
container_name: xr-ai-model-servers-nim-cosmos
http_port: 8110
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_MODEL_SIZE: "nano"
NIM_MAX_MODEL_LEN: "8192"
NIM_MAX_NUM_SEQS: "4"
NIM_MAX_IMAGES_PER_PROMPT: "4"
NIM_MAX_VIDEOS_PER_PROMPT: "0"
NIM_GPU_MEMORY_UTILIZATION: "0.36"
NIM_KVCACHE_PERCENT: "0.36"
NIM_DISABLE_CUDA_GRAPH: "1"
NIM_COMPILATION_CONFIG: '{"cudagraph_mode": "NONE", "compile_mm_encoder": false}'
# FP8 Nano vLLM checkpoint profile tagged L40S (Ada, SM 8.9), also used
# on RTX 6000 Ada (SM 8.9). Contains weights, not a GPU-specific TRT engine.
# Explicit selection prevents the generic BF16 fallback from exceeding the
# 17.3 GiB budget alongside the two speech NIMs. Validate on the target Ada.
NIM_MODEL_PROFILE: "17fedc428e5a9220fae87b540fc9f324eb9e521d35d733de5fe87253db14e6e7"
yaml/dual_48G_ada/stt_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Preserve the original Parakeet HTTP endpoint using the typed Riva client.
kind: stt
alias: stt
base_url: localhost:50051
health_url: http://localhost:9010/v1/health/ready
# The pinned multilingual NIM advertises English as en-GB, not en-US.
language: en-GB
host: "0.0.0.0"
port: 8103
yaml/dual_48G_ada/tts_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# The Pocket-compatible HTTP endpoint synthesizes Magpie audio through Riva.
alias: magpie
base_url: localhost:50052
health_url: http://localhost:9011/v1/health/ready
language: en-US
voice: Magpie-Multilingual.EN-US.Aria
sample_rate: 44100
# Added silence after each nonempty synthesis, including streamed audio (0 disables).
post_synthesis_pause_ms: 300
host: "0.0.0.0"
port: 8105
yaml/dual_48G_ada/vlm_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Keep the original model-servers HTTP contract; NIM uses a separate backend port.
kind: chat
alias: vlm
model: nvidia/cosmos3-nano-reasoner
base_url: http://localhost:8110
health_path: /v1/health/ready
reasoning_field: reasoning
host: "0.0.0.0"
port: 8100
default_extras:
chat_template_kwargs:
enable_thinking: false
yaml/spark/embedding_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Bridges XR AI's query:/passage: prefixes to NIM's asymmetric embedding API.
# Port 8119 is the native NIM; port 8109 is the SDK-compatible endpoint.
model: nvidia/llama-nemotron-embed-1b-v2
base_url: http://localhost:8119
host: "0.0.0.0"
port: 8109
yaml/spark/llm_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Keep the original model-servers HTTP contract; NIM uses a separate backend port.
kind: chat
alias: llm
model: nvidia/nemotron-3-nano-omni-30b-a3b-reasoning
base_url: http://localhost:8118
health_path: /v1/health/ready
reasoning_field: reasoning
host: "0.0.0.0"
port: 8108
default_extras:
chat_template_kwargs:
enable_thinking: false
yaml/spark/models.json#
{
"models": {
"stt": {
"adapter": {
"preset": "parakeet_stt"
},
"endpoint": {
"base_url": "http://localhost:8103",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "stt",
"credentials": [
"HF_TOKEN"
]
}
},
"tts": {
"adapter": {
"preset": "pocket_tts"
},
"endpoint": {
"base_url": "http://localhost:8105",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "tts-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"llm": {
"adapter": {
"preset": "nemotron_omni"
},
"endpoint": {
"base_url": "http://localhost:8108",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "llm-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"agent_llm": {
"adapter": {
"preset": "nemotron_omni"
},
"endpoint": {
"base_url": "http://localhost:8108",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "llm-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"vlm": {
"adapter": {
"preset": "cosmos3_nano_reasoner"
},
"endpoint": {
"base_url": "http://localhost:8100",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "vlm-adapter",
"credentials": [
"NGC_API_KEY"
]
}
},
"embedding": {
"adapter": {
"preset": "nemotron_embedding"
},
"endpoint": {
"base_url": "http://localhost:8109",
"readiness": "health"
},
"deployment": {
"ownership": "managed",
"service": "embedding",
"credentials": [
"NGC_API_KEY"
]
}
}
}
}
yaml/spark/nim_embedding_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Same text embedding model as model-servers (not the distinct VL model).
# Keep a single instance; NIM budgets are engine-specific, not vLLM fractions.
# https://docs.nvidia.com/nim/nemo-retriever/text-embedding/1.13.0/environment-variables.html
image: nvcr.io/nim/nvidia/llama-nemotron-embed-1b-v2:1.13.0@sha256:3c22c0bd8d36dcdee4c46ff371951bb83ec537361db5d6b5737b5c4ecbec92ae
container_name: xr-ai-model-servers-nim-embedding
http_port: 8119
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_NUM_MODEL_INSTANCES: "1"
NIM_NUM_TOKENIZERS: "1"
NIM_TRITON_PERFORMANCE_MODE: "latency"
# Explicit generic FP16 ONNX (4096 tokens) engine.
NIM_MODEL_PROFILE: "e28f17c9c13a99055d065f88d725bf93c23b3aab14acd68f16323de1353fc528"
yaml/spark/nim_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Generic NVFP4, TP=1 profile from this image's model_manifest.yaml.
# Pin precision: an automatically selected BF16 profile cannot share this GPU.
# https://docs.nvidia.com/nim/vision-language-models/2.0.4-variant/support-matrix.html
image: nvcr.io/nim/nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:2.0.4-variant@sha256:8b7dc7fe5f18522bbaeb594d52afdd41b00a562d0887ba25a7ac850e51384f18
container_name: xr-ai-model-servers-nim-omni
http_port: 8118
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_MODEL_PROFILE: "d62eaa66527fa3c35dc50bce594f4622a16b183066fcece982ea532d5ae60196"
NIM_MAX_MODEL_LEN: "32768"
NIM_PASSTHROUGH_ARGS: >-
--gpu-memory-utilization 0.25
--max-num-seqs 4
--enforce-eager
--enable-auto-tool-choice
--tool-call-parser qwen3_coder
--reasoning-parser nemotron_v3
--kv-cache-memory-bytes 2147483648
# Fixed 2 GiB hybrid attention/Mamba cache avoids fractional sizing on UMA.
# GB10 uses the generic NVFP4 profile; full-stack Spark qualification is pending.
yaml/spark/nim_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Uses the sample-local Riva launcher to export and reuse compiled engines.
# The pinned manifest provides batch sizes 8, 32, and 64; reserve about 13 GiB.
# Pin the digest: older documentation for this tag lists an absent bs=1 profile.
# https://docs.nvidia.com/nim/speech/latest/reference/support-matrix/tts.html
image: nvcr.io/nim/nvidia/magpie-tts-multilingual:1.10.0@sha256:72a18be0070be31fe84fda4d5ee97c50b71da99272e405bc6ced7557e1b9da54
container_name: xr-ai-model-servers-nim-tts
http_port: 9011
grpc_port: 50052
# Downloads and compiled repositories persist in separate per-container subdirectories.
# The launcher manages NIM_CACHE_PATH, NIM_EXPORT_PATH, NIM_WORKSPACE, and
# NIM_DISABLE_MODEL_DOWNLOAD; do not override those settings in env.
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_TAGS_SELECTOR: "batch_size=8"
yaml/spark/nim_vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Cosmos3 Nano Reasoner, preserving the original sample's model size.
# Both controls are set because the image's inference.py supplies engine extra
# args in addition to nimlib's NIM_KVCACHE_PERCENT defaults. These are fractions
# of total GPU memory for weights + runtime + cache, not fractions of free VRAM.
image: nvcr.io/nim/nvidia/cosmos3-reasoner:1.7.0@sha256:19add3edaaa77c4030c75eb27d30939c29ca93807bb7af10a1876f05d520026c
container_name: xr-ai-model-servers-nim-cosmos
http_port: 8110
nim_cache: ../../../../models/nim
cuda_visible_devices: "0"
env:
NIM_MODEL_SIZE: "nano"
NIM_MAX_MODEL_LEN: "8192"
NIM_MAX_NUM_SEQS: "4"
NIM_MAX_IMAGES_PER_PROMPT: "4"
NIM_MAX_VIDEOS_PER_PROMPT: "0"
NIM_GPU_MEMORY_UTILIZATION: "0.22"
NIM_KVCACHE_PERCENT: "0.22"
NIM_DISABLE_CUDA_GRAPH: "1"
NIM_COMPILATION_CONFIG: '{"cudagraph_mode": "NONE", "compile_mm_encoder": false}'
# No GPU-specific GB10 profile: select the generic BF16 Nano engine.
NIM_MODEL_PROFILE: "e55fdb44f41441032f546360d0dcf61caa8b39fa2852d31124c03953d01e1cb3"
# Unlike the local Spark vLLM wrapper, this NIM uses fractional cache sizing.
# Validate cold starts on GB10; CPU, page cache, and GPU share unified memory.
yaml/spark/stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# STT server — DGX Spark (1× Blackwell, 128 GB).
model: nvidia/parakeet-tdt-0.6b-v3
device: auto
port: 8103
host: "0.0.0.0"
startup_timeout_s: 600
model_cache: ../../../../models
# Local fallback: Parakeet TDT v3 NIM 1.3.0 has no ARM64 image.
# https://docs.nvidia.com/nim/speech/latest/reference/support-matrix/asr.html
yaml/spark/tts_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# The Pocket-compatible HTTP endpoint synthesizes Magpie audio through Riva.
alias: magpie
base_url: localhost:50052
health_url: http://localhost:9011/v1/health/ready
language: en-US
voice: Magpie-Multilingual.EN-US.Aria
sample_rate: 44100
# Added silence after each nonempty synthesis, including streamed audio (0 disables).
post_synthesis_pause_ms: 300
host: "0.0.0.0"
port: 8105
yaml/spark/vlm_adapter.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Keep the original model-servers HTTP contract; NIM uses a separate backend port.
kind: chat
alias: vlm
model: nvidia/cosmos3-nano-reasoner
base_url: http://localhost:8110
health_path: /v1/health/ready
reasoning_field: reasoning
host: "0.0.0.0"
port: 8100
default_extras:
chat_template_kwargs:
enable_thinking: false
Model-server defaults#
embedding_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# embedding-server — vLLM configuration.
# OpenAI-compatible embeddings API at http://localhost:8109/v1 (served-model-name: "embed")
# Endpoint: POST /v1/embeddings (input text → float vector)
model: nvidia/llama-nemotron-embed-1b-v2
host: "0.0.0.0"
port: 8109
# Optional. HF_TOKEN in the environment takes priority over this value.
hf_token: ""
# Shared weight cache — resolves relative to this YAML.
model_cache: ../../models
# Pin to a specific GPU (or comma-separated list for multi-GPU).
# Unset to use all GPUs visible to the process.
# cuda_visible_devices: "0"
# vLLM knobs.
max_num_seqs: 32
tensor_parallel_size: 1
max_model_len: 8192
# Pooling models do not allocate a generation KV cache, so their deployment
# budget remains a total-memory fraction rather than an explicit cache size.
# Low utilization by default — the 1B model is small and leaves headroom for
# the other vLLM servers (VLM, LLM) sharing the same GPU. Raise to 0.30–0.40
# if this server runs on a dedicated GPU.
gpu_memory_utilization: 0.20
enforce_eager: false
# vLLM runtime. If this key is omitted, the wrapper falls back to pip;
# the checked-in configuration below selects the NGC Docker container.
# pip — vllm CLI from this wrapper's venv (today's behavior)
# docker — `docker run nvcr.io/nvidia/vllm:<tag> vllm serve …`
# Both honor the same config keys above; only the runtime hosting vllm differs.
# docker mode requires Docker Engine + NVIDIA Container Toolkit and a
# `docker login nvcr.io` (or NGC_API_KEY in the environment).
vllm_backend: docker
# Container image used when vllm_backend: docker. Override to pin a different
# tag, an internal mirror, or a custom build.
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
llama_nemotron_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# llama-nemotron-llm-server — vLLM configuration.
# OpenAI-compatible API at http://localhost:8106/v1 (served-model-name: "llm")
model: nvidia/Llama-3.1-Nemotron-Nano-8B-v1
host: "0.0.0.0"
port: 8106
# Optional. HF_TOKEN in the environment takes priority over this value.
hf_token: ""
# Shared weight cache — resolves relative to this YAML.
model_cache: ../../models
# Pin to a specific GPU (or comma-separated list for multi-GPU).
# Unset to use all GPUs visible to the process.
# cuda_visible_devices: "0"
# vLLM knobs.
max_num_seqs: 8
tensor_parallel_size: 1
max_model_len: 32768
gpu_memory_utilization: 0.85
enforce_eager: false
# Tool calling via vLLM's built-in Llama-3 parser.
# Set enable_tool_choice: false to disable tool calling entirely.
enable_tool_choice: true
tool_call_parser: llama3_json
# vLLM runtime. If this key is omitted, the wrapper falls back to pip;
# the checked-in configuration below selects the NGC Docker container.
# pip — vllm CLI from this wrapper's venv (today's behavior)
# docker — `docker run nvcr.io/nvidia/vllm:<tag> vllm serve …`
# Both honor the same config keys above; only the runtime hosting vllm differs.
# docker mode requires Docker Engine + NVIDIA Container Toolkit and a
# `docker login nvcr.io` (or NGC_API_KEY in the environment).
vllm_backend: docker
# Container image used when vllm_backend: docker. Override to pin a different
# tag, an internal mirror, or a custom build.
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
magpie_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# TTS server configuration — nvidia/magpie_tts_multilingual_357m.
# Auto-discovered by xr-ai-launcher and passed as --config to tts_server.
# OpenAI-compatible API at http://localhost:8104/v1
# NeMo TTS model name.
# nvidia/magpie_tts_multilingual_357m — multilingual, NVIDIA Open Model License;
# ~1 GB VRAM
model: nvidia/magpie_tts_multilingual_357m
# Pin to a specific HuggingFace commit so we always load the revision that was
# validated against the NeMo version in pyproject.toml. The 2025-07 HEAD added
# a pt-BR tokenizer that requires newer NeMo API (locale_specific_punct kwarg).
# Remove this pin after upgrading nemo_toolkit to a version that supports the
# new model config.
model_revision: "34d7e40da85cabc97f92198889b65cea27bc7fd1"
# Inference device: "cuda", "cpu", or "auto" (CUDA if available, else CPU).
device: auto
port: 8104
host: "0.0.0.0"
# NeMo FastPitch/VITS native output sample rate.
sample_rate: 22050
# NeMo + HuggingFace weight cache — resolved relative to this YAML file.
model_cache: ../../models
nemotron_omni_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Nemotron-3-Nano-Omni — vLLM configuration.
# Omni multimodal model supporting text + video input.
# OpenAI-compatible API at http://localhost:8108/v1 (served-model-name: "llm")
#
# GPU auto-selection:
# Blackwell (SM100+) → model_blackwell (NVFP4, --kv-cache-dtype fp8)
# Ada, Hopper, Ampere → model_ada (FP8, --kv-cache-dtype fp8)
# use_bf16: true → model_bf16 (BF16, no kv-cache quantisation)
model_blackwell: nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-NVFP4
model_ada: nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-FP8
model_bf16: nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16
# Set to true to force BF16 regardless of GPU (highest quality, most VRAM).
use_bf16: false
host: "0.0.0.0"
port: 8108
# Optional. HF_TOKEN in the environment takes priority over this value.
hf_token: ""
# Weight cache — resolves relative to this YAML.
model_cache: ../../models
# Pin to a specific GPU (or comma-separated list for multi-GPU).
# Unset to use all GPUs visible to the process.
# cuda_visible_devices: "0"
# vLLM knobs.
# The launcher defaults to 384 sequences, or 4 for the NVFP4 model when
# spark_uma is enabled. Set max_num_seqs to override that hardware-aware default.
tensor_parallel_size: 1
max_model_len: 131072
gpu_memory_utilization: 0.85
# Optional fixed KV-cache size in bytes per GPU. When this is set, vLLM still
# uses gpu_memory_utilization for its initial free-memory admission check.
# kv_cache_memory_bytes: 2147483648
enforce_eager: false
# Video input — controls how video frames are sampled and pruned.
video_pruning_rate: 0.5 # fraction of redundant video tokens to drop
video_fps: 2 # FPS for video sampling
video_num_frames: 256 # max frames per video clip
# vLLM runtime. If this key is omitted, the wrapper falls back to pip;
# the checked-in configuration below selects the NGC Docker container.
# pip — vllm CLI from this wrapper's venv (today's behavior)
# docker — `docker run nvcr.io/nvidia/vllm:<tag> vllm serve …`
# Both honor the same config keys above; only the runtime hosting vllm differs.
# docker mode requires Docker Engine + NVIDIA Container Toolkit and a
# `docker login nvcr.io` (or NGC_API_KEY in the environment).
vllm_backend: docker
# Container image used when vllm_backend: docker. Override to pin a different
# tag, an internal mirror, or a custom build.
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
# DGX Spark is detected automatically to select the documented four-sequence
# limit and unified-memory cold-start safeguards. Set spark_uma to override.
nemotron3_nano_llm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Nemotron-3-Nano LLM server configuration. The wrapper selects NVFP4 on
# Blackwell and FP8 on earlier supported GPU architectures.
# Auto-discovered by xr-ai-launcher (filename matches the
# 'nemotron3_nano_llm_server' process command) and passed as --config.
# Exposes an OpenAI-compatible API at http://localhost:8107/v1 via vLLM.
#
# Reasoning mode: the model's chat template defaults to
# ``enable_thinking=True``. vLLM's ``--reasoning-parser nano_v3`` splits
# the resulting ``<think>…</think>`` into message.reasoning_content so the
# actual answer in message.content is never polluted — this is what keeps
# voice TTS from reading the reasoning aloud.
# The wrapper selects the checkpoint from the detected GPU compute capability.
model_blackwell: nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4
model_ada: nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8
host: "0.0.0.0"
port: 8107
# Optional. HF_TOKEN in the environment takes priority over this value.
hf_token: ""
# Shared weight + reasoning-parser cache. Resolves relative to this YAML;
# ../../models lands in the repo-root models/ directory shared by the other
# model services.
model_cache: ../../models
# Pin to a specific GPU (or comma-separated list for multi-GPU).
# Also controls which GPU the compute-capability query targets for model selection.
# Unset to use all GPUs visible to the process.
# cuda_visible_devices: "0"
# vLLM server knobs.
#
# On Blackwell (B200 / RTX PRO 6000 96 GB): NVFP4 weights are ~20 GB. The
# checked-in 0.85 value gives a dedicated server room for its KV cache; lower
# it in a reviewed GPU profile when sharing the device with another model.
#
# On Ada Lovelace (RTX 6000 Ada 48 GB): FP8 weights ~30 GB; run the LLM
# on a dedicated GPU and keep the vlm-server + stt-server on the second GPU.
# With LLM alone on a 48 GB card, 0.85 (~41 GB) gives ~11 GB for KV cache.
# The launcher defaults to 8 sequences, or 4 when spark_uma is enabled for
# DGX Spark. Set max_num_seqs to override that hardware-aware default.
tensor_parallel_size: 1
max_model_len: 32768
gpu_memory_utilization: 0.85
# Skip CUDA graph capture + FlashInfer MoE autotune at startup. For
# NemotronH-30B-A3B-NVFP4 those two phases are silent (no log output)
# and take 3-8 min on first run — bad UX for a voice agent where the
# user is waiting for the server to become healthy. Eager mode starts
# in ~5 s after weight load and is 10-20% slower per token, which is
# imperceptible for this workload (<250 tokens per turn, STT+VAD+TTS
# already dominate turn latency). Set to ``false`` if you want
# maximum throughput and can wait for graph capture to finish.
enforce_eager: true
# vLLM runtime. If this key is omitted, the wrapper falls back to pip;
# the checked-in configuration below selects the NGC Docker container.
# pip — vllm CLI from this wrapper's venv (today's behavior)
# docker — `docker run nvcr.io/nvidia/vllm:<tag> vllm serve …`
# Both honor the same config keys above; only the runtime hosting vllm differs.
# docker mode requires Docker Engine + NVIDIA Container Toolkit and a
# `docker login nvcr.io` (or NGC_API_KEY in the environment).
vllm_backend: docker
# Container image used when vllm_backend: docker. Override to pin a different
# tag, an internal mirror, or a custom build.
vllm_image: nvcr.io/nvidia/vllm:26.09-py3
# DGX Spark is detected automatically to cap max_num_seqs at 4 and enable the
# unified-memory cold-start safeguards. Set spark_uma explicitly to override.
pocket_tts_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Pocket TTS server reference configuration.
# Copy to your agent sample root as pocket_tts_server.yaml and edit as needed.
#
# This release accepts only bill_boerst. Its source Voice-Zero recording is CC0.
voice: bill_boerst
language: english
# Select cuda when available, with a CPU fallback.
device: auto
port: 8105
startup_timeout_s: 600
model_cache: ../../models
stt_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# STT server configuration — nvidia/parakeet-tdt-0.6b-v3.
# Auto-discovered by xr-ai-launcher and passed as --config to stt_server.
# OpenAI-compatible API at http://localhost:8103/v1
# NeMo model name.
# nvidia/parakeet-tdt-0.6b-v3 — 0.6B TDT model; CC-BY-4.0; ~1.5 GB VRAM; English only
# nvidia/parakeet-rnnt-1.1b — stronger, larger; same CC-BY-4.0 license
model: nvidia/parakeet-tdt-0.6b-v3
# Inference device: "cuda", "cpu", or "auto" (CUDA if available, else CPU).
device: auto
port: 8103
host: "0.0.0.0"
# A cold start imports NeMo, downloads weights when absent, initializes CUDA,
# and loads the model before /health opens. Use a positive finite number, and
# increase it on slow links.
startup_timeout_s: 600
# NeMo + HuggingFace weight cache — resolved relative to this YAML file.
model_cache: ../../models
vlm_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# vlm-server — vLLM configuration for the Cosmos3 Nano Reasoner.
# OpenAI-compatible API at http://localhost:8100/v1 (served-model-name: "vlm")
# Accepts image_url content blocks (base64 data URLs or HTTP URLs).
#
# The architecture override selects the Reasoner runtime; rationale and loader
# details: docs/source/components/ai-services.md#per-server-notes.
model: nvidia/Cosmos3-Nano
hf_overrides:
architectures:
- Cosmos3ForConditionalGeneration
host: "0.0.0.0"
port: 8100
# Optional. HF_TOKEN in the environment takes priority over this value. Only
# needed for gated models or to lift HF download rate limits. See
# docs/source/getting_started/credentials.md.
hf_token: ""
# Shared weight cache — resolves relative to this YAML.
model_cache: ../../models
# Pin to a specific GPU (or comma-separated list for multi-GPU).
# Unset to use all GPUs visible to the process.
# cuda_visible_devices: "0"
# vLLM knobs — VLMs are more memory-intensive than text-only LLMs.
max_num_seqs: 4
tensor_parallel_size: 1
max_model_len: 8192
gpu_memory_utilization: 0.85
# Optional fixed KV-cache size in bytes per GPU. When this is set, vLLM still
# uses gpu_memory_utilization for its initial free-memory admission check.
# kv_cache_memory_bytes: 1610612736
enforce_eager: false
# Recommended by NVIDIA for the Cosmos3 Reasoner vLLM path.
async_scheduling: true
mm_encoder_tp_mode: data
# Max images accepted per request.
# Raise max_model_len as needed for larger multi-image prompts.
max_images_per_prompt: 4
# Max video items accepted per request. Default 0 (disabled).
# Multimodal models reserve activation memory at startup for the maximum video
# feature size. Leave at 0 unless your worker sends video_url content blocks.
max_videos_per_prompt: 0
# vLLM runtime. If this key is omitted, the wrapper falls back to pip;
# the checked-in configuration below selects the NGC Docker container.
# pip — vllm CLI from this wrapper's venv (today's behavior)
# docker — `docker run nvcr.io/nvidia/vllm:<tag> vllm serve …`
# Both honor the same config keys above; only the runtime hosting vllm differs.
# docker mode requires Docker Engine + NVIDIA Container Toolkit. NVIDIA's
# public vLLM image supports anonymous pulls; NGC login is only needed for a
# restricted override image (and can be supplied through NGC_API_KEY).
vllm_backend: docker
# Container image used when vllm_backend: docker. Override to pin a different
# tag, an internal mirror, or a custom build.
vllm_image: nvcr.io/nvidia/vllm:26.09-py3