steep-balloon-41261
02/16/2026, 11:03 AMtall-airline-16756
02/16/2026, 11:03 AMtall-airline-16756
02/16/2026, 11:03 AMcuddly-vr-85751
02/16/2026, 11:04 AMcuddly-vr-85751
02/16/2026, 11:04 AMtall-airline-16756
02/16/2026, 11:04 AMcuddly-vr-85751
02/16/2026, 11:04 AMtall-airline-16756
02/16/2026, 11:05 AMLiveKitService.createDispatch, does the worker log show it received the dispatch, connected to the room, and started the session? Any error trace or warnings are important.
1. Confirmation the dispatch call succeeded.
◦ Did LiveKitService.createDispatch(room_name, "chat-agent", ...) return without error? Any response or exception from that call?
1. Do you see the agent as a participant in the room?
◦ Check the LiveKit dashboard or participant list. If the agent isn’t joining, that explains no replies.
1. How are messages sent from the user?
◦ Are you using the built-in Chat component from the LiveKit React SDK (which uses localParticipant.sendText) or a custom send? If custom, paste the send code.
1. Agent/room configuration snippets (if changed):
◦ Any RoomOptions/RoomInputOptions you set, or did you rely on defaults? Confirm dispatch name matches agent_name="chat-agent" in the worker and your createDispatch call uses "chat-agent".
1. Versions you’re using:
◦ livekit-js (React SDK) version and livekit-agents package + Python SDK version.
What I’ll check once you provide logs:
• If the dispatch never reaches the worker, we’ll see that in your backend or agent logs.
• If the worker receives the dispatch but the agent fails to join, the agent logs will show connection/auth errors.
• If the agent joins but doesn’t reply, we’ll inspect agent lifecycle hooks and whether text input is enabled (text input is enabled by default, but confirm you didn’t disable it in session/room options).
• If the frontend sends messages but they’re not delivered, the browser logs or network trace will show it.
If you paste console logs and the relevant agent worker logs (just the lines around the time you press Connect and send a message), I’ll pinpoint the next steps and provide exact fixes.cuddly-vr-85751
02/16/2026, 11:05 AMtall-airline-16756
02/16/2026, 11:06 AMagent_name or the worker identity)? If you don’t see the agent as a participant, the agent never connected.
1. Agent / worker logs (most important)
◦ From the Python worker process that runs your ChatAgent, copy the logs for the timeframe when you clicked Connect and sent the two “hi” messages. Look for lines showing:
▪︎ Received dispatch or dispatch accepted
▪︎ Worker connecting to LiveKit (success or error)
▪︎ Session start or any exceptions
◦ Paste any error traces or warnings you find.
1. Frontend console logs and network status
◦ Open the browser console, click Connect, then send a chat message. Copy any console errors/warnings.
◦ In the browser devtools Network / WS tab, check the WebSocket connection to LiveKit — is it open (status 101) or closed/errored? Any HTTP 4xx/5xx responses when requesting the token or connecting?
1. Verify dispatch call returned success
◦ Did your backend call to LiveKitService.createDispatch(room_name, "chat-agent", ...) succeed (no exception)? Share the response or server log around that API call.
1. Confirm agent session config
◦ In your Python snippet you used:
▪︎ session = AgentSession(llm=agent.llm, stt=None, tts=None)
▪︎ Confirm AgentSession.start(...) completed without error in the worker logs.
◦ Also confirm the worker was started with agent_name="chat-agent" (your dispatch must match this exactly).
1. How messages are sent from the frontend
◦ Are you using the LiveKit React Chat component (the built-in <Chat />) or custom code to send messages? If custom, paste the send snippet (e.g., call to localParticipant.sendText(...)).
What I’ll check once you paste logs or answers:
• If there’s no agent participant, we’ll focus on dispatch/token/auth issues.
• If the agent joined but logs show no incoming chat events, we’ll verify room input is enabled and the agent’s lifecycle hooks (entrypoint, on_user_turn) are running.
• If the agent received messages but didn’t respond, I’ll help inspect the agent code/LLM call and confirm text output is being sent.
If you paste:
• The worker logs (around connect/dispatch),
• A short copy of the browser console around connect/send,
• And confirm whether the agent appears as a participant —
I’ll give exact next steps and a likely fix.cuddly-vr-85751
02/16/2026, 11:09 AMcuddly-vr-85751
02/16/2026, 11:09 AMtall-airline-16756
02/16/2026, 11:10 AMstt=None / tts=None. That prevents the agent from being configured strictly as a text-only responder.
• The frontend must send user chat messages on the lk.chat topic and the client must listen for the agent’s replies (which the SDK delivers via text streams such as lk.transcription).
• Dispatch name and worker agent_name must match exactly so the worker actually joins the room.
Minimal corrected text-only ChatAgent (Python)
• This example explicitly disables audio and enables text I/O when starting the session.
from dotenv import load_dotenv
import logging
from livekit.agents import Agent, AgentSession, JobContext, WorkerOptions, cli, room_io
from livekit.plugins import openai
load_dotenv()
logger = logging.getLogger("chat-agent")
logger.setLevel(<http://logging.INFO|logging.INFO>)
class ChatAgent(Agent):
def __init__(self):
super().__init__(
instructions="You are a helpful text-only chat assistant.",
llm=openai.LLM(model="gpt-4o-mini"),
)
async def entrypoint(ctx: JobContext):
<http://logger.info|logger.info>(f"Entrypoint starting for room: {ctx.room.name}")
await ctx.connect()
agent = ChatAgent()
session = AgentSession(
llm=agent.llm,
stt=None, # no speech-to-text
tts=None, # no text-to-speech
)
# IMPORTANT: explicitly set RoomOptions for text-only
await session.start(
agent=agent,
room=ctx.room,
room_options=room_io.RoomOptions(
audio_input=False, # disable mic publishing
audio_output=False, # disable TTS/audio output
text_input=True, # enable text input
text_output=True, # enable text output
),
)
<http://logger.info|logger.info>("Text-only agent session started")
def run():
cli.run_app(
WorkerOptions(
entrypoint_fnc=entrypoint,
agent_name="chat-agent", # must match createDispatch() target
port=8084,
)
)
if __name__ == "__main__":
run()
Frontend: send and receive text correctly
• Sending text (example using livekit-js / room API):
// send a message to the room on the chat topic
await room.localParticipant.sendText("hi", { topic: "lk.chat" });
• Receiving agent replies (listen to transcription/text streams):
room.registerTextStreamHandler("lk.transcription", async (reader, participantInfo) => {
const text = await reader.readAll();
console.log("Agent reply:", text);
});
Important checks (quick)
• Confirm your backend call to createDispatch uses the exact agent name: "chat-agent".
• Verify the worker logs: when you call createDispatch you should see the worker accept the dispatch and then log connection / "session started" messages.
• Confirm the agent appears as a participant in the room (check participant list or LiveKit dashboard).
• Confirm the frontend actually calls sendText(..., { topic: "lk.chat" }) and not a different topic.
• Ensure your client listens to lk.transcription (or registered text streams) to show the agent’s reply; the Playgrounds may not surface text-only replies.
If it still doesn’t reply — what to paste here
• The worker logs (lines around dispatch handling, session.start, and any exceptions).
• A short browser console log around when you click Connect and send a chat (any errors or warnings).
• Confirmation whether the agent shows up in the room participant list after dispatch.
• The exact createDispatch(...) call or server log response.
If you paste those logs I’ll pinpoint the failure (dispatch/auth, agent joining, text stream routing, or LLM error) and give exact next steps.
Sources: Agent session | LiveKit Documentation | Text and transcriptions | LiveKit Documentation | How to Set Up Speech-to-Text Input with Text-Only Output in LiveKit Agents | How to build an agent with speech-to-text input and text-only output | Live...cuddly-vr-85751
02/16/2026, 11:12 AMtall-airline-16756
02/16/2026, 11:13 AMstt=None and tts=None disables STT/TTS pipelines but does NOT automatically disable audio tracks. Audio is enabled by default and can keep the agent from operating as a pure text responder. You must explicitly disable audio input/output when starting the session.
• The frontend must send text on the lk.chat topic (the Chat component does this) and must listen for agent replies (sent as text streams such as lk.transcription).
• Dispatch name (createDispatch target) must exactly match the worker’s agent_name.
Minimal corrected text-only ChatAgent (Python)
• This explicitly disables audio and enables text I/O when starting the session.
from dotenv import load_dotenv
import logging
from livekit.agents import Agent, AgentSession, JobContext, WorkerOptions, cli, room_io
from livekit.plugins import openai
load_dotenv()
logger = logging.getLogger("chat-agent")
logger.setLevel(<http://logging.INFO|logging.INFO>)
class ChatAgent(Agent):
def __init__(self):
super().__init__(
instructions="You are a helpful text-only chat assistant.",
llm=openai.LLM(model="gpt-4o-mini"),
)
async def entrypoint(ctx: JobContext):
<http://logger.info|logger.info>(f"Entrypoint for room: {ctx.room.name}")
await ctx.connect()
agent = ChatAgent()
session = AgentSession(
llm=agent.llm,
stt=None,
tts=None,
)
# IMPORTANT: explicitly force text-only room options
await session.start(
agent=agent,
room=ctx.room,
room_options=room_io.RoomOptions(
audio_input=False, # disable publishing mic / STT path
audio_output=False, # disable TTS/audio output
text_input=True, # enable text input from users
text_output=True, # enable text output from agent
),
)
<http://logger.info|logger.info>("Text-only agent session started")
def run():
cli.run_app(
WorkerOptions(
entrypoint_fnc=entrypoint,
agent_name="chat-agent", # must match createDispatch target
port=8084,
)
)
if __name__ == "__main__":
run()
Frontend: what to send and what to listen for
• If you use the LiveKit React Chat component it will send user messages with topic lk.chat automatically.
• If you send messages yourself, use:
◦ await room.localParticipant.sendText("hi", { topic: "lk.chat" });
• To receive agent replies, listen for the transcription/text stream (agent responses are published as text streams like lk.transcription):
room.registerTextStreamHandler("lk.transcription", async (reader, participantInfo) => {
const text = await reader.readAll();
console.log("Agent reply:", text);
});
Note: the LiveKit playground may not show text-only replies; use the React Chat component or a custom listener as above.
Checklist / Diagnostics to run right now
1. Confirm your worker logs show the dispatch accepted and "Text-only agent session started".
2. Confirm the agent appears as a participant in the room after createDispatch.
3. Confirm your createDispatch call used the exact agent name "chat-agent".
4. In browser console, confirm:
◦ token request succeeded (no 4xx/5xx)
◦ WebSocket to LiveKit is open (101)
◦ No CORS / auth errors
1. Confirm you can send text from the client:
◦ If using Chat component, type & send — check network or console to see a sendText event.
◦ If custom, ensure you call sendText(..., { topic: "lk.chat" }).
1. Paste these logs if it still fails:
◦ Worker log lines around dispatch & session.start
◦ Browser console logs around connect/send
◦ Whether the agent participant is visible in the room
If you share the worker logs for the dispatch attempt and a short browser console capture when you press Connect and send “hi”, I’ll pinpoint whether the dispatch never reached the worker, the worker failed to join, the agent started but didn’t receive chat events, or the replies are being published but not shown by the frontend — and I’ll give exact next steps.
Sources: How to build an agent with speech-to-text input and text-only output | Live... | Text and transcriptions | LiveKit Documentation