U
    h                     @  s   d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
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 ddlmZmZ erddlZd	d
ddZG dd deZdS )!Callback handler for promptlayer.    )annotationsN)TYPE_CHECKINGAnyCallableDictListOptionalTuple)UUID)BaseCallbackHandler)	AIMessageBaseMessageChatMessageHumanMessageSystemMessage)ChatGeneration	LLMResultpromptlayer)returnc                  C  s.   zddl } W n tk
r(   tdY nX | S )z2Lazy import promptlayer to avoid circular imports.r   NzsThe PromptLayerCallbackHandler requires the promptlayer package.  Please install it with `pip install promptlayer`.)r   ImportError)r    r   V/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/callbacks/promptlayer_callback.py_lazy_import_promptlayer   s    
r   c                	   @  s   e Zd ZdZd$ddddddZddd	d
dddddddddZddd	d
dddddddddZddddddddddZdd
dddZdd d!d"d#Z	dS )%PromptLayerCallbackHandlerr   NzOptional[Callable[..., Any]]zOptional[List[str]]None)pl_id_callbackpl_tagsr   c                 C  s    t   || _|pg | _i | _dS )z*Initialize the PromptLayerCallbackHandler.N)r   r   r   runs)selfr   r   r   r   r   __init__)   s    
z#PromptLayerCallbackHandler.__init__)parent_run_idtagszDict[str, Any]zList[List[BaseMessage]]r   zOptional[UUID]r   )
serializedmessagesrun_idr!   r"   kwargsr   c                  sD    fdd|D | di d|d tj  |d j|< d S )Nc                   s   g | ]}  |d  qS )r   )_create_message_dicts.0mr   r   r   
<listcomp>?   s     zBPromptLayerCallbackHandler.on_chat_model_start.<locals>.<listcomp>invocation_params.id)r$   r-   namerequest_start_timer"   getjoindatetimenow	timestampr   )r   r#   r$   r%   r!   r"   r&   r   r+   r   on_chat_model_start4   s    
z.PromptLayerCallbackHandler.on_chat_model_startz	List[str])r#   promptsr%   r!   r"   r&   r   c                K  s6   || di d|d tj  |d| j|< d S )Nr-   r.   r/   )r9   r-   r0   r1   r"   r2   )r   r#   r9   r%   r!   r"   r&   r   r   r   on_llm_startF   s    
z'PromptLayerCallbackHandler.on_llm_start)r!   r   )responser%   r!   r&   r   c                K  s8  ddl m}m} | j|i }|s&d S tj  |d< tt	|j
D ]}|j
| d }	|	j|jd}
|di }|dd d k	}|r|dg | n|dg | g}|rt|	tr| |	jgn|
}||dd	||| j||d
|d| t| jd k	t|t|t|dg dd}| jrF| | qFd S )Nr   )get_api_keypromptlayer_api_requestZrequest_end_time)text
llm_outputr-   r$   r9   r0   Z	langchainr1   r"   )Z_langchain_run_idZ_langchain_parent_run_idZ_langchain_tags)Zreturn_pl_idmetadata)Zpromptlayer.utilsr<   r=   r   r3   r5   r6   r7   rangelenZgenerationsr>   r?   
isinstancer   _convert_message_to_dictmessager   boolr   str)r   r;   r%   r!   r&   r<   r=   Zrun_infoiZ
generationrespZmodel_paramsZis_chat_modelZmodel_inputZmodel_responseZpl_request_idr   r   r   
on_llm_endX   sP    z%PromptLayerCallbackHandler.on_llm_endr   )rE   r   c                 C  s   t |trd|jd}nXt |tr0d|jd}n@t |trHd|jd}n(t |trb|j|jd}ntd| d|jkr|jd |d< |S )Nuser)rolecontentZ	assistantsystemzGot unknown type r0   )	rC   r   rM   r   r   r   rL   
ValueErrorZadditional_kwargs)r   rE   Zmessage_dictr   r   r   rD      s    




z3PromptLayerCallbackHandler._convert_message_to_dictzList[BaseMessage]z+Tuple[List[Dict[str, Any]], Dict[str, Any]])r$   r   c                   s   i } fdd|D }||fS )Nc                   s   g | ]}  |qS r   )rD   r(   r+   r   r   r,      s     zDPromptLayerCallbackHandler._create_message_dicts.<locals>.<listcomp>r   )r   r$   paramsZmessage_dictsr   r+   r   r'      s    z0PromptLayerCallbackHandler._create_message_dicts)NN)
__name__
__module____qualname____doc__r    r8   r:   rJ   rD   r'   r   r   r   r   r   &   s     7r   )rT   
__future__r   r5   typingr   r   r   r   r   r	   r
   uuidr   Zlangchain_core.callbacksr   Zlangchain_core.messagesr   r   r   r   r   Zlangchain_core.outputsr   r   r   r   r   r   r   r   r   <module>   s   $