o
    Zh0&                     @   s   d dl mZmZmZmZmZmZ d dlmZ d dl	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 dlmZ G d	d
 d
eZdS )    )AnyIterableListOptionalTuplecast)uuid4NDocument)
Embeddings)get_from_env)VectorStore)DistanceStrategyc                   @   s  e Zd ZU dZdZeed< de Zej	dfdede
ded	ed
ef
ddZedefddZdefddZdefddZdefddZ		d1dee deee  de
dedee f
ddZedefddZd2d eee  dedee fd!d"Zd3dee d$e
dee fd%d&Z	#d3d'ed$e
dedee fd(d)Z	#d3d'ed$e
dedeeeef  fd*d+Z 	#d3dee d$e
dedee fd,d-Z!e"ddd.dej	fdee dedeee  dede
d
ed	ededd fd/d0Z#dS )4SemaDBa  `SemaDB` vector store.

    This vector store is a wrapper around the SemaDB database.

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import SemaDB

            db = SemaDB('mycollection', 768, embeddings, DistanceStrategy.COSINE)

    zsemadb.p.rapidapi.comHOSTzhttps:// collection_namevector_size	embeddingdistance_strategyapi_keyc                 C   s,   || _ || _|ptdd| _|| _|| _dS )z#initialize the SemaDB vector store.r   ZSEMADB_API_KEYN)r   r   r   r   
_embeddingr   )selfr   r   r   r   r    r   ^/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/semadb.py__init__   s
   	
zSemaDB.__init__returnc                 C   s   d| j tjdS )zReturn the common headers.zapplication/json)zcontent-typezX-RapidAPI-KeyzX-RapidAPI-Host)r   r   r   r   r   r   r   headers.   s   zSemaDB.headersc                 C   sh   | j tjkrdS | j tjkrtd| j tjkrdS | j tjkr$td| j tjkr,dS td| j  )z&Return the internal distance strategy.Z	euclideanz,Max inner product is not supported by SemaDBdotZcosinezUnknown distance strategy )r   r   EUCLIDEAN_DISTANCEZMAX_INNER_PRODUCT
ValueErrorZDOT_PRODUCTZJACCARDCOSINEr   r   r   r   _get_internal_distance_strategy7   s   z&SemaDB._get_internal_distance_strategyc                 C   s6   | j | j|  d}tjtjd || jd}|jdkS )z/Creates the corresponding collection in SemaDB.)idZ
vectorSizeZdistanceMetricz/collectionsjsonr      )	r   r   r#   requestspostr   BASE_URLr   status_code)r   payloadresponser   r   r   create_collectionF   s   
zSemaDB.create_collectionc                 C   s(   t jtjd| j  | jd}|jdkS )z/Deletes the corresponding collection in SemaDB./collections/)r   r'   )r(   deleter   r*   r   r   r+   )r   r-   r   r   r   delete_collectionT   s
   
zSemaDB.delete_collectionN  texts	metadatas
batch_sizekwargsc                 K   s  t |ts	t|}| j|}t|d | jkr'tdt|d  d| j | jtj	krHt
|}|t
jj|ddd }tttt  | }g }g }|durvt|||D ]\}	}
}tt }|| |||
i |d|	id	 qVnt||D ]\}	}
tt }|| |||
d|	id	 q{tdt||D ]B}||||  }tjtjd
| j d d|i| jd}|jdkrtd| td|j |  d }t|dkrtd| q|S )zAdd texts to the vector store.r   zEmbedding size mismatch z !=    T)ZaxisZkeepdimsNtext)r$   vectormetadatar/   /pointspointsr%   r'   zHERE--zError adding points: ZfailedRanges)!
isinstancelistr   Zembed_documentslenr   r!   r   r   r"   nparraylinalgnormr   r   floattolistzipstrr   appendranger(   r)   r   r*   r   r   r+   printr8   r&   )r   r3   r4   r5   r6   
embeddingsZembed_matrixidsr<   r8   r   r:   Znew_idibatchr-   Zfailed_rangesr   r   r   	add_texts\   sd   







zSemaDB.add_textsc                 C   s   | j S )zReturn the embeddings.)r   r   r   r   r   rK      s   zSemaDB.embeddingsrL   c                 K   sH   d|i}t jtjd| j d || jd}|jdko#t| d dkS )a3  Delete by vector ID or other criteria.

        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, None if not implemented.
        rL   r/   r;   r%   r'   ZfailedPointsr   )	r(   r0   r   r*   r   r   r+   r?   r&   )r   rL   r6   r,   r-   r   r   r   r0      s   zSemaDB.delete   kc                 C   s   | j tjkrt|}|tj| }ttt	 |
 }||d}tjtjd| j d || jd}|jdkr?td|j | d S )zSearch points.)r9   limitr/   z/points/searchr%   r'   zError searching: r<   )r   r   r"   r@   rA   rB   rC   r   r   rD   rE   r(   r)   r   r*   r   r   r+   r!   r8   r&   )r   r   rQ   Zvecr,   r-   r   r   r   _search_points   s   

zSemaDB._search_pointsqueryc                 K   s   | j |}| j||dS )z"Return docs most similar to query.rQ   )r   embed_querysimilarity_search_by_vector)r   rT   rQ   r6   query_embeddingr   r   r   similarity_search   s   zSemaDB.similarity_searchc                 K   s(   | j |}| j||d}dd |D S )z$Run similarity search with distance.rU   c                 S   s,   g | ]}t |d  d |d  d|d fqS )r:   r8   Zpage_contentr:   Zdistancer	   .0pr   r   r   
<listcomp>   s    z7SemaDB.similarity_search_with_score.<locals>.<listcomp>)r   rV   rS   )r   rT   rQ   r6   rX   r<   r   r   r   similarity_search_with_score   s
   z#SemaDB.similarity_search_with_scorec                 K   s   | j ||d}dd |D S )a  Return docs most similar to embedding vector.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.

        Returns:
            List of Documents most similar to the query vector.
        rU   c                 S   s$   g | ]}t |d  d |d  dqS )r:   r8   rZ   r	   r[   r   r   r   r^      s    z6SemaDB.similarity_search_by_vector.<locals>.<listcomp>)rS   )r   r   rQ   r6   r<   r   r   r   rW      s   z"SemaDB.similarity_search_by_vectorr   c           
      K   sX   |st d|st d|st d| |||||d}	|	 s#t d|	j||d |	S )z9Return VectorStore initialized from texts and embeddings.z Collection name must be providedzVector size must be providedzAPI key must be provided)r   r   zError creating collection)r4   )r!   r.   rO   )
clsr3   r   r4   r   r   r   r   r6   Zsemadbr   r   r   
from_texts   s"   zSemaDB.from_texts)Nr2   )N)rP   )$__name__
__module____qualname____doc__r   rG   __annotations__r*   r   r    intr   r   propertydictr   r#   boolr.   r1   r   r   r   r   rO   rK   r0   rD   rS   r
   rY   r   r_   rW   classmethodra   r   r   r   r   r      s   
 


A$ 



	
r   )typingr   r   r   r   r   r   uuidr   numpyr@   r(   Zlangchain_core.documentsr
   Zlangchain_core.embeddingsr   Zlangchain_core.utilsr   Zlangchain_core.vectorstoresr   Z&langchain_community.vectorstores.utilsr   r   r   r   r   r   <module>   s     