
    ihS"                         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y)    N)deepcopy)AnyDictListOptional)AgentActionAgentFinish)BaseCallbackHandler)	LLMResult)flatten_dictdata	file_pathreturnc                 r    t        |d      5 }t        j                  | |       ddd       y# 1 sw Y   yxY w)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      n/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain_community/callbacks/sagemaker_callback.py	save_jsonr      s3     
i	 !		$ ! ! !s   -6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
                         | _        y)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__#   sY     
" !((*    c                 f    | j                   j                         D ]  \  }}d| j                   |<    y )Nr   )r+   items)r/   kvs      r   _resetzSageMakerCallbackHandler._reset<   s/    LL&&( 	 DAqDLLO	 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 }|j                  ddi       |j                  t        |             |j                  | j                          t        |      D ]8  \  }}t	        |      }||d<   | j                  || j                  d| d	|        : y
)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,-DLL!$W- 	KC"4.K$*K!JJZL6	r1   tokenc                     | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   | j                   d   }i }|j                  d|d       |j                  | j                          | j                  || j                  d|        y)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   sz    V!]#q(#ll=1!1EBCDLL!

4/+(GHr1   responsec           
      P   | 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 }|j                  ddi       |j                  t        |j                  xs i              |j                  | j                          |j                  D ]k  }t        |      D ][  \  }}t        |      }|j                  t        |j                                      | j                  || j                  d| d|        ] m y	)
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!4!:;<DLL!#// 		K#,[#9 Z"*4.&&|JOO4E'FG

MMxjSE:			r1   errorc                 `    | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   y)zRun when LLM errors.r   r;   r   Nr+   r/   rV   r9   s      r   on_llm_errorz%SageMakerCallbackHandler.on_llm_error~   *    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 }|j                  ddi       |j                  t        |             |j                  | j                          dj                  |j	                         D cg c]  \  }}| d|  c}}      }t        |      }	||	d	<   | j                  |	| j                  d
|        yc c}}w )zRun when chain starts running.r   r;   r!   r   r<   on_chain_start,=r\   chain_start_N)r+   rA   r   joinr3   r   rC   r.   )
r/   r7   r\   r9   r!   rD   r4   r5   chain_input
input_resps
             r   r^   z'SageMakerCallbackHandler.on_chain_start   s     	V!^$)$X!#||N3!X/01L,-DLL!hhv||~Ftq!1#Qqc
FGd^
*
8

:t}}\N.KL	  Gs   =D
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j                  |j                         D cg c]  \  }}| d|  c}}      }|j                  d|d       |j                  | j                          | j	                  || j
                  d	|        y
c c}}w )zRun when chain ends running.r   r;   r"   r   r_   r`   on_chain_end)r<   re   
chain_end_N)r+   rb   r3   rA   rC   r.   )r/   re   r9   r"   rD   r4   r5   chain_outputs           r   rg   z%SageMakerCallbackHandler.on_chain_end   s    V!\"a'"V!\\,/
!xx H1A3as HI~,GHDLL!

4*ZL(AB	 !Is   5C
c                 `    | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   y)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 }|j                  d|d       |j                  t        |             |j                  | j                          | j                  || j                  d|        y)	zRun when tool starts running.r   r;   r&   r   on_tool_start)r<   rl   tool_start_N)r+   rA   r   rC   r.   )r/   r7   rl   r9   r&   rD   s         r   rn   z&SageMakerCallbackHandler.on_tool_start   s     	V!]#q(#X!#ll=1!YGHL,-DLL!

4+k](CDr1   outputc                 d   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 }|j                  d|d       |j                  | j                         | j                  || j                  d|        y)	zRun when tool ends running.r   r;   r'   r   on_tool_end)r<   rp   	tool_end_N)strr+   rA   rC   r.   )r/   rp   r9   r'   rD   s        r   rr   z$SageMakerCallbackHandler.on_tool_end   s    VV![!Q&!V!LL-	!}?@DLL!

4)I;(?@r1   c                 `    | j                   dxx   dz  cc<   | j                   dxx   dz  cc<   y)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 }|j                  d|d       |j                  | j                          | j                  || j                  d|        y)z+
        Run when agent is ending.
        r   r;   r    on_text)r<   rw   on_text_NrK   )r/   rw   r9   r    rD   s        r   ry   z SageMakerCallbackHandler.on_text   s{     	V!Z A% <<
+!y$78DLL!

4(8*(=>r1   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 }|j                  d|j                  d   |j                  d       |j                  | j                          | j	                  || j
                  d|        y	)
zRun when agent ends running.r   r;   r(   r   on_agent_finishrp   )r<   rp   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zz	
 	DLL!

4-
|(DEr1   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 }|j                  d|j                  |j                  |j                  d       |j                  | j                          | j                  || j                  d|        y)	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!#ll=1!+$//zz		
 	DLL!

4-}(EFr1   r   data_dirfilename	is_outputc                     t         j                  j                  || d      }t        ||       | j                  j                  |||       y)z,To log the input data as json file artifact.z.json)namer   N)ospathrb   r   r   log_file)r/   r   r   r   r   r   s         r   rC   zSageMakerCallbackHandler.jsonf  sB     GGLLhZu+=>	$	")(iHr1   c                 b    | j                          t        j                  | j                         y)z9Reset the steps and delete the temporary local directory.N)r6   shutilrmtreer.   )r/   s    r   flush_trackerz&SageMakerCallbackHandler.flush_tracker  s    dmm$r1   )r   N)T) __name__
__module____qualname____doc__r   r*   r6   r   rt   r   r=   rI   r   rN   BaseExceptionrZ   r^   rg   rk   rn   rr   rv   ry   r	   r}   r   r   r   boolrC   r   __classcell__)r0   s   @r   r   r      s.   +C +D +2 sCx.379HK	0Ic IS IT I9   2$- $3 $4 $
MsCx.M26sCx.MLOM	M*CDcN Cc Cd C$M $S $T $
EsCx.E58EDGE	E"A# A A A$= $C $D $
?C ?3 ?4 ?Fk FS FT F&Gk GS GS G0 %)
I38n
I 
I 	
I
 D>
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   rt   r   r    r1   r   <module>r      sQ     	    , , : 8 ,
!D !S !T !y%2 y%r1   