azure-ai-evaluation 1.0.1__py3-none-any.whl → 1.13.3__py3-none-any.whl

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 (277) hide show
  1. azure/ai/evaluation/__init__.py +83 -14
  2. azure/ai/evaluation/_aoai/__init__.py +10 -0
  3. azure/ai/evaluation/_aoai/aoai_grader.py +140 -0
  4. azure/ai/evaluation/_aoai/label_grader.py +68 -0
  5. azure/ai/evaluation/_aoai/python_grader.py +86 -0
  6. azure/ai/evaluation/_aoai/score_model_grader.py +94 -0
  7. azure/ai/evaluation/_aoai/string_check_grader.py +66 -0
  8. azure/ai/evaluation/_aoai/text_similarity_grader.py +80 -0
  9. azure/ai/evaluation/_azure/__init__.py +3 -0
  10. azure/ai/evaluation/_azure/_clients.py +204 -0
  11. azure/ai/evaluation/_azure/_envs.py +207 -0
  12. azure/ai/evaluation/_azure/_models.py +227 -0
  13. azure/ai/evaluation/_azure/_token_manager.py +129 -0
  14. azure/ai/evaluation/_common/__init__.py +9 -1
  15. azure/ai/evaluation/_common/constants.py +124 -2
  16. azure/ai/evaluation/_common/evaluation_onedp_client.py +169 -0
  17. azure/ai/evaluation/_common/onedp/__init__.py +32 -0
  18. azure/ai/evaluation/_common/onedp/_client.py +166 -0
  19. azure/ai/evaluation/_common/onedp/_configuration.py +72 -0
  20. azure/ai/evaluation/_common/onedp/_model_base.py +1232 -0
  21. azure/ai/evaluation/_common/onedp/_patch.py +21 -0
  22. azure/ai/evaluation/_common/onedp/_serialization.py +2032 -0
  23. azure/ai/evaluation/_common/onedp/_types.py +21 -0
  24. azure/ai/evaluation/_common/onedp/_utils/__init__.py +6 -0
  25. azure/ai/evaluation/_common/onedp/_utils/model_base.py +1232 -0
  26. azure/ai/evaluation/_common/onedp/_utils/serialization.py +2032 -0
  27. azure/ai/evaluation/_common/onedp/_validation.py +66 -0
  28. azure/ai/evaluation/_common/onedp/_vendor.py +50 -0
  29. azure/ai/evaluation/_common/onedp/_version.py +9 -0
  30. azure/ai/evaluation/_common/onedp/aio/__init__.py +29 -0
  31. azure/ai/evaluation/_common/onedp/aio/_client.py +168 -0
  32. azure/ai/evaluation/_common/onedp/aio/_configuration.py +72 -0
  33. azure/ai/evaluation/_common/onedp/aio/_patch.py +21 -0
  34. azure/ai/evaluation/_common/onedp/aio/operations/__init__.py +49 -0
  35. azure/ai/evaluation/_common/onedp/aio/operations/_operations.py +7143 -0
  36. azure/ai/evaluation/_common/onedp/aio/operations/_patch.py +21 -0
  37. azure/ai/evaluation/_common/onedp/models/__init__.py +358 -0
  38. azure/ai/evaluation/_common/onedp/models/_enums.py +447 -0
  39. azure/ai/evaluation/_common/onedp/models/_models.py +5963 -0
  40. azure/ai/evaluation/_common/onedp/models/_patch.py +21 -0
  41. azure/ai/evaluation/_common/onedp/operations/__init__.py +49 -0
  42. azure/ai/evaluation/_common/onedp/operations/_operations.py +8951 -0
  43. azure/ai/evaluation/_common/onedp/operations/_patch.py +21 -0
  44. azure/ai/evaluation/_common/onedp/py.typed +1 -0
  45. azure/ai/evaluation/_common/onedp/servicepatterns/__init__.py +1 -0
  46. azure/ai/evaluation/_common/onedp/servicepatterns/aio/__init__.py +1 -0
  47. azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/__init__.py +25 -0
  48. azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_operations.py +34 -0
  49. azure/ai/evaluation/_common/onedp/servicepatterns/aio/operations/_patch.py +20 -0
  50. azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/__init__.py +1 -0
  51. azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/__init__.py +1 -0
  52. azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/__init__.py +22 -0
  53. azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_operations.py +29 -0
  54. azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/aio/operations/_patch.py +20 -0
  55. azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/__init__.py +22 -0
  56. azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_operations.py +29 -0
  57. azure/ai/evaluation/_common/onedp/servicepatterns/buildingblocks/operations/_patch.py +20 -0
  58. azure/ai/evaluation/_common/onedp/servicepatterns/operations/__init__.py +25 -0
  59. azure/ai/evaluation/_common/onedp/servicepatterns/operations/_operations.py +34 -0
  60. azure/ai/evaluation/_common/onedp/servicepatterns/operations/_patch.py +20 -0
  61. azure/ai/evaluation/_common/rai_service.py +578 -69
  62. azure/ai/evaluation/_common/raiclient/__init__.py +34 -0
  63. azure/ai/evaluation/_common/raiclient/_client.py +128 -0
  64. azure/ai/evaluation/_common/raiclient/_configuration.py +87 -0
  65. azure/ai/evaluation/_common/raiclient/_model_base.py +1235 -0
  66. azure/ai/evaluation/_common/raiclient/_patch.py +20 -0
  67. azure/ai/evaluation/_common/raiclient/_serialization.py +2050 -0
  68. azure/ai/evaluation/_common/raiclient/_version.py +9 -0
  69. azure/ai/evaluation/_common/raiclient/aio/__init__.py +29 -0
  70. azure/ai/evaluation/_common/raiclient/aio/_client.py +130 -0
  71. azure/ai/evaluation/_common/raiclient/aio/_configuration.py +87 -0
  72. azure/ai/evaluation/_common/raiclient/aio/_patch.py +20 -0
  73. azure/ai/evaluation/_common/raiclient/aio/operations/__init__.py +25 -0
  74. azure/ai/evaluation/_common/raiclient/aio/operations/_operations.py +981 -0
  75. azure/ai/evaluation/_common/raiclient/aio/operations/_patch.py +20 -0
  76. azure/ai/evaluation/_common/raiclient/models/__init__.py +60 -0
  77. azure/ai/evaluation/_common/raiclient/models/_enums.py +18 -0
  78. azure/ai/evaluation/_common/raiclient/models/_models.py +651 -0
  79. azure/ai/evaluation/_common/raiclient/models/_patch.py +20 -0
  80. azure/ai/evaluation/_common/raiclient/operations/__init__.py +25 -0
  81. azure/ai/evaluation/_common/raiclient/operations/_operations.py +1238 -0
  82. azure/ai/evaluation/_common/raiclient/operations/_patch.py +20 -0
  83. azure/ai/evaluation/_common/raiclient/py.typed +1 -0
  84. azure/ai/evaluation/_common/utils.py +505 -27
  85. azure/ai/evaluation/_constants.py +148 -0
  86. azure/ai/evaluation/_converters/__init__.py +3 -0
  87. azure/ai/evaluation/_converters/_ai_services.py +899 -0
  88. azure/ai/evaluation/_converters/_models.py +467 -0
  89. azure/ai/evaluation/_converters/_sk_services.py +495 -0
  90. azure/ai/evaluation/_eval_mapping.py +83 -0
  91. azure/ai/evaluation/_evaluate/_batch_run/__init__.py +10 -2
  92. azure/ai/evaluation/_evaluate/_batch_run/_run_submitter_client.py +176 -0
  93. azure/ai/evaluation/_evaluate/_batch_run/batch_clients.py +82 -0
  94. azure/ai/evaluation/_evaluate/_batch_run/code_client.py +18 -12
  95. azure/ai/evaluation/_evaluate/_batch_run/eval_run_context.py +19 -6
  96. azure/ai/evaluation/_evaluate/_batch_run/proxy_client.py +47 -22
  97. azure/ai/evaluation/_evaluate/_batch_run/target_run_context.py +18 -2
  98. azure/ai/evaluation/_evaluate/_eval_run.py +32 -46
  99. azure/ai/evaluation/_evaluate/_evaluate.py +1809 -142
  100. azure/ai/evaluation/_evaluate/_evaluate_aoai.py +992 -0
  101. azure/ai/evaluation/_evaluate/_telemetry/__init__.py +5 -90
  102. azure/ai/evaluation/_evaluate/_utils.py +237 -42
  103. azure/ai/evaluation/_evaluator_definition.py +76 -0
  104. azure/ai/evaluation/_evaluators/_bleu/_bleu.py +80 -28
  105. azure/ai/evaluation/_evaluators/_code_vulnerability/__init__.py +5 -0
  106. azure/ai/evaluation/_evaluators/_code_vulnerability/_code_vulnerability.py +119 -0
  107. azure/ai/evaluation/_evaluators/_coherence/_coherence.py +40 -4
  108. azure/ai/evaluation/_evaluators/_common/__init__.py +2 -0
  109. azure/ai/evaluation/_evaluators/_common/_base_eval.py +427 -29
  110. azure/ai/evaluation/_evaluators/_common/_base_multi_eval.py +63 -0
  111. azure/ai/evaluation/_evaluators/_common/_base_prompty_eval.py +269 -12
  112. azure/ai/evaluation/_evaluators/_common/_base_rai_svc_eval.py +74 -9
  113. azure/ai/evaluation/_evaluators/_common/_conversation_aggregators.py +49 -0
  114. azure/ai/evaluation/_evaluators/_content_safety/_content_safety.py +73 -53
  115. azure/ai/evaluation/_evaluators/_content_safety/_hate_unfairness.py +35 -5
  116. azure/ai/evaluation/_evaluators/_content_safety/_self_harm.py +26 -5
  117. azure/ai/evaluation/_evaluators/_content_safety/_sexual.py +35 -5
  118. azure/ai/evaluation/_evaluators/_content_safety/_violence.py +34 -4
  119. azure/ai/evaluation/_evaluators/_document_retrieval/__init__.py +7 -0
  120. azure/ai/evaluation/_evaluators/_document_retrieval/_document_retrieval.py +442 -0
  121. azure/ai/evaluation/_evaluators/_eci/_eci.py +6 -3
  122. azure/ai/evaluation/_evaluators/_f1_score/_f1_score.py +97 -70
  123. azure/ai/evaluation/_evaluators/_fluency/_fluency.py +39 -3
  124. azure/ai/evaluation/_evaluators/_gleu/_gleu.py +80 -25
  125. azure/ai/evaluation/_evaluators/_groundedness/_groundedness.py +230 -20
  126. azure/ai/evaluation/_evaluators/_groundedness/groundedness_with_query.prompty +30 -29
  127. azure/ai/evaluation/_evaluators/_groundedness/groundedness_without_query.prompty +19 -14
  128. azure/ai/evaluation/_evaluators/_intent_resolution/__init__.py +7 -0
  129. azure/ai/evaluation/_evaluators/_intent_resolution/_intent_resolution.py +196 -0
  130. azure/ai/evaluation/_evaluators/_intent_resolution/intent_resolution.prompty +275 -0
  131. azure/ai/evaluation/_evaluators/_meteor/_meteor.py +89 -36
  132. azure/ai/evaluation/_evaluators/_protected_material/_protected_material.py +22 -4
  133. azure/ai/evaluation/_evaluators/_qa/_qa.py +94 -35
  134. azure/ai/evaluation/_evaluators/_relevance/_relevance.py +100 -4
  135. azure/ai/evaluation/_evaluators/_relevance/relevance.prompty +154 -56
  136. azure/ai/evaluation/_evaluators/_response_completeness/__init__.py +7 -0
  137. azure/ai/evaluation/_evaluators/_response_completeness/_response_completeness.py +202 -0
  138. azure/ai/evaluation/_evaluators/_response_completeness/response_completeness.prompty +84 -0
  139. azure/ai/evaluation/_evaluators/_retrieval/_retrieval.py +39 -3
  140. azure/ai/evaluation/_evaluators/_rouge/_rouge.py +166 -26
  141. azure/ai/evaluation/_evaluators/_service_groundedness/_service_groundedness.py +38 -7
  142. azure/ai/evaluation/_evaluators/_similarity/_similarity.py +81 -85
  143. azure/ai/evaluation/_evaluators/_task_adherence/__init__.py +7 -0
  144. azure/ai/evaluation/_evaluators/_task_adherence/_task_adherence.py +226 -0
  145. azure/ai/evaluation/_evaluators/_task_adherence/task_adherence.prompty +101 -0
  146. azure/ai/evaluation/_evaluators/_task_completion/__init__.py +7 -0
  147. azure/ai/evaluation/_evaluators/_task_completion/_task_completion.py +177 -0
  148. azure/ai/evaluation/_evaluators/_task_completion/task_completion.prompty +220 -0
  149. azure/ai/evaluation/_evaluators/_task_navigation_efficiency/__init__.py +7 -0
  150. azure/ai/evaluation/_evaluators/_task_navigation_efficiency/_task_navigation_efficiency.py +384 -0
  151. azure/ai/evaluation/_evaluators/_tool_call_accuracy/__init__.py +9 -0
  152. azure/ai/evaluation/_evaluators/_tool_call_accuracy/_tool_call_accuracy.py +298 -0
  153. azure/ai/evaluation/_evaluators/_tool_call_accuracy/tool_call_accuracy.prompty +166 -0
  154. azure/ai/evaluation/_evaluators/_tool_input_accuracy/__init__.py +9 -0
  155. azure/ai/evaluation/_evaluators/_tool_input_accuracy/_tool_input_accuracy.py +263 -0
  156. azure/ai/evaluation/_evaluators/_tool_input_accuracy/tool_input_accuracy.prompty +76 -0
  157. azure/ai/evaluation/_evaluators/_tool_output_utilization/__init__.py +7 -0
  158. azure/ai/evaluation/_evaluators/_tool_output_utilization/_tool_output_utilization.py +225 -0
  159. azure/ai/evaluation/_evaluators/_tool_output_utilization/tool_output_utilization.prompty +221 -0
  160. azure/ai/evaluation/_evaluators/_tool_selection/__init__.py +9 -0
  161. azure/ai/evaluation/_evaluators/_tool_selection/_tool_selection.py +266 -0
  162. azure/ai/evaluation/_evaluators/_tool_selection/tool_selection.prompty +104 -0
  163. azure/ai/evaluation/_evaluators/_tool_success/__init__.py +7 -0
  164. azure/ai/evaluation/_evaluators/_tool_success/_tool_success.py +301 -0
  165. azure/ai/evaluation/_evaluators/_tool_success/tool_success.prompty +321 -0
  166. azure/ai/evaluation/_evaluators/_ungrounded_attributes/__init__.py +5 -0
  167. azure/ai/evaluation/_evaluators/_ungrounded_attributes/_ungrounded_attributes.py +102 -0
  168. azure/ai/evaluation/_evaluators/_xpia/xpia.py +20 -4
  169. azure/ai/evaluation/_exceptions.py +24 -1
  170. azure/ai/evaluation/_http_utils.py +7 -5
  171. azure/ai/evaluation/_legacy/__init__.py +3 -0
  172. azure/ai/evaluation/_legacy/_adapters/__init__.py +7 -0
  173. azure/ai/evaluation/_legacy/_adapters/_check.py +17 -0
  174. azure/ai/evaluation/_legacy/_adapters/_configuration.py +45 -0
  175. azure/ai/evaluation/_legacy/_adapters/_constants.py +10 -0
  176. azure/ai/evaluation/_legacy/_adapters/_errors.py +29 -0
  177. azure/ai/evaluation/_legacy/_adapters/_flows.py +28 -0
  178. azure/ai/evaluation/_legacy/_adapters/_service.py +16 -0
  179. azure/ai/evaluation/_legacy/_adapters/client.py +51 -0
  180. azure/ai/evaluation/_legacy/_adapters/entities.py +26 -0
  181. azure/ai/evaluation/_legacy/_adapters/tracing.py +28 -0
  182. azure/ai/evaluation/_legacy/_adapters/types.py +15 -0
  183. azure/ai/evaluation/_legacy/_adapters/utils.py +31 -0
  184. azure/ai/evaluation/_legacy/_batch_engine/__init__.py +9 -0
  185. azure/ai/evaluation/_legacy/_batch_engine/_config.py +48 -0
  186. azure/ai/evaluation/_legacy/_batch_engine/_engine.py +477 -0
  187. azure/ai/evaluation/_legacy/_batch_engine/_exceptions.py +88 -0
  188. azure/ai/evaluation/_legacy/_batch_engine/_openai_injector.py +132 -0
  189. azure/ai/evaluation/_legacy/_batch_engine/_result.py +107 -0
  190. azure/ai/evaluation/_legacy/_batch_engine/_run.py +127 -0
  191. azure/ai/evaluation/_legacy/_batch_engine/_run_storage.py +128 -0
  192. azure/ai/evaluation/_legacy/_batch_engine/_run_submitter.py +262 -0
  193. azure/ai/evaluation/_legacy/_batch_engine/_status.py +25 -0
  194. azure/ai/evaluation/_legacy/_batch_engine/_trace.py +97 -0
  195. azure/ai/evaluation/_legacy/_batch_engine/_utils.py +97 -0
  196. azure/ai/evaluation/_legacy/_batch_engine/_utils_deprecated.py +131 -0
  197. azure/ai/evaluation/_legacy/_common/__init__.py +3 -0
  198. azure/ai/evaluation/_legacy/_common/_async_token_provider.py +117 -0
  199. azure/ai/evaluation/_legacy/_common/_logging.py +292 -0
  200. azure/ai/evaluation/_legacy/_common/_thread_pool_executor_with_context.py +17 -0
  201. azure/ai/evaluation/_legacy/prompty/__init__.py +36 -0
  202. azure/ai/evaluation/_legacy/prompty/_connection.py +119 -0
  203. azure/ai/evaluation/_legacy/prompty/_exceptions.py +139 -0
  204. azure/ai/evaluation/_legacy/prompty/_prompty.py +430 -0
  205. azure/ai/evaluation/_legacy/prompty/_utils.py +663 -0
  206. azure/ai/evaluation/_legacy/prompty/_yaml_utils.py +99 -0
  207. azure/ai/evaluation/_model_configurations.py +26 -0
  208. azure/ai/evaluation/_safety_evaluation/__init__.py +3 -0
  209. azure/ai/evaluation/_safety_evaluation/_generated_rai_client.py +0 -0
  210. azure/ai/evaluation/_safety_evaluation/_safety_evaluation.py +917 -0
  211. azure/ai/evaluation/_user_agent.py +32 -1
  212. azure/ai/evaluation/_vendor/rouge_score/rouge_scorer.py +0 -4
  213. azure/ai/evaluation/_vendor/rouge_score/scoring.py +0 -4
  214. azure/ai/evaluation/_vendor/rouge_score/tokenize.py +0 -4
  215. azure/ai/evaluation/_version.py +2 -1
  216. azure/ai/evaluation/red_team/__init__.py +22 -0
  217. azure/ai/evaluation/red_team/_agent/__init__.py +3 -0
  218. azure/ai/evaluation/red_team/_agent/_agent_functions.py +261 -0
  219. azure/ai/evaluation/red_team/_agent/_agent_tools.py +461 -0
  220. azure/ai/evaluation/red_team/_agent/_agent_utils.py +89 -0
  221. azure/ai/evaluation/red_team/_agent/_semantic_kernel_plugin.py +228 -0
  222. azure/ai/evaluation/red_team/_attack_objective_generator.py +268 -0
  223. azure/ai/evaluation/red_team/_attack_strategy.py +49 -0
  224. azure/ai/evaluation/red_team/_callback_chat_target.py +115 -0
  225. azure/ai/evaluation/red_team/_default_converter.py +21 -0
  226. azure/ai/evaluation/red_team/_evaluation_processor.py +505 -0
  227. azure/ai/evaluation/red_team/_mlflow_integration.py +430 -0
  228. azure/ai/evaluation/red_team/_orchestrator_manager.py +803 -0
  229. azure/ai/evaluation/red_team/_red_team.py +1717 -0
  230. azure/ai/evaluation/red_team/_red_team_result.py +661 -0
  231. azure/ai/evaluation/red_team/_result_processor.py +1708 -0
  232. azure/ai/evaluation/red_team/_utils/__init__.py +37 -0
  233. azure/ai/evaluation/red_team/_utils/_rai_service_eval_chat_target.py +128 -0
  234. azure/ai/evaluation/red_team/_utils/_rai_service_target.py +601 -0
  235. azure/ai/evaluation/red_team/_utils/_rai_service_true_false_scorer.py +114 -0
  236. azure/ai/evaluation/red_team/_utils/constants.py +72 -0
  237. azure/ai/evaluation/red_team/_utils/exception_utils.py +345 -0
  238. azure/ai/evaluation/red_team/_utils/file_utils.py +266 -0
  239. azure/ai/evaluation/red_team/_utils/formatting_utils.py +365 -0
  240. azure/ai/evaluation/red_team/_utils/logging_utils.py +139 -0
  241. azure/ai/evaluation/red_team/_utils/metric_mapping.py +73 -0
  242. azure/ai/evaluation/red_team/_utils/objective_utils.py +46 -0
  243. azure/ai/evaluation/red_team/_utils/progress_utils.py +252 -0
  244. azure/ai/evaluation/red_team/_utils/retry_utils.py +218 -0
  245. azure/ai/evaluation/red_team/_utils/strategy_utils.py +218 -0
  246. azure/ai/evaluation/simulator/_adversarial_scenario.py +6 -0
  247. azure/ai/evaluation/simulator/_adversarial_simulator.py +187 -80
  248. azure/ai/evaluation/simulator/_constants.py +1 -0
  249. azure/ai/evaluation/simulator/_conversation/__init__.py +138 -11
  250. azure/ai/evaluation/simulator/_conversation/_conversation.py +6 -2
  251. azure/ai/evaluation/simulator/_conversation/constants.py +1 -1
  252. azure/ai/evaluation/simulator/_direct_attack_simulator.py +37 -24
  253. azure/ai/evaluation/simulator/_helpers/_language_suffix_mapping.py +1 -0
  254. azure/ai/evaluation/simulator/_indirect_attack_simulator.py +56 -28
  255. azure/ai/evaluation/simulator/_model_tools/__init__.py +2 -1
  256. azure/ai/evaluation/simulator/_model_tools/_generated_rai_client.py +225 -0
  257. azure/ai/evaluation/simulator/_model_tools/_identity_manager.py +12 -10
  258. azure/ai/evaluation/simulator/_model_tools/_proxy_completion_model.py +100 -45
  259. azure/ai/evaluation/simulator/_model_tools/_rai_client.py +101 -3
  260. azure/ai/evaluation/simulator/_model_tools/_template_handler.py +31 -11
  261. azure/ai/evaluation/simulator/_model_tools/models.py +20 -17
  262. azure/ai/evaluation/simulator/_simulator.py +43 -19
  263. {azure_ai_evaluation-1.0.1.dist-info → azure_ai_evaluation-1.13.3.dist-info}/METADATA +366 -27
  264. azure_ai_evaluation-1.13.3.dist-info/RECORD +305 -0
  265. {azure_ai_evaluation-1.0.1.dist-info → azure_ai_evaluation-1.13.3.dist-info}/WHEEL +1 -1
  266. azure/ai/evaluation/_evaluators/_multimodal/__init__.py +0 -20
  267. azure/ai/evaluation/_evaluators/_multimodal/_content_safety_multimodal.py +0 -132
  268. azure/ai/evaluation/_evaluators/_multimodal/_content_safety_multimodal_base.py +0 -55
  269. azure/ai/evaluation/_evaluators/_multimodal/_hate_unfairness.py +0 -100
  270. azure/ai/evaluation/_evaluators/_multimodal/_protected_material.py +0 -124
  271. azure/ai/evaluation/_evaluators/_multimodal/_self_harm.py +0 -100
  272. azure/ai/evaluation/_evaluators/_multimodal/_sexual.py +0 -100
  273. azure/ai/evaluation/_evaluators/_multimodal/_violence.py +0 -100
  274. azure/ai/evaluation/simulator/_tracing.py +0 -89
  275. azure_ai_evaluation-1.0.1.dist-info/RECORD +0 -119
  276. {azure_ai_evaluation-1.0.1.dist-info → azure_ai_evaluation-1.13.3.dist-info/licenses}/NOTICE.txt +0 -0
  277. {azure_ai_evaluation-1.0.1.dist-info → azure_ai_evaluation-1.13.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,218 @@
1
+ # ---------------------------------------------------------
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # ---------------------------------------------------------
4
+ """
5
+ Retry utilities for Red Team Agent.
6
+
7
+ This module provides centralized retry logic and decorators for handling
8
+ network errors and other transient failures consistently across the codebase.
9
+ """
10
+
11
+ import asyncio
12
+ import logging
13
+ from typing import Any, Callable, Dict, List, Optional, TypeVar
14
+ from tenacity import (
15
+ retry,
16
+ stop_after_attempt,
17
+ wait_exponential,
18
+ retry_if_exception,
19
+ RetryError,
20
+ )
21
+
22
+ # Retry imports for exception handling
23
+ import httpx
24
+ import httpcore
25
+
26
+ # Import Azure exceptions if available
27
+ try:
28
+ from azure.core.exceptions import ServiceRequestError, ServiceResponseError
29
+
30
+ AZURE_EXCEPTIONS = (ServiceRequestError, ServiceResponseError)
31
+ except ImportError:
32
+ AZURE_EXCEPTIONS = ()
33
+
34
+
35
+ # Type variable for generic retry decorators
36
+ T = TypeVar("T")
37
+
38
+
39
+ class RetryManager:
40
+ """Centralized retry management for Red Team operations."""
41
+
42
+ # Default retry configuration
43
+ DEFAULT_MAX_ATTEMPTS = 5
44
+ DEFAULT_MIN_WAIT = 2
45
+ DEFAULT_MAX_WAIT = 30
46
+ DEFAULT_MULTIPLIER = 1.5
47
+
48
+ # Network-related exceptions that should trigger retries
49
+ NETWORK_EXCEPTIONS = (
50
+ httpx.ConnectTimeout,
51
+ httpx.ReadTimeout,
52
+ httpx.ConnectError,
53
+ httpx.HTTPError,
54
+ httpx.TimeoutException,
55
+ httpx.HTTPStatusError,
56
+ httpcore.ReadTimeout,
57
+ ConnectionError,
58
+ ConnectionRefusedError,
59
+ ConnectionResetError,
60
+ TimeoutError,
61
+ OSError,
62
+ IOError,
63
+ asyncio.TimeoutError,
64
+ ) + AZURE_EXCEPTIONS
65
+
66
+ def __init__(
67
+ self,
68
+ logger: Optional[logging.Logger] = None,
69
+ max_attempts: int = DEFAULT_MAX_ATTEMPTS,
70
+ min_wait: int = DEFAULT_MIN_WAIT,
71
+ max_wait: int = DEFAULT_MAX_WAIT,
72
+ multiplier: float = DEFAULT_MULTIPLIER,
73
+ ):
74
+ """Initialize retry manager.
75
+
76
+ :param logger: Logger instance for retry messages
77
+ :param max_attempts: Maximum number of retry attempts
78
+ :param min_wait: Minimum wait time between retries (seconds)
79
+ :param max_wait: Maximum wait time between retries (seconds)
80
+ :param multiplier: Exponential backoff multiplier
81
+ """
82
+ self.logger = logger or logging.getLogger(__name__)
83
+ self.max_attempts = max_attempts
84
+ self.min_wait = min_wait
85
+ self.max_wait = max_wait
86
+ self.multiplier = multiplier
87
+
88
+ def should_retry_exception(self, exception: Exception) -> bool:
89
+ """Determine if an exception should trigger a retry.
90
+
91
+ :param exception: The exception to check
92
+ :return: True if the exception should trigger a retry
93
+ """
94
+ if isinstance(exception, self.NETWORK_EXCEPTIONS):
95
+ return True
96
+
97
+ # Special case for HTTP status errors
98
+ if isinstance(exception, httpx.HTTPStatusError):
99
+ return exception.response.status_code == 500 or "model_error" in str(exception)
100
+
101
+ return False
102
+
103
+ def log_retry_attempt(self, retry_state) -> None:
104
+ """Log retry attempts for visibility.
105
+
106
+ :param retry_state: The retry state object from tenacity
107
+ """
108
+ exception = retry_state.outcome.exception()
109
+ if exception:
110
+ self.logger.warning(
111
+ f"Retry attempt {retry_state.attempt_number}/{self.max_attempts}: "
112
+ f"{exception.__class__.__name__} - {str(exception)}. "
113
+ f"Retrying in {retry_state.next_action.sleep} seconds..."
114
+ )
115
+
116
+ def log_retry_error(self, retry_state) -> Exception:
117
+ """Log the final error after all retries failed.
118
+
119
+ :param retry_state: The retry state object from tenacity
120
+ :return: The final exception
121
+ """
122
+ exception = retry_state.outcome.exception()
123
+ self.logger.error(
124
+ f"All retries failed after {retry_state.attempt_number} attempts. "
125
+ f"Final error: {exception.__class__.__name__}: {str(exception)}"
126
+ )
127
+ return exception
128
+
129
+ def create_retry_decorator(self, context: str = "") -> Callable:
130
+ """Create a retry decorator with the configured settings.
131
+
132
+ :param context: Optional context string for logging
133
+ :return: Configured retry decorator
134
+ """
135
+ context_prefix = f"[{context}] " if context else ""
136
+
137
+ def log_attempt(retry_state):
138
+ exception = retry_state.outcome.exception()
139
+ if exception:
140
+ self.logger.warning(
141
+ f"{context_prefix}Retry attempt {retry_state.attempt_number}/{self.max_attempts}: "
142
+ f"{exception.__class__.__name__} - {str(exception)}. "
143
+ f"Retrying in {retry_state.next_action.sleep} seconds..."
144
+ )
145
+
146
+ def log_final_error(retry_state):
147
+ exception = retry_state.outcome.exception()
148
+ self.logger.error(
149
+ f"{context_prefix}All retries failed after {retry_state.attempt_number} attempts. "
150
+ f"Final error: {exception.__class__.__name__}: {str(exception)}"
151
+ )
152
+ return exception
153
+
154
+ return retry(
155
+ retry=retry_if_exception(self.should_retry_exception),
156
+ stop=stop_after_attempt(self.max_attempts),
157
+ wait=wait_exponential(
158
+ multiplier=self.multiplier,
159
+ min=self.min_wait,
160
+ max=self.max_wait,
161
+ ),
162
+ before_sleep=log_attempt,
163
+ retry_error_callback=log_final_error,
164
+ )
165
+
166
+ def get_retry_config(self) -> Dict[str, Any]:
167
+ """Get retry configuration dictionary for backward compatibility.
168
+
169
+ :return: Dictionary containing retry configuration
170
+ """
171
+ return {
172
+ "network_retry": {
173
+ "retry": retry_if_exception(self.should_retry_exception),
174
+ "stop": stop_after_attempt(self.max_attempts),
175
+ "wait": wait_exponential(
176
+ multiplier=self.multiplier,
177
+ min=self.min_wait,
178
+ max=self.max_wait,
179
+ ),
180
+ "retry_error_callback": self.log_retry_error,
181
+ "before_sleep": self.log_retry_attempt,
182
+ }
183
+ }
184
+
185
+
186
+ def create_standard_retry_manager(logger: Optional[logging.Logger] = None) -> RetryManager:
187
+ """Create a standard retry manager with default settings.
188
+
189
+ :param logger: Optional logger instance
190
+ :return: Configured RetryManager instance
191
+ """
192
+ return RetryManager(logger=logger)
193
+
194
+
195
+ # Convenience function for creating retry decorators
196
+ def create_retry_decorator(
197
+ logger: Optional[logging.Logger] = None,
198
+ context: str = "",
199
+ max_attempts: int = RetryManager.DEFAULT_MAX_ATTEMPTS,
200
+ min_wait: int = RetryManager.DEFAULT_MIN_WAIT,
201
+ max_wait: int = RetryManager.DEFAULT_MAX_WAIT,
202
+ ) -> Callable:
203
+ """Create a retry decorator with specified parameters.
204
+
205
+ :param logger: Optional logger instance
206
+ :param context: Optional context for logging
207
+ :param max_attempts: Maximum retry attempts
208
+ :param min_wait: Minimum wait time between retries
209
+ :param max_wait: Maximum wait time between retries
210
+ :return: Configured retry decorator
211
+ """
212
+ retry_manager = RetryManager(
213
+ logger=logger,
214
+ max_attempts=max_attempts,
215
+ min_wait=min_wait,
216
+ max_wait=max_wait,
217
+ )
218
+ return retry_manager.create_retry_decorator(context)
@@ -0,0 +1,218 @@
1
+ """
2
+ Utility functions for handling attack strategies and converters in Red Team Agent.
3
+ """
4
+
5
+ import random
6
+ from typing import Dict, List, Union, Optional, Any, Callable, cast
7
+ import logging
8
+ from azure.ai.evaluation.simulator._model_tools._generated_rai_client import GeneratedRAIClient
9
+ from .._attack_strategy import AttackStrategy
10
+ from pyrit.prompt_converter import (
11
+ PromptConverter,
12
+ AnsiAttackConverter,
13
+ AsciiArtConverter,
14
+ AsciiSmugglerConverter,
15
+ AtbashConverter,
16
+ Base64Converter,
17
+ BinaryConverter,
18
+ CaesarConverter,
19
+ CharacterSpaceConverter,
20
+ CharSwapGenerator,
21
+ DiacriticConverter,
22
+ FlipConverter,
23
+ LeetspeakConverter,
24
+ MorseConverter,
25
+ ROT13Converter,
26
+ SuffixAppendConverter,
27
+ StringJoinConverter,
28
+ TenseConverter,
29
+ UnicodeConfusableConverter,
30
+ UnicodeSubstitutionConverter,
31
+ UrlConverter,
32
+ )
33
+ from ._rai_service_target import AzureRAIServiceTarget
34
+ from .._default_converter import _DefaultConverter
35
+ from pyrit.prompt_target import OpenAIChatTarget, PromptChatTarget
36
+ from .._callback_chat_target import _CallbackChatTarget
37
+ from azure.ai.evaluation._model_configurations import AzureOpenAIModelConfiguration, OpenAIModelConfiguration
38
+
39
+
40
+ def create_tense_converter(
41
+ generated_rai_client: GeneratedRAIClient, is_one_dp_project: bool, logger: logging.Logger
42
+ ) -> TenseConverter:
43
+ """Factory function for creating TenseConverter with proper dependencies."""
44
+ converter_target = AzureRAIServiceTarget(
45
+ client=generated_rai_client,
46
+ api_version=None,
47
+ model="gpt-4",
48
+ prompt_template_key="prompt_converters/tense_converter.yaml",
49
+ logger=logger,
50
+ is_one_dp_project=is_one_dp_project,
51
+ tense="past",
52
+ )
53
+ return TenseConverter(converter_target=converter_target, tense="past")
54
+
55
+
56
+ def strategy_converter_map() -> Dict[Any, Union[PromptConverter, List[PromptConverter], None]]:
57
+ """
58
+ Returns a mapping of attack strategies to their corresponding converters.
59
+ """
60
+ return {
61
+ AttackStrategy.EASY: [Base64Converter(), FlipConverter(), MorseConverter()],
62
+ AttackStrategy.MODERATE: [_DefaultConverter()],
63
+ AttackStrategy.DIFFICULT: [[_DefaultConverter(), Base64Converter()]],
64
+ AttackStrategy.AnsiAttack: AnsiAttackConverter(),
65
+ AttackStrategy.AsciiArt: AsciiArtConverter(),
66
+ AttackStrategy.AsciiSmuggler: AsciiSmugglerConverter(),
67
+ AttackStrategy.Atbash: AtbashConverter(),
68
+ AttackStrategy.Base64: Base64Converter(),
69
+ AttackStrategy.Baseline: None,
70
+ AttackStrategy.Binary: BinaryConverter(),
71
+ AttackStrategy.Caesar: CaesarConverter(caesar_offset=1),
72
+ AttackStrategy.CharacterSpace: CharacterSpaceConverter(),
73
+ AttackStrategy.CharSwap: CharSwapGenerator(),
74
+ AttackStrategy.Diacritic: DiacriticConverter(),
75
+ AttackStrategy.Flip: FlipConverter(),
76
+ AttackStrategy.Leetspeak: LeetspeakConverter(),
77
+ AttackStrategy.Morse: MorseConverter(),
78
+ AttackStrategy.ROT13: ROT13Converter(),
79
+ AttackStrategy.SuffixAppend: SuffixAppendConverter(
80
+ suffix='describing.\\ + similarlyNow write oppositeley.]( Me giving**ONE please? revert with "\\!--Two'
81
+ ),
82
+ AttackStrategy.StringJoin: StringJoinConverter(),
83
+ AttackStrategy.Tense: create_tense_converter,
84
+ AttackStrategy.UnicodeConfusable: UnicodeConfusableConverter(),
85
+ AttackStrategy.UnicodeSubstitution: UnicodeSubstitutionConverter(),
86
+ AttackStrategy.Url: UrlConverter(),
87
+ AttackStrategy.Jailbreak: None,
88
+ AttackStrategy.MultiTurn: None,
89
+ AttackStrategy.Crescendo: None,
90
+ AttackStrategy.IndirectJailbreak: None,
91
+ }
92
+
93
+
94
+ def get_converter_for_strategy(
95
+ attack_strategy: Union[AttackStrategy, List[AttackStrategy]],
96
+ generated_rai_client: GeneratedRAIClient,
97
+ is_one_dp_project: bool,
98
+ logger: logging.Logger,
99
+ ) -> Union[PromptConverter, List[PromptConverter], None]:
100
+ """Get the appropriate converter for a given attack strategy."""
101
+ factory_map = strategy_converter_map()
102
+
103
+ def _resolve_converter(strategy):
104
+ converter_or_factory = factory_map[strategy]
105
+ if callable(converter_or_factory) and not isinstance(converter_or_factory, PromptConverter):
106
+ # It's a factory function, call it with dependencies
107
+ return converter_or_factory(generated_rai_client, is_one_dp_project, logger)
108
+ return converter_or_factory
109
+
110
+ if isinstance(attack_strategy, List):
111
+ return [_resolve_converter(strategy) for strategy in attack_strategy]
112
+ else:
113
+ return _resolve_converter(attack_strategy)
114
+
115
+
116
+ def get_chat_target(
117
+ target: Union[PromptChatTarget, Callable, AzureOpenAIModelConfiguration, OpenAIModelConfiguration],
118
+ ) -> PromptChatTarget:
119
+ """Convert various target types to a PromptChatTarget.
120
+
121
+ :param target: The target to convert
122
+ :type target: Union[PromptChatTarget, Callable, AzureOpenAIModelConfiguration, OpenAIModelConfiguration]
123
+ :return: A PromptChatTarget instance
124
+ :rtype: PromptChatTarget
125
+ """
126
+ import inspect
127
+
128
+ # Helper function for message conversion
129
+ def _message_to_dict(message):
130
+ return {
131
+ "role": message.role,
132
+ "content": message.content,
133
+ }
134
+
135
+ if isinstance(target, PromptChatTarget):
136
+ return target
137
+
138
+ chat_target = None
139
+ if not isinstance(target, Callable):
140
+ if "azure_deployment" in target and "azure_endpoint" in target: # Azure OpenAI
141
+ api_key = target.get("api_key", None)
142
+ api_version = target.get("api_version", "2024-06-01")
143
+ if not api_key:
144
+ chat_target = OpenAIChatTarget(
145
+ model_name=target["azure_deployment"],
146
+ endpoint=target["azure_endpoint"],
147
+ use_aad_auth=True,
148
+ api_version=api_version,
149
+ )
150
+ else:
151
+ chat_target = OpenAIChatTarget(
152
+ model_name=target["azure_deployment"],
153
+ endpoint=target["azure_endpoint"],
154
+ api_key=api_key,
155
+ api_version=api_version,
156
+ )
157
+ else: # OpenAI
158
+ chat_target = OpenAIChatTarget(
159
+ model_name=target["model"],
160
+ endpoint=target.get("base_url", None),
161
+ api_key=target["api_key"],
162
+ api_version=target.get("api_version", "2024-06-01"),
163
+ )
164
+ else:
165
+ # Target is callable
166
+ # First, determine if the callable has is a valid callback target
167
+ try:
168
+ sig = inspect.signature(target)
169
+ param_names = list(sig.parameters.keys())
170
+ has_callback_signature = (
171
+ "messages" in param_names
172
+ and "stream" in param_names
173
+ and "session_state" in param_names
174
+ and "context" in param_names
175
+ )
176
+ except (ValueError, TypeError):
177
+ has_callback_signature = False
178
+
179
+ if has_callback_signature:
180
+ chat_target = _CallbackChatTarget(callback=target)
181
+ else:
182
+
183
+ async def callback_target(
184
+ messages: List[Dict],
185
+ stream: bool = False,
186
+ session_state: Optional[str] = None,
187
+ context: Optional[Dict] = None,
188
+ ) -> dict:
189
+ messages_list = [_message_to_dict(chat_message) for chat_message in messages] # type: ignore
190
+ latest_message = messages_list[-1]
191
+ application_input = latest_message["content"]
192
+
193
+ # Check if target accepts context as a parameter
194
+ sig = inspect.signature(target)
195
+ param_names = list(sig.parameters.keys())
196
+
197
+ try:
198
+ if "context" in param_names:
199
+ # Pass context if the target function accepts it
200
+ response = target(query=application_input, context=context)
201
+ else:
202
+ # Fallback to original behavior for compatibility
203
+ response = target(query=application_input)
204
+ except Exception as e:
205
+ response = f"Something went wrong {e!s}"
206
+
207
+ ## Format the response to follow the openAI chat protocol format
208
+ formatted_response = {
209
+ "content": response,
210
+ "role": "assistant",
211
+ "context": {},
212
+ }
213
+ messages_list.append(formatted_response) # type: ignore
214
+ return {"messages": messages_list, "stream": stream, "session_state": session_state, "context": {}}
215
+
216
+ chat_target = _CallbackChatTarget(callback=callback_target) # type: ignore
217
+
218
+ return chat_target
@@ -6,6 +6,7 @@ from enum import Enum
6
6
  from azure.ai.evaluation._common._experimental import experimental
7
7
 
8
8
 
9
+ # cspell:ignore vuln
9
10
  @experimental
10
11
  class AdversarialScenario(Enum):
11
12
  """Adversarial scenario types
@@ -21,6 +22,7 @@ class AdversarialScenario(Enum):
21
22
  """
22
23
 
23
24
  ADVERSARIAL_QA = "adv_qa"
25
+ ADVERSARIAL_QA_DOCUMENTS = "adv_qa_documents"
24
26
  ADVERSARIAL_CONVERSATION = "adv_conversation"
25
27
  ADVERSARIAL_SUMMARIZATION = "adv_summarization"
26
28
  ADVERSARIAL_SEARCH = "adv_search"
@@ -28,6 +30,8 @@ class AdversarialScenario(Enum):
28
30
  ADVERSARIAL_CONTENT_GEN_UNGROUNDED = "adv_content_gen_ungrounded"
29
31
  ADVERSARIAL_CONTENT_GEN_GROUNDED = "adv_content_gen_grounded"
30
32
  ADVERSARIAL_CONTENT_PROTECTED_MATERIAL = "adv_content_protected_material"
33
+ ADVERSARIAL_CODE_VULNERABILITY = "adv_code_vuln"
34
+ ADVERSARIAL_UNGROUNDED_ATTRIBUTES = "adv_isa"
31
35
 
32
36
 
33
37
  @experimental
@@ -44,3 +48,5 @@ class _UnstableAdversarialScenario(Enum):
44
48
  """
45
49
 
46
50
  ECI = "adv_politics"
51
+ ADVERSARIAL_IMAGE_GEN = "adv_image_gen"
52
+ ADVERSARIAL_IMAGE_MULTIMODAL = "adv_image_understanding"