a
    bg;                     @  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rld 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ddZd
d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   r   List[Document])resultsreturnc                 C  s   dd t | D S )Nc                 S  s   g | ]\}}|qS  r   .0doc_r   r   t/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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                   @  s  e Zd ZU dZdZded< edddddfddddd	d
ddddZeddddZe	ddKdddddddddZ
dLddddddd d!d"Zedfdddddd#d$d%Zedfddddd&d#d'd(Zedddeddddfd)dddddddd	ddd d*d+d,Zddd-d.Zedfd/dddd&d0d1d2Zedfd/ddddd3d4d5Zd6dd7d8Zeddedddfd)dddddd	ddd d9
d:d;Zdd<dd=d>d?ZdMd@dAdBdBdCddDdEdFdGZdNddddHdIdJZdS )O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_NAMENzOptional[bagel.config.Settings]zOptional[Embeddings]zOptional[Dict]zOptional[bagel.Client]z"Optional[Callable[[float], float]]None)cluster_nameclient_settingsembedding_functioncluster_metadataclientrelevance_score_fnr   c           	      C  s   zddl }ddl}W n ty.   tdY n0 |durF|| _|| _n,|rP|}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   r3   r4   r5   r6   r:   r=   r   r   r   __init__:   s,    
zBagel.__init__)r   c                 C  s   | j S )N)rB   rC   r   r   r   
embeddings^   s    zBagel.embeddings)query_textsquery_embeddings   zOptional[List[str]]zOptional[List[List[float]]]intzOptional[Dict[str, str]]r   r   )rG   rH   	n_resultswherekwargsr   c                 K  sn   zddl }W n ty&   tdY n0 | jrR|du rR|rRt|}| j|}d}| jjf ||||d|S )z9Query the Bagel cluster based on the provided parameters.r   Nr7   )rG   rH   rK   rL   )r:   r<   rB   listembed_documentsr@   find)rC   rG   rH   rK   rL   rM   r:   textsr   r   r   Z__query_clusterb   s     
zBagel.__query_clusterzIterable[str]zOptional[List[dict]]z	List[str])rQ   r+   idsrF   rM   r   c                   s  du rdd D t | jr< du r<r<| j r\tt }|rdi g|  g }g }tD ]"\}	}
|
r||	 qt||	 qt|rfdd|D fdd|D } r؇ fdd|D nd}fdd|D }| jj|||d |r~fd	d|D } r2 fd
d|D nd}fdd|D }| jj|||d n"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      r    z#Bagel.add_texts.<locals>.<listcomp>c                   s   g | ]} | qS r   r   r   idx)r+   r   r   r      r    c                   s   g | ]} | qS r   r   rU   rQ   r   r   r      r    c                   s   g | ]} | qS r   r   rU   rF   r   r   r      r    c                   s   g | ]} | qS r   r   rU   rR   r   r   r      r    )rF   r+   r*   rR   c                   s   g | ]} | qS r   r   r   jrW   r   r   r      r    c                   s   g | ]} | qS r   r   rZ   rX   r   r   r      r    c                   s   g | ]} | qS r   r   rZ   rY   r   r   r      r    )rF   r*   rR   )rF   r*   r+   rR   )rN   rB   rO   len	enumerateappendr@   Zupsert)rC   rQ   r+   rR   rF   rM   Zlength_diffZ	empty_idsZnon_empty_idsrV   r'   Ztexts_with_metadatasZembeddings_with_metadatasZids_with_metadataZtexts_without_metadatasZembeddings_without_metadatasZids_without_metadatasr   )rF   rR   r+   rQ   r   	add_texts~   sZ    zBagel.add_texts)querykrL   rM   r   c                 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.
        )rL   c                 S  s   g | ]\}}|qS r   r   r   r   r   r   r      r    z+Bagel.similarity_search.<locals>.<listcomp>)similarity_search_with_score)rC   r`   ra   rL   rM   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.

        )rG   rK   rL   _Bagel__query_clusterr!   )rC   r`   ra   rL   rM   r   r   r   r   rb      s    z"Bagel.similarity_search_with_scorezType[Bagel])clsrQ   	embeddingr+   rR   r1   r2   r4   r5   text_embeddingsrM   r   c
                 K  s0   | f |||||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   r3   r2   r5   r4   )rQ   rF   r+   rR   )r_   )rf   rQ   rg   r+   rR   r1   r2   r4   r5   rh   rM   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)r>   delete_clusterr@   r9   rE   r   r   r   rj   !  s    zBagel.delete_clusterzList[float])rH   ra   rL   rM   r   c                 K  s   | j |||d}t|S )zT
        Return docs most similar to embedding vector and similarity score.
        rH   rK   rL   rd   )rC   rH   ra   rL   rM   r   r   r   r   1similarity_search_by_vector_with_relevance_scores%  s    
z7Bagel.similarity_search_by_vector_with_relevance_scores)rg   ra   rL   rM   r   c                 K  s   | j |||d}t|S )z-Return docs most similar to embedding vector.rk   )re   r#   )rC   rg   ra   rL   rM   r   r   r   r   similarity_search_by_vector4  s    z!Bagel.similarity_search_by_vectorzCallable[[float], float]c                 C  sn   | j r| j S d}d}| jj}|r0||v r0|| }|dkr>| jS |dkrL| jS |dkrZ| jS td| ddS )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.N)rA   r@   r'   Z_cosine_relevance_score_fnZ_euclidean_relevance_score_fnZ%_max_inner_product_relevance_score_fn
ValueError)rC   ZdistanceZdistance_keyr'   r   r   r   _select_relevance_score_fnA  s$    z Bagel._select_relevance_score_fn)
rf   r*   rg   rR   r1   r2   r5   r4   rM   r   c                 K  s>   dd |D }	dd |D }
| j f |	||
|||||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  s   g | ]
}|j qS r   )r&   r   r   r   r   r   r   z  r    z(Bagel.from_documents.<locals>.<listcomp>c                 S  s   g | ]
}|j qS r   )r'   rr   r   r   r   r   {  r    )rQ   rg   r+   rR   r1   r2   r5   r4   )ri   )rf   r*   rg   rR   r1   r2   r5   r4   rM   rQ   r+   r   r   r   from_documents]  s    	zBagel.from_documentsr   )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.
        )rR   r*   r+   N)r&   r'   r@   update)rC   rt   ru   textr'   r   r   r   update_document  s    zBagel.update_documentzOptional[OneOrMany[ID]]zOptional[Where]zOptional[int]zOptional[WhereDocument]zDict[str, Any])rR   rL   limitoffsetwhere_documentincluder   c                 C  s2   |||||d}|dur ||d< | j jf i |S )zGets the collection.)rR   rL   ry   rz   r{   Nr|   )r@   get)rC   rR   rL   ry   rz   r{   r|   rM   r   r   r   r}     s    z	Bagel.get)rR   rM   r   c                 K  s   | j j|d dS )zW
        Delete by IDs.

        Args:
            ids: List of ids to delete.
        rY   N)r@   delete)rC   rR   rM   r   r   r   r~     s    zBagel.delete)NNrI   N)NNN)NNNNNN)N)__name__
__module____qualname____doc__r/   __annotations__rD   propertyrF   r   re   r_   	DEFAULT_Krc   rb   classmethodri   rj   rl   rm   rq   rs   rx   r}   r~   r   r   r   r   r-   ,   s|   
$       L(*$*      r-   ) 
__future__r   rS   typingr   r   r   r   r   r   r	   r
   r   r:   r;   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   ,