hiddenlayer-sdk 1.2.1__py3-none-any.whl → 2.0.1__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.
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]