§
    šŠtj’;  ã                  óÒ   — 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      úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/bagel.pyú
<listcomp>z$_results_to_docs.<locals>.<listcomp>   s   € ÐCÐCÐC‘F�C˜ˆ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   € ð ð ð àõ 
˜v aœy°6¸!´9°?ÀÐ	CÑ	CÔ	CÀVÈAÄYÐ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ØˆLˆLˆLØÐÐÐÐøÝð 	Mð 	Mð 	MÝÐKÑLÔLÐLð	MøøøàÐØ$3ˆDÔ!Ø!ˆDŒLˆLàð Ø#2Ð Ð à#(¤<×#8Ò#8Ø#)Ø&6ð $9ñ $ô $Ð ð %5ˆDÔ!Ø'˜5œ<Ð(8Ñ9Ô9ˆDŒLàœ×:Ò:ØØ%ð ;ñ 
ô 
ˆŒð ,>ˆÔ(Ø#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ØˆLˆLˆLˆLøÝð 	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¨•3•t”z‘|”|Ñ$Ô$Ð4Ð4Ð4r#   c                ó    •— g | ]
}‰|         ‘ŒS r   r   )r   Úidxr0   s     €r!   r"   z#Bagel.add_texts.<locals>.<listcomp>¦   s   ø€ ÐEÐEÐE°˜Y sœ^ÐEÐEÐEr#   c                ó    •— g | ]
}‰|         ‘ŒS r   r   )r   ru   rj   s     €r!   r"   z#Bagel.add_texts.<locals>.<listcomp>§   s   ø€ Ð'LÐ'LÐ'L°s¨¨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Ð6 q�Z ”]Ð6Ð6Ð6r#   c                ó    •— g | ]
}‰|         ‘ŒS r   r   )r   rz   rn   s     €r!   r"   z#Bagel.add_texts.<locals>.<listcomp>·   s   ø€ Ð(CÐ(CÐ(C°A¨¨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Ð4¨eÐ4Ñ4Ô4ˆCå�U‘”ˆØÔ#ð 	I¨
Ð(:¸uÐ(:ØÔ1×AÒAÀ%ÑHÔHˆJØñ *	Ý˜e™*œ*¥s¨9¡~¤~Ñ5ˆKØð ;Ø%¨¨¨{Ñ(:Ñ:�	ØˆIØˆMÝ!*¨9Ñ!5Ô!5ð *ð *‘��XØð *Ø!×(Ò(¨Ñ-Ô-Ð-Ð-à×$Ò$ SÑ)Ô)Ð)Ð)Øð ØEÐEÐEÐE°}ÐEÑEÔE�	Ø'LÐ'LÐ'LÐ'L¸mÐ'LÑ'LÔ'LÐ$àBLÐVÐ>Ð>Ð>Ð>°Ð>Ñ>Ô>Ð>ÐRVð *ð %HÐ$GÐ$GÐ$G¸Ð$GÑ$GÔ$GÐ!Ø”×$Ò$Ø8Ø'Ø2Ø)ð	 %ñ ô ð ð ð 
Ø*GÐ*GÐ*GÐ*G¸YÐ*GÑ*GÔ*GÐ'à:DÐNÐ6Ð6Ð6Ð6¨IÐ6Ñ6Ô6Ð6È$ð -ð )DÐ(CÐ(CÐ(C¸Ð(CÑ(CÔ(CÐ%Ø”×$Ò$Ø;Ø5Ø-ð %ñ ô ð øð ˜�s 5™zœzÑ)ˆ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   € ð& ×;Ò;¸EÀ1ÈEÐ;Ñ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.   € ð, ×&Ò&°E°7ÀaÈuÐ&Ñ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   € ð< ˜ð 
Ø%Ø(Ø+ØØ-ð
ð 
ð ð
ð 
ˆð ×#Ò#Ø O¸yÈcð $ñ 
ô 
ˆð Ð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#   € àŒ×#Ò# D¤MÔ$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Ð7 c�Ô!Ð7Ð7Ð7r#   c                ó   — g | ]	}|j         ‘Œ
S r   )r,   r²   s     r!   r"   z(Bagel.from_documents.<locals>.<listcomp>{  s   € Ð7Ð7Ð7 c�S”\Ð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Ð7¨YÐ7Ñ7Ô7ˆØ7Ð7¨YÐ7Ñ7Ô7ˆ	ØˆsŒ~ð 

ØØØØØ%Ø+ØØ-ð

ð 

ð ð

ð 

ð 
	
r#   Údocument_idÚdocumentr   c                ób   — |j         }|j        }| j                             |g|g|g¬¦  «         dS )z«Update 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   € ð ØØØØ,ð
ð 
ˆð ÐØ 'ˆF�9Ñà ˆ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ð "6ðH ð(ð (ð (ñ „Xð(ð €XÐ1Ñ2Ô2ð ,0Ø8<ØØ*.ð
ð 
ð 
ð 
ñ 3Ô2ð
ð< +/Ø#'Ø26ðGð Gð Gð Gð GðX Ø*.ð	3ð 3ð 3ð 3ð 3ð2 Ø*.ð	4ð 4ð 4ð 4ð 4ð2 ð +/Ø*.Ø#'Ø;Ø;?Ø+/Ø)-Ø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Ø€L€L€LØÐÐÐØ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#   