
    7|h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        l/var/www/html/test/engine/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9T9V#
25C'3'--#
 #
 	.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 )zConstruct 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     ~~dF3%--dF;-. /	 
 	 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                        | _
        nt        |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KK((6![[1188KKMDN;;55dnnEDL/(=rL KK((6H--v-!%!4!4V!<!A!A!O!O
 #7-/G#  ${{AA/R<<+%)\\%?%?DN%)[[%B%B?%SDN:z 2FJJx4N	
 ::or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"NN6#9#9FMM#IQO CRy5(++**,77D 8 C XX__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    sE$++>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   >    "'',,txxH: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>    "'',,txxH:T):;DKK 	 	
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      dkk :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 3B HL#CH~7?}	&?# ?e ? ?
 TU:$sEz*DcN:;:CKC=:	:
$sCx. 
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    		$JB	(* 335!** OOYYYY;;,,

 %'	 NE ::&67	!+-DM
 +B*CD3QD %'$&"$&($&%'#%!')')*,(* (
  O  	"NN155!!	"  	!NN155! DMM	! 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  s\    LL&&( 	 DAqDLLO	 LL&&( 	!DAq DLL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,-DLL!

4<<dll6.BC$W- 	RKC"4.K$*K!LL/077DLL)*11+>JJ[Jzl(3%*PQ	R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(#ll=1!1EBCDLL!

4<<dll6.BC+,33D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~  s4   V!Z A% V!<<
+!X|,-L!4!4!:;<DLL!

4<<dll6.BC#// 	UK#,[#9 UZ"*4.&&|JOO4E'FG&& " HH!% -?;J;N;N1<& JJ&&*!\\&1 '  1299/J-.55oF

  (<u'MN$7&56G&HOJJOO'+joo2N)N 0.z:HJJOOHf{:??7S.ST9U	Ur   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  sx    	V!^$)$X!#||N3!X/01L,-DLL!

4<<dll6.BCfd#((6<<>#J41aqc1#J#JKK%((F#C5CJ#CDKf+Kd^
*
8-.55j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  sH    	V!\"a'"V!\\,/
!gt$88GMMO$LDAqs!A3Z$LML&88CW$56Lw<L~,GHDLL!

4<<dll6.BC+,33D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!#ll=1!YGHL,-DLL!

4<<dll6.BC,-44T:%&--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!LL-	!}?@DLL!

4<<dll6.BC*+224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DLL!

4<<dll6.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zz	
 	DLL!

4<<dll6.BC./66t<%&--d3

zl;<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!#ll=1!+$//zz		
 	DLL!

4<<dll6.BC./66t<%&--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!#<<(:;!3eDEL,-DLL!

4<<dll6.BC1299$?%&--d3

!12B1C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c!f%8s   )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 1 )!T2 A XX%8a%889

 
 	1@STUDLL!

4<<dll6.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G r   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s8} 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^VV]+!V4 	 .2]]-F')B 	# 04xx/C
+ 	
 +
a3H3P3P.PA
 

 " &	&
 -- )) VV^V]H=AVF 	 !ii)=~(NUVi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    DLL!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       |rd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<<EU8V+WX$$&"&"B"B"D+//<I!))$$)?IJJ/>Q1RSJJOOBGGI$4$4$67E /#d?6K2LL

--o>'*40B0BL+Q'R$#(()=>JJ''(<=" JJ!!#KKM ! " 
'223G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
smE
 SME
 tn	E

 smE
 E
 E
 
E
N!RsCx.R379RHKR	R0@c @S @T @",U9 ,U ,U ,U\$- $3 $4 $
DsCx.D26sCx.DLOD	D::T#s(^S$s);<:HK:	:4$M $S $T $
<sCx.<58<DG<	<*8# 8 8 8&$= $C $D $
6C 63 64 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79L Hr   