hiddenlayer-sdk 1.2.1__py3-none-any.whl → 2.0.1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. hiddenlayer/__init__.py +0 -10
  2. hiddenlayer/sdk/exceptions.py +1 -1
  3. hiddenlayer/sdk/models.py +2 -3
  4. hiddenlayer/sdk/rest/__init__.py +16 -11
  5. hiddenlayer/sdk/rest/api/__init__.py +0 -1
  6. hiddenlayer/sdk/rest/api/model_supply_chain_api.py +1706 -571
  7. hiddenlayer/sdk/rest/api/sensor_api.py +214 -1320
  8. hiddenlayer/sdk/rest/models/__init__.py +16 -10
  9. hiddenlayer/sdk/rest/models/{scan_model_request.py → begin_multi_file_upload200_response.py} +9 -9
  10. hiddenlayer/sdk/rest/models/{get_multipart_upload_response.py → begin_multipart_file_upload200_response.py} +9 -9
  11. hiddenlayer/sdk/rest/models/{multipart_upload_part.py → begin_multipart_file_upload200_response_parts_inner.py} +11 -10
  12. hiddenlayer/sdk/rest/models/errors_inner.py +91 -0
  13. hiddenlayer/sdk/rest/models/file_details_v3.py +8 -2
  14. hiddenlayer/sdk/rest/models/{scan_results_v2.py → file_result_v3.py} +21 -32
  15. hiddenlayer/sdk/rest/models/{model_scan_api_v3_scan_query200_response.py → get_condensed_model_scan_reports200_response.py} +4 -4
  16. hiddenlayer/sdk/rest/models/inventory_v3.py +97 -0
  17. hiddenlayer/sdk/rest/models/model_inventory_info.py +1 -1
  18. hiddenlayer/sdk/rest/models/{detections.py → multi_file_upload_request_v3.py} +14 -22
  19. hiddenlayer/sdk/rest/models/{model_scan_api_v3_scan_model_version_id_patch200_response.py → notify_model_scan_completed200_response.py} +4 -4
  20. hiddenlayer/sdk/rest/models/pagination_v3.py +95 -0
  21. hiddenlayer/sdk/rest/models/problem_details.py +103 -0
  22. hiddenlayer/sdk/rest/models/scan_detection_v31.py +155 -0
  23. hiddenlayer/sdk/rest/models/scan_model_details_v3.py +1 -1
  24. hiddenlayer/sdk/rest/models/scan_results_map_v3.py +105 -0
  25. hiddenlayer/sdk/rest/models/scan_results_v3.py +120 -0
  26. hiddenlayer/sdk/rest/models/{model.py → sensor.py} +4 -4
  27. hiddenlayer/sdk/rest/models/{model_query_response.py → sensor_query_response.py} +7 -7
  28. hiddenlayer/sdk/services/aidr_predictive.py +57 -3
  29. hiddenlayer/sdk/services/model_scan.py +98 -135
  30. hiddenlayer/sdk/version.py +1 -1
  31. {hiddenlayer_sdk-1.2.1.dist-info → hiddenlayer_sdk-2.0.1.dist-info}/METADATA +12 -2
  32. {hiddenlayer_sdk-1.2.1.dist-info → hiddenlayer_sdk-2.0.1.dist-info}/RECORD +35 -31
  33. hiddenlayer/sdk/rest/api/model_scan_api.py +0 -591
  34. hiddenlayer/sdk/rest/models/scan_results.py +0 -118
  35. hiddenlayer/sdk/services/model.py +0 -149
  36. {hiddenlayer_sdk-1.2.1.dist-info → hiddenlayer_sdk-2.0.1.dist-info}/LICENSE +0 -0
  37. {hiddenlayer_sdk-1.2.1.dist-info → hiddenlayer_sdk-2.0.1.dist-info}/WHEEL +0 -0
  38. {hiddenlayer_sdk-1.2.1.dist-info → hiddenlayer_sdk-2.0.1.dist-info}/top_level.txt +0 -0
@@ -1,149 +0,0 @@
1
- import json
2
- import random
3
- import time
4
- from typing import Optional
5
-
6
- from hiddenlayer.sdk.constants import ApiErrors
7
- from hiddenlayer.sdk.exceptions import (
8
- HiddenlayerConflictError,
9
- IncompatibleModelError,
10
- ModelDoesNotExistError,
11
- )
12
- from hiddenlayer.sdk.rest.api import SensorApi
13
- from hiddenlayer.sdk.rest.api_client import ApiClient
14
- from hiddenlayer.sdk.rest.exceptions import ApiException
15
- from hiddenlayer.sdk.rest.models import (
16
- CreateSensorRequest,
17
- Model,
18
- SensorSORQueryFilter,
19
- SensorSORQueryRequest,
20
- )
21
-
22
-
23
- class ModelAPI:
24
- def __init__(self, api_client: ApiClient) -> None:
25
- self._sensor_api = SensorApi(api_client=api_client)
26
-
27
- def create(self, *, model_name: str, model_version: Optional[int]) -> Model:
28
- """
29
- Creates a model in the HiddenLayer Platform.
30
-
31
- :params model_name: Name of the model
32
- :params model_version: Version of the model
33
-
34
- :returns: HiddenLayer ModelID
35
- """
36
- return self._sensor_api.create_sensor(
37
- CreateSensorRequest(
38
- plaintext_name=model_name, version=model_version, adhoc=True
39
- )
40
- )
41
-
42
- def create_or_get(self, *, model_name: str, model_version: Optional[int]) -> Model:
43
- """
44
- Creates a model in the HiddenLayer Platform if it does not exist.
45
- If the model and version already exists, returns the existing model.
46
-
47
- :params model_name: Name of the model
48
- :params model_version: Version of the model
49
-
50
- :returns: HiddenLayer ModelID
51
- """
52
- try:
53
- return self.create(model_name=model_name, model_version=model_version)
54
- except ApiException as e:
55
- if e.status == 400 and str(e.body).find(ApiErrors.SENSOR_EXISTS) != -1:
56
- return self.get_with_retry(
57
- model_name=model_name, version=model_version, retry=3
58
- )
59
- else:
60
- raise e
61
-
62
- def get_with_retry(
63
- self, *, model_name: str, version: Optional[int], retry: int
64
- ) -> Model:
65
- """
66
- Gets a HiddenLayer model object. If not version is supplied, the latest model is returned.
67
- Retries if the model is not found.
68
-
69
- :param model_name: Name of the model.
70
- :param version: Version of the model to get.
71
- :param retry: Number of retries
72
-
73
- :returns: HiddenLayer Model object
74
- """
75
-
76
- base_delay = 0.1 # seconds
77
- for retryCount in range(retry):
78
- try:
79
- return self.get(model_name=model_name, version=version)
80
- except ModelDoesNotExistError:
81
- time.sleep(base_delay * 2**retryCount + random.uniform(0, 1))
82
- pass
83
- raise ModelDoesNotExistError(f"Model {model_name} does not exist")
84
-
85
- def get(self, *, model_name: str, version: Optional[int] = None) -> Model:
86
- """
87
- Gets a HiddenLayer model object. If not version is supplied, the latest model is returned.
88
-
89
- :param model_name: Name of the model.
90
- :param version: Version of the model to get.
91
-
92
- :returns: HiddenLayer Model object
93
- """
94
-
95
- return self._get_model_by_name(model_name=model_name, version=version)
96
-
97
- def delete(self, *, model_name: str) -> None:
98
- """
99
- Delete a model.
100
-
101
- :param model_name: Name of the model.
102
- """
103
-
104
- model = self._get_model_by_name(model_name=model_name, version=None)
105
-
106
- try:
107
- self._sensor_api.delete_model(sensor_id=model.sensor_id)
108
- except ApiException as e:
109
- reason = json.loads(str(e.body))["detail"]
110
-
111
- if reason == ApiErrors.NON_ADHOC_SENSOR_DELETE:
112
- raise IncompatibleModelError(
113
- "This type of model is unable to be deleted."
114
- )
115
- else:
116
- raise HiddenlayerConflictError(reason)
117
- except Exception as e:
118
- raise e
119
-
120
- def _get_model_by_name(
121
- self, *, model_name: str, version: Optional[int] = None
122
- ) -> Model:
123
- """
124
- Gets a model object by name. If version is not supplied, get the latest.
125
-
126
- :param model_name: Name of the model.
127
- :param version: Version of the model to get.
128
-
129
- :returns: HiddenLayer Model object
130
- """
131
-
132
- models = self._sensor_api.query_sensor(
133
- sensor_sor_query_request=SensorSORQueryRequest(
134
- filter=SensorSORQueryFilter(plaintext_name=model_name, version=version)
135
- )
136
- )
137
-
138
- if not models.results or len(models.results) == 0:
139
- msg = f"Model {model_name} does not exist"
140
-
141
- if version:
142
- msg = f"{msg} for version {version}."
143
-
144
- raise ModelDoesNotExistError(msg)
145
-
146
- if not version:
147
- models.results.sort(key=lambda x: x.version, reverse=True)
148
-
149
- return models.results[0]