Update app.py
Browse files
app.py
CHANGED
|
@@ -62,7 +62,7 @@ except ImportError:
|
|
| 62 |
logging.basicConfig(level=logging.INFO)
|
| 63 |
logger = logging.getLogger(__name__)
|
| 64 |
|
| 65 |
-
# Get API keys -
|
| 66 |
GCP_KEYS = [
|
| 67 |
# Hugging Face Secrets (these are the primary ones for HF deployment)
|
| 68 |
os.getenv("GOOGLE_API_KEY"),
|
|
@@ -96,14 +96,14 @@ def enhance_prompt_with_gemini(prompt: str, style: str) -> str:
|
|
| 96 |
style (str): The desired image style
|
| 97 |
|
| 98 |
Returns:
|
| 99 |
-
str: Enhanced prompt
|
| 100 |
"""
|
| 101 |
if not GEMINI_AVAILABLE or not GOOGLE_API_KEY:
|
| 102 |
# Basic enhancement without Gemini
|
| 103 |
style_enhancers = {
|
| 104 |
"realistic": "photorealistic, high detail, professional photography, sharp focus",
|
| 105 |
"artistic": "artistic masterpiece, creative composition, painterly style",
|
| 106 |
-
"cartoon": "cartoon style, vibrant
|
| 107 |
"photographic": "professional photograph, high quality, detailed, commercial photography",
|
| 108 |
"illustration": "digital illustration, clean vector art, modern design"
|
| 109 |
}
|
|
@@ -139,7 +139,7 @@ def enhance_prompt_with_gemini(prompt: str, style: str) -> str:
|
|
| 139 |
style_enhancers = {
|
| 140 |
"realistic": "photorealistic, high detail, professional photography",
|
| 141 |
"artistic": "artistic masterpiece, creative composition",
|
| 142 |
-
"cartoon": "cartoon style, vibrant
|
| 143 |
"photographic": "professional photograph, high quality, detailed",
|
| 144 |
"illustration": "digital illustration, clean design"
|
| 145 |
}
|
|
@@ -169,18 +169,22 @@ def generate_marketing_image(prompt: str, style: str = "realistic") -> str:
|
|
| 169 |
logger.info("π¨ Using Google Genai SDK for image generation")
|
| 170 |
logger.info(f"API Key available: {GOOGLE_API_KEY[:10]}...")
|
| 171 |
|
| 172 |
-
#
|
| 173 |
client = genai_sdk.Client(api_key=GOOGLE_API_KEY)
|
| 174 |
|
| 175 |
-
# Generate image using Imagen 4.0 with
|
|
|
|
|
|
|
|
|
|
|
|
|
| 176 |
result = client.models.generate_images(
|
| 177 |
model="imagen-4.0-generate-preview-06-06",
|
| 178 |
prompt=enhanced_prompt,
|
| 179 |
config={
|
| 180 |
"number_of_images": 1,
|
| 181 |
"output_mime_type": "image/png",
|
| 182 |
-
"safety_filter_level": "block_low_and_above",
|
| 183 |
-
"include_safety_attributes": False
|
| 184 |
}
|
| 185 |
)
|
| 186 |
|
|
@@ -244,9 +248,9 @@ def generate_marketing_image(prompt: str, style: str = "realistic") -> str:
|
|
| 244 |
"style": style
|
| 245 |
})
|
| 246 |
|
| 247 |
-
def
|
| 248 |
"""
|
| 249 |
-
|
| 250 |
|
| 251 |
Args:
|
| 252 |
image_url (str): URL or base64 data of the generated image
|
|
@@ -272,7 +276,7 @@ def analyze_marketing_image_with_gemini(image_url: str, prompt: str, review_guid
|
|
| 272 |
|
| 273 |
CRITICAL MARKETING CHECKS:
|
| 274 |
1. **Language/Text Requirements**: If guidelines mention "English" or specific language requirements, verify ALL visible text matches
|
| 275 |
-
2. **Brand Compliance**: Check professional appearance,
|
| 276 |
3. **Marketing Effectiveness**: Assess visual appeal and message clarity
|
| 277 |
4. **Target Audience**: Evaluate cultural appropriateness and accessibility
|
| 278 |
|
|
@@ -502,9 +506,9 @@ def generate_and_review_marketing_image(prompt: str, style: str = "realistic", r
|
|
| 502 |
})
|
| 503 |
continue
|
| 504 |
|
| 505 |
-
# Step 2:
|
| 506 |
image_url = generation_data.get("image_url", "")
|
| 507 |
-
analysis_response =
|
| 508 |
analysis_data = json.loads(analysis_response)
|
| 509 |
|
| 510 |
current_score = analysis_data.get("overall_score", 0.0)
|
|
@@ -612,8 +616,10 @@ def process_generated_image_and_results(api_response_str: str) -> Tuple[Image.Im
|
|
| 612 |
|
| 613 |
# Add specific documentation links for common errors
|
| 614 |
doc_link = ""
|
| 615 |
-
if any(
|
| 616 |
-
doc_link = "\n\nπ See
|
|
|
|
|
|
|
| 617 |
elif 'api' in error_msg.lower() or 'key' in error_msg.lower():
|
| 618 |
doc_link = "\n\nπ See API troubleshooting: https://huggingface.co/spaces/CognizantAI/marketing-image-generator/blob/main/README.md#common-issues"
|
| 619 |
|
|
@@ -731,7 +737,7 @@ def gradio_generate_marketing_image(prompt: str, style: str, max_retries: int, r
|
|
| 731 |
)
|
| 732 |
return process_generated_image_and_results(result_json)
|
| 733 |
except Exception as e:
|
| 734 |
-
error_message = f"β Error: {str(e)}\n\nπ For troubleshooting help, see: https://huggingface.co/spaces/CognizantAI/marketing-image-generator/blob/main/README.md#content-policy--
|
| 735 |
logger.error(error_message)
|
| 736 |
return None, error_message
|
| 737 |
|
|
@@ -739,10 +745,10 @@ def gradio_generate_marketing_image(prompt: str, style: str, max_retries: int, r
|
|
| 739 |
SUGGESTED_PROMPTS = {
|
| 740 |
"Modern office team collaboration": ("A modern office space with diverse professionals collaborating around a sleek conference table, natural lighting, professional attire, English signage visible", "realistic"),
|
| 741 |
"Executive boardroom meeting": ("Professional executive boardroom with polished conference table, city skyline view, business documents, English presentations on screens", "realistic"),
|
| 742 |
-
"Customer service excellence": ("Professional customer service representative with headset in modern call
|
| 743 |
"Product showcase display": ("Clean product showcase on white background with professional lighting, English product labels, minimalist marketing aesthetic", "realistic"),
|
| 744 |
-
"Creative workspace design": ("Creative workspace with
|
| 745 |
-
"Brand presentation setup": ("Professional brand presentation setup with English branded materials, corporate
|
| 746 |
}
|
| 747 |
|
| 748 |
# Create Gradio interface
|
|
|
|
| 62 |
logging.basicConfig(level=logging.INFO)
|
| 63 |
logger = logging.getLogger(__name__)
|
| 64 |
|
| 65 |
+
# Get API keys - prioritise HuggingFace Secrets
|
| 66 |
GCP_KEYS = [
|
| 67 |
# Hugging Face Secrets (these are the primary ones for HF deployment)
|
| 68 |
os.getenv("GOOGLE_API_KEY"),
|
|
|
|
| 96 |
style (str): The desired image style
|
| 97 |
|
| 98 |
Returns:
|
| 99 |
+
str: Enhanced prompt optimised for image generation
|
| 100 |
"""
|
| 101 |
if not GEMINI_AVAILABLE or not GOOGLE_API_KEY:
|
| 102 |
# Basic enhancement without Gemini
|
| 103 |
style_enhancers = {
|
| 104 |
"realistic": "photorealistic, high detail, professional photography, sharp focus",
|
| 105 |
"artistic": "artistic masterpiece, creative composition, painterly style",
|
| 106 |
+
"cartoon": "cartoon style, vibrant colours, playful, animated character design",
|
| 107 |
"photographic": "professional photograph, high quality, detailed, commercial photography",
|
| 108 |
"illustration": "digital illustration, clean vector art, modern design"
|
| 109 |
}
|
|
|
|
| 139 |
style_enhancers = {
|
| 140 |
"realistic": "photorealistic, high detail, professional photography",
|
| 141 |
"artistic": "artistic masterpiece, creative composition",
|
| 142 |
+
"cartoon": "cartoon style, vibrant colours, playful",
|
| 143 |
"photographic": "professional photograph, high quality, detailed",
|
| 144 |
"illustration": "digital illustration, clean design"
|
| 145 |
}
|
|
|
|
| 169 |
logger.info("π¨ Using Google Genai SDK for image generation")
|
| 170 |
logger.info(f"API Key available: {GOOGLE_API_KEY[:10]}...")
|
| 171 |
|
| 172 |
+
# Initialise the genai SDK client
|
| 173 |
client = genai_sdk.Client(api_key=GOOGLE_API_KEY)
|
| 174 |
|
| 175 |
+
# Generate image using Imagen 4.0 with optimised safety filtering
|
| 176 |
+
# Safety configuration: "block_low_and_above" - allows corporate/business content
|
| 177 |
+
# while maintaining essential safety guardrails. This setting significantly
|
| 178 |
+
# improves generation success for financial institutions, corporate brands,
|
| 179 |
+
# and marketing content while blocking genuinely harmful content.
|
| 180 |
result = client.models.generate_images(
|
| 181 |
model="imagen-4.0-generate-preview-06-06",
|
| 182 |
prompt=enhanced_prompt,
|
| 183 |
config={
|
| 184 |
"number_of_images": 1,
|
| 185 |
"output_mime_type": "image/png",
|
| 186 |
+
"safety_filter_level": "block_low_and_above", # Reduced from default strict filtering
|
| 187 |
+
"include_safety_attributes": False # Cleaner response without safety metadata
|
| 188 |
}
|
| 189 |
)
|
| 190 |
|
|
|
|
| 248 |
"style": style
|
| 249 |
})
|
| 250 |
|
| 251 |
+
def analyse_marketing_image_with_gemini(image_url: str, prompt: str, review_guidelines: str = "") -> str:
|
| 252 |
"""
|
| 253 |
+
Analyse a generated marketing image using Gemini Vision for quality, relevance, and compliance.
|
| 254 |
|
| 255 |
Args:
|
| 256 |
image_url (str): URL or base64 data of the generated image
|
|
|
|
| 276 |
|
| 277 |
CRITICAL MARKETING CHECKS:
|
| 278 |
1. **Language/Text Requirements**: If guidelines mention "English" or specific language requirements, verify ALL visible text matches
|
| 279 |
+
2. **Brand Compliance**: Check professional appearance, colour consistency, readability
|
| 280 |
3. **Marketing Effectiveness**: Assess visual appeal and message clarity
|
| 281 |
4. **Target Audience**: Evaluate cultural appropriateness and accessibility
|
| 282 |
|
|
|
|
| 506 |
})
|
| 507 |
continue
|
| 508 |
|
| 509 |
+
# Step 2: Analyse the generated image with Gemini Vision
|
| 510 |
image_url = generation_data.get("image_url", "")
|
| 511 |
+
analysis_response = analyse_marketing_image_with_gemini(image_url, prompt, review_guidelines)
|
| 512 |
analysis_data = json.loads(analysis_response)
|
| 513 |
|
| 514 |
current_score = analysis_data.get("overall_score", 0.0)
|
|
|
|
| 616 |
|
| 617 |
# Add specific documentation links for common errors
|
| 618 |
doc_link = ""
|
| 619 |
+
if any(keyword in error_msg.lower() for keyword in ['political', 'timeout', 'stall']):
|
| 620 |
+
doc_link = "\n\nπ See updated safety configuration: https://huggingface.co/spaces/CognizantAI/marketing-image-generator/blob/main/README.md#content-policy--safety-configuration"
|
| 621 |
+
elif any(keyword in error_msg.lower() for keyword in ['hsbc', 'bank', 'corporate']):
|
| 622 |
+
doc_link = "\n\nπ‘ Note: Financial brands now work better with reduced safety filtering. See: https://huggingface.co/spaces/CognizantAI/marketing-image-generator/blob/main/README.md#improved-content-support"
|
| 623 |
elif 'api' in error_msg.lower() or 'key' in error_msg.lower():
|
| 624 |
doc_link = "\n\nπ See API troubleshooting: https://huggingface.co/spaces/CognizantAI/marketing-image-generator/blob/main/README.md#common-issues"
|
| 625 |
|
|
|
|
| 737 |
)
|
| 738 |
return process_generated_image_and_results(result_json)
|
| 739 |
except Exception as e:
|
| 740 |
+
error_message = f"β Error: {str(e)}\n\nπ For troubleshooting help, see: https://huggingface.co/spaces/CognizantAI/marketing-image-generator/blob/main/README.md#content-policy--safety-configuration"
|
| 741 |
logger.error(error_message)
|
| 742 |
return None, error_message
|
| 743 |
|
|
|
|
| 745 |
SUGGESTED_PROMPTS = {
|
| 746 |
"Modern office team collaboration": ("A modern office space with diverse professionals collaborating around a sleek conference table, natural lighting, professional attire, English signage visible", "realistic"),
|
| 747 |
"Executive boardroom meeting": ("Professional executive boardroom with polished conference table, city skyline view, business documents, English presentations on screens", "realistic"),
|
| 748 |
+
"Customer service excellence": ("Professional customer service representative with headset in modern call centre, English signage, clean corporate environment", "realistic"),
|
| 749 |
"Product showcase display": ("Clean product showcase on white background with professional lighting, English product labels, minimalist marketing aesthetic", "realistic"),
|
| 750 |
+
"Creative workspace design": ("Creative workspace with colourful design elements, inspirational English quotes on walls, modern furniture, artistic marketing materials", "artistic"),
|
| 751 |
+
"Brand presentation setup": ("Professional brand presentation setup with English branded materials, corporate colours, marketing displays, conference room setting", "realistic")
|
| 752 |
}
|
| 753 |
|
| 754 |
# Create Gradio interface
|