File size: 1,012 Bytes
6364e69
 
 
 
 
f526878
6364e69
 
 
 
 
 
 
 
 
f526878
 
6364e69
 
 
 
f526878
 
 
6364e69
f526878
6364e69
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from __future__ import annotations

from typing import Any, Dict

from ca.clarity.compass import Compass
from ca.runtime.safety import SafetyAnalyzer
from ca.runtime.state import SafetyLevel, UserState
from ca.safety.risk import RiskSignals


class Router:
    """Route user input to skills/models based on intent and safety level."""

    def __init__(self) -> None:
        self.compass = Compass()
        self.safety = SafetyAnalyzer()
        self.last_signal = None

    def route(self, text: str, context: Dict[str, Any] | None = None) -> tuple[UserState, SafetyLevel]:
        state = self.compass.classify(text)
        risk = RiskSignals.detect(text)
        signal = self.safety.detect(text)
        self.last_signal = signal
        if risk.high_risk or signal.high_risk:
            return (UserState.CRISIS, SafetyLevel.HIGH)
        if state == UserState.MANIPULATOR or risk.medium_risk or signal.medium_risk:
            return (state, SafetyLevel.MEDIUM)
        return (state, SafetyLevel.LOW)