hiddenlayer-sdk 2.0.9__py3-none-any.whl → 3.0.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/__init__.py +109 -105
- hiddenlayer/_base_client.py +1995 -0
- hiddenlayer/_client.py +761 -0
- hiddenlayer/_compat.py +219 -0
- hiddenlayer/_constants.py +14 -0
- hiddenlayer/_exceptions.py +108 -0
- hiddenlayer/_files.py +123 -0
- hiddenlayer/_models.py +835 -0
- hiddenlayer/_oauth2.py +118 -0
- hiddenlayer/_qs.py +150 -0
- hiddenlayer/_resource.py +43 -0
- hiddenlayer/_response.py +832 -0
- hiddenlayer/_streaming.py +333 -0
- hiddenlayer/_types.py +260 -0
- hiddenlayer/_utils/__init__.py +64 -0
- hiddenlayer/_utils/_compat.py +45 -0
- hiddenlayer/_utils/_datetime_parse.py +136 -0
- hiddenlayer/_utils/_logs.py +25 -0
- hiddenlayer/_utils/_proxy.py +65 -0
- hiddenlayer/_utils/_reflection.py +42 -0
- hiddenlayer/_utils/_resources_proxy.py +24 -0
- hiddenlayer/_utils/_streams.py +12 -0
- hiddenlayer/_utils/_sync.py +86 -0
- hiddenlayer/_utils/_transform.py +457 -0
- hiddenlayer/_utils/_typing.py +156 -0
- hiddenlayer/_utils/_utils.py +421 -0
- hiddenlayer/_version.py +4 -0
- hiddenlayer/lib/.keep +4 -0
- hiddenlayer/lib/__init__.py +6 -0
- hiddenlayer/lib/community_scan.py +174 -0
- hiddenlayer/lib/model_scan.py +752 -0
- hiddenlayer/lib/scan_utils.py +142 -0
- hiddenlayer/pagination.py +127 -0
- hiddenlayer/resources/__init__.py +75 -0
- hiddenlayer/resources/interactions.py +205 -0
- hiddenlayer/resources/models/__init__.py +33 -0
- hiddenlayer/resources/models/cards.py +259 -0
- hiddenlayer/resources/models/models.py +284 -0
- hiddenlayer/resources/prompt_analyzer.py +207 -0
- hiddenlayer/resources/scans/__init__.py +61 -0
- hiddenlayer/resources/scans/jobs.py +499 -0
- hiddenlayer/resources/scans/results.py +169 -0
- hiddenlayer/resources/scans/scans.py +166 -0
- hiddenlayer/resources/scans/upload/__init__.py +33 -0
- hiddenlayer/resources/scans/upload/file.py +279 -0
- hiddenlayer/resources/scans/upload/upload.py +340 -0
- hiddenlayer/resources/sensors.py +575 -0
- hiddenlayer/types/__init__.py +16 -0
- hiddenlayer/types/interaction_analyze_params.py +62 -0
- hiddenlayer/types/interaction_analyze_response.py +199 -0
- hiddenlayer/types/model_retrieve_response.py +50 -0
- hiddenlayer/types/models/__init__.py +6 -0
- hiddenlayer/types/models/card_list_params.py +65 -0
- hiddenlayer/types/models/card_list_response.py +50 -0
- hiddenlayer/types/prompt_analyzer_create_params.py +23 -0
- hiddenlayer/types/prompt_analyzer_create_response.py +381 -0
- hiddenlayer/types/scans/__init__.py +14 -0
- hiddenlayer/types/scans/job_list_params.py +75 -0
- hiddenlayer/types/scans/job_list_response.py +22 -0
- hiddenlayer/types/scans/job_request_params.py +49 -0
- hiddenlayer/types/scans/job_retrieve_params.py +16 -0
- hiddenlayer/types/scans/result_sarif_response.py +7 -0
- hiddenlayer/types/scans/scan_job.py +46 -0
- hiddenlayer/types/scans/scan_report.py +367 -0
- hiddenlayer/types/scans/upload/__init__.py +6 -0
- hiddenlayer/types/scans/upload/file_add_response.py +24 -0
- hiddenlayer/types/scans/upload/file_complete_response.py +12 -0
- hiddenlayer/types/scans/upload_complete_all_response.py +12 -0
- hiddenlayer/types/scans/upload_start_params.py +34 -0
- hiddenlayer/types/scans/upload_start_response.py +12 -0
- hiddenlayer/types/sensor_create_params.py +24 -0
- hiddenlayer/types/sensor_create_response.py +33 -0
- hiddenlayer/types/sensor_query_params.py +39 -0
- hiddenlayer/types/sensor_query_response.py +43 -0
- hiddenlayer/types/sensor_retrieve_response.py +33 -0
- hiddenlayer/types/sensor_update_params.py +20 -0
- hiddenlayer/types/sensor_update_response.py +9 -0
- hiddenlayer_sdk-3.0.0.dist-info/METADATA +431 -0
- hiddenlayer_sdk-3.0.0.dist-info/RECORD +82 -0
- {hiddenlayer_sdk-2.0.9.dist-info → hiddenlayer_sdk-3.0.0.dist-info}/WHEEL +1 -2
- {hiddenlayer_sdk-2.0.9.dist-info → hiddenlayer_sdk-3.0.0.dist-info}/licenses/LICENSE +1 -1
- hiddenlayer/sdk/constants.py +0 -26
- hiddenlayer/sdk/exceptions.py +0 -12
- hiddenlayer/sdk/models.py +0 -58
- hiddenlayer/sdk/rest/__init__.py +0 -135
- hiddenlayer/sdk/rest/api/__init__.py +0 -10
- hiddenlayer/sdk/rest/api/aidr_predictive_api.py +0 -308
- hiddenlayer/sdk/rest/api/health_api.py +0 -272
- hiddenlayer/sdk/rest/api/model_api.py +0 -559
- hiddenlayer/sdk/rest/api/model_supply_chain_api.py +0 -4063
- hiddenlayer/sdk/rest/api/readiness_api.py +0 -272
- hiddenlayer/sdk/rest/api/sensor_api.py +0 -1432
- hiddenlayer/sdk/rest/api_client.py +0 -770
- hiddenlayer/sdk/rest/api_response.py +0 -21
- hiddenlayer/sdk/rest/configuration.py +0 -445
- hiddenlayer/sdk/rest/exceptions.py +0 -199
- hiddenlayer/sdk/rest/models/__init__.py +0 -113
- hiddenlayer/sdk/rest/models/address.py +0 -110
- hiddenlayer/sdk/rest/models/artifact.py +0 -155
- hiddenlayer/sdk/rest/models/artifact_change.py +0 -108
- hiddenlayer/sdk/rest/models/artifact_content.py +0 -101
- hiddenlayer/sdk/rest/models/artifact_location.py +0 -109
- hiddenlayer/sdk/rest/models/attachment.py +0 -129
- hiddenlayer/sdk/rest/models/begin_multi_file_upload200_response.py +0 -87
- hiddenlayer/sdk/rest/models/begin_multipart_file_upload200_response.py +0 -97
- hiddenlayer/sdk/rest/models/begin_multipart_file_upload200_response_parts_inner.py +0 -94
- hiddenlayer/sdk/rest/models/code_flow.py +0 -113
- hiddenlayer/sdk/rest/models/configuration_override.py +0 -108
- hiddenlayer/sdk/rest/models/conversion.py +0 -114
- hiddenlayer/sdk/rest/models/create_sensor_request.py +0 -95
- hiddenlayer/sdk/rest/models/edge.py +0 -108
- hiddenlayer/sdk/rest/models/edge_traversal.py +0 -122
- hiddenlayer/sdk/rest/models/errors_inner.py +0 -91
- hiddenlayer/sdk/rest/models/exception.py +0 -113
- hiddenlayer/sdk/rest/models/external_properties.py +0 -273
- hiddenlayer/sdk/rest/models/external_property_file_reference.py +0 -102
- hiddenlayer/sdk/rest/models/external_property_file_references.py +0 -240
- hiddenlayer/sdk/rest/models/file_details_v3.py +0 -139
- hiddenlayer/sdk/rest/models/file_result_v3.py +0 -117
- hiddenlayer/sdk/rest/models/file_scan_report_v3.py +0 -132
- hiddenlayer/sdk/rest/models/file_scan_reports_v3.py +0 -95
- hiddenlayer/sdk/rest/models/fix.py +0 -113
- hiddenlayer/sdk/rest/models/get_condensed_model_scan_reports200_response.py +0 -102
- hiddenlayer/sdk/rest/models/graph.py +0 -123
- hiddenlayer/sdk/rest/models/graph_traversal.py +0 -97
- hiddenlayer/sdk/rest/models/inventory_v3.py +0 -101
- hiddenlayer/sdk/rest/models/invocation.py +0 -199
- hiddenlayer/sdk/rest/models/location.py +0 -146
- hiddenlayer/sdk/rest/models/location_inner.py +0 -138
- hiddenlayer/sdk/rest/models/location_relationship.py +0 -107
- hiddenlayer/sdk/rest/models/logical_location.py +0 -104
- hiddenlayer/sdk/rest/models/message.py +0 -92
- hiddenlayer/sdk/rest/models/mitre_atlas_inner.py +0 -110
- hiddenlayer/sdk/rest/models/model.py +0 -103
- hiddenlayer/sdk/rest/models/model_inventory_info.py +0 -103
- hiddenlayer/sdk/rest/models/model_version.py +0 -97
- hiddenlayer/sdk/rest/models/multi_file_upload_request_v3.py +0 -97
- hiddenlayer/sdk/rest/models/multiformat_message_string.py +0 -95
- hiddenlayer/sdk/rest/models/node.py +0 -122
- hiddenlayer/sdk/rest/models/notification.py +0 -157
- hiddenlayer/sdk/rest/models/notify_model_scan_completed200_response.py +0 -87
- hiddenlayer/sdk/rest/models/paged_response_with_total.py +0 -94
- hiddenlayer/sdk/rest/models/pagination_v3.py +0 -95
- hiddenlayer/sdk/rest/models/physical_location.py +0 -94
- hiddenlayer/sdk/rest/models/problem_details.py +0 -103
- hiddenlayer/sdk/rest/models/property_bag.py +0 -101
- hiddenlayer/sdk/rest/models/rectangle.py +0 -110
- hiddenlayer/sdk/rest/models/region.py +0 -127
- hiddenlayer/sdk/rest/models/replacement.py +0 -103
- hiddenlayer/sdk/rest/models/reporting_configuration.py +0 -113
- hiddenlayer/sdk/rest/models/reporting_descriptor.py +0 -162
- hiddenlayer/sdk/rest/models/reporting_descriptor_reference.py +0 -103
- hiddenlayer/sdk/rest/models/reporting_descriptor_relationship.py +0 -115
- hiddenlayer/sdk/rest/models/result.py +0 -312
- hiddenlayer/sdk/rest/models/result_provenance.py +0 -133
- hiddenlayer/sdk/rest/models/rule_details_inner.py +0 -102
- hiddenlayer/sdk/rest/models/run.py +0 -318
- hiddenlayer/sdk/rest/models/run_automation_details.py +0 -129
- hiddenlayer/sdk/rest/models/sarif210.py +0 -123
- hiddenlayer/sdk/rest/models/scan_create_request.py +0 -87
- hiddenlayer/sdk/rest/models/scan_detection_v3.py +0 -159
- hiddenlayer/sdk/rest/models/scan_detection_v31.py +0 -158
- hiddenlayer/sdk/rest/models/scan_header_v3.py +0 -129
- hiddenlayer/sdk/rest/models/scan_job.py +0 -115
- hiddenlayer/sdk/rest/models/scan_job_access.py +0 -97
- hiddenlayer/sdk/rest/models/scan_model_details_v3.py +0 -99
- hiddenlayer/sdk/rest/models/scan_model_details_v31.py +0 -97
- hiddenlayer/sdk/rest/models/scan_model_ids_v3.py +0 -89
- hiddenlayer/sdk/rest/models/scan_report_v3.py +0 -139
- hiddenlayer/sdk/rest/models/scan_results_map_v3.py +0 -105
- hiddenlayer/sdk/rest/models/scan_results_v3.py +0 -120
- hiddenlayer/sdk/rest/models/security_posture.py +0 -89
- hiddenlayer/sdk/rest/models/sensor.py +0 -100
- hiddenlayer/sdk/rest/models/sensor_query_response.py +0 -101
- hiddenlayer/sdk/rest/models/sensor_sor_model_card_query_response.py +0 -101
- hiddenlayer/sdk/rest/models/sensor_sor_model_card_response.py +0 -127
- hiddenlayer/sdk/rest/models/sensor_sor_query_filter.py +0 -108
- hiddenlayer/sdk/rest/models/sensor_sor_query_request.py +0 -109
- hiddenlayer/sdk/rest/models/special_locations.py +0 -97
- hiddenlayer/sdk/rest/models/stack.py +0 -113
- hiddenlayer/sdk/rest/models/stack_frame.py +0 -104
- hiddenlayer/sdk/rest/models/submission_response.py +0 -95
- hiddenlayer/sdk/rest/models/submission_v2.py +0 -109
- hiddenlayer/sdk/rest/models/suppression.py +0 -133
- hiddenlayer/sdk/rest/models/thread_flow.py +0 -144
- hiddenlayer/sdk/rest/models/thread_flow_location.py +0 -166
- hiddenlayer/sdk/rest/models/tool.py +0 -107
- hiddenlayer/sdk/rest/models/tool_component.py +0 -251
- hiddenlayer/sdk/rest/models/tool_component_reference.py +0 -108
- hiddenlayer/sdk/rest/models/translation_metadata.py +0 -110
- hiddenlayer/sdk/rest/models/validation_error_model.py +0 -99
- hiddenlayer/sdk/rest/models/version_control_details.py +0 -108
- hiddenlayer/sdk/rest/models/web_request.py +0 -112
- hiddenlayer/sdk/rest/models/web_response.py +0 -112
- hiddenlayer/sdk/rest/rest.py +0 -257
- hiddenlayer/sdk/services/__init__.py +0 -0
- hiddenlayer/sdk/services/aidr_predictive.py +0 -130
- hiddenlayer/sdk/services/model_scan.py +0 -505
- hiddenlayer/sdk/utils.py +0 -92
- hiddenlayer/sdk/version.py +0 -1
- hiddenlayer_sdk-2.0.9.dist-info/METADATA +0 -368
- hiddenlayer_sdk-2.0.9.dist-info/RECORD +0 -126
- hiddenlayer_sdk-2.0.9.dist-info/top_level.txt +0 -1
- /hiddenlayer/{sdk/__init__.py → py.typed} +0 -0
@@ -0,0 +1,142 @@
|
|
1
|
+
"""
|
2
|
+
Shared utilities for scan functionality across different scanner types.
|
3
|
+
|
4
|
+
This module provides common retry logic for handling scan retrieval operations
|
5
|
+
that may initially return 404 errors due to timing issues.
|
6
|
+
"""
|
7
|
+
|
8
|
+
import time
|
9
|
+
import random
|
10
|
+
import asyncio
|
11
|
+
import logging
|
12
|
+
from typing import TYPE_CHECKING
|
13
|
+
|
14
|
+
from .._exceptions import NotFoundError
|
15
|
+
|
16
|
+
if TYPE_CHECKING:
|
17
|
+
from .. import HiddenLayer, AsyncHiddenLayer
|
18
|
+
from ..types.scans import ScanReport
|
19
|
+
|
20
|
+
logger = logging.getLogger(__name__)
|
21
|
+
|
22
|
+
|
23
|
+
class ScanStatus:
|
24
|
+
"""Scan status constants."""
|
25
|
+
|
26
|
+
DONE = "done"
|
27
|
+
FAILED = "failed"
|
28
|
+
PENDING = "pending"
|
29
|
+
RUNNING = "running"
|
30
|
+
CANCELED = "canceled"
|
31
|
+
|
32
|
+
|
33
|
+
def get_scan_results(client: "HiddenLayer", *, scan_id: str) -> "ScanReport":
|
34
|
+
"""
|
35
|
+
Get scan results with retry logic for 404 errors.
|
36
|
+
|
37
|
+
Used when wait_for_results=False to handle initial scan availability.
|
38
|
+
"""
|
39
|
+
retries = 0
|
40
|
+
max_retries = 5 # Fewer retries since we're not waiting for completion
|
41
|
+
base_delay = 0.5 # Slightly longer base delay
|
42
|
+
|
43
|
+
while retries < max_retries:
|
44
|
+
try:
|
45
|
+
return client.scans.jobs.retrieve(scan_id)
|
46
|
+
except NotFoundError:
|
47
|
+
retries += 1
|
48
|
+
if retries >= max_retries:
|
49
|
+
logger.error(f"Scan {scan_id} not found after {max_retries} attempts")
|
50
|
+
raise
|
51
|
+
|
52
|
+
delay = base_delay * retries + random.uniform(0, 0.5)
|
53
|
+
logger.info(f"Scan not yet available, retrying in {delay:.1f}s (attempt {retries + 1}/{max_retries})")
|
54
|
+
time.sleep(delay)
|
55
|
+
|
56
|
+
# Should never reach here due to raise above, but satisfy linter
|
57
|
+
raise RuntimeError(f"Scan {scan_id} not found after {max_retries} attempts")
|
58
|
+
|
59
|
+
|
60
|
+
def wait_for_scan_results(client: "HiddenLayer", *, scan_id: str) -> "ScanReport":
|
61
|
+
"""
|
62
|
+
Wait for scan results using exponential backoff polling.
|
63
|
+
|
64
|
+
Handles initial 404 errors when scan is not immediately available.
|
65
|
+
"""
|
66
|
+
base_delay = 0.1 # seconds
|
67
|
+
retries = 0
|
68
|
+
scan_results = None
|
69
|
+
|
70
|
+
while True:
|
71
|
+
try:
|
72
|
+
scan_results = client.scans.jobs.retrieve(scan_id)
|
73
|
+
# If we got here, scan exists - check if it's done
|
74
|
+
if scan_results.status in [ScanStatus.DONE, ScanStatus.FAILED, ScanStatus.CANCELED]:
|
75
|
+
break
|
76
|
+
logger.info(f"scan status: {scan_results.status}")
|
77
|
+
except NotFoundError:
|
78
|
+
# Scan not found yet, treat it like any other retry condition
|
79
|
+
logger.info(f"scan not found yet, retrying...")
|
80
|
+
|
81
|
+
retries += 1
|
82
|
+
delay = base_delay * 2**retries + random.uniform(0, 1) # exponential back off retry
|
83
|
+
delay = min(delay, 30) # cap at 30 seconds
|
84
|
+
time.sleep(delay)
|
85
|
+
|
86
|
+
return scan_results
|
87
|
+
|
88
|
+
|
89
|
+
async def get_scan_results_async(client: "AsyncHiddenLayer", *, scan_id: str) -> "ScanReport":
|
90
|
+
"""
|
91
|
+
Async version of get_scan_results with retry logic for 404 errors.
|
92
|
+
|
93
|
+
Used when wait_for_results=False to handle initial scan availability.
|
94
|
+
"""
|
95
|
+
retries = 0
|
96
|
+
max_retries = 5 # Fewer retries since we're not waiting for completion
|
97
|
+
base_delay = 0.5 # Slightly longer base delay
|
98
|
+
|
99
|
+
while retries < max_retries:
|
100
|
+
try:
|
101
|
+
return await client.scans.jobs.retrieve(scan_id)
|
102
|
+
except NotFoundError:
|
103
|
+
retries += 1
|
104
|
+
if retries >= max_retries:
|
105
|
+
logger.error(f"Scan {scan_id} not found after {max_retries} attempts")
|
106
|
+
raise
|
107
|
+
|
108
|
+
delay = base_delay * retries + random.uniform(0, 0.5)
|
109
|
+
logger.info(f"Scan not yet available, retrying in {delay:.1f}s (attempt {retries + 1}/{max_retries})")
|
110
|
+
await asyncio.sleep(delay)
|
111
|
+
|
112
|
+
# Should never reach here due to raise above, but satisfy linter
|
113
|
+
raise RuntimeError(f"Scan {scan_id} not found after {max_retries} attempts")
|
114
|
+
|
115
|
+
|
116
|
+
async def wait_for_scan_results_async(client: "AsyncHiddenLayer", *, scan_id: str) -> "ScanReport":
|
117
|
+
"""
|
118
|
+
Async version of wait_for_scan_results.
|
119
|
+
|
120
|
+
Handles initial 404 errors when scan is not immediately available.
|
121
|
+
"""
|
122
|
+
base_delay = 0.1 # seconds
|
123
|
+
retries = 0
|
124
|
+
scan_results = None
|
125
|
+
|
126
|
+
while True:
|
127
|
+
try:
|
128
|
+
scan_results = await client.scans.jobs.retrieve(scan_id)
|
129
|
+
# If we got here, scan exists - check if it's done
|
130
|
+
if scan_results.status in [ScanStatus.DONE, ScanStatus.FAILED, ScanStatus.CANCELED]:
|
131
|
+
break
|
132
|
+
logger.info(f"scan status: {scan_results.status}")
|
133
|
+
except NotFoundError:
|
134
|
+
# Scan not found yet, treat it like any other retry condition
|
135
|
+
logger.info(f"scan not found yet, retrying...")
|
136
|
+
|
137
|
+
retries += 1
|
138
|
+
delay = base_delay * 2**retries + random.uniform(0, 1) # exponential back off retry
|
139
|
+
delay = min(delay, 30) # cap at 30 seconds
|
140
|
+
await asyncio.sleep(delay)
|
141
|
+
|
142
|
+
return scan_results
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
2
|
+
|
3
|
+
from typing import List, Generic, TypeVar, Optional
|
4
|
+
from typing_extensions import override
|
5
|
+
|
6
|
+
from ._models import BaseModel
|
7
|
+
from ._base_client import BasePage, PageInfo, BaseSyncPage, BaseAsyncPage
|
8
|
+
|
9
|
+
__all__ = ["CursorPaginationPage", "SyncCursorPagination", "AsyncCursorPagination", "SyncOffsetPage", "AsyncOffsetPage"]
|
10
|
+
|
11
|
+
_T = TypeVar("_T")
|
12
|
+
|
13
|
+
|
14
|
+
class CursorPaginationPage(BaseModel):
|
15
|
+
next: Optional[str] = None
|
16
|
+
|
17
|
+
prev: Optional[str] = None
|
18
|
+
|
19
|
+
|
20
|
+
class SyncCursorPagination(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
|
21
|
+
items: List[_T]
|
22
|
+
page: Optional[CursorPaginationPage] = None
|
23
|
+
|
24
|
+
@override
|
25
|
+
def _get_page_items(self) -> List[_T]:
|
26
|
+
items = self.items
|
27
|
+
if not items:
|
28
|
+
return []
|
29
|
+
return items
|
30
|
+
|
31
|
+
@override
|
32
|
+
def next_page_info(self) -> Optional[PageInfo]:
|
33
|
+
next = None
|
34
|
+
if self.page is not None:
|
35
|
+
if self.page.next is not None:
|
36
|
+
next = self.page.next
|
37
|
+
if not next:
|
38
|
+
return None
|
39
|
+
|
40
|
+
return PageInfo(params={"cursor": next})
|
41
|
+
|
42
|
+
|
43
|
+
class AsyncCursorPagination(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
|
44
|
+
items: List[_T]
|
45
|
+
page: Optional[CursorPaginationPage] = None
|
46
|
+
|
47
|
+
@override
|
48
|
+
def _get_page_items(self) -> List[_T]:
|
49
|
+
items = self.items
|
50
|
+
if not items:
|
51
|
+
return []
|
52
|
+
return items
|
53
|
+
|
54
|
+
@override
|
55
|
+
def next_page_info(self) -> Optional[PageInfo]:
|
56
|
+
next = None
|
57
|
+
if self.page is not None:
|
58
|
+
if self.page.next is not None:
|
59
|
+
next = self.page.next
|
60
|
+
if not next:
|
61
|
+
return None
|
62
|
+
|
63
|
+
return PageInfo(params={"cursor": next})
|
64
|
+
|
65
|
+
|
66
|
+
class SyncOffsetPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
|
67
|
+
results: List[_T]
|
68
|
+
total_count: Optional[int] = None
|
69
|
+
page_size: Optional[int] = None
|
70
|
+
page_number: Optional[int] = None
|
71
|
+
|
72
|
+
@override
|
73
|
+
def _get_page_items(self) -> List[_T]:
|
74
|
+
results = self.results
|
75
|
+
if not results:
|
76
|
+
return []
|
77
|
+
return results
|
78
|
+
|
79
|
+
@override
|
80
|
+
def next_page_info(self) -> Optional[PageInfo]:
|
81
|
+
offset = self._options.params.get("offset") or 0
|
82
|
+
if not isinstance(offset, int):
|
83
|
+
raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
|
84
|
+
|
85
|
+
length = len(self._get_page_items())
|
86
|
+
current_count = offset + length
|
87
|
+
|
88
|
+
total_count = self.total_count
|
89
|
+
if total_count is None:
|
90
|
+
return None
|
91
|
+
|
92
|
+
if current_count < total_count:
|
93
|
+
return PageInfo(params={"offset": current_count})
|
94
|
+
|
95
|
+
return None
|
96
|
+
|
97
|
+
|
98
|
+
class AsyncOffsetPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
|
99
|
+
results: List[_T]
|
100
|
+
total_count: Optional[int] = None
|
101
|
+
page_size: Optional[int] = None
|
102
|
+
page_number: Optional[int] = None
|
103
|
+
|
104
|
+
@override
|
105
|
+
def _get_page_items(self) -> List[_T]:
|
106
|
+
results = self.results
|
107
|
+
if not results:
|
108
|
+
return []
|
109
|
+
return results
|
110
|
+
|
111
|
+
@override
|
112
|
+
def next_page_info(self) -> Optional[PageInfo]:
|
113
|
+
offset = self._options.params.get("offset") or 0
|
114
|
+
if not isinstance(offset, int):
|
115
|
+
raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
|
116
|
+
|
117
|
+
length = len(self._get_page_items())
|
118
|
+
current_count = offset + length
|
119
|
+
|
120
|
+
total_count = self.total_count
|
121
|
+
if total_count is None:
|
122
|
+
return None
|
123
|
+
|
124
|
+
if current_count < total_count:
|
125
|
+
return PageInfo(params={"offset": current_count})
|
126
|
+
|
127
|
+
return None
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
2
|
+
|
3
|
+
from .scans import (
|
4
|
+
ScansResource,
|
5
|
+
AsyncScansResource,
|
6
|
+
ScansResourceWithRawResponse,
|
7
|
+
AsyncScansResourceWithRawResponse,
|
8
|
+
ScansResourceWithStreamingResponse,
|
9
|
+
AsyncScansResourceWithStreamingResponse,
|
10
|
+
)
|
11
|
+
from .models import (
|
12
|
+
ModelsResource,
|
13
|
+
AsyncModelsResource,
|
14
|
+
ModelsResourceWithRawResponse,
|
15
|
+
AsyncModelsResourceWithRawResponse,
|
16
|
+
ModelsResourceWithStreamingResponse,
|
17
|
+
AsyncModelsResourceWithStreamingResponse,
|
18
|
+
)
|
19
|
+
from .sensors import (
|
20
|
+
SensorsResource,
|
21
|
+
AsyncSensorsResource,
|
22
|
+
SensorsResourceWithRawResponse,
|
23
|
+
AsyncSensorsResourceWithRawResponse,
|
24
|
+
SensorsResourceWithStreamingResponse,
|
25
|
+
AsyncSensorsResourceWithStreamingResponse,
|
26
|
+
)
|
27
|
+
from .interactions import (
|
28
|
+
InteractionsResource,
|
29
|
+
AsyncInteractionsResource,
|
30
|
+
InteractionsResourceWithRawResponse,
|
31
|
+
AsyncInteractionsResourceWithRawResponse,
|
32
|
+
InteractionsResourceWithStreamingResponse,
|
33
|
+
AsyncInteractionsResourceWithStreamingResponse,
|
34
|
+
)
|
35
|
+
from .prompt_analyzer import (
|
36
|
+
PromptAnalyzerResource,
|
37
|
+
AsyncPromptAnalyzerResource,
|
38
|
+
PromptAnalyzerResourceWithRawResponse,
|
39
|
+
AsyncPromptAnalyzerResourceWithRawResponse,
|
40
|
+
PromptAnalyzerResourceWithStreamingResponse,
|
41
|
+
AsyncPromptAnalyzerResourceWithStreamingResponse,
|
42
|
+
)
|
43
|
+
|
44
|
+
__all__ = [
|
45
|
+
"ModelsResource",
|
46
|
+
"AsyncModelsResource",
|
47
|
+
"ModelsResourceWithRawResponse",
|
48
|
+
"AsyncModelsResourceWithRawResponse",
|
49
|
+
"ModelsResourceWithStreamingResponse",
|
50
|
+
"AsyncModelsResourceWithStreamingResponse",
|
51
|
+
"PromptAnalyzerResource",
|
52
|
+
"AsyncPromptAnalyzerResource",
|
53
|
+
"PromptAnalyzerResourceWithRawResponse",
|
54
|
+
"AsyncPromptAnalyzerResourceWithRawResponse",
|
55
|
+
"PromptAnalyzerResourceWithStreamingResponse",
|
56
|
+
"AsyncPromptAnalyzerResourceWithStreamingResponse",
|
57
|
+
"InteractionsResource",
|
58
|
+
"AsyncInteractionsResource",
|
59
|
+
"InteractionsResourceWithRawResponse",
|
60
|
+
"AsyncInteractionsResourceWithRawResponse",
|
61
|
+
"InteractionsResourceWithStreamingResponse",
|
62
|
+
"AsyncInteractionsResourceWithStreamingResponse",
|
63
|
+
"SensorsResource",
|
64
|
+
"AsyncSensorsResource",
|
65
|
+
"SensorsResourceWithRawResponse",
|
66
|
+
"AsyncSensorsResourceWithRawResponse",
|
67
|
+
"SensorsResourceWithStreamingResponse",
|
68
|
+
"AsyncSensorsResourceWithStreamingResponse",
|
69
|
+
"ScansResource",
|
70
|
+
"AsyncScansResource",
|
71
|
+
"ScansResourceWithRawResponse",
|
72
|
+
"AsyncScansResourceWithRawResponse",
|
73
|
+
"ScansResourceWithStreamingResponse",
|
74
|
+
"AsyncScansResourceWithStreamingResponse",
|
75
|
+
]
|
@@ -0,0 +1,205 @@
|
|
1
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import httpx
|
6
|
+
|
7
|
+
from ..types import interaction_analyze_params
|
8
|
+
from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
|
9
|
+
from .._utils import maybe_transform, strip_not_given, async_maybe_transform
|
10
|
+
from .._compat import cached_property
|
11
|
+
from .._resource import SyncAPIResource, AsyncAPIResource
|
12
|
+
from .._response import (
|
13
|
+
to_raw_response_wrapper,
|
14
|
+
to_streamed_response_wrapper,
|
15
|
+
async_to_raw_response_wrapper,
|
16
|
+
async_to_streamed_response_wrapper,
|
17
|
+
)
|
18
|
+
from .._base_client import make_request_options
|
19
|
+
from ..types.interaction_analyze_response import InteractionAnalyzeResponse
|
20
|
+
|
21
|
+
__all__ = ["InteractionsResource", "AsyncInteractionsResource"]
|
22
|
+
|
23
|
+
|
24
|
+
class InteractionsResource(SyncAPIResource):
|
25
|
+
@cached_property
|
26
|
+
def with_raw_response(self) -> InteractionsResourceWithRawResponse:
|
27
|
+
"""
|
28
|
+
This property can be used as a prefix for any HTTP method call to return
|
29
|
+
the raw response object instead of the parsed content.
|
30
|
+
|
31
|
+
For more information, see https://www.github.com/hiddenlayerai/hiddenlayer-sdk-python#accessing-raw-response-data-eg-headers
|
32
|
+
"""
|
33
|
+
return InteractionsResourceWithRawResponse(self)
|
34
|
+
|
35
|
+
@cached_property
|
36
|
+
def with_streaming_response(self) -> InteractionsResourceWithStreamingResponse:
|
37
|
+
"""
|
38
|
+
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
|
39
|
+
|
40
|
+
For more information, see https://www.github.com/hiddenlayerai/hiddenlayer-sdk-python#with_streaming_response
|
41
|
+
"""
|
42
|
+
return InteractionsResourceWithStreamingResponse(self)
|
43
|
+
|
44
|
+
def analyze(
|
45
|
+
self,
|
46
|
+
*,
|
47
|
+
metadata: interaction_analyze_params.Metadata,
|
48
|
+
input: interaction_analyze_params.Input | Omit = omit,
|
49
|
+
output: interaction_analyze_params.Output | Omit = omit,
|
50
|
+
hl_project_id: str | Omit = omit,
|
51
|
+
x_correlation_id: str | Omit = omit,
|
52
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
53
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
54
|
+
extra_headers: Headers | None = None,
|
55
|
+
extra_query: Query | None = None,
|
56
|
+
extra_body: Body | None = None,
|
57
|
+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
58
|
+
) -> InteractionAnalyzeResponse:
|
59
|
+
"""
|
60
|
+
Performs a detailed security analysis of the input and/or output of LLM
|
61
|
+
interactions.
|
62
|
+
|
63
|
+
Args:
|
64
|
+
extra_headers: Send extra headers
|
65
|
+
|
66
|
+
extra_query: Add additional query parameters to the request
|
67
|
+
|
68
|
+
extra_body: Add additional JSON properties to the request
|
69
|
+
|
70
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
71
|
+
"""
|
72
|
+
extra_headers = {
|
73
|
+
**strip_not_given(
|
74
|
+
{
|
75
|
+
"HL-Project-Id": hl_project_id,
|
76
|
+
"X-Correlation-Id": x_correlation_id,
|
77
|
+
}
|
78
|
+
),
|
79
|
+
**(extra_headers or {}),
|
80
|
+
}
|
81
|
+
return self._post(
|
82
|
+
"/detection/v1/interactions",
|
83
|
+
body=maybe_transform(
|
84
|
+
{
|
85
|
+
"metadata": metadata,
|
86
|
+
"input": input,
|
87
|
+
"output": output,
|
88
|
+
},
|
89
|
+
interaction_analyze_params.InteractionAnalyzeParams,
|
90
|
+
),
|
91
|
+
options=make_request_options(
|
92
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
93
|
+
),
|
94
|
+
cast_to=InteractionAnalyzeResponse,
|
95
|
+
)
|
96
|
+
|
97
|
+
|
98
|
+
class AsyncInteractionsResource(AsyncAPIResource):
|
99
|
+
@cached_property
|
100
|
+
def with_raw_response(self) -> AsyncInteractionsResourceWithRawResponse:
|
101
|
+
"""
|
102
|
+
This property can be used as a prefix for any HTTP method call to return
|
103
|
+
the raw response object instead of the parsed content.
|
104
|
+
|
105
|
+
For more information, see https://www.github.com/hiddenlayerai/hiddenlayer-sdk-python#accessing-raw-response-data-eg-headers
|
106
|
+
"""
|
107
|
+
return AsyncInteractionsResourceWithRawResponse(self)
|
108
|
+
|
109
|
+
@cached_property
|
110
|
+
def with_streaming_response(self) -> AsyncInteractionsResourceWithStreamingResponse:
|
111
|
+
"""
|
112
|
+
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
|
113
|
+
|
114
|
+
For more information, see https://www.github.com/hiddenlayerai/hiddenlayer-sdk-python#with_streaming_response
|
115
|
+
"""
|
116
|
+
return AsyncInteractionsResourceWithStreamingResponse(self)
|
117
|
+
|
118
|
+
async def analyze(
|
119
|
+
self,
|
120
|
+
*,
|
121
|
+
metadata: interaction_analyze_params.Metadata,
|
122
|
+
input: interaction_analyze_params.Input | Omit = omit,
|
123
|
+
output: interaction_analyze_params.Output | Omit = omit,
|
124
|
+
hl_project_id: str | Omit = omit,
|
125
|
+
x_correlation_id: str | Omit = omit,
|
126
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
127
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
128
|
+
extra_headers: Headers | None = None,
|
129
|
+
extra_query: Query | None = None,
|
130
|
+
extra_body: Body | None = None,
|
131
|
+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
132
|
+
) -> InteractionAnalyzeResponse:
|
133
|
+
"""
|
134
|
+
Performs a detailed security analysis of the input and/or output of LLM
|
135
|
+
interactions.
|
136
|
+
|
137
|
+
Args:
|
138
|
+
extra_headers: Send extra headers
|
139
|
+
|
140
|
+
extra_query: Add additional query parameters to the request
|
141
|
+
|
142
|
+
extra_body: Add additional JSON properties to the request
|
143
|
+
|
144
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
145
|
+
"""
|
146
|
+
extra_headers = {
|
147
|
+
**strip_not_given(
|
148
|
+
{
|
149
|
+
"HL-Project-Id": hl_project_id,
|
150
|
+
"X-Correlation-Id": x_correlation_id,
|
151
|
+
}
|
152
|
+
),
|
153
|
+
**(extra_headers or {}),
|
154
|
+
}
|
155
|
+
return await self._post(
|
156
|
+
"/detection/v1/interactions",
|
157
|
+
body=await async_maybe_transform(
|
158
|
+
{
|
159
|
+
"metadata": metadata,
|
160
|
+
"input": input,
|
161
|
+
"output": output,
|
162
|
+
},
|
163
|
+
interaction_analyze_params.InteractionAnalyzeParams,
|
164
|
+
),
|
165
|
+
options=make_request_options(
|
166
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
167
|
+
),
|
168
|
+
cast_to=InteractionAnalyzeResponse,
|
169
|
+
)
|
170
|
+
|
171
|
+
|
172
|
+
class InteractionsResourceWithRawResponse:
|
173
|
+
def __init__(self, interactions: InteractionsResource) -> None:
|
174
|
+
self._interactions = interactions
|
175
|
+
|
176
|
+
self.analyze = to_raw_response_wrapper(
|
177
|
+
interactions.analyze,
|
178
|
+
)
|
179
|
+
|
180
|
+
|
181
|
+
class AsyncInteractionsResourceWithRawResponse:
|
182
|
+
def __init__(self, interactions: AsyncInteractionsResource) -> None:
|
183
|
+
self._interactions = interactions
|
184
|
+
|
185
|
+
self.analyze = async_to_raw_response_wrapper(
|
186
|
+
interactions.analyze,
|
187
|
+
)
|
188
|
+
|
189
|
+
|
190
|
+
class InteractionsResourceWithStreamingResponse:
|
191
|
+
def __init__(self, interactions: InteractionsResource) -> None:
|
192
|
+
self._interactions = interactions
|
193
|
+
|
194
|
+
self.analyze = to_streamed_response_wrapper(
|
195
|
+
interactions.analyze,
|
196
|
+
)
|
197
|
+
|
198
|
+
|
199
|
+
class AsyncInteractionsResourceWithStreamingResponse:
|
200
|
+
def __init__(self, interactions: AsyncInteractionsResource) -> None:
|
201
|
+
self._interactions = interactions
|
202
|
+
|
203
|
+
self.analyze = async_to_streamed_response_wrapper(
|
204
|
+
interactions.analyze,
|
205
|
+
)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
2
|
+
|
3
|
+
from .cards import (
|
4
|
+
CardsResource,
|
5
|
+
AsyncCardsResource,
|
6
|
+
CardsResourceWithRawResponse,
|
7
|
+
AsyncCardsResourceWithRawResponse,
|
8
|
+
CardsResourceWithStreamingResponse,
|
9
|
+
AsyncCardsResourceWithStreamingResponse,
|
10
|
+
)
|
11
|
+
from .models import (
|
12
|
+
ModelsResource,
|
13
|
+
AsyncModelsResource,
|
14
|
+
ModelsResourceWithRawResponse,
|
15
|
+
AsyncModelsResourceWithRawResponse,
|
16
|
+
ModelsResourceWithStreamingResponse,
|
17
|
+
AsyncModelsResourceWithStreamingResponse,
|
18
|
+
)
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
"CardsResource",
|
22
|
+
"AsyncCardsResource",
|
23
|
+
"CardsResourceWithRawResponse",
|
24
|
+
"AsyncCardsResourceWithRawResponse",
|
25
|
+
"CardsResourceWithStreamingResponse",
|
26
|
+
"AsyncCardsResourceWithStreamingResponse",
|
27
|
+
"ModelsResource",
|
28
|
+
"AsyncModelsResource",
|
29
|
+
"ModelsResourceWithRawResponse",
|
30
|
+
"AsyncModelsResourceWithRawResponse",
|
31
|
+
"ModelsResourceWithStreamingResponse",
|
32
|
+
"AsyncModelsResourceWithStreamingResponse",
|
33
|
+
]
|