
    Ng=                        d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
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 erd dlZ G d	 d
e          ZdS )    )annotationsN)repeat)	TYPE_CHECKINGAnyDictIterableListOptionalTupleTypeUnionDocument)
Embeddings)VectorStore)maximal_marginal_relevancec                  "   e Zd ZdZ	 	 dFdGdZedHd            Z	 	 dIdJdZe	 	 	 	 	 	 dKdLd$            Z	dMd(Z
	 	 dNdOd.Z	 	 dNdPd0Z	 	 dNdQd2ZdRd4Z	 	 	 dSdTd8Z	 	 dIdUd:Ze	 dVdWd<            ZedXd=            Z	 	 	 dYdZdCZ	 	 	 dYd[dDZdVd\dEZdS )]SupabaseVectorStorea  `Supabase Postgres` vector store.

    It assumes you have the `pgvector`
    extension installed and a `match_documents` (or similar) function. For more details:
    https://integrations.langchain.com/vectorstores?integration_name=SupabaseVectorStore

    You can implement your own `match_documents` function in order to limit the search
    space to a subset of documents based on your own authorization or business logic.

    Note that the Supabase Python client does not yet support async operations.

    If you'd like to use `max_marginal_relevance_search`, please review the instructions
    below on modifying the `match_documents` function to return matched embeddings.


    Examples:

    .. code-block:: python

        from langchain_community.embeddings.openai import OpenAIEmbeddings
        from langchain_core.documents import Document
        from langchain_community.vectorstores import SupabaseVectorStore
        from supabase.client import create_client

        docs = [
            Document(page_content="foo", metadata={"id": 1}),
        ]
        embeddings = OpenAIEmbeddings()
        supabase_client = create_client("my_supabase_url", "my_supabase_key")
        vector_store = SupabaseVectorStore.from_documents(
            docs,
            embeddings,
            client=supabase_client,
            table_name="documents",
            query_name="match_documents",
            chunk_size=500,
        )

    To load from an existing table:

    .. code-block:: python

        from langchain_community.embeddings.openai import OpenAIEmbeddings
        from langchain_community.vectorstores import SupabaseVectorStore
        from supabase.client import create_client


        embeddings = OpenAIEmbeddings()
        supabase_client = create_client("my_supabase_url", "my_supabase_key")
        vector_store = SupabaseVectorStore(
            client=supabase_client,
            embedding=embeddings,
            table_name="documents",
            query_name="match_documents",
        )

      Nclientsupabase.client.Client	embeddingr   
table_namestr
chunk_sizeint
query_nameUnion[str, None]returnNonec                    	 ddl }n# t          $ r t          d          w xY w|| _        || _        |pd| _        |pd| _        |pd| _        dS )z Initialize with supabase client.r   NzXCould not import supabase python package. Please install it with `pip install supabase`.	documentsmatch_documentsr   )supabaseImportError_client
_embeddingr   r   r   )selfr   r   r   r   r   r$   s          e/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/supabase.py__init__zSupabaseVectorStore.__init__X   s~    	OOOO 	 	 	A  	 &/$3$9(9$+s    !c                    | j         S N)r'   )r(   s    r)   
embeddingszSupabaseVectorStore.embeddingsq   s
        textsIterable[str]	metadatasOptional[List[Dict[Any, Any]]]idsOptional[List[str]]kwargsr   	List[str]c                    |pd |D             }|                      ||          }| j                            t          |                    }|                     |||          S )Nc                N    g | ]"}t          t          j                              #S  r   uuiduuid4.0_s     r)   
<listcomp>z1SupabaseVectorStore.add_texts.<locals>.<listcomp>|   s&    777Ac$*,,''777r.   )_texts_to_documentsr'   embed_documentslistadd_vectors)r(   r/   r1   r3   r5   docsvectorss          r)   	add_textszSupabaseVectorStore.add_textsu   se     777777''y99/11$u++>>s333r.   r"   r#   clsType['SupabaseVectorStore']Optional[List[dict]] Optional[supabase.client.Client]Optional[str]'SupabaseVectorStore'c	                    |st          d          |st          d          |                    |          }
d |D             }|                     ||          } | j        |||
|||fi |	  | |||||          S )z9Return VectorStore initialized from texts and embeddings.zSupabase client is required.z)Supabase document table_name is required.c                N    g | ]"}t          t          j                              #S r9   r:   r=   s     r)   r@   z2SupabaseVectorStore.from_texts.<locals>.<listcomp>   s&    000Qs4:<<  000r.   )r   r   r   r   r   )
ValueErrorrB   rA   _add_vectors)rH   r/   r   r1   r   r   r   r   r3   r5   r-   rE   s               r)   
from_textszSupabaseVectorStore.from_texts   s      	=;<<< 	JHIII..u55
00%000&&ui88J
D#z	
 	
EK	
 	
 	
 s!!!
 
 
 	
r.   rF   List[List[float]]List[Document]c                T    |                      | j        | j        |||| j                  S r,   )rQ   r&   r   r   )r(   rF   r"   r3   s       r)   rD   zSupabaseVectorStore.add_vectors   s/       L$/7IsDO
 
 	
r.      querykfilterOptional[Dict[str, Any]]c                X    | j                             |          } | j        |f||d|S NrX   rY   )r'   embed_querysimilarity_search_by_vectorr(   rW   rX   rY   r5   vectors         r)   similarity_searchz%SupabaseVectorStore.similarity_search   s;     ,,U33/t/U!FUUfUUUr.   List[float]c                @     | j         |f||d|}d |D             }|S )Nr]   c                    g | ]\  }}|S r9   r9   )r>   docr?   s      r)   r@   zCSupabaseVectorStore.similarity_search_by_vector.<locals>.<listcomp>   s    ...VS!S...r.   )1similarity_search_by_vector_with_relevance_scores)r(   r   rX   rY   r5   resultr"   s          r)   r_   z/SupabaseVectorStore.similarity_search_by_vector   sN     HG
6
 
-3
 
 /.v...	r.   List[Tuple[Document, float]]c                X    | j                             |          } | j        |f||d|S r\   )r'   r^   rg   r`   s         r)   'similarity_search_with_relevance_scoresz;SupabaseVectorStore.similarity_search_with_relevance_scores   sJ     ,,U33EtE

 
*0
 
 	
r.   Dict[str, Any]c                4    t          |          }|r||d<   |S )N)query_embeddingrY   )dict)r(   rW   rY   rets       r)   
match_argszSupabaseVectorStore.match_args   s*     #5999 	#"CM
r.   postgrest_filterscore_thresholdOptional[float]c                   |                      ||          }| j                            | j        |          }|r$|j                            dd| d          |_        |j                            d|          |_        |                                }d |j        D             }	8fd|	D             }	t          |	          dk    rt          j
        d            |	S )	Nand()limitc           	         g | ]f}|                     d           t          |                     di           |                     d d                    |                     dd          fgS )contentmetadata r|   page_content
similarity        )getr   r>   searchs     r)   r@   zYSupabaseVectorStore.similarity_search_by_vector_with_relevance_scores.<locals>.<listcomp>   s     

 

 

 zz)$$

#ZZ
B77!'Ir!:!:   

<--

 

 

r.   c                *    g | ]\  }}|k    ||fS r9   r9   )r>   rf   r   rs   s      r)   r@   zYSupabaseVectorStore.similarity_search_by_vector_with_relevance_scores.<locals>.<listcomp>   s7       #C00 j!000r.   r   zDNo relevant docs were retrieved using the relevance score threshold )rq   r&   rpcr   paramssetexecutedatalenwarningswarn)
r(   rW   rX   rY   rr   rs   match_documents_paramsquery_builderresmatch_results
        `    r)   rg   zESupabaseVectorStore.similarity_search_by_vector_with_relevance_scores   s+    "&!?!?((:PQQ 	#0#7#;#;.+...$ $M   -377CC##%%

 

 (

 

 

 &   '3  L
 <  A%%4"14 4  
 r.   (List[Tuple[Document, float, np.ndarray]]c                H   |                      ||          }| j                            | j        |          }|r$|j                            dd| d          |_        |j                            d|          |_        |                                }d |j        D             }|S )Nrv   rw   rx   ry   c           
     d   g | ]}|                     d           t          |                     di           |                     d d                    |                     dd          t          j        |                     dd                              d          t          j        d	          fS )
r{   r|   r}   r~   r   r   r   z[],)sep)r   r   np
fromstringstripfloat32r   s     r)   r@   zXSupabaseVectorStore.similarity_search_by_vector_returning_embeddings.<locals>.<listcomp>  s     
 
 
 zz)$$
#ZZ
B77!'Ir!:!:   

<-- JJ{B//55d;;RZS  
 
 
r.   )rq   r&   r   r   r   r   r   r   )	r(   rW   rX   rY   rr   r   r   r   r   s	            r)   0similarity_search_by_vector_returning_embeddingszDSupabaseVectorStore.similarity_search_by_vector_returning_embeddings  s     "&!?!?((:PQQ 	#0#7#;#;.+...$ $M   -377CC##%%
 
 (
 
 
" r.   "Optional[Iterable[Dict[Any, Any]]]c                \    |t          i           }d t          | |          D             }|S )z:Return list of Documents from list of texts and metadatas.Nc                6    g | ]\  }}t          ||           S )r   r|   r   )r>   textr|   s      r)   r@   z;SupabaseVectorStore._texts_to_documents.<locals>.<listcomp>:  s9     
 
 
h $:::
 
 
r.   )r   zip)r/   r1   rE   s      r)   rA   z'SupabaseVectorStore._texts_to_documents1  sD     r

I
 
"%eY"7"7
 
 

 r.   c                   fdt          |          D             }g }t          dt          |          |          D ]}	||	|	|z            }
|                     |                              |
                                          }t          |j                  dk    rt          d          d |j        D             |                               |S )zAdd vectors to Supabase table.c                `    g | ]*\  }}|         |         j         ||         j        d +S ))idr{   r   r|   r   )r>   idxr   r"   r3   r5   s      r)   r@   z4SupabaseVectorStore._add_vectors.<locals>.<listcomp>M  s^     	&
 	&
 	&
 Y #h$S>6&%cN3	 
 	&
 	&
 	&
r.   r   zError inserting: No rows addedc                |    g | ]9}|                     d           t          |                     d                     :S r   )r   r   )r>   is     r)   r@   z4SupabaseVectorStore._add_vectors.<locals>.<listcomp>a  s9    HHHAEE$KKH3quuT{{##HHHr.   )		enumerateranger   from_upsertr   r   	Exceptionextend)r   r   rF   r"   r3   r   r5   rowsid_listr   chunkrh   s      `` `     r)   rQ   z SupabaseVectorStore._add_vectorsA  s    	&
 	&
 	&
 	&
 	&
 	&
 #,G"4"4	&
 	&
 	&
  q#d))Z00 	  	 AQ^+,E\\*--44U;;CCEEF6;1$$ @AAA IHV[HHHCNN3r.            ?fetch_klambda_multfloatc                   
 |                      ||          }d |D             
d |D             }t          t          j        |gt          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:
            embedding: Embedding 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.
            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.
        Returns:
            List of Documents selected by maximal marginal relevance.
        c                    g | ]
}|d          S )r   r9   r>   	doc_tuples     r)   r@   zOSupabaseVectorStore.max_marginal_relevance_search_by_vector.<locals>.<listcomp>  s    BBBiYq\BBBr.   c                    g | ]
}|d          S )   r9   r   s     r)   r@   zOSupabaseVectorStore.max_marginal_relevance_search_by_vector.<locals>.<listcomp>  s    CCCyilCCCr.   )dtype)rX   r   c                     g | ]
}|         S r9   r9   )r>   r   matched_documentss     r)   r@   zOSupabaseVectorStore.max_marginal_relevance_search_by_vector.<locals>.<listcomp>  s    IIIq/2IIIr.   )r   r   r   arrayr   )r(   r   rX   r   r   r5   rh   matched_embeddingsmmr_selectedfiltered_documentsr   s             @r)   'max_marginal_relevance_search_by_vectorz;SupabaseVectorStore.max_marginal_relevance_search_by_vectorg  s    0 FFw
 
 CB6BBBCCFCCC1Hi[
333#	
 
 
 JIIILIII!!r.   c                l    | j                             |          }|                     ||||          }|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.
            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.
        Returns:
            List of Documents selected by maximal marginal relevance.

        `max_marginal_relevance_search` requires that `query_name` returns matched
        embeddings alongside the match documents. The following function
        demonstrates how to do this:

        ```sql
        CREATE FUNCTION match_documents_embeddings(query_embedding vector(1536),
                                                   match_count int)
            RETURNS TABLE(
                id uuid,
                content text,
                metadata jsonb,
                embedding vector(1536),
                similarity float)
            LANGUAGE plpgsql
            AS $$
            # variable_conflict use_column
        BEGIN
            RETURN query
            SELECT
                id,
                content,
                metadata,
                embedding,
                1 -(docstore.embedding <=> query_embedding) AS similarity
            FROM
                docstore
            ORDER BY
                docstore.embedding <=> query_embedding
            LIMIT match_count;
        END;
        $$;
        ```
        )r   )r'   r^   r   )r(   rW   rX   r   r   r5   r   rE   s           r)   max_marginal_relevance_searchz1SupabaseVectorStore.max_marginal_relevance_search  sD    r O//66	;;q'{ < 
 
 r.   c                   |t          d          d |D             }|D ]_}| j                            | j                                                                      d|d                                                    `dS )zUDelete by vector IDs.

        Args:
            ids: List of ids to delete.
        NzNo ids provided to delete.c                    g | ]}d |iS r   r9   )r>   r   s     r)   r@   z.SupabaseVectorStore.delete.<locals>.<listcomp>  s1     &
 &
 &
  b&
 &
 &
r.   r   )rP   r&   r   r   deleteeqr   )r(   r3   r5   r   rows        r)   r   zSupabaseVectorStore.delete  s     ;9:::&
 &
 	&
 &
 &
  	W 	WCLt//6688;;D#d)LLTTVVVV	W 	Wr.   )r   N)r   r   r   r   r   r   r   r   r   r   r   r    )r   r   )NN)
r/   r0   r1   r2   r3   r4   r5   r   r   r6   )NNr"   r#   r   N)rH   rI   r/   r6   r   r   r1   rJ   r   rK   r   rL   r   r   r   r   r3   r4   r5   r   r   rM   )rF   rS   r"   rT   r3   r6   r   r6   )rV   N)
rW   r   rX   r   rY   rZ   r5   r   r   rT   )
r   rc   rX   r   rY   rZ   r5   r   r   rT   )
rW   r   rX   r   rY   rZ   r5   r   r   ri   )rW   rc   rY   rZ   r   rl   )NNN)rW   rc   rX   r   rY   rZ   rr   rL   rs   rt   r   ri   )
rW   rc   rX   r   rY   rZ   rr   rL   r   r   r,   )r/   r0   r1   r   r   rT   )r   r   r   r   rF   rS   r"   rT   r3   r6   r   r   r5   r   r   r6   )rV   r   r   )r   rc   rX   r   r   r   r   r   r5   r   r   rT   )rW   r   rX   r   r   r   r   r   r5   r   r   rT   )r3   r4   r5   r   r   r    )__name__
__module____qualname____doc__r*   propertyr-   rG   classmethodrR   rD   rb   r_   rk   rq   rg   r   staticmethodrA   rQ   r   r   r   r9   r.   r)   r   r      sG       8 8~ '+, , , , ,2    X 59#'	4 4 4 4 4 
 +/37$/'8#'!
 !
 !
 !
 [!
F
 
 
 
 +/	V V V V V +/	    $ +/	

 

 

 

 

    ,0*.+/, , , , ,d ,0*.$ $ $ $ $L  9=    \ # # # \#P  (" (" (" (" ("Z  = = = = =~W W W W W W Wr.   r   )
__future__r   r;   r   	itertoolsr   typingr   r   r   r   r	   r
   r   r   r   numpyr   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   r$   r   r9   r.   r)   <module>r      sX   " " " " " "        
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
     - - - - - - 0 0 0 0 0 0 3 3 3 3 3 3 M M M M M M OOOFW FW FW FW FW+ FW FW FW FW FWr.   