
    ih1                       d Z ddlmZ ddlZddlmZ ddl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 er
ddlZddlmZ  ej<                  e      Z ddZ!	 	 d	 	 	 	 	 	 	 ddZ" G d dee      Z#y)zFlyteKit callback handler.    )annotationsN)deepcopy)TYPE_CHECKINGAnyDictListTuple)AgentActionAgentFinish)BaseCallbackHandler)	LLMResult)guard_import)BaseMetadataCallbackHandlerflatten_dictimport_pandasimport_spacyimport_textstat)rendererc                 F    t        d      t        dd      j                  fS )z2Import flytekit and flytekitplugins-deck-standard.flytekitzflytekitplugins.deckzflytekitplugins-deck-standard)pip_name)r   r        j/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain_community/callbacks/flyte_callback.pyimport_flytekitr      s)     	Z "-L	

(	 r   c                   i }||j                  |       |j                  |       |j                  |       |j                  |       |j	                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |       d}|j                  d|i       |j                  |       |ft!               } ||       }|j"                  j%                  |ddd      }|j"                  j%                  |ddd      }||d}	|j                  |	       |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.

    Returns:
        (dict): A dictionary containing the complexity metrics and visualization
            files serialized to HTML string.
    )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osmantext_complexity_metricsdepFT)stylejupyterpageent)dependency_treeentities)r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   updater   displacyrender)
textnlptextstatrespr,   spacydocdep_outent_outtext_visualizationss
             r   analyze_textr@   '   s|    D#+#?#?#E$,$A$A$$G"--d3"*"="=d"C+3+O+OPT+U,4,Q,QRV,W'77=%-%C%CD%I#//5 ( 9 9$ ?'77= ( 9 9$ ? ))$/&55d;^^D)#
" 	.0GHI+,
$i..''5%d'S..''5%d'S&
 	'(Kr   c                       e Zd ZdZd fdZ	 	 	 	 	 	 	 	 ddZddZddZddZ	 	 	 	 	 	 	 	 ddZ	ddZ
dd	Z	 	 	 	 	 	 	 	 dd
ZddZddZddZddZddZ xZS )FlyteCallbackHandlerz2Callback handler that is used within a Flyte task.c                h   t               \  }}t               | _        d| _        	 t	               | _        d}	 t               }t        | )          d| _        |r	 |j                  d      | _        |j                  | _        |j                   | _         |j$                  d| j#                         j'                  d            | _        y# t
        $ r t        j                  d       Y w xY w# t
        $ r t        j                  d       Y w xY w# t        $ r t        j                  d       Y w xY w)zInitialize callback handler.NzTextstat library is not installed.                 It may result in the inability to log                 certain metrics that can be captured with Textstat.zSpacy library is not installed.                 It may result in the inability to log                 certain metrics that can be captured with Spacy.en_core_web_smzFlyteCallbackHandler uses spacy's en_core_web_sm model for certain metrics. To download, run the following command in your terminal: `python -m spacy download en_core_web_sm`zLangChain Metricsz## LangChain Metrics)r   r   pandasr9   r   ImportErrorloggerwarningr   super__init__r8   loadOSErrorTableRenderertable_rendererMarkdownRenderermarkdown_rendererDeckto_htmldeck)selfr   r   r;   	__class__s       r   rJ   zFlyteCallbackHandler.__init__]   s"   ,.(#o	+-DM 	 NE 	 ::&67 '44!)!:!:!HMM""$,,-CD
	E  	NNE	  	NNB	  As4   C 
C, D C)(C),DDD10D1c                   | xj                   dz  c_         | xj                  dz  c_        | xj                  dz  c_        i }|j                  ddi       |j                  t	        |             |j                  | j                                g }|D ]  }|j                  |        |j                  d|i       | j                  j                  | j                         j                  d             | j                  j                  | j                         j                  | j                  j                  |g            dz          y)zRun when LLM starts.   actionon_llm_startpromptsz### LLM Start
N)step
llm_startsstartsr4   r   get_custom_callback_metaappendrS   rP   rR   rN   rE   	DataFrame)rT   
serializedrZ   kwargsr:   prompt_responsesprompts          r   rY   z!FlyteCallbackHandler.on_llm_start   s   
 			Q	1q!X~./L,-D1134 	,F##F+	, 	Y 012		//199/JK		!))$++*?*?*GH4O	
r   c                     y)z#Run when LLM generates a new token.Nr   )rT   tokenrc   s      r   on_llm_new_tokenz%FlyteCallbackHandler.on_llm_new_token   s    r   c           	     (   | xj                   dz  c_         | xj                  dz  c_        | xj                  dz  c_        i }|j                  ddi       |j                  t	        |j
                  xs i              |j                  | j                                | j                  j                  | j                         j                  d             | j                  j                  | j                         j                  | j                  j                  |g                   |j                  D ]]  }|D ]T  }t        |      }|j                  t	        |j!                                      | j"                  s| j$                  r|j                  t'        |j(                  | j"                  | j$                               |j+                  d      }| j                  j                  | j                         j                  d             | j                  j                  | j                         j                  | j                  j                  |g            dz          |d	   }| j                  j                  | j                         j                  d
             | j                  j                  |       |d   }	| j                  j                  | j                         j                  d             | j                  j                  |	       | j                  j                  | j                         j                  d             | j                  j                  | j                         j                  |j(                               W ` y)zRun when LLM ends running.rW   rX   
on_llm_endz### LLM End)r8   r9   r,   z#### Text Complexity Metricsr[   r2   z#### Dependency Treer3   z#### Entitiesz#### Generated ResponseN)r\   llm_endsendsr4   r   
llm_outputr_   rS   r`   rP   rR   rN   rE   ra   generationsr   dictr8   r9   r@   r7   pop)
rT   responserc   r:   rn   
generationgeneration_respcomplexity_metricsr2   r3   s
             r   rj   zFlyteCallbackHandler.on_llm_end   s   		Q			Q	!X|,-L!4!4!:;<D1134		//199-HI		,,.66t{{7L7LdV7TUV#// %	XK) $X
"*4.&&|JOO4E'FG88t}}#**$&OODMM <K;N;N1<& II$$..0889WX II$$++-55 KK113E2FG  '66G&HOII$$..0889OP II$$_5.z:HII$$T%;%;%=%E%Eo%VWII$$X.II$$..0889RS II$$T%;%;%=%E%Ejoo%VWI$X%	Xr   c                X    | xj                   dz  c_         | xj                  dz  c_        y)zRun when LLM errors.rW   Nr\   errorsrT   errorrc   s      r   on_llm_errorz!FlyteCallbackHandler.on_llm_error       		Q	qr   c           	        | xj                   dz  c_         | xj                  dz  c_        | xj                  dz  c_        i }|j                  ddi       |j                  t	        |             |j                  | j                                dj                  |j                         D cg c]  \  }}| d|  c}}      }t        |      }||d<   | j                  j                  | j                         j                  d             | j                  j                  | j                         j                  | j                  j                  |g            dz          y	c c}}w )
zRun when chain starts running.rW   rX   on_chain_start,=inputsz### Chain Startr[   N)r\   chain_startsr^   r4   r   r_   joinitemsr   rS   r`   rP   rR   rN   rE   ra   )	rT   rb   r   rc   r:   kvchain_input
input_resps	            r   r}   z#FlyteCallbackHandler.on_chain_start   s    			Q	Qq!X/01L,-D1134hhv||~Ftq!1#Qqc
FGd^
*
8		//199:KLM		!))$++*?*?*MNQUU	
  Gs   ,E#
c           	        | xj                   dz  c_         | xj                  dz  c_        | xj                  dz  c_        i }dj                  |j	                         D cg c]  \  }}| d|  c}}      }|j                  d|d       |j                  | j                                | j                  j                  | j                         j                  d             | j                  j                  | j                         j                  | j                  j                  |g            dz          yc c}}w )	zRun when chain ends running.rW   r~   r   on_chain_end)rX   outputsz### Chain Endr[   N)r\   
chain_endsrl   r   r   r4   r_   rS   r`   rP   rR   rN   rE   ra   )rT   r   rc   r:   r   r   chain_outputs          r   r   z!FlyteCallbackHandler.on_chain_end   s    		Q	1		Q	!xx H1A3as HI~,GHD1134		//199/JK		!))$++*?*?*GH4O	
 !Is    D:
c                X    | xj                   dz  c_         | xj                  dz  c_        y)zRun when chain errors.rW   Nrv   rx   s      r   on_chain_errorz#FlyteCallbackHandler.on_chain_error  r{   r   c                :   | xj                   dz  c_         | xj                  dz  c_        | xj                  dz  c_        i }|j                  d|d       |j                  t	        |             |j                  | j                                | j                  j                  | j                         j                  d             | j                  j                  | j                         j                  | j                  j                  |g            dz          y)zRun when tool starts running.rW   on_tool_start)rX   	input_strz### Tool Startr[   N)r\   tool_startsr^   r4   r   r_   rS   r`   rP   rR   rN   rE   ra   )rT   rb   r   rc   r:   s        r   r   z"FlyteCallbackHandler.on_tool_start  s     			Q	Aq!YGHL,-D1134		//199:JKL		!))$++*?*?*GH4O	
r   c                   | xj                   dz  c_         | xj                  dz  c_        | xj                  dz  c_        i }|j                  d|d       |j                  | j	                                | j
                  j                  | j                         j                  d             | j
                  j                  | j                         j                  | j                  j                  |g            dz          y)zRun when tool ends running.rW   on_tool_end)rX   outputz### Tool Endr[   N)r\   	tool_endsrl   r4   r_   rS   r`   rP   rR   rN   rE   ra   )rT   r   rc   r:   s       r   r   z FlyteCallbackHandler.on_tool_end  s    		Q	!		Q	!}?@D1134		//199.IJ		!))$++*?*?*GH4O	
r   c                X    | xj                   dz  c_         | xj                  dz  c_        y)zRun when tool errors.rW   Nrv   rx   s      r   on_tool_errorz"FlyteCallbackHandler.on_tool_error.  r{   r   c                   | xj                   dz  c_         | xj                  dz  c_        i }|j                  d|d       |j                  | j                                | j                  j                  | j                         j                  d             | j                  j                  | j                         j                  | j                  j                  |g            dz          y)z+
        Run when agent is ending.
        rW   on_text)rX   r7   z### On Textr[   N)r\   text_ctrr4   r_   rS   r`   rP   rR   rN   rE   ra   )rT   r7   rc   r:   s       r   r   zFlyteCallbackHandler.on_text3  s     			Q	!y$78D1134		//199-HI		!))$++*?*?*GH4O	
r   c                6   | xj                   dz  c_         | xj                  dz  c_        | xj                  dz  c_        i }|j                  d|j                  d   |j
                  d       |j                  | j                                | j                  j                  | j                         j                  d             | j                  j                  | j                         j                  | j                  j                  |g            dz          y)zRun when agent ends running.rW   on_agent_finishr   )rX   r   logz### Agent Finishr[   N)r\   
agent_endsrl   r4   return_valuesr   r_   rS   r`   rP   rR   rN   rE   ra   )rT   finishrc   r:   s       r   r   z$FlyteCallbackHandler.on_agent_finishC  s    		Q	1		Q	!+ ..x8zz	
 	D1134		//199:LMN		!))$++*?*?*GH4O	
r   c                F   | xj                   dz  c_         | xj                  dz  c_        | xj                  dz  c_        i }|j                  d|j                  |j
                  |j                  d       |j                  | j                                | j                  j                  | j                         j                  d             | j                  j                  | j                         j                  | j                  j                  |g            dz          y)zRun on agent action.rW   on_agent_action)rX   tool
tool_inputr   z### Agent Actionr[   N)r\   r   r^   r4   r   r   r   r_   rS   r`   rP   rR   rN   rE   ra   )rT   rX   rc   r:   s       r   r   z$FlyteCallbackHandler.on_agent_actionX  s    		Q	Aq!+$//zz		
 	D1134		//199:LMN		!))$++*?*?*GH4O	
r   )returnNone)rb   Dict[str, Any]rZ   z	List[str]rc   r   r   r   )rg   strrc   r   r   r   )rq   r   rc   r   r   r   )ry   BaseExceptionrc   r   r   r   )rb   r   r   r   rc   r   r   r   )r   r   rc   r   r   r   )rb   r   r   r   rc   r   r   r   )r   r   rc   r   r   r   )r7   r   rc   r   r   r   )r   r   rc   r   r   r   )rX   r
   rc   r   r   r   )__name__
__module____qualname____doc__rJ   rY   rh   rj   rz   r}   r   r   r   r   r   r   r   r   __classcell__)rU   s   @r   rB   rB   Z   s    <-
^
(
3<
HK
	
223Xj

(
2@
LO
	
,
 

(
58
DG
	
$


 
*
r   rB   )r   zTuple[flytekit, renderer])NN)r7   r   r8   r   r9   r   r   ro   )$r   
__future__r   loggingcopyr   typingr   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   flytekitplugins.deckr   	getLoggerr   rG   r   r@   rB   r   r   r   <module>r      s      "   8 8 : 8 , -  -			8	$ 0
0	0 0 
	0fR
68K R
r   