|
|
|
|
|
|
|
import gradio as gr |
|
import logging |
|
import sys |
|
import random |
|
import time |
|
from huggingface_hub import InferenceClient |
|
from PIL import Image |
|
import io |
|
import base64 |
|
|
|
os.getenv("HF_API_KEY") |
|
|
|
|
|
logging.basicConfig( |
|
level=logging.INFO, |
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', |
|
handlers=[logging.StreamHandler(sys.stdout)] |
|
) |
|
logger = logging.getLogger("ai_image_creator") |
|
|
|
|
|
def setup_client(api_key, provider=None): |
|
"""Initialize and return API client""" |
|
try: |
|
if provider: |
|
client = InferenceClient(provider=provider, api_key=api_key) |
|
logger.info(f"{provider} client initialized successfully") |
|
else: |
|
client = InferenceClient(api_key=api_key) |
|
logger.info("Hugging Face client initialized successfully") |
|
return client |
|
except Exception as e: |
|
logger.error(f"Error initializing client: {str(e)}") |
|
return None |
|
|
|
|
|
try: |
|
|
|
hf_api_key = os.getenv("HF_API_KEY") |
|
hf_client = setup_client(hf_api_key) |
|
logger.info("Hugging Face client created successfully") |
|
|
|
|
|
llama_api_key = os.getenv("HF_API_KEY") |
|
try: |
|
llama_client = setup_client(llama_api_key, "sambanova") |
|
use_llama = True |
|
logger.info("Llama client created successfully") |
|
except Exception as e: |
|
logger.warning(f"Llama client not available: {str(e)}. Will use fallback enhancement.") |
|
llama_client = None |
|
use_llama = False |
|
except Exception as e: |
|
logger.error(f"Failed to create Hugging Face client: {str(e)}") |
|
hf_client = None |
|
llama_client = None |
|
use_llama = False |
|
|
|
|
|
|
|
|
|
IMAGE_MODELS = { |
|
"stabilityai/stable-diffusion-xl-base-1.0": { |
|
"display_name": "SDXL 1.0", |
|
"description": "Best overall quality, slower generation", |
|
"icon": "⭐", |
|
"speed": "slow", |
|
"quality": "excellent" |
|
}, |
|
"runwayml/stable-diffusion-v1-5": { |
|
"display_name": "SD 1.5", |
|
"description": "Good for general purpose, faster generation", |
|
"icon": "🚀", |
|
"speed": "fast", |
|
"quality": "good" |
|
}, |
|
"stabilityai/stable-diffusion-2-1": { |
|
"display_name": "SD 2.1", |
|
"description": "Improved details, balanced speed and quality", |
|
"icon": "✨", |
|
"speed": "medium", |
|
"quality": "very good" |
|
}, |
|
"prompthero/openjourney": { |
|
"display_name": "OpenJourney", |
|
"description": "Midjourney-like stylized results", |
|
"icon": "🎨", |
|
"speed": "medium", |
|
"quality": "stylized" |
|
}, |
|
"dreamlike-art/dreamlike-diffusion-1.0": { |
|
"display_name": "Dreamlike", |
|
"description": "Artistic style with dreamy aesthetics", |
|
"icon": "💫", |
|
"speed": "medium", |
|
"quality": "artistic" |
|
} |
|
} |
|
|
|
|
|
CREATION_TYPES = { |
|
"Realistic Photo": { |
|
"description": "Create a photorealistic image with natural details and lighting", |
|
"icon": "📷", |
|
"prompt_hint": "Try to include details about lighting, time of day, and environment" |
|
}, |
|
"Digital Art": { |
|
"description": "Create colorful digital artwork with clean lines and vibrant colors", |
|
"icon": "🖌️", |
|
"prompt_hint": "Consider specifying color palette and mood for better results" |
|
}, |
|
"Fantasy Illustration": { |
|
"description": "Create magical and fantastical scenes with otherworldly elements", |
|
"icon": "🧙", |
|
"prompt_hint": "Describe magical elements, creatures, and environments in detail" |
|
}, |
|
"Concept Art": { |
|
"description": "Create professional concept art for characters, environments or objects", |
|
"icon": "🎮", |
|
"prompt_hint": "Include details about perspective, purpose, and design influences" |
|
}, |
|
"Anime/Manga": { |
|
"description": "Create Japanese anime or manga style illustration", |
|
"icon": "🍙", |
|
"prompt_hint": "Specify anime aesthetics like shading style and character features" |
|
}, |
|
"Oil Painting": { |
|
"description": "Create an image with oil painting textures and artistic brushstrokes", |
|
"icon": "🖼️", |
|
"prompt_hint": "Consider describing texture, brushwork style, and canvas feel" |
|
}, |
|
"Watercolor": { |
|
"description": "Create a soft watercolor illustration with subtle color blending", |
|
"icon": "💧", |
|
"prompt_hint": "Mention color blending, paper texture, and watercolor-specific effects" |
|
}, |
|
"Sketch": { |
|
"description": "Create a detailed sketch or drawing with line art focus", |
|
"icon": "✏️", |
|
"prompt_hint": "Describe line weight, hatching style, and sketch medium (pencil, charcoal, etc.)" |
|
}, |
|
"3D Rendering": { |
|
"description": "Create an image that looks like a 3D rendered scene with realistic lighting", |
|
"icon": "💻", |
|
"prompt_hint": "Include details about lighting setup, materials, and camera perspective" |
|
}, |
|
"Pixel Art": { |
|
"description": "Create retro-style pixel art with limited color palette", |
|
"icon": "👾", |
|
"prompt_hint": "Specify resolution, color limitations, and pixel art style (e.g., 16-bit, 8-bit)" |
|
} |
|
} |
|
|
|
|
|
ART_STYLES = { |
|
"Photorealistic": { |
|
"description": "Detailed realistic style that resembles a photograph with accurate lighting and textures", |
|
"icon": "📸", |
|
"examples": "Works by Chuck Close, Richard Estes, or modern 3D renderings" |
|
}, |
|
"Impressionist": { |
|
"description": "Soft brushstrokes that capture light and atmosphere over precise details, like Monet", |
|
"icon": "🌈", |
|
"examples": "Claude Monet, Pierre-Auguste Renoir, Camille Pissarro" |
|
}, |
|
"Surrealist": { |
|
"description": "Dreamlike quality with impossible or irrational scenes, like Salvador Dali", |
|
"icon": "🌀", |
|
"examples": "Salvador Dali, René Magritte, Frida Kahlo" |
|
}, |
|
"Pop Art": { |
|
"description": "Bold colors, sharp lines and popular culture references, like Andy Warhol", |
|
"icon": "🎭", |
|
"examples": "Andy Warhol, Roy Lichtenstein, Keith Haring" |
|
}, |
|
"Minimalist": { |
|
"description": "Simplified forms, limited color palette, and clean composition with minimal elements", |
|
"icon": "⬜", |
|
"examples": "Piet Mondrian, Kazimir Malevich, Agnes Martin" |
|
}, |
|
"Abstract": { |
|
"description": "Non-representational style using shapes, colors, and forms to express ideas", |
|
"icon": "🔶", |
|
"examples": "Wassily Kandinsky, Jackson Pollock, Mark Rothko" |
|
}, |
|
"Cubist": { |
|
"description": "Geometric shapes and multiple perspectives shown simultaneously, like Picasso", |
|
"icon": "📐", |
|
"examples": "Pablo Picasso, Georges Braque, Juan Gris" |
|
}, |
|
"Art Nouveau": { |
|
"description": "Ornate, flowing lines inspired by natural forms with decorative elegance", |
|
"icon": "🌿", |
|
"examples": "Alphonse Mucha, Gustav Klimt, Antoni Gaudí" |
|
}, |
|
"Gothic": { |
|
"description": "Dark, medieval-inspired aesthetic with dramatic lighting and architectural elements", |
|
"icon": "🏰", |
|
"examples": "Zdzisław Beksiński, H.R. Giger, medieval architecture" |
|
}, |
|
"Cyberpunk": { |
|
"description": "Futuristic dystopian style with neon colors, technology, and urban decay", |
|
"icon": "🤖", |
|
"examples": "Blade Runner, Ghost in the Shell, Akira" |
|
}, |
|
"Steampunk": { |
|
"description": "Victorian-era aesthetic combined with steam-powered technology and brass elements", |
|
"icon": "⚙️", |
|
"examples": "Works by James Ng, Keith Thompson, retrofuturistic Jules Verne adaptations" |
|
}, |
|
"Retro/Vintage": { |
|
"description": "Nostalgic style reminiscent of past decades with period-appropriate elements", |
|
"icon": "📺", |
|
"examples": "1950s advertisements, vintage travel posters, pulp magazine covers" |
|
}, |
|
"Art Deco": { |
|
"description": "Geometric patterns, bold colors, and luxurious materials in a symmetrical style", |
|
"icon": "🏢", |
|
"examples": "Works from the 1920s-30s, Chrysler Building, Tamara de Lempicka paintings" |
|
}, |
|
"Baroque": { |
|
"description": "Dramatic, ornate style with rich details, contrast, and dynamic composition", |
|
"icon": "👑", |
|
"examples": "Caravaggio, Rembrandt, Peter Paul Rubens" |
|
}, |
|
"Ukiyo-e": { |
|
"description": "Traditional Japanese woodblock print style with flat areas of color and strong outlines", |
|
"icon": "🌊", |
|
"examples": "Hokusai's Great Wave, Hiroshige's landscapes, traditional Japanese prints" |
|
}, |
|
"Comic Book": { |
|
"description": "Bold outlines, bright colors, and action-oriented composition like classic comics", |
|
"icon": "💥", |
|
"examples": "Jack Kirby, Steve Ditko, modern Marvel/DC art styles" |
|
}, |
|
"Psychedelic": { |
|
"description": "Vibrant, swirling colors with abstract patterns inspired by 1960s art", |
|
"icon": "🌈", |
|
"examples": "1960s concert posters, Peter Max, Alex Grey" |
|
}, |
|
"Vaporwave": { |
|
"description": "Glitch aesthetics with pastel colors, 80s/90s nostalgia and digital elements", |
|
"icon": "📼", |
|
"examples": "Retrowave aesthetics, 80s digital graphics, glitch art" |
|
}, |
|
"Studio Ghibli": { |
|
"description": "Whimsical, detailed animation style inspired by Japanese animated films", |
|
"icon": "🐉", |
|
"examples": "Spirited Away, My Neighbor Totoro, Howl's Moving Castle" |
|
}, |
|
"Hyperrealism": { |
|
"description": "Extremely detailed realism that exceeds photograph-like precision", |
|
"icon": "🔍", |
|
"examples": "Works by Roberto Bernardi, Denis Peterson, Gottfried Helnwein" |
|
} |
|
} |
|
|
|
|
|
MOODS = { |
|
"Happy": { |
|
"description": "Bright, cheerful atmosphere with warm colors", |
|
"icon": "😊", |
|
"color_palette": "Warm and vibrant colors: yellows, bright oranges, light blues" |
|
}, |
|
"Sad": { |
|
"description": "Melancholic atmosphere with muted colors", |
|
"icon": "😢", |
|
"color_palette": "Muted blues, grays, desaturated colors, cool tones" |
|
}, |
|
"Mysterious": { |
|
"description": "Enigmatic atmosphere with shadows and hidden elements", |
|
"icon": "🔮", |
|
"color_palette": "Deep purples, dark blues, hints of teal, selective lighting" |
|
}, |
|
"Peaceful": { |
|
"description": "Serene, calm atmosphere with gentle lighting", |
|
"icon": "🕊️", |
|
"color_palette": "Soft blues, gentle greens, pastel colors, balanced light" |
|
}, |
|
"Tense": { |
|
"description": "Suspenseful atmosphere with dramatic lighting", |
|
"icon": "😰", |
|
"color_palette": "High contrast, dark shadows, selective reds, strong highlights" |
|
}, |
|
"Whimsical": { |
|
"description": "Playful, imaginative atmosphere with fanciful elements", |
|
"icon": "🦄", |
|
"color_palette": "Pastels, candy colors, unexpected color combinations" |
|
}, |
|
"Dark": { |
|
"description": "Gloomy atmosphere with deep shadows and low lighting", |
|
"icon": "🌑", |
|
"color_palette": "Dark blues, blacks, deep greens, minimal highlights" |
|
}, |
|
"Energetic": { |
|
"description": "Dynamic, vibrant atmosphere with strong colors and movement", |
|
"icon": "⚡", |
|
"color_palette": "Saturated primary colors, bold contrasts, vibrant hues" |
|
}, |
|
"Romantic": { |
|
"description": "Soft, dreamy atmosphere with warm, gentle lighting", |
|
"icon": "❤️", |
|
"color_palette": "Soft pinks, gentle reds, golden highlights, warm tones" |
|
}, |
|
"Epic": { |
|
"description": "Grand, impressive atmosphere with dramatic scale and lighting", |
|
"icon": "🏔️", |
|
"color_palette": "Bold colors, dramatic contrast, atmospheric lighting, expansive scale" |
|
} |
|
} |
|
|
|
|
|
EXAMPLE_PROMPTS = [ |
|
{ |
|
"text": "A serene lake at sunset with mountains in the background and a small wooden boat floating nearby", |
|
"thumbnail_desc": "Peaceful lake scene at sunset", |
|
"creation_type": "Realistic Photo", |
|
"art_style": "Photorealistic", |
|
"mood": "Peaceful", |
|
"tags": ["nature", "landscape", "water", "sunset"] |
|
}, |
|
{ |
|
"text": "A futuristic cityscape with flying cars, neon lights, and tall skyscrapers under a night sky with two moons", |
|
"thumbnail_desc": "Futuristic city with flying cars", |
|
"creation_type": "Concept Art", |
|
"art_style": "Cyberpunk", |
|
"mood": "Mysterious", |
|
"tags": ["scifi", "future", "urban", "night"] |
|
}, |
|
{ |
|
"text": "A close-up portrait of an elderly craftsman with weathered hands working on an intricate wooden carving in his workshop", |
|
"thumbnail_desc": "Elderly craftsman working with wood", |
|
"creation_type": "Oil Painting", |
|
"art_style": "Hyperrealism", |
|
"mood": "Peaceful", |
|
"tags": ["portrait", "craftsmanship", "elderly", "detail"] |
|
}, |
|
{ |
|
"text": "A magical forest with glowing mushrooms, fairy lights, and a small cottage with smoke coming from the chimney", |
|
"thumbnail_desc": "Magical forest with glowing elements", |
|
"creation_type": "Fantasy Illustration", |
|
"art_style": "Studio Ghibli", |
|
"mood": "Whimsical", |
|
"tags": ["fantasy", "forest", "magic", "cottage"] |
|
}, |
|
{ |
|
"text": "A cybernetic samurai with glowing blue circuits standing in a rainy Tokyo street at night", |
|
"thumbnail_desc": "Cybernetic samurai in rainy Tokyo", |
|
"creation_type": "Digital Art", |
|
"art_style": "Cyberpunk", |
|
"mood": "Dark", |
|
"tags": ["character", "cyberpunk", "samurai", "rain"] |
|
}, |
|
{ |
|
"text": "A cute cat with dragon wings and tiny horns sleeping on a pile of gold coins", |
|
"thumbnail_desc": "Cat with dragon features on gold", |
|
"creation_type": "Fantasy Illustration", |
|
"art_style": "Comic Book", |
|
"mood": "Whimsical", |
|
"tags": ["creature", "fantasy", "cute", "treasure"] |
|
}, |
|
{ |
|
"text": "An ancient temple covered in vines and moss, partially sunken into a crystal-clear cenote in the jungle", |
|
"thumbnail_desc": "Ancient temple in jungle cenote", |
|
"creation_type": "Concept Art", |
|
"art_style": "Photorealistic", |
|
"mood": "Mysterious", |
|
"tags": ["architecture", "ruins", "jungle", "water"] |
|
}, |
|
{ |
|
"text": "A cozy coffee shop interior with rain falling outside the windows, soft lighting, and a few people reading books", |
|
"thumbnail_desc": "Cozy rainy day in coffee shop", |
|
"creation_type": "Digital Art", |
|
"art_style": "Impressionist", |
|
"mood": "Peaceful", |
|
"tags": ["interior", "rainy", "cozy", "urban"] |
|
} |
|
] |
|
|
|
|
|
|
|
|
|
|
|
|
|
def format_dropdown_choices(options_dict): |
|
return [f"{info.get('icon', '•')} {key}" for key in options_dict.keys()] |
|
|
|
|
|
def extract_key(formatted_choice): |
|
|
|
parts = formatted_choice.split(' ', 1) |
|
if len(parts) > 1: |
|
return parts[1] |
|
return formatted_choice |
|
|
|
|
|
def load_example(example_index): |
|
if example_index < 0 or example_index >= len(EXAMPLE_PROMPTS): |
|
return "", "", "", "" |
|
|
|
example = EXAMPLE_PROMPTS[example_index] |
|
creation = f"{CREATION_TYPES[example['creation_type']]['icon']} {example['creation_type']}" |
|
art = f"{ART_STYLES[example['art_style']]['icon']} {example['art_style']}" |
|
mood = f"{MOODS[example['mood']]['icon']} {example['mood']}" |
|
|
|
return example["text"], creation, art, mood |
|
|
|
|
|
def get_model_key(formatted_name): |
|
|
|
if ' ' in formatted_name: |
|
display_name = formatted_name.split(' ', 1)[1] |
|
|
|
for key, info in IMAGE_MODELS.items(): |
|
if info['display_name'] == display_name: |
|
return key |
|
return list(IMAGE_MODELS.keys())[0] |