
    dh<"                         S SK r S SKJrJrJrJrJr  S SKJrJ	r	  S SK
Jr  S SKJr  S SKJrJr  S SKJr  S\4S	 jrS\4S
 jrS\S\S\4S jr " S S\5      rg)    N)AnyDictListOptionalcast)AgentActionAgentFinish)BaseCallbackHandler)BaseMessage)ChatGeneration	LLMResultguard_importreturnc                  4    [        S5      R                  5       $ )zImport the infino client.infinopy)r   InfinoClient     e/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/callbacks/infino_callback.pyimport_infinor      s    
#0022r   c                      [        S5      $ )z6Import tiktoken for counting tokens for OpenAI models.tiktokenr   r   r   r   import_tiktokenr      s    
##r   stringopenai_model_namec                 p    [        5       nUR                  U5      n[        UR                  U 5      5      nU$ )zCalculate num tokens for OpenAI with tiktoken package.

Official documentation: https://github.com/openai/openai-cookbook/blob/main
                        /examples/How_to_count_tokens_with_tiktoken.ipynb
)r   encoding_for_modellenencode)r   r   r   encoding
num_tokenss        r   get_num_tokensr#      s6      H**+<=HX__V,-Jr   c                      \ rS rSrSr   S,S\\   S\\   S\SS4S jjr S-S	\S
\	S\SS4S jjr
S\\\	4   S\\   S\	SS4S jrS\S\	SS4S jrS\S\	SS4S jrS\S\	SS4S jrS\\\	4   S\\\	4   S\	SS4S jrS\\\	4   S\	SS4S jrS\S\	SS4S jrS\\\	4   S\S\	SS4S jrS\S\	S\	4S jr  S.S \S!\\   S"\\   S\	SS4
S# jjrS\S\	SS4S$ jrS%\S\	SS4S& jrS'\S\	SS4S( jrS\\\	4   S)\\\      S\	SS4S* jrS+r g)/InfinoCallbackHandler"   z%Callback Handler that logs to Infino.Nmodel_idmodel_versionverboser   c                 b    [        5       U l        Xl        X l        X0l        SU l        SU l        g )NFzgpt-3.5-turbo)r   clientr'   r(   r)   is_chat_openai_modelchat_openai_model_name)selfr'   r(   r)   s       r   __init__InfinoCallbackHandler.__init__%   s-     $o *$)!&5#r   keyvalueis_tsc                 8   S[        [        R                  " 5       5      XSU R                  U R                  S.0nU R                  (       a  [        SU SU 35        U(       a  U R                  R                  U5        gU R                  R                  U5        g)zSend the key-value to Infino.

Parameters:
key (str): the key to send to Infino.
value (Any): the value to send to Infino.
is_ts (bool): if True, the value is part of a time series, else it
              is sent as a log message.
datelabels)r'   r(   z	Tracking z with Infino: N)	inttimer'   r(   r)   printr+   	append_ts
append_log)r.   r1   r2   r3   payloads        r   _send_to_infino%InfinoCallbackHandler._send_to_infino3   s}     C		$ MM!%!3!3
 <<IcU.	:; KK!!'*KK""7+r   
serializedpromptskwargsc                 z    U H  nU R                  SUSS9  M     SU l        [        R                  " 5       U l        g)z=Log the prompts to Infino, and set start time and error flag.promptFr3   r   N)r=   errorr8   
start_time)r.   r?   r@   rA   rC   s        r   on_llm_start"InfinoCallbackHandler.on_llm_startS   s;     F  6 ? 
 
 ))+r   tokenc                     g)z)Do nothing when a new token is generated.Nr   )r.   rI   rA   s      r   on_llm_new_token&InfinoCallbackHandler.on_llm_new_tokene       r   responsec                    [         R                   " 5       U l        U R                  U R                  -
  nU R                  SU5        U R                  SU R                  5        UR
                   H'  nU H  nU R                  SUR                  SS9  M      M)     UR                  bv  [        UR                  [        5      (       aW  UR                  S   nUbE  US   nUS	   nUS
   n	U R                  SU5        U R                  S	U5        U R                  S
U	5        U R                  (       a>  SR                  S W 5       5      n
[        XR                  S9n	U R                  S
U	5        gg)z<Log the latency, error, token usage, and response to Infino.latencyrE   prompt_responseFrD   Ntoken_usageprompt_tokenstotal_tokenscompletion_tokens c              3      #    U H7  n[        [        [        [        U5      R                  R                  5      v   M9     g 7fN)r   strr   messagecontent).0
generations     r   	<genexpr>3InfinoCallbackHandler.on_llm_end.<locals>.<genexpr>   s4       "-J S$~z:BBJJKK"-s   >A r   )r8   end_timerF   r=   rE   generationstext
llm_output
isinstancer   r,   joinr#   r-   )r.   rN   rA   durationrb   r]   rR   rS   rT   rU   messagess              r   
on_llm_end InfinoCallbackHandler.on_llm_endi   s]    		==4??2Y1 	Wdjj1 $//K)
$$%6
u$U * 0
 +H<O<OQU1V1V"--m<K& +O <*>:$/0C$D!$$_mD$$^\B$$%8:KL $$xx  "-  H !/,G,G!   !46GH %r   rE   c                     SU l         g)zSet the error flag.   N)rE   r.   rE   rA   s      r   on_llm_error"InfinoCallbackHandler.on_llm_error   s	    
r   inputsc                     g)z!Do nothing when LLM chain starts.Nr   )r.   r?   rp   rA   s       r   on_chain_start$InfinoCallbackHandler.on_chain_start   s     	r   outputsc                     g)zDo nothing when LLM chain ends.Nr   )r.   rt   rA   s      r   on_chain_end"InfinoCallbackHandler.on_chain_end   rM   r   c                     g)zNeed to log the error.Nr   rm   s      r   on_chain_error$InfinoCallbackHandler.on_chain_error   rM   r   	input_strc                     g)zDo nothing when tool starts.Nr   )r.   r?   r{   rA   s       r   on_tool_start#InfinoCallbackHandler.on_tool_start   s     	r   actionc                     g)z.Do nothing when agent takes a specific action.Nr   )r.   r   rA   s      r   on_agent_action%InfinoCallbackHandler.on_agent_action   rM   r   outputobservation_prefix
llm_prefixc                     g)zDo nothing when tool ends.Nr   )r.   r   r   r   rA   s        r   on_tool_end!InfinoCallbackHandler.on_tool_end   s     	r   c                     g)z&Do nothing when tool outputs an error.Nr   rm   s      r   on_tool_error#InfinoCallbackHandler.on_tool_error   rM   r   rc   c                     gzDo nothing.Nr   )r.   rc   rA   s      r   on_textInfinoCallbackHandler.on_text   rM   r   finishc                     gr   r   )r.   r   rA   s      r   on_agent_finish%InfinoCallbackHandler.on_agent_finish   rM   r   rh   c                    UR                  S5      nU(       a  U H  nUS:X  d  M  SU l          O   U R                  (       a  UR                  S5      nU(       ak  UR                  S5      nU(       aS  Xpl        SnU H3  n	SR                  S U	 5       5      n
[	        U
U R                  S	9nX-  nM5     U R                  S
U5        U R                  (       a%  [        SU R                   SU R                   35        SR                  S U 5       5      nU R                  SUSS9  SU l        [        R                  " 5       U l
        g)zRun when LLM starts running.id
ChatOpenAITinvocation_params
model_namer   rV   c              3   T   #    U H  n[        [        UR                  5      v   M!     g 7frX   r   rY   r[   )r\   msgs     r   r^   <InfinoCallbackHandler.on_chat_model_start.<locals>.<genexpr>   s!      2>JsDckk22ls   &(r`   rS   z=on_chat_model_start: is_chat_openai_model=                   z+,                   chat_openai_model_name=c              3   d   #    U H'  o H  n[        [        UR                  5      v   M!     M)     g 7frX   r   )r\   sublistr   s      r   r^   r      s*      
2:wgsDckk""g"(s   .0rC   FrD   N)getr,   r-   rf   r#   r=   r)   r9   rE   r8   rF   )r.   r?   rh   rA   valuesr2   r   r   rS   message_listmessage_stringr"   rC   s                r   on_chat_model_start)InfinoCallbackHandler.on_chat_model_start   sJ    %L(04D-   $$ &

+> ? .22<@
2</$%M(0), 2>J2 * &4*.2.I.I&
 &3 )1 ((-H<<,,- .**.*E*E)FH  
2:
 
 	XvU; 
 ))+r   )	r-   r+   ra   rE   r,   r'   r(   rF   r)   )NNF)T)NN)!__name__
__module____qualname____firstlineno____doc__r   rY   boolr/   r   r=   r   r   rG   rK   r   ri   BaseExceptionrn   rr   rv   ry   r}   r   r   r   r   r   r	   r   r   r   __static_attributes__r   r   r   r%   r%   "   s   / #''+	63-6  }6 	6
 
6$ 	,, , 	,
 
,@&cN& c& 	&
 
&$c S T #I9 #I #I #IJ- 3 4 sCx.26sCx.LO	DcN c d M S T cN  	
 
k S S  -1$(	 %SM SM	
  
= C D C 3 4 k S T 8&cN8& tK()8& 	8&
 
8&r   r%   )r8   typingr   r   r   r   r   langchain_core.agentsr   r	   langchain_core.callbacksr
   langchain_core.messagesr   langchain_core.outputsr   r   langchain_core.utilsr   r   r   rY   r7   r#   r%   r   r   r   <module>r      s^     2 2 : 8 / < -3s 3
$ $

3 
3 
3 
Y&/ Y&r   