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.
Files changed (204) hide show
  1. hiddenlayer/__init__.py +109 -105
  2. hiddenlayer/_base_client.py +1995 -0
  3. hiddenlayer/_client.py +761 -0
  4. hiddenlayer/_compat.py +219 -0
  5. hiddenlayer/_constants.py +14 -0
  6. hiddenlayer/_exceptions.py +108 -0
  7. hiddenlayer/_files.py +123 -0
  8. hiddenlayer/_models.py +835 -0
  9. hiddenlayer/_oauth2.py +118 -0
  10. hiddenlayer/_qs.py +150 -0
  11. hiddenlayer/_resource.py +43 -0
  12. hiddenlayer/_response.py +832 -0
  13. hiddenlayer/_streaming.py +333 -0
  14. hiddenlayer/_types.py +260 -0
  15. hiddenlayer/_utils/__init__.py +64 -0
  16. hiddenlayer/_utils/_compat.py +45 -0
  17. hiddenlayer/_utils/_datetime_parse.py +136 -0
  18. hiddenlayer/_utils/_logs.py +25 -0
  19. hiddenlayer/_utils/_proxy.py +65 -0
  20. hiddenlayer/_utils/_reflection.py +42 -0
  21. hiddenlayer/_utils/_resources_proxy.py +24 -0
  22. hiddenlayer/_utils/_streams.py +12 -0
  23. hiddenlayer/_utils/_sync.py +86 -0
  24. hiddenlayer/_utils/_transform.py +457 -0
  25. hiddenlayer/_utils/_typing.py +156 -0
  26. hiddenlayer/_utils/_utils.py +421 -0
  27. hiddenlayer/_version.py +4 -0
  28. hiddenlayer/lib/.keep +4 -0
  29. hiddenlayer/lib/__init__.py +6 -0
  30. hiddenlayer/lib/community_scan.py +174 -0
  31. hiddenlayer/lib/model_scan.py +752 -0
  32. hiddenlayer/lib/scan_utils.py +142 -0
  33. hiddenlayer/pagination.py +127 -0
  34. hiddenlayer/resources/__init__.py +75 -0
  35. hiddenlayer/resources/interactions.py +205 -0
  36. hiddenlayer/resources/models/__init__.py +33 -0
  37. hiddenlayer/resources/models/cards.py +259 -0
  38. hiddenlayer/resources/models/models.py +284 -0
  39. hiddenlayer/resources/prompt_analyzer.py +207 -0
  40. hiddenlayer/resources/scans/__init__.py +61 -0
  41. hiddenlayer/resources/scans/jobs.py +499 -0
  42. hiddenlayer/resources/scans/results.py +169 -0
  43. hiddenlayer/resources/scans/scans.py +166 -0
  44. hiddenlayer/resources/scans/upload/__init__.py +33 -0
  45. hiddenlayer/resources/scans/upload/file.py +279 -0
  46. hiddenlayer/resources/scans/upload/upload.py +340 -0
  47. hiddenlayer/resources/sensors.py +575 -0
  48. hiddenlayer/types/__init__.py +16 -0
  49. hiddenlayer/types/interaction_analyze_params.py +62 -0
  50. hiddenlayer/types/interaction_analyze_response.py +199 -0
  51. hiddenlayer/types/model_retrieve_response.py +50 -0
  52. hiddenlayer/types/models/__init__.py +6 -0
  53. hiddenlayer/types/models/card_list_params.py +65 -0
  54. hiddenlayer/types/models/card_list_response.py +50 -0
  55. hiddenlayer/types/prompt_analyzer_create_params.py +23 -0
  56. hiddenlayer/types/prompt_analyzer_create_response.py +381 -0
  57. hiddenlayer/types/scans/__init__.py +14 -0
  58. hiddenlayer/types/scans/job_list_params.py +75 -0
  59. hiddenlayer/types/scans/job_list_response.py +22 -0
  60. hiddenlayer/types/scans/job_request_params.py +49 -0
  61. hiddenlayer/types/scans/job_retrieve_params.py +16 -0
  62. hiddenlayer/types/scans/result_sarif_response.py +7 -0
  63. hiddenlayer/types/scans/scan_job.py +46 -0
  64. hiddenlayer/types/scans/scan_report.py +367 -0
  65. hiddenlayer/types/scans/upload/__init__.py +6 -0
  66. hiddenlayer/types/scans/upload/file_add_response.py +24 -0
  67. hiddenlayer/types/scans/upload/file_complete_response.py +12 -0
  68. hiddenlayer/types/scans/upload_complete_all_response.py +12 -0
  69. hiddenlayer/types/scans/upload_start_params.py +34 -0
  70. hiddenlayer/types/scans/upload_start_response.py +12 -0
  71. hiddenlayer/types/sensor_create_params.py +24 -0
  72. hiddenlayer/types/sensor_create_response.py +33 -0
  73. hiddenlayer/types/sensor_query_params.py +39 -0
  74. hiddenlayer/types/sensor_query_response.py +43 -0
  75. hiddenlayer/types/sensor_retrieve_response.py +33 -0
  76. hiddenlayer/types/sensor_update_params.py +20 -0
  77. hiddenlayer/types/sensor_update_response.py +9 -0
  78. hiddenlayer_sdk-3.0.0.dist-info/METADATA +431 -0
  79. hiddenlayer_sdk-3.0.0.dist-info/RECORD +82 -0
  80. {hiddenlayer_sdk-2.0.9.dist-info → hiddenlayer_sdk-3.0.0.dist-info}/WHEEL +1 -2
  81. {hiddenlayer_sdk-2.0.9.dist-info → hiddenlayer_sdk-3.0.0.dist-info}/licenses/LICENSE +1 -1
  82. hiddenlayer/sdk/constants.py +0 -26
  83. hiddenlayer/sdk/exceptions.py +0 -12
  84. hiddenlayer/sdk/models.py +0 -58
  85. hiddenlayer/sdk/rest/__init__.py +0 -135
  86. hiddenlayer/sdk/rest/api/__init__.py +0 -10
  87. hiddenlayer/sdk/rest/api/aidr_predictive_api.py +0 -308
  88. hiddenlayer/sdk/rest/api/health_api.py +0 -272
  89. hiddenlayer/sdk/rest/api/model_api.py +0 -559
  90. hiddenlayer/sdk/rest/api/model_supply_chain_api.py +0 -4063
  91. hiddenlayer/sdk/rest/api/readiness_api.py +0 -272
  92. hiddenlayer/sdk/rest/api/sensor_api.py +0 -1432
  93. hiddenlayer/sdk/rest/api_client.py +0 -770
  94. hiddenlayer/sdk/rest/api_response.py +0 -21
  95. hiddenlayer/sdk/rest/configuration.py +0 -445
  96. hiddenlayer/sdk/rest/exceptions.py +0 -199
  97. hiddenlayer/sdk/rest/models/__init__.py +0 -113
  98. hiddenlayer/sdk/rest/models/address.py +0 -110
  99. hiddenlayer/sdk/rest/models/artifact.py +0 -155
  100. hiddenlayer/sdk/rest/models/artifact_change.py +0 -108
  101. hiddenlayer/sdk/rest/models/artifact_content.py +0 -101
  102. hiddenlayer/sdk/rest/models/artifact_location.py +0 -109
  103. hiddenlayer/sdk/rest/models/attachment.py +0 -129
  104. hiddenlayer/sdk/rest/models/begin_multi_file_upload200_response.py +0 -87
  105. hiddenlayer/sdk/rest/models/begin_multipart_file_upload200_response.py +0 -97
  106. hiddenlayer/sdk/rest/models/begin_multipart_file_upload200_response_parts_inner.py +0 -94
  107. hiddenlayer/sdk/rest/models/code_flow.py +0 -113
  108. hiddenlayer/sdk/rest/models/configuration_override.py +0 -108
  109. hiddenlayer/sdk/rest/models/conversion.py +0 -114
  110. hiddenlayer/sdk/rest/models/create_sensor_request.py +0 -95
  111. hiddenlayer/sdk/rest/models/edge.py +0 -108
  112. hiddenlayer/sdk/rest/models/edge_traversal.py +0 -122
  113. hiddenlayer/sdk/rest/models/errors_inner.py +0 -91
  114. hiddenlayer/sdk/rest/models/exception.py +0 -113
  115. hiddenlayer/sdk/rest/models/external_properties.py +0 -273
  116. hiddenlayer/sdk/rest/models/external_property_file_reference.py +0 -102
  117. hiddenlayer/sdk/rest/models/external_property_file_references.py +0 -240
  118. hiddenlayer/sdk/rest/models/file_details_v3.py +0 -139
  119. hiddenlayer/sdk/rest/models/file_result_v3.py +0 -117
  120. hiddenlayer/sdk/rest/models/file_scan_report_v3.py +0 -132
  121. hiddenlayer/sdk/rest/models/file_scan_reports_v3.py +0 -95
  122. hiddenlayer/sdk/rest/models/fix.py +0 -113
  123. hiddenlayer/sdk/rest/models/get_condensed_model_scan_reports200_response.py +0 -102
  124. hiddenlayer/sdk/rest/models/graph.py +0 -123
  125. hiddenlayer/sdk/rest/models/graph_traversal.py +0 -97
  126. hiddenlayer/sdk/rest/models/inventory_v3.py +0 -101
  127. hiddenlayer/sdk/rest/models/invocation.py +0 -199
  128. hiddenlayer/sdk/rest/models/location.py +0 -146
  129. hiddenlayer/sdk/rest/models/location_inner.py +0 -138
  130. hiddenlayer/sdk/rest/models/location_relationship.py +0 -107
  131. hiddenlayer/sdk/rest/models/logical_location.py +0 -104
  132. hiddenlayer/sdk/rest/models/message.py +0 -92
  133. hiddenlayer/sdk/rest/models/mitre_atlas_inner.py +0 -110
  134. hiddenlayer/sdk/rest/models/model.py +0 -103
  135. hiddenlayer/sdk/rest/models/model_inventory_info.py +0 -103
  136. hiddenlayer/sdk/rest/models/model_version.py +0 -97
  137. hiddenlayer/sdk/rest/models/multi_file_upload_request_v3.py +0 -97
  138. hiddenlayer/sdk/rest/models/multiformat_message_string.py +0 -95
  139. hiddenlayer/sdk/rest/models/node.py +0 -122
  140. hiddenlayer/sdk/rest/models/notification.py +0 -157
  141. hiddenlayer/sdk/rest/models/notify_model_scan_completed200_response.py +0 -87
  142. hiddenlayer/sdk/rest/models/paged_response_with_total.py +0 -94
  143. hiddenlayer/sdk/rest/models/pagination_v3.py +0 -95
  144. hiddenlayer/sdk/rest/models/physical_location.py +0 -94
  145. hiddenlayer/sdk/rest/models/problem_details.py +0 -103
  146. hiddenlayer/sdk/rest/models/property_bag.py +0 -101
  147. hiddenlayer/sdk/rest/models/rectangle.py +0 -110
  148. hiddenlayer/sdk/rest/models/region.py +0 -127
  149. hiddenlayer/sdk/rest/models/replacement.py +0 -103
  150. hiddenlayer/sdk/rest/models/reporting_configuration.py +0 -113
  151. hiddenlayer/sdk/rest/models/reporting_descriptor.py +0 -162
  152. hiddenlayer/sdk/rest/models/reporting_descriptor_reference.py +0 -103
  153. hiddenlayer/sdk/rest/models/reporting_descriptor_relationship.py +0 -115
  154. hiddenlayer/sdk/rest/models/result.py +0 -312
  155. hiddenlayer/sdk/rest/models/result_provenance.py +0 -133
  156. hiddenlayer/sdk/rest/models/rule_details_inner.py +0 -102
  157. hiddenlayer/sdk/rest/models/run.py +0 -318
  158. hiddenlayer/sdk/rest/models/run_automation_details.py +0 -129
  159. hiddenlayer/sdk/rest/models/sarif210.py +0 -123
  160. hiddenlayer/sdk/rest/models/scan_create_request.py +0 -87
  161. hiddenlayer/sdk/rest/models/scan_detection_v3.py +0 -159
  162. hiddenlayer/sdk/rest/models/scan_detection_v31.py +0 -158
  163. hiddenlayer/sdk/rest/models/scan_header_v3.py +0 -129
  164. hiddenlayer/sdk/rest/models/scan_job.py +0 -115
  165. hiddenlayer/sdk/rest/models/scan_job_access.py +0 -97
  166. hiddenlayer/sdk/rest/models/scan_model_details_v3.py +0 -99
  167. hiddenlayer/sdk/rest/models/scan_model_details_v31.py +0 -97
  168. hiddenlayer/sdk/rest/models/scan_model_ids_v3.py +0 -89
  169. hiddenlayer/sdk/rest/models/scan_report_v3.py +0 -139
  170. hiddenlayer/sdk/rest/models/scan_results_map_v3.py +0 -105
  171. hiddenlayer/sdk/rest/models/scan_results_v3.py +0 -120
  172. hiddenlayer/sdk/rest/models/security_posture.py +0 -89
  173. hiddenlayer/sdk/rest/models/sensor.py +0 -100
  174. hiddenlayer/sdk/rest/models/sensor_query_response.py +0 -101
  175. hiddenlayer/sdk/rest/models/sensor_sor_model_card_query_response.py +0 -101
  176. hiddenlayer/sdk/rest/models/sensor_sor_model_card_response.py +0 -127
  177. hiddenlayer/sdk/rest/models/sensor_sor_query_filter.py +0 -108
  178. hiddenlayer/sdk/rest/models/sensor_sor_query_request.py +0 -109
  179. hiddenlayer/sdk/rest/models/special_locations.py +0 -97
  180. hiddenlayer/sdk/rest/models/stack.py +0 -113
  181. hiddenlayer/sdk/rest/models/stack_frame.py +0 -104
  182. hiddenlayer/sdk/rest/models/submission_response.py +0 -95
  183. hiddenlayer/sdk/rest/models/submission_v2.py +0 -109
  184. hiddenlayer/sdk/rest/models/suppression.py +0 -133
  185. hiddenlayer/sdk/rest/models/thread_flow.py +0 -144
  186. hiddenlayer/sdk/rest/models/thread_flow_location.py +0 -166
  187. hiddenlayer/sdk/rest/models/tool.py +0 -107
  188. hiddenlayer/sdk/rest/models/tool_component.py +0 -251
  189. hiddenlayer/sdk/rest/models/tool_component_reference.py +0 -108
  190. hiddenlayer/sdk/rest/models/translation_metadata.py +0 -110
  191. hiddenlayer/sdk/rest/models/validation_error_model.py +0 -99
  192. hiddenlayer/sdk/rest/models/version_control_details.py +0 -108
  193. hiddenlayer/sdk/rest/models/web_request.py +0 -112
  194. hiddenlayer/sdk/rest/models/web_response.py +0 -112
  195. hiddenlayer/sdk/rest/rest.py +0 -257
  196. hiddenlayer/sdk/services/__init__.py +0 -0
  197. hiddenlayer/sdk/services/aidr_predictive.py +0 -130
  198. hiddenlayer/sdk/services/model_scan.py +0 -505
  199. hiddenlayer/sdk/utils.py +0 -92
  200. hiddenlayer/sdk/version.py +0 -1
  201. hiddenlayer_sdk-2.0.9.dist-info/METADATA +0 -368
  202. hiddenlayer_sdk-2.0.9.dist-info/RECORD +0 -126
  203. hiddenlayer_sdk-2.0.9.dist-info/top_level.txt +0 -1
  204. /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
+ ]