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
@@ -20,24 +20,29 @@ from hiddenlayer.sdk.rest.models.artifact_change import ArtifactChange
20
20
  from hiddenlayer.sdk.rest.models.artifact_content import ArtifactContent
21
21
  from hiddenlayer.sdk.rest.models.artifact_location import ArtifactLocation
22
22
  from hiddenlayer.sdk.rest.models.attachment import Attachment
23
+ from hiddenlayer.sdk.rest.models.begin_multi_file_upload200_response import BeginMultiFileUpload200Response
24
+ from hiddenlayer.sdk.rest.models.begin_multipart_file_upload200_response import BeginMultipartFileUpload200Response
25
+ from hiddenlayer.sdk.rest.models.begin_multipart_file_upload200_response_parts_inner import BeginMultipartFileUpload200ResponsePartsInner
23
26
  from hiddenlayer.sdk.rest.models.code_flow import CodeFlow
24
27
  from hiddenlayer.sdk.rest.models.configuration_override import ConfigurationOverride
25
28
  from hiddenlayer.sdk.rest.models.conversion import Conversion
26
29
  from hiddenlayer.sdk.rest.models.create_sensor_request import CreateSensorRequest
27
- from hiddenlayer.sdk.rest.models.detections import Detections
28
30
  from hiddenlayer.sdk.rest.models.edge import Edge
29
31
  from hiddenlayer.sdk.rest.models.edge_traversal import EdgeTraversal
32
+ from hiddenlayer.sdk.rest.models.errors_inner import ErrorsInner
30
33
  from hiddenlayer.sdk.rest.models.exception import Exception
31
34
  from hiddenlayer.sdk.rest.models.external_properties import ExternalProperties
32
35
  from hiddenlayer.sdk.rest.models.external_property_file_reference import ExternalPropertyFileReference
33
36
  from hiddenlayer.sdk.rest.models.external_property_file_references import ExternalPropertyFileReferences
34
37
  from hiddenlayer.sdk.rest.models.file_details_v3 import FileDetailsV3
38
+ from hiddenlayer.sdk.rest.models.file_result_v3 import FileResultV3
35
39
  from hiddenlayer.sdk.rest.models.file_scan_report_v3 import FileScanReportV3
36
40
  from hiddenlayer.sdk.rest.models.file_scan_reports_v3 import FileScanReportsV3
37
41
  from hiddenlayer.sdk.rest.models.fix import Fix
38
- from hiddenlayer.sdk.rest.models.get_multipart_upload_response import GetMultipartUploadResponse
42
+ from hiddenlayer.sdk.rest.models.get_condensed_model_scan_reports200_response import GetCondensedModelScanReports200Response
39
43
  from hiddenlayer.sdk.rest.models.graph import Graph
40
44
  from hiddenlayer.sdk.rest.models.graph_traversal import GraphTraversal
45
+ from hiddenlayer.sdk.rest.models.inventory_v3 import InventoryV3
41
46
  from hiddenlayer.sdk.rest.models.invocation import Invocation
42
47
  from hiddenlayer.sdk.rest.models.location import Location
43
48
  from hiddenlayer.sdk.rest.models.location_inner import LocationInner
@@ -45,17 +50,16 @@ from hiddenlayer.sdk.rest.models.location_relationship import LocationRelationsh
45
50
  from hiddenlayer.sdk.rest.models.logical_location import LogicalLocation
46
51
  from hiddenlayer.sdk.rest.models.mitre_atlas_inner import MITREAtlasInner
47
52
  from hiddenlayer.sdk.rest.models.message import Message
48
- from hiddenlayer.sdk.rest.models.model import Model
49
53
  from hiddenlayer.sdk.rest.models.model_inventory_info import ModelInventoryInfo
50
- from hiddenlayer.sdk.rest.models.model_query_response import ModelQueryResponse
51
- from hiddenlayer.sdk.rest.models.model_scan_api_v3_scan_model_version_id_patch200_response import ModelScanApiV3ScanModelVersionIdPatch200Response
52
- from hiddenlayer.sdk.rest.models.model_scan_api_v3_scan_query200_response import ModelScanApiV3ScanQuery200Response
54
+ from hiddenlayer.sdk.rest.models.multi_file_upload_request_v3 import MultiFileUploadRequestV3
53
55
  from hiddenlayer.sdk.rest.models.multiformat_message_string import MultiformatMessageString
54
- from hiddenlayer.sdk.rest.models.multipart_upload_part import MultipartUploadPart
55
56
  from hiddenlayer.sdk.rest.models.node import Node
56
57
  from hiddenlayer.sdk.rest.models.notification import Notification
58
+ from hiddenlayer.sdk.rest.models.notify_model_scan_completed200_response import NotifyModelScanCompleted200Response
57
59
  from hiddenlayer.sdk.rest.models.paged_response_with_total import PagedResponseWithTotal
60
+ from hiddenlayer.sdk.rest.models.pagination_v3 import PaginationV3
58
61
  from hiddenlayer.sdk.rest.models.physical_location import PhysicalLocation
62
+ from hiddenlayer.sdk.rest.models.problem_details import ProblemDetails
59
63
  from hiddenlayer.sdk.rest.models.property_bag import PropertyBag
60
64
  from hiddenlayer.sdk.rest.models.rectangle import Rectangle
61
65
  from hiddenlayer.sdk.rest.models.region import Region
@@ -72,16 +76,18 @@ from hiddenlayer.sdk.rest.models.run_automation_details import RunAutomationDeta
72
76
  from hiddenlayer.sdk.rest.models.sarif210 import Sarif210
73
77
  from hiddenlayer.sdk.rest.models.scan_create_request import ScanCreateRequest
74
78
  from hiddenlayer.sdk.rest.models.scan_detection_v3 import ScanDetectionV3
79
+ from hiddenlayer.sdk.rest.models.scan_detection_v31 import ScanDetectionV31
75
80
  from hiddenlayer.sdk.rest.models.scan_header_v3 import ScanHeaderV3
76
81
  from hiddenlayer.sdk.rest.models.scan_job import ScanJob
77
82
  from hiddenlayer.sdk.rest.models.scan_job_inventory import ScanJobInventory
78
83
  from hiddenlayer.sdk.rest.models.scan_model_details_v3 import ScanModelDetailsV3
79
84
  from hiddenlayer.sdk.rest.models.scan_model_ids_v3 import ScanModelIdsV3
80
- from hiddenlayer.sdk.rest.models.scan_model_request import ScanModelRequest
81
85
  from hiddenlayer.sdk.rest.models.scan_report_v3 import ScanReportV3
82
- from hiddenlayer.sdk.rest.models.scan_results import ScanResults
83
- from hiddenlayer.sdk.rest.models.scan_results_v2 import ScanResultsV2
86
+ from hiddenlayer.sdk.rest.models.scan_results_map_v3 import ScanResultsMapV3
87
+ from hiddenlayer.sdk.rest.models.scan_results_v3 import ScanResultsV3
84
88
  from hiddenlayer.sdk.rest.models.security_posture import SecurityPosture
89
+ from hiddenlayer.sdk.rest.models.sensor import Sensor
90
+ from hiddenlayer.sdk.rest.models.sensor_query_response import SensorQueryResponse
85
91
  from hiddenlayer.sdk.rest.models.sensor_sor_model_card_query_response import SensorSORModelCardQueryResponse
86
92
  from hiddenlayer.sdk.rest.models.sensor_sor_model_card_response import SensorSORModelCardResponse
87
93
  from hiddenlayer.sdk.rest.models.sensor_sor_query_filter import SensorSORQueryFilter
@@ -17,17 +17,17 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, StrictStr
21
- from typing import Any, ClassVar, Dict, List
20
+ from pydantic import BaseModel, ConfigDict, Field, 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
 
25
- class ScanModelRequest(BaseModel):
25
+ class BeginMultiFileUpload200Response(BaseModel):
26
26
  """
27
- ScanModelRequest
27
+ BeginMultiFileUpload200Response
28
28
  """ # noqa: E501
29
- location: StrictStr
30
- __properties: ClassVar[List[str]] = ["location"]
29
+ scan_id: Optional[StrictStr] = Field(default=None, description="Request to resource is successful")
30
+ __properties: ClassVar[List[str]] = ["scan_id"]
31
31
 
32
32
  model_config = ConfigDict(
33
33
  populate_by_name=True,
@@ -47,7 +47,7 @@ class ScanModelRequest(BaseModel):
47
47
 
48
48
  @classmethod
49
49
  def from_json(cls, json_str: str) -> Optional[Self]:
50
- """Create an instance of ScanModelRequest from a JSON string"""
50
+ """Create an instance of BeginMultiFileUpload200Response from a JSON string"""
51
51
  return cls.from_dict(json.loads(json_str))
52
52
 
53
53
  def to_dict(self) -> Dict[str, Any]:
@@ -72,7 +72,7 @@ class ScanModelRequest(BaseModel):
72
72
 
73
73
  @classmethod
74
74
  def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
75
- """Create an instance of ScanModelRequest from a dict"""
75
+ """Create an instance of BeginMultiFileUpload200Response from a dict"""
76
76
  if obj is None:
77
77
  return None
78
78
 
@@ -80,7 +80,7 @@ class ScanModelRequest(BaseModel):
80
80
  return cls.model_validate(obj)
81
81
 
82
82
  _obj = cls.model_validate({
83
- "location": obj.get("location")
83
+ "scan_id": obj.get("scan_id")
84
84
  })
85
85
  return _obj
86
86
 
@@ -17,18 +17,18 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, StrictStr
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List
22
- from hiddenlayer.sdk.rest.models.multipart_upload_part import MultipartUploadPart
22
+ from hiddenlayer.sdk.rest.models.begin_multipart_file_upload200_response_parts_inner import BeginMultipartFileUpload200ResponsePartsInner
23
23
  from typing import Optional, Set
24
24
  from typing_extensions import Self
25
25
 
26
- class GetMultipartUploadResponse(BaseModel):
26
+ class BeginMultipartFileUpload200Response(BaseModel):
27
27
  """
28
- GetMultipartUploadResponse
28
+ BeginMultipartFileUpload200Response
29
29
  """ # noqa: E501
30
- upload_id: StrictStr
31
- parts: List[MultipartUploadPart]
30
+ upload_id: StrictStr = Field(description="UploadId for the current file")
31
+ parts: List[BeginMultipartFileUpload200ResponsePartsInner]
32
32
  __properties: ClassVar[List[str]] = ["upload_id", "parts"]
33
33
 
34
34
  model_config = ConfigDict(
@@ -49,7 +49,7 @@ class GetMultipartUploadResponse(BaseModel):
49
49
 
50
50
  @classmethod
51
51
  def from_json(cls, json_str: str) -> Optional[Self]:
52
- """Create an instance of GetMultipartUploadResponse from a JSON string"""
52
+ """Create an instance of BeginMultipartFileUpload200Response from a JSON string"""
53
53
  return cls.from_dict(json.loads(json_str))
54
54
 
55
55
  def to_dict(self) -> Dict[str, Any]:
@@ -81,7 +81,7 @@ class GetMultipartUploadResponse(BaseModel):
81
81
 
82
82
  @classmethod
83
83
  def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
84
- """Create an instance of GetMultipartUploadResponse from a dict"""
84
+ """Create an instance of BeginMultipartFileUpload200Response from a dict"""
85
85
  if obj is None:
86
86
  return None
87
87
 
@@ -90,7 +90,7 @@ class GetMultipartUploadResponse(BaseModel):
90
90
 
91
91
  _obj = cls.model_validate({
92
92
  "upload_id": obj.get("upload_id"),
93
- "parts": [MultipartUploadPart.from_dict(_item) for _item in obj["parts"]] if obj.get("parts") is not None else None
93
+ "parts": [BeginMultipartFileUpload200ResponsePartsInner.from_dict(_item) for _item in obj["parts"]] if obj.get("parts") is not None else None
94
94
  })
95
95
  return _obj
96
96
 
@@ -19,18 +19,19 @@ import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing_extensions import Annotated
22
23
  from typing import Optional, Set
23
24
  from typing_extensions import Self
24
25
 
25
- class MultipartUploadPart(BaseModel):
26
+ class BeginMultipartFileUpload200ResponsePartsInner(BaseModel):
26
27
  """
27
- MultipartUploadPart
28
+ BeginMultipartFileUpload200ResponsePartsInner
28
29
  """ # noqa: E501
29
- part_number: StrictInt
30
- start_offset: StrictInt
31
- end_offset: StrictInt
32
- upload_url: Optional[StrictStr] = Field(default=None, description="only provided when part is to be directly uploaded to a cloud provider (adhoc)")
33
- __properties: ClassVar[List[str]] = ["part_number", "start_offset", "end_offset", "upload_url"]
30
+ part_number: Optional[Annotated[int, Field(strict=True, ge=0)]] = None
31
+ start_offset: Optional[StrictInt] = None
32
+ stop_offset: Optional[StrictInt] = None
33
+ upload_url: Optional[StrictStr] = None
34
+ __properties: ClassVar[List[str]] = ["part_number", "start_offset", "stop_offset", "upload_url"]
34
35
 
35
36
  model_config = ConfigDict(
36
37
  populate_by_name=True,
@@ -50,7 +51,7 @@ class MultipartUploadPart(BaseModel):
50
51
 
51
52
  @classmethod
52
53
  def from_json(cls, json_str: str) -> Optional[Self]:
53
- """Create an instance of MultipartUploadPart from a JSON string"""
54
+ """Create an instance of BeginMultipartFileUpload200ResponsePartsInner from a JSON string"""
54
55
  return cls.from_dict(json.loads(json_str))
55
56
 
56
57
  def to_dict(self) -> Dict[str, Any]:
@@ -75,7 +76,7 @@ class MultipartUploadPart(BaseModel):
75
76
 
76
77
  @classmethod
77
78
  def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
78
- """Create an instance of MultipartUploadPart from a dict"""
79
+ """Create an instance of BeginMultipartFileUpload200ResponsePartsInner from a dict"""
79
80
  if obj is None:
80
81
  return None
81
82
 
@@ -85,7 +86,7 @@ class MultipartUploadPart(BaseModel):
85
86
  _obj = cls.model_validate({
86
87
  "part_number": obj.get("part_number"),
87
88
  "start_offset": obj.get("start_offset"),
88
- "end_offset": obj.get("end_offset"),
89
+ "stop_offset": obj.get("stop_offset"),
89
90
  "upload_url": obj.get("upload_url")
90
91
  })
91
92
  return _obj
@@ -0,0 +1,91 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ HiddenLayer ModelScan V2
5
+
6
+ HiddenLayer ModelScan API for scanning of models
7
+
8
+ The version of the OpenAPI document: 1
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+ class ErrorsInner(BaseModel):
26
+ """
27
+ ErrorsInner
28
+ """ # noqa: E501
29
+ code: Optional[StrictStr] = None
30
+ detail: Optional[StrictStr] = None
31
+ pointer: Optional[List[StrictStr]] = Field(default=None, description="array of JSON Pointers")
32
+ __properties: ClassVar[List[str]] = ["code", "detail", "pointer"]
33
+
34
+ model_config = ConfigDict(
35
+ populate_by_name=True,
36
+ validate_assignment=True,
37
+ protected_namespaces=(),
38
+ )
39
+
40
+
41
+ def to_str(self) -> str:
42
+ """Returns the string representation of the model using alias"""
43
+ return pprint.pformat(self.model_dump(by_alias=True))
44
+
45
+ def to_json(self) -> str:
46
+ """Returns the JSON representation of the model using alias"""
47
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
48
+ return json.dumps(self.to_dict())
49
+
50
+ @classmethod
51
+ def from_json(cls, json_str: str) -> Optional[Self]:
52
+ """Create an instance of ErrorsInner from a JSON string"""
53
+ return cls.from_dict(json.loads(json_str))
54
+
55
+ def to_dict(self) -> Dict[str, Any]:
56
+ """Return the dictionary representation of the model using alias.
57
+
58
+ This has the following differences from calling pydantic's
59
+ `self.model_dump(by_alias=True)`:
60
+
61
+ * `None` is only added to the output dict for nullable fields that
62
+ were set at model initialization. Other fields with value `None`
63
+ are ignored.
64
+ """
65
+ excluded_fields: Set[str] = set([
66
+ ])
67
+
68
+ _dict = self.model_dump(
69
+ by_alias=True,
70
+ exclude=excluded_fields,
71
+ exclude_none=True,
72
+ )
73
+ return _dict
74
+
75
+ @classmethod
76
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
77
+ """Create an instance of ErrorsInner from a dict"""
78
+ if obj is None:
79
+ return None
80
+
81
+ if not isinstance(obj, dict):
82
+ return cls.model_validate(obj)
83
+
84
+ _obj = cls.model_validate({
85
+ "code": obj.get("code"),
86
+ "detail": obj.get("detail"),
87
+ "pointer": obj.get("pointer")
88
+ })
89
+ return _obj
90
+
91
+
@@ -28,9 +28,9 @@ class FileDetailsV3(BaseModel):
28
28
  FileDetailsV3
29
29
  """ # noqa: E501
30
30
  estimated_time: StrictStr = Field(description="estimated time to scan the file")
31
- md5: Annotated[str, Field(strict=True)] = Field(description="hexadecimal md5 hash of file")
31
+ md5: Optional[Annotated[str, Field(strict=True)]] = Field(default=None, description="hexadecimal md5 hash of file")
32
32
  sha256: Annotated[str, Field(strict=True)] = Field(description="hexadecimal sha256 hash of file")
33
- tlsh: Annotated[str, Field(strict=True)] = Field(description="TLSH hash of file")
33
+ tlsh: Optional[Annotated[str, Field(strict=True)]] = Field(default=None, description="TLSH hash of file")
34
34
  file_size: Optional[Annotated[str, Field(strict=True)]] = Field(default=None, description="size of the file in human readable format")
35
35
  file_size_bytes: Optional[StrictInt] = Field(default=None, description="size of the file in bytes")
36
36
  file_type: StrictStr = Field(description="type of the file")
@@ -40,6 +40,9 @@ class FileDetailsV3(BaseModel):
40
40
  @field_validator('md5')
41
41
  def md5_validate_regular_expression(cls, value):
42
42
  """Validates the regular expression"""
43
+ if value is None:
44
+ return value
45
+
43
46
  if not re.match(r"^[a-fA-F0-9]{32}$", value):
44
47
  raise ValueError(r"must validate the regular expression /^[a-fA-F0-9]{32}$/")
45
48
  return value
@@ -54,6 +57,9 @@ class FileDetailsV3(BaseModel):
54
57
  @field_validator('tlsh')
55
58
  def tlsh_validate_regular_expression(cls, value):
56
59
  """Validates the regular expression"""
60
+ if value is None:
61
+ return value
62
+
57
63
  if not re.match(r"^[a-fA-F0-9]{70}$", value):
58
64
  raise ValueError(r"must validate the regular expression /^[a-fA-F0-9]{70}$/")
59
65
  return value
@@ -19,39 +19,28 @@ import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr, field_validator
21
21
  from typing import Any, ClassVar, Dict, List, Optional
22
- from hiddenlayer.sdk.rest.models.detections import Detections
23
- from hiddenlayer.sdk.rest.models.scan_results import ScanResults
22
+ from hiddenlayer.sdk.rest.models.scan_detection_v31 import ScanDetectionV31
24
23
  from typing import Optional, Set
25
24
  from typing_extensions import Self
26
25
 
27
- class ScanResultsV2(BaseModel):
26
+ class FileResultV3(BaseModel):
28
27
  """
29
- ScanResultsV2
28
+ FileResultV3
30
29
  """ # noqa: E501
31
- scan_id: StrictStr
30
+ file_location: StrictStr
32
31
  status: StrictStr
33
- start_time: StrictInt
34
- end_time: StrictInt
35
- results: Optional[ScanResults] = None
36
- severity: Optional[StrictStr] = None
37
- detections: List[Detections]
38
- __properties: ClassVar[List[str]] = ["scan_id", "status", "start_time", "end_time", "results", "severity", "detections"]
32
+ start_time: Optional[StrictInt] = None
33
+ end_time: Optional[StrictInt] = None
34
+ details: Optional[Dict[str, Any]] = None
35
+ seen: Optional[StrictInt] = None
36
+ detections: Optional[List[ScanDetectionV31]] = None
37
+ __properties: ClassVar[List[str]] = ["file_location", "status", "start_time", "end_time", "details", "seen", "detections"]
39
38
 
40
39
  @field_validator('status')
41
40
  def status_validate_enum(cls, value):
42
41
  """Validates the enum"""
43
- if value not in set(['done', 'accepted', 'failed', 'pending', 'created', 'retry', 'unknown']):
44
- raise ValueError("must be one of enum values ('done', 'accepted', 'failed', 'pending', 'created', 'retry', 'unknown')")
45
- return value
46
-
47
- @field_validator('severity')
48
- def severity_validate_enum(cls, value):
49
- """Validates the enum"""
50
- if value is None:
51
- return value
52
-
53
- if value not in set(['UNKNOWN', 'SAFE', 'SUSPICIOUS', 'MALICIOUS']):
54
- raise ValueError("must be one of enum values ('UNKNOWN', 'SAFE', 'SUSPICIOUS', 'MALICIOUS')")
42
+ if value not in set(['done', 'running', 'failed', 'pending', 'canceled', 'skipped']):
43
+ raise ValueError("must be one of enum values ('done', 'running', 'failed', 'pending', 'canceled', 'skipped')")
55
44
  return value
56
45
 
57
46
  model_config = ConfigDict(
@@ -72,7 +61,7 @@ class ScanResultsV2(BaseModel):
72
61
 
73
62
  @classmethod
74
63
  def from_json(cls, json_str: str) -> Optional[Self]:
75
- """Create an instance of ScanResultsV2 from a JSON string"""
64
+ """Create an instance of FileResultV3 from a JSON string"""
76
65
  return cls.from_dict(json.loads(json_str))
77
66
 
78
67
  def to_dict(self) -> Dict[str, Any]:
@@ -93,9 +82,9 @@ class ScanResultsV2(BaseModel):
93
82
  exclude=excluded_fields,
94
83
  exclude_none=True,
95
84
  )
96
- # override the default output from pydantic by calling `to_dict()` of results
97
- if self.results:
98
- _dict['results'] = self.results.to_dict()
85
+ # override the default output from pydantic by calling `to_dict()` of details
86
+ if self.details:
87
+ _dict['details'] = self.details.to_dict()
99
88
  # override the default output from pydantic by calling `to_dict()` of each item in detections (list)
100
89
  _items = []
101
90
  if self.detections:
@@ -107,7 +96,7 @@ class ScanResultsV2(BaseModel):
107
96
 
108
97
  @classmethod
109
98
  def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
110
- """Create an instance of ScanResultsV2 from a dict"""
99
+ """Create an instance of FileResultV3 from a dict"""
111
100
  if obj is None:
112
101
  return None
113
102
 
@@ -115,13 +104,13 @@ class ScanResultsV2(BaseModel):
115
104
  return cls.model_validate(obj)
116
105
 
117
106
  _obj = cls.model_validate({
118
- "scan_id": obj.get("scan_id"),
107
+ "file_location": obj.get("file_location"),
119
108
  "status": obj.get("status"),
120
109
  "start_time": obj.get("start_time"),
121
110
  "end_time": obj.get("end_time"),
122
- "results": ScanResults.from_dict(obj["results"]) if obj.get("results") is not None else None,
123
- "severity": obj.get("severity"),
124
- "detections": [Detections.from_dict(_item) for _item in obj["detections"]] if obj.get("detections") is not None else None
111
+ "details": FileDetailsV3.from_dict(obj["details"]) if obj.get("details") is not None else None,
112
+ "seen": obj.get("seen"),
113
+ "detections": [ScanDetectionV31.from_dict(_item) for _item in obj["detections"]] if obj.get("detections") is not None else None
125
114
  })
126
115
  return _obj
127
116
 
@@ -24,9 +24,9 @@ from hiddenlayer.sdk.rest.models.scan_report_v3 import ScanReportV3
24
24
  from typing import Optional, Set
25
25
  from typing_extensions import Self
26
26
 
27
- class ModelScanApiV3ScanQuery200Response(BaseModel):
27
+ class GetCondensedModelScanReports200Response(BaseModel):
28
28
  """
29
- ModelScanApiV3ScanQuery200Response
29
+ GetCondensedModelScanReports200Response
30
30
  """ # noqa: E501
31
31
  items: Optional[List[ScanReportV3]] = None
32
32
  total: Annotated[int, Field(strict=True, ge=0)] = Field(description="Total number of items available based on the query criteria.")
@@ -52,7 +52,7 @@ class ModelScanApiV3ScanQuery200Response(BaseModel):
52
52
 
53
53
  @classmethod
54
54
  def from_json(cls, json_str: str) -> Optional[Self]:
55
- """Create an instance of ModelScanApiV3ScanQuery200Response from a JSON string"""
55
+ """Create an instance of GetCondensedModelScanReports200Response from a JSON string"""
56
56
  return cls.from_dict(json.loads(json_str))
57
57
 
58
58
  def to_dict(self) -> Dict[str, Any]:
@@ -84,7 +84,7 @@ class ModelScanApiV3ScanQuery200Response(BaseModel):
84
84
 
85
85
  @classmethod
86
86
  def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
87
- """Create an instance of ModelScanApiV3ScanQuery200Response from a dict"""
87
+ """Create an instance of GetCondensedModelScanReports200Response from a dict"""
88
88
  if obj is None:
89
89
  return None
90
90
 
@@ -0,0 +1,97 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ HiddenLayer ModelScan V2
5
+
6
+ HiddenLayer ModelScan API for scanning of models
7
+
8
+ The version of the OpenAPI document: 1
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+ class InventoryV3(BaseModel):
26
+ """
27
+ InventoryV3
28
+ """ # noqa: E501
29
+ requested_scan_location: Optional[StrictStr] = None
30
+ model_name: Optional[StrictStr] = None
31
+ model_source: Optional[StrictStr] = None
32
+ model_version: Optional[StrictStr] = None
33
+ model_version_id: Optional[StrictStr] = None
34
+ requesting_entity: Optional[StrictStr] = None
35
+ __properties: ClassVar[List[str]] = ["requested_scan_location", "model_name", "model_source", "model_version", "model_version_id", "requesting_entity"]
36
+
37
+ model_config = ConfigDict(
38
+ populate_by_name=True,
39
+ validate_assignment=True,
40
+ protected_namespaces=(),
41
+ )
42
+
43
+
44
+ def to_str(self) -> str:
45
+ """Returns the string representation of the model using alias"""
46
+ return pprint.pformat(self.model_dump(by_alias=True))
47
+
48
+ def to_json(self) -> str:
49
+ """Returns the JSON representation of the model using alias"""
50
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
51
+ return json.dumps(self.to_dict())
52
+
53
+ @classmethod
54
+ def from_json(cls, json_str: str) -> Optional[Self]:
55
+ """Create an instance of InventoryV3 from a JSON string"""
56
+ return cls.from_dict(json.loads(json_str))
57
+
58
+ def to_dict(self) -> Dict[str, Any]:
59
+ """Return the dictionary representation of the model using alias.
60
+
61
+ This has the following differences from calling pydantic's
62
+ `self.model_dump(by_alias=True)`:
63
+
64
+ * `None` is only added to the output dict for nullable fields that
65
+ were set at model initialization. Other fields with value `None`
66
+ are ignored.
67
+ """
68
+ excluded_fields: Set[str] = set([
69
+ ])
70
+
71
+ _dict = self.model_dump(
72
+ by_alias=True,
73
+ exclude=excluded_fields,
74
+ exclude_none=True,
75
+ )
76
+ return _dict
77
+
78
+ @classmethod
79
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
80
+ """Create an instance of InventoryV3 from a dict"""
81
+ if obj is None:
82
+ return None
83
+
84
+ if not isinstance(obj, dict):
85
+ return cls.model_validate(obj)
86
+
87
+ _obj = cls.model_validate({
88
+ "requested_scan_location": obj.get("requested_scan_location"),
89
+ "model_name": obj.get("model_name"),
90
+ "model_source": obj.get("model_source"),
91
+ "model_version": obj.get("model_version"),
92
+ "model_version_id": obj.get("model_version_id"),
93
+ "requesting_entity": obj.get("requesting_entity")
94
+ })
95
+ return _obj
96
+
97
+
@@ -28,7 +28,7 @@ class ModelInventoryInfo(BaseModel):
28
28
  """ # noqa: E501
29
29
  model_name: StrictStr = Field(description="name of the model")
30
30
  model_version: StrictStr = Field(description="version of the model")
31
- model_source: StrictStr = Field(description="source (provider) info")
31
+ model_source: Optional[StrictStr] = Field(default=None, description="source (provider) info")
32
32
  requested_scan_location: StrictStr = Field(description="Location to be scanned")
33
33
  requesting_entity: Optional[StrictStr] = Field(default=None, description="Entity that requested the scan")
34
34
  model_id: StrictStr = Field(description="Unique identifier for the model")