hiddenlayer-sdk 3.2.2__tar.gz → 3.4.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.
- hiddenlayer_sdk-3.4.0/.release-please-manifest.json +3 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/CHANGELOG.md +45 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/PKG-INFO +1 -1
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/api.md +25 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/pyproject.toml +2 -2
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/requirements-dev.lock +10 -10
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/requirements.lock +4 -4
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_base_client.py +5 -2
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_client.py +51 -1
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_compat.py +3 -3
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_oauth2.py +5 -2
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_compat.py +1 -1
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/_utils/_json.py +35 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_version.py +1 -1
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/lib/__init__.py +3 -1
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/lib/evaluation_sessions.py +18 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/lib/red_team_exceptions.py +17 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/lib/red_team_session.py +973 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/__init__.py +14 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/resources/evaluations/__init__.py +33 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/resources/evaluations/evaluations.py +102 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/resources/evaluations/red_team.py +763 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/models/cards.py +4 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/sensors.py +101 -50
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/types/evaluations/__init__.py +19 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/types/evaluations/red_team_create_params.py +59 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/types/evaluations/red_team_create_response.py +15 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/types/evaluations/red_team_retrieve_evaluation_results_response.py +20 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/types/evaluations/red_team_retrieve_next_action_response.py +38 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/types/evaluations/red_team_retrieve_status_response.py +68 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/types/evaluations/red_team_submit_target_response_params.py +15 -0
- hiddenlayer_sdk-3.4.0/src/hiddenlayer/types/evaluations/red_team_submit_target_response_response.py +20 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/models/card_list_params.py +2 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/models/card_list_response.py +6 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/job_list_response.py +6 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/job_request_params.py +6 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/scan_job.py +6 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/scan_report.py +53 -0
- hiddenlayer_sdk-3.4.0/tests/api_resources/evaluations/test_red_team.py +586 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/api_resources/models/test_cards.py +2 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/api_resources/scans/test_jobs.py +2 -0
- hiddenlayer_sdk-3.4.0/tests/api_resources/scans/upload/__init__.py +1 -0
- hiddenlayer_sdk-3.4.0/tests/api_resources/test_sensors.py +550 -0
- hiddenlayer_sdk-3.4.0/tests/test_red_team_session.py +1603 -0
- hiddenlayer_sdk-3.4.0/tests/test_utils/test_json.py +126 -0
- hiddenlayer_sdk-3.2.2/.release-please-manifest.json +0 -3
- hiddenlayer_sdk-3.2.2/tests/api_resources/test_sensors.py +0 -490
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/.gitignore +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/CODE_OF_CONDUCT.md +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/CONTRIBUTING.md +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/LICENSE +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/README.md +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/SECURITY.md +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/bin/check-release-environment +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/bin/publish-jfrog +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/bin/publish-pypi +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/examples/.keep +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/examples/demo.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/noxfile.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/release-please-config.json +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_constants.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_exceptions.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_files.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_models.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_qs.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_resource.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_streaming.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_types.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_datetime_parse.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_logs.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_proxy.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_reflection.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_resources_proxy.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_streams.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_sync.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_transform.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_typing.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/_utils/_utils.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/lib/.keep +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/lib/community_scan.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/lib/model_scan.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/lib/scan_utils.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/pagination.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/py.typed +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/interactions.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/models/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/models/models.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/prompt_analyzer.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/scans/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/scans/jobs.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/scans/results.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/scans/scans.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/scans/upload/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/scans/upload/file.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/resources/scans/upload/upload.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/interaction_analyze_params.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/interaction_analyze_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/model_retrieve_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/models/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/prompt_analyzer_create_params.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/prompt_analyzer_create_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/job_list_params.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/job_retrieve_params.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/result_sarif_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/upload/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/upload/file_add_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/upload/file_complete_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/upload_complete_all_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/upload_start_params.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/scans/upload_start_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/sensor_create_params.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/sensor_create_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/sensor_query_params.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/sensor_query_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/sensor_retrieve_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/sensor_update_params.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/src/hiddenlayer/types/sensor_update_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/api_resources/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2/tests/api_resources/models → hiddenlayer_sdk-3.4.0/tests/api_resources/evaluations}/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2/tests/api_resources/scans → hiddenlayer_sdk-3.4.0/tests/api_resources/models}/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2/tests/api_resources/scans/upload → hiddenlayer_sdk-3.4.0/tests/api_resources/scans}/__init__.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/api_resources/scans/test_results.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/api_resources/scans/test_upload.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/api_resources/scans/upload/test_file.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/api_resources/test_interactions.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/api_resources/test_models.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/api_resources/test_prompt_analyzer.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/conftest.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/sample_file.txt +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_client.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_community_scan.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_deepcopy.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_extract_files.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_files.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_model_scan.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_models.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_qs.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_required_args.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_response.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_streaming.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_transform.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_utils/test_proxy.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/test_utils/test_typing.py +0 -0
- {hiddenlayer_sdk-3.2.2 → hiddenlayer_sdk-3.4.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.4.0 (2026-02-14)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v3.3.0...v3.4.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.3.0...v3.4.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **api:** api update ([a1c0278](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/a1c0278363b3be694895f157bab4da233de753bb))
|
|
10
|
+
* **api:** api update ([4b1ef5b](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/4b1ef5b5c16dd67e5a7756acf871acae5f11512a))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **client/oauth:** send grant_type in request body per RFC 6749 ([#173](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/issues/173)) ([2b4c58d](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/2b4c58dc1fb3ad586e9a8fab90f3b900f59446c0))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Chores
|
|
19
|
+
|
|
20
|
+
* format all `api.md` files ([829c616](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/829c616b17455c59641976e0c29702dfbba50e8e))
|
|
21
|
+
* **internal:** bump dependencies ([bfb6489](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/bfb6489bb4b627f40fcf62c8ff06bd5946882b5b))
|
|
22
|
+
* **internal:** fix lint error on Python 3.14 ([e83496c](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/e83496cc463b59eabd0e415d657fed751365b9f4))
|
|
23
|
+
|
|
24
|
+
## 3.3.0 (2026-02-04)
|
|
25
|
+
|
|
26
|
+
Full Changelog: [v3.2.2...v3.3.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.2.2...v3.3.0)
|
|
27
|
+
|
|
28
|
+
### Features
|
|
29
|
+
|
|
30
|
+
* **api:** api update ([06710f4](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/06710f478124281d55a4eb64af67b8de21610872))
|
|
31
|
+
* **api:** api update ([231de87](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/231de87241982efa3ea2ba7b9a9c784c79f8028a))
|
|
32
|
+
* **api:** api update ([6fba9a3](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/6fba9a328358bf0d2b8d3f33d8dc4051cd38d878))
|
|
33
|
+
* **api:** api update ([c9f395b](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/c9f395b31376da8d2799bf5bcaa785065e821f18))
|
|
34
|
+
* **client:** add custom JSON encoder for extended type support ([e108e39](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/e108e39cbf807e7d690f1c72ac32229b2269962a))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
### Bug Fixes
|
|
38
|
+
|
|
39
|
+
* **client/oauth:** send grant_type in the right location ([b9898e2](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/b9898e2e643c4725178c7fbb0cac4baabc96d0bd))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
### Chores
|
|
43
|
+
|
|
44
|
+
* **ci:** upgrade `actions/github-script` ([3b4df21](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/3b4df21b705214ad6246aa0be2fcc75d8e7e5a7f))
|
|
45
|
+
* configure Dependabot to target next branch ([#165](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/issues/165)) ([71dc626](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/71dc626806e43c668f112ff65dc21a47676bc8cb))
|
|
46
|
+
* **internal:** update `actions/checkout` version ([4aaddb5](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/4aaddb537aa2187a7ef0388ea43e61042ab61f29))
|
|
47
|
+
|
|
3
48
|
## 3.2.2 (2026-01-14)
|
|
4
49
|
|
|
5
50
|
Full Changelog: [v3.2.1...v3.2.2](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.2.1...v3.2.2)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: hiddenlayer-sdk
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.4.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
|
|
@@ -25,6 +25,31 @@ Methods:
|
|
|
25
25
|
|
|
26
26
|
- <code title="get /models/v4/cards">client.models.cards.<a href="./src/hiddenlayer/resources/models/cards.py">list</a>(\*\*<a href="src/hiddenlayer/types/models/card_list_params.py">params</a>) -> <a href="./src/hiddenlayer/types/models/card_list_response.py">SyncOffsetPage[CardListResponse]</a></code>
|
|
27
27
|
|
|
28
|
+
# Evaluations
|
|
29
|
+
|
|
30
|
+
## RedTeam
|
|
31
|
+
|
|
32
|
+
Types:
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
from hiddenlayer.types.evaluations import (
|
|
36
|
+
RedTeamCreateResponse,
|
|
37
|
+
RedTeamRetrieveEvaluationResultsResponse,
|
|
38
|
+
RedTeamRetrieveNextActionResponse,
|
|
39
|
+
RedTeamRetrieveStatusResponse,
|
|
40
|
+
RedTeamSubmitTargetResponseResponse,
|
|
41
|
+
)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Methods:
|
|
45
|
+
|
|
46
|
+
- <code title="post /evaluations/v1-beta/red-team">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">create</a>(\*\*<a href="src/hiddenlayer/types/evaluations/red_team_create_params.py">params</a>) -> <a href="./src/hiddenlayer/types/evaluations/red_team_create_response.py">RedTeamCreateResponse</a></code>
|
|
47
|
+
- <code title="get /evaluations/v1-beta/red-team/{workflow_id}">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">retrieve_evaluation_results</a>(workflow_id) -> <a href="./src/hiddenlayer/types/evaluations/red_team_retrieve_evaluation_results_response.py">RedTeamRetrieveEvaluationResultsResponse</a></code>
|
|
48
|
+
- <code title="get /evaluations/v1-beta/red-team/{workflow_id}/next-action">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">retrieve_next_action</a>(workflow_id) -> <a href="./src/hiddenlayer/types/evaluations/red_team_retrieve_next_action_response.py">RedTeamRetrieveNextActionResponse</a></code>
|
|
49
|
+
- <code title="get /evaluations/v1-beta/red-team/{workflow_id}/status">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">retrieve_status</a>(workflow_id) -> <a href="./src/hiddenlayer/types/evaluations/red_team_retrieve_status_response.py">RedTeamRetrieveStatusResponse</a></code>
|
|
50
|
+
- <code title="post /evaluations/v1-beta/red-team/{workflow_id}/target-response">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">submit_target_response</a>(workflow_id, \*\*<a href="src/hiddenlayer/types/evaluations/red_team_submit_target_response_params.py">params</a>) -> <a href="./src/hiddenlayer/types/evaluations/red_team_submit_target_response_response.py">RedTeamSubmitTargetResponseResponse</a></code>
|
|
51
|
+
- <code title="post /evaluations/v1-beta/red-team/terminations/{workflow_id}">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">terminate</a>(workflow_id) -> None</code>
|
|
52
|
+
|
|
28
53
|
# PromptAnalyzer
|
|
29
54
|
|
|
30
55
|
Types:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "hiddenlayer-sdk"
|
|
3
|
-
version = "3.
|
|
3
|
+
version = "3.4.0"
|
|
4
4
|
description = "The official Python library for the hiddenlayer API"
|
|
5
5
|
dynamic = ["readme"]
|
|
6
6
|
license = {text = "Apache-2.0"}
|
|
@@ -72,7 +72,7 @@ format = { chain = [
|
|
|
72
72
|
# run formatting again to fix any inconsistencies when imports are stripped
|
|
73
73
|
"format:ruff",
|
|
74
74
|
]}
|
|
75
|
-
"format:docs" = "python scripts/utils/ruffen-docs.py README.md api.md"
|
|
75
|
+
"format:docs" = "bash -c 'python scripts/utils/ruffen-docs.py README.md $(find . -type f -name api.md)'"
|
|
76
76
|
"format:ruff" = "ruff format"
|
|
77
77
|
|
|
78
78
|
"lint" = { chain = [
|
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
-e file:.
|
|
13
13
|
aiohappyeyeballs==2.6.1
|
|
14
14
|
# via aiohttp
|
|
15
|
-
aiohttp==3.13.
|
|
15
|
+
aiohttp==3.13.3
|
|
16
16
|
# via hiddenlayer-sdk
|
|
17
17
|
# via httpx-aiohttp
|
|
18
18
|
aiosignal==1.4.0
|
|
19
19
|
# via aiohttp
|
|
20
20
|
annotated-types==0.7.0
|
|
21
21
|
# via pydantic
|
|
22
|
-
anyio==4.12.
|
|
22
|
+
anyio==4.12.1
|
|
23
23
|
# via hiddenlayer-sdk
|
|
24
24
|
# via httpx
|
|
25
25
|
argcomplete==3.6.3
|
|
@@ -31,7 +31,7 @@ attrs==25.4.0
|
|
|
31
31
|
# via nox
|
|
32
32
|
backports-asyncio-runner==1.2.0
|
|
33
33
|
# via pytest-asyncio
|
|
34
|
-
certifi==
|
|
34
|
+
certifi==2026.1.4
|
|
35
35
|
# via httpcore
|
|
36
36
|
# via httpx
|
|
37
37
|
colorlog==6.10.1
|
|
@@ -63,7 +63,7 @@ httpx==0.28.1
|
|
|
63
63
|
# via hiddenlayer-sdk
|
|
64
64
|
# via httpx-aiohttp
|
|
65
65
|
# via respx
|
|
66
|
-
httpx-aiohttp==0.1.
|
|
66
|
+
httpx-aiohttp==0.1.12
|
|
67
67
|
# via hiddenlayer-sdk
|
|
68
68
|
humanize==4.13.0
|
|
69
69
|
# via nox
|
|
@@ -72,7 +72,7 @@ idna==3.11
|
|
|
72
72
|
# via httpx
|
|
73
73
|
# via requests
|
|
74
74
|
# via yarl
|
|
75
|
-
importlib-metadata==8.7.
|
|
75
|
+
importlib-metadata==8.7.1
|
|
76
76
|
iniconfig==2.1.0
|
|
77
77
|
# via pytest
|
|
78
78
|
markdown-it-py==3.0.0
|
|
@@ -85,14 +85,14 @@ multidict==6.7.0
|
|
|
85
85
|
mypy==1.17.0
|
|
86
86
|
mypy-extensions==1.1.0
|
|
87
87
|
# via mypy
|
|
88
|
-
nodeenv==1.
|
|
88
|
+
nodeenv==1.10.0
|
|
89
89
|
# via pyright
|
|
90
90
|
nox==2025.11.12
|
|
91
91
|
packaging==25.0
|
|
92
92
|
# via dependency-groups
|
|
93
93
|
# via nox
|
|
94
94
|
# via pytest
|
|
95
|
-
pathspec==0.
|
|
95
|
+
pathspec==1.0.3
|
|
96
96
|
# via mypy
|
|
97
97
|
platformdirs==4.4.0
|
|
98
98
|
# via virtualenv
|
|
@@ -125,13 +125,13 @@ requests-auth==8.0.0
|
|
|
125
125
|
# via hiddenlayer
|
|
126
126
|
respx==0.22.0
|
|
127
127
|
rich==14.2.0
|
|
128
|
-
ruff==0.14.
|
|
128
|
+
ruff==0.14.13
|
|
129
129
|
six==1.17.0
|
|
130
130
|
# via python-dateutil
|
|
131
131
|
sniffio==1.3.1
|
|
132
132
|
# via hiddenlayer-sdk
|
|
133
133
|
time-machine==2.19.0
|
|
134
|
-
tomli==2.
|
|
134
|
+
tomli==2.4.0
|
|
135
135
|
# via dependency-groups
|
|
136
136
|
# via mypy
|
|
137
137
|
# via nox
|
|
@@ -152,7 +152,7 @@ types-requests==2.32.4.20250611
|
|
|
152
152
|
# via virtualenv
|
|
153
153
|
typing-inspection==0.4.2
|
|
154
154
|
# via pydantic
|
|
155
|
-
virtualenv==20.
|
|
155
|
+
virtualenv==20.36.1
|
|
156
156
|
urllib3==2.5.0
|
|
157
157
|
# via nox
|
|
158
158
|
yarl==1.22.0
|
|
@@ -12,21 +12,21 @@
|
|
|
12
12
|
-e file:.
|
|
13
13
|
aiohappyeyeballs==2.6.1
|
|
14
14
|
# via aiohttp
|
|
15
|
-
aiohttp==3.13.
|
|
15
|
+
aiohttp==3.13.3
|
|
16
16
|
# via hiddenlayer-sdk
|
|
17
17
|
# via httpx-aiohttp
|
|
18
18
|
aiosignal==1.4.0
|
|
19
19
|
# via aiohttp
|
|
20
20
|
annotated-types==0.7.0
|
|
21
21
|
# via pydantic
|
|
22
|
-
anyio==4.12.
|
|
22
|
+
anyio==4.12.1
|
|
23
23
|
# via hiddenlayer-sdk
|
|
24
24
|
# via httpx
|
|
25
25
|
async-timeout==5.0.1
|
|
26
26
|
# via aiohttp
|
|
27
27
|
attrs==25.4.0
|
|
28
28
|
# via aiohttp
|
|
29
|
-
certifi==
|
|
29
|
+
certifi==2026.1.4
|
|
30
30
|
# via httpcore
|
|
31
31
|
# via httpx
|
|
32
32
|
distro==1.9.0
|
|
@@ -45,7 +45,7 @@ httpcore==1.0.9
|
|
|
45
45
|
httpx==0.28.1
|
|
46
46
|
# via hiddenlayer-sdk
|
|
47
47
|
# via httpx-aiohttp
|
|
48
|
-
httpx-aiohttp==0.1.
|
|
48
|
+
httpx-aiohttp==0.1.12
|
|
49
49
|
# via hiddenlayer-sdk
|
|
50
50
|
idna==3.11
|
|
51
51
|
# via anyio
|
|
@@ -86,6 +86,7 @@ from ._exceptions import (
|
|
|
86
86
|
APIConnectionError,
|
|
87
87
|
APIResponseValidationError,
|
|
88
88
|
)
|
|
89
|
+
from ._utils._json import openapi_dumps
|
|
89
90
|
|
|
90
91
|
log: logging.Logger = logging.getLogger(__name__)
|
|
91
92
|
|
|
@@ -554,8 +555,10 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
|
|
|
554
555
|
kwargs["content"] = options.content
|
|
555
556
|
elif isinstance(json_data, bytes):
|
|
556
557
|
kwargs["content"] = json_data
|
|
557
|
-
|
|
558
|
-
|
|
558
|
+
elif not files:
|
|
559
|
+
# Don't set content when JSON is sent as multipart/form-data,
|
|
560
|
+
# since httpx's content param overrides other body arguments
|
|
561
|
+
kwargs["content"] = openapi_dumps(json_data) if is_given(json_data) and json_data is not None else None
|
|
559
562
|
kwargs["files"] = files
|
|
560
563
|
else:
|
|
561
564
|
headers.pop("Content-Type", None)
|
|
@@ -32,14 +32,16 @@ from ._base_client import (
|
|
|
32
32
|
)
|
|
33
33
|
|
|
34
34
|
if TYPE_CHECKING:
|
|
35
|
-
from .resources import scans, models, sensors, interactions, prompt_analyzer
|
|
35
|
+
from .resources import scans, models, sensors, evaluations, interactions, prompt_analyzer
|
|
36
36
|
from .lib.model_scan import ModelScanner, AsyncModelScanner
|
|
37
37
|
from .resources.sensors import SensorsResource, AsyncSensorsResource
|
|
38
38
|
from .lib.community_scan import CommunityScanner, AsyncCommunityScanner
|
|
39
39
|
from .resources.scans.scans import ScansResource, AsyncScansResource
|
|
40
40
|
from .resources.interactions import InteractionsResource, AsyncInteractionsResource
|
|
41
|
+
from .lib.evaluation_sessions import EvaluationSessionsResource, AsyncEvaluationSessionsResource
|
|
41
42
|
from .resources.models.models import ModelsResource, AsyncModelsResource
|
|
42
43
|
from .resources.prompt_analyzer import PromptAnalyzerResource, AsyncPromptAnalyzerResource
|
|
44
|
+
from .resources.evaluations.evaluations import EvaluationsResource, AsyncEvaluationsResource
|
|
43
45
|
|
|
44
46
|
__all__ = [
|
|
45
47
|
"ENVIRONMENTS",
|
|
@@ -155,6 +157,18 @@ class HiddenLayer(SyncAPIClient):
|
|
|
155
157
|
|
|
156
158
|
return ModelsResource(self)
|
|
157
159
|
|
|
160
|
+
@cached_property
|
|
161
|
+
def evaluations(self) -> EvaluationsResource:
|
|
162
|
+
from .resources.evaluations import EvaluationsResource
|
|
163
|
+
|
|
164
|
+
return EvaluationsResource(self)
|
|
165
|
+
|
|
166
|
+
@cached_property
|
|
167
|
+
def evaluation_sessions(self) -> EvaluationSessionsResource:
|
|
168
|
+
from .lib.evaluation_sessions import EvaluationSessionsResource
|
|
169
|
+
|
|
170
|
+
return EvaluationSessionsResource(self)
|
|
171
|
+
|
|
158
172
|
@cached_property
|
|
159
173
|
def prompt_analyzer(self) -> PromptAnalyzerResource:
|
|
160
174
|
from .resources.prompt_analyzer import PromptAnalyzerResource
|
|
@@ -430,6 +444,18 @@ class AsyncHiddenLayer(AsyncAPIClient):
|
|
|
430
444
|
|
|
431
445
|
return AsyncModelsResource(self)
|
|
432
446
|
|
|
447
|
+
@cached_property
|
|
448
|
+
def evaluations(self) -> AsyncEvaluationsResource:
|
|
449
|
+
from .resources.evaluations import AsyncEvaluationsResource
|
|
450
|
+
|
|
451
|
+
return AsyncEvaluationsResource(self)
|
|
452
|
+
|
|
453
|
+
@cached_property
|
|
454
|
+
def evaluation_sessions(self) -> AsyncEvaluationSessionsResource:
|
|
455
|
+
from .lib.evaluation_sessions import AsyncEvaluationSessionsResource
|
|
456
|
+
|
|
457
|
+
return AsyncEvaluationSessionsResource(self)
|
|
458
|
+
|
|
433
459
|
@cached_property
|
|
434
460
|
def prompt_analyzer(self) -> AsyncPromptAnalyzerResource:
|
|
435
461
|
from .resources.prompt_analyzer import AsyncPromptAnalyzerResource
|
|
@@ -620,6 +646,12 @@ class HiddenLayerWithRawResponse:
|
|
|
620
646
|
|
|
621
647
|
return ModelsResourceWithRawResponse(self._client.models)
|
|
622
648
|
|
|
649
|
+
@cached_property
|
|
650
|
+
def evaluations(self) -> evaluations.EvaluationsResourceWithRawResponse:
|
|
651
|
+
from .resources.evaluations import EvaluationsResourceWithRawResponse
|
|
652
|
+
|
|
653
|
+
return EvaluationsResourceWithRawResponse(self._client.evaluations)
|
|
654
|
+
|
|
623
655
|
@cached_property
|
|
624
656
|
def prompt_analyzer(self) -> prompt_analyzer.PromptAnalyzerResourceWithRawResponse:
|
|
625
657
|
from .resources.prompt_analyzer import PromptAnalyzerResourceWithRawResponse
|
|
@@ -657,6 +689,12 @@ class AsyncHiddenLayerWithRawResponse:
|
|
|
657
689
|
|
|
658
690
|
return AsyncModelsResourceWithRawResponse(self._client.models)
|
|
659
691
|
|
|
692
|
+
@cached_property
|
|
693
|
+
def evaluations(self) -> evaluations.AsyncEvaluationsResourceWithRawResponse:
|
|
694
|
+
from .resources.evaluations import AsyncEvaluationsResourceWithRawResponse
|
|
695
|
+
|
|
696
|
+
return AsyncEvaluationsResourceWithRawResponse(self._client.evaluations)
|
|
697
|
+
|
|
660
698
|
@cached_property
|
|
661
699
|
def prompt_analyzer(self) -> prompt_analyzer.AsyncPromptAnalyzerResourceWithRawResponse:
|
|
662
700
|
from .resources.prompt_analyzer import AsyncPromptAnalyzerResourceWithRawResponse
|
|
@@ -694,6 +732,12 @@ class HiddenLayerWithStreamedResponse:
|
|
|
694
732
|
|
|
695
733
|
return ModelsResourceWithStreamingResponse(self._client.models)
|
|
696
734
|
|
|
735
|
+
@cached_property
|
|
736
|
+
def evaluations(self) -> evaluations.EvaluationsResourceWithStreamingResponse:
|
|
737
|
+
from .resources.evaluations import EvaluationsResourceWithStreamingResponse
|
|
738
|
+
|
|
739
|
+
return EvaluationsResourceWithStreamingResponse(self._client.evaluations)
|
|
740
|
+
|
|
697
741
|
@cached_property
|
|
698
742
|
def prompt_analyzer(self) -> prompt_analyzer.PromptAnalyzerResourceWithStreamingResponse:
|
|
699
743
|
from .resources.prompt_analyzer import PromptAnalyzerResourceWithStreamingResponse
|
|
@@ -731,6 +775,12 @@ class AsyncHiddenLayerWithStreamedResponse:
|
|
|
731
775
|
|
|
732
776
|
return AsyncModelsResourceWithStreamingResponse(self._client.models)
|
|
733
777
|
|
|
778
|
+
@cached_property
|
|
779
|
+
def evaluations(self) -> evaluations.AsyncEvaluationsResourceWithStreamingResponse:
|
|
780
|
+
from .resources.evaluations import AsyncEvaluationsResourceWithStreamingResponse
|
|
781
|
+
|
|
782
|
+
return AsyncEvaluationsResourceWithStreamingResponse(self._client.evaluations)
|
|
783
|
+
|
|
734
784
|
@cached_property
|
|
735
785
|
def prompt_analyzer(self) -> prompt_analyzer.AsyncPromptAnalyzerResourceWithStreamingResponse:
|
|
736
786
|
from .resources.prompt_analyzer import AsyncPromptAnalyzerResourceWithStreamingResponse
|
|
@@ -139,6 +139,7 @@ def model_dump(
|
|
|
139
139
|
exclude_defaults: bool = False,
|
|
140
140
|
warnings: bool = True,
|
|
141
141
|
mode: Literal["json", "python"] = "python",
|
|
142
|
+
by_alias: bool | None = None,
|
|
142
143
|
) -> dict[str, Any]:
|
|
143
144
|
if (not PYDANTIC_V1) or hasattr(model, "model_dump"):
|
|
144
145
|
return model.model_dump(
|
|
@@ -148,13 +149,12 @@ def model_dump(
|
|
|
148
149
|
exclude_defaults=exclude_defaults,
|
|
149
150
|
# warnings are not supported in Pydantic v1
|
|
150
151
|
warnings=True if PYDANTIC_V1 else warnings,
|
|
152
|
+
by_alias=by_alias,
|
|
151
153
|
)
|
|
152
154
|
return cast(
|
|
153
155
|
"dict[str, Any]",
|
|
154
156
|
model.dict( # pyright: ignore[reportDeprecated, reportUnnecessaryCast]
|
|
155
|
-
exclude=exclude,
|
|
156
|
-
exclude_unset=exclude_unset,
|
|
157
|
-
exclude_defaults=exclude_defaults,
|
|
157
|
+
exclude=exclude, exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, by_alias=bool(by_alias)
|
|
158
158
|
),
|
|
159
159
|
)
|
|
160
160
|
|
|
@@ -87,8 +87,11 @@ class OAuth2ClientCredentials(httpx.Auth):
|
|
|
87
87
|
return httpx.Request(
|
|
88
88
|
"POST",
|
|
89
89
|
self._token_url,
|
|
90
|
-
|
|
91
|
-
headers={
|
|
90
|
+
content=b"grant_type=client_credentials",
|
|
91
|
+
headers={
|
|
92
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
93
|
+
"Authorization": f"Basic {encoded_credentials}",
|
|
94
|
+
},
|
|
92
95
|
)
|
|
93
96
|
|
|
94
97
|
def token_is_expired(self) -> bool:
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from typing import Any
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from typing_extensions import override
|
|
5
|
+
|
|
6
|
+
import pydantic
|
|
7
|
+
|
|
8
|
+
from .._compat import model_dump
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def openapi_dumps(obj: Any) -> bytes:
|
|
12
|
+
"""
|
|
13
|
+
Serialize an object to UTF-8 encoded JSON bytes.
|
|
14
|
+
|
|
15
|
+
Extends the standard json.dumps with support for additional types
|
|
16
|
+
commonly used in the SDK, such as `datetime`, `pydantic.BaseModel`, etc.
|
|
17
|
+
"""
|
|
18
|
+
return json.dumps(
|
|
19
|
+
obj,
|
|
20
|
+
cls=_CustomEncoder,
|
|
21
|
+
# Uses the same defaults as httpx's JSON serialization
|
|
22
|
+
ensure_ascii=False,
|
|
23
|
+
separators=(",", ":"),
|
|
24
|
+
allow_nan=False,
|
|
25
|
+
).encode()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class _CustomEncoder(json.JSONEncoder):
|
|
29
|
+
@override
|
|
30
|
+
def default(self, o: Any) -> Any:
|
|
31
|
+
if isinstance(o, datetime):
|
|
32
|
+
return o.isoformat()
|
|
33
|
+
if isinstance(o, pydantic.BaseModel):
|
|
34
|
+
return model_dump(o, exclude_unset=True, mode="json", by_alias=True)
|
|
35
|
+
return super().default(o)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Custom extensions for HiddenLayer SDK
|
|
2
|
-
|
|
3
2
|
from .model_scan import ModelScanner, AsyncModelScanner
|
|
4
3
|
from .community_scan import CommunityScanner, CommunityScanSource, AsyncCommunityScanner
|
|
4
|
+
from .evaluation_sessions import EvaluationSessionsResource, AsyncEvaluationSessionsResource
|
|
5
5
|
|
|
6
6
|
__all__ = [
|
|
7
7
|
"CommunityScanner",
|
|
@@ -9,4 +9,6 @@ __all__ = [
|
|
|
9
9
|
"ModelScanner",
|
|
10
10
|
"AsyncModelScanner",
|
|
11
11
|
"CommunityScanSource",
|
|
12
|
+
"EvaluationSessionsResource",
|
|
13
|
+
"AsyncEvaluationSessionsResource",
|
|
12
14
|
]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from .._compat import cached_property
|
|
4
|
+
from .._resource import SyncAPIResource, AsyncAPIResource
|
|
5
|
+
from .red_team_session import RedTeamSessionsResource, AsyncRedTeamSessionsResource
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
class EvaluationSessionsResource(SyncAPIResource):
|
|
10
|
+
@cached_property
|
|
11
|
+
def red_team(self) -> RedTeamSessionsResource:
|
|
12
|
+
return RedTeamSessionsResource(client=self._client)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AsyncEvaluationSessionsResource(AsyncAPIResource):
|
|
16
|
+
@cached_property
|
|
17
|
+
def red_team(self) -> AsyncRedTeamSessionsResource:
|
|
18
|
+
return AsyncRedTeamSessionsResource(client=self._client)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Exception classes for HiddenLayer AI Red Team SDK."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class RedTeamSessionError(Exception):
|
|
5
|
+
"""Base exception for red team session errors."""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PollTimeoutError(RedTeamSessionError):
|
|
9
|
+
"""Raised when polling times out."""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class WorkflowNotFoundError(RedTeamSessionError):
|
|
13
|
+
"""Raised when workflow is not found."""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class InvalidSessionError(RedTeamSessionError):
|
|
17
|
+
"""Raised when session ID is invalid."""
|