
    ha@                        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y)    )annotationsN)repeat)	TYPE_CHECKINGAnyDictIterableListOptionalTupleTypeUnion)Document)
Embeddings)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		 	 	 	 	 	 	 	 ddZ
	 	 d	 	 	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 	 	 	 	 dd	Z	 	 d	 	 	 	 	 	 	 	 	 dd
Z	 	 	 	 	 	 ddZ	 	 	 d 	 	 	 	 	 	 	 	 	 	 	 d!dZ	 	 d	 	 	 	 	 	 	 	 	 d"dZe	 d#	 	 	 	 	 d$d       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d%d       Z	 	 	 d&	 	 	 	 	 	 	 	 	 	 	 d'dZ	 	 	 d&	 	 	 	 	 	 	 	 	 	 	 d(dZd#d)dZy)*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",
        )

    Nc                    	 ddl }|| _        || _        |xs d| _        |xs d| _        |xs d| _        y# t        $ r t        d      w xY w)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          g/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/supabase.py__init__zSupabaseVectorStore.__init__X   sc    	 &/$3$9(9$+  	A 	s	   6 Ac                    | j                   S N)r   )r   s    r"   
embeddingszSupabaseVectorStore.embeddingsq   s        c                    |xs+ |D cg c]  }t        t        j                               ! c}}| j                  ||      }| j                  j                  t        |            }| j                  |||      S c c}w r%   )struuiduuid4_texts_to_documentsr   embed_documentslistadd_vectors)r   texts	metadatasidskwargs_docsvectorss           r"   	add_textszSupabaseVectorStore.add_textsu   sh     77Ac$**,'7''y9//11$u+>s33	 8s   $A9c	                $   |st        d      |st        d      |j                  |      }
|D cg c]  }t        t        j                               ! }}| j                  ||      } | j                  |||
|||fi |	  | |||||      S c c}w )z9Return VectorStore initialized from texts and embeddings.zSupabase client is required.z)Supabase document table_name is required.)r    r!   r   r   r   )
ValueErrorr-   r)   r*   r+   r,   _add_vectors)clsr0   r!   r1   r    r   r   r   r2   r3   r&   r4   r5   s                r"   
from_textszSupabaseVectorStore.from_texts   s     ;<<HII..u5
*/0Qs4::< 00&&ui8J
D#z	
EK	
 !!!
 	
 1s   $Bc                j    | j                  | j                  | j                  |||| j                        S r%   )r:   r   r   r   )r   r6   r   r2   s       r"   r/   zSupabaseVectorStore.add_vectors   s0       LL$//7IsDOO
 	
r'   c                d    | j                   j                  |      } | j                  |f||d|S N)kfilter)r   embed_querysimilarity_search_by_vectorr   queryr@   rA   r3   vectors         r"   similarity_searchz%SupabaseVectorStore.similarity_search   s7     ,,U3/t//U!FUfUUr'   c                f     | j                   |f||d|}|D cg c]  \  }}|	 }}}|S c c}}w r?   )1similarity_search_by_vector_with_relevance_scores)	r   r!   r@   rA   r3   resultdocr4   r   s	            r"   rC   z/SupabaseVectorStore.similarity_search_by_vector   sP     HGG
6
-3
 (..VS!S.	. /s   -c                d    | j                   j                  |      } | j                  |f||d|S r?   )r   rB   rI   rD   s         r"   'similarity_search_with_relevance_scoresz;SupabaseVectorStore.similarity_search_with_relevance_scores   sB     ,,U3EtEE

*0
 	
r'   c                ,    t        |      }|r||d<   |S )N)query_embeddingrA   )dict)r   rE   rA   rets       r"   
match_argszSupabaseVectorStore.match_args   s     #59"CM
r'   c           
     X   |rb|j                         D ]O  \  }}t        |t              sd|v s|d   }dj                  d |D              }	d| d|	 d}
|r
d| d|
 d}N|
}Q | j	                  ||      }| j
                  j                  | j                  |      }|r%|j                  j                  d	d| d      |_        |j                  j                  d
|      |_        |j                         }|j                  D cg c]R  }|j                  d      r?t        |j                  di       |j                  dd            |j                  dd      fT }}|A|D cg c]  \  }}||k\  r||f }}}t        |      dk(  rt        j                   d|        |S c c}w c c}}w )Nz$in,c              3  :   K   | ]  }d t        |       d   yw)'N)r)   ).0vs     r"   	<genexpr>zXSupabaseVectorStore.similarity_search_by_vector_with_relevance_scores.<locals>.<genexpr>   s     )KAAc!fXQ-)Ks   zmetadata->>z IN ()(z) and (andlimitcontentmetadata r_   page_content
similarity        r   zDNo relevant docs were retrieved using the relevance score threshold )items
isinstancerP   joinrR   r   rpcr   paramssetexecutedatagetr   lenwarningswarn)r   rE   r@   rA   postgrest_filterscore_thresholdkeyvalue	in_values
values_str
new_filtermatch_documents_paramsquery_builderressearchmatch_resultrK   rc   s                     r"   rI   zESupabaseVectorStore.similarity_search_by_vector_with_relevance_scores   s    $lln 6
UeT*u~ %eI!$)K)K!KJ#.se5A!FJ (-./?.@
|ST+U(+5(6 "&!?((:PQ#0#7#7#;#;+,A.$M   -3377C##% ((

 zz)$ #ZZ
B7!'Ir!: 

<-

 

 & (4#C0 j!L 
 < A%""1!24
 1

s   AF!#F&c                   | j                  ||      }| j                  j                  | j                  |      }|r%|j                  j                  dd| d      |_        |j                  j                  d|      |_        |j                         }|j                  D cg c]  }|j                  d      rt        |j                  di       |j                  dd            |j                  d	d
      t        j                  |j                  dd      j                  d      t        j                  d      f }	}|	S c c}w )Nr\   r[   rZ   r]   r^   r_   r`   ra   rc   rd   r!   z[]rT   )sep)rR   r   rh   r   ri   rj   rk   rl   rm   r   np
fromstringstripfloat32)
r   rE   r@   rA   rq   rx   ry   rz   r{   r|   s
             r"   0similarity_search_by_vector_returning_embeddingszDSupabaseVectorStore.similarity_search_by_vector_returning_embeddings  s*    "&!?((:PQ#0#7#7#;#;+,A.$M   -3377C##% ((
 zz)$ #ZZ
B7!'Ir!: 

<- JJ{B/55d;RZZS
 
" #
s   BD>c                ~    |t        i       }t        | |      D cg c]  \  }}t        ||       }}}|S c c}}w )z:Return list of Documents from list of texts and metadatas.)rb   r_   )r   zipr   )r0   r1   textr_   r5   s        r"   r,   z'SupabaseVectorStore._texts_to_documentsA  sP     r
I #&eY"7
h $:
 

 
s   9c           	     2   t        |      D cg c]+  \  }}||   ||   j                  |||   j                  d|- }	}}g }
t        dt	        |	      |      D ]  }|	|||z    }| j                  |      j                  |      j                         }t	        |j                        dk(  rt        d      |j                  D cg c].  }|j                  d      st        |j                  d            0 }}|
j                  |        |
S c c}}w c c}w )zAdd vectors to Supabase table.)idr^   r!   r_   r   zError inserting: No rows addedr   )	enumeraterb   r_   rangern   from_upsertrk   rl   	Exceptionrm   r)   extend)r    r   r6   r   r2   r   r3   idxr!   rowsid_listichunkrJ   s                 r"   r:   z SupabaseVectorStore._add_vectorsQ  s   ( #,G"4	&
 Y #h$S>66&%cN33	
 	&
 	&
  q#d)Z0 	 AQ^,E\\*-44U;CCEF6;;1$ @AA .4[[HAEE$K3quuT{#HCHNN3	  1	&
( Is   0DDDc                   | j                  ||      }|D cg c]  }|d   	 }}|D cg c]  }|d   	 }	}t        t        j                  |gt        j                        |	||      }
|
D cg c]  }||   	 }}|S c c}w 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:
            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)r@   lambda_mult)r   r   r   arrayr   )r   r!   r@   fetch_kr   r3   rJ   	doc_tuplematched_documentsmatched_embeddingsmmr_selectedr   filtered_documentss                r"   'max_marginal_relevance_search_by_vectorz;SupabaseVectorStore.max_marginal_relevance_search_by_vectorw  s    0 FFw
 <BBiYq\BB<BCyilCC1HHi[

3#	
 =IIq/2II!! CC Js   A>B.Bc                f    | j                   j                  |      }| 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   rB   r   )r   rE   r@   r   r   r3   r!   r5   s           r"   max_marginal_relevance_searchz1SupabaseVectorStore.max_marginal_relevance_search  s>    r OO//6	;;q'{ < 
 r'   c                    |t        d      |D cg c]  }d|i }}|D ]V  }| j                  j                  | j                        j	                         j                  d|d         j                          X yc c}w )zUDelete by vector IDs.

        Args:
            ids: List of ids to delete.
        NzNo ids provided to delete.r   )r9   r   r   r   deleteeqrk   )r   r2   r3   r   r   rows         r"   r   zSupabaseVectorStore.delete  s     ;9:: 	&
  b&
 &
  	WCLLt/668;;D#d)LTTV	W&
s   A;)r   N)r    supabase.client.Clientr!   r   r   r)   r   intr   Union[str, None]returnNone)r   r   )NN)
r0   Iterable[str]r1   zOptional[List[Dict[Any, Any]]]r2   Optional[List[str]]r3   r   r   	List[str])NNr   r   r   N)r;   zType['SupabaseVectorStore']r0   r   r!   r   r1   zOptional[List[dict]]r    z Optional[supabase.client.Client]r   Optional[str]r   r   r   r   r2   r   r3   r   r   z'SupabaseVectorStore')r6   List[List[float]]r   List[Document]r2   r   r   r   )   N)
rE   r)   r@   r   rA   Optional[Dict[str, Any]]r3   r   r   r   )
r!   List[float]r@   r   rA   r   r3   r   r   r   )
rE   r)   r@   r   rA   r   r3   r   r   List[Tuple[Document, float]])rE   r   rA   r   r   zDict[str, Any])NNN)rE   r   r@   r   rA   r   rq   r   rr   zOptional[float]r   r   )
rE   r   r@   r   rA   r   rq   r   r   z(List[Tuple[Document, float, np.ndarray]]r%   )r0   r   r1   z"Optional[Iterable[Dict[Any, Any]]]r   r   )r    r   r   r)   r6   r   r   r   r2   r   r   r   r3   r   r   r   )r      g      ?)r!   r   r@   r   r   r   r   floatr3   r   r   r   )rE   r)   r@   r   r   r   r   r   r3   r   r   r   )r2   r   r3   r   r   r   )__name__
__module____qualname____doc__r#   propertyr&   r7   classmethodr<   r/   rG   rC   rM   rR   rI   r   staticmethodr,   r:   r   r   r    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r'   r   )
__future__r   r*   ro   	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'   