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
# Leave both blank to generate credentials for this hub run.
# Optional overrides: LIVEKIT_API_KEY and LIVEKIT_API_SECRET in the environment.
# Refer to docs/source/getting_started/credentials.md for setup.
api_key: ""
api_secret: ""
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/media_capture.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Other capture settings use the shared defaults. Add fields here to override them.
out_dir: ~/.local/share/xr-ai/captures/lab-instrument-monitoring
profile: demo
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
# Final transcripts during an active conversation are recorded before any
# optional wake gate. Only accepted turns reach the foreground agent.
magic_phrases:
- agent
- hey agent
listening_chime: true
followup_grace_s: 5.0
# Start once, then speak naturally until the full stop phrase.
conversation:
enabled: true
start_phrase: "Hey agent, let's start talking"
stop_phrase: "Hey agent, let's stop talking"
require_wake_phrase: false # true keeps magic_phrases and followup_grace_s
phrase_window_s: 6.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 ────────────────────────────────────────────────────────────
# Leave both blank to generate credentials for this hub run.
# Optional overrides: LIVEKIT_API_KEY and LIVEKIT_API_SECRET in the environment.
# Refer to docs/source/getting_started/credentials.md for setup.
api_key: ""
api_secret: ""
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
# Other capture settings use the shared defaults. Add fields here to override them.
out_dir: ~/.local/share/xr-ai/captures/simple-vlm-example
profile: demo
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
# Start once, then speak naturally until the full stop phrase.
# A short "stop" interrupts the response without closing the conversation.
conversation:
enabled: true
start_phrase: "Hey agent, let's start talking"
stop_phrase: "Hey agent, let's stop talking"
# false: speak naturally after starting. true: keep wake and follow-up rules.
require_wake_phrase: false
# Join exact control fragments whose onsets are within this window.
phrase_window_s: 6.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
# Leave both blank to generate credentials for this hub run.
# Optional overrides: LIVEKIT_API_KEY and LIVEKIT_API_SECRET in the environment.
# Refer to docs/source/getting_started/credentials.md for setup.
api_key: ""
api_secret: ""
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/media_capture.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Other capture settings use the shared defaults. Add fields here to override them.
out_dir: ~/.local/share/xr-ai/captures/tea-making-sample
profile: demo
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
# Continuous dispatch after the start phrase, until the full stop phrase.
conversation:
enabled: true
start_phrase: "Hey agent, let's start talking"
stop_phrase: "Hey agent, let's stop talking"
require_wake_phrase: false
phrase_window_s: 6.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
# Start once, then speak naturally until the full stop phrase.
conversation:
enabled: true
start_phrase: "Hey agent, let's start talking"
stop_phrase: "Hey agent, let's stop talking"
require_wake_phrase: false # true keeps magic_phrases and followup_grace_s
phrase_window_s: 6.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 ────────────────────────────────────────────────────────────
# Leave both blank to generate credentials for this hub run.
# Optional overrides: LIVEKIT_API_KEY and LIVEKIT_API_SECRET in the environment.
# Refer to docs/source/getting_started/credentials.md for setup.
api_key: ""
api_secret: ""
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
# Other capture settings use the shared defaults. Add fields here to override them.
out_dir: ~/.local/share/xr-ai/captures/xr-render-demo
profile: demo
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
# Must match device_io_hub.yaml video_recording.out_dir when history is enabled.
recordings_dir: /dev/shm/xr-ai/recordings
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 — optional wake phrases during the active conversation.
# To require a "hey agent" / "agent" wake word, also set
# conversation.require_wake_phrase: true and use:
# magic_phrases:
# - "agent"
# - "hey agent"
# 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: [] # no wake word during the conversation
listening_chime: true
followup_grace_s: 5.0
# Start once, then speak naturally until the full stop phrase.
conversation:
enabled: true
start_phrase: "Hey agent, let's start talking"
stop_phrase: "Hey agent, let's stop talking"
require_wake_phrase: false
phrase_window_s: 6.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 point recordings_dir
# in video_memory_service.yaml at the same directory. Omitting this setting
# enables history. The sample sets it to false because hub recording is off;
# when history is 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
clef-flash#
yaml/clef_server.yaml#
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# The pinned snapshot downloads into model_cache on first launch. Set
# model_path to an extracted matching snapshot directory to reuse it directly.
model_name: Cloudflare/clef-flash
model_revision: 17f0b0ad64efb65d273590632833508766b2aae6
model_path: null
model_cache: ../../../models
host: 127.0.0.1
# 810x contains shared client endpoints, including NIM compatibility adapters.
# 811x is used by native NIM chat and embedding backends; Clef uses 8120.
# Port inventory: docs/source/reference/model-servers-nim.md.
port: 8120
device: cuda:0
dtype: bfloat16
max_length: 4096
max_body_bytes: 1048576
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/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/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/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
# Restart the container once if the CUDA driver rejects its initial allocation
# and Docker did not OOM-kill it.
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
# Restart the container once if the CUDA driver rejects its initial allocation
# and Docker did not OOM-kill it.
spark_uma: true
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
# Restart the container once if the CUDA driver rejects its initial allocation
# and Docker did not OOM-kill it.
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