diff --git a/services/comms/scripts/atlasbot/bot.py b/services/comms/scripts/atlasbot/bot.py index eca5fef..7f22ad5 100644 --- a/services/comms/scripts/atlasbot/bot.py +++ b/services/comms/scripts/atlasbot/bot.py @@ -163,6 +163,8 @@ CLUSTER_HINT_WORDS = { "documentation", "docs", "playbook", + "utilization", + "usage", "grafana", "victoria", "prometheus", @@ -561,8 +563,10 @@ def _has_any(text: str, phrases: tuple[str, ...]) -> bool: def _detect_operation(q: str) -> str | None: if _has_any(q, OPERATION_HINTS["top"]): return "top" + if _has_any(q, OPERATION_HINTS["bottom"]): + return "bottom" for op, phrases in OPERATION_HINTS.items(): - if op == "top": + if op in ("top", "bottom"): continue if _has_any(q, phrases): return op @@ -1353,6 +1357,11 @@ def snapshot_metric_answer( failed = metrics.get("pods_failed") succeeded = metrics.get("pods_succeeded") status_terms = ("running", "pending", "failed", "succeeded", "completed") + if ("most pods" in q or ("most" in q and "pod" in q and "node" in q)) and not nodes_in_query: + return _format_confidence( + "I don't have per-node pod counts in the snapshot.", + "medium", + ) if "total" in q or "sum" in q: values = [v for v in (running, pending, failed, succeeded) if isinstance(v, (int, float))] if values: @@ -1363,13 +1372,13 @@ def snapshot_metric_answer( return _format_confidence(f"Pods not running: {sum(parts):.0f}.", "high") if sum(1 for term in status_terms if term in q) > 1: parts = [] - if running is not None: + if "running" in q and running is not None: parts.append(f"running {running:.0f}") - if pending is not None: + if "pending" in q and pending is not None: parts.append(f"pending {pending:.0f}") - if failed is not None: + if "failed" in q and failed is not None: parts.append(f"failed {failed:.0f}") - if succeeded is not None: + if ("succeeded" in q or "completed" in q) and succeeded is not None: parts.append(f"succeeded {succeeded:.0f}") if parts: return _format_confidence(f"Pods: {', '.join(parts)}.", "high") @@ -1461,7 +1470,12 @@ def structured_answer( if hw_line: return _format_confidence(hw_line, "high") - if entity == "node" and op == "status" and metric is None: + if ( + entity == "node" + and op == "status" + and metric is None + and not (include_hw or exclude_hw or nodes_in_query or only_workers or role_filters) + ): summary = _nodes_summary_line(inventory, snapshot) if summary: return _format_confidence(summary, "high")