Skip to content

Commit 2cf8d29

Browse files
committed
[refactor]: migrate classification logic with simplification
1 parent 8badfc0 commit 2cf8d29

File tree

5 files changed

+94
-219
lines changed

5 files changed

+94
-219
lines changed

backend/app/agents/classification_router.py

Lines changed: 0 additions & 208 deletions
This file was deleted.

backend/app/classification/__init__.py

Whitespace-only changes.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import logging
2+
from typing import Dict, Any
3+
from langchain_google_genai import ChatGoogleGenerativeAI
4+
from langchain_core.messages import HumanMessage
5+
from app.core.config import settings
6+
from .prompt import DEVREL_TRIAGE_PROMPT
7+
8+
logger = logging.getLogger(__name__)
9+
10+
class ClassificationRouter:
11+
"""Simple DevRel triage - determines if message needs DevRel assistance"""
12+
13+
def __init__(self, llm_client=None):
14+
self.llm = llm_client or ChatGoogleGenerativeAI(
15+
model=settings.classification_agent_model,
16+
temperature=0.1,
17+
google_api_key=settings.gemini_api_key
18+
)
19+
20+
async def should_process_message(self, message: str, context: Dict[str, Any] = None) -> Dict[str, Any]:
21+
"""Simple triage: Does this message need DevRel assistance?"""
22+
try:
23+
triage_prompt = DEVREL_TRIAGE_PROMPT.format(
24+
message=message,
25+
context=context or 'No additional context'
26+
)
27+
28+
response = await self.llm.ainvoke([HumanMessage(content=triage_prompt)])
29+
30+
response_text = response.content.strip()
31+
if '{' in response_text:
32+
json_start = response_text.find('{')
33+
json_end = response_text.rfind('}') + 1
34+
json_str = response_text[json_start:json_end]
35+
36+
import json
37+
result = json.loads(json_str)
38+
39+
return {
40+
"needs_devrel": result.get("needs_devrel", True),
41+
"priority": result.get("priority", "medium"),
42+
"reasoning": result.get("reasoning", "LLM classification"),
43+
"original_message": message
44+
}
45+
46+
return self._fallback_triage(message)
47+
48+
except Exception as e:
49+
logger.error(f"Triage error: {str(e)}")
50+
return self._fallback_triage(message)
51+
52+
def _fallback_triage(self, message: str) -> Dict[str, Any]:
53+
"""Fallback: assume it needs DevRel help"""
54+
return {
55+
"needs_devrel": True,
56+
"priority": "medium",
57+
"reasoning": "Fallback - assuming DevRel assistance needed",
58+
"original_message": message
59+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
DEVREL_TRIAGE_PROMPT = """Analyze this message to determine if it needs DevRel assistance.
2+
3+
Message: {message}
4+
5+
Context: {context}
6+
7+
DevRel handles:
8+
- Technical questions about projects/APIs
9+
- Developer onboarding and support
10+
- Bug reports and feature requests
11+
- Community discussions about development
12+
- Documentation requests
13+
- General developer experience questions
14+
15+
Respond ONLY with JSON:
16+
{{
17+
"needs_devrel": true/false,
18+
"priority": "high|medium|low",
19+
"reasoning": "brief explanation"
20+
}}
21+
22+
Examples:
23+
- "How do I contribute?" → {{"needs_devrel": true, "priority": "high", "reasoning": "Onboarding question"}}
24+
- "What's for lunch?" → {{"needs_devrel": false, "priority": "low", "reasoning": "Not development related"}}
25+
- "API is throwing errors" → {{"needs_devrel": true, "priority": "high", "reasoning": "Technical support needed"}}
26+
"""

backend/integrations/discord/bot.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import logging
44
from typing import Dict, Any, Optional
55
from app.core.orchestration.queue_manager import AsyncQueueManager, QueuePriority
6-
from app.agents.classification_router import ClassificationRouter
6+
from app.classification.classification_router import ClassificationRouter
77

88
logger = logging.getLogger(__name__)
99

@@ -51,8 +51,7 @@ async def on_message(self, message):
5151
return
5252

5353
try:
54-
# Classify message locally first
55-
classification = await self.classifier.classify_message(
54+
triage_result = await self.classifier.should_process_message(
5655
message.content,
5756
{
5857
"channel_id": str(message.channel.id),
@@ -61,16 +60,15 @@ async def on_message(self, message):
6160
}
6261
)
6362

64-
logger.info(f"Message classified as: {classification}")
63+
logger.info(f"Message triage result: {triage_result}")
6564

66-
# Only process if DevRel intervention is needed
67-
if classification.get("needs_devrel", False):
68-
await self._handle_devrel_message(message, classification)
65+
if triage_result.get("needs_devrel", False):
66+
await self._handle_devrel_message(message, triage_result)
6967

7068
except Exception as e:
7169
logger.error(f"Error processing message: {str(e)}")
7270

73-
async def _handle_devrel_message(self, message, classification: Dict[str, Any]):
71+
async def _handle_devrel_message(self, message, triage_result: Dict[str, Any]):
7472
"""Handle messages that need DevRel intervention"""
7573
try:
7674
user_id = str(message.author.id)
@@ -87,7 +85,7 @@ async def _handle_devrel_message(self, message, classification: Dict[str, Any]):
8785
"thread_id": thread_id,
8886
"memory_thread_id": user_id,
8987
"content": message.content,
90-
"classification": classification,
88+
"triage": triage_result,
9189
"platform": "discord",
9290
"timestamp": message.created_at.isoformat(),
9391
"author": {
@@ -96,13 +94,13 @@ async def _handle_devrel_message(self, message, classification: Dict[str, Any]):
9694
}
9795
}
9896

99-
# Determine priority based on classification
97+
# Determine priority based on triage
10098
priority_map = {
10199
"high": QueuePriority.HIGH,
102100
"medium": QueuePriority.MEDIUM,
103101
"low": QueuePriority.LOW
104102
}
105-
priority = priority_map.get(classification.get("priority"), QueuePriority.MEDIUM)
103+
priority = priority_map.get(triage_result.get("priority"), QueuePriority.MEDIUM)
106104

107105
# Enqueue for agent processing
108106
await self.queue_manager.enqueue(agent_message, priority)

0 commit comments

Comments
 (0)