项目文件夹

文件
2026-07-13 13:32:05 +08:00

49 行
1.4 KiB
Python

from typing import List, Dict, Optional, Union
from dataclasses import dataclass, field
from pydantic import BaseModel
import re
from deepeval.test_case import (
LLMTestCase,
)
from deepeval.prompt import Prompt
class Contestant(BaseModel):
name: str
test_case: LLMTestCase
hyperparameters: Optional[Dict[str, Union[str, int, float, Prompt]]] = None
model_config = {"arbitrary_types_allowed": True}
@dataclass
class ArenaTestCase:
contestants: List[Contestant]
multimodal: bool = field(default=False)
def __post_init__(self):
contestant_names = [contestant.name for contestant in self.contestants]
if len(contestant_names) != len(set(contestant_names)):
raise ValueError("All contestant names must be unique.")
cases = [contestant.test_case for contestant in self.contestants]
ref_input = cases[0].input
for case in cases[1:]:
if case.input != ref_input:
raise ValueError("All contestants must have the same 'input'.")
ref_expected = cases[0].expected_output
for case in cases[1:]:
if case.expected_output != ref_expected:
raise ValueError(
"All contestants must have the same 'expected_output'."
)
for contestant in self.contestants:
if contestant.test_case.multimodal:
self.multimodal = True
class Arena:
test_cases: List[ArenaTestCase]