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 CHANGED
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "hiddenlayer"
4
- __version__ = "3.0.1" # x-release-please-version
4
+ __version__ = "3.1.0" # x-release-please-version
@@ -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__ = ["CommunityScanner", "AsyncCommunityScanner", "ModelScanner", "AsyncModelScanner"]
6
+ __all__ = [
7
+ "CommunityScanner",
8
+ "AsyncCommunityScanner",
9
+ "ModelScanner",
10
+ "AsyncModelScanner",
11
+ "CommunityScanSource",
12
+ ]
@@ -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 = httpx.put(
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
- async with httpx.AsyncClient() as client:
744
- response = await client.put(
745
- part.upload_url,
746
- content=part_data,
747
- headers={"Content-Type": "application/octet-stream"},
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[Literal["SAFE", "UNSAFE", "SUSPICIOUS", "UNKNOWN", "ERROR"]] | Omit = omit,
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[Literal["SAFE", "UNSAFE", "SUSPICIOUS", "UNKNOWN", "ERROR"]] | Omit = omit,
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"]] | Omit = omit,
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: SequenceNotStr[str] | Omit = omit,
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"]] | Omit = omit,
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: SequenceNotStr[str] | Omit = omit,
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"] | Omit = omit,
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"] | Omit = omit,
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[Literal["SAFE", "UNSAFE", "SUSPICIOUS", "UNKNOWN", "ERROR"]]
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: SequenceNotStr[str]
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[ScanReport]
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[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"]] = None
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
- "InventoryScanModelDetailsV3",
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 InventoryScanModelDetailsV3(BaseModel):
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[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"]] = None
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 InventoryScanModelIDsV3(BaseModel):
64
- model_id: str
65
- """Unique identifier for the model"""
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
- class InventoryScanModelComboV3(BaseModel):
76
- model_id: str
77
- """Unique identifier for the model"""
72
+ detection_count: Optional[int] = None
73
+ """total number of detections found"""
78
74
 
79
- model_name: str
80
- """name of the model"""
75
+ file_count: Optional[int] = None
76
+ """total number of files scanned"""
81
77
 
82
- model_version_id: str
83
- """unique identifier for the model version"""
78
+ files_failed_to_scan: Optional[int] = None
79
+ """number of files that failed during scanning"""
84
80
 
85
- requested_scan_location: str
86
- """Location to be scanned"""
81
+ files_with_detections_count: Optional[int] = None
82
+ """number of files that contain detections"""
87
83
 
88
- model_source: Optional[str] = None
89
- """source (provider) info"""
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
- model_version: Optional[str] = None
92
- """version of the model"""
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
- origin: Optional[str] = None
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
- request_source: Optional[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"]] = None
101
- """Identifies the system that requested the scan"""
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
- """number of files with detections found"""
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", "safe", "unknown"]] = None
360
- """The severity of the detection.
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 ScanDetectionSeverity (without safe) or ScanDetectionSeverityWithNone
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: Optional[str] = None
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: Optional[str] = None
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: Optional[str] = None
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.1
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 <dev-feedback@hiddenlayer-sdk.com>
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.8; extra == 'aiohttp'
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=OB7zD1GDSoq7oHiTUkL0ubMnRRH9Pq9xtuR8eGru_u0,163
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=oiTTRCYF7y8tIvultJMmXYskwcBvL17DBMnP7Ba-z9U,259
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=GrwMZUntaIwRIj6ufjLTqawXKCkF3MUPOWWLX0R9YI0,27395
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=ZqRmSBMAV81bPpcX8uG0-7wkf3L2VQO7CRqhEGjIQxI,10037
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=gHYqOqg5B-BgwCFsQiy9_YAKzLx0IVEH0OhsrD9wYos,19177
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=bZJ3Amu6t6zXRpdFk9r408TX0xgvSGsgDt-QPGtQofA,12637
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=_EvX7Q93FsF_U3NAsiJUexOABPWwyIpCLoVrUwe783c,5824
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=2FdRKJo-VjMyF3zMiH6RkwB4tdBAmeB3STSIMS2gnII,1650
64
- hiddenlayer/types/models/card_list_response.py,sha256=vjsro8Y1H2zOPZq_IeJssB9MNYYPTIp8C-bMC-THG8o,1311
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=ml8Oezdk2RKgB7hIId3IOTmnDWeVrCvVsbj5YZyiBmk,1911
67
- hiddenlayer/types/scans/job_list_response.py,sha256=ccGFUSkoY4HipftQq_VXpjM0gdIhPCkYeV8CHpWXdTw,582
68
- hiddenlayer/types/scans/job_request_params.py,sha256=P4_3vxfILORfEUeza8KoPupSNtNgj0dYoMwp0rQVo6o,1241
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=axX_Ydbzbadvw9u2AaTjUC8r8yeC0MBSgqD7hHlD3RU,1266
72
- hiddenlayer/types/scans/scan_report.py,sha256=iHbmSU9rjXYQhKNy304YG1QF1GU2S8ysOTT5G41UmCE,9693
73
- hiddenlayer/types/scans/upload_complete_all_response.py,sha256=ovVjWqsrXJ7OOMhWX4RpR1STiM0fV4YMfA0x1AK7IaM,314
74
- hiddenlayer/types/scans/upload_start_params.py,sha256=GSRF_30snIBUG-Cn0dQwslIavV0CvqweKvYsR3wfjcc,893
75
- hiddenlayer/types/scans/upload_start_response.py,sha256=wDzz5DDAC0MIDKAdMsHa0Y1GRS5kfPPgTRJtY4I5cI0,302
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=zhoV24Z_dyD0aP174viJyno5b8P7BG4hizOtPGdps0I,305
79
- hiddenlayer_sdk-3.0.1.dist-info/METADATA,sha256=hPtSxHNAJIAf_rpNIuf_ETeureHmh4RVnQrGePKgn5A,16356
80
- hiddenlayer_sdk-3.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
81
- hiddenlayer_sdk-3.0.1.dist-info/licenses/LICENSE,sha256=5_TlOiFFpqKABs8i1L9AimAZ096K4ItapeGm2Qo-RiA,11341
82
- hiddenlayer_sdk-3.0.1.dist-info/RECORD,,
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,,