| import re | |
| from typing import List | |
| from config import COLOR_HARMONY, CLOTHING_TYPES | |
| def extract_clothing_info(text: str) -> dict: | |
| text_lower = text.lower() | |
| colors = list(COLOR_HARMONY.keys()) | |
| found_color = None | |
| for color in colors: | |
| if color in text_lower: | |
| found_color = color | |
| break | |
| found_types = [] | |
| for clothing_type in CLOTHING_TYPES: | |
| if clothing_type in text_lower: | |
| found_types.append(clothing_type) | |
| existing_item = None | |
| requested_item = None | |
| question_patterns = ["what kind of", "what", "which", "suggest", "recommend"] | |
| is_question = any(pattern in text_lower for pattern in question_patterns) | |
| if is_question and len(found_types) > 0: | |
| if "my" in text_lower or "i have" in text_lower or "i'm wearing" in text_lower: | |
| for i, word in enumerate(text_lower.split()): | |
| if word == "my" and i + 1 < len(text_lower.split()): | |
| next_words = " ".join(text_lower.split()[i+1:i+4]) | |
| for ct in found_types: | |
| if ct in next_words: | |
| existing_item = ct | |
| break | |
| if existing_item: | |
| break | |
| for ct in found_types: | |
| if "match" in text_lower or "go with" in text_lower or "pair" in text_lower: | |
| ct_pos = text_lower.find(ct) | |
| match_pos = text_lower.find("match") | |
| if ct_pos > match_pos or "what kind of" in text_lower[:ct_pos]: | |
| requested_item = ct | |
| break | |
| if not existing_item and not requested_item and found_types: | |
| if is_question: | |
| requested_item = found_types[0] | |
| else: | |
| existing_item = found_types[0] | |
| return { | |
| "color": found_color, | |
| "type": existing_item or requested_item, | |
| "existing_item": existing_item, | |
| "requested_item": requested_item, | |
| "is_question": is_question, | |
| "raw_text": text | |
| } | |
| def get_color_matches(color: str) -> List[str]: | |
| color_lower = color.lower() | |
| return COLOR_HARMONY.get(color_lower, ["white", "black", "grey", "beige"]) | |
| def extract_colors_from_query(query: str) -> tuple: | |
| query_lower = query.lower() | |
| colors = list(COLOR_HARMONY.keys()) | |
| extended_colors = ["navy blue", "wine", "burgundy", "maroon", "crimson", "scarlet", "mauve", "taupe", "olive", "teal", "turquoise", "indigo", "cobalt"] | |
| all_colors = extended_colors + colors | |
| color_mapping = { | |
| "wine": "red", "burgundy": "red", "maroon": "red", | |
| "mauve": "purple", "taupe": "beige", "olive": "green", | |
| "teal": "blue", "turquoise": "blue", "indigo": "navy", "cobalt": "blue", | |
| "navy blue": "navy" | |
| } | |
| found_colors = [] | |
| seen_mapped = set() | |
| for color in all_colors: | |
| if color in query_lower: | |
| mapped = color_mapping.get(color, color) | |
| if mapped not in seen_mapped: | |
| found_colors.append((color, mapped)) | |
| seen_mapped.add(mapped) | |
| return found_colors | |
| def detect_query_type(message: str) -> str: | |
| message_lower = message.lower() | |
| color_comparison_patterns = ["does", "do", "will", "can"] | |
| comparison_keywords = ["go with", "match", "work with", "pair with", "combine with"] | |
| color_suggestion_patterns = ["what color", "which color", "colors go with", "colors match", "better color", "color to match"] | |
| has_two_colors = len(extract_colors_from_query(message)) >= 2 | |
| if any(pattern in message_lower for pattern in color_comparison_patterns) and any(kw in message_lower for kw in comparison_keywords) and has_two_colors: | |
| return "color_compatibility" | |
| outfit_request_patterns = ["suggest", "recommend", "outfit", "wear", "dress", "thinking of", "what should i wear", "what can i wear", "what to wear"] | |
| what_matches_patterns = ["what will go", "what goes with", "what matches", "what will match", "what can go"] | |
| if any(pattern in message_lower for pattern in what_matches_patterns) and any(item in message_lower for item in CLOTHING_TYPES): | |
| return "outfit_suggestion" | |
| if any(pattern in message_lower for pattern in outfit_request_patterns): | |
| return "outfit_suggestion" | |
| if any(pattern in message_lower for pattern in color_suggestion_patterns): | |
| return "color_suggestion" | |
| if any(ct in message_lower for ct in CLOTHING_TYPES) and any(c in message_lower for c in ["with", "match", "go", "pair", "style", "stylish", "look"]): | |
| return "outfit_suggestion" | |
| if len(extract_colors_from_query(message)) > 0 and any(word in message_lower for word in ["match", "with", "go", "pair"]): | |
| return "color_suggestion" | |
| if any(ct in message_lower for ct in CLOTHING_TYPES): | |
| return "outfit_suggestion" | |
| return "outfit_suggestion" | |
| def is_greeting(message: str) -> bool: | |
| message_lower = message.lower().strip() | |
| greetings = [ | |
| "hello", "hi", "hey", "good morning", "good afternoon", "good evening", | |
| "greetings", "howdy", "what's up", "whats up", "sup", "yo" | |
| ] | |
| return any(message_lower.startswith(g) or message_lower == g for g in greetings) | |
| def is_name_question(message: str) -> bool: | |
| message_lower = message.lower().strip() | |
| name_patterns = [ | |
| "what is your name", "what's your name", "whats your name", | |
| "who are you", "what are you", "tell me your name", "your name" | |
| ] | |
| return any(pattern in message_lower for pattern in name_patterns) | |