| """ |
| 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 |
|
|
| 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" |
|
|
| |
| |
|
|
|
|
| def _last_user_content(messages: list[dict]) -> str: |
| for msg in reversed(messages): |
| if msg.get("role") == "user": |
| return str(msg.get("content", "")) |
| return "" |
|
|
|
|
| |
| |
| |
|
|