
    +#h9                     h   d Z ddlmZ ddlmZmZmZ ddlZddlZddl	m
Z
 	 ddlZej                  j                  ej                  j                  ej                  j                  fZ G d dej$                        Zy# e$ r/ ej                  j                  ej                  j                  fZY Iw xY w)z
Retriever model for deeplake
    )defaultdict)ListOptionalUnionN)dotdictc                   v     e Zd ZdZ	 d	dedef fdZd
dZdeee	e   f   de
e   dej                  fdZ xZS )
DeeplakeRMa  
    A retriever module that uses deeplake to return the top passages for a given query.

    Assumes that a Deep Lake Vector Store has been created and populated with the following payload:
        - text: The text of the passage

    Args:
        deeplake_vectorstore_name (str): The name or path of the Deep Lake Vector Store.
        deeplake_client (VectorStore): An instance of the Deep Lake client.
        k (int, optional): The default number of top passages to retrieve. Defaults to 3.

    Examples:
        Below is a code snippet that shows how to use Deep Lake as the default retriver:
        ```python
        from deeplake import VectorStore
        llm = dspy.OpenAI(model="gpt-3.5-turbo")
        deeplake_client = VectorStore
        retriever_model = DeeplakeRM("my_vectorstore_path", deeplake_client=deeplake_client)
        dspy.settings.configure(lm=llm, rm=retriever_model)
        ```

        Below is a code snippet that shows how to use Deep Lake in the forward() function of a module
        ```python
        self.retrieve = DeeplakeRM("my_vectorstore_path", deeplake_client=deeplake_client, k=num_passages)
        ```
    deeplake_vectorstore_namekc                     	 ddl m} || _        || _        t
        |   |       y # t        $ r t        d      w xY w)Nr   )VectorStorezcThe 'deeplake' extra is required to use DeepLakeRM. Install it with `pip install dspy-ai[deeplake]`)r   )deeplaker   ImportError_deeplake_vectorstore_name_deeplake_clientsuper__init__)selfr
   deeplake_clientr   r   	__class__s        V/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/retrieve/deeplake_rm.pyr   zDeeplakeRM.__init__6   sO    	
*
 +D' /1  	s 	s   ( =c                     t        |t              r|g}|D cg c]  }|j                  dd       }}t        j                  j                  ||      d   D cg c]  }|d   	 c}S c c}w c c}w )N
 )inputmodeldata	embedding)
isinstancestrreplaceopenai	Embeddingcreate)r   textsr   tr   s        r   embedding_functionzDeeplakeRM.embedding_functionG   sx    eS!GE/45!4%55 ((//e5/I&Q
 
 	
 6
s   A(A-query_or_queriesreturnc                 (   t        |t              r|gn|}|D cg c]  }|s|	 }}||n| j                  }t        t              }|D ]}  } | j                  | j                  | j                        j                  |fd|i|}t        |j                  dd      |j                  dd            D ]  \  }	}
||
xx   |	z  cc<     t        |j                         d d	
      d| }|D cg c]  \  }}t        d|i       c}}S c c}w c c}}w )a_  Search with DeepLake for self.k top passages for query

        Args:
            query_or_queries (Union[str, List[str]]): The query or queries to search for.
            k (Optional[int]): The number of top passages to retrieve. Defaults to self.k.

        Returns:
            dspy.Prediction: An object containing the retrieved passages.
        N)pathr'   r   scoreg        text c                     | d   S )N    )xs    r   <lambda>z$DeeplakeRM.forward.<locals>.<lambda>s   s
    AaD     T)keyreverse	long_text)r   r    r   r   floatr   r   r'   searchzipgetsorteditemsr   )r   r(   r   kwargsqueriesqpassagesqueryresultsr,   r-   sorted_passagesp_s                 r   forwardzDeeplakeRM.forwardQ   s>    *C0 ! 	
 &+1++ADFFu% 	(Ed++00#66 ,  fU*  * #)*G
 "'++gc":7;;vb;QR (
d%'(	( !NN.$@@BD 7FFdaa()FF% ,$ Gs   D	D	.D)   )ztext-embedding-ada-002)__name__
__module____qualname____doc__r    intr   r'   r   r   r   dspy
PredictionrG   __classcell__)r   s   @r   r	   r	      s_    > 	#& 	"
$G %c49n 5$G:B3-$G	$Gr4   r	   )rL   collectionsr   typingr   r   r   r"   rN   	dsp.utilsr   openai.errorerrorRateLimitErrorServiceUnavailableErrorAPIErrorERRORS	ExceptionRetriever	   r1   r4   r   <module>r\      s    $ ( (   	B 	##,,F\G \G	  Bll))6<<+@+@AFBs   AA= =1B10B1