hiddenlayer-sdk 1.0.0__tar.gz → 1.1.1__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/PKG-INFO +2 -2
  2. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/constants.py +1 -0
  3. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/models.py +2 -2
  4. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/__init__.py +1 -1
  5. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/api/sensor_api.py +24 -36
  6. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/__init__.py +1 -1
  7. hiddenlayer_sdk-1.0.0/hiddenlayer/sdk/rest/models/file_results_inner.py → hiddenlayer_sdk-1.1.1/hiddenlayer/sdk/rest/models/file_scan_report_v3.py +17 -6
  8. hiddenlayer_sdk-1.0.0/hiddenlayer/sdk/rest/models/file_scan_report_v3.py → hiddenlayer_sdk-1.1.1/hiddenlayer/sdk/rest/models/file_scan_reports_v3.py +7 -7
  9. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/model_scan_api_v3_scan_query200_response.py +2 -2
  10. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/multipart_upload_part.py +5 -5
  11. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/paged_response_with_total.py +2 -2
  12. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_detection_v3.py +2 -2
  13. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_report_v3.py +3 -3
  14. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/sensor_sor_model_card_response.py +1 -1
  15. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/services/model.py +46 -1
  16. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/services/model_scan.py +1 -1
  17. hiddenlayer_sdk-1.1.1/hiddenlayer/sdk/version.py +1 -0
  18. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer_sdk.egg-info/PKG-INFO +2 -2
  19. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer_sdk.egg-info/SOURCES.txt +1 -1
  20. hiddenlayer_sdk-1.0.0/hiddenlayer/sdk/version.py +0 -1
  21. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/LICENSE +0 -0
  22. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/README.md +0 -0
  23. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/__init__.py +0 -0
  24. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/__init__.py +0 -0
  25. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/exceptions.py +0 -0
  26. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/api/__init__.py +0 -0
  27. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/api/aidr_predictive_api.py +0 -0
  28. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/api/health_api.py +0 -0
  29. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/api/model_scan_api.py +0 -0
  30. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/api/model_supply_chain_api.py +0 -0
  31. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/api/readiness_api.py +0 -0
  32. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/api_client.py +0 -0
  33. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/api_response.py +0 -0
  34. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/configuration.py +0 -0
  35. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/exceptions.py +0 -0
  36. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/address.py +0 -0
  37. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/artifact.py +0 -0
  38. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/artifact_change.py +0 -0
  39. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/artifact_content.py +0 -0
  40. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/artifact_location.py +0 -0
  41. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/attachment.py +0 -0
  42. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/code_flow.py +0 -0
  43. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/configuration_override.py +0 -0
  44. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/conversion.py +0 -0
  45. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/create_sensor_request.py +0 -0
  46. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/detections.py +0 -0
  47. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/edge.py +0 -0
  48. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/edge_traversal.py +0 -0
  49. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/exception.py +0 -0
  50. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/external_properties.py +0 -0
  51. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/external_property_file_reference.py +0 -0
  52. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/external_property_file_references.py +0 -0
  53. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/file_details_v3.py +0 -0
  54. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/fix.py +0 -0
  55. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/get_multipart_upload_response.py +0 -0
  56. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/graph.py +0 -0
  57. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/graph_traversal.py +0 -0
  58. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/invocation.py +0 -0
  59. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/location.py +0 -0
  60. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/location_inner.py +0 -0
  61. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/location_relationship.py +0 -0
  62. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/logical_location.py +0 -0
  63. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/message.py +0 -0
  64. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/mitre_atlas_inner.py +0 -0
  65. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/model.py +0 -0
  66. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/model_inventory_info.py +0 -0
  67. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/model_query_response.py +0 -0
  68. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/model_scan_api_v3_scan_model_version_id_patch200_response.py +0 -0
  69. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/multiformat_message_string.py +0 -0
  70. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/node.py +0 -0
  71. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/notification.py +0 -0
  72. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/physical_location.py +0 -0
  73. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/property_bag.py +0 -0
  74. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/rectangle.py +0 -0
  75. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/region.py +0 -0
  76. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/replacement.py +0 -0
  77. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/reporting_configuration.py +0 -0
  78. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/reporting_descriptor.py +0 -0
  79. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/reporting_descriptor_reference.py +0 -0
  80. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/reporting_descriptor_relationship.py +0 -0
  81. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/result.py +0 -0
  82. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/result_provenance.py +0 -0
  83. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/rule_details_inner.py +0 -0
  84. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/run.py +0 -0
  85. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/run_automation_details.py +0 -0
  86. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/sarif210.py +0 -0
  87. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_create_request.py +0 -0
  88. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_header_v3.py +0 -0
  89. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_job.py +0 -0
  90. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_job_inventory.py +0 -0
  91. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_model_details_v3.py +0 -0
  92. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_model_ids_v3.py +0 -0
  93. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_model_request.py +0 -0
  94. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_results.py +0 -0
  95. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/scan_results_v2.py +0 -0
  96. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/security_posture.py +0 -0
  97. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/sensor_sor_model_card_query_response.py +0 -0
  98. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/sensor_sor_query_filter.py +0 -0
  99. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/sensor_sor_query_request.py +0 -0
  100. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/special_locations.py +0 -0
  101. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/stack.py +0 -0
  102. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/stack_frame.py +0 -0
  103. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/submission_response.py +0 -0
  104. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/submission_v2.py +0 -0
  105. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/suppression.py +0 -0
  106. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/thread_flow.py +0 -0
  107. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/thread_flow_location.py +0 -0
  108. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/tool.py +0 -0
  109. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/tool_component.py +0 -0
  110. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/tool_component_reference.py +0 -0
  111. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/translation_metadata.py +0 -0
  112. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/validation_error_model.py +0 -0
  113. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/version_control_details.py +0 -0
  114. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/web_request.py +0 -0
  115. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/models/web_response.py +0 -0
  116. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/rest/rest.py +0 -0
  117. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/services/__init__.py +0 -0
  118. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/services/aidr_predictive.py +0 -0
  119. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer/sdk/utils.py +0 -0
  120. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer_sdk.egg-info/dependency_links.txt +0 -0
  121. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer_sdk.egg-info/requires.txt +0 -0
  122. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/hiddenlayer_sdk.egg-info/top_level.txt +0 -0
  123. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/pyproject.toml +0 -0
  124. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/setup.cfg +0 -0
  125. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/tests/test_hiddenlayer.py +0 -0
  126. {hiddenlayer_sdk-1.0.0 → hiddenlayer_sdk-1.1.1}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: hiddenlayer-sdk
3
- Version: 1.0.0
3
+ Version: 1.1.1
4
4
  Summary: Official HiddenLayer Python SDK
5
5
  Author-email: HiddenLayer Integrations Team <integrations@hiddenlayer.com>
6
6
  Maintainer-email: HiddenLayer Integrations Team <integrations@hiddenlayer.com>
@@ -12,3 +12,4 @@ class ScanStatus(str, Enum):
12
12
 
13
13
  class ApiErrors(str, Enum):
14
14
  NON_ADHOC_SENSOR_DELETE = "only adhoc sensors may be deleted"
15
+ SENSOR_EXISTS = "already exists"
@@ -9,7 +9,7 @@ from hiddenlayer.sdk.rest.models import (
9
9
  ModelInventoryInfo,
10
10
  ScanReportV3,
11
11
  )
12
- from hiddenlayer.sdk.rest.models.file_results_inner import FileResultsInner
12
+ from hiddenlayer.sdk.rest.models.file_scan_report_v3 import FileScanReportV3
13
13
  from hiddenlayer.sdk.rest.models.sarif210 import Sarif210
14
14
 
15
15
 
@@ -50,7 +50,7 @@ class EmptyScanResults(ScanResults):
50
50
  start_time: datetime = datetime.now()
51
51
  end_time: Optional[datetime] = datetime.now()
52
52
  severity: Optional[StrictStr] = ""
53
- file_results: Optional[List[FileResultsInner]] = []
53
+ file_results: Optional[List[FileScanReportV3]] = []
54
54
 
55
55
 
56
56
  class Sarif(Sarif210):
@@ -54,8 +54,8 @@ from hiddenlayer.sdk.rest.models.external_properties import ExternalProperties
54
54
  from hiddenlayer.sdk.rest.models.external_property_file_reference import ExternalPropertyFileReference
55
55
  from hiddenlayer.sdk.rest.models.external_property_file_references import ExternalPropertyFileReferences
56
56
  from hiddenlayer.sdk.rest.models.file_details_v3 import FileDetailsV3
57
- from hiddenlayer.sdk.rest.models.file_results_inner import FileResultsInner
58
57
  from hiddenlayer.sdk.rest.models.file_scan_report_v3 import FileScanReportV3
58
+ from hiddenlayer.sdk.rest.models.file_scan_reports_v3 import FileScanReportsV3
59
59
  from hiddenlayer.sdk.rest.models.fix import Fix
60
60
  from hiddenlayer.sdk.rest.models.get_multipart_upload_response import GetMultipartUploadResponse
61
61
  from hiddenlayer.sdk.rest.models.graph import Graph
@@ -16,8 +16,8 @@ from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt
16
16
  from typing import Any, Dict, List, Optional, Tuple, Union
17
17
  from typing_extensions import Annotated
18
18
 
19
- from pydantic import Field, StrictFloat, StrictInt, StrictStr, field_validator
20
- from typing import Any, Dict, Optional, Union
19
+ from pydantic import Field, StrictInt, StrictStr, field_validator
20
+ from typing import Any, Optional
21
21
  from typing_extensions import Annotated
22
22
  from hiddenlayer.sdk.rest.models.create_sensor_request import CreateSensorRequest
23
23
  from hiddenlayer.sdk.rest.models.get_multipart_upload_response import GetMultipartUploadResponse
@@ -48,7 +48,7 @@ class SensorApi:
48
48
  def begin_multipart_upload(
49
49
  self,
50
50
  sensor_id: StrictStr,
51
- x_content_length: Annotated[Union[StrictFloat, StrictInt], Field(description="The total size of multipart upload.")],
51
+ x_content_length: Annotated[StrictInt, Field(description="The total size of multipart upload.")],
52
52
  _request_timeout: Union[
53
53
  None,
54
54
  Annotated[StrictFloat, Field(gt=0)],
@@ -68,7 +68,7 @@ class SensorApi:
68
68
  :param sensor_id: (required)
69
69
  :type sensor_id: str
70
70
  :param x_content_length: The total size of multipart upload. (required)
71
- :type x_content_length: float
71
+ :type x_content_length: int
72
72
  :param _request_timeout: timeout setting for this request. If one
73
73
  number provided, it will be total request
74
74
  timeout. It can also be a pair (tuple) of
@@ -119,7 +119,7 @@ class SensorApi:
119
119
  def begin_multipart_upload_with_http_info(
120
120
  self,
121
121
  sensor_id: StrictStr,
122
- x_content_length: Annotated[Union[StrictFloat, StrictInt], Field(description="The total size of multipart upload.")],
122
+ x_content_length: Annotated[StrictInt, Field(description="The total size of multipart upload.")],
123
123
  _request_timeout: Union[
124
124
  None,
125
125
  Annotated[StrictFloat, Field(gt=0)],
@@ -139,7 +139,7 @@ class SensorApi:
139
139
  :param sensor_id: (required)
140
140
  :type sensor_id: str
141
141
  :param x_content_length: The total size of multipart upload. (required)
142
- :type x_content_length: float
142
+ :type x_content_length: int
143
143
  :param _request_timeout: timeout setting for this request. If one
144
144
  number provided, it will be total request
145
145
  timeout. It can also be a pair (tuple) of
@@ -190,7 +190,7 @@ class SensorApi:
190
190
  def begin_multipart_upload_without_preload_content(
191
191
  self,
192
192
  sensor_id: StrictStr,
193
- x_content_length: Annotated[Union[StrictFloat, StrictInt], Field(description="The total size of multipart upload.")],
193
+ x_content_length: Annotated[StrictInt, Field(description="The total size of multipart upload.")],
194
194
  _request_timeout: Union[
195
195
  None,
196
196
  Annotated[StrictFloat, Field(gt=0)],
@@ -210,7 +210,7 @@ class SensorApi:
210
210
  :param sensor_id: (required)
211
211
  :type sensor_id: str
212
212
  :param x_content_length: The total size of multipart upload. (required)
213
- :type x_content_length: float
213
+ :type x_content_length: int
214
214
  :param _request_timeout: timeout setting for this request. If one
215
215
  number provided, it will be total request
216
216
  timeout. It can also be a pair (tuple) of
@@ -334,7 +334,7 @@ class SensorApi:
334
334
  _content_type: Optional[StrictStr] = None,
335
335
  _headers: Optional[Dict[StrictStr, Any]] = None,
336
336
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
337
- ) -> object:
337
+ ) -> None:
338
338
  """Complete Multipart Upload
339
339
 
340
340
 
@@ -374,7 +374,7 @@ class SensorApi:
374
374
  )
375
375
 
376
376
  _response_types_map: Dict[str, Optional[str]] = {
377
- '200': "object",
377
+ '200': None,
378
378
  '400': None,
379
379
  }
380
380
  response_data = self.api_client.call_api(
@@ -405,7 +405,7 @@ class SensorApi:
405
405
  _content_type: Optional[StrictStr] = None,
406
406
  _headers: Optional[Dict[StrictStr, Any]] = None,
407
407
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
408
- ) -> ApiResponse[object]:
408
+ ) -> ApiResponse[None]:
409
409
  """Complete Multipart Upload
410
410
 
411
411
 
@@ -445,7 +445,7 @@ class SensorApi:
445
445
  )
446
446
 
447
447
  _response_types_map: Dict[str, Optional[str]] = {
448
- '200': "object",
448
+ '200': None,
449
449
  '400': None,
450
450
  }
451
451
  response_data = self.api_client.call_api(
@@ -516,7 +516,7 @@ class SensorApi:
516
516
  )
517
517
 
518
518
  _response_types_map: Dict[str, Optional[str]] = {
519
- '200': "object",
519
+ '200': None,
520
520
  '400': None,
521
521
  }
522
522
  response_data = self.api_client.call_api(
@@ -559,12 +559,6 @@ class SensorApi:
559
559
  # process the body parameter
560
560
 
561
561
 
562
- # set the HTTP header `Accept`
563
- _header_params['Accept'] = self.api_client.select_header_accept(
564
- [
565
- 'application/json'
566
- ]
567
- )
568
562
 
569
563
 
570
564
  # authentication setting
@@ -1984,7 +1978,7 @@ class SensorApi:
1984
1978
  self,
1985
1979
  sensor_id: StrictStr,
1986
1980
  upload_id: StrictStr,
1987
- part: Union[StrictFloat, StrictInt],
1981
+ part: StrictInt,
1988
1982
  body: Optional[Any],
1989
1983
  _request_timeout: Union[
1990
1984
  None,
@@ -1998,7 +1992,7 @@ class SensorApi:
1998
1992
  _content_type: Optional[StrictStr] = None,
1999
1993
  _headers: Optional[Dict[StrictStr, Any]] = None,
2000
1994
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
2001
- ) -> object:
1995
+ ) -> None:
2002
1996
  """Upload part
2003
1997
 
2004
1998
 
@@ -2007,7 +2001,7 @@ class SensorApi:
2007
2001
  :param upload_id: (required)
2008
2002
  :type upload_id: str
2009
2003
  :param part: (required)
2010
- :type part: float
2004
+ :type part: int
2011
2005
  :param body: (required)
2012
2006
  :type body: object
2013
2007
  :param _request_timeout: timeout setting for this request. If one
@@ -2044,7 +2038,7 @@ class SensorApi:
2044
2038
  )
2045
2039
 
2046
2040
  _response_types_map: Dict[str, Optional[str]] = {
2047
- '200': "object",
2041
+ '200': None,
2048
2042
  '400': None,
2049
2043
  }
2050
2044
  response_data = self.api_client.call_api(
@@ -2063,7 +2057,7 @@ class SensorApi:
2063
2057
  self,
2064
2058
  sensor_id: StrictStr,
2065
2059
  upload_id: StrictStr,
2066
- part: Union[StrictFloat, StrictInt],
2060
+ part: StrictInt,
2067
2061
  body: Optional[Any],
2068
2062
  _request_timeout: Union[
2069
2063
  None,
@@ -2077,7 +2071,7 @@ class SensorApi:
2077
2071
  _content_type: Optional[StrictStr] = None,
2078
2072
  _headers: Optional[Dict[StrictStr, Any]] = None,
2079
2073
  _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
2080
- ) -> ApiResponse[object]:
2074
+ ) -> ApiResponse[None]:
2081
2075
  """Upload part
2082
2076
 
2083
2077
 
@@ -2086,7 +2080,7 @@ class SensorApi:
2086
2080
  :param upload_id: (required)
2087
2081
  :type upload_id: str
2088
2082
  :param part: (required)
2089
- :type part: float
2083
+ :type part: int
2090
2084
  :param body: (required)
2091
2085
  :type body: object
2092
2086
  :param _request_timeout: timeout setting for this request. If one
@@ -2123,7 +2117,7 @@ class SensorApi:
2123
2117
  )
2124
2118
 
2125
2119
  _response_types_map: Dict[str, Optional[str]] = {
2126
- '200': "object",
2120
+ '200': None,
2127
2121
  '400': None,
2128
2122
  }
2129
2123
  response_data = self.api_client.call_api(
@@ -2142,7 +2136,7 @@ class SensorApi:
2142
2136
  self,
2143
2137
  sensor_id: StrictStr,
2144
2138
  upload_id: StrictStr,
2145
- part: Union[StrictFloat, StrictInt],
2139
+ part: StrictInt,
2146
2140
  body: Optional[Any],
2147
2141
  _request_timeout: Union[
2148
2142
  None,
@@ -2165,7 +2159,7 @@ class SensorApi:
2165
2159
  :param upload_id: (required)
2166
2160
  :type upload_id: str
2167
2161
  :param part: (required)
2168
- :type part: float
2162
+ :type part: int
2169
2163
  :param body: (required)
2170
2164
  :type body: object
2171
2165
  :param _request_timeout: timeout setting for this request. If one
@@ -2202,7 +2196,7 @@ class SensorApi:
2202
2196
  )
2203
2197
 
2204
2198
  _response_types_map: Dict[str, Optional[str]] = {
2205
- '200': "object",
2199
+ '200': None,
2206
2200
  '400': None,
2207
2201
  }
2208
2202
  response_data = self.api_client.call_api(
@@ -2251,12 +2245,6 @@ class SensorApi:
2251
2245
  _body_params = body
2252
2246
 
2253
2247
 
2254
- # set the HTTP header `Accept`
2255
- _header_params['Accept'] = self.api_client.select_header_accept(
2256
- [
2257
- 'application/json'
2258
- ]
2259
- )
2260
2248
 
2261
2249
  # set the HTTP header `Content-Type`
2262
2250
  if _content_type:
@@ -32,8 +32,8 @@ from hiddenlayer.sdk.rest.models.external_properties import ExternalProperties
32
32
  from hiddenlayer.sdk.rest.models.external_property_file_reference import ExternalPropertyFileReference
33
33
  from hiddenlayer.sdk.rest.models.external_property_file_references import ExternalPropertyFileReferences
34
34
  from hiddenlayer.sdk.rest.models.file_details_v3 import FileDetailsV3
35
- from hiddenlayer.sdk.rest.models.file_results_inner import FileResultsInner
36
35
  from hiddenlayer.sdk.rest.models.file_scan_report_v3 import FileScanReportV3
36
+ from hiddenlayer.sdk.rest.models.file_scan_reports_v3 import FileScanReportsV3
37
37
  from hiddenlayer.sdk.rest.models.fix import Fix
38
38
  from hiddenlayer.sdk.rest.models.get_multipart_upload_response import GetMultipartUploadResponse
39
39
  from hiddenlayer.sdk.rest.models.graph import Graph
@@ -25,9 +25,9 @@ from hiddenlayer.sdk.rest.models.scan_detection_v3 import ScanDetectionV3
25
25
  from typing import Optional, Set
26
26
  from typing_extensions import Self
27
27
 
28
- class FileResultsInner(BaseModel):
28
+ class FileScanReportV3(BaseModel):
29
29
  """
30
- FileResultsInner
30
+ FileScanReportV3
31
31
  """ # noqa: E501
32
32
  file_instance_id: StrictStr = Field(description="unique ID of the file")
33
33
  file_location: StrictStr = Field(description="full file path")
@@ -37,7 +37,8 @@ class FileResultsInner(BaseModel):
37
37
  status: StrictStr = Field(description="status of the scan")
38
38
  seen: datetime = Field(description="time the scan was seen at")
39
39
  detections: Optional[List[ScanDetectionV3]] = None
40
- __properties: ClassVar[List[str]] = ["file_instance_id", "file_location", "start_time", "end_time", "details", "status", "seen", "detections"]
40
+ file_results: Optional[List[FileScanReportV3]] = None
41
+ __properties: ClassVar[List[str]] = ["file_instance_id", "file_location", "start_time", "end_time", "details", "status", "seen", "detections", "file_results"]
41
42
 
42
43
  @field_validator('status')
43
44
  def status_validate_enum(cls, value):
@@ -64,7 +65,7 @@ class FileResultsInner(BaseModel):
64
65
 
65
66
  @classmethod
66
67
  def from_json(cls, json_str: str) -> Optional[Self]:
67
- """Create an instance of FileResultsInner from a JSON string"""
68
+ """Create an instance of FileScanReportV3 from a JSON string"""
68
69
  return cls.from_dict(json.loads(json_str))
69
70
 
70
71
  def to_dict(self) -> Dict[str, Any]:
@@ -95,11 +96,18 @@ class FileResultsInner(BaseModel):
95
96
  if _item:
96
97
  _items.append(_item.to_dict())
97
98
  _dict['detections'] = _items
99
+ # override the default output from pydantic by calling `to_dict()` of each item in file_results (list)
100
+ _items = []
101
+ if self.file_results:
102
+ for _item in self.file_results:
103
+ if _item:
104
+ _items.append(_item.to_dict())
105
+ _dict['file_results'] = _items
98
106
  return _dict
99
107
 
100
108
  @classmethod
101
109
  def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
102
- """Create an instance of FileResultsInner from a dict"""
110
+ """Create an instance of FileScanReportV3 from a dict"""
103
111
  if obj is None:
104
112
  return None
105
113
 
@@ -114,8 +122,11 @@ class FileResultsInner(BaseModel):
114
122
  "details": FileDetailsV3.from_dict(obj["details"]) if obj.get("details") is not None else None,
115
123
  "status": obj.get("status"),
116
124
  "seen": obj.get("seen"),
117
- "detections": [ScanDetectionV3.from_dict(_item) for _item in obj["detections"]] if obj.get("detections") is not None else None
125
+ "detections": [ScanDetectionV3.from_dict(_item) for _item in obj["detections"]] if obj.get("detections") is not None else None,
126
+ "file_results": [FileScanReportV3.from_dict(_item) for _item in obj["file_results"]] if obj.get("file_results") is not None else None
118
127
  })
119
128
  return _obj
120
129
 
130
+ # TODO: Rewrite to not use raise_errors
131
+ FileScanReportV3.model_rebuild(raise_errors=False)
121
132
 
@@ -19,15 +19,15 @@ import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict
21
21
  from typing import Any, ClassVar, Dict, List, Optional
22
- from hiddenlayer.sdk.rest.models.file_results_inner import FileResultsInner
22
+ from hiddenlayer.sdk.rest.models.file_scan_report_v3 import FileScanReportV3
23
23
  from typing import Optional, Set
24
24
  from typing_extensions import Self
25
25
 
26
- class FileScanReportV3(BaseModel):
26
+ class FileScanReportsV3(BaseModel):
27
27
  """
28
- FileScanReportV3
28
+ FileScanReportsV3
29
29
  """ # noqa: E501
30
- file_results: Optional[List[FileResultsInner]] = None
30
+ file_results: Optional[List[FileScanReportV3]] = None
31
31
  __properties: ClassVar[List[str]] = ["file_results"]
32
32
 
33
33
  model_config = ConfigDict(
@@ -48,7 +48,7 @@ class FileScanReportV3(BaseModel):
48
48
 
49
49
  @classmethod
50
50
  def from_json(cls, json_str: str) -> Optional[Self]:
51
- """Create an instance of FileScanReportV3 from a JSON string"""
51
+ """Create an instance of FileScanReportsV3 from a JSON string"""
52
52
  return cls.from_dict(json.loads(json_str))
53
53
 
54
54
  def to_dict(self) -> Dict[str, Any]:
@@ -80,7 +80,7 @@ class FileScanReportV3(BaseModel):
80
80
 
81
81
  @classmethod
82
82
  def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
83
- """Create an instance of FileScanReportV3 from a dict"""
83
+ """Create an instance of FileScanReportsV3 from a dict"""
84
84
  if obj is None:
85
85
  return None
86
86
 
@@ -88,7 +88,7 @@ class FileScanReportV3(BaseModel):
88
88
  return cls.model_validate(obj)
89
89
 
90
90
  _obj = cls.model_validate({
91
- "file_results": [FileResultsInner.from_dict(_item) for _item in obj["file_results"]] if obj.get("file_results") is not None else None
91
+ "file_results": [FileScanReportV3.from_dict(_item) for _item in obj["file_results"]] if obj.get("file_results") is not None else None
92
92
  })
93
93
  return _obj
94
94
 
@@ -18,7 +18,7 @@ import re # noqa: F401
18
18
  import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, Field
21
- from typing import Any, ClassVar, Dict, List, Optional, Union
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
22
  from typing_extensions import Annotated
23
23
  from hiddenlayer.sdk.rest.models.scan_report_v3 import ScanReportV3
24
24
  from typing import Optional, Set
@@ -29,7 +29,7 @@ class ModelScanApiV3ScanQuery200Response(BaseModel):
29
29
  ModelScanApiV3ScanQuery200Response
30
30
  """ # noqa: E501
31
31
  items: Optional[List[ScanReportV3]] = None
32
- total: Union[Annotated[float, Field(strict=True, ge=0)], Annotated[int, Field(strict=True, ge=0)]] = Field(description="Total number of items available based on the query criteria.")
32
+ total: Annotated[int, Field(strict=True, ge=0)] = Field(description="Total number of items available based on the query criteria.")
33
33
  limit: Annotated[int, Field(le=100, strict=True, ge=1)] = Field(description="Maximum number of items to return")
34
34
  offset: Annotated[int, Field(strict=True, ge=0)] = Field(description="Begin returning the results from this offset")
35
35
  __properties: ClassVar[List[str]] = ["items", "total", "limit", "offset"]
@@ -17,8 +17,8 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr
21
- from typing import Any, ClassVar, Dict, List, Optional, Union
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
22
  from typing import Optional, Set
23
23
  from typing_extensions import Self
24
24
 
@@ -26,9 +26,9 @@ class MultipartUploadPart(BaseModel):
26
26
  """
27
27
  MultipartUploadPart
28
28
  """ # noqa: E501
29
- part_number: Union[StrictFloat, StrictInt]
30
- start_offset: Union[StrictFloat, StrictInt]
31
- end_offset: Union[StrictFloat, StrictInt]
29
+ part_number: StrictInt
30
+ start_offset: StrictInt
31
+ end_offset: StrictInt
32
32
  upload_url: Optional[StrictStr] = Field(default=None, description="only provided when part is to be directly uploaded to a cloud provider (adhoc)")
33
33
  __properties: ClassVar[List[str]] = ["part_number", "start_offset", "end_offset", "upload_url"]
34
34
 
@@ -18,7 +18,7 @@ import re # noqa: F401
18
18
  import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
- from typing import Any, ClassVar, Dict, List, Optional, Union
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
22
  from typing_extensions import Annotated
23
23
  from typing import Optional, Set
24
24
  from typing_extensions import Self
@@ -28,7 +28,7 @@ class PagedResponseWithTotal(BaseModel):
28
28
  PagedResponseWithTotal
29
29
  """ # noqa: E501
30
30
  items: Optional[List[StrictStr]] = Field(default=None, description="List of items. If no matching items are found, then `[]` will be returned.")
31
- total: Union[Annotated[float, Field(strict=True, ge=0)], Annotated[int, Field(strict=True, ge=0)]] = Field(description="Total number of items available based on the query criteria.")
31
+ total: Annotated[int, Field(strict=True, ge=0)] = Field(description="Total number of items available based on the query criteria.")
32
32
  limit: Annotated[int, Field(le=100, strict=True, ge=1)] = Field(description="Maximum number of items to return")
33
33
  offset: Annotated[int, Field(strict=True, ge=0)] = Field(description="Begin returning the results from this offset")
34
34
  __properties: ClassVar[List[str]] = ["items", "total", "limit", "offset"]
@@ -66,8 +66,8 @@ class ScanDetectionV3(BaseModel):
66
66
  if value is None:
67
67
  return value
68
68
 
69
- if not re.match(r"^CWE-\d{1,4}.*$", value):
70
- raise ValueError(r"must validate the regular expression /^CWE-\d{1,4}.*$/")
69
+ if not re.match(r"^CWE-\d{1,4}.*$|^$", value):
70
+ raise ValueError(r"must validate the regular expression /^CWE-\d{1,4}.*$|^$/")
71
71
  return value
72
72
 
73
73
  model_config = ConfigDict(
@@ -20,7 +20,7 @@ import json
20
20
  from datetime import datetime
21
21
  from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, field_validator
22
22
  from typing import Any, ClassVar, Dict, List, Optional
23
- from hiddenlayer.sdk.rest.models.file_results_inner import FileResultsInner
23
+ from hiddenlayer.sdk.rest.models.file_scan_report_v3 import FileScanReportV3
24
24
  from hiddenlayer.sdk.rest.models.model_inventory_info import ModelInventoryInfo
25
25
  from typing import Optional, Set
26
26
  from typing_extensions import Self
@@ -40,7 +40,7 @@ class ScanReportV3(BaseModel):
40
40
  end_time: Optional[datetime] = Field(default=None, description="time the scan ended")
41
41
  status: StrictStr = Field(description="status of the scan")
42
42
  severity: Optional[StrictStr] = Field(default=None, description="detection severity")
43
- file_results: Optional[List[FileResultsInner]] = None
43
+ file_results: Optional[List[FileScanReportV3]] = None
44
44
  __properties: ClassVar[List[str]] = ["file_count", "files_with_detections_count", "detection_count", "detection_categories", "inventory", "version", "scan_id", "start_time", "end_time", "status", "severity", "file_results"]
45
45
 
46
46
  @field_validator('status')
@@ -132,7 +132,7 @@ class ScanReportV3(BaseModel):
132
132
  "end_time": obj.get("end_time"),
133
133
  "status": obj.get("status"),
134
134
  "severity": obj.get("severity"),
135
- "file_results": [FileResultsInner.from_dict(_item) for _item in obj["file_results"]] if obj.get("file_results") is not None else None
135
+ "file_results": [FileScanReportV3.from_dict(_item) for _item in obj["file_results"]] if obj.get("file_results") is not None else None
136
136
  })
137
137
  return _obj
138
138
 
@@ -28,7 +28,7 @@ class SensorSORModelCardResponse(BaseModel):
28
28
  SensorSORModelCardResponse
29
29
  """ # noqa: E501
30
30
  model_id: StrictStr
31
- created_at: StrictInt = Field(description="Unix timestamp")
31
+ created_at: StrictInt = Field(description="Unix Nano Epoch")
32
32
  plaintext_name: StrictStr
33
33
  active_versions: List[StrictInt]
34
34
  source: StrictStr
@@ -1,4 +1,6 @@
1
1
  import json
2
+ import random
3
+ import time
2
4
  from typing import Optional
3
5
 
4
6
  from hiddenlayer.sdk.constants import ApiErrors
@@ -37,6 +39,49 @@ class ModelAPI:
37
39
  )
38
40
  )
39
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
+
40
85
  def get(self, *, model_name: str, version: Optional[int] = None) -> Model:
41
86
  """
42
87
  Gets a HiddenLayer model object. If not version is supplied, the latest model is returned.
@@ -90,7 +135,7 @@ class ModelAPI:
90
135
  )
91
136
  )
92
137
 
93
- if not models.results:
138
+ if not models.results or len(models.results) == 0:
94
139
  msg = f"Model {model_name} does not exist"
95
140
 
96
141
  if version:
@@ -70,7 +70,7 @@ class ModelScanAPI:
70
70
  file_path = Path(model_path)
71
71
 
72
72
  filesize = file_path.stat().st_size
73
- sensor = self._model_api.create(
73
+ sensor = self._model_api.create_or_get(
74
74
  model_name=model_name, model_version=model_version
75
75
  )
76
76
  upload = self._sensor_api.begin_multipart_upload(sensor.sensor_id, filesize)
@@ -0,0 +1 @@
1
+ VERSION = "1.1.1"
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: hiddenlayer-sdk
3
- Version: 1.0.0
3
+ Version: 1.1.1
4
4
  Summary: Official HiddenLayer Python SDK
5
5
  Author-email: HiddenLayer Integrations Team <integrations@hiddenlayer.com>
6
6
  Maintainer-email: HiddenLayer Integrations Team <integrations@hiddenlayer.com>
@@ -40,8 +40,8 @@ hiddenlayer/sdk/rest/models/external_properties.py
40
40
  hiddenlayer/sdk/rest/models/external_property_file_reference.py
41
41
  hiddenlayer/sdk/rest/models/external_property_file_references.py
42
42
  hiddenlayer/sdk/rest/models/file_details_v3.py
43
- hiddenlayer/sdk/rest/models/file_results_inner.py
44
43
  hiddenlayer/sdk/rest/models/file_scan_report_v3.py
44
+ hiddenlayer/sdk/rest/models/file_scan_reports_v3.py
45
45
  hiddenlayer/sdk/rest/models/fix.py
46
46
  hiddenlayer/sdk/rest/models/get_multipart_upload_response.py
47
47
  hiddenlayer/sdk/rest/models/graph.py
@@ -1 +0,0 @@
1
- VERSION = "1.0.0"
File without changes