pratik-250620/MultiModal-Coherence-AI
2
1from __future__ import annotations2 3from dataclasses import dataclass4from typing import List5 6from .schema import SemanticPlan, RiskFlag, ComplexityLevel7 8 9@dataclass(frozen=True)10class PlanValidationResult:11 ok: bool12 warnings: List[str]13 risk_flags: List[RiskFlag]14 complexity_level: ComplexityLevel15 16 17def validate_plan(plan: SemanticPlan) -> PlanValidationResult:18 warnings: List[str] = []19 risk_flags: List[RiskFlag] = list(plan.risk_flags)20 21 if len(plan.primary_entities) > 5:22 warnings.append("Too many primary_entities; may reduce coherence.")23 if RiskFlag.ambiguity not in risk_flags:24 risk_flags.append(RiskFlag.ambiguity)25 26 if len(plan.must_include) > 7:27 warnings.append("Too many must_include constraints; generation may become brittle.")28 if plan.complexity_level == ComplexityLevel.low:29 complexity = ComplexityLevel.medium30 else:31 complexity = plan.complexity_level32 else:33 complexity = plan.complexity_level34 35 lower_moods = {m.lower() for m in plan.mood_emotion}36 if "calm" in lower_moods and "tense" in lower_moods:37 warnings.append("Conflicting mood_emotion signals (calm + tense).")38 if RiskFlag.emotional_conflict not in risk_flags:39 risk_flags.append(RiskFlag.emotional_conflict)40 41 overlap = {x.lower() for x in plan.must_include}.intersection(42 {y.lower() for y in plan.must_avoid}43 )44 if overlap:45 warnings.append(46 "Conflicting constraints: "47 f"{sorted(overlap)} appear in both must_include and must_avoid."48 )49 if RiskFlag.conflicting_constraints not in risk_flags:50 risk_flags.append(RiskFlag.conflicting_constraints)51 52 return PlanValidationResult(53 ok=True,54 warnings=warnings,55 risk_flags=risk_flags,56 complexity_level=complexity,57 )58 