add video_source field to UserImageRequestFrame

This commit is contained in:
Aleix Conchillo Flaqué
2025-05-07 11:42:16 -07:00
parent a3038afa02
commit ed00f7d071
4 changed files with 9 additions and 2 deletions

View File

@@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- `UserImageRequestFrame.video_source` field has been added to request an image
from the desired video source.
- Added support for the AWS Nova Sonic speech-to-speech model with the new - Added support for the AWS Nova Sonic speech-to-speech model with the new
`AWSNovaSonicLLMService`. `AWSNovaSonicLLMService`.
See https://docs.aws.amazon.com/nova/latest/userguide/speech.html. See https://docs.aws.amazon.com/nova/latest/userguide/speech.html.

View File

@@ -715,9 +715,10 @@ class UserImageRequestFrame(SystemFrame):
context: Optional[Any] = None context: Optional[Any] = None
function_name: Optional[str] = None function_name: Optional[str] = None
tool_call_id: Optional[str] = None tool_call_id: Optional[str] = None
video_source: Optional[str] = None
def __str__(self): def __str__(self):
return f"{self.name}(user: {self.user_id}, function: {self.function_name}, request: {self.tool_call_id})" return f"{self.name}(user: {self.user_id}, video_source: {self.video_source}, function: {self.function_name}, request: {self.tool_call_id})"
@dataclass @dataclass

View File

@@ -190,6 +190,7 @@ class LLMService(AIService):
function_name: Optional[str] = None, function_name: Optional[str] = None,
tool_call_id: Optional[str] = None, tool_call_id: Optional[str] = None,
text_content: Optional[str] = None, text_content: Optional[str] = None,
video_source: Optional[str] = None,
): ):
await self.push_frame( await self.push_frame(
UserImageRequestFrame( UserImageRequestFrame(
@@ -197,6 +198,7 @@ class LLMService(AIService):
function_name=function_name, function_name=function_name,
tool_call_id=tool_call_id, tool_call_id=tool_call_id,
context=text_content, context=text_content,
video_source=video_source,
), ),
FrameDirection.UPSTREAM, FrameDirection.UPSTREAM,
) )

View File

@@ -1076,7 +1076,8 @@ class DailyInputTransport(BaseInputTransport):
async def request_participant_image(self, frame: UserImageRequestFrame): async def request_participant_image(self, frame: UserImageRequestFrame):
if frame.user_id in self._video_renderers: if frame.user_id in self._video_renderers:
self._video_renderers[frame.user_id]["render_next_frame"].append(frame) video_source = frame.video_source if frame.video_source else "camera"
self._video_renderers[frame.user_id][video_source]["render_next_frame"].append(frame)
async def _on_participant_video_frame( async def _on_participant_video_frame(
self, participant_id: str, video_frame: VideoFrame, video_source: str self, participant_id: str, video_frame: VideoFrame, video_source: str