versioned prompt store with diffable renders and eval pins. prompts are code, treat them like it.
1 """Stockage versionne des prompts. Un prompt est du code : il se diffe,
2 il se relit, il se rejoue."""
3
4 from dataclasses import dataclass
5
6
7 @dataclass
8 class Pin:
9 """Un score d'eval fige a une version donnee."""
10 version: str
11 score: float
12
13
14 class Vault:
15 def save(self, name: str, body: str, *, force: bool = False, reason: str = "") -> str:
16 """Enregistre une version. Refuse si le score passe sous le pin.
17
18 Un prompt qui se degrade en silence est la panne la plus chere a
19 diagnostiquer : mieux vaut bloquer et expliquer.
20 """
21 pin = self._pins.get(name)
22 score = self._evaluate(name, body)
23
24 if pin and score < pin.score and not force:
25 raise ScoreRegression(
26 f"{name}: {score:.3f} < pinned {pin.score:.3f}. "
27 f"pass force=True with a reason to override."
28 )
29
30 if force and not reason:
31 raise ValueError("forcing a regression requires a reason, it lands in the log")
32
33 return self._write(name, body, score=score, forced=force, reason=reason)