Quickstart
Start NeMo Labs Voice Agent and talk to it in a browser. This quickstart launches vLLM, the agent server, and the web client, then verifies the browser-to-agent connection.
Prerequisites
Before you begin, prepare the installed project and the terminal sessions used by its three services:
- Complete Prerequisites and Installation.
- Verify that you can activate the project environment with
source .venv/bin/activate. - Open three terminals: one for vLLM, one for the agent server, and one for the web client.
Quickstart Steps
Complete these four steps in order to start the services and connect from the browser.
Start vLLM Yourself
This is the most common first-run failure. The shipped default large language model (LLM) configuration
(examples/generic_voice_agent/server/server_configs/llm_configs/nemotron_nano_v3.yaml) sets
start_vllm_on_init: false. As a result, python server.py does not start a model. The agent server starts
and then fails to reach the OpenAI-compatible endpoint at http://localhost:8000/v1.
In the first terminal, serve the default model with the flags from that file’s vllm_server_params. The
YAML file is the authoritative source if this example differs from the current configuration:
Wait until the vLLM logs confirm that it is serving before continuing. To let the agent server launch vLLM,
set start_vllm_on_init: true in the model configuration. Refer to
Serving with vLLM.
The model sub-YAML overrides default.yaml, not the other way around. This override changes
default.yaml’s llm.type: auto to vllm at runtime. For details, refer to
Server configuration.
Start the Agent Server
In the second terminal:
On first startup, the server downloads weights from Hugging Face. It loads automatic speech recognition (ASR), diarization, text-to-speech (TTS), and the vLLM client. It runs until you press Ctrl+C.
examples/generic_voice_agent/server/server.py reads the following environment variables. The server loads
a .env file from the working directory, and its values take precedence over the shell environment:
The Hugging Face libraries honor HF_TOKEN and HF_HUB_CACHE if you need a gated model or a custom cache
location. For the complete list, refer to Environment Variables.
How the Two Ports Fit Together
The browser uses two ports. Confusing their roles is the second-most-common first-run problem.
- The client sends a POST request to
http://<server-host>:7860/connect(FastAPI). The handler innemo_voice_agent/pipecat/bot_server.pyreturns a JSON body with a singlews_urlkey. - That URL is assembled by
build_websocket_urlinnemo_voice_agent/utils/websocket_url.pyfromWEBSOCKET_SCHEME,SERVER_PUBLIC_HOST, andWEBSOCKET_PORT. With the defaults, the URL isws://127.0.0.1:8765. - The client then opens that WebSocket and all audio flows over port 8765. Port 7860 is not used again.
SERVER_PUBLIC_HOST must be reachable from the browser, not only from the server. If you browse from
another machine, 127.0.0.1 produces a successful /connect request followed by a WebSocket connection
failure. Export the server machine’s hostname or IP before starting the server:
The client derives its own base URL from the browser address bar, so
examples/generic_voice_agent/client/src/app.ts needs no edit for remote access.
The server supports one client at a time. While a client is connected, the transport rejects another
connection with WebSocket close code 1013 and keeps the active client. A different client can connect
after the active client disconnects.
Start the Web Client
In the third terminal, on the server machine:
Vite prints its listening address. It binds 0.0.0.0:5173 by default. If port 5173 is unavailable, change
the port value in examples/generic_voice_agent/client/vite.config.js.
Connect From the Browser
Open http://<your-machine-ip>:5173/ (or whatever Vite printed).
Microphone capture requires a secure context. In Chrome, add that exact origin to
chrome://flags/#unsafely-treat-insecure-origin-as-secure and restart the browser. Otherwise, the
Connect button fails when it requests microphone access.
Leave the Server dropdown on WebSocket Server. This option points to /connect on port 7860.
Then press Connect and grant microphone permission. The bot speaks first: the server queues an initial
LLM run when the client reports ready. You hear the greeting from the system prompt in default.yaml:
“Hi, I’m Lisa, your helpful AI assistant…” Start talking after the greeting finishes.
If a service does not start or the browser cannot connect, use Troubleshooting to diagnose the symptom.
Controls
Use the browser controls to manage the active session and inspect its state:
Next Steps
After the first browser session works, explore the pipeline design, configuration, tools, or evaluation workflow: