
    љi!                         S SK r S SKJr  S SKJrJrJr  S SKJr  S SK	J
r
  S SKrS SKJr  S SKJr  S SKJr  \" \5      r " S	 S
5      r " S S\5      r " S S\5      rg)    N)	getLogger)TupleDictUnion)Path)uuid4)genai)types)Toolc                       \ rS rSr        SS\S\S\S\S\S\S	\S
\S\4S jjrSSSS.S\S\S\	\
\4   S\\\
4   4S jjrS\S\
4S jrS\S\
4S jrSrg)
NanoBanana   Ngemini_api_keymodelsystem_instruction	id_prefixtimeout	get_image
save_imagesave_dirdebugc
                     X l         X0l        [        R                  " U[        R
                  " US9S9U l        U=(       d    SU l        X`l        Xpl	        Xl
        U	n	g )N)r   )api_keyhttp_options
nanobanana)r   r   r	   Clientr
   HttpOptionsclientr   
_get_image_save_imager   )
selfr   r   r   r   r   r   r   r   r   s
             [/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/llm/tools/nanobanana.py__init__NanoBanana.__init__   sS     
"4ll"**7;
 "1\#%     )image_idpromptreference_imager&   r'   r(   returnc                  #    U(       d  U R                    S[        5        3n/ nU(       a,  UR                  [        R                  R                  US95        U(       a  [        U[        5      (       a.  UR                  [        R                  R                  USS95        OB[        U[        5      (       a-  UR                  [        R                  R                  USS95        [        R                  " SUS9/n[        R                  " S/S	9nU R                  (       a  U R                  Ul        U R                  R                  R                   R#                  U R$                  UUS
9I S h  vN nUR&                  (       a  UR&                  S   R(                  (       a  UR&                  S   R(                  R*                   H  nUR,                  (       d  M  UR,                  R.                  (       d  M3  UR,                  R.                  R1                  S5      (       a  XR,                  R.                  4s  $ U[2        R4                  " UR,                  R.                  5      4s  $    [7        S5      e GN7f)N_)textz	image/png)data	mime_type)file_urir.   user)rolepartsIMAGE)response_modalities)r   contentsconfigr   s   PNGzImage is not generated.)r   r   appendr
   Part	from_text
isinstancebytes
from_bytesstrfrom_uriContentGenerateContentConfigr   r   aiomodelsgenerate_contentr   
candidatescontentr2   inline_datar-   
startswithbase64	b64decode	Exception)	r!   r&   r'   r(   r2   r5   generate_content_configrespps	            r"   generate_imageNanoBanana.generate_image'   s    ..)57)4HLL--6-:;/511UZZ22S^2_`OS11UZZ00/U`0abMMvU;<"'"="=SZR["\""9=9P9P#6[[__++<<*** = 
 
 ??tq199__Q'//55===Q]]%7%7%7}}))44Z@@'););;;')9)9!--:L:L)MMM 6 122
s    E+I8-I5.A(I8I87A?I8idimage_bytesc                 j  #    U R                   (       a  U R                  X5      I S h  vN   g [        R                  " [        U R                  5      U S3-  S5       IS h  vN nUR                  U5      I S h  vN   S S S 5      IS h  vN   g  Nh N0 N N! , IS h  vN  (       d  f       g = f7f)N.pngwb)r    aiofilesopenr   r   write)r!   rP   rQ   fs       r"   r   NanoBanana.save_imageJ   s     ""2333}}T$--%8bT;%FMMQRggk*** NMM 4M* NMMMsi   &B3B9B3"B#B3&B;B<B B3BB3B3BB3B0B" B0,B3c                 f  #    U R                   (       a  U R                  U5      I S h  vN $ [        R                  " [        U R                  5      U S3-  S5       IS h  vN nUR                  5       I S h  vN sS S S 5      IS h  vN   $  Nf N/ N N! , IS h  vN  (       d  f       g = f7f)NrS   rb)r   rU   rV   r   r   read)r!   rP   rX   s      r"   
read_imageNanoBanana.read_imageQ   sw     ??,,,}}T$--%8bT;%FMMQRVVX~ NMM -M% NMMMsi   &B1B8B1!B"B1%B9B:B=B1	B
B1B1BB1B.B B.*B1)r   r    r   r   r   r   r   )gemini-2.5-flash-imageNN`  NNnanobanana_imagesF)__name__
__module____qualname____firstlineno__r=   intcallableboolr#   r   r;   r   rN   r   r]   __static_attributes__ r%   r"   r   r      s     ."&"#+   	
      0 7;$uy !3 !3C !3afglnqgqar !3  D  EH  JO  EO  P !3F+3 +U +&3 &5 &r%   r   c                      ^  \ rS rSrSSSSSSSSSSSSSS.S	\S
\S\S\S\S\\\4   S\S\S\S\S\S\S\	S\	4U 4S jjjr
SS\S\S\\\4   4S jjrS\S\4S jrSrU =r$ ) NanoBananaToolY   r_   Nimager`   ra   Fr   r   r   r   r(   r   r   r   namespecinstruction
is_dynamicr   r   r   r   r   r   r(   r   r   r   rp   rq   rr   rs   r   c                   > [        UUUUUUUU	US9	U l        X`l        Xl        [        TU ]  U
=(       d    SU=(       d     SU
=(       d    SSSSSS.SS	S.S
.S/S.S.S.U R                  UUS9  g )N)	r   r   r   r   r   r   r   r   r   rN   functionzGenerate image by given prompt.objectstringzPrompt to generate image.)typedescriptionzURI for reference image.)r'   reference_image_urir'   rx   
propertiesrequiredrp   ry   
parametersrx   ru   )rp   rq   funcrr   rs   )r   r   r(   r   superr#   rN   r!   r   r   r   r   r   r(   r   r   r   rp   rq   rr   rs   r   	__class__s                  r"   r#   NanoBananaTool.__init__Z   s    $ %)1!

  /
)) " 4$4#D (/7Hc&d<DUo3p' &.J# $$#!' 	 	
r%   r'   rz   r)   c                 8  #     U=(       d    U R                   nU R                  R                  XS9I S h  vN u  pEU R                  R                  XE5      I S h  vN   SU0$  N- N
! [         a&  n[
        R                  SU 35        SS0s S nA$ S nAff = f7f)N)r'   r(   r&   zError at generate_image: errorzError at generate_image.)r(   r   rN   r   rJ   loggerr   )r!   r'   rz   r(   rP   rQ   exs          r"   rN   NanoBananaTool.generate_image   s     		91IT5I5IO$(OO$B$B %C % OB //,,R===##	 > 	9LL4RD9:788	9sV   B1A' A#$A' A%A' "B#A' %A' '
B1BBBBBrP   c                 T   #    U R                   R                  U5      I S h  vN $  N7fN)r   r]   )r!   rP   s     r"   r   NanoBananaTool.get_image   s      __//3333s   (&()r   r   r(   r   )rb   rc   rd   re   r=   rf   r   r;   rg   rh   r#   r   rN   r   ri   __classcell__r   s   @r"   rl   rl   Y   s   
 ."& -1"#+ !4
 4
 	4

  4
 4
 4
 ucz*4
 4
 4
 4
 4
 4
 4
 4
  !4
 4
l
93 
9S 
9TXY\^aYaTb 
94# 4% 4 4r%   rl   c                      ^  \ rS rSrSSSSSSSSSSSSSS.S	\S
\S\S\S\S\\\4   S\S\S\S\S\S\S\	S\	4U 4S jjjr
S\S\S\S\\\4   4S jrSrU =r$ )NanoBananaSelfieTool   r_   Nselfier`   ra   Fro   r   r   r   r   r   r(   r   r   r   rp   rq   rr   rs   r   c                   > [         TU ]  UUU=(       d    SUUUUUU	U
=(       d    SU=(       d"    SU
=(       d    SSSSS0SS0SS0S./ SQS	.S
.S.UUUS9  U R                  U l        g )Na  You are the selfie generator.

Please update the selfie image of the given character in the given situation according to the following rules.

## Rules

- Keep the selfie composition.
- Do not output smartphones or cameras. We want to output an image taken by the character themselves.
generate_selfieru   z*Generate selfie image by given situations.rv   rx   rw   )face_expressionclothlocation_backgroundr{   r~   r   )r   r   r   r   r   r(   r   r   r   rp   rq   rr   rs   r   )r   r#   r   r   r   s                  r"   r#   NanoBananaSelfieTool.__init__   s    $ 	)1   6  +!** " 5$5#O (06/A&,h%74:H3E'
 %X#  $!K 	 &	
N ((	r%   r   r   r   r)   c                    #     SU SU SU S3nU R                   (       a  [        R                  SU 35        U R                  U5      I S h  vN nSUS   0$  N! [         a&  n[        R                  SU 35        S	S
0s S nA$ S nAff = f7f)Nz:Modify this selfie image:

            - face expression: z
            - cloth: z$
            - location background: z
            zPrompt for selfie: 	selfie_idr&   zError at generate_selfie: r   zError at generate_selfie.)r   r   inforN   rJ   r   )r!   r   r   r   r'   resultr   s          r"   r   $NanoBananaSelfieTool.generate_selfie   s     	:  /0 1W $$7#8 9	F zz1&:;..v66F
!344 7 	:LL5bT:;899	:sG   BA	A A
A BA 
B%B BBBB)r   )rb   rc   rd   re   r=   rf   r   r;   rg   rh   r#   r   r   ri   r   r   s   @r"   r   r      s    
 ."&!-1"#+ !9) 9) 	9)
  9) 9) 9) ucz*9) 9) 9) 9) 9) 9) 9) 9)  !9) 9)v:S : :[^ :cghkmphpcq : :r%   r   )rH   loggingr   typingr   r   r   pathlibr   uuidr   rU   googler	   google.genair
   aiavatar.sts.llmr   rb   r   r   rl   r   rj   r%   r"   <module>r      sW      % %      !	8	H& H&VD4T D4NJ:> J:r%   