fix: tighten _process_completed_function_calls in AWS Nova Sonic
Three small changes that resolve pyright errors and sharpen the logic: - Guard `self._context` with the codebase's "should never happen" early-return pattern, so we don't blindly call `.get_messages()` on None. - Skip `LLMSpecificMessage` items in the iteration. They're opaque provider-specific payloads with no `.get()`, and the surrounding logic only applies to standard tool-result messages. - Match `role == "tool"` explicitly. The previous truthy-only check was working by accident — the `tool_call_id` filter further down was effectively narrowing to tool messages, but the intent is clearer when stated upfront.
This commit is contained in:
@@ -49,7 +49,7 @@ from pipecat.frames.frames import (
|
|||||||
UserStartedSpeakingFrame,
|
UserStartedSpeakingFrame,
|
||||||
UserStoppedSpeakingFrame,
|
UserStoppedSpeakingFrame,
|
||||||
)
|
)
|
||||||
from pipecat.processors.aggregators.llm_context import LLMContext
|
from pipecat.processors.aggregators.llm_context import LLMContext, LLMSpecificMessage
|
||||||
from pipecat.processors.frame_processor import FrameDirection
|
from pipecat.processors.frame_processor import FrameDirection
|
||||||
from pipecat.services.aws.nova_sonic.session_continuation import (
|
from pipecat.services.aws.nova_sonic.session_continuation import (
|
||||||
SessionContinuationHelper,
|
SessionContinuationHelper,
|
||||||
@@ -612,9 +612,18 @@ class AWSNovaSonicLLMService(LLMService):
|
|||||||
await self._disconnect()
|
await self._disconnect()
|
||||||
|
|
||||||
async def _process_completed_function_calls(self, send_new_results: bool):
|
async def _process_completed_function_calls(self, send_new_results: bool):
|
||||||
|
if not self._context: # should never happen
|
||||||
|
return
|
||||||
# Check for set of completed function calls in the context
|
# Check for set of completed function calls in the context
|
||||||
for message in self._context.get_messages():
|
for message in self._context.get_messages():
|
||||||
if message.get("role") and message.get("content") not in ["IN_PROGRESS", "CANCELLED"]:
|
# LLMSpecificMessages are opaque provider-specific payloads, not
|
||||||
|
# standard tool-result messages — skip them.
|
||||||
|
if isinstance(message, LLMSpecificMessage):
|
||||||
|
continue
|
||||||
|
if message.get("role") == "tool" and message.get("content") not in [
|
||||||
|
"IN_PROGRESS",
|
||||||
|
"CANCELLED",
|
||||||
|
]:
|
||||||
tool_call_id = message.get("tool_call_id")
|
tool_call_id = message.get("tool_call_id")
|
||||||
if tool_call_id and tool_call_id not in self._completed_tool_calls:
|
if tool_call_id and tool_call_id not in self._completed_tool_calls:
|
||||||
# Found a newly-completed function call - send the result to the service
|
# Found a newly-completed function call - send the result to the service
|
||||||
|
|||||||
Reference in New Issue
Block a user