o
    Zh;                     @  s   d dl mZ d dlZd dlmZmZmZmZmZm	Z	m
Z
mZmZ er6d dlZd dlZd dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d	ZdddZdddZG dd deZdS )    )annotationsN)	TYPE_CHECKINGAnyCallableDictIterableListOptionalTupleType)ID	OneOrManyWhereWhereDocumentDocument)
Embeddings)xor_args)VectorStore   resultsr   returnList[Document]c                 C  s   dd t | D S )Nc                 S     g | ]\}}|qS  r   .0doc_r   r   ]/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/bagel.py
<listcomp>       z$_results_to_docs.<locals>.<listcomp>)_results_to_docs_and_scoresr   r   r   r   _results_to_docs   s   r$   List[Tuple[Document, float]]c                 C  s.   dd t | d d | d d | d d D S )Nc                 S  s,   g | ]}t |d  |d pi d|d fqS )r      )page_contentmetadata   r   )r   resultr   r   r   r    "   s    z/_results_to_docs_and_scores.<locals>.<listcomp>	documentsr   	metadatasZ	distances)zipr#   r   r   r   r"   !   s   


r"   c                	   @  s0  e Zd ZU dZdZded< edddddfd[ddZed\ddZe	d				d]d^d$d%Z
			d_d`d-d.Zedfdad1d2Zedfdbd4d5Zedddeddddfdcd:d;Zddd<d=Zedfded?d@ZedfdfdAdBZdgdDdEZeddedddfdhdGdHZdidLdMZ						djdkdWdXZdldmdYdZZdS )nBagela"  ``Bagel.net`` Inference platform.

    To use, you should have the ``bagelML`` python package installed.

    Example:
        .. code-block:: python

                from langchain_community.vectorstores import Bagel
                vectorstore = Bagel(cluster_name="langchain_store")
    Z	langchainstr_LANGCHAIN_DEFAULT_CLUSTER_NAMENcluster_nameclient_settingsOptional[bagel.config.Settings]embedding_functionOptional[Embeddings]cluster_metadataOptional[Dict]clientOptional[bagel.Client]relevance_score_fn"Optional[Callable[[float], float]]r   Nonec           	      C  s   z
ddl }ddl}W n ty   tdw |dur!|| _|| _n|r&|}n|jjddd}|| _||| _| jj||d| _	|| _
|| _dS )zInitialize with bagel clientr   N+Please install bagel `pip install bagelML`.restzapi.bageldb.ai)Zbagel_api_implZbagel_server_host)namer(   )bagelbagel.configImportError_client_settings_clientconfigZSettingsZClientZget_or_create_cluster_clusteroverride_relevance_score_fn_embedding_function)	selfr1   r2   r4   r6   r8   r:   r@   rC   r   r   r   __init__:   s.   

zBagel.__init__c                 C  s   | j S N)rH   rI   r   r   r   
embeddings^   s   zBagel.embeddings)query_textsquery_embeddings   rN   Optional[List[str]]rO   Optional[List[List[float]]]	n_resultsintwhereOptional[Dict[str, str]]kwargsr   r   c                 K  sj   zddl }W n ty   tdw | jr'|du r'|r't|}| j|}d}| jjd||||d|S )z9Query the Bagel cluster based on the provided parameters.r   Nr=   )rN   rO   rS   rU   r   )r@   rB   rH   listembed_documentsrF   find)rI   rN   rO   rS   rU   rW   r@   textsr   r   r   Z__query_clusterb   s"   
zBagel.__query_clusterr[   Iterable[str]r,   Optional[List[dict]]idsrM   	List[str]c                   s|  du rdd D t | jr du rr| j rtt }|r1i g|  g }g }tD ]\}	}
|
rE||	 q9||	 q9|rfdd|D fdd|D } rj fdd|D nd}fdd|D }| jj|||d |rfd	d|D } r fd
d|D nd}fdd|D }| jj|||d S i gt | jj d S )a  
        Add texts along with their corresponding embeddings and optional
        metadata to the Bagel cluster.

        Args:
            texts (Iterable[str]): Texts to be added.
            embeddings (Optional[List[float]]): List of embeddingvectors
            metadatas (Optional[List[dict]]): Optional list of metadatas.
            ids (Optional[List[str]]): List of unique ID for the texts.

        Returns:
            List[str]: List of unique ID representing the added texts.
        Nc                 S  s   g | ]}t t qS r   )r/   uuiduuid4)r   r   r   r   r   r       s    z#Bagel.add_texts.<locals>.<listcomp>c                      g | ]} | qS r   r   r   idx)r,   r   r   r       r!   c                   rb   r   r   rc   r[   r   r   r       r!   c                   rb   r   r   rc   rM   r   r   r       r!   c                   rb   r   r   rc   r^   r   r   r       r!   )rM   r,   r+   r^   c                   rb   r   r   r   jre   r   r   r       r!   c                   rb   r   r   rh   rf   r   r   r       r!   c                   rb   r   r   rh   rg   r   r   r       r!   )rM   r+   r^   )rM   r+   r,   r^   )rX   rH   rY   len	enumerateappendrF   Zupsert)rI   r[   r,   r^   rM   rW   Zlength_diffZ	empty_idsZnon_empty_idsrd   r(   Ztexts_with_metadatasZembeddings_with_metadatasZids_with_metadataZtexts_without_metadatasZembeddings_without_metadatasZids_without_metadatasr   )rM   r^   r,   r[   r   	add_texts~   s\   zBagel.add_textsquerykc                 K  s   | j |||d}dd |D S )a  
        Run a similarity search with Bagel.

        Args:
            query (str): The query text to search for similar documents/texts.
            k (int): The number of results to return.
            where (Optional[Dict[str, str]]): Metadata filters to narrow down.

        Returns:
            List[Document]: List of documents objects representing
            the documents most similar to the query text.
        )rU   c                 S  r   r   r   r   r   r   r   r       r!   z+Bagel.similarity_search.<locals>.<listcomp>)similarity_search_with_score)rI   rn   ro   rU   rW   Zdocs_and_scoresr   r   r   similarity_search   s   zBagel.similarity_searchr%   c                 K  s   | j |g||d}t|S )a  
        Run a similarity search with Bagel and return documents with their
        corresponding similarity scores.

        Args:
            query (str): The query text to search for similar documents.
            k (int): The number of results to return.
            where (Optional[Dict[str, str]]): Filter using metadata.

        Returns:
            List[Tuple[Document, float]]: List of tuples, each containing a
            Document object representing a similar document and its
            corresponding similarity score.

        )rN   rS   rU   _Bagel__query_clusterr"   )rI   rn   ro   rU   rW   r   r   r   r   rp      s   z"Bagel.similarity_search_with_scoreclsType[Bagel]	embeddingtext_embeddingsc
                 K  s0   | d|||||d|
}|j ||	||d}|S )a  
        Create and initialize a Bagel instance from list of texts.

        Args:
            texts (List[str]): List of text content to be added.
            cluster_name (str): The name of the Bagel cluster.
            client_settings (Optional[bagel.config.Settings]): Client settings.
            cluster_metadata (Optional[Dict]): Metadata of the cluster.
            embeddings (Optional[Embeddings]): List of embedding.
            metadatas (Optional[List[dict]]): List of metadata.
            ids (Optional[List[str]]): List of unique ID. Defaults to None.
            client (Optional[bagel.Client]): Bagel client instance.

        Returns:
            Bagel: Bagel vectorstore.
        )r1   r4   r2   r8   r6   )r[   rM   r,   r^   Nr   )rm   )rt   r[   rv   r,   r^   r1   r2   r6   r8   rw   rW   Zbagel_clusterr   r   r   r   
from_texts   s   zBagel.from_textsc                 C  s   | j | jj dS )zDelete the cluster.N)rD   delete_clusterrF   r?   rL   r   r   r   ry   !  s   zBagel.delete_clusterList[float]c                 K     | j |||d}t|S )zT
        Return docs most similar to embedding vector and similarity score.
        rO   rS   rU   rr   )rI   rO   ro   rU   rW   r   r   r   r   1similarity_search_by_vector_with_relevance_scores%  s   
z7Bagel.similarity_search_by_vector_with_relevance_scoresc                 K  r{   )z-Return docs most similar to embedding vector.r|   )rs   r$   )rI   rv   ro   rU   rW   r   r   r   r   similarity_search_by_vector4  s   z!Bagel.similarity_search_by_vectorCallable[[float], float]c                 C  sj   | j r| j S d}d}| jj}|r||v r|| }|dkr| jS |dkr&| jS |dkr-| jS td| d)z
        Select and return the appropriate relevance score function based
        on the distance metric used in the Bagel cluster.
        l2z
hnsw:spaceZcosineipzANo supported normalization function for distance metric of type: z=. Consider providing relevance_score_fn to Bagel constructor.)rG   rF   r(   Z_cosine_relevance_score_fnZ_euclidean_relevance_score_fnZ%_max_inner_product_relevance_score_fn
ValueError)rI   ZdistanceZdistance_keyr(   r   r   r   _select_relevance_score_fnA  s$   z Bagel._select_relevance_score_fnr+   c                 K  s>   dd |D }	dd |D }
| j d|	||
|||||d|S )a  
        Create a Bagel vectorstore from a list of documents.

        Args:
            documents (List[Document]): List of Document objects to add to the
                                        Bagel vectorstore.
            embedding (Optional[List[float]]): List of embedding.
            ids (Optional[List[str]]): List of IDs. Defaults to None.
            cluster_name (str): The name of the Bagel cluster.
            client_settings (Optional[bagel.config.Settings]): Client settings.
            client (Optional[bagel.Client]): Bagel client instance.
            cluster_metadata (Optional[Dict]): Metadata associated with the
                                               Bagel cluster. Defaults to None.

        Returns:
            Bagel: Bagel vectorstore.
        c                 S     g | ]}|j qS r   )r'   r   r   r   r   r   r    z      z(Bagel.from_documents.<locals>.<listcomp>c                 S  r   r   )r(   r   r   r   r   r    {  r   )r[   rv   r,   r^   r1   r2   r8   r6   Nr   )rx   )rt   r+   rv   r^   r1   r2   r8   r6   rW   r[   r,   r   r   r   from_documents]  s   	zBagel.from_documentsdocument_iddocumentr   c                 C  s(   |j }|j}| jj|g|g|gd dS )zUpdate a document in the cluster.

        Args:
            document_id (str): ID of the document to update.
            document (Document): Document to update.
        )r^   r+   r,   N)r'   r(   rF   update)rI   r   r   textr(   r   r   r   update_document  s   
zBagel.update_documentOptional[OneOrMany[ID]]Optional[Where]limitOptional[int]offsetwhere_documentOptional[WhereDocument]includeDict[str, Any]c                 C  s2   |||||d}|dur||d< | j jdi |S )zGets the collection.)r^   rU   r   r   r   Nr   r   )rF   get)rI   r^   rU   r   r   r   r   rW   r   r   r   r     s   z	Bagel.getc                 K  s   | j j|d dS )zW
        Delete by IDs.

        Args:
            ids: List of ids to delete.
        rg   N)rF   delete)rI   r^   rW   r   r   r   r     s   zBagel.delete)r1   r/   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r   r<   )r   r5   )NNrP   N)rN   rQ   rO   rR   rS   rT   rU   rV   rW   r   r   r   )NNN)r[   r\   r,   r]   r^   rQ   rM   rR   rW   r   r   r_   )
rn   r/   ro   rT   rU   rV   rW   r   r   r   )
rn   r/   ro   rT   rU   rV   rW   r   r   r%   )rt   ru   r[   r_   rv   r5   r,   r]   r^   rQ   r1   r/   r2   r3   r6   r7   r8   r9   rw   rR   rW   r   r   r.   )r   r<   )
rO   rz   ro   rT   rU   rV   rW   r   r   r%   )
rv   rz   ro   rT   rU   rV   rW   r   r   r   )r   r   )rt   ru   r+   r   rv   r5   r^   rQ   r1   r/   r2   r3   r8   r9   r6   r7   rW   r   r   r.   )r   r/   r   r   r   r<   )NNNNNN)r^   r   rU   r   r   r   r   r   r   r   r   rQ   r   r   rK   )r^   rQ   rW   r   r   r<   )__name__
__module____qualname____doc__r0   __annotations__rJ   propertyrM   r   rs   rm   	DEFAULT_Krq   rp   classmethodrx   ry   r}   r~   r   r   r   r   r   r   r   r   r   r.   ,   s~   
 $L
*

*r.   )r   r   r   r   )r   r   r   r%   ) 
__future__r   r`   typingr   r   r   r   r   r   r	   r
   r   r@   rA   Zbagel.api.typesr   r   r   r   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.utilsr   Zlangchain_core.vectorstoresr   r   r$   r"   r.   r   r   r   r   <module>   s    ,

