File size: 1,089 Bytes
6c3043e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | from __future__ import annotations
import json
from collections.abc import Sequence
from datetime import UTC, datetime
from agent_threat_map.observability import analyze_case_records
from agent_threat_map.schema import CaseScore
from agent_threat_map.scoring import aggregate_metrics
def build_report(
scores: Sequence[CaseScore],
*,
model_name: str = "unspecified",
probe_version: str = "seed",
geometry_clusters: int = 4,
geometry_min_cases: int = 5,
) -> dict:
metrics = aggregate_metrics(scores, model_name=model_name)
cases_dict = [s.to_dict() for s in scores]
observability = analyze_case_records(
cases_dict,
n_clusters=geometry_clusters,
min_cases=geometry_min_cases,
)
return {
"generated_at_utc": datetime.now(UTC).isoformat(),
"probe_dataset": probe_version,
"metrics": metrics,
"observability": observability,
"cases": cases_dict,
}
def report_to_json(report: dict, *, indent: int = 2) -> str:
return json.dumps(report, indent=indent, ensure_ascii=False)
|