| from __future__ import annotations |
| import logging |
| from typing import Any, Optional |
|
|
| from schemas.incident import Priority |
| from schemas.signal import NormalizedSignal, SignalType |
|
|
| logger = logging.getLogger(__name__) |
|
|
| _PRIORITY_RULES = { |
| SignalType.PERSON_TRAPPED: Priority.P0, |
| SignalType.MEDICAL_EMERGENCY: Priority.P0, |
| SignalType.FIRE: Priority.P0, |
| SignalType.STRUCTURAL_DAMAGE: Priority.P1, |
| SignalType.MISSING_PERSON: Priority.P1, |
| SignalType.FLOOD: Priority.P1, |
| SignalType.RESOURCE_REQUEST: Priority.P2, |
| SignalType.SAFE_STATUS: Priority.P3, |
| SignalType.UNKNOWN: Priority.P2, |
| } |
|
|
| _P0_KEYWORDS = ["atrapado", "trapped", "no puede salir", "inconsciente", "unconscious", "no respira", "not breathing", "critical", "crítico", "sangre", "bleeding", "niño solo", "child alone"] |
| _P1_KEYWORDS = ["urgente", "urgent", "rescate", "rescue", "evacuar", "evacuate", "herido", "injured", "derrumbe", "collapse"] |
|
|
|
|
| async def classify_priority( |
| signal: NormalizedSignal, |
| vllm_client: Any = None, |
| ) -> Priority: |
| base = _PRIORITY_RULES.get(signal.signal_type, Priority.P2) |
|
|
| text_lower = signal.raw_text.lower() |
|
|
| if any(kw in text_lower for kw in _P0_KEYWORDS): |
| if base in (Priority.P1, Priority.P2): |
| logger.debug("Upgrading signal %s to P0 due to critical keywords", signal.id) |
| return Priority.P0 |
|
|
| if any(kw in text_lower for kw in _P1_KEYWORDS): |
| if base == Priority.P2: |
| logger.debug("Upgrading signal %s to P1 due to urgency keywords", signal.id) |
| return Priority.P1 |
|
|
| if signal.affected_people and signal.affected_people > 20: |
| if base == Priority.P2: |
| return Priority.P1 |
| if base == Priority.P1: |
| return Priority.P0 |
|
|
| return base |
|
|