hiddenlayer-sdk 3.5.0__tar.gz → 3.7.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 (163) hide show
  1. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/.gitignore +1 -0
  2. hiddenlayer_sdk-3.7.0/.release-please-manifest.json +3 -0
  3. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/CHANGELOG.md +76 -0
  4. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/PKG-INFO +9 -2
  5. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/README.md +7 -0
  6. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/api.md +20 -7
  7. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/pyproject.toml +4 -3
  8. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/__init__.py +10 -1
  9. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_base_client.py +4 -0
  10. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_client.py +80 -5
  11. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_compat.py +9 -2
  12. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_files.py +53 -3
  13. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_qs.py +6 -7
  14. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_types.py +3 -0
  15. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/__init__.py +1 -1
  16. hiddenlayer_sdk-3.7.0/src/hiddenlayer/_utils/_path.py +127 -0
  17. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_utils.py +37 -25
  18. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_version.py +1 -1
  19. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/lib/__init__.py +4 -0
  20. hiddenlayer_sdk-3.7.0/src/hiddenlayer/lib/_beta.py +45 -0
  21. hiddenlayer_sdk-3.7.0/src/hiddenlayer/lib/_beta_endpoints.py +13 -0
  22. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/lib/community_scan.py +11 -4
  23. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/lib/model_scan.py +10 -3
  24. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/lib/scan_utils.py +20 -0
  25. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/__init__.py +14 -0
  26. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/evaluations/red_team.py +53 -19
  27. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/models/models.py +5 -4
  28. hiddenlayer_sdk-3.7.0/src/hiddenlayer/resources/runtime.py +378 -0
  29. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/scans/jobs.py +3 -5
  30. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/scans/results.py +3 -2
  31. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/scans/upload/file.py +5 -5
  32. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/scans/upload/upload.py +3 -3
  33. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/sensors.py +7 -7
  34. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/__init__.py +4 -0
  35. hiddenlayer_sdk-3.7.0/src/hiddenlayer/types/evaluations/red_team_retrieve_evaluation_results_response.py +48 -0
  36. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_status_response.py +0 -6
  37. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/interaction_analyze_params.py +3 -6
  38. hiddenlayer_sdk-3.7.0/src/hiddenlayer/types/runtime_evaluate_request_params.py +23 -0
  39. hiddenlayer_sdk-3.7.0/src/hiddenlayer/types/runtime_evaluate_request_response.py +8 -0
  40. hiddenlayer_sdk-3.7.0/src/hiddenlayer/types/runtime_evaluate_response_params.py +23 -0
  41. hiddenlayer_sdk-3.7.0/src/hiddenlayer/types/runtime_evaluate_response_response.py +8 -0
  42. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/job_list_response.py +1 -1
  43. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/job_request_params.py +1 -1
  44. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/scan_job.py +1 -1
  45. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/scan_report.py +1 -1
  46. hiddenlayer_sdk-3.7.0/tests/api_resources/test_runtime.py +299 -0
  47. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/conftest.py +21 -1
  48. hiddenlayer_sdk-3.7.0/tests/test_beta.py +62 -0
  49. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_client.py +48 -0
  50. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_extract_files.py +28 -1
  51. hiddenlayer_sdk-3.7.0/tests/test_files.py +148 -0
  52. hiddenlayer_sdk-3.7.0/tests/test_utils/test_path.py +89 -0
  53. hiddenlayer_sdk-3.5.0/.release-please-manifest.json +0 -3
  54. hiddenlayer_sdk-3.5.0/src/hiddenlayer/types/evaluations/red_team_retrieve_evaluation_results_response.py +0 -20
  55. hiddenlayer_sdk-3.5.0/tests/test_deepcopy.py +0 -58
  56. hiddenlayer_sdk-3.5.0/tests/test_files.py +0 -51
  57. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/CODE_OF_CONDUCT.md +0 -0
  58. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/CONTRIBUTING.md +0 -0
  59. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/LICENSE +0 -0
  60. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/SECURITY.md +0 -0
  61. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/bin/check-release-environment +0 -0
  62. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/bin/publish-jfrog +0 -0
  63. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/bin/publish-pypi +0 -0
  64. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/examples/.keep +0 -0
  65. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/examples/demo.py +0 -0
  66. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/noxfile.py +0 -0
  67. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/release-please-config.json +0 -0
  68. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/requirements-dev.lock +0 -0
  69. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/requirements.lock +0 -0
  70. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_constants.py +0 -0
  71. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_exceptions.py +0 -0
  72. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_models.py +0 -0
  73. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_oauth2.py +0 -0
  74. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_resource.py +0 -0
  75. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_response.py +0 -0
  76. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_streaming.py +0 -0
  77. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_compat.py +0 -0
  78. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_datetime_parse.py +0 -0
  79. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_json.py +0 -0
  80. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_logs.py +0 -0
  81. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_proxy.py +0 -0
  82. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_reflection.py +0 -0
  83. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_resources_proxy.py +0 -0
  84. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_streams.py +0 -0
  85. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_sync.py +0 -0
  86. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_transform.py +0 -0
  87. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/_utils/_typing.py +0 -0
  88. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/lib/.keep +0 -0
  89. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/lib/evaluation_sessions.py +0 -0
  90. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/lib/red_team_exceptions.py +0 -0
  91. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/lib/red_team_session.py +0 -0
  92. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/pagination.py +0 -0
  93. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/py.typed +0 -0
  94. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/evaluations/__init__.py +0 -0
  95. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/evaluations/evaluations.py +0 -0
  96. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/interactions.py +0 -0
  97. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/models/__init__.py +0 -0
  98. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/models/cards.py +0 -0
  99. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/prompt_analyzer.py +0 -0
  100. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/scans/__init__.py +0 -0
  101. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/scans/scans.py +0 -0
  102. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/resources/scans/upload/__init__.py +0 -0
  103. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/evaluations/__init__.py +0 -0
  104. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/evaluations/red_team_create_params.py +0 -0
  105. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/evaluations/red_team_create_response.py +0 -0
  106. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/evaluations/red_team_retrieve_next_action_response.py +0 -0
  107. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/evaluations/red_team_submit_target_response_params.py +0 -0
  108. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/evaluations/red_team_submit_target_response_response.py +0 -0
  109. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/interaction_analyze_response.py +0 -0
  110. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/model_retrieve_response.py +0 -0
  111. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/models/__init__.py +0 -0
  112. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/models/card_list_params.py +0 -0
  113. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/models/card_list_response.py +0 -0
  114. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/prompt_analyzer_create_params.py +0 -0
  115. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/prompt_analyzer_create_response.py +0 -0
  116. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/__init__.py +0 -0
  117. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/job_list_params.py +0 -0
  118. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/job_retrieve_params.py +0 -0
  119. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/result_sarif_response.py +0 -0
  120. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/upload/__init__.py +0 -0
  121. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/upload/file_add_response.py +0 -0
  122. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/upload/file_complete_response.py +0 -0
  123. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/upload_complete_all_response.py +0 -0
  124. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/upload_start_params.py +0 -0
  125. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/scans/upload_start_response.py +0 -0
  126. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/sensor_create_params.py +0 -0
  127. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/sensor_create_response.py +0 -0
  128. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/sensor_query_params.py +0 -0
  129. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/sensor_query_response.py +0 -0
  130. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/sensor_retrieve_response.py +0 -0
  131. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/sensor_update_params.py +0 -0
  132. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/src/hiddenlayer/types/sensor_update_response.py +0 -0
  133. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/__init__.py +0 -0
  134. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/__init__.py +0 -0
  135. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/evaluations/__init__.py +0 -0
  136. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/evaluations/test_red_team.py +0 -0
  137. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/models/__init__.py +0 -0
  138. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/models/test_cards.py +0 -0
  139. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/scans/__init__.py +0 -0
  140. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/scans/test_jobs.py +0 -0
  141. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/scans/test_results.py +0 -0
  142. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/scans/test_upload.py +0 -0
  143. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/scans/upload/__init__.py +0 -0
  144. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/scans/upload/test_file.py +0 -0
  145. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/test_interactions.py +0 -0
  146. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/test_models.py +0 -0
  147. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/test_prompt_analyzer.py +0 -0
  148. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/api_resources/test_sensors.py +0 -0
  149. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/sample_file.txt +0 -0
  150. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_community_scan.py +0 -0
  151. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_model_scan.py +0 -0
  152. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_models.py +0 -0
  153. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_qs.py +0 -0
  154. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_red_team_session.py +0 -0
  155. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_required_args.py +0 -0
  156. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_response.py +0 -0
  157. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_streaming.py +0 -0
  158. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_transform.py +0 -0
  159. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_utils/test_datetime_parse.py +0 -0
  160. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_utils/test_json.py +0 -0
  161. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_utils/test_proxy.py +0 -0
  162. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/test_utils/test_typing.py +0 -0
  163. {hiddenlayer_sdk-3.5.0 → hiddenlayer_sdk-3.7.0}/tests/utils.py +0 -0
@@ -1,4 +1,5 @@
1
1
  .prism.log
2
+ .stdy.log
2
3
  _dev
3
4
 
4
5
  __pycache__
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "3.7.0"
3
+ }
@@ -1,5 +1,81 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.7.0 (2026-05-07)
4
+
5
+ Full Changelog: [v3.6.0...v3.7.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.6.0...v3.7.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** Add Runtime Security evaluation endpoints for real-time request and response analysis ([d974153](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/d97415346f44c347c013408a4552524e2def0eb6))
10
+ * **client:** Support setting custom request headers via environment variables ([8087cc1](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/8087cc193f18244f48ce846c05d91df6e895f472))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **client:** Use correct field name format for multipart file arrays ([62a51d1](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/62a51d195f6e46948c4512ad8627d05435bdda6e))
16
+
17
+
18
+ ### Performance Improvements
19
+
20
+ * **client:** Optimize file structure copying in multipart requests ([2f7a1e3](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/2f7a1e3322b9c05a8dbbeec9c5843e6f271b38b8))
21
+
22
+ ## 3.6.0 (2026-04-14)
23
+
24
+ Full Changelog: [v3.5.0...v3.6.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.5.0...v3.6.0)
25
+
26
+ ### Features
27
+
28
+ * add beta instability warnings for unstable SDK methods ([#186](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/issues/186)) ([e56488a](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/e56488a532201b4f6cc46c5a0be68a45614b1734))
29
+ * **api:** add runtime security evaluations endpoints ([2433787](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/2433787d248b222da7a077b2ef1efd54f5116f7e))
30
+ * **api:** api update ([6b894b8](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/6b894b89ab4cef087e0fc7df4a62913c4b1b1710))
31
+ * **api:** api update ([dd91242](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/dd912420f1d2e8574454cdfa754f4817b7a2423e))
32
+ * **api:** api update ([825a274](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/825a2742d0b674b392e37c99be54c576ff9be34c))
33
+ * **api:** api update ([c43deaa](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/c43deaa74339cc7f3f70cb4b5e26c027fe975896))
34
+ * **api:** api update ([716c68c](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/716c68cef3e9ae8d15631d417335c3f387bedc72))
35
+ * **api:** api update ([98a52fa](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/98a52fad11b3e42b9b576738601743f59ad8752d))
36
+ * **api:** finalize runtime security endpoints ([e83726c](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/e83726c4a62ede87be9222e1f3acbbd0c27e1f99))
37
+ * **internal:** implement indices array format for query and form serialization ([05135c2](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/05135c262a3688319bfd7508452b1c101d9901c4))
38
+
39
+
40
+ ### Bug Fixes
41
+
42
+ * **beta:** harden CI tests against codegen churn ([#191](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/issues/191)) ([8f85aec](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/8f85aec226a6a7278aa388d30f74d7735031b9cb))
43
+ * **client:** preserve hardcoded query params when merging with user params ([90ad63a](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/90ad63ae4aea92158416a5e1101a3d0496a20646))
44
+ * correct async method indentation in beta warning patcher ([2af3e63](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/2af3e6358565aaca1a3b3069868f2af090db7f92))
45
+ * **deps:** bump minimum typing-extensions version ([53b0b0e](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/53b0b0edfaf7a7dea0b097333fac0ecdc9a16bcb))
46
+ * ensure file data are only sent as 1 parameter ([1ea7561](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/1ea756124f32f0f49ba9d73bcdc2c4d63931c649))
47
+ * **pydantic:** do not pass `by_alias` unless set ([86f9db3](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/86f9db32c94ff8358bf294f14a54a460d1d7444b))
48
+ * sanitize endpoint path params ([ea53526](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/ea5352653b0708eaa5f495a598cdf19935d26fac))
49
+ * **tests:** correct setup of OAuth 2 Client Credentials tests ([b3887a1](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/b3887a1e39f05e01d5e16c768ef96ac6ca6e98ed))
50
+
51
+
52
+ ### Chores
53
+
54
+ * **ci:** skip lint on metadata-only changes ([803a48b](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/803a48bed50ae657bfe8efdbfce86969d57ac96d))
55
+ * **ci:** skip uploading artifacts on stainless-internal branches ([e901a9f](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/e901a9f5a6af3b5650d0002b9dd18b7ba954c38d))
56
+ * **deps:** bump actions/setup-node from 4 to 6 ([5abc090](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/5abc090fa35bc1efd1422cd8455aa369fed72fc4))
57
+ * **deps:** bump github/codeql-action from 4.32.6 to 4.35.1 ([6715471](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/67154712c4497ee3d90fea9aa9632d2ad6fa763d))
58
+ * **deps:** bump step-security/harden-runner from 2.15.1 to 2.16.1 ([58738e5](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/58738e54c1dd7cfe4b710e0cc75a246598c6b9f7))
59
+ * **internal:** codegen related update ([e2b17fd](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/e2b17fd099188441b0d296a1a745a930f9953665))
60
+ * **internal:** tweak CI branches ([535faac](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/535faacf763992576b28266f92e226be1f07fb09))
61
+ * **internal:** update gitignore ([bf2dcbe](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/bf2dcbe99c112ab5869ecff719ae66c93cacfc15))
62
+ * patch beta warnings [skip ci] ([ff2ae92](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/ff2ae92be61ae0838e24d28632e38aa024ad28cb))
63
+ * regenerate beta endpoint registry [skip ci] ([5aded1f](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/5aded1f3c1b0aa3bc4ae76137faf6987a71c0db2))
64
+ * regenerate beta endpoint registry [skip ci] ([126b13e](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/126b13ea66294a7c1a2d31e8edfcd336552b245e))
65
+ * regenerate beta endpoint registry [skip ci] ([24d568e](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/24d568e9fc74b6a0c044ea9a74120e4504fe1b16))
66
+ * remove stale version comments from SHA-pinned actions ([#184](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/issues/184)) ([cf07e32](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/cf07e322e7b4674fe3ef622e491278b0346e5e7e))
67
+
68
+
69
+ ### Documentation
70
+
71
+ * **readme:** add Beta APIs section ([#185](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/issues/185)) ([b1381e3](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/b1381e389f6e7ee59ba51ff00ce84b4a43f97c35))
72
+
73
+
74
+ ### Refactors
75
+
76
+ * **client:** move beta warnings to _prepare_options interceptor ([#190](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/issues/190)) ([893ee22](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/893ee22fdda949ebab80d66d70b99accb79aded2))
77
+ * **types:** use `extra_items` from PEP 728 ([e5ee89f](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/commit/e5ee89fccbefe680538b8b3b06871dfba90d1474))
78
+
3
79
  ## 3.5.0 (2026-03-03)
4
80
 
5
81
  Full Changelog: [v3.4.0...v3.5.0](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/compare/v3.4.0...v3.5.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: hiddenlayer-sdk
3
- Version: 3.5.0
3
+ Version: 3.7.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
@@ -30,7 +30,7 @@ Requires-Dist: requests-auth>=8.0.0
30
30
  Requires-Dist: requests>=2.32.4
31
31
  Requires-Dist: sniffio
32
32
  Requires-Dist: types-requests>=2.32.0.20241016
33
- Requires-Dist: typing-extensions<5,>=4.10
33
+ Requires-Dist: typing-extensions<5,>=4.14
34
34
  Provides-Extra: aiohttp
35
35
  Requires-Dist: aiohttp; extra == 'aiohttp'
36
36
  Requires-Dist: httpx-aiohttp>=0.1.9; extra == 'aiohttp'
@@ -51,6 +51,13 @@ It is generated with [Stainless](https://www.stainless.com/).
51
51
 
52
52
  The REST API documentation can be found on [dev.hiddenlayer.ai](https://dev.hiddenlayer.ai). The full API of this library can be found in [api.md](https://github.com/hiddenlayerai/hiddenlayer-sdk-python/tree/main/api.md).
53
53
 
54
+ ## Beta APIs
55
+
56
+ Some HiddenLayer APIs are marked as **Beta**, meaning they are not yet generally available (GA) or production ready. Beta APIs can be used in a production environment, but at your own risk and discretion. For full details, see the [Beta API Guidelines](https://dev.hiddenlayer.ai/docs/beta-api-faq) on the developer portal.
57
+
58
+ - HiddenLayer does not provide compatibility guarantees for Beta APIs. Breaking changes may occur at any time.
59
+ - SDK functions and types associated with Beta APIs are excluded when determining semver release versions.
60
+
54
61
  ## Installation
55
62
 
56
63
  ```sh
@@ -13,6 +13,13 @@ It is generated with [Stainless](https://www.stainless.com/).
13
13
 
14
14
  The REST API documentation can be found on [dev.hiddenlayer.ai](https://dev.hiddenlayer.ai). The full API of this library can be found in [api.md](api.md).
15
15
 
16
+ ## Beta APIs
17
+
18
+ Some HiddenLayer APIs are marked as **Beta**, meaning they are not yet generally available (GA) or production ready. Beta APIs can be used in a production environment, but at your own risk and discretion. For full details, see the [Beta API Guidelines](https://dev.hiddenlayer.ai/docs/beta-api-faq) on the developer portal.
19
+
20
+ - HiddenLayer does not provide compatibility guarantees for Beta APIs. Breaking changes may occur at any time.
21
+ - SDK functions and types associated with Beta APIs are excluded when determining semver release versions.
22
+
16
23
  ## Installation
17
24
 
18
25
  ```sh
@@ -43,19 +43,19 @@ from hiddenlayer.types.evaluations import (
43
43
 
44
44
  Methods:
45
45
 
46
- - <code title="post /evaluations/v1-beta/red-team">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">create</a>(\*\*<a href="src/hiddenlayer/types/evaluations/red_team_create_params.py">params</a>) -> <a href="./src/hiddenlayer/types/evaluations/red_team_create_response.py">RedTeamCreateResponse</a></code>
47
- - <code title="get /evaluations/v1-beta/red-team/{workflow_id}">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">retrieve_evaluation_results</a>(workflow_id) -> <a href="./src/hiddenlayer/types/evaluations/red_team_retrieve_evaluation_results_response.py">RedTeamRetrieveEvaluationResultsResponse</a></code>
48
- - <code title="get /evaluations/v1-beta/red-team/{workflow_id}/next-action">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">retrieve_next_action</a>(workflow_id) -> <a href="./src/hiddenlayer/types/evaluations/red_team_retrieve_next_action_response.py">RedTeamRetrieveNextActionResponse</a></code>
49
- - <code title="get /evaluations/v1-beta/red-team/{workflow_id}/status">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">retrieve_status</a>(workflow_id) -> <a href="./src/hiddenlayer/types/evaluations/red_team_retrieve_status_response.py">RedTeamRetrieveStatusResponse</a></code>
50
- - <code title="post /evaluations/v1-beta/red-team/{workflow_id}/target-response">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">submit_target_response</a>(workflow_id, \*\*<a href="src/hiddenlayer/types/evaluations/red_team_submit_target_response_params.py">params</a>) -> <a href="./src/hiddenlayer/types/evaluations/red_team_submit_target_response_response.py">RedTeamSubmitTargetResponseResponse</a></code>
51
- - <code title="post /evaluations/v1-beta/red-team/terminations/{workflow_id}">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">terminate</a>(workflow_id) -> None</code>
46
+ - <code title="post /evaluations/v1/red-team">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">create</a>(\*\*<a href="src/hiddenlayer/types/evaluations/red_team_create_params.py">params</a>) -> <a href="./src/hiddenlayer/types/evaluations/red_team_create_response.py">RedTeamCreateResponse</a></code>
47
+ - <code title="get /evaluations/v1/red-team/{workflow_id}">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">retrieve_evaluation_results</a>(workflow_id) -> <a href="./src/hiddenlayer/types/evaluations/red_team_retrieve_evaluation_results_response.py">RedTeamRetrieveEvaluationResultsResponse</a></code>
48
+ - <code title="get /evaluations/v1/red-team/{workflow_id}/next-action">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">retrieve_next_action</a>(workflow_id) -> <a href="./src/hiddenlayer/types/evaluations/red_team_retrieve_next_action_response.py">RedTeamRetrieveNextActionResponse</a></code>
49
+ - <code title="get /evaluations/v1/red-team/{workflow_id}/status">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">retrieve_status</a>(workflow_id) -> <a href="./src/hiddenlayer/types/evaluations/red_team_retrieve_status_response.py">RedTeamRetrieveStatusResponse</a></code>
50
+ - <code title="post /evaluations/v1/red-team/{workflow_id}/target-response">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">submit_target_response</a>(workflow_id, \*\*<a href="src/hiddenlayer/types/evaluations/red_team_submit_target_response_params.py">params</a>) -> <a href="./src/hiddenlayer/types/evaluations/red_team_submit_target_response_response.py">RedTeamSubmitTargetResponseResponse</a></code>
51
+ - <code title="post /evaluations/v1/jobs/{workflow_id}/termination">client.evaluations.red_team.<a href="./src/hiddenlayer/resources/evaluations/red_team.py">terminate</a>(workflow_id) -> None</code>
52
52
 
53
53
  # PromptAnalyzer
54
54
 
55
55
  Types:
56
56
 
57
57
  ```python
58
- from hiddenlayer.types import PromptAnalyzerCreateResponse, PromptAnalyzerCreateParams
58
+ from hiddenlayer.types import PromptAnalyzerCreateResponse
59
59
  ```
60
60
 
61
61
  Methods:
@@ -74,6 +74,19 @@ Methods:
74
74
 
75
75
  - <code title="post /detection/v1/interactions">client.interactions.<a href="./src/hiddenlayer/resources/interactions.py">analyze</a>(\*\*<a href="src/hiddenlayer/types/interaction_analyze_params.py">params</a>) -> <a href="./src/hiddenlayer/types/interaction_analyze_response.py">InteractionAnalyzeResponse</a></code>
76
76
 
77
+ # Runtime
78
+
79
+ Types:
80
+
81
+ ```python
82
+ from hiddenlayer.types import RuntimeEvaluateRequestResponse, RuntimeEvaluateResponseResponse
83
+ ```
84
+
85
+ Methods:
86
+
87
+ - <code title="post /detection/v2/request-evaluations">client.runtime.<a href="./src/hiddenlayer/resources/runtime.py">evaluate_request</a>(\*\*<a href="src/hiddenlayer/types/runtime_evaluate_request_params.py">params</a>) -> <a href="./src/hiddenlayer/types/runtime_evaluate_request_response.py">RuntimeEvaluateRequestResponse</a></code>
88
+ - <code title="post /detection/v2/response-evaluations">client.runtime.<a href="./src/hiddenlayer/resources/runtime.py">evaluate_response</a>(\*\*<a href="src/hiddenlayer/types/runtime_evaluate_response_params.py">params</a>) -> <a href="./src/hiddenlayer/types/runtime_evaluate_response_response.py">RuntimeEvaluateResponseResponse</a></code>
89
+
77
90
  # Sensors
78
91
 
79
92
  Types:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hiddenlayer-sdk"
3
- version = "3.5.0"
3
+ version = "3.7.0"
4
4
  description = "The official Python library for the hiddenlayer API"
5
5
  dynamic = ["readme"]
6
6
  license = {text = "Apache-2.0"}
@@ -11,7 +11,7 @@ authors = [
11
11
  dependencies = [
12
12
  "httpx>=0.23.0, <1",
13
13
  "pydantic>=1.9.0, <3",
14
- "typing-extensions>=4.10, <5",
14
+ "typing-extensions>=4.14, <5",
15
15
  "anyio>=3.5.0, <5",
16
16
  "distro>=1.7.0, <2",
17
17
  "sniffio",
@@ -140,6 +140,7 @@ xfail_strict = true
140
140
  asyncio_mode = "auto"
141
141
  asyncio_default_fixture_loop_scope = "session"
142
142
  filterwarnings = [
143
+ "default::hiddenlayer.lib._beta.BetaWarning",
143
144
  "error"
144
145
  ]
145
146
 
@@ -173,7 +174,7 @@ show_error_codes = true
173
174
  #
174
175
  # We also exclude our `tests` as mypy doesn't always infer
175
176
  # types correctly and Pyright will still catch any type errors.
176
- exclude = ['src/hiddenlayer/_files.py', '_dev/.*.py', 'tests/.*']
177
+ exclude = ["src/hiddenlayer/_files.py", "_dev/.*.py", "tests/.*"]
177
178
 
178
179
  strict_equality = true
179
180
  implicit_reexport = true
@@ -3,7 +3,14 @@
3
3
  import typing as _t
4
4
 
5
5
  from . import types
6
- from .lib import ModelScanner, CommunityScanner, AsyncModelScanner, AsyncCommunityScanner
6
+ from .lib import (
7
+ BetaWarning,
8
+ ModelScanner,
9
+ CommunityScanner,
10
+ AsyncModelScanner,
11
+ AsyncCommunityScanner,
12
+ warn_beta,
13
+ )
7
14
  from ._types import NOT_GIVEN, Omit, NoneType, NotGiven, Transport, ProxiesTypes, omit, not_given
8
15
  from ._utils import file_from_path
9
16
  from ._client import (
@@ -46,6 +53,8 @@ __all__ = [
46
53
  "__version__",
47
54
  "__title__",
48
55
  "NoneType",
56
+ "BetaWarning",
57
+ "warn_beta",
49
58
  "CommunityScanner",
50
59
  "AsyncCommunityScanner",
51
60
  "ModelScanner",
@@ -540,6 +540,10 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
540
540
  files = cast(HttpxRequestFiles, ForceMultipartDict())
541
541
 
542
542
  prepared_url = self._prepare_url(options.url)
543
+ # preserve hard-coded query params from the url
544
+ if params and prepared_url.query:
545
+ params = {**dict(prepared_url.params.items()), **params}
546
+ prepared_url = prepared_url.copy_with(raw_path=prepared_url.raw_path.split(b"?", 1)[0])
543
547
  if "_" in prepared_url.host:
544
548
  # work around https://github.com/encode/httpx/discussions/2880
545
549
  kwargs["extensions"] = {"sni_hostname": prepared_url.host.replace("_", "-")}
@@ -19,8 +19,13 @@ from ._types import (
19
19
  RequestOptions,
20
20
  not_given,
21
21
  )
22
- from ._utils import is_given, get_async_library
22
+ from ._utils import (
23
+ is_given,
24
+ is_mapping_t,
25
+ get_async_library,
26
+ )
23
27
  from ._compat import cached_property
28
+ from ._models import FinalRequestOptions
24
29
  from ._oauth2 import OAuth2ClientCredentials, make_oauth2
25
30
  from ._version import __version__
26
31
  from ._streaming import Stream as Stream, AsyncStream as AsyncStream
@@ -32,17 +37,20 @@ from ._base_client import (
32
37
  )
33
38
 
34
39
  if TYPE_CHECKING:
35
- from .resources import scans, models, sensors, evaluations, interactions, prompt_analyzer
36
- from .lib.model_scan import ModelScanner, AsyncModelScanner
40
+ from .resources import scans, models, runtime, sensors, evaluations, interactions, prompt_analyzer
41
+ from .resources.runtime import RuntimeResource, AsyncRuntimeResource
37
42
  from .resources.sensors import SensorsResource, AsyncSensorsResource
38
- from .lib.community_scan import CommunityScanner, AsyncCommunityScanner
39
43
  from .resources.scans.scans import ScansResource, AsyncScansResource
40
44
  from .resources.interactions import InteractionsResource, AsyncInteractionsResource
41
- from .lib.evaluation_sessions import EvaluationSessionsResource, AsyncEvaluationSessionsResource
42
45
  from .resources.models.models import ModelsResource, AsyncModelsResource
43
46
  from .resources.prompt_analyzer import PromptAnalyzerResource, AsyncPromptAnalyzerResource
44
47
  from .resources.evaluations.evaluations import EvaluationsResource, AsyncEvaluationsResource
45
48
 
49
+ if TYPE_CHECKING:
50
+ from .lib.model_scan import ModelScanner, AsyncModelScanner
51
+ from .lib.community_scan import CommunityScanner, AsyncCommunityScanner
52
+ from .lib.evaluation_sessions import EvaluationSessionsResource, AsyncEvaluationSessionsResource
53
+
46
54
  __all__ = [
47
55
  "ENVIRONMENTS",
48
56
  "Timeout",
@@ -140,6 +148,15 @@ class HiddenLayer(SyncAPIClient):
140
148
  except KeyError as exc:
141
149
  raise ValueError(f"Unknown environment: {environment}") from exc
142
150
 
151
+ custom_headers_env = os.environ.get("HIDDENLAYER_CUSTOM_HEADERS")
152
+ if custom_headers_env is not None:
153
+ parsed: dict[str, str] = {}
154
+ for line in custom_headers_env.split("\n"):
155
+ colon = line.find(":")
156
+ if colon >= 0:
157
+ parsed[line[:colon].strip()] = line[colon + 1 :].strip()
158
+ default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
159
+
143
160
  super().__init__(
144
161
  version=__version__,
145
162
  base_url=base_url,
@@ -181,6 +198,12 @@ class HiddenLayer(SyncAPIClient):
181
198
 
182
199
  return InteractionsResource(self)
183
200
 
201
+ @cached_property
202
+ def runtime(self) -> RuntimeResource:
203
+ from .resources.runtime import RuntimeResource
204
+
205
+ return RuntimeResource(self)
206
+
184
207
  @cached_property
185
208
  def sensors(self) -> SensorsResource:
186
209
  from .resources.sensors import SensorsResource
@@ -256,6 +279,12 @@ class HiddenLayer(SyncAPIClient):
256
279
  return True
257
280
  return super()._should_retry(response)
258
281
 
282
+ @override
283
+ def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOptions:
284
+ from .lib._beta import check_beta_endpoint
285
+
286
+ check_beta_endpoint(options.url)
287
+ return options
259
288
 
260
289
  def copy(
261
290
  self,
@@ -427,6 +456,15 @@ class AsyncHiddenLayer(AsyncAPIClient):
427
456
  except KeyError as exc:
428
457
  raise ValueError(f"Unknown environment: {environment}") from exc
429
458
 
459
+ custom_headers_env = os.environ.get("HIDDENLAYER_CUSTOM_HEADERS")
460
+ if custom_headers_env is not None:
461
+ parsed: dict[str, str] = {}
462
+ for line in custom_headers_env.split("\n"):
463
+ colon = line.find(":")
464
+ if colon >= 0:
465
+ parsed[line[:colon].strip()] = line[colon + 1 :].strip()
466
+ default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
467
+
430
468
  super().__init__(
431
469
  version=__version__,
432
470
  base_url=base_url,
@@ -468,6 +506,12 @@ class AsyncHiddenLayer(AsyncAPIClient):
468
506
 
469
507
  return AsyncInteractionsResource(self)
470
508
 
509
+ @cached_property
510
+ def runtime(self) -> AsyncRuntimeResource:
511
+ from .resources.runtime import AsyncRuntimeResource
512
+
513
+ return AsyncRuntimeResource(self)
514
+
471
515
  @cached_property
472
516
  def sensors(self) -> AsyncSensorsResource:
473
517
  from .resources.sensors import AsyncSensorsResource
@@ -543,6 +587,13 @@ class AsyncHiddenLayer(AsyncAPIClient):
543
587
  return True
544
588
  return super()._should_retry(response)
545
589
 
590
+ @override
591
+ async def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOptions:
592
+ from .lib._beta import check_beta_endpoint
593
+
594
+ check_beta_endpoint(options.url)
595
+ return options
596
+
546
597
  def copy(
547
598
  self,
548
599
  *,
@@ -664,6 +715,12 @@ class HiddenLayerWithRawResponse:
664
715
 
665
716
  return InteractionsResourceWithRawResponse(self._client.interactions)
666
717
 
718
+ @cached_property
719
+ def runtime(self) -> runtime.RuntimeResourceWithRawResponse:
720
+ from .resources.runtime import RuntimeResourceWithRawResponse
721
+
722
+ return RuntimeResourceWithRawResponse(self._client.runtime)
723
+
667
724
  @cached_property
668
725
  def sensors(self) -> sensors.SensorsResourceWithRawResponse:
669
726
  from .resources.sensors import SensorsResourceWithRawResponse
@@ -707,6 +764,12 @@ class AsyncHiddenLayerWithRawResponse:
707
764
 
708
765
  return AsyncInteractionsResourceWithRawResponse(self._client.interactions)
709
766
 
767
+ @cached_property
768
+ def runtime(self) -> runtime.AsyncRuntimeResourceWithRawResponse:
769
+ from .resources.runtime import AsyncRuntimeResourceWithRawResponse
770
+
771
+ return AsyncRuntimeResourceWithRawResponse(self._client.runtime)
772
+
710
773
  @cached_property
711
774
  def sensors(self) -> sensors.AsyncSensorsResourceWithRawResponse:
712
775
  from .resources.sensors import AsyncSensorsResourceWithRawResponse
@@ -750,6 +813,12 @@ class HiddenLayerWithStreamedResponse:
750
813
 
751
814
  return InteractionsResourceWithStreamingResponse(self._client.interactions)
752
815
 
816
+ @cached_property
817
+ def runtime(self) -> runtime.RuntimeResourceWithStreamingResponse:
818
+ from .resources.runtime import RuntimeResourceWithStreamingResponse
819
+
820
+ return RuntimeResourceWithStreamingResponse(self._client.runtime)
821
+
753
822
  @cached_property
754
823
  def sensors(self) -> sensors.SensorsResourceWithStreamingResponse:
755
824
  from .resources.sensors import SensorsResourceWithStreamingResponse
@@ -793,6 +862,12 @@ class AsyncHiddenLayerWithStreamedResponse:
793
862
 
794
863
  return AsyncInteractionsResourceWithStreamingResponse(self._client.interactions)
795
864
 
865
+ @cached_property
866
+ def runtime(self) -> runtime.AsyncRuntimeResourceWithStreamingResponse:
867
+ from .resources.runtime import AsyncRuntimeResourceWithStreamingResponse
868
+
869
+ return AsyncRuntimeResourceWithStreamingResponse(self._client.runtime)
870
+
796
871
  @cached_property
797
872
  def sensors(self) -> sensors.AsyncSensorsResourceWithStreamingResponse:
798
873
  from .resources.sensors import AsyncSensorsResourceWithStreamingResponse
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Any, Union, Generic, TypeVar, Callable, cast, overload
4
4
  from datetime import date, datetime
5
- from typing_extensions import Self, Literal
5
+ from typing_extensions import Self, Literal, TypedDict
6
6
 
7
7
  import pydantic
8
8
  from pydantic.fields import FieldInfo
@@ -131,6 +131,10 @@ def model_json(model: pydantic.BaseModel, *, indent: int | None = None) -> str:
131
131
  return model.model_dump_json(indent=indent)
132
132
 
133
133
 
134
+ class _ModelDumpKwargs(TypedDict, total=False):
135
+ by_alias: bool
136
+
137
+
134
138
  def model_dump(
135
139
  model: pydantic.BaseModel,
136
140
  *,
@@ -142,6 +146,9 @@ def model_dump(
142
146
  by_alias: bool | None = None,
143
147
  ) -> dict[str, Any]:
144
148
  if (not PYDANTIC_V1) or hasattr(model, "model_dump"):
149
+ kwargs: _ModelDumpKwargs = {}
150
+ if by_alias is not None:
151
+ kwargs["by_alias"] = by_alias
145
152
  return model.model_dump(
146
153
  mode=mode,
147
154
  exclude=exclude,
@@ -149,7 +156,7 @@ def model_dump(
149
156
  exclude_defaults=exclude_defaults,
150
157
  # warnings are not supported in Pydantic v1
151
158
  warnings=True if PYDANTIC_V1 else warnings,
152
- by_alias=by_alias,
159
+ **kwargs,
153
160
  )
154
161
  return cast(
155
162
  "dict[str, Any]",
@@ -3,8 +3,8 @@ from __future__ import annotations
3
3
  import io
4
4
  import os
5
5
  import pathlib
6
- from typing import overload
7
- from typing_extensions import TypeGuard
6
+ from typing import Sequence, cast, overload
7
+ from typing_extensions import TypeVar, TypeGuard
8
8
 
9
9
  import anyio
10
10
 
@@ -17,7 +17,9 @@ from ._types import (
17
17
  HttpxFileContent,
18
18
  HttpxRequestFiles,
19
19
  )
20
- from ._utils import is_tuple_t, is_mapping_t, is_sequence_t
20
+ from ._utils import is_list, is_mapping, is_tuple_t, is_mapping_t, is_sequence_t
21
+
22
+ _T = TypeVar("_T")
21
23
 
22
24
 
23
25
  def is_base64_file_input(obj: object) -> TypeGuard[Base64FileInput]:
@@ -121,3 +123,51 @@ async def async_read_file_content(file: FileContent) -> HttpxFileContent:
121
123
  return await anyio.Path(file).read_bytes()
122
124
 
123
125
  return file
126
+
127
+
128
+ def deepcopy_with_paths(item: _T, paths: Sequence[Sequence[str]]) -> _T:
129
+ """Copy only the containers along the given paths.
130
+
131
+ Used to guard against mutation by extract_files without copying the entire structure.
132
+ Only dicts and lists that lie on a path are copied; everything else
133
+ is returned by reference.
134
+
135
+ For example, given paths=[["foo", "files", "file"]] and the structure:
136
+ {
137
+ "foo": {
138
+ "bar": {"baz": {}},
139
+ "files": {"file": <content>}
140
+ }
141
+ }
142
+ The root dict, "foo", and "files" are copied (they lie on the path).
143
+ "bar" and "baz" are returned by reference (off the path).
144
+ """
145
+ return _deepcopy_with_paths(item, paths, 0)
146
+
147
+
148
+ def _deepcopy_with_paths(item: _T, paths: Sequence[Sequence[str]], index: int) -> _T:
149
+ if not paths:
150
+ return item
151
+ if is_mapping(item):
152
+ key_to_paths: dict[str, list[Sequence[str]]] = {}
153
+ for path in paths:
154
+ if index < len(path):
155
+ key_to_paths.setdefault(path[index], []).append(path)
156
+
157
+ # if no path continues through this mapping, it won't be mutated and copying it is redundant
158
+ if not key_to_paths:
159
+ return item
160
+
161
+ result = dict(item)
162
+ for key, subpaths in key_to_paths.items():
163
+ if key in result:
164
+ result[key] = _deepcopy_with_paths(result[key], subpaths, index + 1)
165
+ return cast(_T, result)
166
+ if is_list(item):
167
+ array_paths = [path for path in paths if index < len(path) and path[index] == "<array>"]
168
+
169
+ # if no path expects a list here, nothing will be mutated inside it - return by reference
170
+ if not array_paths:
171
+ return cast(_T, item)
172
+ return cast(_T, [_deepcopy_with_paths(entry, array_paths, index + 1) for entry in item])
173
+ return item
@@ -2,17 +2,13 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any, List, Tuple, Union, Mapping, TypeVar
4
4
  from urllib.parse import parse_qs, urlencode
5
- from typing_extensions import Literal, get_args
5
+ from typing_extensions import get_args
6
6
 
7
- from ._types import NotGiven, not_given
7
+ from ._types import NotGiven, ArrayFormat, NestedFormat, not_given
8
8
  from ._utils import flatten
9
9
 
10
10
  _T = TypeVar("_T")
11
11
 
12
-
13
- ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
14
- NestedFormat = Literal["dots", "brackets"]
15
-
16
12
  PrimitiveData = Union[str, int, float, bool, None]
17
13
  # this should be Data = Union[PrimitiveData, "List[Data]", "Tuple[Data]", "Mapping[str, Data]"]
18
14
  # https://github.com/microsoft/pyright/issues/3555
@@ -101,7 +97,10 @@ class Querystring:
101
97
  items.extend(self._stringify_item(key, item, opts))
102
98
  return items
103
99
  elif array_format == "indices":
104
- raise NotImplementedError("The array indices format is not supported yet")
100
+ items = []
101
+ for i, item in enumerate(value):
102
+ items.extend(self._stringify_item(f"{key}[{i}]", item, opts))
103
+ return items
105
104
  elif array_format == "brackets":
106
105
  items = []
107
106
  key = key + "[]"
@@ -47,6 +47,9 @@ AnyMapping = Mapping[str, object]
47
47
  ModelT = TypeVar("ModelT", bound=pydantic.BaseModel)
48
48
  _T = TypeVar("_T")
49
49
 
50
+ ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
51
+ NestedFormat = Literal["dots", "brackets"]
52
+
50
53
 
51
54
  # Approximates httpx internal ProxiesTypes and RequestFiles types
52
55
  # while adding support for `PathLike` instances
@@ -1,3 +1,4 @@
1
+ from ._path import path_template as path_template
1
2
  from ._sync import asyncify as asyncify
2
3
  from ._proxy import LazyProxy as LazyProxy
3
4
  from ._utils import (
@@ -23,7 +24,6 @@ from ._utils import (
23
24
  coerce_integer as coerce_integer,
24
25
  file_from_path as file_from_path,
25
26
  strip_not_given as strip_not_given,
26
- deepcopy_minimal as deepcopy_minimal,
27
27
  get_async_library as get_async_library,
28
28
  maybe_coerce_float as maybe_coerce_float,
29
29
  get_required_header as get_required_header,