o
    ?\iW'                  
   @   sj  d Z ddlZddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlZddlmZmZ ddejd	ed
iZdddddddddddddddddddddddddZdad4deddfd d!Zdefd"d#Zd$ed%ed&edeeef fd'd(Zd)ed*edeeef fd+d,ZG d-d. d.Zdefd/d0Zd1e	de
e	eef  fd2d3Zd3d.gZdS )5z}
LOCAL GPU IMAGE GENERATOR (Optimized for SD15)
Lazy GPU init + strong diagnostics so systemd/env issues don't crash import.
    N)BytesIO)datetime)OptionalDictListTuple)StableDiffusionPipelineDPMSolverMultistepSchedulersd15zrunwayml/stable-diffusion-v1-5@   )repo_iddtypesize_multiplepipeline_classzPphotorealistic, 8k uhd, professional photography, detailed lighting, ultra sharpz8cartoon, painting, sketch, low quality, blurry, deformed)positivenegativez;anime style, studio quality, vibrant colors, smooth shadingz'realistic photo, ugly, deformed, blurryz43d render, octane render, unreal engine, ray tracingz2d, cartoon, low qualityz1cartoon, colorful, animated style, clean outlineszrealistic, photo, blurryz1comic book style, inking, halftone, bold outlineszphoto, realistic, blurryzEcinematic lighting, professional composition, dramatic depth of fieldzflat, low quality, dullzBfantasy concept art, magic, epic, detailed, trending on artstationzmodern, realistic, low qualityz>cyberpunk, neon lights, futuristic, sci-fi, detailed cityscapezfantasy, medieval, low quality)	realisticanime3dcartoonisticcomic	cinematicfantasy	cyberpunk prefixreturnc              
   C   s  zkt |  dtj   t |  dttjdd  t |  dtj  t |  dtj	d  zddl
}|jd	g|jd
dd}t |  d|  W W dS  tyk } zt |  d|  W Y d}~W dS d}~ww  ty } zt |  d|  W Y d}~dS d}~ww )z%Print detailed CUDA diagnostics once.ztorch.cuda.is_available(): ztorch.version.cuda: cudaNztorch.__version__: zCUDA_VISIBLE_DEVICES: CUDA_VISIBLE_DEVICESr   z
nvidia-smiT   )stderrtexttimeoutznvidia-smi OK:
z$nvidia-smi not available or failed: zCUDA diagnostic failed: )printtorchr   is_availablegetattrversion__version__osenvironget
subprocesscheck_outputSTDOUT	Exception)r   r,   smie r2   D/var/www/eduai.edurigo.com/roleplay/testing/local_image_generator.py_diagnose_cudaB   s"   " r4   c                   C   s,   t jdd dkrdS tj rdS dS )z<cpu override for debugging; otherwise use cuda if available.FORCE_DEVICEr   cpur   )r)   r*   r+   lowerr$   r   r%   r2   r2   r2   r3   _device_wantedS   s   r8   widthheight
model_namec                 C   s<   t | d }| | d | | } || d | | }| |fS )Nr      )MODEL_CONFIGS)r9   r:   r;   multipler2   r2   r3   _adjust_dimensionsZ   s   r?   promptcategoryc                 C   s.   t | t d }|  d|d  |d fS )Nr   z, r   r   )CATEGORY_STYLESr+   r7   )r@   rA   styler2   r2   r3   _enhance_prompta   s   rD   c                   @   sf   e Zd Zddee fddZdedefddZd	d
 Zde	e
 fddZdeeeef  fddZdS )LocalImageGeneratorNpreload_modelsc                 C   s`   i | _ |pdg| _t | _td tdd | jD ]}| | q|   td| j d d S )Nr
   u1   
🚀 Initializing SD15 image generator (lazy)...z[init] r   u   ✅ SD15 ready on device: 
)	pipelinesrF   r8   devicer#   r4   _load_model_print_vram_status)selfrF   r;   r2   r2   r3   __init__h   s   

zLocalImageGenerator.__init__r;   r   c              
   C   s.  || j v rtd| d dS t| }td| d| j d zX|d j|d | jd	kr0|d
 ntjdd}t|j	j
|_	|| j}| jd	kre|  z
|  td W n tyd   td Y nw || j |< td| d| j  W dS  ty } ztd|  tdd W Y d }~dS d }~ww )Nu   ℹ️  z already loadedTu   ⏳ Loading z
 model on ...r   r   r   r   )torch_dtypeuse_safetensorsu      ✅ xformers enabledu       ℹ️ xformers not availableu   ✅ z loaded to u   ❌ Failed to load model: z[load_model] rG   F)rI   r#   r=   rJ   from_pretrainedr$   float32r	   from_config	schedulerconfigtoenable_attention_slicing*enable_xformers_memory_efficient_attentionr/   r4   )rM   r;   cfgpipeliner1   r2   r2   r3   rK   v   s<   



zLocalImageGenerator._load_modelc                 C   sf   | j dkr1tjdjd }tjdd }tjdd }td|dd|dd|dd d S d S )	Nr   r   i   @u   
📊 VRAM: Allocated=z.2fz GB | Reserved=z GB | Total=z GB)rJ   r$   r   get_device_propertiestotal_memorymemory_reservedmemory_allocatedr#   )rM   totalreserved	allocatedr2   r2   r3   rL      s   
&z&LocalImageGenerator._print_vram_statusc              
   C   sj  || j vr| |std d S | j | }t||\}}t|||\}}| jdkr.tj  td| d| d| j d zJt	  |||dd||d	}	W d    n1 sWw   Y  |	j
d
 }
t }|
j|dd ~	| jdkr{tj  tj  t  td | W S  ty } z!td|  tdd | jdkrtj  t  W Y d }~d S d }~ww )Nu/   ❌ Model not loaded and cannot be initialized.r   u   
🎨 Generating xz
 image on rO      g      @)r@   negative_promptnum_inference_stepsguidance_scaler9   r:   r   PNG)formatu+   ✅ Generation complete and memory cleared.u   ❌ Generation error: z[generate] rG   )rI   rK   r#   rD   r?   rJ   r$   r   empty_cacheinference_modeimagesr   savesynchronizegccollectgetvaluer/   r4   )rM   r@   rA   r;   r9   r:   r[   enhancedr   resultimgbufr1   r2   r2   r3   generate_single_image   sP   














z)LocalImageGenerator.generate_single_imagec                 C   s   g }t  d}td| d t|D ]6}	td|	d  d|  | |||||}
|
rK|| d| d| d|	d dd	t|
	d
d qtdt
| d| d |S )N%Y%m%d_%H%M%Su#   
🚀 Starting generation batch of z
 images...u   📸 Generating image r<   /_03d.pngutf-8namebase64u   ✅ Batch complete: z successful)r   nowstrftimer#   rangerv   appendr   	b64encodedecodelen)rM   r@   rA   r;   r9   r:   image_countimgs	timestampi	img_bytesr2   r2   r3   generate_multiple_images   s    z,LocalImageGenerator.generate_multiple_images)N)__name__
__module____qualname__r   strrN   boolrK   rL   r   bytesrv   r   r   r2   r2   r2   r3   rE   g   s    !-rE   c                   C   s   t d u r
tdgda t S )Nr
   )rF   )
_GENERATORrE   r2   r2   r2   r3   _get_generator   s   r   payloadc           
      C   s   t | dd }t | dd  pd}t | dd  p%d}t| dd}t| d	d}t| d
d}|tvrDd}|dksL|dkrPd\}}|dkrVd}t }|dkr||||||}|sjg S t	 
d}	| d| d|	 dt|ddgS |||||||S )z
    Expected payload:
    {
      "prompt": "...",
      "category": "realistic",
      "model_name": "sd15",
      "width": 1024,
      "height": 1024,
      "image_count": 1
    }
    Returns: [ { "name": "...png", "base64": "..." } ]
    r@   r   rA   r   r;   r
   r9      r:   r   r<   r   )r   r   rw   ry   r{   r|   r}   )r   r+   stripr7   intr=   r   rv   r   r   r   r   r   r   r   )
r   r@   rA   r;   r9   r:   countgenr   r   r2   r2   r3   generate_images   s,   r   )r   )__doc__r)   ro   r   ior   r   typingr   r   r   r   r$   	diffusersr   r	   float16r=   rB   r   r   r4   r8   r   r?   rD   rE   r   r   __all__r2   r2   r2   r3   <module>   sd    $"u,