azure-ai-evaluation 1.0.1__py3-none-any.whl → 1.1.0__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 (33) hide show
  1. azure/ai/evaluation/_azure/__init__.py +3 -0
  2. azure/ai/evaluation/_azure/_clients.py +188 -0
  3. azure/ai/evaluation/_azure/_models.py +227 -0
  4. azure/ai/evaluation/_azure/_token_manager.py +118 -0
  5. azure/ai/evaluation/_common/rai_service.py +30 -21
  6. azure/ai/evaluation/_constants.py +1 -0
  7. azure/ai/evaluation/_evaluate/_batch_run/target_run_context.py +1 -1
  8. azure/ai/evaluation/_evaluate/_eval_run.py +14 -43
  9. azure/ai/evaluation/_evaluate/_evaluate.py +9 -34
  10. azure/ai/evaluation/_evaluate/_utils.py +66 -34
  11. azure/ai/evaluation/_evaluators/_common/_base_eval.py +71 -1
  12. azure/ai/evaluation/_evaluators/_common/_base_prompty_eval.py +12 -1
  13. azure/ai/evaluation/_evaluators/_common/_base_rai_svc_eval.py +33 -1
  14. azure/ai/evaluation/_evaluators/_content_safety/_content_safety.py +3 -3
  15. azure/ai/evaluation/_evaluators/_similarity/_similarity.py +1 -1
  16. azure/ai/evaluation/_http_utils.py +6 -4
  17. azure/ai/evaluation/_vendor/rouge_score/rouge_scorer.py +0 -4
  18. azure/ai/evaluation/_vendor/rouge_score/scoring.py +0 -4
  19. azure/ai/evaluation/_vendor/rouge_score/tokenize.py +0 -4
  20. azure/ai/evaluation/_version.py +1 -1
  21. azure/ai/evaluation/simulator/_adversarial_scenario.py +2 -0
  22. azure/ai/evaluation/simulator/_adversarial_simulator.py +35 -16
  23. azure/ai/evaluation/simulator/_conversation/__init__.py +128 -7
  24. azure/ai/evaluation/simulator/_conversation/_conversation.py +0 -1
  25. azure/ai/evaluation/simulator/_indirect_attack_simulator.py +1 -0
  26. azure/ai/evaluation/simulator/_model_tools/_rai_client.py +40 -0
  27. azure/ai/evaluation/simulator/_model_tools/_template_handler.py +1 -0
  28. azure/ai/evaluation/simulator/_simulator.py +3 -0
  29. {azure_ai_evaluation-1.0.1.dist-info → azure_ai_evaluation-1.1.0.dist-info}/METADATA +15 -10
  30. {azure_ai_evaluation-1.0.1.dist-info → azure_ai_evaluation-1.1.0.dist-info}/RECORD +33 -29
  31. {azure_ai_evaluation-1.0.1.dist-info → azure_ai_evaluation-1.1.0.dist-info}/NOTICE.txt +0 -0
  32. {azure_ai_evaluation-1.0.1.dist-info → azure_ai_evaluation-1.1.0.dist-info}/WHEEL +0 -0
  33. {azure_ai_evaluation-1.0.1.dist-info → azure_ai_evaluation-1.1.0.dist-info}/top_level.txt +0 -0
@@ -17,10 +17,6 @@
17
17
 
18
18
  """A library for tokenizing text."""
19
19
 
20
- from __future__ import absolute_import
21
- from __future__ import division
22
- from __future__ import print_function
23
-
24
20
  import re
25
21
 
26
22
 
@@ -2,4 +2,4 @@
2
2
  # Copyright (c) Microsoft Corporation. All rights reserved.
3
3
  # ---------------------------------------------------------
4
4
 
5
- VERSION = "1.0.1"
5
+ VERSION = "1.1.0"
@@ -44,3 +44,5 @@ class _UnstableAdversarialScenario(Enum):
44
44
  """
45
45
 
46
46
  ECI = "adv_politics"
47
+ ADVERSARIAL_IMAGE_GEN = "adv_image_gen"
48
+ ADVERSARIAL_IMAGE_MULTIMODAL = "adv_image_understanding"
@@ -6,8 +6,7 @@
6
6
  import asyncio
7
7
  import logging
8
8
  import random
9
- from typing import Any, Callable, Dict, List, Literal, Optional, Union, cast
10
- from itertools import zip_longest
9
+ from typing import Any, Callable, Dict, List, Optional, Union, cast
11
10
 
12
11
  from tqdm import tqdm
13
12
 
@@ -16,13 +15,19 @@ from azure.ai.evaluation._common.utils import validate_azure_ai_project
16
15
  from azure.ai.evaluation._exceptions import ErrorBlame, ErrorCategory, ErrorTarget, EvaluationException
17
16
  from azure.ai.evaluation._http_utils import get_async_http_client
18
17
  from azure.ai.evaluation._model_configurations import AzureAIProject
19
- from azure.ai.evaluation.simulator import AdversarialScenario
18
+ from azure.ai.evaluation.simulator import AdversarialScenario, AdversarialScenarioJailbreak
20
19
  from azure.ai.evaluation.simulator._adversarial_scenario import _UnstableAdversarialScenario
21
20
  from azure.core.credentials import TokenCredential
22
21
  from azure.core.pipeline.policies import AsyncRetryPolicy, RetryMode
23
22
 
24
23
  from ._constants import SupportedLanguages
25
- from ._conversation import CallbackConversationBot, ConversationBot, ConversationRole, ConversationTurn
24
+ from ._conversation import (
25
+ CallbackConversationBot,
26
+ MultiModalConversationBot,
27
+ ConversationBot,
28
+ ConversationRole,
29
+ ConversationTurn,
30
+ )
26
31
  from ._conversation._conversation import simulate_conversation
27
32
  from ._model_tools import (
28
33
  AdversarialTemplateHandler,
@@ -205,7 +210,6 @@ class AdversarialSimulator:
205
210
  ncols=100,
206
211
  unit="simulations",
207
212
  )
208
-
209
213
  if randomize_order:
210
214
  # The template parameter lists are persistent across sim runs within a session,
211
215
  # So randomize a the selection instead of the parameter list directly,
@@ -214,11 +218,11 @@ class AdversarialSimulator:
214
218
  random.seed(randomization_seed)
215
219
  random.shuffle(templates)
216
220
  parameter_lists = [t.template_parameters for t in templates]
217
- zipped_parameters = list(zip_longest(*parameter_lists))
221
+ zipped_parameters = list(zip(*parameter_lists))
218
222
  for param_group in zipped_parameters:
219
223
  for template, parameter in zip(templates, param_group):
220
224
  if _jailbreak_type == "upia":
221
- parameter = self._join_conversation_starter(parameter, random.choice(jailbreak_dataset))
225
+ parameter = self._add_jailbreak_parameter(parameter, random.choice(jailbreak_dataset))
222
226
  tasks.append(
223
227
  asyncio.create_task(
224
228
  self._simulate_async(
@@ -231,6 +235,7 @@ class AdversarialSimulator:
231
235
  api_call_delay_sec=api_call_delay_sec,
232
236
  language=language,
233
237
  semaphore=semaphore,
238
+ scenario=scenario,
234
239
  )
235
240
  )
236
241
  )
@@ -292,10 +297,13 @@ class AdversarialSimulator:
292
297
  api_call_delay_sec: int,
293
298
  language: SupportedLanguages,
294
299
  semaphore: asyncio.Semaphore,
300
+ scenario: Union[AdversarialScenario, AdversarialScenarioJailbreak],
295
301
  ) -> List[Dict]:
296
- user_bot = self._setup_bot(role=ConversationRole.USER, template=template, parameters=parameters)
302
+ user_bot = self._setup_bot(
303
+ role=ConversationRole.USER, template=template, parameters=parameters, scenario=scenario
304
+ )
297
305
  system_bot = self._setup_bot(
298
- target=target, role=ConversationRole.ASSISTANT, template=template, parameters=parameters
306
+ target=target, role=ConversationRole.ASSISTANT, template=template, parameters=parameters, scenario=scenario
299
307
  )
300
308
  bots = [user_bot, system_bot]
301
309
  session = get_async_http_client().with_policies(
@@ -341,6 +349,7 @@ class AdversarialSimulator:
341
349
  template: AdversarialTemplate,
342
350
  parameters: TemplateParameters,
343
351
  target: Optional[Callable] = None,
352
+ scenario: Union[AdversarialScenario, AdversarialScenarioJailbreak],
344
353
  ) -> ConversationBot:
345
354
  if role is ConversationRole.USER:
346
355
  model = self._get_user_proxy_completion_model(
@@ -372,6 +381,21 @@ class AdversarialSimulator:
372
381
  def __call__(self) -> None:
373
382
  pass
374
383
 
384
+ if scenario in [
385
+ _UnstableAdversarialScenario.ADVERSARIAL_IMAGE_GEN,
386
+ _UnstableAdversarialScenario.ADVERSARIAL_IMAGE_MULTIMODAL,
387
+ ]:
388
+ return MultiModalConversationBot(
389
+ callback=target,
390
+ role=role,
391
+ model=DummyModel(),
392
+ user_template=str(template),
393
+ user_template_parameters=parameters,
394
+ rai_client=self.rai_client,
395
+ conversation_template="",
396
+ instantiation_parameters={},
397
+ )
398
+
375
399
  return CallbackConversationBot(
376
400
  callback=target,
377
401
  role=role,
@@ -391,13 +415,8 @@ class AdversarialSimulator:
391
415
  blame=ErrorBlame.SYSTEM_ERROR,
392
416
  )
393
417
 
394
- def _join_conversation_starter(self, parameters: TemplateParameters, to_join: str) -> TemplateParameters:
395
- key: Literal["conversation_starter"] = "conversation_starter"
396
- if key in parameters.keys():
397
- parameters[key] = f"{to_join} {parameters[key]}"
398
- else:
399
- parameters[key] = to_join
400
-
418
+ def _add_jailbreak_parameter(self, parameters: TemplateParameters, to_join: str) -> TemplateParameters:
419
+ parameters["jailbreak_string"] = to_join
401
420
  return parameters
402
421
 
403
422
  def call_sync(
@@ -9,12 +9,12 @@ import time
9
9
  from dataclasses import dataclass
10
10
  from typing import Any, Callable, Dict, List, Optional, Tuple, Union, cast
11
11
 
12
+ import re
12
13
  import jinja2
13
14
 
14
15
  from azure.ai.evaluation._exceptions import ErrorBlame, ErrorCategory, ErrorTarget, EvaluationException
15
16
  from azure.ai.evaluation._http_utils import AsyncHttpPipeline
16
-
17
- from .._model_tools import LLMBase, OpenAIChatCompletionsModel
17
+ from .._model_tools import LLMBase, OpenAIChatCompletionsModel, RAIClient
18
18
  from .._model_tools._template_handler import TemplateParameters
19
19
  from .constants import ConversationRole
20
20
 
@@ -128,15 +128,19 @@ class ConversationBot:
128
128
  self.conversation_starter: Optional[Union[str, jinja2.Template, Dict]] = None
129
129
  if role == ConversationRole.USER:
130
130
  if "conversation_starter" in self.persona_template_args:
131
+ print(self.persona_template_args)
131
132
  conversation_starter_content = self.persona_template_args["conversation_starter"]
132
133
  if isinstance(conversation_starter_content, dict):
133
134
  self.conversation_starter = conversation_starter_content
135
+ print(f"Conversation starter content: {conversation_starter_content}")
134
136
  else:
135
137
  try:
136
138
  self.conversation_starter = jinja2.Template(
137
139
  conversation_starter_content, undefined=jinja2.StrictUndefined
138
140
  )
139
- except jinja2.exceptions.TemplateSyntaxError: # noqa: F841
141
+ print("Successfully created a Jinja2 template for the conversation starter.")
142
+ except jinja2.exceptions.TemplateSyntaxError as e: # noqa: F841
143
+ print(f"Template syntax error: {e}. Using raw content.")
140
144
  self.conversation_starter = conversation_starter_content
141
145
  else:
142
146
  self.logger.info(
@@ -175,6 +179,9 @@ class ConversationBot:
175
179
  samples = [self.conversation_starter.render(**self.persona_template_args)]
176
180
  else:
177
181
  samples = [self.conversation_starter]
182
+ jailbreak_string = self.persona_template_args.get("jailbreak_string", None)
183
+ if jailbreak_string:
184
+ samples = [f"{jailbreak_string} {samples[0]}"]
178
185
  time_taken = 0
179
186
 
180
187
  finish_reason = ["stop"]
@@ -271,8 +278,6 @@ class CallbackConversationBot(ConversationBot):
271
278
  "id": None,
272
279
  "template_parameters": {},
273
280
  }
274
- self.logger.info("Using user provided callback returning response.")
275
-
276
281
  time_taken = end_time - start_time
277
282
  try:
278
283
  response = {
@@ -290,8 +295,6 @@ class CallbackConversationBot(ConversationBot):
290
295
  blame=ErrorBlame.USER_ERROR,
291
296
  ) from exc
292
297
 
293
- self.logger.info("Parsed callback response")
294
-
295
298
  return response, {}, time_taken, result
296
299
 
297
300
  # Bug 3354264: template is unused in the method - is this intentional?
@@ -308,9 +311,127 @@ class CallbackConversationBot(ConversationBot):
308
311
  }
309
312
 
310
313
 
314
+ class MultiModalConversationBot(ConversationBot):
315
+ """MultiModal Conversation bot that uses a user provided callback to generate responses.
316
+
317
+ :param callback: The callback function to use to generate responses.
318
+ :type callback: Callable
319
+ :param user_template: The template to use for the request.
320
+ :type user_template: str
321
+ :param user_template_parameters: The template parameters to use for the request.
322
+ :type user_template_parameters: Dict
323
+ :param args: Optional arguments to pass to the parent class.
324
+ :type args: Any
325
+ :param kwargs: Optional keyword arguments to pass to the parent class.
326
+ :type kwargs: Any
327
+ """
328
+
329
+ def __init__(
330
+ self,
331
+ callback: Callable,
332
+ user_template: str,
333
+ user_template_parameters: TemplateParameters,
334
+ rai_client: RAIClient,
335
+ *args,
336
+ **kwargs,
337
+ ) -> None:
338
+ self.callback = callback
339
+ self.user_template = user_template
340
+ self.user_template_parameters = user_template_parameters
341
+ self.rai_client = rai_client
342
+
343
+ super().__init__(*args, **kwargs)
344
+
345
+ async def generate_response(
346
+ self,
347
+ session: AsyncHttpPipeline,
348
+ conversation_history: List[Any],
349
+ max_history: int,
350
+ turn_number: int = 0,
351
+ ) -> Tuple[dict, dict, float, dict]:
352
+ previous_prompt = conversation_history[-1]
353
+ chat_protocol_message = await self._to_chat_protocol(conversation_history, self.user_template_parameters)
354
+
355
+ # replace prompt with {image.jpg} tags with image content data.
356
+ conversation_history.pop()
357
+ conversation_history.append(
358
+ ConversationTurn(
359
+ role=previous_prompt.role,
360
+ name=previous_prompt.name,
361
+ message=chat_protocol_message["messages"][0]["content"],
362
+ full_response=previous_prompt.full_response,
363
+ request=chat_protocol_message,
364
+ )
365
+ )
366
+ msg_copy = copy.deepcopy(chat_protocol_message)
367
+ result = {}
368
+ start_time = time.time()
369
+ result = await self.callback(msg_copy)
370
+ end_time = time.time()
371
+ if not result:
372
+ result = {
373
+ "messages": [{"content": "Callback did not return a response.", "role": "assistant"}],
374
+ "finish_reason": ["stop"],
375
+ "id": None,
376
+ "template_parameters": {},
377
+ }
378
+
379
+ time_taken = end_time - start_time
380
+ try:
381
+ response = {
382
+ "samples": [result["messages"][-1]["content"]],
383
+ "finish_reason": ["stop"],
384
+ "id": None,
385
+ }
386
+ except Exception as exc:
387
+ msg = "User provided callback does not conform to chat protocol standard."
388
+ raise EvaluationException(
389
+ message=msg,
390
+ internal_message=msg,
391
+ target=ErrorTarget.CALLBACK_CONVERSATION_BOT,
392
+ category=ErrorCategory.INVALID_VALUE,
393
+ blame=ErrorBlame.USER_ERROR,
394
+ ) from exc
395
+
396
+ return response, chat_protocol_message, time_taken, result
397
+
398
+ async def _to_chat_protocol(self, conversation_history, template_parameters): # pylint: disable=unused-argument
399
+ messages = []
400
+
401
+ for _, m in enumerate(conversation_history):
402
+ if "image:" in m.message:
403
+ content = await self._to_multi_modal_content(m.message)
404
+ messages.append({"content": content, "role": m.role.value})
405
+ else:
406
+ messages.append({"content": m.message, "role": m.role.value})
407
+
408
+ return {
409
+ "template_parameters": template_parameters,
410
+ "messages": messages,
411
+ "$schema": "http://azureml/sdk-2-0/ChatConversation.json",
412
+ }
413
+
414
+ async def _to_multi_modal_content(self, text: str) -> list:
415
+ split_text = re.findall(r"[^{}]+|\{[^{}]*\}", text)
416
+ messages = [
417
+ text.strip("{}").replace("image:", "").strip() if text.startswith("{") else text for text in split_text
418
+ ]
419
+ contents = []
420
+ for msg in messages:
421
+ if msg.startswith("image_understanding/"):
422
+ encoded_image = await self.rai_client.get_image_data(msg)
423
+ contents.append(
424
+ {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{encoded_image}"}},
425
+ )
426
+ else:
427
+ contents.append({"type": "text", "text": msg})
428
+ return contents
429
+
430
+
311
431
  __all__ = [
312
432
  "ConversationRole",
313
433
  "ConversationBot",
314
434
  "CallbackConversationBot",
435
+ "MultiModalConversationBot",
315
436
  "ConversationTurn",
316
437
  ]
@@ -9,7 +9,6 @@ from typing import Callable, Dict, List, Optional, Tuple, Union
9
9
  from azure.ai.evaluation._exceptions import ErrorBlame, ErrorCategory, ErrorTarget, EvaluationException
10
10
  from azure.ai.evaluation.simulator._constants import SupportedLanguages
11
11
  from azure.ai.evaluation.simulator._helpers._language_suffix_mapping import SUPPORTED_LANGUAGES_MAPPING
12
-
13
12
  from ..._http_utils import AsyncHttpPipeline
14
13
  from . import ConversationBot, ConversationTurn
15
14
 
@@ -189,6 +189,7 @@ class IndirectAttackSimulator(AdversarialSimulator):
189
189
  api_call_delay_sec=api_call_delay_sec,
190
190
  language=language,
191
191
  semaphore=semaphore,
192
+ scenario=scenario,
192
193
  )
193
194
  )
194
195
  )
@@ -4,6 +4,7 @@
4
4
  import os
5
5
  from typing import Any
6
6
  from urllib.parse import urljoin, urlparse
7
+ import base64
7
8
 
8
9
  from azure.ai.evaluation._exceptions import ErrorBlame, ErrorCategory, ErrorTarget, EvaluationException
9
10
  from azure.ai.evaluation._http_utils import AsyncHttpPipeline, get_async_http_client, get_http_client
@@ -57,6 +58,7 @@ class RAIClient: # pylint: disable=client-accepts-api-version-keyword
57
58
  # add a "/" at the end of the url
58
59
  self.api_url = self.api_url.rstrip("/") + "/"
59
60
  self.parameter_json_endpoint = urljoin(self.api_url, "simulation/template/parameters")
61
+ self.parameter_image_endpoint = urljoin(self.api_url, "simulation/template/parameters/image")
60
62
  self.jailbreaks_json_endpoint = urljoin(self.api_url, "simulation/jailbreak")
61
63
  self.simulation_submit_endpoint = urljoin(self.api_url, "simulation/chat/completions/submit")
62
64
  self.xpia_jailbreaks_json_endpoint = urljoin(self.api_url, "simulation/jailbreak/xpia")
@@ -166,3 +168,41 @@ class RAIClient: # pylint: disable=client-accepts-api-version-keyword
166
168
  category=ErrorCategory.UNKNOWN,
167
169
  blame=ErrorBlame.USER_ERROR,
168
170
  )
171
+
172
+ async def get_image_data(self, path: str) -> Any:
173
+ """Make a GET Image request to the given url
174
+
175
+ :param path: The url of the image
176
+ :type path: str
177
+ :raises EvaluationException: If the Azure safety evaluation service is not available in the current region
178
+ :return: The response
179
+ :rtype: Any
180
+ """
181
+ token = self.token_manager.get_token()
182
+ headers = {
183
+ "Authorization": f"Bearer {token}",
184
+ "Content-Type": "application/json",
185
+ "User-Agent": USER_AGENT,
186
+ }
187
+
188
+ session = self._create_async_client()
189
+ params = {"path": path}
190
+ async with session:
191
+ response = await session.get(
192
+ url=self.parameter_image_endpoint, params=params, headers=headers
193
+ ) # pylint: disable=unexpected-keyword-arg
194
+
195
+ if response.status_code == 200:
196
+ return base64.b64encode(response.content).decode("utf-8")
197
+
198
+ msg = (
199
+ "Azure safety evaluation service is not available in your current region, "
200
+ + "please go to https://aka.ms/azureaistudiosafetyeval to see which regions are supported"
201
+ )
202
+ raise EvaluationException(
203
+ message=msg,
204
+ internal_message=msg,
205
+ target=ErrorTarget.RAI_CLIENT,
206
+ category=ErrorCategory.UNKNOWN,
207
+ blame=ErrorBlame.USER_ERROR,
208
+ )
@@ -56,6 +56,7 @@ class TemplateParameters(TypedDict):
56
56
  category: NotRequired[str]
57
57
  target_population: NotRequired[str]
58
58
  topic: NotRequired[str]
59
+ jailbreak_string: NotRequired[str]
59
60
 
60
61
 
61
62
  class _CategorizedParameter(TypedDict):
@@ -25,6 +25,9 @@ from ._helpers import ConversationHistory, Turn
25
25
  from ._utils import JsonLineChatProtocol
26
26
 
27
27
 
28
+ USER_AGENT += " (type=simulator; subtype=Simulator)"
29
+
30
+
28
31
  @experimental
29
32
  class Simulator:
30
33
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: azure-ai-evaluation
3
- Version: 1.0.1
3
+ Version: 1.1.0
4
4
  Summary: Microsoft Azure Evaluation Library for Python
5
5
  Home-page: https://github.com/Azure/azure-sdk-for-python
6
6
  Author: Microsoft Corporation
@@ -28,8 +28,7 @@ Requires-Dist: pyjwt >=2.8.0
28
28
  Requires-Dist: azure-identity >=1.16.0
29
29
  Requires-Dist: azure-core >=1.30.2
30
30
  Requires-Dist: nltk >=3.9.1
31
- Provides-Extra: remote
32
- Requires-Dist: promptflow-azure <2.0.0,>=1.15.0 ; extra == 'remote'
31
+ Requires-Dist: azure-storage-blob >=12.10.0
33
32
 
34
33
  # Azure AI Evaluation client library for Python
35
34
 
@@ -359,13 +358,13 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
359
358
  [evaluate_dataset]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/evaluate-sdk#evaluate-on-test-dataset-using-evaluate
360
359
  [evaluators]: https://learn.microsoft.com/python/api/azure-ai-evaluation/azure.ai.evaluation?view=azure-python-preview
361
360
  [evaluate_api]: https://learn.microsoft.com/python/api/azure-ai-evaluation/azure.ai.evaluation?view=azure-python-preview#azure-ai-evaluation-evaluate
362
- [evaluate_app]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/evaluate_app
361
+ [evaluate_app]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Supported_Evaluation_Targets/Evaluate_App_Endpoint
363
362
  [evaluation_tsg]: https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/evaluation/azure-ai-evaluation/TROUBLESHOOTING.md
364
363
  [ai_studio]: https://learn.microsoft.com/azure/ai-studio/what-is-ai-studio
365
364
  [ai_project]: https://learn.microsoft.com/azure/ai-studio/how-to/create-projects?tabs=ai-studio
366
365
  [azure_openai]: https://learn.microsoft.com/azure/ai-services/openai/
367
- [evaluate_models]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/evaluate_endpoints
368
- [custom_evaluators]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/evaluate_custom
366
+ [evaluate_models]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Supported_Evaluation_Targets/Evaluate_Base_Model_Endpoint
367
+ [custom_evaluators]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Supported_Evaluation_Metrics/Custom_Evaluators
369
368
  [evaluate_samples]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate
370
369
  [evaluation_metrics]: https://learn.microsoft.com/azure/ai-studio/concepts/evaluation-metrics-built-in
371
370
  [performance_and_quality_evaluators]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/evaluate-sdk#performance-and-quality-evaluators
@@ -373,18 +372,23 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
373
372
  [composite_evaluators]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/evaluate-sdk#composite-evaluators
374
373
  [adversarial_simulation_docs]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#generate-adversarial-simulations-for-safety-evaluation
375
374
  [adversarial_simulation_scenarios]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#supported-adversarial-simulation-scenarios
376
- [adversarial_simulation]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/simulate_adversarial
377
- [simulate_with_conversation_starter]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/simulate_conversation_starter
375
+ [adversarial_simulation]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Simulators/Simulate_Adversarial_Data
376
+ [simulate_with_conversation_starter]: https://github.com/Azure-Samples/azureai-samples/tree/main/scenarios/evaluate/Simulators/Simulate_Context-Relevant_Data/Simulate_From_Conversation_Starter
378
377
  [adversarial_jailbreak]: https://learn.microsoft.com/azure/ai-studio/how-to/develop/simulator-interaction-data#simulating-jailbreak-attacks
379
378
 
380
-
381
379
  # Release History
382
380
 
381
+ ## 1.1.0 (2024-12-12)
382
+
383
+ ### Bugs Fixed
384
+ - Removed `[remote]` extra. This is no longer needed when tracking results in Azure AI Studio.
385
+ - Fixed `AttributeError: 'NoneType' object has no attribute 'get'` while running simulator with 1000+ results
386
+
383
387
  ## 1.0.1 (2024-11-15)
384
388
 
385
389
  ### Bugs Fixed
386
- - Fixed `[remote]` extra to be needed only when tracking results in Azure AI Studio.
387
390
  - Removing `azure-ai-inference` as dependency.
391
+ - Fixed `AttributeError: 'NoneType' object has no attribute 'get'` while running simulator with 1000+ results
388
392
 
389
393
  ## 1.0.0 (2024-11-13)
390
394
 
@@ -396,6 +400,7 @@ This project has adopted the [Microsoft Open Source Code of Conduct][code_of_con
396
400
  - Fixed an issue where the `output_path` parameter in the `evaluate` API did not support relative path.
397
401
  - Output of adversarial simulators are of type `JsonLineList` and the helper function `to_eval_qr_json_lines` now outputs context from both user and assistant turns along with `category` if it exists in the conversation
398
402
  - Fixed an issue where during long-running simulations, API token expires causing "Forbidden" error. Instead, users can now set an environment variable `AZURE_TOKEN_REFRESH_INTERVAL` to refresh the token more frequently to prevent expiration and ensure continuous operation of the simulation.
403
+ - Fixed an issue with the `ContentSafetyEvaluator` that caused parallel execution of sub-evaluators to fail. Parallel execution is now enabled by default again, but can still be disabled via the '_parallel' boolean keyword argument during class initialization.
399
404
  - Fix `evaluate` function not producing aggregated metrics if ANY values to be aggregated were None, NaN, or
400
405
  otherwise difficult to process. Such values are ignored fully, so the aggregated metric of `[1, 2, 3, NaN]`
401
406
  would be 2, not 1.5.
@@ -1,26 +1,30 @@
1
1
  azure/ai/evaluation/__init__.py,sha256=MFxJRoKfSsP_Qlfq0FwynxNf4csNAfTYPQX7jdXc9RU,2757
2
- azure/ai/evaluation/_constants.py,sha256=kdOdisz3FiWQ6PHg5m0TaFFVRx2m3b_oaUkG3y-bkqA,1984
2
+ azure/ai/evaluation/_constants.py,sha256=d41rQb-w2GmCMHOwiyDD1ieJB1U6JyPPl6APZSJbKzg,2036
3
3
  azure/ai/evaluation/_exceptions.py,sha256=MsTbgsPGYPzIxs7MyLKzSeiVKEoCxYkVjONzNfv2tXA,5162
4
- azure/ai/evaluation/_http_utils.py,sha256=oVbRaxUm41tVFGkYpZdHjT9ss_9va1NzXYuV3DUVr8k,17125
4
+ azure/ai/evaluation/_http_utils.py,sha256=1bGce6pKAL-vmaUGRPxVX7DVO05XVQ8YPIwIQ3q7mfA,17221
5
5
  azure/ai/evaluation/_model_configurations.py,sha256=MNN6cQlz7P9vNfHmfEKsUcly3j1FEOEFsA8WV7GPuKQ,4043
6
6
  azure/ai/evaluation/_user_agent.py,sha256=O2y-QPBAcw7w7qQ6M2aRPC3Vy3TKd789u5lcs2yuFaI,290
7
- azure/ai/evaluation/_version.py,sha256=PNwYJcvbJBl8Q8tjRz_IIdkpS8NluC6Ujspj7gJP3CY,199
7
+ azure/ai/evaluation/_version.py,sha256=LzMvSuUB6pmU-LfCPzoYuCoTF0BAqE7ljPjk6r8YaMw,199
8
8
  azure/ai/evaluation/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ azure/ai/evaluation/_azure/__init__.py,sha256=Yx1Iq2GNKQ5lYxTotvPwkPL4u0cm6YVxUe-iVbu1clI,180
10
+ azure/ai/evaluation/_azure/_clients.py,sha256=1mFRSxt-Ld5UBn-m3DJkKc-VPP9CbXQHrqLNdLs9RF0,8201
11
+ azure/ai/evaluation/_azure/_models.py,sha256=tKpxjb5Ou476UasjXPCiuvsxTjLTrnoVnSXy5Bfa51M,12483
12
+ azure/ai/evaluation/_azure/_token_manager.py,sha256=1NZHwgEc9BMXWPz5Ear_J5-oYjouD77crLHHqNLldEw,5193
9
13
  azure/ai/evaluation/_common/__init__.py,sha256=LHTkf6dMLLxikrGNgbUuREBVQcs4ORHR6Eryo4bm9M8,586
10
14
  azure/ai/evaluation/_common/_experimental.py,sha256=GVtSn9r1CeR_yEa578dJVNDJ3P24eqe8WYdH7llbiQY,5694
11
15
  azure/ai/evaluation/_common/constants.py,sha256=OsExttFGLnTAyZa26jnY5_PCDTb7uJNFqtE2qsRZ1mg,1957
12
16
  azure/ai/evaluation/_common/math.py,sha256=d4bwWe35_RWDIZNcbV1BTBbHNx2QHQ4-I3EofDyyNE0,2863
13
- azure/ai/evaluation/_common/rai_service.py,sha256=l98dEuNkaXjU4RI9R3Mc6JxRatPlQV3BfwkK7L8Oajs,26023
17
+ azure/ai/evaluation/_common/rai_service.py,sha256=DcakzdOour9qNdMXU-8UFfvLb12oexAoiJXG8XFTRBs,26462
14
18
  azure/ai/evaluation/_common/utils.py,sha256=MQIZs95gH5je1L-S3twa_WQi071zRu0Dv54lzCI7ZgU,17642
15
19
  azure/ai/evaluation/_evaluate/__init__.py,sha256=Yx1Iq2GNKQ5lYxTotvPwkPL4u0cm6YVxUe-iVbu1clI,180
16
- azure/ai/evaluation/_evaluate/_eval_run.py,sha256=Jil7ERapJzjr4GIMGT4WgfKFt3AIFgTOo1S1AAP_DB4,23333
17
- azure/ai/evaluation/_evaluate/_evaluate.py,sha256=mk9hoeISTq9M6rVBcRtlTu7astdCMpN-FtNOSOOmkjY,37279
18
- azure/ai/evaluation/_evaluate/_utils.py,sha256=IiTkgSBatAUR73oSsq7Mr0W96ZA2cVazw7rKYB-opS0,12280
20
+ azure/ai/evaluation/_evaluate/_eval_run.py,sha256=het3cxjK4J-_hT19dT5a0mC2Cdnk93gM3ONQMJb9bxQ,21923
21
+ azure/ai/evaluation/_evaluate/_evaluate.py,sha256=P5aL70eUBKZT9CVRM9RVSfD0DkuljQyc5ECte37Ycmo,36225
22
+ azure/ai/evaluation/_evaluate/_utils.py,sha256=S4LUUDUBo9JNA41ojSezMC-PZzkWcihhhNdyZwZrpr0,13428
19
23
  azure/ai/evaluation/_evaluate/_batch_run/__init__.py,sha256=G8McpeLxAS_gFhNShX52_YWvE-arhJn-bVpAfzjWG3Q,427
20
24
  azure/ai/evaluation/_evaluate/_batch_run/code_client.py,sha256=XQLaXfswF6ReHLpQthHLuLLa65Pts8uawGp7kRqmMDs,8260
21
25
  azure/ai/evaluation/_evaluate/_batch_run/eval_run_context.py,sha256=p3Bsg_shGs5RXvysOlvo0CQb4Te5herSvX1OP6ylFUQ,3543
22
26
  azure/ai/evaluation/_evaluate/_batch_run/proxy_client.py,sha256=T_QRHScDMBM4O6ejkkKdBmHPjH2NOF6owW48aVUYF6k,3775
23
- azure/ai/evaluation/_evaluate/_batch_run/target_run_context.py,sha256=_e-6QldHyEbPklGFMUOqrQCZHalCUMGHGNiAsVT0wgg,1628
27
+ azure/ai/evaluation/_evaluate/_batch_run/target_run_context.py,sha256=SMos3bVmD73pK6gpIaL4iZZS3-Zda3V4N89Jg0J9sss,1636
24
28
  azure/ai/evaluation/_evaluate/_telemetry/__init__.py,sha256=fhLqE41qxdjfBOGi23cpk6QgUe-s1Fw2xhAAUjNESF0,7045
25
29
  azure/ai/evaluation/_evaluators/__init__.py,sha256=Yx1Iq2GNKQ5lYxTotvPwkPL4u0cm6YVxUe-iVbu1clI,180
26
30
  azure/ai/evaluation/_evaluators/_bleu/__init__.py,sha256=quKKO0kvOSkky5hcoNBvgBuMeeVRFCE9GSv70mAdGP4,260
@@ -29,11 +33,11 @@ azure/ai/evaluation/_evaluators/_coherence/__init__.py,sha256=GRqcSCQse02Spyki0U
29
33
  azure/ai/evaluation/_evaluators/_coherence/_coherence.py,sha256=uG9hX2XWkMREKfMAWRoosjicoI4Lg3ptR3UcLEgKd0c,4643
30
34
  azure/ai/evaluation/_evaluators/_coherence/coherence.prompty,sha256=ANvh9mDFW7KMejrgdWqBLjj4SIqEO5WW9gg5pE0RLJk,6798
31
35
  azure/ai/evaluation/_evaluators/_common/__init__.py,sha256=_hPqTkAla_O6s4ebVtTaBrVLEW3KSdDz66WwxjK50cI,423
32
- azure/ai/evaluation/_evaluators/_common/_base_eval.py,sha256=_KitrIIOzqhggKP3EL3he0AvpDJv4T3io06PwfAtfg8,15961
33
- azure/ai/evaluation/_evaluators/_common/_base_prompty_eval.py,sha256=WfCE6KuSK1bNxBvSOl1vPOqh5UEpuVgA5WMN-BOYeQ4,3876
34
- azure/ai/evaluation/_evaluators/_common/_base_rai_svc_eval.py,sha256=WXGGWf2fsFLeNq0-QL-4s56LXp72CPUhHuTw29H9k-E,5817
36
+ azure/ai/evaluation/_evaluators/_common/_base_eval.py,sha256=n6qldJr8d8H0DnS7IwkQPH9Ep9PdZnVeVtSxQiunADc,19424
37
+ azure/ai/evaluation/_evaluators/_common/_base_prompty_eval.py,sha256=hvJD7jR2ESePkRPN17ytoFhFiS0iTotOfeqmTwG2IMs,4531
38
+ azure/ai/evaluation/_evaluators/_common/_base_rai_svc_eval.py,sha256=czyn1MfaxOmrvvFgdeblf6FaauKgKolgPFsP5f7K29w,7331
35
39
  azure/ai/evaluation/_evaluators/_content_safety/__init__.py,sha256=PEYMIybfP64f7byhuTaiq4RiqsYbjqejpW1JsJIG1jA,556
36
- azure/ai/evaluation/_evaluators/_content_safety/_content_safety.py,sha256=UERxH-cHj1E3mNY7aXMdUz4rAxAkRRNlg8NXqaDdr7M,6332
40
+ azure/ai/evaluation/_evaluators/_content_safety/_content_safety.py,sha256=CIGfBLNOTVXrlF5HIc2UpuDDG5BfzjD7ubJ23CbvobQ,6341
37
41
  azure/ai/evaluation/_evaluators/_content_safety/_hate_unfairness.py,sha256=sjw8FfwxC1f0K1J4TkeA8wkfq88aebiNbaKzS-8DWzk,5919
38
42
  azure/ai/evaluation/_evaluators/_content_safety/_self_harm.py,sha256=0zaB-JKm8FU6yoxD1nqoYvxp3gvjuZfcQjb-xhSHoQ0,5156
39
43
  azure/ai/evaluation/_evaluators/_content_safety/_sexual.py,sha256=q9bEMu6Dp1wxDlH3h2iTayrWv4ux-izLB0kGkxrgEhM,5396
@@ -76,27 +80,27 @@ azure/ai/evaluation/_evaluators/_rouge/_rouge.py,sha256=SV5rESLVARQqh1n0Pf6EMvJo
76
80
  azure/ai/evaluation/_evaluators/_service_groundedness/__init__.py,sha256=0DODUGTOgaYyFbO9_zxuwifixDL3SIm3EkwP1sdwn6M,288
77
81
  azure/ai/evaluation/_evaluators/_service_groundedness/_service_groundedness.py,sha256=GPvufAgTnoQ2HYs6Xnnpmh23n5E3XxnUV0NGuwjDyU0,6648
78
82
  azure/ai/evaluation/_evaluators/_similarity/__init__.py,sha256=V2Mspog99_WBltxTkRHG5NpN5s9XoiTSN4I8POWEkLA,268
79
- azure/ai/evaluation/_evaluators/_similarity/_similarity.py,sha256=DCoHr8-FN9rM6Kbl2T7yRINabBAmLBuEhHKk7EMz6is,5698
83
+ azure/ai/evaluation/_evaluators/_similarity/_similarity.py,sha256=UVBIa1xIlOIJtPctCu-UCOWvXzE4ysaK_XFdokajCuA,5669
80
84
  azure/ai/evaluation/_evaluators/_similarity/similarity.prompty,sha256=eoludASychZoGL625bFCaZai-OY7DIAg90ZLax_o4XE,4594
81
85
  azure/ai/evaluation/_evaluators/_xpia/__init__.py,sha256=VMEL8WrpJQeh4sQiOLzP7hRFPnjzsvwfvTzaGCVJPCM,88
82
86
  azure/ai/evaluation/_evaluators/_xpia/xpia.py,sha256=Nv14lU7jN0yXKbHgHRXMHEy6pn1rXmesBOYI2Ge9ewk,5849
83
87
  azure/ai/evaluation/_vendor/__init__.py,sha256=Yx1Iq2GNKQ5lYxTotvPwkPL4u0cm6YVxUe-iVbu1clI,180
84
88
  azure/ai/evaluation/_vendor/rouge_score/__init__.py,sha256=03OkyfS_UmzRnHv6-z9juTaJ6OXJoEJM989hgifIZbc,607
85
- azure/ai/evaluation/_vendor/rouge_score/rouge_scorer.py,sha256=xDdNtzwtivcdki5RyErEI9BaQ7nksgj4bXYrGz7tLLs,11409
86
- azure/ai/evaluation/_vendor/rouge_score/scoring.py,sha256=ruwkMrJFJNvs3GWqVLAXudIwDa4EsX_d30pfUPUTf8E,1988
87
- azure/ai/evaluation/_vendor/rouge_score/tokenize.py,sha256=tdSsUibKxtOMY8fdqGK_3-4sMbeOxZEG6D6L7suDTxQ,1936
89
+ azure/ai/evaluation/_vendor/rouge_score/rouge_scorer.py,sha256=DtNSeshHipzc6vFnvx7kbs5viXe4LNq-ZrgllFvfR4U,11299
90
+ azure/ai/evaluation/_vendor/rouge_score/scoring.py,sha256=0sqdiNE-4R_EmTTqyWL9_DAOgl54250H5004tZDGxEE,1878
91
+ azure/ai/evaluation/_vendor/rouge_score/tokenize.py,sha256=IyHVsWY6IFFZdB23cLiJs8iBZ0DXk1mQlWE1xtdjuuk,1826
88
92
  azure/ai/evaluation/_vendor/rouge_score/tokenizers.py,sha256=3_-y1TyvyluHuERhSJ5CdXSwnpcMA7aAKU6PCz9wH_Q,1745
89
93
  azure/ai/evaluation/simulator/__init__.py,sha256=JbrPZ8pvTBalyX94SvZ9btHNoovX8rbZV03KmzxxWys,552
90
- azure/ai/evaluation/simulator/_adversarial_scenario.py,sha256=_hvL719cT7Vgh34KpztJikSlnKhzr16lvNVBXZa6Wwk,1605
91
- azure/ai/evaluation/simulator/_adversarial_simulator.py,sha256=O-QLbo6-5w-1Qn4-sghCcPECe8uavlenJWg-1x-kc_0,20980
94
+ azure/ai/evaluation/simulator/_adversarial_scenario.py,sha256=9rpAPz594tYjxzM3XMeDq6CZSc2yvf5YaNaGC7nzYhM,1710
95
+ azure/ai/evaluation/simulator/_adversarial_simulator.py,sha256=FPZ3OdpGuwCHDVoOZW-f_j7pyK71PfDN3JPh205tW0c,21706
92
96
  azure/ai/evaluation/simulator/_constants.py,sha256=nCL7_1BnYh6k0XvxudxsDVMbiG9MMEvYw5wO9FZHHZ8,857
93
97
  azure/ai/evaluation/simulator/_direct_attack_simulator.py,sha256=FTtWf655dHJF5FLJi0xGSBgIlGWNiVWyqaLDJSud9XA,10199
94
- azure/ai/evaluation/simulator/_indirect_attack_simulator.py,sha256=ktVLlQo7LfzRodVA6wDLc_Dm3YADPa2klX6bPPfrkiw,10179
95
- azure/ai/evaluation/simulator/_simulator.py,sha256=3wi3hdlao_41sVNvjM6YCXfJ-1A6-tDg_brpkaUat8U,36158
98
+ azure/ai/evaluation/simulator/_indirect_attack_simulator.py,sha256=nweIU_AkUIR50qLQpjmljf_OkpsCPth2Ebf4vusygCA,10226
99
+ azure/ai/evaluation/simulator/_simulator.py,sha256=pWxVfy9ll6gmOyGEk6Ie7Y48X21wJ5DebqY8Re0SIOk,36213
96
100
  azure/ai/evaluation/simulator/_tracing.py,sha256=frZ4-usrzINast9F4-ONRzEGGox71y8bYw0UHNufL1Y,3069
97
101
  azure/ai/evaluation/simulator/_utils.py,sha256=16NltlywpbMtoFtULwTKqeURguIS1kSKSo3g8uKV8TA,5181
98
- azure/ai/evaluation/simulator/_conversation/__init__.py,sha256=ulkkJkvRBRROLp_wpAKy1J-HLMJi3Yq6g7Q6VGRuD88,12914
99
- azure/ai/evaluation/simulator/_conversation/_conversation.py,sha256=vzKdpItmUjZrM5OUSkS2UkTnLnKvIzhak5hZ8xvFwnU,7403
102
+ azure/ai/evaluation/simulator/_conversation/__init__.py,sha256=s8djzJ58_-CiIA8xHB-SbgeZaq1F7ftrc3qJbpUpUdg,17853
103
+ azure/ai/evaluation/simulator/_conversation/_conversation.py,sha256=qdzGMtCPYMxeGpR91NZTEmmz2RtADTvQGj6C-3EUTw4,7402
100
104
  azure/ai/evaluation/simulator/_conversation/constants.py,sha256=3v7zkjPwJAPbSpJYIK6VOZZy70bJXMo_QTVqSFGlq9A,984
101
105
  azure/ai/evaluation/simulator/_data_sources/__init__.py,sha256=Yx1Iq2GNKQ5lYxTotvPwkPL4u0cm6YVxUe-iVbu1clI,180
102
106
  azure/ai/evaluation/simulator/_data_sources/grounding.json,sha256=jqdqHrCgS7hN7K2kXSEcPCmzFjV4cv_qcCSR-Hutwx4,1257075
@@ -106,14 +110,14 @@ azure/ai/evaluation/simulator/_helpers/_simulator_data_classes.py,sha256=BOttMTe
106
110
  azure/ai/evaluation/simulator/_model_tools/__init__.py,sha256=aMv5apb7uVjuhMF9ohhA5kQmo652hrGIJlhdl3y2R1I,835
107
111
  azure/ai/evaluation/simulator/_model_tools/_identity_manager.py,sha256=-hptp2vpJIcfjvtd0E2c7ry00LVh23LxuYGevsNFfgs,6385
108
112
  azure/ai/evaluation/simulator/_model_tools/_proxy_completion_model.py,sha256=Zg_SzqjCGJ3Wt8hktxz6Y1JEJCcV0V5jBC9N06jQP3k,8984
109
- azure/ai/evaluation/simulator/_model_tools/_rai_client.py,sha256=5WFRbZQbPhp3S8_l1lHE72HHipSgqtlcB-JdRt293aU,7228
110
- azure/ai/evaluation/simulator/_model_tools/_template_handler.py,sha256=FGKLsWL0FZry47ZxFi53FSem8PZmh0iIy3JN4PBg5Tg,7036
113
+ azure/ai/evaluation/simulator/_model_tools/_rai_client.py,sha256=40MGzIXGv7oVshWH7AbOPLCigI4HlMrqbF2Rq5jFMGo,8755
114
+ azure/ai/evaluation/simulator/_model_tools/_template_handler.py,sha256=NQWqjE7csSzkhb2XdW82AoCA-DxixpTrfBxAnOt2Wlc,7075
111
115
  azure/ai/evaluation/simulator/_model_tools/models.py,sha256=bfVm0PV3vfH_8DkdmTMZqYVN-G51hZ6Y0TOO-NiysJY,21811
112
116
  azure/ai/evaluation/simulator/_prompty/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
117
  azure/ai/evaluation/simulator/_prompty/task_query_response.prompty,sha256=2BzSqDDYilDushvR56vMRDmqFIaIYAewdUlUZg_elMg,2182
114
118
  azure/ai/evaluation/simulator/_prompty/task_simulate.prompty,sha256=NE6lH4bfmibgMn4NgJtm9_l3PMoHSFrfjjosDJEKM0g,939
115
- azure_ai_evaluation-1.0.1.dist-info/METADATA,sha256=QmfPB60dq4htOHkeAa_YuKh1AywKZVlH0QAl0qqf7CY,28098
116
- azure_ai_evaluation-1.0.1.dist-info/NOTICE.txt,sha256=4tzi_Yq4-eBGhBvveobWHCgUIVF-ZeouGN0m7hVq5Mk,3592
117
- azure_ai_evaluation-1.0.1.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
118
- azure_ai_evaluation-1.0.1.dist-info/top_level.txt,sha256=S7DhWV9m80TBzAhOFjxDUiNbKszzoThbnrSz5MpbHSQ,6
119
- azure_ai_evaluation-1.0.1.dist-info/RECORD,,
119
+ azure_ai_evaluation-1.1.0.dist-info/METADATA,sha256=zusuZTIcO7487bWQK5V7XZ-Pbqugm7HFzvcCV5yfTmk,28751
120
+ azure_ai_evaluation-1.1.0.dist-info/NOTICE.txt,sha256=4tzi_Yq4-eBGhBvveobWHCgUIVF-ZeouGN0m7hVq5Mk,3592
121
+ azure_ai_evaluation-1.1.0.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
122
+ azure_ai_evaluation-1.1.0.dist-info/top_level.txt,sha256=S7DhWV9m80TBzAhOFjxDUiNbKszzoThbnrSz5MpbHSQ,6
123
+ azure_ai_evaluation-1.1.0.dist-info/RECORD,,