§
    šŠtj<"  ã                   ó¶   — 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© ó    úk/var/www/html/CA-Chatbot/venv/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 )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ØÐ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;   € õ $‘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/   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ð 	×Ò˜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   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¥ c¤kÑ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ð
ð 
Ø?B�D•�c”kÑ"Ô"ð
ð 
ð 
ð 
ð 
ð 
ð 
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Ò(Ð(Ø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   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ð ð ð ð ðØ˜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%   )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Ø /Ð /Ð /Ð /Ð /Ð /Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø -Ð -Ð -Ð -Ð -Ð -ð3�sð 3ð 3ð 3ð 3ð
$˜ð $ð $ð $ð $ð

˜3ð 
°3ð 
¸3ð 
ð 
ð 
ð 
ðY&ð Y&ð Y&ð Y&ð Y&Ð/ñ Y&ô Y&ð Y&ð Y&ð Y&r   