| from typing import Any, Dict, List |
|
|
| FLOW_STAGE_KEYWORDS = { |
| "GREETING": ["hello", "hi", "good morning", "good afternoon", "good evening", "hey"], |
| "INTRODUCTION": ["my name is", "this is", "calling from", "work as", "am a student", "am a teacher"], |
| "DISCOVERY": ["looking for", "what features", "what requirement", "your budget", "need a", "want to buy"], |
| "PRODUCT_DISCUSSION": ["suggest model", "we have", "comes with", "specifications", "ram", "processor", "screen", "warranty", "available"], |
| "OBJECTION_HANDLING": ["too expensive", "any discount", "not sure", "thinking", "installment", "emi", "high price", "costly"], |
| "FOLLOW_UP": ["get back to you", "will follow up", "share the details", "contact you later", "call you back"], |
| "CLOSING": ["thank you", "thanks for calling", "have a nice day", "goodbye", "bye"] |
| } |
|
|
| def classify_flow_stage(text: str) -> str: |
| """Classify the conversation flow stage for a given turn.""" |
| text_lower = text.lower() |
| best_stage = "START" |
| max_matches = 0 |
| for stage, keywords in FLOW_STAGE_KEYWORDS.items(): |
| matches = sum(1 for kw in keywords if kw in text_lower) |
| if matches > max_matches: |
| max_matches = matches |
| best_stage = stage |
| return best_stage |
|
|
| def validate_and_correct_roles(turns: List[Dict[str, Any]], classifications: Dict[str, Dict[str, Any]], threshold: float = 0.85) -> Dict[str, Dict[str, Any]]: |
| """ |
| Validate and correct speaker roles dynamically based on flow stages. |
| Returns the corrected classifications dictionary. |
| """ |
| for i, turn in enumerate(turns): |
| speaker = turn.get("speaker") |
| text = turn.get("text", "") |
| text_lower = text.lower() |
| |
| cls = classifications.get(speaker) |
| if not cls: |
| continue |
| |
| |
| if cls.get("confidence", 1.0) < threshold: |
| stage = classify_flow_stage(text) |
| |
| |
| if stage == "DISCOVERY" and any(q in text_lower for q in ["what", "how", "budget", "need", "preference"]): |
| if "?" in text or any(kw in text_lower for kw in ["what features", "what is your", "brand preference"]): |
| cls["role"] = "Agent" |
| cls["confidence"] = 0.90 |
| cls["method"] = "flow_validator_correction" |
| |
| |
| elif stage == "DISCOVERY" and any(kw in text_lower for kw in ["my budget", "i want", "i need", "looking for"]): |
| cls["role"] = "Customer" |
| cls["confidence"] = 0.90 |
| cls["method"] = "flow_validator_correction" |
| |
| |
| elif stage == "OBJECTION_HANDLING" and any(kw in text_lower for kw in ["too expensive", "discount", "not sure", "get back to you"]): |
| cls["role"] = "Customer" |
| cls["confidence"] = 0.92 |
| cls["method"] = "flow_validator_correction" |
| |
| |
| elif stage == "FOLLOW_UP" and any(kw in text_lower for kw in ["i will share", "i'll share", "follow up", "call you back"]): |
| cls["role"] = "Agent" |
| cls["confidence"] = 0.90 |
| cls["method"] = "flow_validator_correction" |
| |
| |
| elif i < 2 and stage in ["GREETING", "INTRODUCTION"] and any(kw in text_lower for kw in ["this is", "calling from", "how can i"]): |
| cls["role"] = "Agent" |
| cls["confidence"] = 0.95 |
| cls["method"] = "flow_validator_correction" |
| |
| return classifications |
|
|