| import json |
| from pathlib import Path |
| from typing import Iterable |
|
|
|
|
| def evaluate_text(text: str, required_terms: Iterable[str], banned_terms: Iterable[str]) -> dict: |
| lowered = text.lower() |
| issues: list[str] = [] |
| for term in required_terms: |
| if term.lower() not in lowered: |
| issues.append(f"missing required term: {term}") |
| for term in banned_terms: |
| if term.lower() in lowered: |
| issues.append(f"banned term: {term}") |
| if any(marker in lowered for marker in ["you have depression", "this means you will", "certainly predicts"]): |
| issues.append("unsafe certainty or diagnosis") |
| return {"passes": not issues, "issues": issues} |
|
|
|
|
| def load_cases(path: str = "tests/fixtures/demo_eval_cases.json") -> list[dict]: |
| return json.loads(Path(path).read_text(encoding="utf-8")) |
|
|
|
|
| def case_source_text(case: dict) -> str: |
| return " ".join( |
| part |
| for part in [ |
| str(case.get("dream_text", "")), |
| str(case.get("voice_transcript", "")), |
| " ".join(str(clue) for clue in case.get("visual_clues", [])), |
| ] |
| if part.strip() |
| ) |
|
|
|
|
| def evaluate_case(case: dict) -> dict: |
| result = evaluate_text( |
| case_source_text(case), |
| required_terms=case.get("required_terms", []), |
| banned_terms=case.get("banned_terms", []), |
| ) |
| return {"id": case.get("id", ""), **result} |
|
|
|
|
| def evaluate_cases(cases: list[dict]) -> dict: |
| results = [evaluate_case(case) for case in cases] |
| failures = [result for result in results if not result["passes"]] |
| return { |
| "case_count": len(cases), |
| "ids": [case["id"] for case in cases], |
| "failures": failures, |
| "passes": not failures, |
| } |
|
|
|
|
| def main() -> int: |
| cases = load_cases() |
| report = evaluate_cases(cases) |
| print(json.dumps(report, indent=2)) |
| return 0 if report["passes"] else 1 |
|
|
|
|
| if __name__ == "__main__": |
| raise SystemExit(main()) |
|
|