2121 _xpia ,
2222 _coherence ,
2323)
24+ from azure .ai .evaluation ._evaluators ._eci ._eci import ECIEvaluator
2425from azure .ai .evaluation ._evaluate import _evaluate
2526from azure .ai .evaluation ._exceptions import ErrorBlame , ErrorCategory , ErrorTarget , EvaluationException
2627from azure .ai .evaluation ._model_configurations import AzureAIProject , EvaluationResult
3031 AdversarialScenario ,
3132 AdversarialScenarioJailbreak ,
3233 IndirectAttackSimulator ,
33- DirectAttackSimulator ,
34+ DirectAttackSimulator ,
3435)
36+ from azure .ai .evaluation .simulator ._adversarial_scenario import _UnstableAdversarialScenario
3537from azure .ai .evaluation .simulator ._utils import JsonLineList
3638from azure .ai .evaluation ._common .utils import validate_azure_ai_project
3739from azure .ai .evaluation ._model_configurations import AzureOpenAIModelConfiguration , OpenAIModelConfiguration
@@ -75,6 +77,7 @@ class _SafetyEvaluator(Enum):
7577 COHERENCE = "coherence"
7678 INDIRECT_ATTACK = "indirect_attack"
7779 DIRECT_ATTACK = "direct_attack"
80+ ECI = "eci"
7881
7982
8083@experimental
@@ -148,7 +151,7 @@ async def _simulate(
148151 max_simulation_results : int = 3 ,
149152 conversation_turns : List [List [Union [str , Dict [str , Any ]]]] = [],
150153 tasks : List [str ] = [],
151- adversarial_scenario : Optional [Union [AdversarialScenario , AdversarialScenarioJailbreak ]] = None ,
154+ adversarial_scenario : Optional [Union [AdversarialScenario , AdversarialScenarioJailbreak , _UnstableAdversarialScenario ]] = None ,
152155 source_text : Optional [str ] = None ,
153156 direct_attack : bool = False ,
154157 ) -> Dict [str , str ]:
@@ -231,7 +234,7 @@ async def callback(
231234 )
232235
233236 # if DirectAttack, run DirectAttackSimulator
234- elif direct_attack :
237+ elif direct_attack and isinstance ( adversarial_scenario , AdversarialScenario ) :
235238 self .logger .info (
236239 f"Running DirectAttackSimulator with inputs: adversarial_scenario={ adversarial_scenario } , max_conversation_turns={ max_conversation_turns } , max_simulation_results={ max_simulation_results } "
237240 )
@@ -267,7 +270,7 @@ async def callback(
267270 )
268271 simulator = AdversarialSimulator (azure_ai_project = self .azure_ai_project , credential = self .credential )
269272 simulator_outputs = await simulator (
270- scenario = adversarial_scenario ,
273+ scenario = adversarial_scenario , #type: ignore
271274 max_conversation_turns = max_conversation_turns ,
272275 max_simulation_results = max_simulation_results ,
273276 conversation_turns = conversation_turns ,
@@ -340,7 +343,7 @@ def _get_scenario(
340343 evaluators : List [_SafetyEvaluator ],
341344 num_turns : int = 3 ,
342345 scenario : Optional [Union [AdversarialScenario , AdversarialScenarioJailbreak ]] = None ,
343- ) -> Optional [Union [AdversarialScenario , AdversarialScenarioJailbreak ]]:
346+ ) -> Optional [Union [AdversarialScenario , AdversarialScenarioJailbreak , _UnstableAdversarialScenario ]]:
344347 """
345348 Returns the Simulation scenario based on the provided list of SafetyEvaluator.
346349
@@ -362,6 +365,8 @@ def _get_scenario(
362365 if num_turns > 1
363366 else AdversarialScenario .ADVERSARIAL_QA
364367 )
368+ if evaluator == _SafetyEvaluator .ECI :
369+ return _UnstableAdversarialScenario .ECI
365370 if evaluator in [
366371 _SafetyEvaluator .GROUNDEDNESS ,
367372 _SafetyEvaluator .RELEVANCE ,
@@ -439,6 +444,10 @@ def _get_evaluators(
439444 evaluators_dict ["content_safety" ] = _content_safety .ContentSafetyEvaluator (
440445 azure_ai_project = self .azure_ai_project , credential = self .credential
441446 )
447+ elif evaluator == _SafetyEvaluator .ECI :
448+ evaluators_dict ["eci" ] = ECIEvaluator (
449+ azure_ai_project = self .azure_ai_project , credential = self .credential
450+ )
442451 else :
443452 msg = (
444453 f"Invalid evaluator: { evaluator } . Supported evaluators are: { _SafetyEvaluator .__members__ .values ()} "
0 commit comments