/
Chaizee
/
ZenithCode_Incident-LLM-analytics
Обзор
Документация
Войти
/
Chaizee
/
ZenithCode_Incident-LLM-analytics
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/severity.py
120 строк
4 KB
Chaizee
fix: fix speed
12 июн 2026, 16:28
12 июн 2026, 16:28
b2745cc
Код
Авторство
О чём код?
from __future__ import annotations SEVERITY_LEVELS: dict[int, dict[str, str]] = { 1: { "label": "МИКРО", "title": "Микро-проблемы", "description": "Мелкий дискомфорт, инфраструктура работает", }, 2: { "label": "ЛОКАЛ", "title": "Локальный сбой", "description": "Яма, лифт, переполненный бак ТБО, уборка снега", }, 3: { "label": "СИСТЕМ", "title": "Системный сбой", "description": "Нет воды, тепла, массовые неисправности", }, 4: { "label": "ВЫС", "title": "Высокая тяжесть", "description": "Затопление, прорыв трубы, срочное реагирование", }, 5: { "label": "ЧП", "title": "Региональное ЧП", "description": "Химвыбросы, обрушение моста, замерзание посёлка", }, } CRITICAL_SEVERITY = 5 MODEL_SEVERITY_MIN = 1 MODEL_SEVERITY_MAX = 5 _SEVERITY_CAPS: tuple[tuple[int, tuple[str, ...]], ...] = ( (2, ( "уборк", "снег", "снега", "снегу", "снегом", "расчист", "снегоубор", "не убран", "не очищ", "налед", "гололед", )), (2, ("мусор", "контейнер", "тко", "свалк", "вывоз отход")), (2, ("освещен", "фонар", "не горит свет", "лампа")), (2, ("шум", "громко", "сосед", "благодар", "спасиб")), (3, ("яма", "выбоин", "тротуар", "асфальт", "люк")), ) _SEVERITY_FLOORS: tuple[tuple[int, tuple[str, ...]], ...] = ( (5, ( "эвакуа", "химвыброс", "химическ", "обрушени", "чрезвыч", "ч.п", "взрыв", "погиб", "жертв", "замерз", "замёрз", "массов", "угроза жизн", )), (5, ( "затопил", "затоплен", "затопило", "затопление", "затопл", "под топ", "залило", "залит", "залило", )), (4, ("прорвал", "прорыв", "прорвало", "прорв")), (4, ("нет вод", "отключил воду", "без вод", "нет горяч", "нет холодн")), (4, ("нет тепл", "нет отоплен", "холодные батар", "не топит", "не греет")), (4, ("обруш", "рухнул", "обвал")), ) def clamp_severity(value: object, *, default: int = 1) -> int: try: n = int(value) except (TypeError, ValueError): return default return max(MODEL_SEVERITY_MIN, min(MODEL_SEVERITY_MAX, n)) def severity_label(severity: int) -> str: meta = SEVERITY_LEVELS.get(clamp_severity(severity), {}) return str(meta.get("label", str(severity))) def severity_title(severity: int) -> str: meta = SEVERITY_LEVELS.get(clamp_severity(severity), {}) return str(meta.get("title", "")) def _match_blob(text: str, theme: str = "") -> str: return f"{theme or ''} {text or ''}".lower() def rule_severity_bounds(text: str, theme: str = "") -> tuple[int | None, int | None]: blob = _match_blob(text, theme) floor: int | None = None cap: int | None = None for min_sev, keywords in _SEVERITY_FLOORS: if any(k in blob for k in keywords): floor = max(floor or min_sev, min_sev) for max_sev, keywords in _SEVERITY_CAPS: if any(k in blob for k in keywords): cap = min(cap or max_sev, max_sev) return floor, cap def refine_severity( ml_severity: int, text: str, *, theme: str = "", is_problem: bool = True, ) -> int: if not is_problem: return MODEL_SEVERITY_MIN sev = clamp_severity(ml_severity) floor, cap = rule_severity_bounds(text, theme) if floor is not None: sev = max(sev, floor) if cap is not None: sev = min(sev, cap) if floor is not None and cap is not None and floor > cap: sev = floor return clamp_severity(sev) def apply_problem_flags(is_problem: bool, severity: int) -> tuple[bool, int]: sev = clamp_severity(severity) if not is_problem: return False, MODEL_SEVERITY_MIN return True, sev