Spaces:
Sleeping
Sleeping
| """ | |
| Intelligent Prompt Optimization System | |
| Enhances user prompts for better image generation accuracy | |
| """ | |
| import re | |
| from typing import Dict, Tuple | |
| from config import STYLE_PRESETS, BASE_NEGATIVE_PROMPT | |
| class PromptOptimizer: | |
| """ | |
| Analyzes and enhances user prompts to improve generation quality | |
| """ | |
| def __init__(self): | |
| self.quality_tokens = [ | |
| "highly detailed", | |
| "sharp focus", | |
| "professional", | |
| "4k" | |
| ] | |
| self.lighting_terms = { | |
| 'photo': "soft cinematic lighting", | |
| 'art': "dramatic lighting", | |
| 'anime': "vibrant lighting", | |
| 'default': "good lighting" | |
| } | |
| def detect_intent(self, prompt: str) -> str: | |
| """ | |
| Detect the user's intended style from their prompt | |
| Args: | |
| prompt: User's input prompt | |
| Returns: | |
| Detected style category ('photo', 'art', 'anime', etc.) | |
| """ | |
| prompt_lower = prompt.lower() | |
| # Check for explicit style keywords | |
| if any(word in prompt_lower for word in ['photograph', 'photo', 'camera', 'lens', 'dslr']): | |
| return 'photo' | |
| elif any(word in prompt_lower for word in ['anime', 'manga', 'kawaii']): | |
| return 'anime' | |
| elif any(word in prompt_lower for word in ['painting', 'art', 'illustration', 'drawing']): | |
| return 'art' | |
| elif any(word in prompt_lower for word in ['3d', 'render', 'cgi']): | |
| return '3d' | |
| return 'default' | |
| def clean_prompt(self, prompt: str) -> str: | |
| """ | |
| Clean and normalize the user's prompt | |
| Args: | |
| prompt: Raw user input | |
| Returns: | |
| Cleaned prompt | |
| """ | |
| # Remove excessive whitespace | |
| prompt = re.sub(r'\s+', ' ', prompt) | |
| # Remove special characters that might confuse the model | |
| prompt = re.sub(r'[^\w\s,.-]', '', prompt) | |
| # Capitalize first letter | |
| prompt = prompt.strip() | |
| if prompt: | |
| prompt = prompt[0].upper() + prompt[1:] | |
| return prompt | |
| def enhance_prompt( | |
| self, | |
| prompt: str, | |
| style: str = "None", | |
| add_quality_tokens: bool = True | |
| ) -> Tuple[str, str]: | |
| """ | |
| Enhance user prompt with style-specific improvements | |
| Args: | |
| prompt: User's input prompt | |
| style: Selected style preset | |
| add_quality_tokens: Whether to add quality enhancement tokens | |
| Returns: | |
| Tuple of (enhanced_prompt, negative_prompt) | |
| """ | |
| # Clean the input | |
| prompt = self.clean_prompt(prompt) | |
| if not prompt: | |
| prompt = "a beautiful scene" | |
| # Get style configuration | |
| style_config = STYLE_PRESETS.get(style, STYLE_PRESETS["None"]) | |
| # Build enhanced prompt | |
| enhanced_parts = [prompt] | |
| # Add style-specific suffix | |
| if style_config["prompt_suffix"]: | |
| enhanced_parts.append(style_config["prompt_suffix"]) | |
| # Add quality tokens if enabled and not already present | |
| if add_quality_tokens and style == "None": | |
| # Only add generic quality tokens if no specific style is selected | |
| quality_str = ", ".join(self.quality_tokens) | |
| enhanced_parts.append(quality_str) | |
| enhanced_prompt = ", ".join(enhanced_parts) | |
| # Build negative prompt | |
| negative_prompt = style_config.get("negative_prompt", BASE_NEGATIVE_PROMPT) | |
| return enhanced_prompt, negative_prompt | |
| def structure_prompt(self, prompt: str) -> str: | |
| """ | |
| Convert free-form prompt into structured format | |
| [Subject] [Action] [Environment] [Style] [Lighting] [Quality] | |
| Args: | |
| prompt: User's input prompt | |
| Returns: | |
| Structured prompt | |
| """ | |
| # This is a simple implementation | |
| # For production, you might use NLP to extract components | |
| parts = prompt.split(',') | |
| if len(parts) == 1: | |
| # Single phrase - assume it's the subject | |
| return prompt | |
| # Already somewhat structured, return as-is | |
| return prompt | |
| def get_prompt_info(self, prompt: str, style: str) -> Dict[str, str]: | |
| """ | |
| Get detailed information about how the prompt will be processed | |
| Args: | |
| prompt: User's input prompt | |
| style: Selected style preset | |
| Returns: | |
| Dictionary with prompt processing details | |
| """ | |
| enhanced, negative = self.enhance_prompt(prompt, style) | |
| intent = self.detect_intent(prompt) | |
| return { | |
| "original": prompt, | |
| "enhanced": enhanced, | |
| "negative": negative, | |
| "detected_intent": intent, | |
| "style": style | |
| } | |
| # Test function | |
| if __name__ == "__main__": | |
| optimizer = PromptOptimizer() | |
| # Test prompts | |
| test_prompts = [ | |
| "a cat sitting on a windowsill", | |
| "photorealistic portrait of a warrior", | |
| "anime girl with blue hair", | |
| "3d render of a futuristic city" | |
| ] | |
| print("=== Prompt Optimizer Test ===\n") | |
| for prompt in test_prompts: | |
| print(f"Original: {prompt}") | |
| enhanced, negative = optimizer.enhance_prompt(prompt, "Photorealistic") | |
| print(f"Enhanced: {enhanced}") | |
| print(f"Negative: {negative}") | |
| print(f"Detected Intent: {optimizer.detect_intent(prompt)}") | |
| print("-" * 80) | |
| print() | |