""" Heuristic adapter router. Priority: explicit `mode` override → keyword match → default "support". Swap in model self-classification by uncommenting _model_classify below. """ from typing import Literal AdapterName = Literal["support", "analytics", "form"] _KEYWORDS: dict[str, list[str]] = { "support": [ "error", "help", "issue", "problem", "broken", "fix", "support", "bug", "crash", "fail", "wrong", "not working", ], "analytics": [ "chart", "graph", "data", "analytics", "trend", "report", "metric", "dashboard", "stat", "plot", "visuali", "insight", ], "form": [ "form", "fill", "submit", "input", "register", "sign up", "signup", "onboard", "enter your", "complete", "provide", ], } _VALID: set[str] = set(_KEYWORDS.keys()) def route(messages: list[dict], explicit_mode: str | None = None) -> AdapterName: if explicit_mode and explicit_mode in _VALID: return explicit_mode # type: ignore[return-value] text = _last_user_content(messages).lower() if not text: return "support" scores: dict[str, int] = {k: 0 for k in _KEYWORDS} for name, kws in _KEYWORDS.items(): for kw in kws: if kw in text: scores[name] += 1 best = max(scores, key=lambda k: scores[k]) return best if scores[best] > 0 else "support" # type: ignore[return-value] # Uncomment to replace keyword match with model self-classification: # return _model_classify(messages) def _last_user_content(messages: list[dict]) -> str: for msg in reversed(messages): if msg.get("role") == "user": return str(msg.get("content", "")) return "" # def _model_classify(messages): # """Classify using a lightweight model (e.g. a 0-shot instruct call).""" # raise NotImplementedError