
    ^h3                     "   S SK r S SKrS SKrS SKrS SKrS SKr\R                  " 5          \R                  " S5        S SKrSSS5        S SK	r	SSK
JrJr  SSKJr  SSKJr   " S S	\5      rS
\S\4S jr " S S5      rg! , (       d  f       NE= f)    Nignore   )sandwich_tokenstrim_messages)
strip_ansi   )Printerc                   4   ^  \ rS rSrS\SS4U 4S jjrSrU =r$ )AssistantError   argsreturnNc                     > [         TU ]  " U6   g N)super__init__)selfr   	__class__s     U/home/james-whalen/.local/lib/python3.13/site-packages/chatdbg/assistant/assistant.pyr   AssistantError.__init__   s    $     )__name__
__module____qualname____firstlineno__objectr   __static_attributes____classcell__)r   s   @r   r   r      s     f      r   r   sr   c                 x   ^ [        [        R                  5      mSR                  [	        U4S jU 5      5      nU$ )N c                    > U T;   $ r   r   )xprintable_charss    r   <lambda>,remove_non_printable_chars.<locals>.<lambda>   s
    qO/Cr   )setstring	printablejoinfilter)r    filtered_stringr%   s     @r   remove_non_printable_charsr.      s/    &**+Oggf%CQGHOr   c                       \ rS rSrSS\" 5       // SSS4S jrS rS rSS	 jrS
\	4S jr
S rS rS rS rS\	4S jrS
\	4S jrS
\	4S jrSS jrS rS rSrg)	Assistant   zgpt-4o   i   Fc	                 @  ^
 S[         l        U(       a  [        SS5      m
U
4S jU l        OS U l        X@l        0 U l        U H  n	U R                  U	5        M     X l        X0l        SUS./U l	        X`l
        Xl        U R                  5         U R                  SU5        g )NTzchatdbg.logwc                 @   > [        [        R                  " U SS9TSS9$ )N   )widthT)fileflush)printpprintpformat)model_call_dictlog_files    r   r&   $Assistant.__init__.<locals>.<lambda>1   s    5c:QU4r   systemrolecontenton_begin_dialog)litellmsuppress_debug_infoopen_logger_clients
_functions_add_function_model_timeout_conversation_max_call_response_tokens_stream_check_model
_broadcast)r   instructionsmodeltimeout	listeners	functionsmax_call_response_tokensdebugstreamfr>   s             @r   r   Assistant.__init__    s     '+#kC0HDL  DL!Aq!  '/LIJ)A&)<8r   c                 H    U R                   S :w  a  U R                  U5        g g r   )rH   )r   dicts     r   _logAssistant._logF   s    <<4LL  r   c                 &    U R                  S5        g )Non_end_dialog)rR   )r   s    r   closeAssistant.closeJ   s    (r   c                     SS K nUR                  [        U5      XR                  5      nSR	                  U5      nU R                  SU SU SU 35        g )Nr   r"   on_errorz


)	tracebackformat_exceptiontype__traceback__r+   rR   )r   emessagerh   tb_lines	tb_strings         r   _warn_about_exceptionAssistant._warn_about_exceptionM   sL    --d1gq//JGGH%	
witA3b$DEr   promptc                 X   SSS.n[         R                   " 5       nU R                  SX5         U R                  (       a  U R                  X5      nOU R	                  X5      n[         R                   " 5       U-
  nXSS'   U R
                  US'   SUS'   S	US
   S S3US'   U R                  SU5        U$ ! [        R                   a%  nU R                  US5        SU S3US'    SnANHSnAf[         a    SUS'    N\[         a%  nU R                  US5        SU S3US'    SnANSnAff = f)a?  
Send a query to the LLM.
  - prompt is the prompt to send.
  - user_text is what the user typed (which may or not be the same as prompt)

Returns a dictionary containing:
    - "completed":          True of the query ran to completion.
    - "cost":               Cost of query, or 0 if not completed.
Other fields only if completed is True
    - "time":               completion time in seconds
    - "model":              the model used.
    - "tokens":             total tokens
    - "prompt_tokens":      our prompts
    - "completion_tokens":  the LLM completions part
Fr   )	completedcoston_begin_querytimerT   Trt   z

[Cost: ~$ru   z.2fz USD]rm   z*Unexpected OpenAI Error.  Retry the query.z[Exception: ]N[Chat Interrupted]zUnexpected Exception.on_end_query)rw   rR   rP   _streamed_query_batch_queryrL   openaiOpenAIErrorrp   KeyboardInterrupt	Exception)r   rr   	user_textstatsstartelapsedrl   s          r   queryAssistant.queryT   s,     $Q/		(&<	3||,,V?))&<iikE)G#&M![[E'N!%E+!,U6]3,?uEE) 	. !! 	3&&q,VX!-aS2E)  	43E) 	3&&q,AC!-aS2E)	3s*   A1B3 3D)C''D);	D)D$$D)c                 D    US   (       a  [        5         g [        S5        g )Nrt   ry   )r:   )r   r   s     r   _reportAssistant._report   s    G&'r   c                 p    U R                    H&  n[        X1S 5      n[        U5      (       d  M!  U" U6   M(     g r   )rI   getattrcallable)r   method_namer   clientmethods        r   rR   Assistant._broadcast   s.    mmFV$7F $r   c           
         [         R                  " U R                  5      nUS   nU/ :w  a  [         R                  " U R                  5      u  p4  nUS:X  a-  [	        [
        R                  " SU R                   S35      5      e[	        [
        R                  " SU R                   SSR                  U5       S35      5      e [         R                  " U R                  5      (       d-  [	        [
        R                  " S	U R                   S
35      5      eg !   [	        [
        R                  " SU R                   S35      5      e= f)Nmissing_keysr}   z6                    You need an OpenAI key to use the z model.
                    You can get a key here: https://platform.openai.com/api-keys.
                    Set the environment variable OPENAI_API_KEY to your key value.zg                    You need to set the following environment variables
                    to use the z model: z, .z                    The zf model does not support function calls.
                    You must use a model that does, eg. gpt-4.z                ze does not appear to be a supported model.
                See https://docs.litellm.ai/docs/providers.)	rE   validate_environmentrL   get_llm_providerr   textwrapdedentr+   supports_function_calling)r   resultr   _providers        r   rQ   Assistant._check_model   sJ   --dkk:n-2 ' 8 8 EAA8#$OO77;{{m DSV  %OO  $}HTYY|5L4MQR 	44T[[AA$OO &?B  B	  <? s   AD /Ec                     [         R                  " UR                  5      nSU;   d   S5       eXS.U R                  US   '   g)zu
Add a new function to the list of function tools.
The function should have the necessary json spec as its docstring
namez(Bad JSON in docstring for function tool.)functionschemaN)jsonloads__doc__rJ   )r   r   r   s      r   rK   Assistant._add_function   sA    
 H,,-K!KK7?*Rv'r   r   c                    UR                   R                  n [        R                  " UR                   R                  5      nU R
                  U   nUS   " S0 UD6u  pV[        [        U5      R                  5       5      nU R                  SXV5        U$ ! [         a  nUeS nAf[         a"  nSU 3nU R                  SU5         S nAU$ S nAff = f)Nr   on_function_callzException in function call: on_warnr   )r   r   r   r   	argumentsrJ   r.   r   
expandtabsrR   r   r   )r   	tool_callr   r   r   callr   rl   s           r   
_make_callAssistant._make_call   s    !!&&	/::i00::;Dt,H#J/7$7LD/
60B0M0M0OPFOO.=  ! 	G 	/3A37FOOIv..		/s$   A:B 
CB  C-C

Cc                 b   SnU R                   R                  SUS.5         U R                  5       nU[        R                  " U5      -  nUR
                  S   R                  nU R                   R                  UR                  5       5        UR                  (       a  U R                  SUR                  5        UR
                  S   R                  S:X  a  U R                  U5        OOM  UUR                  R                  UR                  R                  UR                  R                  S.nU$ )Nr   userrA   on_response
tool_callsru   tokensprompt_tokenscompletion_tokens)rN   append_completionrE   completion_costchoicesrm   r   rC   rR   finish_reason%_add_function_results_to_conversationusagetotal_tokensr   r   )r   rr   r   ru   
completionresponse_messager   s          r   r|   Assistant._batch_query   s	   !!6f"EF))+JG++J77D)11!4<<%%&6&;&;&=>''/?/G/GH!!!$22lB::;KL "  &&33'--;;!+!1!1!C!C	
 r   c                    SnU R                   R                  SUS.5         U R                  SS9n U R                  S5        / n/ nU H  nU R	                  SU05        UR                  U5        UR
                  S   R                  R                  S :w  a5  U R                  SUR
                  S   R                  R                  5        M  UR                  U5        M     U R                  S	5        [        R                  " XPR                   S
9nU[        R                  " U5      -  nUR
                  S   R                  n	U	R                  S :w  a>  U	R                  5       n	S U	S'   U R                   R                  U	R                  5       5        U	R                  S :w  a  U R                  SU	R                  5        UR
                  S   R                  S:X  a  [        R                  " X`R                   5      n
U[        R                  " U
5      -  nU
R
                  S   R                  nUR                  5       nUR                  S/ 5       H  nUR!                  SS 5      nM     SUS'   U R                   R                  U5        U R#                  U5        OOGMz  UUR$                  R&                  UR$                  R(                  UR$                  R*                  S.nU$ ! U R                  S	5        f = f)Nr   r   rA   T)rZ   on_begin_streamchunkon_stream_deltaon_end_streammessagesr   r   index	assistantrB   r   )rN   r   r   rR   r_   r   deltarC   rE   stream_chunk_builderr   rm   copyr   r   getpopr   r   r   r   r   )r   rr   r   ru   rZ   chunkstool_chunksr   r   r   tool_completiontool_message	tool_jsonr   r   r   s                   r   r{   Assistant._streamed_query   s   !!6f"EF%%T%2F1 12 #EIIw./MM%(}}Q'--55=-u}}Q/?/E/E/M/M $**51 $ 0 !55!3!3J G++J77D  *11!4<<''4/#3#8#8#: 15 .""))*:*?*?*AB''4//?/G/GH!!!$22lB")">">!3!3#
 //@@.66q9AA(--/	
 "+|R!@I!gt4A "A %0	&!"")))4::<HC H  &&33'--;;!+!1!1!C!C	
 g 0s   B/K! !K4c           
         U R                  5         [        R                  " U R                  U R                  U R
                  R                  5        Vs/ s H  nSUS   S.PM     snU R                  U R                  US9$ s  snf )Nr   r   )rj   r   )rT   r   toolsrU   	logger_fnrZ   )	_trim_conversationrE   r   rL   rN   rJ   valuesrM   rH   )r   rZ   r[   s      r   r   Assistant._completion;  s|    !!!++'' //11A $8=1 MMll

 
	
s   Bc                 0   [         R                  " U R                  U R                  S9n[	        U R                  U R                  5      U l        [         R                  " U R                  U R                  S9nX:w  a  U R                  SSU SU S35        g g )Nr   r   zTrimming conversation from z to z tokens.)rE   token_counterrL   rN   r   rR   )r   old_lennew_lens      r   r   Assistant._trim_conversationK  s    ''d>P>PQ*4+=+=t{{K''d>P>PQOO8	gYhW r   c                 v   SUS'   UR                   n U Hu  nU R                  U5      n[        X@R                  U R                  S5      nUR
                  SUR                  R                  US.nU R                  R                  U5        Mw     g ! [         a  nU R                  SSU 35         S nAg S nAff = f)Nr   rB   g      ?tool)tool_call_idrB   r   rC   rf   z2An exception occured while processing tool calls: )r   r   r   rL   rO   idr   r   rN   r   r   rR   )r   r   r   r   function_responseresponserl   s          r   r   /Assistant._add_function_results_to_conversationV  s    #. %00
	'	$(OOI$>!$3%{{D4R4RTW%! %.LL"%..330	 ""))(3 (  	 OOPQRPST 	s   A;B 
B8B33B8)rI   rN   rJ   rH   rO   rL   rP   rM   N)zUnexpected Exception)F)r   r   r   r   r	   r   r_   rc   rp   strr   r   rR   rQ   rK   r   r|   r{   r   r   r   r   r   r   r   r0   r0      s     9+!%$9L)F*C *X('RSs  3 :Nc N`
 	r   r0   )r   r)   r   rw   r;   warningscatch_warningssimplefilterrE   r}   	util.trimr   r   	util.textr   rV   r	   r   r   r   r.   r0   r   r   r   <module>r      s{         (#   6 "  Y  
# # L L- s   B  
B