
    D_iu+                       S r SSKJr  SSKJrJr  SSKJr  SSKJ	r	J
r
  SSKJr  SSKJrJrJr  SSKJrJr  SS	KJr  SS
KJrJrJrJr  SSKJr  \	(       a  SSKJrJr  \r \!\   r"\\ \"4   r#\\
\"4   r$ " S S\SS9r% " S S\\ \"4   \5      r&g)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                  H    \ rS rSr% SrS\S'    S\S'    S\S'    S\S'   S	rg
)LangSmithRetrieverParams'   z!LangSmith parameters for tracing.strls_retriever_namez
str | Nonels_vector_store_providerls_embedding_providerls_embedding_model N)__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r       S/home/james-whalen/.local/lib/python3.13/site-packages/langchain_core/retrievers.pyr   r   '   s)    +(( %%""r'   r   F)totalc                    ^  \ rS rSr% Sr\" SS9rSrS\S'   Sr	S\S'   S	r
S
\S'    S	rS\S'    \SU 4S jj5       rSS jr\ S       SS jj5       r\ S       SS jj5       r\      SS j5       r      SS jrSrU =r$ )BaseRetriever4   a  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metadatac                r  > [         TU ]  " S0 UD6  [        U R                  5      R                  nUR                  S5      S LU l        U R                  (       d/  U R                  [        R                  :X  a        SS jnX0l        [        [        UR                  5       5      1 Sk-
  5      S:  U l        g )Nrun_managerc                L   #    [        S U R                  U5      I S h  vN $  N7fN)r   _get_relevant_documents)selfquerys     r(   _aget_relevant_documentsABaseRetriever.__init_subclass__.<locals>._aget_relevant_documents   s#      -T43O3OQVWWWWs   $"$>   r8   r9   r4   r   r   )r8   r
   r9   r   returnlist[Document])super__init_subclass__r   r7   
parametersgetr/   r:   r+   lensetkeysr0   )clskwargsr@   r:   	__class__s       r(   r?   BaseRetriever.__init_subclass__   s    !+F+s::;FF
!+!>d!J&&,,0V0VVXX#&XX
 ,D( JOO%&)IIJQN 	r'   c                    U R                  5       nUR                  S5      (       a  USS nOUR                  S5      (       a  USS nUR                  5       n[	        US9$ )z Get standard params for tracing.	Retriever	   Ni)r   )get_name
startswithendswithlowerr   )r8   _kwargsdefault_retriever_names      r(   _get_ls_paramsBaseRetriever._get_ls_params   se    !%!,,[99%;AB%?"#,,[99%;CR%@"!7!=!=!?':PQQr'   c           
        [        U5      n0 UR                  S5      =(       d    0 EU R                  " S0 UD6En[        R                  " UR                  S5      SUR                  SS5      UR                  S5      U R
                  UU R                  S9nUR                  SUUR                  S5      =(       d    U R                  5       UR                  S	S5      S
9n U R                  (       a  UO0 nU R                  (       a  U R                  " U4SU0UD6nOU R                  " U40 UD6nUR                  U5        U$ ! [         a  n	UR                  U	5        e Sn	A	ff = f)aT  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")
```
r2   	callbacksNverboseFr1   rV   inheritable_tags
local_tagsinheritable_metadatalocal_metadatarun_namerun_idnamer]   r4   r   )r   rA   rR   r   	configurer1   r2   on_retriever_startrL   popr0   r/   r7   on_retriever_end	Exceptionon_retriever_error
r8   inputconfigrF   rZ   callback_managerr4   kwargs_resultes
             r(   invokeBaseRetriever.invoke   se   * v& 
zz*%+ 
!!+F+ 
 +44JJ{#JJy%0#ZZ/yy!5==
 '99J':4==?::h-	 : 
	 $ 8 8fbG&&55'26= 55eGwG
 (( M  	**1-	s   AE 
E"EE"c           
     4  #    [        U5      n0 UR                  S5      =(       d    0 EU R                  " S0 UD6En[        R                  " UR                  S5      SUR                  SS5      UR                  S5      U R
                  UU R                  S9nUR                  SUUR                  S5      =(       d    U R                  5       UR                  S	S5      S
9I Sh  vN n U R                  (       a  UO0 nU R                  (       a  U R                  " U4SU0UD6I Sh  vN nOU R                  " U40 UD6I Sh  vN nUR                  U5      I Sh  vN   U$  N N= N# N! [         a   n	UR                  U	5      I Sh  vN    e Sn	A	ff = f7f)ak  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")
```
r2   rU   NrV   Fr1   rW   r\   r]   r^   r4   r   )r   rA   rR   r   r`   r1   r2   ra   rL   rb   r0   r/   r:   rc   rd   re   rf   s
             r(   ainvokeBaseRetriever.ainvoke   s    0 v& 
zz*%+ 
!!+F+ 
 099JJ{#JJy%0#ZZ/yy!5==
 -??J':4==?::h-	 @ 
 
	 $ 8 8fbG&&#<< '2 6=    $<<UNgNN
 ..   M+
 O
	  	00333	sx   C!F#E#$F)>E+ 'E%(E+ E'E+ FE)F%E+ 'E+ )F+
F5F	F
FFFc                   g)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   r8   r9   r4   s      r(   r7   %BaseRetriever._get_relevant_documents#  s    r'   c               f   #    [        SU R                  UUR                  5       S9I Sh  vN $  N7f)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)r4   )r   r7   get_syncrs   s      r(   r:   &BaseRetriever._aget_relevant_documents1  s9      %((#,,.	
 
 	
 
s   (1/1r   )rF   r   r<   None)rP   r   r<   r   r6   )rg   r   rh   zRunnableConfig | NonerF   r   r<   r=   )r9   r   r4   r   r<   r=   )r9   r   r4   r   r<   r=   )r    r!   r"   r#   r$   r	   model_configr/   r%   r0   r1   r2   r   r?   rR   rm   rp   r   r7   r:   r&   __classcell__)rG   s   @r(   r+   r+   4   s2   ;z  $L  %$ %%!D
! '+H#* 
 
*	R :>77"77JM7	7 7r  )-:: &: 	:
 
: :x *H	 

*M
	
 
r'   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(   <module>r      s    # #  %  7 7 R -  <
 x.89sO34 
y 
N
()HI3 N
r'   