
    љi;d                     >   S SK JrJr  S SKrS SKrS SKrS SKrS SKrS SKJ	r	J
r
JrJrJrJrJrJr  SSKJrJr  \R(                  " \5      r " S S5      r " S S	5      r " S
 S5      r " S S\5      r " S S5      r " S S5      r " S S\5      r " S S\5      rg)    )ABCabstractmethodN)AsyncGeneratorListDictAnyCallableOptionalTupleLiteral   )ContextManagerSQLiteContextManagerc                   .    \ rS rSrSS\S\S\4S jjrSrg)	ToolCallResult   Ndatais_finaltextc                 <    U=(       d    0 U l         X l        X0l        g Nr   r   r   )selfr   r   r   s       O/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/llm/base.py__init__ToolCallResult.__init__   s    JB	 	    r   )NTN)	__name__
__module____qualname____firstlineno__dictboolstrr   __static_attributes__ r   r   r   r      s!    T D s  r   r   c            	       8    \ rS rSrS
S\S\S\S\4S jjrS rS	r	g)ToolCall   Nidname	argumentsresultc                 X    Xl         X l        X0l        U=(       d
    [        5       U l        g r   )r*   r+   r,   r   r-   )r   r*   r+   r,   r-   s        r   r   ToolCall.__init__   s     	"0 0r   c                     U R                   U R                  U R                  U R                  R                  U R                  R
                  S.S.$ )Nr   r   )r*   r+   r,   r-   )r*   r+   r,   r-   r   r   r   s    r   to_dictToolCall.to_dict   s=    ''II#{{//T[[=Q=QR	
 	
r   )r,   r*   r+   r-   )NNNN)
r   r   r    r!   r$   anyr   r   r3   r%   r&   r   r   r(   r(      s)    13 1S 1C 1Xf 1
r   r(   c            	       8    \ rS rSrS
S\S\S\S   S\4S jjrS	rg)GuardrailRespose$   Nguardrail_nameis_triggeredaction)replaceblockr   c                 4    Xl         X l        X0l        X@l        g r   )r9   r:   r;   r   )r   r9   r:   r;   r   s        r   r   GuardrailRespose.__init__%   s    ,(	r   )r;   r9   r:   r   )r<   N)	r   r   r    r!   r$   r#   r   r   r%   r&   r   r   r7   r7   $   s/    s $ PbHc wz  r   r7   c                   z    \ rS rSrSS\S   S\4S jjr\SS\S\S	\S
\\	\\4      S\	\\
4   S\4S jj5       rSrg)	Guardrail,   N
applies_to)requestresponsebothr+   c                 X    Xl         U=(       d    U R                  R                  U l        g r   )rC   	__class__r   r+   )r   rC   r+   s      r   r   Guardrail.__init__-   s    $3DNN33	r   
context_iduser_idr   filessystem_prompt_paramsreturnc                    #    g 7fr   r&   r   rJ   rK   r   rL   rM   s         r   applyGuardrail.apply1           )rC   r+   r   NN)r   r   r    r!   r   r$   r   r   r   r   r5   r7   rQ   r%   r&   r   r   rA   rA   ,   s    47+H#I 4QT 4 c C s 4PTUXZ]U]P^K_   C  DG  IL  DL  M   Yi  r   rA   c                   :    \ rS rSrSS\S\S\S\S\S\4S	 jjrS
rg)LLMResponse6   NrJ   r   
voice_text	tool_callguradrail_name
error_infoc                 `    Xl         X l        X0l        X@l        XPl        U=(       d    0 U l        g r   )rJ   r   rY   rZ   r[   r\   )r   rJ   r   rY   rZ   r[   r\   s          r   r   LLMResponse.__init__7   s(    $	$",$*r   )rJ   r\   r[   r   rZ   rY   )NNNNN)	r   r   r    r!   r$   r(   r"   r   r%   r&   r   r   rW   rW   6   sA    +3 +c +c +]e +  B +  W[ + +r   rW   c                       \ rS rSrSS\S\\\4   S\S\S\4
S jjr	S\\\4   S	\
\\\\\4   4   4S
 jrS\S\S\S\S	\\\4   4
S jrS\S	S 4S jrS rSrg)Tool@   Nr+   specfuncinstruction
is_dynamicc                 @    Xl         X l        X0l        X@l        XPl        g r   )r+   rb   rc   rd   re   )r   r+   rb   rc   rd   re   s         r   r   Tool.__init__A   s    			&$r   rN   c                    UR                  S5      S:X  a#  SU;   a  U R                  S   nUS   US   US   4$ SU;   a   U R                  S   S   nUS   US   US   4$ SU;   a  US   US   US   4$ [        S	U 35      e)
Ntypefunctionr+   description
parametersfunctionDeclarationsr   input_schemazUnknown tool spec format: )getrb   
ValueError)r   rb   fs      r   
parse_specTool.parse_specH   s    88Fz)jD.@		*%AV9a.,??#t+		01!4AV9a.,??t#<m!4d>6JJJ5dV<==r   llm_service_namerk   rl   c                     SUR                  5       ;   a	  SUUUS.S.$ SUR                  5       ;   a	  SUUUS./0$ SUR                  5       ;   a  UUUS.$ [        S	U 35      e)
Ngptrj   )r+   rk   rl   )ri   rj   geminirm   claude)r+   rk   rn   zUnknown LLM service: )lowerrp   )r   rt   r+   rk   rl   s        r   
build_specTool.build_specT   s    $**,," #.",  )//11& #.",* )  )//11* *  01A0BCDDr   c                     [         R                   " U 5      nU R                  U R                  5      u  p4nU R                  XXE5      Ul        U$ r   )copyrr   rb   rz   )r   rt   toolndps         r   	clone_forTool.clone_foro   s=    yy//$)),aOO$4>	r   c                 n    UR                  U R                  U R                  U R                  S   S   S9  g )Nrj   rk   )fnr+   rk   )add_toolrc   r+   rb   )r   
mcp_servers     r   add_to_mcp_serverTool.add_to_mcp_serveru   s4    yy		*-m< 	 	
r   )rc   rd   re   r+   rb   )NF)r   r   r    r!   r$   r   r   r	   r#   r   r   rr   r"   rz   r   r   r%   r&   r   r   r`   r`   @   s    %S %S#X %h %UX %mq %
>tCH~ 
>%S$sCx.8P2Q 
>E3 Ec E EY] Ebfgjlogobp E6# & 
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\\   S\S\	S\S\	S\
S\\   S\\   S\S\	4S jjrS\4S jrS\S\4S jrS rS rS rSCS \S!\	S"\	4S# jjrS$ rS% rS&\\   4S' jrS( rS) rS* rS+ rS,\S-\S.\\\4   4S/ jr\\ S\4S0 j5       5       r!\ SDS,\S-\S1\S2\\\\4      S.\\\4   S\\   4S3 jj5       r"\ S,\S-\S4\\   S5\4S6 j5       r#SES4\\   S7\\\4   S\\\\4      4S8 jjr$\ SES,\S-\S4\\   S.\\\4   S\%\&S4   4
S9 jj5       r'S1\S\4S: jr(S;\S<\S7\S\%\)S4   4S= jr*SDS>\+S?   S,\S-\S1\S2\\\\4      S.\\\4   S\,4S@ jjr-SDS,\S-\S1\S2\\\\4      S.\\\4   S\%\&S4   4SA jjr.SBr/g)F
LLMService}         ?N2   TFaiavatar.db)temperature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
guardrailsdb_connection_strdebugsystem_promptmodelr   r   r   r   r   r   r   r   r   r   r   r   r   c          	      
   Xl         U R                  U l        X l        X0l        X@l        U=(       d    / SQU l        U=(       d    SS/U l        Xpl        Xl	        SR                  S [        U R                  [        SS9 5       5      U l        [        U R                  [        SS9 Vs/ s HH  nUR                  S5      (       a  [        R                   " U5      O[        R                   " U5       S	3PMJ     snU l        S
SR                  U R"                  5       SSR                  U R"                  5       S3U l        S U l        S U l        Xl        0 U l        Xl        SU l        SU l        U R4                  U l        U R8                  U l        U(       a  Xl        O6UR?                  S5      (       a  SSK J!n  U" US9U l        O[E        US9U l        Xl#        U=(       d    / U l$        S U l%        S U l&        Xl'        g s  snf )N)u   。u   ？u   ！z. ?!
u   、z, |c              3   N   #    U  H  n[         R                  " U5      v   M     g 7fr   reescape.0chars     r   	<genexpr>&LLMService.__init__.<locals>.<genexpr>   s      ,
(WBIIdOO(W   #%Tkeyreverse \s?(
)\s*(?!.*())a  

## Important: Use of `{dynamic_tool_name}`

When external tools, knowledge, or data are required to process a user's request, use the appropriate tools.  

Examples where external tools are needed:

- Performing web searches
- Retrieving weather information
- Retrieving memory from past conversations
- Playing game
- Any other cases that requires accessing real-world systems or data to provide better solutions

**NOTE**: Say something before execute tool. (e.g. I will look it up on the web. Wait a moment.)

a:  
----
Extract up to five tools that could be used to process the above user input.
The response should follow this format. If multiple tools apply, separate them with commas.

[tools:{tool_name},{tool_name},{tool_name}]

If none apply, respond as follows:

[tool_name:NOT_FOUND]

The list of tools is as follows:

zpostgresql://r   )PostgreSQLContextManager)connection_str)db_path)(r   get_system_prompt_default_get_system_promptr   r   r   r   r   r   r   joinsortedlensplit_chars_patternendswithr   r   option_split_patternsoption_split_chars_regex_request_filter_update_context_filterr   toolsr   dynamic_tool_instruction"additional_prompt_for_tool_listingget_dynamic_tools_default_get_dynamic_toolson_before_tool_calls_default_on_before_tool_callsr   
startswithcontext_manager.postgresr   r   r   r   _print_chat	_on_errorr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                     r   r   LLMService.__init__~   s   & +"&"@"@
& 0&U*U"4"E&<#%:"#&88 ,
(.t/?/?SRV(W,
 $
  t66CN&
N  $}}S11BIIdO"))D/9J$7OON&
"
 3345[$JdJdAe@ffhi 	%  $&*#,&(
!2)%"3/ #'"@"@%)%F%F"#2  ++O<<N'?O`'a$';DU'V$"4$*
u&
s   )AH rN   c                     U R                   U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  U R                  S.$ )Nr   r   r   r   r   r   r   r   r   r   r   r   r2   s    r   
get_configLLMService.get_config   sk    !//ZZ++++"&"9"9&*&A&A%)%?%?"11 $ 5 5!%!7!7ZZ
 	
r   configc           	         U R                  5       R                  5       n0 nUR                  5        H"  u  pEUc  M
  XB;  a  M   [        XU5        XSU'   M$     SU;   a4  SR                  S [        U R                  [        SS9 5       5      U l	        SU;   a  [        U R                  [        SS9 Vs/ s HH  nUR                  S5      (       a  [        R                  " U5      O[        R                  " U5       S3PMJ     snU l        S	SR                  U R                  5       S
SR                  U R                  5       S3U l        U$ ! [         a     GM(  f = fs  snf )Nr   r   c              3   N   #    U  H  n[         R                  " U5      v   M     g 7fr   r   r   s     r   r   (LLMService.set_config.<locals>.<genexpr>   s      0,[D		$,[r   Tr   r   r   r   r   r   r   )r   keysitemssetattr	Exceptionr   r   r   r   r   r   r   r   r   r   r   )r   r   allowed_keysupdatedkvr   s          r   
set_configLLMService.set_config   sO   (--/LLNDAy$#
 # G#'*xx 0,243C3CVZ,[0 (D$  7* #4#:#:TR*RD $(==#5#5		$biio=Nd;SSR*D&
 CHHT7789SXXdNhNhEiDjjlm ) #  *s   E2AE
EEc                     Xl         U$ r   )r   r   rc   s     r   request_filterLLMService.request_filter	  s    #r   c                     Xl         U$ r   )r   r   s     r   update_context_filter LLMService.update_context_filter  s    &*#r   c                     S nU$ )Nc                     U $ r   r&   )rc   s    r   	decorator"LLMService.tool.<locals>.decorator  s    Kr   r&   )r   rb   r   s      r   r~   LLMService.tool  s    	r   r~   re   use_originalc                     U(       a  UnO+UR                  U R                  R                  5      nX$l        X@R                  UR
                  '   g r   )r   rH   r   re   r   r+   )r   r~   re   r   tool_to_adds        r   r   LLMService.add_tool  s:    K..)@)@AK%/"'2

;##$r   c                    #    Xl         U$ 7fr   )r   r   s     r   get_dynamic_toolsLLMService.get_dynamic_tools  s     "&s   	c                     Xl         U$ r   )r   r   s     r   on_before_tool_callsLLMService.on_before_tool_calls"  s    %)"r   
tool_callsc                    #    g 7fr   r&   )r   r   s     r   r   'LLMService.on_before_tool_calls_default&  s     rT   c                     Xl         U$ r   )r   r   s     r   
print_chatLLMService.print_chat)  s    r   c                     Xl         U$ r   )r   r   s     r   on_errorLLMService.on_error-  s    r   c                 F    [         R                  " U R                  SU5      $ )N\1|)r   subr   )r   originals     r   replace_last_option_split_char)LLMService.replace_last_option_split_char1  s    vvd33VXFFr   c                     Xl         U$ r   )r   r   s     r   get_system_promptLLMService.get_system_prompt4  s    "&r   rJ   rK   rM   c                 h   #    U(       d  U R                   $ U R                   R                  " S0 UD6$ 7f)Nr&   )r   format)r   rJ   rK   rM   s       r   r   $LLMService.get_system_prompt_default8  s/     #%%%%%,,D/CDDs   02c                     g r   r&   r2   s    r   dynamic_tool_nameLLMService.dynamic_tool_name>  s     	r   r   rL   c                    #    g 7fr   r&   rP   s         r   compose_messagesLLMService.compose_messagesC  rS   rT   messagesresponse_textc                    #    g 7fr   r&   r   rJ   rK   r  r  s        r   update_contextLLMService.update_contextG  rS   rT   metadatac                    #    / $ 7fr   r&   )r   r  r  s      r   r   $LLMService.get_dynamic_tools_defaultK  s
     	s   c                    #    g 7fr   r&   )r   rJ   rK   r  rM   s        r   get_llm_stream_response"LLMService.get_llm_stream_responseN  rS   rT   c                 Z    Un[         R                  " SSU5      nUR                  5       nU$ )Nz\[(\w+):([^\]]+)\] )r   r  strip)r   r   
clean_texts      r   remove_control_tagsLLMService.remove_control_tagsR  s.    
VV12zB
%%'
r   r+   r,   c                Z  #    U R                   U   nS[        R                  " UR                  5      R                  ;   a  X2S'   UR                  " S0 UD6n[        R
                  " U5      (       a  U  S h  vN n[        U[        5      (       a  [        US   US   S97v   M3  [        U[        5      (       a  [        USS97v   MW  [        U[        5      (       a  [        USS97v   M{  U7v   M  [        U[        5      (       a  U7v   g [        UI S h  vN S97v   g  N
 g  N7f)	Nr  r   r   r1   F)r   r   )r   r&   )r   inspect	signaturerc   rl   
isasyncgen
isinstancer   r   r"   r$   )r   r+   r,   r  r~   tool_resultrs          r   execute_toolLLMService.execute_toolX  s     zz$**4995@@@$,j!ii,),k**& aa''(adQqTBB4(((a%@@3''(a%@@G^44 K&788; '8s7   A1D+3D'7D%8D';BD+D)
D+%D''D+rC   )rD   rE   c                   #    U R                    Vs/ s H  owR                  US4;   d  M  UPM     nnU(       Gaj  U Vs/ s H*  n[        R                  " UR	                  UUUUUS95      PM,     n	n [        R
                  " U	5       H  n
U
I S h  vN nUR                  (       d  M   [        R                  SU SUR                   SUR                   SUR                   35        Us  U	 H*  n
U
R                  5       (       a  M  U
R                  5         M,     U	 H%  n
U
R                  5       (       a  M   U
I S h  vN   M'     $    U	 H*  n
U
R                  5       (       a  M  U
R                  5         M,     U	 H%  n
U
R                  5       (       a  M   U
I S h  vN   M'     g g s  snf s  snf  GN Nu! [        R                   a     M  f = f N4! [        R                   a     Mn  f = f! U	 H*  n
U
R                  5       (       a  M  U
R                  5         M,     U	 HA  n
U
R                  5       (       a  M   U
I S h  vN    M(  ! [        R                   a     M?  f = f   f = f7f)NrF   )rJ   rK   r   rL   rM   zGuardrail for z 'z' triggered: action=z, text=)r   rC   asynciocreate_taskrQ   as_completedr:   loggerwarningr9   r;   r   donecancelCancelledError)r   rC   rJ   rK   r   rL   rM   grr   taskstaskgrresps               r   apply_guardrailsLLMService.apply_guardrailsm  s=    #'??\?Rmm
TZG[6[b?
\ ( (r ##BHH)#)= %- %  (  #007D#'ZF!.. NN(Bv7L7L6MMabhboboappwx~  yD  yD  xE  F "M "D99;; " "Dyy{{ "

 " 8 "D99;; " "Dyy{{ "

 " I ] (" #"11  #"11  "D99;; " "Dyy{{ "

"11  "s  I(F%F%I(1F*/I(2G, F/AG, *I(0I(7F4<F2=F4I(G, I($0I(GGGI(/G, 2F44GI(GI(GG)%I((G))I(,I%	0I%:I?I
 II%I	I%I	I%%I(c           	      
  ^ ^^^#    T R                   (       a  T R                  SXX45        O[        R                  SU 35        T R                  (       a)  T R                  U5      n[        R                  SU 35        U(       d  U(       d  g T R	                  SUUUUUS9I S h  vN =n(       aj  UR
                  S:X  a  UR                  nOMUR
                  S:X  a=  [        UUR                  T R                  UR                  5      UR                  S97v   g T R                  XX4U5      I S h  vN n[        U5      S	-
  nS
n	S
n
SmST R                   S3mST R                   S3mS[        S[        [           4UU UU4S jjnT R                  XXu5        S h  vN nUR                   (       a1  T R"                  (       a  T R#                  U5      I S h  vN   U7v     g UR$                  (       as  U	(       a  U" U	5      n[        XU5      7v   X-  n
S
n	U7v   UR$                  R&                  T R(                  :X  a$  [        R                  ST R(                   35        S
n
M  XR                  -  n	[*        R,                  " ST R.                   S3SU	5      n	T R0                  (       a  [*        R,                  " SSU	5      n	[        T R                  U	5      5      T R2                  :  a  T R5                  U	5      n	U	R7                  S5      n[        U5      S	:  a_  UR9                  S5      nSR;                  U5      n	U" U5      n[        XU5      7v   X-  n
U	R7                  S5      n[        U5      S	:  a  M_  [<        R>                  " S5      I S h  vN   GM   GN GNq GN GN N
 U	(       a  U" U	5      n[        XU5      7v   X-  n
T R                  (       a8  T R                  U
;  a(  T R                  U
5      =n(       a  [        US
U5      7v   T R	                  SUUU
S9I S h  vN  =n(       a<  [        UUR                  T R                  UR                  5      UR                  S97v   T R                   (       a  T R                  SXU
S 5        O[        R                  SU
 35        [        U5      U:  a:  T RA                  UUXx[        U5      -
  S  U
RC                  5       5      I S h  vN    g g 7f)NuserzUser: zUser(Filtered): rD   )rC   rJ   rK   r   rL   rM   r<   r=   )rJ   r   rY   r[   r   r   F<>z</segmentrN   c                    > TR                   (       d  TR                  U 5      $ TU ;   aK  TU ;   aE  SmU R                  T5      nU R                  T5      nX[        T5      -   U nTR                  U5      $ TU ;   a4  SmU R                  T5      nX[        T5      -   S  nTR                  U5      $ TU ;   a2  T(       a)  SmU R                  T5      nU S U nTR                  U5      $  g T(       a  TR                  U 5      $ g )NFT)r   r#  findr   )rA  start_index	end_indexvoice_segmentin_voice_tagr   
target_endtarget_starts       r   to_voice_text-LLMService.chat_stream.<locals>.to_voice_text  s   &&//88 w&:+@$%ll<8#LL4	 'c,6G(G S//>>(#%ll<8 'c,6G(G(H I//>>w&#(L 'Z 8I$+JY$7M33MBB	    //88r   zself.dynamic_tool_name: z((z)+)r  z(?=\[\w+:[^\]]+\])r   r   gMbP?rE   )rC   rJ   rK   r   aizAI: )"r   r2  infor   r;  r;   r   rW   r#  r9   r  r   r   r$   r
   r  r\   r   rZ   r+   r  r   r  r   r   r   r  splitpopr   r/  sleepr  r!  )r   rJ   rK   r   rL   rM   request_guardrail_responser  message_length_at_startstream_bufferr  rJ  chunkrY   segmentssentenceresponse_guardrail_responserG  rH  rI  s   `                @@@r   chat_streamLLMService.chat_stream  s    VZ$FKK&(''-DKK*4&12E 04/D/D !!5 0E 0
 *
 
% 
 *00I=166+22g=!)388#778R8W8WX#=#L#L	  ..zDQeff"%h-!"34../q1$--.a0
	3 	8C= 	 	<  77
Xl ,	'%>>../// !.}!=J%jLL!2M$&M??''4+A+AAKK":4;Q;Q:R ST$&MZZ'M FFR(@(@'A#Ev}]M )) "'<c= Q4++M:;d>Y>YY $ C CM R$**3/Hh-!##<<? # 2*84
!*
CC)(..s3 h-!# --&&&O*
& gP,	' 0R 'Y m\ &}5JjDD*M4#6#6m#K!55mDDzD!*b*== 150E0E!!	 1F 1
 +
 +
 
& 
 %055334O4T4TU:II	  T:tLKK$}o./x=22%%3x=@AB##%	   3s   BS>$N%BS>0N!1A(S>N,N$N,!7S>N'F"S>=S>N*S>!S>$N,'S>*S>,BS>-P0.CS>6S97S>)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )FFrU   r   )0r   r   r    r!   r$   floatr   r"   intr#   r   rA   r   r   r   r   r   r~   r`   r   r   r   r(   r   r   r   r  r  r   r5   r   propertyr   r  r  r  r   r   rW   r  r#  r   r,  r   r7   r;  rX  r%   r&   r   r   r   r   }   s    !'+!%(,&(&*""'*.(,&*!.#[ [ 	[
 [ t*[ #Y[ !I[ !$[  $[ [  [ ([ !I[ O[  ![" #[z
D 
 $ >
3T 3t 34 3T(^ GE# E Ecghkmphpcq E 3     s # VZ[_`ceh`h[iVj   JN  OR  TW  OW  JX   dh  im  dn   s S DQUJ gj  T
 dSVX[S[n hlmqruwzrzm{h|   c UYZ^U_ w{|  BE  }E  xF   R`  al  nr  ar  Rs    9s 9t 9t 9P^_mos_sPt 9*%9N1O %]` %kn %vy %  CG  HL  MP  RU  MU  HV  CW %  vz  {~  @C  {C  vD %  P` %NXC X# XS XQUVZ[^`c[cVdQe X  EI  JM  OR  JR  ES X  _m  ny  {  n  _@ X X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\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S j5       rS)S\S\S \S!\\\\4      S"\\\4   S\\   4S# jjrS\S\S$\\   S
\4S% jrS)S\S\S$\\   S"\\\4   S&\\\\4      S\\S4   4S' jjrS(rU =r$ )*LLMServiceDummyi/  Ng        r   r   TFr   )r  wait_secr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r_  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                R   > [         TU ]  UUUUUUU	U
UUUUUUS9  Xl        X l        g )N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )superr   r  r_  )r   r  r_  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rH   s                     r   r   LLMServiceDummy.__init__0  sN    * 	'#-#1#9"7)/+1/ 	 	
  + r   rN   c                     g)N
dummy_toolr&   r2   s    r   r  !LLMServiceDummy.dynamic_tool_nameX  s    r   rJ   rK   r   rL   rM   c                   #    / nU R                  XU5      I S h  vN =n(       a  UR                  SUS.5        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        U(       aW  / n	U H3  n
U
R                  S5      =n(       d  M  U	R                  SSU0S	.5        M5     U(       a  U	R                  S
US.5        OUn	UR                  SU	S.5        U$  GNN N7f)Nsystemrolecontent)rJ   r   ri  r>  url	image_url)ri   rl  r   )ri   r   )	r   appendr   extendr   get_historiesr   rO  ro   )r   rJ   rK   r   rL   rM   r  r   	historiesrj  rq   rk  s               r   r   LLMServiceDummy.compose_messages]  sJ    "&"9"9*Oc"ddd=dOOX-HI   OOD112 ..<<AEAXAX
|d&=&==^h = 
 
	 IaL0F:MM! IaL0F:	"G%%,&3&NNKucl#ST  =>GG<=5 e
s/   E-E(BE-#E+$;E-!5E-AE-+E-r  c                   #    U R                   (       a  [        US   S   [        5      (       a9  SUS   S   S   ;   a)  U R                  US   S   S   S   5      US   S   S   S'   O8[        US   S   [        5      (       a  U R                  US   S   5      US   S'   UR	                  SUS.5        U R
                  R                  XS5      I S h  vN   g  N7f)Nr   rj  r   	assistantrh  dummy)r   r)  listr$   rm  r   add_historiesr  s        r   r  LLMServiceDummy.update_context{  s     &&(1+i0$77Xa[3B779=9T9TU]^_U`ajUklnUopvUw9xHQK	*2.v6HQK	2C88)-)D)DXa[QZE[)\I&GH""00wOOOs   CCCCr   c                   #    [         R                  " U R                  5      I S h  vN   [        UU R                  U R                  U R                  5      S97v   g  N67f)N)rJ   r   rY   )r/  rP  r_  rW   r  r#  )r   rJ   rK   r  rM   r   s         r   r  'LLMServiceDummy.get_llm_stream_response  sM     mmDMM***!##//0B0BC
 	
 	+s   $AA7A)r  r_  rU   )r   r   r    r!   r$   rZ  r   r"   r[  r#   r   rA   r   r\  r  r   r5   r  r  r   rW   r  r%   __classcell__)rH   s   @r   r^  r^  /  sb    "! '+!%(,&(&*""'*.(,&*!.'&! &! 	&!
 &! &! &! t*&! #Y&! !I&! !$&!  $&! &!  &! (&!  !I!&!" O#&!$ %&!& '&! &!P 3   s # VZ[_`ceh`h[iVj   JN  OR  TW  OW  JX   dh  im  dn <Ps PS PDQUJ Pgj P
 
c 
UYZ^U_ 
w{|  BE  }E  xF 
  VZ  [_  `c  eh  `h  [i  Vj 
  vD  EP  RV  EV  vW 
 
r   r^  )abcr   r   r/  r}   r&  loggingr   typingr   r   r   r   r	   r
   r   r   r   r   r   	getLoggerr   r2  r   r(   r7   rA   rW   r`   r   r^  r&   r   r   <module>r     s    #     	 V V V A			8	$ 
 
   + +:
 :
zo od\
j \
r   