
    dh;                        S SK Jr  S SKrS SKJrJrJrJrJrJ	r	J
r
JrJr  \(       a  S SKrS SKrS SKJrJrJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S	rSS
 jrSS jr " S S\5      rg)    )annotationsN)	TYPE_CHECKINGAnyCallableDictIterableListOptionalTupleType)ID	OneOrManyWhereWhereDocument)Document)
Embeddings)xor_args)VectorStore   c                L    [        U 5       VVs/ sH  u  pUPM	     snn$ s  snnf N)_results_to_docs_and_scores)resultsdoc_s      ^/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/vectorstores/bagel.py_results_to_docsr      s#    9'BCBFCCBCCCs    c                    [        U S   S   U S   S   U S   S   5       Vs/ sH!  n[        US   US   =(       d    0 S9US   4PM#     sn$ s  snf )N	documentsr   	metadatas	distances   )page_contentmetadata   )zipr   )r   results     r   r   r   !   su     K #K #K #

F 
vay6!9?	CVAYO
  s   'Ac            	      l   \ rS rSr% SrSrS\S'   \SSSSS4             SS jjr\SS j5       r	\
" S	5          S           SS
 jj5       r   S           SS jjr\S4         SS jjr\S4         SS jjr\SSS\SSSS4                       S S jj5       rS!S jr\S4         S"S jjr\S4         S#S jjrS$S jr\SS\SSS4                   S%S jj5       rS&S jr      S'             S(S jjrS)S*S jjrSrg)+Bagel,   a
  ``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_NAMENc                @    SSK nSSKnUb  X l        XPl        OAU(       a  UnOUR
                  R                  SSS9nXl        UR                  " U5      U l        U R                  R                  UUS9U l	        X`l
        X0l        g! [         a    [        S5      ef = f)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)	selfcluster_nameclient_settingsembedding_functioncluster_metadataclientrelevance_score_fnr4   r7   s	            r   __init__Bagel.__init__:   s    	M $3!!L#2 #(<<#8#8#)&6 $9 $  %5! <<(89DL::% ; 
 ,>(#5 +  	MKLL	Ms   B Bc                    U R                   $ r   )r?   r@   s    r   
embeddingsBagel.embeddings^   s    '''    )query_textsquery_embeddingsc                    SSK nU R                  (       a2  Uc/  U(       a(  [        U5      nU R                  R	                  U5      nSnU R
                  R                  " SUUUUS.UD6$ ! [         a    [        S5      ef = f)z9Query the Bagel cluster based on the provided parameters.r   Nr/   )rN   rO   	n_resultswhere )r4   r6   r?   listembed_documentsr=   find)r@   rN   rO   rQ   rR   kwargsr4   textss           r   __query_clusterBagel.__query_clusterb   s    	M ##(8(@[%E#77GGNK}}!! 
#-	

 
 	
  	MKLL	Ms   A* *B c                2   Uc-  U Vs/ sH!  n[        [        R                  " 5       5      PM#     nn[        U5      nU R                  (       a%  Uc"  U(       a  U R                  R                  U5      nU(       GaJ  [        U5      [        U5      -
  nU(       a	  U0 /U-  -   n/ n/ n	[        U5       H0  u  pU(       a  U	R                  U
5        M  UR                  U
5        M2     U	(       ar  U	 V
s/ sH  oU
   PM	     nn
U	 V
s/ sH  oU
   PM	     nn
U(       a  U	 V
s/ sH  oU
   PM	     sn
OSnU	 V
s/ sH  oU
   PM	     nn
U R                  R                  UUUUS9  U(       a^  U Vs/ sH  oU   PM	     nnU(       a  U Vs/ sH  oU   PM	     snOSnU Vs/ sH  oU   PM	     nnU R                  R                  UUUS9  U$ 0 /[        U5      -  nU R                  R                  UUUUS9  U$ s  snf s  sn
f s  sn
f s  sn
f s  sn
f s  snf s  snf s  snf )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.
N)rK   r    r   ids)rK   r   r\   )rK   r   r    r\   )r,   uuiduuid4rT   r?   rU   len	enumerateappendr=   upsert)r@   rX   r    r\   rK   rW   r   length_diff	empty_idsnon_empty_idsidxr$   texts_with_metadatasembeddings_with_metadatasids_with_metadatajtexts_without_metadatasembeddings_without_metadatasids_without_metadatass                      r   	add_textsBagel.add_texts~   s   , ;.34e3tzz|$eC4U##
(:u11AA%HJe*s9~5K%{(::	IM!*9!5!((-$$S)	 "6
 7DE}s^}	E>K'Lmsc
m$'LBL>_>RV * :G$G#X!$G$$8'2)	 %  =F*GY8Y'*G:DI6Iq]I6$ - :C(CAQ%(C$$;5- %  
 s5z)IMM  %#	 !  
a 5" F'L>$G +H6(Cs/   'G1/G6G;H 2H(H
HHc                Z    U R                  XUS9nU VVs/ sH  u  pgUPM	     snn$ s  snnf )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.
)rR   )similarity_search_with_score)r@   querykrR   rW   docs_and_scoresr   r   s           r   similarity_searchBagel.similarity_search   s3    & ;;EE;R"12//222s   'c                :    U R                  U/X#S9n[        U5      $ )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   rQ   rR   _Bagel__query_clusterr   )r@   rr   rs   rR   rW   r   s         r   rq   "Bagel.similarity_search_with_score   s&    , &&E7a&U*733rM   c
           	     B    U " SUUUUUS.U
D6nUR                  XX4S9nU$ )aU  
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.
)rA   rC   rB   rE   rD   )rX   rK   r    r\   rS   )rn   )clsrX   	embeddingr    r\   rA   rB   rD   rE   text_embeddingsrW   bagel_clusterr   s                r   
from_textsBagel.from_texts   sP    <  
%(+-
 
 ##y $ 
 rM   c                b    U R                   R                  U R                  R                  5        g)zDelete the cluster.N)r8   delete_clusterr=   r3   rJ   s    r   r   Bagel.delete_cluster!  s    ##DMM$6$67rM   c                8    U R                  XUS9n[        U5      $ )zD
Return docs most similar to embedding vector and similarity score.
rO   rQ   rR   rx   )r@   rO   rs   rR   rW   r   s         r   1similarity_search_by_vector_with_relevance_scores7Bagel.similarity_search_by_vector_with_relevance_scores%  s+     &&-% ' 
 +733rM   c                8    U R                  XUS9n[        U5      $ )z-Return docs most similar to embedding vector.r   )ry   r   )r@   r}   rs   rR   rW   r   s         r   similarity_search_by_vector!Bagel.similarity_search_by_vector4  s+     &&&5 ' 
  ((rM   c                   U R                   (       a  U R                   $ SnSnU R                  R                  nU(       a	  X#;   a  X2   nUS:X  a  U R                  $ US:X  a  U R                  $ US:X  a  U R
                  $ [        SU S35      e)zt
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.)r>   r=   r$   _cosine_relevance_score_fn_euclidean_relevance_score_fn%_max_inner_product_relevance_score_fn
ValueError)r@   distancedistance_keyr$   s       r   _select_relevance_score_fn Bagel._select_relevance_score_fnA  s    
 ++333#==))0-Hx222555===$$,: .<< rM   c                    U V	s/ sH  oR                   PM     n
n	U V	s/ sH  oR                  PM     nn	U R                  " SU
UUUUUUUS.UD6$ s  sn	f s  sn	f )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.
)rX   r}   r    r\   rA   rB   rE   rD   rS   )r#   r$   r   )r|   r   r}   r\   rA   rB   rE   rD   rW   r   rX   r    s               r   from_documentsBagel.from_documents]  sr    : .77Yc!!Y7-67Yc\\Y	7~~ 

%+-

 

 
	
 87s
   AAc                p    UR                   nUR                  nU R                  R                  U/U/U/S9  g)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$   r=   update)r@   document_iddocumenttextr$   s        r   update_documentBagel.update_document  s@     $$$$fj 	 	
rM   c                X    UUUUUS.nUb  XgS'   U R                   R                  " S0 UD6$ )zGets the collection.)r\   rR   limitoffsetwhere_documentincluderS   )r=   get)r@   r\   rR   r   r   r   r   rW   s           r   r   	Bagel.get  sB     ,
  '9}}  *6**rM   c                6    U R                   R                  US9  g)z7
Delete by IDs.

Args:
    ids: List of ids to delete.
)r\   N)r=   delete)r@   r\   rW   s      r   r   Bagel.delete  s     	%rM   )r8   r7   r=   r?   r>   )rA   r,   rB   Optional[bagel.config.Settings]rC   Optional[Embeddings]rD   Optional[Dict]rE   Optional[bagel.Client]rF   z"Optional[Callable[[float], float]]returnNone)r   r   )NN   N)rN   Optional[List[str]]rO   Optional[List[List[float]]]rQ   intrR   Optional[Dict[str, str]]rW   r   r   List[Document])NNN)rX   zIterable[str]r    Optional[List[dict]]r\   r   rK   r   rW   r   r   	List[str])
rr   r,   rs   r   rR   r   rW   r   r   r   )
rr   r,   rs   r   rR   r   rW   r   r   List[Tuple[Document, float]])r|   Type[Bagel]rX   r   r}   r   r    r   r\   r   rA   r,   rB   r   rD   r   rE   r   r~   r   rW   r   r   r)   )r   r   )
rO   List[float]rs   r   rR   r   rW   r   r   r   )
r}   r   rs   r   rR   r   rW   r   r   r   )r   zCallable[[float], float])r|   r   r   r   r}   r   r\   r   rA   r,   rB   r   rE   r   rD   r   rW   r   r   r)   )r   r,   r   r   r   r   )NNNNNN)r\   zOptional[OneOrMany[ID]]rR   zOptional[Where]r   Optional[int]r   r   r   zOptional[WhereDocument]r   r   r   zDict[str, Any]r   )r\   r   rW   r   r   r   )__name__
__module____qualname____firstlineno____doc__r-   __annotations__rG   propertyrK   r   ry   rn   	DEFAULT_Kru   rq   classmethodr   r   r   r   r   r   r   r   r   __static_attributes__rS   rM   r   r)   r)   ,   s   	 ,7#S6 <;?37+/)-AE"6"6 9"6 1	"6
 )"6 '"6 ?"6 
"6H ( ( 12 ,08<*.
(
 6
 	

 (
 
 

 3
< +/#'26GG (G !	G
 0G G 
GX *.	33 3 (	3
 3 
32 *.	44 4 (	4
 4 
&42  +/*.#';;?+/)-7;((( (( (	(
 !( ( 9( )( '( 5( ( 
( (T8 *.	4%4 4 (	4
 4 
&4$ *.	)) ) (	)
 ) 
)8  +/#';;?)-+/(
(
!(
 ((
 !	(

 (
 9(
 '(
 )(
 (
 
(
 (
T
" (,!%# $26'++$+ + 	+
 + 0+ %+ 
+.& &rM   r)   )r   r   r   r   )r   r   r   r   ) 
__future__r   r]   typingr   r   r   r   r   r	   r
   r   r   r4   r5   bagel.api.typesr   r   r   r   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   r   r   r   r)   rS   rM   r   <module>r      sU    " 
 
 
 CC - 0 ) 3	DI&K I&rM   