
    7|h<"                         d dl Z d dlmZmZmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ defd	Zdefd
ZdededefdZ G d de      Zy)    N)AnyDictListOptionalcast)AgentActionAgentFinish)BaseCallbackHandler)BaseMessage)ChatGeneration	LLMResultguard_importreturnc                  4    t        d      j                         S )zImport the infino client.infinopy)r   InfinoClient     l/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/callbacks/infino_callback.pyimport_infinor      s    
#0022r   c                      t        d      S )z6Import tiktoken for counting tokens for OpenAI models.tiktokenr   r   r   r   import_tiktokenr      s    
##r   stringopenai_model_namec                 p    t               }|j                  |      }t        |j                  |             }|S )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                      e Zd ZdZ	 	 	 d*dee   dee   deddfdZ	 d+ded	ed
eddfdZ	de
eef   dee   deddfdZdededdfdZdededdfdZdededdfdZde
eef   de
eef   deddfdZde
eef   deddfdZdededdfdZde
eef   dededdfdZdededefdZ	 	 d,ded ee   d!ee   deddf
d"Zdededdfd#Zd$ededdfd%Zd&ededdfd'Zde
eef   d(eee      deddfd)Zy)-InfinoCallbackHandlerz%Callback Handler that logs to Infino.Nmodel_idmodel_versionverboser   c                 h    t               | _        || _        || _        || _        d| _        d| _        y )NFzgpt-3.5-turbo)r   clientr&   r'   r(   is_chat_openai_modelchat_openai_model_name)selfr&   r'   r(   s       r   __init__zInfinoCallbackHandler.__init__%   s3     $o *$)!&5#r   keyvalueis_tsc                 $   dt        t        j                               ||d| j                  | j                  di}| j                  rt        d| d|        |r| j                  j                  |       y| j                  j                  |       y)a  Send 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-   r/   r0   r1   payloads        r   _send_to_infinoz%InfinoCallbackHandler._send_to_infino3   s     C		$ MM!%!3!3
 <<IcU.	:; KK!!'*KK""7+r   
serializedpromptskwargsc                 z    |D ]  }| j                  d|d        d| _        t        j                         | _        y)z=Log the prompts to Infino, and set start time and error flag.promptFr1   r   N)r;   errorr6   
start_time)r-   r<   r=   r>   r@   s        r   on_llm_startz"InfinoCallbackHandler.on_llm_startS   sB      	@F  6 ?	@
 
 ))+r   tokenc                      y)z)Do nothing when a new token is generated.Nr   )r-   rE   r>   s      r   on_llm_new_tokenz&InfinoCallbackHandler.on_llm_new_tokene       r   responsec                    t        j                          | _        | j                  | j                  z
  }| j                  d|       | j                  d| j                         |j
                  D ]'  }|D ]   }| j                  d|j                  d       " ) |j                  pt        |j                  t              rV|j                  d   }|E|d   }|d	   }|d
   }	| j                  d|       | j                  d	|       | j                  d
|	       | j                  rBdj                  d D              }
t        |
| j                        }	| j                  d
|	       yy)z<Log the latency, error, token usage, and response to Infino.latencyrB   prompt_responseFrA   Ntoken_usageprompt_tokenstotal_tokenscompletion_tokens c              3      K   | ]6  }t        t        t        t        |      j                  j                         8 y wN)r   strr   messagecontent).0
generations     r   	<genexpr>z3InfinoCallbackHandler.on_llm_end.<locals>.<genexpr>   s2        S$~z:BBJJK s   <>r   )r6   end_timerC   r;   rB   generationstext
llm_output
isinstancer   r+   joinr#   r,   )r-   rI   r>   durationr\   rX   rM   rN   rO   rP   messagess              r   
on_llm_endz InfinoCallbackHandler.on_llm_endi   sj    		==4??2Y1 	Wdjj1 $// 	VK) V
$$%6
u$UV	V
 +H<O<OQU1V"--m<K& +O <*>:$/0C$D!$$_mD$$^\B$$%8:KL $$xx  "-  H !/D,G,G!   !46GH %r   rB   c                     d| _         y)zSet the error flag.   N)rB   r-   rB   r>   s      r   on_llm_errorz"InfinoCallbackHandler.on_llm_error   s	    
r   inputsc                      y)z!Do nothing when LLM chain starts.Nr   )r-   r<   rh   r>   s       r   on_chain_startz$InfinoCallbackHandler.on_chain_start   s     	r   outputsc                      y)zDo nothing when LLM chain ends.Nr   )r-   rk   r>   s      r   on_chain_endz"InfinoCallbackHandler.on_chain_end   rH   r   c                      y)zNeed to log the error.Nr   rf   s      r   on_chain_errorz$InfinoCallbackHandler.on_chain_error   rH   r   	input_strc                      y)zDo nothing when tool starts.Nr   )r-   r<   rp   r>   s       r   on_tool_startz#InfinoCallbackHandler.on_tool_start   s     	r   actionc                      y)z.Do nothing when agent takes a specific action.Nr   )r-   rs   r>   s      r   on_agent_actionz%InfinoCallbackHandler.on_agent_action   rH   r   outputobservation_prefix
llm_prefixc                      y)zDo nothing when tool ends.Nr   )r-   rv   rw   rx   r>   s        r   on_tool_endz!InfinoCallbackHandler.on_tool_end   s     	r   c                      y)z&Do nothing when tool outputs an error.Nr   rf   s      r   on_tool_errorz#InfinoCallbackHandler.on_tool_error   rH   r   r]   c                      yzDo nothing.Nr   )r-   r]   r>   s      r   on_textzInfinoCallbackHandler.on_text   rH   r   finishc                      yr~   r   )r-   r   r>   s      r   on_agent_finishz%InfinoCallbackHandler.on_agent_finish   rH   r   rb   c                 ^   |j                  d      }|r|D ]  }|dk(  s	d| _         n | j                  r||j                  d      }|ri|j                  d      }|rV|| _        d}|D ]6  }	dj                  d |	D              }
t	        |
| j                  	      }||z  }8 | j                  d
|       | j                  r%t        d| j                   d| j                          dj                  d |D              }| j                  d|d       d| _        t        j                         | _
        y)zRun when LLM starts running.id
ChatOpenAITinvocation_params
model_namer   rQ   c              3   P   K   | ]  }t        t        |j                           y wrS   r   rT   rV   )rW   msgs     r   rY   z<InfinoCallbackHandler.on_chat_model_start.<locals>.<genexpr>   s       27:Dckk22s   $&rZ   rN   z=on_chat_model_start: is_chat_openai_model=                   z+,                   chat_openai_model_name=c              3   ^   K   | ]%  }|D ]  }t        t        |j                           ' y wrS   r   )rW   sublistr   s      r   rY   z<InfinoCallbackHandler.on_chat_model_start.<locals>.<genexpr>   s2      
'.g
?BDckk"
"
s   +-r@   FrA   N)getr+   r,   r`   r#   r;   r(   r7   rB   r6   rC   )r-   r<   rb   r>   valuesr0   r   r   rN   message_listmessage_stringr"   r@   s                r   on_chat_model_startz)InfinoCallbackHandler.on_chat_model_start   sX    % L(04D- $$ &

+> ? .22<@
2<D/$%M(0 4), 2>J2 * &4*.2.I.I&
 &34 ((-H<<,,- .**.*E*E)FH  
2:
 
 	XvU; 
 ))+r   )NNF)T)NN)__name__
__module____qualname____doc__r   rT   boolr.   r   r;   r   r   rD   rG   r   rc   BaseExceptionrg   rj   rm   ro   rr   r   ru   rz   r|   r   r	   r   r   r   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%   )r6   typingr   r   r   r   r   langchain_core.agentsr   r	   langchain_core.callbacksr
   langchain_core.messagesr   langchain_core.outputsr   r   langchain_core.utilsr   r   r   rT   r5   r#   r%   r   r   r   <module>r      s^     2 2 : 8 / < -3s 3
$ $

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