Source code for rath.eval.models

"""Versioned evaluation datasets, results, and experiment summaries."""

from __future__ import annotations

from collections.abc import Mapping
from dataclasses import dataclass, field
from enum import Enum
from typing import Protocol, runtime_checkable
from uuid import UUID, uuid4

from rath._json import JSONValue, freeze_mapping
from rath.runtime import Run

__all__ = [
    "Dataset",
    "EvaluationResult",
    "Evaluator",
    "Example",
    "Experiment",
    "GateDecision",
]


[docs] @dataclass(frozen=True, slots=True) class Example: id: UUID inputs: Mapping[str, JSONValue] expected: Mapping[str, JSONValue] def __post_init__(self) -> None: object.__setattr__(self, "inputs", freeze_mapping(self.inputs, field="inputs")) object.__setattr__( self, "expected", freeze_mapping(self.expected, field="expected") )
[docs] @classmethod def create( cls, inputs: Mapping[str, object], expected: Mapping[str, object], ) -> "Example": return cls( id=uuid4(), inputs=freeze_mapping(inputs, field="inputs"), expected=freeze_mapping(expected, field="expected"), )
[docs] @dataclass(frozen=True, slots=True) class Dataset: id: UUID name: str version: str examples: tuple[Example, ...]
[docs] @dataclass(frozen=True, slots=True) class EvaluationResult: evaluator: str score: float passed: bool reason: str metadata: Mapping[str, JSONValue] = field(default_factory=dict) def __post_init__(self) -> None: if not 0 <= self.score <= 1: raise ValueError("evaluation score must be between 0 and 1") object.__setattr__( self, "metadata", freeze_mapping(self.metadata, field="evaluation.metadata"), )
[docs] @runtime_checkable class Evaluator(Protocol): name: str
[docs] async def evaluate(self, example: Example, run: Run) -> EvaluationResult: ...
[docs] @dataclass(frozen=True, slots=True) class Experiment: id: UUID dataset_id: UUID revision_id: UUID results: tuple[EvaluationResult, ...] @property def mean_score(self) -> float: if not self.results: return 0.0 return sum(result.score for result in self.results) / len(self.results)
[docs] class GateDecision(str, Enum): PASS = "pass" FAIL = "fail"