o
    +iu+                     @  s  d Z ddlmZ ddl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mZmZ ddlmZmZ dd	lmZ dd
lmZmZmZmZ ddlmZ e	rXddl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.
    )annotations)ABCabstractmethod)	signature)TYPE_CHECKINGAny)
ConfigDict)Self	TypedDictoverride)AsyncCallbackManagerCallbackManager)Document)RunnableRunnableConfigRunnableSerializableensure_config)run_in_executor)#AsyncCallbackManagerForRetrieverRunCallbackManagerForRetrieverRunc                   @  s8   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_namez
str | Nonels_vector_store_providerls_embedding_providerls_embedding_modelN)__name__
__module____qualname____doc____annotations__ r!   r!   V/var/www/html/psymed-ai/venv/lib/python3.10/site-packages/langchain_core/retrievers.pyr   '   s   
 r   F)totalc                      s   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< 	 ed( fddZd)ddZe	d*d+ddZe	d*d+ddZed,d#d$Zd-d&d'Z  ZS ).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 "Retriever that returns the first 5 documents from a list of documents"

        ```python
        from langchain_core.documents import Document
        from langchain_core.retrievers import BaseRetriever

        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 "Simple retriever based on a scikit-learn vectorizer"

        ```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)arbitrary_types_allowedFbool_new_arg_supported_expects_other_argsNzlist[str] | Nonetagszdict[str, Any] | Nonemetadatakwargsr   returnNonec                   sr   t  jdi | t| jj}|dd u| _| js(| jtjkr(ddd	}|| _t	t
| h d
 dk| _d S )Nrun_managerselfr	   queryr   r,   list[Document]c                   s   t d | j|I d H S N)r   _get_relevant_documents)r/   r0   r!   r!   r"   _aget_relevant_documents   s   zABaseRetriever.__init_subclass__.<locals>._aget_relevant_documents>   r/   r0   r.   r   r!   )r/   r	   r0   r   r,   r1   )super__init_subclass__r   r3   
parametersgetr'   r4   r$   lensetkeysr(   )clsr+   r7   r4   	__class__r!   r"   r6      s   
zBaseRetriever.__init_subclass___kwargsr   c                 K  sH   |   }|dr|dd }n|dr|dd }| }t|dS )z Get standard params for tracing.	Retriever	   Ni)r   )get_name
startswithendswithlowerr   )r/   r?   default_retriever_namer!   r!   r"   _get_ls_params   s   


zBaseRetriever._get_ls_paramsinputr   configRunnableConfig | Noner1   c           
   
   K  s   t |}i |dpi | jdi |}tj|dd|dd|d| j|| jd}|jd||dp9|  |	d	dd
}z!| j
rG|ni }| jrX| j|fd|i|}n	| j|fi |}W n tyt }	 z||	  d}	~	ww || |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.
            **kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.

        Examples:
        ```python
        retriever.invoke("query")
        ```
        r*   	callbacksNverboseFr)   rL   inheritable_tags
local_tagsinheritable_metadatalocal_metadatarun_namerun_idnamerS   r.   r!   )r   r8   rG   r   	configurer)   r*   on_retriever_startrB   popr(   r'   r3   	Exceptionon_retriever_erroron_retriever_end
r/   rH   rI   r+   rP   callback_managerr.   kwargs_resulter!   r!   r"   invoke   sT   
	

zBaseRetriever.invokec           
   
     s  t |}i |dpi | jdi |}tj|dd|dd|d| j|| jd}|jd||dp:|  |	d	dd
I dH }z'| j
rK|ni }| jr_| j|fd|i|I dH }n| j|fi |I dH }W n ty }	 z	||	I dH   d}	~	ww ||I dH  |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.
            **kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.

        Examples:
        ```python
        await retriever.ainvoke("query")
        ```
        r*   rK   NrL   Fr)   rM   rR   rS   rT   r.   r!   )r   r8   rG   r   rV   r)   r*   rW   rB   rX   r(   r'   r4   rY   rZ   r[   r\   r!   r!   r"   ainvoke   sV   
	

zBaseRetriever.ainvoker0   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!   r/   r0   r.   r!   r!   r"   r3   #  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   r3   get_syncrc   r!   r!   r"   r4   1  s   z&BaseRetriever._aget_relevant_documents)r+   r   r,   r-   )r?   r   r,   r   r2   )rH   r   rI   rJ   r+   r   r,   r1   )r0   r   r.   r   r,   r1   )r0   r   r.   r   r,   r1   )r   r   r   r   r   model_configr'   r    r(   r)   r*   r   r6   rG   ra   rb   r   r3   r4   __classcell__r!   r!   r=   r"   r$   4   s.   
 =	
9<r$   N)'r   
__future__r   abcr   r   inspectr   typingr   r   pydanticr   typing_extensionsr	   r
   r    langchain_core.callbacks.managerr   r   langchain_core.documentsr   langchain_core.runnablesr   r   r   r   langchain_core.runnables.configr   r   r   r   RetrieverInputlistRetrieverOutputRetrieverLikeRetrieverOutputLiker   r$   r!   r!   r!   r"   <module>   s&    