reports.py 1.95 KB
"""Markdown and text reports for batch evaluation."""

from __future__ import annotations

from typing import Any, Dict

from .constants import RELEVANCE_EXACT, RELEVANCE_HIGH, RELEVANCE_IRRELEVANT, RELEVANCE_LOW


def render_batch_report_markdown(payload: Dict[str, Any]) -> str:
    lines = [
        "# Search Batch Evaluation",
        "",
        f"- Batch ID: {payload['batch_id']}",
        f"- Created at: {payload['created_at']}",
        f"- Tenant ID: {payload['tenant_id']}",
        f"- Query count: {len(payload['queries'])}",
        f"- Top K: {payload['top_k']}",
        "",
        "## Aggregate Metrics",
        "",
    ]
    for key, value in sorted((payload.get("aggregate_metrics") or {}).items()):
        lines.append(f"- {key}: {value}")
    distribution = payload.get("aggregate_distribution") or {}
    if distribution:
        lines.extend(
            [
                "",
                "## Label Distribution",
                "",
                f"- Exact Match: {distribution.get(RELEVANCE_EXACT, 0)}",
                f"- High Relevant: {distribution.get(RELEVANCE_HIGH, 0)}",
                f"- Low Relevant: {distribution.get(RELEVANCE_LOW, 0)}",
                f"- Irrelevant: {distribution.get(RELEVANCE_IRRELEVANT, 0)}",
            ]
        )
    lines.extend(["", "## Per Query", ""])
    for item in payload.get("per_query") or []:
        lines.append(f"### {item['query']}")
        lines.append("")
        for key, value in sorted((item.get("metrics") or {}).items()):
            lines.append(f"- {key}: {value}")
        distribution = item.get("distribution") or {}
        lines.append(f"- Exact Match: {distribution.get(RELEVANCE_EXACT, 0)}")
        lines.append(f"- High Relevant: {distribution.get(RELEVANCE_HIGH, 0)}")
        lines.append(f"- Low Relevant: {distribution.get(RELEVANCE_LOW, 0)}")
        lines.append(f"- Irrelevant: {distribution.get(RELEVANCE_IRRELEVANT, 0)}")
        lines.append("")
    return "\n".join(lines)