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.
Files changed (175) hide show
  1. hiddenlayer_sdk-3.9.0/.release-please-manifest.json +3 -0
  2. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/CHANGELOG.md +27 -0
  3. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/PKG-INFO +1 -1
  4. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/pyproject.toml +1 -1
  5. hiddenlayer_sdk-3.9.0/release-please-config.json +24 -0
  6. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_version.py +1 -1
  7. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/_beta.py +17 -7
  8. hiddenlayer_sdk-3.9.0/src/hiddenlayer/lib/_beta_endpoints.py +22 -0
  9. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/models/cards.py +29 -10
  10. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/runtime.py +4 -20
  11. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/interaction_analyze_params.py +5 -1
  12. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/job_list_response.py +23 -1
  13. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/scan_report.py +15 -0
  14. hiddenlayer_sdk-3.9.0/tests/api_resources/models/test_cards.py +152 -0
  15. hiddenlayer_sdk-3.9.0/tests/test_beta.py +73 -0
  16. hiddenlayer_sdk-3.8.0/.release-please-manifest.json +0 -3
  17. hiddenlayer_sdk-3.8.0/release-please-config.json +0 -66
  18. hiddenlayer_sdk-3.8.0/src/hiddenlayer/lib/_beta_endpoints.py +0 -13
  19. hiddenlayer_sdk-3.8.0/tests/api_resources/models/test_cards.py +0 -138
  20. hiddenlayer_sdk-3.8.0/tests/test_beta.py +0 -62
  21. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/.gitignore +0 -0
  22. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/CODE_OF_CONDUCT.md +0 -0
  23. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/CONTRIBUTING.md +0 -0
  24. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/LICENSE +0 -0
  25. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/README.md +0 -0
  26. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/SECURITY.md +0 -0
  27. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/api.md +0 -0
  28. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/bin/check-release-environment +0 -0
  29. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/bin/publish-jfrog +0 -0
  30. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/bin/publish-pypi +0 -0
  31. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/.keep +0 -0
  32. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/demo.py +0 -0
  33. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/README.md +0 -0
  34. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_http_api.ipynb +0 -0
  35. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_openai.ipynb +0 -0
  36. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_playwright.ipynb +0 -0
  37. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_static_prompts.ipynb +0 -0
  38. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_template.ipynb +0 -0
  39. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_webhook.ipynb +0 -0
  40. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/examples/red_team/red_team_websocket.ipynb +0 -0
  41. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/noxfile.py +0 -0
  42. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/requirements-dev.lock +0 -0
  43. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/requirements.lock +0 -0
  44. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/__init__.py +0 -0
  45. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_base_client.py +0 -0
  46. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_client.py +0 -0
  47. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_compat.py +0 -0
  48. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_constants.py +0 -0
  49. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_exceptions.py +0 -0
  50. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_files.py +0 -0
  51. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_models.py +0 -0
  52. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_oauth2.py +0 -0
  53. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_qs.py +0 -0
  54. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_resource.py +0 -0
  55. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_response.py +0 -0
  56. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_streaming.py +0 -0
  57. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_types.py +0 -0
  58. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/__init__.py +0 -0
  59. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_compat.py +0 -0
  60. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_datetime_parse.py +0 -0
  61. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_json.py +0 -0
  62. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_logs.py +0 -0
  63. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_path.py +0 -0
  64. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_proxy.py +0 -0
  65. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_reflection.py +0 -0
  66. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_resources_proxy.py +0 -0
  67. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_streams.py +0 -0
  68. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_sync.py +0 -0
  69. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_transform.py +0 -0
  70. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_typing.py +0 -0
  71. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/_utils/_utils.py +0 -0
  72. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/.keep +0 -0
  73. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/__init__.py +0 -0
  74. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/community_scan.py +0 -0
  75. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/evaluation_sessions.py +0 -0
  76. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/model_scan.py +0 -0
  77. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/red_team_exceptions.py +0 -0
  78. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/red_team_session.py +0 -0
  79. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/lib/scan_utils.py +0 -0
  80. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/pagination.py +0 -0
  81. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/py.typed +0 -0
  82. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/__init__.py +0 -0
  83. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/evaluations/__init__.py +0 -0
  84. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/evaluations/evaluations.py +0 -0
  85. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/evaluations/red_team.py +0 -0
  86. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/interactions.py +0 -0
  87. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/models/__init__.py +0 -0
  88. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/models/models.py +0 -0
  89. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/prompt_analyzer.py +0 -0
  90. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/__init__.py +0 -0
  91. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/jobs.py +0 -0
  92. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/results.py +0 -0
  93. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/scans.py +0 -0
  94. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/upload/__init__.py +0 -0
  95. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/upload/file.py +0 -0
  96. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/scans/upload/upload.py +0 -0
  97. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/resources/sensors.py +0 -0
  98. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/__init__.py +0 -0
  99. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/__init__.py +0 -0
  100. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_create_params.py +0 -0
  101. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_create_response.py +0 -0
  102. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_evaluation_results_response.py +0 -0
  103. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_next_action_response.py +0 -0
  104. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_status_response.py +0 -0
  105. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_submit_target_response_params.py +0 -0
  106. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/evaluations/red_team_submit_target_response_response.py +0 -0
  107. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/interaction_analyze_response.py +0 -0
  108. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/model_retrieve_response.py +0 -0
  109. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/models/__init__.py +0 -0
  110. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/models/card_list_params.py +0 -0
  111. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/models/card_list_response.py +0 -0
  112. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/prompt_analyzer_create_params.py +0 -0
  113. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/prompt_analyzer_create_response.py +0 -0
  114. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_interaction_params.py +0 -0
  115. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_interaction_response.py +0 -0
  116. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_request_params.py +0 -0
  117. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_request_response.py +0 -0
  118. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_response_params.py +0 -0
  119. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/runtime_evaluate_response_response.py +0 -0
  120. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/__init__.py +0 -0
  121. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/job_list_params.py +0 -0
  122. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/job_request_params.py +0 -0
  123. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/job_retrieve_params.py +0 -0
  124. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/result_sarif_response.py +0 -0
  125. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/scan_job.py +0 -0
  126. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload/__init__.py +0 -0
  127. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload/file_add_response.py +0 -0
  128. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload/file_complete_response.py +0 -0
  129. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload_complete_all_response.py +0 -0
  130. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload_start_params.py +0 -0
  131. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/scans/upload_start_response.py +0 -0
  132. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_create_params.py +0 -0
  133. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_create_response.py +0 -0
  134. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_query_params.py +0 -0
  135. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_query_response.py +0 -0
  136. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_retrieve_response.py +0 -0
  137. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_update_params.py +0 -0
  138. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/src/hiddenlayer/types/sensor_update_response.py +0 -0
  139. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/__init__.py +0 -0
  140. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/__init__.py +0 -0
  141. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/evaluations/__init__.py +0 -0
  142. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/evaluations/test_red_team.py +0 -0
  143. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/models/__init__.py +0 -0
  144. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/__init__.py +0 -0
  145. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/test_jobs.py +0 -0
  146. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/test_results.py +0 -0
  147. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/test_upload.py +0 -0
  148. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/upload/__init__.py +0 -0
  149. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/scans/upload/test_file.py +0 -0
  150. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_interactions.py +0 -0
  151. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_models.py +0 -0
  152. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_prompt_analyzer.py +0 -0
  153. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_runtime.py +0 -0
  154. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/api_resources/test_sensors.py +0 -0
  155. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/conftest.py +0 -0
  156. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/sample_file.txt +0 -0
  157. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_client.py +0 -0
  158. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_community_scan.py +0 -0
  159. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_extract_files.py +0 -0
  160. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_files.py +0 -0
  161. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_model_scan.py +0 -0
  162. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_models.py +0 -0
  163. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_qs.py +0 -0
  164. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_red_team_session.py +0 -0
  165. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_required_args.py +0 -0
  166. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_response.py +0 -0
  167. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_streaming.py +0 -0
  168. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_transform.py +0 -0
  169. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_datetime_parse.py +0 -0
  170. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_json.py +0 -0
  171. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_path.py +0 -0
  172. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_proxy.py +0 -0
  173. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/test_utils/test_typing.py +0 -0
  174. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/tests/utils.py +0 -0
  175. {hiddenlayer_sdk-3.8.0 → hiddenlayer_sdk-3.9.0}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "3.9.0"
3
+ }
@@ -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.8.0
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hiddenlayer-sdk"
3
- version = "3.8.0"
3
+ version = "3.9.0"
4
4
  description = "The official Python library for the hiddenlayer API"
5
5
  dynamic = ["readme"]
6
6
  license = {text = "Apache-2.0"}
@@ -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
+ }
@@ -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.8.0" # x-release-please-version
4
+ __version__ = "3.9.0" # x-release-please-version
@@ -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
- qualified_name = BETA_ENDPOINTS.get(url)
40
- if qualified_name is not None:
41
- # Called from _prepare_options, which is deeper in the stack than
42
- # a direct warn_beta call from a resource method. The higher
43
- # stacklevel won't point at user code, but the message itself
44
- # identifies the method.
45
- warn_beta(qualified_name, stacklevel=4)
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
- List Model Cards
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
- List Model Cards
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 = to_raw_response_wrapper(
265
- cards.list,
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 = async_to_raw_response_wrapper(
274
- cards.list,
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 = to_streamed_response_wrapper(
283
- cards.list,
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 = async_to_streamed_response_wrapper(
292
- cards.list,
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
- Performs synchronous security evaluation on an LLM **interaction**. The
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
- Performs synchronous security evaluation on an LLM **interaction**. The
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
 
@@ -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(TypedDict, total=False, extra_items=object): # type: ignore[call-arg]
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
 
@@ -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__ = ["JobListResponse", "Item", "ItemInventory", "ItemInventoryProviderDetails", "ItemSummary", "ItemCompliance"]
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
@@ -1,3 +0,0 @@
1
- {
2
- ".": "3.8.0"
3
- }