superb-ai-onprem 0.5.10__py3-none-any.whl → 0.5.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of superb-ai-onprem might be problematic. Click here for more details.

Files changed (53) hide show
  1. spb_onprem/__init__.py +8 -0
  2. spb_onprem/_version.py +2 -2
  3. spb_onprem/activities/service.py +1 -2
  4. spb_onprem/contents/params/__init__.py +2 -0
  5. spb_onprem/contents/params/delete_content.py +10 -0
  6. spb_onprem/contents/queries.py +11 -0
  7. spb_onprem/contents/service.py +19 -0
  8. spb_onprem/data/params/__init__.py +8 -0
  9. spb_onprem/data/params/get_data_detail.py +14 -0
  10. spb_onprem/data/params/get_evaluation_value_list.py +36 -0
  11. spb_onprem/data/queries.py +70 -0
  12. spb_onprem/data/service.py +95 -0
  13. spb_onprem/datasets/params/__init__.py +2 -0
  14. spb_onprem/datasets/params/delete_dataset.py +12 -0
  15. spb_onprem/datasets/queries.py +11 -0
  16. spb_onprem/datasets/service.py +18 -0
  17. spb_onprem/entities.py +4 -0
  18. spb_onprem/inferences/__init__.py +5 -0
  19. spb_onprem/inferences/service.py +56 -0
  20. spb_onprem/models/__init__.py +7 -0
  21. spb_onprem/models/entities.py +9 -0
  22. spb_onprem/models/params/__init__.py +7 -0
  23. spb_onprem/models/params/delete_model.py +14 -0
  24. spb_onprem/models/params/get_models.py +29 -0
  25. spb_onprem/models/queries.py +33 -0
  26. spb_onprem/models/service.py +76 -0
  27. spb_onprem/predictions/__init__.py +7 -0
  28. spb_onprem/predictions/entities.py +11 -0
  29. spb_onprem/predictions/params/__init__.py +15 -0
  30. spb_onprem/predictions/params/create_prediction_set.py +44 -0
  31. spb_onprem/predictions/params/delete_prediction_from_data.py +20 -0
  32. spb_onprem/predictions/params/delete_prediction_set.py +14 -0
  33. spb_onprem/predictions/params/get_prediction_set.py +14 -0
  34. spb_onprem/predictions/params/get_prediction_sets.py +29 -0
  35. spb_onprem/predictions/params/update_prediction_set_data_info.py +28 -0
  36. spb_onprem/predictions/queries.py +110 -0
  37. spb_onprem/predictions/service.py +225 -0
  38. {superb_ai_onprem-0.5.10.dist-info → superb_ai_onprem-0.5.11.dist-info}/METADATA +1 -1
  39. {superb_ai_onprem-0.5.10.dist-info → superb_ai_onprem-0.5.11.dist-info}/RECORD +53 -21
  40. tests/activities/test_params.py +2 -2
  41. tests/activities/test_service.py +28 -38
  42. tests/data/__init__.py +0 -0
  43. tests/data/test_data_service.py +412 -0
  44. tests/datasets/__init__.py +1 -0
  45. tests/datasets/test_dataset_service.py +135 -0
  46. tests/exports/test_service.py +1 -0
  47. tests/models/__init__.py +1 -0
  48. tests/models/test_model_service.py +249 -0
  49. tests/predictions/__init__.py +1 -0
  50. tests/predictions/test_prediction_service.py +359 -0
  51. {superb_ai_onprem-0.5.10.dist-info → superb_ai_onprem-0.5.11.dist-info}/WHEEL +0 -0
  52. {superb_ai_onprem-0.5.10.dist-info → superb_ai_onprem-0.5.11.dist-info}/licenses/LICENSE +0 -0
  53. {superb_ai_onprem-0.5.10.dist-info → superb_ai_onprem-0.5.11.dist-info}/top_level.txt +0 -0
spb_onprem/__init__.py CHANGED
@@ -10,6 +10,9 @@ from .slices.service import SliceService
10
10
  from .activities.service import ActivityService
11
11
  from .exports.service import ExportService
12
12
  from .contents.service import ContentService
13
+ from .predictions.service import PredictionService
14
+ from .models.service import ModelService
15
+ from .inferences.service import InferService
13
16
 
14
17
  # Core Entities and Enums
15
18
  from .entities import (
@@ -77,6 +80,9 @@ __all__ = (
77
80
  "ActivityService",
78
81
  "ExportService",
79
82
  "ContentService",
83
+ "PredictionService",
84
+ "ModelService",
85
+ "InferService",
80
86
 
81
87
  # Core Entities
82
88
  "Data",
@@ -93,6 +99,8 @@ __all__ = (
93
99
  "Export",
94
100
  "Content",
95
101
  "Frame",
102
+ "PredictionSet",
103
+ "Model",
96
104
 
97
105
  # Enums
98
106
  "DataType",
spb_onprem/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.5.10'
32
- __version_tuple__ = version_tuple = (0, 5, 10)
31
+ __version__ = version = '0.5.11'
32
+ __version_tuple__ = version_tuple = (0, 5, 11)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -65,8 +65,7 @@ class ActivityService(BaseService):
65
65
  meta=meta,
66
66
  )
67
67
  )
68
- activity_dict = response
69
- return Activity.model_validate(activity_dict)
68
+ return Activity.model_validate(response)
70
69
 
71
70
  def get_activities(
72
71
  self,
@@ -1,8 +1,10 @@
1
1
 
2
2
  from .create import create_variables
3
3
  from .get_download_url import get_download_url_params
4
+ from .delete_content import delete_content_params
4
5
 
5
6
  __all__ = (
6
7
  "create_variables",
7
8
  "get_download_url_params",
9
+ "delete_content_params",
8
10
  )
@@ -0,0 +1,10 @@
1
+ def delete_content_params(content_id: str):
2
+ """Generate variables for delete content GraphQL mutation.
3
+
4
+ Args:
5
+ content_id (str): The ID of the content to delete.
6
+
7
+ Returns:
8
+ dict: Variables dictionary for the GraphQL query.
9
+ """
10
+ return {"id": content_id}
@@ -1,6 +1,7 @@
1
1
  from .params import (
2
2
  create_variables,
3
3
  get_download_url_params,
4
+ delete_content_params,
4
5
  )
5
6
 
6
7
  class Queries:
@@ -33,3 +34,13 @@ class Queries:
33
34
  ''',
34
35
  "variables": get_download_url_params
35
36
  }
37
+
38
+ DELETE = {
39
+ "name": "deleteContent",
40
+ "query": '''
41
+ mutation DeleteContent($id: ID!) {
42
+ deleteContent(id: $id)
43
+ }
44
+ ''',
45
+ "variables": delete_content_params
46
+ }
@@ -176,3 +176,22 @@ class ContentService(BaseService):
176
176
  variables=Queries.GET_DOWNLOAD_URL["variables"](content_id)
177
177
  )
178
178
  return response
179
+
180
+ def delete_content(
181
+ self,
182
+ content_id: str,
183
+ ) -> bool:
184
+ '''
185
+ Delete a content by ID.
186
+
187
+ Args:
188
+ content_id (str): The ID of the content to delete.
189
+
190
+ Returns:
191
+ bool: True if deletion was successful.
192
+ '''
193
+ response = self.request_gql(
194
+ query=Queries.DELETE,
195
+ variables=Queries.DELETE["variables"](content_id)
196
+ )
197
+ return response.get("deleteContent", False)
@@ -15,6 +15,12 @@ from .data_list import (
15
15
  DataFilterOptions,
16
16
  DataListFilter,
17
17
  )
18
+ from .get_data_detail import (
19
+ get_data_detail_params,
20
+ )
21
+ from .get_evaluation_value_list import (
22
+ get_evaluation_value_list_params,
23
+ )
18
24
  from .remove_data_from_slice import (
19
25
  remove_data_from_slice_params
20
26
  )
@@ -73,6 +79,8 @@ __all__ = [
73
79
  "get_params",
74
80
  "get_data_id_list_params",
75
81
  "get_data_list_params",
82
+ "get_data_detail_params",
83
+ "get_evaluation_value_list_params",
76
84
  "AnnotationFilter",
77
85
  "AnnotationRangeFilter",
78
86
  "DataFilterOptions",
@@ -0,0 +1,14 @@
1
+ def get_data_detail_params(dataset_id: str, data_id: str):
2
+ """Generate variables for get data detail GraphQL query.
3
+
4
+ Args:
5
+ dataset_id (str): The ID of the dataset.
6
+ data_id (str): The ID of the data.
7
+
8
+ Returns:
9
+ dict: Variables dictionary for the GraphQL query.
10
+ """
11
+ return {
12
+ "datasetId": dataset_id,
13
+ "id": data_id
14
+ }
@@ -0,0 +1,36 @@
1
+ from typing import Union
2
+ from spb_onprem.base_types import UndefinedType, Undefined
3
+
4
+
5
+ def get_evaluation_value_list_params(
6
+ dataset_id: str,
7
+ prediction_set_id: str,
8
+ filter: Union[UndefinedType, dict] = Undefined,
9
+ length: int = 50,
10
+ cursor: Union[UndefinedType, str] = Undefined
11
+ ):
12
+ """Generate variables for get evaluation value list GraphQL query.
13
+
14
+ Args:
15
+ dataset_id (str): The ID of the dataset.
16
+ prediction_set_id (str): The ID of the prediction set.
17
+ filter (Union[UndefinedType, dict], optional): Diagnosis filter for evaluation values.
18
+ length (int): Number of items to retrieve per page.
19
+ cursor (Union[UndefinedType, str], optional): Cursor for pagination.
20
+
21
+ Returns:
22
+ dict: Variables dictionary for the GraphQL query.
23
+ """
24
+ params = {
25
+ "datasetId": dataset_id,
26
+ "predictionSetId": prediction_set_id,
27
+ "length": length
28
+ }
29
+
30
+ if filter is not Undefined:
31
+ params["filter"] = filter
32
+
33
+ if cursor is not Undefined:
34
+ params["cursor"] = cursor
35
+
36
+ return params
@@ -4,6 +4,8 @@ from .params import (
4
4
  get_params,
5
5
  get_data_id_list_params,
6
6
  get_data_list_params,
7
+ get_data_detail_params,
8
+ get_evaluation_value_list_params,
7
9
  remove_data_from_slice_params,
8
10
  insert_data_to_slice_params,
9
11
  delete_data_params,
@@ -106,6 +108,34 @@ class Schemas:
106
108
  {DATA}
107
109
  }}
108
110
  '''
111
+
112
+ DATA_DETAIL = '''
113
+ id
114
+ datasetId
115
+ scene {
116
+ id
117
+ content {
118
+ id
119
+ }
120
+ }
121
+ annotation {
122
+ versions {
123
+ id
124
+ content {
125
+ id
126
+ }
127
+ }
128
+ }
129
+ predictions {
130
+ id
131
+ content {
132
+ id
133
+ }
134
+ }
135
+ thumbnail {
136
+ id
137
+ }
138
+ '''
109
139
 
110
140
 
111
141
  class Queries():
@@ -590,3 +620,43 @@ class Queries():
590
620
  ''',
591
621
  "variables": update_frames_params,
592
622
  }
623
+
624
+ GET_DETAIL = {
625
+ "name": "getDataDetail",
626
+ "query": f'''
627
+ query GetDataDetail($datasetId: String!, $id: String!) {{
628
+ data(datasetId: $datasetId, id: $id) {{
629
+ {Schemas.DATA_DETAIL}
630
+ }}
631
+ }}
632
+ ''',
633
+ "variables": get_data_detail_params
634
+ }
635
+
636
+ GET_EVALUATION_VALUE_LIST = {
637
+ "name": "getEvaluationValueList",
638
+ "query": '''
639
+ query GetEvaluationValueList(
640
+ $datasetId: String!,
641
+ $predictionSetId: String!,
642
+ $filter: DiagnosisFilter,
643
+ $length: Int,
644
+ $cursor: String
645
+ ) {
646
+ evaluationValueList(
647
+ datasetId: $datasetId,
648
+ predictionSetId: $predictionSetId,
649
+ filter: $filter,
650
+ length: $length,
651
+ cursor: $cursor
652
+ ) {
653
+ totalCount
654
+ next
655
+ data {
656
+ dataId
657
+ }
658
+ }
659
+ }
660
+ ''',
661
+ "variables": get_evaluation_value_list_params
662
+ }
@@ -769,3 +769,98 @@ class DataService(BaseService):
769
769
  )
770
770
  data = Data.model_validate(response)
771
771
  return data
772
+
773
+ def get_data_detail(
774
+ self,
775
+ dataset_id: str,
776
+ data_id: str,
777
+ ) -> Data:
778
+ """Get detailed data information including all nested relationships.
779
+
780
+ This method retrieves comprehensive data information including:
781
+ - Scene content references
782
+ - Annotation versions with content references
783
+ - Predictions with content references
784
+ - Thumbnail references
785
+
786
+ Args:
787
+ dataset_id (str): The dataset ID.
788
+ data_id (str): The data ID.
789
+
790
+ Returns:
791
+ Data: The data object with all nested relationships.
792
+ """
793
+ if dataset_id is None:
794
+ raise BadParameterError("dataset_id is required.")
795
+ if data_id is None:
796
+ raise BadParameterError("data_id is required.")
797
+
798
+ response = self.request_gql(
799
+ Queries.GET_DETAIL,
800
+ Queries.GET_DETAIL["variables"](dataset_id, data_id)
801
+ )
802
+ data_dict = response.get("data", {})
803
+ return Data.model_validate(data_dict)
804
+
805
+ def get_evaluation_value_list(
806
+ self,
807
+ dataset_id: str,
808
+ prediction_set_id: str,
809
+ filter: Union[UndefinedType, dict] = Undefined,
810
+ length: int = 50,
811
+ cursor: Union[UndefinedType, str] = Undefined
812
+ ) -> dict:
813
+ """Get evaluation values list for diagnosis filtering.
814
+
815
+ Retrieves evaluation values for diagnosis filtering with pagination support.
816
+
817
+ Args:
818
+ dataset_id (str): The dataset ID.
819
+ prediction_set_id (str): The prediction set ID.
820
+ filter (Union[UndefinedType, dict]): Diagnosis filter for evaluation values.
821
+ length (int): Number of items to retrieve per page.
822
+ cursor (Union[UndefinedType, str]): Cursor for pagination.
823
+
824
+ Returns:
825
+ dict: Response containing totalCount, next cursor, and data list with dataId fields.
826
+ """
827
+ if dataset_id is None:
828
+ raise BadParameterError("dataset_id is required.")
829
+ if prediction_set_id is None:
830
+ raise BadParameterError("prediction_set_id is required.")
831
+
832
+ response = self.request_gql(
833
+ Queries.GET_EVALUATION_VALUE_LIST,
834
+ Queries.GET_EVALUATION_VALUE_LIST["variables"](
835
+ dataset_id=dataset_id,
836
+ prediction_set_id=prediction_set_id,
837
+ filter=filter,
838
+ length=length,
839
+ cursor=cursor
840
+ )
841
+ )
842
+ return response.get("evaluationValueList", {})
843
+
844
+ def get_total_data_id_count_in_evaluation_value(
845
+ self,
846
+ dataset_id: str,
847
+ prediction_set_id: str,
848
+ filter: Union[UndefinedType, dict] = Undefined
849
+ ) -> int:
850
+ """Get total count of data IDs in evaluation values for diagnosis filtering.
851
+
852
+ Args:
853
+ dataset_id (str): The dataset ID.
854
+ prediction_set_id (str): The prediction set ID.
855
+ filter (Union[UndefinedType, dict]): Diagnosis filter for evaluation values.
856
+
857
+ Returns:
858
+ int: Total count of evaluation values.
859
+ """
860
+ result = self.get_evaluation_value_list(
861
+ dataset_id=dataset_id,
862
+ prediction_set_id=prediction_set_id,
863
+ filter=filter,
864
+ length=1
865
+ )
866
+ return result.get("totalCount", 0)
@@ -2,10 +2,12 @@ from .dataset import dataset_params
2
2
  from .datasets import datasets_params
3
3
  from .create_dataset import create_dataset_params
4
4
  from .update_dataset import update_dataset_params
5
+ from .delete_dataset import delete_dataset_params
5
6
 
6
7
  __all__ = (
7
8
  "dataset_params",
8
9
  "datasets_params",
9
10
  "create_dataset_params",
10
11
  "update_dataset_params",
12
+ "delete_dataset_params",
11
13
  )
@@ -0,0 +1,12 @@
1
+ def delete_dataset_params(dataset_id: str):
2
+ """Generate variables for delete dataset GraphQL mutation.
3
+
4
+ Args:
5
+ dataset_id (str): The ID of the dataset to delete.
6
+
7
+ Returns:
8
+ dict: Variables dictionary for the GraphQL mutation.
9
+ """
10
+ return {
11
+ "dataset_id": dataset_id
12
+ }
@@ -3,6 +3,7 @@ from spb_onprem.datasets.params import (
3
3
  datasets_params,
4
4
  create_dataset_params,
5
5
  update_dataset_params,
6
+ delete_dataset_params,
6
7
  )
7
8
 
8
9
  class Schemas:
@@ -77,3 +78,13 @@ class Queries():
77
78
  ''',
78
79
  "variables": update_dataset_params,
79
80
  }
81
+
82
+ DELETE_DATASET = {
83
+ "name": "deleteDataset",
84
+ "query": '''
85
+ mutation DeleteDataset($dataset_id: String!) {
86
+ deleteDataset(datasetId: $dataset_id)
87
+ }
88
+ ''',
89
+ "variables": delete_dataset_params,
90
+ }
@@ -130,3 +130,21 @@ class DatasetService(BaseService):
130
130
  ),
131
131
  )
132
132
  return Dataset.model_validate(response)
133
+
134
+ def delete_dataset(self, dataset_id: str) -> bool:
135
+ """Delete the dataset.
136
+
137
+ Args:
138
+ dataset_id (str): The ID of the dataset to delete.
139
+
140
+ Returns:
141
+ bool: True if deletion was successful.
142
+ """
143
+ if dataset_id is None:
144
+ raise BadParameterError("dataset_id is required.")
145
+
146
+ response = self.request_gql(
147
+ Queries.DELETE_DATASET,
148
+ Queries.DELETE_DATASET["variables"](dataset_id=dataset_id)
149
+ )
150
+ return response.get("deleteDataset", False)
spb_onprem/entities.py CHANGED
@@ -26,6 +26,8 @@ from .activities.entities import (
26
26
  )
27
27
  from .exports.entities import Export
28
28
  from .contents.entities import Content
29
+ from .predictions.entities import PredictionSet
30
+ from .models.entities import Model
29
31
 
30
32
  __all__ = [
31
33
  # Core Entities
@@ -43,6 +45,8 @@ __all__ = [
43
45
  "Export",
44
46
  "Content",
45
47
  "Frame",
48
+ "PredictionSet",
49
+ "Model",
46
50
 
47
51
  # Enums
48
52
  "DataType",
@@ -0,0 +1,5 @@
1
+ from .service import InferService
2
+
3
+ __all__ = [
4
+ "InferService",
5
+ ]
@@ -0,0 +1,56 @@
1
+ import os
2
+ from typing import Dict, Any
3
+
4
+ from spb_onprem.base_service import BaseService
5
+ from spb_onprem.exceptions import BadParameterError
6
+
7
+
8
+ class InferService(BaseService):
9
+ """Service class for handling inference operations."""
10
+
11
+ def __init__(self):
12
+ super().__init__()
13
+ self.model_endpoint_url = os.environ.get("MODEL_ENDPOINT_URL")
14
+ if not self.model_endpoint_url:
15
+ raise ValueError("MODEL_ENDPOINT_URL environment variable is required")
16
+
17
+ def infer_data(
18
+ self,
19
+ model_id: str,
20
+ base64_image: str
21
+ ) -> Dict[str, Any]:
22
+ """Perform inference on image data using the specified model.
23
+
24
+ Args:
25
+ model_id (str): The model ID to use for inference.
26
+ base64_image (str): Base64 encoded image data.
27
+
28
+ Returns:
29
+ Dict[str, Any]: The inference result.
30
+
31
+ Raises:
32
+ BadParameterError: If required parameters are missing.
33
+ """
34
+ if model_id is None:
35
+ raise BadParameterError("model_id is required.")
36
+ if base64_image is None:
37
+ raise BadParameterError("base64_image is required.")
38
+
39
+ payload = {
40
+ "model_id": model_id,
41
+ "base64_image": base64_image,
42
+ }
43
+
44
+ try:
45
+ response = self.request(
46
+ method="POST",
47
+ url=self.model_endpoint_url,
48
+ json_data=payload,
49
+ headers={
50
+ "Content-Type": "application/json"
51
+ }
52
+ )
53
+ return response
54
+ except Exception as e:
55
+ print(f"Failed to fetch inference result: {e}")
56
+ raise
@@ -0,0 +1,7 @@
1
+ from .service import ModelService
2
+ from .entities import Model
3
+
4
+ __all__ = [
5
+ "ModelService",
6
+ "Model",
7
+ ]
@@ -0,0 +1,9 @@
1
+ from typing import Optional
2
+ from spb_onprem.base_model import BaseModel
3
+
4
+
5
+ class Model(BaseModel):
6
+ """Model entity representing a model in the dataset."""
7
+
8
+ id: str
9
+ name: Optional[str] = None
@@ -0,0 +1,7 @@
1
+ from .get_models import get_models_params
2
+ from .delete_model import delete_model_params
3
+
4
+ __all__ = [
5
+ "get_models_params",
6
+ "delete_model_params",
7
+ ]
@@ -0,0 +1,14 @@
1
+ def delete_model_params(dataset_id: str, model_id: str):
2
+ """Generate variables for delete model GraphQL mutation.
3
+
4
+ Args:
5
+ dataset_id (str): The ID of the dataset.
6
+ model_id (str): The ID of the model to delete.
7
+
8
+ Returns:
9
+ dict: Variables dictionary for the GraphQL mutation.
10
+ """
11
+ return {
12
+ "dataset_id": dataset_id,
13
+ "id": model_id
14
+ }
@@ -0,0 +1,29 @@
1
+ def get_models_params(
2
+ dataset_id: str,
3
+ filter: dict = None,
4
+ cursor: str = None,
5
+ length: int = 50
6
+ ):
7
+ """Generate variables for get models GraphQL query.
8
+
9
+ Args:
10
+ dataset_id (str): The ID of the dataset.
11
+ filter (dict, optional): Filter for models.
12
+ cursor (str, optional): Cursor for pagination.
13
+ length (int): Number of items to retrieve per page.
14
+
15
+ Returns:
16
+ dict: Variables dictionary for the GraphQL query.
17
+ """
18
+ params = {
19
+ "dataset_id": dataset_id,
20
+ "length": length
21
+ }
22
+
23
+ if filter is not None:
24
+ params["filter"] = filter
25
+
26
+ if cursor is not None:
27
+ params["cursor"] = cursor
28
+
29
+ return params
@@ -0,0 +1,33 @@
1
+ from .params import (
2
+ get_models_params,
3
+ delete_model_params,
4
+ )
5
+
6
+
7
+ class Queries:
8
+ GET_MODELS = {
9
+ "name": "getModels",
10
+ "query": '''
11
+ query GetModels($dataset_id: String!, $filter: ModelFilter, $cursor: String, $length: Int) {
12
+ models(datasetId: $dataset_id, filter: $filter, cursor: $cursor, length: $length) {
13
+ models {
14
+ id
15
+ name
16
+ }
17
+ next
18
+ totalCount
19
+ }
20
+ }
21
+ ''',
22
+ "variables": get_models_params
23
+ }
24
+
25
+ DELETE_MODEL = {
26
+ "name": "deleteModel",
27
+ "query": '''
28
+ mutation DeleteModel($dataset_id: String!, $id: String!) {
29
+ deleteModel(datasetId: $dataset_id, id: $id)
30
+ }
31
+ ''',
32
+ "variables": delete_model_params
33
+ }