a
    bg                     @   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 zHd 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 n  e y   G dd dZY n0 dS )    )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< eeef eeef dddZeee dddZeeef edddZeeef edddZeee dddZ eeef ee dddZ!eee" dd d!Z#eeef d"dd#d$Z$eeef eeef d"d% fd&d'Z%d"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 ]6} j|}|rd| dd| d}|| q|s^ jrXg nd}n$ jrx 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 k/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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_variables)r$   c                 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)outputsr$   c                 C   s>   | j du r8t|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_stringr$   c                 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   s    
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:   rP   r   Z
add_triple)r+   r#   rN   r5   Ztripler,   r,   r-   _get_and_update_kgy   s    
z'ConversationKGMemory._get_and_update_kg)r#   r;   r$   c                    s   t  || | | dS )z.Save context from this conversation to buffer.N)supersave_contextrQ   )r+   r#   r;   	__class__r,   r-   rS      s    z!ConversationKGMemory.save_contextc                    s   t    | j  dS )zClear memory contents.N)rR   clearr   r*   rT   r,   r-   rV      s    
zConversationKGMemory.clear)(__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   rP   rQ   rS   rV   __classcell__r,   r,   rT   r-   r      s,   

 &r   c                   @   s   e Zd ZdS )r   N)rW   rX   rY   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   q