a
    bgS"                     @   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 eedd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   n1 s,0    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   ~/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/callbacks/sagemaker_callback.py	save_json   s    r   c                       s  e Zd ZdZedd fddZddddZeeef e	e edd	d
dZ
eeddddZeeddddZeeddddZeeef eeef eddddZeeef eddddZeeddddZeeef eeddddZeedd d!d"Zeeddd#d$Zeedd%d&d'Zeedd(d)d*Zeeed+d,d-Zd4eeef eeee dd/d0d1Zddd2d3Z  ZS )5SageMakerCallbackHandlerzCallback Handler that logs prompt artifacts and metrics to SageMaker Experiments.

    Parameters:
        run (sagemaker.experiments.run.Run): Run object where the experiment is logged.
    N)runr   c                    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__)r   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kwargsr   c           	   	   K   s   | j d  d7  < | j d  d7  < | j d  d7  < | j d }i }|ddi |t| || j  t|D ]4\}}t|}||d< | || jd| d	|  qtd
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)tokenr5   r   c                 K   sh   | 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   r@   X   s    
z)SageMakerCallbackHandler.on_llm_new_token)responser5   r   c           	   
   K   s   | j d  d7  < | j d  d7  < | j d  d7  < | j d }i }|ddi |t|jp`i  || j  |jD ]L}t|D ]>\}}t|}|t|  | || j	d| d|  qqxd	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,   rB   r5   r!   r=   rD   r>   Z
generationZgeneration_respr   r   r   rC   e   s"    

z#SageMakerCallbackHandler.on_llm_end)errorr5   r   c                 K   s(   | j d  d7  < | j d  d7  < dS )zRun when LLM errors.r   r6   r   Nr(   r,   rF   r5   r   r   r   on_llm_error~   s    z%SageMakerCallbackHandler.on_llm_error)r3   inputsr5   r   c                 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   s   g | ]\}}| d | qS =r   .0r0   r1   r   r   r   
<listcomp>       z;SageMakerCallbackHandler.on_chain_start.<locals>.<listcomp>rJ   Zchain_start_N)r(   r:   r   joinr/   r   r<   r+   )r,   r3   rJ   r5   r   r=   Zchain_inputZ
input_respr   r   r   rK      s    
z'SageMakerCallbackHandler.on_chain_start)outputsr5   r   c                 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   rL   c                 S   s   g | ]\}}| d | qS rM   r   rO   r   r   r   rQ      rR   z9SageMakerCallbackHandler.on_chain_end.<locals>.<listcomp>on_chain_end)r7   rT   Z
chain_end_N)r(   rS   r/   r:   r<   r+   )r,   rT   r5   r   r=   Zchain_outputr   r   r   rU      s    
z%SageMakerCallbackHandler.on_chain_endc                 K   s(   | j d  d7  < | j d  d7  < dS )zRun when chain errors.r   r6   r   NrG   rH   r   r   r   on_chain_error   s    z'SageMakerCallbackHandler.on_chain_error)r3   	input_strr5   r   c                 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   rW   Ztool_start_N)r(   r:   r   r<   r+   )r,   r3   rW   r5   r#   r=   r   r   r   rX      s    
z&SageMakerCallbackHandler.on_tool_start)outputr5   r   c                 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   rY   Z	tool_end_N)strr(   r:   r<   r+   )r,   rY   r5   r$   r=   r   r   r   rZ      s    
z$SageMakerCallbackHandler.on_tool_endc                 K   s(   | j d  d7  < | j d  d7  < dS )zRun when tool errors.r   r6   r   NrG   rH   r   r   r   on_tool_error   s    z&SageMakerCallbackHandler.on_tool_error)textr5   r   c                 K   sh   | j d  d7  < | j d  d7  < | j d }i }|d|d || j  | || jd|  dS )z+
        Run when agent is ending.
        r   r6   r   on_text)r7   r]   Zon_text_NrA   )r,   r]   r5   r   r=   r   r   r   r^      s    
z SageMakerCallbackHandler.on_text)finishr5   r   c                 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_finishrY   )r7   rY   logZagent_finish_N)r(   r:   Zreturn_valuesra   r<   r+   )r,   r_   r5   r%   r=   r   r   r   r`      s    
z(SageMakerCallbackHandler.on_agent_finish)r7   r5   r   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_inputra   Zagent_action_N)r(   r:   rc   rd   ra   r<   r+   )r,   r7   r5   r#   r=   r   r   r   rb      s    
z(SageMakerCallbackHandler.on_agent_actionT)r   data_dirfilename	is_outputr   c                 C   s4   t j|| d}t|| | jj|||d dS )z,To log the input data as json file artifact.z.json)namerg   N)ospathrS   r   r   Zlog_file)r,   r   re   rf   rg   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)T) __name__
__module____qualname____doc__r   r'   r2   r   r[   r   r8   r@   r
   rC   BaseExceptionrI   rK   rU   rV   rX   rZ   r\   r^   r   r`   r   rb   r   boolr<   rm   __classcell__r   r   r-   r   r      s>    
r   )r   ri   rk   r)   copyr   typingr   r   r   r   Zlangchain_core.agentsr   r   Zlangchain_core.callbacksr	   Zlangchain_core.outputsr
   Z#langchain_community.callbacks.utilsr   rE   r[   r   r   r   r   r   r   <module>   s   