hiddenlayer-sdk 3.0.1__py3-none-any.whl → 3.1.0__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.
- hiddenlayer/_version.py +1 -1
- hiddenlayer/lib/__init__.py +8 -2
- hiddenlayer/lib/model_scan.py +7 -18
- hiddenlayer/resources/models/cards.py +32 -2
- hiddenlayer/resources/scans/jobs.py +10 -6
- hiddenlayer/resources/scans/upload/upload.py +4 -2
- hiddenlayer/types/interaction_analyze_response.py +37 -3
- hiddenlayer/types/models/card_list_params.py +5 -1
- hiddenlayer/types/models/card_list_response.py +6 -0
- hiddenlayer/types/scans/job_list_params.py +2 -2
- hiddenlayer/types/scans/job_list_response.py +135 -4
- hiddenlayer/types/scans/job_request_params.py +41 -5
- hiddenlayer/types/scans/scan_job.py +45 -5
- hiddenlayer/types/scans/scan_report.py +41 -85
- hiddenlayer/types/scans/upload/file_complete_response.py +1 -3
- hiddenlayer/types/scans/upload_complete_all_response.py +1 -3
- hiddenlayer/types/scans/upload_start_params.py +1 -1
- hiddenlayer/types/scans/upload_start_response.py +1 -3
- {hiddenlayer_sdk-3.0.1.dist-info → hiddenlayer_sdk-3.1.0.dist-info}/METADATA +3 -3
- {hiddenlayer_sdk-3.0.1.dist-info → hiddenlayer_sdk-3.1.0.dist-info}/RECORD +22 -22
- {hiddenlayer_sdk-3.0.1.dist-info → hiddenlayer_sdk-3.1.0.dist-info}/WHEEL +0 -0
- {hiddenlayer_sdk-3.0.1.dist-info → hiddenlayer_sdk-3.1.0.dist-info}/licenses/LICENSE +0 -0
hiddenlayer/_version.py
CHANGED
hiddenlayer/lib/__init__.py
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
# Custom extensions for HiddenLayer SDK
|
|
2
2
|
|
|
3
3
|
from .model_scan import ModelScanner, AsyncModelScanner
|
|
4
|
-
from .community_scan import CommunityScanner, AsyncCommunityScanner
|
|
4
|
+
from .community_scan import CommunityScanner, CommunityScanSource, AsyncCommunityScanner
|
|
5
5
|
|
|
6
|
-
__all__ = [
|
|
6
|
+
__all__ = [
|
|
7
|
+
"CommunityScanner",
|
|
8
|
+
"AsyncCommunityScanner",
|
|
9
|
+
"ModelScanner",
|
|
10
|
+
"AsyncModelScanner",
|
|
11
|
+
"CommunityScanSource",
|
|
12
|
+
]
|
hiddenlayer/lib/model_scan.py
CHANGED
|
@@ -12,8 +12,6 @@ from fnmatch import fnmatch
|
|
|
12
12
|
from pathlib import Path
|
|
13
13
|
from typing_extensions import TYPE_CHECKING
|
|
14
14
|
|
|
15
|
-
import httpx
|
|
16
|
-
|
|
17
15
|
from .scan_utils import get_scan_results, wait_for_scan_results, get_scan_results_async, wait_for_scan_results_async
|
|
18
16
|
|
|
19
17
|
logger = logging.getLogger(__name__)
|
|
@@ -135,8 +133,6 @@ class ModelScanner:
|
|
|
135
133
|
)
|
|
136
134
|
|
|
137
135
|
scan_id = upload_response.scan_id
|
|
138
|
-
if scan_id is None:
|
|
139
|
-
raise ValueError("scan_id must have a value")
|
|
140
136
|
|
|
141
137
|
# Upload the file
|
|
142
138
|
self._scan_file(scan_id=scan_id, file_path=file_path)
|
|
@@ -189,8 +185,6 @@ class ModelScanner:
|
|
|
189
185
|
)
|
|
190
186
|
|
|
191
187
|
scan_id = upload_response.scan_id
|
|
192
|
-
if scan_id is None:
|
|
193
|
-
raise ValueError("scan_id must have a value")
|
|
194
188
|
|
|
195
189
|
# Prepare file patterns
|
|
196
190
|
ignore_file_patterns = EXCLUDE_FILE_TYPES + ignore_file_patterns if ignore_file_patterns else EXCLUDE_FILE_TYPES
|
|
@@ -445,7 +439,7 @@ class ModelScanner:
|
|
|
445
439
|
if part.upload_url is None:
|
|
446
440
|
raise Exception("part.upload_url must not be None")
|
|
447
441
|
|
|
448
|
-
response =
|
|
442
|
+
response = self._client._client.put(
|
|
449
443
|
part.upload_url,
|
|
450
444
|
content=part_data,
|
|
451
445
|
headers={"Content-Type": "application/octet-stream"},
|
|
@@ -491,8 +485,6 @@ class AsyncModelScanner:
|
|
|
491
485
|
)
|
|
492
486
|
|
|
493
487
|
scan_id = upload_response.scan_id
|
|
494
|
-
if scan_id is None:
|
|
495
|
-
raise ValueError("scan_id must have a value")
|
|
496
488
|
|
|
497
489
|
# Upload the file
|
|
498
490
|
await self._scan_file(scan_id=scan_id, file_path=file_path)
|
|
@@ -536,8 +528,6 @@ class AsyncModelScanner:
|
|
|
536
528
|
)
|
|
537
529
|
|
|
538
530
|
scan_id = upload_response.scan_id
|
|
539
|
-
if scan_id is None:
|
|
540
|
-
raise ValueError("scan_id must have a value")
|
|
541
531
|
|
|
542
532
|
# Prepare file patterns
|
|
543
533
|
ignore_file_patterns = EXCLUDE_FILE_TYPES + ignore_file_patterns if ignore_file_patterns else EXCLUDE_FILE_TYPES
|
|
@@ -740,13 +730,12 @@ class AsyncModelScanner:
|
|
|
740
730
|
if part.upload_url is None:
|
|
741
731
|
raise Exception("part.upload_url must not be None")
|
|
742
732
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
response.raise_for_status()
|
|
733
|
+
response = await self._client._client.put(
|
|
734
|
+
part.upload_url,
|
|
735
|
+
content=part_data,
|
|
736
|
+
headers={"Content-Type": "application/octet-stream"},
|
|
737
|
+
)
|
|
738
|
+
response.raise_for_status()
|
|
750
739
|
|
|
751
740
|
# Complete the file upload
|
|
752
741
|
await self._client.scans.upload.file.complete(file_id=upload.upload_id, scan_id=scan_id)
|
|
@@ -53,7 +53,22 @@ class CardsResource(SyncAPIResource):
|
|
|
53
53
|
limit: int | Omit = omit,
|
|
54
54
|
model_created: card_list_params.ModelCreated | Omit = omit,
|
|
55
55
|
model_name: card_list_params.ModelName | Omit = omit,
|
|
56
|
-
modscan_severity: List[
|
|
56
|
+
modscan_severity: List[
|
|
57
|
+
Literal[
|
|
58
|
+
"SAFE",
|
|
59
|
+
"UNSAFE",
|
|
60
|
+
"SUSPICIOUS",
|
|
61
|
+
"UNKNOWN",
|
|
62
|
+
"ERROR",
|
|
63
|
+
"critical",
|
|
64
|
+
"high",
|
|
65
|
+
"medium",
|
|
66
|
+
"low",
|
|
67
|
+
"none",
|
|
68
|
+
"unknown",
|
|
69
|
+
]
|
|
70
|
+
]
|
|
71
|
+
| Omit = omit,
|
|
57
72
|
modscan_status: Literal["ENABLED", "DISABLED", "ANY"] | Omit = omit,
|
|
58
73
|
offset: int | Omit = omit,
|
|
59
74
|
provider: List[Literal["AZURE", "ADHOC"]] | Omit = omit,
|
|
@@ -152,7 +167,22 @@ class AsyncCardsResource(AsyncAPIResource):
|
|
|
152
167
|
limit: int | Omit = omit,
|
|
153
168
|
model_created: card_list_params.ModelCreated | Omit = omit,
|
|
154
169
|
model_name: card_list_params.ModelName | Omit = omit,
|
|
155
|
-
modscan_severity: List[
|
|
170
|
+
modscan_severity: List[
|
|
171
|
+
Literal[
|
|
172
|
+
"SAFE",
|
|
173
|
+
"UNSAFE",
|
|
174
|
+
"SUSPICIOUS",
|
|
175
|
+
"UNKNOWN",
|
|
176
|
+
"ERROR",
|
|
177
|
+
"critical",
|
|
178
|
+
"high",
|
|
179
|
+
"medium",
|
|
180
|
+
"low",
|
|
181
|
+
"none",
|
|
182
|
+
"unknown",
|
|
183
|
+
]
|
|
184
|
+
]
|
|
185
|
+
| Omit = omit,
|
|
156
186
|
modscan_status: Literal["ENABLED", "DISABLED", "ANY"] | Omit = omit,
|
|
157
187
|
offset: int | Omit = omit,
|
|
158
188
|
provider: List[Literal["AZURE", "ADHOC"]] | Omit = omit,
|
|
@@ -76,7 +76,6 @@ class JobsResource(SyncAPIResource):
|
|
|
76
76
|
"""
|
|
77
77
|
if not scan_id:
|
|
78
78
|
raise ValueError(f"Expected a non-empty value for `scan_id` but received {scan_id!r}")
|
|
79
|
-
extra_headers = {"Accept": "application/json; charset=utf-8", **(extra_headers or {})}
|
|
80
79
|
extra_headers = {**strip_not_given({"X-Correlation-Id": x_correlation_id}), **(extra_headers or {})}
|
|
81
80
|
return self._get(
|
|
82
81
|
f"/scan/v3/results/{scan_id}",
|
|
@@ -102,9 +101,10 @@ class JobsResource(SyncAPIResource):
|
|
|
102
101
|
model_name: job_list_params.ModelName | Omit = omit,
|
|
103
102
|
model_version_ids: SequenceNotStr[str] | Omit = omit,
|
|
104
103
|
offset: int | Omit = omit,
|
|
105
|
-
request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"
|
|
104
|
+
request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]]
|
|
105
|
+
| Omit = omit,
|
|
106
106
|
scanner_version: str | Omit = omit,
|
|
107
|
-
severity:
|
|
107
|
+
severity: Literal["critical", "high", "medium", "low", "none", "unknown", "safe"] | Omit = omit,
|
|
108
108
|
sort: str | Omit = omit,
|
|
109
109
|
source: job_list_params.Source | Omit = omit,
|
|
110
110
|
start_time: Union[str, datetime] | Omit = omit,
|
|
@@ -208,6 +208,8 @@ class JobsResource(SyncAPIResource):
|
|
|
208
208
|
Scan a remote model
|
|
209
209
|
|
|
210
210
|
Args:
|
|
211
|
+
access: Access method for the location of files associated with the scan
|
|
212
|
+
|
|
211
213
|
extra_headers: Send extra headers
|
|
212
214
|
|
|
213
215
|
extra_query: Add additional query parameters to the request
|
|
@@ -281,7 +283,6 @@ class AsyncJobsResource(AsyncAPIResource):
|
|
|
281
283
|
"""
|
|
282
284
|
if not scan_id:
|
|
283
285
|
raise ValueError(f"Expected a non-empty value for `scan_id` but received {scan_id!r}")
|
|
284
|
-
extra_headers = {"Accept": "application/json; charset=utf-8", **(extra_headers or {})}
|
|
285
286
|
extra_headers = {**strip_not_given({"X-Correlation-Id": x_correlation_id}), **(extra_headers or {})}
|
|
286
287
|
return await self._get(
|
|
287
288
|
f"/scan/v3/results/{scan_id}",
|
|
@@ -309,9 +310,10 @@ class AsyncJobsResource(AsyncAPIResource):
|
|
|
309
310
|
model_name: job_list_params.ModelName | Omit = omit,
|
|
310
311
|
model_version_ids: SequenceNotStr[str] | Omit = omit,
|
|
311
312
|
offset: int | Omit = omit,
|
|
312
|
-
request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"
|
|
313
|
+
request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]]
|
|
314
|
+
| Omit = omit,
|
|
313
315
|
scanner_version: str | Omit = omit,
|
|
314
|
-
severity:
|
|
316
|
+
severity: Literal["critical", "high", "medium", "low", "none", "unknown", "safe"] | Omit = omit,
|
|
315
317
|
sort: str | Omit = omit,
|
|
316
318
|
source: job_list_params.Source | Omit = omit,
|
|
317
319
|
start_time: Union[str, datetime] | Omit = omit,
|
|
@@ -415,6 +417,8 @@ class AsyncJobsResource(AsyncAPIResource):
|
|
|
415
417
|
Scan a remote model
|
|
416
418
|
|
|
417
419
|
Args:
|
|
420
|
+
access: Access method for the location of files associated with the scan
|
|
421
|
+
|
|
418
422
|
extra_headers: Send extra headers
|
|
419
423
|
|
|
420
424
|
extra_query: Add additional query parameters to the request
|
|
@@ -99,7 +99,8 @@ class UploadResource(SyncAPIResource):
|
|
|
99
99
|
requesting_entity: str,
|
|
100
100
|
location_alias: str | Omit = omit,
|
|
101
101
|
origin: str | Omit = omit,
|
|
102
|
-
request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"
|
|
102
|
+
request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]
|
|
103
|
+
| Omit = omit,
|
|
103
104
|
x_correlation_id: str | Omit = omit,
|
|
104
105
|
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
105
106
|
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
@@ -221,7 +222,8 @@ class AsyncUploadResource(AsyncAPIResource):
|
|
|
221
222
|
requesting_entity: str,
|
|
222
223
|
location_alias: str | Omit = omit,
|
|
223
224
|
origin: str | Omit = omit,
|
|
224
|
-
request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"
|
|
225
|
+
request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]
|
|
226
|
+
| Omit = omit,
|
|
225
227
|
x_correlation_id: str | Omit = omit,
|
|
226
228
|
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
227
229
|
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from typing import TYPE_CHECKING, Dict, List, Optional
|
|
4
4
|
from datetime import datetime
|
|
5
|
+
from typing_extensions import Literal
|
|
5
6
|
|
|
6
7
|
from pydantic import Field as FieldInfo
|
|
7
8
|
|
|
@@ -24,6 +25,7 @@ __all__ = [
|
|
|
24
25
|
"ModifiedDataInputMessage",
|
|
25
26
|
"ModifiedDataOutput",
|
|
26
27
|
"ModifiedDataOutputMessage",
|
|
28
|
+
"Evaluation",
|
|
27
29
|
]
|
|
28
30
|
|
|
29
31
|
|
|
@@ -39,12 +41,17 @@ class AnalysisFindings(BaseModel):
|
|
|
39
41
|
frameworks: Dict[str, List[AnalysisFindingsFramework]]
|
|
40
42
|
"""The taxonomies for the detections."""
|
|
41
43
|
|
|
42
|
-
__pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
|
|
43
44
|
if TYPE_CHECKING:
|
|
45
|
+
# Some versions of Pydantic <2.8.0 have a bug and don’t allow assigning a
|
|
46
|
+
# value to this field, so for compatibility we avoid doing it at runtime.
|
|
47
|
+
__pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
|
|
48
|
+
|
|
44
49
|
# Stub to indicate that arbitrary properties are accepted.
|
|
45
50
|
# To access properties that are not valid identifiers you can use `getattr`, e.g.
|
|
46
51
|
# `getattr(obj, '$type')`
|
|
47
52
|
def __getattr__(self, attr: str) -> object: ...
|
|
53
|
+
else:
|
|
54
|
+
__pydantic_extra__: Dict[str, object]
|
|
48
55
|
|
|
49
56
|
|
|
50
57
|
class Analysis(BaseModel):
|
|
@@ -85,12 +92,17 @@ class AnalyzedDataInput(BaseModel):
|
|
|
85
92
|
messages: Optional[List[AnalyzedDataInputMessage]] = None
|
|
86
93
|
"""The list of messages as input to a language model."""
|
|
87
94
|
|
|
88
|
-
__pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
|
|
89
95
|
if TYPE_CHECKING:
|
|
96
|
+
# Some versions of Pydantic <2.8.0 have a bug and don’t allow assigning a
|
|
97
|
+
# value to this field, so for compatibility we avoid doing it at runtime.
|
|
98
|
+
__pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
|
|
99
|
+
|
|
90
100
|
# Stub to indicate that arbitrary properties are accepted.
|
|
91
101
|
# To access properties that are not valid identifiers you can use `getattr`, e.g.
|
|
92
102
|
# `getattr(obj, '$type')`
|
|
93
103
|
def __getattr__(self, attr: str) -> object: ...
|
|
104
|
+
else:
|
|
105
|
+
__pydantic_extra__: Dict[str, object]
|
|
94
106
|
|
|
95
107
|
|
|
96
108
|
class AnalyzedDataOutputMessage(BaseModel):
|
|
@@ -157,12 +169,17 @@ class ModifiedDataInput(BaseModel):
|
|
|
157
169
|
messages: Optional[List[ModifiedDataInputMessage]] = None
|
|
158
170
|
"""The list of messages as input to a language model."""
|
|
159
171
|
|
|
160
|
-
__pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
|
|
161
172
|
if TYPE_CHECKING:
|
|
173
|
+
# Some versions of Pydantic <2.8.0 have a bug and don’t allow assigning a
|
|
174
|
+
# value to this field, so for compatibility we avoid doing it at runtime.
|
|
175
|
+
__pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
|
|
176
|
+
|
|
162
177
|
# Stub to indicate that arbitrary properties are accepted.
|
|
163
178
|
# To access properties that are not valid identifiers you can use `getattr`, e.g.
|
|
164
179
|
# `getattr(obj, '$type')`
|
|
165
180
|
def __getattr__(self, attr: str) -> object: ...
|
|
181
|
+
else:
|
|
182
|
+
__pydantic_extra__: Dict[str, object]
|
|
166
183
|
|
|
167
184
|
|
|
168
185
|
class ModifiedDataOutputMessage(BaseModel):
|
|
@@ -184,6 +201,20 @@ class ModifiedData(BaseModel):
|
|
|
184
201
|
output: ModifiedDataOutput
|
|
185
202
|
|
|
186
203
|
|
|
204
|
+
class Evaluation(BaseModel):
|
|
205
|
+
action: Literal["Allow", "Alert", "Redact", "Block"]
|
|
206
|
+
"""The action based on interaction analysis and configured tenant security rules."""
|
|
207
|
+
|
|
208
|
+
has_detections: bool
|
|
209
|
+
"""Indicates if any detections were found during the analysis."""
|
|
210
|
+
|
|
211
|
+
threat_level: Literal["None", "Low", "Medium", "High", "Critical"]
|
|
212
|
+
"""
|
|
213
|
+
The threat level based on interaction analysis and configured tenant security
|
|
214
|
+
rules.
|
|
215
|
+
"""
|
|
216
|
+
|
|
217
|
+
|
|
187
218
|
class InteractionAnalyzeResponse(BaseModel):
|
|
188
219
|
analysis: List[Analysis]
|
|
189
220
|
|
|
@@ -197,3 +228,6 @@ class InteractionAnalyzeResponse(BaseModel):
|
|
|
197
228
|
The potentially modified language model input and output after applying any
|
|
198
229
|
redactions or modifications based on the analysis.
|
|
199
230
|
"""
|
|
231
|
+
|
|
232
|
+
evaluation: Optional[Evaluation] = None
|
|
233
|
+
"""The evaluation of the analysis results."""
|
|
@@ -26,7 +26,11 @@ class CardListParams(TypedDict, total=False):
|
|
|
26
26
|
model_name: ModelName
|
|
27
27
|
"""substring match on model name"""
|
|
28
28
|
|
|
29
|
-
modscan_severity: List[
|
|
29
|
+
modscan_severity: List[
|
|
30
|
+
Literal[
|
|
31
|
+
"SAFE", "UNSAFE", "SUSPICIOUS", "UNKNOWN", "ERROR", "critical", "high", "medium", "low", "none", "unknown"
|
|
32
|
+
]
|
|
33
|
+
]
|
|
30
34
|
|
|
31
35
|
modscan_status: Literal["ENABLED", "DISABLED", "ANY"]
|
|
32
36
|
|
|
@@ -35,12 +35,18 @@ class CardListResponse(BaseModel):
|
|
|
35
35
|
|
|
36
36
|
model_id: str
|
|
37
37
|
|
|
38
|
+
model_scan_severity: Literal["not available", "critical", "high", "medium", "low", "none", "unknown"]
|
|
39
|
+
"""The severity of the model's latest scan"""
|
|
40
|
+
|
|
38
41
|
model_scan_threat_level: Literal["safe", "unsafe", "suspicious", "not available"]
|
|
39
42
|
|
|
40
43
|
plaintext_name: str
|
|
41
44
|
|
|
42
45
|
source: str
|
|
43
46
|
|
|
47
|
+
model_scan_has_error: Optional[bool] = None
|
|
48
|
+
"""True if the model's latest scan has an error"""
|
|
49
|
+
|
|
44
50
|
security_posture: Optional[SecurityPosture] = None
|
|
45
51
|
|
|
46
52
|
tags: Optional[Dict[str, object]] = None
|
|
@@ -38,13 +38,13 @@ class JobListParams(TypedDict, total=False):
|
|
|
38
38
|
|
|
39
39
|
offset: int
|
|
40
40
|
|
|
41
|
-
request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"]]
|
|
41
|
+
request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]]
|
|
42
42
|
"""Filter by request source using a comma-separated list"""
|
|
43
43
|
|
|
44
44
|
scanner_version: str
|
|
45
45
|
"""filter by version of the scanner"""
|
|
46
46
|
|
|
47
|
-
severity:
|
|
47
|
+
severity: Literal["critical", "high", "medium", "low", "none", "unknown", "safe"]
|
|
48
48
|
"""Severities"""
|
|
49
49
|
|
|
50
50
|
sort: str
|
|
@@ -1,15 +1,146 @@
|
|
|
1
1
|
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
from typing import List
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing_extensions import Literal
|
|
4
6
|
|
|
7
|
+
from pydantic import Field as FieldInfo
|
|
8
|
+
|
|
9
|
+
from ..._compat import PYDANTIC_V1, ConfigDict
|
|
5
10
|
from ..._models import BaseModel
|
|
6
|
-
from .scan_report import ScanReport
|
|
7
11
|
|
|
8
|
-
__all__ = ["JobListResponse"]
|
|
12
|
+
__all__ = ["JobListResponse", "Item", "ItemInventory", "ItemSummary", "ItemCompliance"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ItemInventory(BaseModel):
|
|
16
|
+
model_id: str
|
|
17
|
+
"""Unique identifier for the model"""
|
|
18
|
+
|
|
19
|
+
model_name: str
|
|
20
|
+
"""name of the model"""
|
|
21
|
+
|
|
22
|
+
model_version_id: str
|
|
23
|
+
"""unique identifier for the model version"""
|
|
24
|
+
|
|
25
|
+
requested_scan_location: str
|
|
26
|
+
"""Location to be scanned"""
|
|
27
|
+
|
|
28
|
+
model_source: Optional[str] = None
|
|
29
|
+
"""source (provider) info"""
|
|
30
|
+
|
|
31
|
+
model_version: Optional[str] = None
|
|
32
|
+
"""version of the model"""
|
|
33
|
+
|
|
34
|
+
origin: Optional[str] = None
|
|
35
|
+
"""
|
|
36
|
+
Specifies the platform or service where the model originated before being
|
|
37
|
+
scanned
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
request_source: Optional[
|
|
41
|
+
Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]
|
|
42
|
+
] = None
|
|
43
|
+
"""Identifies the system that requested the scan"""
|
|
44
|
+
|
|
45
|
+
requesting_entity: Optional[str] = None
|
|
46
|
+
"""Entity that requested the scan"""
|
|
47
|
+
|
|
48
|
+
if not PYDANTIC_V1:
|
|
49
|
+
# allow fields with a `model_` prefix
|
|
50
|
+
model_config = ConfigDict(protected_namespaces=tuple())
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class ItemSummary(BaseModel):
|
|
54
|
+
detection_categories: Optional[List[str]] = None
|
|
55
|
+
"""list of unique detection categories found"""
|
|
56
|
+
|
|
57
|
+
detection_count: Optional[int] = None
|
|
58
|
+
"""total number of detections found"""
|
|
59
|
+
|
|
60
|
+
file_count: Optional[int] = None
|
|
61
|
+
"""total number of files scanned"""
|
|
62
|
+
|
|
63
|
+
files_failed_to_scan: Optional[int] = None
|
|
64
|
+
"""number of files that failed during scanning"""
|
|
65
|
+
|
|
66
|
+
files_with_detections_count: Optional[int] = None
|
|
67
|
+
"""number of files that contain detections"""
|
|
68
|
+
|
|
69
|
+
highest_severity: Optional[Literal["critical", "high", "medium", "low", "none", "unknown"]] = None
|
|
70
|
+
"""The highest severity of any detections on the scan."""
|
|
71
|
+
|
|
72
|
+
severity: Optional[Literal["critical", "high", "medium", "low", "unknown", "safe"]] = None
|
|
73
|
+
"""The highest severity of any detections on the scan, including "safe".
|
|
74
|
+
|
|
75
|
+
Use `.summary.highest_severity` instead.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
unknown_files: Optional[int] = None
|
|
79
|
+
"""number of files with unknown file type"""
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class ItemCompliance(BaseModel):
|
|
83
|
+
evaluated_at: Optional[datetime] = None
|
|
84
|
+
"""The datetime when the rule set was evaluated against the scan result"""
|
|
85
|
+
|
|
86
|
+
rule_set_ids: Optional[List[str]] = None
|
|
87
|
+
"""A list of non-default rule sets that were used when evaluating the scan result"""
|
|
88
|
+
|
|
89
|
+
status: Optional[Literal["COMPLIANT", "NONCOMPLIANT"]] = None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class Item(BaseModel):
|
|
93
|
+
detection_count: int
|
|
94
|
+
"""number of detections found; use `.summary.detection_count` instead"""
|
|
95
|
+
|
|
96
|
+
file_count: int
|
|
97
|
+
"""number of files scanned; use `.summary.file_count` instead"""
|
|
98
|
+
|
|
99
|
+
files_with_detections_count: int
|
|
100
|
+
"""
|
|
101
|
+
number of files with detections found; use
|
|
102
|
+
`.summary.files_with_detections_count` instead
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
inventory: ItemInventory
|
|
106
|
+
|
|
107
|
+
scan_id: str
|
|
108
|
+
"""unique identifier for the scan"""
|
|
109
|
+
|
|
110
|
+
start_time: datetime
|
|
111
|
+
"""time the scan started"""
|
|
112
|
+
|
|
113
|
+
status: Literal["pending", "running", "done", "failed", "canceled"]
|
|
114
|
+
"""status of the scan"""
|
|
115
|
+
|
|
116
|
+
summary: ItemSummary
|
|
117
|
+
|
|
118
|
+
version: str
|
|
119
|
+
"""scanner version"""
|
|
120
|
+
|
|
121
|
+
schema_version: Optional[str] = FieldInfo(alias="$schema_version", default=None)
|
|
122
|
+
"""version of the scan report schema format"""
|
|
123
|
+
|
|
124
|
+
compliance: Optional[ItemCompliance] = None
|
|
125
|
+
|
|
126
|
+
detection_categories: Optional[List[str]] = None
|
|
127
|
+
"""list of detection categories found; use `.summary.detection_categories` instead"""
|
|
128
|
+
|
|
129
|
+
end_time: Optional[datetime] = None
|
|
130
|
+
"""time the scan ended"""
|
|
131
|
+
|
|
132
|
+
has_genealogy: Optional[bool] = None
|
|
133
|
+
"""if there is model geneaology info available"""
|
|
134
|
+
|
|
135
|
+
severity: Optional[Literal["critical", "high", "medium", "low", "unknown", "safe"]] = None
|
|
136
|
+
"""The highest severity of any detections on the scan, including "safe".
|
|
137
|
+
|
|
138
|
+
Use `.summary.highest_severity` instead.
|
|
139
|
+
"""
|
|
9
140
|
|
|
10
141
|
|
|
11
142
|
class JobListResponse(BaseModel):
|
|
12
|
-
items: List[
|
|
143
|
+
items: List[Item]
|
|
13
144
|
"""List of items. If no matching items are found, then `[]` will be returned."""
|
|
14
145
|
|
|
15
146
|
limit: int
|
|
@@ -4,11 +4,12 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing_extensions import Literal, Required, TypedDict
|
|
6
6
|
|
|
7
|
-
__all__ = ["JobRequestParams", "Access", "Inventory"]
|
|
7
|
+
__all__ = ["JobRequestParams", "Access", "Inventory", "InventoryScanTarget", "InventoryScanTargetProviderModel"]
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class JobRequestParams(TypedDict, total=False):
|
|
11
11
|
access: Required[Access]
|
|
12
|
+
"""Access method for the location of files associated with the scan"""
|
|
12
13
|
|
|
13
14
|
inventory: Required[Inventory]
|
|
14
15
|
|
|
@@ -23,9 +24,34 @@ class Access(TypedDict, total=False):
|
|
|
23
24
|
"GOOGLE_SIGNED",
|
|
24
25
|
"GOOGLE_OAUTH",
|
|
25
26
|
"HUGGING_FACE",
|
|
27
|
+
"NONE",
|
|
26
28
|
]
|
|
27
29
|
|
|
28
30
|
|
|
31
|
+
class InventoryScanTargetProviderModel(TypedDict, total=False):
|
|
32
|
+
model_id: Required[str]
|
|
33
|
+
"""The provider's unique identifier for the model. Examples:
|
|
34
|
+
|
|
35
|
+
- AWS Bedrock: "anthropic.claude-3-5-sonnet-20241022-v2:0"
|
|
36
|
+
- Azure AI Foundry: "Claude-3-5-Sonnet"
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
provider: Required[Literal["AWS_BEDROCK", "AZURE_AI_FOUNDRY", "AWS_SAGEMAKER"]]
|
|
40
|
+
|
|
41
|
+
model_arn: str
|
|
42
|
+
"""
|
|
43
|
+
Optional full ARN or resource identifier for the model. Used for provisioned
|
|
44
|
+
models, custom deployments, or cross-account access.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class InventoryScanTarget(TypedDict, total=False):
|
|
49
|
+
file_location: str
|
|
50
|
+
"""URL or path to the model files"""
|
|
51
|
+
|
|
52
|
+
provider_model: InventoryScanTargetProviderModel
|
|
53
|
+
|
|
54
|
+
|
|
29
55
|
class Inventory(TypedDict, total=False):
|
|
30
56
|
model_name: Required[str]
|
|
31
57
|
"""Name of the model"""
|
|
@@ -33,9 +59,6 @@ class Inventory(TypedDict, total=False):
|
|
|
33
59
|
model_version: Required[str]
|
|
34
60
|
"""If you do not provide a version, one will be generated for you."""
|
|
35
61
|
|
|
36
|
-
requested_scan_location: Required[str]
|
|
37
|
-
"""Location to be scanned"""
|
|
38
|
-
|
|
39
62
|
requesting_entity: Required[str]
|
|
40
63
|
"""Entity that requested the scan"""
|
|
41
64
|
|
|
@@ -45,5 +68,18 @@ class Inventory(TypedDict, total=False):
|
|
|
45
68
|
scanned
|
|
46
69
|
"""
|
|
47
70
|
|
|
48
|
-
request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"]
|
|
71
|
+
request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]
|
|
49
72
|
"""Identifies the system that requested the scan"""
|
|
73
|
+
|
|
74
|
+
requested_scan_location: str
|
|
75
|
+
"""**DEPRECATED**: Use `scan_target` instead. Location of files to be scanned.
|
|
76
|
+
|
|
77
|
+
Maintained for backwards compatibility. If both `requested_scan_location` and
|
|
78
|
+
`scan_target` are provided, `scan_target` takes precedence.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
scan_target: InventoryScanTarget
|
|
82
|
+
"""Specifies what to scan.
|
|
83
|
+
|
|
84
|
+
Must provide at least one of: file_location, provider_model, or both.
|
|
85
|
+
"""
|
|
@@ -6,7 +6,35 @@ from typing_extensions import Literal
|
|
|
6
6
|
from ..._compat import PYDANTIC_V1, ConfigDict
|
|
7
7
|
from ..._models import BaseModel
|
|
8
8
|
|
|
9
|
-
__all__ = ["ScanJob", "Inventory"]
|
|
9
|
+
__all__ = ["ScanJob", "Inventory", "InventoryScanTarget", "InventoryScanTargetProviderModel"]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class InventoryScanTargetProviderModel(BaseModel):
|
|
13
|
+
model_id: str
|
|
14
|
+
"""The provider's unique identifier for the model. Examples:
|
|
15
|
+
|
|
16
|
+
- AWS Bedrock: "anthropic.claude-3-5-sonnet-20241022-v2:0"
|
|
17
|
+
- Azure AI Foundry: "Claude-3-5-Sonnet"
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
provider: Literal["AWS_BEDROCK", "AZURE_AI_FOUNDRY", "AWS_SAGEMAKER"]
|
|
21
|
+
|
|
22
|
+
model_arn: Optional[str] = None
|
|
23
|
+
"""
|
|
24
|
+
Optional full ARN or resource identifier for the model. Used for provisioned
|
|
25
|
+
models, custom deployments, or cross-account access.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
if not PYDANTIC_V1:
|
|
29
|
+
# allow fields with a `model_` prefix
|
|
30
|
+
model_config = ConfigDict(protected_namespaces=tuple())
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class InventoryScanTarget(BaseModel):
|
|
34
|
+
file_location: Optional[str] = None
|
|
35
|
+
"""URL or path to the model files"""
|
|
36
|
+
|
|
37
|
+
provider_model: Optional[InventoryScanTargetProviderModel] = None
|
|
10
38
|
|
|
11
39
|
|
|
12
40
|
class Inventory(BaseModel):
|
|
@@ -16,9 +44,6 @@ class Inventory(BaseModel):
|
|
|
16
44
|
model_version: str
|
|
17
45
|
"""If you do not provide a version, one will be generated for you."""
|
|
18
46
|
|
|
19
|
-
requested_scan_location: str
|
|
20
|
-
"""Location to be scanned"""
|
|
21
|
-
|
|
22
47
|
requesting_entity: str
|
|
23
48
|
"""Entity that requested the scan"""
|
|
24
49
|
|
|
@@ -28,9 +53,24 @@ class Inventory(BaseModel):
|
|
|
28
53
|
scanned
|
|
29
54
|
"""
|
|
30
55
|
|
|
31
|
-
request_source: Optional[
|
|
56
|
+
request_source: Optional[
|
|
57
|
+
Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]
|
|
58
|
+
] = None
|
|
32
59
|
"""Identifies the system that requested the scan"""
|
|
33
60
|
|
|
61
|
+
requested_scan_location: Optional[str] = None
|
|
62
|
+
"""**DEPRECATED**: Use `scan_target` instead. Location of files to be scanned.
|
|
63
|
+
|
|
64
|
+
Maintained for backwards compatibility. If both `requested_scan_location` and
|
|
65
|
+
`scan_target` are provided, `scan_target` takes precedence.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
scan_target: Optional[InventoryScanTarget] = None
|
|
69
|
+
"""Specifies what to scan.
|
|
70
|
+
|
|
71
|
+
Must provide at least one of: file_location, provider_model, or both.
|
|
72
|
+
"""
|
|
73
|
+
|
|
34
74
|
if not PYDANTIC_V1:
|
|
35
75
|
# allow fields with a `model_` prefix
|
|
36
76
|
model_config = ConfigDict(protected_namespaces=tuple())
|
|
@@ -12,9 +12,7 @@ from ..._models import BaseModel
|
|
|
12
12
|
__all__ = [
|
|
13
13
|
"ScanReport",
|
|
14
14
|
"Inventory",
|
|
15
|
-
"
|
|
16
|
-
"InventoryScanModelIDsV3",
|
|
17
|
-
"InventoryScanModelComboV3",
|
|
15
|
+
"Summary",
|
|
18
16
|
"Compliance",
|
|
19
17
|
"FileResult",
|
|
20
18
|
"FileResultDetails",
|
|
@@ -26,14 +24,19 @@ __all__ = [
|
|
|
26
24
|
"FileResultDetection",
|
|
27
25
|
"FileResultDetectionMitreAtlas",
|
|
28
26
|
"FileResultDetectionRuleDetail",
|
|
29
|
-
"Summary",
|
|
30
27
|
]
|
|
31
28
|
|
|
32
29
|
|
|
33
|
-
class
|
|
30
|
+
class Inventory(BaseModel):
|
|
31
|
+
model_id: str
|
|
32
|
+
"""Unique identifier for the model"""
|
|
33
|
+
|
|
34
34
|
model_name: str
|
|
35
35
|
"""name of the model"""
|
|
36
36
|
|
|
37
|
+
model_version_id: str
|
|
38
|
+
"""unique identifier for the model version"""
|
|
39
|
+
|
|
37
40
|
requested_scan_location: str
|
|
38
41
|
"""Location to be scanned"""
|
|
39
42
|
|
|
@@ -49,7 +52,9 @@ class InventoryScanModelDetailsV3(BaseModel):
|
|
|
49
52
|
scanned
|
|
50
53
|
"""
|
|
51
54
|
|
|
52
|
-
request_source: Optional[
|
|
55
|
+
request_source: Optional[
|
|
56
|
+
Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]
|
|
57
|
+
] = None
|
|
53
58
|
"""Identifies the system that requested the scan"""
|
|
54
59
|
|
|
55
60
|
requesting_entity: Optional[str] = None
|
|
@@ -60,55 +65,33 @@ class InventoryScanModelDetailsV3(BaseModel):
|
|
|
60
65
|
model_config = ConfigDict(protected_namespaces=tuple())
|
|
61
66
|
|
|
62
67
|
|
|
63
|
-
class
|
|
64
|
-
|
|
65
|
-
"""
|
|
66
|
-
|
|
67
|
-
model_version_id: str
|
|
68
|
-
"""unique identifier for the model version"""
|
|
69
|
-
|
|
70
|
-
if not PYDANTIC_V1:
|
|
71
|
-
# allow fields with a `model_` prefix
|
|
72
|
-
model_config = ConfigDict(protected_namespaces=tuple())
|
|
73
|
-
|
|
68
|
+
class Summary(BaseModel):
|
|
69
|
+
detection_categories: Optional[List[str]] = None
|
|
70
|
+
"""list of unique detection categories found"""
|
|
74
71
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"""Unique identifier for the model"""
|
|
72
|
+
detection_count: Optional[int] = None
|
|
73
|
+
"""total number of detections found"""
|
|
78
74
|
|
|
79
|
-
|
|
80
|
-
"""
|
|
75
|
+
file_count: Optional[int] = None
|
|
76
|
+
"""total number of files scanned"""
|
|
81
77
|
|
|
82
|
-
|
|
83
|
-
"""
|
|
78
|
+
files_failed_to_scan: Optional[int] = None
|
|
79
|
+
"""number of files that failed during scanning"""
|
|
84
80
|
|
|
85
|
-
|
|
86
|
-
"""
|
|
81
|
+
files_with_detections_count: Optional[int] = None
|
|
82
|
+
"""number of files that contain detections"""
|
|
87
83
|
|
|
88
|
-
|
|
89
|
-
"""
|
|
84
|
+
highest_severity: Optional[Literal["critical", "high", "medium", "low", "none", "unknown"]] = None
|
|
85
|
+
"""The highest severity of any detections on the scan."""
|
|
90
86
|
|
|
91
|
-
|
|
92
|
-
"""
|
|
87
|
+
severity: Optional[Literal["critical", "high", "medium", "low", "unknown", "safe"]] = None
|
|
88
|
+
"""The highest severity of any detections on the scan, including "safe".
|
|
93
89
|
|
|
94
|
-
|
|
95
|
-
"""
|
|
96
|
-
Specifies the platform or service where the model originated before being
|
|
97
|
-
scanned
|
|
90
|
+
Use `.summary.highest_severity` instead.
|
|
98
91
|
"""
|
|
99
92
|
|
|
100
|
-
|
|
101
|
-
"""
|
|
102
|
-
|
|
103
|
-
requesting_entity: Optional[str] = None
|
|
104
|
-
"""Entity that requested the scan"""
|
|
105
|
-
|
|
106
|
-
if not PYDANTIC_V1:
|
|
107
|
-
# allow fields with a `model_` prefix
|
|
108
|
-
model_config = ConfigDict(protected_namespaces=tuple())
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
Inventory: TypeAlias = Union[InventoryScanModelDetailsV3, InventoryScanModelIDsV3, InventoryScanModelComboV3]
|
|
93
|
+
unknown_files: Optional[int] = None
|
|
94
|
+
"""number of files with unknown file type"""
|
|
112
95
|
|
|
113
96
|
|
|
114
97
|
class Compliance(BaseModel):
|
|
@@ -288,45 +271,20 @@ class FileResult(BaseModel):
|
|
|
288
271
|
"""Error messages returned by the scanner"""
|
|
289
272
|
|
|
290
273
|
|
|
291
|
-
class Summary(BaseModel):
|
|
292
|
-
detection_categories: Optional[List[str]] = None
|
|
293
|
-
"""list of unique detection categories found"""
|
|
294
|
-
|
|
295
|
-
detection_count: Optional[int] = None
|
|
296
|
-
"""total number of detections found"""
|
|
297
|
-
|
|
298
|
-
file_count: Optional[int] = None
|
|
299
|
-
"""total number of files scanned"""
|
|
300
|
-
|
|
301
|
-
files_failed_to_scan: Optional[int] = None
|
|
302
|
-
"""number of files that failed during scanning"""
|
|
303
|
-
|
|
304
|
-
files_with_detections_count: Optional[int] = None
|
|
305
|
-
"""number of files that contain detections"""
|
|
306
|
-
|
|
307
|
-
severity: Optional[Literal["critical", "high", "medium", "low", "safe", "unknown"]] = None
|
|
308
|
-
"""The severity of the detection.
|
|
309
|
-
|
|
310
|
-
Use ScanDetectionSeverity (without safe) or ScanDetectionSeverityWithNone
|
|
311
|
-
instead.
|
|
312
|
-
"""
|
|
313
|
-
|
|
314
|
-
unknown_files: Optional[int] = None
|
|
315
|
-
"""number of files with unknown file type"""
|
|
316
|
-
|
|
317
|
-
|
|
318
274
|
class ScanReport(BaseModel):
|
|
319
275
|
detection_count: int
|
|
320
|
-
"""number of detections found"""
|
|
276
|
+
"""number of detections found; use `.summary.detection_count` instead"""
|
|
321
277
|
|
|
322
278
|
file_count: int
|
|
323
|
-
"""number of files scanned"""
|
|
279
|
+
"""number of files scanned; use `.summary.file_count` instead"""
|
|
324
280
|
|
|
325
281
|
files_with_detections_count: int
|
|
326
|
-
"""
|
|
282
|
+
"""
|
|
283
|
+
number of files with detections found; use
|
|
284
|
+
`.summary.files_with_detections_count` instead
|
|
285
|
+
"""
|
|
327
286
|
|
|
328
287
|
inventory: Inventory
|
|
329
|
-
"""information about model and version that this scan relates to"""
|
|
330
288
|
|
|
331
289
|
scan_id: str
|
|
332
290
|
"""unique identifier for the scan"""
|
|
@@ -337,6 +295,8 @@ class ScanReport(BaseModel):
|
|
|
337
295
|
status: Literal["pending", "running", "done", "failed", "canceled"]
|
|
338
296
|
"""status of the scan"""
|
|
339
297
|
|
|
298
|
+
summary: Summary
|
|
299
|
+
|
|
340
300
|
version: str
|
|
341
301
|
"""scanner version"""
|
|
342
302
|
|
|
@@ -346,7 +306,7 @@ class ScanReport(BaseModel):
|
|
|
346
306
|
compliance: Optional[Compliance] = None
|
|
347
307
|
|
|
348
308
|
detection_categories: Optional[List[str]] = None
|
|
349
|
-
"""list of detection categories found"""
|
|
309
|
+
"""list of detection categories found; use `.summary.detection_categories` instead"""
|
|
350
310
|
|
|
351
311
|
end_time: Optional[datetime] = None
|
|
352
312
|
"""time the scan ended"""
|
|
@@ -356,12 +316,8 @@ class ScanReport(BaseModel):
|
|
|
356
316
|
has_genealogy: Optional[bool] = None
|
|
357
317
|
"""if there is model geneaology info available"""
|
|
358
318
|
|
|
359
|
-
severity: Optional[Literal["critical", "high", "medium", "low", "
|
|
360
|
-
"""The severity of the
|
|
319
|
+
severity: Optional[Literal["critical", "high", "medium", "low", "unknown", "safe"]] = None
|
|
320
|
+
"""The highest severity of any detections on the scan, including "safe".
|
|
361
321
|
|
|
362
|
-
Use
|
|
363
|
-
instead.
|
|
322
|
+
Use `.summary.highest_severity` instead.
|
|
364
323
|
"""
|
|
365
|
-
|
|
366
|
-
summary: Optional[Summary] = None
|
|
367
|
-
"""aggregated summary statistics for the scan"""
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
3
|
from ...._models import BaseModel
|
|
6
4
|
|
|
7
5
|
__all__ = ["FileCompleteResponse"]
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
class FileCompleteResponse(BaseModel):
|
|
11
|
-
scan_id:
|
|
9
|
+
scan_id: str
|
|
12
10
|
"""Request to resource is successful"""
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
3
|
from ..._models import BaseModel
|
|
6
4
|
|
|
7
5
|
__all__ = ["UploadCompleteAllResponse"]
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
class UploadCompleteAllResponse(BaseModel):
|
|
11
|
-
scan_id:
|
|
9
|
+
scan_id: str
|
|
12
10
|
"""Request to resource is successful"""
|
|
@@ -28,7 +28,7 @@ class UploadStartParams(TypedDict, total=False):
|
|
|
28
28
|
scanned
|
|
29
29
|
"""
|
|
30
30
|
|
|
31
|
-
request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"]
|
|
31
|
+
request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]
|
|
32
32
|
"""Identifies the system that requested the scan"""
|
|
33
33
|
|
|
34
34
|
x_correlation_id: Annotated[str, PropertyInfo(alias="X-Correlation-Id")]
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
3
|
from ..._models import BaseModel
|
|
6
4
|
|
|
7
5
|
__all__ = ["UploadStartResponse"]
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
class UploadStartResponse(BaseModel):
|
|
11
|
-
scan_id:
|
|
9
|
+
scan_id: str
|
|
12
10
|
"""Request to resource is successful"""
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: hiddenlayer-sdk
|
|
3
|
-
Version: 3.0
|
|
3
|
+
Version: 3.1.0
|
|
4
4
|
Summary: The official Python library for the hiddenlayer API
|
|
5
5
|
Project-URL: Homepage, https://github.com/hiddenlayerai/hiddenlayer-sdk-python
|
|
6
6
|
Project-URL: Repository, https://github.com/hiddenlayerai/hiddenlayer-sdk-python
|
|
7
|
-
Author-email: HiddenLayer <
|
|
7
|
+
Author-email: HiddenLayer <sdks@hiddenlayer.com>
|
|
8
8
|
License: Apache-2.0
|
|
9
9
|
Classifier: Intended Audience :: Developers
|
|
10
10
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
@@ -33,7 +33,7 @@ Requires-Dist: types-requests>=2.32.0.20241016
|
|
|
33
33
|
Requires-Dist: typing-extensions<5,>=4.10
|
|
34
34
|
Provides-Extra: aiohttp
|
|
35
35
|
Requires-Dist: aiohttp; extra == 'aiohttp'
|
|
36
|
-
Requires-Dist: httpx-aiohttp>=0.1.
|
|
36
|
+
Requires-Dist: httpx-aiohttp>=0.1.9; extra == 'aiohttp'
|
|
37
37
|
Description-Content-Type: text/markdown
|
|
38
38
|
|
|
39
39
|
# HiddenLayer Python API library
|
|
@@ -12,7 +12,7 @@ hiddenlayer/_resource.py,sha256=2gb_vW4S82SKkbromH5bXbjusfdkg50fqatzePjeU44,1130
|
|
|
12
12
|
hiddenlayer/_response.py,sha256=NQRPhM9il3hR8Oh8HyH-aAGHn2-y464jtVbTWt5SfAU,28848
|
|
13
13
|
hiddenlayer/_streaming.py,sha256=nI65s60yoKWveXysHG-Ly-moTTIbn44wSVTb6A1wxyU,10120
|
|
14
14
|
hiddenlayer/_types.py,sha256=jJ_NDtjSV3hOcBV3vEPtp5ORmpoKIKnrD_uqvwzFzb8,7241
|
|
15
|
-
hiddenlayer/_version.py,sha256=
|
|
15
|
+
hiddenlayer/_version.py,sha256=W02dpjL0x6QQ_MSLtPsKKD3fWn6PVyhzfvbG4oOlbQg,163
|
|
16
16
|
hiddenlayer/pagination.py,sha256=WQtuZxl0jOJBsIRn8-IxBqbv2F4HzDBYzY1gLlXIqds,3558
|
|
17
17
|
hiddenlayer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
18
|
hiddenlayer/_utils/__init__.py,sha256=7fch0GT9zpNnErbciSpUNa-SjTxxjY6kxHxKMOM4AGs,2305
|
|
@@ -28,27 +28,27 @@ hiddenlayer/_utils/_transform.py,sha256=NjCzmnfqYrsAikUHQig6N9QfuTVbKipuP3ur9mcN
|
|
|
28
28
|
hiddenlayer/_utils/_typing.py,sha256=N_5PPuFNsaygbtA_npZd98SVN1LQQvFTKL6bkWPBZGU,4786
|
|
29
29
|
hiddenlayer/_utils/_utils.py,sha256=0dDqauUbVZEXV0NVl7Bwu904Wwo5eyFCZpQThhFNhyA,12253
|
|
30
30
|
hiddenlayer/lib/.keep,sha256=wuNrz-5SXo3jJaJOJgz4vFHM41YH_g20F5cRQo0vLes,224
|
|
31
|
-
hiddenlayer/lib/__init__.py,sha256=
|
|
31
|
+
hiddenlayer/lib/__init__.py,sha256=btTwIKt9OIgst2Z5kta0RJbuFD1SozdKGvzmR99MGAU,326
|
|
32
32
|
hiddenlayer/lib/community_scan.py,sha256=b76aRTXw7-LRcr9ud3QcGJm6TxcODELf57So6KXmeA4,6019
|
|
33
|
-
hiddenlayer/lib/model_scan.py,sha256=
|
|
33
|
+
hiddenlayer/lib/model_scan.py,sha256=W3pLYSgA5W_P4RjgznzbNR3kl5EzeImYtbGAT3DcX6o,26984
|
|
34
34
|
hiddenlayer/lib/scan_utils.py,sha256=GdHAaaUVW6tnSaqpRqiU7ZKnRz7GratqCOh7BnePXYc,4853
|
|
35
35
|
hiddenlayer/resources/__init__.py,sha256=xkR6NS_c3hJoiowVcO-BPwPzCnTHV5O9JYmtDXrH8dw,2535
|
|
36
36
|
hiddenlayer/resources/interactions.py,sha256=jpFBxSWKF6VRlf-gdD9Huvss6S0O9x85Gn7e9vSOF7I,7753
|
|
37
37
|
hiddenlayer/resources/prompt_analyzer.py,sha256=deb5KymcnC_tOO6NNAY6RWEiaMSakNmQ08n4HOm_NR0,7741
|
|
38
38
|
hiddenlayer/resources/sensors.py,sha256=jrwjT6KFErnLzZUs06CVh8iNodN9jUj-1vgzP_nF_y0,22233
|
|
39
39
|
hiddenlayer/resources/models/__init__.py,sha256=u34NP3OXwz5AMpZWFSif-DAeObv0i2qbUuaiqK5vV1w,989
|
|
40
|
-
hiddenlayer/resources/models/cards.py,sha256=
|
|
40
|
+
hiddenlayer/resources/models/cards.py,sha256=MbGARxunHo4ky5fZA9Kj_Zu2T7B1EeGHFVndixADpBQ,10591
|
|
41
41
|
hiddenlayer/resources/models/models.py,sha256=fcqZwIEw5xGpcvVNJaT98vZcxu1LHm73KbIQCDyQjIo,10633
|
|
42
42
|
hiddenlayer/resources/scans/__init__.py,sha256=Nk30F5DCEcreqEo9O648f9zs1GVPAq9a8t1bLRdK5jk,1876
|
|
43
|
-
hiddenlayer/resources/scans/jobs.py,sha256=
|
|
43
|
+
hiddenlayer/resources/scans/jobs.py,sha256=IbMP-t47kMTs1SOkXP4TBN28EeObrHeDY_vr4Mfhx_w,19319
|
|
44
44
|
hiddenlayer/resources/scans/results.py,sha256=80h9OUIYsc2J9Nqu0vQs2Ra1VYt7TNjNGxCmAQAdeXU,6340
|
|
45
45
|
hiddenlayer/resources/scans/scans.py,sha256=b0CZZ1jsQtLmf7h0C_kXExvS0MuDy5UP67WvSjgJyNU,5719
|
|
46
46
|
hiddenlayer/resources/scans/upload/__init__.py,sha256=aguQflI_0cmjU-4YqX3OYQ5kawYB3szm2v4CROTJbWQ,976
|
|
47
47
|
hiddenlayer/resources/scans/upload/file.py,sha256=Esvt604lV0-nlvLNgIPo8akyBq2AboQroR3XcRmN1nI,10350
|
|
48
|
-
hiddenlayer/resources/scans/upload/upload.py,sha256=
|
|
48
|
+
hiddenlayer/resources/scans/upload/upload.py,sha256=cRle_DuE_FvX31Dj5rNUXlbsiRS6XOpUbJ9LKJNxGk4,12697
|
|
49
49
|
hiddenlayer/types/__init__.py,sha256=GXxQCChqx12t33aB5yq_k79eD5HUHeYzl6viH8TW-iA,1154
|
|
50
50
|
hiddenlayer/types/interaction_analyze_params.py,sha256=MrrFeEgv5kzg-QesEYQdvFfuQ62rouK1fIgny1Gffyw,1694
|
|
51
|
-
hiddenlayer/types/interaction_analyze_response.py,sha256=
|
|
51
|
+
hiddenlayer/types/interaction_analyze_response.py,sha256=nCOP3PCISNMpBtXFmSY9PwBGb4lESsDMrb9VurzVh7w,7110
|
|
52
52
|
hiddenlayer/types/model_retrieve_response.py,sha256=3iUERIZ4gguWZ1i9YjMg2mZZRh21DWpOk3aycAs6YR8,1165
|
|
53
53
|
hiddenlayer/types/prompt_analyzer_create_params.py,sha256=wWPc1STT2ruBnuBG3c_7pEQLEifXUBFJrq6SAGIz848,604
|
|
54
54
|
hiddenlayer/types/prompt_analyzer_create_response.py,sha256=H6Kg2-y0Q1BLOlRGtKfRz33YyGeYH-XVZxfZ4AQN50I,11314
|
|
@@ -60,23 +60,23 @@ hiddenlayer/types/sensor_retrieve_response.py,sha256=7H262Rk2GlGjORP7GYwUx0Y7lmw
|
|
|
60
60
|
hiddenlayer/types/sensor_update_params.py,sha256=PG78VcDNZNLSTSyVO_falMUOZDWte2QopXF9SI2bM-I,468
|
|
61
61
|
hiddenlayer/types/sensor_update_response.py,sha256=Ag3SJmmMwQVQrJXFfd2VmHgNRkSzkRMO18xfJZMHpek,212
|
|
62
62
|
hiddenlayer/types/models/__init__.py,sha256=IKIsHDwjHY4w4W9AEkVcpuz5OAmRRMdeXnAUan7B914,255
|
|
63
|
-
hiddenlayer/types/models/card_list_params.py,sha256=
|
|
64
|
-
hiddenlayer/types/models/card_list_response.py,sha256=
|
|
63
|
+
hiddenlayer/types/models/card_list_params.py,sha256=MXtfvit2PxdUcctHfptzN01feMr1P522QGy1XzgeXmg,1742
|
|
64
|
+
hiddenlayer/types/models/card_list_response.py,sha256=xV1M4BmJcJmMRe49lKLDvKAZEAKrn4g-JrJ5VLmuSpg,1572
|
|
65
65
|
hiddenlayer/types/scans/__init__.py,sha256=C0Q2Un0WDwBgq1fBZ6eZOZSr08qnCdj8OunED0gX3qc,806
|
|
66
|
-
hiddenlayer/types/scans/job_list_params.py,sha256=
|
|
67
|
-
hiddenlayer/types/scans/job_list_response.py,sha256=
|
|
68
|
-
hiddenlayer/types/scans/job_request_params.py,sha256=
|
|
66
|
+
hiddenlayer/types/scans/job_list_params.py,sha256=eOcdF3JvJGmxmyhYWiD3XRDmgY6BumIMHAq09UG2CdM,1985
|
|
67
|
+
hiddenlayer/types/scans/job_list_response.py,sha256=F93cyj5fOpYOj8Xzs5bdKhUNFv2ExTwMdJI0Ft8gjU4,4517
|
|
68
|
+
hiddenlayer/types/scans/job_request_params.py,sha256=J1b9eW2B2-ElYAyUFwNKqnNZFyV8v8W83iTPmt3iN-U,2465
|
|
69
69
|
hiddenlayer/types/scans/job_retrieve_params.py,sha256=1qidN2xxwgDpshevghEKiQKIPXwpLWYgWYIxTv-xOx4,476
|
|
70
70
|
hiddenlayer/types/scans/result_sarif_response.py,sha256=rkP9Y4n1nilht9Ov0pDoFlamzryqYyTVffVhGTjC-U0,200
|
|
71
|
-
hiddenlayer/types/scans/scan_job.py,sha256=
|
|
72
|
-
hiddenlayer/types/scans/scan_report.py,sha256=
|
|
73
|
-
hiddenlayer/types/scans/upload_complete_all_response.py,sha256=
|
|
74
|
-
hiddenlayer/types/scans/upload_start_params.py,sha256=
|
|
75
|
-
hiddenlayer/types/scans/upload_start_response.py,sha256=
|
|
71
|
+
hiddenlayer/types/scans/scan_job.py,sha256=wbMl9xVMVRHl3RFrAWoJotv78Laj1Yeq5ivVH-io8lI,2597
|
|
72
|
+
hiddenlayer/types/scans/scan_report.py,sha256=ro5WXYr86azokrykI_XHyS-AqWeu6Y4LoWp7Y6bp3Fs,8552
|
|
73
|
+
hiddenlayer/types/scans/upload_complete_all_response.py,sha256=UBHTleGo5kYyyzrbxDIC2LOvzAECcNwOQU5uS2958mQ,268
|
|
74
|
+
hiddenlayer/types/scans/upload_start_params.py,sha256=sAAPPPLu0mtsKPNOGs_Gx2rfbqGnliS1FNg_B_TAnic,915
|
|
75
|
+
hiddenlayer/types/scans/upload_start_response.py,sha256=c60w9bqNXIx6M6yV-Qh5PyzWWyJnydrSYba1MdsqiGY,256
|
|
76
76
|
hiddenlayer/types/scans/upload/__init__.py,sha256=NVyWXWAU49cRCA-8XaJvK4HSkFh7t7bEWDjuJ3gwSnM,270
|
|
77
77
|
hiddenlayer/types/scans/upload/file_add_response.py,sha256=oqEXlFo6XlmPlaJgr6l4yjx6Mp20LNfSbvzKrMxZsjU,492
|
|
78
|
-
hiddenlayer/types/scans/upload/file_complete_response.py,sha256=
|
|
79
|
-
hiddenlayer_sdk-3.0.
|
|
80
|
-
hiddenlayer_sdk-3.0.
|
|
81
|
-
hiddenlayer_sdk-3.0.
|
|
82
|
-
hiddenlayer_sdk-3.0.
|
|
78
|
+
hiddenlayer/types/scans/upload/file_complete_response.py,sha256=R9NA46vXoSKSGV7WwK73aOVecrW-jxL5LXQKSwABMHY,259
|
|
79
|
+
hiddenlayer_sdk-3.1.0.dist-info/METADATA,sha256=e-P9remduoUDCeyL_YysjK4rmxgb3Ew-04rgnrMkGY4,16344
|
|
80
|
+
hiddenlayer_sdk-3.1.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
81
|
+
hiddenlayer_sdk-3.1.0.dist-info/licenses/LICENSE,sha256=5_TlOiFFpqKABs8i1L9AimAZ096K4ItapeGm2Qo-RiA,11341
|
|
82
|
+
hiddenlayer_sdk-3.1.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|