
    Ng                        d dl mZ d dlmZ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 dlmZmZ d d	lmZ ddZ G d de          ZdS )    )annotations)AnyDictIterableListOptionalTupleUnionN)Document)
Embeddingsguard_import)VectorStore)AddableMixinDocstore)InMemoryDocstorereturnr   c                      t          d          S )z=
    Import usearch if available, otherwise raise error.
    usearch.indexr        d/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/usearch.pydependable_usearch_importr      s     (((r   c                  `    e Zd ZdZd d
Z	 	 d!d"dZ	 d#d$dZ	 d#d%dZe	 	 	 d&d'd            Z	dS )(USearchzc`USearch` vector store.

    To use, you should have the ``usearch`` python package installed.
    	embeddingr   indexr   docstorer   ids	List[str]c                >    || _         || _        || _        || _        dS )z%Initialize with necessary components.N)r   r   r   r   )selfr   r   r   r   s        r   __init__zUSearch.__init__   s$     #
 r   NtextsIterable[str]	metadatasOptional[List[Dict]]&Optional[Union[np.ndarray, list[str]]]kwargsr   c                t  
 t          | j        t                    st          d| j         d          | j                            t          |                    }g }t          |          D ]5\  }}|r||         ni }	|                    t          ||	                     6t          | j        d                   dz   
|.t          j        
fdt          |          D                       }n)t          |t                    rt          j        |          }| j                            t          j        |          t          j        |                     | j                            t!          t#          ||                               | j                            |           |                                S )al  Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of unique IDs.

        Returns:
            List of ids from adding the texts into the vectorstore.
        zSIf trying to add texts, the underlying docstore should support adding items, which z	 does notpage_contentmetadata   Nc                :    g | ]\  }}t          |z             S r   str).0id_last_ids      r   
<listcomp>z%USearch.add_texts.<locals>.<listcomp>G   s)    LLL%"aC"--LLLr   )
isinstancer   r   
ValueErrorr   embed_documentslist	enumerateappendr   intr   nparrayr   adddictzipextendtolist)r"   r$   r&   r   r)   
embeddings	documentsitextr-   r6   s             @r   	add_textszUSearch.add_texts)   s   " $-66 	@'+}@ @ @  
 ^33DKK@@
	 '' 	M 	MGAt'08y||bHX4(KKKLLLLdhrl##a';(LLLL9U;K;KLLLMMCCT"" 	 (3--C
rx}}bhz&:&:;;;$s3	2233444zz||r      queryr2   kr>   List[Tuple[Document, float]]c                   | j                             |          }| j                            t	          j        |          |          }g }t          |j        |j                  D ]m\  }}| j	                            t          |                    }t          |t                    st          d| d|           |                    ||f           n|S )a	  Return docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.

        Returns:
            List of documents most similar to the query with distance.
        Could not find document for id , got )r   embed_queryr   searchr?   r@   rC   keys	distancesr   r2   r8   r   r9   r=   )	r"   rL   rM   query_embeddingmatchesdocs_with_scoresr4   scoredocs	            r   similarity_search_with_scorez$USearch.similarity_search_with_scoreP   s     .44U;;*##BH_$=$=qAA9;W\7+<== 	2 	2IB-&&s2ww//Cc8,, T !R2!R!RS!R!RSSS##S%L1111r   List[Document]c                x   | j                             |          }| j                            t	          j        |          |          }g }|j        D ]h}| j                            t          |                    }t          |t                    st          d| d|           |                    |           i|S )zReturn docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.

        Returns:
            List of Documents most similar to the query.
        rP   rQ   )r   rR   r   rS   r?   r@   rT   r   r2   r8   r   r9   r=   )	r"   rL   rM   r)   rV   rW   docsr4   rZ   s	            r   similarity_searchzUSearch.similarity_searchj   s     .44U;;*##BH_$=$=qAA!, 	 	B-&&s2ww//Cc8,, T !R2!R!RS!R!RSSSKKr   cosmetricc                   |                     |          }g }|,t          j        d t          |          D                       }n)t	          |t
                    rt          j        |          }t          |          D ]5\  }	}
|r||	         ni }|                    t          |
|                     6t          t          t          ||                              }t          d          }|                    t          |d                   |          }|                    t          j        |          t          j        |                      | ||||                                          S )aW  Construct USearch wrapper from raw documents.
        This is a user friendly interface that:
            1. Embeds documents.
            2. Creates an in memory docstore
            3. Initializes the USearch database
        This is intended to be a quick way to get started.

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import USearch
                from langchain_community.embeddings import OpenAIEmbeddings

                embeddings = OpenAIEmbeddings()
                usearch = USearch.from_texts(texts, embeddings)
        Nc                2    g | ]\  }}t          |          S r   r1   )r3   r4   r5   s      r   r7   z&USearch.from_texts.<locals>.<listcomp>   s"    BBBACGGBBBr   r+   r   r   )ndimra   )r:   r?   r@   r<   r8   r;   r=   r   r   rB   rC   r   IndexlenrA   rE   )clsr$   r   r&   r   ra   r)   rF   rG   rH   rI   r-   r   usearchr   s                  r   
from_textszUSearch.from_texts   sL   4 ..u55
$&	;(BB51A1ABBBCCCCT"" 	 (3--C '' 	M 	MGAt'08y||bHX4(KKKLLLL#DS))<)<$=$=>>//3z!}#5#5fEE		"(3--*!5!5666s9eXszz||<<<r   )r   r   r   r   r   r   r   r    )NN)
r$   r%   r&   r'   r   r(   r)   r   r   r    )rK   )rL   r2   rM   r>   r   rN   )rL   r2   rM   r>   r)   r   r   r\   )NNr`   )r$   r    r   r   r&   r'   r   r(   ra   r2   r)   r   r   r   )
__name__
__module____qualname____doc__r#   rJ   r[   r_   classmethodri   r   r   r   r   r      s         
     +/6:	% % % % %T          :     6 
 +/6:(= (= (= (= [(= (= (=r   r   )r   r   )
__future__r   typingr   r   r   r   r   r	   r
   numpyr?   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   !langchain_community.docstore.baser   r   &langchain_community.docstore.in_memoryr   r   r   r   r   r   <module>rx      s   " " " " " " D D D D D D D D D D D D D D D D D D     - - - - - - 0 0 0 0 0 0 - - - - - - 3 3 3 3 3 3 D D D D D D D D C C C C C C) ) ) )X= X= X= X= X=k X= X= X= X= X=r   