U
    h`                     @   sP   d dl mZ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dS )    )AnyDictList)BaseLanguageModel)BaseMessageget_buffer_string)BaseChatMemoryc                       s   e Zd ZU dZdZeed< dZeed< eed< dZ	eed< d	Z
eed
< eedddZeedddZ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 fddZ  ZS )ConversationTokenBufferMemoryz*Conversation chat memory with token limit.ZHumanhuman_prefixZAI	ai_prefixllmhistory
memory_keyi  max_token_limit)returnc                 C   s   | j r| jS | jS )zString buffer of memory.)Zreturn_messagesbuffer_as_messagesbuffer_as_strself r   A/tmp/pip-unpacked-wheel-bo69hh5q/langchain/memory/token_buffer.pybuffer   s    z$ConversationTokenBufferMemory.bufferc                 C   s   t | jj| j| jdS )z@Exposes the buffer as a string in case return_messages is False.)r
   r   )r   chat_memorymessagesr
   r   r   r   r   r   r      s
    z+ConversationTokenBufferMemory.buffer_as_strc                 C   s   | j jS )zIExposes the buffer as a list of messages in case return_messages is True.)r   r   r   r   r   r   r       s    z0ConversationTokenBufferMemory.buffer_as_messagesc                 C   s   | j gS )zMWill always return list of memory variables.

        :meta private:
        )r   r   r   r   r   memory_variables%   s    z.ConversationTokenBufferMemory.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    z3ConversationTokenBufferMemory.load_memory_variablesN)r   outputsr   c                    s\   t  || | jj}| j|}|| jkrXg }|| jkrX||d | j|}q0dS )z6Save context from this conversation to buffer. Pruned.r   N)	supersave_contextr   r   r   Zget_num_tokens_from_messagesr   appendpop)r   r   r   r   Zcurr_buffer_lengthZpruned_memory	__class__r   r   r   1   s    

z*ConversationTokenBufferMemory.save_context)__name__
__module____qualname____doc__r
   str__annotations__r   r   r   r   intpropertyr   r   r   r   r   r   r   r   r   r   __classcell__r   r   r"   r   r	   	   s    
 r	   N)typingr   r   r   Zlangchain_core.language_modelsr   Zlangchain_core.messagesr   r   Zlangchain.memory.chat_memoryr   r	   r   r   r   r   <module>   s   