Simplify LLMContextFrame handling in process_frame methods

Now that LLMContextFrame is the only frame that provides a context,
remove the intermediate `context = None` / `if context:` pattern
and handle context processing directly in the isinstance branch.
This commit is contained in:
Paul Kompfner
2026-03-31 18:35:48 -04:00
parent 394599d031
commit 19e521b75a
7 changed files with 13 additions and 44 deletions

View File

@@ -552,18 +552,14 @@ class AnthropicLLMService(LLMService):
""" """
await super().process_frame(frame, direction) await super().process_frame(frame, direction)
context = None
if isinstance(frame, LLMContextFrame): if isinstance(frame, LLMContextFrame):
context = frame.context await self._process_context(frame.context)
elif isinstance(frame, LLMEnablePromptCachingFrame): elif isinstance(frame, LLMEnablePromptCachingFrame):
logger.debug(f"Setting enable prompt caching to: [{frame.enable}]") logger.debug(f"Setting enable prompt caching to: [{frame.enable}]")
self._settings.enable_prompt_caching = frame.enable self._settings.enable_prompt_caching = frame.enable
else: else:
await self.push_frame(frame, direction) await self.push_frame(frame, direction)
if context:
await self._process_context(context)
def _estimate_tokens(self, text: str) -> int: def _estimate_tokens(self, text: str) -> int:
return int(len(re.split(r"[^\w]+", text)) * 1.3) return int(len(re.split(r"[^\w]+", text)) * 1.3)

View File

@@ -564,15 +564,11 @@ class AWSBedrockLLMService(LLMService):
""" """
await super().process_frame(frame, direction) await super().process_frame(frame, direction)
context = None
if isinstance(frame, LLMContextFrame): if isinstance(frame, LLMContextFrame):
context = frame.context await self._process_context(frame.context)
else: else:
await self.push_frame(frame, direction) await self.push_frame(frame, direction)
if context:
await self._process_context(context)
def _estimate_tokens(self, text: str) -> int: def _estimate_tokens(self, text: str) -> int:
return int(len(re.split(r"[^\w]+", text)) * 1.3) return int(len(re.split(r"[^\w]+", text)) * 1.3)

View File

@@ -524,8 +524,7 @@ class AWSNovaSonicLLMService(LLMService):
await super().process_frame(frame, direction) await super().process_frame(frame, direction)
if isinstance(frame, LLMContextFrame): if isinstance(frame, LLMContextFrame):
context = frame.context await self._handle_context(frame.context)
await self._handle_context(context)
elif isinstance(frame, InputAudioRawFrame): elif isinstance(frame, InputAudioRawFrame):
await self._handle_input_audio_frame(frame) await self._handle_input_audio_frame(frame)
elif isinstance(frame, InterruptionFrame): elif isinstance(frame, InterruptionFrame):

View File

@@ -637,16 +637,11 @@ class GoogleLLMService(LLMService):
""" """
await super().process_frame(frame, direction) await super().process_frame(frame, direction)
context = None
if isinstance(frame, LLMContextFrame): if isinstance(frame, LLMContextFrame):
context = frame.context await self._process_context(frame.context)
else: else:
await self.push_frame(frame, direction) await self.push_frame(frame, direction)
if context:
await self._process_context(context)
async def stop(self, frame): async def stop(self, frame):
"""Override stop to gracefully close the client.""" """Override stop to gracefully close the client."""
await super().stop(frame) await super().stop(frame)

View File

@@ -265,12 +265,8 @@ class Mem0MemoryService(FrameProcessor):
""" """
await super().process_frame(frame, direction) await super().process_frame(frame, direction)
context = None
if isinstance(frame, LLMContextFrame): if isinstance(frame, LLMContextFrame):
context = frame.context context = frame.context
if context:
try: try:
# Get the latest user message to use as a query for memory retrieval # Get the latest user message to use as a query for memory retrieval
context_messages = context.get_messages() context_messages = context.get_messages()
@@ -300,5 +296,4 @@ class Mem0MemoryService(FrameProcessor):
) )
await self.push_frame(frame) # Still pass the original frame through await self.push_frame(frame) # Still pass the original frame through
else: else:
# For non-context frames, just pass them through
await self.push_frame(frame, direction) await self.push_frame(frame, direction)

View File

@@ -532,17 +532,11 @@ class BaseOpenAILLMService(LLMService):
""" """
await super().process_frame(frame, direction) await super().process_frame(frame, direction)
context = None
if isinstance(frame, LLMContextFrame): if isinstance(frame, LLMContextFrame):
context = frame.context
else:
await self.push_frame(frame, direction)
if context:
try: try:
await self.push_frame(LLMFullResponseStartFrame()) await self.push_frame(LLMFullResponseStartFrame())
await self.start_processing_metrics() await self.start_processing_metrics()
await self._process_context(context) await self._process_context(frame.context)
except httpx.TimeoutException as e: except httpx.TimeoutException as e:
await self._call_event_handler("on_completion_timeout") await self._call_event_handler("on_completion_timeout")
await self.push_error(error_msg="LLM completion timeout", exception=e) await self.push_error(error_msg="LLM completion timeout", exception=e)
@@ -551,3 +545,5 @@ class BaseOpenAILLMService(LLMService):
finally: finally:
await self.stop_processing_metrics() await self.stop_processing_metrics()
await self.push_frame(LLMFullResponseEndFrame()) await self.push_frame(LLMFullResponseEndFrame())
else:
await self.push_frame(frame, direction)

View File

@@ -674,17 +674,11 @@ class OpenAIResponsesLLMService(_BaseOpenAIResponsesLLMService, WebsocketLLMServ
""" """
await super().process_frame(frame, direction) await super().process_frame(frame, direction)
context = None
if isinstance(frame, LLMContextFrame): if isinstance(frame, LLMContextFrame):
context = frame.context
else:
await self.push_frame(frame, direction)
if context:
try: try:
await self.push_frame(LLMFullResponseStartFrame()) await self.push_frame(LLMFullResponseStartFrame())
await self.start_processing_metrics() await self.start_processing_metrics()
await self._process_context(context) await self._process_context(frame.context)
except asyncio.CancelledError: except asyncio.CancelledError:
# The pipeline cancelled us (e.g. due to an interruption). # The pipeline cancelled us (e.g. due to an interruption).
# Ask the server to stop generating and flag that we need # Ask the server to stop generating and flag that we need
@@ -717,6 +711,8 @@ class OpenAIResponsesLLMService(_BaseOpenAIResponsesLLMService, WebsocketLLMServ
finally: finally:
await self.stop_processing_metrics() await self.stop_processing_metrics()
await self.push_frame(LLMFullResponseEndFrame()) await self.push_frame(LLMFullResponseEndFrame())
else:
await self.push_frame(frame, direction)
# -- core inference ------------------------------------------------------- # -- core inference -------------------------------------------------------
@@ -960,17 +956,11 @@ class OpenAIResponsesHttpLLMService(_BaseOpenAIResponsesLLMService):
""" """
await super().process_frame(frame, direction) await super().process_frame(frame, direction)
context = None
if isinstance(frame, LLMContextFrame): if isinstance(frame, LLMContextFrame):
context = frame.context
else:
await self.push_frame(frame, direction)
if context:
try: try:
await self.push_frame(LLMFullResponseStartFrame()) await self.push_frame(LLMFullResponseStartFrame())
await self.start_processing_metrics() await self.start_processing_metrics()
await self._process_context(context) await self._process_context(frame.context)
except httpx.TimeoutException as e: except httpx.TimeoutException as e:
await self._call_event_handler("on_completion_timeout") await self._call_event_handler("on_completion_timeout")
await self.push_error(error_msg="LLM completion timeout", exception=e) await self.push_error(error_msg="LLM completion timeout", exception=e)
@@ -979,6 +969,8 @@ class OpenAIResponsesHttpLLMService(_BaseOpenAIResponsesLLMService):
finally: finally:
await self.stop_processing_metrics() await self.stop_processing_metrics()
await self.push_frame(LLMFullResponseEndFrame()) await self.push_frame(LLMFullResponseEndFrame())
else:
await self.push_frame(frame, direction)
@traced_llm @traced_llm
async def _process_context(self, context: LLMContext): async def _process_context(self, context: LLMContext):