Source code for flexeval.rubric

"""Rubric metric IO utilities. Should maybe be moved to :mod:`~flexeval.io`."""

import importlib.resources
import logging
from pathlib import Path

import flexeval.configuration
from flexeval.io.parsers import yaml_parser
from flexeval.schema import Rubric, RubricsCollection

logger = logging.getLogger(__name__)


default_rubric_collection = (
    None  # don't access directly, use load_default_rubric_metrics
)


[docs] def load_rubrics_from_yaml_file(path: Path) -> dict[str, Rubric]: return yaml_parser.load_models_from_yaml_filepath(path, Rubric)
[docs] def load_rubrics_from_yaml_stream( stream, ) -> dict[str, Rubric]: return yaml_parser.load_models_from_yaml_stream(stream, Rubric)
[docs] def get_default_rubric_collection() -> RubricsCollection: global default_rubric_collection if default_rubric_collection is not None: return default_rubric_collection logger.debug("Attempting to load from default rubric_metrics.yaml.") metrics_path = ( importlib.resources.files(flexeval.configuration) / "rubric_metrics.yaml" ) metrics_string = metrics_path.read_text() rubric_metrics = load_rubrics_from_yaml_stream(metrics_string) default_rubric_collection = RubricsCollection(rubrics=rubric_metrics) return default_rubric_collection
[docs] def load_rubric_metrics( rubric_collections: list[Path | RubricsCollection], add_defaults: bool = False ) -> dict[str, Rubric]: rubric_metrics = {} if add_defaults: rubric_collections.append(get_default_rubric_collection()) for rubric_collection in rubric_collections: if isinstance(rubric_collection, Path): rubric_dict = load_rubrics_from_yaml_file(rubric_collection) else: rubric_dict = rubric_collection.rubrics for key, rubric in rubric_dict.items(): if key not in rubric_metrics: rubric_metrics[key] = rubric if rubric.name is None: # infer rubric name from parent key rubric.name = key else: logger.warning(f"Ignoring second (or later) version of rubric '{key}'.") return rubric_metrics