
    Ng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 j$        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/dS )    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        i/var/www/html/ai-engine/env/lib/python3.11/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 }G fdt                      D             }|                    d|i           |                    |           |ot                      } |           }|j                            |ddd          }|j                            |ddd          }||d	}	|                    |	           |S )
a  Analyze text using textstat and spacy.

    Parameters:
        text (str): The text to analyze.
        nlp (spacy.lang): The spacy language model to use for visualization.
        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.
    Nc                 D    i | ]}| t          |                    S r   )getattr).0keyrA   rC   s     r   
<dictcomp>z analyze_text.<locals>.<dictcomp>_   s=     #
 #
 #
25C'3''--#
 #
 #
r   text_complexity_metricsdepFT)stylejupyterpageent)dependency_treeentities)r@   updater   displacyrender)
rA   rB   rC   resprJ   spacydocdep_outent_outtext_visualizationss
   ` `       r   analyze_textr[   M   s      D#
 #
 #
 #
 #
9T9V9V#
 #
 #
 	.0GHIII+,,,
c$ii.''5%d'SS.''5%d'SS  '
 

 	'(((Kr   prompt
generationc                 l    |                      dd          }|                     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)r\   r]   formatted_promptformatted_generations       r   )construct_html_from_prompt_and_generationrc   w   sY     ~~dF33%--dF;;-  
	   r   c            	       F   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dS )!MlflowLoggera  Callback Handler that logs metrics and artifacts to mlflow server.

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

    This handler implements the helper functions to initialize,
    log metrics and artifacts to the mlflow server.
    kwargsc                 d   t                      | _        dt          j        v rg| j                            d           | j        j        j                                        | _        | j        	                    | j                  | _
        nt          |ddd          }| j                            |           |                    d          x}r*| j                            |          j        j        | _        nht          |dd          }| j                            |          | _
        | j
        | j
        j        | _        n| j                            |          | _        |                     |d	         |d
         |                    dd                      |                    dd          | _        d S )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)selfrf   rj   rm   rn   s        r   __init__zMlflowLogger.__init__   s   #oo'2:55K((666![18KKMMDN;55dnEEDLL/(=r L K((666H---v T!%!4!4V!<!<!A!O
 #7-/G# #  ${AA/RR<+%)\%?DNN%)[%B%B?%S%SDN:z 2FJJx4N4N	
 	
 	
 ::or22r   Nnametagsrm   r   c                 \   ||                     d          rMd                    t          j        t          j        t          j        z   d                    }|dd         |z   }| j                                        	                    | j
        ||          }|j        j        }|| _        dS )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-%rl      )k)rp   r   )endswithjoinrandomchoicesstringascii_uppercasedigitsr   MlflowClient
create_runry   r~   rm   )r   r   r   rm   rnameruns         r   r   zMlflowLogger.start_run   s     >}}T"" )N6#9FM#IQOOO  CRCy5(+**,,77D 8  C X_Fr   c                 8    | j                                          dS )zTo finish the run.N)r   end_runr   s    r   
finish_runzMlflowLogger.finish_run   s    r   rH   valuec                 J    | j                             ||| j                   dS )zTo log metric to mlflow server.rm   N)r   
log_metricrm   )r   rH   r   s      r   metriczMlflowLogger.metric   s'    sE$+>>>>>r   r   datar    c                 H    | j                             || j                   dS )z%To log all metrics in the input dict.r   N)r   log_metricsrm   )r   r   r    s      r   metricszMlflowLogger.metrics   s'     	T[99999r   filenamec                     | j                             |t          j                            | j        | d          | j                   dS )z,To log the input data as json file artifact.z.jsonr   N)r   log_dictrs   pathr   r   rm   )r   r   r   s      r   jsonfzMlflowLogger.jsonf   O    "',,txH);););<<T[ 	 	
 	
 	
 	
 	
r   	dataframec                 \    |                      |                                d|            dS )z1To log the input pandas dataframe as a html tabletable_N)htmlto_html)r   r   r   s      r   tablezMlflowLogger.table   s.    		)##%%77777r   r   c                     | j                             |t          j                            | j        | d          | j                   dS )z3To log the input html string as html file artifact.z.htmlr   Nr   log_textrs   r   r   r   rm   )r   r   r   s      r   r   zMlflowLogger.html   r   r   rA   c                     | j                             |t          j                            | j        | d          | j                   dS )z,To log the input text as text file artifact.z.txtr   Nr   )r   rA   r   s      r   rA   zMlflowLogger.text   sO    "',,txH):):):;;DK 	 	
 	
 	
 	
 	
r   r   c                 H    | j                             || j                   dS )z/To upload the file from given path as artifact.r   N)r   log_artifactrm   )r   r   s     r   artifactzMlflowLogger.artifact   s%      dk :::::r   chainc                 T    | j         j                            |d| j                   d S )Nzlangchain-modelr   )r   	langchain	log_modelrm   )r   r   s     r   langchain_artifactzMlflowLogger.langchain_artifact   s+    ''/@'UUUU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   re   re      s       
 
3 3 3 3 3B HL #CH~7?}	   &   ?# ?e ? ? ? ? ?
 TU: :$sEz*DcN:;:CKC=:	: : : :
$sCx. 
C 
D 
 
 
 
8# 8# 8$ 8 8 8 8
 
 
 
 
 
 

 
 
 
 
 
 
;S ;T ; ; ; ;V V V V V V V Vr   re   c                       e Zd ZdZ	 	 	 	 	 	 d3dee         dee         dee         d	ee         d
ee         deddf fdZd4d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$d5d1e	d%e#ddfd2Z% xZ&S )6MlflowCallbackHandleraO  Callback Handler that logs metrics and artifacts to mlflow server.

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

    This handler will utilize the associated callback method called and formats
    the input of each callback function with metadata regarding the state of LLM run,
    and adds the response to the list of records for both the {method}_records and
    action. It then logs the response to mlflow server.
    langchainrun-%r   Nrl   r   
experimentr   rj   rm   rr   r   c                    t                       t                       t                                                       || _        || _        |pi | _        || _        || _        || _	        t          j                    | _        t          | j        | j        | j        | j        | j        | j	                  | _        g | _        d| _        	 t#                      }	 |                    d          | _        n`# t&          $ r t(                              d           Y n:w xY w# t,          $ r)}t(                              |j                   Y d}~nd}~ww xY w	 t1                      | _        n=# t,          $ r0}t(                              |j                   d| _        Y d}~nd}~ww xY wd t5                      D             | _        g g g g g g g g g g g g g d| _        dS )zInitialize callback handler.)rj   rn   rp   rq   rm   rr   Nen_core_web_smzfRun `python -m spacy download en_core_web_sm` to download en_core_web_sm model for text visualization.c                     i | ]}|d S r   r   )rG   rH   s     r   rI   z2MlflowCallbackHandler.__init__.<locals>.<dictcomp>=  s    DDD3QDDDr   )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   rj   rm   rr   tempfileTemporaryDirectorytemp_dirre   mlflgr   rB   r   loadOSErrorloggerwarningImportErrormsgr   rC   r/   r   records)
r   r   r   r   rj   rm   rr   rV   e	__class__s
            r   r   zMlflowCallbackHandler.__init__  s    		$JB	(* 355!* OYY;,
 
 

 %'	 NNE ::&677   O      	" 	" 	"NN15!!!!!!!!	"	!+--DMM 	! 	! 	!NN15!!! DMMMMMM	! ED*A*C*CDDD %'$&"$&($&%'#%!')')*,(* (
 (
sB   	D C3 3$DD
E'EEE( (
F"2&FF"c                     | j                                         D ]\  }}d| j         |<   | j                                        D ]\  }}g | j        |<   d S )Nr   )r   itemsr   )r   r   vs      r   _resetzMlflowCallbackHandler._resetO  sh    L&&(( 	  	 DAqDLOOL&&(( 	! 	!DAq DLOO	! 	!r   
serializedpromptsrf   c                    | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                    ddi           |                    t          |                     |                    | j                    | j                             | j         | j         d                    t	          |          D ]z\  }}t          |          }||d<   | j        d	                             |           | j        d
                             |           | j                            |d| d|            {dS )zRun when LLM starts.r       r'   r!   actionon_llm_startr    r\   r   r   
llm_start__prompt_N)	r   rR   r   r   	enumerater   r   appendr   )	r   r   r   rf   r'   rU   idxr\   prompt_resps	            r   r   z"MlflowCallbackHandler.on_llm_startU  sz    	V!\"""a'"""X!#\,/
!X~.///L,,---DL!!!
4<dl6.BCCC$W-- 	R 	RKC"4..K$*K!L/077DDDL)*11+>>>J[*Pz*P*P3*P*PQQQQ	R 	Rr   tokenc                    | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                    d|d           |                    | j                    | j                             | j         | j         d                    | j        d                             |           | j        d                             |           | j                            |d	|            d
S )z#Run when LLM generates a new token.r    r   r)   on_llm_new_token)r   r   r   r   r   llm_new_tokens_Nr   rR   r   r   r   r   )r   r   rf   r)   rU   s        r   r   z&MlflowCallbackHandler.on_llm_new_tokenm  s   V!]###q(###l=1!1EBBCCCDL!!!
4<dl6.BCCC+,33D999%&--d33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 }|                    ddi           |                    t          |j        pi                      |                    | j                    | j                             | j         | j         d                    |j        D ]}t          |          D ]\  }}t          |          }|                    t          |                                                     |                    t          |j
        | j        | j                             d	|v r<|                    d	          }	| j                             |	| j         d                    | j        d
                             |           | j        d                             |           | j                            |d| d|            d|v r8|d         }
| j                            |
dt%          |j
                  z              d|v r8|d         }| j                            |dt%          |j
                  z              dS )zRun when LLM ends running.r    r   r(   r"   r   
on_llm_endr   )rB   rC   rJ   r   r   llm_end__generation_rP   zdep-rQ   zent-N)r   rR   r   
llm_outputr   generationsr   r   dictr[   rA   rB   rC   popr   r   r   r   r   )r   r   rf   r(   rU   r  r   r]   generation_respcomplexity_metricsrP   rQ   s               r   r   z MlflowCallbackHandler.on_llm_end~  s   V!Z   A%   V!<
+!X|,---L!4!:;;<<<DL!!!
4<dl6.BCCC#/ 	U 	UK#,[#9#9 U UZ"*4..&&|JOO4E4E'F'FGGG&& " H!%     -??;J;N;N1< <& J&&*!\&1 '    1299/JJJ-.55oFFF
  'M('M'M'M'MNNN$77&56G&HOJOO'+jo2N2N)N   00.z:HJOOHf{:?7S7S.STTT9U	U 	Ur   errorc                 Z    | j         dxx         dz  cc<   | j         dxx         dz  cc<   dS )zRun when LLM errors.r    r   r#   Nr   r   r	  rf   s      r   on_llm_errorz"MlflowCallbackHandler.on_llm_error  D    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 }|                    ddi           |                    t          |                     |                    | j                    | j                             | j         | j         d                    t	          |t
                    r2d                    d	 |                                D                       }nDt	          |t                    r d                    d
 |D                       }nt          |          }t          |          }||d<   | j        d                             |           | j        d                             |           | j                            |d|            dS )zRun when chain starts running.r    r   r%   r!   r   on_chain_startr   ,c                 "    g | ]\  }}| d | S =r   rG   r   r   s      r   
<listcomp>z8MlflowCallbackHandler.on_chain_start.<locals>.<listcomp>  s&    #J#J#J41aqJJ1JJ#J#J#Jr   c                 ,    g | ]}t          |          S r   r   )rG   inputs     r   r  z8MlflowCallbackHandler.on_chain_start.<locals>.<listcomp>  s    #C#C#C5CJJ#C#C#Cr   r  r   r   chain_start_N)r   rR   r   r   
isinstancer  r   r   listr   r   r   r   r   )r   r   r  rf   r%   rU   chain_input
input_resps           r   r  z$MlflowCallbackHandler.on_chain_start  s    	V!^$$$)$$$X!#|N3!X/0111L,,---DL!!!
4<dl6.BCCCfd## 	&((#J#J6<<>>#J#J#JKKKK%% 	&((#C#CF#C#C#CDDKKf++Kd^^
*
8-.55jAAA%&--j999
%BL%B%BCCCCCr   outputsc                 B   | 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                    r2d                    d |                                D                       }nMt          |t
                    r)d                    t          t          |                    }nt          |          }|                    d|d           |                    | j                    | j	                             | j         | j         d         	           | j
        d
                             |           | j
        d                             |           | j	                            |d|            dS )zRun when chain ends running.r    r   r&   r"   r  c                 "    g | ]\  }}| d | S r  r   r  s      r   r  z6MlflowCallbackHandler.on_chain_end.<locals>.<listcomp>  s&    $L$L$LDAqZZAZZ$L$L$Lr   on_chain_end)r   r   r   r   r   
chain_end_N)r   r  r  r   r   r  mapr   rR   r   r   r   r   )r   r   rf   r&   rU   chain_outputs         r   r#  z"MlflowCallbackHandler.on_chain_end  s    	V!\"""a'"""V!\,/
!gt$$ 	(88$L$LGMMOO$L$L$LMMLL&& 	(88CW$5$566LLw<<L~,GGHHHDL!!!
4<dl6.BCCC+,33D999%&--d333
8J8899999r   c                 Z    | j         dxx         dz  cc<   | j         dxx         dz  cc<   dS )zRun when chain errors.r    r   r#   Nr  r  s      r   on_chain_errorz$MlflowCallbackHandler.on_chain_error  r  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 }|                    d|d           |                    t          |                     |                    | j                    | j                             | j         | j         d                    | j        d                             |           | j        d	                             |           | j                            |d
|            dS )zRun when tool starts running.r    r   r*   r!   on_tool_start)r   r)  r   r   r   tool_start_Nr   rR   r   r   r   r   r   )r   r   r)  rf   r*   rU   s         r   r+  z#MlflowCallbackHandler.on_tool_start  s:    	V!]###q(###X!#l=1!YGGHHHL,,---DL!!!
4<dl6.BCCC,-44T:::%&--d333
:[::;;;;;r   outputc                 8   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 }|                    d|d           |                    | j                   | j                            | j        | j        d                    | j        d                             |           | j        d	                             |           | j                            |d
|            dS )zRun when tool ends running.r    r   r+   r"   on_tool_end)r   r.  r   r   r   	tool_end_N)r   r   rR   r   r   r   r   )r   r.  rf   r+   rU   s        r   r0  z!MlflowCallbackHandler.on_tool_end  s)   VV![!!!Q&!!!V!L-	!}??@@@DL!!!
4<dl6.BCCC*+224888%&--d333
696677777r   c                 Z    | j         dxx         dz  cc<   | j         dxx         dz  cc<   dS )zRun when tool errors.r    r   r#   Nr  r  s      r   on_tool_errorz#MlflowCallbackHandler.on_tool_error  r  r   rA   c                    | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                    d|d           |                    | j                    | j                             | j         | j         d                    | j        d                             |           | j        d                             |           | j                            |d	|            d
S )z,
        Run when text is received.
        r    r   r$   on_text)r   rA   r   r   r   on_text_Nr   )r   rA   rf   r$   rU   s        r   r5  zMlflowCallbackHandler.on_text  s    	V!Z   A%   <
+!y$77888DL!!!
4<dl6.BCCC&'..t444%&--d333
4(445555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 }|                    d|j        d         |j        d           |                    | j                    | j                             | j         | j         d                    | j        d	                             |           | j        d
                             |           | j                            |d|            dS )zRun when agent ends running.r    r   r,   r"   on_agent_finishr.  )r   r.  logr   r   r   agent_finish_N)r   rR   return_valuesr:  r   r   r   r   )r   r7  rf   r,   rU   s        r   r9  z%MlflowCallbackHandler.on_agent_finish-  s9   V!\"""a'"""V!\,/
!+ .x8z 	
 	
 	
 	DL!!!
4<dl6.BCCC./66t<<<%&--d333
;z;;<<<<<r   r   c                 <   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                    d|j        |j        |j        d           |                    | j                    | j                             | j         | j         d                    | j        d                             |           | j        d	                             |           | j                            |d
|            dS )zRun on agent action.r    r   r*   r!   on_agent_action)r   tool
tool_inputr:  r   r   r   agent_action_N)	r   rR   r?  r@  r:  r   r   r   r   )r   r   rf   r*   rU   s        r   r>  z%MlflowCallbackHandler.on_agent_actionD  s9   V!]###q(###X!#l=1!+$/z	 	
 	
 	
 	DL!!!
4<dl6.BCCC./66t<<<%&--d333
<{<<=====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 }|                    d|d           |                    t          |                     |                    | j                    | j                             | j         | j         d                    | j        d                             |           | j        d	                             |           | j                            |d
|            dS )z"Run when Retriever starts running.r    r   r-   r!   on_retriever_start)r   rB  r   r   r   retriever_start_Nr-  )r   r   rB  rf   r-   rU   s         r   rD  z(MlflowCallbackHandler.on_retriever_startZ  s?    	V!'(((A-(((X!#<(:;!3eDDEEEL,,---DL!!!
4<dl6.BCCC1299$???%&--d333
D2BDDEEEEEr   	documentsc                 2   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }d |D             }|                    d|d           |                    | j                    | j                             | j         | j         d                    | j        d	                             |           | j        d
                             |           | j                            |d|            dS )z Run when Retriever ends running.r    r   r.   r"   c                 d    g | ]-}|j         d  |j                                        D             d.S )c                     i | ]I\  }}|t          |t                    st          |          nd                     d |D                       JS )r  c              3   4   K   | ]}t          |          V  d S r   r  )rG   xs     r   	<genexpr>zOMlflowCallbackHandler.on_retriever_end.<locals>.<listcomp>.<dictcomp>.<genexpr>  s(      %8%8c!ff%8%8%8%8%8%8r   )r  r  r   r   r  s      r   rI   zEMlflowCallbackHandler.on_retriever_end.<locals>.<listcomp>.<dictcomp>  sh        1 )!T229A XX%8%8a%8%8%888	  r   )page_contentmetadata)rM  rN  r   )rG   rW   s     r   r  z:MlflowCallbackHandler.on_retriever_end.<locals>.<listcomp>  sc     
 
 
  !$ 0  !$ 2 2 4 4  
 

 
 
r   on_retriever_end)r   rF  r   r   r   retriever_end_Nr   )r   rF  rf   r.   rU   retriever_documentss         r   rO  z&MlflowCallbackHandler.on_retriever_endr  sG    	V!%&&&!+&&&V!&67!
 
 !
 
 
 	1@STTUUUDL!!!
4<dl6.BCCC/077===%&--d333
@@@AAAAAr   c                 Z    | j         dxx         dz  cc<   | j         dxx         dz  cc<   dS )zRun when Retriever errors.r    r   r#   Nr  r  s      r   on_retriever_errorz(MlflowCallbackHandler.on_retriever_error  r  r   c                 ,  
 t                      }|                    | j        d                   }|                    | j        d                   
ddg}d|j        v r|                    d           n=d|j        v r4|d                             d           |d<   |                    d           ||                             d	                              dd
id	          }| j        t                      ng }| j
        ddgng }g d}
fd|D             }
ddg|z   |z   |z                                d	                              dddd	          }|                    ||gd	          }	|	ddg                             d d	          |	d<   |	S )z=Create a dataframe with all the information from the session.r   r   r    r\   r   idc                     | d         S )Nr   r   )id_s    r   <lambda>zCMlflowCallbackHandler._create_session_analysis_df.<locals>.<lambda>  s
    CG r   r   )axisprompt_stepNrP   rQ   )token_usage_total_tokenstoken_usage_prompt_tokenstoken_usage_completion_tokensc                 &    g | ]}|j         v |S r   )columns)rG   rK  on_llm_end_records_dfs     r   r  zEMlflowCallbackHandler._create_session_analysis_df.<locals>.<listcomp>  s.     
 
 
a3H3P.P.PA.P.P.Pr   rA   output_stepr.  )r    rA   c                 :    t          | d         | d                   S )Nr\   r.  )rc   )rows    r   rX  zCMlflowCallbackHandler._create_session_analysis_df.<locals>.<lambda>  s    AHs8}  r   	chat_html)r   	DataFramer   r_  r   applydropnarenamerC   r@   rB   concat)r   pdon_llm_start_records_dfllm_input_columnsllm_input_prompts_dfcomplexity_metrics_columnsvisualizations_columnstoken_usage_columnsllm_outputs_dfsession_analysis_dfr`  s             @r   _create_session_analysis_dfz1MlflowCallbackHandler._create_session_analysis_df  s(   __"$,,t|<R/S"T"T "T\:N-O P P#X.,444$$V,,,,,444 /Fd.K.Q.Q##/ /#F+ $$V,,,#$56VV^^VV]+!V44 	 .2]-F')))B 	# 04x/C
++ 	
 
 


 
 
 
*
 
 

 " &	&
 -- )) VV^^V]H==AVFF 	 !ii)=~(NUViWW+>x ,

%  	  
 
 	K( #"r   c                 6    t          | j        d                   S )Nr   )boolr   r   s    r   _contain_llm_recordsz*MlflowCallbackHandler._contain_llm_records  s    DL!78999r   Flangchain_assetc                 @   t                      }| j                            d|                    | j        d                              |                                 r|                                 }|                    d          }|                    ddd          }| j                            d|                    |                     | j        	                    d
                    |                                          d           |r_dt          t          |                    v r| j                            |           n%t          t          | j        j        d	                    }	 |                    |           | j                            |           n# t(          $ r 	 |                    |           | j                            |           n_# t,          $ r% t/          d
           t1          j                     Y n1t4          $ r% t/          d
           t1          j                     Y nw xY wY n1t4          $ r% t/          d
           t1          j                     Y nw xY w|r/| j                                         |                                  d S d S )Nr   rd  r_   rl   T)regexsession_analysiszlangchain.chains.llm.LLMChainz
model.jsonzCould not save model.)r   r   r   re  r   rv  rs  r  r`   r   r   tolistr   typer   r   r   r   saver   
ValueError
save_agentAttributeErrorprint	traceback	print_excNotImplementedErrorr   r   )r   rw  r7  rj  rr  rd  langchain_asset_paths          r   flush_trackerz#MlflowCallbackHandler.flush_tracker  s   __
)2<<EU8V+W+WXXX$$&& 	F"&"B"B"D"D+//<<I!))$$)??IJ/>Q1R1RSSSJOOBGGI$4$4$6$677EEE 	 /#d?6K6K2L2LLL
--o>>>>'*40BL+Q+Q'R'R$#(()=>>>J''(<====!   
'223GHHH
++,@AAAA)   5666!+---.   5666!+--- +   1222')))D  	J!!###KKMMMMM	 	sH   0/F   
I*+/GI*,H7I*	+H74I*6H77I*<+I*)I*)r   r   NNNrl   r   )NF)'r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   BaseExceptionr  r  r
   r#  r(  r+  r0  r3  r5  r   r9  r   r>  rD  r	   r   rO  rS  rs  ru  rv  r  __classcell__)r   s   @r   r   r      s          /$/#&* $E
 E
smE
 SME
 tn	E

 smE
 E
 E
 
E
 E
 E
 E
 E
 E
N! ! ! !RsCx.R379RHKR	R R R R0@c @S @T @ @ @ @",U9 ,U ,U ,U ,U ,U ,U\$- $3 $4 $ $ $ $
DsCx.D26sCx.DLOD	D D D D::T#s(^S$s);<:HK:	: : : :4$M $S $T $ $ $ $
<sCx.<58<DG<	< < < <*8# 8 8 8 8 8 8&$= $C $D $ $ $ $
6C 63 64 6 6 6 6&=k =S =T = = = =.>k >S >S > > > >,FcNF F 	F
 
F F F F0"BH%"B "B 
	"B "B "B "BH$ $ $ $ $ $ $
;#S ;# ;# ;# ;#z:d : : : :& &S & &RV & & & & & & & &r   r   )NN)0loggingrs   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  r[   rc   re   r   r   r   r   <module>r     s    				                    = = = = = = = = = = = = = = = = : : : : : : : : 8 8 8 8 8 8 - - - - - - , , , , , , C C C C C C C C                
	8	$	$"s " " " "
c    *T#Y    0 ' '
'	' ' 
	' ' ' 'Tc s s    ,iV iV iV iV iV iV iV iVXH H H H H79L H H H H Hr   