Update OpenAIRealtimeLLMService to work with LLMContext and LLMContextAggregatorPair
This commit is contained in:
@@ -41,6 +41,7 @@ from pipecat.frames.frames import (
|
|||||||
UserStoppedSpeakingFrame,
|
UserStoppedSpeakingFrame,
|
||||||
)
|
)
|
||||||
from pipecat.metrics.metrics import LLMTokenUsage
|
from pipecat.metrics.metrics import LLMTokenUsage
|
||||||
|
from pipecat.processors.aggregators.llm_context import LLMContext
|
||||||
from pipecat.processors.aggregators.llm_response import (
|
from pipecat.processors.aggregators.llm_response import (
|
||||||
LLMAssistantAggregatorParams,
|
LLMAssistantAggregatorParams,
|
||||||
LLMUserAggregatorParams,
|
LLMUserAggregatorParams,
|
||||||
@@ -138,7 +139,15 @@ class OpenAIRealtimeLLMService(LLMService):
|
|||||||
self._send_transcription_frames = send_transcription_frames
|
self._send_transcription_frames = send_transcription_frames
|
||||||
self._websocket = None
|
self._websocket = None
|
||||||
self._receive_task = None
|
self._receive_task = None
|
||||||
self._context = None
|
# "Last received context" is only needed while we still support
|
||||||
|
# OpenAILLMContextFrame. The "last received context" is the context received
|
||||||
|
# in the most recent OpenAILLMContextFrame or LLMContextFrame, before
|
||||||
|
# we convert it to an LLMContext if needed. Storing the "last received
|
||||||
|
# context" lets us determine whether the context has changed. (We can't
|
||||||
|
# compare contexts after conversion because conversion creates a new
|
||||||
|
# object.)
|
||||||
|
self._context: LLMContext = None
|
||||||
|
self._last_received_context: OpenAILLMContext | LLMContext = None
|
||||||
|
|
||||||
self._disconnecting = False
|
self._disconnecting = False
|
||||||
self._api_session_ready = False
|
self._api_session_ready = False
|
||||||
@@ -347,22 +356,22 @@ class OpenAIRealtimeLLMService(LLMService):
|
|||||||
|
|
||||||
if isinstance(frame, TranscriptionFrame):
|
if isinstance(frame, TranscriptionFrame):
|
||||||
pass
|
pass
|
||||||
elif isinstance(frame, OpenAILLMContextFrame):
|
elif isinstance(frame, (LLMContextFrame, OpenAILLMContextFrame)):
|
||||||
context: OpenAIRealtimeLLMContext = OpenAIRealtimeLLMContext.upgrade_to_realtime(
|
context = (
|
||||||
frame.context
|
frame.context
|
||||||
|
if isinstance(frame, LLMContextFrame)
|
||||||
|
else LLMContext.from_openai_context(frame.context)
|
||||||
)
|
)
|
||||||
if not self._context:
|
if not self._context:
|
||||||
|
self._last_received_context = frame.context
|
||||||
self._context = context
|
self._context = context
|
||||||
elif frame.context is not self._context:
|
elif frame.context is not self._last_received_context:
|
||||||
# If the context has changed, reset the conversation
|
# If the context has changed, reset the conversation
|
||||||
|
self._last_received_context = frame.context
|
||||||
self._context = context
|
self._context = context
|
||||||
await self.reset_conversation()
|
await self.reset_conversation()
|
||||||
# Run the LLM at next opportunity
|
# Run the LLM at next opportunity
|
||||||
await self._create_response()
|
await self._create_response()
|
||||||
elif isinstance(frame, LLMContextFrame):
|
|
||||||
raise NotImplementedError(
|
|
||||||
"Universal LLMContext is not yet supported for OpenAI Realtime."
|
|
||||||
)
|
|
||||||
elif isinstance(frame, InputAudioRawFrame):
|
elif isinstance(frame, InputAudioRawFrame):
|
||||||
if not self._audio_input_paused:
|
if not self._audio_input_paused:
|
||||||
await self._send_user_audio(frame)
|
await self._send_user_audio(frame)
|
||||||
|
|||||||
Reference in New Issue
Block a user