§
    æ˜ºh\^  ã                   ó&  — d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm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 d	lmZmZmZmZmZmZ d
e
fd„Z	 dde de
d
e!fd„Z"de de d
e
fd„Z# G d„ d¦  «        Z$ G d„ dee¦  «        Z%dS )é    N)Údeepcopy)ÚPath)ÚAnyÚDictÚListÚOptionalÚUnion)ÚAgentActionÚAgentFinish)ÚBaseCallbackHandler)Ú	LLMResult)Úget_from_dict_or_env)ÚBaseMetadataCallbackHandlerÚflatten_dictÚhash_stringÚimport_pandasÚimport_spacyÚimport_textstatÚreturnc                  óL   — 	 ddl } n# t          $ r t          d¦  «        ‚w xY w| S )zKImport the mlflow python package and raise an error if it is not installed.r   Nz�To use the mlflow callback manager you need to have the `mlflow` python package installed. Please install it with `pip install mlflow>=2.3.0`)ÚmlflowÚImportError)r   s    úu/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/callbacks/mlflow_callback.pyÚimport_mlflowr      sL   € ð
ØˆˆˆˆøÝð 
ð 
ð 
ÝðTñ
ô 
ð 	
ð
øøøð
 €Ms   ‚ ‡!ÚtextÚnlpc                 ó¾  — i }t          ¦   «         }t          ¦   «         }|                     | ¦  «        |                     | ¦  «        |                     | ¦  «        |                     | ¦  «        |                     | ¦  «        |                     | ¦  «        |                     | ¦  «        | 	                    | ¦  «        | 
                    | ¦  «        |                     | ¦  «        |                     | ¦  «        |                     | ¦  «        |                     | ¦  «        |                     | ¦  «        |                     | ¦  «        dœ}|                     d|i¦  «         |                     |¦  «         |�a || ¦  «        }|j                             |ddd¬¦  «        }|j                             |ddd¬¦  «        }||d	œ}	|                     |	¦  «         |S )
a?  Analyze text using textstat and spacy.

    Parameters:
        text (str): The text to analyze.
        nlp (spacy.lang): The spacy language model to use for visualization.

    Returns:
        (dict): A dictionary containing the complexity metrics and visualization
            files serialized to  HTML string.
    ©Úflesch_reading_easeÚflesch_kincaid_gradeÚ
smog_indexÚcoleman_liau_indexÚautomated_readability_indexÚdale_chall_readability_scoreÚdifficult_wordsÚlinsear_write_formulaÚgunning_fogÚfernandez_huertaÚszigriszt_pazosÚgutierrez_poliniÚcrawfordÚgulpease_indexÚosmanÚtext_complexity_metricsNÚdepFT)ÚstyleÚjupyterÚpageÚent)Údependency_treeÚentities)r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   ÚupdateÚdisplacyÚrender)
r   r   ÚrespÚtextstatÚspacyr.   ÚdocÚdep_outÚent_outÚtext_visualizationss
             r   Úanalyze_textr@   %   sâ  € ð €DÝÑ Ô €HÝ‰NŒN€Eà'×;Ò;¸DÑAÔAØ (× =Ò =¸dÑ CÔ CØ×)Ò)¨$Ñ/Ô/Ø&×9Ò9¸$Ñ?Ô?Ø'/×'KÒ'KÈDÑ'QÔ'QØ(0×(MÒ(MÈdÑ(SÔ(SØ#×3Ò3°DÑ9Ô9Ø!)×!?Ò!?ÀÑ!EÔ!EØ×+Ò+¨DÑ1Ô1à$×5Ò5°dÑ;Ô;Ø#×3Ò3°DÑ9Ô9Ø$×5Ò5°dÑ;Ô;Ø×%Ò% dÑ+Ô+Ø"×1Ò1°$Ñ7Ô7Ø—’ Ñ%Ô%ð!ð Ðð$ 	‡K‚KÐ*Ð,CÐDÑEÔEÐEØ‡K‚KÐ'Ñ(Ô(Ð(à
€Øˆc�$‰iŒiˆà”.×'Ò'Ø�u e°$ð (ñ 
ô 
ˆð ”.×'Ò'Ø�u e°$ð (ñ 
ô 
ˆð
  'Øð
ð 
Ðð
 	�ŠÐ'Ñ(Ô(Ð(à€Kó    ÚpromptÚ
generationc                 ól   — |                       dd¦  «        }|                      dd¦  «        }d|› d|› d�S )zÄConstruct an html element from a prompt and a generation.

    Parameters:
        prompt (str): The prompt.
        generation (str): The generation.

    Returns:
        (str): The html string.ú
z<br>z
    <p style="color:black;">z>:</p>
    <blockquote>
      <p style="color:green;">
        z"
      </p>
    </blockquote>
    )Úreplace)rB   rC   Úformatted_promptÚformatted_generations       r   Ú)construct_html_from_prompt_and_generationrI   `   sY   € ð —~’~ d¨FÑ3Ô3ÐØ%×-Ò-¨d°FÑ;Ô;ÐðØ-ðð ð 
ð	ð ð ð rA   c                   ó.  — e Zd ZdZdefd„Zdedeeef         ddfd„Zdd	„Z	d
ede
ddfd„Z	 ddeeee
f         eeef         f         dee         ddfd„Zdeeef         deddfd„Z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dfd„Zdeddfd„ZdS )ÚMlflowLoggera’  Callback Handler that logs metrics and artifacts to mlflow server.

    Parameters:
        name (str): Name of the run.
        experiment (str): Name of the experiment.
        tags (dict): Tags to be attached for the run.
        tracking_uri (str): MLflow tracking server uri.

    This handler implements the helper functions to initialize,
    log metrics and artifacts to the mlflow server.
    Úkwargsc                 ó‚  — t          ¦   «         | _        dt          j        v rg| j                             d¦  «         | j        j        j                             ¦   «         | _        | j         	                    | j        ¦  «        | _
        n”t          |ddd¦  «        }| j                             |¦  «         t          |dd¦  «        }| j                             |¦  «        | _
        | j
        �| j
        j        | _        n| j                             |¦  «        | _        |                      |d         |d	         ¦  «         d S )
NÚDATABRICKS_RUNTIME_VERSIONÚ
databricksÚtracking_uriÚMLFLOW_TRACKING_URIÚ Úexperiment_nameÚMLFLOW_EXPERIMENT_NAMEÚrun_nameÚrun_tags)r   r   ÚosÚenvironÚset_tracking_uriÚtrackingÚfluentÚ_get_experiment_idÚ	mlf_expidÚget_experimentÚmlf_expr   Úget_experiment_by_nameÚexperiment_idÚcreate_experimentÚ	start_run)ÚselfrL   rP   rS   s       r   Ú__init__zMlflowLogger.__init__ƒ   s  € Ý#‘o”oˆŒØ'­2¬:Ð5Ð5ØŒK×(Ò(¨Ñ6Ô6Ð6Ø!œ[Ô1Ô8×KÒKÑMÔMˆDŒNØœ;×5Ò5°d´nÑEÔEˆDŒLˆLå/Ø˜Ð(=¸rñô ˆLð ŒK×(Ò(¨Ñ6Ô6Ð6õ
 3ØÐ)Ð+Cñô ˆOð  œ;×=Ò=¸oÑNÔNˆDŒLØŒ|Ð'Ø!%¤Ô!;�”�à!%¤×!>Ò!>¸Ñ!OÔ!O�”à�Š�v˜jÔ)¨6°*Ô+=Ñ>Ô>Ð>Ð>Ð>rA   ÚnameÚtagsr   Nc                 óN  — |                      d¦  «        rVd                     t          j        t          j        t          j        z   d¬¦  «        ¦  «        }|                     d|¦  «        }| j         	                    ¦   «          
                    | j        ||¬¦  «        | _        dS )z=To start a new run, auto generates the random suffix for namez-%rR   é   )Úkú%)rU   rg   N)ÚendswithÚjoinÚrandomÚchoicesÚstringÚascii_uppercaseÚdigitsrF   r   ÚMlflowClientÚ
create_runr]   Úrun)rd   rf   rg   Úrnames       r   rc   zMlflowLogger.start_run�   s‹   € à�=Š=˜ÑÔð 	,Ø—G’G�FœN­6Ô+AÅFÄMÑ+QÐUVÐWÑWÔWÑXÔXˆEØ—<’<  UÑ+Ô+ˆDØ”;×+Ò+Ñ-Ô-×8Ò8ØŒN T°ð 9ñ 
ô 
ˆŒˆˆrA   c                 óÊ   — | j                              | j        j        j        | j        ¬¦  «        5  | j                              ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )zTo finish the run.©Úrun_idra   N)r   rc   ru   Úinfory   r]   Úend_run)rd   s    r   Ú
finish_runzMlflowLogger.finish_run¦   s§   € àŒ[×"Ò"Ø”8”=Ô'°t´~ð #ñ 
ô 
ð 	"ð 	"ð ŒK×ÒÑ!Ô!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s   ±AÁAÁAÚkeyÚvaluec                 óÎ   — | j                              | j        j        j        | j        ¬¦  «        5  | j                              ||¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zTo log metric to mlflow server.rx   N)r   rc   ru   rz   ry   r]   Ú
log_metric)rd   r}   r~   s      r   ÚmetriczMlflowLogger.metric­   s«   € àŒ[×"Ò"Ø”8”=Ô'°t´~ð #ñ 
ô 
ð 	/ð 	/ð ŒK×"Ò" 3¨Ñ.Ô.Ð.ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/s   ±AÁAÁ!Ar   ÚdataÚstepc                 óÌ   — | j                              | j        j        j        | j        ¬¦  «        5  | j                              |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z%To log all metrics in the input dict.rx   N)r   rc   ru   rz   ry   r]   Úlog_metrics)rd   r‚   rƒ   s      r   ÚmetricszMlflowLogger.metrics´   s«   € ð Œ[×"Ò"Ø”8”=Ô'°t´~ð #ñ 
ô 
ð 	*ð 	*ð ŒK×#Ò# DÑ)Ô)Ð)ð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ó   ±AÁAÁ AÚfilenamec                 óÔ   — | j                              | j        j        j        | j        ¬¦  «        5  | j                              ||› d�¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z,To log the input data as json file artifact.rx   z.jsonN)r   rc   ru   rz   ry   r]   Úlog_dict)rd   r‚   rˆ   s      r   ÚjsonfzMlflowLogger.jsonf½   ó´   € àŒ[×"Ò"Ø”8”=Ô'°t´~ð #ñ 
ô 
ð 	;ð 	;ð ŒK× Ò  ¨(Ð'9Ð'9Ð'9Ñ:Ô:Ð:ð	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ó   ±AÁA!Á$A!c                 ó\   — |                       |                     ¦   «         d|› �¦  «         dS )z1To log the input pandas dataframe as a html tableÚtable_N)ÚhtmlÚto_html)rd   rf   Ú	dataframes      r   ÚtablezMlflowLogger.tableÄ   s.   € à�	Š	�)×#Ò#Ñ%Ô% °  Ñ7Ô7Ð7Ð7Ð7rA   r�   c                 óÔ   — | j                              | j        j        j        | j        ¬¦  «        5  | j                              ||› d�¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z3To log the input html string as html file artifact.rx   z.htmlN©r   rc   ru   rz   ry   r]   Úlog_text)rd   r�   rˆ   s      r   r�   zMlflowLogger.htmlÈ   rŒ   r�   r   c                 óÔ   — | j                              | j        j        j        | j        ¬¦  «        5  | j                              ||› d�¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z,To log the input text as text file artifact.rx   z.txtNr•   )rd   r   rˆ   s      r   r   zMlflowLogger.textÏ   s´   € àŒ[×"Ò"Ø”8”=Ô'°t´~ð #ñ 
ô 
ð 	:ð 	:ð ŒK× Ò  ¨(Ð'8Ð'8Ð'8Ñ9Ô9Ð9ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:ð 	:ð 	:r�   Úpathc                 óÌ   — | j                              | j        j        j        | j        ¬¦  «        5  | j                              |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z/To upload the file from given path as artifact.rx   N)r   rc   ru   rz   ry   r]   Úlog_artifact)rd   r˜   s     r   ÚartifactzMlflowLogger.artifactÖ   s©   € àŒ[×"Ò"Ø”8”=Ô'°t´~ð #ñ 
ô 
ð 	+ð 	+ð ŒK×$Ò$ TÑ*Ô*Ð*ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	+ð 	+r‡   Úchainc                 óØ   — | j                              | j        j        j        | j        ¬¦  «        5  | j         j                             |d¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nrx   zlangchain-model)r   rc   ru   rz   ry   r]   Ú	langchainÚ	log_model)rd   rœ   s     r   Úlangchain_artifactzMlflowLogger.langchain_artifactÝ   sÃ   € ØŒ[×"Ò"Ø”8”=Ô'°t´~ð #ñ 
ô 
ð 	Fð 	Fð ŒKÔ!×+Ò+¨EÐ3DÑEÔEÐEð	Fð 	Fð 	Fñ 	Fô 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Føøøð 	Fð 	Fð 	Fð 	Fð 	Fð 	Fs   ±!AÁA#Á&A#©r   N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   re   Ústrr   rc   r|   Úfloatr�   r	   Úintr   r†   r‹   r“   r�   r   r›   r    © rA   r   rK   rK   v   sï  € € € € € ð
ð 
ð? ð ?ð ?ð ?ð ?ð4
˜cð 
¨¨c°3¨h¬ð 
¸Dð 
ð 
ð 
ð 
ð"ð "ð "ð "ð/˜#ð / eð /°ð /ð /ð /ð /ð TUð*ð *Ø˜$˜s E˜zÔ*¨D°°c°¬NÐ:Ô;ð*ØCKÈCÄ=ð*à	ð*ð *ð *ð *ð;˜$˜s C˜xœ.ð ;°Cð ;¸Dð ;ð ;ð ;ð ;ð8˜#ð 8¨Tð 8ð 8ð 8ð 8ð;˜ð ;¨ð ;°ð ;ð ;ð ;ð ;ð:˜ð :¨ð :°ð :ð :ð :ð :ð+˜Sð + Tð +ð +ð +ð +ðF¨ð F°ð Fð Fð Fð Fð Fð FrA   rK   c                   ó  ‡ — e Zd ZdZ	 	 	 	 d*dee         dee         dee         dee         d	df
ˆ fd
„Zd+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	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de	d	e	fd%„Zd	e	fd&„Zd,d(e	d"ed	dfd)„Zˆ xZS )-ÚMlflowCallbackHandleraO  Callback Handler that logs metrics and artifacts to mlflow server.

    Parameters:
        name (str): Name of the run.
        experiment (str): Name of the experiment.
        tags (dict): Tags to be attached for the run.
        tracking_uri (str): MLflow tracking server uri.

    This handler will utilize the associated callback method called and formats
    the input of each callback function with metadata regarding the state of LLM run,
    and adds the response to the list of records for both the {method}_records and
    action. It then logs the response to mlflow server.
    úlangchainrun-%rž   Nrf   Ú
experimentrg   rP   r   c                 ó  •— t          ¦   «          t          ¦   «          t          ¦   «          t          ¦   «         }t	          ¦   «                              ¦   «          || _        || _        |pi | _        || _	        t          j        ¦   «         | _        t          | j	        | j        | j        | j        ¬¦  «        | _        g | _        |                     d¦  «        | _        ddddddddddddddœ| _        g g g g g g g g g g g dœ| _        dS )zInitialize callback handler.)rP   rS   rU   rV   Úen_core_web_smr   )rƒ   ÚstartsÚendsÚerrorsÚtext_ctrÚchain_startsÚ
chain_endsÚ
llm_startsÚllm_endsÚllm_streamsÚtool_startsÚ	tool_endsÚ
agent_ends)Úon_llm_start_recordsÚon_llm_token_recordsÚon_llm_end_recordsÚon_chain_start_recordsÚon_chain_end_recordsÚon_tool_start_recordsÚon_tool_end_recordsÚon_text_recordsÚon_agent_finish_recordsÚon_agent_action_recordsÚaction_recordsN)r   r   r   r   Úsuperre   rf   r­   rg   rP   ÚtempfileÚTemporaryDirectoryÚtemp_dirrK   ÚmlflgrÆ   Úloadr   r†   Úrecords)rd   rf   r­   rg   rP   r;   Ú	__class__s         €r   re   zMlflowCallbackHandler.__init__ó   s(  ø€ õ 	‰ŒˆÝÑÔÐÝ‰ŒˆÝ‘”ˆÝ‰Œ×ÒÑÔÐàˆŒ	Ø$ˆŒØ�J˜BˆŒ	Ø(ˆÔå Ô3Ñ5Ô5ˆŒå!ØÔ*Ø œOØ”YØ”Yð	
ñ 
ô 
ˆŒ
ð %'ˆÔØ—:’:Ð.Ñ/Ô/ˆŒð ØØØØØØØØØØØØð
ð 
ˆŒð" %'Ø$&Ø"$Ø&(Ø$&Ø%'Ø#%Ø!Ø')Ø')Ø ð(
ð (
ˆŒˆˆrA   c                 óª   — | j                              ¦   «         D ]\  }}d| j         |<   Œ| j                             ¦   «         D ]\  }}g | j        |<   Œd S )Nr   )r†   ÚitemsrÍ   )rd   rj   Úvs      r   Ú_resetzMlflowCallbackHandler._reset0  sh   € Ø”L×&Ò&Ñ(Ô(ð 	 ð 	 ‰DˆAˆqØˆDŒL˜‰OˆOØ”L×&Ò&Ñ(Ô(ð 	!ð 	!‰DˆAˆqØ ˆDŒL˜‰OˆOð	!ð 	!rA   Ú
serializedÚpromptsrL   c                 ó´  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                     ddi¦  «         |                     t          |¦  «        ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬¦  «         t	          |¦  «        D ]z\  }}t          |¦  «        }||d<   | j        d	                              |¦  «         | j        d
                              |¦  «         | j                             |d|› d|› �¦  «         Œ{dS )zRun when LLM starts.rƒ   é   r¶   r°   ÚactionÚon_llm_start©rƒ   rB   r¼   rÆ   Ú
llm_start_Ú_prompt_N)	r†   r6   r   rË   Ú	enumerater   rÍ   Úappendr‹   )	rd   rÓ   rÔ   rL   r¶   r9   ÚidxrB   Úprompt_resps	            r   rØ   z"MlflowCallbackHandler.on_llm_start6  sz  € ð 	Œ�VÐÐÔ Ñ!ÐÐÑØŒ�\Ð"Ð"Ô" aÑ'Ð"Ð"Ñ"ØŒ�XÐÐÔ !Ñ#ÐÐÑà”\ ,Ô/ˆ
à!ˆØ�Š�X˜~Ð.Ñ/Ô/Ð/Ø�Š•L Ñ,Ô,Ñ-Ô-Ð-Ø�Š�D”LÑ!Ô!Ð!àŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCå$ WÑ-Ô-ð 	Rð 	R‰KˆC�Ý" 4™.œ.ˆKØ$*ˆK˜Ñ!ØŒLÐ/Ô0×7Ò7¸ÑDÔDÐDØŒLÐ)Ô*×1Ò1°+Ñ>Ô>Ð>ØŒJ×Ò˜[Ð*P°zÐ*PÐ*PÈ3Ð*PÐ*PÑQÔQÐQÐQð	Rð 	RrA   Útokenc                 óð  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                     d|dœ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬¦  «         | j        d                              |¦  «         | j        d                              |¦  «         | j                             |d	|› �¦  «         d
S )z#Run when LLM generates a new token.rƒ   rÖ   r¸   Úon_llm_new_token)r×   rà   rÙ   r½   rÆ   Úllm_new_tokens_N©r†   r6   rË   rÍ   rÝ   r‹   )rd   rà   rL   r¸   r9   s        r   râ   z&MlflowCallbackHandler.on_llm_new_tokenN  s  € àŒ�VÐÐÔ Ñ!ÐÐÑØŒ�]Ð#Ð#Ô# qÑ(Ð#Ð#Ñ#à”l =Ô1ˆà!ˆØ�ŠÐ1¸EÐBÐBÑCÔCÐCØ�Š�D”LÑ!Ô!Ð!àŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCàŒÐ+Ô,×3Ò3°DÑ9Ô9Ð9ØŒÐ%Ô&×-Ò-¨dÑ3Ô3Ð3ØŒ
×Ò˜Ð>°Ð>Ð>Ñ?Ô?Ð?Ð?Ð?rA   Úresponsec           	      óð  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                     ddi¦  «         |                     t          |j        pi ¦  «        ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬¦  «         |j        D �]˜}t          |¦  «        D �]„\  }}t          |¦  «        }|                     t          |                     ¦   «         ¦  «        ¦  «         |                     t          |j
        | j        ¬¦  «        ¦  «         |                     d	¦  «        }	| j                              |	| j         d         ¬¦  «         | j        d
                              |¦  «         | j        d                              |¦  «         | j                             |d|› d|› �¦  «         |d         }
|d         }| j                             |
dt#          |j
        ¦  «        z   ¦  «         | j                             |dt#          |j
        ¦  «        z   ¦  «         �Œ†�ŒšdS )zRun when LLM ends running.rƒ   rÖ   r·   r±   r×   Ú
on_llm_endrÙ   )r   r.   r¾   rÆ   Úllm_end_Ú_generation_r4   r5   zdep-zent-N)r†   r6   r   Ú
llm_outputrË   ÚgenerationsrÜ   r   Údictr@   r   r   ÚpoprÍ   rÝ   r‹   r�   r   )rd   rå   rL   r·   r9   rë   rÞ   rC   Úgeneration_respÚcomplexity_metricsr4   r5   s               r   rç   z MlflowCallbackHandler.on_llm_end_  s•  € àŒ�VÐÐÔ Ñ!ÐÐÑØŒ�ZÐ Ð Ô  AÑ%Ð Ð Ñ ØŒ�VÐÐÔ Ñ!ÐÐÑà”< 
Ô+ˆà!ˆØ�Š�X˜|Ð,Ñ-Ô-Ð-Ø�Š•L Ô!4Ð!:¸Ñ;Ô;Ñ<Ô<Ð<Ø�Š�D”LÑ!Ô!Ð!àŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCà#Ô/ð 	Qñ 	QˆKÝ#,¨[Ñ#9Ô#9ð Qñ Q‘��ZÝ"*¨4¡.¤.�Ø×&Ò&¥|°J·O²OÑ4EÔ4EÑ'FÔ'FÑGÔGÐGØ×&Ò&Ý Ø"œØ œHðñ ô ñô ð ð 8G×7JÒ7JØ-ñ8ô 8Ð"ð ”
×"Ò"Ø&Øœ fÔ-ð #ñ ô ð ð ”Ð1Ô2×9Ò9¸/ÑJÔJÐJØ”Ð-Ô.×5Ò5°oÑFÔFÐFØ”
× Ò  Ð'M°(Ð'MÐ'MÈÐ'MÐ'MÑNÔNÐNØ"1Ð2CÔ"D�Ø*¨:Ô6�Ø”
—’ °½+ÀjÄoÑ:VÔ:VÑ1VÑWÔWÐWØ”
—’ ¨&µ;¸z¼Ñ3OÔ3OÑ*OÑPÔPÐPÑPñ-Qð	Qð 	QrA   Úerrorc                 óZ   — | j         dxx         dz  cc<   | j         dxx         dz  cc<   dS )zRun when LLM errors.rƒ   rÖ   r²   N©r†   ©rd   rð   rL   s      r   Úon_llm_errorz"MlflowCallbackHandler.on_llm_error‡  óD   € àŒ�VÐÐÔ Ñ!ÐÐÑØŒ�XÐÐÔ !Ñ#ÐÐÑÐÐrA   Úinputsc                 óæ  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                     ddi¦  «         |                     t          |¦  «        ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬¦  «         d                     d	„ |                     ¦   «         D ¦   «         ¦  «        }t          |¦  «        }||d
<   | j        d                              |¦  «         | j        d                              |¦  «         | j         	                    |d|› �¦  «         dS )zRun when chain starts running.rƒ   rÖ   r´   r°   r×   Úon_chain_startrÙ   ú,c                 ó"   — g | ]\  }}|› d |› �‘ŒS ©ú=r©   ©Ú.0rj   rÑ   s      r   ú
<listcomp>z8MlflowCallbackHandler.on_chain_start.<locals>.<listcomp>�  s&   € ÐFÐFÐF©t¨q°! 1 
 
 q 
 
ÐFÐFÐFrA   rö   r¿   rÆ   Úchain_start_N)
r†   r6   r   rË   rm   rÐ   r   rÍ   rÝ   r‹   )rd   rÓ   rö   rL   r´   r9   Úchain_inputÚ
input_resps           r   rø   z$MlflowCallbackHandler.on_chain_startŒ  su  € ð 	Œ�VÐÐÔ Ñ!ÐÐÑØŒ�^Ð$Ð$Ô$¨Ñ)Ð$Ð$Ñ$ØŒ�XÐÐÔ !Ñ#ÐÐÑà”| NÔ3ˆà!ˆØ�Š�XÐ/Ð0Ñ1Ô1Ð1Ø�Š•L Ñ,Ô,Ñ-Ô-Ð-Ø�Š�D”LÑ!Ô!Ð!àŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCà—h’hÐFÐF°v·|²|±~´~ÐFÑFÔFÑGÔGˆÝ˜d‘^”^ˆ
Ø*ˆ
�8ÑØŒÐ-Ô.×5Ò5°jÑAÔAÐAØŒÐ%Ô&×-Ò-¨jÑ9Ô9Ð9ØŒ
×Ò˜Ð%B°LÐ%BÐ%BÑCÔCÐCÐCÐCrA   Úoutputsc                 ó|  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }d                     d„ |                     ¦   «         D ¦   «         ¦  «        }|                     d|dœ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬	¦  «         | j        d
                              |¦  «         | j        d                              |¦  «         | j                             |d|› �¦  «         dS )zRun when chain ends running.rƒ   rÖ   rµ   r±   rù   c                 ó"   — g | ]\  }}|› d |› �‘ŒS rû   r©   rý   s      r   rÿ   z6MlflowCallbackHandler.on_chain_end.<locals>.<listcomp>­  s&   € Ð HÐ HÐ H±°°1 A  ¨  Ð HÐ HÐ HrA   Úon_chain_end)r×   r  rÙ   rÀ   rÆ   Ú
chain_end_N)r†   rm   rÐ   r6   rË   rÍ   rÝ   r‹   )rd   r  rL   rµ   r9   Úchain_outputs         r   r  z"MlflowCallbackHandler.on_chain_end¤  sF  € àŒ�VÐÐÔ Ñ!ÐÐÑØŒ�\Ð"Ð"Ô" aÑ'Ð"Ð"Ñ"ØŒ�VÐÐÔ Ñ!ÐÐÑà”\ ,Ô/ˆ
à!ˆØ—x’xÐ HÐ H¸¿º¹¼Ð HÑ HÔ HÑIÔIˆØ�Š˜~¸,ÐGÐGÑHÔHÐHØ�Š�D”LÑ!Ô!Ð!àŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCàŒÐ+Ô,×3Ò3°DÑ9Ô9Ð9ØŒÐ%Ô&×-Ò-¨dÑ3Ô3Ð3ØŒ
×Ò˜Ð8¨JÐ8Ð8Ñ9Ô9Ð9Ð9Ð9rA   c                 óZ   — | j         dxx         dz  cc<   | j         dxx         dz  cc<   dS )zRun when chain errors.rƒ   rÖ   r²   Nrò   ró   s      r   Úon_chain_errorz$MlflowCallbackHandler.on_chain_error·  rõ   rA   Ú	input_strc                 ó^  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                     d|dœ¦  «         |                     t          |¦  «        ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬¦  «         | j        d                              |¦  «         | j        d	                              |¦  «         | j                             |d
|› �¦  «         dS )zRun when tool starts running.rƒ   rÖ   r¹   r°   Úon_tool_start)r×   r  rÙ   rÁ   rÆ   Útool_start_N)r†   r6   r   rË   rÍ   rÝ   r‹   )rd   rÓ   r  rL   r¹   r9   s         r   r  z#MlflowCallbackHandler.on_tool_start¼  s:  € ð 	Œ�VÐÐÔ Ñ!ÐÐÑØŒ�]Ð#Ð#Ô# qÑ(Ð#Ð#Ñ#ØŒ�XÐÐÔ !Ñ#ÐÐÑà”l =Ô1ˆà!ˆØ�Š˜¸YÐGÐGÑHÔHÐHØ�Š•L Ñ,Ô,Ñ-Ô-Ð-Ø�Š�D”LÑ!Ô!Ð!àŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCàŒÐ,Ô-×4Ò4°TÑ:Ô:Ð:ØŒÐ%Ô&×-Ò-¨dÑ3Ô3Ð3ØŒ
×Ò˜Ð:¨[Ð:Ð:Ñ;Ô;Ð;Ð;Ð;rA   Úoutputc                 ó  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                     d|dœ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬¦  «         | j        d                              |¦  «         | j        d	                              |¦  «         | j                             |d
|› �¦  «         dS )zRun when tool ends running.rƒ   rÖ   rº   r±   Úon_tool_end)r×   r  rÙ   rÂ   rÆ   Ú	tool_end_Nrä   )rd   r  rL   rº   r9   s        r   r  z!MlflowCallbackHandler.on_tool_endÑ  s  € àŒ�VÐÐÔ Ñ!ÐÐÑØŒ�[Ð!Ð!Ô! QÑ&Ð!Ð!Ñ!ØŒ�VÐÐÔ Ñ!ÐÐÑà”L Ô-ˆ	à!ˆØ�Š˜}¸Ð?Ð?Ñ@Ô@Ð@Ø�Š�D”LÑ!Ô!Ð!àŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCàŒÐ*Ô+×2Ò2°4Ñ8Ô8Ð8ØŒÐ%Ô&×-Ò-¨dÑ3Ô3Ð3ØŒ
×Ò˜Ð6¨9Ð6Ð6Ñ7Ô7Ð7Ð7Ð7rA   c                 óZ   — | j         dxx         dz  cc<   | j         dxx         dz  cc<   dS )zRun when tool errors.rƒ   rÖ   r²   Nrò   ró   s      r   Úon_tool_errorz#MlflowCallbackHandler.on_tool_errorã  rõ   rA   r   c                 óð  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                     d|dœ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬¦  «         | j        d                              |¦  «         | j        d                              |¦  «         | j                             |d	|› �¦  «         d
S )z+
        Run when agent is ending.
        rƒ   rÖ   r³   Úon_text)r×   r   rÙ   rÃ   rÆ   Úon_text_Nrä   )rd   r   rL   r³   r9   s        r   r  zMlflowCallbackHandler.on_textè  s  € ð 	Œ�VÐÐÔ Ñ!ÐÐÑØŒ�ZÐ Ð Ô  AÑ%Ð Ð Ñ à”< 
Ô+ˆà!ˆØ�Š˜y°$Ð7Ð7Ñ8Ô8Ð8Ø�Š�D”LÑ!Ô!Ð!àŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCàŒÐ&Ô'×.Ò.¨tÑ4Ô4Ð4ØŒÐ%Ô&×-Ò-¨dÑ3Ô3Ð3ØŒ
×Ò˜Ð4¨(Ð4Ð4Ñ5Ô5Ð5Ð5Ð5rA   Úfinishc                 ó<  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                     d|j        d         |j        dœ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬¦  «         | j        d	                              |¦  «         | j        d
                              |¦  «         | j                             |d|› �¦  «         dS )zRun when agent ends running.rƒ   rÖ   r»   r±   Úon_agent_finishr  )r×   r  ÚlogrÙ   rÄ   rÆ   Úagent_finish_N)r†   r6   Úreturn_valuesr  rË   rÍ   rÝ   r‹   )rd   r  rL   r»   r9   s        r   r  z%MlflowCallbackHandler.on_agent_finishû  s9  € àŒ�VÐÐÔ Ñ!ÐÐÑØŒ�\Ð"Ð"Ô" aÑ'Ð"Ð"Ñ"ØŒ�VÐÐÔ Ñ!ÐÐÑà”\ ,Ô/ˆ
Ø!ˆØ�Šà+Ø Ô.¨xÔ8Ø”zðð ñ	
ô 	
ð 	
ð 	�Š�D”LÑ!Ô!Ð!àŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCàŒÐ.Ô/×6Ò6°tÑ<Ô<Ð<ØŒÐ%Ô&×-Ò-¨dÑ3Ô3Ð3ØŒ
×Ò˜Ð;¨zÐ;Ð;Ñ<Ô<Ð<Ð<Ð<rA   r×   c                 ó<  — | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                     d|j        |j        |j        dœ¦  «         |                     | j         ¦  «         | j                              | j         | j         d         ¬¦  «         | j        d                              |¦  «         | j        d	                              |¦  «         | j                             |d
|› �¦  «         dS )zRun on agent action.rƒ   rÖ   r¹   r°   Úon_agent_action)r×   ÚtoolÚ
tool_inputr  rÙ   rÅ   rÆ   Úagent_action_N)	r†   r6   r   r!  r  rË   rÍ   rÝ   r‹   )rd   r×   rL   r¹   r9   s        r   r  z%MlflowCallbackHandler.on_agent_action  s9  € àŒ�VÐÐÔ Ñ!ÐÐÑØŒ�]Ð#Ð#Ô# qÑ(Ð#Ð#Ñ#ØŒ�XÐÐÔ !Ñ#ÐÐÑà”l =Ô1ˆØ!ˆØ�Šà+ØœØ$Ô/Ø”zð	ð ñ	
ô 	
ð 	
ð 	�Š�D”LÑ!Ô!Ð!ØŒ
×Ò˜4œ<¨d¬l¸6Ô.BÐÑCÔCÐCØŒÐ.Ô/×6Ò6°tÑ<Ô<Ð<ØŒÐ%Ô&×-Ò-¨dÑ3Ô3Ð3ØŒ
×Ò˜Ð<¨{Ð<Ð<Ñ=Ô=Ð=Ð=Ð=rA   c                 óÐ  — t          ¦   «         }|                     | j        d         ¦  «        }|                     | j        d         ¦  «        }ddg}d|j        v r|                     d¦  «         n=d|j        v r4|d                              d„ ¦  «        |d<   |                     d¦  «         ||                              d¬	¦  «                             dd
id¬	¦  «        }g }g }g d¢}ddg}|g d¢|z   |z                                 d¬	¦  «                             dddœd¬	¦  «        }|                     ||gd¬	¦  «        }	|	ddg                              d„ d¬	¦  «        |	d<   |	S )z=Create a dataframe with all the information from the session.r¼   r¾   rƒ   rB   rf   Úidc                 ó   — | d         S )Néÿÿÿÿr©   )Úid_s    r   ú<lambda>zCMlflowCallbackHandler._create_session_analysis_df.<locals>.<lambda>5  s
   € ˜C œG€ rA   rÖ   )ÚaxisÚprompt_stepr   r4   r5   )rƒ   r   Útoken_usage_total_tokensÚtoken_usage_prompt_tokensÚtoken_usage_completion_tokensÚoutput_stepr  )rƒ   r   c                 ó:   — t          | d         | d         ¦  «        S )NrB   r  )rI   )Úrows    r   r(  zCMlflowCallbackHandler._create_session_analysis_df.<locals>.<lambda>h  s   € ÕAØ�H”˜s 8œ}ñô € rA   Ú	chat_html)	r   Ú	DataFramerÍ   ÚcolumnsrÝ   ÚapplyÚdropnaÚrenameÚconcat)
rd   ÚpdÚon_llm_start_records_dfÚon_llm_end_records_dfÚllm_input_columnsÚllm_input_prompts_dfÚcomplexity_metrics_columnsÚvisualizations_columnsÚllm_outputs_dfÚsession_analysis_dfs
             r   Ú_create_session_analysis_dfz1MlflowCallbackHandler._create_session_analysis_df(  sÚ  € å‰_Œ_ˆØ"$§,¢,¨t¬|Ð<RÔ/SÑ"TÔ"TÐØ "§¢¨T¬\Ð:NÔ-OÑ PÔ PÐà# XÐ.ÐØÐ,Ô4Ð4Ð4Ø×$Ò$ VÑ,Ô,Ð,Ð,ØÐ,Ô4Ð4Ð4ð /FÀdÔ.K×.QÒ.QØ#Ð#ñ/ô /Ð# FÑ+ð ×$Ò$ VÑ,Ô,Ð,à#Ð$5Ô6ßŠV˜ˆV‰^Œ^ßŠV�V˜]Ð+°!ˆVÑ4Ô4ð 	ð
 &(Ð"Ø!#Ðð&
ð &
ð &
Ð"ð& #4°ZÐ!@Ðð "ðð ð ð -ñ-ð )ñ)ô
÷ ŠV˜ˆV‰^Œ^ßŠV˜]°HÐ=Ð=ÀAˆVÑFÔFð 	ð !ŸišiÐ)=¸~Ð(NÐUV˜iÑWÔWÐØ+>Ø�xÐ ô,
ç
Š%ðð ð ð	 ñ 
ô 
ð 	˜KÑ(ð #Ð"rA   FÚlangchain_assetc                 ó  — t          ¦   «         }| j                             d|                     | j        d         ¦  «        ¦  «         |                      ¦   «         }|                     d¦  «        }|                     ddd¬¦  «        }| j                             d|                     |¦  «        ¦  «         | j                             d 	                    | 
                    ¦   «         ¦  «        d¦  «         |�r_dt          t          |¦  «        ¦  «        v r| j                             |¦  «         �n%t          t          | j        j        d	¦  «        ¦  «        }	 |                     |¦  «         | j                             |¦  «         nÍ# t&          $ r“ 	 |                     |¦  «         | j                             |¦  «         n_# t*          $ r% t-          d
¦  «         t/          j        ¦   «          Y n1t2          $ r% t-          d
¦  «         t/          j        ¦   «          Y nw xY wY n1t2          $ r% t-          d
¦  «         t/          j        ¦   «          Y nw xY w|r/| j                             ¦   «          |                      ¦   «          d S d S )NrÆ   r1  rE   rR   T)ÚregexÚsession_analysiszlangchain.chains.llm.LLMChainz
model.jsonzCould not save model.)r   rË   r“   r2  rÍ   rA  rí   rF   r�   rm   Útolistr¦   Útyper    r   rÊ   rf   Úsaver›   Ú
ValueErrorÚ
save_agentÚAttributeErrorÚprintÚ	tracebackÚ	print_excÚNotImplementedErrorr|   rÒ   )rd   rB  r  r8  r@  r1  Úlangchain_asset_paths          r   Úflush_trackerz#MlflowCallbackHandler.flush_trackero  sŽ  € Ý‰_Œ_ˆØŒ
×ÒÐ)¨2¯<ª<¸¼ÐEUÔ8VÑ+WÔ+WÑXÔXÐXØ"×>Ò>Ñ@Ô@ÐØ'×+Ò+¨KÑ8Ô8ˆ	Ø×%Ò% d¨B°dÐ%Ñ;Ô;ˆ	ØŒ
×ÒÐ+¨R¯\ª\Ð:MÑ-NÔ-NÑOÔOÐOØŒ
�Š˜Ÿš 	× 0Ò 0Ñ 2Ô 2Ñ3Ô3°[ÑAÔAÐAàñ 	ð /µ#µd¸?Ñ6KÔ6KÑ2LÔ2LÐLÐLØ”
×-Ò-¨oÑ>Ô>Ð>Ñ>å'*­4°´Ô0BÀLÑ+QÔ+QÑ'RÔ'RÐ$ðØ#×(Ò(Ð)=Ñ>Ô>Ð>Ø”J×'Ò'Ð(<Ñ=Ô=Ð=Ð=øÝ!ð ð ð ð
Ø'×2Ò2Ð3GÑHÔHÐHØœ
×+Ò+Ð,@ÑAÔAÐAÐAøÝ)ð ð ð ÝÐ5Ñ6Ô6Ð6Ý!Ô+Ñ-Ô-Ð-Ø˜Ý.ð ð ð ÝÐ5Ñ6Ô6Ð6Ý!Ô+Ñ-Ô-Ð-Ø˜ðøøøøøõ +ð ð ð ÝÐ1Ñ2Ô2Ð2ÝÔ'Ñ)Ô)Ð)Ø�Dðøøøð ð 	ØŒJ×!Ò!Ñ#Ô#Ð#Ø�KŠK‰MŒMˆMˆMˆMð	ð 	sH   Å/F Æ
IÆ/GÇIÇ,H#Ç3IÇ5+H#È IÈ"H#È#IÈ(+IÉI)r¬   rž   NNr¡   )NF) r¢   r£   r¤   r¥   r   r¦   r   re   rÒ   r   r   rØ   râ   r   rç   ÚBaseExceptionrô   rø   r  r
  r  r  r  r  r   r  r
   r  rA  ÚboolrQ  Ú__classcell__)rÎ   s   @r   r«   r«   ä   s€  ø€ € € € € ðð ð  /Ø$/Ø#Ø&*ð;
ð ;
à�sŒmð;
ð ˜S”Mð;
ð �tŒnð	;
ð
 ˜s”mð;
ð 
ð;
ð ;
ð ;
ð ;
ð ;
ð ;
ðz!ð !ð !ð !ðRØ˜s C˜xœ.ðRØ37¸´9ðRØHKðRà	ðRð Rð Rð Rð0@ cð @°Sð @¸Tð @ð @ð @ð @ð"&Q 9ð &Q¸ð &QÀð &Qð &Qð &Qð &QðP$ -ð $¸3ð $À4ð $ð $ð $ð $ð
DØ˜s C˜xœ.ðDØ26°s¸C°x´.ðDØLOðDà	ðDð Dð Dð Dð0: D¨¨c¨¤Nð :¸cð :Àdð :ð :ð :ð :ð&$ Mð $¸Sð $ÀTð $ð $ð $ð $ð
<Ø˜s C˜xœ.ð<Ø58ð<ØDGð<à	ð<ð <ð <ð <ð*8 #ð 8°ð 8¸ð 8ð 8ð 8ð 8ð$$ =ð $¸Cð $ÀDð $ð $ð $ð $ð
6˜Cð 6¨3ð 6°4ð 6ð 6ð 6ð 6ð&= kð =¸Sð =ÀTð =ð =ð =ð =ð.> kð >¸Sð >ÀSð >ð >ð >ð >ð,E#¨Sð E#ð E#ð E#ð E#ðN%ð %¨Sð %Àð %ÐRVð %ð %ð %ð %ð %ð %ð %ð %rA   r«   )N)&rW   rn   rp   rÈ   rM  Úcopyr   Úpathlibr   Útypingr   r   r   r   r	   Úlangchain_core.agentsr
   r   Úlangchain_core.callbacksr   Úlangchain_core.outputsr   Úlangchain_core.utilsr   Ú#langchain_community.callbacks.utilsr   r   r   r   r   r   r   r¦   rì   r@   rI   rK   r«   r©   rA   r   ú<module>r]     s  ðØ 	€	€	€	Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð	�sð 	ð 	ð 	ð 	ð ð8ð 8Ø
ð8à	ð8ð 
ð8ð 8ð 8ð 8ðv°cð Àsð Èsð ð ð ð ð,kFð kFð kFð kFð kFñ kFô kFð kFð\pð pð pð pð pÐ7Ð9Lñ pô pð pð pð prA   