a
    bgT2                     @   s  d Z ddlZddlZddlZddlmZ ddlmZ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 dd	lmZ dd
lmZ ddlmZmZmZ ddlmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z* e+e,Z-G dd deZ.dS )zo
Pebblo Retrieval Chain with Identity & Semantic Enforcement for question-answering
against a vector database.
    N)version)AnyDictListOptional)Chain)BaseCombineDocumentsChain)AsyncCallbackManagerForChainRunCallbackManagerForChainRun)Document)BaseLanguageModel)VectorStoreRetriever)
ConfigDictField	validator)SUPPORTED_VECTORSTORESset_enforcement_filters)AppAuthContext	ChainInfo	FrameworkModelSemanticContextVectorDB)PLUGIN_VERSIONPebbloRetrievalAPIWrapperget_runtimec                   @   sN  e Zd ZU dZeed< dZeed< dZeed< dZ	e
ed< ed	d
Zeed< dZeed< dZeed< eed< eed< eed< dZee ed< dZee ed< dZeed< dZe
ed< d	Ze
ed< eedZeed< d?eeef ee eeef dddZd@eeef ee eeef ddd Zed	d	d!d"Ze e!e d#d$d%Z"e e!e d#d&d'Z#e ed#d(d)Z$e%dAe&eeeeee' ee ee eed d+d,d-Z(e)dd	d	d.eed/d0d1Z*eee+ ee, ee!e- d2d3d4Z.eee+ ee, ee!e- d2d5d6Z/e0eeee&e1d7d8d9Z2e%dd#d:d;Z3e%e&ee!e4 d<d=d>Z5dS )BPebbloRetrievalQAzt
    Retrieval Chain with Identity & Semantic Enforcement for question-answering
    against a vector database.
    combine_documents_chainquery	input_keyresult
output_keyFreturn_source_documentsT)exclude	retrieverauth_contextauth_context_keysemantic_contextsemantic_context_keyapp_nameownerdescriptionNapi_keyclassifier_urllocalclassifier_location_discover_sentenable_prompt_gov)default_factory	pb_client)inputsrun_managerreturnc                 C   s   t j   }|pt }|| j }|| j}|| j}| j	
|\}}	dt| jjv }
|
rv| j||||d}n| |||}| jj||| d}| j	| j| j|||||	|| j	 | jr| j|d|iS | j|iS dS )h  Run get_relevant_text and llm on input query.

        If chain has 'return_source_documents' as 'True', returns
        the retrieved documents as well under the key 'source_documents'.

        Example:
        .. code-block:: python

        res = indexqa({'query': 'This is my query'})
        answer, docs = res['result'], res['source_documents']
        r6   r6   Zinput_documentsquestion	callbackssource_documentsN)datetimenow	isoformatr
   get_noop_managerr    getr'   r)   r4   Zcheck_prompt_validityinspect	signature	_get_docs
parametersr   run	get_childZsend_promptr*   r%   r2   r#   r"   )selfr5   r6   prompt_time_run_managerr;   r&   r(   _prompt_entitiesaccepts_run_managerdocsanswer rQ   ~/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chains/pebblo_retrieval/base.py_callU   s<    

zPebbloRetrievalQA._callc                    s   t j   }|pt }|| j }|| j}|| j}dt	
| jjv }| j|I dH \}	}
|r| j||||dI dH }n| |||I dH }| jj||| dI dH }| j| j| j|||||
|| j	I dH  | jr| j|d|iS | j|iS dS )r8   r6   Nr9   r:   r=   )r>   r?   r@   r	   rA   r    rB   r'   r)   rC   rD   
_aget_docsrF   r4   Zacheck_prompt_validityr   ZarunrH   Zasend_promptr*   r%   r2   r#   r"   )rI   r5   r6   rJ   rK   r;   r&   r(   rN   rL   rM   rO   rP   rQ   rQ   rR   _acall   s<    


zPebbloRetrievalQA._acallZforbid)Zpopulate_by_nameZarbitrary_types_allowedextra)r7   c                 C   s   | j | j| jgS )z,Input keys.

        :meta private:
        )r    r'   r)   rI   rQ   rQ   rR   
input_keys   s    zPebbloRetrievalQA.input_keysc                 C   s   | j g}| jr|dg7 }|S )z-Output keys.

        :meta private:
        r=   )r"   r#   )rI   Z_output_keysrQ   rQ   rR   output_keys   s    
zPebbloRetrievalQA.output_keysc                 C   s   dS )zReturn the chain type.Zpebblo_retrieval_qarQ   rW   rQ   rQ   rR   _chain_type   s    zPebbloRetrievalQA._chain_typestuff)llmr*   r,   r+   
chain_typechain_type_kwargsr-   r.   r0   kwargsr7   c
                 K   sz   ddl m} |pi }||fd|i|}tjf ||||d|
}t||	|d}|| | f |||||||	|d|
S )zLoad chain from chain type.r   )load_qa_chainr]   )r*   r,   r+   r\   )r-   r0   r.   )r   r*   r+   r,   r-   r.   r0   r4   )Z#langchain.chains.question_answeringr`   r   _get_app_detailsr   Zsend_app_discover)clsr\   r*   r,   r+   r]   r^   r-   r.   r0   r_   r`   Z_chain_type_kwargsr   appr4   rQ   rQ   rR   from_chain_type   sF    
	z!PebbloRetrievalQA.from_chain_type)prealways)r%   r7   c                 C   s.   |j jjtvr*tdt d|j jj d|S )z[
        Validate that the vectorstore of the retriever is supported vectorstores.
        zFVectorstore must be an instance of one of the supported vectorstores: z. Got 'z
' instead.)vectorstore	__class____name__r   
ValueError)rb   r%   rQ   rQ   rR   validate_vectorstore  s    z&PebbloRetrievalQA.validate_vectorstore)r;   r&   r(   r6   r7   c                C   s"   t | j|| | jj|| dS )	Get docs.r<   )r   r%   Zget_relevant_documentsrH   rI   r;   r&   r(   r6   rQ   rQ   rR   rE     s    	zPebbloRetrievalQA._get_docsc                   s(   t | j|| | jj|| dI dH S )rl   rm   N)r   r%   Zaget_relevant_documentsrH   rn   rQ   rQ   rR   rT   -  s    	zPebbloRetrievalQA._aget_docs)r*   r+   r,   r\   r7   c           	      K   sD   t  \}}tj|fi |}t| |||||ttdtddd}|S )z[Fetch app details. Internal method.
        Returns:
            App: App details.
        Zlangchain_community)namer   )ro   r+   r,   runtime	frameworkchainsZplugin_versionclient_version)r   r   get_chain_detailsr   r   r   r   )	r*   r+   r,   r\   r_   rq   rp   rr   rc   rQ   rQ   rR   ra   ;  s     
z"PebbloRetrievalQA._get_app_detailsc                 C   s
   d| _ d S )NT)r1   )rb   rQ   rQ   rR   set_discover_sentT  s    z#PebbloRetrievalQA.set_discover_sent)r\   r_   r7   c              	   K   s   |j }t| jt|d|d|jjdt|d jjjt|d jdrXt	|d jj
jn$t|d jdrzt	|d jjjnddgd	g}|S )
z
        Get chain details.

        Args:
            llm (BaseLanguageModel): Language model instance.
            **kwargs: Additional keyword arguments.

        Returns:
            List[ChainInfo]: Chain details.
        Z
model_namemodel)ro   vendorr%   _embeddings
_embeddingN)ro   Zembedding_model)ro   rv   Z
vector_dbs)__dict__r   ri   r   rB   rh   r   rg   hasattrstrrx   rv   ry   )rb   r\   r_   Zllm_dictrr   rQ   rQ   rR   rt   X  s*    z#PebbloRetrievalQA.get_chain_details)N)N)r[   NNNr/   )6ri   
__module____qualname____doc__r   __annotations__r    r|   r"   r#   boolr   r%   r   r'   r)   r-   r   r.   r0   r1   r2   r   r4   r   r   r
   rS   r	   rU   r   Zmodel_configpropertyr   rX   rY   rZ   classmethodr   dictrd   r   rk   r   r   r   rE   rT   staticmethodr   ra   ru   r   rt   rQ   rQ   rQ   rR   r   -   s   
 

8 

6
     1r   )/r   r>   rC   loggingimportlib.metadatar   typingr   r   r   r   Zlangchain.chains.baser   Z'langchain.chains.combine_documents.baser   Zlangchain_core.callbacksr	   r
   Zlangchain_core.documentsr   Zlangchain_core.language_modelsr   Zlangchain_core.vectorstoresr   Zpydanticr   r   r   Z?langchain_community.chains.pebblo_retrieval.enforcement_filtersr   r   Z2langchain_community.chains.pebblo_retrieval.modelsr   r   r   r   r   r   r   Z5langchain_community.chains.pebblo_retrieval.utilitiesr   r   r   	getLoggerri   loggerr   rQ   rQ   rQ   rR   <module>   s"   $	
