§
    šŠtjÈ;  ã                  óÎ   — 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j        e¦  «        Z G d„ de¦  «        ZdS )é    )ÚannotationsN)Údeepcopy)ÚEnum)ÚAnyÚIterableÚListÚOptionalÚTuple)ÚDocument)Ú
Embeddings)Úrun_in_executor)ÚVectorStore)Úmaximal_marginal_relevancec                  ó>  — e Zd ZdZ	 dBdCd„ZedDd„¦   «         Z	 	 	 dEdFd„Ze	 	 	 	 	 	 	 dGdHd„¦   «         Z	 G d„ d e
¦  «        Zd!ej        dfdId(„Zd!ej        dfdJd*„Zd!ej        dfdKd,„Zd!ej        dfdLd-„Z	 	 	 dMdd0œdNd4„Z	 	 	 dOdPd9„ZdQd<„ZdRd>„ZdSdTd@„Z	 dSdTdA„ZdS )UÚ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")

    ÚcommonsÚclientr   Ú
embeddingsr   Úcollection_nameÚstrÚtext_keyÚembedding_keyÚ	workspacec                óZ  — 	 ddl m} n# t          $ r t          d¦  «        ‚w xY wt          ||¦  «        st	          dt          |¦  «        › �¦  «        ‚|| _        || _        || _        || _	        || _
        || _        	 | j                             d¦  «         dS # t          $ r Y dS 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)Úselfr   r   r   r   r   r   r   s           úh/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/rocksetdb.pyÚ__init__zRockset.__init__1   sÿ   € ð*	Ø-Ð-Ð-Ð-Ð-Ð-Ð-øÝð 	ð 	ð 	Ýð@ñô ð ð	øøøõ ˜& -Ñ0Ô0ð 	Ýð&Ý˜F‘|”|ð&ð &ñô ð ð
 ˆŒØ /ˆÔØ%ˆÔØ!ˆŒØ+ˆÔØ#ˆŒð	ØŒL×(Ò(¨Ñ5Ô5Ð5Ð5Ð5øÝð 	ð 	ð 	àˆDˆDð	øøøs   ‚	 ‰#Â B Â
B*Â)B*Úreturnc                ó   — | j         S ©N)r%   ©r+   s    r,   r   zRockset.embeddingsa   s   € àÔÐó    Né    ÚtextsúIterable[str]Ú	metadatasúOptional[List[dict]]ÚidsúOptional[List[str]]Ú
batch_sizeÚintÚkwargsú	List[str]c                ó  — g }g }t          |¦  «        D ]¿\  }}	t          |¦  «        |k    r||                      |¦  «        z  }g }i }
|r(t          |¦  «        |k    rt          ||         ¦  «        }
|rt          |¦  «        |k    r||         |
d<   |	|
| j        <   | j                             |	¦  «        |
| j        <   |                     |
¦  «         ŒÀt          |¦  «        dk    r||                      |¦  «        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+   r4   r6   r8   r:   r<   ÚbatchÚ
stored_idsÚiÚtextÚdocs              r,   Ú	add_textszRockset.add_textse   s  € ð( ˆØˆ
å  Ñ'Ô'ð 	ð 	‰GˆAˆtÝ�5‰zŒz˜ZÒ'Ð'Ø˜d×>Ò>¸uÑEÔEÑE�
Ø�ØˆCØð -�S ™^œ^¨aÒ/Ð/Ý˜y¨œ|Ñ,Ô,�Øð $•s˜3‘x”x !’|�|Ø  œV��E‘
Ø"&ˆC�”ÑØ'+Ô'7×'CÒ'CÀDÑ'IÔ'IˆC�Ô#Ñ$Ø�LŠL˜ÑÔÐÐÝˆu‰:Œ:˜Š>ˆ>Ø˜$×:Ò:¸5ÑAÔAÑAˆJØˆEØÐr2   Ú Ú	embeddingc
                ó´   — |€
J d¦   «         ‚|s
J d¦   «         ‚|s
J d¦   «         ‚|s
J d¦   «         ‚ | |||||¦  «        }|                      ||||	¦  «         |S )znCreate Rockset wrapper with existing texts.
        This is intended as a quicker way to get started.
        NzRockset Client cannot be NonezCollection name cannot be emptyzText key name cannot be emptyzEmbedding key cannot be empty)rJ   )Úclsr4   rL   r6   r   r   r   r   r8   r:   r<   r   s               r,   Ú
from_textszRockset.from_texts�   s‹   € ð& Ð!Ð!Ð#BÑ!Ô!Ð!ØÐAÐAÐ AÑAÔAˆØÐ8Ð8Ð8Ñ8Ô8ˆxØÐ=Ð=Ð=Ñ=Ô=ˆ}à�#�f˜i¨¸(ÀMÑRÔRˆØ×Ò˜% ¨C°Ñ<Ô<Ð<Øˆr2   c                  ó"   — e Zd ZdZdZdZdd„ZdS )	úRockset.DistanceFunctionÚ
COSINE_SIMÚEUCLIDEAN_DISTÚDOT_PRODUCTr.   r   c                ó    — | j         dk    rdS dS )NrS   ÚASCÚDESC)Úvaluer1   s    r,   Úorder_byz!Rockset.DistanceFunction.order_by°   s   € ØŒzÐ-Ò-Ð-Ø�uØ�6r2   N)r.   r   )Ú__name__Ú
__module__Ú__qualname__rR   rS   rT   rY   © r2   r,   ÚDistanceFunctionrQ   ª   s7   € € € € € Ø!ˆ
Ø)ˆØ#ˆð	ð 	ð 	ð 	ð 	ð 	r2   r^   é   ÚqueryÚkÚdistance_funcÚ	where_strúOptional[str]úList[Tuple[Document, float]]c                óT   —  | 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%   rC   ©r+   r`   ra   rb   rc   r<   s         r,   Ú'similarity_search_with_relevance_scoresz/Rockset.similarity_search_with_relevance_scoresµ   sH   € ð2 FˆtÔEØÔ×(Ò(¨Ñ/Ô/ØØØð	
ð 
ð
 ð
ð 
ð 	
r2   úList[Document]c                óT   —  | j         | j                             |¦  «        |||fi |¤ŽS )zaSame as `similarity_search_with_relevance_scores` but
        doesn't return the scores.
        )Úsimilarity_search_by_vectorr%   rC   rh   s         r,   Úsimilarity_searchzRockset.similarity_searchÖ   sG   € ð 0ˆtÔ/ØÔ×(Ò(¨Ñ/Ô/ØØØð	
ð 
ð
 ð
ð 
ð 	
r2   úList[float]c                ó<   —  | j         ||||fi |¤Ž}d„ |D ¦   «         S )zZAccepts a query_embedding (vector), and returns documents with
        similar embeddings.c                ó   — g | ]\  }}|‘ŒS r]   r]   )Ú.0rI   Ú_s      r,   ú
<listcomp>z7Rockset.similarity_search_by_vector.<locals>.<listcomp>÷   s   € Ð2Ð2Ð2™˜˜Q�Ð2Ð2Ð2r2   )rg   )r+   rL   ra   rb   rc   r<   Údocs_and_scoress          r,   rl   z#Rockset.similarity_search_by_vectoré   sE   € ð Q˜$ÔPØ�q˜-¨ð
ð 
Ø6<ð
ð 
ˆð 3Ð2 /Ð2Ñ2Ô2Ð2r2   c           	     ój  — d}d|v r|d         }|                       |||||¦  «        }	 | j        j                             d|i¬¦  «        }n4# t          $ r'}	t
                               d|	¦  «         g cY d}	~	S d}	~	ww xY wg }
|j        D �](}i }t          |t          ¦  «        s*J d 
                    t          |¦  «        ¦  «        ¦   «         ‚|                     ¦   «         D ]©\  }}|| j        k    rHt          |t          ¦  «        s0J d 
                    | j        t          |¦  «        ¦  «        ¦   «         ‚|}ŒX|d	k    rBt          |t          ¦  «        s*J d
 
                    t          |¦  «        ¦  «        ¦   «         ‚|}Œ |dvr|||<   Œª|
                     t#          ||¬¦  «        |f¦  «         �Œ*|
S )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 {})r?   Ú_event_timeÚ_meta)Úpage_contentÚmetadata)Ú_build_query_sqlr#   ÚQueriesr`   Ú	ExceptionÚloggerÚerrorÚresultsr    ÚdictÚformatr"   Úitemsr&   r   ÚfloatrD   r   )r+   rL   ra   rb   rc   r<   rv   Úq_strÚquery_responseÚeÚfinalResultÚdocumentr|   Úvr{   Úscores                   r,   rg   z9Rockset.similarity_search_by_vector_with_relevance_scoresù   s   € ð "ÐØ 6Ð)Ð)Ø!'Ð(<Ô!=ÐØ×%Ò%Ø�} a¨Ð4Fñ
ô 
ˆð	Ø!œ\Ô1×7Ò7¸WÀeÐ<LÐ7ÑMÔMˆNˆNøÝð 	ð 	ð 	Ý�LŠLÐ@À!ÑDÔDÐDØˆIˆIˆIˆIˆIˆIøøøøð	øøøð 57ˆØ&Ô.ð 	ñ 	ˆHØˆHÝ˜h­Ñ-Ô-ð ð ØM×TÒTÝ˜‘N”Nñô ñô Ð-ð
 !ŸšÑ(Ô(ð $ð $‘��1Ø˜œÒ&Ð&Ý% a­Ñ-Ô-ð 6ð 6ð*ç’f˜Tœ^­T°!©W¬WÑ5Ô5ñ6ô 6Ð-ð $%�L�LØ˜&’[�[Ý% a­Ñ/Ô/ð &ð &ð'ç’f�T !™WœW‘o”oñ&ô &Ð/ð �E�EØÐ=Ð=Ð=ð #$�H˜Q‘KøØ×Òå¨,ÀÐJÑJÔJØðñô ð ñ ð Ðs   ©"A Á
A=ÁA8Á2A=Á8A=é   ç      à?)rc   Úfetch_kÚlambda_multr†   c               ó  ‡ ‡— ‰ j                              |¦  «        } ‰ j        |f||ddœ|¤ŽŠˆ fd„‰D ¦   «         }t          t	          j        |¦  «        |||¬¦  «        }	|	D ]}
‰|
         j        ‰ j        = Œˆfd„|	D ¦   «         S )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)ra   rc   rv   c                ó4   •— g | ]}|j         ‰j                 ‘ŒS r]   )r|   r'   )rq   rI   r+   s     €r,   rs   z9Rockset.max_marginal_relevance_search.<locals>.<listcomp>V  s#   ø€ ÐPÐPÐP¸C�c”l 4Ô#6Ô7ÐPÐPÐPr2   )r‘   ra   c                ó    •— g | ]
}‰|         ‘ŒS r]   r]   )rq   rG   Úinitial_docss     €r,   rs   z9Rockset.max_marginal_relevance_search.<locals>.<listcomp>d  s   ø€ Ð:Ð:Ð: A�˜Q”Ð:Ð:Ð:r2   )r%   rC   rl   r   ÚnpÚarrayr|   r'   )r+   r`   ra   r�   r‘   rc   r<   Úquery_embeddingr   Úselected_indicesrG   r•   s   `          @r,   Úmax_marginal_relevance_searchz%Rockset.max_marginal_relevance_search0  sØ   øø€ ð: Ô*×6Ò6°uÑ=Ô=ˆØ7�tÔ7Øð
àØØ$ð	
ð 
ð
 ð
ð 
ˆð QÐPÐPÐPÀ<ÐPÑPÔPˆ
å5ÝŒH�_Ñ%Ô%ØØ#Øð	
ñ 
ô 
Ðð "ð 	>ð 	>ˆAØ˜Q”Ô(¨Ô)<Ð=Ð=à:Ð:Ð:Ð:Ð)9Ð:Ñ:Ô:Ð:r2   Tr˜   rv   Úboolc                ó0  — d                      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|                     ¦   «         › dt          |¦  «        › d�S )zABuilds Rockset SQL query to query similar vectors to query_vectorú,ú(z, [z
]) as distzWHERE ú
rK   z EXCEPT(z),zSELECT *ú z
FROM ú.zORDER BY dist z
LIMIT )ÚjoinÚmapr   rX   r'   r(   r$   rY   )	r+   r˜   rb   ra   rc   rv   Úq_embedding_strÚdistance_strÚselect_embeddings	            r,   r}   zRockset._build_query_sqlh  s  € ð Ÿ(š(¥3¥s¨OÑ#<Ô#<Ñ=Ô=ˆØ)Ô/ð  ð  °$Ô2Eð  ð  Øð ð  ð  ˆà.7Ð?Ð*˜YÐ*Ð*Ð*Ð*¸Rˆ	à2DÐMÐ.�tÔ*Ð.Ð.Ð.Ð.È#ð 	ðØ	ðð Ø(ðð à
„oðð àÔ-ðð ð ðð ð ×%Ò%Ñ'Ô'ð	ð õ
 ˆ1�v„vðð ð ð 	r2   rE   ú
List[dict]c                ó|   — | j         j                             | j        || j        ¬¦  «        }d„ |j        D ¦   «         S )N©Ú
collectionÚdatar   c                ó   — g | ]	}|j         ‘Œ
S r]   )r?   )rq   Ú
doc_statuss     r,   rs   z7Rockset._write_documents_to_rockset.<locals>.<listcomp>…  s   € ÐBÐBÐB :�
”ÐBÐBÐBr2   )r#   Ú	DocumentsÚadd_documentsr$   r(   r«   )r+   rE   Úadd_doc_ress      r,   rB   z#Rockset._write_documents_to_rockset�  sG   € Ø”lÔ,×:Ò:ØÔ,°5ÀDÄOð ;ñ 
ô 
ˆð CÐB°Ô1AÐBÑBÔBÐBr2   ÚNonec                óÂ   ‡— 	 ddl mŠ n# t          $ r t          d¦  «        ‚w xY w| j        j                             | j        ˆfd„|D ¦   «         | j        ¬¦  «         dS )z1Delete a list of docs from the Rockset collectionr   )ÚDeleteDocumentsRequestDatar   c                ó(   •— g | ]} ‰|¬ ¦  «        ‘ŒS ))Úidr]   )rq   rG   r³   s     €r,   rs   z(Rockset.delete_texts.<locals>.<listcomp>“  s(   ø€ Ð@Ð@Ð@°qÐ,Ð,°Ð2Ñ2Ô2Ð@Ð@Ð@r2   r©   N)Úrockset.modelsr³   r   r#   r®   Údelete_documentsr$   r(   )r+   r8   r³   s     @r,   Údelete_textszRockset.delete_texts‡  s    ø€ ð	ØAÐAÐAÐAÐAÐAÐAøÝð 	ð 	ð 	Ýð@ñô ð ð	øøøð 	ŒÔ×/Ò/ØÔ,Ø@Ð@Ð@Ð@¸CÐ@Ñ@Ô@Ø”oð 	0ñ 	
ô 	
ð 	
ð 	
ð 	
s   ƒ
 Š$úOptional[bool]c                ó¢   — 	 |€g }|                       |¦  «         n3# t          $ r&}t                               d|¦  «         Y d }~dS d }~ww xY wdS )Nz.Exception when deleting docs from Rockset: %s
FT)r¸   r   r€   r�   )r+   r8   r<   r‰   s       r,   ÚdeletezRockset.delete—  sp   € ð	Øˆ{Ø�Ø×Ò˜cÑ"Ô"Ð"Ð"øÝð 	ð 	ð 	Ý�LŠLÐJÈAÑNÔNÐNØ�5�5�5�5�5øøøøð	øøøð ˆts   ‚ œ
A¦AÁAc              ‹  ó:   K  — t          d | j        |fi |¤Žƒ d {V —†S r0   )r   r»   )r+   r8   r<   s      r,   ÚadeletezRockset.adelete¢  s6   è è € õ % T¨4¬;¸ÐFÐF¸vÐFÐFÐFÐFÐFÐFÐFÐFÐFr2   )r   )r   r   r   r   r   r   r   r   r   r   r   r   )r.   r   )NNr3   )r4   r5   r6   r7   r8   r9   r:   r;   r<   r   r.   r=   )NNrK   rK   rK   Nr3   )r4   r=   rL   r   r6   r7   r   r   r   r   r   r   r   r   r8   r9   r:   r;   r<   r   r.   r   )r`   r   ra   r;   rb   r^   rc   rd   r<   r   r.   re   )r`   r   ra   r;   rb   r^   rc   rd   r<   r   r.   rj   )rL   rn   ra   r;   rb   r^   rc   rd   r<   r   r.   rj   )rL   rn   ra   r;   rb   r^   rc   rd   r<   r   r.   re   )r_   rŽ   r�   )r`   r   ra   r;   r�   r;   r‘   r†   rc   rd   r<   r   r.   rj   )r_   NT)r˜   rn   rb   r^   ra   r;   rc   rd   rv   r›   r.   r   )rE   r§   r.   r=   )r8   r=   r.   r±   r0   )r8   r9   r<   r   r.   r¹   )rZ   r[   r\   Ú__doc__r-   Úpropertyr   rJ   ÚclassmethodrO   r   r^   rR   ri   rm   rl   rg   rš   r}   rB   r¸   r»   r½   r]   r2   r,   r   r      sI  € € € € € ðð ðH #ð.ð .ð .ð .ð .ð` ð ð  ð  ñ „Xð ð +/Ø#'Øð&ð &ð &ð &ð &ðP ð
 +/ØØ!ØØØ#'Øðð ð ð ñ „[ðð8	ð 	ð 	ð 	ð 	˜4ñ 	ô 	ð 	ð Ø*:Ô*EØ#'ð
ð 
ð 
ð 
ð 
ðH Ø*:Ô*EØ#'ð
ð 
ð 
ð 
ð 
ð, Ø*:Ô*EØ#'ð3ð 3ð 3ð 3ð 3ð& Ø*:Ô*EØ#'ð5ð 5ð 5ð 5ð 5ðt ØØ ð4;ð $(ð4;ð 4;ð 4;ð 4;ð 4;ð 4;ðx Ø#'Ø#'ðð ð ð ð ð2Cð Cð Cð Cð
ð 
ð 
ð 
ð 	ð 	ð 	ð 	ð 	ð *.ðGð Gð Gð Gð Gð Gð Gr2   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   Ú	getLoggerrZ   r€   r   r]   r2   r,   ú<module>rÍ      s.  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3à MÐ MÐ MÐ MÐ MÐ Mà	ˆÔ	˜8Ñ	$Ô	$€ðRGð RGð RGð RGð RGˆkñ RGô RGð RGð RGð RGr2   