Ë
    µŒjÈ;  ã                  óÊ   — d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlZd dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ  ej2                  e«      Z G d„ de«      Zy)é    )ÚannotationsN)Údeepcopy)ÚEnum)ÚAnyÚIterableÚListÚOptionalÚTuple)ÚDocument)Ú
Embeddings)Úrun_in_executor)ÚVectorStore)Úmaximal_marginal_relevancec                  ó:  — e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zedd„«       Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Ze	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Z	 G d„ de
«      Zd	ej                  df	 	 	 	 	 	 	 	 	 	 	 dd
„Zd	ej                  df	 	 	 	 	 	 	 	 	 	 	 dd„Zd	ej                  df	 	 	 	 	 	 	 	 	 	 	 dd„Zd	ej                  df	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 d ddœ	 	 	 	 	 	 	 	 	 	 	 	 	 d!d„Z	 	 	 d"	 	 	 	 	 	 	 	 	 	 	 d#d„Zd$d„Zd%d„Zd&d'd„Z	 d&	 	 	 	 	 d'd„Zy)(ÚRocksetaž  `Rockset` vector store.

    To use, you should have the `rockset` python package installed. Note that to use
    this, the collection being used must already exist in your Rockset instance.
    You must also ensure you use a Rockset ingest transformation to apply
    `VECTOR_ENFORCE` on the column being used to store `embedding_key` in the
    collection.
    See: https://rockset.com/blog/introducing-vector-search-on-rockset/ for more details

    Everything below assumes `commons` Rockset workspace.

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import Rockset
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            import rockset

            # Make sure you use the right host (region) for your Rockset instance
            # and APIKEY has both read-write access to your collection.

            rs = rockset.RocksetClient(host=rockset.Regions.use1a1, api_key="***")
            collection_name = "langchain_demo"
            embeddings = OpenAIEmbeddings()
            vectorstore = Rockset(rs, collection_name, embeddings,
                "description", "description_embedding")

    c                ó2  — 	 ddl m} t        ||«      st	        dt        |«      › �«      ‚|| _        || _        || _        || _	        || _
        || _        	 | j                  j                  d«       y# t        $ r t        d«      ‚w xY w# t        $ r Y yw xY w)aN  Initialize with Rockset client.
        Args:
            client: Rockset client object
            collection: Rockset collection to insert docs / query
            embeddings: Langchain Embeddings object to use to generate
                        embedding for given text.
            text_key: column in Rockset collection to use to store the text
            embedding_key: column in Rockset collection to use to store the embedding.
                           Note: We must apply `VECTOR_ENFORCE()` on this column via
                           Rockset ingest transformation.

        r   )ÚRocksetClientú]Could not import rockset client python package. Please install it with `pip install rockset`.z;client should be an instance of rockset.RocksetClient, got Ú	langchainN)Úrocksetr   ÚImportErrorÚ
isinstanceÚ
ValueErrorÚtypeÚ_clientÚ_collection_nameÚ_embeddingsÚ	_text_keyÚ_embedding_keyÚ
_workspaceÚset_applicationÚAttributeError)ÚselfÚclientÚ
embeddingsÚcollection_nameÚtext_keyÚembedding_keyÚ	workspacer   s           út/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/vectorstores/rocksetdb.pyÚ__init__zRockset.__init__1   s³   € ð*	Ý-ô ˜& -Ô0ÜðÜ˜F“|�nð&óð ð
 ˆŒØ /ˆÔØ%ˆÔØ!ˆŒØ+ˆÔØ#ˆŒð	Ø�L‰L×(Ñ(¨Õ5øô) ò 	Üð@óð ð	ûô* ò 	áð	ús   ‚A2 ÁB
 Á2BÂ
	BÂBc                ó   — | j                   S ©N)r   ©r#   s    r*   r%   zRockset.embeddingsa   s   € à×ÑÐó    Nc                óÄ  — g }g }t        |«      D ]©  \  }}	t        |«      |k(  r|| j                  |«      z  }g }i }
|rt        |«      |kD  rt        ||   «      }
|rt        |«      |kD  r||   |
d<   |	|
| j                  <   | j
                  j                  |	«      |
| j                  <   |j                  |
«       Œ« t        |«      dkD  r|| j                  |«      z  }g }|S )aÇ  Run more texts through the embeddings and add to the vectorstore

                Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of ids to associate with the texts.
            batch_size: Send documents in batches to rockset.

        Returns:
            List of ids from adding the texts into the vectorstore.

        Ú_idr   )	Ú	enumerateÚlenÚ_write_documents_to_rocksetr   r   r   Úembed_queryr   Úappend)r#   ÚtextsÚ	metadatasÚidsÚ
batch_sizeÚkwargsÚbatchÚ
stored_idsÚiÚtextÚdocs              r*   Ú	add_textszRockset.add_textse   sê   € ð( ˆØˆ
ä  Ö'‰GˆAˆtÜ�5‹z˜ZÒ'Ø˜d×>Ñ>¸uÓEÑE�
Ø�ØˆCÙœS ›^¨aÒ/Ü˜y¨™|Ó,�Ù”s˜3“x !’|Ø  ™V��E‘
Ø"&ˆC�—‘ÑØ'+×'7Ñ'7×'CÑ'CÀDÓ'IˆC�×#Ñ#Ñ$Ø�L‰L˜Õð (ô ˆu‹:˜Š>Ø˜$×:Ñ:¸5ÓAÑAˆJØˆEØÐr/   c
                óŽ   — |€J d«       ‚|sJ d«       ‚|sJ d«       ‚|sJ d«       ‚ | |||||«      }|j                  ||||	«       |S )znCreate Rockset wrapper with existing texts.
        This is intended as a quicker way to get started.
        zRockset Client cannot be NonezCollection name cannot be emptyzText key name cannot be emptyzEmbedding key cannot be empty)rA   )Úclsr7   Ú	embeddingr8   r$   r&   r'   r(   r9   r:   r;   r   s               r*   Ú
from_textszRockset.from_texts�   sk   € ð& Ð!ÐBÐ#BÓBÐ!ÙÐAÐ AÓAˆÙÐ8Ð8Ó8ˆxÙÐ=Ð=Ó=ˆ}á�f˜i¨¸(ÀMÓRˆØ×Ñ˜% ¨C°Ô<Øˆr/   c                  ó    — e Zd ZdZdZdZdd„Zy)úRockset.DistanceFunctionÚ
COSINE_SIMÚEUCLIDEAN_DISTÚDOT_PRODUCTc                ó$   — | j                   dk(  ryy)NrI   ÚASCÚDESC)Úvaluer.   s    r*   Úorder_byz!Rockset.DistanceFunction.order_by°   s   € Ø�z‰zÐ-Ò-ØØr/   N)ÚreturnÚstr)Ú__name__Ú
__module__Ú__qualname__rH   rI   rJ   rO   © r/   r*   ÚDistanceFunctionrG   ª   s   „ Ø!ˆ
Ø)ˆØ#ˆô	r/   rV   é   c                ó`   —  | j                   | j                  j                  |«      |||fi |¤ŽS )aã  Perform a similarity search with Rockset

        Args:
            query (str): Text to look up documents similar to.
            distance_func (DistanceFunction): how to compute distance between two
                vectors in Rockset.
            k (int, optional): Top K neighbors to retrieve. Defaults to 4.
            where_str (Optional[str], optional): Metadata filters supplied as a
                SQL `where` condition string. Defaults to None.
                eg. "price<=70.0 AND brand='Nintendo'"

            NOTE: Please do not let end-user to fill this and always be aware
                  of SQL injection.

        Returns:
            List[Tuple[Document, float]]: List of documents with their relevance score
        )Ú1similarity_search_by_vector_with_relevance_scoresr   r5   ©r#   ÚqueryÚkÚdistance_funcÚ	where_strr;   s         r*   Ú'similarity_search_with_relevance_scoresz/Rockset.similarity_search_with_relevance_scoresµ   sA   € ð2 Fˆt×EÑEØ×Ñ×(Ñ(¨Ó/ØØØñ	
ð
 ñ
ð 	
r/   c                ó`   —  | j                   | j                  j                  |«      |||fi |¤ŽS )zaSame as `similarity_search_with_relevance_scores` but
        doesn't return the scores.
        )Úsimilarity_search_by_vectorr   r5   rZ   s         r*   Úsimilarity_searchzRockset.similarity_searchÖ   s@   € ð 0ˆt×/Ñ/Ø×Ñ×(Ñ(¨Ó/ØØØñ	
ð
 ñ
ð 	
r/   c                ód   —  | j                   ||||fi |¤Ž}|D ��cg c]  \  }}|‘Œ	 c}}S c c}}w )zZAccepts a query_embedding (vector), and returns documents with
        similar embeddings.)rY   )	r#   rD   r\   r]   r^   r;   Údocs_and_scoresr@   Ú_s	            r*   ra   z#Rockset.similarity_search_by_vectoré   sF   € ð Q˜$×PÑPØ�q˜-¨ñ
Ø6<ñ
ˆñ #2Ô2¡/™˜˜Q’ /Ò2Ð2ùÓ2s   œ,c           	     ó  — d}d|v r|d   }| j                  |||||«      }	 | j                  j                  j                  d|i¬«      }g }
|j                  D ]ö  }i }t        |t        «      sJ dj                  t        |«      «      «       ‚|j                  «       D ]’  \  }}|| j                  k(  r=t        |t        «      s*J dj                  | j                  t        |«      «      «       ‚|}ŒR|d	k(  r2t        |t        «      sJ d
j                  t        |«      «      «       ‚|}Œ‰|dvsŒŽ|||<   Œ” |
j!                  t#        |¬«      f«       Œø |
S # t        $ r"}	t
        j                  d|	«       g cY d}	~	S d}	~	ww xY w)z|Accepts a query_embedding (vector), and returns documents with
        similar embeddings along with their relevance scores.TÚexclude_embeddingsr[   )Úsqlz$Exception when querying Rockset: %s
Nz;document should be of type `dict[str,Any]`. But found: `{}`zIpage content stored in column `{}` must be of type `str`. But found: `{}`ÚdistzDComputed distance between vectors must of type `float`. But found {})r1   Ú_event_timeÚ_meta)Úpage_contentÚmetadata)Ú_build_query_sqlr   ÚQueriesr[   Ú	ExceptionÚloggerÚerrorÚresultsr   ÚdictÚformatr   Úitemsr   rQ   Úfloatr6   r   )r#   rD   r\   r]   r^   r;   rg   Úq_strÚquery_responseÚeÚfinalResultÚdocumentrm   Úvrl   Úscores                   r*   rY   z9Rockset.similarity_search_by_vector_with_relevance_scoresù   sŸ  € ð "ÐØ 6Ñ)Ø!'Ð(<Ñ!=ÐØ×%Ñ%Ø�} a¨Ð4Fó
ˆð	Ø!Ÿ\™\×1Ñ1×7Ñ7¸WÀeÐ<LÐ7ÓMˆNð 57ˆØ&×.Ô.ˆHØˆHÜ˜h¬Ô-ð ØM×TÑTÜ˜“NóóÐ-ð
 !Ÿ™Ö(‘��1Ø˜Ÿ™Ò&Ü% a¬Ô-ð 6ð*ç‘f˜TŸ^™^¬T°!«WÓ5ó6Ð-ð $%‘LØ˜&’[Ü% a¬Ô/ð &ð'ç‘fœT !›W“oó&Ð/ð ‘EØÐ=Ò=ð #$�H˜Q’Kð! )ð" ×Ñä¨,ÀÔJØðõð1 /ð< ÐøôE ò 	Ü�L‰LÐ@À!ÔDØ�Iûð	ús   ¢(E Å	E>ÅE9Å3E>Å9E>)r^   c               ór  — | j                   j                  |«      } | j                  |f||ddœ|¤Ž}|D �	cg c]  }	|	j                  | j                     ‘Œ }
}	t        t        j                  |«      |
||¬«      }|D ]  }||   j                  | j                  = Œ |D �cg c]  }||   ‘Œ	 c}S c c}	w c c}w )a–  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            distance_func (DistanceFunction): how to compute distance between two
                vectors in Rockset.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            where_str: where clause for the sql query
        Returns:
            List of Documents selected by maximal marginal relevance.
        F)r\   r^   rg   )Úlambda_multr\   )r   r5   ra   rm   r   r   ÚnpÚarray)r#   r[   r\   Úfetch_kr€   r^   r;   Úquery_embeddingÚinitial_docsr@   r%   Úselected_indicesr>   s                r*   Úmax_marginal_relevance_searchz%Rockset.max_marginal_relevance_search0  sÚ   € ð: ×*Ñ*×6Ñ6°uÓ=ˆØ7�t×7Ñ7Øð
àØØ$ñ	
ð
 ñ
ˆñ DPÓPÁ<¸C�c—l‘l 4×#6Ñ#6Ó7À<ˆ
ÐPä5Ü�H‰H�_Ó%ØØ#Øô	
Ðó "ˆAØ˜Q‘×(Ñ(¨×)<Ñ)<Ñ=ð "ñ *:Ó:Ñ)9 A�˜Q“Ð)9Ñ:Ð:ùò Qùò ;s   · B/Â B4c                ó@  — dj                  t        t        |«      «      }|j                  › d| j                  › d|› d�}|rd|› d�nd}|rd| j                  › d	�nd}d
|› d|› d| j
                  › d| j                  › d|› d|j                  «       › dt        |«      › d�S )zABuilds Rockset SQL query to query similar vectors to query_vectorÚ,Ú(z, [z
]) as distzWHERE Ú
Ú z EXCEPT(z),zSELECT *Ú z
FROM Ú.zORDER BY dist z
LIMIT )ÚjoinÚmaprQ   rN   r   r    r   rO   )	r#   r„   r]   r\   r^   rg   Úq_embedding_strÚdistance_strÚselect_embeddings	            r*   rn   zRockset._build_query_sqlh  sÝ   € ð Ÿ(™(¤3¤s¨OÓ#<Ó=ˆØ)×/Ñ/Ð0°°$×2EÑ2EÐ1Fð GØÐ�*ð ˆá.7�f˜Y˜K rÑ*¸Rˆ	á2Dˆh�t×*Ñ*Ð+¨2Ñ.È#ð 	ð	Ø	Ð˜!˜L˜>ð *Ø
‡o�oÐ�a˜×-Ñ-Ð.ð /Ø
€ð Ø×%Ñ%Ó'Ð(ð )Ü
ˆ1ƒv€hð ðð 	r/   c                óÌ   — | j                   j                  j                  | j                  || j                  ¬«      }|j
                  D �cg c]  }|j                  ‘Œ c}S c c}w )N©Ú
collectionÚdatar)   )r   Ú	DocumentsÚadd_documentsr   r    r—   r1   )r#   r<   Úadd_doc_resÚ
doc_statuss       r*   r4   z#Rockset._write_documents_to_rockset�  sX   € Ø—l‘l×,Ñ,×:Ñ:Ø×,Ñ,°5ÀDÇOÁOð ;ó 
ˆð 2=×1AÒ1AÓBÑ1A :�
—“Ð1AÑBÐBùÒBs   ÁA!c           	     óî   — 	 ddl m} | j                  j                  j                  | j                  |D �cg c]  } ||¬«      ‘Œ c}| j                  ¬«       y# t        $ r t        d«      ‚w xY wc c}w )z1Delete a list of docs from the Rockset collectionr   )ÚDeleteDocumentsRequestDatar   )Úidr•   N)Úrockset.modelsr�   r   r   r˜   Údelete_documentsr   r    )r#   r9   r�   r>   s       r*   Údelete_textszRockset.delete_texts‡  sz   € ð	ÝAð 	�‰×Ñ×/Ñ/Ø×,Ñ,Ù<?Ó@¹C°qÑ,°Ö2¸CÑ@Ø—o‘oð 	0õ 	
øô ò 	Üð@óð ð	üò As   ‚A ¶A2
ÁA/c                óˆ   — 	 |€g }| j                  |«       y# t        $ r }t        j                  d|«       Y d }~yd }~ww xY w)Nz.Exception when deleting docs from Rockset: %s
FT)r¡   rp   rq   rr   )r#   r9   r;   rz   s       r*   ÚdeletezRockset.delete—  sH   € ð	Øˆ{Ø�Ø×Ñ˜cÔ"ð
 øô	 ò 	Ü�L‰LÐJÈAÔNÜûð	ús   ‚ ˜	A¡<¼Ac              ‹  óN   K  — t        d | j                  |fi |¤Žƒ d {  –—† S 7 Œ­wr-   )r   r£   )r#   r9   r;   s      r*   ÚadeletezRockset.adelete¢  s&   è ø€ ô % T¨4¯;©;¸ÑF¸vÑF×FÐFÐFús   ‚%ž#Ÿ%)Úcommons)r$   r   r%   r   r&   rQ   r'   rQ   r(   rQ   r)   rQ   )rP   r   )NNé    )r7   zIterable[str]r8   úOptional[List[dict]]r9   úOptional[List[str]]r:   Úintr;   r   rP   ú	List[str])NNrŒ   rŒ   rŒ   Nr§   )r7   r«   rD   r   r8   r¨   r$   r   r&   rQ   r'   rQ   r(   rQ   r9   r©   r:   rª   r;   r   rP   r   )r[   rQ   r\   rª   r]   rV   r^   úOptional[str]r;   r   rP   úList[Tuple[Document, float]])r[   rQ   r\   rª   r]   rV   r^   r¬   r;   r   rP   úList[Document])rD   úList[float]r\   rª   r]   rV   r^   r¬   r;   r   rP   r®   )rD   r¯   r\   rª   r]   rV   r^   r¬   r;   r   rP   r­   )rW   é   g      à?)r[   rQ   r\   rª   rƒ   rª   r€   rw   r^   r¬   r;   r   rP   r®   )rW   NT)r„   r¯   r]   rV   r\   rª   r^   r¬   rg   ÚboolrP   rQ   )r<   z
List[dict]rP   r«   )r9   r«   rP   ÚNoner-   )r9   r©   r;   r   rP   zOptional[bool])rR   rS   rT   Ú__doc__r+   Úpropertyr%   rA   ÚclassmethodrE   r   rV   rH   r_   rb   ra   rY   r‡   rn   r4   r¡   r£   r¥   rU   r/   r*   r   r      sp  „ ñðH #ð.àð.ð ð.ð ð	.ð
 ð.ð ð.ð ó.ð` ò ó ð ð +/Ø#'Øð&àð&ð (ð&ð !ð	&ð
 ð&ð ð&ð 
ó&ðP ð
 +/ØØ!ØØØ#'Øðàðð ðð (ð	ð
 ðð ðð ðð ðð !ðð ðð ðð 
òó ðô8	˜4ô 	ð Ø*:×*EÑ*EØ#'ð
àð
ð ð
ð (ð	
ð
 !ð
ð ð
ð 
&ó
ðH Ø*:×*EÑ*EØ#'ð
àð
ð ð
ð (ð	
ð
 !ð
ð ð
ð 
ó
ð, Ø*:×*EÑ*EØ#'ð3àð3ð ð3ð (ð	3ð
 !ð3ð ð3ð 
ó3ð& Ø*:×*EÑ*EØ#'ð5àð5ð ð5ð (ð	5ð
 !ð5ð ð5ð 
&ó5ðt ØØ ð4;ð $(ñ4;àð4;ð ð4;ð ð	4;ð
 ð4;ð !ð4;ð ð4;ð 
ó4;ðx Ø#'Ø#'ðà$ðð (ðð ð	ð
 !ðð !ðð 
óó2Có
ô 	ð *.ðGØ&ðGØ9<ðGà	ôGr/   r   )Ú
__future__r   ÚloggingÚcopyr   Úenumr   Útypingr   r   r   r	   r
   Únumpyr�   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.runnablesr   Úlangchain_core.vectorstoresr   Ú&langchain_community.vectorstores.utilsr   Ú	getLoggerrR   rq   r   rU   r/   r*   Ú<module>rÂ      sK   ðÝ "ã Ý Ý ß 7Õ 7ã Ý -Ý 0Ý 4Ý 3å Mà	ˆ×	Ñ	˜8Ó	$€ôRGˆkõ RGr/   