
    "j                    J   U d Z ddlmZ ddlZddl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 ddd	d
Zded<    e
d           G d d                      Z e
d           G d d                      Z G d d          Z G d d          Zd&d'dZd(dZd d!d)d%ZdS )*z?NVIDIA NIM image-generation client for AutoShortsBot keyframes.    )annotationsN)	dataclass)Path)Anyz2https://ai.api.nvidia.com/v1/genai/qwen/qwen-imagezIhttps://ai.api.nvidia.com/v1/genai/stabilityai/stable-diffusion-3_5-largez?https://ai.api.nvidia.com/v1/genai/black-forest-labs/flux.1-devz
qwen-imagezstable-diffusion-3.5-largez
flux.1-devzdict[str, str]NVIDIA_IMAGE_ENDPOINTST)frozenc                  |    e Zd ZU dZded<   ded<   dZded<   d	Zded
<   dZded<   dZded<   dZ	ded<   dZ
ded<   dS )NvidiaImageRequestz5Provider-neutral request for a single keyframe image.strpromptr   output_pathi   intwidthi@  heighte   seed   stepsg      @float	cfg_scalebasemodeN)__name__
__module____qualname____doc____annotations__r   r   r   r   r   r        X/home/agent/jarvis_runtime/autoshortsbot/AutoShortsBot/autoshorts/nvidia_image_client.pyr   r      s         ??KKKEFDOOOOEOOOOIDr    r   c                  j    e Zd ZU dZded<   ded<   ded<   dZded<   dZd	ed
<   dZded<   dZded<   dS )NvidiaImageResultz+Structured result for one provider attempt.r   statusmodelendpointNPath | Noner   z
int | Nonehttp_status
str | Noneerrorr   r   bytes_written)	r   r   r   r   r   r   r(   r*   r+   r   r    r!   r#   r#   &   sw         55KKKJJJMMM#K####"K""""EMr    r#   c                      e Zd ZdZddZdS )UrllibNvidiaImageTransportz;Small urllib transport so tests can swap the network layer.r&   r   api_keypayloaddict[str, Any]timeout_secondsr   returntuple[int, bytes, str]c               .   t           j                            |t          j        |                              d          d| dddd          }	 t           j                            ||          5 }|j        |                                |j	        
                    dd	          fcd d d            S # 1 swxY w Y   d S # t           j        j        $ r?}|j        |                                |j	        
                    dd	          fcY d }~S d }~ww xY w)
Nutf-8zBearer zapplication/json)AuthorizationAcceptContent-TypePOST)dataheadersmethod)timeoutr8    )urllibrequestRequestjsondumpsencodeurlopenr$   readr;   getr*   	HTTPErrorcode)selfr&   r.   r/   r1   r@   responseexcs           r!   	post_jsonz$UrllibNvidiaImageTransport.post_json6   sw   .((G$$++G44!47!4!4, 2 
  ) 	
 	
	M'''II bX9I9M9Mn^`9a9aab b b b b b b b b b b b b b b b b b|% 	M 	M 	M8SXXZZ)L)LLLLLLLL	MsB   !C 25B4'C 4B88C ;B8<C D4D	DDN)
r&   r   r.   r   r/   r0   r1   r   r2   r3   )r   r   r   r   rM   r   r    r!   r-   r-   3   s4        EEM M M M M Mr    r-   c                  <    e Zd ZdZdddddddZddddZddZdS )NvidiaImageClienta"  Client for hosted NVIDIA image-generation endpoints.

    The Build portal has both hosted API endpoints and deploy/self-host pages. This client only uses
    the hosted API path under ``https://ai.api.nvidia.com/v1/genai/...`` and does not require hosting
    a NIM container locally.
    N   )r.   	endpoints	transportr1   r.   r)   rQ   dict[str, str] | NonerR   
Any | Noner1   r   r2   Nonec                   |pt                      | _        |pt          | _        |pt	                      | _        || _        d S N)load_nvidia_api_keyr.   r   rQ   r-   rR   r1   )rJ   r.   rQ   rR   r1   s        r!   __init__zNvidiaImageClient.__init__P   sE     7"5"7"7"<&<"B&@&B&B.r    )model_orderr@   r   rZ   list[str] | Noner#   c                   |pg d}d}|D ]8}| j         |         }|                     |||          }|j        dk    r|c S |}9|t          d          |S )z>Generate one image, trying models in order until one succeeds.r   N)r%   r&   successzmodel_order is empty)rQ   _generate_with_modelr$   
ValueError)rJ   r@   rZ   orderlast_resultr%   r&   results           r!   generatezNvidiaImageClient.generate]   s     YYYY04 	! 	!E~e,H..weh.WWF}	)) KK3444r    r%   r   r&   c          
        |j         |j        |j        |j        |j        |j        |j        d}| j                            || j	        || j
                  \  }}}|dk     s|dk    r!t          d|||t          |                    S 	 t          t          j        |                    d                              }n.# t"          $ r!}	t          d|||d|	           cY d }	~	S d }	~	ww xY w|j        j                            d	d	
           |j                            |           t          d|||j        |t-          |                    S )N)r   r   r   r   r   r   r   )r1      i,  failed)r$   r%   r&   r(   r*   r5   z could not parse image response: T)parentsexist_okr]   )r$   r%   r&   r   r(   r+   )r   r   r   r   r   r   r   rR   rM   r.   r1   r#   _safe_error_text_extract_image_bytesrB   loadsdecode	Exceptionr   parentmkdirwrite_byteslen)
rJ   r@   r%   r&   r/   status_codebody_content_typeimage_bytesrL   s
             r!   r^   z&NvidiaImageClient._generate_with_modelq   s   nL *]nL]
 
 ,0>+C+CL 0	 ,D ,
 ,
(T= s 2 2$!'&t,,   		.tz$++g:N:N/O/OPPKK 	 	 	$!'>>>        	 	"(((EEE''444 +#k**
 
 
 	
s   4B= =
C(C#C(#C()
r.   r)   rQ   rS   rR   rT   r1   r   r2   rU   )r@   r   rZ   r[   r2   r#   )r@   r   r%   r   r&   r   r2   r#   )r   r   r   r   rY   rc   r^   r   r    r!   rO   rO   H   s          #+/ $"/ / / / / /" )-	     (-
 -
 -
 -
 -
 -
r    rO   pathr'   r2   r   c                   dD ].}t          j        |          }|r|                                c S /| pt          j                    dz  dz  dz  }|                    d                                          }d|v rg|                    dd          \  }}|                                d	vr$t          d
|                                           |                                S |                                S )zGLoad NVIDIA API key from env or Hermes secret file without printing it.)NVIDIA_API_KEYNGC_API_KEYNVIDIA_NIM_API_KEYz.hermessecretsnvidia_api_keyr5   )encoding=   >   ry   rx   rz   z$Unsupported NVIDIA secret key name: )osgetenvstripr   home	read_textsplitr_   )rv   env_namevaluesecret_pathrawnames         r!   rX   rX      s     L ! !	(## 	!;;==   	! P$)++	1I=@PPK




1
1
7
7
9
9C
czziiQ''e::<<VVVRDJJLLRRSSS{{}}99;;r    r/   r0   bytesc                R   |                      d          x}r3|d         }|                     d          x}rt          j        |          S dD ]D}|                      |          }t          |t                    r|rt          j        |          c S E|                      d          x}rO|d         }dD ]D}|                     |          }t          |t                    r|rt          j        |          c S Et          dt          |                                                      )zDExtract image bytes from common NVIDIA Visual GenAI response shapes.	artifactsr   base64)imageb64_jsonr   r:   )r   r   r   z"no base64 image field found; keys=)rG   r   	b64decode
isinstancer   r_   sortedkeys)r/   r   firstencodedkeyr:   s         r!   rj   rj      s9    KK,,,y -!ii)))7 	-#G,,,. - -++c""gs## 	- 	-#G,,,,,{{6"""t 1Q2 	1 	1CiinnG'3'' 1G 1'00000
R&:P:PRR
S
SSr    i  )limitrs   r   r   c               h    |                      dd                                          }|d |         S )Nr5   replace)errors)rl   r   )rs   r   texts      r!   ri   ri      s1    ;;wy;117799D<r    rW   )rv   r'   r2   r   )r/   r0   r2   r   )rs   r   r   r   r2   r   )r   
__future__r   r   rB   r   urllib.errorr?   urllib.requestdataclassesr   pathlibr   typingr   r   r   r   r#   r-   rO   rX   rj   ri   r   r    r!   <module>r      s   E E E " " " " " "   				         ! ! ! ! ! !             G"m T* *      $
 
 
 
 
 
 
 
 $	 	 	 	 	 	 	 	M M M M M M M M*V
 V
 V
 V
 V
 V
 V
 V
r    $T T T T. 36        r    