hiddenlayer-sdk 3.0.1__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.1 → hiddenlayer_sdk-3.1.0}/CHANGELOG.md +32 -0
  3. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/PKG-INFO +3 -3
  4. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/api.md +2 -9
  5. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/pyproject.toml +7 -3
  6. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/requirements-dev.lock +1 -1
  7. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/requirements.lock +1 -1
  8. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_version.py +1 -1
  9. hiddenlayer_sdk-3.1.0/src/hiddenlayer/lib/__init__.py +12 -0
  10. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/lib/model_scan.py +7 -18
  11. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/models/cards.py +32 -2
  12. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/jobs.py +10 -6
  13. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/upload/upload.py +4 -2
  14. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/interaction_analyze_response.py +37 -3
  15. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/models/card_list_params.py +5 -1
  16. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/models/card_list_response.py +6 -0
  17. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/job_list_params.py +2 -2
  18. hiddenlayer_sdk-3.1.0/src/hiddenlayer/types/scans/job_list_response.py +153 -0
  19. hiddenlayer_sdk-3.1.0/src/hiddenlayer/types/scans/job_request_params.py +85 -0
  20. hiddenlayer_sdk-3.1.0/src/hiddenlayer/types/scans/scan_job.py +86 -0
  21. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/scan_report.py +41 -85
  22. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload/file_complete_response.py +1 -3
  23. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload_complete_all_response.py +1 -3
  24. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload_start_params.py +1 -1
  25. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload_start_response.py +1 -3
  26. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/models/test_cards.py +2 -2
  27. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/test_jobs.py +28 -18
  28. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/test_results.py +2 -2
  29. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/test_upload.py +6 -6
  30. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/upload/test_file.py +4 -4
  31. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/test_interactions.py +2 -2
  32. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/test_models.py +4 -4
  33. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/test_prompt_analyzer.py +2 -2
  34. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/test_sensors.py +10 -10
  35. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_model_scan.py +20 -48
  36. hiddenlayer_sdk-3.0.1/.release-please-manifest.json +0 -3
  37. hiddenlayer_sdk-3.0.1/src/hiddenlayer/lib/__init__.py +0 -6
  38. hiddenlayer_sdk-3.0.1/src/hiddenlayer/types/scans/job_list_response.py +0 -22
  39. hiddenlayer_sdk-3.0.1/src/hiddenlayer/types/scans/job_request_params.py +0 -49
  40. hiddenlayer_sdk-3.0.1/src/hiddenlayer/types/scans/scan_job.py +0 -46
  41. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/.gitignore +0 -0
  42. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/CODE_OF_CONDUCT.md +0 -0
  43. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/CONTRIBUTING.md +0 -0
  44. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/LICENSE +0 -0
  45. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/README.md +0 -0
  46. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/SECURITY.md +0 -0
  47. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/bin/check-release-environment +0 -0
  48. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/bin/publish-jfrog +0 -0
  49. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/bin/publish-pypi +0 -0
  50. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/examples/.keep +0 -0
  51. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/examples/demo.py +0 -0
  52. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/noxfile.py +0 -0
  53. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/release-please-config.json +0 -0
  54. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/__init__.py +0 -0
  55. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_base_client.py +0 -0
  56. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_client.py +0 -0
  57. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_compat.py +0 -0
  58. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_constants.py +0 -0
  59. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_exceptions.py +0 -0
  60. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_files.py +0 -0
  61. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_models.py +0 -0
  62. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_oauth2.py +0 -0
  63. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_qs.py +0 -0
  64. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_resource.py +0 -0
  65. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_response.py +0 -0
  66. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_streaming.py +0 -0
  67. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_types.py +0 -0
  68. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/__init__.py +0 -0
  69. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_compat.py +0 -0
  70. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_datetime_parse.py +0 -0
  71. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_logs.py +0 -0
  72. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_proxy.py +0 -0
  73. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_reflection.py +0 -0
  74. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_resources_proxy.py +0 -0
  75. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_streams.py +0 -0
  76. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_sync.py +0 -0
  77. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_transform.py +0 -0
  78. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_typing.py +0 -0
  79. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/_utils/_utils.py +0 -0
  80. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/lib/.keep +0 -0
  81. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/lib/community_scan.py +0 -0
  82. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/lib/scan_utils.py +0 -0
  83. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/pagination.py +0 -0
  84. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/py.typed +0 -0
  85. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/__init__.py +0 -0
  86. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/interactions.py +0 -0
  87. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/models/__init__.py +0 -0
  88. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/models/models.py +0 -0
  89. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/prompt_analyzer.py +0 -0
  90. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/__init__.py +0 -0
  91. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/results.py +0 -0
  92. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/scans.py +0 -0
  93. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/upload/__init__.py +0 -0
  94. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/scans/upload/file.py +0 -0
  95. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/resources/sensors.py +0 -0
  96. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/__init__.py +0 -0
  97. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/interaction_analyze_params.py +0 -0
  98. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/model_retrieve_response.py +0 -0
  99. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/models/__init__.py +0 -0
  100. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/prompt_analyzer_create_params.py +0 -0
  101. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/prompt_analyzer_create_response.py +0 -0
  102. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/__init__.py +0 -0
  103. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/job_retrieve_params.py +0 -0
  104. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/result_sarif_response.py +0 -0
  105. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload/__init__.py +0 -0
  106. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/scans/upload/file_add_response.py +0 -0
  107. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_create_params.py +0 -0
  108. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_create_response.py +0 -0
  109. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_query_params.py +0 -0
  110. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_query_response.py +0 -0
  111. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_retrieve_response.py +0 -0
  112. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_update_params.py +0 -0
  113. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/src/hiddenlayer/types/sensor_update_response.py +0 -0
  114. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/__init__.py +0 -0
  115. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/__init__.py +0 -0
  116. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/models/__init__.py +0 -0
  117. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/__init__.py +0 -0
  118. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/api_resources/scans/upload/__init__.py +0 -0
  119. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/conftest.py +0 -0
  120. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/sample_file.txt +0 -0
  121. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_client.py +0 -0
  122. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_community_scan.py +0 -0
  123. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_deepcopy.py +0 -0
  124. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_extract_files.py +0 -0
  125. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_files.py +0 -0
  126. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_models.py +0 -0
  127. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_qs.py +0 -0
  128. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_required_args.py +0 -0
  129. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_response.py +0 -0
  130. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_streaming.py +0 -0
  131. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_transform.py +0 -0
  132. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_utils/test_datetime_parse.py +0 -0
  133. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_utils/test_proxy.py +0 -0
  134. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/test_utils/test_typing.py +0 -0
  135. {hiddenlayer_sdk-3.0.1 → hiddenlayer_sdk-3.1.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "3.1.0"
3
+ }
@@ -1,5 +1,37 @@
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
+
3
35
  ## 3.0.1 (2025-09-23)
4
36
 
5
37
  Full Changelog: [v3.0.0...v3.0.1](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.0.0...v3.0.1)
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: hiddenlayer-sdk
3
- Version: 3.0.1
3
+ Version: 3.1.0
4
4
  Summary: The official Python library for the hiddenlayer API
5
5
  Project-URL: Homepage, https://github.com/hiddenlayerai/hiddenlayer-sdk-python
6
6
  Project-URL: Repository, https://github.com/hiddenlayerai/hiddenlayer-sdk-python
7
- Author-email: HiddenLayer <dev-feedback@hiddenlayer-sdk.com>
7
+ Author-email: HiddenLayer <sdks@hiddenlayer.com>
8
8
  License: Apache-2.0
9
9
  Classifier: Intended Audience :: Developers
10
10
  Classifier: License :: OSI Approved :: Apache Software License
@@ -33,7 +33,7 @@ Requires-Dist: types-requests>=2.32.0.20241016
33
33
  Requires-Dist: typing-extensions<5,>=4.10
34
34
  Provides-Extra: aiohttp
35
35
  Requires-Dist: aiohttp; extra == 'aiohttp'
36
- Requires-Dist: httpx-aiohttp>=0.1.8; extra == 'aiohttp'
36
+ Requires-Dist: httpx-aiohttp>=0.1.9; extra == 'aiohttp'
37
37
  Description-Content-Type: text/markdown
38
38
 
39
39
  # HiddenLayer Python API library
@@ -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.1"
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.1" # 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)
@@ -53,7 +53,22 @@ class CardsResource(SyncAPIResource):
53
53
  limit: int | Omit = omit,
54
54
  model_created: card_list_params.ModelCreated | Omit = omit,
55
55
  model_name: card_list_params.ModelName | Omit = omit,
56
- modscan_severity: List[Literal["SAFE", "UNSAFE", "SUSPICIOUS", "UNKNOWN", "ERROR"]] | Omit = omit,
56
+ modscan_severity: List[
57
+ Literal[
58
+ "SAFE",
59
+ "UNSAFE",
60
+ "SUSPICIOUS",
61
+ "UNKNOWN",
62
+ "ERROR",
63
+ "critical",
64
+ "high",
65
+ "medium",
66
+ "low",
67
+ "none",
68
+ "unknown",
69
+ ]
70
+ ]
71
+ | Omit = omit,
57
72
  modscan_status: Literal["ENABLED", "DISABLED", "ANY"] | Omit = omit,
58
73
  offset: int | Omit = omit,
59
74
  provider: List[Literal["AZURE", "ADHOC"]] | Omit = omit,
@@ -152,7 +167,22 @@ class AsyncCardsResource(AsyncAPIResource):
152
167
  limit: int | Omit = omit,
153
168
  model_created: card_list_params.ModelCreated | Omit = omit,
154
169
  model_name: card_list_params.ModelName | Omit = omit,
155
- modscan_severity: List[Literal["SAFE", "UNSAFE", "SUSPICIOUS", "UNKNOWN", "ERROR"]] | Omit = omit,
170
+ modscan_severity: List[
171
+ Literal[
172
+ "SAFE",
173
+ "UNSAFE",
174
+ "SUSPICIOUS",
175
+ "UNKNOWN",
176
+ "ERROR",
177
+ "critical",
178
+ "high",
179
+ "medium",
180
+ "low",
181
+ "none",
182
+ "unknown",
183
+ ]
184
+ ]
185
+ | Omit = omit,
156
186
  modscan_status: Literal["ENABLED", "DISABLED", "ANY"] | Omit = omit,
157
187
  offset: int | Omit = omit,
158
188
  provider: List[Literal["AZURE", "ADHOC"]] | Omit = omit,
@@ -76,7 +76,6 @@ class JobsResource(SyncAPIResource):
76
76
  """
77
77
  if not scan_id:
78
78
  raise ValueError(f"Expected a non-empty value for `scan_id` but received {scan_id!r}")
79
- extra_headers = {"Accept": "application/json; charset=utf-8", **(extra_headers or {})}
80
79
  extra_headers = {**strip_not_given({"X-Correlation-Id": x_correlation_id}), **(extra_headers or {})}
81
80
  return self._get(
82
81
  f"/scan/v3/results/{scan_id}",
@@ -102,9 +101,10 @@ class JobsResource(SyncAPIResource):
102
101
  model_name: job_list_params.ModelName | Omit = omit,
103
102
  model_version_ids: SequenceNotStr[str] | Omit = omit,
104
103
  offset: int | Omit = omit,
105
- request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"]] | Omit = omit,
104
+ request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]]
105
+ | Omit = omit,
106
106
  scanner_version: str | Omit = omit,
107
- severity: SequenceNotStr[str] | Omit = omit,
107
+ severity: Literal["critical", "high", "medium", "low", "none", "unknown", "safe"] | Omit = omit,
108
108
  sort: str | Omit = omit,
109
109
  source: job_list_params.Source | Omit = omit,
110
110
  start_time: Union[str, datetime] | Omit = omit,
@@ -208,6 +208,8 @@ class JobsResource(SyncAPIResource):
208
208
  Scan a remote model
209
209
 
210
210
  Args:
211
+ access: Access method for the location of files associated with the scan
212
+
211
213
  extra_headers: Send extra headers
212
214
 
213
215
  extra_query: Add additional query parameters to the request
@@ -281,7 +283,6 @@ class AsyncJobsResource(AsyncAPIResource):
281
283
  """
282
284
  if not scan_id:
283
285
  raise ValueError(f"Expected a non-empty value for `scan_id` but received {scan_id!r}")
284
- extra_headers = {"Accept": "application/json; charset=utf-8", **(extra_headers or {})}
285
286
  extra_headers = {**strip_not_given({"X-Correlation-Id": x_correlation_id}), **(extra_headers or {})}
286
287
  return await self._get(
287
288
  f"/scan/v3/results/{scan_id}",
@@ -309,9 +310,10 @@ class AsyncJobsResource(AsyncAPIResource):
309
310
  model_name: job_list_params.ModelName | Omit = omit,
310
311
  model_version_ids: SequenceNotStr[str] | Omit = omit,
311
312
  offset: int | Omit = omit,
312
- request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"]] | Omit = omit,
313
+ request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]]
314
+ | Omit = omit,
313
315
  scanner_version: str | Omit = omit,
314
- severity: SequenceNotStr[str] | Omit = omit,
316
+ severity: Literal["critical", "high", "medium", "low", "none", "unknown", "safe"] | Omit = omit,
315
317
  sort: str | Omit = omit,
316
318
  source: job_list_params.Source | Omit = omit,
317
319
  start_time: Union[str, datetime] | Omit = omit,
@@ -415,6 +417,8 @@ class AsyncJobsResource(AsyncAPIResource):
415
417
  Scan a remote model
416
418
 
417
419
  Args:
420
+ access: Access method for the location of files associated with the scan
421
+
418
422
  extra_headers: Send extra headers
419
423
 
420
424
  extra_query: Add additional query parameters to the request
@@ -99,7 +99,8 @@ class UploadResource(SyncAPIResource):
99
99
  requesting_entity: str,
100
100
  location_alias: str | Omit = omit,
101
101
  origin: str | Omit = omit,
102
- request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"] | Omit = omit,
102
+ request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]
103
+ | Omit = omit,
103
104
  x_correlation_id: str | Omit = omit,
104
105
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
105
106
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -221,7 +222,8 @@ class AsyncUploadResource(AsyncAPIResource):
221
222
  requesting_entity: str,
222
223
  location_alias: str | Omit = omit,
223
224
  origin: str | Omit = omit,
224
- request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"] | Omit = omit,
225
+ request_source: Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]
226
+ | Omit = omit,
225
227
  x_correlation_id: str | Omit = omit,
226
228
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
227
229
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -2,6 +2,7 @@
2
2
 
3
3
  from typing import TYPE_CHECKING, Dict, List, Optional
4
4
  from datetime import datetime
5
+ from typing_extensions import Literal
5
6
 
6
7
  from pydantic import Field as FieldInfo
7
8
 
@@ -24,6 +25,7 @@ __all__ = [
24
25
  "ModifiedDataInputMessage",
25
26
  "ModifiedDataOutput",
26
27
  "ModifiedDataOutputMessage",
28
+ "Evaluation",
27
29
  ]
28
30
 
29
31
 
@@ -39,12 +41,17 @@ class AnalysisFindings(BaseModel):
39
41
  frameworks: Dict[str, List[AnalysisFindingsFramework]]
40
42
  """The taxonomies for the detections."""
41
43
 
42
- __pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
43
44
  if TYPE_CHECKING:
45
+ # Some versions of Pydantic <2.8.0 have a bug and don’t allow assigning a
46
+ # value to this field, so for compatibility we avoid doing it at runtime.
47
+ __pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
48
+
44
49
  # Stub to indicate that arbitrary properties are accepted.
45
50
  # To access properties that are not valid identifiers you can use `getattr`, e.g.
46
51
  # `getattr(obj, '$type')`
47
52
  def __getattr__(self, attr: str) -> object: ...
53
+ else:
54
+ __pydantic_extra__: Dict[str, object]
48
55
 
49
56
 
50
57
  class Analysis(BaseModel):
@@ -85,12 +92,17 @@ class AnalyzedDataInput(BaseModel):
85
92
  messages: Optional[List[AnalyzedDataInputMessage]] = None
86
93
  """The list of messages as input to a language model."""
87
94
 
88
- __pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
89
95
  if TYPE_CHECKING:
96
+ # Some versions of Pydantic <2.8.0 have a bug and don’t allow assigning a
97
+ # value to this field, so for compatibility we avoid doing it at runtime.
98
+ __pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
99
+
90
100
  # Stub to indicate that arbitrary properties are accepted.
91
101
  # To access properties that are not valid identifiers you can use `getattr`, e.g.
92
102
  # `getattr(obj, '$type')`
93
103
  def __getattr__(self, attr: str) -> object: ...
104
+ else:
105
+ __pydantic_extra__: Dict[str, object]
94
106
 
95
107
 
96
108
  class AnalyzedDataOutputMessage(BaseModel):
@@ -157,12 +169,17 @@ class ModifiedDataInput(BaseModel):
157
169
  messages: Optional[List[ModifiedDataInputMessage]] = None
158
170
  """The list of messages as input to a language model."""
159
171
 
160
- __pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
161
172
  if TYPE_CHECKING:
173
+ # Some versions of Pydantic <2.8.0 have a bug and don’t allow assigning a
174
+ # value to this field, so for compatibility we avoid doing it at runtime.
175
+ __pydantic_extra__: Dict[str, object] = FieldInfo(init=False) # pyright: ignore[reportIncompatibleVariableOverride]
176
+
162
177
  # Stub to indicate that arbitrary properties are accepted.
163
178
  # To access properties that are not valid identifiers you can use `getattr`, e.g.
164
179
  # `getattr(obj, '$type')`
165
180
  def __getattr__(self, attr: str) -> object: ...
181
+ else:
182
+ __pydantic_extra__: Dict[str, object]
166
183
 
167
184
 
168
185
  class ModifiedDataOutputMessage(BaseModel):
@@ -184,6 +201,20 @@ class ModifiedData(BaseModel):
184
201
  output: ModifiedDataOutput
185
202
 
186
203
 
204
+ class Evaluation(BaseModel):
205
+ action: Literal["Allow", "Alert", "Redact", "Block"]
206
+ """The action based on interaction analysis and configured tenant security rules."""
207
+
208
+ has_detections: bool
209
+ """Indicates if any detections were found during the analysis."""
210
+
211
+ threat_level: Literal["None", "Low", "Medium", "High", "Critical"]
212
+ """
213
+ The threat level based on interaction analysis and configured tenant security
214
+ rules.
215
+ """
216
+
217
+
187
218
  class InteractionAnalyzeResponse(BaseModel):
188
219
  analysis: List[Analysis]
189
220
 
@@ -197,3 +228,6 @@ class InteractionAnalyzeResponse(BaseModel):
197
228
  The potentially modified language model input and output after applying any
198
229
  redactions or modifications based on the analysis.
199
230
  """
231
+
232
+ evaluation: Optional[Evaluation] = None
233
+ """The evaluation of the analysis results."""
@@ -26,7 +26,11 @@ class CardListParams(TypedDict, total=False):
26
26
  model_name: ModelName
27
27
  """substring match on model name"""
28
28
 
29
- modscan_severity: List[Literal["SAFE", "UNSAFE", "SUSPICIOUS", "UNKNOWN", "ERROR"]]
29
+ modscan_severity: List[
30
+ Literal[
31
+ "SAFE", "UNSAFE", "SUSPICIOUS", "UNKNOWN", "ERROR", "critical", "high", "medium", "low", "none", "unknown"
32
+ ]
33
+ ]
30
34
 
31
35
  modscan_status: Literal["ENABLED", "DISABLED", "ANY"]
32
36
 
@@ -35,12 +35,18 @@ class CardListResponse(BaseModel):
35
35
 
36
36
  model_id: str
37
37
 
38
+ model_scan_severity: Literal["not available", "critical", "high", "medium", "low", "none", "unknown"]
39
+ """The severity of the model's latest scan"""
40
+
38
41
  model_scan_threat_level: Literal["safe", "unsafe", "suspicious", "not available"]
39
42
 
40
43
  plaintext_name: str
41
44
 
42
45
  source: str
43
46
 
47
+ model_scan_has_error: Optional[bool] = None
48
+ """True if the model's latest scan has an error"""
49
+
44
50
  security_posture: Optional[SecurityPosture] = None
45
51
 
46
52
  tags: Optional[Dict[str, object]] = None
@@ -38,13 +38,13 @@ class JobListParams(TypedDict, total=False):
38
38
 
39
39
  offset: int
40
40
 
41
- request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload"]]
41
+ request_source: List[Literal["Hybrid Upload", "API Upload", "Integration", "UI Upload", "AI Asset Discovery"]]
42
42
  """Filter by request source using a comma-separated list"""
43
43
 
44
44
  scanner_version: str
45
45
  """filter by version of the scanner"""
46
46
 
47
- severity: SequenceNotStr[str]
47
+ severity: Literal["critical", "high", "medium", "low", "none", "unknown", "safe"]
48
48
  """Severities"""
49
49
 
50
50
  sort: str