adaptive-model / lib /router.py
joduor's picture
init: adaptive-model — handler, gateway, mcp-server, training
1de92bf verified
Raw
History Blame Contribute Delete
1.86 kB
"""
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