
    h0&                         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
e      Zy)    )AnyIterableListOptionalTuplecast)uuid4N)Document)
Embeddings)get_from_env)VectorStore)DistanceStrategyc                      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#y)%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                 f    || _         || _        |xs t        dd      | _        || _        || _        y)z#initialize the SemaDB vector store.r   SEMADB_API_KEYN)r   r   r   r   
_embeddingr   )selfr   r   r   r   r   s         e/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/semadb.py__init__zSemaDB.__init__   s7      /&K,y:J"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     /"ll%{{
 	
r   c                    | j                   t        j                  k(  ry| j                   t        j                  k(  rt	        d      | j                   t        j
                  k(  ry| j                   t        j                  k(  rt	        d      | j                   t        j                  k(  ry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##'7'C'CC##'7'?'??KLL##'7'>'>>9$:P:P9QRSSr   c                     | j                   | 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   sb     &&**"BBD

 ==OOn,LL

 ##s**r   c                     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   sD    ??OOd.B.B-CDDLL
 ##s**r   Ntexts	metadatas
batch_sizekwargsc                    t        |t              st        |      }| j                  j                  |      }t	        |d         | j
                  k7  r't        dt	        |d          d| j
                         | j                  t        j                  k(  rft        j                  |      }|t        j                  j                  |dd      z  }t        t        t        t               |j#                               }g }g }|Vt%        |||      D ]E  \  }	}
}t'        t)                     }|j+                  |       |j+                  ||
i |d|	id       G nOt%        ||      D ]@  \  }	}
t'        t)                     }|j+                  |       |j+                  ||
d|	id       B t-        dt	        |      |      D ]  }||||z    }t/        j0                  t2        j4                  d	| j6                   d
z   d|i| j8                        }|j:                  dk7  r$t=        d|       t        d|j>                         |jA                         d   }t	        |      dkD  st        d|        |S )zAdd texts to the vector store.r   zEmbedding size mismatch z !=    T)axiskeepdims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normr   r   floattolistzipstrr	   appendranger5   r6   r   r7   r   r"   r8   printrH   r3   )r   r@   rA   rB   rC   
embeddingsembed_matrixidsrL   rH   r   rJ   new_idibatchr:   failed_rangess                    r   	add_textszSemaDB.add_texts\   sj    %&KE__44U;
z!}!1!11*3z!}+=*>d4CSCSBTU  !!%5%<%<<88J/L'"))..1t +9 + L d4;/1D1D1FGJ -0
I-N 	)iUW

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

6"$"+%+TN	 q#f+z2 	JA1q:~.E}}M$2F2F1Gw"OO&H
 ##s*h& #8!HII$MMON;M=!A% #8!HII	J 
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(  xr t        |j                         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=   rK   r2   r4   failedPointsr   )	r5   r>   r   r7   r   r"   r8   rQ   r3   )r   r_   rC   r9   r:   s        r   r>   zSemaDB.delete   st     3
 ??OOd.B.B-C7KKLL

 ##s*Xs8==?>3R/SWX/XXr   kc                    | j                   t        j                  k(  r\t        j                  |      }|t        j
                  j                  |      z  }t        t        t           |j                               }||d}t        j                  t        j                  d| j                   dz   || j                         }|j"                  dk7  rt%        d|j&                         |j)                         d   S )zSearch points.)rI   limitr=   z/points/searchr2   r4   zError searching: rL   )r   r   r,   rR   rS   rT   rU   r   r   rV   rW   r5   r6   r   r7   r   r"   r8   r)   rH   r3   )r   r   rh   vecr9   r:   s         r   _search_pointszSemaDB._search_points   s     !!%5%<%<<((9%C		s++CT%[#**,7I  
 ==OOd.B.B-C>RRLL

 3&0@AA}}x((r   queryc                 ^    | j                   j                  |      }| j                  ||      S )z"Return docs most similar to query.rh   )r   embed_querysimilarity_search_by_vector)r   rm   rh   rC   query_embeddings        r   similarity_searchzSemaDB.similarity_search   s.     //55e<//1/EEr   c                     | j                   j                  |      }| j                  ||      }|D cg c]  }t        |d   d   |d         |d   f c}S c c}w )z$Run similarity search with distance.ro   rJ   rH   page_contentrJ   distance)r   rp   rl   r
   )r   rm   rh   rC   rr   rL   ps          r   similarity_search_with_scorez#SemaDB.similarity_search_with_score   sq     //55e<$$_$: 

  a
mF&;a
mT*
 	
 
s   "Ac                 z    | j                  ||      }|D cg c]  }t        |d   d   |d          c}S c c}w )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.
        ro   rJ   rH   ru   )rl   r
   )r   r   rh   rC   rL   rx   s         r   rq   z"SemaDB.similarity_search_by_vector   sO     $$Y!$4 
 !J-"7!J-P
 	
 
s   8r   c                     |st        d      |st        d      |st        d       | |||||      }	|	j                         st        d      |	j                  ||       |	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)rA   )r)   r;   rd   )
clsr@   r   rA   r   r   r   r   rC   semadbs
             r   
from_textszSemaDB.from_texts   s|     ?@@;<<788/
 '')899)4r   )Ni  )N)   )$__name__
__module____qualname____doc__r   rY   __annotations__r7   r   r'   intr   r   propertydictr"   r-   boolr;   r?   r   r   r   r   rd   r]   r>   rV   rl   r
   rs   r   ry   rq   classmethodr~    r   r   r   r      s    (D#'D H /?.Q.Q33 3 	3
 ,3 3 
 
 
T T+4 ++4 + +/	?}? DJ'? 	?
 ? 
c?B J  Y(49- Y YQU Y*)U ) )DJ ), $%FF F03F	hF $%

 
03
	eHeO$	%
 01
e
),
<?
	h
$ 
 +/!.>.Q.QCy  DJ'	
    ,  
 r   r   )typingr   r   r   r   r   r   uuidr	   numpyrR   r5   langchain_core.documentsr
   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   r   r   r   r   <module>r      s1    = =    - 0 - 3 CB[ Br   