o
    hy2                     @   s2  U d Z ddlmZmZ ddlmZ ddlmZmZm	Z	 ddl
mZmZ ddlZddlmZ ddlmZ ejejd	d
 eeZdaee ed< edefddZedddedZejedgddgdgd G dd deZG dd deZG dd deZG dd deZej ddgd d!d" Z!ej"d#ed$gd%d&efd'd(Z#ej d)ed*gd%d+d, Z$ej d-d*gd d.d/ Z%ej"d0d*gd d1e&fd2d3Z'ej(d4d*gd d1e&fd5d6Z)e*e+d7d8 Z,ed9krddl-Z-e.d: e.d; e.d< e.d= e.d> e.d? e.d@ e.dA e-j/dBdCdDdEdFdG dS dS )Hz
PROFESSIONAL IMAGE GENERATION API
==================================
FastAPI server with preloaded SDXL and SD15 models for instant generation
    )FastAPIHTTPException)CORSMiddleware)	BaseModelField	validator)ListOptionalN)asynccontextmanager)LocalImageGeneratorz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformat	generatorappc              
   C  s   t d t d ztddgdat d W n ty4 } zt d|  td| d	}~ww d	V  t d
 trBbd	S d	S )z
    Lifespan context manager for model preloading on startup.
    Both SDXL and SD15 will be loaded into VRAM during initialization.
    u%   🚀 Starting Image Generation API...u#   📦 Preloading models into VRAM...sdxlsd15)preload_modelsu.   ✅ Models preloaded successfully - API ready!u$   ❌ Failed to initialize generator: zModel initialization failed: Nu   🛑 Shutting down API...)loggerinfor   r   	ExceptionerrorRuntimeError)r   e r   E/var/www/eduai.edurigo.com/generate_image/staging/image_generation.pylifespan   s    


r   !Professional Image Generation APIuN   🚀 GPU-based Self-Hosted Image Generator with Preloaded Models (SDXL + SD15)6.0.0)titledescriptionversionr   *T)allow_originsallow_credentialsallow_methodsallow_headersc                   @   s   e Zd ZU dZeddddddZeed< edd	d
dZeed< eddddZ	eed< edddddZ
eed< edddddZeed< edddddZeed< eddd Zeddd Zedd d! Zd"S )#ImageRequestz#Request model for image generation..z Text prompt for image generation   i  z(a beautiful mountain landscape at sunset)r   
min_length
max_lengthexamplepromptzVisual style or theme	realistic)r   r*   categoryr   z#Model to use: sdxl, sd15, realisticr   
model_namei   zImage width in pixels   i   )r   gelewidthzImage height in pixelsheight   zNumber of images to generateimage_countc                 C   s"   g d}||vrt d| |S )z-Validate model name against available models.r   r   r,   zmodel_name must be one of: 
ValueError)clsvalueallowed_modelsr   r   r   validate_model_names   s   z ImageRequest.validate_model_namec                 C   s(   d|  krdkst d t d|S )z0Validate image count is within acceptable range.r4   r'   z#image_count must be between 1 and 3r7   )r9   r:   r   r   r   validate_image_count{   s
   z!ImageRequest.validate_image_countc                 C   s*   g d}|  |vrtd| d |S )z'Validate category against known styles.r,   3dcartoonisticcomicanime	cinematicfantasy	cyberpunkzUnknown category 'z ', defaulting to realistic style)lowerr   warning)r9   r:   allowed_categoriesr   r   r   validate_category   s   zImageRequest.validate_categoryN)__name__
__module____qualname____doc__r   r+   str__annotations__r-   r.   r2   intr3   r5   r   r<   r=   rI   r   r   r   r   r&   L   sV   
 

r&   c                   @   s:   e Zd ZU dZedddZeed< edddZeed< dS )		ImageDatazSingle image data..zUnique image identifierr   namezBase64 encoded image database64N)	rJ   rK   rL   rM   r   rS   rN   rO   rT   r   r   r   r   rQ      s   
 rQ   c                   @   sN   e Zd ZU dZedddZeed< edddZeed< edddZ	e
ed	< d
S )ImageResponsez/Response model for successful image generation..zResponse statusrR   statuszHuman-readable messagemessagezGenerated image datadataN)rJ   rK   rL   rM   r   rV   rN   rO   rW   rX   dictr   r   r   r   rU      s
   
 rU   c                   @   s"   e Zd ZU dZeed< eed< dS )HealthResponsez Response model for health check.rV   rX   N)rJ   rK   rL   rM   rN   rO   rY   r   r   r   r   rZ      s   
 rZ   /Info)tagsc                	      s    dddddgdddd	d
dS )z)API root endpoint with basic information.r   r   operationalr   r   /generate-image/health/modelsz/docs)generatehealthmodelsdocs)servicer    rV   preloaded_models	endpointsr   r   r   r   r   root   s   ri   r_   
Generation)response_modelr]   requestc                    s*  t du rtdddtd| j d| j d| j d| j d	 td	| jdd
  d zDt j	| j| j
| j| j| j| jd}|sItdddtdt| d ddt| d| j  || j| j d| j | j
ddW S  ty } ztdt|  tddt| dd}~ww )a  
    Generate one or more images using preloaded GPU models.
    
    This endpoint uses models that are already loaded in VRAM,
    providing near-instant generation without loading delays.
    
    Args:
        request: ImageRequest containing generation parameters
        
    Returns:
        ImageResponse with generated base64 encoded images
        
    Raises:
        HTTPException: If generation fails or models not available
    N  z5Generator not initialized. Please restart the server.status_codedetailu   📥 New request: z | xz	 image(s)z   Prompt: P   z...)r+   r-   r.   r2   r3   r5     z1Image generation failed. No images were produced.u   ✅ Successfully generated successzSuccessfully generated z image(s) using )images
model_used
dimensionsr-   )rV   rW   rX   u   ❌ Generation error: zError generating image: )r   r   r   r   r.   r2   r3   r5   r+   generate_multiple_imagesr-   lenupperr   r   rN   )rl   ru   r   r   r   r   generate_image   sN   ,	r{   r`   Systemc               
      sn   t du rtdddz
t  } d| dW S  ty6 } ztdt|  tdd	t| dd}~ww )
ab  
    Comprehensive health check of GPU, models, and system status.
    
    Returns detailed information about:
    - GPU availability and VRAM usage
    - Preloaded models status
    - PyTorch and CUDA versions
    
    Returns:
        HealthResponse with system health information
        
    Raises:
        HTTPException: If health check fails
    Nrm   Generator not initializedrn   rt   rV   rX   u   ❌ Health check failed: rs   zHealth check failed: )r   r   check_healthr   r   r   rN   )health_statusr   r   r   r   health_check   s&   r   ra   c                      s:   t du rtddddg dtt j g ddd	S )
z
    List all available and currently loaded models.
    
    Returns:
        Dictionary containing available and loaded models
    Nrm   r}   rn   rt   r6   r>   )available_modelsrg   supported_categoriesr~   )r   r   list	pipelineskeysr   r   r   r   list_models  s   r   z/models/load/{model_name}r.   c              
      s   t du rtdddg d}| |vrtdd| dz!t | }|r4dd	|  d
tt j dW S tdd|  dd tyT } ztddt| dd}~ww )a	  
    Load an additional model into VRAM on-demand.
    
    Args:
        model_name: Name of model to load (sdxl, sd15, realistic)
        
    Returns:
        Success message if model loaded
        
    Raises:
        HTTPException: If model loading fails
    Nrm   r}   rn   r6   i  zInvalid model name. Allowed: rt   Model 'z' loaded successfully)rV   rW   rg   rs   zFailed to load model ''zError loading model: )r   r   load_additional_modelr   r   r   r   rN   )r.   r;   rt   r   r   r   r   
load_model,  s<   


r   z/models/unload/{model_name}c              
      s   t du rtdddz!t | }|r#dd|  dtt j dW S td	d|  d
d tyC } ztddt| dd}~ww )z
    Unload a model from VRAM to free memory.
    
    Args:
        model_name: Name of model to unload
        
    Returns:
        Success message if model unloaded
        
    Raises:
        HTTPException: If model unloading fails
    Nrm   r}   rn   rt   r   z' unloaded successfully)rV   rW   remaining_modelsi  z' not currently loadedrs   zError unloading model: )r   r   unload_modelr   r   r   r   rN   )r.   rt   r   r   r   r   r   Z  s0   


r   c                    s   dt |ddS )zHandle validation errors.r   validation_error)rV   rW   type)rN   )rl   excr   r   r   value_error_handler  s
   r   __main__zG
======================================================================u/   🚀 STARTING PROFESSIONAL IMAGE GENERATION APIzF======================================================================u6   📦 Models will be preloaded on startup (SDXL + SD15)u<   ⏱️  First startup may take 1-2 minutes for model loadingu4   🌐 API will be available at: http://localhost:8000u1   📖 Documentation at: http://localhost:8000/docszG======================================================================
zmain:appz0.0.0.0i@  Fr   )hostportreload	log_level)0rM   fastapir   r   fastapi.middleware.corsr   pydanticr   r   r   typingr   r	   logging
contextlibr
   local_image_generatorr   basicConfigINFO	getLoggerrJ   r   r   rO   r   r   add_middlewarer&   rQ   rU   rZ   getri   postr{   r   r   rN   r   deleter   exception_handlerr8   r   uvicornprintrunr   r   r   r   <module>   s    
A
>
"
-)


