hiddenlayer-sdk 3.3.0__tar.gz → 3.5.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 (150) hide show
  1. hiddenlayer_sdk-3.5.0/.release-please-manifest.json +3 -0
  2. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/CHANGELOG.md +48 -0
  3. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/CONTRIBUTING.md +0 -7
  4. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/PKG-INFO +1 -1
  5. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/api.md +92 -0
  6. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/pyproject.toml +2 -2
  7. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/requirements-dev.lock +10 -10
  8. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/requirements.lock +4 -4
  9. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_client.py +2 -2
  10. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_oauth2.py +5 -2
  11. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_response.py +3 -0
  12. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_streaming.py +8 -3
  13. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_compat.py +1 -1
  14. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_version.py +1 -1
  15. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/lib/red_team_session.py +17 -35
  16. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/models/cards.py +4 -0
  17. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/scans/upload/file.py +20 -9
  18. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/models/card_list_params.py +2 -0
  19. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/models/card_list_response.py +14 -0
  20. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/job_list_response.py +6 -0
  21. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/job_request_params.py +6 -0
  22. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/scan_job.py +6 -0
  23. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/scan_report.py +56 -0
  24. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/evaluations/test_red_team.py +48 -48
  25. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/models/test_cards.py +10 -8
  26. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/scans/test_jobs.py +28 -26
  27. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/scans/test_results.py +8 -8
  28. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/scans/test_upload.py +16 -16
  29. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/scans/upload/test_file.py +36 -22
  30. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/test_interactions.py +8 -8
  31. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/test_models.py +16 -16
  32. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/test_prompt_analyzer.py +8 -8
  33. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/test_sensors.py +42 -42
  34. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_client.py +16 -0
  35. hiddenlayer_sdk-3.3.0/.release-please-manifest.json +0 -3
  36. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/.gitignore +0 -0
  37. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/CODE_OF_CONDUCT.md +0 -0
  38. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/LICENSE +0 -0
  39. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/README.md +0 -0
  40. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/SECURITY.md +0 -0
  41. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/bin/check-release-environment +0 -0
  42. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/bin/publish-jfrog +0 -0
  43. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/bin/publish-pypi +0 -0
  44. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/examples/.keep +0 -0
  45. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/examples/demo.py +0 -0
  46. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/noxfile.py +0 -0
  47. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/release-please-config.json +0 -0
  48. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/__init__.py +0 -0
  49. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_base_client.py +0 -0
  50. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_compat.py +0 -0
  51. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_constants.py +0 -0
  52. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_exceptions.py +0 -0
  53. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_files.py +0 -0
  54. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_models.py +0 -0
  55. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_qs.py +0 -0
  56. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_resource.py +0 -0
  57. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_types.py +0 -0
  58. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/__init__.py +0 -0
  59. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_datetime_parse.py +0 -0
  60. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_json.py +0 -0
  61. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_logs.py +0 -0
  62. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_proxy.py +0 -0
  63. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_reflection.py +0 -0
  64. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_resources_proxy.py +0 -0
  65. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_streams.py +0 -0
  66. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_sync.py +0 -0
  67. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_transform.py +0 -0
  68. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_typing.py +0 -0
  69. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/_utils/_utils.py +0 -0
  70. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/lib/.keep +0 -0
  71. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/lib/__init__.py +0 -0
  72. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/lib/community_scan.py +0 -0
  73. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/lib/evaluation_sessions.py +0 -0
  74. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/lib/model_scan.py +0 -0
  75. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/lib/red_team_exceptions.py +0 -0
  76. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/lib/scan_utils.py +0 -0
  77. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/pagination.py +0 -0
  78. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/py.typed +0 -0
  79. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/__init__.py +0 -0
  80. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/evaluations/__init__.py +0 -0
  81. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/evaluations/evaluations.py +0 -0
  82. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/evaluations/red_team.py +0 -0
  83. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/interactions.py +0 -0
  84. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/models/__init__.py +0 -0
  85. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/models/models.py +0 -0
  86. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/prompt_analyzer.py +0 -0
  87. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/scans/__init__.py +0 -0
  88. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/scans/jobs.py +0 -0
  89. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/scans/results.py +0 -0
  90. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/scans/scans.py +0 -0
  91. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/scans/upload/__init__.py +0 -0
  92. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/scans/upload/upload.py +0 -0
  93. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/resources/sensors.py +0 -0
  94. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/__init__.py +0 -0
  95. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/evaluations/__init__.py +0 -0
  96. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/evaluations/red_team_create_params.py +0 -0
  97. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/evaluations/red_team_create_response.py +0 -0
  98. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_evaluation_results_response.py +0 -0
  99. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_next_action_response.py +0 -0
  100. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_status_response.py +0 -0
  101. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/evaluations/red_team_submit_target_response_params.py +0 -0
  102. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/evaluations/red_team_submit_target_response_response.py +0 -0
  103. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/interaction_analyze_params.py +0 -0
  104. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/interaction_analyze_response.py +0 -0
  105. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/model_retrieve_response.py +0 -0
  106. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/models/__init__.py +0 -0
  107. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/prompt_analyzer_create_params.py +0 -0
  108. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/prompt_analyzer_create_response.py +0 -0
  109. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/__init__.py +0 -0
  110. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/job_list_params.py +0 -0
  111. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/job_retrieve_params.py +0 -0
  112. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/result_sarif_response.py +0 -0
  113. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/upload/__init__.py +0 -0
  114. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/upload/file_add_response.py +0 -0
  115. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/upload/file_complete_response.py +0 -0
  116. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/upload_complete_all_response.py +0 -0
  117. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/upload_start_params.py +0 -0
  118. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/scans/upload_start_response.py +0 -0
  119. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/sensor_create_params.py +0 -0
  120. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/sensor_create_response.py +0 -0
  121. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/sensor_query_params.py +0 -0
  122. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/sensor_query_response.py +0 -0
  123. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/sensor_retrieve_response.py +0 -0
  124. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/sensor_update_params.py +0 -0
  125. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/src/hiddenlayer/types/sensor_update_response.py +0 -0
  126. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/__init__.py +0 -0
  127. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/__init__.py +0 -0
  128. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/evaluations/__init__.py +0 -0
  129. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/models/__init__.py +0 -0
  130. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/scans/__init__.py +0 -0
  131. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/api_resources/scans/upload/__init__.py +0 -0
  132. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/conftest.py +0 -0
  133. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/sample_file.txt +0 -0
  134. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_community_scan.py +0 -0
  135. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_deepcopy.py +0 -0
  136. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_extract_files.py +0 -0
  137. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_files.py +0 -0
  138. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_model_scan.py +0 -0
  139. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_models.py +0 -0
  140. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_qs.py +0 -0
  141. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_red_team_session.py +0 -0
  142. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_required_args.py +0 -0
  143. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_response.py +0 -0
  144. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_streaming.py +0 -0
  145. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_transform.py +0 -0
  146. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_utils/test_datetime_parse.py +0 -0
  147. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_utils/test_json.py +0 -0
  148. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_utils/test_proxy.py +0 -0
  149. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/test_utils/test_typing.py +0 -0
  150. {hiddenlayer_sdk-3.3.0 → hiddenlayer_sdk-3.5.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "3.5.0"
3
+ }
@@ -1,5 +1,53 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.5.0 (2026-03-03)
4
+
5
+ Full Changelog: [v3.4.0...v3.5.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.4.0...v3.5.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([9eea54c](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/9eea54c2eb2727e95426a560d3df0835f7b7111c))
10
+ * **api:** api update ([f141896](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/f141896accb0dd56c58ee9d1cc4f81efd30d25d0))
11
+ * **api:** api update ([92f2618](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/92f26183853e9a3e540c10647520955e9d5908f0))
12
+ * **api:** api update ([16f2a69](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/16f2a6965558821b0a15448aa53b0feb49098b0c))
13
+ * **api:** api update ([b98638e](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/b98638ef2650e5f5562fc04d7a441005a10d4486))
14
+ * **api:** api update ([f08f968](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/f08f968be5fe2be22924a77d7ccf61c65e6f1ccb))
15
+
16
+
17
+ ### Chores
18
+
19
+ * **internal:** add request options to SSE classes ([33b7597](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/33b7597bc7a36847f70dc26ebc2dfcccd6a3d15c))
20
+ * **internal:** make `test_proxy_environment_variables` more resilient ([5d82965](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/5d82965da2550879002ffacc2b116ae9e241de3f))
21
+ * **internal:** make `test_proxy_environment_variables` more resilient to env ([31ee619](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/31ee61956ce172605b9fe9a386b4123fca590b78))
22
+ * **internal:** remove mock server code ([9579dbc](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/9579dbc6e8d484a84b628c2513b8d5cc12bfc19b))
23
+ * update mock server docs ([5af4adc](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/5af4adc0dba02208929639010a9513da98d45339))
24
+
25
+
26
+ ### Documentation
27
+
28
+ * add RedTeamSessions to API reference ([#176](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/issues/176)) ([587ac08](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/587ac0868a82a6a25dc02a9639edd159fe2cb7e2))
29
+
30
+ ## 3.4.0 (2026-02-14)
31
+
32
+ Full Changelog: [v3.3.0...v3.4.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.3.0...v3.4.0)
33
+
34
+ ### Features
35
+
36
+ * **api:** api update ([a1c0278](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/a1c0278363b3be694895f157bab4da233de753bb))
37
+ * **api:** api update ([4b1ef5b](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/4b1ef5b5c16dd67e5a7756acf871acae5f11512a))
38
+
39
+
40
+ ### Bug Fixes
41
+
42
+ * **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))
43
+
44
+
45
+ ### Chores
46
+
47
+ * format all `api.md` files ([829c616](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/829c616b17455c59641976e0c29702dfbba50e8e))
48
+ * **internal:** bump dependencies ([bfb6489](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/bfb6489bb4b627f40fcf62c8ff06bd5946882b5b))
49
+ * **internal:** fix lint error on Python 3.14 ([e83496c](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/e83496cc463b59eabd0e415d657fed751365b9f4))
50
+
3
51
  ## 3.3.0 (2026-02-04)
4
52
 
5
53
  Full Changelog: [v3.2.2...v3.3.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.2.2...v3.3.0)
@@ -85,13 +85,6 @@ $ pip install ./path-to-wheel-file.whl
85
85
 
86
86
  ## Running tests
87
87
 
88
- Most tests require you to [set up a mock server](https://github.com/stoplightio/prism) against the OpenAPI spec to run the tests.
89
-
90
- ```sh
91
- # you will need npm installed
92
- $ npx prism mock path/to/your/openapi.yml
93
- ```
94
-
95
88
  ```sh
96
89
  $ ./scripts/test
97
90
  ```
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: hiddenlayer-sdk
3
- Version: 3.3.0
3
+ Version: 3.5.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
@@ -203,6 +203,98 @@ CommunityScanSource.GOOGLE_OAUTH = "GOOGLE_OAUTH"
203
203
  CommunityScanSource.HUGGING_FACE = "HUGGING_FACE"
204
204
  ```
205
205
 
206
+ ## RedTeamSessions
207
+
208
+ High-level session management for red team evaluations. Wraps the low-level `client.evaluations.red_team.*` API into a stateful session abstraction with polling, iteration, and callback-driven execution.
209
+
210
+ ```python
211
+ from hiddenlayer.lib import EvaluationSessionsResource, AsyncEvaluationSessionsResource
212
+ from hiddenlayer.lib.red_team_exceptions import (
213
+ RedTeamSessionError,
214
+ PollTimeoutError,
215
+ WorkflowNotFoundError,
216
+ InvalidSessionError,
217
+ )
218
+ ```
219
+
220
+ ### Session Manager
221
+
222
+ Accessed via `client.evaluation_sessions.red_team`.
223
+
224
+ Methods:
225
+
226
+ - **start_session(name, target_model, target_system_prompt="", max_turns=3, execution_strategy_type="random", attacker_max_generation_attempts=2, n_random_techniques=1, max_parallel_techniques=1, prompt_set_id="", hiddenlayer_project_id=None, poll_interval=2.0, poll_max_wait=None, sessions_per_technique=1) -> RedTeamSession**
227
+ Start a new red team session. Returns a `RedTeamSession` (sync) or `AsyncRedTeamSession` (async).
228
+ Uses adaptive multi-objective evaluation: each session runs to `max_turns` (no short-circuit),
229
+ tests all objectives, and maintains cross-session state for adaptive attacks.
230
+ `sessions_per_technique` controls how many sessions run per technique (default 1).
231
+
232
+ - **resume_session(workflow_id, poll_interval=2.0, poll_max_wait=None, max_parallel_techniques=None) -> RedTeamSession**
233
+ Reconnect to a previously started workflow by its ID.
234
+
235
+ - **terminate_session(workflow_id) -> None**
236
+ Stop a running workflow.
237
+
238
+ ### Session Object
239
+
240
+ Returned by `start_session()` and `resume_session()`. Available as `RedTeamSession` (sync) and `AsyncRedTeamSession` (async).
241
+
242
+ Properties:
243
+
244
+ - **workflow_id -> str**
245
+ The workflow ID for this session.
246
+
247
+ - **name -> str**
248
+ The session name.
249
+
250
+ Methods:
251
+
252
+ - **get_next_action(block=True) -> RedTeamRetrieveNextActionResponse**
253
+ Poll the server for the next action. When `block=True`, waits until an action is ready.
254
+
255
+ - **wait_for_completion(poll_interval=3.0, max_wait=300.0, verbose=False) -> None**
256
+ Poll status until the workflow reaches a terminal state (COMPLETED, FAILED, CANCELLED, TERMINATED, or TIMED_OUT). Automatically called by `run_with_callback()` and `run_with_callback_parallel()`.
257
+
258
+ - **iterate_actions() -> Iterator[RedTeamRetrieveNextActionResponse]**
259
+ Yield `attack_task` actions until the workflow completes or fails. Use with `for`/`async for`.
260
+
261
+ - **run_with_callback(handler) -> None**
262
+ Drive the full session sequentially. The handler receives `(attack_prompt, history, session_id, target_system_prompt)` and returns the target model's response string. Waits for workflow completion before returning.
263
+
264
+ ### Async-Only Session Methods
265
+
266
+ These methods are only available on `AsyncRedTeamSession`:
267
+
268
+ - **get_available_actions(max_actions=10) -> list[RedTeamRetrieveNextActionResponse]**
269
+ Non-blocking batch fetch of up to `max_actions` currently ready actions.
270
+
271
+ - **run_with_callback_parallel(handler, max_parallel=None, poll_batch_interval=0.5) -> None**
272
+ Drive the session with parallel action processing. When `max_parallel` is None, uses the `max_parallel_techniques` value from session config.
273
+
274
+ ### Exceptions
275
+
276
+ ```python
277
+ from hiddenlayer.lib.red_team_exceptions import (
278
+ RedTeamSessionError,
279
+ PollTimeoutError,
280
+ WorkflowNotFoundError,
281
+ InvalidSessionError,
282
+ )
283
+ ```
284
+
285
+ - **RedTeamSessionError** -- Base exception for red team session errors.
286
+ - **PollTimeoutError** -- Raised when polling exceeds `max_wait`.
287
+ - **WorkflowNotFoundError** -- Raised when a workflow ID does not exist (HTTP 404).
288
+ - **InvalidSessionError** -- Raised when a session ID is invalid during response submission (HTTP 400).
289
+
290
+ ### Execution Strategies
291
+
292
+ Available values for `start_session(execution_strategy_type=...)`:
293
+
294
+ - `"single"` -- Single technique execution
295
+ - `"random"` -- Random technique selection (default)
296
+ - `"static_prompt_set"` -- Static prompt set evaluation (requires `prompt_set_id`)
297
+
206
298
  # Client Usage
207
299
 
208
300
  ## Authentication Methods
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hiddenlayer-sdk"
3
- version = "3.3.0"
3
+ version = "3.5.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.2
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.0
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==2025.11.12
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.9
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.0
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.9.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.12.1
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.7
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.3.0
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.35.4
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.2
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.0
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==2025.11.12
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.9
48
+ httpx-aiohttp==0.1.12
49
49
  # via hiddenlayer-sdk
50
50
  idna==3.11
51
51
  # via anyio
@@ -233,7 +233,7 @@ class HiddenLayer(SyncAPIClient):
233
233
  return make_oauth2(
234
234
  client_id=self.client_id,
235
235
  client_secret=self.client_secret,
236
- token_url=self._prepare_url("/oauth2/token?grant_type=client_credentials"),
236
+ token_url=self._prepare_url("/oauth2/token"),
237
237
  header="Authorization",
238
238
  )
239
239
  return None
@@ -520,7 +520,7 @@ class AsyncHiddenLayer(AsyncAPIClient):
520
520
  return make_oauth2(
521
521
  client_id=self.client_id,
522
522
  client_secret=self.client_secret,
523
- token_url=self._prepare_url("/oauth2/token?grant_type=client_credentials"),
523
+ token_url=self._prepare_url("/oauth2/token"),
524
524
  header="Authorization",
525
525
  )
526
526
  return None
@@ -87,8 +87,11 @@ class OAuth2ClientCredentials(httpx.Auth):
87
87
  return httpx.Request(
88
88
  "POST",
89
89
  self._token_url,
90
- params={"grant_type": "client_credentials"},
91
- headers={"Authorization": f"Basic {encoded_credentials}"},
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:
@@ -152,6 +152,7 @@ class BaseAPIResponse(Generic[R]):
152
152
  ),
153
153
  response=self.http_response,
154
154
  client=cast(Any, self._client),
155
+ options=self._options,
155
156
  ),
156
157
  )
157
158
 
@@ -162,6 +163,7 @@ class BaseAPIResponse(Generic[R]):
162
163
  cast_to=extract_stream_chunk_type(self._stream_cls),
163
164
  response=self.http_response,
164
165
  client=cast(Any, self._client),
166
+ options=self._options,
165
167
  ),
166
168
  )
167
169
 
@@ -175,6 +177,7 @@ class BaseAPIResponse(Generic[R]):
175
177
  cast_to=cast_to,
176
178
  response=self.http_response,
177
179
  client=cast(Any, self._client),
180
+ options=self._options,
178
181
  ),
179
182
  )
180
183
 
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
  import json
5
5
  import inspect
6
6
  from types import TracebackType
7
- from typing import TYPE_CHECKING, Any, Generic, TypeVar, Iterator, AsyncIterator, cast
7
+ from typing import TYPE_CHECKING, Any, Generic, TypeVar, Iterator, Optional, AsyncIterator, cast
8
8
  from typing_extensions import Self, Protocol, TypeGuard, override, get_origin, runtime_checkable
9
9
 
10
10
  import httpx
@@ -13,6 +13,7 @@ from ._utils import extract_type_var_from_base
13
13
 
14
14
  if TYPE_CHECKING:
15
15
  from ._client import HiddenLayer, AsyncHiddenLayer
16
+ from ._models import FinalRequestOptions
16
17
 
17
18
 
18
19
  _T = TypeVar("_T")
@@ -22,7 +23,7 @@ class Stream(Generic[_T]):
22
23
  """Provides the core interface to iterate over a synchronous stream response."""
23
24
 
24
25
  response: httpx.Response
25
-
26
+ _options: Optional[FinalRequestOptions] = None
26
27
  _decoder: SSEBytesDecoder
27
28
 
28
29
  def __init__(
@@ -31,10 +32,12 @@ class Stream(Generic[_T]):
31
32
  cast_to: type[_T],
32
33
  response: httpx.Response,
33
34
  client: HiddenLayer,
35
+ options: Optional[FinalRequestOptions] = None,
34
36
  ) -> None:
35
37
  self.response = response
36
38
  self._cast_to = cast_to
37
39
  self._client = client
40
+ self._options = options
38
41
  self._decoder = client._make_sse_decoder()
39
42
  self._iterator = self.__stream__()
40
43
 
@@ -85,7 +88,7 @@ class AsyncStream(Generic[_T]):
85
88
  """Provides the core interface to iterate over an asynchronous stream response."""
86
89
 
87
90
  response: httpx.Response
88
-
91
+ _options: Optional[FinalRequestOptions] = None
89
92
  _decoder: SSEDecoder | SSEBytesDecoder
90
93
 
91
94
  def __init__(
@@ -94,10 +97,12 @@ class AsyncStream(Generic[_T]):
94
97
  cast_to: type[_T],
95
98
  response: httpx.Response,
96
99
  client: AsyncHiddenLayer,
100
+ options: Optional[FinalRequestOptions] = None,
97
101
  ) -> None:
98
102
  self.response = response
99
103
  self._cast_to = cast_to
100
104
  self._client = client
105
+ self._options = options
101
106
  self._decoder = client._make_sse_decoder()
102
107
  self._iterator = self.__stream__()
103
108
 
@@ -26,7 +26,7 @@ def is_union(tp: Optional[Type[Any]]) -> bool:
26
26
  else:
27
27
  import types
28
28
 
29
- return tp is Union or tp is types.UnionType
29
+ return tp is Union or tp is types.UnionType # type: ignore[comparison-overlap]
30
30
 
31
31
 
32
32
  def is_typeddict(tp: Type[Any]) -> bool:
@@ -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.3.0" # x-release-please-version
4
+ __version__ = "3.5.0" # x-release-please-version
@@ -253,23 +253,14 @@ class RedTeamSessionsResource(SyncAPIResource):
253
253
  ) -> RedTeamSession:
254
254
  """Start a new red team session.
255
255
 
256
- Supports two modes:
257
-
258
- V1 Mode (objective-specific with short-circuit):
259
- - Provide objective_ids (required)
260
- - Do not set sessions_per_technique
261
- - Each session tests one objective and short-circuits on success
262
-
263
- V2 Mode (objective-agnostic adaptive):
264
- - Set sessions_per_technique (e.g., 3)
265
- - objective_ids optional (defaults to all available)
266
- - Each session tests all objectives, runs to max_turns
267
- - Adaptive attacker with cross-session state
256
+ Uses adaptive multi-objective evaluation: each session runs to
257
+ max_turns (no short-circuit), tests all provided objectives, and
258
+ maintains cross-session state for adaptive attacks.
268
259
 
269
260
  Args:
270
261
  name: Session name
271
- objective_ids: List of objective IDs to test (e.g., ["HLO.03"])
272
- V1: Required. V2: Optional (defaults to all available)
262
+ objective_ids: List of objective IDs to test (e.g., ["HLO.03"]).
263
+ Optional; defaults to all available objectives.
273
264
  target_model: Model identifier for the target being tested
274
265
  target_system_prompt: System prompt for the target model
275
266
  refusal_judge_model: Model to use for refusal judging
@@ -288,13 +279,13 @@ class RedTeamSessionsResource(SyncAPIResource):
288
279
  hiddenlayer_project_id: Optional HiddenLayer project ID
289
280
  poll_interval: How often to poll for actions (seconds, default: 2.0s)
290
281
  poll_max_wait: Maximum time to wait for actions (seconds)
291
- sessions_per_technique: Number of sessions to run per technique (enables V2 mode)
282
+ sessions_per_technique: Number of sessions to run per technique
292
283
 
293
284
  Returns:
294
- AsyncRedTeamSession instance
285
+ RedTeamSession instance
295
286
 
296
287
  Raises:
297
- ValueError: If objective_ids not provided in V1 mode
288
+ ValueError: If execution_strategy_type is invalid
298
289
  """
299
290
  # Use defaults if not provided
300
291
  refusal_judge_model = refusal_judge_model or self._default_refusal_judge_model
@@ -302,7 +293,7 @@ class RedTeamSessionsResource(SyncAPIResource):
302
293
  attacker_model = attacker_model or self._default_attacker_model
303
294
  evaluation_report_model = evaluation_report_model or self._default_evaluation_report_model
304
295
 
305
- # V2 mode: objective_ids optional (defaults to all)
296
+ # Default to all available objectives if not specified
306
297
  if objective_ids is None:
307
298
  objective_ids = self._available_objective_ids.copy()
308
299
 
@@ -791,23 +782,14 @@ class AsyncRedTeamSessionsResource(AsyncAPIResource):
791
782
  ) -> AsyncRedTeamSession:
792
783
  """Start a new red team session.
793
784
 
794
- Supports two modes:
795
-
796
- V1 Mode (objective-specific with short-circuit):
797
- - Provide objective_ids (required)
798
- - Do not set sessions_per_technique
799
- - Each session tests one objective and short-circuits on success
800
-
801
- V2 Mode (objective-agnostic adaptive):
802
- - Set sessions_per_technique (e.g., 3)
803
- - objective_ids optional (defaults to all available)
804
- - Each session tests all objectives, runs to max_turns
805
- - Adaptive attacker with cross-session state
785
+ Uses adaptive multi-objective evaluation: each session runs to
786
+ max_turns (no short-circuit), tests all provided objectives, and
787
+ maintains cross-session state for adaptive attacks.
806
788
 
807
789
  Args:
808
790
  name: Session name
809
- objective_ids: List of objective IDs to test (e.g., ["HLO.03"])
810
- V1: Required. V2: Optional (defaults to all available)
791
+ objective_ids: List of objective IDs to test (e.g., ["HLO.03"]).
792
+ Optional; defaults to all available objectives.
811
793
  target_model: Model identifier for the target being tested
812
794
  target_system_prompt: System prompt for the target model
813
795
  refusal_judge_model: Model to use for refusal judging
@@ -826,13 +808,13 @@ class AsyncRedTeamSessionsResource(AsyncAPIResource):
826
808
  hiddenlayer_project_id: Optional HiddenLayer project ID
827
809
  poll_interval: How often to poll for actions (seconds, default: 2.0s)
828
810
  poll_max_wait: Maximum time to wait for actions (seconds)
829
- sessions_per_technique: Number of sessions to run per technique (enables V2 mode)
811
+ sessions_per_technique: Number of sessions to run per technique
830
812
 
831
813
  Returns:
832
814
  AsyncRedTeamSession instance
833
815
 
834
816
  Raises:
835
- ValueError: If objective_ids not provided in V1 mode
817
+ ValueError: If execution_strategy_type is invalid
836
818
  """
837
819
  # Use defaults if not provided
838
820
  refusal_judge_model = refusal_judge_model or self._default_refusal_judge_model
@@ -840,7 +822,7 @@ class AsyncRedTeamSessionsResource(AsyncAPIResource):
840
822
  attacker_model = attacker_model or self._default_attacker_model
841
823
  evaluation_report_model = evaluation_report_model or self._default_evaluation_report_model
842
824
 
843
- # V2 mode: objective_ids optional (defaults to all)
825
+ # Default to all available objectives if not specified
844
826
  if objective_ids is None:
845
827
  objective_ids = self._available_objective_ids.copy()
846
828
 
@@ -71,6 +71,7 @@ class CardsResource(SyncAPIResource):
71
71
  | Omit = omit,
72
72
  modscan_status: Literal["ENABLED", "DISABLED", "ANY"] | Omit = omit,
73
73
  offset: int | Omit = omit,
74
+ policy_status: List[Literal["COMPLIANT", "NONCOMPLIANT"]] | Omit = omit,
74
75
  provider: List[Literal["AZURE", "ADHOC"]] | Omit = omit,
75
76
  sort: str | Omit = omit,
76
77
  source: card_list_params.Source | Omit = omit,
@@ -128,6 +129,7 @@ class CardsResource(SyncAPIResource):
128
129
  "modscan_severity": modscan_severity,
129
130
  "modscan_status": modscan_status,
130
131
  "offset": offset,
132
+ "policy_status": policy_status,
131
133
  "provider": provider,
132
134
  "sort": sort,
133
135
  "source": source,
@@ -185,6 +187,7 @@ class AsyncCardsResource(AsyncAPIResource):
185
187
  | Omit = omit,
186
188
  modscan_status: Literal["ENABLED", "DISABLED", "ANY"] | Omit = omit,
187
189
  offset: int | Omit = omit,
190
+ policy_status: List[Literal["COMPLIANT", "NONCOMPLIANT"]] | Omit = omit,
188
191
  provider: List[Literal["AZURE", "ADHOC"]] | Omit = omit,
189
192
  sort: str | Omit = omit,
190
193
  source: card_list_params.Source | Omit = omit,
@@ -242,6 +245,7 @@ class AsyncCardsResource(AsyncAPIResource):
242
245
  "modscan_severity": modscan_severity,
243
246
  "modscan_status": modscan_status,
244
247
  "offset": offset,
248
+ "policy_status": policy_status,
245
249
  "provider": provider,
246
250
  "sort": sort,
247
251
  "source": source,
@@ -2,11 +2,10 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from urllib.parse import quote
6
-
7
5
  import httpx
8
6
 
9
- from ...._types import Body, Query, Headers, NotGiven, not_given
7
+ from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
8
+ from ...._utils import strip_not_given
10
9
  from ...._compat import cached_property
11
10
  from ...._resource import SyncAPIResource, AsyncAPIResource
12
11
  from ...._response import (
@@ -47,7 +46,8 @@ class FileResource(SyncAPIResource):
47
46
  scan_id: str,
48
47
  *,
49
48
  file_content_length: int,
50
- file_name: str,
49
+ file_name: str | Omit = omit,
50
+ file_name_base64: str | Omit = omit,
51
51
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
52
52
  # The extra values given here take precedence over values defined on the client or passed to this method.
53
53
  extra_headers: Headers | None = None,
@@ -70,8 +70,13 @@ class FileResource(SyncAPIResource):
70
70
  if not scan_id:
71
71
  raise ValueError(f"Expected a non-empty value for `scan_id` but received {scan_id!r}")
72
72
  extra_headers = {
73
- "file-content-length": str(file_content_length),
74
- "file-name": quote(file_name),
73
+ **strip_not_given(
74
+ {
75
+ "file-content-length": str(file_content_length),
76
+ "file-name": file_name,
77
+ "file-name-base64": file_name_base64,
78
+ }
79
+ ),
75
80
  **(extra_headers or {}),
76
81
  }
77
82
  return self._post(
@@ -144,7 +149,8 @@ class AsyncFileResource(AsyncAPIResource):
144
149
  scan_id: str,
145
150
  *,
146
151
  file_content_length: int,
147
- file_name: str,
152
+ file_name: str | Omit = omit,
153
+ file_name_base64: str | Omit = omit,
148
154
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
149
155
  # The extra values given here take precedence over values defined on the client or passed to this method.
150
156
  extra_headers: Headers | None = None,
@@ -167,8 +173,13 @@ class AsyncFileResource(AsyncAPIResource):
167
173
  if not scan_id:
168
174
  raise ValueError(f"Expected a non-empty value for `scan_id` but received {scan_id!r}")
169
175
  extra_headers = {
170
- "file-content-length": str(file_content_length),
171
- "file-name": quote(file_name),
176
+ **strip_not_given(
177
+ {
178
+ "file-content-length": str(file_content_length),
179
+ "file-name": file_name,
180
+ "file-name-base64": file_name_base64,
181
+ }
182
+ ),
172
183
  **(extra_headers or {}),
173
184
  }
174
185
  return await self._post(