
    hh                     l    d dl mZ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  G d de	e          ZdS )	    )AnyListOptional)CallbackManagerForRetrieverRun)Document)BaseRetriever)	BaseModelFieldc                      e Zd ZU dZdZee         ed<   	  edd          Z	ee
         ed<    edd          Zee
         ed	<    edd
          Zee         ed<   ddZde
dee         fdZde
dedee         fdZdS )NeedleRetrieveraY  
    NeedleRetriever retrieves relevant documents or context from a Needle collection
    based on a search query.

    Setup:
        Install the `needle-python` library and set your Needle API key.

        .. code-block:: bash

            pip install needle-python
            export NEEDLE_API_KEY="your-api-key"

    Key init args:
        - `needle_api_key` (Optional[str]): The API key for authenticating with Needle.
        - `collection_id` (str): The ID of the Needle collection to search in.
        - `client` (Optional[NeedleClient]): An optional instance of the NeedleClient.
        - `top_k` (Optional[int]): Maximum number of results to return.

    Usage:
        .. code-block:: python

            from langchain_community.retrievers.needle import NeedleRetriever

            retriever = NeedleRetriever(
                needle_api_key="your-api-key",
                collection_id="your-collection-id",
                top_k=10  # optional
            )

            results = retriever.retrieve("example query")
            for doc in results:
                print(doc.page_content)
    NclientzNeedle API Key)descriptionneedle_api_key.z,The ID of the Needle collection to search incollection_idz*Maximum number of search results to return)defaultr   top_kreturnc                     	 ddl m} n# t          $ r t          d          w xY w| j        s || j                  | _        dS dS )z
        Initialize the NeedleClient with the provided API key.

        If a client instance is already provided, this method does nothing.
        r   )NeedleClientz0Please install with `pip install needle-python`.)api_keyN)	needle.v1r   ImportErrorr   r   )selfr   s     b/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain_community/retrievers/needle.py_initialize_clientz"NeedleRetriever._initialize_client6   s    	R....... 	R 	R 	RPQQQ	R { 	D&,t/BCCCDKKK	D 	Ds   	 #queryc                     |                                   | j        t          d          | j        j                            | j        || j                  }d |D             }|S )z
        Search the Needle collection for relevant documents.

        Args:
            query (str): The search query used to find relevant documents.

        Returns:
            List[Document]: A list of documents matching the search query.
        Nz4NeedleClient is not initialized. Provide an API key.)r   textr   c                 8    g | ]}t          |j                   S ))page_content)r   content).0results     r   
<listcomp>z6NeedleRetriever._search_collection.<locals>.<listcomp>U   s%    LLL&fn555LLL    )r   r   
ValueErrorcollectionssearchr   r   )r   r   resultsdocss       r   _search_collectionz"NeedleRetriever._search_collectionD   ss     	!!!;STTT+)00,5
 1 
 
 MLGLLLr%   run_managerc                ,    |                      |          S )z
        Retrieve relevant documents based on the query.

        Args:
            query (str): The query string used to search the collection.
        Returns:
            List[Document]: A list of documents relevant to the query.
        )r+   )r   r   r,   s      r   _get_relevant_documentsz'NeedleRetriever._get_relevant_documentsX   s     &&u---r%   )r   N)__name__
__module____qualname____doc__r   r   r   __annotations__r
   r   strr   r   intr   r   r   r+   r   r.    r%   r   r   r   	   s0           D !FHSM   ,$)E$<L$M$M$MNHSMMMM#(5G$ $ $M8C=    !5"N  E8C=   D D D D X    (..*H.	h. . . . . .r%   r   N)typingr   r   r   langchain_core.callbacksr   langchain_core.documentsr   langchain_core.retrieversr   pydanticr	   r
   r   r6   r%   r   <module>r<      s    & & & & & & & & & & C C C C C C - - - - - - 3 3 3 3 3 3 % % % % % % % %\. \. \. \. \.mY \. \. \. \. \.r%   