o
    Zh]                     @   sx   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	 d	eZdS )
    N)AnyDictIterableListOptionalTuple)Document)
Embeddings)VectorStore)maximal_marginal_relevance   c                   @   s  e Zd ZdZdededdfddZd?dd	Zede	e fd
dZ
	d@dee de	ee  dedee fddZ	d@dee de	ee  dedee fddZ	d@de	ee  dede	e fddZ	d@de	ee  dede	e fd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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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 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"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$d%Zefdddee dede	eeef  dedee f
d&d'Zefdddee dede	eeef  dedee f
d(d)Z efdddedede	eeef  dedee f
d*d+Z!efdddedede	eeef  dedee f
d,d-Z"ed.d/fdddee ded0ed1ede	eeef  dedee fd2d3Z#ed.d/fdddee ded0ed1ede	eeef  dedee fd4d5Z$	6	.	/dAdddeded0ed1ede	eeef  dedee fd7d8Z%ed.d/fdddeded0ed1ede	eeef  dedee fd9d:Z&e'	d@dee dede	ee  dedd f
d;d<Z(e'	d@dee dede	ee  dedd f
d=d>Z)dS )B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              
   K   s   zddl m} W n ty } ztd|d }~ww |dd| _| jdd dkr1|| j| _ntd|d	d
| _|dd| _|dd| _	|| _
|| _d S )Nr   )SurrealzZCannot import from surrealdb.
                please install with `pip install surrealdb`.dburlzws://localhost:8000/rpc   wsz6Only websocket connections are supported at this time.nsZ	langchaindbZdatabase
collectionZ	documents)Z	surrealdbr   ImportErrorpopr   sdb
ValueErrorr   r   r   r   r   )selfr   r   r   e r   a/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/surrealdb.py__init__5   s&   
zSurrealDBStore.__init__c                    sr   | j  I dH  d| jv r+d| jv r+| jd}| jd}| j ||dI dH  | j | j| jI dH  dS )zr
        Initialize connection to surrealdb database
        and authenticate if credentials are provided
        NZdb_userZdb_pass)userpass)r   connectr   getZsigninZuser   r   )r   r!   passwordr   r   r   
initializeO   s   zSurrealDBStore.initializec                 C   s   t | jtr	| jS d S N)
isinstancer   r	   r   r   r   r   
embeddings[   s
   
zSurrealDBStore.embeddingstexts	metadatasc           
         s   | j t|}g }t|D ]4\}}||| d}|dur+|t|k r+|| |d< ng |d< | j| j|I dH }	||	d d  q|S )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   Zembed_documentslist	enumeratelenr   creater   append)
r   r+   r,   r   r*   idsidxr-   datarecordr   r   r   
aadd_textsc   s   
zSurrealDBStore.aadd_textsc              
      sJ   	ddt t dttt  dtdtt f fdd}t|||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
        Nr+   r,   r   r   c                    s*      I d H   j| |fi |I d H S r'   r&   r:   )r+   r,   r   r)   r   r   
_add_texts   s   z,SurrealDBStore.add_texts.<locals>._add_textsr'   )r   strr   r   dictr   asynciorun)r   r+   r,   r   r<   r   r)   r   	add_texts   s   
zSurrealDBStore.add_textsr6   c                    sx   |du r j  jI dH  dS t|tr! j |I dH  dS t|tr:t|dkr: fdd|D I dH }dS dS )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   c                    s    g | ]} j |I d H qS r'   )r   delete).0r0   r)   r   r   
<listcomp>   s    z*SurrealDBStore.adelete.<locals>.<listcomp>F)r   rB   r   r(   r=   r1   r3   )r   r6   r   _r   r)   r   adelete   s   
zSurrealDBStore.adeletec                    s<   dt tt  dtdt t f fdd}t||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.
        r6   r   r   c                    s*      I d H   jdd| i|I d H S )Nr6   r   )r&   rF   )r6   r   r)   r   r   _delete   s   z&SurrealDBStore.delete.<locals>._delete)r   r   r=   r   boolr?   r@   )r   r6   r   rG   r   r)   r   rB      s   &zSurrealDBStore.delete)filterr.   krI   c                   s   | j |||ddd}d}|r9|D ]%}t|| ttfv r(d||  d}n||  }|d| d| d7 }qd	|d
  d| d}	| j|	|I dH }
t|
dkrVg S |
d }|d dkrpddlm	} |dd}||dd |d D S )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.   rJ   rK    '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 Errorc                 S   s@   g | ]}t |d  d|d i|dpi d|d |d fqS )r-   r0   r/   )Zpage_contentr/   
similarityr.   )r   r$   )rC   docr   r   r   rD     s    	zKSurrealDBStore._asimilarity_search_by_vector_with_score.<locals>.<listcomp>)
r   r$   typer=   rH   r   queryr3   Zsurrealdb.wsrQ   )r   r.   rJ   rI   r   argsZcustom_filterkeyZfilter_valuerV   resultsrR   rQ   errr   r   r   (_asimilarity_search_by_vector_with_score   s:   

		z7SurrealDBStore._asimilarity_search_by_vector_with_scorerV   c                   6   | j |}dd | j||fd|i|I dH D S )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
        c                 S      g | ]	\}}}||fqS r   r   rC   documentrS   rE   r   r   r   rD   *      zKSurrealDBStore.asimilarity_search_with_relevance_scores.<locals>.<listcomp>rI   Nr   embed_queryr[   r   rV   rJ   rI   r   Zquery_embeddingr   r   r   (asimilarity_search_with_relevance_scores     
z7SurrealDBStore.asimilarity_search_with_relevance_scoresc                   2   dt tttf  f fdd}t| 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                      .     I d H  jfd iI d H S NrI   )r&   rd   r   rI   rJ   r   rV   r   r   r   (_similarity_search_with_relevance_scoresF  s   zhSurrealDBStore.similarity_search_with_relevance_scores.<locals>._similarity_search_with_relevance_scoresr   r   r   floatr?   r@   )r   rV   rJ   rI   r   rj   r   ri   r   'similarity_search_with_relevance_scores3  s   
z6SurrealDBStore.similarity_search_with_relevance_scoresc                   r\   )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
        c                 S   r]   r   r   r^   r   r   r   rD   c  r`   z@SurrealDBStore.asimilarity_search_with_score.<locals>.<listcomp>rI   Nra   rc   r   r   r   asimilarity_search_with_scoreP  re   z,SurrealDBStore.asimilarity_search_with_scorec                   rf   )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                      rg   rh   )r&   rn   r   ri   r   r   _similarity_search_with_score     zRSurrealDBStore.similarity_search_with_score.<locals>._similarity_search_with_scorerk   )r   rV   rJ   rI   r   ro   r   ri   r   similarity_search_with_scorel  s   &z+SurrealDBStore.similarity_search_with_scorec                   s*   dd | j ||fd|i|I dH D S )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
        c                 S   s   g | ]\}}}|qS r   r   )rC   r_   rE   r   r   r   rD     s    z?SurrealDBStore.asimilarity_search_by_vector.<locals>.<listcomp>rI   N)r[   )r   r.   rJ   rI   r   r   r   r   asimilarity_search_by_vector  s   
z+SurrealDBStore.asimilarity_search_by_vectorc                   *   dt t f fdd}t| 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                      s.     I d H  j fdiI d H S rh   )r&   rr   r   r.   rI   rJ   r   r   r   r   _similarity_search_by_vector  rp   zPSurrealDBStore.similarity_search_by_vector.<locals>._similarity_search_by_vectorr   r   r?   r@   )r   r.   rJ   rI   r   ru   r   rt   r   similarity_search_by_vector  s   z*SurrealDBStore.similarity_search_by_vectorc                   s,   | j |}| j||fd|i|I dH S )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
        rI   N)r   rb   rr   rc   r   r   r   asimilarity_search  s   z!SurrealDBStore.asimilarity_searchc                   rs   )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                      rg   rh   )r&   rx   r   ri   r   r   _similarity_search  s   z<SurrealDBStore.similarity_search.<locals>._similarity_searchrv   )r   rV   rJ   rI   r   ry   r   ri   r   similarity_search  s   z SurrealDBStore.similarity_search         ?fetch_klambda_multc          
         sj   | j ||fd|i|I dH }dd |D  dd |D }ttj|tjd|||d}	 fdd|	D S )	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.
        rI   Nc                 S      g | ]}|d  qS )r   r   rC   subr   r   r   rD         zKSurrealDBStore.amax_marginal_relevance_search_by_vector.<locals>.<listcomp>c                 S   r   )r   r   r   r   r   rD     r   )Zdtype)rJ   r~   c                    s   g | ]} | qS r   r   )rC   idocsr   r   rD     r   )r[   r   nparrayZfloat32)
r   r.   rJ   r}   r~   rI   r   rR   r*   Zmmr_selectedr   r   r   (amax_marginal_relevance_search_by_vector  s"   z7SurrealDBStore.amax_marginal_relevance_search_by_vectorc                   .   dt t f fdd}t| 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                      s2     I d H  j fdiI d H S rh   )r&   r   r   r.   r}   rI   rJ   r   r~   r   r   r   (_max_marginal_relevance_search_by_vector6     zhSurrealDBStore.max_marginal_relevance_search_by_vector.<locals>._max_marginal_relevance_search_by_vectorrv   )r   r.   rJ   r}   r~   rI   r   r   r   r   r   'max_marginal_relevance_search_by_vector  s   "z6SurrealDBStore.max_marginal_relevance_search_by_vectorr   c          	         s4   | j |}| j||||fd|i|I dH }|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.
        rI   N)r   rb   r   )	r   rV   rJ   r}   r~   rI   r   r.   r   r   r   r   amax_marginal_relevance_search>  s   z-SurrealDBStore.amax_marginal_relevance_searchc                   r   )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                      s2     I d H  j fdiI d H S rh   )r&   r   r   r}   rI   rJ   r   r~   rV   r   r   r   _max_marginal_relevance_search}  r   zTSurrealDBStore.max_marginal_relevance_search.<locals>._max_marginal_relevance_searchrv   )r   rV   rJ   r}   r~   rI   r   r   r   r   r   max_marginal_relevance_searcha  s   "z,SurrealDBStore.max_marginal_relevance_searchc                    s>   | |fi |}|  I dH  |j||fi |I dH  |S )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.Nr;   clsr+   r.   r,   r   r   r   r   r   afrom_texts  s
   zSurrealDBStore.afrom_textsc                 K   s    t | 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.)r?   r@   r   r   r   r   r   
from_texts  s   zSurrealDBStore.from_texts)r   Nr'   )r   r{   r|   )*__name__
__module____qualname____doc__r	   r   r    r&   propertyr   r*   r   r=   r   r>   r:   rA   rH   rF   rB   	DEFAULT_Krl   intr   r   r   r[   rd   rm   rn   rq   rr   rw   rx   rz   r   r   r   r   classmethodr   r   r   r   r   r   r      s0   &




 






N

 





	
1	
(	
&	
$

r   )r?   typingr   r   r   r   r   r   numpyr   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr	   Zlangchain_core.vectorstoresr
   Z&langchain_community.vectorstores.utilsr   r   r   r   r   r   r   <module>   s     