Source code for scripts.bench_utils

"""Shared utilities for benchmark and evaluation scripts."""

from __future__ import annotations

import math
import os
import statistics
from typing import Any, Optional, Sequence


[docs] def safe_mean(values: Sequence[float]) -> float: """Return the arithmetic mean or ``0.0`` for an empty sequence.""" return float(statistics.fmean(values)) if values else 0.0
[docs] def percentile(values: Sequence[float], p: float) -> float: """Return the linear-interpolated percentile for *values*.""" if not values: return 0.0 sorted_v = sorted(values) k = (len(sorted_v) - 1) * (p / 100.0) f = math.floor(k) c = math.ceil(k) if f == c: return sorted_v[int(k)] return sorted_v[f] * (c - k) + sorted_v[c] * (k - f)
[docs] def format_float(val: float, decimals: int = 3) -> str: """Format a float with a fixed number of decimal places.""" return f"{val:.{decimals}f}"
[docs] def build_ragas_embeddings( provider: str, api_key: Optional[str], ) -> Any: """Build a RAGAS-compatible embeddings wrapper for the judge provider.""" try: from ragas.embeddings import LangchainEmbeddingsWrapper except ImportError: return None if provider == "mistral": try: from langchain_mistralai import MistralAIEmbeddings emb = MistralAIEmbeddings( model="mistral-embed", api_key=api_key or os.getenv("MISTRAL_API_KEY", ""), # type: ignore[arg-type] ) return LangchainEmbeddingsWrapper(emb) except ImportError: return None return None