steep-balloon-41261
02/17/2026, 5:19 PMtall-airline-16756
02/17/2026, 5:19 PMtall-airline-16756
02/17/2026, 5:19 PMagents: [{ agentName: "your-agent-name" }]). If no dispatch, the worker will never be sent jobs even though it’s registered.
1. Check Agent Insights / session traces
◦ Open the Agent Insights or the session trace for the room attempt and look for dispatch attempts, timeouts, or errors when assigning a job to the worker.
1. Verify agent name & availability
◦ Ensure the agent name in your deployment matches the dispatch target. Your logs show one worker registered, but confirm it’s the correct agent_name.
1. Confirm client-side connectivity
◦ Run the LiveKit Connection Test:
▪︎ WebSocket, WebRTC, and TURN checks.
◦ If any test fails, the problem is client network/firewall related (not the agent itself).
1. Look for client error messages
◦ When connecting the client, capture the exact client-side error (browser console logs or SDK error). Examples to share: ICE failures, TURN errors, or signaling/WS connection errors.
1. Network / firewall / proxy issues
◦ Production environments often have different egress/ingress rules. Check for:
▪︎ Blocked ports (WebRTC/UDP, TURN)
▪︎ Corporate proxies / DPI (ZScaler can block WebRTC) — if present, try bypass rules for LiveKit domains.
1. Address the memory warnings
◦ High memory usage can cause the worker to not accept or process jobs reliably. Consider:
▪︎ Reducing concurrency per instance
▪︎ Deploying an additional worker for HA
▪︎ Deploying a minimal agent build to test whether memory usage is the cause
What I need from you to continue troubleshooting
• The dispatch method you use (token-based agent grant, room configuration, or other).
• Any client-side error text (browser console or SDK logs) when trying to connect.
• Whether the agent name in your deployment matches the name used in dispatch.
• Whether you’ve tested connectivity with the LiveKit Connection Test and the results.
If you share the client error and dispatch method, I’ll suggest targeted checks and next steps (e.g., sample token payload to verify agent grant, what to look for in Agent Insights, or network rules to open).
Sources: Voice AI quickstart | LiveKit Documentation | server-sdk-go | livekit/livekit_composite | DeepWiki | Diagnosing Connection Errors with the Connection Test Utility | LiveKit | Configure ZScaler proxy for LiveKit connections | LiveKit | Streamline troubleshooting with Agent Observabilitytall-airline-16756
02/17/2026, 5:24 PMagent: true or an agents field in the room payload (paste the token payload or room creation snippet), or
◦ another dispatch method (name it).
1. Result of the LiveKit Connection Test (if you ran it): which checks failed — WebSocket, WebRTC, or TURN?
If you can’t copy logs, tell me whether:
• The client establishes a WebSocket/signaling connection (sign of signaling working), or
• The client fails immediately with ICE/TURN errors (sign of NAT/firewall).
With those three items I’ll give the exact next steps (token snippet to check, what to change in network rules, or a minimal test to isolate the issue).tall-airline-16756
02/17/2026, 5:27 PMtall-airline-16756
02/17/2026, 5:28 PMtall-airline-16756
02/17/2026, 5:32 PMiceTransportPolicy: 'relay' in the client's RTC config and retry joining.
Why I’m asking
• Transcription proving the agent receives audio narrows the problem to client-side signaling/ICE/TURN or token/join completion. If there truly are no errors visible, ICE/DTLS may be failing silently (common with NAT/relay issues or mobile WebRTC stacks). Forcing TURN (relay) or running the Connection Test will expose that.
Immediate, high-value checks you can run now
• Run Connection Test from a failing client and paste results.
• Enable iceTransportPolicy: 'relay' and try again. If that fixes it, the problem is UDP/NAT/TURN access.
• Paste the client join logs (even if they look empty). I’ll translate them into an exact one-line fix.
If you prefer I can give the most likely single change to try first: set iceTransportPolicy: 'relay' and test. Tell me the result and I’ll give the next exact step.
Sources: Firewall Tips for LiveKit Connectivity | LiveKit | Diagnosing Connection Errors with Connection Test Utilitytall-airline-16756
02/17/2026, 5:33 PMroom.connect(url, token, {
rtcConfig: { iceTransportPolicy: 'relay' }
});
If this fixes it, UDP/NAT traversal is the issue and the fix is to ensure TURN reachability or keep relay for affected networks.
2) Run the LiveKit Connection Test from a failing client/network
• Tell me which checks fail: WebSocket, WebRTC (ICE), or TURN. That identifies whether signaling or media relay is blocked.
3) Check the client-side join flow and logs
• Even if “no error” is obvious, confirm the SDK emits a join result. Add:
room.on('connected', () => console.log('joined'));
room.on('disconnected', (r) => console.log('disconnected', r));
room.on('connectionFailed', (e) => console.log('conn failed', e));
Paste any console output you get — even “no event” is useful.
4) Verify token usage & room name
• Confirm the client uses the fresh token you generate and that the room in the token exactly matches the room you try to join (case-sensitive). A stale or wrong token often fails silently.
5) Quick production-host checks (if you can run them)
• From the production host or client environment try a websocket probe to your LiveKit URL (wss://...). If it fails, signaling is blocked. If it succeeds, the problem is media (ICE/TURN).
If you don’t want to run all tests: do step 1 (force relay). Report back the result (works / still fails) and the Connection Test outcome. With that single result I’ll give the exact one-line change you need (open firewall domain, switch TURN settings, or token fix).
Sources: Diagnosing Connection Errors with the Connection Test Utility | LiveKit | Firewall Tips for LiveKit Connectivity | LiveKit | Configure ZScaler proxy for LiveKit connections | LiveKit | server-sdk-js | livekit/livekit_composite | DeepWiki | client-sdk-js | livekit/livekit_composite | DeepWikitall-airline-16756
02/17/2026, 5:42 PMroom.connect(url, token, {
rtcConfig: { iceTransportPolicy: 'relay' }
});
• Retry on the same Expo device/network. If this fixes it, the problem is UDP/NAT traversal and TURN must be reachable from your clients.
2) Run the LiveKit Connection Test from the Expo device/network
• Open https://livekit.io/connection-test on the same device (or run the ConnectionChecker if you have an SDK wrapper).
• Tell me which checks fail: WebSocket, WebRTC (ICE), or TURN.
3) Capture minimal client-side logs in Expo
• Add these handlers and paste any output you get (or say “no output”):
room.on('connected', () => console.log('joined'));
room.on('disconnected', (r) => console.log('disconnected', r));
room.on('connectionFailed', (e) => console.log('conn failed', e));
console.log('ws', navigator && navigator.userAgent);
• Also check Expo/React Native console for WebRTC-related warnings (ICE/DTLS).
4) Quick network checks
• Test the Expo device on a different network (phone hotspot). If it works on hotspot, the issue is network-level blocking on original network.
• Ensure TCP/443 to *.turn.livekit.cloud and *.livekit.cloud is allowed.
If none of the above helps, give me these three items and I’ll provide an exact one-line change:
• The Connection Test results (which checks passed/failed).
• The small Expo logs from step 3 (or confirm “no events emitted”).
• Whether forcing iceTransportPolicy: 'relay' changed anything (works / still fails).
I’ll stay focused: once you share those results I’ll give the precise fix (network rule, TURN configuration, or token change) — no extra fluff.
Sources: Firewall Tips for LiveKit Connectivity | LiveKit | Diagnosing Connection Errors with Connection Test Utilitytall-airline-16756
02/17/2026, 5:46 PMparticipantConnected. That means signaling, dispatch, and agent join are working. Let’s narrow what still fails.
Tell me which of these describes your situation now (pick one or paste short logs):
• Clients join the room but cannot publish audio (others don’t hear you).
• Clients join but don’t receive other participants’ audio (no ontrack/playback).
• You join and see agent transcription, but the client UI never shows "joined" or usable audio (despite participantConnected).
• You see errors when trying to publish or subscribe (paste the exact error).
• Everything looks joined but no media flows and no ICE/TURN errors in console.
If you’re not sure, add these two quick checks and paste results:
1) On the Expo client, force relay and retry — did it change anything?
room.connect(url, token, { rtcConfig: { iceTransportPolicy: 'relay' }});
2) Add brief logging in the client for media events and permission/state:
room.on('connected', () => console.log('SDK: connected'));
room.on('participantConnected', p => console.log('SDK: participantConnected', p.identity, p.kind));
room.on('trackPublished', (p,t) => console.log('trackPublished', p.identity, t.source));
room.on('trackSubscribed', (p,t) => console.log('trackSubscribed', p.identity, t.kind));
room.on('subscriptionError', (err) => console.log('subscriptionError', err));
What I’ll do when you reply:
• If publish/subscribe errors appear, I’ll give the exact one-line fix (TURN whitelist, token grant, or permission change).
• If relay fixes it, I’ll show how to make TURN reliable for Expo clients.
• If no change and no errors, I’ll guide you through a minimal reproducible test to isolate Expo/WebRTC behavior.
Paste the one result (which case above) plus the outcome of forcing iceTransportPolicy: 'relay' and I’ll give the precise next step.tall-airline-16756
02/17/2026, 5:48 PMontrack appears, and you forced iceTransportPolicy: 'relay'. That tells me signaling, ICE, and track negotiation are completing. So we need to pin down what "still nothing" means and check a few final items.
Quick checklist — tell me the result for each (one-line answers):
1) Can you hear any audio at all from other participants on the Expo device? (yes / no) 2) When you speak, do others hear you? (yes / no) 3) Do you see any published tracks in the UI (trackPublished / participant list)? (yes / no) 4) Any browser/Expo console warnings about autoplay, audio focus, or permissions? (paste if present) 5) Does ontrack carry audio that you can attach to an <Audio> component? Are you rendering/playing the received track? (describe how you consume tracks)
If the answers above are mostly "no" (no audio in/out) try these two immediate checks:
A) Explicitly subscribe and play the remote audio:
• When room.on('trackSubscribed', (participant, track) => ...) fires, ensure you attach the track to playback. For React Native / rn-webrtc you may need to create an audio element or use the SDK's playback helpers. Log when track becomes Subscribed and when playback starts.
B) Confirm local mic publish success:
• After connecting, call room.localParticipant.publishTrack(localAudioTrack) and log the publish result and any publicationFailed or trackPublished events.
If you prefer a direct test now:
• Paste the outputs of these two event logs (exact lines):
◦ room.on('trackSubscribed', (p, t) => console.log('trackSubscribed', p.identity, t.source, t.kind));
◦ room.localParticipant.on('trackPublished', pub => console.log('published', pub.track?.source, pub.track?.kind));
This will show whether tracks are actually subscribed/published at the SDK layer.
One more important Expo note:
• Mobile OS or Expo may mute autoplayed audio or require a user interaction to start audio output. If you haven’t requested audio focus or triggered a user interaction before playing tracks, the audio may be blocked silently. Try a tap-to-play action that starts audio playback, then see if remote audio plays.
Send the five checklist answers and/or the two event logs and I’ll give the exact one-line change (playback hook, permission, or publish fix).tall-airline-16756
02/17/2026, 5:49 PM