From 70feb1ef85113424b0595115b093afb58cbfe253 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Tue, 27 Jan 2026 13:02:23 -0300 Subject: [PATCH] atlasbot: refine role and hardware filters --- services/comms/atlasbot-deployment.yaml | 2 +- services/comms/scripts/atlasbot/bot.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/services/comms/atlasbot-deployment.yaml b/services/comms/atlasbot-deployment.yaml index 7fdbf64..ce53f8c 100644 --- a/services/comms/atlasbot-deployment.yaml +++ b/services/comms/atlasbot-deployment.yaml @@ -16,7 +16,7 @@ spec: labels: app: atlasbot annotations: - checksum/atlasbot-configmap: manual-atlasbot-37 + checksum/atlasbot-configmap: manual-atlasbot-38 vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: "comms" vault.hashicorp.com/agent-inject-secret-turn-secret: "kv/data/atlas/comms/turn-shared-secret" diff --git a/services/comms/scripts/atlasbot/bot.py b/services/comms/scripts/atlasbot/bot.py index ff528ea..a7741cd 100644 --- a/services/comms/scripts/atlasbot/bot.py +++ b/services/comms/scripts/atlasbot/bot.py @@ -432,7 +432,10 @@ def _detect_metric(q: str) -> str | None: def _detect_hardware_filters(q: str) -> tuple[set[str], set[str]]: include: set[str] = set() exclude: set[str] = set() + rpi_specific = "rpi4" in q or "rpi5" in q for hardware, phrases in HARDWARE_HINTS.items(): + if hardware == "rpi" and rpi_specific: + continue for phrase in phrases: if f"non {phrase}" in q or f"non-{phrase}" in q or f"not {phrase}" in q: exclude.add(hardware) @@ -440,6 +443,17 @@ def _detect_hardware_filters(q: str) -> tuple[set[str], set[str]]: include.add(hardware) return include, exclude + +def _detect_role_filters(q: str) -> set[str]: + roles: set[str] = set() + if "control-plane" in q or "control plane" in q: + roles.add("control-plane") + if "master" in q: + roles.add("master") + if "accelerator" in q: + roles.add("accelerator") + return roles + def _detect_entity(q: str) -> str | None: if "node" in q or "nodes" in q or "worker" in q or TITAN_NODE_RE.search(q): return "node" @@ -1125,6 +1139,7 @@ def structured_answer( include_hw, exclude_hw = _detect_hardware_filters(q) nodes_in_query = _extract_titan_nodes(q) only_workers = "worker" in q or "workers" in q + role_filters = _detect_role_filters(q) only_ready: bool | None = None if "not ready" in q or "unready" in q or "down" in q or "missing" in q: only_ready = False @@ -1201,6 +1216,12 @@ def structured_answer( only_ready=only_ready if op in ("status", "count") else None, nodes_in_query=nodes_in_query, ) + if role_filters: + filtered = [ + node + for node in filtered + if role_filters.intersection(set(node.get("roles") or [])) + ] names = [node["name"] for node in filtered] if op == "status":