
    Ng<"                         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dS )    N)AnyDictListOptionalcast)AgentActionAgentFinish)BaseCallbackHandler)BaseMessage)ChatGeneration	LLMResultguard_importreturnc                  D    t          d                                          S )zImport the infino client.infinopy)r   InfinoClient     i/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/callbacks/infino_callback.pyimport_infinor      s    
##002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                     t                      }|                    |          }t          |                    |                     }|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#      sB       H**+<==HX__V,,--Jr   c                   8   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dS )/InfinoCallbackHandlerz%Callback Handler that logs to Infino.NFmodel_idmodel_versionverboser   c                 r    t                      | _        || _        || _        || _        d| _        d| _        d S )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__%   s;     $oo *$)!&5###r   Tkeyvalueis_tsc                    dt          t          j                              ||d| j        | j        di}| j        rt          d| d|            |r| j                            |           dS | j                            |           dS )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	$$ M!%!3 
 < 	<:c::::;;;  	,K!!'*****K""7+++++r   
serializedpromptskwargsc                 ~    |D ]}|                      d|d           d| _        t          j                    | _        dS )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   sO      	@ 	@F  6 ???? 
 )++r   tokenc                     dS )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
  }|                     d|           |                     d| j                   |j        D ]$}|D ]}|                     d|j        d            %|j        t          |j        t                    ri|j        d         }|Z|d         }|d	         }|d
         }	|                     d|           |                     d	|           |                     d
|	           | j
        rMd                    d |D                       }
t          |
| j                  }	|                     d
|	           dS dS )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   z   K   | ]6}t          t          t          t          |          j        j                  V  7d S N)r   strr   messagecontent).0
generations     r   	<genexpr>z3InfinoCallbackHandler.on_llm_end.<locals>.<genexpr>   sP           S$~z::BJKK           r   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   s    	=4?2Y111 	Wdj111 $/ 	V 	VK) V V
$$%6
u$UUUUV +H<OQU1V1V+"-m<K& +O <*>:$/0C$D!$$_mDDD$$^\BBB$$%8:KLLL $ 	Ixx    "-       H !/D,G! ! !   !46GHHHHH	I 	Ir   rB   c                     d| _         dS )zSet the error flag.   N)rB   r-   rB   r>   s      r   on_llm_errorz"InfinoCallbackHandler.on_llm_error   s    


r   inputsc                     dS )z!Do nothing when LLM chain starts.Nr   )r-   r<   rh   r>   s       r   on_chain_startz$InfinoCallbackHandler.on_chain_start   s	     	r   outputsc                     dS )zDo nothing when LLM chain ends.Nr   )r-   rk   r>   s      r   on_chain_endz"InfinoCallbackHandler.on_chain_end   rH   r   c                     dS )zNeed to log the error.Nr   rf   s      r   on_chain_errorz$InfinoCallbackHandler.on_chain_error   rH   r   	input_strc                     dS )zDo nothing when tool starts.Nr   )r-   r<   rp   r>   s       r   on_tool_startz#InfinoCallbackHandler.on_tool_start   s	     	r   actionc                     dS )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                     dS )zDo nothing when tool ends.Nr   )r-   rv   rw   rx   r>   s        r   on_tool_endz!InfinoCallbackHandler.on_tool_end   s	     	r   c                     dS )z&Do nothing when tool outputs an error.Nr   rf   s      r   on_tool_errorz#InfinoCallbackHandler.on_tool_error   rH   r   r]   c                     dS zDo nothing.Nr   )r-   r]   r>   s      r   on_textzInfinoCallbackHandler.on_text   rH   r   finishc                     dS r~   r   )r-   r   r>   s      r   on_agent_finishz%InfinoCallbackHandler.on_agent_finish   rH   r   rb   c                 z   |                     d          }|r|D ]}|dk    r	d| _         n| j        r|                     d          }|ru|                     d          }|r^|| _        d}|D ]<}	d                    d |	D                       }
t	          |
| j        	          }||z  }=|                     d
|           | j        rt          d| j         d| j                    d                    d |D                       }|                     d|d           d| _        t          j	                    | _
        dS )zRun when LLM starts running.id
ChatOpenAITinvocation_params
model_namer   rQ   c              3   J   K   | ]}t          t          |j                  V  d S rS   r   rT   rV   )rW   msgs     r   rY   z<InfinoCallbackHandler.on_chat_model_start.<locals>.<genexpr>   s?       2 27:Dck222 2 2 2 2 2r   rZ   rN   z=on_chat_model_start: is_chat_openai_model=                   z+,                   chat_openai_model_name=c              3   T   K   | ]#}|D ]}t          t          |j                  V  $d S rS   r   )rW   sublistr   s      r   rY   z<InfinoCallbackHandler.on_chat_model_start.<locals>.<genexpr>   sS       
 
'.g
 
?BDck""
 
 
 
 
 
 
r   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   s    %% 	  L((04D-E )
 $ 	I &

+> ? ?  I.22<@@
 I2<D/$%M(0 4 4), 2 2>J2 2 2 * * &4*.2.I& & &
 &3((-HHH< 	H,H H*.*EH 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 63-6  }6 	6
 
6 6 6 6$ 	, ,, , 	,
 
, , , ,@&cN& c& 	&
 
& & & &$c S T    #I9 #I #I #I #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& 8& 8& 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 2 2 2 2 2 2 2 2 2 2 2 2 : : : : : : : : 8 8 8 8 8 8 / / / / / / < < < < < < < < - - - - - -3s 3 3 3 3
$ $ $ $ $

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