Ë
    µŒjk  ã            	       ó‚  — d dl Z 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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 d d
lmZmZm Z m!Z!m"Z"m#Z#  e jH                  e%«      Z&defd„Z'dee(   fd„Z)dee(   fd„Z*	 	 dde(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/y)é    N)Údeepcopy)ÚPath)ÚAnyÚDictÚListÚOptionalÚSequenceÚUnion)ÚAgentActionÚAgentFinish)ÚBaseCallbackHandler)ÚDocument)Ú	LLMResult)Úget_from_dict_or_envÚguard_import)ÚBaseMetadataCallbackHandlerÚflatten_dictÚhash_stringÚimport_pandasÚimport_spacyÚimport_textstatÚreturnc                  ó   — t        d«      S )zKImport the mlflow python package and raise an error if it is not installed.Úmlflow)r   © ó    úw/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/callbacks/mlflow_callback.pyÚimport_mlflowr      s   € ä˜Ó!Ð!r   c                  ó
   — g d¢S )z!Get the metrics to log to MLFlow.)ÚstepÚstartsÚendsÚerrorsÚtext_ctrÚchain_startsÚ
chain_endsÚ
llm_startsÚllm_endsÚllm_streamsÚtool_startsÚ	tool_endsÚ
agent_endsÚretriever_startsÚretriever_endsr   r   r   r   Úmlflow_callback_metricsr/   "   s   € òð r   c                  ó
   — g d¢S )z.Get the text complexity metrics from textstat.)Ú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Úosmanr   r   r   r   Úget_text_complexity_metricsr@   7   s   € òð r   ÚtextÚnlpÚtextstatc           	      ó€  — i }|�Lt        «       D �ci c]  }| t        ||«      | «      “Œ }}|j                  d|i«       |j                  |«       |�ft        «       } || «      }|j                  j                  |ddd¬«      }|j                  j                  |ddd¬«      }	||	dœ}
|j                  |
«       |S c c}w )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.
        textstat: The textstat library to use for complexity metrics calculation.

    Returns:
        (dict): A dictionary containing the complexity metrics and visualization
            files serialized to  HTML string.
    Útext_complexity_metricsÚdepFT)ÚstyleÚjupyterÚpageÚent)Údependency_treeÚentities)r@   ÚgetattrÚupdater   ÚdisplacyÚrender)rA   rB   rC   ÚrespÚkeyrE   ÚspacyÚdocÚdep_outÚent_outÚtext_visualizationss              r   Úanalyze_textrX   M   sÝ   € ð  €DØÐä9TÔ9Vó#
Ù9V°#ˆCÐ'”˜ 3Ó'¨Ó-Ñ-Ð9Vð 	 ð #
ð 	�‰Ð.Ð0GÐHÔIØ�‰Ð+Ô,à
€Ü“ˆÙ�$‹iˆà—.‘.×'Ñ'¨°5À%ÈdÐ'ÓSˆà—.‘.×'Ñ'¨°5À%ÈdÐ'ÓSˆð  'Øñ
Ðð
 	�‰Ð'Ô(à€Kùò+#
s   ‘B;ÚpromptÚ
generationc                 ó\   — | j                  dd«      }|j                  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)rY   rZ   Úformatted_promptÚformatted_generations       r   Ú)construct_html_from_prompt_and_generationr`   w   sO   € ð —~‘~ d¨FÓ3ÐØ%×-Ñ-¨d°FÓ;ÐðØ-Ð.ð /	ð 
Ðð ð	ð r   c            	       ó  — e Zd ZdZdefd„Z	 ddedeeef   dee   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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y) Ú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 ry| j                  j	                  d«       | j                  j
                  j                  j                  «       | _        | j                  j                  | j                  «      | _
        næt        |ddd«      }| j                  j	                  |«       |j                  d«      x}r5| j                  j                  |«      j                  j                  | _        nut        |dd«      }| j                  j!                  |«      | _
        | j                  �| j                  j                  | _        n | j                  j#                  |«      | _        | j%                  |d	   |d
   |j                  dd «      «       |j                  dd«      | _        y )NÚDATABRICKS_RUNTIME_VERSIONÚ
databricksÚtracking_uriÚMLFLOW_TRACKING_URIÚ Úrun_idÚexperiment_nameÚMLFLOW_EXPERIMENT_NAMEÚrun_nameÚrun_tagsÚartifacts_dir)r   r   ÚosÚenvironÚset_tracking_uriÚtrackingÚfluentÚ_get_experiment_idÚ	mlf_expidÚget_experimentÚmlf_expr   ÚgetÚget_runÚinfoÚexperiment_idÚget_experiment_by_nameÚcreate_experimentÚ	start_runÚdir)Úselfrc   rg   rj   rk   s        r   Ú__init__zMlflowLogger.__init__š   s[  € Ü#“oˆŒØ'¬2¯:©:Ñ5Ø�K‰K×(Ñ(¨Ô6Ø!Ÿ[™[×1Ñ1×8Ñ8×KÑKÓMˆDŒNØŸ;™;×5Ñ5°d·n±nÓEˆD�Lä/Ø˜Ð(=¸róˆLð �K‰K×(Ñ(¨Ô6àŸ™ HÓ-Ð-ˆvÐ-Ø!%§¡×!4Ñ!4°VÓ!<×!AÑ!A×!OÑ!O�•ô
 #7ØÐ-Ð/Gó#�ð  $Ÿ{™{×AÑAÀ/ÓR�”Ø—<‘<Ð+Ø%)§\¡\×%?Ñ%?�D•Nà%)§[¡[×%BÑ%BÀ?Ó%S�D”Nà�‰Ø�:Ñ  zÑ 2°F·J±J¸xÈÓ4Nô	
ð —:‘:˜o¨rÓ2ˆ�r   NÚnameÚtagsrj   r   c                 ój  — |€ª|j                  d«      rMdj                  t        j                  t        j
                  t        j                  z   d¬«      «      }|dd |z   }| j                  j                  «       j                  | j                  ||¬«      }|j                  j                  }|| _        y)z¨
        If run_id is provided, it will reuse the run with the given run_id.
        Otherwise, it starts a new run, auto generates the random suffix for name.
        Nz-%ri   é   )Úkéÿÿÿÿ)rm   r„   )ÚendswithÚjoinÚrandomÚchoicesÚstringÚascii_uppercaseÚdigitsr   ÚMlflowClientÚ
create_runrv   r{   rj   )r�   rƒ   r„   rj   ÚrnameÚruns         r   r   zMlflowLogger.start_runº   s•   € ð ˆ>Ø�}‰}˜TÔ"ØŸ™Ü—N‘N¤6×#9Ñ#9¼F¿M¹MÑ#IÈQÔOó�ð ˜C˜R�y 5Ñ(�Ø—+‘+×*Ñ*Ó,×7Ñ7Ø—‘¨°Dð 8ó ˆCð —X‘X—_‘_ˆFØˆ�r   c                 ó8   — | j                   j                  «        y)zTo finish the run.N)r   Úend_run©r�   s    r   Ú
finish_runzMlflowLogger.finish_runÍ   s   € à�‰×ÑÕr   rR   Úvaluec                 óT   — | j                   j                  ||| j                  ¬«       y)zTo log metric to mlflow server.©rj   N)r   Ú
log_metricrj   )r�   rR   r˜   s      r   ÚmetriczMlflowLogger.metricÑ   s   € à�‰×Ñ˜s E°$·+±+ÐÕ>r   Údatar    c                 óR   — | j                   j                  || j                  ¬«       y)z%To log all metrics in the input dict.rš   N)r   Úlog_metricsrj   )r�   r�   r    s      r   ÚmetricszMlflowLogger.metricsÕ   s   € ð 	�‰×Ñ ¨T¯[©[ÐÕ9r   Úfilenamec                 óª   — | j                   j                  |t        j                  j	                  | j
                  |› d�«      | j                  ¬«       y)z,To log the input data as json file artifact.z.jsonrš   N)r   Úlog_dictrp   ÚpathrŠ   r€   rj   )r�   r�   r¡   s      r   ÚjsonfzMlflowLogger.jsonfÛ   ó>   € à�‰×ÑØ”"—'‘'—,‘,˜tŸx™x¨H¨:°UÐ);Ó<ÀTÇ[Á[ð 	õ 	
r   Ú	dataframec                 óJ   — | j                  |j                  «       d|› �«       y)z1To log the input pandas dataframe as a html tableÚtable_N)ÚhtmlÚto_html)r�   rƒ   r§   s      r   ÚtablezMlflowLogger.tableá   s   € à�	‰	�)×#Ñ#Ó%¨°¨v Õ7r   rª   c                 óª   — | j                   j                  |t        j                  j	                  | j
                  |› d�«      | j                  ¬«       y)z3To log the input html string as html file artifact.z.htmlrš   N©r   Úlog_textrp   r¤   rŠ   r€   rj   )r�   rª   r¡   s      r   rª   zMlflowLogger.htmlå   r¦   r   rA   c                 óª   — | j                   j                  |t        j                  j	                  | j
                  |› d�«      | j                  ¬«       y)z,To log the input text as text file artifact.z.txtrš   Nr®   )r�   rA   r¡   s      r   rA   zMlflowLogger.textë   s>   € à�‰×ÑØ”"—'‘'—,‘,˜tŸx™x¨H¨:°TÐ):Ó;ÀDÇKÁKð 	õ 	
r   r¤   c                 óR   — | j                   j                  || j                  ¬«       y)z/To upload the file from given path as artifact.rš   N)r   Úlog_artifactrj   )r�   r¤   s     r   ÚartifactzMlflowLogger.artifactñ   s   € à�‰× Ñ  ¨d¯k©kÐ Õ:r   Úchainc                 óh   — | j                   j                  j                  |d| j                  ¬«       y )Nzlangchain-modelrš   )r   Ú	langchainÚ	log_modelrj   )r�   r´   s     r   Úlangchain_artifactzMlflowLogger.langchain_artifactõ   s&   € Ø�‰×Ñ×'Ñ'¨Ð/@ÈÏÉÐ'ÕUr   ©N©r   N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r‚   Ústrr   r   r   r—   Úfloatrœ   r
   Úintr    r¥   r¬   rª   rA   r³   r¸   r   r   r   rb   rb   �   sG  „ ñ
ð3 ó 3ðB HLñØðØ# C¨ H™~ðØ7?À±}ðà	óó&ð?˜#ð ? eð ?°ó ?ð
 TUñ:Ø˜$˜s E˜zÑ*¨D°°c°©NÐ:Ñ;ð:ØCKÈCÁ=ð:à	ó:ð
˜$˜s C˜x™.ð 
°Cð 
¸Dó 
ð8˜#ð 8¨#ð 8°$ó 8ð
˜ð 
¨ð 
°ó 
ð
˜ð 
¨ð 
°ó 
ð;˜Sð ; Tó ;ðV¨ð V°ô Vr   rb   c                   óL  ‡ — e Zd ZdZ	 	 	 	 	 	 d/dee   dee   dee   dee   dee   ded	dfˆ fd
„Zd0d„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e	f   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ee	f   d&ede	d	e	fd'„Zd(ee   de	d	e	fd)„Z dede	d	e	fd*„Z!d	e	fd+„Z"d	e#fd,„Z$d1d-e	d"e#d	dfd.„Z%ˆ xZ&S )2Ú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.
    Nrƒ   Ú
experimentr„   rg   rj   ro   r   c                 ó–  •— t        «        t        «        t        ‰
| �  «        || _        || _        |xs i | _        || _        || _        || _	        t        j                  «       | _        t        | j                  | j
                  | j                  | j                  | j                  | j                  ¬«      | _        g | _        d| _        	 t#        «       }	 |j%                  d«      | _        	 t1        «       | _        t5        «       D �	ci c]  }	|	d“Œ c}	| _        g g g g g g g g g g g g g dœ| _        y# t&        $ r t(        j+                  d«       Y Œdw xY w# t,        $ r)}t(        j+                  |j.                  «       Y d}~Œ•d}~ww xY w# t,        $ r0}t(        j+                  |j.                  «       d| _        Y d}~ŒÁd}~ww xY wc c}	w )zInitialize callback handler.)rg   rk   rm   rn   rj   ro   NÚen_core_web_smzfRun `python -m spacy download en_core_web_sm` to download en_core_web_sm model for text visualization.r   )Ú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Úon_retriever_start_recordsÚon_retriever_end_recordsÚaction_records)r   r   Úsuperr‚   rƒ   rÄ   r„   rg   rj   ro   ÚtempfileÚTemporaryDirectoryÚtemp_dirrb   ÚmlflgrÓ   rB   r   ÚloadÚOSErrorÚloggerÚwarningÚImportErrorÚmsgr   rC   r/   r    Úrecords)r�   rƒ   rÄ   r„   rg   rj   ro   rS   ÚerR   Ú	__class__s             €r   r‚   zMlflowCallbackHandler.__init__  s   ø€ ô 	ŒÜŒÜ‰ÑÔàˆŒ	Ø$ˆŒØ’J˜BˆŒ	Ø(ˆÔØˆŒØ*ˆÔä ×3Ñ3Ó5ˆŒä!Ø×*Ñ*Ø ŸO™OØ—Y‘YØ—Y‘YØ—;‘;Ø×,Ñ,ô
ˆŒ
ð %'ˆÔØˆŒð	Ü “NˆEðØ Ÿ:™:Ð&6Ó7�”ð	!Ü+Ó-ˆDŒMô
 +BÔ*CÓDÑ*C 3˜˜Q™Ð*CÑDˆŒð %'Ø$&Ø"$Ø&(Ø$&Ø%'Ø#%Ø!Ø')Ø')Ø*,Ø(*Ø ñ(
ˆ�øô ò Ü—‘ðOöðûô ò 	"Ü�N‰N˜1Ÿ5™5×!Ñ!ûð	"ûô ò 	!Ü�N‰N˜1Ÿ5™5Ô!Ø ˆD�M‰Mûð	!üò EsH   Ã
E ÃD1 Ã.F
 Ä	
GÄ1EÅEÅ	FÅFÆFÆ
	GÆ&F>Æ>Gc                 óÈ   — | j                   j                  «       D ]  \  }}d| j                   |<   Œ | j                  j                  «       D ]  \  }}g | j                  |<   Œ y )Nr   )r    Úitemsrß   )r�   r‡   Úvs      r   Ú_resetzMlflowCallbackHandler._resetO  sR   € Ø—L‘L×&Ñ&Ö(‰DˆAˆqØˆD�L‰L˜ŠOð )à—L‘L×&Ñ&Ö(‰DˆAˆqØ ˆD�L‰L˜ŠOñ )r   Ú
serializedÚpromptsrc   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 }|j                  ddi«       |j                  t        |«      «       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬«       t	        |«      D ]s  \  }}t        |«      }||d<   | j                  d	   j                  |«       | j                  d
   j                  |«       | j                  j                  |d|› d|› �«       Œu y)zRun when LLM starts.r    é   r'   r!   ÚactionÚon_llm_start©r    rY   rÇ   rÓ   Ú
llm_start_Ú_prompt_N)	r    rN   r   rØ   Ú	enumerater   rß   Úappendr¥   )	r�   ræ   rç   rc   r'   rQ   ÚidxrY   Úprompt_resps	            r   rë   z"MlflowCallbackHandler.on_llm_startU  s   € ð 	�‰�VÓ Ñ!ÓØ�‰�\Ó" aÑ'Ó"Ø�‰�XÓ !Ñ#Óà—\‘\ ,Ñ/ˆ
à!ˆØ�‰�X˜~Ð.Ô/Ø�‰”L Ó,Ô-Ø�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCä$ WÖ-‰KˆC�Ü" 4›.ˆKØ$*ˆK˜Ñ!Ø�L‰LÐ/Ñ0×7Ñ7¸ÔDØ�L‰LÐ)Ñ*×1Ñ1°+Ô>Ø�J‰J×Ñ˜[¨J°z°lÀ(È3È%Ð*PÕQñ .r   Útokenc                 óþ  — | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   | j                   d   }i }|j                  d|dœ«       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬«       | j                  d   j	                  |«       | j                  d   j	                  |«       | j                  j                  |d	|› �«       y
)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    rN   rØ   rß   rð   r¥   )r�   ró   rc   r)   rQ   s        r   rõ   z&MlflowCallbackHandler.on_llm_new_tokenm  sÎ   € à�‰�VÓ Ñ!ÓØ�‰�]Ó# qÑ(Ó#à—l‘l =Ñ1ˆà!ˆØ�‰Ð1¸EÑBÔCØ�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCà�‰Ð+Ñ,×3Ñ3°DÔ9Ø�‰Ð%Ñ&×-Ñ-¨dÔ3Ø�
‰
×Ñ˜ °°Ð>Õ?r   Ú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 }|j                  ddi«       |j                  t        |j                  xs i «      «       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬«       |j
                  D �]›  }t        |«      D �]‰  \  }}t        |«      }|j                  t        |j                  «       «      «       |j                  t        |j                  | j                  | j                  ¬«      «       d	|v r;|j                  d	«      }	| j                  j                  |	| j                   d   ¬«       | j                  d
   j                  |«       | j                  d   j                  |«       | j                  j!                  |d|› d|› �«       d|v r7|d   }
| j                  j#                  |
dt%        |j                  «      z   «       d|v s�ŒS|d   }| j                  j#                  |dt%        |j                  «      z   «       �ŒŒ �Œž y)zRun when LLM ends running.r    ré   r(   r"   rê   Ú
on_llm_endrì   )rB   rC   rE   rÉ   rÓ   Úllm_end_Ú_generation_rK   zdep-rL   zent-N)r    rN   r   Ú
llm_outputrØ   Úgenerationsrï   r   ÚdictrX   rA   rB   rC   Úpoprß   rð   r¥   rª   r   )r�   rø   rc   r(   rQ   rþ   rñ   rZ   Úgeneration_respÚcomplexity_metricsrK   rL   s               r   rú   z MlflowCallbackHandler.on_llm_end~  s&  € à�‰�VÓ Ñ!ÓØ�‰�ZÓ  AÑ%Ó Ø�‰�VÓ Ñ!Óà—<‘< 
Ñ+ˆà!ˆØ�‰�X˜|Ð,Ô-Ø�‰”L ×!4Ñ!4Ò!:¸Ó;Ô<Ø�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCà#×/Õ/ˆKÜ#,¨[×#9‘��ZÜ"*¨4£.�Ø×&Ñ&¤|°J·O±OÓ4EÓ'FÔGØ×&Ñ&Ü Ø"Ÿ™Ø ŸH™HØ!%§¡ôôð -°Ñ?Ø;J×;NÑ;NØ1ó<Ð&ð —J‘J×&Ñ&Ø*Ø!Ÿ\™\¨&Ñ1ð 'ô ð —‘Ð1Ñ2×9Ñ9¸/ÔJØ—‘Ð-Ñ.×5Ñ5°oÔFØ—
‘
× Ñ  ¨°(°¸<ÈÀuÐ'MÔNØ$¨Ñ7Ø&5Ð6GÑ&H�OØ—J‘J—O‘OØ'¨´+¸j¿o¹oÓ2NÑ)Nôð  Ó0Ø.¨zÑ:�HØ—J‘J—O‘O H¨f´{À:Ç?Á?Ó7SÑ.SÖTò9 $:ñ 0r   Úerrorc                 ó`   — | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   y)zRun when LLM errors.r    ré   r#   N©r    ©r�   r  rc   s      r   Úon_llm_errorz"MlflowCallbackHandler.on_llm_error¬  ó*   € à�‰�VÓ Ñ!ÓØ�‰�XÓ !Ñ#Ôr   Ú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 }|j                  ddi«       |j                  t        |«      «       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬«       t	        |t
        «      r8dj                  |j                  «       D ��cg c]  \  }}|› d	|› �‘Œ c}}«      }nDt	        |t        «      r)dj                  |D �	cg c]  }	t        |	«      ‘Œ c}	«      }nt        |«      }t        |«      }
||
d
<   | j                  d   j                  |
«       | j                  d   j                  |
«       | j                  j                  |
d|› �«       yc c}}w c c}	w )zRun when chain starts running.r    ré   r%   r!   rê   Úon_chain_startrì   Ú,Ú=r	  rÊ   rÓ   Úchain_start_N)r    rN   r   rØ   Ú
isinstancerÿ   rŠ   rã   Úlistr¿   r   rß   rð   r¥   )r�   ræ   r	  rc   r%   rQ   r‡   rä   Úchain_inputÚinputÚ
input_resps              r   r  z$MlflowCallbackHandler.on_chain_start±  s€  € ð 	�‰�VÓ Ñ!ÓØ�‰�^Ó$¨Ñ)Ó$Ø�‰�XÓ !Ñ#Óà—|‘| NÑ3ˆà!ˆØ�‰�XÐ/Ð0Ô1Ø�‰”L Ó,Ô-Ø�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCä�fœdÔ#ØŸ(™(¸6¿<¹<¼>Ô#J¹>±4°1°a q c¨¨1¨#¢J¸>Ò#JÓK‰KÜ˜¤Ô%ØŸ(™(¹FÓ#C¹F°5¤C¨¥J¸FÑ#CÓD‰Kä˜f›+ˆKÜ˜d“^ˆ
Ø*ˆ
�8ÑØ�‰Ð-Ñ.×5Ñ5°jÔAØ�‰Ð%Ñ&×-Ñ-¨jÔ9Ø�
‰
×Ñ˜ |°L°>Ð%BÕCùó $Kùâ#Cs   ÄG
Ä:GÚ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 }t        |t        «      r8dj                  |j	                  «       D ��cg c]  \  }}|› d|› �‘Œ c}}«      }n;t        |t
        «      r dj                  t        t        |«      «      }nt        |«      }|j                  d|dœ«       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬	«       | j                  d
   j                  |«       | j                  d   j                  |«       | j                  j                  |d|› �«       yc c}}w )zRun when chain ends running.r    ré   r&   r"   r  r  Úon_chain_end)rê   r  rì   rË   rÓ   Ú
chain_end_N)r    r  rÿ   rŠ   rã   r  Úmapr¿   rN   rØ   rß   rð   r¥   )r�   r  rc   r&   rQ   r‡   rä   Úchain_outputs           r   r  z"MlflowCallbackHandler.on_chain_endÎ  sL  € ð 	�‰�VÓ Ñ!ÓØ�‰�\Ó" aÑ'Ó"Ø�‰�VÓ Ñ!Óà—\‘\ ,Ñ/ˆ
à!ˆÜ�gœtÔ$ØŸ8™8¸G¿M¹M¼OÔ$L¹O±D°A°q¨ s¨!¨A¨3¢Z¸OÒ$LÓM‰LÜ˜¤Ô&ØŸ8™8¤C¬¨WÓ$5Ó6‰Lä˜w›<ˆLØ�‰˜~¸,ÑGÔHØ�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCà�‰Ð+Ñ,×3Ñ3°DÔ9Ø�‰Ð%Ñ&×-Ñ-¨dÔ3Ø�
‰
×Ñ˜ ¨J¨<Ð8Õ9ùó %Ms   ÂF
c                 ó`   — | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   y)zRun when chain errors.r    ré   r#   Nr  r  s      r   Úon_chain_errorz$MlflowCallbackHandler.on_chain_errorè  r  r   Ú	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 }|j                  d|dœ«       |j                  t        |«      «       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬«       | j                  d   j                  |«       | j                  d	   j                  |«       | j                  j                  |d
|› �«       y)zRun when tool starts running.r    ré   r*   r!   Úon_tool_start)rê   r  rì   rÌ   rÓ   Útool_start_N©r    rN   r   rØ   rß   rð   r¥   )r�   ræ   r  rc   r*   rQ   s         r   r  z#MlflowCallbackHandler.on_tool_startí  sô   € ð 	�‰�VÓ Ñ!ÓØ�‰�]Ó# qÑ(Ó#Ø�‰�XÓ !Ñ#Óà—l‘l =Ñ1ˆà!ˆØ�‰˜¸YÑGÔHØ�‰”L Ó,Ô-Ø�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCà�‰Ð,Ñ-×4Ñ4°TÔ:Ø�‰Ð%Ñ&×-Ñ-¨dÔ3Ø�
‰
×Ñ˜ ¨[¨MÐ:Õ;r   Úoutputc                 óB  — t        |«      }| 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 }|j                  d|dœ«       |j                  | j                  «       | j                  j                  | j                  | j                  d   ¬«       | j                  d   j                  |«       | j                  d	   j                  |«       | j                  j                  |d
|› �«       y)zRun when tool ends running.r    ré   r+   r"   Úon_tool_end)rê   r!  rì   rÍ   rÓ   Ú	tool_end_N)r¿   r    rN   rØ   rß   rð   r¥   )r�   r!  rc   r+   rQ   s        r   r#  z!MlflowCallbackHandler.on_tool_end  sê   € ä�V“ˆØ�‰�VÓ Ñ!ÓØ�‰�[Ó! QÑ&Ó!Ø�‰�VÓ Ñ!Óà—L‘L Ñ-ˆ	à!ˆØ�‰˜}¸Ñ?Ô@Ø�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCà�‰Ð*Ñ+×2Ñ2°4Ô8Ø�‰Ð%Ñ&×-Ñ-¨dÔ3Ø�
‰
×Ñ˜ ¨9¨+Ð6Õ7r   c                 ó`   — | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   y)zRun when tool errors.r    ré   r#   Nr  r  s      r   Úon_tool_errorz#MlflowCallbackHandler.on_tool_error  r  r   rA   c                 óþ  — | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   | j                   d   }i }|j                  d|dœ«       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬«       | j                  d   j	                  |«       | j                  d   j	                  |«       | j                  j                  |d	|› �«       y
)z,
        Run when text is received.
        r    ré   r$   Úon_text)rê   rA   rì   rÎ   rÓ   Úon_text_Nr÷   )r�   rA   rc   r$   rQ   s        r   r(  zMlflowCallbackHandler.on_text  sÏ   € ð 	�‰�VÓ Ñ!ÓØ�‰�ZÓ  AÑ%Ó à—<‘< 
Ñ+ˆà!ˆØ�‰˜y°$Ñ7Ô8Ø�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCà�‰Ð&Ñ'×.Ñ.¨tÔ4Ø�‰Ð%Ñ&×-Ñ-¨dÔ3Ø�
‰
×Ñ˜ ¨(¨Ð4Õ5r   Ú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 }|j                  d|j                  d   |j                  dœ«       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬«       | j
                  d	   j                  |«       | j
                  d
   j                  |«       | j                  j                  |d|› �«       y)zRun when agent ends running.r    ré   r,   r"   Úon_agent_finishr!  )rê   r!  Úlogrì   rÏ   rÓ   Úagent_finish_N)r    rN   Úreturn_valuesr-  rØ   rß   rð   r¥   )r�   r*  rc   r,   rQ   s        r   r,  z%MlflowCallbackHandler.on_agent_finish-  sû   € à�‰�VÓ Ñ!ÓØ�‰�\Ó" aÑ'Ó"Ø�‰�VÓ Ñ!Óà—\‘\ ,Ñ/ˆ
Ø!ˆØ�‰à+Ø ×.Ñ.¨xÑ8Ø—z‘zñô	
ð 	�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCà�‰Ð.Ñ/×6Ñ6°tÔ<Ø�‰Ð%Ñ&×-Ñ-¨dÔ3Ø�
‰
×Ñ˜ ¨z¨lÐ;Õ<r   rê   c                 ól  — | 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 }|j                  d|j                  |j                  |j                  dœ«       |j                  | j                   «       | j
                  j                  | j                   | j                   d   ¬«       | j                  d   j                  |«       | j                  d	   j                  |«       | j
                  j                  |d
|› �«       y)zRun on agent action.r    ré   r*   r!   Úon_agent_action)rê   ÚtoolÚ
tool_inputr-  rì   rÐ   rÓ   Úagent_action_N)	r    rN   r2  r3  r-  rØ   rß   rð   r¥   )r�   rê   rc   r*   rQ   s        r   r1  z%MlflowCallbackHandler.on_agent_actionD  sý   € à�‰�VÓ Ñ!ÓØ�‰�]Ó# qÑ(Ó#Ø�‰�XÓ !Ñ#Óà—l‘l =Ñ1ˆØ!ˆØ�‰à+ØŸ™Ø$×/Ñ/Ø—z‘zñ	ô	
ð 	�‰�D—L‘LÔ!Ø�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCØ�‰Ð.Ñ/×6Ñ6°tÔ<Ø�‰Ð%Ñ&×-Ñ-¨dÔ3Ø�
‰
×Ñ˜ ¨{¨mÐ<Õ=r   Úqueryc                 ó`  — | 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 }|j                  d|dœ«       |j                  t        |«      «       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬«       | j                  d   j                  |«       | j                  d	   j                  |«       | j                  j                  |d
|› �«       y)z"Run when Retriever starts running.r    ré   r-   r!   Úon_retriever_start)rê   r5  rì   rÑ   rÓ   Úretriever_start_Nr   )r�   ræ   r5  rc   r-   rQ   s         r   r7  z(MlflowCallbackHandler.on_retriever_startZ  sû   € ð 	�‰�VÓ Ñ!ÓØ�‰Ð'Ó(¨AÑ-Ó(Ø�‰�XÓ !Ñ#ÓàŸ<™<Ð(:Ñ;Ðà!ˆØ�‰Ð3¸eÑDÔEØ�‰”L Ó,Ô-Ø�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCà�‰Ð1Ñ2×9Ñ9¸$Ô?Ø�‰Ð%Ñ&×-Ñ-¨dÔ3Ø�
‰
×Ñ˜Ð!1Ð2BÐ1CÐDÕEr   Ú	documentsc                 ó@  — | 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 ���cg c]n  }|j                  |j                  j                  «       D ��ci c]9  \  }}|t	        |t
        «      st        |«      ndj                  d„ |D «       «      “Œ; c}}dœ‘Œp }}}}|j                  d|d	œ«       |j                  | j                   «       | j                  j                  | j                   | j                   d   ¬
«       | j                  d   j                  |«       | j                  d   j                  |«       | j                  j                  |d|› �«       yc c}}w c c}}}w )z Run when Retriever ends running.r    ré   r.   r"   r  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr¹   )r¿   )Ú.0Úxs     r   Ú	<genexpr>z9MlflowCallbackHandler.on_retriever_end.<locals>.<genexpr>†  s   è ø€ Ð%8±a°¤c¨!§f±aùs   ‚)Úpage_contentÚmetadataÚon_retriever_end)rê   r9  rì   rÒ   rÓ   Úretriever_end_N)r    r?  r@  rã   r  r  r¿   rŠ   rN   rØ   rß   rð   r¥   )	r�   r9  rc   r.   rQ   rT   r‡   rä   Úretriever_documentss	            r   rA  z&MlflowCallbackHandler.on_retriever_endr  s�  € ð 	�‰�VÓ Ñ!ÓØ�‰Ð%Ó&¨!Ñ+Ó&Ø�‰�VÓ Ñ!ÓàŸ™Ð&6Ñ7ˆà!ˆñ !õ
ñ !�ð !$× 0Ñ 0ð !$§¡× 2Ñ 2Ô 4ôñ !5™˜˜1ð ä)¨!¬TÔ2ô ˜Aœà ŸX™XÑ%8±aÓ%8Ó8ñ9ð
 !5òó
ð !ð 	ò 
ð 	�‰Ð1Ð@SÑTÔUØ�‰�D—L‘LÔ!à�
‰
×Ñ˜4Ÿ<™<¨d¯l©l¸6Ñ.BÐÔCà�‰Ð/Ñ0×7Ñ7¸Ô=Ø�‰Ð%Ñ&×-Ñ-¨dÔ3Ø�
‰
×Ñ˜ °Ð/?Ð@ÕAùó%ùô
s   Á-FÂ
>FÃFÆFc                 ó`   — | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   y)zRun when Retriever errors.r    ré   r#   Nr  r  s      r   Úon_retriever_errorz(MlflowCallbackHandler.on_retriever_error–  r  r   c                 ó  — t        «       }|j                  | j                  d   «      }|j                  | j                  d   «      }ddg}d|j                  v r|j	                  d«       n7d|j                  v r)|d   j                  d„ «      |d<   |j	                  d«       ||   j                  d¬	«      j                  dd
id¬	«      }| j                  �
t        «       ng }| j                  �ddgng }g d¢}|D �	cg c]  }	|	|j                  v sŒ|	‘Œ }}	|ddg|z   |z   |z      j                  d¬	«      j                  dddœd¬	«      }
|j                  ||
gd¬	«      }|ddg   j                  d„ d¬	«      |d<   |S c c}	w )z=Create a dataframe with all the information from the session.rÇ   rÉ   r    rY   rƒ   Úidc                 ó   — | d   S )Nrˆ   r   )Úid_s    r   Ú<lambda>zCMlflowCallbackHandler._create_session_analysis_df.<locals>.<lambda>¨  s   € ˜C šGr   ré   )ÚaxisÚprompt_steprK   rL   )Útoken_usage_total_tokensÚtoken_usage_prompt_tokensÚtoken_usage_completion_tokensrA   Úoutput_stepr!  )r    rA   c                 ó&   — t        | d   | d   «      S )NrY   r!  )r`   )Úrows    r   rJ  zCMlflowCallbackHandler._create_session_analysis_df.<locals>.<lambda>Ñ  s   € ÔAØ�H‘˜s 8™}ôr   Ú	chat_html)r   Ú	DataFramerß   Úcolumnsrð   ÚapplyÚdropnaÚrenamerC   r@   rB   Úconcat)r�   ÚpdÚon_llm_start_records_dfÚon_llm_end_records_dfÚllm_input_columnsÚllm_input_prompts_dfÚcomplexity_metrics_columnsÚvisualizations_columnsÚtoken_usage_columnsr=  Úllm_outputs_dfÚsession_analysis_dfs               r   Ú_create_session_analysis_dfz1MlflowCallbackHandler._create_session_analysis_df›  sì  € ä‹_ˆØ"$§,¡,¨t¯|©|Ð<RÑ/SÓ"TÐØ "§¡¨T¯\©\Ð:NÑ-OÓ PÐà# XÐ.ÐØÐ,×4Ñ4Ñ4Ø×$Ñ$ VÕ,ØÐ,×4Ñ4Ñ4ð /FÀdÑ.K×.QÑ.QÙ#ó/Ð# FÑ+ð ×$Ñ$ VÔ,à#Ð$5Ñ6ß‰V˜ˆV‹^ß‰V�V˜]Ð+°!ˆVÓ4ð 	ð .2¯]©]Ð-FÔ'Ô)ÈBð 	#ð 04¯x©xÐ/CÐ 
Ñ+Èð 	ò
Ðñ +ó
Ù*�!¨aÐ3H×3PÑ3PÒ.PŠAÐ*ð 	ð 
ð
 "àØðð &ñ	&ð
 -ñ-ð )ñ)ñ÷ ‰V˜ˆV‹^ß‰V˜]°HÑ=ÀAˆVÓFð 	ð !Ÿi™iÐ)=¸~Ð(NÐUV˜iÓWÐØ+>Ø�xÐ ñ,
ç
‰%ñð ð	 ó 
ð 	˜KÑ(ð #Ð"ùò5
s   Ã<E=ÄE=c                 ó2   — t        | j                  d   «      S )NrÇ   )Úboolrß   r–   s    r   Ú_contain_llm_recordsz*MlflowCallbackHandler._contain_llm_recordsØ  s   € Ü�D—L‘LÐ!7Ñ8Ó9Ð9r   Úlangchain_assetc                 óÂ  — t        «       }| j                  j                  d|j                  | j                  d   «      «       | j                  «       r™| j                  «       }|j                  d«      }|j                  ddd¬«      }| j                  j                  d|j                  |«      «       | j                  j                  dj                  |j                  «       «      d«       |rˆdt        t        |«      «      v r| j                  j                  |«       nVt        t        | j                   j"                  d	«      «      }	 |j%                  |«       | j                  j'                  |«       |r+| j                  j7                  «        | j9                  «        y y # t(        $ rˆ 	 |j+                  |«       | j                  j'                  |«       nW# t,        $ r" t/        d
«       t1        j2                  «        Y n-t4        $ r" t/        d
«       t1        j2                  «        Y nw xY wY Œ¾t4        $ r" t/        d
«       t1        j2                  «        Y Œçw xY w)NrÓ   rS  r\   ri   T)ÚregexÚsession_analysiszlangchain.chains.llm.LLMChainz
model.jsonzCould not save model.)r   rØ   r¬   rT  rß   rg  rd  r   r]   rª   rŠ   Útolistr¿   Útyper¸   r   r×   rƒ   Úsaver³   Ú
ValueErrorÚ
save_agentÚAttributeErrorÚprintÚ	tracebackÚ	print_excÚNotImplementedErrorr—   rå   )r�   rh  r*  rZ  rc  rS  Úlangchain_asset_paths          r   Úflush_trackerz#MlflowCallbackHandler.flush_trackerÛ  sæ  € Ü‹_ˆØ�
‰
×ÑÐ)¨2¯<©<¸¿¹ÐEUÑ8VÓ+WÔXØ×$Ñ$Ô&Ø"&×"BÑ"BÓ"DÐØ+×/Ñ/°Ó<ˆIØ!×)Ñ)¨$°¸$Ð)Ó?ˆIØ�J‰J×ÑÐ/°·±Ð>QÓ1RÔSØ�J‰J�O‰O˜BŸG™G I×$4Ñ$4Ó$6Ó7¸ÔEáð /´#´d¸?Ó6KÓ2LÑLØ—
‘
×-Ñ-¨oÕ>ä'*¬4°·±×0BÑ0BÀLÓ+QÓ'RÐ$ðØ#×(Ñ(Ð)=Ô>Ø—J‘J×'Ñ'Ð(<Ô=ñ" Ø�J‰J×!Ñ!Ô#Ø�K‰K�Mð øô! "ò ð
Ø'×2Ñ2Ð3GÔHØŸ
™
×+Ñ+Ð,@ÕAøÜ)ò ÜÐ5Ô6Ü!×+Ñ+Ô-ÙÜ.ò ÜÐ5Ô6Ü!×+Ñ+Ô-Ùðüô +ò ÜÐ1Ô2Ü×'Ñ'Ô)ÙðúsH   Å
,F$ Æ$	IÆ.,GÇIÇ(H/ÈIÈ'H/È,IÈ.H/È/IÈ4'IÉI)zlangchainrun-%r¶   NNNri   rº   )NF)'r»   r¼   r½   r¾   r   r¿   r   r‚   rå   r   r   rë   rõ   r   rú   ÚBaseExceptionr  r  r
   r  r  r  r#  r&  r(  r   r,  r   r1  r7  r	   r   rA  rE  rd  rf  rg  rw  Ú__classcell__)rá   s   @r   rÃ   rÃ   ù   sý  ø„ ñð  /Ø$/Ø#Ø&*Ø $ØñE
à�s‰mðE
ð ˜S‘MðE
ð �t‰nð	E
ð
 ˜s‘mðE
ð ˜‘ðE
ð ðE
ð 
õE
óN!ðRØ˜s C˜x™.ðRØ37¸±9ðRØHKðRà	óRð0@ cð @°Sð @¸Tó @ð",U 9ð ,U¸ð ,UÀó ,Uð\$ -ð $¸3ð $À4ó $ð
DØ˜s C˜x™.ðDØ26°s¸C°x±.ðDØLOðDà	óDð::Ø˜T # s (™^¨S°$°s±)Ð;Ñ<ð:ØHKð:à	ó:ð4$ Mð $¸Sð $ÀTó $ð
<Ø˜s C˜x™.ð<Ø58ð<ØDGð<à	ó<ð*8 #ð 8°ð 8¸ó 8ð&$ =ð $¸Cð $ÀDó $ð
6˜Cð 6¨3ð 6°4ó 6ð&= kð =¸Sð =ÀTó =ð.> kð >¸Sð >ÀSó >ð,Fà˜˜c˜‘NðFð ðFð ð	Fð
 
óFð0"Bà˜HÑ%ð"Bð ð"Bð 
ó	"BðH$¨ð $Àð $Èó $ð
;#¨Só ;#ðz: dó :ñ&¨Sð &Àð &ÐRV÷ &r   rÃ   )NN)0Úloggingrp   r‹   r�   rÕ   rs  Úcopyr   Úpathlibr   Útypingr   r   r   r   r	   r
   Úlangchain_core.agentsr   r   Úlangchain_core.callbacksr   Úlangchain_core.documentsr   Úlangchain_core.outputsr   Úlangchain_core.utilsr   r   Ú#langchain_community.callbacks.utilsr   r   r   r   r   r   Ú	getLoggerr»   rÛ   r   r¿   r/   r@   rÿ   rX   r`   rb   rÃ   r   r   r   Ú<module>r…     sé   ðÛ Û 	Û Û Û Û Ý Ý ß =× =ç :Ý 8Ý -Ý ,ß C÷÷ ð 
ˆ×	Ñ	˜8Ó	$€ð"�só "ð
  c¡ó ð* T¨#¡Yó ð0 Øñ'Ø
ð'à	ð'ð ð'ð 
ó	'ðT°cð Àsð Èsó ÷,iVñ iVôXHÐ7Ð9Lõ Hr   