§
    æ˜º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 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)Ú	LLMResultÚreturnc                  ó`   — 	 ddl m}  n# t          $ r t          d¦  «        ‚w xY w | ¦   «         S )zImport the infino client.r   ©ÚInfinoClientzŠTo use the Infino callbacks manager you need to have the `infinopy` python package installed.Please install it with `pip install infinopy`)Úinfinopyr   ÚImportErrorr   s    úu/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/callbacks/infino_callback.pyÚimport_infinor   
   s\   € ð
Ø)Ð)Ð)Ð)Ð)Ð)Ð)øÝð 
ð 
ð 
Ýð<ñ
ô 
ð 	
ð
øøøð ˆ<‰>Œ>Ðs   ‚	 ‰#c                  óL   — 	 ddl } n# t          $ r t          d¦  «        ‚w xY w| S )z6Import tiktoken for counting tokens for OpenAI models.r   Nz To use the ChatOpenAI model with Infino callback manager, you need to have the `tiktoken` python package installed.Please install it with `pip install tiktoken`)Útiktokenr   )r   s    r   Úimport_tiktokenr      sK   € ð
ØˆˆˆˆøÝð 
ð 
ð 
Ýð<ñ
ô 
ð 	
ð
øøøð €Os   ‚ ‡!ÚstringÚopenai_model_namec                 ó�   — t          ¦   «         }|                     |¦  «        }t          |                     | ¦  «        ¦  «        }|S )zÚCalculate 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ØÐó    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__4   s;   € õ $‘o”oˆŒØ ˆŒØ*ˆÔØˆŒØ$)ˆÔ!Ø&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-   r.   r/   Úpayloads        r   Ú_send_to_infinoz%InfinoCallbackHandler._send_to_infinoB   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©r/   r   N)r9   Úerrorr4   Ú
start_time)r+   r:   r;   r<   r>   s        r   Úon_llm_startz"InfinoCallbackHandler.on_llm_startb   sO   € ð ð 	@ð 	@ˆFØ× Ò  ¨6¸Ð Ñ?Ô?Ð?Ð?ð ˆŒ
õ œ)™+œ+ˆŒˆˆr!   Útokenc                 ó   — dS )z)Do nothing when a new token is generated.N© )r+   rC   r<   s      r   Úon_llm_new_tokenz&InfinoCallbackHandler.on_llm_new_tokent   ó   € àˆ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.Úlatencyr@   Úprompt_responseFr?   NÚtoken_usageÚprompt_tokensÚtotal_tokensÚcompletion_tokensú c              3   ó.   K  — | ]}|j         j        V — Œd S ©N)ÚmessageÚcontent)Ú.0Ú
generations     r   ú	<genexpr>z3InfinoCallbackHandler.on_llm_end.<locals>.<genexpr>”   s<   è è € ð  ð  àð Ô"Ô*ð ð  ð  ð  ð  ð  r!   ©r   )r4   Úend_timerA   r9   r@   ÚgenerationsÚtextÚ
llm_outputÚ
isinstancer   r)   Újoinr    r*   )r+   rH   r<   ÚdurationrZ   rV   rL   rM   rN   rO   Úmessagess              r   Ú
on_llm_endz InfinoCallbackHandler.on_llm_endx   sº  € õ œ	™œˆŒØ”= 4¤?Ñ2ˆØ×Ò˜Y¨Ñ1Ô1Ð1ð 	×Ò˜W d¤jÑ1Ô1Ð1ð $Ô/ð 	Vð 	VˆKØ)ð Vð V�
Ø×$Ò$Ð%6¸
¼ÈuÐ$ÑUÔUÐUÐUðVð ÔÐ+µ¸HÔ<OÕQUÑ1VÔ1VÐ+Ø"Ô-¨mÔ<ˆKØÐ&Ø +¨OÔ <�Ø*¨>Ô:�Ø$/Ð0CÔ$DÐ!Ø×$Ò$ _°mÑDÔDÐDØ×$Ò$ ^°\ÑBÔBÐBØ×$Ò$Ð%8Ð:KÑLÔLÐLð Ô$ð 	IØ—x’xð  ð  à"-ð ñ  ô  ñ ô ˆHõ !/Ø¨DÔ,Gð!ñ !ô !Ðð × Ò Ð!4Ð6GÑHÔHÐHÐHÐHð	Ið 	Ir!   r@   c                 ó   — d| _         dS )zSet the error flag.é   N)r@   ©r+   r@   r<   s      r   Úon_llm_errorz"InfinoCallbackHandler.on_llm_error�   s   € àˆŒ
ˆ
ˆ
r!   Úinputsc                 ó   — dS )z!Do nothing when LLM chain starts.NrE   )r+   r:   rf   r<   s       r   Úon_chain_startz$InfinoCallbackHandler.on_chain_start¡   s	   € ð 	ˆr!   Úoutputsc                 ó   — dS )zDo nothing when LLM chain ends.NrE   )r+   ri   r<   s      r   Úon_chain_endz"InfinoCallbackHandler.on_chain_end§   rG   r!   c                 ó   — dS )zNeed to log the error.NrE   rd   s      r   Úon_chain_errorz$InfinoCallbackHandler.on_chain_error«   rG   r!   Ú	input_strc                 ó   — dS )zDo nothing when tool starts.NrE   )r+   r:   rn   r<   s       r   Úon_tool_startz#InfinoCallbackHandler.on_tool_start¯   s	   € ð 	ˆr!   Úactionc                 ó   — dS )z.Do nothing when agent takes a specific action.NrE   )r+   rq   r<   s      r   Úon_agent_actionz%InfinoCallbackHandler.on_agent_action¸   rG   r!   ÚoutputÚobservation_prefixÚ
llm_prefixc                 ó   — dS )zDo nothing when tool ends.NrE   )r+   rt   ru   rv   r<   s        r   Úon_tool_endz!InfinoCallbackHandler.on_tool_end¼   s	   € ð 	ˆr!   c                 ó   — dS )z&Do nothing when tool outputs an error.NrE   rd   s      r   Úon_tool_errorz#InfinoCallbackHandler.on_tool_errorÆ   rG   r!   r[   c                 ó   — dS ©zDo nothing.NrE   )r+   r[   r<   s      r   Úon_textzInfinoCallbackHandler.on_textÊ   rG   r!   Úfinishc                 ó   — dS r|   rE   )r+   r~   r<   s      r   Úon_agent_finishz%InfinoCallbackHandler.on_agent_finishÎ   rG   r!   r`   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   rP   c              3   óJ   K  — | ]}t          t          |j        ¦  «        V — Œd S rR   ©r   ÚstrrT   )rU   Úmsgs     r   rW   z<InfinoCallbackHandler.on_chat_model_start.<locals>.<genexpr>ì   s?   è è € ð 2ð 2Ø7:�D¥ c¤kÑ2Ô2ð2ð 2ð 2ð 2ð 2ð 2r!   rX   rM   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 rR   r‡   )rU   Úsublistr‰   s      r   rW   z<InfinoCallbackHandler.on_chat_model_start.<locals>.<genexpr>ÿ   sS   è è € ð 
ð 
Ø'.Àgð
ð 
Ø?B�D•�c”kÑ"Ô"ð
ð 
ð 
ð 
ð 
ð 
ð 
r!   r>   Fr?   N)Úgetr)   r*   r^   r    r9   r&   r5   r@   r4   rA   )r+   r:   r`   r<   Úvaluesr.   r„   r…   rM   Úmessage_listÚmessage_stringr   r>   s                r   Úon_chat_model_startz)InfinoCallbackHandler.on_chat_model_startÒ   sÍ  € ð —’ Ñ%Ô%ˆØð 	Øð ð �Ø˜LÒ(Ð(Ø04�DÔ-Ø�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:ð
ñ 
ô 
ñ 
ô 
ˆð 	×Ò˜X v°UÐÑ;Ô;Ð;ð ˆŒ
õ œ)™+œ+ˆŒˆˆr!   )NNF)T)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rˆ   Úboolr,   r   r9   r   r   rB   rF   r   ra   ÚBaseExceptionre   rh   rk   rm   rp   r   rs   rx   rz   r}   r	   r€   r   r�   rE   r!   r   r#   r#   1   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ð ð ð ð ðØ˜s C˜xœ.ðØ26°s¸C°x´.ðØLOðà	ðð ð ð ð D¨¨c¨¤Nð ¸cð Àdð ð ð ð ð Mð ¸Sð ÀTð ð ð ð ðà˜˜c˜”Nðð ðð ð	ð
 
ðð ð ð ð kð ¸Sð ÀSð ð ð ð ð -1Ø$(ð	ð àðð % SœMðð ˜S”Mð	ð
 ðð 
ðð ð ð ð =ð ¸Cð ÀDð ð ð ð ð˜Cð ¨3ð °4ð ð ð ð ð kð ¸Sð ÀTð ð ð ð ð8&à˜˜c˜”Nð8&ð �t˜KÔ(Ô)ð8&ð ð	8&ð
 
ð8&ð 8&ð 8&ð 8&ð 8&ð 8&r!   r#   )r4   Útypingr   r   r   r   r   Úlangchain_core.agentsr   r	   Úlangchain_core.callbacksr
   Úlangchain_core.messagesr   Úlangchain_core.outputsr   r   r   rˆ   r3   r    r#   rE   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Ø /Ð /Ð /Ð /Ð /Ð /Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,ð
�sð 
ð 
ð 
ð 
ð
˜ð 
ð 
ð 
ð 
ð
˜3ð 
°3ð 
¸3ð 
ð 
ð 
ð 
ðY&ð Y&ð Y&ð Y&ð Y&Ð/ñ Y&ô Y&ð Y&ð Y&ð Y&r!   