| 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) |
|
|
|
|