ó
    üÞ j„+  ã                  ó  • 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)a5  **Retriever** class returns `Document` objects 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/var/www/html/gaurav/venv/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$ )ÚBaseRetrieveré7   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_documentsÚABaseRetriever.__init_subclass__.<locals>._aget_relevant_documents›   s#   é € ô -¨T°4×3OÑ3OÐQVÓW×WÐWÑWùs   ‚$�"ž$>   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ˆÔà×&×&Ø×,Ñ,´×0VÑ0VÓVðXØðXØ#&ðXàôXð
 ,DÔ(ô ”�J—O‘OÓ%Ó&Ò)IÑIÓJÈQÑ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Ø%;¸A¸BÐ%?Ñ"Ø#×,Ñ,¨[×9Ñ9Ø%;¸C¸RÐ%@Ð"Ø!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Ó&ˆð 
Ø�z‰z˜*Ó%×+¨ð 
à×!Ò!Ñ+ FÑ+ð 
Ðô +×4Ò4Ø�J‰J�{Ó#ØØ—J‘J˜y¨%Ó0Ø#ŸZ™Z¨Ó/Ø—y‘yØ!5ØŸ=™=ñ
Ðð '×9Ñ9ØØØ—‘˜JÓ'×:¨4¯=©=«?Ø—:‘:˜h¨Ó-ð	 :ð 
ˆð	Ø $× 8× 8‘f¸bˆGØ×&×&Ø×5Ò5ØñØ'2ðØ6=ñ‘ð ×5Ò5°eÑG¸wÑ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Ó&ˆð 
Ø�z‰z˜*Ó%×+¨ð 
à×!Ò!Ñ+ FÑ+ð 
Ðô 0×9Ò9Ø�J‰J�{Ó#ØØ—J‘J˜y¨%Ó0Ø#ŸZ™Z¨Ó/Ø—y‘yØ!5ØŸ=™=ñ
Ðð -×?Ñ?ØØØ—‘˜JÓ'×:¨4¯=©=«?Ø—:‘:˜h¨Ó-ð	 @ð 
÷ 
ˆð	Ø $× 8× 8‘f¸bˆGØ×&×&Ø#×<Ò<Øñ Ø'2ð Ø6=ñ ÷ ‘ð  $×<Ò<¸UÑNÀgÑ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)z´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.
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)zÀAsynchronously 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_documents7  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+   7   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€Ø˜s OÐ3Ñ4Ð ô˜y°ò ô Q
Ð(¨¸Ð)HÑIÈ3õ Q
r'   