kind-iron-94532
08/03/2025, 3:45 AM2025-08-03 08:57:22,407 - DEBUG livekit.agents - received user transcript {"user_transcript": "No. We are just checking.", "language": "en", "pid": 10359, "job_id": "AJ_YWXovKTPLDET"}
2025-08-03 08:57:22,533 - DEBUG livekit.agents - received user transcript {"user_transcript": "First. Good.", "language": "en", "pid": 10359, "job_id": "AJ_YWXovKTPLDET"}
2025-08-03 08:57:22,543 - INFO livekit.agents - LLM metrics {"ttft": -1.0, "prompt_tokens": 0, "prompt_cached_tokens": 0, "completion_tokens": 0, "tokens_per_second": 0.0, "pid": 10359, "job_id": "AJ_YWXovKTPLDET"}
2025-08-03 08:57:22,545 - ERROR asyncio - Exception in callback AgentActivity._create_speech_task.<locals>._mark_done_if_needed(<Task finishe...> result=None>) at /.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_activity.py:329
handle: <Handle AgentActivity._create_speech_task.<locals>._mark_done_if_needed(<Task finishe...> result=None>) at /.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_activity.py:329>
Traceback (most recent call last):
File "/Users/sauravsharma/.local/share/uv/python/cpython-3.12.11-macos-aarch64-none/lib/python3.12/asyncio/events.py", line 88, in _run
self._context.run(self._callback, *self._args)
File "/.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_activity.py", line 331, in _mark_done_if_needed
speech_handle._mark_done()
File "/.venv/lib/python3.12/site-packages/livekit/agents/voice/speech_handle.py", line 210, in _mark_done
self._mark_generation_done()
File "/.venv/lib/python3.12/site-packages/livekit/agents/voice/speech_handle.py", line 201, in _mark_generation_done
raise RuntimeError("cannot use mark_generation_done: no active generation is running.")
RuntimeError: cannot use mark_generation_done: no active generation is running. {"pid": 10359, "job_id": "AJ_YWXovKTPLDET"}tall-airline-16756
08/03/2025, 3:45 AMtall-airline-16756
08/03/2025, 3:45 AMpreemptive_generation=True, ensure the following:
• Check Active Generation: Modify the _mark_generation_done method in SpeechHandle to verify if a generation is active before marking it as done. For example: def _mark_generation_done(self):
if not self._generations:
raise RuntimeError("cannot use mark_generation_done: no active generation is running.")
with contextlib.suppress(asyncio.InvalidStateError):
self._generations[-1].set_result(None)
• Handle Preemptive Generation Cancellation: Ensure that when preemptive generation is canceled, the state is reset properly. For instance, in the _user_turn_completed_task method of AgentActivity, include logic to cancel preemptive generation if the context changes: if preemptive := self._preemptive_generation:
if preemptive.info.new_transcript != user_message.text_content or \
not preemptive.chat_ctx.is_equivalent(temp_mutable_chat_ctx) or \
preemptive.tools != self.tools or \
preemptive.tool_choice != self._tool_choice:
logger.warning("Preemptive generation canceled due to context change")
preemptive.speech_handle._cancel()
self._preemptive_generation = None
These steps ensure proper state management and prevent the error from occurring.kind-iron-94532
08/03/2025, 3:48 AMtall-airline-16756
08/03/2025, 3:49 AM