
    Ig                        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y)    )annotations)AnyDictIterableListOptionalTupleUnionN)Document)
Embeddingsguard_import)VectorStore)AddableMixinDocstore)InMemoryDocstorec                     t        d      S )z=
    Import usearch if available, otherwise raise error.
    usearch.indexr        e/var/www/html/answerous/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           
     f   t        | j                  t              st        d| j                   d      | j                  j                  t        |            }g }t        |      D ]*  \  }}|r||   ni }	|j                  t        ||	             , t        | j                  d         dz   }
|>t        j                  t        |      D cg c]  \  }}t        |
|z          c}}      }n%t        |t              rt        j                  |      }| j                  j!                  t        j                  |      t        j                  |             | j                  j!                  t#        t%        ||                   | j                  j'                  |       |j)                         S 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   intr   nparraystrr   adddictzipextendtolist)r    texts	metadatasr   kwargs
embeddings	documentsitextr%   last_idid_s                r   	add_textszUSearch.add_texts)   sS   " $--6''+}}oY@ 
 ^^33DK@
	 ' 	MGAt'0y|bHX4(KL	M dhhrl#a';((9U;KL%"aC"-LMCT"((3-C

rxx}bhhz&:;$s3	234zz| Ms   F-
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   searchr/   r0   r4   keys	distancesr   r1   r(   r   r)   r-   )	r    querykquery_embeddingmatchesdocs_with_scoresr?   scoredocs	            r   similarity_search_with_scorez$USearch.similarity_search_with_scoreP   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.
        rC   rD   )r   rE   r   rF   r/   r0   rG   r   r1   r(   r   r)   r-   )	r    rI   rJ   r9   rK   rL   docsr?   rO   s	            r   similarity_searchzUSearch.similarity_searchj   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                  |              | ||||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*   r/   r0   r,   r1   r(   r+   r-   r   r   r3   r4   r   Indexlenr2   r6   )clsr7   r   r8   r   rV   r9   r:   r;   r?   r@   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9eXszz|<< Cs   E
)r   r   r   r   r   r   r   	List[str])NN)
r7   zIterable[str]r8   Optional[List[Dict]]r   &Optional[Union[np.ndarray, list[str]]]r9   r   returnr\   )   )rI   r1   rJ   r.   r_   zList[Tuple[Document, float]])rI   r1   rJ   r.   r9   r   r_   zList[Document])NNcos)r7   r\   r   r   r8   r]   r   r^   rV   r1   r9   r   r_   r   )
__name__
__module____qualname____doc__r!   rA   rP   rS   classmethodr[   r   r   r   r   r      s)   
  	
   +/6:	%% (% 4	%
 % 
%T      
&	 :   	
 
6 
 +/6:(=(= (= (	(=
 4(= (= (= 
(= (=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>rp      s9    " D D D  - 0 - 3 D C)X=k X=r   