"""fallback_utils.py — Funzioni di utilità per il loop di fallback. Estratto da unified_loop_fallback.py (split 2026-06-30). """ import re def _is_refusal(text: str) -> bool: """Verifica se la risposta del modello è un rifiuto (S129).""" if not text: return False refusals = ["mi dispiace", "non posso", "i apologize", "i cannot", "unauthorized", "access denied"] t = text.lower() return any(r in t for r in refusals) def _s759_bjac(a: str, b: str) -> float: """Calcola la somiglianza di Jaccard tra due stringhe (S759).""" if not a or not b: return 0.0 set_a = set(a.lower().split()) set_b = set(b.lower().split()) intersection = len(set_a.intersection(set_b)) union = len(set_a.union(set_b)) return intersection / union if union > 0 else 0.0 def _avg10(lst: list) -> float: """Calcola la media degli ultimi 10 elementi di una lista.""" if not lst: return 0.0 sub = lst[-10:] return sum(sub) / len(sub)