fix: protege limpeza da sessão após desconexão

This commit is contained in:
alex alves
2026-11-03 10:31:04 -03:00
parent 5c35fd4e33
commit 82553d86c7
3 changed files with 76 additions and 72 deletions

View File

@@ -5,6 +5,7 @@ description = "Realtime voice assistant with WebSocket audio gateway, streaming
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
dependencies = [ dependencies = [
"anyio>=4.15.1,<5",
"deepagents>=0.7.26", "deepagents>=0.7.26",
"fastapi>=0.141.1", "fastapi>=0.141.1",
"httpx>=0.28,<1", "httpx>=0.28,<1",

View File

@@ -35,6 +35,7 @@ Architecture:
import json import json
import logging import logging
from pathlib import Path from pathlib import Path
import anyio
from fastapi.responses import FileResponse from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
@@ -1044,6 +1045,7 @@ async def audio_socket(websocket: WebSocket) -> None:
pass pass
finally: finally:
with anyio.CancelScope(shield=True):
# Stop Gateway-owned finalization before provider cleanup. # Stop Gateway-owned finalization before provider cleanup.
try: try:
await cancel_finalization_task() await cancel_finalization_task()
@@ -1063,8 +1065,7 @@ async def audio_socket(websocket: WebSocket) -> None:
session.session_id if session else None, session.session_id if session else None,
) )
# A task may have been created before registration failed. # Handle tasks created before pipeline registration.
# Handle it independently if the pipeline does not own it.
if stt_events_task is not None: if stt_events_task is not None:
task = stt_events_task task = stt_events_task
@@ -1100,6 +1101,7 @@ async def audio_socket(websocket: WebSocket) -> None:
if task.done(): if task.done():
stt_events_task = None stt_events_task = None
# Abort STT without waiting for a final transcript. # Abort STT without waiting for a final transcript.
if stt is not None: if stt is not None:
try: try:
@@ -1133,4 +1135,3 @@ async def audio_socket(websocket: WebSocket) -> None:
) )
finally: finally:
agent = None agent = None

2
uv.lock generated
View File

@@ -2924,6 +2924,7 @@ name = "voice-assistant"
version = "0.1.0" version = "0.1.0"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "anyio" },
{ name = "deepagents" }, { name = "deepagents" },
{ name = "fastapi" }, { name = "fastapi" },
{ name = "httpx" }, { name = "httpx" },
@@ -2946,6 +2947,7 @@ dev = [
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "anyio", specifier = ">=4.15.1,<5" },
{ name = "deepagents", specifier = ">=0.7.26" }, { name = "deepagents", specifier = ">=0.7.26" },
{ name = "fastapi", specifier = ">=0.141.1" }, { name = "fastapi", specifier = ">=0.141.1" },
{ name = "httpx", specifier = ">=0.28,<1" }, { name = "httpx", specifier = ">=0.28,<1" },