
    Ng%                         d dl 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
e          ZdS )    )AnyIterableListOptionalTuple)uuid4NDocument)
Embeddings)get_from_env)VectorStore)DistanceStrategyc                   x   e Zd ZU dZdZeed<   dez   Zej	        dfdede
ded	ed
ef
dZedefd            ZdefdZdefdZdefdZ	 	 d$dee         deee                  de
dedee         f
dZedefd            Zd%deee                  dedee         fdZd&dee         de
dee         fdZ	 d&dede
dedee         fdZ	 d&dede
dedeeeef                  fd Z 	 d&dee         de
dedee         f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#            Z#dS )'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                 l    || _         || _        |pt          dd          | _        || _        || _        dS )z#initialize the SemaDB vector store.r   SEMADB_API_KEYN)r   r   r   r   
_embeddingr   )selfr   r   r   r   r   s         c/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/semadb.py__init__zSemaDB.__init__   s@      /&K,y:J"K"K#!2    returnc                 ,    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   s    r   headerszSemaDB.headers.   s      /"l%{
 
 	
r   c                 J   | 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.	euclideanz,Max inner product is not supported by SemaDBdotcosinezUnknown distance strategy )r   r   EUCLIDEAN_DISTANCEMAX_INNER_PRODUCT
ValueErrorDOT_PRODUCTJACCARDCOSINEr!   s    r   _get_internal_distance_strategyz&SemaDB._get_internal_distance_strategy7   s    !%5%HHH;#'7'IIIKLLL#'7'CCC5#'7'???KLLL#'7'>>>8R$:PRRSSSr   c                     | j         | j        |                                 d}t          j        t
          j        dz   || j                  }|j        dk    S )z/Creates the corresponding collection in SemaDB.)id
vectorSizedistanceMetricz/collectionsjsonr"      )	r   r   r-   requestspostr   BASE_URLr"   status_code)r   payloadresponses      r   create_collectionzSemaDB.create_collectionF   se     &*"BBDD
 

 =On,L
 
 

 #s**r   c                 x    t          j        t          j        d| j         z   | j                  }|j        dk    S )z/Deletes the corresponding collection in SemaDB./collections/)r"   r4   )r5   deleter   r7   r   r"   r8   )r   r:   s     r   delete_collectionzSemaDB.delete_collectionT   sC    ?ODd.BDDDL
 
 
 #s**r   N  texts	metadatas
batch_sizekwargsc                     t          |t                    st          |          }| j                            |          }t	          |d                   | j        k    r-t          dt	          |d                    d| j                   | j        t          j	        k    rMt          j        |          }|t          j                            |dd          z  }|                                }g }g }|ht          |||          D ]U\  }	}
}t!          t#                                }|                    |           |                    ||
i |d|	id	           Vnat          ||          D ]P\  }	}
t!          t#                                }|                    |           |                    ||
d|	id	           Qt'          dt	          |          |          D ]}||||z            }t)          j        t,          j        d
| j         dz   d|i| j                  }|j        dk    r't7          d|           t          d|j                   |                                d         }t	          |          dk    rt          d|           |S )zAdd texts to the vector store.r   zEmbedding size mismatch z !=    T)axiskeepdimsNtext)r/   vectormetadatar=   /pointspointsr2   r4   zHERE--zError adding points: failedRanges)
isinstancelistr   embed_documentslenr   r)   r   r   r,   nparraylinalgnormtolistzipstrr   appendranger5   r6   r   r7   r   r"   r8   printrI   r3   )r   rA   rB   rC   rD   
embeddingsembed_matrixidsrM   rI   r   rK   new_idibatchr:   failed_rangess                    r   	add_textszSemaDB.add_texts\   s    %&& 	 KKE_44U;;
z!}!111U3z!}+=+=UU4CSUU   !%5%<<<8J//L'")..1t +9 + + L &,,..J -0
I-N-N 	 	)iUWW

6"""$"+$Bx$BFD>$B    	 $'uj#9#9 	 	iUWW

6"""$"+%+TN     q#f++z22 	J 	JA1q:~-.E}"O$2F"O"O"OO&  H
 #s**h&&& !H!H!HIII$MMOON;M=!!A%% !H!H!HIII & 
r   c                     | j         S )zReturn the embeddings.)r   r!   s    r   r]   zSemaDB.embeddings   s     r   r_   c                     d|i}t          j        t          j        d| j         dz   || j                  }|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.
        r_   r=   rL   r2   r4   failedPointsr   )	r5   r>   r   r7   r   r"   r8   rR   r3   )r   r_   rD   r9   r:   s        r   r>   zSemaDB.delete   sy     3
 ?OKd.BKKKKL
 
 

 #s*Xs8==??>3R/S/SWX/XXr      kc                    | j         t          j        k    rJt          j        |          }|t          j                            |          z  }|                                }||d}t          j	        t          j        d| j         dz   || j                  }|j        dk    rt          d|j                   |                                d         S )zSearch points.)rJ   limitr=   z/points/searchr2   r4   zError searching: rM   )r   r   r,   rS   rT   rU   rV   rW   r5   r6   r   r7   r   r"   r8   r)   rI   r3   )r   r   ri   vecr9   r:   s         r   _search_pointszSemaDB._search_points   s     !%5%<<<(9%%C	s+++C

I  
 
 =ORd.BRRRRL
 
 

 3&&@@@AAA}}x((r   queryc                 d    | j                             |          }|                     ||          S )z"Return docs most similar to query.ri   )r   embed_querysimilarity_search_by_vector)r   rn   ri   rD   query_embeddings        r   similarity_searchzSemaDB.similarity_search   s2     /55e<<//1/EEEr   c                 |    | j                             |          }|                     ||          }d |D             S )z$Run similarity search with distance.rp   c                 d    g | ]-}t          |d          d         |d                    |d         f.S )rK   rI   page_contentrK   distancer	   .0ps     r   
<listcomp>z7SemaDB.similarity_search_with_score.<locals>.<listcomp>   sP     
 
 

  a
mF&;a
mTTT*
 
 
r   )r   rq   rm   )r   rn   ri   rD   rs   rM   s         r   similarity_search_with_scorez#SemaDB.similarity_search_with_score   sT     /55e<<$$_$::
 

 
 
 
 	
r   c                 H    |                      ||          }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.
        rp   c                 T    g | ]%}t          |d          d         |d                    &S )rK   rI   rw   r	   rz   s     r   r}   z6SemaDB.similarity_search_by_vector.<locals>.<listcomp>   sB     
 
 
 !J-"7!J-PPP
 
 
r   )rm   )r   r   ri   rD   rM   s        r   rr   z"SemaDB.similarity_search_by_vector   s=     $$Y!$44
 

 
 
 	
r   r   c                     |st          d          |st          d          |st          d           | |||||          }	|	                                st          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)rB   )r)   r;   rd   )
clsrA   r   rB   r   r   r   r   rD   semadbs
             r   
from_textszSemaDB.from_texts   s      	A?@@@ 	=;<<< 	97888/
 
 
 '')) 	:8999)444r   )Nr@   )N)rh   )$__name__
__module____qualname____doc__r   rY   __annotations__r7   r   r'   intr   r   propertydictr"   r-   boolr;   r?   r   r   r   r   rd   r]   r>   floatrm   r
   rt   r   r~   rr   classmethodr    r   r   r   r      s          (D#'''D H /?.Q3 33 3 	3
 ,3 3 3 3 3 
 
 
 
 X
T T T T T+4 + + + ++4 + + + + +/	? ?}? DJ'? 	?
 ? 
c? ? ? ?B J    XY Y(49- Y YQU Y Y Y Y*) )U ) )DJ ) ) ) ), $%F FF F03F	hF F F F $%
 

 
03
	eHeO$	%
 
 
 
 01
 
e
),
<?
	h
 
 
 
$ 
 +/!.>.Q Cy  DJ'	
    ,  
   [  r   r   )typingr   r   r   r   r   uuidr   numpyrS   r5   langchain_core.documentsr
   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   r   r   r   r   <module>r      s    7 7 7 7 7 7 7 7 7 7 7 7 7 7            - - - - - - 0 0 0 0 0 0 - - - - - - 3 3 3 3 3 3 C C C C C CB B B B B[ B B B B Br   