o
    ZhS"                     @   s   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dZG dd deZdS )    N)deepcopy)AnyDictListOptional)AgentActionAgentFinish)BaseCallbackHandler)	LLMResult)flatten_dictdata	file_pathreturnc                 C   s<   t |d}t| | W d   dS 1 s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   outfile r   g/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/callbacks/sagemaker_callback.py	save_json   s   "r   c                       s  e Zd ZdZdeddf fddZd9ddZd	eeef d
e	e deddfddZ
dededdfddZdededdfddZdededdfddZd	eeef deeef deddfddZdeeef deddfddZdededdfddZd	eeef dededdfd d!Zd"ededdfd#d$Zdededdfd%d&Zd'ededdfd(d)Zd*ededdfd+d,Zd-ededefd.d/Z	0d:d1eeef d2ed3ed4ee ddf
d5d6Zd9d7d8Z  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                    s@   t    || _dddddddddddddd| _t | _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__r   r   r'   #   s"   
z!SageMakerCallbackHandler.__init__c                 C   s"   | j  D ]	\}}d| j |< qd S )Nr   )r(   items)r,   kvr   r   r   _reset<   s   zSageMakerCallbackHandler._reset
serializedpromptskwargsc           	   	   K   s   | j d  d7  < | j d  d7  < | j d  d7  < | j d }i }|ddi |t| || j  t|D ]\}}t|}||d< | || jd| d	|  q:d
S )zRun when LLM starts.r      r    r   actionon_llm_startpromptZ
llm_start_Z_prompt_N)r(   updater   	enumerater   jsonfr+   )	r,   r3   r4   r5   r    respidxr9   Zprompt_respr   r   r   r8   @   s"   
z%SageMakerCallbackHandler.on_llm_starttokenc                 K   h   | j d  d7  < | j d  d7  < | j d }i }|d|d || j  | || jd|  dS )z#Run when LLM generates a new token.r   r6   r"   on_llm_new_token)r7   r?   Zllm_new_tokens_Nr(   r:   r<   r+   )r,   r?   r5   r"   r=   r   r   r   rA   X   s   
z)SageMakerCallbackHandler.on_llm_new_tokenresponsec           	   
   K   s   | j d  d7  < | j d  d7  < | j d  d7  < | j d }i }|ddi |t|jp0i  || j  |jD ]&}t|D ]\}}t|}|t|  | || j	d| d|  qBq<d	S )
zRun when LLM ends running.r   r6   r!   r   r7   
on_llm_endZllm_end_Z_generation_N)
r(   r:   r   Z
llm_outputgenerationsr;   r   dictr<   r+   )	r,   rC   r5   r!   r=   rE   r>   Z
generationZgeneration_respr   r   r   rD   e   s&   

z#SageMakerCallbackHandler.on_llm_enderrorc                 K   (   | j d  d7  < | j d  d7  < dS )zRun when LLM errors.r   r6   r   Nr(   r,   rG   r5   r   r   r   on_llm_error~      z%SageMakerCallbackHandler.on_llm_errorinputsc                 K   s   | j d  d7  < | j d  d7  < | j d  d7  < | j d }i }|ddi |t| || j  ddd	 | D }t|}||d
< | || jd|  dS )zRun when chain starts running.r   r6   r   r   r7   on_chain_start,c                 S      g | ]\}}| d | qS =r   .0r0   r1   r   r   r   
<listcomp>       z;SageMakerCallbackHandler.on_chain_start.<locals>.<listcomp>rM   Zchain_start_N)r(   r:   r   joinr/   r   r<   r+   )r,   r3   rM   r5   r   r=   Zchain_inputZ
input_respr   r   r   rN      s   
z'SageMakerCallbackHandler.on_chain_startoutputsc                 K   s   | j d  d7  < | j d  d7  < | j d  d7  < | j d }i }ddd | D }|d|d	 || j  | || jd
|  dS )zRun when chain ends running.r   r6   r   r   rO   c                 S   rP   rQ   r   rS   r   r   r   rU      rV   z9SageMakerCallbackHandler.on_chain_end.<locals>.<listcomp>on_chain_end)r7   rX   Z
chain_end_N)r(   rW   r/   r:   r<   r+   )r,   rX   r5   r   r=   Zchain_outputr   r   r   rY      s   
z%SageMakerCallbackHandler.on_chain_endc                 K   rH   )zRun when chain errors.r   r6   r   NrI   rJ   r   r   r   on_chain_error   rL   z'SageMakerCallbackHandler.on_chain_error	input_strc                 K   s   | j d  d7  < | j d  d7  < | j d  d7  < | j d }i }|d|d |t| || j  | || jd|  dS )	zRun when tool starts running.r   r6   r#   r   on_tool_start)r7   r[   Ztool_start_N)r(   r:   r   r<   r+   )r,   r3   r[   r5   r#   r=   r   r   r   r\      s   
z&SageMakerCallbackHandler.on_tool_startoutputc                 K   s   t |}| jd  d7  < | jd  d7  < | jd  d7  < | jd }i }|d|d || j | || jd|  dS )	zRun when tool ends running.r   r6   r$   r   on_tool_end)r7   r]   Z	tool_end_N)strr(   r:   r<   r+   )r,   r]   r5   r$   r=   r   r   r   r^      s   
z$SageMakerCallbackHandler.on_tool_endc                 K   rH   )zRun when tool errors.r   r6   r   NrI   rJ   r   r   r   on_tool_error   rL   z&SageMakerCallbackHandler.on_tool_errortextc                 K   r@   )z+
        Run when agent is ending.
        r   r6   r   on_text)r7   ra   Zon_text_NrB   )r,   ra   r5   r   r=   r   r   r   rb      s   
z SageMakerCallbackHandler.on_textfinishc                 K   s   | j d  d7  < | j d  d7  < | j d  d7  < | j d }i }|d|jd |jd || j  | || jd|  d	S )
zRun when agent ends running.r   r6   r%   r   on_agent_finishr]   )r7   r]   logZagent_finish_N)r(   r:   Zreturn_valuesre   r<   r+   )r,   rc   r5   r%   r=   r   r   r   rd      s   
z(SageMakerCallbackHandler.on_agent_finishr7   c                 K   s   | j d  d7  < | j d  d7  < | j d  d7  < | j d }i }|d|j|j|jd || j  | || jd|  dS )	zRun on agent action.r   r6   r#   r   on_agent_action)r7   tool
tool_inputre   Zagent_action_N)r(   r:   rg   rh   re   r<   r+   )r,   r7   r5   r#   r=   r   r   r   rf      s   
z(SageMakerCallbackHandler.on_agent_actionTr   data_dirfilename	is_outputc                 C   s4   t j|| d}t|| | jj|||d dS )z,To log the input data as json file artifact.z.json)namerk   N)ospathrW   r   r   Zlog_file)r,   r   ri   rj   rk   r   r   r   r   r<     s   
zSageMakerCallbackHandler.jsonfc                 C   s   |    t| j dS )z9Reset the steps and delete the temporary local directory.N)r2   shutilrmtreer+   )r,   r   r   r   flush_tracker  s   z&SageMakerCallbackHandler.flush_tracker)r   N)T) __name__
__module____qualname____doc__r   r'   r2   r   r_   r   r8   rA   r
   rD   BaseExceptionrK   rN   rY   rZ   r\   r^   r`   rb   r   rd   r   rf   r   boolr<   rq   __classcell__r   r   r-   r   r      sl    









r   )r   rm   ro   r)   copyr   typingr   r   r   r   Zlangchain_core.agentsr   r   Zlangchain_core.callbacksr	   Zlangchain_core.outputsr
   Z#langchain_community.callbacks.utilsr   rF   r_   r   r   r   r   r   r   <module>   s    