a
    bgD                     @  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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)InMemoryDocstorer   )returnc                   C  s   t dS )z=
    Import usearch if available, otherwise raise error.
    usearch.indexr    r   r   v/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/usearch.pydependable_usearch_import   s    r   c                
   @  s   e Zd ZdZdddddddZdd
dddddddZd ddddddZd!dddddddZed"ddddddd dddZ	d	S )#USearchzc`USearch` vector store.

    To use, you should have the ``usearch`` python package installed.
    r   r   r   z	List[str]	embeddingindexdocstoreidsc                 C  s   || _ || _|| _|| _dS )z%Initialize with necessary components.Nr   )selfr   r   r   r   r   r   r   __init__   s    zUSearch.__init__NzIterable[str]zOptional[List[Dict]]z&Optional[Union[np.ndarray, list[str]]])texts	metadatasr   kwargsr   c           
        s   t | jtstd| j d| jt|}g }t|D ]*\}}|rN|| ni }	|t	||	d q:t
| jd d  |du rt fddt|D }nt |trt|}| 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       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   r-   r   	add_texts)   s(    

zUSearch.add_texts   r(   r6   zList[Tuple[Document, float]])querykr   c           	      C  s|   | j |}| jt||}g }t|j|jD ]D\}}| j	t
|}t|tshtd| d| |||f q2|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   searchr7   r8   r;   keysZ	distancesr   r(   r0   r   r1   r5   )	r   rD   rE   query_embeddingmatchesZdocs_with_scoresr+   Zscoredocr   r   r   similarity_search_with_scoreP   s    
z$USearch.similarity_search_with_scorezList[Document])rD   rE   r"   r   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.
        rF   rG   )r   rH   r   rI   r7   r8   rJ   r   r(   r0   r   r1   r5   )	r   rD   rE   r"   rK   rL   docsr+   rM   r   r   r   similarity_searchj   s    

zUSearch.similarity_searchcos)r    r   r!   r   metricr"   r   c                 K  s   | |}g }|du r0tdd t|D }nt|trDt|}t|D ]*\}	}
|r`||	 ni }|t|
|d qLt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   r.      r/   z&USearch.from_texts.<locals>.<listcomp>r#   r   r   )ndimrR   )r2   r7   r8   r4   r0   r3   r5   r   r   r:   r;   r   Indexlenr9   r
   r   r(   r=   )clsr    r   r!   r   rR   r"   r>   r?   r@   rA   r$   r   Zusearchr   r   r   r   
from_texts   s    


zUSearch.from_texts)NN)rC   )rC   )NNrQ   )
__name__
__module____qualname____doc__r   rB   rN   rP   classmethodrW   r   r   r   r   r      s     *     r   )
__future__r   typingr   r   r   r   r   r   r	   r
   numpyr7   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   (