
    Ng;                        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rd 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ZddZ G 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                4    d t          |           D             S )Nc                    g | ]\  }}|S  r   .0doc_s      b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/bagel.py
<listcomp>z$_results_to_docs.<locals>.<listcomp>   s    CCCFCCCCC    )_results_to_docs_and_scoresr   s    r!   _results_to_docsr&      s    CC9'BBCCCCr#   List[Tuple[Document, float]]c                    d t          | d         d         | d         d         | d         d                   D             S )Nc                \    g | ])}t          |d          |d         pi           |d         f*S )r      )page_contentmetadata   r   )r   results     r!   r"   z/_results_to_docs_and_scores.<locals>.<listcomp>"   sJ        
vay6!9?	C	C	CVAYO  r#   	documentsr   	metadatas	distances)zipr%   s    r!   r$   r$   !   sT     K #K #K #
 
   r#   c            	      T   e Zd ZU dZdZded<   edddddfdLdZedMd            Z e	d          	 	 	 	 dNdOd"            Z
	 	 	 dPdQd*ZedfdRd-ZedfdSd/ZedddeddddfdTd4            ZdUd5ZedfdVd7ZedfdWd8ZdXd:ZeddedddfdYd<            ZdZd@Z	 	 	 	 	 	 d[d\dJZd]d^dKZdS )_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")
    	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                N   	 ddl }ddl}n# t          $ r t          d          w xY w||| _        || _        n=|r|}n|j                            dd          }|| _         |j        |          | _        | j                            ||          | _	        || _
        || _        dS )zInitialize with bagel clientr   N+Please install bagel `pip install bagelML`.restzapi.bageldb.ai)bagel_api_implbagel_server_host)namer,   )bagelbagel.configImportError_client_settings_clientconfigSettingsClientget_or_create_cluster_clusteroverride_relevance_score_fn_embedding_function)	selfr8   r9   r;   r=   r?   rA   rJ   rM   s	            r!   __init__zBagel.__init__:   s    	MLLL 	M 	M 	MKLLL	M$3D!!DLL #2  #(<#8#8#)&6 $9 $ $  %5D!'5<(899DL::% ; 
 
 ,>(#5   s    %c                    | j         S N)rU   rV   s    r!   
embeddingszBagel.embeddings^   s    ''r#   )query_textsquery_embeddings   r\   Optional[List[str]]r]   Optional[List[List[float]]]	n_resultsintwhereOptional[Dict[str, str]]kwargsr   r   c                    	 ddl }n# t          $ r t          d          w xY w| j        r/|-|r+t          |          }| j                            |          }d} | j        j        d||||d|S )z9Query the Bagel cluster based on the provided parameters.r   NrE   )r\   r]   ra   rc   r   )rJ   rL   rU   listembed_documentsrS   find)rV   r\   r]   ra   rc   re   rJ   textss           r!   __query_clusterzBagel.__query_clusterb   s    	MLLLL 	M 	M 	MKLLL	M # 	(8(@[(@%%E#7GGNNK!t}! 
#-	
 

 
 
 	
s    !rj   Iterable[str]r0   Optional[List[dict]]idsr[   	List[str]c                .   d D             t                    | j        rr| j                                      rt                    t                    z
  }|r	i g|z  z   g }g }t	                    D ]2\  }	}
|
r|                    |	           |                    |	           3|rZfd|D             fd|D             }rfd|D             nd}fd|D             }| j                            |||           |rKfd|D             }rfd	|D             nd}fd
|D             }| j                            |||           n1i gt                    z  | j                                       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                N    g | ]"}t          t          j                              #S r   )r6   uuiduuid4)r   r    s     r!   r"   z#Bagel.add_texts.<locals>.<listcomp>   s&    4443tz||$$444r#   c                     g | ]
}|         S r   r   )r   idxr0   s     r!   r"   z#Bagel.add_texts.<locals>.<listcomp>   s    EEEYs^EEEr#   c                     g | ]
}|         S r   r   )r   ru   rj   s     r!   r"   z#Bagel.add_texts.<locals>.<listcomp>   s    'L'L'Lsc
'L'L'Lr#   c                     g | ]
}|         S r   r   )r   ru   r[   s     r!   r"   z#Bagel.add_texts.<locals>.<listcomp>   s    >>>Z_>>>r#   c                     g | ]
}|         S r   r   )r   ru   rn   s     r!   r"   z#Bagel.add_texts.<locals>.<listcomp>   s    $G$G$G#SX$G$G$Gr#   )r[   r0   r/   rn   c                     g | ]
}|         S r   r   )r   jrj   s     r!   r"   z#Bagel.add_texts.<locals>.<listcomp>   s    *G*G*G58*G*G*Gr#   c                     g | ]
}|         S r   r   )r   rz   r[   s     r!   r"   z#Bagel.add_texts.<locals>.<listcomp>   s    666qZ]666r#   c                     g | ]
}|         S r   r   )r   rz   rn   s     r!   r"   z#Bagel.add_texts.<locals>.<listcomp>   s    (C(C(CAQ(C(C(Cr#   )r[   r/   rn   )r[   r/   r0   rn   )rg   rU   rh   len	enumerateappendrS   upsert)rV   rj   r0   rn   r[   re   length_diff	empty_idsnon_empty_idsru   r,   texts_with_metadatasembeddings_with_metadatasids_with_metadatatexts_without_metadatasembeddings_without_metadatasids_without_metadatass    ````            r!   	add_textszBagel.add_texts~   sk   , ;44e444CU# 	I
(:u(:1AA%HHJ *	e**s9~~5K ;%{(::	IM!*9!5!5 * *X *!((----$$S)))) EEEE}EEE	'L'L'L'Lm'L'L'L$BLV>>>>>>>>RV * %H$G$G$G$G$G$G!$$8'2)	 %     
*G*G*G*GY*G*G*G':DN6666I6666$ - )D(C(C(C(C(C(C%$$;5- %    s5zz)IM  %#	 !    
r#   querykc                J    |                      |||          }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.
        )rc   c                    g | ]\  }}|S r   r   r   s      r!   r"   z+Bagel.similarity_search.<locals>.<listcomp>   s    222Q222r#   )similarity_search_with_score)rV   r   r   rc   re   docs_and_scoress         r!   similarity_searchzBagel.similarity_search   s2    & ;;E1E;RR22/2222r#   r'   c                R    |                      |g||          }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.

        )r\   ra   rc   _Bagel__query_clusterr$   )rV   r   r   rc   re   r   s         r!   r   z"Bagel.similarity_search_with_score   s.    , &&E7au&UU*7333r#   clsType[Bagel]	embeddingtext_embeddingsc
           	     T     | d|||||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.
        )r8   r;   r9   r?   r=   )rj   r[   r0   rn   r   )r   )r   rj   r   r0   rn   r8   r9   r=   r?   r   re   bagel_clusterr    s                r!   
from_textszBagel.from_texts   se    <  
%(+-
 
 
 
 ##Oyc $ 
 
 r#   c                N    | j                             | j        j                   dS )zDelete the cluster.N)rN   delete_clusterrS   rI   rZ   s    r!   r   zBagel.delete_cluster!  s#    ##DM$677777r#   List[float]c                P    |                      |||          }t          |          S )zT
        Return docs most similar to embedding vector and similarity score.
        r]   ra   rc   r   )rV   r]   r   rc   re   r   s         r!   1similarity_search_by_vector_with_relevance_scoresz7Bagel.similarity_search_by_vector_with_relevance_scores%  s5     &&-% ' 
 
 +7333r#   c                P    |                      |||          }t          |          S )z-Return docs most similar to embedding vector.r   )r   r&   )rV   r   r   rc   re   r   s         r!   similarity_search_by_vectorz!Bagel.similarity_search_by_vector4  s5     &&&!5 ' 
 
  (((r#   Callable[[float], float]c                    | 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:spacecosineipzANo supported normalization function for distance metric of type: z=. Consider providing relevance_score_fn to Bagel constructor.)rT   rS   r,   _cosine_relevance_score_fn_euclidean_relevance_score_fn%_max_inner_product_relevance_score_fn
ValueError)rV   distancedistance_keyr,   s       r!   _select_relevance_score_fnz Bagel._select_relevance_score_fnA  s    
 + 	433#=) 	.00-Hx2255==<$,< < <  r#   r/   c                ^    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                    g | ]	}|j         
S r   )r+   r   r   s     r!   r"   z(Bagel.from_documents.<locals>.<listcomp>z  s    777c!777r#   c                    g | ]	}|j         
S r   )r,   r   s     r!   r"   z(Bagel.from_documents.<locals>.<listcomp>{  s    777cS\777r#   )rj   r   r0   rn   r8   r9   r?   r=   r   )r   )r   r/   r   rn   r8   r9   r?   r=   re   rj   r0   s              r!   from_documentszBagel.from_documents]  sl    : 87Y77777Y777	s~ 

%+-

 

 

 

 
	
r#   document_iddocumentr   c                b    |j         }|j        }| j                            |g|g|g           dS )zUpdate a document in the cluster.

        Args:
            document_id (str): ID of the document to update.
            document (Document): Document to update.
        )rn   r/   r0   N)r+   r,   rS   update)rV   r   r   textr,   s        r!   update_documentzBagel.update_document  sL     $$fj 	 	
 	
 	
 	
 	
r#   Optional[OneOrMany[ID]]Optional[Where]limitOptional[int]offsetwhere_documentOptional[WhereDocument]includeDict[str, Any]c                D    |||||d}|||d<    | j         j        di |S )zGets the collection.)rn   rc   r   r   r   Nr   r   )rS   get)rV   rn   rc   r   r   r   r   re   s           r!   r   z	Bagel.get  sL     ,
 
  'F9 t} **6***r#   c                <    | j                             |           dS )zW
        Delete by IDs.

        Args:
            ids: List of ids to delete.
        )rn   N)rS   delete)rV   rn   re   s      r!   r   zBagel.delete  s#     	%%%%%r#   )r8   r6   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   r   rC   )r   r<   )NNr^   N)r\   r_   r]   r`   ra   rb   rc   rd   re   r   r   r   )NNN)rj   rl   r0   rm   rn   r_   r[   r`   re   r   r   ro   )
r   r6   r   rb   rc   rd   re   r   r   r   )
r   r6   r   rb   rc   rd   re   r   r   r'   )r   r   rj   ro   r   r<   r0   rm   rn   r_   r8   r6   r9   r:   r=   r>   r?   r@   r   r`   re   r   r   r4   )r   rC   )
r]   r   r   rb   rc   rd   re   r   r   r'   )
r   r   r   rb   rc   rd   re   r   r   r   )r   r   )r   r   r/   r   r   r<   rn   r_   r8   r6   r9   r:   r?   r@   r=   r>   re   r   r   r4   )r   r6   r   r   r   rC   )NNNNNN)rn   r   rc   r   r   r   r   r   r   r   r   r_   r   r   rY   )rn   r_   re   r   r   rC   )__name__
__module____qualname____doc__r7   __annotations__rW   propertyr[   r   r   r   	DEFAULT_Kr   r   classmethodr   r   r   r   r   r   r   r   r   r   r#   r!   r4   r4   ,   sk        	 	 ,7#6666 <;?37+/)-AE"6 "6 "6 "6 "6H ( ( ( X( X122 ,08<*.
 
 
 
 32
< +/#'26G G G G GX *.	3 3 3 3 32 *.	4 4 4 4 42  +/*.#';;?+/)-7;( ( ( ( [(T8 8 8 8 *.	4 4 4 4 4$ *.	) ) ) ) )   8  +/#';;?)-+/(
 (
 (
 (
 [(
T
 
 
 
" (,!%# $26'++ + + + +.& & & & & & &r#   r4   )r   r   r   r   )r   r   r   r'   ) 
__future__r   rr   typingr   r   r   r   r   r	   r
   r   r   rJ   rK   bagel.api.typesr   r   r   r   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   r   r&   r$   r4   r   r#   r!   <module>r      s   " " " " " " 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  DLLLCCCCCCCCCCCC - - - - - - 0 0 0 0 0 0 ) ) ) ) ) ) 3 3 3 3 3 3	D D D D   I& I& I& I& I&K I& I& I& I& I&r#   