
    ih                         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 	 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e      Zy# e $ r  G d d      ZY yw xY 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                       e Zd ZU dZdZeed<   dZeed<   dZ	eed<    e
e      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Zedee   fd       Zdeeef   defdZdeeef   defdZdedee   fdZ deeef   dee   fdZ!dedee"   fdZ#deeef   ddfdZ$deeef   deeef   ddf fdZ%d fdZ& xZ'S ) ConversationKGMemoryzKnowledge graph conversation memory.

        Integrates with external knowledge graph to store and retrieve
        information about knowledge triples in the conversation.
           kHumanhuman_prefixAI	ai_prefix)default_factorykgknowledge_extraction_promptentity_extraction_promptllmsummary_message_clshistory
memory_keyinputsreturnc                    | j                  |      }g }|D ]I  }| j                  j                  |      }|s!d| ddj                  |       d}|j	                  |       K |s| j
                  rg nd}n=| j
                  r |D cg c]  }| j                  |       }}ndj                  |      }| j                  |iS c c}w )zReturn history buffer.zOn z: z. . )content
)_get_current_entitiesr    get_entity_knowledgejoinappendreturn_messagesr$   r&   )	selfr'   entitiessummary_stringsentity	knowledgesummarycontexttexts	            [/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain_community/memory/kg.pyload_memory_variablesz*ConversationKGMemory.load_memory_variables,   s    11&9H O" 4 GG88@	 #F82dii	.B-C1EG#**73	4 # $ 4 4""%%GV?CD,,T,:  ))O4OOW--s   C c                     | j                   gS )zUWill always return list of memory variables.

            :meta private:
            )r&   )r3   s    r;   memory_variablesz%ConversationKGMemory.memory_variablesB   s     OO$$    c                 ^    | j                   t        || j                        S | j                   S )z!Get the input key for the prompt.)	input_keyr   r>   )r3   r'   s     r;   _get_prompt_input_keyz*ConversationKGMemory._get_prompt_input_keyJ   s)    ~~%+FD4I4IJJ>>!r?   outputsc                     | j                   Ft        |      dk7  rt        d|j                                t	        |j                               d   S | j                   S )z"Get the output key for the prompt.   zOne output key expected, got r   )
output_keylen
ValueErrorkeyslist)r3   rC   s     r;   _get_prompt_output_keyz+ConversationKGMemory._get_prompt_output_keyP   sR    &w<1$$'DW\\^DT%UVVGLLN+A..??"r?   input_stringc                    t        | j                  | j                        }t        | j                  j
                  | j                   dz  d  | j                  | j                        }|j                  ||      }t        |      S )Nr#   promptr   r   r   )r%   input)r   r#   r"   r   chat_memorymessagesr   r   r   predictr   )r3   rL   chainbuffer_stringoutputs        r;   get_current_entitiesz)ConversationKGMemory.get_current_entitiesX   sz    $2O2OPE-  ))466'A+-8!....M
 ]]%" # F  ''r?   c                 L    | j                  |      }| j                  ||         S )z-Get the current entities in the conversation.)rB   rX   )r3   r'   prompt_input_keys      r;   r.   z*ConversationKGMemory._get_current_entitiese   s*    #99&A,,V4D-EFFr?   c                    t        | j                  | j                        }t        | j                  j
                  | j                   dz  d  | j                  | j                        }|j                  ||d      }t        |      }|S )NrN   r   rP   T)r%   rQ   verbose)r   r#   r!   r   rR   rS   r   r   r   rT   r   )r3   rL   rU   rV   rW   r7   s         r;   get_knowledge_tripletsz+ConversationKGMemory.get_knowledge_tripletsj   s    $2R2RSE-  ))466'A+-8!....M
 ]]%" # F
 &f-Ir?   Nc                     | j                  |      }| j                  ||         }|D ]  }| j                  j                  |        y)z=Get and update knowledge graph from the conversation history.N)rB   r]   r    
add_triple)r3   r'   rZ   r7   triples        r;   _get_and_update_kgz'ConversationKGMemory._get_and_update_kgy   sJ    #99&A33F;K4LMI# +""6*+r?   c                 H    t         |   ||       | j                  |       y)z.Save context from this conversation to buffer.N)supersave_contextra   )r3   r'   rC   	__class__s      r;   rd   z!ConversationKGMemory.save_context   s     G 1##F+r?   c                 V    t         |           | j                  j                          y)zClear memory contents.N)rc   clearr    )r3   re   s    r;   rg   zConversationKGMemory.clear   s    GMOGGMMOr?   )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   r<   propertyr   r>   rB   rK   rX   r.   r   r]   ra   rd   rg   __classcell__)re   s   @r;   r   r      s   	 3
#c#	3"'8K"LL. 	$%7 	
 8P "4O1>T+.>F#
C#	.S#X 	.4S> 	., 
	%d3i 	% 
	%	"S#X 	"3 	"	#$sCx. 	#S 	#	(S 	(T#Y 	(	GS#X 	G49 	G
	s 	tO?T 		+T#s(^ 	+ 	+	,tCH~ 	,S#X 	,SW 	,
	 	r?   r   c                       e Zd Zy)r   N)rh   ri   rj    r?   r;   r   r      s    r?   N)!typingr   r   r   r   r   langchain_core.language_modelsr   langchain_core.messagesr	   r
   r   langchain_core.promptsr   pydanticr   langchain_community.graphsr   )langchain_community.graphs.networkx_graphr   r   r   langchain.chains.llmr   langchain.memory.chat_memoryr   langchain.memory.promptr   r   langchain.memory.utilsr   r   ImportErrorrr   r?   r;   <module>r      sg    / / < Q Q 5  : ~-; <p~ pd   s   %A" "A43A4