@@ -436,12 +436,12 @@ def test_valid_creation(self) -> None:
436436 conversation_group_id = "conv1" ,
437437 turns = turns ,
438438 description = "Test conversation" ,
439- tag = "test_tag" ,
439+ tag = { "test_tag" } ,
440440 conversation_metrics = ["deepeval:conversation_completeness" ],
441441 )
442442
443443 assert eval_data .conversation_group_id == "conv1"
444- assert eval_data .tag == "test_tag"
444+ assert eval_data .tag == { "test_tag" }
445445 assert len (eval_data .turns ) == 2
446446 assert eval_data .description == "Test conversation"
447447 assert eval_data .conversation_metrics is not None
@@ -452,14 +452,58 @@ def test_default_tag_value(self) -> None:
452452 turn = TurnData (turn_id = "turn1" , query = "Query" )
453453 eval_data = EvaluationData (conversation_group_id = "conv1" , turns = [turn ])
454454
455- assert eval_data .tag == "eval"
455+ assert eval_data .tag == { "eval" }
456456
457- def test_empty_tag_rejected (self ) -> None :
458- """Test that empty tag is rejected."""
457+ def test_single_string_tag_normalized_to_set (self ) -> None :
458+ """Test that a single string tag is normalized to a set."""
459+ turn = TurnData (turn_id = "turn1" , query = "Query" )
460+ eval_data = EvaluationData (
461+ conversation_group_id = "conv1" , turns = [turn ], tag = "basic" # type: ignore[arg-type]
462+ )
463+
464+ assert eval_data .tag == {"basic" }
465+
466+ def test_list_tag_accepted (self ) -> None :
467+ """Test that a list of tags is accepted."""
468+ turn = TurnData (turn_id = "turn1" , query = "Query" )
469+ eval_data = EvaluationData (
470+ conversation_group_id = "conv1" , turns = [turn ], tag = {"basic" , "advanced" }
471+ )
472+
473+ assert eval_data .tag == {"basic" , "advanced" }
474+
475+ def test_empty_tag_list_rejected (self ) -> None :
476+ """Test that empty list tag is rejected."""
459477 turn = TurnData (turn_id = "turn1" , query = "Query" )
460478
461479 with pytest .raises (ValidationError ):
462- EvaluationData (conversation_group_id = "conv1" , turns = [turn ], tag = "" )
480+ EvaluationData (
481+ conversation_group_id = "conv1" ,
482+ turns = [turn ],
483+ tag = [], # type: ignore[arg-type]
484+ )
485+
486+ def test_whitespace_only_tag_rejected (self ) -> None :
487+ """Test that a list of only whitespace strings is rejected."""
488+ turn = TurnData (turn_id = "turn1" , query = "Query" )
489+
490+ with pytest .raises (ValidationError ):
491+ EvaluationData (
492+ conversation_group_id = "conv1" ,
493+ turns = [turn ],
494+ tag = [" " ], # type: ignore[arg-type]
495+ )
496+
497+ def test_non_string_tag_items_rejected (self ) -> None :
498+ """Test that non-string items in tag list are rejected."""
499+ turn = TurnData (turn_id = "turn1" , query = "Query" )
500+
501+ with pytest .raises (ValidationError ):
502+ EvaluationData (
503+ conversation_group_id = "conv1" ,
504+ turns = [turn ],
505+ tag = [1 , "prod" ], # type: ignore[list-item]
506+ )
463507
464508 def test_empty_conversation_id_rejected (self ) -> None :
465509 """Test that empty conversation_group_id is rejected."""
@@ -500,7 +544,7 @@ def test_default_values(self) -> None:
500544 )
501545
502546 # Test meaningful defaults
503- assert result .tag == "eval"
547+ assert result .tag == { "eval" }
504548 assert result .score is None
505549 assert result .reason == ""
506550 assert result .evaluation_latency == 0
@@ -509,21 +553,45 @@ def test_explicit_tag_value(self) -> None:
509553 """Test EvaluationResult with explicit tag value."""
510554 result = EvaluationResult (
511555 conversation_group_id = "conv1" ,
512- tag = "custom_tag" ,
556+ tag = { "custom_tag" } ,
513557 turn_id = "turn1" ,
514558 metric_identifier = "metric1" ,
515559 result = "PASS" ,
516560 threshold = 0.7 ,
517561 )
518562
519- assert result .tag == "custom_tag"
563+ assert result .tag == {"custom_tag" }
564+
565+ def test_empty_tag_list_rejected (self ) -> None :
566+ """Test that empty tag list is rejected."""
567+ with pytest .raises (ValidationError ):
568+ EvaluationResult (
569+ conversation_group_id = "conv1" ,
570+ tag = [], # type: ignore[arg-type]
571+ turn_id = "turn1" ,
572+ metric_identifier = "metric1" ,
573+ result = "PASS" ,
574+ threshold = 0.7 ,
575+ )
576+
577+ def test_whitespace_only_tag_rejected (self ) -> None :
578+ """Test that a list of only whitespace strings is rejected."""
579+ with pytest .raises (ValidationError ):
580+ EvaluationResult (
581+ conversation_group_id = "conv1" ,
582+ tag = [" " ], # type: ignore[arg-type]
583+ turn_id = "turn1" ,
584+ metric_identifier = "metric1" ,
585+ result = "PASS" ,
586+ threshold = 0.7 ,
587+ )
520588
521- def test_empty_tag_rejected (self ) -> None :
522- """Test that empty tag is rejected."""
589+ def test_non_string_tag_items_rejected (self ) -> None :
590+ """Test that non-string items in tag list are rejected."""
523591 with pytest .raises (ValidationError ):
524592 EvaluationResult (
525593 conversation_group_id = "conv1" ,
526- tag = "" ,
594+ tag = [ 1 , "prod" ], # type: ignore[list-item]
527595 turn_id = "turn1" ,
528596 metric_identifier = "metric1" ,
529597 result = "PASS" ,
0 commit comments