{"openapi":"3.1.0","info":{"title":"StyleAdvisor API","description":"LLM-powered fashion recommendation service","version":"0.1.0"},"paths":{"/api/v1/auth/signup":{"post":{"tags":["Authentication"],"summary":"Signup","description":"Create a new user account with email and password.\n\nRate limited to 5 attempts per minute per IP.\n\nArgs:\n    request: Email, password, and optional name\n\nReturns:\n    session_id: UUID to be used for saving/retrieving recommendations\n    \nExample Request:\n    POST /api/v1/auth/signup\n    {\n      \"email\": \"user@example.com\",\n      \"password\": \"secure_password123\",\n      \"name\": \"John Doe\"\n    }","operationId":"signup_api_v1_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Authentication"],"summary":"Login","description":"Login with email and password.\n\nRate limited to 5 attempts per minute per IP.\nReturns generic error to prevent account enumeration.\n\nArgs:\n    request: Email and password\n\nReturns:\n    session_id: UUID for authenticated session\n    \nExample Request:\n    POST /api/v1/auth/login\n    {\n      \"email\": \"user@example.com\",\n      \"password\": \"secure_password123\"\n    }","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/google":{"post":{"tags":["Authentication"],"summary":"Google Auth","description":"Authenticate with Google OAuth.\n\nSECURITY: Verifies the Google ID token server-side to prevent spoofing.\n\nThis endpoint is called after user authenticates with Google on frontend.\nFrontend sends the ID token, backend verifies it with Google.\n\nIf user exists, logs them in. If not, creates new account.\n\nArgs:\n    request: Google ID token (and optional user info)\n\nReturns:\n    session_id: UUID for authenticated session\n    \nExample Request:\n    POST /api/v1/auth/google\n    {\n      \"id_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\"\n    }","operationId":"google_auth_api_v1_auth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAuthRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["Authentication"],"summary":"Logout","description":"Revoke a session so it can no longer be used.","operationId":"logout_api_v1_auth_logout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_LogoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}":{"get":{"tags":["Sessions"],"summary":"Get User Session Endpoint","description":"Retrieve user session data.\n\nArgs:\n    session_id: Session identifier\n\nReturns:\n    Session data including metadata and custom data","operationId":"get_user_session_endpoint_api_v1_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Sessions"],"summary":"Update User Session Endpoint","description":"Update user session data.\n\nArgs:\n    session_id: Session identifier\n    data: Data to merge into session (dict)\n\nReturns:\n    Success confirmation","operationId":"update_user_session_endpoint_api_v1_sessions__session_id__put","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/history":{"get":{"tags":["Sessions"],"summary":"Get Session History Endpoint","description":"Get user's recommendation history.\n\nReturns all color palettes and outfit recommendations for this session.\n\nArgs:\n    session_id: Session identifier\n\nReturns:\n    color_palettes: List of past color palette recommendations\n    outfit_recommendations: List of past outfit recommendations","operationId":"get_session_history_endpoint_api_v1_sessions__session_id__history_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sessions/{session_id}/clicks":{"post":{"tags":["Sessions"],"summary":"Save Outbound Click Endpoint","description":"Track outbound click to retailer site.\n\nRecords when user clicks on a shopping link for attribution and history.\n\nArgs:\n    session_id: Session identifier\n    click_data: Click details (item, retailer, URL, etc.)\n\nReturns:\n    click_id: ID of the saved click record","operationId":"save_outbound_click_endpoint_api_v1_sessions__session_id__clicks_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutboundClickRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Sessions"],"summary":"Get Outbound Clicks Endpoint","description":"Get outbound clicks for a session.\n\nReturns all clicks to retailer sites for this session.\n\nArgs:\n    session_id: Session identifier\n\nReturns:\n    clicks: List of outbound click records","operationId":"get_outbound_clicks_endpoint_api_v1_sessions__session_id__clicks_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Root","description":"Root endpoint.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/recommendations":{"post":{"summary":"Create Recommendations","description":"Generate fashion recommendations based on user profile and context.\n\nThis endpoint uses LLM (GPT-4, Claude, etc.) to generate personalized\nfashion recommendations based on user's body type, style preferences,\noccasion, and budget.\n\nArgs:\n    request: User profile, context, and preferences\n\nReturns:\n    RecommendationResponse with personalized fashion items\n\nRaises:\n    HTTPException: If recommendation generation fails","operationId":"create_recommendations_api_v1_recommendations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback":{"post":{"summary":"Submit Feedback","description":"Submit feedback on recommendations.\n\nThis endpoint collects user feedback on generated recommendations\nto improve future suggestions through prompt refinement and eventual\nmodel fine-tuning.\n\nArgs:\n    feedback: User feedback on recommendations\n\nReturns:\n    FeedbackResponse confirming submission","operationId":"submit_feedback_api_v1_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/color-recommendations":{"post":{"summary":"Create Color Recommendations","description":"Generate personalized color palette recommendations based on complexion.\n\nThis endpoint uses LLM to analyze the user's complexion description\nand provide a comprehensive color palette with specific colors,\nstyling tips, and outfit ideas.\n\nBased on professional color theory research covering:\n- Skin tone classification (7 categories)\n- Undertone analysis (warm/cool/neutral)\n- Seasonal color analysis (Spring/Summer/Autumn/Winter)\n- Color harmony principles\n\nArgs:\n    request: Complexion description and optional details\n\nReturns:\n    ColorRecommendationResponse with personalized color palette\n\nRaises:\n    HTTPException: If color recommendation generation fails","operationId":"create_color_recommendations_api_v1_color_recommendations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColorRecommendationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColorRecommendationResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColorErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColorErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analyze-photo":{"post":{"summary":"Analyze Photo Endpoint","description":"Analyze complexion from uploaded photo using AI vision.\n\n**Phase 3 Feature**: Hybrid approach combining:\n1. OpenCV preprocessing (face detection, quality check)\n2. Multimodal LLM analysis (Gemini Vision/GPT-4 Vision)\n\nThe response includes an auto-fill description that can be used\nto populate the complexion description field automatically.\n\nArgs:\n    request: Base64 encoded image\n\nReturns:\n    PhotoAnalysisResponse with detected skin tone and undertone\n\nRaises:\n    HTTPException: If photo analysis fails","operationId":"analyze_photo_endpoint_api_v1_analyze_photo_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoAnalysisResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColorErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColorErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fashion-recommendations":{"post":{"tags":["Fashion Recommendations"],"summary":"Get outfit recommendations based on color palette","description":"Generate personalized outfit recommendations based on user's selected color palette.\n\nThis endpoint takes the user's color profile (from color palette analysis) and\nstyle preferences to create complete outfit recommendations.\n\nArgs:\n    request: Fashion recommendation request with user profile and preferences\n\nReturns:\n    Fashion recommendations with outfit suggestions\n\nRaises:\n    HTTPException: If recommendation generation fails","operationId":"get_outfit_recommendations_api_v1_fashion_recommendations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FashionRecommendationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FashionRecommendationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cache/stats":{"get":{"summary":"Get Cache Stats","description":"Get cache statistics for all caches.\n\nReturns:\n    Cache statistics including hits, misses, and hit rates","operationId":"get_cache_stats_api_v1_cache_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/cache/clear":{"post":{"summary":"Clear Cache","description":"Clear all caches. Requires X-Admin-Token header.\n\nReturns:\n    Confirmation message","operationId":"clear_cache_api_v1_cache_clear_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/category-image":{"get":{"summary":"Category Image","operationId":"category_image_api_v1_category_image_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","default":"default","title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/generate-outfit-image":{"post":{"summary":"Generate Outfit Image","description":"Generate an AI image for an outfit recommendation.\n\nThis endpoint uses DALL-E 3 to generate a custom image that accurately\nrepresents the outfit. Results are cached to minimize costs.\n\nFlow:\n1. Check cache for existing image (returns immediately if found)\n2. Check budget limits (falls back to Pexels if exceeded)\n3. Generate with DALL-E 3 (with timeout)\n4. Cache successful generations\n5. Fall back to Pexels on any error\n\nArgs:\n    request: Outfit and context data\n    \nReturns:\n    Generated image URL and metadata","operationId":"generate_outfit_image_api_v1_generate_outfit_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateImageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateImageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/generate-item-images":{"post":{"summary":"Generate Item Images","description":"Generate AI images for individual outfit items (per-item product shots).\n\nThis endpoint is shared between the React frontend and the expert review tool,\nensuring both use the same cache and don't duplicate image generation work.\n\nUses the same generate_items_parallel() method as the fashion-recommendations\nendpoint, with identical cache keys so images are shared.","operationId":"generate_item_images_api_v1_generate_item_images_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateItemImagesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateItemImagesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-image/status":{"get":{"summary":"Get Ai Image Status","description":"Get AI image generation status and statistics.\n\nReturns:\n    Status including cache stats, cost tracking, and budget alerts","operationId":"get_ai_image_status_api_v1_ai_image_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/ai-image/cache":{"get":{"summary":"Get Ai Image Cache Entries","description":"List cached AI-generated images (admin endpoint).\n\nArgs:\n    limit: Maximum entries to return\n    \nReturns:\n    List of cached image entries","operationId":"get_ai_image_cache_entries_api_v1_ai_image_cache_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-image/cache/clear":{"post":{"summary":"Clear Ai Image Cache","description":"Clear the AI image cache. Requires X-Admin-Token header.\n\nReturns:\n    Number of entries cleared","operationId":"clear_ai_image_cache_api_v1_ai_image_cache_clear_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ai-image/cache/clear-items":{"post":{"summary":"Clear Item Image Cache","description":"Clear per-item image cache entries (prefix 'item_').\n\nOld item entries are keyed by category+color+gender only, ignoring\nthe description. This causes mismatches (e.g., a belt image shown\nfor a messenger bag). Clearing forces regeneration through the\nsemantic cache which matches descriptions properly.\n\nOutfit composite images are NOT affected.\n\nQuery params:\n    category: Optional filter (e.g. \"accessory\", \"top\", \"shoes\").\n              Omit to clear ALL item entries.\n\nRequires X-Admin-Token header.","operationId":"clear_item_image_cache_api_v1_ai_image_cache_clear_items_post","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/outfit-image":{"get":{"summary":"Get Outfit Image Proxy","description":"Search for a real fashion image on Pexels based on a query.\nProxy endpoint to avoid exposing API keys in frontend.\nAllows fetching different images from the search results via index.","operationId":"get_outfit_image_proxy_api_v1_outfit_image_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","title":"Query"}},{"name":"index","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cache/cleanup":{"post":{"summary":"Cleanup Cache","description":"Remove expired entries from all caches.\n\nReturns:\n    Number of entries removed","operationId":"cleanup_cache_api_v1_cache_cleanup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/expert-session/{expert_id}":{"get":{"summary":"Get Expert Session","description":"Get or create an expert session.\n\nIf session doesn't exist, creates a new one.\nDataset is READ-ONLY - experts can only write to their session file.","operationId":"get_expert_session_api_expert_session__expert_id__get","parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"string","title":"Expert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Expert Session","description":"Update expert session with new ratings.\n\nExperts can update their own ratings at any time.\nEach rating update is timestamped.","operationId":"update_expert_session_api_expert_session__expert_id__put","parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"string","title":"Expert Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/expert-sessions":{"get":{"summary":"List Expert Sessions","description":"List all expert sessions (admin endpoint).\n\nReturns summary of all experts' progress.","operationId":"list_expert_sessions_api_expert_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/expert-sessions/export":{"get":{"summary":"Export Expert Ratings","description":"Export all expert ratings for analysis (admin endpoint).\n\nReturns aggregated ratings from all experts.","operationId":"export_expert_ratings_api_expert_sessions_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/static/generated/images/{filename}":{"get":{"summary":"Serve Generated Image","description":"Serve generated images with no-cache headers to prevent browser caching.\nThis ensures that regenerated images are always fresh.","operationId":"serve_generated_image_static_generated_images__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/review_tool":{"get":{"summary":"Redirect Review Tool","operationId":"redirect_review_tool_review_tool_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"BodyType":{"type":"string","enum":["pear","apple","hourglass","rectangle","inverted_triangle","athletic"],"title":"BodyType"},"ColorDetail":{"properties":{"name":{"type":"string","title":"Name","description":"Color name (e.g., 'Rust', 'Sapphire Blue')"},"hex":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","title":"Hex","description":"Hex code (e.g., '#B7410E')"},"category":{"type":"string","enum":["warm","cool","neutral"],"title":"Category","description":"Color temperature category"},"reasoning":{"type":"string","minLength":10,"title":"Reasoning","description":"Why this color works for the user"}},"type":"object","required":["name","hex","category","reasoning"],"title":"ColorDetail","description":"Detailed information about a recommended color."},"ColorErrorResponse":{"properties":{"error":{"type":"string","title":"Error"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["error"],"title":"ColorErrorResponse","description":"Error response for color recommendation failures."},"ColorPalette":{"properties":{"primary_colors":{"items":{"$ref":"#/components/schemas/ColorDetail"},"type":"array","maxItems":6,"minItems":4,"title":"Primary Colors","description":"4-6 primary colors that complement the skin tone"},"accent_colors":{"items":{"$ref":"#/components/schemas/ColorDetail"},"type":"array","maxItems":4,"minItems":2,"title":"Accent Colors","description":"2-4 accent colors for variety"},"neutral_colors":{"items":{"$ref":"#/components/schemas/ColorDetail"},"type":"array","maxItems":4,"minItems":3,"title":"Neutral Colors","description":"3-4 neutral colors as wardrobe staples"},"metals":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Metals","description":"Recommended metals (e.g., 'Gold', 'Silver', 'Rose Gold')"}},"type":"object","required":["primary_colors","accent_colors","neutral_colors","metals"],"title":"ColorPalette","description":"Complete color palette recommendation."},"ColorRecommendationRequest":{"properties":{"complexion_description":{"type":"string","maxLength":500,"minLength":3,"title":"Complexion Description","description":"Natural language description of skin tone (e.g., 'fair skin with warm undertones')","examples":["I have fair skin with warm undertones","Medium brown skin, cool undertones","Indian wheatish complexion","Pale skin that burns easily"]},"skin_tone":{"anyOf":[{"$ref":"#/components/schemas/SkinTone"},{"type":"null"}],"description":"Specific skin tone category if known"},"undertone":{"anyOf":[{"$ref":"#/components/schemas/Undertone"},{"type":"null"}],"description":"Specific undertone if known"},"hair_color":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Hair Color","description":"Hair color (e.g., 'blonde', 'dark brown', 'black')"},"eye_color":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Eye Color","description":"Eye color (e.g., 'blue', 'brown', 'hazel')"},"gender":{"anyOf":[{"type":"string","enum":["male","female","unisex"]},{"type":"null"}],"title":"Gender","description":"Gender/style preference for fashion recommendations (e.g., 'male', 'female', 'unisex')"},"age_range":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Age Range","description":"Age range (e.g., '18-24', '25-34', '35-44', '45-54', '55-64', '65+')"},"color_preferences":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Color Preferences","description":"Colors the user already likes"},"avoid_colors":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Avoid Colors","description":"Colors the user wants to avoid"},"context":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Context","description":"Context for recommendations (e.g., 'professional', 'casual', 'wedding')"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Optional session ID for tracking user history"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["complexion_description"],"title":"ColorRecommendationRequest","description":"Request for color palette recommendations."},"ColorRecommendationResponse":{"properties":{"session_id":{"type":"string","title":"Session Id","description":"Unique session identifier"},"skin_analysis":{"$ref":"#/components/schemas/SkinAnalysis","description":"Analysis of user's complexion"},"color_palette":{"$ref":"#/components/schemas/ColorPalette","description":"Recommended color palette"},"colors_to_avoid":{"items":{"$ref":"#/components/schemas/ColorToAvoid"},"type":"array","maxItems":5,"minItems":2,"title":"Colors To Avoid","description":"Colors that may not be flattering"},"styling_tips":{"items":{"type":"string"},"type":"array","maxItems":5,"minItems":3,"title":"Styling Tips","description":"Practical styling tips based on color analysis"},"outfit_ideas":{"items":{"type":"string"},"type":"array","maxItems":3,"minItems":2,"title":"Outfit Ideas","description":"Specific outfit combinations using recommended colors"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"llm_provider":{"type":"string","title":"Llm Provider","description":"LLM provider used"},"model_used":{"type":"string","title":"Model Used","description":"Specific model version"}},"type":"object","required":["session_id","skin_analysis","color_palette","colors_to_avoid","styling_tips","outfit_ideas","llm_provider","model_used"],"title":"ColorRecommendationResponse","description":"Complete response with color recommendations."},"ColorToAvoid":{"properties":{"name":{"type":"string","title":"Name","description":"Color name"},"hex":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","title":"Hex","description":"Hex code"},"reason":{"type":"string","minLength":10,"title":"Reason","description":"Why this color should be avoided"}},"type":"object","required":["name","hex","reason"],"title":"ColorToAvoid","description":"Color that should be avoided with reasoning."},"ContextData":{"properties":{"gender":{"type":"string","title":"Gender","description":"Gender (male, female, unisex)","default":"unisex"},"style":{"type":"string","title":"Style","description":"Style preference","default":""},"occasion":{"type":"string","title":"Occasion","description":"Occasion","default":""},"body_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Type","description":"Body type for personalized visualization (e.g. hourglass, pear, athletic)"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size","description":"Clothing size (e.g. XS, S, M, L, XL, XXL)"},"age_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Range","description":"Age range (e.g. 18-24, 25-34, 35-44)"},"complexion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Complexion","description":"Complexion/skin tone description"}},"type":"object","title":"ContextData","description":"Context data for image generation."},"ErrorResponse":{"properties":{"error":{"type":"string","title":"Error"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["error"],"title":"ErrorResponse","description":"Standard error response."},"FashionPreferences":{"properties":{"occasion":{"type":"string","title":"Occasion","description":"Event/occasion type"},"style":{"type":"string","title":"Style","description":"Style preference"},"budget":{"type":"string","title":"Budget","description":"Budget range"},"body_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Type","description":"Body type (optional)"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size","description":"Clothing size (e.g., XS, S, M, L, XL, XXL)"},"additional_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Additional Notes","description":"Additional preferences"}},"type":"object","required":["occasion","style","budget"],"title":"FashionPreferences","description":"User's style preferences for outfit recommendations."},"FashionRecommendationRequest":{"properties":{"user_profile":{"$ref":"#/components/schemas/UserColorProfile","description":"User's color profile"},"preferences":{"$ref":"#/components/schemas/FashionPreferences","description":"Style preferences"},"num_outfits":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Num Outfits","description":"Number of outfits to generate (1-5)","default":1},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Optional session ID for tracking user history"},"skip_cache":{"type":"boolean","title":"Skip Cache","description":"Skip L1+L2 cache lookups (used by 'Generate More' to get fresh results)","default":false}},"type":"object","required":["user_profile","preferences"],"title":"FashionRecommendationRequest","description":"Request for fashion/outfit recommendations."},"FashionRecommendationResponse":{"properties":{"outfits":{"items":{"$ref":"#/components/schemas/OutfitRecommendation"},"type":"array","title":"Outfits","description":"List of outfit recommendations"},"general_tips":{"items":{"type":"string"},"type":"array","title":"General Tips","description":"General styling tips"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["outfits"],"title":"FashionRecommendationResponse","description":"Response with outfit recommendations."},"FeedbackRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"},"overall_rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Overall Rating"},"items":{"items":{"$ref":"#/components/schemas/ItemFeedback"},"type":"array","minItems":1,"title":"Items"},"general_feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"General Feedback"},"would_use_again":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Would Use Again"}},"type":"object","required":["session_id","overall_rating","items"],"title":"FeedbackRequest","description":"User feedback on recommendations."},"FeedbackResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["success","message","session_id"],"title":"FeedbackResponse","description":"Response after submitting feedback."},"Gender":{"type":"string","enum":["male","female","non_binary","prefer_not_to_say"],"title":"Gender"},"GenerateImageRequest":{"properties":{"outfit":{"$ref":"#/components/schemas/OutfitData"},"context":{"$ref":"#/components/schemas/ContextData"},"style_preference":{"type":"string","enum":["auto","editorial","lifestyle","studio","catalog"],"title":"Style Preference","description":"Photography style; 'auto' derives from occasion (casual→lifestyle, work→studio, party→editorial)","default":"auto"},"force_regenerate":{"type":"boolean","title":"Force Regenerate","description":"Force regeneration bypassing cache (for regenerate button)","default":false}},"type":"object","required":["outfit"],"title":"GenerateImageRequest","description":"Request model for AI image generation."},"GenerateImageResponse":{"properties":{"image_url":{"type":"string","title":"Image Url"},"source":{"type":"string","enum":["cache","generated","fallback"],"title":"Source"},"cache_key":{"type":"string","title":"Cache Key"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"generation_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generation Time Ms"},"cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["image_url","source","cache_key"],"title":"GenerateImageResponse","description":"Response model for AI image generation."},"GenerateItemImagesRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OutfitItemData"},"type":"array","title":"Items","description":"List of items to generate images for"},"context":{"$ref":"#/components/schemas/ContextData"},"force_regenerate":{"type":"boolean","title":"Force Regenerate","description":"Force regeneration bypassing cache","default":false}},"type":"object","required":["items"],"title":"GenerateItemImagesRequest","description":"Request model for per-item image generation (shared between React app and review tool)."},"GenerateItemImagesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ItemImageResult"},"type":"array","title":"Items"},"total_items":{"type":"integer","title":"Total Items"},"cache_hits":{"type":"integer","title":"Cache Hits"},"generated":{"type":"integer","title":"Generated"}},"type":"object","required":["items","total_items","cache_hits","generated"],"title":"GenerateItemImagesResponse","description":"Response model for per-item image generation."},"GoogleAuthRequest":{"properties":{"id_token":{"type":"string","title":"Id Token","description":"Google ID token from frontend"},"google_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Id","description":"Google user ID (optional, extracted from token)"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"User's email from Google (optional, extracted from token)"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"User's name from Google"},"profile_picture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Picture","description":"Profile picture URL from Google"}},"type":"object","required":["id_token"],"title":"GoogleAuthRequest","description":"Request to authenticate with Google OAuth."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ItemFeedback":{"properties":{"item_index":{"type":"integer","minimum":0.0,"title":"Item Index"},"liked":{"type":"boolean","title":"Liked"},"rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Rating"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"}},"type":"object","required":["item_index","liked"],"title":"ItemFeedback","description":"Feedback for a single recommended item."},"ItemImageResult":{"properties":{"category":{"type":"string","title":"Category"},"color":{"type":"string","title":"Color"},"image_url":{"type":"string","title":"Image Url"},"source":{"type":"string","title":"Source"},"cache_key":{"type":"string","title":"Cache Key"}},"type":"object","required":["category","color","image_url","source","cache_key"],"title":"ItemImageResult","description":"Result for a single item image."},"ItemType":{"type":"string","enum":["top","bottom","dress","outerwear","shoes","accessories"],"title":"ItemType"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"User's email"},"password":{"type":"string","title":"Password","description":"User's password"}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"Request to login with email and password."},"Occasion":{"type":"string","enum":["work","casual_weekend","date_night","party","formal_event","wedding","vacation","gym","interview"],"title":"Occasion"},"OutboundClickRequest":{"properties":{"item_category":{"type":"string","title":"Item Category"},"item_description":{"type":"string","title":"Item Description"},"item_color":{"type":"string","title":"Item Color"},"retailer":{"type":"string","title":"Retailer"},"search_query":{"type":"string","title":"Search Query"},"outbound_url":{"type":"string","title":"Outbound Url"},"click_source":{"type":"string","title":"Click Source"},"outfit_recommendation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outfit Recommendation Id"}},"type":"object","required":["item_category","item_description","item_color","retailer","search_query","outbound_url","click_source"],"title":"OutboundClickRequest","description":"Request model for outbound click tracking."},"OutfitData":{"properties":{"name":{"type":"string","title":"Name","description":"Outfit name"},"description":{"type":"string","title":"Description","description":"Outfit description","default":""},"items":{"items":{"$ref":"#/components/schemas/OutfitItemData"},"type":"array","title":"Items","description":"List of outfit items"}},"type":"object","required":["name","items"],"title":"OutfitData","description":"Outfit data for image generation request."},"OutfitItem":{"properties":{"category":{"type":"string","title":"Category","description":"Clothing category (e.g., 'Top', 'Bottom', 'Shoes')"},"color":{"type":"string","title":"Color","description":"Color name"},"description":{"type":"string","title":"Description","description":"Description of the item"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"AI-generated product image URL"}},"type":"object","required":["category","color","description"],"title":"OutfitItem","description":"A single clothing item in an outfit."},"OutfitItemData":{"properties":{"category":{"type":"string","title":"Category","description":"Item category (e.g., Top, Bottom, Shoes)"},"color":{"type":"string","title":"Color","description":"Item color"},"description":{"type":"string","title":"Description","description":"Item description","default":""}},"type":"object","required":["category","color"],"title":"OutfitItemData","description":"Outfit item for image generation request."},"OutfitRecommendation":{"properties":{"name":{"type":"string","title":"Name","description":"Name/title of the outfit"},"description":{"type":"string","title":"Description","description":"Overall outfit description"},"items":{"items":{"$ref":"#/components/schemas/OutfitItem"},"type":"array","title":"Items","description":"List of clothing items"},"styling_tip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Styling Tip","description":"Styling tip for this outfit"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Representative image URL from Pexels"},"image_thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Thumbnail","description":"Thumbnail image URL"},"image_photographer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Photographer","description":"Photographer attribution"},"image_photographer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Photographer Url","description":"Photographer profile URL"},"image_source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Source Url","description":"Image source URL on Pexels"}},"type":"object","required":["name","description","items"],"title":"OutfitRecommendation","description":"A complete outfit recommendation."},"PhotoAnalysisRequest":{"properties":{"image_base64":{"type":"string","title":"Image Base64","description":"Base64 encoded image (JPEG/PNG)"}},"type":"object","required":["image_base64"],"title":"PhotoAnalysisRequest","description":"Request for photo-based complexion analysis."},"PhotoAnalysisResponse":{"properties":{"skin_tone":{"type":"string","title":"Skin Tone","description":"Detected skin tone category"},"undertone":{"type":"string","enum":["warm","cool","neutral"],"title":"Undertone","description":"Detected undertone"},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Analysis confidence"},"description":{"type":"string","title":"Description","description":"Natural language description"},"auto_fill_description":{"type":"string","title":"Auto Fill Description","description":"Description to auto-fill in form"},"hair_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hair Color","description":"Detected hair color (null if not visible)"},"eye_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eye Color","description":"Detected eye color (null if not visible)"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"Any notes about image quality or analysis"},"face_box":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Face Box","description":"Detected face bounding box coordinates (x, y, width, height)"},"metadata":{"type":"object","title":"Metadata","description":"Image preprocessing metadata"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["skin_tone","undertone","confidence","description","auto_fill_description"],"title":"PhotoAnalysisResponse","description":"Response from photo analysis."},"RecommendationContext":{"properties":{"occasion":{"$ref":"#/components/schemas/Occasion"},"season":{"$ref":"#/components/schemas/Season"},"weather":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weather"},"budget_min":{"type":"integer","minimum":0.0,"title":"Budget Min"},"budget_max":{"type":"integer","minimum":0.0,"title":"Budget Max"}},"type":"object","required":["occasion","season","budget_min","budget_max"],"title":"RecommendationContext","description":"Context for generating recommendations."},"RecommendationItem":{"properties":{"item_type":{"$ref":"#/components/schemas/ItemType"},"category":{"type":"string","title":"Category"},"style_attributes":{"$ref":"#/components/schemas/StyleAttributes"},"reasoning":{"type":"string","title":"Reasoning"},"priority":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Priority"},"alternatives":{"items":{"type":"string"},"type":"array","title":"Alternatives"},"estimated_price_range":{"anyOf":[{"prefixItems":[{"type":"integer"},{"type":"integer"}],"type":"array","maxItems":2,"minItems":2},{"type":"null"}],"title":"Estimated Price Range"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Representative image URL for the item"}},"type":"object","required":["item_type","category","style_attributes","reasoning","priority"],"title":"RecommendationItem","description":"Single fashion item recommendation."},"RecommendationRequest":{"properties":{"profile":{"$ref":"#/components/schemas/UserProfile"},"context":{"$ref":"#/components/schemas/RecommendationContext"},"preferences":{"anyOf":[{"$ref":"#/components/schemas/UserPreferences"},{"type":"null"}]},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["profile","context"],"title":"RecommendationRequest","description":"Complete request for fashion recommendations."},"RecommendationResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"recommendations":{"items":{"$ref":"#/components/schemas/RecommendationItem"},"type":"array","title":"Recommendations"},"outfit_coherence":{"type":"string","title":"Outfit Coherence"},"confidence_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence Score"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"llm_provider":{"type":"string","title":"Llm Provider"},"model_used":{"type":"string","title":"Model Used"}},"type":"object","required":["session_id","recommendations","outfit_coherence","confidence_score","timestamp","llm_provider","model_used"],"title":"RecommendationResponse","description":"Response containing fashion recommendations."},"Season":{"type":"string","enum":["spring","summer","fall","winter"],"title":"Season"},"SeasonalCategory":{"type":"string","enum":["spring","summer","autumn","winter"],"title":"SeasonalCategory","description":"Seasonal color analysis categories."},"SelectedColor":{"properties":{"hex":{"type":"string","title":"Hex","description":"Hex color code"},"name":{"type":"string","title":"Name","description":"Color name"}},"type":"object","required":["hex","name"],"title":"SelectedColor","description":"A color selected from the user's palette."},"SignupRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"User's email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password","description":"User's password (8-128 characters)"},"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name","description":"User's name (optional)"}},"type":"object","required":["email","password"],"title":"SignupRequest","description":"Request to create a new user account."},"SkinAnalysis":{"properties":{"tone":{"type":"string","title":"Tone","description":"Identified skin tone (e.g., 'Medium', 'Fair')"},"undertone":{"type":"string","enum":["warm","cool","neutral"],"title":"Undertone","description":"Identified undertone"},"seasonal_category":{"anyOf":[{"$ref":"#/components/schemas/SeasonalCategory"},{"type":"null"}],"description":"Seasonal color category if applicable"},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence level in the analysis"}},"type":"object","required":["tone","undertone","confidence"],"title":"SkinAnalysis","description":"Analysis of user's skin tone and undertone."},"SkinTone":{"type":"string","enum":["very_fair","fair","light_medium","medium","olive","tan_brown","deep_dark"],"title":"SkinTone","description":"Skin tone categories."},"StyleAttributes":{"properties":{"fit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fit"},"neckline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neckline"},"sleeve":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sleeve"},"pattern":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pattern"},"colors":{"items":{"type":"string"},"type":"array","title":"Colors"},"material":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Material"},"style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style"},"rise":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rise"},"wash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wash"}},"type":"object","title":"StyleAttributes","description":"Style attributes for a fashion item."},"StylePreference":{"type":"string","enum":["casual","formal","business","sporty","bohemian","minimalist","trendy","classic","edgy","romantic"],"title":"StylePreference"},"Undertone":{"type":"string","enum":["warm","cool","neutral"],"title":"Undertone","description":"Skin undertone categories."},"UserColorProfile":{"properties":{"complexion":{"type":"string","title":"Complexion","description":"User's complexion description"},"hair_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hair Color","description":"User's hair color"},"eye_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eye Color","description":"User's eye color"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender","description":"Gender/style preference (male, female, unisex)"},"age_range":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Range","description":"Age range (e.g., '18-24', '25-34', etc.)"},"selected_colors":{"items":{"$ref":"#/components/schemas/SelectedColor"},"type":"array","title":"Selected Colors","description":"Colors selected by user"}},"type":"object","required":["complexion","selected_colors"],"title":"UserColorProfile","description":"User's color profile from color palette analysis."},"UserPreferences":{"properties":{"preferred_brands":{"items":{"type":"string"},"type":"array","title":"Preferred Brands"},"avoid_patterns":{"items":{"type":"string"},"type":"array","title":"Avoid Patterns"},"comfort_priority":{"type":"string","enum":["low","medium","high"],"title":"Comfort Priority","default":"medium"},"fit_preference":{"type":"string","enum":["tight","fitted","regular","relaxed","oversized"],"title":"Fit Preference","default":"regular"}},"type":"object","title":"UserPreferences","description":"Additional user preferences."},"UserProfile":{"properties":{"age":{"type":"integer","maximum":120.0,"minimum":13.0,"title":"Age"},"gender":{"$ref":"#/components/schemas/Gender"},"body_type":{"$ref":"#/components/schemas/BodyType"},"height_cm":{"anyOf":[{"type":"integer","maximum":250.0,"minimum":100.0},{"type":"null"}],"title":"Height Cm"},"weight_kg":{"anyOf":[{"type":"number","maximum":300.0,"minimum":30.0},{"type":"null"}],"title":"Weight Kg"},"style_preferences":{"items":{"$ref":"#/components/schemas/StylePreference"},"type":"array","maxItems":5,"minItems":1,"title":"Style Preferences"},"color_preferences":{"items":{"type":"string"},"type":"array","title":"Color Preferences"},"avoid_colors":{"items":{"type":"string"},"type":"array","title":"Avoid Colors"},"additional_requirements":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Additional Requirements","description":"Additional preferences or requirements"}},"type":"object","required":["age","gender","body_type","style_preferences"],"title":"UserProfile","description":"User's personal profile for recommendations."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"_LogoutRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["session_id"],"title":"_LogoutRequest"}}}}