15
15
16
16
from azure .ai .evaluation ._common .math import list_sum
17
17
from azure .ai .evaluation ._exceptions import ErrorBlame , ErrorCategory , ErrorTarget , EvaluationException
18
+ from azure .ai .evaluation ._common .utils import validate_azure_ai_project
18
19
19
20
from .._constants import (
20
21
CONTENT_SAFETY_DEFECT_RATE_THRESHOLD_DEFAULT ,
@@ -292,76 +293,85 @@ def _validate_columns_for_evaluators(
292
293
293
294
def _validate_and_load_data (target , data , evaluators , output_path , azure_ai_project , evaluation_name ):
294
295
if data is None :
295
- msg = "data parameter must be provided for evaluation."
296
+ msg = "The ' data' parameter is required for evaluation."
296
297
raise EvaluationException (
297
298
message = msg ,
298
- internal_message = msg ,
299
299
target = ErrorTarget .EVALUATE ,
300
- category = ErrorCategory .MISSING_FIELD ,
300
+ category = ErrorCategory .INVALID_VALUE ,
301
+ blame = ErrorBlame .USER_ERROR ,
302
+ )
303
+ if not isinstance (data , (os .PathLike , str )):
304
+ msg = "The 'data' parameter must be a string or a path-like object."
305
+ raise EvaluationException (
306
+ message = msg ,
307
+ target = ErrorTarget .EVALUATE ,
308
+ category = ErrorCategory .INVALID_VALUE ,
309
+ blame = ErrorBlame .USER_ERROR ,
310
+ )
311
+ if not os .path .exists (data ):
312
+ msg = f"The input data file path '{ data } ' does not exist."
313
+ raise EvaluationException (
314
+ message = msg ,
315
+ target = ErrorTarget .EVALUATE ,
316
+ category = ErrorCategory .INVALID_VALUE ,
301
317
blame = ErrorBlame .USER_ERROR ,
302
318
)
303
319
304
320
if target is not None :
305
321
if not callable (target ):
306
- msg = "target parameter must be a callable function."
322
+ msg = "The ' target' parameter must be a callable function."
307
323
raise EvaluationException (
308
324
message = msg ,
309
- internal_message = msg ,
310
325
target = ErrorTarget .EVALUATE ,
311
326
category = ErrorCategory .INVALID_VALUE ,
312
327
blame = ErrorBlame .USER_ERROR ,
313
328
)
314
329
315
- if data is not None :
316
- if not isinstance (data , str ):
317
- msg = "data parameter must be a string."
318
- raise EvaluationException (
319
- message = msg ,
320
- internal_message = msg ,
321
- target = ErrorTarget .EVALUATE ,
322
- category = ErrorCategory .INVALID_VALUE ,
323
- blame = ErrorBlame .USER_ERROR ,
324
- )
330
+ if not evaluators :
331
+ msg = "The 'evaluators' parameter is required and cannot be None or empty."
332
+ raise EvaluationException (
333
+ message = msg ,
334
+ target = ErrorTarget .EVALUATE ,
335
+ category = ErrorCategory .INVALID_VALUE ,
336
+ blame = ErrorBlame .USER_ERROR ,
337
+ )
338
+ if not isinstance (evaluators , dict ):
339
+ msg = "The 'evaluators' parameter must be a dictionary."
340
+ raise EvaluationException (
341
+ message = msg ,
342
+ target = ErrorTarget .EVALUATE ,
343
+ category = ErrorCategory .INVALID_VALUE ,
344
+ blame = ErrorBlame .USER_ERROR ,
345
+ )
325
346
326
- if evaluators is not None :
327
- if not isinstance (evaluators , dict ):
328
- msg = "evaluators parameter must be a dictionary ."
347
+ if output_path is not None :
348
+ if not isinstance (output_path , ( os . PathLike , str ) ):
349
+ msg = "The 'output_path' parameter must be a string or a path-like object ."
329
350
raise EvaluationException (
330
351
message = msg ,
331
- internal_message = msg ,
332
352
target = ErrorTarget .EVALUATE ,
333
353
category = ErrorCategory .INVALID_VALUE ,
334
354
blame = ErrorBlame .USER_ERROR ,
335
355
)
336
356
337
- if output_path is not None :
338
- if not isinstance ( output_path , str ):
339
- msg = "output_path parameter must be a string ."
357
+ output_dir = output_path if os . path . isdir ( output_path ) else os . path . dirname ( output_path )
358
+ if not os . path . exists ( output_dir ):
359
+ msg = f"The output directory ' { output_dir } ' does not exist. Please create the directory manually ."
340
360
raise EvaluationException (
341
361
message = msg ,
342
- internal_message = msg ,
343
362
target = ErrorTarget .EVALUATE ,
344
363
category = ErrorCategory .INVALID_VALUE ,
345
364
blame = ErrorBlame .USER_ERROR ,
346
365
)
347
366
348
367
if azure_ai_project is not None :
349
- if not isinstance (azure_ai_project , Dict ):
350
- msg = "azure_ai_project parameter must be a dictionary."
351
- raise EvaluationException (
352
- message = msg ,
353
- internal_message = msg ,
354
- target = ErrorTarget .EVALUATE ,
355
- category = ErrorCategory .INVALID_VALUE ,
356
- blame = ErrorBlame .USER_ERROR ,
357
- )
368
+ validate_azure_ai_project (azure_ai_project )
358
369
359
370
if evaluation_name is not None :
360
- if not isinstance (evaluation_name , str ):
361
- msg = "evaluation_name parameter must be a string."
371
+ if not isinstance (evaluation_name , str ) or not evaluation_name . strip () :
372
+ msg = "The ' evaluation_name' parameter must be a non-empty string."
362
373
raise EvaluationException (
363
374
message = msg ,
364
- internal_message = msg ,
365
375
target = ErrorTarget .EVALUATE ,
366
376
category = ErrorCategory .INVALID_VALUE ,
367
377
blame = ErrorBlame .USER_ERROR ,
@@ -371,8 +381,7 @@ def _validate_and_load_data(target, data, evaluators, output_path, azure_ai_proj
371
381
initial_data_df = pd .read_json (data , lines = True )
372
382
except Exception as e :
373
383
raise EvaluationException (
374
- message = f"Failed to load data from { data } . Confirm that it is valid jsonl data. Error: { str (e )} ." ,
375
- internal_message = "Failed to load data. Confirm that it is valid jsonl data." ,
384
+ message = f"Unable to load data from '{ data } '. Please ensure the input is valid JSONL format. Detailed error: { e } ." ,
376
385
target = ErrorTarget .EVALUATE ,
377
386
category = ErrorCategory .INVALID_VALUE ,
378
387
blame = ErrorBlame .USER_ERROR ,
0 commit comments