mirror of
https://github.com/dograh-hq/dograh.git
synced 2026-06-16 08:25:18 +02:00
chore: update pipecat to 1.3.0 (#379)
* chore: rename PipelineTask to PipelineWorker * fix: fix tests * chore: update pipecat submodule * fix: fix anyio same task cancellation scope
This commit is contained in:
parent
e695436fb3
commit
5ef3be92b5
26 changed files with 170 additions and 132 deletions
|
|
@ -79,8 +79,12 @@ class McpToolSession:
|
|||
self.available: bool = False
|
||||
|
||||
async def start(self) -> None:
|
||||
"""Connect, initialize, and cache the tool list. Never raises —
|
||||
on any failure the session is marked unavailable."""
|
||||
"""Connect, initialize, and cache the tool list.
|
||||
|
||||
Never raises on a connect failure — a dead/unreachable MCP server
|
||||
leaves the session marked unavailable (``available = False``). Genuine
|
||||
external cancellation, KeyboardInterrupt, and SystemExit are re-raised
|
||||
(see the CancelledError handling below and ``_degrade``)."""
|
||||
try:
|
||||
params = build_streamable_http_params(
|
||||
url=self._url,
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ from pipecat.frames.frames import (
|
|||
LLMContextFrame,
|
||||
TTSSpeakFrame,
|
||||
)
|
||||
from pipecat.pipeline.task import PipelineTask
|
||||
from pipecat.pipeline.worker import PipelineWorker
|
||||
from pipecat.processors.aggregators.llm_context import LLMContext
|
||||
from pipecat.services.llm_service import FunctionCallParams
|
||||
from pipecat.services.settings import LLMSettings
|
||||
|
|
@ -60,7 +60,7 @@ class PipecatEngine:
|
|||
def __init__(
|
||||
self,
|
||||
*,
|
||||
task: Optional[PipelineTask] = None,
|
||||
task: Optional[PipelineWorker] = None,
|
||||
llm: Optional["LLMService"] = None,
|
||||
inference_llm: Optional["LLMService"] = None,
|
||||
context: Optional[LLMContext] = None,
|
||||
|
|
@ -842,7 +842,7 @@ class PipecatEngine:
|
|||
"""
|
||||
self.context = context
|
||||
|
||||
def set_task(self, task: PipelineTask) -> None:
|
||||
def set_task(self, task: PipelineWorker) -> None:
|
||||
"""Set the pipeline task.
|
||||
|
||||
This allows setting the task after the engine has been created,
|
||||
|
|
@ -955,7 +955,15 @@ class PipecatEngine:
|
|||
exc_info=True,
|
||||
)
|
||||
|
||||
async def _close_mcp_sessions(self) -> None:
|
||||
async def close_mcp_sessions(self) -> None:
|
||||
"""Close all open MCP tool sessions.
|
||||
|
||||
Must run in the same task that ran initialize() (which opened the
|
||||
sessions via _open_mcp_sessions). The MCP client's underlying anyio
|
||||
cancel scopes are task-affine — they must be exited from the task that
|
||||
entered them — so this is invoked from _run_pipeline's finally, not
|
||||
from cleanup() (which runs in a pipecat event-handler task).
|
||||
"""
|
||||
for tool_uuid, session in list(self._mcp_sessions.items()):
|
||||
try:
|
||||
await session.close()
|
||||
|
|
@ -964,7 +972,14 @@ class PipecatEngine:
|
|||
self._mcp_sessions = {}
|
||||
|
||||
async def cleanup(self):
|
||||
"""Clean up engine resources on disconnect."""
|
||||
"""Clean up engine resources on disconnect.
|
||||
|
||||
MCP tool sessions are intentionally NOT closed here — see
|
||||
close_mcp_sessions(). This method runs in a pipecat event-handler task
|
||||
(on_pipeline_finished), a different task than the one that opened the
|
||||
MCP sessions; closing them here raises "Attempted to exit cancel scope
|
||||
in a different task than it was entered in".
|
||||
"""
|
||||
# Cancel any pending timeout tasks
|
||||
if (
|
||||
self._user_response_timeout_task
|
||||
|
|
@ -973,11 +988,5 @@ class PipecatEngine:
|
|||
self._user_response_timeout_task.cancel()
|
||||
|
||||
# Cancel any in-flight background summarization.
|
||||
# MCP sessions are closed in a finally block so they are guaranteed to
|
||||
# run even if the summarization cleanup raises an exception.
|
||||
try:
|
||||
if self._context_summarization_manager:
|
||||
await self._context_summarization_manager.cleanup()
|
||||
finally:
|
||||
# Close any open MCP tool sessions
|
||||
await self._close_mcp_sessions()
|
||||
if self._context_summarization_manager:
|
||||
await self._context_summarization_manager.cleanup()
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ from pipecat.frames.frames import (
|
|||
TTSStoppedFrame,
|
||||
)
|
||||
from pipecat.pipeline.pipeline import Pipeline
|
||||
from pipecat.pipeline.runner import PipelineRunner
|
||||
from pipecat.processors.aggregators.llm_context import LLMContext
|
||||
from pipecat.processors.aggregators.llm_response_universal import (
|
||||
LLMAssistantAggregatorParams,
|
||||
|
|
@ -45,6 +44,10 @@ from api.services.pipecat.tracing_config import (
|
|||
build_remote_parent_context,
|
||||
get_trace_url,
|
||||
)
|
||||
from api.services.pipecat.worker_runner import (
|
||||
run_pipeline_worker,
|
||||
wait_for_pipeline_worker_started,
|
||||
)
|
||||
from api.services.workflow.dto import ReactFlowDTO
|
||||
from api.services.workflow.pipecat_engine import PipecatEngine
|
||||
from api.services.workflow.workflow_graph import WorkflowGraph
|
||||
|
|
@ -534,8 +537,7 @@ async def execute_text_chat_pending_turn(
|
|||
conversation_type="text",
|
||||
additional_span_attributes=trace_span_attributes,
|
||||
)
|
||||
runner = PipelineRunner(handle_sigint=False, handle_sigterm=False)
|
||||
runner_task = asyncio.create_task(runner.run(task))
|
||||
runner_task = asyncio.create_task(run_pipeline_worker(task))
|
||||
|
||||
engine.set_task(task)
|
||||
engine.set_audio_config(audio_config)
|
||||
|
|
@ -548,7 +550,7 @@ async def execute_text_chat_pending_turn(
|
|||
)
|
||||
|
||||
try:
|
||||
await asyncio.wait_for(task._pipeline_start_event.wait(), timeout=5.0)
|
||||
await wait_for_pipeline_worker_started(task, timeout=5.0, run_task=runner_task)
|
||||
|
||||
await engine.initialize()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue