azure-ai-evaluation 1.0.1__tar.gz → 1.1.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.

Potentially problematic release.


This version of azure-ai-evaluation might be problematic. Click here for more details.

Files changed (173) hide show
  1. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/CHANGELOG.md +8 -1
  2. {azure_ai_evaluation-1.0.1/azure_ai_evaluation.egg-info → azure_ai_evaluation-1.1.0}/PKG-INFO +15 -10
  3. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/README.md +6 -6
  4. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/TROUBLESHOOTING.md +5 -1
  5. azure_ai_evaluation-1.1.0/azure/ai/evaluation/_azure/_clients.py +188 -0
  6. azure_ai_evaluation-1.1.0/azure/ai/evaluation/_azure/_models.py +227 -0
  7. azure_ai_evaluation-1.1.0/azure/ai/evaluation/_azure/_token_manager.py +118 -0
  8. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/rai_service.py +30 -21
  9. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_constants.py +1 -0
  10. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/target_run_context.py +1 -1
  11. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_eval_run.py +14 -43
  12. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_evaluate.py +9 -34
  13. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_utils.py +66 -34
  14. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_common/_base_eval.py +71 -1
  15. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_common/_base_prompty_eval.py +12 -1
  16. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_common/_base_rai_svc_eval.py +33 -1
  17. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_content_safety.py +3 -3
  18. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_similarity/_similarity.py +1 -1
  19. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_http_utils.py +6 -4
  20. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/rouge_scorer.py +0 -4
  21. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/scoring.py +0 -4
  22. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/tokenize.py +0 -4
  23. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_version.py +1 -1
  24. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_adversarial_scenario.py +2 -0
  25. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_adversarial_simulator.py +35 -16
  26. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_conversation/__init__.py +128 -7
  27. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_conversation/_conversation.py +0 -1
  28. azure_ai_evaluation-1.1.0/azure/ai/evaluation/simulator/_data_sources/__init__.py +3 -0
  29. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_indirect_attack_simulator.py +1 -0
  30. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/_rai_client.py +40 -0
  31. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/_template_handler.py +1 -0
  32. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_simulator.py +3 -0
  33. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0/azure_ai_evaluation.egg-info}/PKG-INFO +15 -10
  34. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/SOURCES.txt +8 -0
  35. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/requires.txt +1 -3
  36. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/setup.py +1 -5
  37. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/conftest.py +76 -31
  38. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/test_adv_simulator.py +222 -4
  39. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/test_builtin_evaluators.py +103 -45
  40. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/test_evaluate.py +50 -23
  41. azure_ai_evaluation-1.1.0/tests/e2etests/test_lite_management_client.py +72 -0
  42. azure_ai_evaluation-1.1.0/tests/e2etests/test_mass_evaluate.py +381 -0
  43. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/test_metrics_upload.py +30 -19
  44. azure_ai_evaluation-1.1.0/tests/e2etests/test_sim_and_eval.py +398 -0
  45. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_batch_run_context.py +2 -2
  46. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_content_safety_rai_script.py +2 -0
  47. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_eval_run.py +23 -23
  48. azure_ai_evaluation-1.1.0/tests/unittests/test_evaluate_performance.py +82 -0
  49. azure_ai_evaluation-1.1.0/tests/unittests/test_evaluators/slow_eval.py +34 -0
  50. azure_ai_evaluation-1.0.1/tests/e2etests/test_sim_and_eval.py +0 -129
  51. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/MANIFEST.in +0 -0
  52. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/NOTICE.txt +0 -0
  53. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/__init__.py +0 -0
  54. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/__init__.py +0 -0
  55. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/__init__.py +0 -0
  56. {azure_ai_evaluation-1.0.1/azure/ai/evaluation/_evaluate → azure_ai_evaluation-1.1.0/azure/ai/evaluation/_azure}/__init__.py +0 -0
  57. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/__init__.py +0 -0
  58. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/_experimental.py +0 -0
  59. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/constants.py +0 -0
  60. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/math.py +0 -0
  61. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/utils.py +0 -0
  62. {azure_ai_evaluation-1.0.1/azure/ai/evaluation/_evaluators → azure_ai_evaluation-1.1.0/azure/ai/evaluation/_evaluate}/__init__.py +0 -0
  63. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/__init__.py +0 -0
  64. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/code_client.py +0 -0
  65. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/eval_run_context.py +0 -0
  66. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/proxy_client.py +0 -0
  67. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_telemetry/__init__.py +0 -0
  68. {azure_ai_evaluation-1.0.1/azure/ai/evaluation/_vendor → azure_ai_evaluation-1.1.0/azure/ai/evaluation/_evaluators}/__init__.py +0 -0
  69. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_bleu/__init__.py +0 -0
  70. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_bleu/_bleu.py +0 -0
  71. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_coherence/__init__.py +0 -0
  72. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_coherence/_coherence.py +0 -0
  73. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_coherence/coherence.prompty +0 -0
  74. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_common/__init__.py +0 -0
  75. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/__init__.py +0 -0
  76. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_hate_unfairness.py +0 -0
  77. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_self_harm.py +0 -0
  78. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_sexual.py +0 -0
  79. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_violence.py +0 -0
  80. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_eci/__init__.py +0 -0
  81. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_eci/_eci.py +0 -0
  82. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_f1_score/__init__.py +0 -0
  83. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_f1_score/_f1_score.py +0 -0
  84. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_fluency/__init__.py +0 -0
  85. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_fluency/_fluency.py +0 -0
  86. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_fluency/fluency.prompty +0 -0
  87. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_gleu/__init__.py +0 -0
  88. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_gleu/_gleu.py +0 -0
  89. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_groundedness/__init__.py +0 -0
  90. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_groundedness/_groundedness.py +0 -0
  91. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_groundedness/groundedness_with_query.prompty +0 -0
  92. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_groundedness/groundedness_without_query.prompty +0 -0
  93. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_meteor/__init__.py +0 -0
  94. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_meteor/_meteor.py +0 -0
  95. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/__init__.py +0 -0
  96. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_content_safety_multimodal.py +0 -0
  97. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_content_safety_multimodal_base.py +0 -0
  98. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_hate_unfairness.py +0 -0
  99. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_protected_material.py +0 -0
  100. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_self_harm.py +0 -0
  101. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_sexual.py +0 -0
  102. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_violence.py +0 -0
  103. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_protected_material/__init__.py +0 -0
  104. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_protected_material/_protected_material.py +0 -0
  105. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_qa/__init__.py +0 -0
  106. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_qa/_qa.py +0 -0
  107. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_relevance/__init__.py +0 -0
  108. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_relevance/_relevance.py +0 -0
  109. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_relevance/relevance.prompty +0 -0
  110. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_retrieval/__init__.py +0 -0
  111. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_retrieval/_retrieval.py +0 -0
  112. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_retrieval/retrieval.prompty +0 -0
  113. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_rouge/__init__.py +0 -0
  114. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_rouge/_rouge.py +0 -0
  115. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_service_groundedness/__init__.py +0 -0
  116. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_service_groundedness/_service_groundedness.py +0 -0
  117. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_similarity/__init__.py +0 -0
  118. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_similarity/similarity.prompty +0 -0
  119. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_xpia/__init__.py +0 -0
  120. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_xpia/xpia.py +0 -0
  121. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_exceptions.py +0 -0
  122. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_model_configurations.py +0 -0
  123. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_user_agent.py +0 -0
  124. {azure_ai_evaluation-1.0.1/azure/ai/evaluation/simulator/_data_sources → azure_ai_evaluation-1.1.0/azure/ai/evaluation/_vendor}/__init__.py +0 -0
  125. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/__init__.py +0 -0
  126. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/tokenizers.py +0 -0
  127. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/py.typed +0 -0
  128. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/__init__.py +0 -0
  129. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_constants.py +0 -0
  130. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_conversation/constants.py +0 -0
  131. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_data_sources/grounding.json +0 -0
  132. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_direct_attack_simulator.py +0 -0
  133. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_helpers/__init__.py +0 -0
  134. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_helpers/_language_suffix_mapping.py +0 -0
  135. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_helpers/_simulator_data_classes.py +0 -0
  136. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/__init__.py +0 -0
  137. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/_identity_manager.py +0 -0
  138. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/_proxy_completion_model.py +0 -0
  139. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/models.py +0 -0
  140. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_prompty/__init__.py +0 -0
  141. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty +0 -0
  142. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty +0 -0
  143. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_tracing.py +0 -0
  144. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_utils.py +0 -0
  145. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/dependency_links.txt +0 -0
  146. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/not-zip-safe +0 -0
  147. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/top_level.txt +0 -0
  148. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/pyproject.toml +0 -0
  149. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/README.md +0 -0
  150. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/data/evaluate_test_data.jsonl +0 -0
  151. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/evaluation_samples_common.py +0 -0
  152. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/evaluation_samples_evaluate.py +0 -0
  153. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/evaluation_samples_simulate.py +0 -0
  154. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/setup.cfg +0 -0
  155. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/__init__.py +0 -0
  156. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/__openai_patcher.py +0 -0
  157. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/__pf_service_isolation.py +0 -0
  158. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/__init__.py +0 -0
  159. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/custom_evaluators/answer_length_with_aggregation.py +0 -0
  160. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/target_fn.py +0 -0
  161. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_built_in_evaluator.py +0 -0
  162. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_content_safety_defect_rate.py +0 -0
  163. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_evaluate.py +0 -0
  164. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_evaluate_telemetry.py +0 -0
  165. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_evaluators/apology_dag/apology.py +0 -0
  166. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_evaluators/test_inputs_evaluators.py +0 -0
  167. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_jailbreak_simulator.py +0 -0
  168. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_non_adv_simulator.py +0 -0
  169. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_save_eval.py +0 -0
  170. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_simulator.py +0 -0
  171. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_synthetic_callback_conv_bot.py +0 -0
  172. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_synthetic_conversation_bot.py +0 -0
  173. {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_utils.py +0 -0
@@ -1,10 +1,16 @@
1
1
  # Release History
2
2
 
3
+ ## 1.1.0 (2024-12-12)
4
+
5
+ ### Bugs Fixed
6
+ - Removed `[remote]` extra. This is no longer needed when tracking results in Azure AI Studio.
7
+ - Fixed `AttributeError: 'NoneType' object has no attribute 'get'` while running simulator with 1000+ results
8
+
3
9
  ## 1.0.1 (2024-11-15)
4
10
 
5
11
  ### Bugs Fixed
6
- - Fixed `[remote]` extra to be needed only when tracking results in Azure AI Studio.
7
12
  - Removing `azure-ai-inference` as dependency.
13
+ - Fixed `AttributeError: 'NoneType' object has no attribute 'get'` while running simulator with 1000+ results
8
14
 
9
15
  ## 1.0.0 (2024-11-13)
10
16
 
@@ -16,6 +22,7 @@
16
22
  - Fixed an issue where the `output_path` parameter in the `evaluate` API did not support relative path.
17
23
  - Output of adversarial simulators are of type `JsonLineList` and the helper function `to_eval_qr_json_lines` now outputs context from both user and assistant turns along with `category` if it exists in the conversation
18
24
  - Fixed an issue where during long-running simulations, API token expires causing "Forbidden" error. Instead, users can now set an environment variable `AZURE_TOKEN_REFRESH_INTERVAL` to refresh the token more frequently to prevent expiration and ensure continuous operation of the simulation.
25
+ - Fixed an issue with the `ContentSafetyEvaluator` that caused parallel execution of sub-evaluators to fail. Parallel execution is now enabled by default again, but can still be disabled via the '_parallel' boolean keyword argument during class initialization.
19
26
  - Fix `evaluate` function not producing aggregated metrics if ANY values to be aggregated were None, NaN, or
20
27
  otherwise difficult to process. Such values are ignored fully, so the aggregated metric of `[1, 2, 3, NaN]`
21
28
  would be 2, not 1.5.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: azure-ai-evaluation
3
- Version: 1.0.1
3
+ Version: 1.1.0
4
4
  Summary: Microsoft Azure Evaluation Library for Python
5
5
  Home-page: https://github.com/Azure/azure-sdk-for-python
6
6
  Author: Microsoft Corporation
@@ -28,8 +28,7 @@ Requires-Dist: pyjwt>=2.8.0
28
28
  Requires-Dist: azure-identity>=1.16.0
29
29
  Requires-Dist: azure-core>=1.30.2
30
30
  Requires-Dist: nltk>=3.9.1
31
- Provides-Extra: remote
32
- Requires-Dist: promptflow-azure<2.0.0,>=1.15.0; extra == "remote"
31
+ Requires-Dist: azure-storage-blob>=12.10.0
33
32
 
34
33
  # Azure AI Evaluation client library for Python
35
34
 
@@ -359,13 +358,13 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
359
358
  [evaluate_dataset]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/evaluate-sdk#evaluate-on-test-dataset-using-evaluate
360
359
  [evaluators]: https://learn.microsoft.com/python/api/azure-ai-evaluation/azure.ai.evaluation?view=azure-python-preview
361
360
  [evaluate_api]: https://learn.microsoft.com/python/api/azure-ai-evaluation/azure.ai.evaluation?view=azure-python-preview#azure-ai-evaluation-evaluate
362
- [evaluate_app]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/evaluate_app
361
+ [evaluate_app]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Supported_Evaluation_Targets/Evaluate_App_Endpoint
363
362
  [evaluation_tsg]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/evaluation/azure-ai-evaluation/TROUBLESHOOTING.md
364
363
  [ai_studio]: https://learn.microsoft.com/azure/ai-studio/what-is-ai-studio
365
364
  [ai_project]: https://learn.microsoft.com/azure/ai-studio/how-to/create-projects?tabs=ai-studio
366
365
  [azure_openai]: https://learn.microsoft.com/azure/ai-services/openai/
367
- [evaluate_models]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/evaluate_endpoints
368
- [custom_evaluators]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/evaluate_custom
366
+ [evaluate_models]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Supported_Evaluation_Targets/Evaluate_Base_Model_Endpoint
367
+ [custom_evaluators]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Supported_Evaluation_Metrics/Custom_Evaluators
369
368
  [evaluate_samples]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate
370
369
  [evaluation_metrics]: https://learn.microsoft.com/azure/ai-studio/concepts/evaluation-metrics-built-in
371
370
  [performance_and_quality_evaluators]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/evaluate-sdk#performance-and-quality-evaluators
@@ -373,18 +372,23 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
373
372
  [composite_evaluators]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/evaluate-sdk#composite-evaluators
374
373
  [adversarial_simulation_docs]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#generate-adversarial-simulations-for-safety-evaluation
375
374
  [adversarial_simulation_scenarios]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#supported-adversarial-simulation-scenarios
376
- [adversarial_simulation]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/simulate_adversarial
377
- [simulate_with_conversation_starter]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/simulate_conversation_starter
375
+ [adversarial_simulation]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Simulators/Simulate_Adversarial_Data
376
+ [simulate_with_conversation_starter]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Simulators/Simulate_Context-Relevant_Data/Simulate_From_Conversation_Starter
378
377
  [adversarial_jailbreak]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#simulating-jailbreak-attacks
379
378
 
380
-
381
379
  # Release History
382
380
 
381
+ ## 1.1.0 (2024-12-12)
382
+
383
+ ### Bugs Fixed
384
+ - Removed `[remote]` extra. This is no longer needed when tracking results in Azure AI Studio.
385
+ - Fixed `AttributeError: 'NoneType' object has no attribute 'get'` while running simulator with 1000+ results
386
+
383
387
  ## 1.0.1 (2024-11-15)
384
388
 
385
389
  ### Bugs Fixed
386
- - Fixed `[remote]` extra to be needed only when tracking results in Azure AI Studio.
387
390
  - Removing `azure-ai-inference` as dependency.
391
+ - Fixed `AttributeError: 'NoneType' object has no attribute 'get'` while running simulator with 1000+ results
388
392
 
389
393
  ## 1.0.0 (2024-11-13)
390
394
 
@@ -396,6 +400,7 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
396
400
  - Fixed an issue where the `output_path` parameter in the `evaluate` API did not support relative path.
397
401
  - Output of adversarial simulators are of type `JsonLineList` and the helper function `to_eval_qr_json_lines` now outputs context from both user and assistant turns along with `category` if it exists in the conversation
398
402
  - Fixed an issue where during long-running simulations, API token expires causing "Forbidden" error. Instead, users can now set an environment variable `AZURE_TOKEN_REFRESH_INTERVAL` to refresh the token more frequently to prevent expiration and ensure continuous operation of the simulation.
403
+ - Fixed an issue with the `ContentSafetyEvaluator` that caused parallel execution of sub-evaluators to fail. Parallel execution is now enabled by default again, but can still be disabled via the '_parallel' boolean keyword argument during class initialization.
399
404
  - Fix `evaluate` function not producing aggregated metrics if ANY values to be aggregated were None, NaN, or
400
405
  otherwise difficult to process. Such values are ignored fully, so the aggregated metric of `[1, 2, 3, NaN]`
401
406
  would be 2, not 1.5.
@@ -326,13 +326,13 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
326
326
  [evaluate_dataset]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/evaluate-sdk#evaluate-on-test-dataset-using-evaluate
327
327
  [evaluators]: https://learn.microsoft.com/python/api/azure-ai-evaluation/azure.ai.evaluation?view=azure-python-preview
328
328
  [evaluate_api]: https://learn.microsoft.com/python/api/azure-ai-evaluation/azure.ai.evaluation?view=azure-python-preview#azure-ai-evaluation-evaluate
329
- [evaluate_app]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/evaluate_app
329
+ [evaluate_app]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Supported_Evaluation_Targets/Evaluate_App_Endpoint
330
330
  [evaluation_tsg]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/evaluation/azure-ai-evaluation/TROUBLESHOOTING.md
331
331
  [ai_studio]: https://learn.microsoft.com/azure/ai-studio/what-is-ai-studio
332
332
  [ai_project]: https://learn.microsoft.com/azure/ai-studio/how-to/create-projects?tabs=ai-studio
333
333
  [azure_openai]: https://learn.microsoft.com/azure/ai-services/openai/
334
- [evaluate_models]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/evaluate_endpoints
335
- [custom_evaluators]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/evaluate_custom
334
+ [evaluate_models]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Supported_Evaluation_Targets/Evaluate_Base_Model_Endpoint
335
+ [custom_evaluators]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Supported_Evaluation_Metrics/Custom_Evaluators
336
336
  [evaluate_samples]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate
337
337
  [evaluation_metrics]: https://learn.microsoft.com/azure/ai-studio/concepts/evaluation-metrics-built-in
338
338
  [performance_and_quality_evaluators]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/evaluate-sdk#performance-and-quality-evaluators
@@ -340,6 +340,6 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
340
340
  [composite_evaluators]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/evaluate-sdk#composite-evaluators
341
341
  [adversarial_simulation_docs]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#generate-adversarial-simulations-for-safety-evaluation
342
342
  [adversarial_simulation_scenarios]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#supported-adversarial-simulation-scenarios
343
- [adversarial_simulation]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/simulate_adversarial
344
- [simulate_with_conversation_starter]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/simulate_conversation_starter
345
- [adversarial_jailbreak]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#simulating-jailbreak-attacks
343
+ [adversarial_simulation]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Simulators/Simulate_Adversarial_Data
344
+ [simulate_with_conversation_starter]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Simulators/Simulate_Context-Relevant_Data/Simulate_From_Conversation_Starter
345
+ [adversarial_jailbreak]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#simulating-jailbreak-attacks
@@ -26,6 +26,10 @@ This guide walks you through how to investigate failures, common errors in the `
26
26
  - Ensure that you assign the proper permissions to the storage account linked to your Azure AI Studio hub. This can be done with the following command. More information can be found [here](https://aka.ms/credentialleshub).
27
27
 
28
28
  ```Shell
29
+ # <mySubscriptionID>: Subscription ID of the Azure AI Studio hub's linked storage account (available in Azure AI hub resource view in Azure Portal).
30
+ # <myResourceGroupName>: Resource group of the Azure AI Studio hub's linked storage account.
31
+ # <user-id>: User object ID for role assignment (retrieve with "az ad user show" command).
32
+
29
33
  az role assignment create --role "Storage Blob Data Contributor" --scope /subscriptions/<mySubscriptionID>/resourceGroups/<myResourceGroupName> --assignee-principal-type User --assignee-object-id "<user-id>"
30
34
  ```
31
35
 
@@ -50,7 +54,7 @@ The Adversarial simulator does not support selecting individual harms, instead w
50
54
  ### Simulator is slow
51
55
 
52
56
  Identify the type of simulations being run (adversarial or non-adversarial).
53
- Adjust parameters such as `api_call_retry_sleep_sec`, `api_call_delay_sec`, and `concurrent_async_task`. Please note that rate limits to llm calls can be both tokens per minute and requests per minute.
57
+ Adjust parameters such as `api_call_retry_sleep_sec`, `api_call_delay_sec`, and `concurrent_async_task`. Please note that rate limits to llm calls can be both tokens per minute and requests per minute.
54
58
 
55
59
  ## Logging
56
60
 
@@ -0,0 +1,188 @@
1
+ # ---------------------------------------------------------
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # ---------------------------------------------------------
4
+
5
+ from logging import Logger
6
+ from typing import Any, Dict, Final, Optional, Set, Union, cast
7
+ from threading import Lock
8
+ from urllib.parse import quote
9
+ from json.decoder import JSONDecodeError
10
+
11
+ from azure.core.credentials import TokenCredential, AzureSasCredential
12
+ from azure.core.rest import HttpResponse
13
+ from azure.ai.evaluation._exceptions import ErrorBlame, ErrorCategory, ErrorTarget, EvaluationException
14
+ from azure.ai.evaluation._http_utils import HttpPipeline, get_http_client
15
+ from azure.ai.evaluation._azure._token_manager import AzureMLTokenManager
16
+ from azure.ai.evaluation.simulator._model_tools._identity_manager import TokenScope
17
+ from ._models import BlobStoreInfo, Workspace
18
+
19
+
20
+ API_VERSION: Final[str] = "2024-10-01"
21
+ QUERY_KEY_API_VERSION: Final[str] = "api-version"
22
+ PATH_ML_WORKSPACES = ("providers", "Microsoft.MachineLearningServices", "workspaces")
23
+
24
+
25
+ class LiteMLClient:
26
+ """A lightweight Azure ML API client.
27
+
28
+ :param subscription_id: Azure subscription ID
29
+ :type subscription_id: str
30
+ :param resource_group: Azure resource group name
31
+ :type resource_group: str
32
+ :param logger: Logger object
33
+ :type logger: logging.Logger
34
+ :keyword credential: Azure credentials
35
+ :paramtype credential: TokenCredential
36
+ :keyword kwargs: Additional keyword arguments
37
+ :paramtype kwargs: Dict
38
+ :keyword str api_version: The API version. Default is 2024-10-01
39
+ """
40
+
41
+ def __init__(
42
+ self,
43
+ subscription_id: str,
44
+ resource_group: str,
45
+ logger: Logger,
46
+ credential: Optional[TokenCredential] = None,
47
+ **kwargs: Any,
48
+ ) -> None:
49
+ subscription_id = quote(subscription_id, safe="")
50
+ resource_group = quote(resource_group, safe="")
51
+
52
+ self._base_url: Final[str] = (
53
+ f"https://management.azure.com/subscriptions/{subscription_id}/resourceGroups/{resource_group}"
54
+ )
55
+ self._logger: Final[Logger] = logger
56
+ self._api_version: Final[str] = kwargs.get("api_version", API_VERSION)
57
+ self._http_client: Final[HttpPipeline] = get_http_client(**kwargs)
58
+ self._lock: Final[Lock] = Lock()
59
+
60
+ # things that can change under lock
61
+ self._token_manager: Optional[AzureMLTokenManager] = None
62
+ self._credential: Optional[TokenCredential] = credential
63
+
64
+ def get_token(self) -> str:
65
+ return self._get_token_manager().get_token()
66
+
67
+ def get_credential(self) -> TokenCredential:
68
+ # load the token manager to get the credential if needed
69
+ self._get_token_manager()
70
+ return cast(TokenCredential, self._credential)
71
+
72
+ def workspace_get_default_datastore(self, workspace_name: str, include_credentials: bool = False) -> BlobStoreInfo:
73
+ # 1. Get the default blob store
74
+ # REST API documentation:
75
+ # https://learn.microsoft.com/rest/api/azureml/datastores/list?view=rest-azureml-2024-10-01
76
+ url = self._generate_path( # pylint: disable=specify-parameter-names-in-call
77
+ *PATH_ML_WORKSPACES, workspace_name, "datastores"
78
+ )
79
+ headers = self._get_headers()
80
+
81
+ stores_response = self._http_client.request(
82
+ method="GET",
83
+ url=url,
84
+ params={QUERY_KEY_API_VERSION: self._api_version, "isDefault": True, "count": 1, "orderByAsc": "false"},
85
+ headers=headers,
86
+ )
87
+ self._throw_on_http_error(stores_response, "list default workspace datastore")
88
+
89
+ json = stores_response.json()["value"][0]
90
+ props_json = json["properties"]
91
+ name = json["name"]
92
+ account_name = props_json["accountName"]
93
+ endpoint = props_json["endpoint"]
94
+ container_name = props_json["containerName"]
95
+
96
+ # 2. Get the SAS token to use for accessing the blob store
97
+ # REST API documentation:
98
+ # https://learn.microsoft.com/rest/api/azureml/datastores/list-secrets?view=rest-azureml-2024-10-01
99
+ blob_store_credential: Optional[Union[AzureSasCredential, str]] = None
100
+ if include_credentials:
101
+ url = self._generate_path(
102
+ *PATH_ML_WORKSPACES, workspace_name, "datastores", "workspaceblobstore", "listSecrets"
103
+ )
104
+ secrets_response = self._http_client.request(
105
+ method="POST",
106
+ url=url,
107
+ params={
108
+ QUERY_KEY_API_VERSION: self._api_version,
109
+ },
110
+ headers=headers,
111
+ )
112
+ self._throw_on_http_error(secrets_response, "workspace datastore secrets")
113
+
114
+ secrets_json = secrets_response.json()
115
+ secrets_type = secrets_json["secretsType"].lower()
116
+
117
+ if secrets_type == "sas":
118
+ blob_store_credential = AzureSasCredential(secrets_json["sasToken"])
119
+ elif secrets_type == "accountkey":
120
+ # To support olders versions of azure-storage-blob better, we return a string here instead of
121
+ # an AzureNamedKeyCredential
122
+ blob_store_credential = secrets_json["key"]
123
+ else:
124
+ raise EvaluationException(
125
+ message=f"The '{account_name}' blob store does not use a recognized credential type.",
126
+ internal_message=f"The credential type is '{secrets_type}'",
127
+ target=ErrorTarget.EVALUATE,
128
+ category=ErrorCategory.INVALID_VALUE,
129
+ blame=ErrorBlame.SYSTEM_ERROR,
130
+ )
131
+
132
+ return BlobStoreInfo(name, account_name, endpoint, container_name, blob_store_credential)
133
+
134
+ def workspace_get_info(self, workspace_name: str) -> Workspace:
135
+ # https://learn.microsoft.com/rest/api/azureml/workspaces/get?view=rest-azureml-2024-10-01
136
+ workspace_response = self._http_client.request(
137
+ "GET",
138
+ self._generate_path(*PATH_ML_WORKSPACES, workspace_name),
139
+ params={QUERY_KEY_API_VERSION: self._api_version},
140
+ headers=self._get_headers(),
141
+ )
142
+
143
+ self._throw_on_http_error(workspace_response, f"get '{workspace_name}' workspace")
144
+ workspace = Workspace.deserialize(workspace_response)
145
+ return workspace
146
+
147
+ def _get_token_manager(self) -> AzureMLTokenManager:
148
+ # Lazy init since getting credentials in the constructor can take a long time in some situations
149
+ if self._token_manager is None:
150
+ with self._lock:
151
+ if self._token_manager is None:
152
+ self._token_manager = AzureMLTokenManager(
153
+ TokenScope.DEFAULT_AZURE_MANAGEMENT.value, self._logger, credential=self._credential
154
+ )
155
+ self._credential = self._token_manager.credential
156
+
157
+ return self._token_manager
158
+
159
+ @staticmethod
160
+ def _throw_on_http_error(response: HttpResponse, description: str, valid_status: Optional[Set[int]] = None) -> None:
161
+ if valid_status and (response.status_code in valid_status):
162
+ return
163
+ if response.status_code >= 200 and response.status_code < 300:
164
+ # nothing to see here, move along
165
+ return
166
+
167
+ additional_info: Optional[str] = None
168
+ try:
169
+ error_json = response.json()["error"]
170
+ additional_info = f"({error_json['code']}) {error_json['message']}"
171
+ except (JSONDecodeError, ValueError, KeyError):
172
+ pass
173
+
174
+ raise EvaluationException(
175
+ message=f"The {description} request failed with HTTP {response.status_code}",
176
+ target=ErrorTarget.EVALUATE,
177
+ category=ErrorCategory.FAILED_EXECUTION,
178
+ blame=ErrorBlame.SYSTEM_ERROR,
179
+ internal_message=additional_info,
180
+ )
181
+
182
+ def _generate_path(self, *paths: str) -> str:
183
+ sanitized_paths = [quote(path, safe="") for path in paths]
184
+ url = self._base_url + "/" + str.join("/", sanitized_paths)
185
+ return url
186
+
187
+ def _get_headers(self) -> Dict[str, str]:
188
+ return {"Authorization": f"Bearer {self.get_token()}", "Content-Type": "application/json"}
@@ -0,0 +1,227 @@
1
+ # ---------------------------------------------------------
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # ---------------------------------------------------------
4
+
5
+ # pylint: disable=too-many-instance-attributes
6
+ # pylint: disable=too-many-locals
7
+ # pylint: disable=line-too-long
8
+
9
+ from typing import Dict, List, NamedTuple, Optional, Union
10
+ from msrest.serialization import Model
11
+ from azure.core.credentials import AzureSasCredential
12
+
13
+
14
+ class BlobStoreInfo(NamedTuple):
15
+ name: str
16
+ account_name: str
17
+ endpoint: str
18
+ container_name: str
19
+ credential: Optional[Union[AzureSasCredential, str]]
20
+
21
+
22
+ class WorkspaceHubConfig(Model):
23
+ """WorkspaceHub's configuration object."""
24
+
25
+ _attribute_map = {
26
+ "additional_workspace_storage_accounts": {"key": "additionalWorkspaceStorageAccounts", "type": "[str]"},
27
+ "default_workspace_resource_group": {"key": "defaultWorkspaceResourceGroup", "type": "str"},
28
+ }
29
+
30
+ def __init__(
31
+ self,
32
+ *,
33
+ additional_workspace_storage_accounts: Optional[List[str]] = None,
34
+ default_workspace_resource_group: Optional[str] = None,
35
+ **kwargs
36
+ ):
37
+ super(WorkspaceHubConfig, self).__init__(**kwargs)
38
+ self.additional_workspace_storage_accounts = additional_workspace_storage_accounts
39
+ self.default_workspace_resource_group = default_workspace_resource_group
40
+
41
+
42
+ class Workspace(Model):
43
+ """An object that represents a machine learning workspace.
44
+
45
+ Variables are only populated by the server, and will be ignored when sending a request."""
46
+
47
+ _validation = {
48
+ "id": {"readonly": True},
49
+ "name": {"readonly": True},
50
+ "type": {"readonly": True},
51
+ #'system_data': {'readonly': True},
52
+ "agents_endpoint_uri": {"readonly": True},
53
+ "ml_flow_tracking_uri": {"readonly": True},
54
+ #'notebook_info': {'readonly': True},
55
+ "private_endpoint_connections": {"readonly": True},
56
+ #'private_link_count': {'readonly': True},
57
+ "provisioning_state": {"readonly": True},
58
+ "service_provisioned_resource_group": {"readonly": True},
59
+ "storage_hns_enabled": {"readonly": True},
60
+ "tenant_id": {"readonly": True},
61
+ "workspace_id": {"readonly": True},
62
+ }
63
+
64
+ _attribute_map = {
65
+ "id": {"key": "id", "type": "str"},
66
+ "name": {"key": "name", "type": "str"},
67
+ "type": {"key": "type", "type": "str"},
68
+ #'system_data': {'key': 'systemData', 'type': 'SystemData'},
69
+ #'identity': {'key': 'identity', 'type': 'ManagedServiceIdentity'},
70
+ "kind": {"key": "kind", "type": "str"},
71
+ "location": {"key": "location", "type": "str"},
72
+ #'sku': {'key': 'sku', 'type': 'Sku'},
73
+ "tags": {"key": "tags", "type": "{str}"},
74
+ "agents_endpoint_uri": {"key": "properties.agentsEndpointUri", "type": "str"},
75
+ "allow_public_access_when_behind_vnet": {"key": "properties.allowPublicAccessWhenBehindVnet", "type": "bool"},
76
+ "allow_role_assignment_on_rg": {"key": "properties.allowRoleAssignmentOnRG", "type": "bool"},
77
+ "application_insights": {"key": "properties.applicationInsights", "type": "str"},
78
+ "associated_workspaces": {"key": "properties.associatedWorkspaces", "type": "[str]"},
79
+ "container_registries": {"key": "properties.containerRegistries", "type": "[str]"},
80
+ "container_registry": {"key": "properties.containerRegistry", "type": "str"},
81
+ "description": {"key": "properties.description", "type": "str"},
82
+ "discovery_url": {"key": "properties.discoveryUrl", "type": "str"},
83
+ "enable_data_isolation": {"key": "properties.enableDataIsolation", "type": "bool"},
84
+ "enable_service_side_cmk_encryption": {"key": "properties.enableServiceSideCMKEncryption", "type": "bool"},
85
+ "enable_simplified_cmk": {"key": "properties.enableSimplifiedCmk", "type": "bool"},
86
+ "enable_software_bill_of_materials": {"key": "properties.enableSoftwareBillOfMaterials", "type": "bool"},
87
+ #'encryption': {'key': 'properties.encryption', 'type': 'EncryptionProperty'},
88
+ "existing_workspaces": {"key": "properties.existingWorkspaces", "type": "[str]"},
89
+ #'feature_store_settings': {'key': 'properties.featureStoreSettings', 'type': 'FeatureStoreSettings'},
90
+ "friendly_name": {"key": "properties.friendlyName", "type": "str"},
91
+ "hbi_workspace": {"key": "properties.hbiWorkspace", "type": "bool"},
92
+ "hub_resource_id": {"key": "properties.hubResourceId", "type": "str"},
93
+ "image_build_compute": {"key": "properties.imageBuildCompute", "type": "str"},
94
+ "ip_allowlist": {"key": "properties.ipAllowlist", "type": "[str]"},
95
+ "key_vault": {"key": "properties.keyVault", "type": "str"},
96
+ "key_vaults": {"key": "properties.keyVaults", "type": "[str]"},
97
+ #'managed_network': {'key': 'properties.managedNetwork', 'type': 'ManagedNetworkSettings'},
98
+ "ml_flow_tracking_uri": {"key": "properties.mlFlowTrackingUri", "type": "str"},
99
+ #'network_acls': {'key': 'properties.networkAcls', 'type': 'NetworkAcls'},
100
+ #'notebook_info': {'key': 'properties.notebookInfo', 'type': 'NotebookResourceInfo'},
101
+ "primary_user_assigned_identity": {"key": "properties.primaryUserAssignedIdentity", "type": "str"},
102
+ "private_endpoint_connections": {
103
+ "key": "properties.privateEndpointConnections",
104
+ "type": "[PrivateEndpointConnection]",
105
+ },
106
+ "private_link_count": {"key": "properties.privateLinkCount", "type": "int"},
107
+ "provision_network_now": {"key": "properties.provisionNetworkNow", "type": "bool"},
108
+ "provisioning_state": {"key": "properties.provisioningState", "type": "str"},
109
+ #'public_network_access': {'key': 'properties.publicNetworkAccess', 'type': 'str'},
110
+ #'serverless_compute_settings': {'key': 'properties.serverlessComputeSettings', 'type': 'ServerlessComputeSettings'},
111
+ #'service_managed_resources_settings': {'key': 'properties.serviceManagedResourcesSettings', 'type': 'ServiceManagedResourcesSettings'},
112
+ "service_provisioned_resource_group": {"key": "properties.serviceProvisionedResourceGroup", "type": "str"},
113
+ #'shared_private_link_resources': {'key': 'properties.sharedPrivateLinkResources', 'type': '[SharedPrivateLinkResource]'},
114
+ "soft_delete_retention_in_days": {"key": "properties.softDeleteRetentionInDays", "type": "int"},
115
+ "storage_account": {"key": "properties.storageAccount", "type": "str"},
116
+ "storage_accounts": {"key": "properties.storageAccounts", "type": "[str]"},
117
+ "storage_hns_enabled": {"key": "properties.storageHnsEnabled", "type": "bool"},
118
+ #'system_datastores_auth_mode': {'key': 'properties.systemDatastoresAuthMode', 'type': 'str'},
119
+ "tenant_id": {"key": "properties.tenantId", "type": "str"},
120
+ "v1_legacy_mode": {"key": "properties.v1LegacyMode", "type": "bool"},
121
+ "workspace_hub_config": {"key": "properties.workspaceHubConfig", "type": "WorkspaceHubConfig"},
122
+ "workspace_id": {"key": "properties.workspaceId", "type": "str"},
123
+ }
124
+
125
+ def __init__(
126
+ self,
127
+ *,
128
+ # system_data: Optional[SystemData] = None,
129
+ # identity: Optional["ManagedServiceIdentity"] = None,
130
+ kind: Optional[str] = None,
131
+ location: Optional[str] = None,
132
+ # sku: Optional["Sku"] = None,
133
+ tags: Optional[Dict[str, str]] = None,
134
+ allow_public_access_when_behind_vnet: Optional[bool] = None,
135
+ allow_role_assignment_on_rg: Optional[bool] = None,
136
+ application_insights: Optional[str] = None,
137
+ associated_workspaces: Optional[List[str]] = None,
138
+ container_registries: Optional[List[str]] = None,
139
+ container_registry: Optional[str] = None,
140
+ description: Optional[str] = None,
141
+ discovery_url: Optional[str] = None,
142
+ enable_data_isolation: Optional[bool] = None,
143
+ enable_service_side_cmk_encryption: Optional[bool] = None,
144
+ enable_simplified_cmk: Optional[bool] = None,
145
+ enable_software_bill_of_materials: Optional[bool] = None,
146
+ # encryption: Optional["EncryptionProperty"] = None,
147
+ existing_workspaces: Optional[List[str]] = None,
148
+ # feature_store_settings: Optional["FeatureStoreSettings"] = None,
149
+ friendly_name: Optional[str] = None,
150
+ hbi_workspace: Optional[bool] = None,
151
+ hub_resource_id: Optional[str] = None,
152
+ image_build_compute: Optional[str] = None,
153
+ ip_allowlist: Optional[List[str]] = None,
154
+ key_vault: Optional[str] = None,
155
+ key_vaults: Optional[List[str]] = None,
156
+ # managed_network: Optional["ManagedNetworkSettings"] = None,
157
+ # network_acls: Optional["NetworkAcls"] = None,
158
+ primary_user_assigned_identity: Optional[str] = None,
159
+ provision_network_now: Optional[bool] = None,
160
+ # public_network_access: Optional[Union[str, "PublicNetworkAccessType"]] = None,
161
+ # serverless_compute_settings: Optional["ServerlessComputeSettings"] = None,
162
+ # service_managed_resources_settings: Optional["ServiceManagedResourcesSettings"] = None,
163
+ # shared_private_link_resources: Optional[List["SharedPrivateLinkResource"]] = None,
164
+ soft_delete_retention_in_days: Optional[int] = None,
165
+ storage_account: Optional[str] = None,
166
+ storage_accounts: Optional[List[str]] = None,
167
+ # system_datastores_auth_mode: Optional[Union[str, "SystemDatastoresAuthMode"]] = None,
168
+ v1_legacy_mode: Optional[bool] = None,
169
+ workspace_hub_config: Optional["WorkspaceHubConfig"] = None,
170
+ **kwargs
171
+ ):
172
+ super(Workspace, self).__init__(**kwargs)
173
+ self.id: Optional[str] = None
174
+ self.name: Optional[str] = None
175
+ self.type: Optional[str] = None
176
+ # self.system_data = system_data
177
+ # self.identity = identity
178
+ self.kind = kind
179
+ self.location = location
180
+ # self.sku = sku
181
+ self.tags = tags
182
+ self.agents_endpoint_uri = None
183
+ self.allow_public_access_when_behind_vnet = allow_public_access_when_behind_vnet
184
+ self.allow_role_assignment_on_rg = allow_role_assignment_on_rg
185
+ self.application_insights = application_insights
186
+ self.associated_workspaces = associated_workspaces
187
+ self.container_registries = container_registries
188
+ self.container_registry = container_registry
189
+ self.description = description
190
+ self.discovery_url = discovery_url
191
+ self.enable_data_isolation = enable_data_isolation
192
+ self.enable_service_side_cmk_encryption = enable_service_side_cmk_encryption
193
+ self.enable_simplified_cmk = enable_simplified_cmk
194
+ self.enable_software_bill_of_materials = enable_software_bill_of_materials
195
+ # self.encryption = encryption
196
+ self.existing_workspaces = existing_workspaces
197
+ # self.feature_store_settings = feature_store_settings
198
+ self.friendly_name = friendly_name
199
+ self.hbi_workspace = hbi_workspace
200
+ self.hub_resource_id = hub_resource_id
201
+ self.image_build_compute = image_build_compute
202
+ self.ip_allowlist = ip_allowlist
203
+ self.key_vault = key_vault
204
+ self.key_vaults = key_vaults
205
+ # self.managed_network = managed_network
206
+ self.ml_flow_tracking_uri = None
207
+ # self.network_acls = network_acls
208
+ # self.notebook_info = None
209
+ self.primary_user_assigned_identity = primary_user_assigned_identity
210
+ self.private_endpoint_connections = None
211
+ self.private_link_count = None
212
+ self.provision_network_now = provision_network_now
213
+ self.provisioning_state = None
214
+ # self.public_network_access = public_network_access
215
+ # self.serverless_compute_settings = serverless_compute_settings
216
+ # self.service_managed_resources_settings = service_managed_resources_settings
217
+ self.service_provisioned_resource_group = None
218
+ # self.shared_private_link_resources = shared_private_link_resources
219
+ self.soft_delete_retention_in_days = soft_delete_retention_in_days
220
+ self.storage_account = storage_account
221
+ self.storage_accounts = storage_accounts
222
+ self.storage_hns_enabled = None
223
+ # self.system_datastores_auth_mode = system_datastores_auth_mode
224
+ self.tenant_id = None
225
+ self.v1_legacy_mode = v1_legacy_mode
226
+ self.workspace_hub_config = workspace_hub_config
227
+ self.workspace_id = None