Skip to content

Commit 29e3487

Browse files
authored
added question detectoor to nestbot mentions (#2473)
1 parent 8c8930a commit 29e3487

File tree

2 files changed

+60
-4
lines changed
  • backend

2 files changed

+60
-4
lines changed

backend/apps/slack/common/handlers/ai.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from apps.ai.agent.agent import AgenticRAGAgent
88
from apps.slack.blocks import markdown
9+
from apps.slack.common.question_detector import QuestionDetector
910

1011
logger = logging.getLogger(__name__)
1112

@@ -38,6 +39,10 @@ def process_ai_query(query: str) -> str | None:
3839
str | None: The AI response or None if error occurred.
3940
4041
"""
42+
question_detector = QuestionDetector()
43+
if not question_detector.is_owasp_question(text=query):
44+
return get_default_response()
45+
4146
agent = AgenticRAGAgent()
4247
result = agent.run(query=query)
4348
return result["answer"]
@@ -56,3 +61,13 @@ def get_error_blocks() -> list[dict]:
5661
"Please try again later or contact support if the issue persists."
5762
)
5863
]
64+
65+
66+
def get_default_response() -> str:
67+
"""Get default response for non-OWASP questions.
68+
69+
Returns:
70+
str: A default response for non-OWASP questions.
71+
72+
"""
73+
return "Please ask questions related to OWASP."

backend/tests/apps/slack/common/handlers/ai_test.py

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44

55
import pytest
66

7-
from apps.slack.common.handlers.ai import get_blocks, get_error_blocks, process_ai_query
7+
from apps.slack.common.handlers.ai import (
8+
get_blocks,
9+
get_default_response,
10+
get_error_blocks,
11+
process_ai_query,
12+
)
813

914

1015
class TestAiHandler:
@@ -63,51 +68,87 @@ def test_get_blocks_with_empty_response(self, mock_get_error_blocks, mock_proces
6368
assert result == error_blocks
6469

6570
@patch("apps.slack.common.handlers.ai.AgenticRAGAgent")
66-
def test_process_ai_query_success(self, mock_agent_class):
71+
@patch("apps.slack.common.handlers.ai.QuestionDetector")
72+
def test_process_ai_query_success(self, mock_question_detector_class, mock_agent_class):
6773
"""Test successful AI query processing with AgenticRAGAgent."""
6874
query = "What is OWASP?"
6975
expected_response = "OWASP is a security organization..."
7076

77+
mock_question_detector = Mock()
78+
mock_question_detector.is_owasp_question.return_value = True
79+
mock_question_detector_class.return_value = mock_question_detector
80+
7181
mock_agent = Mock()
7282
mock_agent.run.return_value = {"answer": expected_response}
7383
mock_agent_class.return_value = mock_agent
7484

7585
result = process_ai_query(query)
7686

87+
mock_question_detector_class.assert_called_once()
88+
mock_question_detector.is_owasp_question.assert_called_once_with(text=query)
7789
mock_agent_class.assert_called_once()
7890
mock_agent.run.assert_called_once_with(query=query)
7991
assert result == expected_response
8092

8193
@patch("apps.slack.common.handlers.ai.AgenticRAGAgent")
82-
def test_process_ai_query_failure(self, mock_agent_class):
94+
@patch("apps.slack.common.handlers.ai.QuestionDetector")
95+
def test_process_ai_query_failure(self, mock_question_detector_class, mock_agent_class):
8396
"""Test AI query processing failure raises exception."""
8497
query = "What is OWASP?"
8598

99+
mock_question_detector = Mock()
100+
mock_question_detector.is_owasp_question.return_value = True
101+
mock_question_detector_class.return_value = mock_question_detector
102+
86103
mock_agent = Mock()
87104
mock_agent.run.side_effect = Exception("AI service error")
88105
mock_agent_class.return_value = mock_agent
89106

90107
with pytest.raises(Exception, match="AI service error"):
91108
process_ai_query(query)
92109

110+
mock_question_detector_class.assert_called_once()
111+
mock_question_detector.is_owasp_question.assert_called_once_with(text=query)
93112
mock_agent_class.assert_called_once()
94113
mock_agent.run.assert_called_once_with(query=query)
95114

96115
@patch("apps.slack.common.handlers.ai.AgenticRAGAgent")
97-
def test_process_ai_query_returns_none(self, mock_agent_class):
116+
@patch("apps.slack.common.handlers.ai.QuestionDetector")
117+
def test_process_ai_query_returns_none(self, mock_question_detector_class, mock_agent_class):
98118
"""Test AI query processing when agent returns no answer."""
99119
query = "What is OWASP?"
100120

121+
mock_question_detector = Mock()
122+
mock_question_detector.is_owasp_question.return_value = True
123+
mock_question_detector_class.return_value = mock_question_detector
124+
101125
mock_agent = Mock()
102126
mock_agent.run.return_value = {"answer": None}
103127
mock_agent_class.return_value = mock_agent
104128

105129
result = process_ai_query(query)
106130

131+
mock_question_detector_class.assert_called_once()
132+
mock_question_detector.is_owasp_question.assert_called_once_with(text=query)
107133
mock_agent_class.assert_called_once()
108134
mock_agent.run.assert_called_once_with(query=query)
109135
assert result is None
110136

137+
@patch("apps.slack.common.handlers.ai.QuestionDetector")
138+
def test_process_ai_query_non_owasp_question(self, mock_question_detector_class):
139+
"""Test AI query processing when question is not OWASP-related."""
140+
query = "What is the weather today?"
141+
142+
mock_question_detector = Mock()
143+
mock_question_detector.is_owasp_question.return_value = False
144+
mock_question_detector_class.return_value = mock_question_detector
145+
146+
result = process_ai_query(query)
147+
148+
mock_question_detector_class.assert_called_once()
149+
mock_question_detector.is_owasp_question.assert_called_once_with(text=query)
150+
assert result == get_default_response()
151+
111152
@patch("apps.slack.common.handlers.ai.markdown")
112153
def test_get_error_blocks(self, mock_markdown):
113154
"""Test error blocks generation."""

0 commit comments

Comments
 (0)