arpit13's picture
Create setup.py
6a21df7 verified
raw
history blame
17 kB
# AI Image Creator: Enhanced UI and UX
# Part 1: Core Setup, Model Classes and API Configuration
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")
# Set up logging
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")
# =============== MODEL CLIENTS SETUP ===============
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
# Initialize clients
try:
# Replace with your actual HF API key
hf_api_key = os.getenv("HF_API_KEY")
hf_client = setup_client(hf_api_key)
logger.info("Hugging Face client created successfully")
# Set up Llama client if API key is provided
llama_api_key = os.getenv("HF_API_KEY") # Replace with actual key if available
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
# =============== DATA MODELS ===============
# Image Models with friendly names, descriptions and icons
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 with icons and detailed descriptions
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 with icons and detailed descriptions
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 with icons and descriptions
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 with rich metadata
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"]
}
]
# CSS for enhanced UI styling - Will be included in part 2
# =============== HELPER FUNCTIONS ===============
# Helper function to format dropdown choices with icons
def format_dropdown_choices(options_dict):
return [f"{info.get('icon', '•')} {key}" for key in options_dict.keys()]
# Helper function to extract the key from formatted choice
def extract_key(formatted_choice):
# Skip the icon and space at the beginning
parts = formatted_choice.split(' ', 1)
if len(parts) > 1:
return parts[1]
return formatted_choice
# Function to load example prompt
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
# Get model key from formatted display name
def get_model_key(formatted_name):
# Extract display name without the icon
if ' ' in formatted_name:
display_name = formatted_name.split(' ', 1)[1]
# Find the corresponding key
for key, info in IMAGE_MODELS.items():
if info['display_name'] == display_name:
return key
return list(IMAGE_MODELS.keys())[0] # Default to first model if not found