hiddenlayer-sdk 3.8.0__tar.gz → 3.9.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.9.0/.release-please-manifest.json +3 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/CHANGELOG.md +27 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/PKG-INFO +1 -1
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/pyproject.toml +1 -1
- hiddenlayer_sdk-3.9.0/release-please-config.json +24 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_version.py +1 -1
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/_beta.py +17 -7
- hiddenlayer_sdk-3.9.0/src/hiddenlayer/lib/_beta_endpoints.py +22 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/models/cards.py +29 -10
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/runtime.py +4 -20
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/interaction_analyze_params.py +5 -1
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/job_list_response.py +23 -1
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/scan_report.py +15 -0
- hiddenlayer_sdk-3.9.0/tests/api_resources/models/test_cards.py +152 -0
- hiddenlayer_sdk-3.9.0/tests/test_beta.py +73 -0
- hiddenlayer_sdk-3.8.0/.release-please-manifest.json +0 -3
- hiddenlayer_sdk-3.8.0/release-please-config.json +0 -66
- hiddenlayer_sdk-3.8.0/src/hiddenlayer/lib/_beta_endpoints.py +0 -13
- hiddenlayer_sdk-3.8.0/tests/api_resources/models/test_cards.py +0 -138
- hiddenlayer_sdk-3.8.0/tests/test_beta.py +0 -62
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/.gitignore +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/CODE_OF_CONDUCT.md +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/CONTRIBUTING.md +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/LICENSE +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/README.md +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/SECURITY.md +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/api.md +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/bin/check-release-environment +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/bin/publish-jfrog +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/bin/publish-pypi +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/.keep +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/demo.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/README.md +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_http_api.ipynb +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_openai.ipynb +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_playwright.ipynb +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_static_prompts.ipynb +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_template.ipynb +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_webhook.ipynb +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_websocket.ipynb +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/noxfile.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/requirements-dev.lock +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/requirements.lock +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_base_client.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_client.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_compat.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_constants.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_exceptions.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_files.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_models.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_oauth2.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_qs.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_resource.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_streaming.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_types.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_compat.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_datetime_parse.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_json.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_logs.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_path.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_proxy.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_reflection.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_resources_proxy.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_streams.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_sync.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_transform.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_typing.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_utils.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/.keep +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/community_scan.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/evaluation_sessions.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/model_scan.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/red_team_exceptions.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/red_team_session.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/scan_utils.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/pagination.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/py.typed +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/evaluations/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/evaluations/evaluations.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/evaluations/red_team.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/interactions.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/models/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/models/models.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/prompt_analyzer.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/jobs.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/results.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/scans.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/upload/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/upload/file.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/upload/upload.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/sensors.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_create_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_create_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_evaluation_results_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_next_action_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_status_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_submit_target_response_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_submit_target_response_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/interaction_analyze_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/model_retrieve_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/models/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/models/card_list_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/models/card_list_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/prompt_analyzer_create_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/prompt_analyzer_create_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_interaction_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_interaction_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_request_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_request_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_response_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_response_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/job_list_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/job_request_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/job_retrieve_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/result_sarif_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/scan_job.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload/file_add_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload/file_complete_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload_complete_all_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload_start_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload_start_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_create_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_create_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_query_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_query_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_retrieve_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_update_params.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_update_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/evaluations/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/evaluations/test_red_team.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/models/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/test_jobs.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/test_results.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/test_upload.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/upload/__init__.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/upload/test_file.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_interactions.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_models.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_prompt_analyzer.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_runtime.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_sensors.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/conftest.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/sample_file.txt +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_client.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_community_scan.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_extract_files.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_files.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_model_scan.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_models.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_qs.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_red_team_session.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_required_args.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_response.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_streaming.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_transform.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_json.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_path.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_proxy.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_typing.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/utils.py +0 -0
- {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/uv.lock +0 -0
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.9.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.8.0...v3.9.0) (2026-08-10)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **scans:** add MITRE Atlas tactic/technique pairs to scan summaries ([7bfb80e](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/7bfb80e6220e401e10b05c05e550d257196f5a3e))
|
|
9
|
+
* **assets:** expose v2 AI Asset Inventory API ([b4aa81e](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/b4aa81e2315da43dccd70f7a39b433f4eac52dbb))
|
|
10
|
+
* **assets:** scope integration_id to discovered relationships, add ASSIGNED_TO ([087ad00](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/087ad007a98147216dc481388c9462f12d40daf1))
|
|
11
|
+
* **runtime:** add effective_action_count, deprecate integration-limited counts ([3654047](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/365404768b647d0188e0bb544d403ceceb821670))
|
|
12
|
+
* **runtime:** qualify action concepts, deprecate unqualified names ([9c709ac](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/9c709ac2e071baa6978dc547498814da8d3e9fe1))
|
|
13
|
+
* **runtime:** remove beta label from v2 endpoints ([58f8cd5](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/58f8cd5b31a8f8768f9c0d3dd85c517a324c1f5f))
|
|
14
|
+
* **scans:** add file upload endpoints ([60fe7d4](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/60fe7d4f6d66e4c7d0d2a9cf5d95f8ce11736c6f))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **assets:** align relationship docs with merged server behavior ([977f0db](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/977f0db81c133696f5f689b1c324cfbc5d07c627))
|
|
20
|
+
* resolve unicode filename regression ([cc3026e](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/cc3026e5dcdeab2c75b7574bd59a3a8b1afc35cf))
|
|
21
|
+
* **types:** avoid type-checker errors on params with additional properties ([47f06d0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/47f06d054b14d89dae1e661286a86c431355b4f0))
|
|
22
|
+
* warn on beta endpoints with path parameters ([#208](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/issues/208)) ([b0af129](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/b0af12979805ecb7a18bbb843077d9b3c9257fe3))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Documentation
|
|
26
|
+
|
|
27
|
+
* define scope and length boundaries for endpoint descriptions ([3fd9115](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/3fd91157106804b07e535de2f6370cf61730b16c))
|
|
28
|
+
* **runtime:** document control action alongside policy outcome ([adcb019](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/adcb019c4ac5cf522bd37f9bb1105c13c508f563))
|
|
29
|
+
|
|
3
30
|
## 3.8.0 (2026-06-24)
|
|
4
31
|
|
|
5
32
|
Full Changelog: [v3.7.1...v3.8.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.7.1...v3.8.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: hiddenlayer-sdk
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.9.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
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"packages": {
|
|
3
|
+
".": {
|
|
4
|
+
"release-type": "python",
|
|
5
|
+
"extra-files": ["src/hiddenlayer/_version.py"]
|
|
6
|
+
}
|
|
7
|
+
},
|
|
8
|
+
"include-v-in-tag": true,
|
|
9
|
+
"include-component-in-tag": false,
|
|
10
|
+
"bump-minor-pre-major": true,
|
|
11
|
+
"changelog-sections": [
|
|
12
|
+
{"type": "feat", "section": "Features"},
|
|
13
|
+
{"type": "fix", "section": "Bug Fixes"},
|
|
14
|
+
{"type": "perf", "section": "Performance Improvements"},
|
|
15
|
+
{"type": "revert", "section": "Reverts"},
|
|
16
|
+
{"type": "docs", "section": "Documentation"},
|
|
17
|
+
{"type": "refactor", "section": "Refactors"},
|
|
18
|
+
{"type": "chore", "section": "Chores", "hidden": true},
|
|
19
|
+
{"type": "test", "section": "Tests", "hidden": true},
|
|
20
|
+
{"type": "ci", "section": "CI", "hidden": true},
|
|
21
|
+
{"type": "build", "section": "Build System", "hidden": true},
|
|
22
|
+
{"type": "style", "section": "Styles", "hidden": true}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -31,15 +31,25 @@ def warn_beta(qualified_name: str, *, stacklevel: int = 3) -> None:
|
|
|
31
31
|
def check_beta_endpoint(url: str) -> None:
|
|
32
32
|
"""Check whether *url* is a beta endpoint and emit a warning if so.
|
|
33
33
|
|
|
34
|
+
Matching is segment-based so that endpoints with path parameters (e.g.
|
|
35
|
+
"/evaluations/v1/red-team/{workflow_id}/status") are recognized even though
|
|
36
|
+
the runtime URL has the parameter value substituted in. A registry segment
|
|
37
|
+
of None is a wildcard that matches any single path segment.
|
|
38
|
+
|
|
34
39
|
Args:
|
|
35
40
|
url: The URL path for the request (e.g. "/detection/v2/request-evaluations").
|
|
36
41
|
"""
|
|
37
42
|
from ._beta_endpoints import BETA_ENDPOINTS
|
|
38
43
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
segments = [s for s in url.split("?", 1)[0].lstrip("/").split("/") if s]
|
|
45
|
+
|
|
46
|
+
for pattern, qualified_name in BETA_ENDPOINTS:
|
|
47
|
+
if len(pattern) != len(segments):
|
|
48
|
+
continue
|
|
49
|
+
if all(seg == actual for seg, actual in zip(pattern, segments) if seg is not None):
|
|
50
|
+
# Called from _prepare_options, which is deeper in the stack than
|
|
51
|
+
# a direct warn_beta call from a resource method. The higher
|
|
52
|
+
# stacklevel won't point at user code, but the message itself
|
|
53
|
+
# identifies the method.
|
|
54
|
+
warn_beta(qualified_name, stacklevel=4)
|
|
55
|
+
return
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Auto-generated registry of beta endpoints.
|
|
2
|
+
|
|
3
|
+
DO NOT EDIT -- regenerated by scripts/utils/generate-beta-endpoints.cjs
|
|
4
|
+
|
|
5
|
+
Each entry is a (path pattern, qualified method name) pair. A path pattern is a
|
|
6
|
+
tuple of segments where a string is a literal match and None is a wildcard that
|
|
7
|
+
matches any single path-parameter segment. Used for runtime beta warnings.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
BETA_ENDPOINTS: list[tuple[tuple[str | None, ...], str]] = [
|
|
13
|
+
(("detection", "v2", "interaction-evaluations"), "RuntimeResource.evaluate_interaction"),
|
|
14
|
+
(("detection", "v2", "request-evaluations"), "RuntimeResource.evaluate_request"),
|
|
15
|
+
(("detection", "v2", "response-evaluations"), "RuntimeResource.evaluate_response"),
|
|
16
|
+
(("evaluations", "v1", "jobs", None, "termination"), "RedTeamResource.terminate"),
|
|
17
|
+
(("evaluations", "v1", "red-team"), "RedTeamResource.create"),
|
|
18
|
+
(("evaluations", "v1", "red-team", None), "RedTeamResource.retrieve_evaluation_results"),
|
|
19
|
+
(("evaluations", "v1", "red-team", None, "next-action"), "RedTeamResource.retrieve_next_action"),
|
|
20
|
+
(("evaluations", "v1", "red-team", None, "status"), "RedTeamResource.retrieve_status"),
|
|
21
|
+
(("evaluations", "v1", "red-team", None, "target-response"), "RedTeamResource.submit_target_response"),
|
|
22
|
+
]
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import typing_extensions
|
|
5
6
|
from typing import List
|
|
6
7
|
from typing_extensions import Literal
|
|
7
8
|
|
|
@@ -45,6 +46,7 @@ class CardsResource(SyncAPIResource):
|
|
|
45
46
|
"""
|
|
46
47
|
return CardsResourceWithStreamingResponse(self)
|
|
47
48
|
|
|
49
|
+
@typing_extensions.deprecated("deprecated")
|
|
48
50
|
def list(
|
|
49
51
|
self,
|
|
50
52
|
*,
|
|
@@ -83,7 +85,11 @@ class CardsResource(SyncAPIResource):
|
|
|
83
85
|
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
|
84
86
|
) -> SyncOffsetPage[CardListResponse]:
|
|
85
87
|
"""
|
|
86
|
-
|
|
88
|
+
Deprecated in favor of `GET /asset-inventory/v2/assets`
|
|
89
|
+
(`asset_type[in]=MODEL`), which returns the same model-card data — scan
|
|
90
|
+
status/timing and findings from the `supply-chain` annotation — alongside the
|
|
91
|
+
rest of an asset's data, with matching filters (`model_id[eq]`,
|
|
92
|
+
`scan_started_at[gt/gte/lt/lte]`) and sorts (`model_name`, `scan_started_at`).
|
|
87
93
|
|
|
88
94
|
Args:
|
|
89
95
|
aidr_severity: Deprecated - use ModelCardAIDRThreatLevel(aidr_threat_level) instead
|
|
@@ -161,6 +167,7 @@ class AsyncCardsResource(AsyncAPIResource):
|
|
|
161
167
|
"""
|
|
162
168
|
return AsyncCardsResourceWithStreamingResponse(self)
|
|
163
169
|
|
|
170
|
+
@typing_extensions.deprecated("deprecated")
|
|
164
171
|
def list(
|
|
165
172
|
self,
|
|
166
173
|
*,
|
|
@@ -199,7 +206,11 @@ class AsyncCardsResource(AsyncAPIResource):
|
|
|
199
206
|
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
|
200
207
|
) -> AsyncPaginator[CardListResponse, AsyncOffsetPage[CardListResponse]]:
|
|
201
208
|
"""
|
|
202
|
-
|
|
209
|
+
Deprecated in favor of `GET /asset-inventory/v2/assets`
|
|
210
|
+
(`asset_type[in]=MODEL`), which returns the same model-card data — scan
|
|
211
|
+
status/timing and findings from the `supply-chain` annotation — alongside the
|
|
212
|
+
rest of an asset's data, with matching filters (`model_id[eq]`,
|
|
213
|
+
`scan_started_at[gt/gte/lt/lte]`) and sorts (`model_name`, `scan_started_at`).
|
|
203
214
|
|
|
204
215
|
Args:
|
|
205
216
|
aidr_severity: Deprecated - use ModelCardAIDRThreatLevel(aidr_threat_level) instead
|
|
@@ -261,8 +272,10 @@ class CardsResourceWithRawResponse:
|
|
|
261
272
|
def __init__(self, cards: CardsResource) -> None:
|
|
262
273
|
self._cards = cards
|
|
263
274
|
|
|
264
|
-
self.list =
|
|
265
|
-
|
|
275
|
+
self.list = ( # pyright: ignore[reportDeprecated]
|
|
276
|
+
to_raw_response_wrapper(
|
|
277
|
+
cards.list, # pyright: ignore[reportDeprecated],
|
|
278
|
+
)
|
|
266
279
|
)
|
|
267
280
|
|
|
268
281
|
|
|
@@ -270,8 +283,10 @@ class AsyncCardsResourceWithRawResponse:
|
|
|
270
283
|
def __init__(self, cards: AsyncCardsResource) -> None:
|
|
271
284
|
self._cards = cards
|
|
272
285
|
|
|
273
|
-
self.list =
|
|
274
|
-
|
|
286
|
+
self.list = ( # pyright: ignore[reportDeprecated]
|
|
287
|
+
async_to_raw_response_wrapper(
|
|
288
|
+
cards.list, # pyright: ignore[reportDeprecated],
|
|
289
|
+
)
|
|
275
290
|
)
|
|
276
291
|
|
|
277
292
|
|
|
@@ -279,8 +294,10 @@ class CardsResourceWithStreamingResponse:
|
|
|
279
294
|
def __init__(self, cards: CardsResource) -> None:
|
|
280
295
|
self._cards = cards
|
|
281
296
|
|
|
282
|
-
self.list =
|
|
283
|
-
|
|
297
|
+
self.list = ( # pyright: ignore[reportDeprecated]
|
|
298
|
+
to_streamed_response_wrapper(
|
|
299
|
+
cards.list, # pyright: ignore[reportDeprecated],
|
|
300
|
+
)
|
|
284
301
|
)
|
|
285
302
|
|
|
286
303
|
|
|
@@ -288,6 +305,8 @@ class AsyncCardsResourceWithStreamingResponse:
|
|
|
288
305
|
def __init__(self, cards: AsyncCardsResource) -> None:
|
|
289
306
|
self._cards = cards
|
|
290
307
|
|
|
291
|
-
self.list =
|
|
292
|
-
|
|
308
|
+
self.list = ( # pyright: ignore[reportDeprecated]
|
|
309
|
+
async_to_streamed_response_wrapper(
|
|
310
|
+
cards.list, # pyright: ignore[reportDeprecated],
|
|
311
|
+
)
|
|
293
312
|
)
|
|
@@ -62,11 +62,9 @@ class RuntimeResource(SyncAPIResource):
|
|
|
62
62
|
extra_body: Body | None = None,
|
|
63
63
|
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
|
64
64
|
) -> RuntimeEvaluateInteractionResponse:
|
|
65
|
-
"""
|
|
66
|
-
[BETA] This endpoint is not GA or Production ready and is subject to changes at
|
|
67
|
-
any time. Breaking changes may occur.
|
|
65
|
+
"""Performs synchronous security evaluation on an LLM **interaction**.
|
|
68
66
|
|
|
69
|
-
|
|
67
|
+
The
|
|
70
68
|
interaction can be a standalone user prompt, a standalone model response, a
|
|
71
69
|
partial exchange, or a long multi-turn message history. The endpoint imposes no
|
|
72
70
|
requirement that the messages form a complete request/response pair.
|
|
@@ -141,9 +139,6 @@ class RuntimeResource(SyncAPIResource):
|
|
|
141
139
|
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
|
142
140
|
) -> RuntimeEvaluateRequestResponse:
|
|
143
141
|
"""
|
|
144
|
-
[BETA] This endpoint is not GA or Production ready and is subject to changes at
|
|
145
|
-
any time. Breaking changes may occur.
|
|
146
|
-
|
|
147
142
|
Analyzes an LLM request payload for security threats before it is sent to the
|
|
148
143
|
model.
|
|
149
144
|
|
|
@@ -207,9 +202,6 @@ class RuntimeResource(SyncAPIResource):
|
|
|
207
202
|
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
|
208
203
|
) -> RuntimeEvaluateResponseResponse:
|
|
209
204
|
"""
|
|
210
|
-
[BETA] This endpoint is not GA or Production ready and is subject to changes at
|
|
211
|
-
any time. Breaking changes may occur.
|
|
212
|
-
|
|
213
205
|
Analyzes an LLM response payload for security threats after it is received from
|
|
214
206
|
the model.
|
|
215
207
|
|
|
@@ -293,11 +285,9 @@ class AsyncRuntimeResource(AsyncAPIResource):
|
|
|
293
285
|
extra_body: Body | None = None,
|
|
294
286
|
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
|
295
287
|
) -> RuntimeEvaluateInteractionResponse:
|
|
296
|
-
"""
|
|
297
|
-
[BETA] This endpoint is not GA or Production ready and is subject to changes at
|
|
298
|
-
any time. Breaking changes may occur.
|
|
288
|
+
"""Performs synchronous security evaluation on an LLM **interaction**.
|
|
299
289
|
|
|
300
|
-
|
|
290
|
+
The
|
|
301
291
|
interaction can be a standalone user prompt, a standalone model response, a
|
|
302
292
|
partial exchange, or a long multi-turn message history. The endpoint imposes no
|
|
303
293
|
requirement that the messages form a complete request/response pair.
|
|
@@ -372,9 +362,6 @@ class AsyncRuntimeResource(AsyncAPIResource):
|
|
|
372
362
|
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
|
373
363
|
) -> RuntimeEvaluateRequestResponse:
|
|
374
364
|
"""
|
|
375
|
-
[BETA] This endpoint is not GA or Production ready and is subject to changes at
|
|
376
|
-
any time. Breaking changes may occur.
|
|
377
|
-
|
|
378
365
|
Analyzes an LLM request payload for security threats before it is sent to the
|
|
379
366
|
model.
|
|
380
367
|
|
|
@@ -438,9 +425,6 @@ class AsyncRuntimeResource(AsyncAPIResource):
|
|
|
438
425
|
timeout: float | httpx.Timeout | None | NotGiven = not_given,
|
|
439
426
|
) -> RuntimeEvaluateResponseResponse:
|
|
440
427
|
"""
|
|
441
|
-
[BETA] This endpoint is not GA or Production ready and is subject to changes at
|
|
442
|
-
any time. Breaking changes may occur.
|
|
443
|
-
|
|
444
428
|
Analyzes an LLM response payload for security threats after it is received from
|
|
445
429
|
the model.
|
|
446
430
|
|
{hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/interaction_analyze_params.py
RENAMED
|
@@ -39,7 +39,11 @@ class InputMessage(TypedDict, total=False):
|
|
|
39
39
|
"""The role of the message sender (e.g., user, assistant, system)."""
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
class Input(
|
|
42
|
+
class Input( # type: ignore[call-arg]
|
|
43
|
+
TypedDict,
|
|
44
|
+
total=False,
|
|
45
|
+
extra_items=object, # pyright: ignore[reportGeneralTypeIssues]
|
|
46
|
+
):
|
|
43
47
|
messages: Iterable[InputMessage]
|
|
44
48
|
"""The list of messages as input to a language model."""
|
|
45
49
|
|
{hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/job_list_response.py
RENAMED
|
@@ -9,7 +9,15 @@ from pydantic import Field as FieldInfo
|
|
|
9
9
|
from ..._compat import PYDANTIC_V1, ConfigDict
|
|
10
10
|
from ..._models import BaseModel
|
|
11
11
|
|
|
12
|
-
__all__ = [
|
|
12
|
+
__all__ = [
|
|
13
|
+
"JobListResponse",
|
|
14
|
+
"Item",
|
|
15
|
+
"ItemInventory",
|
|
16
|
+
"ItemInventoryProviderDetails",
|
|
17
|
+
"ItemSummary",
|
|
18
|
+
"ItemSummaryMitreAtlas",
|
|
19
|
+
"ItemCompliance",
|
|
20
|
+
]
|
|
13
21
|
|
|
14
22
|
|
|
15
23
|
class ItemInventoryProviderDetails(BaseModel):
|
|
@@ -88,6 +96,14 @@ class ItemInventory(BaseModel):
|
|
|
88
96
|
model_config = ConfigDict(protected_namespaces=tuple())
|
|
89
97
|
|
|
90
98
|
|
|
99
|
+
class ItemSummaryMitreAtlas(BaseModel):
|
|
100
|
+
tactic: Optional[str] = None
|
|
101
|
+
"""MITRE Atlas Tactic"""
|
|
102
|
+
|
|
103
|
+
technique: Optional[str] = None
|
|
104
|
+
"""MITRE Atlas Technique"""
|
|
105
|
+
|
|
106
|
+
|
|
91
107
|
class ItemSummary(BaseModel):
|
|
92
108
|
advisory_categories: Optional[List[str]] = None
|
|
93
109
|
"""list of unique advisory categories found"""
|
|
@@ -113,6 +129,12 @@ class ItemSummary(BaseModel):
|
|
|
113
129
|
highest_severity: Optional[Literal["critical", "high", "medium", "low", "none", "unknown"]] = None
|
|
114
130
|
"""The highest severity of any detections on the scan."""
|
|
115
131
|
|
|
132
|
+
mitre_atlas: Optional[List[ItemSummaryMitreAtlas]] = None
|
|
133
|
+
"""
|
|
134
|
+
deduped list of MITRE Atlas tactic/technique pairs across all detections in the
|
|
135
|
+
scan
|
|
136
|
+
"""
|
|
137
|
+
|
|
116
138
|
severity: Optional[Literal["critical", "high", "medium", "low", "unknown", "safe"]] = None
|
|
117
139
|
"""The highest severity of any detections on the scan, including "safe".
|
|
118
140
|
|
|
@@ -14,6 +14,7 @@ __all__ = [
|
|
|
14
14
|
"Inventory",
|
|
15
15
|
"InventoryProviderDetails",
|
|
16
16
|
"Summary",
|
|
17
|
+
"SummaryMitreAtlas",
|
|
17
18
|
"Compliance",
|
|
18
19
|
"FileResult",
|
|
19
20
|
"FileResultDetails",
|
|
@@ -108,6 +109,14 @@ class Inventory(BaseModel):
|
|
|
108
109
|
model_config = ConfigDict(protected_namespaces=tuple())
|
|
109
110
|
|
|
110
111
|
|
|
112
|
+
class SummaryMitreAtlas(BaseModel):
|
|
113
|
+
tactic: Optional[str] = None
|
|
114
|
+
"""MITRE Atlas Tactic"""
|
|
115
|
+
|
|
116
|
+
technique: Optional[str] = None
|
|
117
|
+
"""MITRE Atlas Technique"""
|
|
118
|
+
|
|
119
|
+
|
|
111
120
|
class Summary(BaseModel):
|
|
112
121
|
advisory_categories: Optional[List[str]] = None
|
|
113
122
|
"""list of unique advisory categories found"""
|
|
@@ -133,6 +142,12 @@ class Summary(BaseModel):
|
|
|
133
142
|
highest_severity: Optional[Literal["critical", "high", "medium", "low", "none", "unknown"]] = None
|
|
134
143
|
"""The highest severity of any detections on the scan."""
|
|
135
144
|
|
|
145
|
+
mitre_atlas: Optional[List[SummaryMitreAtlas]] = None
|
|
146
|
+
"""
|
|
147
|
+
deduped list of MITRE Atlas tactic/technique pairs across all detections in the
|
|
148
|
+
scan
|
|
149
|
+
"""
|
|
150
|
+
|
|
136
151
|
severity: Optional[Literal["critical", "high", "medium", "low", "unknown", "safe"]] = None
|
|
137
152
|
"""The highest severity of any detections on the scan, including "safe".
|
|
138
153
|
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from typing import Any, cast
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
from hiddenlayer import HiddenLayer, AsyncHiddenLayer
|
|
11
|
+
from tests.utils import assert_matches_type
|
|
12
|
+
from hiddenlayer._utils import parse_datetime
|
|
13
|
+
from hiddenlayer.pagination import SyncOffsetPage, AsyncOffsetPage
|
|
14
|
+
from hiddenlayer.types.models import CardListResponse
|
|
15
|
+
|
|
16
|
+
# pyright: reportDeprecated=false
|
|
17
|
+
|
|
18
|
+
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TestCards:
|
|
22
|
+
parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
|
|
23
|
+
|
|
24
|
+
@pytest.mark.skip(reason="Mock server tests are disabled")
|
|
25
|
+
@parametrize
|
|
26
|
+
def test_method_list(self, client: HiddenLayer) -> None:
|
|
27
|
+
with pytest.warns(DeprecationWarning):
|
|
28
|
+
card = client.models.cards.list()
|
|
29
|
+
|
|
30
|
+
assert_matches_type(SyncOffsetPage[CardListResponse], card, path=["response"])
|
|
31
|
+
|
|
32
|
+
@pytest.mark.skip(reason="Mock server tests are disabled")
|
|
33
|
+
@parametrize
|
|
34
|
+
def test_method_list_with_all_params(self, client: HiddenLayer) -> None:
|
|
35
|
+
with pytest.warns(DeprecationWarning):
|
|
36
|
+
card = client.models.cards.list(
|
|
37
|
+
aidr_severity=["SAFE"],
|
|
38
|
+
aidr_status="ENABLED",
|
|
39
|
+
limit=50,
|
|
40
|
+
model_created={
|
|
41
|
+
"gte": parse_datetime("2019-12-27T18:11:19.117Z"),
|
|
42
|
+
"lte": parse_datetime("2019-12-27T18:11:19.117Z"),
|
|
43
|
+
},
|
|
44
|
+
model_name={
|
|
45
|
+
"contains": "contains",
|
|
46
|
+
"eq": "eq",
|
|
47
|
+
},
|
|
48
|
+
modscan_severity=["SAFE"],
|
|
49
|
+
modscan_status="ENABLED",
|
|
50
|
+
offset=250,
|
|
51
|
+
policy_status=["COMPLIANT"],
|
|
52
|
+
provider=["AZURE"],
|
|
53
|
+
sort="-model_name",
|
|
54
|
+
source={
|
|
55
|
+
"contains": "contains",
|
|
56
|
+
"eq": "eq",
|
|
57
|
+
},
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
assert_matches_type(SyncOffsetPage[CardListResponse], card, path=["response"])
|
|
61
|
+
|
|
62
|
+
@pytest.mark.skip(reason="Mock server tests are disabled")
|
|
63
|
+
@parametrize
|
|
64
|
+
def test_raw_response_list(self, client: HiddenLayer) -> None:
|
|
65
|
+
with pytest.warns(DeprecationWarning):
|
|
66
|
+
response = client.models.cards.with_raw_response.list()
|
|
67
|
+
|
|
68
|
+
assert response.is_closed is True
|
|
69
|
+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
|
|
70
|
+
card = response.parse()
|
|
71
|
+
assert_matches_type(SyncOffsetPage[CardListResponse], card, path=["response"])
|
|
72
|
+
|
|
73
|
+
@pytest.mark.skip(reason="Mock server tests are disabled")
|
|
74
|
+
@parametrize
|
|
75
|
+
def test_streaming_response_list(self, client: HiddenLayer) -> None:
|
|
76
|
+
with pytest.warns(DeprecationWarning):
|
|
77
|
+
with client.models.cards.with_streaming_response.list() as response:
|
|
78
|
+
assert not response.is_closed
|
|
79
|
+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
|
|
80
|
+
|
|
81
|
+
card = response.parse()
|
|
82
|
+
assert_matches_type(SyncOffsetPage[CardListResponse], card, path=["response"])
|
|
83
|
+
|
|
84
|
+
assert cast(Any, response.is_closed) is True
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class TestAsyncCards:
|
|
88
|
+
parametrize = pytest.mark.parametrize(
|
|
89
|
+
"async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
@pytest.mark.skip(reason="Mock server tests are disabled")
|
|
93
|
+
@parametrize
|
|
94
|
+
async def test_method_list(self, async_client: AsyncHiddenLayer) -> None:
|
|
95
|
+
with pytest.warns(DeprecationWarning):
|
|
96
|
+
card = await async_client.models.cards.list()
|
|
97
|
+
|
|
98
|
+
assert_matches_type(AsyncOffsetPage[CardListResponse], card, path=["response"])
|
|
99
|
+
|
|
100
|
+
@pytest.mark.skip(reason="Mock server tests are disabled")
|
|
101
|
+
@parametrize
|
|
102
|
+
async def test_method_list_with_all_params(self, async_client: AsyncHiddenLayer) -> None:
|
|
103
|
+
with pytest.warns(DeprecationWarning):
|
|
104
|
+
card = await async_client.models.cards.list(
|
|
105
|
+
aidr_severity=["SAFE"],
|
|
106
|
+
aidr_status="ENABLED",
|
|
107
|
+
limit=50,
|
|
108
|
+
model_created={
|
|
109
|
+
"gte": parse_datetime("2019-12-27T18:11:19.117Z"),
|
|
110
|
+
"lte": parse_datetime("2019-12-27T18:11:19.117Z"),
|
|
111
|
+
},
|
|
112
|
+
model_name={
|
|
113
|
+
"contains": "contains",
|
|
114
|
+
"eq": "eq",
|
|
115
|
+
},
|
|
116
|
+
modscan_severity=["SAFE"],
|
|
117
|
+
modscan_status="ENABLED",
|
|
118
|
+
offset=250,
|
|
119
|
+
policy_status=["COMPLIANT"],
|
|
120
|
+
provider=["AZURE"],
|
|
121
|
+
sort="-model_name",
|
|
122
|
+
source={
|
|
123
|
+
"contains": "contains",
|
|
124
|
+
"eq": "eq",
|
|
125
|
+
},
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
assert_matches_type(AsyncOffsetPage[CardListResponse], card, path=["response"])
|
|
129
|
+
|
|
130
|
+
@pytest.mark.skip(reason="Mock server tests are disabled")
|
|
131
|
+
@parametrize
|
|
132
|
+
async def test_raw_response_list(self, async_client: AsyncHiddenLayer) -> None:
|
|
133
|
+
with pytest.warns(DeprecationWarning):
|
|
134
|
+
response = await async_client.models.cards.with_raw_response.list()
|
|
135
|
+
|
|
136
|
+
assert response.is_closed is True
|
|
137
|
+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
|
|
138
|
+
card = await response.parse()
|
|
139
|
+
assert_matches_type(AsyncOffsetPage[CardListResponse], card, path=["response"])
|
|
140
|
+
|
|
141
|
+
@pytest.mark.skip(reason="Mock server tests are disabled")
|
|
142
|
+
@parametrize
|
|
143
|
+
async def test_streaming_response_list(self, async_client: AsyncHiddenLayer) -> None:
|
|
144
|
+
with pytest.warns(DeprecationWarning):
|
|
145
|
+
async with async_client.models.cards.with_streaming_response.list() as response:
|
|
146
|
+
assert not response.is_closed
|
|
147
|
+
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
|
|
148
|
+
|
|
149
|
+
card = await response.parse()
|
|
150
|
+
assert_matches_type(AsyncOffsetPage[CardListResponse], card, path=["response"])
|
|
151
|
+
|
|
152
|
+
assert cast(Any, response.is_closed) is True
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import warnings
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from hiddenlayer.lib._beta import BetaWarning, warn_beta, check_beta_endpoint
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TestWarnBeta:
|
|
11
|
+
def test_emits_warning_on_call(self) -> None:
|
|
12
|
+
with pytest.warns(BetaWarning, match=r"\[BETA\] Foo\.firstCall"):
|
|
13
|
+
warn_beta("Foo.firstCall")
|
|
14
|
+
|
|
15
|
+
def test_warning_message_format(self) -> None:
|
|
16
|
+
with pytest.warns(BetaWarning) as record:
|
|
17
|
+
warn_beta("Bar.analyze")
|
|
18
|
+
|
|
19
|
+
assert len(record) == 1
|
|
20
|
+
assert "[BETA] Bar.analyze" in str(record[0].message)
|
|
21
|
+
assert "not GA or Production ready" in str(record[0].message)
|
|
22
|
+
assert "Breaking changes may occur" in str(record[0].message)
|
|
23
|
+
|
|
24
|
+
def test_warning_category_is_beta(self) -> None:
|
|
25
|
+
with warnings.catch_warnings(record=True) as caught:
|
|
26
|
+
warnings.simplefilter("always")
|
|
27
|
+
warn_beta("Baz.create")
|
|
28
|
+
|
|
29
|
+
assert len(caught) == 1
|
|
30
|
+
assert issubclass(caught[0].category, BetaWarning)
|
|
31
|
+
assert issubclass(caught[0].category, UserWarning)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TestCheckBetaEndpoint:
|
|
35
|
+
def test_static_beta_url_fires_warning(self) -> None:
|
|
36
|
+
with pytest.warns(BetaWarning, match=r"\[BETA\] RuntimeResource\.evaluate_request"):
|
|
37
|
+
check_beta_endpoint("/detection/v2/request-evaluations")
|
|
38
|
+
|
|
39
|
+
def test_dynamic_beta_url_fires_warning(self) -> None:
|
|
40
|
+
with pytest.warns(BetaWarning, match=r"\[BETA\] RedTeamResource\.retrieve_status"):
|
|
41
|
+
check_beta_endpoint("/evaluations/v1/red-team/abc123/status")
|
|
42
|
+
|
|
43
|
+
def test_dynamic_single_param_url_fires_warning(self) -> None:
|
|
44
|
+
with pytest.warns(BetaWarning, match=r"\[BETA\] RedTeamResource\.retrieve_evaluation_results"):
|
|
45
|
+
check_beta_endpoint("/evaluations/v1/red-team/abc123")
|
|
46
|
+
|
|
47
|
+
def test_query_string_is_ignored(self) -> None:
|
|
48
|
+
with pytest.warns(BetaWarning, match=r"\[BETA\] RuntimeResource\.evaluate_request"):
|
|
49
|
+
check_beta_endpoint("/detection/v2/request-evaluations?foo=bar")
|
|
50
|
+
|
|
51
|
+
def test_non_beta_url_no_warning(self) -> None:
|
|
52
|
+
with warnings.catch_warnings(record=True) as caught:
|
|
53
|
+
warnings.simplefilter("always")
|
|
54
|
+
check_beta_endpoint("/models/v2/scan")
|
|
55
|
+
|
|
56
|
+
beta_warnings = [w for w in caught if issubclass(w.category, BetaWarning)]
|
|
57
|
+
assert len(beta_warnings) == 0
|
|
58
|
+
|
|
59
|
+
def test_literal_segment_mismatch_no_warning(self) -> None:
|
|
60
|
+
with warnings.catch_warnings(record=True) as caught:
|
|
61
|
+
warnings.simplefilter("always")
|
|
62
|
+
check_beta_endpoint("/evaluations/v1/red-team/abc123/not-a-real-action")
|
|
63
|
+
|
|
64
|
+
beta_warnings = [w for w in caught if issubclass(w.category, BetaWarning)]
|
|
65
|
+
assert len(beta_warnings) == 0
|
|
66
|
+
|
|
67
|
+
def test_segment_count_mismatch_no_warning(self) -> None:
|
|
68
|
+
with warnings.catch_warnings(record=True) as caught:
|
|
69
|
+
warnings.simplefilter("always")
|
|
70
|
+
check_beta_endpoint("/evaluations/v1/red-team/abc123/status/extra")
|
|
71
|
+
|
|
72
|
+
beta_warnings = [w for w in caught if issubclass(w.category, BetaWarning)]
|
|
73
|
+
assert len(beta_warnings) == 0
|