a
    bg0&                     @   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ee
eeedddZeed	d
dZed	ddZed	ddZed	ddZd,ee eee  e
eee dddZeed	ddZd-eee  eee dddZd.ee e
ee dddZd/ee
eee d d!d"Zd0ee
eeeeef  d d#d$Z d1ee e
eee d%d&d'Z!e"ddd(dej	fee eeee  ee
eeed d)	d*d+Z#dS )2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   u/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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   sp   | j tjkrdS | j tjkr&tdnF| j tjkr6dS | j tjkrLtdn | j tjkr\dS td| j  dS )z&Return the internal distance strategy.Z	euclideanz,Max inner product is not supported by SemaDBdotZcosinezUnknown distance strategy N)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kwargsr   c                 K   s  t |tst|}| j|}t|d | jkrNtdt|d  d| j | jtj	krt
|}|t
jj|ddd }tttt  | }g }g }|durt|||D ]<\}	}
}tt }|| |||
i |d|	id	 qn>t||D ]2\}	}
tt }|| |||
d|	id	 qtdt||D ]}||||  }tjtjd
| j d d|i| jd}|jdkrtd| td|j |  d }t|dkr:t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\   s`    






zSemaDB.add_textsc                 C   s   | j S )zReturn the embeddings.)r   r   r   r   r   rK      s    zSemaDB.embeddings)rL   r6   r   c                 K   sH   d|i}t jtjd| j d || jd}|jdkoFt| 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   )r   kr   c                 C   s   | j tjkr8t|}|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)queryrQ   r6   r   c                 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_score)r   rQ   r6   r   c                 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   )	r3   r   r4   r   r   r   r   r6   r   c           
      K   sX   |st d|st d|s$t d| |||||d}	|	 sFt 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   )rP   )rP   )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    