hiddenlayer-sdk 3.0.0__tar.gz → 3.0.1__tar.gz

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 (131) hide show
  1. hiddenlayer_sdk-3.0.1/.release-please-manifest.json +3 -0
  2. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/CHANGELOG.md +8 -0
  3. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/PKG-INFO +115 -25
  4. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/README.md +114 -24
  5. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/pyproject.toml +1 -1
  6. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_version.py +1 -1
  7. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_client.py +70 -24
  8. hiddenlayer_sdk-3.0.0/.release-please-manifest.json +0 -3
  9. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/.gitignore +0 -0
  10. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/CODE_OF_CONDUCT.md +0 -0
  11. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/CONTRIBUTING.md +0 -0
  12. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/LICENSE +0 -0
  13. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/SECURITY.md +0 -0
  14. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/api.md +0 -0
  15. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/bin/check-release-environment +0 -0
  16. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/bin/publish-jfrog +0 -0
  17. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/bin/publish-pypi +0 -0
  18. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/examples/.keep +0 -0
  19. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/examples/demo.py +0 -0
  20. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/noxfile.py +0 -0
  21. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/release-please-config.json +0 -0
  22. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/requirements-dev.lock +0 -0
  23. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/requirements.lock +0 -0
  24. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/__init__.py +0 -0
  25. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_base_client.py +0 -0
  26. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_client.py +0 -0
  27. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_compat.py +0 -0
  28. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_constants.py +0 -0
  29. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_exceptions.py +0 -0
  30. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_files.py +0 -0
  31. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_models.py +0 -0
  32. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_oauth2.py +0 -0
  33. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_qs.py +0 -0
  34. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_resource.py +0 -0
  35. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_response.py +0 -0
  36. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_streaming.py +0 -0
  37. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_types.py +0 -0
  38. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/__init__.py +0 -0
  39. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_compat.py +0 -0
  40. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_datetime_parse.py +0 -0
  41. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_logs.py +0 -0
  42. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_proxy.py +0 -0
  43. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_reflection.py +0 -0
  44. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_resources_proxy.py +0 -0
  45. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_streams.py +0 -0
  46. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_sync.py +0 -0
  47. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_transform.py +0 -0
  48. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_typing.py +0 -0
  49. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/_utils/_utils.py +0 -0
  50. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/lib/.keep +0 -0
  51. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/lib/__init__.py +0 -0
  52. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/lib/community_scan.py +0 -0
  53. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/lib/model_scan.py +0 -0
  54. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/lib/scan_utils.py +0 -0
  55. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/pagination.py +0 -0
  56. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/py.typed +0 -0
  57. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/__init__.py +0 -0
  58. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/interactions.py +0 -0
  59. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/models/__init__.py +0 -0
  60. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/models/cards.py +0 -0
  61. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/models/models.py +0 -0
  62. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/prompt_analyzer.py +0 -0
  63. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/scans/__init__.py +0 -0
  64. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/scans/jobs.py +0 -0
  65. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/scans/results.py +0 -0
  66. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/scans/scans.py +0 -0
  67. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/scans/upload/__init__.py +0 -0
  68. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/scans/upload/file.py +0 -0
  69. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/scans/upload/upload.py +0 -0
  70. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/resources/sensors.py +0 -0
  71. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/__init__.py +0 -0
  72. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/interaction_analyze_params.py +0 -0
  73. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/interaction_analyze_response.py +0 -0
  74. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/model_retrieve_response.py +0 -0
  75. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/models/__init__.py +0 -0
  76. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/models/card_list_params.py +0 -0
  77. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/models/card_list_response.py +0 -0
  78. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/prompt_analyzer_create_params.py +0 -0
  79. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/prompt_analyzer_create_response.py +0 -0
  80. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/__init__.py +0 -0
  81. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/job_list_params.py +0 -0
  82. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/job_list_response.py +0 -0
  83. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/job_request_params.py +0 -0
  84. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/job_retrieve_params.py +0 -0
  85. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/result_sarif_response.py +0 -0
  86. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/scan_job.py +0 -0
  87. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/scan_report.py +0 -0
  88. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/upload/__init__.py +0 -0
  89. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/upload/file_add_response.py +0 -0
  90. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/upload/file_complete_response.py +0 -0
  91. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/upload_complete_all_response.py +0 -0
  92. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/upload_start_params.py +0 -0
  93. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/scans/upload_start_response.py +0 -0
  94. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/sensor_create_params.py +0 -0
  95. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/sensor_create_response.py +0 -0
  96. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/sensor_query_params.py +0 -0
  97. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/sensor_query_response.py +0 -0
  98. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/sensor_retrieve_response.py +0 -0
  99. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/sensor_update_params.py +0 -0
  100. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/src/hiddenlayer/types/sensor_update_response.py +0 -0
  101. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/__init__.py +0 -0
  102. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/__init__.py +0 -0
  103. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/models/__init__.py +0 -0
  104. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/models/test_cards.py +0 -0
  105. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/scans/__init__.py +0 -0
  106. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/scans/test_jobs.py +0 -0
  107. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/scans/test_results.py +0 -0
  108. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/scans/test_upload.py +0 -0
  109. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/scans/upload/__init__.py +0 -0
  110. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/scans/upload/test_file.py +0 -0
  111. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/test_interactions.py +0 -0
  112. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/test_models.py +0 -0
  113. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/test_prompt_analyzer.py +0 -0
  114. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/api_resources/test_sensors.py +0 -0
  115. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/conftest.py +0 -0
  116. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/sample_file.txt +0 -0
  117. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_community_scan.py +0 -0
  118. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_deepcopy.py +0 -0
  119. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_extract_files.py +0 -0
  120. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_files.py +0 -0
  121. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_model_scan.py +0 -0
  122. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_models.py +0 -0
  123. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_qs.py +0 -0
  124. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_required_args.py +0 -0
  125. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_response.py +0 -0
  126. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_streaming.py +0 -0
  127. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_transform.py +0 -0
  128. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_utils/test_datetime_parse.py +0 -0
  129. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_utils/test_proxy.py +0 -0
  130. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/test_utils/test_typing.py +0 -0
  131. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.0.1}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "3.0.1"
3
+ }
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.0.1 (2025-09-23)
4
+
5
+ Full Changelog: [v3.0.0...v3.0.1](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.0.0...v3.0.1)
6
+
7
+ ### Features
8
+
9
+ * **api:** manual updates ([2be2f2c](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/2be2f2c124d8ac9b9d22c675c165be496c1793ba))
10
+
3
11
  ## 3.0.0 (2025-09-23)
4
12
 
5
13
  Full Changelog: [v0.1.0-alpha.33...v3.0.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v0.1.0-alpha.33...v3.0.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: hiddenlayer-sdk
3
- Version: 3.0.0
3
+ Version: 3.0.1
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
@@ -70,10 +70,21 @@ client = HiddenLayer(
70
70
  environment="prod-eu",
71
71
  )
72
72
 
73
- sensor = client.sensors.create(
74
- plaintext_name="REPLACE_ME",
73
+ response = client.interactions.analyze(
74
+ metadata={
75
+ "model": "REPLACE_ME",
76
+ "requester_id": "REPLACE_ME",
77
+ },
78
+ input={
79
+ "messages": [
80
+ {
81
+ "role": "user",
82
+ "content": "REPLACE_ME",
83
+ }
84
+ ]
85
+ },
75
86
  )
76
- print(sensor.model_id)
87
+ print(response.analysis)
77
88
  ```
78
89
 
79
90
  While you can provide a `bearer_token` keyword argument,
@@ -96,10 +107,21 @@ client = AsyncHiddenLayer(
96
107
 
97
108
 
98
109
  async def main() -> None:
99
- sensor = await client.sensors.create(
100
- plaintext_name="REPLACE_ME",
110
+ response = await client.interactions.analyze(
111
+ metadata={
112
+ "model": "REPLACE_ME",
113
+ "requester_id": "REPLACE_ME",
114
+ },
115
+ input={
116
+ "messages": [
117
+ {
118
+ "role": "user",
119
+ "content": "REPLACE_ME",
120
+ }
121
+ ]
122
+ },
101
123
  )
102
- print(sensor.model_id)
124
+ print(response.analysis)
103
125
 
104
126
 
105
127
  asyncio.run(main())
@@ -130,10 +152,21 @@ async def main() -> None:
130
152
  async with AsyncHiddenLayer(
131
153
  http_client=DefaultAioHttpClient(),
132
154
  ) as client:
133
- sensor = await client.sensors.create(
134
- plaintext_name="REPLACE_ME",
155
+ response = await client.interactions.analyze(
156
+ metadata={
157
+ "model": "REPLACE_ME",
158
+ "requester_id": "REPLACE_ME",
159
+ },
160
+ input={
161
+ "messages": [
162
+ {
163
+ "role": "user",
164
+ "content": "REPLACE_ME",
165
+ }
166
+ ]
167
+ },
135
168
  )
136
- print(sensor.model_id)
169
+ print(response.analysis)
137
170
 
138
171
 
139
172
  asyncio.run(main())
@@ -157,10 +190,14 @@ from hiddenlayer import HiddenLayer
157
190
 
158
191
  client = HiddenLayer()
159
192
 
160
- page = client.models.cards.list(
161
- model_created={},
193
+ response = client.interactions.analyze(
194
+ metadata={
195
+ "model": "gpt-5",
196
+ "requester_id": "user-1234",
197
+ "provider": "openai",
198
+ },
162
199
  )
163
- print(page.results)
200
+ print(response.metadata)
164
201
  ```
165
202
 
166
203
  ## Handling errors
@@ -179,8 +216,19 @@ from hiddenlayer import HiddenLayer
179
216
  client = HiddenLayer()
180
217
 
181
218
  try:
182
- client.sensors.create(
183
- plaintext_name="REPLACE_ME",
219
+ client.interactions.analyze(
220
+ metadata={
221
+ "model": "REPLACE_ME",
222
+ "requester_id": "REPLACE_ME",
223
+ },
224
+ input={
225
+ "messages": [
226
+ {
227
+ "role": "user",
228
+ "content": "REPLACE_ME",
229
+ }
230
+ ]
231
+ },
184
232
  )
185
233
  except hiddenlayer.APIConnectionError as e:
186
234
  print("The server could not be reached")
@@ -224,8 +272,19 @@ client = HiddenLayer(
224
272
  )
225
273
 
226
274
  # Or, configure per-request:
227
- client.with_options(max_retries=5).sensors.create(
228
- plaintext_name="REPLACE_ME",
275
+ client.with_options(max_retries=5).interactions.analyze(
276
+ metadata={
277
+ "model": "REPLACE_ME",
278
+ "requester_id": "REPLACE_ME",
279
+ },
280
+ input={
281
+ "messages": [
282
+ {
283
+ "role": "user",
284
+ "content": "REPLACE_ME",
285
+ }
286
+ ]
287
+ },
229
288
  )
230
289
  ```
231
290
 
@@ -249,8 +308,19 @@ client = HiddenLayer(
249
308
  )
250
309
 
251
310
  # Override per-request:
252
- client.with_options(timeout=5.0).sensors.create(
253
- plaintext_name="REPLACE_ME",
311
+ client.with_options(timeout=5.0).interactions.analyze(
312
+ metadata={
313
+ "model": "REPLACE_ME",
314
+ "requester_id": "REPLACE_ME",
315
+ },
316
+ input={
317
+ "messages": [
318
+ {
319
+ "role": "user",
320
+ "content": "REPLACE_ME",
321
+ }
322
+ ]
323
+ },
254
324
  )
255
325
  ```
256
326
 
@@ -292,13 +362,22 @@ The "raw" Response object can be accessed by prefixing `.with_raw_response.` to
292
362
  from hiddenlayer import HiddenLayer
293
363
 
294
364
  client = HiddenLayer()
295
- response = client.sensors.with_raw_response.create(
296
- plaintext_name="REPLACE_ME",
365
+ response = client.interactions.with_raw_response.analyze(
366
+ metadata={
367
+ "model": "REPLACE_ME",
368
+ "requester_id": "REPLACE_ME",
369
+ },
370
+ input={
371
+ "messages": [{
372
+ "role": "user",
373
+ "content": "REPLACE_ME",
374
+ }]
375
+ },
297
376
  )
298
377
  print(response.headers.get('X-My-Header'))
299
378
 
300
- sensor = response.parse() # get the object that `sensors.create()` would have returned
301
- print(sensor.model_id)
379
+ interaction = response.parse() # get the object that `interactions.analyze()` would have returned
380
+ print(interaction.analysis)
302
381
  ```
303
382
 
304
383
  These methods return an [`APIResponse`](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/tree/main/src/hiddenlayer/_response.py) object.
@@ -312,8 +391,19 @@ The above interface eagerly reads the full response body when you make the reque
312
391
  To stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.
313
392
 
314
393
  ```python
315
- with client.sensors.with_streaming_response.create(
316
- plaintext_name="REPLACE_ME",
394
+ with client.interactions.with_streaming_response.analyze(
395
+ metadata={
396
+ "model": "REPLACE_ME",
397
+ "requester_id": "REPLACE_ME",
398
+ },
399
+ input={
400
+ "messages": [
401
+ {
402
+ "role": "user",
403
+ "content": "REPLACE_ME",
404
+ }
405
+ ]
406
+ },
317
407
  ) as response:
318
408
  print(response.headers.get("X-My-Header"))
319
409
 
@@ -32,10 +32,21 @@ client = HiddenLayer(
32
32
  environment="prod-eu",
33
33
  )
34
34
 
35
- sensor = client.sensors.create(
36
- plaintext_name="REPLACE_ME",
35
+ response = client.interactions.analyze(
36
+ metadata={
37
+ "model": "REPLACE_ME",
38
+ "requester_id": "REPLACE_ME",
39
+ },
40
+ input={
41
+ "messages": [
42
+ {
43
+ "role": "user",
44
+ "content": "REPLACE_ME",
45
+ }
46
+ ]
47
+ },
37
48
  )
38
- print(sensor.model_id)
49
+ print(response.analysis)
39
50
  ```
40
51
 
41
52
  While you can provide a `bearer_token` keyword argument,
@@ -58,10 +69,21 @@ client = AsyncHiddenLayer(
58
69
 
59
70
 
60
71
  async def main() -> None:
61
- sensor = await client.sensors.create(
62
- plaintext_name="REPLACE_ME",
72
+ response = await client.interactions.analyze(
73
+ metadata={
74
+ "model": "REPLACE_ME",
75
+ "requester_id": "REPLACE_ME",
76
+ },
77
+ input={
78
+ "messages": [
79
+ {
80
+ "role": "user",
81
+ "content": "REPLACE_ME",
82
+ }
83
+ ]
84
+ },
63
85
  )
64
- print(sensor.model_id)
86
+ print(response.analysis)
65
87
 
66
88
 
67
89
  asyncio.run(main())
@@ -92,10 +114,21 @@ async def main() -> None:
92
114
  async with AsyncHiddenLayer(
93
115
  http_client=DefaultAioHttpClient(),
94
116
  ) as client:
95
- sensor = await client.sensors.create(
96
- plaintext_name="REPLACE_ME",
117
+ response = await client.interactions.analyze(
118
+ metadata={
119
+ "model": "REPLACE_ME",
120
+ "requester_id": "REPLACE_ME",
121
+ },
122
+ input={
123
+ "messages": [
124
+ {
125
+ "role": "user",
126
+ "content": "REPLACE_ME",
127
+ }
128
+ ]
129
+ },
97
130
  )
98
- print(sensor.model_id)
131
+ print(response.analysis)
99
132
 
100
133
 
101
134
  asyncio.run(main())
@@ -119,10 +152,14 @@ from hiddenlayer import HiddenLayer
119
152
 
120
153
  client = HiddenLayer()
121
154
 
122
- page = client.models.cards.list(
123
- model_created={},
155
+ response = client.interactions.analyze(
156
+ metadata={
157
+ "model": "gpt-5",
158
+ "requester_id": "user-1234",
159
+ "provider": "openai",
160
+ },
124
161
  )
125
- print(page.results)
162
+ print(response.metadata)
126
163
  ```
127
164
 
128
165
  ## Handling errors
@@ -141,8 +178,19 @@ from hiddenlayer import HiddenLayer
141
178
  client = HiddenLayer()
142
179
 
143
180
  try:
144
- client.sensors.create(
145
- plaintext_name="REPLACE_ME",
181
+ client.interactions.analyze(
182
+ metadata={
183
+ "model": "REPLACE_ME",
184
+ "requester_id": "REPLACE_ME",
185
+ },
186
+ input={
187
+ "messages": [
188
+ {
189
+ "role": "user",
190
+ "content": "REPLACE_ME",
191
+ }
192
+ ]
193
+ },
146
194
  )
147
195
  except hiddenlayer.APIConnectionError as e:
148
196
  print("The server could not be reached")
@@ -186,8 +234,19 @@ client = HiddenLayer(
186
234
  )
187
235
 
188
236
  # Or, configure per-request:
189
- client.with_options(max_retries=5).sensors.create(
190
- plaintext_name="REPLACE_ME",
237
+ client.with_options(max_retries=5).interactions.analyze(
238
+ metadata={
239
+ "model": "REPLACE_ME",
240
+ "requester_id": "REPLACE_ME",
241
+ },
242
+ input={
243
+ "messages": [
244
+ {
245
+ "role": "user",
246
+ "content": "REPLACE_ME",
247
+ }
248
+ ]
249
+ },
191
250
  )
192
251
  ```
193
252
 
@@ -211,8 +270,19 @@ client = HiddenLayer(
211
270
  )
212
271
 
213
272
  # Override per-request:
214
- client.with_options(timeout=5.0).sensors.create(
215
- plaintext_name="REPLACE_ME",
273
+ client.with_options(timeout=5.0).interactions.analyze(
274
+ metadata={
275
+ "model": "REPLACE_ME",
276
+ "requester_id": "REPLACE_ME",
277
+ },
278
+ input={
279
+ "messages": [
280
+ {
281
+ "role": "user",
282
+ "content": "REPLACE_ME",
283
+ }
284
+ ]
285
+ },
216
286
  )
217
287
  ```
218
288
 
@@ -254,13 +324,22 @@ The "raw" Response object can be accessed by prefixing `.with_raw_response.` to
254
324
  from hiddenlayer import HiddenLayer
255
325
 
256
326
  client = HiddenLayer()
257
- response = client.sensors.with_raw_response.create(
258
- plaintext_name="REPLACE_ME",
327
+ response = client.interactions.with_raw_response.analyze(
328
+ metadata={
329
+ "model": "REPLACE_ME",
330
+ "requester_id": "REPLACE_ME",
331
+ },
332
+ input={
333
+ "messages": [{
334
+ "role": "user",
335
+ "content": "REPLACE_ME",
336
+ }]
337
+ },
259
338
  )
260
339
  print(response.headers.get('X-My-Header'))
261
340
 
262
- sensor = response.parse() # get the object that `sensors.create()` would have returned
263
- print(sensor.model_id)
341
+ interaction = response.parse() # get the object that `interactions.analyze()` would have returned
342
+ print(interaction.analysis)
264
343
  ```
265
344
 
266
345
  These methods return an [`APIResponse`](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/tree/main/src/hiddenlayer/_response.py) object.
@@ -274,8 +353,19 @@ The above interface eagerly reads the full response body when you make the reque
274
353
  To stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.
275
354
 
276
355
  ```python
277
- with client.sensors.with_streaming_response.create(
278
- plaintext_name="REPLACE_ME",
356
+ with client.interactions.with_streaming_response.analyze(
357
+ metadata={
358
+ "model": "REPLACE_ME",
359
+ "requester_id": "REPLACE_ME",
360
+ },
361
+ input={
362
+ "messages": [
363
+ {
364
+ "role": "user",
365
+ "content": "REPLACE_ME",
366
+ }
367
+ ]
368
+ },
279
369
  ) as response:
280
370
  print(response.headers.get("X-My-Header"))
281
371
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hiddenlayer-sdk"
3
- version = "3.0.0"
3
+ version = "3.0.1"
4
4
  description = "The official Python library for the hiddenlayer API"
5
5
  dynamic = ["readme"]
6
6
  license = {text = "Apache-2.0"}
@@ -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.0" # x-release-please-version
4
+ __version__ = "3.0.1" # x-release-please-version
@@ -742,20 +742,30 @@ class TestHiddenLayer:
742
742
  @mock.patch("hiddenlayer._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
743
743
  @pytest.mark.respx(base_url=base_url)
744
744
  def test_retrying_timeout_errors_doesnt_leak(self, respx_mock: MockRouter, client: HiddenLayer) -> None:
745
- respx_mock.post("/api/v2/sensors/create").mock(side_effect=httpx.TimeoutException("Test timeout error"))
745
+ respx_mock.post("/detection/v1/interactions").mock(side_effect=httpx.TimeoutException("Test timeout error"))
746
746
 
747
747
  with pytest.raises(APITimeoutError):
748
- client.sensors.with_streaming_response.create(plaintext_name="plaintext_name").__enter__()
748
+ client.interactions.with_streaming_response.analyze(
749
+ metadata={
750
+ "model": "gpt-5",
751
+ "requester_id": "user-1234",
752
+ }
753
+ ).__enter__()
749
754
 
750
755
  assert _get_open_connections(self.client) == 0
751
756
 
752
757
  @mock.patch("hiddenlayer._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
753
758
  @pytest.mark.respx(base_url=base_url)
754
759
  def test_retrying_status_errors_doesnt_leak(self, respx_mock: MockRouter, client: HiddenLayer) -> None:
755
- respx_mock.post("/api/v2/sensors/create").mock(return_value=httpx.Response(500))
760
+ respx_mock.post("/detection/v1/interactions").mock(return_value=httpx.Response(500))
756
761
 
757
762
  with pytest.raises(APIStatusError):
758
- client.sensors.with_streaming_response.create(plaintext_name="plaintext_name").__enter__()
763
+ client.interactions.with_streaming_response.analyze(
764
+ metadata={
765
+ "model": "gpt-5",
766
+ "requester_id": "user-1234",
767
+ }
768
+ ).__enter__()
759
769
  assert _get_open_connections(self.client) == 0
760
770
 
761
771
  @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
@@ -782,9 +792,14 @@ class TestHiddenLayer:
782
792
  return httpx.Response(500)
783
793
  return httpx.Response(200)
784
794
 
785
- respx_mock.post("/api/v2/sensors/create").mock(side_effect=retry_handler)
795
+ respx_mock.post("/detection/v1/interactions").mock(side_effect=retry_handler)
786
796
 
787
- response = client.sensors.with_raw_response.create(plaintext_name="plaintext_name")
797
+ response = client.interactions.with_raw_response.analyze(
798
+ metadata={
799
+ "model": "gpt-5",
800
+ "requester_id": "user-1234",
801
+ }
802
+ )
788
803
 
789
804
  assert response.retries_taken == failures_before_success
790
805
  assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
@@ -806,10 +821,14 @@ class TestHiddenLayer:
806
821
  return httpx.Response(500)
807
822
  return httpx.Response(200)
808
823
 
809
- respx_mock.post("/api/v2/sensors/create").mock(side_effect=retry_handler)
824
+ respx_mock.post("/detection/v1/interactions").mock(side_effect=retry_handler)
810
825
 
811
- response = client.sensors.with_raw_response.create(
812
- plaintext_name="plaintext_name", extra_headers={"x-stainless-retry-count": Omit()}
826
+ response = client.interactions.with_raw_response.analyze(
827
+ metadata={
828
+ "model": "gpt-5",
829
+ "requester_id": "user-1234",
830
+ },
831
+ extra_headers={"x-stainless-retry-count": Omit()},
813
832
  )
814
833
 
815
834
  assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
@@ -831,10 +850,14 @@ class TestHiddenLayer:
831
850
  return httpx.Response(500)
832
851
  return httpx.Response(200)
833
852
 
834
- respx_mock.post("/api/v2/sensors/create").mock(side_effect=retry_handler)
853
+ respx_mock.post("/detection/v1/interactions").mock(side_effect=retry_handler)
835
854
 
836
- response = client.sensors.with_raw_response.create(
837
- plaintext_name="plaintext_name", extra_headers={"x-stainless-retry-count": "42"}
855
+ response = client.interactions.with_raw_response.analyze(
856
+ metadata={
857
+ "model": "gpt-5",
858
+ "requester_id": "user-1234",
859
+ },
860
+ extra_headers={"x-stainless-retry-count": "42"},
838
861
  )
839
862
 
840
863
  assert response.http_request.headers.get("x-stainless-retry-count") == "42"
@@ -1581,10 +1604,15 @@ class TestAsyncHiddenLayer:
1581
1604
  async def test_retrying_timeout_errors_doesnt_leak(
1582
1605
  self, respx_mock: MockRouter, async_client: AsyncHiddenLayer
1583
1606
  ) -> None:
1584
- respx_mock.post("/api/v2/sensors/create").mock(side_effect=httpx.TimeoutException("Test timeout error"))
1607
+ respx_mock.post("/detection/v1/interactions").mock(side_effect=httpx.TimeoutException("Test timeout error"))
1585
1608
 
1586
1609
  with pytest.raises(APITimeoutError):
1587
- await async_client.sensors.with_streaming_response.create(plaintext_name="plaintext_name").__aenter__()
1610
+ await async_client.interactions.with_streaming_response.analyze(
1611
+ metadata={
1612
+ "model": "gpt-5",
1613
+ "requester_id": "user-1234",
1614
+ }
1615
+ ).__aenter__()
1588
1616
 
1589
1617
  assert _get_open_connections(self.client) == 0
1590
1618
 
@@ -1593,10 +1621,15 @@ class TestAsyncHiddenLayer:
1593
1621
  async def test_retrying_status_errors_doesnt_leak(
1594
1622
  self, respx_mock: MockRouter, async_client: AsyncHiddenLayer
1595
1623
  ) -> None:
1596
- respx_mock.post("/api/v2/sensors/create").mock(return_value=httpx.Response(500))
1624
+ respx_mock.post("/detection/v1/interactions").mock(return_value=httpx.Response(500))
1597
1625
 
1598
1626
  with pytest.raises(APIStatusError):
1599
- await async_client.sensors.with_streaming_response.create(plaintext_name="plaintext_name").__aenter__()
1627
+ await async_client.interactions.with_streaming_response.analyze(
1628
+ metadata={
1629
+ "model": "gpt-5",
1630
+ "requester_id": "user-1234",
1631
+ }
1632
+ ).__aenter__()
1600
1633
  assert _get_open_connections(self.client) == 0
1601
1634
 
1602
1635
  @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
@@ -1624,9 +1657,14 @@ class TestAsyncHiddenLayer:
1624
1657
  return httpx.Response(500)
1625
1658
  return httpx.Response(200)
1626
1659
 
1627
- respx_mock.post("/api/v2/sensors/create").mock(side_effect=retry_handler)
1660
+ respx_mock.post("/detection/v1/interactions").mock(side_effect=retry_handler)
1628
1661
 
1629
- response = await client.sensors.with_raw_response.create(plaintext_name="plaintext_name")
1662
+ response = await client.interactions.with_raw_response.analyze(
1663
+ metadata={
1664
+ "model": "gpt-5",
1665
+ "requester_id": "user-1234",
1666
+ }
1667
+ )
1630
1668
 
1631
1669
  assert response.retries_taken == failures_before_success
1632
1670
  assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
@@ -1649,10 +1687,14 @@ class TestAsyncHiddenLayer:
1649
1687
  return httpx.Response(500)
1650
1688
  return httpx.Response(200)
1651
1689
 
1652
- respx_mock.post("/api/v2/sensors/create").mock(side_effect=retry_handler)
1690
+ respx_mock.post("/detection/v1/interactions").mock(side_effect=retry_handler)
1653
1691
 
1654
- response = await client.sensors.with_raw_response.create(
1655
- plaintext_name="plaintext_name", extra_headers={"x-stainless-retry-count": Omit()}
1692
+ response = await client.interactions.with_raw_response.analyze(
1693
+ metadata={
1694
+ "model": "gpt-5",
1695
+ "requester_id": "user-1234",
1696
+ },
1697
+ extra_headers={"x-stainless-retry-count": Omit()},
1656
1698
  )
1657
1699
 
1658
1700
  assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
@@ -1675,10 +1717,14 @@ class TestAsyncHiddenLayer:
1675
1717
  return httpx.Response(500)
1676
1718
  return httpx.Response(200)
1677
1719
 
1678
- respx_mock.post("/api/v2/sensors/create").mock(side_effect=retry_handler)
1720
+ respx_mock.post("/detection/v1/interactions").mock(side_effect=retry_handler)
1679
1721
 
1680
- response = await client.sensors.with_raw_response.create(
1681
- plaintext_name="plaintext_name", extra_headers={"x-stainless-retry-count": "42"}
1722
+ response = await client.interactions.with_raw_response.analyze(
1723
+ metadata={
1724
+ "model": "gpt-5",
1725
+ "requester_id": "user-1234",
1726
+ },
1727
+ extra_headers={"x-stainless-retry-count": "42"},
1682
1728
  )
1683
1729
 
1684
1730
  assert response.http_request.headers.get("x-stainless-retry-count") == "42"
@@ -1,3 +0,0 @@
1
- {
2
- ".": "3.0.0"
3
- }
File without changes
File without changes