
    h                        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
Z G d de      Zy)    )annotations)AnyDictIterableListOptionalTupleUnioncastN)Document)
Embeddingsguard_import)VectorStore)AddableMixinDocstore)InMemoryDocstorec                     t        d      S )z=
    Import usearch if available, otherwise raise error.
    usearch.indexr        f/var/www/html/eduruby.in/venv/lib/python3.12/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	y)USearchzc`USearch` vector store.

    To use, you should have the ``usearch`` python package installed.
    c                <    || _         || _        || _        || _        y)z%Initialize with necessary components.N)	embeddingindexdocstoreids)selfr   r   r   r    s        r   __init__zUSearch.__init__   s      #
 r   Nc           
     *   t        | j                  t              st        d| j                   d      | j                  j                  t        |            }g }t        |      D ]*  \  }}|r||   ni }	|j                  t        ||	             , || j                  rYt        | j                  d         dz   }
t        j                  t        |      D cg c]  \  }}t        |
|z          c}}      }n`t        j                  t        |      D cg c]  \  }}t        |       c}}      }n%t        |t              rt        j                  |      }| j                  j!                  t        j                  |      t        j                  |             | j                  j!                  t#        t%        ||                   | j                  j'                  |       t)        t*        t           |j-                               S c c}}w c c}}w )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   )
isinstancer   r   
ValueErrorr   embed_documentslist	enumerateappendr   r    intnparraystrr   adddictzipextendr   r   tolist)r!   texts	metadatasr    kwargs
embeddings	documentsitextr&   last_idid_s                r   	add_textszUSearch.add_texts)   s   " $--6''+}}oY@ 
 ^^33DK@
	 ' 	MGAt'0y|bHX4(KL	M ;xxdhhrl+a/hhy?OPeb!GbL 1PQhhYu5EFEBBFGT"((3-C

rxx}bhhz&:;$s3	234DIszz|,,  QFs   H	
H
c                   | j                   j                  |      }| j                  j                  t	        j
                  |      |      }g }t        |j                  |j                        D ]]  \  }}| j                  j                  t        |            }t        |t              st        d| d|       |j                  ||f       _ |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   searchr0   r1   r5   keys	distancesr   r2   r)   r   r*   r.   )	r!   querykquery_embeddingmatchesdocs_with_scoresr@   scoredocs	            r   similarity_search_with_scorez$USearch.similarity_search_with_scoreT   s     ..44U;**##BHH_$=qA9;W\\7+<+<= 	2IB--&&s2w/Cc8, #B2$fSE!RSS##S%L1		2  r   c                l   | j                   j                  |      }| j                  j                  t	        j
                  |      |      }g }|j                  D ]X  }| j                  j                  t        |            }t        |t              st        d| d|       |j                  |       Z |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.
        rD   rE   )r   rF   r   rG   r0   r1   rH   r   r2   r)   r   r*   r.   )	r!   rJ   rK   r:   rL   rM   docsr@   rP   s	            r   similarity_searchzUSearch.similarity_searchn   s     ..44U;**##BHH_$=qA!,, 	B--&&s2w/Cc8, #B2$fSE!RSSKK		 r   c           
        |j                  |      }g }|;t        j                  t        |      D 	
cg c]  \  }	}
t	        |	       c}
}	      }n%t        |t              rt        j                  |      }t        |      D ]*  \  }}|r||   ni }|j                  t        ||             , t        t        t        ||                  }t        d      }|j                  t        |d         |      }|j                  t        j                  |      t        j                  |              | |||t!        t"        t           |j%                                     S c c}
}	w )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)
        r$   r   r   )ndimmetric)r+   r0   r1   r-   r2   r)   r,   r.   r   r   r4   r5   r   Indexlenr3   r   r   r7   )clsr8   r   r9   r    rW   r:   r;   r<   r@   rA   r=   r>   r&   r   usearchr   s                    r   
from_textszUSearch.from_texts   s   4 ..u5
$&	;((51ABACGBCCT"((3-C ' 	MGAt'0y|bHX4(KL	M $DS))<$=>/3z!}#5fE		"((3-*!569eXtDIszz|/LMM Cs   E
)r   r   r   r   r   r   r    	List[str])NN)
r8   zIterable[str]r9   Optional[List[Dict]]r    &Optional[Union[np.ndarray, list[str]]]r:   r   returnr]   )   )rJ   r2   rK   r/   r`   zList[Tuple[Document, float]])rJ   r2   rK   r/   r:   r   r`   zList[Document])NNcos)r8   r]   r   r   r9   r^   r    r_   rW   r2   r:   r   r`   r   )
__name__
__module____qualname____doc__r"   rB   rQ   rT   classmethodr\   r   r   r   r   r      s2   
  	
   +/6:	)-)- ()- 4	)-
 )- 
)-\      
&	 :   	
 
6 
 +/6:(N(N (N (	(N
 4(N (N (N 
(N (Nr   r   )r`   r   )
__future__r   typingr   r   r   r   r   r	   r
   r   numpyr0   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>rq      s;    " J J J  - 0 - 3 D C)\Nk \Nr   