
    dhk              	          S SK r S SKrS SKrS SKrS SKrS SKrS SKJr  S SKJ	r	  S SK
JrJrJrJrJrJr  S SKJrJr  S SKJr  S SKJr  S SKJr  S S	KJrJr  S S
KJrJrJ r J!r!J"r"J#r#  \ RH                  " \%5      r&S\4S jr'S\\(   4S jr)S\\(   4S jr*  SS\(S\S\S\+4S jjr,S\(S\(S\4S jr- " S S5      r. " S S\\5      r/g)    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                      [        S5      $ )zKImport the mlflow python package and raise an error if it is not installed.mlflow)r        e/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/callbacks/mlflow_callback.pyimport_mlflowr      s    !!r   c                  
    / SQ$ )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                  
    / SQ$ )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                 x   0 nUbL  [        5        Vs0 sH  oD[        X$5      " U 5      _M     nnUR                  SU05        UR                  U5        Ub`  [        5       nU" U 5      nUR                  R                  USSSS9nUR                  R                  USSSS9n	UU	S.n
UR                  U
5        U$ s  snf )aq  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#
9V#'--9V 	  #
 	.0GHI+,
$i..''5%d'S..''5%d'S  '

 	'(K+#
s   B7prompt
generationc                 \    U R                  SS5      nUR                  SS5      nSU SU S3$ )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            	       <   \ rS rSrSrS\4S jr SS\S\\\4   S\	\   S	S4S
 jjr
S S jrS\S\S	S4S jr S!S\\\\4   \\\4   4   S\	\   S	S4S jjrS\\\4   S\S	S4S jrS\S\S	S4S jrS\S\S	S4S jrS\S\S	S4S jrS\S	S4S jrS\S	S4S jrSrg)"MlflowLogger   ar  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                    [        5       U l        S[        R                  ;   ay  U R                  R	                  S5        U R                  R
                  R                  R                  5       U l        U R                  R                  U R                  5      U l
        O[        USSS5      nU R                  R	                  U5        UR                  S5      =n(       a5  U R                  R                  U5      R                  R                  U l        Ov[        USS5      nU R                  R!                  U5      U l
        U R                  b  U R                  R                  U l        O U R                  R#                  U5      U l        U R%                  US	   US
   UR                  SS 5      5        UR                  SS5      U l        g )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)selfrd   rh   rk   rl   s        r   __init__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tagsrk   r   c                 h   Uc  UR                  S5      (       aK  SR                  [        R                  " [        R
                  [        R                  -   SS95      nUSS U-   nU R                  R                  5       R                  U R                  XS9nUR                  R                  nX0l        g)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-%rj      )k)rn   r   )endswithjoinrandomchoicesstringascii_uppercasedigitsr   MlflowClient
create_runrw   r|   rk   )r   r   r   rk   rnameruns         r   r   MlflowLogger.start_run   s     >}}T""NN6#9#9FMM#IQO CRy5(++**,77 8 C XX__Fr   c                 8    U R                   R                  5         g)zTo finish the run.N)r   end_runr   s    r   
finish_runMlflowLogger.finish_run   s    r   rR   valuec                 L    U R                   R                  XU R                  S9  g)zTo log metric to mlflow server.rk   N)r   
log_metricrk   )r   rR   r   s      r   metricMlflowLogger.metric   s    s$++>r   datar    c                 J    U R                   R                  XR                  S9  g)z%To log all metrics in the input dict.r   N)r   log_metricsrk   )r   r   r    s      r   metricsMlflowLogger.metrics   s     	[[9r   filenamec                     U R                   R                  U[        R                  R	                  U R
                  U S35      U R                  S9  g)z,To log the input data as json file artifact.z.jsonr   N)r   log_dictrq   pathr   r   rk   )r   r   r   s      r   jsonfMlflowLogger.jsonf   >    "'',,txxH:U);<T[[ 	 	
r   	dataframec                 J    U R                  UR                  5       SU 35        g)z1To log the input pandas dataframe as a html tabletable_N)htmlto_html)r   r   r   s      r   tableMlflowLogger.table   s    		)##%v7r   r   c                     U R                   R                  U[        R                  R	                  U R
                  U S35      U R                  S9  g)z3To log the input html string as html file artifact.z.htmlr   Nr   log_textrq   r   r   r   rk   )r   r   r   s      r   r   MlflowLogger.html   r   r   rA   c                     U R                   R                  U[        R                  R	                  U R
                  U S35      U R                  S9  g)z,To log the input text as text file artifact.z.txtr   Nr   )r   rA   r   s      r   rA   MlflowLogger.text   s>    "'',,txxH:T):;DKK 	 	
r   r   c                 J    U R                   R                  XR                  S9  g)z/To upload the file from given path as artifact.r   N)r   log_artifactrk   )r   r   s     r   artifactMlflowLogger.artifact   s      kk :r   chainc                 b    U R                   R                  R                  USU R                  S9  g )Nzlangchain-modelr   )r   	langchain	log_modelrk   )r   r   s     r   langchain_artifactMlflowLogger.langchain_artifact   s&    ''/@'Ur   )r   ry   rw   r   rk   Nr   N)r   )__name__
__module____qualname____firstlineno____doc__r   r   strr   r   r   r   floatr   r
   intr   r   r   r   rA   r   r   __static_attributes__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                     ^  \ rS rSrSr      S1S\\   S\\   S\\   S\\   S\\   S	\S
S4U 4S jjjrS2S jr	S\\\
4   S\\   S\
S
S4S jrS\S\
S
S4S jrS\S\
S
S4S jrS\S\
S
S4S jrS\\\
4   S\\\
4   S\
S
S4S jrS\\\\
4   \\\   4   S\
S
S4S jrS\S\
S
S4S jrS\\\
4   S\S\
S
S4S jrS\
S\
S
S4S jrS\S\
S
S4S  jrS!\S\
S
S4S" jrS#\S\
S
S4S$ jrS%\S\
S
\
4S& jrS\\\
4   S'\S\
S
\
4S( jrS)\\    S\
S
\
4S* jr!S\S\
S
\
4S+ jr"S
\
4S, jr#S
\$4S- jr%S3S.\
S#\$S
S4S/ jjr&S0r'U =r($ )4MlflowCallbackHandler   a'  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   rh   rk   rp   r   c                   > [        5         [        5         [        T
U ]  5         Xl        X l        U=(       d    0 U l        X@l        XPl        X`l	        [        R                  " 5       U l        [        U R                  U R
                  U R                  U R                  U R                  U R                  S9U l        / U l        SU l         [#        5       n UR%                  S5      U l         [1        5       U l        [5        5        V	s0 sH  oS_M     sn	U l        / / / / / / / / / / / / / S.U l        g! [&         a    [(        R+                  S5         Nff = f! [,         a)  n[(        R+                  UR.                  5         SnANSnAff = f! [,         a0  n[(        R+                  UR.                  5        SU l         SnANSnAff = fs  sn	f )zInitialize callback handler.)rh   rl   rn   ro   rk   rp   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   rh   rk   rp   tempfileTemporaryDirectorytemp_dirrb   mlflgr   rB   r   loadOSErrorloggerwarningImportErrormsgr   rC   r/   r   records)r   r   r   r   rh   rk   rp   rS   erR   	__class__s             r   r   MlflowCallbackHandler.__init__  s    		$JB	(* 335!** OOYYYY;;,,

 %'	 NE ::&67	!+-DM
 +B*CD*C3Q*CD %'$&"$&($&%'#%!')')*,(* (
  O  	"NN155!!	"  	!NN155! DMM	! EsH   

E D0 ,F G0EE
FFF
G&G  Gc                     U R                   R                  5        H  u  pSU R                   U'   M     U R                  R                  5        H  u  p/ U R                  U'   M     g )Nr   )r   itemsr   )r   r   vs      r   _resetMlflowCallbackHandler._resetO  sN    LL&&(DADLLO )LL&&(DA DLLO )r   
serializedpromptsrd   c                    U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nUR                  SS05        UR                  [        U5      5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S9  [	        U5       Hr  u  pg[        U5      nXxS'   U R                  S	   R                  U5        U R                  S
   R                  U5        U R                  R                  USU SU 35        Mt     g)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   rd   r'   rQ   idxrY   prompt_resps	            r   r   "MlflowCallbackHandler.on_llm_startU  s    	V!\"a'"X!#\\,/
!X~./L,-DLL!

4<<dll6.BC$W-KC"4.K$*!LL/077DLL)*11+>JJ[Jzl(3%*PQ .r   tokenc                    U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nUR                  SUS.5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S9  U R                  S   R	                  U5        U R                  S   R	                  U5        U R                  R                  US	U 35        g
)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  rd   r)   rQ   s        r   r  &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           
      &   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nUR                  SS05        UR                  [        UR                  =(       d    0 5      5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S9  UR
                   GH  n[        U5       GH  u  pg[        U5      nUR                  [        UR                  5       5      5        UR                  [        UR                  U R                  U R                  S95        S	U;   a8  UR                  S	5      n	U R                  R                  U	U R                   S   S9  U R                  S
   R                  U5        U R                  S   R                  U5        U R                  R!                  USU SU 35        SU;   a7  US   n
U R                  R#                  U
S[%        UR                  5      -   5        SU;   d  GMS  US   nU R                  R#                  US[%        UR                  5      -   5        GM     GM     g)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  rd   r(   rQ   r  r  rZ   generation_respcomplexity_metricsrK   rL   s               r   r   MlflowCallbackHandler.on_llm_end~  s$   V!Z A% V!<<
+!X|,-L!4!4!:;<DLL!

4<<dll6.BC#//K#,[#9"*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 $: 0r   errorc                 `    U R                   S==   S-  ss'   U R                   S==   S-  ss'   g)zRun when LLM errors.r    r   r#   Nr   r   r  rd   s      r   on_llm_error"MlflowCallbackHandler.on_llm_error  *    V!X!#r   inputsc           	         U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nUR                  SS05        UR                  [        U5      5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S9  [	        U[
        5      (       a9  SR                  UR                  5        VVs/ sH  u  pgU S	U 3PM     snn5      nOK[	        U[        5      (       a+  SR                  U V	s/ sH  n	[        U	5      PM     sn	5      nO[        U5      n[        U5      n
XS
'   U R                  S   R                  U
5        U R                  S   R                  U
5        U R                  R                  U
SU 35        gs  snnf s  sn	f )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  rd   r%   rQ   r   r   chain_inputinput
input_resps              r   r   $MlflowCallbackHandler.on_chain_start  s    	V!^$)$X!#||N3!X/01L,-DLL!

4<<dll6.BCfd##((6<<>#J>41qc1#J>#JKK%%((F#CF5CJF#CDKf+Kd^
*8-.55jA%&--j9

|L>%BC $K#Cs   G
Goutputsc           	      N   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 n[        U[        5      (       a9  SR                  UR	                  5        VVs/ sH  u  pVU SU 3PM     snn5      nO@[        U[
        5      (       a   SR                  [        [        U5      5      nO[        U5      nUR                  SUS.5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S	9  U R                  S
   R                  U5        U R                  S   R                  U5        U R                  R                  USU 35        gs  snnf )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*  rd   r&   rQ   r   r   chain_outputs           r   r,  "MlflowCallbackHandler.on_chain_end  sP    	V!\"a'"V!\\,/
!gt$$88GMMO$LODAs!A3ZO$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                 `    U R                   S==   S-  ss'   U R                   S==   S-  ss'   g)zRun when chain errors.r    r   r#   Nr  r  s      r   on_chain_error$MlflowCallbackHandler.on_chain_error  r  r   	input_strc                 Z   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nUR                  SUS.5        UR                  [        U5      5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S9  U R                  S   R                  U5        U R                  S	   R                  U5        U R                  R                  US
U 35        g)zRun when tool starts running.r    r   r*   r!   on_tool_start)r   r4  r   r   r   tool_start_Nr   rN   r   r   r   r  r   )r   r   r4  rd   r*   rQ   s         r   r6  #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                 <   [        U5      nU R                  S==   S-  ss'   U R                  S==   S-  ss'   U R                  S==   S-  ss'   U R                  S   n0 nUR                  SUS.5        UR                  U R                  5        U R                  R                  U R                  U R                  S   S9  U R                  S   R                  U5        U R                  S	   R                  U5        U R                  R                  US
U 35        g)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:  rd   r+   rQ   s        r   r<  !MlflowCallbackHandler.on_tool_end  s    VV![!Q&!V!LL-	!}?@DLL!

4<<dll6.BC*+2248%&--d3

9+67r   c                 `    U R                   S==   S-  ss'   U R                   S==   S-  ss'   g)zRun when tool errors.r    r   r#   Nr  r  s      r   on_tool_error#MlflowCallbackHandler.on_tool_error  r  r   rA   c                    U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nUR                  SUS.5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S9  U R                  S   R	                  U5        U R                  S   R	                  U5        U R                  R                  US	U 35        g
)z
Run when text is received.
r    r   r$   on_text)r   rA   r   r   r   on_text_Nr	  )r   rA   rd   r$   rQ   s        r   rC  MlflowCallbackHandler.on_text  s     	V!Z A% <<
+!y$78DLL!

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

(45r   finishc                 V   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nUR                  SUR                  S   UR                  S.5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S9  U R
                  S	   R                  U5        U R
                  S
   R                  U5        U R                  R                  USU 35        g)zRun when agent ends running.r    r   r,   r"   on_agent_finishr:  )r   r:  logr   r   r   agent_finish_N)r   rN   return_valuesrI  r   r   r  r   )r   rF  rd   r,   rQ   s        r   rH  %MlflowCallbackHandler.on_agent_finish-  s    V!\"a'"V!\\,/
!+ ..x8zz	
 	DLL!

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

zl;<r   r   c                 f   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nUR                  SUR                  UR                  UR                  S.5        UR                  U R                   5        U R
                  R                  U R                   U R                   S   S9  U R                  S   R                  U5        U R                  S	   R                  U5        U R
                  R                  US
U 35        g)zRun on agent action.r    r   r*   r!   on_agent_action)r   tool
tool_inputrI  r   r   r   agent_action_N)	r   rN   rO  rP  rI  r   r   r  r   )r   r   rd   r*   rQ   s        r   rN  %MlflowCallbackHandler.on_agent_actionD  s    V!]#q(#X!#ll=1!+$//zz		
 	DLL!

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

{m<=r   queryc                 Z   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nUR                  SUS.5        UR                  [        U5      5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S9  U R                  S   R                  U5        U R                  S	   R                  U5        U R                  R                  US
U 35        g)z"Run when Retriever starts running.r    r   r-   r!   on_retriever_start)r   rS  r   r   r   retriever_start_Nr8  )r   r   rS  rd   r-   rQ   s         r   rU  (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   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S==   S-  ss'   U R                   S   n0 nU VVVs/ sHu  nUR                  UR                  R                  5        VVs0 sH>  u  pgU[	        U[
        5      (       d  [        U5      OSR                  S U 5       5      _M@     snnS.PMw     nnnnUR                  SUS	.5        UR                  U R                   5        U R                  R                  U R                   U R                   S   S
9  U R                  S   R                  U5        U R                  S   R                  U5        U R                  R                  USU 35        gs  snnf s  snnnf )z Run when Retriever ends running.r    r   r.   r"   r!  c              3   6   #    U H  n[        U5      v   M     g 7fr   )r   ).0xs     r   	<genexpr>9MlflowCallbackHandler.on_retriever_end.<locals>.<genexpr>  s     %8ac!ffas   )page_contentmetadataon_retriever_end)r   rX  r   r   r   retriever_end_N)r   r_  r`  r   r$  r%  r   r   rN   r   r   r  r   )	r   rX  rd   r.   rQ   rT   r   r   retriever_documentss	            r   ra  &MlflowCallbackHandler.on_retriever_endr  s    	V!%&!+&V!&67! !
 ! !$ 0 0 !$ 2 2 4 !5 )!T22 A XX%8a%889
 !5
 ! 	 
 	1@STUDLL!

4<<dll6.BC/077=%&--d3

/?@A%
s   -F
AF
FFc                 `    U R                   S==   S-  ss'   U R                   S==   S-  ss'   g)zRun when Retriever errors.r    r   r#   Nr  r  s      r   on_retriever_error(MlflowCallbackHandler.on_retriever_error  r  r   c                    [        5       nUR                  U R                  S   5      nUR                  U R                  S   5      nSS/nSUR                  ;   a  UR	                  S5        O9SUR                  ;   a)  US   R                  S 5      US'   UR	                  S5        X$   R                  SS	9R                  SS
0SS	9nU R                  b
  [        5       O/ nU R                  b  SS/O/ n/ SQnU V	s/ sH  oUR                  ;   d  M  U	PM     nn	USS/U-   U-   U-      R                  SS	9R                  SSS.SS	9n
UR                  XZ/SS	9nUSS/   R                  S SS	9US'   U$ s  sn	f )z=Create a dataframe with all the information from the session.r   r   r    rY   r   idc                     U S   $ )Nr   r   )id_s    r   <lambda>CMlflowCallbackHandler._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                 &    [        U S   U S   5      $ )NrY   r:  )r`   )rows    r   rl  rm    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_df1MlflowCallbackHandler._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,#6VV^VV]+!V4 	 .2]]-F')B 	# 04xx/C
+ 	
 +
*!3H3P3P.PA* 	 

 " &	&
 -- )) VV^V]H=AVF 	 !ii)=(NUViW+>x ,

% 	  
 	K( #"5
s   ;E3E3c                 2    [        U R                  S   5      $ )Nr   )boolr   r   s    r   _contain_llm_records*MlflowCallbackHandler._contain_llm_records  s    DLL!7899r   langchain_assetc                    [        5       nU R                  R                  SUR                  U R                  S   5      5        U R                  5       (       a  U R                  5       nUR                  S5      nUR                  SSSS9nU R                  R                  SUR                  U5      5        U R                  R                  SR                  UR                  5       5      S5        U(       a  S[        [        U5      5      ;   a  U R                  R                  U5        OV[        [        U R                   R"                  S	5      5      n UR%                  U5        U R                  R'                  U5        U(       a+  U R                  R7                  5         U R9                  5         g g ! [(         a     UR+                  U5        U R                  R'                  U5         Nl! [,         a$    [/        S
5        [0        R2                  " 5           N[4         a$    [/        S
5        [0        R2                  " 5           Nf = f[4         a#    [/        S
5        [0        R2                  " 5          Nf = f)Nr   rv  r\   rj   T)regexsession_analysiszlangchain.chains.llm.LLMChainz
model.jsonzCould not save model.)r   r   r   rw  r   r  r  r  r]   r   r   tolistr   typer   r   r   r   saver   
ValueError
save_agentAttributeErrorprint	traceback	print_excNotImplementedErrorr   r   )r   r  rF  r}  r  rv  langchain_asset_paths          r   flush_tracker#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'')s<   ,F2 2
I4=,G++*II4)II4I,I43I4)r   rp   r   r   r   r   rB   r   rk   r   r   rC   rh   )zlangchainrun-%r   NNNrj   r   )NF))r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  BaseExceptionr  r   r
   r,  r2  r6  r<  r@  rC  r   rH  r   rN  rU  r	   r   ra  rf  r  r  r  r  r   __classcell__)r   s   @r   r   r      s     /$/#&* $E
smE
 SME
 tn	E

 smE
 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loggingrq   r   r   r   r  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   