o
    ZhT2                     @   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                   @   s  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@deeef dee deeef fdd Z	d@deeef dee deeef fd!d"Zed	d	d#d$Ze de!e fd%d&Z"e de!e fd'd(Z#e defd)d*Z$e%	+				dAd,e&dededed-ed.ee' dee dee ded/edd fd0d1Z(e)dd	d	d2dedefd3d4Z*d5edee+ dee, dede!e- f
d6d7Z.d5edee+ dee, dede!e- f
d8d9Z/e0dededed,e&de1f
d:d;Z2e%dBd<d=Z3e%d,e&d/ede!e4 fd>d?Z5dS )C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 }
|
r;| j||||d}n| |||}| jj||| d}| j	| j| j|||||	|| j	 | jrh| j|d|iS | j|i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_documents)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   g/var/www/html/lang_env/lib/python3.10/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 \}	}
|rB| j||||dI dH }n
| |||I dH }| jj||| dI dH }| j| j| j|||||
|| j	I dH  | jrx| j|d|iS | j|i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extrac                 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llm
chain_typechain_type_kwargskwargsc
                 K   sz   ddl m} |p	i }||fd|i|}tjd||||d|
}t||	|d}|| | d|||||||	|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   NrQ   )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alwaysc                 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_vectorstorer;   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_docsc           	      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_sentc              	   K   s   |j }t| jt|d|d|jjdt|d jjjt|d jdr,t	|d jj
jnt|d jdr=t	|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)r[   NNNr/   )r7   N)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$    $	
