
    +#h                         d dl Z d dl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ZdZdedefd	Z G d
 de	j                         Zy)    N)defaultdict)ListOptionalUnion)dotdictz	<%START%>z<%END%>sreturnc                 V    | j                  t        d      j                  t        d      S )N )replaceSTART_SNIPPETEND_SNIPPET)r   s    U/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/retrieve/vectara_rm.pyremove_snippetr      s     99]B'//R@@    c            	            e Zd ZdZ	 	 	 	 ddee   dee   dee   def fdZ	 ddeded	ee   fd
Z	de
eee   f   dee   d	ej                  fdZ xZS )	VectaraRMa  
    A retrieval module that uses Vectara to return the top passages for a given query.

    Assumes that a Vectara corpus has been created and populated with the following payload:
        - document: The text of the passage

    Args:
        vectara_customer_id (str): Vectara Customer ID. defaults to VECTARA_CUSTOMER_ID environment variable
        vectara_corpus_id (str): Vectara Corpus ID. defaults to VECTARA_CORPUS_ID environment variable
        vectara_api_key (str): Vectara API Key. defaults to VECTARA_API_KEY environment variable
        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 Vectara as the default retriver:
        ```python
        from vectara_client import vectaraClient

        llm = dspy.OpenAI(model="gpt-3.5-turbo")
        retriever_model = vectaraRM("<VECTARA_CUSTOMER_ID>", "<VECTARA_CORPUS_ID>", "<VECTARA_API_KEY>")
        dspy.settings.configure(lm=llm, rm=retriever_model)
        ```

        Below is a code snippet that shows how to use Vectara in the forward() function of a module
        ```python
        self.retrieve = vectaraRM("<VECTARA_CUSTOMER_ID>", "<VECTARA_CORPUS_ID>", "<VECTARA_API_KEY>", k=num_passages)
        ```
    vectara_customer_idvectara_corpus_idvectara_api_keykc                 F   | t         j                  j                  dd      }| t         j                  j                  dd      }| t         j                  j                  dd      }|| _        || _        || _        dx| _        | _        d| _        t        | )  |       y )NVECTARA_CUSTOMER_IDr   VECTARA_CORPUS_IDVECTARA_API_KEY   x   )r   )osenvironget_vectara_customer_id_vectara_corpus_id_vectara_api_key_n_sentences_before_n_sentences_after_vectara_timeoutsuper__init__)selfr   r   r   r   	__class__s        r   r(   zVectaraRM.__init__.   s     &"$**..1F"K$ "

/BB G" jjnn->CO$7!"3 /=>> 4#: #1r   querylimitr	   c           
      F   | j                   | j                  ddid}d|d|| j                  | j                  t        t
        d|gdgi}| j                  | j                   dd	d
}t        j                  |dt        j                  |      | j                        }|j                  dk7  r6t        dd|j                   d|j                   d|j                   d       g S |j                         }|d   d   d   }|D 	cg c]  }	t!        |	d         |	d   d }
}	|
S c c}	w )znQuery Vectara index to get for top k matching passages.
        Args:
            query: query string
        lambdag?)
customerIdcorpusIdlexicalInterpolationConfigr+   r   )sentencesBeforesentencesAfterstartTagendTag)r+   start
numResultscontextConfig	corpusKeyzapplication/jsondspy)z	x-api-keyzcustomer-idzContent-TypezX-Sourcezhttps://api.vectara.io/v1/query)headersurldatatimeout   zQuery failed %sz(code z	, reason z
, details )responseSetresponsetextscore)rC   rD   )r!   r"   r$   r%   r   r   r#   requestspostjsondumpsr&   status_codeprintreasonrC   r   )r)   r+   r,   
corpus_keyr=   r;   rB   result	responsesxress              r   _vectara_queryzVectaraRM._vectara_queryC   sb    33//+3U*<

 ""'+/+C+C*.*A*A$1"-	& #-
$ ..44.	
 ==1D!))	
 3&!--.i7H
==/$
 I=)!,Z8	 !	
  'qy17
 
 

s   ?Dquery_or_queriesc                    t        |t              r|gn|}|D cg c]  }|s|	 }}||n| j                  }g }t        |      dkD  rd|z  n|}|D ]&  }| j	                  ||      }|j                  |       ( t        t              }	|D ]  }
|
D ]  }|	|d   xx   |d   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 Vectara 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      )r,   rC   rD   c                     | d   S )NrT    )rO   s    r   <lambda>z#VectaraRM.forward.<locals>.<lambda>   s
    AaD r   T)keyreverse	long_text)
isinstancestrr   lenrQ   appendr   floatsorteditemsr   )r)   rR   r   queriesqall_resr,   r+   _respassagesres_listrP   sorted_passagespassage_s                  r   forwardzVectaraRM.forward   s&    *C0 ! 	
 &+1++ADFF7|a'!Q 	!E&&uE&:DNN4 	! u% 	6H 6V%W5%6	6 !NN.$@@BD CRRJGQg./RR! ,  Ss   C*C*C/)NNN   )rU   )__name__
__module____qualname____doc__r   r]   intr(   r   rQ   r   r:   
Predictionrl   __classcell__)r*   s   @r   r   r      s    < .2+/)-%c] $C= "#	
 0 ?? ? 
c	?BSc49n(= S(3- STXTcTc Sr   r   )rG   r   collectionsr   typingr   r   r   rE   r:   	dsp.utilsr   r   r   r]   r   Retriever   rW   r   r   <module>ry      sQ     	 # ( (   Ac Ac AQS QSr   