microscopic-gold-81132
04/13/2026, 12:36 PMrequest_fnc setup for our Agent Server that can purposely reject a job
2. We believe this mechanism worked before as expected - if we have multiple workers running with the same agent_name and the first worker rejects the job, it is offered to the next worker
3. Today we discovered it no longer seems to work that way, after rejecting a job it is not offered to another worker
Could this be related to a recent change in the retry dispatch behavior that we are not aware of?tall-airline-16756
04/13/2026, 12:36 PMtall-airline-16756
04/13/2026, 12:37 PMrequest_fnc (e.g., req.reject()) should cause the job to be reassigned to another active worker with the same agent_name.
• There are no documented changes that would change retry/redispatch behavior; rejected jobs are expected to be resent to other available agents.
• The rejection/redispatch behavior requires explicit dispatch mode and that multiple workers are actively registered with the same agent_name.
To help diagnose, please tell me:
1. The SDK version(s) your agent workers are running.
2. Whether all workers use the same agent_name and are confirmed active at the time of rejection.
3. A short reproduction pattern (steps you take, code snippet of request_fnc reject logic, and any error logs or dispatcher logs you see).
With that I can suggest targeted checks (logs to inspect and config flags) or reproduce and pinpoint whether this is a version-specific bug.
Sources: Server options | LiveKit Documentation | Agents Framework | livekit/livekit_composite | DeepWiki | Agent dispatch | LiveKit Documentation | Avoiding crosstalk when multiple developers share a LiveKit project | LiveK..., with interactive elementsmicroscopic-gold-81132
04/13/2026, 12:38 PMlivekit-agents==1.5.2
Here's minimalist example:
main_accepts.py:
from livekit import agents
from livekit.agents import AgentServer, JobRequest, WorkerOptions, WorkerType
server = AgentServer()
async def request_fnc(req: JobRequest) -> None: # noqa: D103
print("✅ Accepting job") # noqa: T201
await req.accept()
async def entrypoint(ctx: agents.JobContext) -> None: # noqa: D103
await ctx.connect()
print("👌 Joined the room") # noqa: T201
ctx.shutdown()
if __name__ == "__main__":
agents.cli.run_app(
WorkerOptions(
agent_name="test-redispatch",
entrypoint_fnc=entrypoint,
request_fnc=request_fnc,
worker_type=WorkerType.ROOM,
shutdown_process_timeout=80,
drain_timeout=120,
port=8077,
)
)
main_rejects.py:
from livekit import agents
from livekit.agents import AgentServer, JobRequest, WorkerOptions, WorkerType
server = AgentServer()
async def request_fnc(req: JobRequest) -> None: # noqa: D103
print("❌ Rejecting job") # noqa: T201
await req.reject()
async def entrypoint(ctx: agents.JobContext) -> None: # noqa: D103
await ctx.connect()
print("THIS SHOULD NOT BE PRINTED") # noqa: T201
ctx.shutdown()
if __name__ == "__main__":
agents.cli.run_app(
WorkerOptions(
agent_name="test-redispatch",
entrypoint_fnc=entrypoint,
request_fnc=request_fnc,
worker_type=WorkerType.ROOM,
shutdown_process_timeout=80,
drain_timeout=120,
port=8076,
)
)
The repro setup:
1. you run both main_accepts.py and main_rejects.py in a separate terminal
2. you try to dispatch a couple of "test-redispatch" agents
Expectation: If main_rejects.py worker rejects the work, it is offered to main_accepts.py
Observation: If main_rejects.py worker rejects the work, it is droppedtall-airline-16756
04/13/2026, 12:39 PMagent_name on livekit-agents==1.5.2.
Short answer:
• Calling await req.reject() drops the job; LiveKit does not automatically redispatch rejected jobs to other workers in the same agent_name pool.
• This is the current, intended dispatch behavior and has not changed in recent SDK releases (including 1.5.2).
What you can do next:
• If you need fallback for transient conditions, avoid using reject() for recoverable cases. Accept the job and handle failure/retry inside the job lifecycle.
• Or implement application-level retry/redispatch (e.g., requeue the job externally) so another worker can receive it.
• If useful, I can show patterns for in-job retry handling or a simple requeue example—which would you prefer? Sources: Agent dispatch | LiveKit Documentation | examples/bank-ivr | livekit/livekit_composite | DeepWiki, with interactive elementsmicroscopic-gold-81132
04/13/2026, 12:41 PMCallingCan you point me to the docs that say this is the way it behaves verbatim?drops the job; LiveKit does not automatically redispatch rejected jobs to other workers in the sameawait req.reject()pool.agent_name
tall-airline-16756
04/13/2026, 12:42 PMagent_name.”
Short answer:
• There is no single verbatim sentence in the docs that states that exact phrasing.
• The docs do state how the request/dispatch flow works (accept vs. reject) and explain dispatch routing; combined, they imply that a rejection hands the request to the next available agent and that there is no guaranteed retry loop if no agent accepts.
Relevant documentation pages (closest authoritative text):
• Server options — Request handler: https://docs.livekit.io/agents/server/options/#request-handler
(Describes that the request handler must accept or reject and that accepted requests call the entrypoint.)
• Agent dispatch: https://docs.livekit.io/agents/server/agent-dispatch/
(Describes routing and availability-based dispatching.)
• Job lifecycle: https://docs.livekit.io/agents/server/job/
(Describes job handling and lifecycle around accept/reject.)
If you’d like, I can:
• Pull the exact excerpts from those pages and paste them here, or
• Draft suggested doc wording you could use internally to clarify behavior, or
• Propose a small code pattern to implement external requeueing if you need guaranteed redispatch. Which would help you most? Sources: Server options | LiveKit Documentation | Agent dispatch | LiveKit Documentation | Job lifecycle | LiveKit Documentation, with interactive elementsmicroscopic-gold-81132
04/13/2026, 1:23 PM1.3.7 and you have to supply job.reject(terminate=False) to get the redispatch behavior enabled.
The docs here: https://docs.livekit.io/agents/server/options/#request-handler are outdated.
Here's the code before the change (redispatch by default):
https://github.com/livekit/agents/blob/a115d6d139428fd00d3fb60411f64d1c1343fda0/livekit-agents/livekit/agents/job.py#L688
Here's the code after the change (no redispatch unless terminate=False):
https://github.com/livekit/agents/blob/livekit-agents%401.3.12/livekit-agents/livekit/agents/job.py#L688tall-airline-16756
04/13/2026, 1:23 PMawait req.reject() will terminate the job. To get redispatch you must call await req.reject(terminate=False).
Docs status: the request-handler docs are outdated and don't reflect this change. The behavior and mitigation you described (use terminate=False) match the current SDK behavior.
If you want, I can:
• Paste the exact doc snippets and the two GitHub lines you cited, or
• Suggest a short code change pattern to preserve redispatch across your workers (example: wrap reject(terminate=False) in your request_fnc with logging), or
• Draft suggested doc text you can paste into an issue/PR to update the docs.
Which would you prefer?
Sources: Server options | LiveKit Documentation | Deployment reliability on LiveKit Cloud | LiveKit | Agent dispatch | LiveKit Documentation | Server lifecycle | LiveKit Documentation | Agents Framework | livekit/livekit_composite | DeepWiki, with interactive elements