
    NgS"                         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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ed	ed
dfdZ G d de          ZdS )    N)deepcopy)AnyDictListOptional)AgentActionAgentFinish)BaseCallbackHandler)	LLMResult)flatten_dictdata	file_pathreturnc                     t          |d          5 }t          j        | |           ddd           dS # 1 swxY w Y   dS )zSave dict to local file path.

    Parameters:
        data (dict): The dictionary to be saved.
        file_path (str): Local file path.
    wN)openjsondump)r   r   outfiles      l/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/callbacks/sagemaker_callback.py	save_jsonr      s     
i		 !	$   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !s   488c                       e Zd ZdZdeddf fdZd(d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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)d"eeef         d#ed$ed%ee         ddf
d&Zd(d'Z xZS )*SageMakerCallbackHandlerzCallback Handler that logs prompt artifacts and metrics to SageMaker Experiments.

    Parameters:
        run (sagemaker.experiments.run.Run): Run object where the experiment is logged.
    runr   Nc                     t                                                       || _        dddddddddddddd| _        t	          j                    | _        dS )zInitialize callback handler.r   )stepstartsendserrorstext_ctrchain_starts
chain_ends
llm_startsllm_endsllm_streamstool_starts	tool_ends
agent_endsN)super__init__r   metricstempfilemkdtemptemp_dir)selfr   	__class__s     r   r*   z!SageMakerCallbackHandler.__init__#   sm     
 
" !(**    c                 X    | j                                         D ]\  }}d| j         |<   d S )Nr   )r+   items)r/   kvs      r   _resetzSageMakerCallbackHandler._reset<   s:    L&&(( 	  	 DAqDLOO	  	 r1   
serializedpromptskwargsc           	         | 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                    t          |          D ];\  }}t	          |          }||d<   |                     || j        d| d	|            <d
S )zRun when LLM starts.r      r#   r   actionon_llm_startprompt
llm_start__prompt_N)r+   updater   	enumerater   jsonfr.   )	r/   r7   r8   r9   r#   respidxr>   prompt_resps	            r   r=   z%SageMakerCallbackHandler.on_llm_start@   s$    	V!\"""a'"""X!#\,/
!X~.///L,,---DL!!!$W-- 	 	KC"4..K$*K!JJ6Z6666   	 	r1   tokenc                    | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                    d|d           |                    | j                    |                     || j        d|            dS )z#Run when LLM generates a new token.r   r;   r%   on_llm_new_token)r<   rG   llm_new_tokens_Nr+   rA   rC   r.   )r/   rG   r9   r%   rD   s        r   rI   z)SageMakerCallbackHandler.on_llm_new_tokenX   s    V!]###q(###l=1!1EBBCCCDL!!!

4(G+(G(GHHHHHr1   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        D ]|}t          |          D ]j\  }}t          |          }|                    t          |                                                     |                     || j	        d| d|            k}d	S )
zRun when LLM ends running.r   r;   r$   r   r<   
on_llm_endllm_end__generation_N)
r+   rA   r   
llm_outputgenerationsrB   r   dictrC   r.   )	r/   rL   r9   r$   rD   rR   rE   
generationgeneration_resps	            r   rN   z#SageMakerCallbackHandler.on_llm_ende   s]   V!Z   A%   V!<
+!X|,---L!4!:;;<<<DL!!!#/ 		 		K#,[#9#9  Z"*4..&&|JOO4E4E'F'FGGG

M:x::S::   			 		r1   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/   rV   r9   s      r   on_llm_errorz%SageMakerCallbackHandler.on_llm_error~   D    V!X!#r1   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                    d                    d |                                D                       }t          |          }||d	<   |                     || j        d
|            dS )zRun when chain starts running.r   r;   r!   r   r<   on_chain_start,c                 "    g | ]\  }}| d | S = .0r4   r5   s      r   
<listcomp>z;SageMakerCallbackHandler.on_chain_start.<locals>.<listcomp>   s&    FFFtq!1

q

FFFr1   r\   chain_start_N)r+   rA   r   joinr3   r   rC   r.   )r/   r7   r\   r9   r!   rD   chain_input
input_resps           r   r^   z'SageMakerCallbackHandler.on_chain_start   s    	V!^$$$)$$$X!#|N3!X/0111L,,---DL!!!hhFFv||~~FFFGGd^^
*
8

:t}.K\.K.KLLLLLr1   outputsc                    | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }d                    d |                                D                       }|                    d|d           |                    | j                    |                     || j        d	|            d
S )zRun when chain ends running.r   r;   r"   r   r_   c                 "    g | ]\  }}| d | S ra   rc   rd   s      r   rf   z9SageMakerCallbackHandler.on_chain_end.<locals>.<listcomp>   s&     H H H1A H H Hr1   on_chain_end)r<   rk   
chain_end_N)r+   rh   r3   rA   rC   r.   )r/   rk   r9   r"   rD   chain_outputs         r   rn   z%SageMakerCallbackHandler.on_chain_end   s    V!\"""a'"""V!\,/
!xx H H H H HII~,GGHHHDL!!!

4(AZ(A(ABBBBBr1   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   NrX   rY   s      r   on_chain_errorz'SageMakerCallbackHandler.on_chain_error   r[   r1   	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        d|            dS )	zRun when tool starts running.r   r;   r&   r   on_tool_start)r<   rs   tool_start_N)r+   rA   r   rC   r.   )r/   r7   rs   r9   r&   rD   s         r   ru   z&SageMakerCallbackHandler.on_tool_start   s     	V!]###q(###X!#l=1!YGGHHHL,,---DL!!!

4(Ck(C(CDDDDDr1   outputc                 b   t          |          }| j        dxx         dz  cc<   | j        dxx         dz  cc<   | j        dxx         dz  cc<   | j        d         }i }|                    d|d           |                    | j                   |                     || j        d|            dS )	zRun when tool ends running.r   r;   r'   r   on_tool_end)r<   rw   	tool_end_N)strr+   rA   rC   r.   )r/   rw   r9   r'   rD   s        r   ry   z$SageMakerCallbackHandler.on_tool_end   s    VV![!!!Q&!!!V!L-	!}??@@@DL!!!

4(?I(?(?@@@@@r1   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   NrX   rY   s      r   on_tool_errorz&SageMakerCallbackHandler.on_tool_error   r[   r1   textc                    | j         dxx         dz  cc<   | j         dxx         dz  cc<   | j         d         }i }|                    d|d           |                    | j                    |                     || j        d|            dS )z+
        Run when agent is ending.
        r   r;   r    on_text)r<   r~   on_text_NrK   )r/   r~   r9   r    rD   s        r   r   z SageMakerCallbackHandler.on_text   s     	V!Z   A%   <
+!y$77888DL!!!

4(=8(=(=>>>>>r1   finishc                 f   | 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        d|            d	S )
zRun when agent ends running.r   r;   r(   r   on_agent_finishrw   )r<   rw   logagent_finish_N)r+   rA   return_valuesr   rC   r.   )r/   r   r9   r(   rD   s        r   r   z(SageMakerCallbackHandler.on_agent_finish   s    V!\"""a'"""V!\,/
!+ .x8z 	
 	
 	
 	DL!!!

4(D
(D(DEEEEEr1   r<   c                 f   | 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        d|            dS )	zRun on agent action.r   r;   r&   r   on_agent_action)r<   tool
tool_inputr   agent_action_N)r+   rA   r   r   r   rC   r.   )r/   r<   r9   r&   rD   s        r   r   z(SageMakerCallbackHandler.on_agent_action   s    V!]###q(###X!#l=1!+$/z	 	
 	
 	
 	DL!!!

4(E(E(EFFFFFr1   Tr   data_dirfilename	is_outputc                     t           j                            || d          }t          ||           | j                            |||           dS )z,To log the input data as json file artifact.z.json)namer   N)ospathrh   r   r   log_file)r/   r   r   r   r   r   s         r   rC   zSageMakerCallbackHandler.jsonf  sU     GLLh+=+=+=>>	$	""")(iHHHHHr1   c                 `    |                                   t          j        | j                   dS )z9Reset the steps and delete the temporary local directory.N)r6   shutilrmtreer.   )r/   s    r   flush_trackerz&SageMakerCallbackHandler.flush_tracker  s'    dm$$$$$r1   )r   N)T) __name__
__module____qualname____doc__r   r*   r6   r   r{   r   r=   rI   r   rN   BaseExceptionrZ   r^   rn   rr   ru   ry   r}   r   r	   r   r   r   r   boolrC   r   __classcell__)r0   s   @r   r   r      sv        +C +D + + + + + +2       sCx.379HK	   0Ic IS IT I I I I9      2$- $3 $4 $ $ $ $
MsCx.M26sCx.MLOM	M M M M*CDcN Cc Cd C C C C$M $S $T $ $ $ $
EsCx.E58EDGE	E E E E"A# A A A A A A$= $C $D $ $ $ $
?C ?3 ?4 ? ? ? ?Fk FS FT F F F F&Gk GS GS G G G G0 %)
I 
I38n
I 
I 	
I
 D>
I 

I 
I 
I 
I% % % % % % % %r1   r   )r   r   r   r,   copyr   typingr   r   r   r   langchain_core.agentsr   r	   langchain_core.callbacksr
   langchain_core.outputsr   #langchain_community.callbacks.utilsr   rS   r{   r   r   rc   r1   r   <module>r      s!    				         , , , , , , , , , , , , : : : : : : : : 8 8 8 8 8 8 , , , , , ,     
!D !S !T ! ! ! !y% y% y% y% y%2 y% y% y% y% y%r1   