You're on the hosted UI in Chrome on your Mac. The agent runs in another browser tab on the same Mac. Three steps:
-
Install BlackHole 2ch + 16ch, then reboot.
brew install blackhole-2ch blackhole-16ch
Why: these are virtual audio cables. BlackHole 2ch is the wire the page uses to push turn audio into the agent's mic; BlackHole 16ch is the wire the page listens on for the agent's TTS reply (so we can time when it starts).
-
Create a Multi-Output Device that combines BlackHole 16ch + your real speakers, and set it as the Mac's system audio output.
Open Audio MIDI Setup → + in the bottom-left → Create Multi-Output Device → tick BlackHole 16ch + your speakers. Then System Settings → Sound → Output → pick that Multi-Output Device.
Why: whatever the agent tab plays out goes to the system output. We need it to hit BlackHole 16ch (so the page hears the response) and your real speakers (so you hear it too) — a Multi-Output Device sends one stream to both at once.
-
Open the agent under test in another browser tab, set its microphone to BlackHole 2ch, then come back here and hit Run All.
In the agent's tab: address-bar permissions icon → Site settings → Microphone → BlackHole 2ch. Back in this tab, the three device slots below should already auto-pick BlackHole 2ch / your speakers / BlackHole 16ch — click Grant mic access in the Audio Devices panel the first time so the labels appear.
Why: the agent listens to whatever you put in Output 1 (to agent under test); for this loopback to work, the agent has to be reading from the same wire — BlackHole 2ch on both sides.
Quick sanity check before Run All: the live amplitude meter under Input should jump and go green past the yellow VAD threshold the moment the agent speaks. If it stays flat, the page isn't hearing the agent — re-check step 2 and that the system output is actually the Multi-Output Device.
External agent (phone, another laptop, hardware)? Skip step 2 entirely. Set Output 1 to your real speakers (crank volume), Input to your built-in mic. The agent listens to the room, the page listens to the room mic.
Browser: Chrome / Edge / Opera / Brave only. Firefox and Safari can't pick the output device (setSinkId) and will fall back to system default.