o
    ZhD                     @  s   d dl mZ d dlmZ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dZG dd deZdS )    )annotations)AnyDictIterableListOptionalTupleUnioncastN)Document)
Embeddingsguard_import)VectorStore)AddableMixinDocstore)InMemoryDocstorereturnr   c                   C  s   t dS )z=
    Import usearch if available, otherwise raise error.
    usearch.indexr    r   r   _/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/usearch.pydependable_usearch_import   s   r   c                   @  s\   e Zd ZdZd%d
dZ		d&d'ddZ	d(d)ddZ	d(d*dd Ze			!d+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                 C  s   || _ || _|| _|| _dS )z%Initialize with necessary components.N)r   r   r   r   )selfr   r   r   r   r   r   r   __init__   s   
zUSearch.__init__NtextsIterable[str]	metadatasOptional[List[Dict]]&Optional[Union[np.ndarray, list[str]]]kwargsr   c           
        s   t | jtstd| j d| jt|}g }t|D ]\}}|r'|| ni }	|t	||	d qt
| jd d  |du rOt fddt|D }n
t |trYt|}| jt|t| | jtt|| | j| ttt | 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Zpage_contentmetadata   Nc                   s   g | ]
\}}t  | qS r   str.0id_Zlast_idr   r   
<listcomp>G   s    z%USearch.add_texts.<locals>.<listcomp>)
isinstancer   r   
ValueErrorr   embed_documentslist	enumerateappendr   intr   nparrayr   adddictzipextendr
   r   r+   tolist)
r   r    r"   r   r%   
embeddings	documentsitextr'   r   r0   r   	add_texts)   s(   

zUSearch.add_texts   queryr+   kr8   List[Tuple[Document, float]]c           	      C  s|   | j |}| jt||}g }t|j|jD ]"\}}| j	t
|}t|ts4td| d| |||f q|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   searchr9   r:   r=   keysZ	distancesr   r+   r2   r   r3   r7   )	r   rF   rG   query_embeddingmatchesZdocs_with_scoresr.   Zscoredocr   r   r   similarity_search_with_scoreP   s   
z$USearch.similarity_search_with_scoreList[Document]c           	      K  sl   | j |}| jt||}g }|jD ]}| jt|}t	|t
s.td| d| || q|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.
        rI   rJ   )r   rK   r   rL   r9   r:   rM   r   r+   r2   r   r3   r7   )	r   rF   rG   r%   rN   rO   docsr.   rP   r   r   r   similarity_searchj   s   

zUSearch.similarity_searchcosmetricc                 K  s   | |}g }|du rtdd t|D }n
t|tr"t|}t|D ]\}	}
|r0||	 ni }|t|
|d q&tt	t
||}td}|jt|d |d}|t|t| | |||ttt | 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                 S  s   g | ]\}}t |qS r   r*   r,   r   r   r   r1      s    z&USearch.from_texts.<locals>.<listcomp>r&   r   r   )ndimrV   )r4   r9   r:   r6   r2   r5   r7   r   r   r<   r=   r   Indexlenr;   r
   r   r+   r?   )clsr    r   r"   r   rV   r%   r@   rA   rB   rC   r'   r   Zusearchr   r   r   r   
from_texts   s   


zUSearch.from_texts)r   r   r   r   r   r   r   r   )NN)
r    r!   r"   r#   r   r$   r%   r   r   r   )rE   )rF   r+   rG   r8   r   rH   )rF   r+   rG   r8   r%   r   r   rR   )NNrU   )r    r   r   r   r"   r#   r   r$   rV   r+   r%   r   r   r   )
__name__
__module____qualname____doc__r   rD   rQ   rT   classmethodr[   r   r   r   r   r      s    
*r   )r   r   )
__future__r   typingr   r   r   r   r   r   r	   r
   numpyr9   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.utilsr   Zlangchain_core.vectorstoresr   Z!langchain_community.docstore.baser   r   Z&langchain_community.docstore.in_memoryr   r   r   r   r   r   r   <module>   s    (
