hiddenlayer-sdk 3.0.0__tar.gz → 3.1.0__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 (135) hide show
  1. hiddenlayer_sdk-3.1.0/.release-please-manifest.json +3 -0
  2. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/CHANGELOG.md +40 -0
  3. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/PKG-INFO +117 -27
  4. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/README.md +114 -24
  5. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/api.md +2 -9
  6. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/pyproject.toml +7 -3
  7. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/requirements-dev.lock +1 -1
  8. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/requirements.lock +1 -1
  9. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_version.py +1 -1
  10. hiddenlayer_sdk-3.1.0/src/hiddenlayer/lib/__init__.py +12 -0
  11. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/lib/model_scan.py +7 -18
  12. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/models/cards.py +32 -2
  13. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/jobs.py +10 -6
  14. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/upload/upload.py +4 -2
  15. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/interaction_analyze_response.py +37 -3
  16. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/models/card_list_params.py +5 -1
  17. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/models/card_list_response.py +6 -0
  18. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/job_list_params.py +2 -2
  19. hiddenlayer_sdk-3.1.0/src/hiddenlayer/types/scans/job_list_response.py +153 -0
  20. hiddenlayer_sdk-3.1.0/src/hiddenlayer/types/scans/job_request_params.py +85 -0
  21. hiddenlayer_sdk-3.1.0/src/hiddenlayer/types/scans/scan_job.py +86 -0
  22. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/scan_report.py +41 -85
  23. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload/file_complete_response.py +1 -3
  24. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload_complete_all_response.py +1 -3
  25. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload_start_params.py +1 -1
  26. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload_start_response.py +1 -3
  27. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/models/test_cards.py +2 -2
  28. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/test_jobs.py +28 -18
  29. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/test_results.py +2 -2
  30. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/test_upload.py +6 -6
  31. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/upload/test_file.py +4 -4
  32. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/test_interactions.py +2 -2
  33. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/test_models.py +4 -4
  34. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/test_prompt_analyzer.py +2 -2
  35. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/test_sensors.py +10 -10
  36. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_client.py +70 -24
  37. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_model_scan.py +20 -48
  38. hiddenlayer_sdk-3.0.0/.release-please-manifest.json +0 -3
  39. hiddenlayer_sdk-3.0.0/src/hiddenlayer/lib/__init__.py +0 -6
  40. hiddenlayer_sdk-3.0.0/src/hiddenlayer/types/scans/job_list_response.py +0 -22
  41. hiddenlayer_sdk-3.0.0/src/hiddenlayer/types/scans/job_request_params.py +0 -49
  42. hiddenlayer_sdk-3.0.0/src/hiddenlayer/types/scans/scan_job.py +0 -46
  43. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/.gitignore +0 -0
  44. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/CODE_OF_CONDUCT.md +0 -0
  45. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/CONTRIBUTING.md +0 -0
  46. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/LICENSE +0 -0
  47. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/SECURITY.md +0 -0
  48. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/bin/check-release-environment +0 -0
  49. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/bin/publish-jfrog +0 -0
  50. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/bin/publish-pypi +0 -0
  51. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/examples/.keep +0 -0
  52. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/examples/demo.py +0 -0
  53. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/noxfile.py +0 -0
  54. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/release-please-config.json +0 -0
  55. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/__init__.py +0 -0
  56. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_base_client.py +0 -0
  57. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_client.py +0 -0
  58. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_compat.py +0 -0
  59. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_constants.py +0 -0
  60. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_exceptions.py +0 -0
  61. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_files.py +0 -0
  62. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_models.py +0 -0
  63. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_oauth2.py +0 -0
  64. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_qs.py +0 -0
  65. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_resource.py +0 -0
  66. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_response.py +0 -0
  67. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_streaming.py +0 -0
  68. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_types.py +0 -0
  69. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/__init__.py +0 -0
  70. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_compat.py +0 -0
  71. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_datetime_parse.py +0 -0
  72. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_logs.py +0 -0
  73. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_proxy.py +0 -0
  74. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_reflection.py +0 -0
  75. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_resources_proxy.py +0 -0
  76. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_streams.py +0 -0
  77. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_sync.py +0 -0
  78. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_transform.py +0 -0
  79. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_typing.py +0 -0
  80. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_utils.py +0 -0
  81. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/lib/.keep +0 -0
  82. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/lib/community_scan.py +0 -0
  83. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/lib/scan_utils.py +0 -0
  84. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/pagination.py +0 -0
  85. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/py.typed +0 -0
  86. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/__init__.py +0 -0
  87. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/interactions.py +0 -0
  88. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/models/__init__.py +0 -0
  89. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/models/models.py +0 -0
  90. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/prompt_analyzer.py +0 -0
  91. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/__init__.py +0 -0
  92. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/results.py +0 -0
  93. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/scans.py +0 -0
  94. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/upload/__init__.py +0 -0
  95. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/upload/file.py +0 -0
  96. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/sensors.py +0 -0
  97. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/__init__.py +0 -0
  98. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/interaction_analyze_params.py +0 -0
  99. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/model_retrieve_response.py +0 -0
  100. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/models/__init__.py +0 -0
  101. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/prompt_analyzer_create_params.py +0 -0
  102. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/prompt_analyzer_create_response.py +0 -0
  103. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/__init__.py +0 -0
  104. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/job_retrieve_params.py +0 -0
  105. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/result_sarif_response.py +0 -0
  106. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload/__init__.py +0 -0
  107. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload/file_add_response.py +0 -0
  108. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_create_params.py +0 -0
  109. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_create_response.py +0 -0
  110. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_query_params.py +0 -0
  111. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_query_response.py +0 -0
  112. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_retrieve_response.py +0 -0
  113. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_update_params.py +0 -0
  114. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_update_response.py +0 -0
  115. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/__init__.py +0 -0
  116. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/__init__.py +0 -0
  117. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/models/__init__.py +0 -0
  118. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/__init__.py +0 -0
  119. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/upload/__init__.py +0 -0
  120. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/conftest.py +0 -0
  121. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/sample_file.txt +0 -0
  122. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_community_scan.py +0 -0
  123. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_deepcopy.py +0 -0
  124. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_extract_files.py +0 -0
  125. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_files.py +0 -0
  126. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_models.py +0 -0
  127. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_qs.py +0 -0
  128. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_required_args.py +0 -0
  129. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_response.py +0 -0
  130. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_streaming.py +0 -0
  131. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_transform.py +0 -0
  132. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_utils/test_datetime_parse.py +0 -0
  133. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_utils/test_proxy.py +0 -0
  134. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/test_utils/test_typing.py +0 -0
  135. {hiddenlayer_sdk-3.0.0 → hiddenlayer_sdk-3.1.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "3.1.0"
3
+ }
@@ -1,5 +1,45 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.1.0 (2025-10-22)
4
+
5
+ Full Changelog: [v3.0.1...v3.1.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.0.1...v3.1.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([f9b04a6](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/f9b04a6f32744afdfafa6bac6dc8e6cc514ad735))
10
+ * **api:** api update ([cac77ff](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/cac77ffde9e844dbaa0089e33d365fb6f01ad060))
11
+ * **api:** api update ([a5f4aa4](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/a5f4aa47ae06afd63a0a5f476023492e23b01d87))
12
+ * **api:** api update ([f8ea9b3](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/f8ea9b34e18900b9955ce810e396a9050a5a3683))
13
+ * **api:** api update ([a09c23c](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/a09c23c700f049b0b20a50bd7b09737981eebe4d))
14
+ * **api:** api update ([144ea2b](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/144ea2b7fb99d892088bc72a725fd8a0fecb0382))
15
+ * **api:** api update ([495bc26](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/495bc26f2f5aee49e6ac239011a1e9666f9c8e58))
16
+ * **api:** api update ([82bcadd](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/82bcaddd193d4ad155eb2651cb190a4a200800e1))
17
+ * **api:** api update ([da69d10](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/da69d104dc5f408a04d46c0266973fe404665cf8))
18
+ * **api:** api update ([75a179e](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/75a179e93a759b83194806b4c561ad4035ae2714))
19
+ * **api:** api update ([56ec98d](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/56ec98d2485b1ebb16a832d4eac125d05a7a1993))
20
+ * **api:** manual updates ([7e16b74](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/7e16b749a22db9414de5faf17067f15cf37ff78a))
21
+ * **api:** manual updates ([4a1d8af](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/4a1d8af69e44413809219221e5a3ff3b102a7637))
22
+ * **api:** restore ScanReport ([5bba48d](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/5bba48def63831679f3f33475b9ed423c9726bbf))
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * **compat:** compat with `pydantic<2.8.0` when using additional fields ([a055406](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/a055406b415d42d8b99284a200eaf0af694e14c3))
28
+
29
+
30
+ ### Chores
31
+
32
+ * bump `httpx-aiohttp` version to 0.1.9 ([01ab00d](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/01ab00ddaf35da51b7c4a546c37f7d092357ffe4))
33
+ * **internal:** detect missing future annotations with ruff ([e087ecc](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/e087ecc97867d858d138af0ebb7dfd7e919c14bb))
34
+
35
+ ## 3.0.1 (2025-09-23)
36
+
37
+ Full Changelog: [v3.0.0...v3.0.1](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.0.0...v3.0.1)
38
+
39
+ ### Features
40
+
41
+ * **api:** manual updates ([2be2f2c](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/2be2f2c124d8ac9b9d22c675c165be496c1793ba))
42
+
3
43
  ## 3.0.0 (2025-09-23)
4
44
 
5
45
  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,10 +1,10 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: hiddenlayer-sdk
3
- Version: 3.0.0
3
+ Version: 3.1.0
4
4
  Summary: The official Python library for the hiddenlayer API
5
5
  Project-URL: Homepage, https://github.com/hiddenlayerai/hiddenlayer-sdk-python
6
6
  Project-URL: Repository, https://github.com/hiddenlayerai/hiddenlayer-sdk-python
7
- Author-email: HiddenLayer <dev-feedback@hiddenlayer-sdk.com>
7
+ Author-email: HiddenLayer <sdks@hiddenlayer.com>
8
8
  License: Apache-2.0
9
9
  Classifier: Intended Audience :: Developers
10
10
  Classifier: License :: OSI Approved :: Apache Software License
@@ -33,7 +33,7 @@ Requires-Dist: types-requests>=2.32.0.20241016
33
33
  Requires-Dist: typing-extensions<5,>=4.10
34
34
  Provides-Extra: aiohttp
35
35
  Requires-Dist: aiohttp; extra == 'aiohttp'
36
- Requires-Dist: httpx-aiohttp>=0.1.8; extra == 'aiohttp'
36
+ Requires-Dist: httpx-aiohttp>=0.1.9; extra == 'aiohttp'
37
37
  Description-Content-Type: text/markdown
38
38
 
39
39
  # HiddenLayer Python API library
@@ -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
 
@@ -80,7 +80,7 @@ Methods:
80
80
  Types:
81
81
 
82
82
  ```python
83
- from hiddenlayer.types.scans import FileScanReport, ScanReport, ResultSarifResponse
83
+ from hiddenlayer.types.scans import ScanReport, ResultSarifResponse
84
84
  ```
85
85
 
86
86
  Methods:
@@ -92,14 +92,7 @@ Methods:
92
92
  Types:
93
93
 
94
94
  ```python
95
- from hiddenlayer.types.scans import (
96
- ScanJob,
97
- ScanReport,
98
- JobListResponse,
99
- JobListParams,
100
- JobRequestParams,
101
- JobRetrieveParams,
102
- )
95
+ from hiddenlayer.types.scans import JobListResponse, ScanJob, ScanReport
103
96
  ```
104
97
 
105
98
  Methods:
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "hiddenlayer-sdk"
3
- version = "3.0.0"
3
+ version = "3.1.0"
4
4
  description = "The official Python library for the hiddenlayer API"
5
5
  dynamic = ["readme"]
6
6
  license = {text = "Apache-2.0"}
7
7
  authors = [
8
- { name = "HiddenLayer", email = "dev-feedback@hiddenlayer-sdk.com" },
8
+ { name = "HiddenLayer", email = "sdks@hiddenlayer.com" },
9
9
  ]
10
10
  dependencies = [
11
11
  "httpx>=0.23.0, <1",
@@ -42,7 +42,7 @@ Homepage = "https://github.com/hiddenlayerai/hiddenlayer-sdk-python"
42
42
  Repository = "https://github.com/hiddenlayerai/hiddenlayer-sdk-python"
43
43
 
44
44
  [project.optional-dependencies]
45
- aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"]
45
+ aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
46
46
 
47
47
  [tool.rye]
48
48
  managed = true
@@ -229,6 +229,8 @@ select = [
229
229
  "B",
230
230
  # remove unused imports
231
231
  "F401",
232
+ # check for missing future annotations
233
+ "FA102",
232
234
  # bare except statements
233
235
  "E722",
234
236
  # unused arguments
@@ -251,6 +253,8 @@ unfixable = [
251
253
  "T203",
252
254
  ]
253
255
 
256
+ extend-safe-fixes = ["FA102"]
257
+
254
258
  [tool.ruff.lint.flake8-tidy-imports.banned-api]
255
259
  "functools.lru_cache".msg = "This function does not retain type information for the wrapped function's arguments; The `lru_cache` function from `_utils` should be used instead"
256
260
 
@@ -59,7 +59,7 @@ httpx==0.28.1
59
59
  # via hiddenlayer-sdk
60
60
  # via httpx-aiohttp
61
61
  # via respx
62
- httpx-aiohttp==0.1.8
62
+ httpx-aiohttp==0.1.9
63
63
  # via hiddenlayer-sdk
64
64
  idna==3.4
65
65
  # via anyio
@@ -46,7 +46,7 @@ httpcore==1.0.9
46
46
  httpx==0.28.1
47
47
  # via hiddenlayer-sdk
48
48
  # via httpx-aiohttp
49
- httpx-aiohttp==0.1.8
49
+ httpx-aiohttp==0.1.9
50
50
  # via hiddenlayer-sdk
51
51
  idna==3.4
52
52
  # via anyio
@@ -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.1.0" # x-release-please-version
@@ -0,0 +1,12 @@
1
+ # Custom extensions for HiddenLayer SDK
2
+
3
+ from .model_scan import ModelScanner, AsyncModelScanner
4
+ from .community_scan import CommunityScanner, CommunityScanSource, AsyncCommunityScanner
5
+
6
+ __all__ = [
7
+ "CommunityScanner",
8
+ "AsyncCommunityScanner",
9
+ "ModelScanner",
10
+ "AsyncModelScanner",
11
+ "CommunityScanSource",
12
+ ]
@@ -12,8 +12,6 @@ from fnmatch import fnmatch
12
12
  from pathlib import Path
13
13
  from typing_extensions import TYPE_CHECKING
14
14
 
15
- import httpx
16
-
17
15
  from .scan_utils import get_scan_results, wait_for_scan_results, get_scan_results_async, wait_for_scan_results_async
18
16
 
19
17
  logger = logging.getLogger(__name__)
@@ -135,8 +133,6 @@ class ModelScanner:
135
133
  )
136
134
 
137
135
  scan_id = upload_response.scan_id
138
- if scan_id is None:
139
- raise ValueError("scan_id must have a value")
140
136
 
141
137
  # Upload the file
142
138
  self._scan_file(scan_id=scan_id, file_path=file_path)
@@ -189,8 +185,6 @@ class ModelScanner:
189
185
  )
190
186
 
191
187
  scan_id = upload_response.scan_id
192
- if scan_id is None:
193
- raise ValueError("scan_id must have a value")
194
188
 
195
189
  # Prepare file patterns
196
190
  ignore_file_patterns = EXCLUDE_FILE_TYPES + ignore_file_patterns if ignore_file_patterns else EXCLUDE_FILE_TYPES
@@ -445,7 +439,7 @@ class ModelScanner:
445
439
  if part.upload_url is None:
446
440
  raise Exception("part.upload_url must not be None")
447
441
 
448
- response = httpx.put(
442
+ response = self._client._client.put(
449
443
  part.upload_url,
450
444
  content=part_data,
451
445
  headers={"Content-Type": "application/octet-stream"},
@@ -491,8 +485,6 @@ class AsyncModelScanner:
491
485
  )
492
486
 
493
487
  scan_id = upload_response.scan_id
494
- if scan_id is None:
495
- raise ValueError("scan_id must have a value")
496
488
 
497
489
  # Upload the file
498
490
  await self._scan_file(scan_id=scan_id, file_path=file_path)
@@ -536,8 +528,6 @@ class AsyncModelScanner:
536
528
  )
537
529
 
538
530
  scan_id = upload_response.scan_id
539
- if scan_id is None:
540
- raise ValueError("scan_id must have a value")
541
531
 
542
532
  # Prepare file patterns
543
533
  ignore_file_patterns = EXCLUDE_FILE_TYPES + ignore_file_patterns if ignore_file_patterns else EXCLUDE_FILE_TYPES
@@ -740,13 +730,12 @@ class AsyncModelScanner:
740
730
  if part.upload_url is None:
741
731
  raise Exception("part.upload_url must not be None")
742
732
 
743
- async with httpx.AsyncClient() as client:
744
- response = await client.put(
745
- part.upload_url,
746
- content=part_data,
747
- headers={"Content-Type": "application/octet-stream"},
748
- )
749
- response.raise_for_status()
733
+ response = await self._client._client.put(
734
+ part.upload_url,
735
+ content=part_data,
736
+ headers={"Content-Type": "application/octet-stream"},
737
+ )
738
+ response.raise_for_status()
750
739
 
751
740
  # Complete the file upload
752
741
  await self._client.scans.upload.file.complete(file_id=upload.upload_id, scan_id=scan_id)