
    h]                     ~    d dl Z d dlmZmZmZmZmZmZ d dlZ	d dl
mZ d dlmZ d dlmZ d dlmZ dZ G d d	e      Zy)
    N)AnyDictIterableListOptionalTuple)Document)
Embeddings)VectorStore)maximal_marginal_relevance   c                   
   e Zd ZdZdededdfdZd(dZede	e   fd       Z
	 d)d	ee   d
e	ee      dedee   fdZ	 d)d	ee   d
e	ee      dedee   fdZ	 d)de	ee      dede	e   fdZ	 d)de	ee      dede	e   fdZefdddee   dede	eeef      dedeeeeef      f
dZefdddedede	eeef      dedeeeef      f
dZefdddedede	eeef      dedeeeef      f
dZefdddedede	eeef      dedeeeef      f
dZefdddedede	eeef      dedeeeef      f
dZefdddee   dede	eeef      dedee   f
dZefdddee   dede	eeef      dedee   f
dZ efdddedede	eeef      dedee   f
dZ!efdddedede	eeef      dedee   f
dZ"eddfdddee   ded ed!ede	eeef      dedee   fd"Z#eddfdddee   ded ed!ede	eeef      dedee   fd#Z$	 	 	 d*dddeded ed!ede	eeef      dedee   fd$Z%eddfdddeded ed!ede	eeef      dedee   fd%Z&e'	 d)d	ee   ded
e	ee      dedd f
d&       Z(e'	 d)d	ee   ded
e	ee      dedd f
d'       Z)y)+SurrealDBStorea/  
    SurrealDB as Vector Store.

    To use, you should have the ``surrealdb`` python package installed.

    Args:
        embedding_function: Embedding function to use.
        dburl: SurrealDB connection url
        ns: surrealdb namespace for the vector store. (default: "langchain")
        db: surrealdb database for the vector store. (default: "database")
        collection: surrealdb collection for the vector store.
            (default: "documents")

        (optional) db_user and db_pass: surrealdb credentials

    Example:
        .. code-block:: python

            from langchain_community.vectorstores.surrealdb import SurrealDBStore
            from langchain_community.embeddings import HuggingFaceEmbeddings

            model_name = "sentence-transformers/all-mpnet-base-v2"
            embedding_function = HuggingFaceEmbeddings(model_name=model_name)
            dburl = "ws://localhost:8000/rpc"
            ns = "langchain"
            db = "docstore"
            collection = "documents"
            db_user = "root"
            db_pass = "root"

            sdb = SurrealDBStore.from_texts(
                    texts=texts,
                    embedding=embedding_function,
                    dburl,
                    ns, db, collection,
                    db_user=db_user, db_pass=db_pass)
    embedding_functionkwargsreturnNc                    	 ddl m} |j                  dd      | _        | j                  dd dk(  r || j                        | _        nt        d      |j                  d	d
      | _        |j                  dd      | _        |j                  dd      | _	        || _
        || _        y # t        $ r}t        d      |d }~ww xY w)Nr   )SurrealzZCannot import from surrealdb.
                please install with `pip install surrealdb`.dburlzws://localhost:8000/rpc   wsz6Only websocket connections are supported at this time.ns	langchaindbdatabase
collection	documents)	surrealdbr   ImportErrorpopr   sdb
ValueErrorr   r   r   r   r   )selfr   r   r   es        h/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/surrealdb.py__init__zSurrealDBStore.__init__5   s    
	) ZZ)BC
::a?d"tzz*DHUVV**T;/**T:. **\;?"4#  	@ 	s   B( (	C1B==Cc                   K   | j                   j                          d{    d| j                  v rjd| j                  v r\| j                  j                  d      }| j                  j                  d      }| j                   j	                  ||d       d{    | j                   j                  | j                  | j                         d{    y7 7 ?7 	w)zr
        Initialize connection to surrealdb database
        and authenticate if credentials are provided
        Ndb_userdb_pass)userpass)r!   connectr   getsigninuser   r   )r#   r*   passwords      r%   
initializezSurrealDBStore.initializeO   s     
 hh   #	T[[(@;;??9-D{{y1H((//4"BCCChhll477DGG,,, 	! D,s4   CCA7CC7CCCCCc                 R    t        | j                  t              r| j                  S d S N)
isinstancer   r
   )r#   s    r%   
embeddingszSurrealDBStore.embeddings[   s.     $11:> ##	
 	
    texts	metadatasc                 Z  K   | j                   j                  t        |            }g }t        |      D ]p  \  }}|||   d}||t	        |      k  r	||   |d<   ng |d<   | j
                  j                  | j                  |       d{   }	|j                  |	d   d          r |S 7 w)zAdd list of text along with embeddings to the vector store asynchronously

        Args:
            texts (Iterable[str]): collection of text to add to the database

        Returns:
            List of ids for the newly inserted documents
        )text	embeddingNmetadatar   id)	r   embed_documentslist	enumeratelenr!   creater   append)
r#   r7   r8   r   r5   idsidxr:   datarecords
             r%   
aadd_textszSurrealDBStore.aadd_textsc   s      ,,<<T%[I
"5) 
	(IC z#?D$s9~)=#,S>Z #%Z 88?? F JJvay'
	( 
s   BB+	B)
 B+c           
           	 ddt         t           dt        t        t              dt
        dt        t           f fd}t        j                   |||fi |      S )zAdd list of text along with embeddings to the vector store

        Args:
            texts (Iterable[str]): collection of text to add to the database

        Returns:
            List of ids for the newly inserted documents
        r7   r8   r   r   c                 |   K   j                          d {     j                  | |fi | d {   S 7  7 wr3   r1   rH   )r7   r8   r   r#   s      r%   
_add_textsz,SurrealDBStore.add_texts.<locals>._add_texts   s=     
 //###(	DVDDD $D   <8<:<<r3   )r   strr   r   dictr   asynciorun)r#   r7   r8   r   rL   s   `    r%   	add_textszSurrealDBStore.add_texts   sd    " /3	EC=	ET
+	E 	E #Y		E {{:eYA&ABBr6   rD   c                   K   |.| j                   j                  | j                         d{    yt        |t              r$| j                   j                  |       d{    yt        |t
              r?t        |      dkD  r1|D cg c]%  }| j                   j                  |       d{   ' }}yy7 7 W7 c c}w w)a  Delete by document ID asynchronously.

        Args:
            ids: List of ids to delete.
            **kwargs: Other keyword arguments that subclasses might use.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise.
        NTr   F)r!   deleter   r4   rN   r?   rA   )r#   rD   r   r=   _s        r%   adeletezSurrealDBStore.adelete   s       ;((//$//222#s#hhooc***c4(SX\=@Artxxr222AAA 3 + 3AsE   +CB73C!B9"'C	#B=,B;
-B=3C9C;B==Cc                      dt         t        t              dt        dt         t           f fd}t        j                   ||fi |      S )a
  Delete by document ID.

        Args:
            ids: List of ids to delete.
            **kwargs: Other keyword arguments that subclasses might use.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise.
        rD   r   r   c                 |   K   j                          d {     j                  dd| i| d {   S 7  7 w)NrD    )r1   rV   )rD   r   r#   s     r%   _deletez&SurrealDBStore.delete.<locals>._delete   s<     //###%8#8888 $8rM   )r   r   rN   r   boolrP   rQ   )r#   rD   r   rZ   s   `   r%   rT   zSurrealDBStore.delete   sE     	9xS	2 	9c 	9htn 	9 {{731&122r6   )filterr;   kr\   c          
      >  K   | j                   |||j                  dd      d}d}|r=|D ]8  }t        ||         t        t        fv r
d||    d}n||    }|d| d| dz  }: d	|d
    d| d}	| j
                  j                  |	|       d{   }
t        |
      dk(  rg S |
d   }|d   dk7  r ddlm	} |j                  dd      } ||      |d   D cg c]5  }t        |d   d|d   i|j                  d      xs i       |d   |d   f7 c}S 7 c c}w w)a  Run similarity search for query embedding asynchronously
        and return documents and scores

        Args:
            embedding (List[float]): Query embedding.
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with scores
        score_thresholdr   )r   r;   r]   r_    'zand metadata.z =  u   
        select
            id,
            text,
            metadata,
            embedding,
            vector::similarity::cosine(embedding, $embedding) as similarity
        from ⟨r   ub   ⟩
        where vector::similarity::cosine(embedding, $embedding) >= $score_threshold
          z4
        order by similarity desc LIMIT $k;
        NstatusOK)SurrealExceptionresultzUnknown Errorr:   r=   r<   )page_contentr<   
similarityr;   )r   r-   typerN   r[   r!   queryrA   surrealdb.wsre   r	   )r#   r;   r]   r\   r   argscustom_filterkeyfilter_valuerj   resultsrf   re   errdocs                  r%   (_asimilarity_search_by_vector_with_scorez7SurrealDBStore._asimilarity_search_by_vector_with_score   s    ( //"%zz*;Q?	
  Is$d3%&vc{m1#5L&,Sk]L=Sa!HHI l#$ %/ 	 ud33w<1I(t#5**X7C"3'' h'

  !$V"CIM#''*2E2KM L!K 

 
	
 4

s%   BDDAD:DDDrj   c                   K   | j                   j                  |      } | j                  ||fd|i| d{   D cg c]
  \  }}}||f c}}}S 7 c c}}}w w)af  Run similarity search asynchronously and return relevance scores

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with relevance scores
        r\   Nr   embed_queryrs   	r#   rj   r]   r\   r   query_embeddingdocumentrh   rU   s	            r%   (asimilarity_search_with_relevance_scoresz7SurrealDBStore.asimilarity_search_with_relevance_scores  }     $ 11==eD DdCC#Q/59? 
 
'*a z"
 	

!   5AAA AAAc                     dt         t        t        t        f      f fd}t	        j
                   |             S )ae  Run similarity search synchronously and return relevance scores

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with relevance scores
        r   c                     K   j                          d {     j                  fd i d {   S 7 "7 wNr\   )r1   rz   r\   r]   r   rj   r#   s   r%   (_similarity_search_with_relevance_scoreszhSurrealDBStore.similarity_search_with_relevance_scores.<locals>._similarity_search_with_relevance_scoresF  sS      //###FFFq!'+1   $   >:><>>r   r   r	   floatrP   rQ   )r#   rj   r]   r\   r   r   s   ````` r%   'similarity_search_with_relevance_scoresz6SurrealDBStore.similarity_search_with_relevance_scores3  s;    &	(E/"A
 	 	 {{CEFFr6   c                   K   | j                   j                  |      } | j                  ||fd|i| d{   D cg c]
  \  }}}||f c}}}S 7 c c}}}w w)an  Run similarity search asynchronously and return distance scores

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with relevance distance scores
        r\   Nru   rw   s	            r%   asimilarity_search_with_scorez,SurrealDBStore.asimilarity_search_with_scoreP  r{   r|   c                     dt         t        t        t        f      f fd}t	        j
                   |             S )am  Run similarity search synchronously and return distance scores

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with relevance distance scores
        r   c                     K   j                          d {     j                  fd i d {   S 7 "7 wr   )r1   r   r   s   r%   _similarity_search_with_scorezRSurrealDBStore.similarity_search_with_score.<locals>._similarity_search_with_score  sQ     //###;;;q!'+1   $r   r   )r#   rj   r]   r\   r   r   s   ````` r%   similarity_search_with_scorez+SurrealDBStore.similarity_search_with_scorel  s7    &	T%%:P5Q 	 	 {{8:;;r6   c                ~   K    | j                   ||fd|i| d{   D cg c]  \  }}}|
 c}}S 7 c c}}w w)ad  Run similarity search on query embedding asynchronously

        Args:
            embedding (List[float]): Query embedding
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query
        r\   N)rs   )r#   r;   r]   r\   r   ry   rU   s          r%   asimilarity_search_by_vectorz+SurrealDBStore.asimilarity_search_by_vector  s[     ( )V(U(U1)%+)/5) #
!Q 
 	
#
s   =5=7==c                n     dt         t           f fd}t        j                   |             S )aU  Run similarity search on query embedding

        Args:
            embedding (List[float]): Query embedding
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query
        r   c                     K   j                          d {     j                   fdi d {   S 7 "7 wr   )r1   r   )r;   r\   r]   r   r#   s   r%   _similarity_search_by_vectorzPSurrealDBStore.similarity_search_by_vector.<locals>._similarity_search_by_vector  sQ     //###:::1%+/5   $r   r   r	   rP   rQ   )r#   r;   r]   r\   r   r   s   ````` r%   similarity_search_by_vectorz*SurrealDBStore.similarity_search_by_vector  s-    &	DN 	 	 {{79::r6   c                   K   | j                   j                  |      } | j                  ||fd|i| d{   S 7 w)aD  Run similarity search on query asynchronously

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query
        r\   N)r   rv   r   )r#   rj   r]   r\   r   rx   s         r%   asimilarity_searchz!SurrealDBStore.asimilarity_search  sR     $ 11==eD6T66Q
'-
17
 
 	
 
s   5><>c                n     dt         t           f fd}t        j                   |             S )a5  Run similarity search on query

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query
        r   c                     K   j                          d {     j                  fd i d {   S 7 "7 wr   )r1   r   r   s   r%   _similarity_searchz<SurrealDBStore.similarity_search.<locals>._similarity_search  sB     //###000S&SFSSS $Sr   r   )r#   rj   r]   r\   r   r   s   ````` r%   similarity_searchz SurrealDBStore.similarity_search  s0    &	T$x. 	T 	T {{-/00r6            ?fetch_klambda_multc                :  K    | j                   ||fd|i| d{   }|D cg c]  }|d   	 }	}|D cg c]  }|d   	 }
}t        t        j                  |t        j                        |
||      }|D cg c]  }|	|   	 c}S 7 mc c}w c c}w c c}w w)aH  Return docs selected using the maximal marginal relevance.
        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r\   Nr   )dtype)r]   r   )rs   r   nparrayfloat32)r#   r;   r]   r   r   r\   r   rf   subdocsr5   mmr_selectedis                r%   (amax_marginal_relevance_search_by_vectorz7SurrealDBStore.amax_marginal_relevance_search_by_vector  s     8 EtDDw
'-
17
 

 #))3A)))/0#c"g0
01HHYbjj1#	
 "..AQ..!

 *0 /s6   BB
BBBB8B;BBBc                v     dt         t           f fd}t        j                   |             S )aI  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r   c                     K   j                          d {     j                   fdi d {   S 7 $7 wr   )r1   r   )r;   r   r\   r]   r   r   r#   s   r%   (_max_marginal_relevance_search_by_vectorzhSurrealDBStore.max_marginal_relevance_search_by_vector.<locals>._max_marginal_relevance_search_by_vector6  sU     //###FFF1g{;AEK   $   A <A >A A r   )r#   r;   r]   r   r   r\   r   r   s   ``````` r%   'max_marginal_relevance_search_by_vectorz6SurrealDBStore.max_marginal_relevance_search_by_vector  s-    :	X 	 	 {{CEFFr6   c                   K   | j                   j                  |      } | j                  ||||fd|i| d{   }|S 7 w)a@  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r\   N)r   rv   r   )	r#   rj   r]   r   r   r\   r   r;   r   s	            r%   amax_marginal_relevance_searchz-SurrealDBStore.amax_marginal_relevance_search>  sZ     : ++77>	BTBBq';
7=
AG
 
 
s   7AA Ac                v     dt         t           f fd}t        j                   |             S )a?  Return docs selected using the maximal marginal relevance.
        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r   c                     K   j                          d {     j                   fdi d {   S 7 $7 wr   )r1   r   )r   r\   r]   r   r   rj   r#   s   r%   _max_marginal_relevance_searchzTSurrealDBStore.max_marginal_relevance_search.<locals>._max_marginal_relevance_search}  sU     //###<<<q';7=AG   $r   r   )r#   rj   r]   r   r   r\   r   r   s   ``````` r%   max_marginal_relevance_searchz,SurrealDBStore.max_marginal_relevance_searcha  s-    8	d8n 	 	 {{9;<<r6   c                    K    | |fi |}|j                          d{     |j                  ||fi | d{    |S 7 "7 w)a  Create SurrealDBStore from list of text asynchronously

        Args:
            texts (List[str]): list of text to vectorize and store
            embedding (Optional[Embeddings]): Embedding function.
            dburl (str): SurrealDB connection url
                (default: "ws://localhost:8000/rpc")
            ns (str): surrealdb namespace for the vector store.
                (default: "langchain")
            db (str): surrealdb database for the vector store.
                (default: "database")
            collection (str): surrealdb collection for the vector store.
                (default: "documents")

            (optional) db_user and db_pass: surrealdb credentials

        Returns:
            SurrealDBStore object initialized and ready for use.NrK   clsr7   r;   r8   r   r!   s         r%   afrom_textszSurrealDBStore.afrom_texts  sP     6 )&v&nncnnUI8888
 	8s   AAAAAAc                 V    t        j                   | j                  |||fi |      }|S )a  Create SurrealDBStore from list of text

        Args:
            texts (List[str]): list of text to vectorize and store
            embedding (Optional[Embeddings]): Embedding function.
            dburl (str): SurrealDB connection url
            ns (str): surrealdb namespace for the vector store.
                (default: "langchain")
            db (str): surrealdb database for the vector store.
                (default: "database")
            collection (str): surrealdb collection for the vector store.
                (default: "documents")

            (optional) db_user and db_pass: surrealdb credentials

        Returns:
            SurrealDBStore object initialized and ready for use.)rP   rQ   r   r   s         r%   
from_textszSurrealDBStore.from_texts  s+    2 kk/#//%IPPQ
r6   )r   Nr3   )r   r   r   )*__name__
__module____qualname____doc__r
   r   r&   r1   propertyr   r5   r   rN   r   rO   rH   rR   r[   rV   rT   	DEFAULT_Kr   intr   r   r	   rs   rz   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   rY   r6   r%   r   r      s   $L&  
	4
- 
HZ0 
 
 +/} DJ' 	
 
c@ +/C}C DJ'C 	C
 
cC6 $(d3i   
$	> $(3d3i 3 3 
$	32 I

 ,0I
;I
 I

 c3h(I
 I
 
eHeS()	*I
\ 

 ,0

 

 c3h(
 
 
eHeO$	%
> G
 ,0GG G
 c3h(G G 
eHeO$	%G@ 

 ,0

 

 c3h(
 
 
eHeO$	%
> <
 ,0<< <
 c3h(< < 
eHeO$	%<< 

 ,0
;
 

 c3h(
 
 
h
8 ;
 ,0;;; ;
 c3h(; ; 
h;< 

 ,0

 

 c3h(
 
 
h
4 1
 ,011 1
 c3h(1 1 
h18  ,/ ,0,/;,/ ,/ 	,/
 ,/ c3h(,/ ,/ 
h,/b  #G ,0#G;#G #G 	#G
 #G c3h(#G #G 
h#GP  ! ,0!! ! 	!
 ! c3h(! ! 
h!L  "= ,0"="= "= 	"=
 "= c3h("= "= 
h"=H 
 +/	Cy  DJ'	
  
 > 
 +/	Cy  DJ'	
  
 r6   r   )rP   typingr   r   r   r   r   r   numpyr   langchain_core.documentsr	   langchain_core.embeddingsr
   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   r   r   rY   r6   r%   <module>r      s0     = =  - 0 3 M	q
[ q
r6   