EDA_Explorer / core /query_router.py
ProfessionalMario's picture
Fresh deployment with LFS tracking
9eecab5
from utils.logger import logger
class QueryRouter:
"""
Rule-based fallback router.
Order matters: transformer action words are checked first so that queries
like 'drop column X' or 'impute missing' don't get swallowed by the
metadata keyword list.
"""
# Transformer keywords take top priority β€” they are explicit action verbs.
TRANSFORMER_KEYWORDS = [
"normalize",
"standardize",
"zscore",
"z-score",
"scale",
"encode",
"onehot",
"one-hot",
"one hot",
"dummies",
"drop",
"fill",
"impute",
"rename",
"strip",
"duplicate",
"constant",
"whitespace",
"dropna",
]
# Metadata keywords β€” structural / schema queries.
METADATA_KEYWORDS = [
"column",
"numeric",
"categorical",
"missing",
"schema",
"fields",
"field",
]
# DataFrame / statistics keywords.
DATAFRAME_KEYWORDS = [
"average",
"mean",
"median",
"max",
"min",
"top",
"count",
"rows",
"sum",
"highest",
"lowest",
]
# Visualisation keywords.
VISUAL_KEYWORDS = [
"plot",
"graph",
"scatter",
"hist",
"bar",
"chart",
"histogram",
"distribution",
]
def route(self, query):
q = query.lower()
if any(word in q for word in self.TRANSFORMER_KEYWORDS):
logger.info("Routing β†’ transformer_agent")
return "transformer_agent"
if any(word in q for word in self.METADATA_KEYWORDS):
logger.info("Routing β†’ metadata_agent")
return "metadata_agent"
if any(word in q for word in self.DATAFRAME_KEYWORDS):
logger.info("Routing β†’ dataframe_agent")
return "dataframe_agent"
if any(word in q for word in self.VISUAL_KEYWORDS):
logger.info("Routing β†’ visualization_agent")
return "visualization_agent"
if "analyze" in query or "analysis" in query or "analyse" in query:
return "analysis_agent"
logger.warning(f"No route matched for query: {query}")
return "unknown command"