packages/qwen-live/README.md
Standalone Live voice daemon: a realtime voice control plane that orchestrates coding sessions through voice.
qwen-live connects three parties:
~/.qwen/live/daemon.json for discovery, so an
already-installed Host connects automatically.qwen-omni realtime) that owns the
conversation: VAD, direct answers, and a tool surface for dispatching work
to coding sessions.BackendAdaptor. Two adaptors are available:
one drives qwen serve over REST/SSE, and one spawns any ACP-compatible
agent (qwen --acp, qodercli --acp, gemini --acp, etc.) as a child
process over JSON-RPC stdio. Multiple backends can coexist with per-session
routing.The live session itself is fully owned by this daemon (JSONL logs under
~/.qwen-live/sessions/); backend sessions are ordinary coding sessions
that keep running after a call ends.
# From the qwen-code monorepo
cd qwen-code
npm install && npm run build
node packages/qwen-live/dist/index.js init
The wizard will:
When done, it writes ~/.qwen-live/config.json and tells you to run
qwen-live to start.
qwen-live
# → qwen-live listening on http://127.0.0.1:<port>
On macOS, open the Live Host app — it reads the discovery file and connects automatically. Press the global shortcut to start a voice call.
On other platforms: the Live Host app is macOS-only (it needs native microphone, global shortcut, and screen capture). Linux/Windows users cannot use voice features until a Host is available on their platform.
Configuration comes from ~/.qwen-live/config.json (generated by init),
with environment variables (DASHSCOPE_API_KEY, QWEN_LIVE_*) as overrides.
{
"realtimeApiKey": "sk-...",
"defaultCwd": "~/work/my-project",
"backends": [
{
"name": "qodercli",
"kind": "acp",
"command": "/usr/local/bin/qodercli",
"args": ["--acp"],
"default": true,
},
{
"name": "qwen",
"kind": "acp",
"command": "/usr/bin/qwen",
"args": ["--acp"],
},
],
}
See src/config.ts for the full list of options and validation rules.
| Backend | Kind | ACP entry | Notes |
|---|---|---|---|
| Qoder CLI | acp | qodercli --acp | Hidden flag; uses Qoder's own login |
| Qwen Code | acp | qwen --acp | Native ACP mode |
| Gemini CLI | acp | gemini --experimental-acp | Official ACP support |
| Claude Code | acp | npx @agentclientprotocol/claude-agent-acp | Adapter-based |
| Codex | acp | npx @agentclientprotocol/codex-acp | Adapter-based |
| qwen serve | qwen-code | REST/SSE to qwen serve daemon | Legacy; no ACP needed |
Multiple backends can coexist — the voice model sees all sessions across
all backends in session_list and can route handoff to a specific one by
name.
The Live Host installer is built in. On macOS, qwen-live init checks if
the Host is installed and offers to download and install it (sha256 +
codesign + team identifier verification). The daemon also exposes HTTP
endpoints behind its Bearer token:
TOKEN=$(jq -r .token ~/.qwen/live/daemon.json)
PORT=$(jq -r .url ~/.qwen/live/daemon.json | sed 's/.*://')
curl -H "authorization: Bearer $TOKEN" "http://127.0.0.1:$PORT/live/setup"
The daemon speaks Live Host protocol v7, which adds playback receipts:
the Host app sends host.playback_started and host.playback_completed
messages when audio actually starts and finishes playing. The injector uses
these real signals instead of estimating playback duration from byte counts.
A v6 Host still connects (the daemon falls back to a simpler playback model without byte estimation), but v7 is required for the full "dual-barrier delivery confirmation" described in the roadmap.
Incubating inside the qwen-code monorepo, tracking M1–M5 of the Live split roadmap (issue #10118):
qwen-live init wizard