From a49118eed80d2bbe23511399c15218e5c048b79f Mon Sep 17 00:00:00 2001 From: viambot <79611529+viambot@users.noreply.github.com> Date: Fri, 8 Aug 2025 15:19:03 +0000 Subject: [PATCH] [WORKFLOW] AI update based on proto changes from commit 6257a7b7cc1edf3ad61552374605bed648dbe7f4 --- src/viam/components/camera/camera.py | 7 ++++++- src/viam/components/camera/client.py | 3 ++- src/viam/components/camera/service.py | 4 +++- tests/mocks/components.py | 5 ++++- tests/test_camera.py | 13 +++++++++++++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/viam/components/camera/camera.py b/src/viam/components/camera/camera.py index 9faeae9d5..81ee14809 100644 --- a/src/viam/components/camera/camera.py +++ b/src/viam/components/camera/camera.py @@ -63,7 +63,9 @@ async def get_image( ... @abc.abstractmethod - async def get_images(self, *, timeout: Optional[float] = None, **kwargs) -> Tuple[List[NamedImage], ResponseMetadata]: + async def get_images( + self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs + ) -> Tuple[List[NamedImage], ResponseMetadata]: """Get simultaneous images from different imagers, along with associated metadata. This should not be used for getting a time series of images from the same imager. @@ -75,6 +77,9 @@ async def get_images(self, *, timeout: Optional[float] = None, **kwargs) -> Tupl first_image = images[0] timestamp = metadata.captured_at + Args: + extra (Optional[Dict[str, Any]]): Additional arguments to the method. + Returns: Tuple[List[NamedImage], ResponseMetadata]: A tuple containing two values; the first [0] a list of images returned from the camera system, and the second [1] the metadata associated with this response. diff --git a/src/viam/components/camera/client.py b/src/viam/components/camera/client.py index 45feacf32..0460450f4 100644 --- a/src/viam/components/camera/client.py +++ b/src/viam/components/camera/client.py @@ -46,11 +46,12 @@ async def get_image( async def get_images( self, *, + extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs, ) -> Tuple[List[NamedImage], ResponseMetadata]: md = kwargs.get("metadata", self.Metadata()).proto - request = GetImagesRequest(name=self.name) + request = GetImagesRequest(name=self.name, extra=dict_to_struct(extra)) response: GetImagesResponse = await self.client.GetImages(request, timeout=timeout, metadata=md) imgs = [] for img_data in response.images: diff --git a/src/viam/components/camera/service.py b/src/viam/components/camera/service.py index 936271491..63c5b8af4 100644 --- a/src/viam/components/camera/service.py +++ b/src/viam/components/camera/service.py @@ -48,7 +48,9 @@ async def GetImages(self, stream: Stream[GetImagesRequest, GetImagesResponse]) - camera = self.get_resource(name) timeout = stream.deadline.time_remaining() if stream.deadline else None - images, metadata = await camera.get_images(timeout=timeout, metadata=stream.metadata) + images, metadata = await camera.get_images( + extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata + ) img_bytes_lst = [] for img in images: fmt = img.mime_type.to_proto() diff --git a/tests/mocks/components.py b/tests/mocks/components.py index fd80dc51e..47d04c99a 100644 --- a/tests/mocks/components.py +++ b/tests/mocks/components.py @@ -377,8 +377,11 @@ async def get_image( self.timeout = timeout return self.image - async def get_images(self, timeout: Optional[float] = None, **kwargs) -> Tuple[List[NamedImage], ResponseMetadata]: + async def get_images( + self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs + ) -> Tuple[List[NamedImage], ResponseMetadata]: self.timeout = timeout + self.extra = extra # Add this line to store the extra parameter return [NamedImage(self.name, self.image.data, self.image.mime_type)], self.metadata async def get_point_cloud( diff --git a/tests/test_camera.py b/tests/test_camera.py index 47943e7d9..a2ad54bc8 100644 --- a/tests/test_camera.py +++ b/tests/test_camera.py @@ -99,6 +99,10 @@ async def test_get_images(self, camera: Camera, image: ViamImage, metadata: Resp assert imgs[0].data == image.data assert md == metadata + # Add this block to test the 'extra' parameter + await camera.get_images(extra={"1": 1}) + assert camera.extra == {"1": 1} + async def test_get_point_cloud(self, camera: MockCamera, point_cloud: bytes): pc, _ = await camera.get_point_cloud() assert pc == point_cloud @@ -163,6 +167,11 @@ async def test_get_images(self, camera: MockCamera, service: CameraRPCService, m assert response.response_metadata == metadata assert camera.timeout == loose_approx(18.1) + # Add this block to test the 'extra' parameter + request_with_extra = GetImagesRequest(name="camera", extra=dict_to_struct({"2": 2})) + await client.GetImages(request_with_extra) + assert camera.extra == {"2": 2} + async def test_render_frame(self, camera: MockCamera, service: CameraRPCService, image: ViamImage): assert camera.timeout is None async with ChannelFor([service]) as channel: @@ -233,6 +242,10 @@ async def test_get_images(self, camera: MockCamera, service: CameraRPCService, i assert md == metadata assert camera.timeout == loose_approx(1.82) + # Add this block to test the 'extra' parameter + await client.get_images(extra={"3": 3}) + assert camera.extra == {"3": 3} + async def test_get_point_cloud(self, camera: MockCamera, service: CameraRPCService, point_cloud: bytes): assert camera.timeout is None async with ChannelFor([service]) as channel: