File size: 1,107 Bytes
acf77ab | 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 39 40 | from __future__ import annotations
from collections import Counter
from dataclasses import asdict
from codeforge.models import AuditEntry
class AuditLedger:
"""Per-episode, per-step append-only audit log."""
def __init__(self) -> None:
self._entries: list[AuditEntry] = []
def append(self, entry: AuditEntry) -> None:
self._entries.append(entry)
def entries(self) -> tuple[AuditEntry, ...]:
return tuple(self._entries)
def total_reward(self) -> float:
return sum(e.reward for e in self._entries)
def citation_count(self) -> dict[str, int]:
counts: Counter[str] = Counter()
for entry in self._entries:
counts.update(entry.cited_skill_ids)
return dict(counts)
def step_count(self) -> int:
return len(self._entries)
def serialize(self) -> dict[str, object]:
return {
"entries": [asdict(e) for e in self._entries],
"total_reward": self.total_reward(),
"step_count": self.step_count(),
"citation_count": self.citation_count(),
}
|