
    љi >                         S SK r S SKrS SKJr  S SK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JrJrJr  SSKJr  \" \5      r " S	 S
\5      rg)    N)	getLogger)AsyncGeneratorDictList)genai)types   )
LLMServiceLLMResponseToolCallTool)ContextManagerc            !         ^  \ 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\S\S\S\\   S\\   S\\   S\S\	S\S\	S\
S\\   S\S\	4 U 4S jjjrS\4U 4S jjrS\S\4S jr\S\4S  j5       rS3S!\S"\S#\S$\\\\4      S%\\\4   S\\   4S& jjrS!\S"\S'\\   S(\4S) jrS* rS+\4S, jrS4S'\\   S-\\\4   S\\\\4      4S. jjrS'\S\4S/ jrS3S!\S"\S'\\   S%\\\4   S0\\\\4      S\\S4   4S1 jjrS2rU =r$ )5GeminiService   Nzgemini-2.5-flashg      ?2   TFzaiavatar.db)gemini_api_keysystem_promptmodeltemperaturethinking_budgetinitial_messagessplit_charsoption_split_charsoption_split_thresholdsplit_on_control_tagsvoice_text_taguse_dynamic_toolscontext_managershared_context_idsdb_connection_strdebugr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   c                   > [         TU ]  UUUUUUU	U
UUUUUUS9  [        R                  " US9U l        XPl        SSSSSSS	.SS
S	.S.SS/S.S./0U l        g )N)r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   )api_keyfunctionDeclarationsexecute_external_toolz_Execute the most appropriate tool based on the user's intent: what they want to do and to what.objectstringzNWhat the user wants to interact with (e.g., long-term memory, weather, music).)typedescriptionzOThe type of operation to perform on the target (e.g., retrieve, look up, play).)targetactionr,   r-   )r*   
propertiesrequired)namer+   
parameters)super__init__r   Clientgemini_clientr   dynamic_tool_spec)selfr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   	__class__s                    Q/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/llm/gemini.pyr3   GeminiService.__init__   s    ( 	'#-#1#9"7)/+1/ 	 	
  #\\"
  / #/  A$ %-+{#
 %-+|#	# "*8 4& %"
    returnc                 B   > [         TU ]  5       nU R                  US'   U$ )Nr   )r2   
get_configr   )r7   configr8   s     r9   r>   GeminiService.get_configN   s&    #%$($8$8 !r;   urlc                   #    [         R                  " SS9 IS h  vN nUR                  U5      I S h  vN nUR                  5         UR                  sS S S 5      IS h  vN   $  NJ N3 N	! , IS h  vN  (       d  f       g = f7f)N   )timeout)httpxAsyncClientgetraise_for_statuscontent)r7   rA   clientresponses       r9   download_imageGeminiService.download_imageS   sY     $$R00F#ZZ_,H%%'## 100, 1000sT   BA&BA,A(A,B A*!B(A,*B,B2A53B?Bc                 ,    U R                   S   S   S   $ )Nr&   r   r0   )r6   )r7   s    r9   dynamic_tool_nameGeminiService.dynamic_tool_nameY   s    %%&<=a@HHr;   
context_iduser_idtextfilessystem_prompt_paramsc                   #    / nU R                   (       a  UR                  U R                   5        U R                  R                  U R                  (       a  U/U R                  -   OUS9I S h  vN nU(       a2  US   S   S:w  a&  UR                  S5        U(       a  US   S   S:w  a  M&  UR                  U5        / nU(       a  U H  n	U	R                  S5      =n
(       d  M  U
R                  S5      (       d  U
R                  S5      (       a  U R                  U
5      I S h  vN nO?U
R                  S5      (       a)  [        R                  " U
R                  S	S
5      S
   5      nW(       d  M  UR                  [        R                  R                  USS95        M     U(       a,  UR                  [        R                  R!                  US95        UR                  [        R"                  " SUS95        U$  GN N7f)N)rQ   r   roleuserrA   zhttp://zhttps://zdata:,r	   z	image/png)data	mime_typerS   rW   parts)r   extendr    get_historiesr!   poprG   
startswithrL   base64	b64decodesplitappendr   Part
from_bytes	from_textContent)r7   rQ   rR   rS   rT   rU   messages	historiesr^   frA   image_bytess               r9   compose_messagesGeminiService.compose_messages]   s       OOD112 ..<<AEAXAX
|d&=&==^h = 
 
	 IaL0F:MM! IaL0F:	"%%,&3&~~i00CNN:4N4N,0,?,?,D&D00&,&6&6syya7H7K&L"{UZZ%:%:!,&1 &; &   LL--4-896?@3
 'Es9   A,H.G=/;H,5H%A H%H &A	H3BH Hrk   response_textc           	        #    UR                  [        R                  " S[        R                  R	                  US9/S95        / nU H  nUR                  5       nUR                  S/ 5       HP  nUR                  S5      n	U	(       d  M  SU	;   d  M%  [        R                  " U	S   5      R                  S5      U	S'   MR     UR                  U5        M     U R                  (       a8  SUS	   S   S
   ;   a)  U R                  US	   S   S
   S   5      US	   S   S
   S'   U R                  R                  XS5      I S h  vN   g  N7f)Nr   r\   r]   r^   inline_datarZ   zutf-8rS   r   r   gemini)rf   r   rj   rg   ri   
model_dumprG   rc   	b64encodedecode_update_context_filterr    add_histories)
r7   rQ   rR   rk   rq   dict_messagesmdumpedpartrs   s
             r9   update_contextGeminiService.update_context   s,    75::;O;OUb;O;c:defA\\^F

7B/"hh}5;6[#8*0*:*:;v;N*O*V*VW^*_K' 0   (  &&q)'22668<8S8STabcTdelTmnpTqrxTy8za )"-f5""00HUUUs   BE	EB,E=E>Ec                    #    U R                   R                  R                  R                  U R                  SS9I S h  vN nU  S h  vN nM   N N
 [
        R                  S5        g 7f)Nzsay just "hello")r   contentszGemini client initialized.)r5   aiomodelsgenerate_content_streamr   loggerinfo)r7   stream_respchunks      r9   	preflightGeminiService.preflight   sd      ..2299QQ**) R 
 
 ' 	%
	;01s3   <A+AA+A	A
AA+AA+specc                    ^ ^ U U4S jnU$ )Nc                 N   > TS   S   S   n[        UTU S9TR                  U'   U $ )Nr&   r   r0   )r0   r   func)r   tools)r   	tool_namer7   r   s     r9   	decorator%GeminiService.tool.<locals>.decorator   s;    34Q7?I$(%DJJy!
 Kr;    )r7   r   r   s   `` r9   toolGeminiService.tool   s    	 r;   metadatac           
        #    U R                   nU R                  R                  5        H.  u  pEUSUR                   SUR                  S   S   S    S3-  nM0     US-  nUS   R
                  n/ nS	nU Hi  n	U	R                  (       aD  U(       d=  UR                  [        R                  R                  U	R                  U-   S
95        SnMX  UR                  U	5        Mk     U(       d,  UR                  [        R                  R                  US
95        S n
U R                  S:  a  [        R                  " U R                  S9n
U R                  R                  R                  R!                  U R"                  [        R$                  " US   SU
S9US S [        R&                  " SUS9/-   S9I S h  vN n[(        R*                  " SUR,                  S   R.                  R
                  S   R                  5      =n(       a  UR1                  S5      nOSn/ nUR3                  S5       HP  nU R                  R5                  UR7                  5       5      =n(       d  M5  UR                  UR                  5        MR     U$  N7f)Nz- z: r&   r   r+   
z6- NOT_FOUND: Use this if no suitable tools are found.
r   Fr\   Tr   r   g        )system_instructionr   thinking_configrX   r]   r   r?   r   z\[tools:(.*?)\]r	   	NOT_FOUNDrY   )"additional_prompt_for_tool_listingr   itemsr0   r   r^   rS   rf   r   rg   ri   r   ThinkingConfigr5   r   r   generate_contentr   GenerateContentConfigrj   research
candidatesrI   groupre   rG   strip)r7   rk   r   tool_listing_prompt_tuser_content_partsuser_content_parts_for_tooltext_updatedpr   tool_choice_respmatch
tool_namesr   r   s                   r9   get_dynamic_tools_default'GeminiService.get_dynamic_tools_default   sK    "EEJJ$$&DARxr!&&9O2PQR2STa2b1cce#ff 'XX &b\//&(##Avvl+225::3G3GQVVViMi3G3jk# ,2215 $ '..uzz/C/CI\/C/]^ 1$#22 $ 4 4O
 "&!3!3!7!7!>!>!O!O**00#+O#< /
 cr]emm1' &  "P "
 
 II02B2M2Ma2P2X2X2^2^_`2a2f2fgg5gQJ$J!!#&Azz~~aggi00t0TYY' ' /
s   F0J2J 3B(J"Jc                 L   [         R                  " U5      nU R                  nU H{  n[        U[        R
                  5      (       a  UR                  5       nOUnUS    H=  nUR                  S5      =n(       a  X7S'   UR                  S5      =n(       d  M9  X8S'   M?     M}     U$ )Nr^   function_callr0   function_response)copydeepcopyrO   
isinstancer   rj   ru   rG   )	r7   rk   renamed_messagesrO   messager{   r}   fcfrs	            r9   rename_tool_namesGeminiService.rename_tool_names   s    ==2 22'G'5==11&&('
/2222!2vJ"56626!2vJ	 # (  r;   r   c                Z  #    U R                   S:  a  [        R                  " U R                   S9nOS nSnU(       aJ  UnU HA  n	U R                  R	                  U	S   S   S   5      R
                  =n
(       d  M:  Xz S3-  nMC     OU R                  (       a1  U R                  /nU R                  R                  U R                  S9nOUU R                  R                  5        VV	s/ s H$  u  pU	R                  (       a  M  U	R                  PM&     sn	n=(       d    S nU R                  XU5      I S h  vN nU(       a  U(       a  X-   OUnU R                  R                   R"                  R%                  U R&                  [        R(                  " UU R*                  U[        R,                  " SS	9US
9U(       d"  U R                  (       a  U R/                  U5      OUS9I S h  vN n/ nSnSnU  S h  vN nUR0                  (       a(  UR0                  S   R2                  R4                  (       d  MD  UR0                  S   R2                  R4                   GH[  nUR6                  =n(       a:  UU-  nU(       a  US   R4                  S   R8                  c  MB  [;        UUS97v   MQ  UR<                  (       d  Md  UR?                  [A        UR<                  RB                  UR<                  RD                  [G        UR<                  RH                  5      5      5        [;        USS97v   UR<                  RD                  U R                  :X  d  M  [J        RM                  S5        U RO                  USU R                  XU5      I S h  vN 05      I S h  vN n[J        RM                  SU 35        SnGM^     GM  s  sn	nf  GN GN GN NB N7
 U(       Ga  U RQ                  U5      I S h  vN    [S        U5      nU GHm  nU RT                  (       a"  [J        RM                  SURD                   35        [;        UUS97v   S nURD                  U R                  :X  a  U(       d  SS0nOU RT                  (       aE  U V	s/ s H  oS   S   S   PM     Os  sn	f nn	[J        RM                  SURD                   SU 35        U RW                  URD                  URX                  SU05        S h  vN  nUUl-        UR6                  (       a  [;        UUR6                  S97v   M;  [;        UUS97v   UR\                  (       d  M[  UR^                  n  O
 U RT                  (       a  [J        RM                  SU 35        U(       d  GM  / nU(       a,  UR?                  [        R`                  Rc                  US95        UR?                  [        R`                  Re                  URD                  URX                  S95        UR?                  [        Rf                  " SUS95        UR?                  [        Rf                  " S[        R`                  Ri                  URD                  US 9/S95        GMp     [S        U5      U:  d  U(       a$  U Rk                  XX4US!9  S h  vN  nU7v   M  
 g g g 7f)"Nr   r    r&   r0   z

)rO   T)disable)r   r   r   automatic_function_callingr   r   Fr   )rQ   rS   r   zGet dynamic toolr   zDynamic tools: z
ToolCall: )rQ   	tool_callr   zNo tools foundzExecute tool: z
 / tools: rR   zToolCall result: r\   )r0   argsr   r]   rX   )r0   rK   )rU   r   )6r   r   r   r   rG   instructionr   r6   dynamic_tool_instructionformatrO   r   
is_dynamicr   _get_system_promptr5   r   r   r   r   r   r   AutomaticFunctionCallingConfigr   r   rI   r^   rS   r   r   r   rf   r   idr0   dictr   r   r   _get_dynamic_tools_on_before_tool_callslenr#   execute_tool	argumentsresultis_finalrZ   rg   ri   from_function_callrj   from_function_responseget_llm_stream_response)r7   rQ   rR   rk   rU   r   r   tool_instructionfiltered_toolsr   tir   r   r   
tool_callstry_dynamic_toolsrq   r   r}   rI   messages_lengthtctool_resultr   trmodel_partsllm_responses                              r9   r   %GeminiService.get_llm_stream_response   s    1$#22 $ 4 4O #O "N#*@(A!(DV(LMYYY2Y$$d3$ $ ##"445N#<<CC"&"8"8  D   261A1A1CX1C1<<faff1CX`\`N#'#:#::Pd#eeJ\!3!Fbr ..2299QQ**00#5 ,,$+0+O+OX\+] / >CtG]G]T++H5ck R 

 

 &(
!& 	1%##5+;+;A+>+F+F+L+L((+3399"ii'7'!W,M"!3!3A!6!H!H!P
 )ZgNN'''%%ht/A/A/D/DdFXFXF]F]_cdhdvdvd{d{_|&}~%$GG))..$2H2HH$67/3/F/F$,D4K4KJau4v.vw0 * on5E$FG,0)+ :1 Ye

	1* /w*' '4 ,,Z888
 "(mO ::KK*RWWI 67!Z2FF"77d444)'02B&CzzTb%cTbq(>&?&B6&JTb%c
%cnRWWIZ
|$TU$($5$5bggr||iY`Ma$b & &b$&	77"-"''"RR"-r"RR!{{{.0gg % %c ::KK"3K= AB;"$K$#**5::+?+?]+?+ST&&uzz'D'D"''XZXdXd'D'efOOEMM$)%  OOEMM#$zz@@bggXc@de% I !R 8}.2C*.*F*Fdr +G + ' ', '&+ 3Dc s   A5Z+;A+Z+&N:N:"Z+3O 4B/Z+#O$Z+0O4O5O8B?Z+;BZ+7Z+O	Z+O-Z+Z+O	Z+Z+Z+*O-+BZ+>RAZ+(U,S/-U1AZ+=Z+DZ+Z'ZZ'Z+)r6   r5   r   )NN)N)__name__
__module____qualname____firstlineno__strfloatintr   r   boolr   r3   r>   bytesrL   propertyrO   r   anyro   r~   r   r   r   listr   r   r   r   __static_attributes____classcell__)r8   s   @r9   r   r      s    #!' !'+!%(,&(&*""'*.(,!.%<
 <
 	<

 <
 <
 <
 t*<
 #Y<
 !I<
 !$<
  $<
 <
  <
 (<
  !I!<
" #<
$ %<
 <
|D 
$ $ $ I3 I I! !s !# !VZ[_`ceh`h[iVj !  JN  OR  TW  OW  JX !  dh  im  dn !FVs VS VDQUJ Vgj V 2	 	6T
 6dSVX[S[n 6hlmqruwzrzm{h| 6p $  4  $z' z'c z'UYZ^U_ z'w{|  BE  }E  xF z'  VZ  [_  `c  eh  `h  [i  Vj z'  vD  EP  RV  EV  vW z' z'r;   r   )rc   r   loggingr   r   typingr   r   r   googler   google.genair   rE   r   r
   r   r   r   r    r   r   r   r   r   r;   r9   <module>r      sA       	 - -    5 5 +	8	Z'J Z'r;   