o
    Zh                     @   s   d dl mZmZmZmZmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZmZmZ z%d dl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W dS  e yp   G dd dZY dS w )    )AnyDictListTypeUnion)BaseLanguageModel)BaseMessageSystemMessageget_buffer_string)BasePromptTemplate)Field)NetworkxEntityGraph)KnowledgeTripleget_entitiesparse_triples)LLMChain)BaseChatMemory)ENTITY_EXTRACTION_PROMPT"KNOWLEDGE_TRIPLE_EXTRACTION_PROMPT)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Zeed	< eZeed
< eZeed< eed< eZee ed< 	 dZeed< deeef deeef fddZedee fddZdeeef defddZdeeef defddZdedee fddZ deeef dee fddZ!dedee" fd d!Z#deeef dd"fd#d$Z$deeef deeef dd"f fd%d&Z%d) fd'd(Z&  Z'S )*ConversationKGMemoryzKnowledge graph conversation memory.

        Integrates with external knowledge graph to store and retrieve
        information about knowledge triples in the conversation.
           kZHumanhuman_prefixZAI	ai_prefix)default_factorykgknowledge_extraction_promptentity_extraction_promptllmsummary_message_clshistory
memory_keyinputsreturnc                    s     |}g }|D ]} j|}|r$d| dd| d}|| q	|s/ jr,g nd}n jr< fdd|D }nd|} j|iS )	zReturn history buffer.zOn z: z. . c                    s   g | ]} j |d qS ))content)r    ).0textself T/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/memory/kg.py
<listcomp>:   s    z>ConversationKGMemory.load_memory_variables.<locals>.<listcomp>
)_get_current_entitiesr   Zget_entity_knowledgejoinappendZreturn_messagesr"   )r+   r#   entitiesZsummary_stringsentity	knowledgesummarycontextr,   r*   r-   load_memory_variables,   s    




z*ConversationKGMemory.load_memory_variablesc                 C   s   | j gS )zUWill always return list of memory variables.

            :meta private:
            )r"   r*   r,   r,   r-   memory_variablesB   s   z%ConversationKGMemory.memory_variablesc                 C   s   | j du rt|| jS | j S )z!Get the input key for the prompt.N)Z	input_keyr   r9   )r+   r#   r,   r,   r-   _get_prompt_input_keyJ   s   
z*ConversationKGMemory._get_prompt_input_keyoutputsc                 C   s>   | j du rt|dkrtd|  t| d S | j S )z"Get the output key for the prompt.N   zOne output key expected, got r   )Z
output_keylen
ValueErrorkeyslist)r+   r;   r,   r,   r-   _get_prompt_output_keyP   s
   
z+ConversationKGMemory._get_prompt_output_keyinput_stringc                 C   sL   t | j| jd}t| jj| j d d  | j| jd}|j	||d}t
|S )Nr   promptr   r   r   )r!   input)r   r   r   r
   chat_memorymessagesr   r   r   predictr   )r+   rB   chainbuffer_stringoutputr,   r,   r-   get_current_entitiesX   s   z)ConversationKGMemory.get_current_entitiesc                 C   s   |  |}| || S )z-Get the current entities in the conversation.)r:   rM   )r+   r#   prompt_input_keyr,   r,   r-   r0   e      
z*ConversationKGMemory._get_current_entitiesc                 C   sR   t | j| jd}t| jj| j d d  | j| jd}|j	||dd}t
|}|S )NrC   r   rE   T)r!   rF   verbose)r   r   r   r
   rG   rH   r   r   r   rI   r   )r+   rB   rJ   rK   rL   r5   r,   r,   r-   get_knowledge_tripletsj   s   z+ConversationKGMemory.get_knowledge_tripletsNc                 C   s2   |  |}| || }|D ]}| j| qdS )z=Get and update knowledge graph from the conversation history.N)r:   rQ   r   Z
add_triple)r+   r#   rN   r5   Ztripler,   r,   r-   _get_and_update_kgy   s
   
z'ConversationKGMemory._get_and_update_kgc                    s   t  || | | dS )z.Save context from this conversation to buffer.N)supersave_contextrR   )r+   r#   r;   	__class__r,   r-   rT      s   z!ConversationKGMemory.save_contextc                    s   t    | j  dS )zClear memory contents.N)rS   clearr   r*   rU   r,   r-   rW      rO   zConversationKGMemory.clear)r$   N)(__name__
__module____qualname____doc__r   int__annotations__r   strr   r   r   r   r   r   r   r   r   r   r	   r    r   r   r"   r   r   r8   propertyr   r9   r:   rA   rM   r0   r   rQ   rR   rT   rW   __classcell__r,   r,   rU   r-   r      s0   
 
"*r   c                   @   s   e Zd ZdS )r   N)rX   rY   rZ   r,   r,   r,   r-   r      s    N)!typingr   r   r   r   r   Zlangchain_core.language_modelsr   Zlangchain_core.messagesr   r	   r
   Zlangchain_core.promptsr   Zpydanticr   Zlangchain_community.graphsr   Z)langchain_community.graphs.networkx_graphr   r   r   Zlangchain.chains.llmr   Zlangchain.memory.chat_memoryr   Zlangchain.memory.promptr   r   Zlangchain.memory.utilsr   r   ImportErrorr,   r,   r,   r-   <module>   s     r