File size: 2,307 Bytes
80ef840
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from app.models.model_router import ModelRouter


class IntentAgent:
    INTENT_KEYWORDS = {
        "refund_request": ["refund", "money back", "reimburse"],
        "return_request": ["return", "send back"],
        "shipping_status": ["where", "shipping", "shipment", "tracking", "arrived", "delivery", "delayed"],
        "payment_issue": ["payment", "card", "charged", "failed"],
        "cancellation_request": ["cancel", "cancellation"],
        "exchange_request": ["exchange", "replace", "size"],
        "warranty_claim": ["warranty", "repair", "defective", "broken"],
    }

    def __init__(self, router: ModelRouter | None = None):
        self.router = router or ModelRouter()

    def classify(self, message: str) -> dict:
        if self.router.intent_model.api_key:
            try:
                return self._classify_with_groq(message)
            except Exception:
                pass
        return self._classify_locally(message)

    def _classify_with_groq(self, message: str) -> dict:
        prompt = f"""
Classify this Shopify customer support ticket.
Return only JSON with keys: intent, priority, confidence.
Allowed intents: refund_request, return_request, shipping_status, payment_issue,
cancellation_request, exchange_request, warranty_claim, general_support.
Allowed priority values: low, normal, high.

Message: {message}
"""
        result = self.router.intent_model.complete_json(
            prompt,
            system="You are an intent classification agent for ecommerce customer support.",
        )
        return {
            "intent": result.get("intent", "general_support"),
            "priority": result.get("priority", "normal"),
            "confidence": float(result.get("confidence", 0.7)),
        }

    def _classify_locally(self, message: str) -> dict:
        lowered = message.lower()
        intent = "general_support"
        for candidate, keywords in self.INTENT_KEYWORDS.items():
            if any(keyword in lowered for keyword in keywords):
                intent = candidate
                break
        priority = "high" if any(word in lowered for word in ["urgent", "angry", "refund", "failed", "broken"]) else "normal"
        return {"intent": intent, "priority": priority, "confidence": 0.86 if intent != "general_support" else 0.62}