U
    h                     @   st   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mZ d dlmZ G dd deZG dd	 d	eZd
S )    )AnyDictListOptional)BaseMessageget_buffer_string)pre_init)BaseChatMemory
BaseMemory)get_prompt_input_keyc                   @   s  e Zd ZU dZdZeed< dZeed< dZeed< e	e
dd	d
Ze
dddZee edddZe	edddZedddZe	ee dddZee dddZe	ee dddZeee
f eee
f dddZeee
f eee
f dddZdS ) ConversationBufferMemory'Buffer for storing conversation memory.Humanhuman_prefixAI	ai_prefixhistory
memory_keyreturnc                 C   s   | j r| jS | jS )String buffer of memory.)return_messagesbuffer_as_messagesbuffer_as_strself r   ;/tmp/pip-unpacked-wheel-bo69hh5q/langchain/memory/buffer.pybuffer   s    zConversationBufferMemory.bufferc                    s"   | j r|  I dH S |  I dH S )r   N)r   abuffer_as_messagesabuffer_as_strr   r   r   r   abuffer   s    z ConversationBufferMemory.abuffer)messagesr   c                 C   s   t || j| jdS )N)r   r   )r   r   r   r   r"   r   r   r   _buffer_as_str   s
    z'ConversationBufferMemory._buffer_as_strc                 C   s   |  | jjS )?Exposes the buffer as a string in case return_messages is True.)r$   chat_memoryr"   r   r   r   r   r   %   s    z&ConversationBufferMemory.buffer_as_strc                    s   | j  I dH }| |S )r%   N)r&   aget_messagesr$   r#   r   r   r   r    *   s    z'ConversationBufferMemory.abuffer_as_strc                 C   s   | j jS )JExposes the buffer as a list of messages in case return_messages is False.)r&   r"   r   r   r   r   r   /   s    z+ConversationBufferMemory.buffer_as_messagesc                    s   | j  I dH S )r(   N)r&   r'   r   r   r   r   r   4   s    z,ConversationBufferMemory.abuffer_as_messagesc                 C   s   | j gS )zMWill always return list of memory variables.

        :meta private:
        r   r   r   r   r   memory_variables8   s    z)ConversationBufferMemory.memory_variablesinputsr   c                 C   s   | j | jiS zReturn history buffer.r   r   r   r,   r   r   r   load_memory_variables@   s    z.ConversationBufferMemory.load_memory_variablesc                    s   |   I dH }| j|iS )z9Return key-value pairs given the text input to the chain.N)r!   r   )r   r,   r   r   r   r   aload_memory_variablesD   s    z/ConversationBufferMemory.aload_memory_variablesN)__name__
__module____qualname____doc__r   str__annotations__r   r   propertyr   r   r!   r   r   r$   r   r    r   r   r*   r   r0   r1   r   r   r   r   r   
   s$   
 r   c                   @   s,  e Zd ZU dZdZeed< dZeed< dZeed< dZ	e
e ed	< dZe
e ed
< dZeed< eeedddZeee dddZeeef eeef dddZeeef eeef dddZeeef eeef ddddZeeef eeef ddddZddddZdddd ZdS )!ConversationStringBufferMemoryr   r   r   r   r    r   N
output_key	input_keyr   r   )valuesr   c                 C   s   | ddrtd|S )z*Validate that return messages is not True.r   Fz@return_messages must be False for ConversationStringBufferMemory)get
ValueError)clsr=   r   r   r   validate_chainsU   s
    z.ConversationStringBufferMemory.validate_chainsr   c                 C   s   | j gS )zLWill always return list of memory variables.
        :meta private:
        r)   r   r   r   r   r*   ^   s    z/ConversationStringBufferMemory.memory_variablesr+   c                 C   s   | j | jiS r-   r.   r/   r   r   r   r0   e   s    z4ConversationStringBufferMemory.load_memory_variablesc                    s
   |  |S r-   )r0   r/   r   r   r   r1   i   s    z5ConversationStringBufferMemory.aload_memory_variables)r,   outputsr   c                 C   s   | j dkrt|| j}n| j }| jdkrXt|dkrFtd|  t| d }n| j}| j d||  }| j	 d||  }|  j
dd||g 7  _
dS ).Save context from this conversation to buffer.N   zOne output key expected, got r   z: 
)r<   r   r*   r;   lenr?   keyslistr   r   r   join)r   r,   rB   Zprompt_input_keyr;   ZhumanZair   r   r   save_contextm   s    

z+ConversationStringBufferMemory.save_contextc                    s   |  ||S )rC   )rJ   )r   r,   rB   r   r   r   asave_context}   s    z,ConversationStringBufferMemory.asave_contextc                 C   s
   d| _ dS )zClear memory contents.r:   N)r   r   r   r   r   clear   s    z$ConversationStringBufferMemory.clearc                    s   |    d S )N)rL   r   r   r   r   aclear   s    z%ConversationStringBufferMemory.aclear)r2   r3   r4   r5   r   r6   r7   r   r   r;   r   r<   r   r   r   rA   r8   r   r*   r   r0   r1   rJ   rK   rL   rM   r   r   r   r   r9   J   s(   
  "
 
r9   N)typingr   r   r   r   Zlangchain_core.messagesr   r   Zlangchain_core.utilsr   Zlangchain.memory.chat_memoryr	   r
   Zlangchain.memory.utilsr   r   r9   r   r   r   r   <module>   s   @