
    NgH                        d dl m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mZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZmZmZmZ erd dl Z!ddZ" G d dee          Z#dS )    )annotationsN)deepcopy)Path)TYPE_CHECKINGAnyDictListMappingOptionalSequence)AgentActionAgentFinish)BaseCallbackHandler)	LLMResultguard_import)BaseMetadataCallbackHandlerflatten_dicthash_stringimport_pandasimport_spacyimport_textstat	load_jsonreturnr   c                      t          d          S )zLImport the clearml python package and raise an error if it is not installed.clearmlr        j/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/callbacks/clearml_callback.pyimport_clearmlr       s    	"""r   c                       e Zd ZdZ	 	 	 	 	 	 	 dDdE fdZdFdZdGdZdHdZdId!ZdJd$Z	dKd&Z
dLd(ZdJd)ZdMd+ZdNd-ZdJd.ZdOd0ZdPd3ZdQd6ZdRd8ZedSd?            ZdTd@Z	 	 	 dUdVdCZ xZS )WClearMLCallbackHandlera   Callback Handler that logs to ClearML.

    Parameters:
        job_type (str): The type of clearml task such as "inference", "testing" or "qc"
        project_name (str): The clearml project name
        tags (list): Tags to add to the task
        task_name (str): Name of the clearml task
        visualize (bool): Whether to visualize the run.
        complexity_metrics (bool): Whether to log complexity metrics
        stream_logs (bool): Whether to stream callback actions to ClearML

    This handler will utilize the associated callback method 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 the ClearML console.
    	inferencelangchain_callback_demoNF	task_typeOptional[str]project_nametagsOptional[Sequence]	task_name	visualizeboolcomplexity_metricsstream_logsr   Nonec                   t                      }t                      }	t                                                       || _        || _        || _        || _        || _        || _	        || _
        t          j                    | _        |j                                        r|j                                        | _        n8|j                            | j        | j        | j        | j        d          | _        | j                                        | _        d}
| j                            |
dd           g | _        g | _        || _	        || _        |	                    d          | _        dS )zInitialize callback handler.T)r%   r'   r(   r*   
output_urizThe clearml callback is currently in beta and is subject to change based on updates to `langchain`. Please report any issues to https://github.com/allegroai/clearml/issues with the tag `langchain`.   )levelprint_consoleen_core_web_smN)r    r   super__init__r%   r'   r(   r*   r+   r-   r.   tempfileTemporaryDirectorytemp_dirTaskcurrent_tasktaskinit
get_loggerloggerreport_textcallback_columnsaction_recordsloadnlp)selfr%   r'   r(   r*   r+   r-   r.   r   spacywarning	__class__s              r   r7   zClearMLCallbackHandler.__init__2   sP    !"""(	"""4& 355 <$$&& 		1133DII)).!.Y. *  DI i**,,T 	
 	rFFF&($&"4"::.//r   r   c                $    d | j         D             S )Nc                    i | ]}|d S )Nr   ).0ks     r   
<dictcomp>z5ClearMLCallbackHandler._init_resp.<locals>.<dictcomp>e   s    777A4777r   )rB   )rF   s    r   
_init_respz!ClearMLCallbackHandler._init_respd   s    77!67777r   
serializedDict[str, Any]prompts	List[str]kwargsr   c                *   | xj         dz  c_         | xj        dz  c_        | xj        dz  c_        |                                 }|                    ddi           |                    t          |                     |                    |                                            |D ]k}t          |          }||d<   | j        	                    |           | j
        	                    |           | j        r| j                            |           ldS )zRun when LLM starts.   actionon_llm_startrR   N)step
llm_startsstartsrO   updater   get_custom_callback_metar   on_llm_start_recordsappendrC   r.   r@   rA   )rF   rP   rR   rT   resppromptprompt_resps          r   rX   z#ClearMLCallbackHandler.on_llm_startg   s    			Q		1q  X~.///L,,---D1133444 	5 	5F"4..K%+K	"%,,[999&&{333 5''444	5 	5r   tokenstrc                   | xj         dz  c_         | xj        dz  c_        |                                 }|                    d|d           |                    |                                            | j                            |           | j                            |           | j        r| j	        
                    |           dS dS )z#Run when LLM generates a new token.rV   on_llm_new_token)rW   rc   N)rY   llm_streamsrO   r\   r]   on_llm_token_recordsr_   rC   r.   r@   rA   )rF   rc   rT   r`   s       r   rf   z'ClearMLCallbackHandler.on_llm_new_token|   s    		Q		A  1EBBCCCD1133444!((...""4((( 	*K##D)))))	* 	*r   responser   c                   | xj         dz  c_         | xj        dz  c_        | xj        dz  c_        |                                 }|                    ddi           |                    t          |j        pi                      |                    |                                            |j        D ]}|D ]}t          |          }|                    t          |
                                                     |                    |                     |j                             | j                            |           | j                            |           | j        r| j                            |           ȌdS )zRun when LLM ends running.rV   rW   
on_llm_endN)rY   llm_endsendsrO   r\   r   
llm_outputr]   generationsr   dictanalyze_texttexton_llm_end_recordsr_   rC   r.   r@   rA   )rF   ri   rT   r`   ro   
generationgeneration_resps          r   rk   z!ClearMLCallbackHandler.on_llm_end   sk   		Q				Q		  X|,---L!4!:;;<<<D1133444#/ 	= 	=K) = =
"*4..&&|JOO4E4E'F'FGGG&&t'8'8'I'IJJJ'..???#**?;;;# =K++O<<<=	= 	=r   errorBaseExceptionc                F    | xj         dz  c_         | xj        dz  c_        dS )zRun when LLM errors.rV   NrY   errorsrF   rv   rT   s      r   on_llm_errorz#ClearMLCallbackHandler.on_llm_error   %    		Q		qr   inputsc                   | xj         dz  c_         | xj        dz  c_        | xj        dz  c_        |                                 }|                    ddi           |                    t          |                     |                    |                                            |                    d|                    d                    }t          |t                    rmt          |          }||d<   | j                            |           | j                            |           | j        r| j                            |           dS dS t          |t"                    r|D ]{}t          |          }|                    |           | j                            |           | j                            |           | j        r| j                            |           |dS t%          d          )zRun when chain starts running.rV   rW   on_chain_startinputhuman_inputz Unexpected data format provided!N)rY   chain_startsr[   rO   r\   r   r]   get
isinstancerd   r   on_chain_start_recordsr_   rC   r.   r@   rA   list
ValueError)rF   rP   r~   rT   r`   chain_input
input_respinps           r   r   z%ClearMLCallbackHandler.on_chain_start   s    			Q		Qq  X/0111L,,---D1133444jj&**]*C*CDDk3'' 	A!$J"-Jw'..z:::&&z222 4''
333334 4T** 		A" 8 8%d^^
!!#&&&+22:>>>#**:666# 8K++J7778 8 ?@@@r   outputsc           	        | xj         dz  c_         | xj        dz  c_        | xj        dz  c_        |                                 }|                    d|                    d|                    d                    d           |                    |                                            | j                            |           | j	                            |           | j
        r| j                            |           dS dS )zRun when chain ends running.rV   on_chain_endoutputrr   )rW   r   N)rY   
chain_endsrm   rO   r\   r   r]   on_chain_end_recordsr_   rC   r.   r@   rA   )rF   r   rT   r`   s       r   r   z#ClearMLCallbackHandler.on_chain_end   s    		Q		1		Q		  (";;xV1D1DEE 	
 	
 	
 	D1133444!((...""4((( 	*K##D)))))	* 	*r   c                F    | xj         dz  c_         | xj        dz  c_        dS )zRun when chain errors.rV   Nry   r{   s      r   on_chain_errorz%ClearMLCallbackHandler.on_chain_error   r}   r   	input_strc                   | xj         dz  c_         | xj        dz  c_        | xj        dz  c_        |                                 }|                    d|d           |                    t          |                     |                    |                                            | j                            |           | j	                            |           | j
        r| j                            |           dS dS )zRun when tool starts running.rV   on_tool_start)rW   r   N)rY   tool_startsr[   rO   r\   r   r]   on_tool_start_recordsr_   rC   r.   r@   rA   )rF   rP   r   rT   r`   s        r   r   z$ClearMLCallbackHandler.on_tool_start   s     			Q		Aq  YGGHHHL,,---D1133444"))$///""4((( 	*K##D)))))	* 	*r   r   c                   t          |          }| xj        dz  c_        | xj        dz  c_        | xj        dz  c_        |                                 }|                    d|d           |                    |                                            | j                            |           | j	                            |           | j
        r| j                            |           dS dS )zRun when tool ends running.rV   on_tool_end)rW   r   N)rd   rY   	tool_endsrm   rO   r\   r]   on_tool_end_recordsr_   rC   r.   r@   rA   )rF   r   rT   r`   s       r   r   z"ClearMLCallbackHandler.on_tool_end   s    V		Q		!		Q		  }??@@@D1133444 ''---""4((( 	*K##D)))))	* 	*r   c                F    | xj         dz  c_         | xj        dz  c_        dS )zRun when tool errors.rV   Nry   r{   s      r   on_tool_errorz$ClearMLCallbackHandler.on_tool_error   r}   r   rr   c                   | xj         dz  c_         | xj        dz  c_        |                                 }|                    d|d           |                    |                                            | j                            |           | j                            |           | j        r| j	        
                    |           dS dS )z+
        Run when agent is ending.
        rV   on_text)rW   rr   N)rY   text_ctrrO   r\   r]   on_text_recordsr_   rC   r.   r@   rA   )rF   rr   rT   r`   s       r   r   zClearMLCallbackHandler.on_text  s     			Q		  y$77888D1133444##D)))""4((( 	*K##D)))))	* 	*r   finishr   c                   | xj         dz  c_         | xj        dz  c_        | xj        dz  c_        |                                 }|                    d|j        d         |j        d           |                    |                                            | j        	                    |           | j
        	                    |           | j        r| j                            |           dS dS )zRun when agent ends running.rV   on_agent_finishr   )rW   r   logN)rY   
agent_endsrm   rO   r\   return_valuesr   r]   on_agent_finish_recordsr_   rC   r.   r@   rA   )rF   r   rT   r`   s       r   r   z&ClearMLCallbackHandler.on_agent_finish  s    		Q		1		Q		  + .x8z 	
 	
 	
 	D1133444$++D111""4((( 	*K##D)))))	* 	*r   rW   r   c                   | xj         dz  c_         | xj        dz  c_        | xj        dz  c_        |                                 }|                    d|j        |j        |j        d           |                    |                                            | j	        
                    |           | j        
                    |           | j        r| j                            |           dS dS )zRun on agent action.rV   on_agent_action)rW   tool
tool_inputr   N)rY   r   r[   rO   r\   r   r   r   r]   on_agent_action_recordsr_   rC   r.   r@   rA   )rF   rW   rT   r`   s       r   r   z&ClearMLCallbackHandler.on_agent_action*  s    		Q		Aq  +$/z	 	
 	
 	
 	D1133444$++D111""4((( 	*K##D)))))	* 	*r   rp   c                   i }t                      }t                      }| j        rwi d|                    |          d|                    |          d|                    |          d|                    |          d|                    |          d|                    |          d|	                    |          d|
                    |          d	|                    |          d
|                    |          d|                    |          d|                    |          d|                    |          d|                    |          d|                    |          d|                    |          }|                    |           | j        rN| j        rF| j        j        9|                     |          }|j                            |ddd          }t5          | j        j        t7          d|           dz             }|                    dd                              |           |j                            |ddd          }	t5          | j        j        t7          d|           dz             }
|
                    dd                              |	           | j                            d||           | j                            d||
           |S ) zAnalyze text using textstat and spacy.

        Parameters:
            text (str): The text to analyze.

        Returns:
            (dict): A dictionary containing the complexity metrics.
        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text_standardfernandez_huertaszigriszt_pazosgutierrez_polinicrawfordgulpease_indexosmanNdepFT)stylejupyterpagezdep-z.htmlwzutf-8)encodingentzent-zDependencies Plot)
local_pathzEntities Plot) r   r   r-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r\   r+   rE   r:   namedisplacyrenderr   r   openwriter@   report_media)rF   rr   r`   textstatrG   text_complexity_metricsdocdep_outdep_output_pathent_outent_output_paths              r   rq   z#ClearMLCallbackHandler.analyze_text?  sI    "$$" 	1'%x'C'CD'I'I'&(E(Ed(K(K' h11$77' %h&A&A$&G&G	'
 .x/S/S0 0' /0U0U1 1' "8#;#;D#A#A' ()G)G)M)M' x33D99'  !7!7!=!=' #H$=$=d$C$C'  "8#;#;D#A#A!'" #H$=$=d$C$C#'$ H--d33%'& !("9"9$"?"?''( --)'#, KK/000> 	Xdh 	X4=+=+I((4..Cn++CueRV+WWG""Kt$>$>$H O   w 77==gFFFn++CueRV+WWG""Kt$>$>$H O   w 77==gFFFK$$#To %    K$$_d$WWWr   base_dfpd.DataFramebase_df_fieldsr   
rename_mapr
   c                      fdD             fd|                                 D             }                              d          }|r|                    |d          }|S )Nc                    g | ]}|v |	S r   r   )rL   fieldr   s     r   
<listcomp>z8ClearMLCallbackHandler._build_llm_df.<locals>.<listcomp>~  s#    PPPEu?O?O%?O?O?Or   c                $    i | ]\  }}|v 	||S r   r   )rL   map_entry_kmap_entry_vr   s      r   rN   z8ClearMLCallbackHandler._build_llm_df.<locals>.<dictcomp>  s4     
 
 
([n,, ,,,r   rV   axis)itemsdropnarename)r   r   r   llm_dfs   ``  r   _build_llm_dfz$ClearMLCallbackHandler._build_llm_dfz  s     QPPP^PPP
 
 
 
,6,<,<,>,>
 
 


 (//Q/77 	7]]:A]66Fr   c                8   t                      } |j        | j                  }t                              |ddgd|v rdgndgz   ddi          }g }g }| j        rg d}t                              |g d|z   |z   d	d
d          } |j        ||gd          }|S )z=Create a dataframe with all the information from the session.rY   rR   r   idprompt_step)r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rY   rr   token_usage_total_tokenstoken_usage_prompt_tokenstoken_usage_completion_tokensoutput_stepr   )rY   rr   rV   r   )r   	DataFramers   r"   r   r-   concat)rF   pdon_llm_end_records_dfllm_input_prompts_dfcomplexity_metrics_columnsvisualizations_columnsllm_outputs_dfsession_analysis_dfs           r   _create_session_analysis_dfz2ClearMLCallbackHandler._create_session_analysis_df  s   __ ,T-D E E5CC)"I.!%:::xxH.	  D  
  
 &("')" 	* * *&& 0==!   )) %% #H55
 
 (bi)=~(NUVWWW""r   r   langchain_assetc                   t                      }t                      }| j                            d| |j        | j                             |                                 }| j                            d||           | j        r0| j                             |j        | j                  |d           |r/t          | j
        j        d          }	 |                    |           |                    | j        t          |                    }|                    t#          |          d|           n# t$          $ rf |                    |           |                    | j        t          |                    }|                    t#          |          d|           Y nAt(          $ r5}	t+          d	           t+          t-          |	                     Y d
}	~	nd
}	~	ww xY w| j                            d           | j
                                         t3          j                    | _
        |                                  |r| j                                         d
S d
S )aU  Flush the tracker and setup the session.

        Everything after this will be a new table.

        Args:
            name: Name of the performed session so far so it is identifiable
            langchain_asset: The langchain asset to save.
            finish: Whether to finish the run.

            Returns:
                None
        zAction Records)
table_plotzSession Analysis)rC   session_analysisz
model.json)r=   config_textF)weights_filenameauto_delete_filetarget_filenamezCould not save model.NT)wait_for_uploads)r   r    r@   report_tabler   rC   r   r.   rA   r   r:   r   saveOutputModelr=   r   update_weightsrd   r   
save_agentNotImplementedErrorprintreprflushcleanupr8   r9   reset_callback_metaclose)
rF   r   r   r   r   r   r   langchain_asset_pathoutput_modeles
             r   flush_trackerz$ClearMLCallbackHandler.flush_tracker  s   $ __ "" 	  d|r|D<O/P/P 	! 	
 	
 	

 #>>@@  1D 	! 	
 	
 	
  	K##&2bl43F&G&G(;     	#'(:L#I#I $$%9:::&22	:N0O0O  3     ++%()=%>%>%*$( ,    
  	 	 	**+?@@@&22	:N0O0O  3     ++%()=%>%>%*$( ,     
 '   -...d1gg 		... 355  """ 	IOO	 	s    A#D7 7A-G$&	G$/+GG$)r#   r$   NNFFF)r%   r&   r'   r&   r(   r)   r*   r&   r+   r,   r-   r,   r.   r,   r   r/   )r   r   )rP   rQ   rR   rS   rT   r   r   r/   )rc   rd   rT   r   r   r/   )ri   r   rT   r   r   r/   )rv   rw   rT   r   r   r/   )rP   rQ   r~   rQ   rT   r   r   r/   )r   rQ   rT   r   r   r/   )rP   rQ   r   rd   rT   r   r   r/   )r   r   rT   r   r   r/   )rr   rd   rT   r   r   r/   )r   r   rT   r   r   r/   )rW   r   rT   r   r   r   )rr   rd   r   rp   )r   r   r   r   r   r
   r   r   r   r   )NNF)r   r&   r   r   r   r,   r   r/   )__name__
__module____qualname____doc__r7   rO   rX   rf   rk   r|   r   r   r   r   r   r   r   r   r   rq   staticmethodr   r   r  __classcell__)rI   s   @r   r"   r"       s        & $/&?#'#'#(!00 00 00 00 00 00 00d8 8 8 85 5 5 5** * * *= = = =*   
A A A AB* * * *(   
* * * *$* * * *    
* * * * * * * *** * * **9 9 9 9v    \0# 0# 0# 0#h ##	K K K K K K K K Kr   r"   r  )$
__future__r   r8   copyr   pathlibr   typingr   r   r   r	   r
   r   r   langchain_core.agentsr   r   langchain_core.callbacksr   langchain_core.outputsr   langchain_core.utilsr   #langchain_community.callbacks.utilsr   r   r   r   r   r   r   pandasr   r    r"   r   r   r   <module>r"     s   " " " " " "              N N N N N N N N N N N N N N N N N N : : : : : : : : 8 8 8 8 8 8 , , , , , , - - - - - -                   # # # #
f f f f f8:M f f f f fr   