Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions src/viam/app/data_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
AddBinaryDataToDatasetByIDsRequest,
AddBoundingBoxToImageByIDRequest,
AddBoundingBoxToImageByIDResponse,
AddSequencesToDatasetRequest,
AddTagsToBinaryDataByFilterRequest,
AddTagsToBinaryDataByIDsRequest,
BinaryData,
Expand Down Expand Up @@ -55,10 +56,13 @@
Order,
RemoveBinaryDataFromDatasetByIDsRequest,
RemoveBoundingBoxFromImageByIDRequest,
RemoveSequencesFromDatasetRequest,
RemoveTagsFromBinaryDataByFilterRequest,
RemoveTagsFromBinaryDataByFilterResponse,
RemoveTagsFromBinaryDataByIDsRequest,
RemoveTagsFromBinaryDataByIDsResponse,
SequencesByDatasetIDRequest,
SequencesByDatasetIDResponse,
TabularDataByFilterRequest,
TabularDataByFilterResponse,
TabularDataByMQLRequest,
Expand Down Expand Up @@ -1607,6 +1611,99 @@ async def remove_binary_data_from_dataset_by_ids(self, binary_ids: Union[List[Bi
request = RemoveBinaryDataFromDatasetByIDsRequest(binary_ids=bin_ids, dataset_id=dataset_id)
await self._data_client.RemoveBinaryDataFromDatasetByIDs(request, metadata=self._metadata)

async def add_sequences_to_dataset(self, dataset_id: str, sequence_ids: List[str]) -> None:
"""Add sequences to a dataset.

::

await data_client.add_sequences_to_dataset(
dataset_id="<YOUR-DATASET-ID>",
sequence_ids=["<SEQUENCE-ID-1>", "<SEQUENCE-ID-2>"]
)

Args:
dataset_id (str): The ID of the dataset to add sequences to. To retrieve the dataset ID:

- Navigate to the **DATASETS** tab of the **DATA** page.
- Click on the dataset.
- Click the **...** menu.
- Select **Copy dataset ID**.
sequence_ids (List[str]): The IDs of the sequences to add to the dataset.

For more information, see `Data Client API <https://docs.viam.com/dev/reference/apis/data-client/#addsequencestodataset>`_.
"""
request = AddSequencesToDatasetRequest(dataset_id=dataset_id, sequence_ids=sequence_ids)
await self._data_client.AddSequencesToDataset(request, metadata=self._metadata)

async def remove_sequences_from_dataset(self, dataset_id: str, sequence_ids: List[str]) -> None:
"""Remove sequences from a dataset.

::

await data_client.remove_sequences_from_dataset(
dataset_id="<YOUR-DATASET-ID>",
sequence_ids=["<SEQUENCE-ID-1>", "<SEQUENCE-ID-2>"]
)

Args:
dataset_id (str): The ID of the dataset to remove sequences from. To retrieve the dataset ID:

- Navigate to the **DATASETS** tab of the **DATA** page.
- Click on the dataset.
- Click the **...** menu.
- Select **Copy dataset ID**.
sequence_ids (List[str]): The IDs of the sequences to remove from the dataset.

For more information, see `Data Client API <https://docs.viam.com/dev/reference/apis/data-client/#removesequencesfromdataset>`_.
"""
request = RemoveSequencesFromDatasetRequest(dataset_id=dataset_id, sequence_ids=sequence_ids)
await self._data_client.RemoveSequencesFromDataset(request, metadata=self._metadata)

async def sequences_by_dataset_id(
self, dataset_id: str, page_token: Optional[str] = None, page_size: Optional[int] = None
) -> SequencesByDatasetIDResponse:
"""Get sequences in a dataset by dataset ID.

::

from viam.proto.app.data import Sequence

response = await data_client.sequences_by_dataset_id(
dataset_id="<YOUR-DATASET-ID>"
)

sequences = response.sequences
next_page_token = response.next_page_token

# Get next page
if next_page_token:
response = await data_client.sequences_by_dataset_id(
dataset_id="<YOUR-DATASET-ID>",
page_token=next_page_token
)

Args:
dataset_id (str): The ID of the dataset. To retrieve the dataset ID:

- Navigate to the **DATASETS** tab of the **DATA** page.
- Click on the dataset.
- Click the **...** menu.
- Select **Copy dataset ID**.
page_token (Optional[str]): Optional page token for pagination.
page_size (Optional[int]): Optional page size for pagination.

Returns:
SequencesByDatasetIDResponse: The response containing sequences and pagination token.

For more information, see `Data Client API <https://docs.viam.com/dev/reference/apis/data-client/#sequencesbydatasetid>`_.
"""
request = SequencesByDatasetIDRequest(dataset_id=dataset_id)
if page_token is not None:
request.page_token = page_token
if page_size is not None:
request.page_size = page_size
return await self._data_client.SequencesByDatasetID(request, metadata=self._metadata)

async def binary_data_capture_upload(
self,
binary_data: bytes,
Expand Down
28 changes: 26 additions & 2 deletions src/viam/gen/app/data/v1/data_grpc.py

Large diffs are not rendered by default.

166 changes: 89 additions & 77 deletions src/viam/gen/app/data/v1/data_pb2.py

Large diffs are not rendered by default.

106 changes: 103 additions & 3 deletions src/viam/gen/app/data/v1/data_pb2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -1754,6 +1754,62 @@ class RemoveBinaryDataFromDatasetByIDsResponse(_message.Message):
...
Global___RemoveBinaryDataFromDatasetByIDsResponse: _TypeAlias = RemoveBinaryDataFromDatasetByIDsResponse

@_typing.final
class AddSequencesToDatasetRequest(_message.Message):
"""AddSequencesToDatasetRequest adds the sequences with the given IDs to the dataset with dataset_id."""
DESCRIPTOR: _descriptor.Descriptor
DATASET_ID_FIELD_NUMBER: _builtins.int
SEQUENCE_IDS_FIELD_NUMBER: _builtins.int
dataset_id: _builtins.str

@_builtins.property
def sequence_ids(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]:
...

def __init__(self, *, dataset_id: _builtins.str=..., sequence_ids: _abc.Iterable[_builtins.str] | None=...) -> None:
...
_ClearFieldArgType: _TypeAlias = _typing.Literal['dataset_id', b'dataset_id', 'sequence_ids', b'sequence_ids']

def ClearField(self, field_name: _ClearFieldArgType) -> None:
...
Global___AddSequencesToDatasetRequest: _TypeAlias = AddSequencesToDatasetRequest

@_typing.final
class AddSequencesToDatasetResponse(_message.Message):
DESCRIPTOR: _descriptor.Descriptor

def __init__(self) -> None:
...
Global___AddSequencesToDatasetResponse: _TypeAlias = AddSequencesToDatasetResponse

@_typing.final
class RemoveSequencesFromDatasetRequest(_message.Message):
"""RemoveSequencesFromDatasetRequest removes the sequences with the given IDs from the dataset with dataset_id."""
DESCRIPTOR: _descriptor.Descriptor
DATASET_ID_FIELD_NUMBER: _builtins.int
SEQUENCE_IDS_FIELD_NUMBER: _builtins.int
dataset_id: _builtins.str

@_builtins.property
def sequence_ids(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]:
...

def __init__(self, *, dataset_id: _builtins.str=..., sequence_ids: _abc.Iterable[_builtins.str] | None=...) -> None:
...
_ClearFieldArgType: _TypeAlias = _typing.Literal['dataset_id', b'dataset_id', 'sequence_ids', b'sequence_ids']

def ClearField(self, field_name: _ClearFieldArgType) -> None:
...
Global___RemoveSequencesFromDatasetRequest: _TypeAlias = RemoveSequencesFromDatasetRequest

@_typing.final
class RemoveSequencesFromDatasetResponse(_message.Message):
DESCRIPTOR: _descriptor.Descriptor

def __init__(self) -> None:
...
Global___RemoveSequencesFromDatasetResponse: _TypeAlias = RemoveSequencesFromDatasetResponse

@_typing.final
class CreateIndexRequest(_message.Message):
"""CreateIndexRequest starts a custom index build"""
Expand Down Expand Up @@ -2187,6 +2243,7 @@ class Sequence(_message.Message):
START_TIME_FIELD_NUMBER: _builtins.int
END_TIME_FIELD_NUMBER: _builtins.int
RESOURCES_FIELD_NUMBER: _builtins.int
DATASET_IDS_FIELD_NUMBER: _builtins.int
id: _builtins.str
'Metadata associated with the sequence.'
part_id: _builtins.str
Expand Down Expand Up @@ -2215,13 +2272,19 @@ class Sequence(_message.Message):
def resources(self) -> _containers.RepeatedCompositeFieldContainer[Global___SequenceResourceFilter]:
"""Resources whose data is associated with this sequence."""

def __init__(self, *, id: _builtins.str=..., part_id: _builtins.str=..., sequence_tags: _abc.Iterable[_builtins.str] | None=..., created_at: _timestamp_pb2.Timestamp | None=..., updated_at: _timestamp_pb2.Timestamp | None=..., start_time: _timestamp_pb2.Timestamp | None=..., end_time: _timestamp_pb2.Timestamp | None=..., resources: _abc.Iterable[Global___SequenceResourceFilter] | None=...) -> None:
@_builtins.property
def dataset_ids(self) -> _containers.RepeatedScalarFieldContainer[_builtins.str]:
"""Datasets this sequence is a member of. Membership is added/removed via
AddSequencesToDataset / RemoveSequencesFromDataset.
"""

def __init__(self, *, id: _builtins.str=..., part_id: _builtins.str=..., sequence_tags: _abc.Iterable[_builtins.str] | None=..., created_at: _timestamp_pb2.Timestamp | None=..., updated_at: _timestamp_pb2.Timestamp | None=..., start_time: _timestamp_pb2.Timestamp | None=..., end_time: _timestamp_pb2.Timestamp | None=..., resources: _abc.Iterable[Global___SequenceResourceFilter] | None=..., dataset_ids: _abc.Iterable[_builtins.str] | None=...) -> None:
...
_HasFieldArgType: _TypeAlias = _typing.Literal['created_at', b'created_at', 'end_time', b'end_time', 'start_time', b'start_time', 'updated_at', b'updated_at']

def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool:
...
_ClearFieldArgType: _TypeAlias = _typing.Literal['created_at', b'created_at', 'end_time', b'end_time', 'id', b'id', 'part_id', b'part_id', 'resources', b'resources', 'sequence_tags', b'sequence_tags', 'start_time', b'start_time', 'updated_at', b'updated_at']
_ClearFieldArgType: _TypeAlias = _typing.Literal['created_at', b'created_at', 'dataset_ids', b'dataset_ids', 'end_time', b'end_time', 'id', b'id', 'part_id', b'part_id', 'resources', b'resources', 'sequence_tags', b'sequence_tags', 'start_time', b'start_time', 'updated_at', b'updated_at']

def ClearField(self, field_name: _ClearFieldArgType) -> None:
...
Expand Down Expand Up @@ -2426,4 +2489,41 @@ class ListSequencesResponse(_message.Message):

def ClearField(self, field_name: _ClearFieldArgType) -> None:
...
Global___ListSequencesResponse: _TypeAlias = ListSequencesResponse
Global___ListSequencesResponse: _TypeAlias = ListSequencesResponse

@_typing.final
class SequencesByDatasetIDRequest(_message.Message):
DESCRIPTOR: _descriptor.Descriptor
DATASET_ID_FIELD_NUMBER: _builtins.int
PAGE_TOKEN_FIELD_NUMBER: _builtins.int
PAGE_SIZE_FIELD_NUMBER: _builtins.int
dataset_id: _builtins.str
page_token: _builtins.str
page_size: _builtins.int

def __init__(self, *, dataset_id: _builtins.str=..., page_token: _builtins.str=..., page_size: _builtins.int=...) -> None:
...
_ClearFieldArgType: _TypeAlias = _typing.Literal['dataset_id', b'dataset_id', 'page_size', b'page_size', 'page_token', b'page_token']

def ClearField(self, field_name: _ClearFieldArgType) -> None:
...
Global___SequencesByDatasetIDRequest: _TypeAlias = SequencesByDatasetIDRequest

@_typing.final
class SequencesByDatasetIDResponse(_message.Message):
DESCRIPTOR: _descriptor.Descriptor
SEQUENCES_FIELD_NUMBER: _builtins.int
NEXT_PAGE_TOKEN_FIELD_NUMBER: _builtins.int
next_page_token: _builtins.str

@_builtins.property
def sequences(self) -> _containers.RepeatedCompositeFieldContainer[Global___Sequence]:
...

def __init__(self, *, sequences: _abc.Iterable[Global___Sequence] | None=..., next_page_token: _builtins.str=...) -> None:
...
_ClearFieldArgType: _TypeAlias = _typing.Literal['next_page_token', b'next_page_token', 'sequences', b'sequences']

def ClearField(self, field_name: _ClearFieldArgType) -> None:
...
Global___SequencesByDatasetIDResponse: _TypeAlias = SequencesByDatasetIDResponse
12 changes: 12 additions & 0 deletions src/viam/proto/app/data/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
AddBinaryDataToDatasetByIDsResponse,
AddBoundingBoxToImageByIDRequest,
AddBoundingBoxToImageByIDResponse,
AddSequencesToDatasetRequest,
AddSequencesToDatasetResponse,
AddTagsToBinaryDataByFilterRequest,
AddTagsToBinaryDataByFilterResponse,
AddTagsToBinaryDataByIDsRequest,
Expand Down Expand Up @@ -77,12 +79,16 @@
RemoveBinaryDataFromDatasetByIDsResponse,
RemoveBoundingBoxFromImageByIDRequest,
RemoveBoundingBoxFromImageByIDResponse,
RemoveSequencesFromDatasetRequest,
RemoveSequencesFromDatasetResponse,
RemoveTagsFromBinaryDataByFilterRequest,
RemoveTagsFromBinaryDataByFilterResponse,
RemoveTagsFromBinaryDataByIDsRequest,
RemoveTagsFromBinaryDataByIDsResponse,
Sequence,
SequenceResourceFilter,
SequencesByDatasetIDRequest,
SequencesByDatasetIDResponse,
TabularData,
TabularDataByFilterRequest,
TabularDataByFilterResponse,
Expand Down Expand Up @@ -112,6 +118,8 @@
"AddBinaryDataToDatasetByIDsResponse",
"AddBoundingBoxToImageByIDRequest",
"AddBoundingBoxToImageByIDResponse",
"AddSequencesToDatasetRequest",
"AddSequencesToDatasetResponse",
"AddTagsToBinaryDataByFilterRequest",
"AddTagsToBinaryDataByFilterResponse",
"AddTagsToBinaryDataByIDsRequest",
Expand Down Expand Up @@ -180,12 +188,16 @@
"RemoveBinaryDataFromDatasetByIDsResponse",
"RemoveBoundingBoxFromImageByIDRequest",
"RemoveBoundingBoxFromImageByIDResponse",
"RemoveSequencesFromDatasetRequest",
"RemoveSequencesFromDatasetResponse",
"RemoveTagsFromBinaryDataByFilterRequest",
"RemoveTagsFromBinaryDataByFilterResponse",
"RemoveTagsFromBinaryDataByIDsRequest",
"RemoveTagsFromBinaryDataByIDsResponse",
"Sequence",
"SequenceResourceFilter",
"SequencesByDatasetIDRequest",
"SequencesByDatasetIDResponse",
"TabularData",
"TabularDataByFilterRequest",
"TabularDataByFilterResponse",
Expand Down
2 changes: 1 addition & 1 deletion src/viam/version_metadata.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "0.76.0"

API_VERSION = "v0.1.553"
API_VERSION = "v0.1.556"
SDK_VERSION = __version__
35 changes: 35 additions & 0 deletions tests/mocks/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@
AddBinaryDataToDatasetByIDsResponse,
AddBoundingBoxToImageByIDRequest,
AddBoundingBoxToImageByIDResponse,
AddSequencesToDatasetRequest,
AddSequencesToDatasetResponse,
AddTagsToBinaryDataByFilterRequest,
AddTagsToBinaryDataByFilterResponse,
AddTagsToBinaryDataByIDsRequest,
Expand Down Expand Up @@ -252,10 +254,14 @@
RemoveBinaryDataFromDatasetByIDsResponse,
RemoveBoundingBoxFromImageByIDRequest,
RemoveBoundingBoxFromImageByIDResponse,
RemoveSequencesFromDatasetRequest,
RemoveSequencesFromDatasetResponse,
RemoveTagsFromBinaryDataByFilterRequest,
RemoveTagsFromBinaryDataByFilterResponse,
RemoveTagsFromBinaryDataByIDsRequest,
RemoveTagsFromBinaryDataByIDsResponse,
SequencesByDatasetIDRequest,
SequencesByDatasetIDResponse,
TabularData,
TabularDataByFilterRequest,
TabularDataByFilterResponse,
Expand All @@ -269,6 +275,9 @@
UpdateBoundingBoxRequest,
UpdateBoundingBoxResponse,
)
from viam.proto.app.data import (
Sequence as DataSequence,
)
from viam.proto.app.datapipelines import (
CreateDataPipelineRequest,
CreateDataPipelineResponse,
Expand Down Expand Up @@ -1082,6 +1091,32 @@ async def RemoveBinaryDataFromDatasetByIDs(
self.dataset_id = request.dataset_id
await stream.send_message(RemoveBinaryDataFromDatasetByIDsResponse())

async def AddSequencesToDataset(self, stream: Stream[AddSequencesToDatasetRequest, AddSequencesToDatasetResponse]) -> None:
request = await stream.recv_message()
assert request is not None
self.dataset_id = request.dataset_id
self.sequence_ids = list(request.sequence_ids)
await stream.send_message(AddSequencesToDatasetResponse())

async def RemoveSequencesFromDataset(
self, stream: Stream[RemoveSequencesFromDatasetRequest, RemoveSequencesFromDatasetResponse]
) -> None:
request = await stream.recv_message()
assert request is not None
self.dataset_id = request.dataset_id
self.sequence_ids = list(request.sequence_ids)
await stream.send_message(RemoveSequencesFromDatasetResponse())

async def SequencesByDatasetID(self, stream: Stream[SequencesByDatasetIDRequest, SequencesByDatasetIDResponse]) -> None:
request = await stream.recv_message()
assert request is not None
self.dataset_id = request.dataset_id
self.page_token = request.page_token if request.page_token else None
self.page_size = request.page_size if request.page_size else None
# Return mock sequences - this can be enhanced based on test needs
sequences = [DataSequence(id="seq1", part_id="part1"), DataSequence(id="seq2", part_id="part2")]
await stream.send_message(SequencesByDatasetIDResponse(sequences=sequences, next_page_token="next_page"))

async def TabularDataBySQL(self, stream: Stream[TabularDataBySQLRequest, TabularDataBySQLResponse]) -> None:
request = await stream.recv_message()
assert request is not None
Expand Down
Loading