
    dha@                        S SK Jr  S SKrS SKrS SKJr  S SKJrJrJ	r	J
r
JrJrJrJrJr  S SKrS SKJr  S SKJr  S SKJr  S SKJr  \(       a  S SKr " S	 S
\5      rg)    )annotationsN)repeat)	TYPE_CHECKINGAnyDictIterableListOptionalTupleTypeUnion)Document)
Embeddings)VectorStore)maximal_marginal_relevancec                  j   \ rS rSrSr  S           SS jjr\SS j5       r  S         SS jjr\	      S                     SS jj5       r
        SS jr  S         SS	 jjr  S         SS
 jjr  S         S S jjr      S!S jr   S"           S#S jjr  S         S$S jjr\ S%     S&S jj5       r\                S'S j5       r   S(           S)S jjr   S(           S*S jjrS%S+S jjrSrg),SupabaseVectorStore   aJ  `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",
    )

Nc                     SSK nXl        X l        U=(       d    SU l        U=(       d    SU l        U=(       d    SU l        g! [         a    [        S5      ef = f)z Initialize with supabase client.r   NzXCould not import supabase python package. Please install it with `pip install supabase`.	documentsmatch_documents  )supabaseImportError_client
_embedding
table_name
query_name
chunk_size)selfclient	embeddingr   r   r   r   s          a/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/vectorstores/supabase.py__init__SupabaseVectorStore.__init__X   s_    	 &/$3$9(9$+  	A 	s   A Ac                    U R                   $ N)r   )r    s    r#   
embeddingsSupabaseVectorStore.embeddingsq   s        c                   U=(       d.    U Vs/ sH!  n[        [        R                  " 5       5      PM#     snnU R                  X5      nU R                  R                  [        U5      5      nU R                  XvU5      $ s  snf r'   )struuiduuid4_texts_to_documentsr   embed_documentslistadd_vectors)r    texts	metadatasidskwargs_docsvectorss           r#   	add_textsSupabaseVectorStore.add_textsu   sh     77Ac$**,'7''9//11$u+>s33	 8s   'A?c	                0   U(       d  [        S5      eU(       d  [        S5      eUR                  U5      n
U Vs/ sH!  n[        [        R                  " 5       5      PM#     nnU R                  X5      nU R                  " XEXX40 U	D6  U " UUUUUS9$ s  snf )z9Return VectorStore initialized from texts and embeddings.zSupabase client is required.z)Supabase document table_name is required.)r!   r"   r   r   r   )
ValueErrorr0   r,   r-   r.   r/   _add_vectors)clsr3   r"   r4   r!   r   r   r   r5   r6   r(   r7   r8   s                r#   
from_textsSupabaseVectorStore.from_texts   s     ;<<HII..u5
*/0%Qs4::< %0&&u8
#	
EK	
 !!!
 	
 1s   'Bc                f    U R                  U R                  U R                  XX0R                  5      $ r'   )r>   r   r   r   )r    r9   r   r5   s       r#   r2   SupabaseVectorStore.add_vectors   s,       LL$//7sOO
 	
r*   c                b    U R                   R                  U5      nU R                  " U4X#S.UD6$ N)kfilter)r   embed_querysimilarity_search_by_vectorr    queryrF   rG   r6   vectors         r#   similarity_search%SupabaseVectorStore.similarity_search   s3     ,,U3//U!UfUUr*   c                f    U R                   " U4X#S.UD6nU VVs/ sH  u  pgUPM	     nnnU$ s  snnf rE   )1similarity_search_by_vector_with_relevance_scores)	r    r"   rF   rG   r6   resultdocr7   r   s	            r#   rI   /SupabaseVectorStore.similarity_search_by_vector   sJ     GG

-3
 (..vVSSv	. /s   -c                b    U R                   R                  U5      nU R                  " U4X#S.UD6$ rE   )r   rH   rP   rJ   s         r#   'similarity_search_with_relevance_scores;SupabaseVectorStore.similarity_search_with_relevance_scores   s>     ,,U3EE

*0
 	
r*   c                .    [        US9nU(       a  X#S'   U$ )N)query_embeddingrG   )dict)r    rK   rG   rets       r#   
match_argsSupabaseVectorStore.match_args   s     #59"M
r*   c           
        U(       ar  UR                  5        H^  u  pg[        U[        5      (       d  M  SU;   d  M$  US   nSR                  S U 5       5      n	SU SU	 S3n
U(       a  SU SU
 S3nM\  U
nM`     U R	                  X5      nU R
                  R                  U R                  U5      nU(       a%  UR                  R                  S	SU S35      Ul        UR                  R                  S
U5      Ul        UR                  5       nUR                   Vs/ sHW  nUR                  S5      (       d  M  [        UR                  S0 5      UR                  SS5      S9UR                  SS5      4PMY     nnUbH  U VVs/ sH  u  nnUU:  d  M  UU4PM     nnn[        U5      S:X  a  [        R                   " SU 35        U$ s  snf s  snnf )Nz$in,c              3  >   #    U H  nS [        U5       S 3v   M     g7f)'N)r,   ).0vs     r#   	<genexpr>XSupabaseVectorStore.similarity_search_by_vector_with_relevance_scores.<locals>.<genexpr>   s     )KAAc!fXQ-s   zmetadata->>z IN ()(z) and (andlimitcontentmetadata rj   page_content
similarity        r   zDNo relevant docs were retrieved using the relevance score threshold )items
isinstancerY   joinr[   r   rpcr   paramssetexecutedatagetr   lenwarningswarn)r    rK   rF   rG   postgrest_filterscore_thresholdkeyvalue	in_values
values_str
new_filtermatch_documents_paramsquery_builderressearchmatch_resultrR   rn   s                     r#   rP   ESupabaseVectorStore.similarity_search_by_vector_with_relevance_scores   s    $lln
eT**u~ %eI!$)K)K!KJ#.se5A!FJ (-./?.@
|ST+U(+5( - "&!?((:PQ#0#7#7#;#;+,A.$M   -3377C##% ((

 #zz)$#ZZ
B7!'Ir!: 

<- # 	 

 & (4'3OC0 "j!'3  
 < A%""1!24
 1

s   G9A GGGc                   U R                  X5      nU R                  R                  U R                  U5      nU(       a%  UR                  R                  SSU S35      Ul        UR                  R                  SU5      Ul        UR                  5       nUR                   Vs/ sH  nUR                  S5      (       d  M  [        UR                  S0 5      UR                  SS5      S9UR                  S	S
5      [        R                  " UR                  SS5      R                  S5      [        R                  SS94PM     n	nU	$ s  snf )Nrg   rf   re   rh   ri   rj   rk   rl   rn   ro   r"   z[]r^   )sep)r[   r   rs   r   rt   ru   rv   rw   rx   r   np
fromstringstripfloat32)
r    rK   rF   rG   r|   r   r   r   r   r   s
             r#   0similarity_search_by_vector_returning_embeddingsDSupabaseVectorStore.similarity_search_by_vector_returning_embeddings  s0    "&!?((:PQ#0#7#7#;#;+,A.$M   -3377C##% ((
 #zz)$#ZZ
B7!'Ir!: 

<- JJ{B/55d;RZZS # 	 
" #
s   #E BEc           	     x    Uc  [        0 5      n[        X5       VVs/ sH  u  p#[        X#S9PM     nnnU$ s  snnf )z:Return list of Documents from list of texts and metadatas.)rm   rj   )r   zipr   )r3   r4   textrj   r8   s        r#   r/   'SupabaseVectorStore._texts_to_documentsA  sM     r
I #&e"7
"7 $:"7 	 

 
s   6c           	     >   [        U5       VVs/ sH(  u  pxXG   X7   R                  UX7   R                  S.UEPM*     n	nn/ n
[        S[	        U	5      U5       H  nXX-    nU R                  U5      R                  U5      R                  5       n[	        UR                  5      S:X  a  [        S5      eUR                   Vs/ sH4  oR                  S5      (       d  M  [        UR                  S5      5      PM6     nnU
R                  U5        M     U
$ s  snnf s  snf )zAdd vectors to Supabase table.)idri   r"   rj   r   zError inserting: No rows addedr   )	enumeraterm   rj   rangery   from_upsertrv   rw   	Exceptionrx   r,   extend)r!   r   r9   r   r5   r   r6   idxr"   rowsid_listichunkrQ   s                 r#   r>    SupabaseVectorStore._add_vectorsQ  s   ( #,G"4	&
 #5 h$>66&%N33	
  #5 	 	&
  q#d)Z0AQ^,E\\*-44U;CCEF6;;1$ @AA .4[[H[EE$K#3quuT{#[CHNN3 1 1	&
( Is   .DDDc                   U R                  X5      nU Vs/ sH  owS   PM	     nnU Vs/ sH  owS   PM	     n	n[        [        R                  " U/[        R                  S9U	UUS9n
U
 Vs/ sH  oU   PM	     nnU$ s  snf s  snf s  snf )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.
r      )dtype)rF   lambda_mult)r   r   r   arrayr   )r    r"   rF   fetch_kr   r6   rQ   	doc_tuplematched_documentsmatched_embeddingsmmr_selectedr   filtered_documentss                r#   'max_marginal_relevance_search_by_vector;SupabaseVectorStore.max_marginal_relevance_search_by_vectorw  s    0 FF
 <BB6iq\6B<BCFylFC1HHi[

3#	
 =IILq2LI!! CC Js   A;B *Bc                \    U R                   R                  U5      nU R                  XbX4S9nU$ )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   rH   r   )r    rK   rF   r   r   r6   r"   r8   s           r#   max_marginal_relevance_search1SupabaseVectorStore.max_marginal_relevance_search  s:    r OO//6	;;' < 
 r*   c                
   Uc  [        S5      eU Vs/ sH  nSU0PM	     nnU HW  nU R                  R                  U R                  5      R	                  5       R                  SUS   5      R                  5         MY     gs  snf )z=Delete by vector IDs.

Args:
    ids: List of ids to delete.
NzNo ids provided to delete.r   )r=   r   r   r   deleteeqrv   )r    r5   r6   r   r   rows         r#   r   SupabaseVectorStore.delete  s     ;9:: 	&
  b 	 	 &
 CLLt/668;;D#d)LTTV &
s   B )r   r   r   r   r   )r   N)r!   supabase.client.Clientr"   r   r   r,   r   intr   Union[str, None]returnNone)r   r   )NN)
r3   Iterable[str]r4   zOptional[List[Dict[Any, Any]]]r5   Optional[List[str]]r6   r   r   	List[str])NNr   r   r   N)r?   zType['SupabaseVectorStore']r3   r   r"   r   r4   zOptional[List[dict]]r!   z Optional[supabase.client.Client]r   Optional[str]r   r   r   r   r5   r   r6   r   r   z'SupabaseVectorStore')r9   List[List[float]]r   List[Document]r5   r   r   r   )   N)
rK   r,   rF   r   rG   Optional[Dict[str, Any]]r6   r   r   r   )
r"   List[float]rF   r   rG   r   r6   r   r   r   )
rK   r,   rF   r   rG   r   r6   r   r   List[Tuple[Document, float]])rK   r   rG   r   r   zDict[str, Any])NNN)rK   r   rF   r   rG   r   r|   r   r}   zOptional[float]r   r   )
rK   r   rF   r   rG   r   r|   r   r   z(List[Tuple[Document, float, np.ndarray]]r'   )r3   r   r4   z"Optional[Iterable[Dict[Any, Any]]]r   r   )r!   r   r   r,   r9   r   r   r   r5   r   r   r   r6   r   r   r   )r      g      ?)r"   r   rF   r   r   r   r   floatr6   r   r   r   )rK   r,   rF   r   r   r   r   r   r6   r   r   r   )r5   r   r6   r   r   r   )__name__
__module____qualname____firstlineno____doc__r$   propertyr(   r:   classmethodr@   r2   rM   rI   rU   r[   rP   r   staticmethodr/   r>   r   r   r   __static_attributes__ r*   r#   r   r      s   8~ '+,&, , 	,
 , %, 
,2   59#'	44 24 !	4
 4 
4 
 +/37$/'8#'!
(!
!
 !
 (	!

 1!
 "!
 %!
 !
 !!
 !
 
!
 !
F
"
 "
 	

 

 +/	VV V )	V
 V 
V +/	  )	
  
$ +/	



 

 )	


 

 
&

 *B	 ,0*.+/<< < )	<
 (< )< 
&<D ,0*.$$ $ )	$
 ($ 
2$L  9=5 
  #&## ## "	#
 # # # 
# #P  ("(" (" 	("
 (" (" 
("Z  == = 	=
 = = 
=~W Wr*   r   )
__future__r   r-   rz   	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   r   r*   r#   <module>r      sG    "   
 
 
  - 0 3 MVW+ VWr*   