File size: 2,341 Bytes
9eecab5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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"