case0 / src /case_zero /schemas /accusation.py
HusseinEid's picture
Case Zero - initial public release (fully local: Qwen2.5-1.5B via llama.cpp + Supertonic, custom pixel-noir SPA via gradio.Server)
414dc55
Raw
History Blame Contribute Delete
809 Bytes
"""Final accusation and the scored verdict.
The verdict is produced by deterministic scoring (engine.scoring), not by the model,
so a jailbroken confession in prose can never change the outcome.
"""
from __future__ import annotations
from pydantic import BaseModel, ConfigDict, Field
class Accusation(BaseModel):
model_config = ConfigDict(frozen=True)
accused_sus_id: str
weapon_id: str | None = None
motive_id: str | None = None
cited_clue_ids: tuple[str, ...] = ()
class Verdict(BaseModel):
model_config = ConfigDict(frozen=True)
solved: bool
culprit_correct: bool
weapon_correct: bool
motive_correct: bool
score: int = Field(ge=0, le=100)
breakdown: tuple[tuple[str, int], ...] = ()
rationale: str = ""
deduction_chain: tuple[str, ...] = ()