a
    bg]                     @   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eeddddZddddZee	e dd	d
Z
d<ee e	ee  eee dddZd=ee e	ee  eee dddZd>e	ee  ee	e dddZd?e	ee  ee	e dddZefddee ee	eeef  eeeeeef  dddZefddeee	eeef  eeeeef  dddZefddeee	eeef  eeeeef  dddZefddeee	eeef  eeeeef  dddZefddeee	eeef  eeeeef  dd d!Zefddee ee	eeef  eee dd"d#Zefddee ee	eeef  eee dd$d%Z efddeee	eeef  eee dd&d'Z!efddeee	eeef  eee dd(d)Z"ed*d+fddee eeee	eeef  eee d,d-d.Z#ed*d+fddee eeee	eeef  eee d,d/d0Z$d@ddeeeee	eeef  eee d2d3d4Z%ed*d+fddeeeee	eeef  eee d2d5d6Z&e'dAee ee	ee  ed d7d8d9Z(e'dBee ee	ee  ed d7d:d;Z)dS )C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)
    N)embedding_functionkwargsreturnc              
   K   s   zddl m} W n. ty> } ztd|W Y d }~n
d }~0 0 |dd| _| jdd dkrn|| 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   x/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/surrealdb.py__init__5   s"    zSurrealDBStore.__init__r   c                    sp   | j  I dH  d| jv rTd| jv rT| 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	metadatasr   r   c           
         s   | j t|}g }t|D ]h\}}||| d}|durT|t|k rT|| |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                    sB   dt t ttt  ttt d 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,   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_texts)N)r   strr   r   dictr   asynciorun)r   r-   r.   r   r>   r   r*   r   	add_texts   s     
zSurrealDBStore.add_textsr8   r   r   c                    sv   |du r  j  jI dH  dS t|tr@ j |I dH  dS t|trrt|dkrr 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).0r2   r*   r   r   
<listcomp>       z*SurrealDBStore.adelete.<locals>.<listcomp>F)r   rE   r   r)   r?   r3   r5   )r   r8   r   _r   r*   r   adelete   s    
zSurrealDBStore.adeletec                    s8   t tt  tt t d 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.
        rD   c                    s(      I d H   jf d| i|I d H S )Nr8   )r'   rJ   )r8   r   r*   r   r   _delete   s    z&SurrealDBStore.delete.<locals>._delete)r   r   r?   r   boolrA   rB   )r   r8   r   rK   r   r*   r   rE      s    "zSurrealDBStore.delete)filter)r0   krM   r   r   c                   s   | j |||ddd}d}|rp|D ]J}t|| ttfv rNd||  d}n
||  }|d| d| d7 }q$d	|d
  d| d}	| j|	|I dH }
t|
dkrg S |
d }|d dkrd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   r0   rN   rO    '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 | ]8}t |d  d|d i|dp&i d|d |d fqS )r/   r2   r1   )Zpage_contentr1   
similarityr0   )r   r%   )rF   docr   r   r   rG     s   	zKSurrealDBStore._asimilarity_search_by_vector_with_score.<locals>.<listcomp>)
r   r%   typer?   rL   r   queryr5   Zsurrealdb.wsrU   )r   r0   rN   rM   r   argsZcustom_filterkeyZfilter_valuerZ   resultsrV   rU   errr   r   r   (_asimilarity_search_by_vector_with_score   s8    

		z7SurrealDBStore._asimilarity_search_by_vector_with_score)rZ   rN   rM   r   r   c                   s4   | 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   s   g | ]\}}}||fqS r   r   rF   documentrW   rI   r   r   r   rG   *  s   zKSurrealDBStore.asimilarity_search_with_relevance_scores.<locals>.<listcomp>rM   Nr   embed_queryr_   r   rZ   rN   rM   r   Zquery_embeddingr   r   r   (asimilarity_search_with_relevance_scores  s    
z7SurrealDBStore.asimilarity_search_with_relevance_scoresc                   s2   t tttf  d 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                      s,     I d H  jfd iI d H S NrM   )r'   re   r   rM   rN   r   rZ   r   r   r   (_similarity_search_with_relevance_scoresF  s    zhSurrealDBStore.similarity_search_with_relevance_scores.<locals>._similarity_search_with_relevance_scoresr   r   r   floatrA   rB   )r   rZ   rN   rM   r   rh   r   rg   r   'similarity_search_with_relevance_scores3  s    z6SurrealDBStore.similarity_search_with_relevance_scoresc                   s4   | j |}dd | j||fd|i|I dH D S )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   s   g | ]\}}}||fqS r   r   r`   r   r   r   rG   c  s   z@SurrealDBStore.asimilarity_search_with_score.<locals>.<listcomp>rM   Nrb   rd   r   r   r   asimilarity_search_with_scoreP  s    
z,SurrealDBStore.asimilarity_search_with_scorec                   s2   t tttf  d fdd}t| 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                      s,     I d H  jfd iI d H S rf   )r'   rl   r   rg   r   r   _similarity_search_with_score  s    zRSurrealDBStore.similarity_search_with_score.<locals>._similarity_search_with_scoreri   )r   rZ   rN   rM   r   rm   r   rg   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   )rF   ra   rI   r   r   r   rG     s   z?SurrealDBStore.asimilarity_search_by_vector.<locals>.<listcomp>rM   N)r_   )r   r0   rN   rM   r   r   r   r   asimilarity_search_by_vector  s    
z+SurrealDBStore.asimilarity_search_by_vectorc                   s*   t t d 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 rf   )r'   ro   r   r0   rM   rN   r   r   r   r   _similarity_search_by_vector  s    zPSurrealDBStore.similarity_search_by_vector.<locals>._similarity_search_by_vectorr   r   rA   rB   )r   r0   rN   rM   r   rq   r   rp   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
        rM   N)r   rc   ro   rd   r   r   r   asimilarity_search  s    z!SurrealDBStore.asimilarity_searchc                   s*   t t d fdd}t| 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                      s,     I d H  jfd iI d H S rf   )r'   rt   r   rg   r   r   _similarity_search  s    z<SurrealDBStore.similarity_search.<locals>._similarity_searchrr   )r   rZ   rN   rM   r   ru   r   rg   r   similarity_search  s    z SurrealDBStore.similarity_search         ?)r0   rN   fetch_klambda_multrM   r   r   c          
         sh   | 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.
        rM   Nc                 S   s   g | ]}|d  qS )r   r   rF   subr   r   r   rG     rH   zKSurrealDBStore.amax_marginal_relevance_search_by_vector.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r{   r   r   r   rG     rH   )Zdtype)rN   rz   c                    s   g | ]} | qS r   r   )rF   idocsr   r   rG     rH   )r_   r   nparrayZfloat32)
r   r0   rN   ry   rz   rM   r   rV   r+   Zmmr_selectedr   r   r   (amax_marginal_relevance_search_by_vector  s     z7SurrealDBStore.amax_marginal_relevance_search_by_vectorc                   s.   t t d 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                      s0     I d H  j fdiI d H S rf   )r'   r   r   r0   ry   rM   rN   r   rz   r   r   r   (_max_marginal_relevance_search_by_vector6  s    zhSurrealDBStore.max_marginal_relevance_search_by_vector.<locals>._max_marginal_relevance_search_by_vectorrr   )r   r0   rN   ry   rz   rM   r   r   r   r   r   'max_marginal_relevance_search_by_vector  s    "z6SurrealDBStore.max_marginal_relevance_search_by_vectorr   )rZ   rN   ry   rz   rM   r   r   c          	         s2   | 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.
        rM   N)r   rc   r   )	r   rZ   rN   ry   rz   rM   r   r0   r   r   r   r   amax_marginal_relevance_search>  s    z-SurrealDBStore.amax_marginal_relevance_searchc                   s.   t t d fdd}t| 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                      s0     I d H  j fdiI d H S rf   )r'   r   r   ry   rM   rN   r   rz   rZ   r   r   r   _max_marginal_relevance_search}  s    zTSurrealDBStore.max_marginal_relevance_search.<locals>._max_marginal_relevance_searchrr   )r   rZ   rN   ry   rz   rM   r   r   r   r   r   max_marginal_relevance_searcha  s    "z,SurrealDBStore.max_marginal_relevance_search)r-   r0   r.   r   r   c                    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-   r0   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.)rA   rB   r   r   r   r   r   
from_texts  s    zSurrealDBStore.from_texts)N)N)N)N)r   rw   rx   )N)N)*__name__
__module____qualname____doc__r	   r   r    r'   propertyr   r+   r   r?   r   r@   r<   rC   rL   rJ   rE   	DEFAULT_Krj   intr   r   r   r_   re   rk   rl   rn   ro   rs   rt   rv   r   r   r   r   classmethodr   r   r   r   r   r   r      s  (
 
  
 
 
N 1(   &$ 
 
r   )rA   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    