
    љi4                         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JrJrJr  SSKJr  \" \5      r " S S	\5      rg)
    N)	getLogger)AsyncGeneratorDictList)AsyncAnthropic   )
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\\   S\S\	4"U 4S jjjrS\4U 4S jjr\S\4S j5       rS0S \S!\S"\S#\\\\4      S$\\\4   S\\   4S% jjrS \S!\S&\\   S'\4S( jrS)\4S* jrS1S&\\   S+\\\4   S\\\\4      4S, jjrS0S \S!\S&\\   S$\\\4   S-\\\\4      S\\S4   4S. jjrS/rU =r$ )2ClaudeService   Nzclaude-haiku-4-5g      ?i   2   TFzaiavatar.db)anthropic_api_keysystem_promptbase_urlmodeltemperature
max_tokens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!   r"   c                   > [         TU ]  U=(       d    SUUUUU	U
UUUUUUUS9  [        UUS9U l        X`l        SSSSSS	.SS
S	.S.SS/S.S.U l        g )N )r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   )api_keyr   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*   input_schema)super__init__r   anthropic_clientr   dynamic_tool_spec)selfr   r   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/claude.pyr2   ClaudeService.__init__   s    * 	'-2#-#1#9"7)/+1/ 	 	
  !/%!
 % ,|  !)'w
 !)'x	 &x0"
    returnc                 B   > [         TU ]  5       nU R                  US'   U$ )Nr   )r1   
get_configr   )r5   configr6   s     r7   r<   ClaudeService.get_configK   s#    #%#|r9   c                      U R                   S   $ )Nr/   )r4   )r5   s    r7   dynamic_tool_nameClaudeService.dynamic_tool_nameP   s    %%f--r9   
context_iduser_idtextfilessystem_prompt_paramsc                 j  #    / 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 H4  n	U	R                  S5      =n
(       d  M  UR                  SSU
S.S.5        M6     U(       a  UR                  S	US
.5        UR                  SUS.5        U$  N7f)N)rB   r   roleuserurlimage)r)   rJ   )r)   sourcerD   r)   rD   rH   content)r   extendr   get_historiesr    popgetappend)r5   rB   rC   rD   rE   rF   messages	historiesrO   frJ   s              r7   compose_messagesClaudeService.compose_messagesT   s       OOD112 ..<<AEAXAX
|d&=&==^h = 
 
	 IaL0F:MM! IaL0F:	"%%,&3&NNGVY?Z#[\  NNFD9:G<=!
s   A,D3.D1/;D3,5D3%AD3rU   response_textc                   #    U R                   (       a8  SUS   S   S   ;   a)  U R                  US   S   S   S   5      US   S   S   S'   UR                  SSUS./S.5        U R                  R                  XS5      I S h  vN   g  N7f)	NrD   r   rO   	assistantrM   rN   claude)_update_context_filterrT   r   add_histories)r5   rB   rC   rU   rZ   s        r7   update_contextClaudeService.update_contextn   s     &&!Y/33595P5PQYZ[Q\]fQghjQklrQs5tI&r*626S`:a9bcd""00xPPPs   BBB	Bspecc                    ^ ^ U U4S jnU$ )Nc                 B   > TS   n[        UTU S9TR                  U'   U $ )Nr/   )r/   rc   func)r   tools)rf   	tool_namer5   rc   s     r7   	decorator%ClaudeService.tool.<locals>.decoratorv   s/    VI$(%DJJy!
 Kr9    )r5   rc   ri   s   `` r7   toolClaudeService.toolu   s    	 r9   metadatac                    #    U R                   nU R                  R                  5        H(  u  pEUSUR                   SUR                  S    S3-  nM*     US-  nUS   S   n[        U[        5      (       aj  / nSnU HD  n	U	S	   n
U
S
:X  a%  U(       d  UR                  S
U	S
   U-   S.5        SnM3  UR                  U	5        MF     U(       d  UR                  S
US.5        O[        U[        5      (       a  Xc-   nU R                  R                  R                  US S SWS./-   US   U R                  SU R                  S9I S h  vN n[        R                  " SUR                   S   R"                  5      =n(       a  UR%                  S5      nOSn/ nUR'                  S5       HP  nU R                  R)                  UR+                  5       5      =n(       d  M5  UR                  UR                  5        MR     U$  N7f)Nz- z: r*   
z9- NOT_FOUND: Return this if no suitable tools are found.
r\   rO   Fr)   rD   rM   TrI   rN   r   g        )rU   systemr   r   r   z\[tools:(.*?)\]r   r   	NOT_FOUND,)"additional_prompt_for_tool_listingrg   itemsr/   rc   
isinstancelistrT   strr3   rU   creater   r   researchrO   rD   groupsplitrS   strip)r5   rU   rn   tool_listing_prompt_tuser_contentuser_content_for_tooltext_updatedccontent_typetool_choice_respmatch
tool_namesrg   rl   s                   r7   get_dynamic_tools_default'ClaudeService.get_dynamic_tools_default   s    "EEJJ$$&DARxr!&&2G1H#KK '[[  |I.lD))$&! L! y6),)00&!F)ViJi1jk#'L *003 "  %,,fFY-Z[c**$0$F! "&!6!6!?!?!F!Fcr]vBW&X%YYO,** "G "
 
 II02B2J2J12M2R2RSS5SQJ$J!!#&Azz~~aggi00t0TYY' ' '
s   EG>G<BG>"G>rg   c                  #    SnU(       aD  UnU H;  nU R                   R                  US   5      R                  =n	(       d  M4  Xi S3-  nM=     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    / nU R                  R                  R                  UU R                  XU5      I S h  vN U-   U R                  U R                   UU R"                  S9 IS h  vN n/ nSnSnU  S h  vN nUR$                  S:X  a  UR&                  R$                  S:X  a  UR)                  [+        UR&                  R,                  UR&                  R.                  S5      5        [1        US	S
97v   UR&                  R.                  U R                  :X  af  [2        R5                  S5        U R7                  USU R                  XU5      I S h  vN 05      I S h  vN n[2        R5                  SU 35        SnGM  GM  GM  UR$                  S:X  d  GM'  UR8                  R$                  S:X  aW  XR8                  R:                  -  nU(       a  US   S   S   S   S:w  a  GMu  [1        XR8                  R:                  S
97v   GM  UR8                  R$                  S:X  d  GM  US   =R<                  UR8                  R>                  -  sl        GM  s  snn
f  GN' GN GN GN GN

 S S S 5      IS h  vN    O! , IS h  vN  (       d  f       O= fW(       GaU  U RA                  U5      I S h  vN    [C        U5      nU GH  nU RD                  (       a"  [2        R5                  SUR.                   35        [1        UUS97v   UR<                  (       a!  [F        RH                  " UR<                  5      nO0 nS nUR.                  U R                  :X  a  U(       d  SS0nOU RK                  UR.                  USU05        S h  vN  nUUl&        UR:                  (       a  [1        UUR:                  S
97v   M;  [1        UUS97v   URN                  (       d  M[  URP                  n  O
 U RD                  (       a  [2        R5                  SU 35        U(       d  GM\  / nW(       a  UR)                  SUS.5        UR)                  SUR,                  UR.                  US.5        UR)                  S US!.5        UR)                  S"SUR,                  [F        RR                  " U5      S#./S!.5        GM     [C        U5      U:  d  W(       a$  U RU                  XX4US$9  S h  vN  nU7v   M  
 g g g 7f)%Nr$   r/   z

)r@   )rU   rq   r   r   rg   r   Fcontent_block_starttool_userp   )rB   rD   zGet dynamic toolr   zDynamic tools: Tcontent_block_delta
text_deltar\   rO   r   r)   tool_resultinput_json_deltaz
ToolCall: )rB   	tool_callmessagezNo tools foundrC   zToolCall result: rD   rM   )r)   idr/   inputr]   rN   rI   )r)   tool_use_idrO   )rF   rg   )+rg   rS   instructionr   r4   dynamic_tool_instructionformatr@   ru   
is_dynamicrc   r3   rU   stream_get_system_promptr   r   r   r)   content_blockrT   r   r   r/   r
   loggerinfo_get_dynamic_toolsdeltarD   	argumentspartial_json_on_before_tool_callslenr"   jsonloadsexecute_toolresultis_finaldatadumpsget_llm_stream_response)r5   rB   rC   rU   rF   rg   tool_instructionfiltered_toolsr   tir   stream_resp
tool_callstry_dynamic_toolsrZ   chunkmessages_lengthtcarguments_jsonr   trassistant_contentllm_responses                          r7   r   %ClaudeService.get_llm_stream_response   s#    "N#&	2>>>2>$$d3$ $ ##"445N#<<CC"&"8"8  D   261A1A1CX1C1<<faff1CX^\^N((118800FZ[[^nn**((  9 
 
 )+J %M* Me::!66**//:="))(53F3F3I3I5K^K^KcKceg*hi)ZdKK ..33t7M7MM"KK(:;373J3J (!08O8OPZey8z2z {4 .N #KK/.9I(JK04- N > ZZ#88{{''<7%)9)99 Xb\)%<Q%?%G=%X
 !"-++JZJZ"[[))-??"200EKK4L4LL00M Y \
M 3{.  +
 
 
 
 
 
L ,,Z888
 "(mO ::KK*RWWI 67!Z2FF<<%)ZZ%=N%'N"77d444)'02B&C$($5$5bgg~PY[bOc$d & &b$&	77"-"''"RR"-r"RR!{{{.0gg % %e ::KK"3K= AB;(*%$)00$*$12  &,, * ee "!/	.  OO +#4% 
 OO &$1+-55'+zz+'>% $% ] !n 8}.2C*.*F*Fdr +G + ' ', '&+ 3D s  >WA+W/L=
L=AWM
/WMW	M%MM	M!CM%8M9M%M5M% B	M%/M%=WW	MM%M%M%WM!W%M<+M.,M<8#WNCW-S1Q42S6AW=W
B>WWWWW)r3   r4   r   )NN)N)__name__
__module____qualname____firstlineno__rx   floatintr   dictboolr   r2   r<   propertyr@   r   anyrX   ra   rl   r   r   r
   r   __static_attributes____classcell__)r6   s   @r7   r   r      s    "&!' '+!%(,&(&*""'*.(,!.'<
 <
 	<

 <
 <
 <
 <
 t*<
 #Y<
 !I<
 !$<
  $<
 <
  <
  (!<
" !I#<
$ %<
& '<
 <
|D 
 .3 . . s # VZ[_`ceh`h[iVj   JN  OR  TW  OW  JX   dh  im  dn 4Qs QS QDQUJ Qgj Q	 	/T
 /dSVX[S[n /hlmqruwzrzm{h| /b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'r9   r   )r   loggingr   rz   typingr   r   r   	anthropicr   r$   r	   r
   r   r   r   r   r   r   r   rk   r9   r7   <module>r      s8      	 - - $ 5 5 +	8	_'J _'r9   