AI-support-ticket / graders.py
Jainam maru
Fix task scores strictly between 0 and 1, fix all openenv issues
34976e8
Raw
History Blame Contribute Delete
3.52 kB
from models import Category, Priority, Status
TASKS = {
"classify_ticket": {
"difficulty": "easy",
"ticket": {
"subject": "My invoice shows wrong amount",
"description": "I was charged $150 but my plan is only $50/month. Please fix this immediately.",
"expected_category": Category.billing,
"expected_priority": Priority.high,
},
},
"resolve_ticket": {
"difficulty": "medium",
"ticket": {
"subject": "Cannot login to my account",
"description": "I keep getting 'invalid password' error even after resetting my password twice. I need access urgently.",
"expected_category": Category.account,
"expected_priority": Priority.high,
"resolution_keywords": ["password", "reset", "login", "account", "support", "help", "try", "clear", "browser", "cache"],
},
},
"triage_queue": {
"difficulty": "hard",
"tickets": [
{
"id": "t1",
"subject": "System completely down for all users",
"description": "Our entire team cannot access the platform. Business is halted.",
"expected_priority": Priority.critical,
"expected_category": Category.technical,
},
{
"id": "t2",
"subject": "Question about pricing plans",
"description": "Can you tell me the difference between basic and pro plans?",
"expected_priority": Priority.low,
"expected_category": Category.billing,
},
{
"id": "t3",
"subject": "Package not delivered after 2 weeks",
"description": "My order #12345 was supposed to arrive 2 weeks ago. No updates.",
"expected_priority": Priority.high,
"expected_category": Category.shipping,
},
],
},
}
def _clamp(score: float) -> float:
"""Ensure score is strictly between 0.0 and 1.0 (exclusive)."""
return round(min(max(score, 0.01), 0.99), 2)
def grade_classify_ticket(action: dict) -> float:
task = TASKS["classify_ticket"]["ticket"]
score = 0.1
if action.get("category") == task["expected_category"]:
score += 0.44
if action.get("priority") == task["expected_priority"]:
score += 0.44
return _clamp(score)
def grade_resolve_ticket(action: dict) -> float:
task = TASKS["resolve_ticket"]["ticket"]
score = 0.1
if action.get("category") == task["expected_category"]:
score += 0.15
if action.get("priority") == task["expected_priority"]:
score += 0.15
resolution = (action.get("resolution") or "").lower()
if len(resolution) > 20:
score += 0.15
matched = sum(1 for kw in task["resolution_keywords"] if kw in resolution)
score += min(matched / len(task["resolution_keywords"]), 0.89) * 0.35
return _clamp(score)
def grade_triage_queue(actions: list) -> float:
tickets = TASKS["triage_queue"]["tickets"]
if not actions:
return 0.01
total = 0.1
for i, ticket in enumerate(tickets):
if i >= len(actions):
break
action = actions[i]
if action.get("priority") == ticket["expected_priority"]:
total += 0.28
if action.get("category") == ticket["expected_category"]:
total += 0.28
return _clamp(total / len(tickets))