
    Ng                         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dS # e $ r  G d d          ZY dS 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                 Z                          |          }g }|D ]O} j                            |          }|r1d| dd                    |           d}|                    |           P|s j        rg nd}n+ j        r fd|D             }nd                    |          } j        |iS )zReturn history buffer.zOn z: z. . c                 <    g | ]}                     |           S ))content)r$   ).0textselfs     Y/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/memory/kg.py
<listcomp>z>ConversationKGMemory.load_memory_variables.<locals>.<listcomp>:   s7       ?CD,,T,::      
)_get_current_entitiesr    get_entity_knowledgejoinappendreturn_messagesr&   )r0   r'   entitiessummary_stringsentity	knowledgesummarycontexts   `       r1   load_memory_variablesz*ConversationKGMemory.load_memory_variables,   s    11&99H O" 4 4 G88@@	 4EFEEdii	.B.BEEEG#**7333" 5 $ 4<"""% 5   GV   ))O44OW--r3   c                     | j         gS )zUWill always return list of memory variables.

            :meta private:
            )r&   )r0   s    r1   memory_variablesz%ConversationKGMemory.memory_variablesB   s     O$$r3   c                 H    | j         t          || j                  S | j         S )z!Get the input key for the prompt.)	input_keyr   rB   )r0   r'   s     r1   _get_prompt_input_keyz*ConversationKGMemory._get_prompt_input_keyJ   s%    ~%+FD4IJJJ>!r3   outputsc                     | j         ^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   )
output_keylen
ValueErrorkeyslist)r0   rF   s     r1   _get_prompt_output_keyz+ConversationKGMemory._get_prompt_output_keyP   s]    &w<<1$$$%UW\\^^%U%UVVVGLLNN++A..?"r3   input_stringc                     t          | j        | j                  }t          | j        j        | j         dz  d          | j        | j                  }|	                    ||          }t          |          S )Nr#   promptr   r   r   )r%   input)r   r#   r"   r   chat_memorymessagesr   r   r   predictr   )r0   rO   chainbuffer_stringoutputs        r1   get_current_entitiesz)ConversationKGMemory.get_current_entitiesX   s    $2OPPPE- )46'A+--8!..  M
 ]]%" #  F  '''r3   c                 b    |                      |          }|                     ||                   S )z-Get the current entities in the conversation.)rE   r[   )r0   r'   prompt_input_keys      r1   r5   z*ConversationKGMemory._get_current_entitiese   s0    #99&AA,,V4D-EFFFr3   c                     t          | j        | j                  }t          | j        j        | j         dz  d          | j        | j                  }|	                    ||d          }t          |          }|S )NrQ   r   rS   T)r%   rT   verbose)r   r#   r!   r   rU   rV   r   r   r   rW   r   )r0   rO   rX   rY   rZ   r=   s         r1   get_knowledge_tripletsz+ConversationKGMemory.get_knowledge_tripletsj   s    $2RSSSE- )46'A+--8!..  M
 ]]%" #  F
 &f--Ir3   Nc                     |                      |          }|                     ||                   }|D ]}| j                            |           dS )z=Get and update knowledge graph from the conversation history.N)rE   r`   r    
add_triple)r0   r'   r]   r=   triples        r1   _get_and_update_kgz'ConversationKGMemory._get_and_update_kgy   sa    #99&AA33F;K4LMMI# + +""6****+ +r3   c                 v    t                                          ||           |                     |           dS )z.Save context from this conversation to buffer.N)supersave_contextrd   )r0   r'   rF   	__class__s      r1   rg   z!ConversationKGMemory.save_context   s7    GG  111##F+++++r3   c                 z    t                                                       | j                                         dS )zClear memory contents.N)rf   clearr    )r0   rh   s    r1   rj   zConversationKGMemory.clear   s'    GGMMOOOGMMOOOOOr3   )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   rB   rE   rN   r[   r5   r   r`   rd   rg   rj   __classcell__)rh   s   @r1   r   r      s        	 	 3


#c###	3"'%8K"L"L"LLLL. 	$%7 	
 	
 	
 8P "4OO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 	G 	G 	G
	s 	tO?T 	 	 	 		+T#s(^ 	+ 	+ 	+ 	+ 	+	,tCH~ 	,S#X 	,SW 	, 	, 	, 	, 	, 	,
	 	 	 	 	 	 	 	 	 	r3   r   c                       e Zd ZdS )r   N)rk   rl   rm    r3   r1   r   r      s        r3   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   ImportErrorru   r3   r1   <module>r      s   / / / / / / / / / / / / / / < < < < < < Q Q Q Q Q Q Q Q Q Q 5 5 5 5 5 5       : : : : : :         }------;;;;;;        <;;;;;p p p p p~ p p p p pb              s   (A& &A<;A<