a
    `g:A                     @  s  d Z ddlmZ ddlZddl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mZ dd	lmZ dd
lmZ ddlmZmZmZmZ ddlmZ e
rddlmZmZm Z  e!Z"e#e Z$ee"e$f Z%eee$f Z&G dd deddZ'G dd dee"e$f eZ(dS )a  **Retriever** class returns Documents given a text **query**.

It is more general than a vector store. A retriever does not need to be able to
store documents, only to return (or retrieve) it. Vector stores can be used as
the backbone of a retriever, but there are other types of retrievers as well.

**Class hierarchy:**

.. code-block::

    BaseRetriever --> <name>Retriever  # Examples: ArxivRetriever, MergerRetriever

**Main helpers:**

.. code-block::

    RetrieverInput, RetrieverOutput, RetrieverLike, RetrieverOutputLike,
    Document, Serializable, Callbacks,
    CallbackManagerForRetrieverRun, AsyncCallbackManagerForRetrieverRun
    )annotationsN)ABCabstractmethod)	signature)TYPE_CHECKINGAnyOptional)
ConfigDict)Self	TypedDict)
deprecated)Document)RunnableRunnableConfigRunnableSerializableensure_config)run_in_executor)#AsyncCallbackManagerForRetrieverRunCallbackManagerForRetrieverRun	Callbacksc                   @  s2   e Zd ZU dZded< ded< ded< ded< dS )	LangSmithRetrieverParamsz!LangSmith parameters for tracing.strls_retriever_nameOptional[str]Zls_vector_store_providerZls_embedding_providerZls_embedding_modelN)__name__
__module____qualname____doc____annotations__ r   r   g/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_core/retrievers.pyr   7   s   
r   F)totalc                
      s0  e Zd ZU dZeddZdZded< dZded< dZ	d	ed
< dZ
ded< ddd fddZdddddZd1dddddddZd2dddddddZedddddd Zdd!ddd"d#Zed$d%d&d'ddddd(dd)d	dd*ddd+d,d-Zed$d.d&d'ddddd(dd)d	dd*ddd+d/d0Z  ZS )3BaseRetrievera?	  Abstract base class for a Document retrieval system.

    A retrieval system is defined as something that can take string queries and return
    the most 'relevant' Documents from some source.

    Usage:

    A retriever follows the standard Runnable interface, and should be used
    via the standard Runnable methods of `invoke`, `ainvoke`, `batch`, `abatch`.

    Implementation:

    When implementing a custom retriever, the class should implement
    the `_get_relevant_documents` method to define the logic for retrieving documents.

    Optionally, an async native implementations can be provided by overriding the
    `_aget_relevant_documents` method.

    Example: A retriever that returns the first 5 documents from a list of documents

        .. code-block:: python

            from langchain_core.documents import Document
            from langchain_core.retrievers import BaseRetriever
            from typing import List

            class SimpleRetriever(BaseRetriever):
                docs: List[Document]
                k: int = 5

                def _get_relevant_documents(self, query: str) -> List[Document]:
                    """Return the first k documents from the list of documents"""
                    return self.docs[:self.k]

                async def _aget_relevant_documents(self, query: str) -> List[Document]:
                    """(Optional) async native implementation."""
                    return self.docs[:self.k]

    Example: A simple retriever based on a scikit-learn vectorizer

        .. code-block:: python

            from sklearn.metrics.pairwise import cosine_similarity

            class TFIDFRetriever(BaseRetriever, BaseModel):
                vectorizer: Any
                docs: List[Document]
                tfidf_array: Any
                k: int = 4

                class Config:
                    arbitrary_types_allowed = True

                def _get_relevant_documents(self, query: str) -> List[Document]:
                    # Ip -- (n_docs,x), Op -- (n_docs,n_Feats)
                    query_vec = self.vectorizer.transform([query])
                    # Op -- (n_docs,1) -- Cosine Sim with each doc
                    results = cosine_similarity(self.tfidf_array, query_vec).reshape((-1,))
                    return [self.docs[i] for i in results.argsort()[-self.k :][::-1]]
    T)Zarbitrary_types_allowedFbool_new_arg_supported_expects_other_argsNzOptional[list[str]]tagszOptional[dict[str, Any]]metadatar   None)kwargsreturnc                   s   t  jf i | | jtjkrBtjdtdd | j}tj| _|| _t| dr|| j	tj	kr|tjdtdd | j	}tj	| _	|| _
t| jj}|dd u| _| js| j
tj
krddd	d
dd}|| _
tt| h d dk| _d S )NzgRetrievers must implement abstract `_get_relevant_documents` method instead of `get_relevant_documents`   )
stacklevelaget_relevant_documentsziRetrievers must implement abstract `_aget_relevant_documents` method instead of `aget_relevant_documents`run_managerr
   r   list[Document])selfqueryr*   c                   s   t d | j|I d H S )N)r   _get_relevant_documents)r0   r1   r   r   r    _aget_relevant_documents   s    zABaseRetriever.__init_subclass__.<locals>._aget_relevant_documents>   r0   r1   r.   r   )super__init_subclass__get_relevant_documentsr"   warningswarnDeprecationWarningr2   hasattrr-   r3   r   
parametersgetr$   lensetkeysr%   )clsr)   ZswapZaswapr;   r3   	__class__r   r    r5      sD    

zBaseRetriever.__init_subclass__r   c                 K  sL   |   }|dr |dd }n|dr6|dd }| }t|d}|S )z Get standard params for tracing.Z	Retriever	   Ni)r   )get_name
startswithendswithlowerr   )r0   r)   Zdefault_retriever_nameZ	ls_paramsr   r   r    _get_ls_params   s    


zBaseRetriever._get_ls_paramsr   zOptional[RunnableConfig]r/   )inputconfigr)   r*   c              
   K  s  ddl m} t|}i |dp"i | jf i |}|j|dd|dd|d| j|| jd	}|jd||d
p~| 	 |
ddd}zB| jr|ni }| jr| j|fd|i|}	n| j|fi |}	W n2 ty }
 z||
  W Y d}
~
nd}
~
0 0 ||	 |	S dS )a  Invoke the retriever to get relevant documents.

        Main entry point for synchronous retriever invocations.

        Args:
            input: The query string.
            config: Configuration for the retriever. Defaults to None.
            kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.

        Examples:

        .. code-block:: python

            retriever.invoke("query")
        r   )CallbackManagerr'   	callbacksNverboseFr&   rM   Zinheritable_tagsZ
local_tagsinheritable_metadataZlocal_metadatarun_namerun_idnamerQ   r.   ) langchain_core.callbacks.managerrK   r   r<   rH   	configurer&   r'   on_retriever_startrD   popr%   r$   r2   	Exceptionon_retriever_erroron_retriever_end)r0   rI   rJ   r)   rK   rO   callback_managerr.   _kwargsresulter   r   r    invoke   sP    
	

zBaseRetriever.invokec              
     s4  ddl m} t|}i |dp"i | jf i |}|j|dd|dd|d| j|| jd	}|jd||d
p~| 	 |
dddI dH }zN| jr|ni }| jr| j|fd|i|I dH }	n| j|fi |I dH }	W n8 ty }
 z||
I dH   W Y d}
~
nd}
~
0 0 ||	I dH  |	S dS )a  Asynchronously invoke the retriever to get relevant documents.

        Main entry point for asynchronous retriever invocations.

        Args:
            input: The query string.
            config: Configuration for the retriever. Defaults to None.
            kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.

        Examples:

        .. code-block:: python

            await retriever.ainvoke("query")
        r   )AsyncCallbackManagerr'   rL   NrM   Fr&   rN   rP   rQ   rR   r.   )rT   r`   r   r<   rH   rU   r&   r'   rV   rD   rW   r%   r$   r3   rX   rY   rZ   )r0   rI   rJ   r)   r`   rO   r[   r.   r\   r]   r^   r   r   r    ainvoke  sP    
	

zBaseRetriever.ainvoker   )r1   r.   r*   c                C  s   dS )zGet documents relevant to a query.

        Args:
            query: String to find relevant documents for.
            run_manager: The callback handler to use.

        Returns:
            List of relevant documents.
        Nr   r0   r1   r.   r   r   r    r2   P  s    z%BaseRetriever._get_relevant_documentsr   c                  s   t d| j|| dI dH S )zAsynchronously get documents relevant to a query.

        Args:
            query: String to find relevant documents for
            run_manager: The callback handler to use
        Returns:
            List of relevant documents
        N)r.   )r   r2   Zget_syncrb   r   r   r    r3   ^  s    z&BaseRetriever._aget_relevant_documentsz0.1.46r_   z1.0)ZsincealternativeZremoval)rL   r&   r'   rP   r   r   )r1   rL   r&   r'   rP   r)   r*   c                K  sH   i }|r||d< |r||d< |r(||d< |r4||d< | j ||fi |S )a  Retrieve documents relevant to a query.

        Users should favor using `.invoke` or `.batch` rather than
        `get_relevant_documents directly`.

        Args:
            query: string to find relevant documents for.
            callbacks: Callback manager or list of callbacks. Defaults to None.
            tags: Optional list of tags associated with the retriever.
                These tags will be associated with each call to this retriever,
                and passed as arguments to the handlers defined in `callbacks`.
                Defaults to None.
            metadata: Optional metadata associated with the retriever.
                This metadata will be associated with each call to this retriever,
                and passed as arguments to the handlers defined in `callbacks`.
                Defaults to None.
            run_name: Optional name for the run. Defaults to None.
            kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.
        rL   r&   r'   rP   )r_   r0   r1   rL   r&   r'   rP   r)   rJ   r   r   r    r6   p  s    !z$BaseRetriever.get_relevant_documentsra   c                  sN   i }|r||d< |r||d< |r(||d< |r4||d< | j ||fi |I dH S )a  Asynchronously get documents relevant to a query.

        Users should favor using `.ainvoke` or `.abatch` rather than
        `aget_relevant_documents directly`.

        Args:
            query: string to find relevant documents for.
            callbacks: Callback manager or list of callbacks.
            tags: Optional list of tags associated with the retriever.
                These tags will be associated with each call to this retriever,
                and passed as arguments to the handlers defined in `callbacks`.
                Defaults to None.
            metadata: Optional metadata associated with the retriever.
                This metadata will be associated with each call to this retriever,
                and passed as arguments to the handlers defined in `callbacks`.
                Defaults to None.
            run_name: Optional name for the run. Defaults to None.
            kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.
        rL   r&   r'   rP   N)ra   rd   r   r   r    r-     s    !z%BaseRetriever.aget_relevant_documents)N)N)r   r   r   r   r	   Zmodel_configr$   r   r%   r&   r'   r5   rH   r_   ra   r   r2   r3   r   r6   r-   __classcell__r   r   rA   r    r"   D   s:   
=2 ? ? +r"   ))r   
__future__r   r7   abcr   r   inspectr   typingr   r   r   Zpydanticr	   Ztyping_extensionsr
   r   Zlangchain_core._apir   Zlangchain_core.documentsr   Zlangchain_core.runnablesr   r   r   r   Zlangchain_core.runnables.configr   rT   r   r   r   r   ZRetrieverInputlistZRetrieverOutputZRetrieverLikeZRetrieverOutputLiker   r"   r   r   r   r    <module>   s&   