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.
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/CHANGELOG.md +8 -1
- {azure_ai_evaluation-1.0.1/azure_ai_evaluation.egg-info → azure_ai_evaluation-1.1.0}/PKG-INFO +15 -10
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/README.md +6 -6
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/TROUBLESHOOTING.md +5 -1
- azure_ai_evaluation-1.1.0/azure/ai/evaluation/_azure/_clients.py +188 -0
- azure_ai_evaluation-1.1.0/azure/ai/evaluation/_azure/_models.py +227 -0
- azure_ai_evaluation-1.1.0/azure/ai/evaluation/_azure/_token_manager.py +118 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/rai_service.py +30 -21
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_constants.py +1 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/target_run_context.py +1 -1
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_eval_run.py +14 -43
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_evaluate.py +9 -34
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_utils.py +66 -34
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_common/_base_eval.py +71 -1
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_common/_base_prompty_eval.py +12 -1
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_common/_base_rai_svc_eval.py +33 -1
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_content_safety.py +3 -3
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_similarity/_similarity.py +1 -1
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_http_utils.py +6 -4
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/rouge_scorer.py +0 -4
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/scoring.py +0 -4
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/tokenize.py +0 -4
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_version.py +1 -1
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_adversarial_scenario.py +2 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_adversarial_simulator.py +35 -16
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_conversation/__init__.py +128 -7
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_conversation/_conversation.py +0 -1
- azure_ai_evaluation-1.1.0/azure/ai/evaluation/simulator/_data_sources/__init__.py +3 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_indirect_attack_simulator.py +1 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/_rai_client.py +40 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/_template_handler.py +1 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_simulator.py +3 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0/azure_ai_evaluation.egg-info}/PKG-INFO +15 -10
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/SOURCES.txt +8 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/requires.txt +1 -3
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/setup.py +1 -5
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/conftest.py +76 -31
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/test_adv_simulator.py +222 -4
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/test_builtin_evaluators.py +103 -45
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/test_evaluate.py +50 -23
- azure_ai_evaluation-1.1.0/tests/e2etests/test_lite_management_client.py +72 -0
- azure_ai_evaluation-1.1.0/tests/e2etests/test_mass_evaluate.py +381 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/test_metrics_upload.py +30 -19
- azure_ai_evaluation-1.1.0/tests/e2etests/test_sim_and_eval.py +398 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_batch_run_context.py +2 -2
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_content_safety_rai_script.py +2 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_eval_run.py +23 -23
- azure_ai_evaluation-1.1.0/tests/unittests/test_evaluate_performance.py +82 -0
- azure_ai_evaluation-1.1.0/tests/unittests/test_evaluators/slow_eval.py +34 -0
- azure_ai_evaluation-1.0.1/tests/e2etests/test_sim_and_eval.py +0 -129
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/MANIFEST.in +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/NOTICE.txt +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1/azure/ai/evaluation/_evaluate → azure_ai_evaluation-1.1.0/azure/ai/evaluation/_azure}/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/_experimental.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/constants.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/math.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_common/utils.py +0 -0
- {azure_ai_evaluation-1.0.1/azure/ai/evaluation/_evaluators → azure_ai_evaluation-1.1.0/azure/ai/evaluation/_evaluate}/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/code_client.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/eval_run_context.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_batch_run/proxy_client.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluate/_telemetry/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1/azure/ai/evaluation/_vendor → azure_ai_evaluation-1.1.0/azure/ai/evaluation/_evaluators}/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_bleu/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_bleu/_bleu.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_coherence/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_coherence/_coherence.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_coherence/coherence.prompty +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_common/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_hate_unfairness.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_self_harm.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_sexual.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_content_safety/_violence.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_eci/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_eci/_eci.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_f1_score/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_f1_score/_f1_score.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_fluency/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_fluency/_fluency.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_fluency/fluency.prompty +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_gleu/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_gleu/_gleu.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_groundedness/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_groundedness/_groundedness.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_groundedness/groundedness_with_query.prompty +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_groundedness/groundedness_without_query.prompty +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_meteor/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_meteor/_meteor.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_content_safety_multimodal.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_content_safety_multimodal_base.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_hate_unfairness.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_protected_material.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_self_harm.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_sexual.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_multimodal/_violence.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_protected_material/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_protected_material/_protected_material.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_qa/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_qa/_qa.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_relevance/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_relevance/_relevance.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_relevance/relevance.prompty +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_retrieval/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_retrieval/_retrieval.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_retrieval/retrieval.prompty +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_rouge/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_rouge/_rouge.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_service_groundedness/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_service_groundedness/_service_groundedness.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_similarity/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_similarity/similarity.prompty +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_xpia/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_evaluators/_xpia/xpia.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_exceptions.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_model_configurations.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_user_agent.py +0 -0
- {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
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/_vendor/rouge_score/tokenizers.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/py.typed +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_constants.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_conversation/constants.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_data_sources/grounding.json +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_direct_attack_simulator.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_helpers/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_helpers/_language_suffix_mapping.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_helpers/_simulator_data_classes.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/_identity_manager.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/_proxy_completion_model.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_model_tools/models.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_prompty/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_prompty/task_query_response.prompty +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_prompty/task_simulate.prompty +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_tracing.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure/ai/evaluation/simulator/_utils.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/dependency_links.txt +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/not-zip-safe +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/azure_ai_evaluation.egg-info/top_level.txt +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/pyproject.toml +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/README.md +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/data/evaluate_test_data.jsonl +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/evaluation_samples_common.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/evaluation_samples_evaluate.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/samples/evaluation_samples_simulate.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/setup.cfg +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/__openai_patcher.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/__pf_service_isolation.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/__init__.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/custom_evaluators/answer_length_with_aggregation.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/e2etests/target_fn.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_built_in_evaluator.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_content_safety_defect_rate.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_evaluate.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_evaluate_telemetry.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_evaluators/apology_dag/apology.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_evaluators/test_inputs_evaluators.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_jailbreak_simulator.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_non_adv_simulator.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_save_eval.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_simulator.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_synthetic_callback_conv_bot.py +0 -0
- {azure_ai_evaluation-1.0.1 → azure_ai_evaluation-1.1.0}/tests/unittests/test_synthetic_conversation_bot.py +0 -0
- {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.
|
{azure_ai_evaluation-1.0.1/azure_ai_evaluation.egg-info → azure_ai_evaluation-1.1.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: azure-ai-evaluation
|
|
3
|
-
Version: 1.0
|
|
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
|
-
|
|
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/
|
|
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/
|
|
368
|
-
[custom_evaluators]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/
|
|
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/
|
|
377
|
-
[simulate_with_conversation_starter]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/
|
|
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/
|
|
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/
|
|
335
|
-
[custom_evaluators]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/
|
|
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/
|
|
344
|
-
[simulate_with_conversation_starter]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/
|
|
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
|