
    dh;                        S SK Jr  S SKrS SKrS SKrS SKrS SKJrJrJ	r	J
r
JrJrJr  S SKJr  S SKJr  S SKJr  \(       a  S SKr\R*                  " \5      rS
S jr " S S	\5      rg)    )annotationsN)TYPE_CHECKINGAnyIterableListOptionalTupleType)Document)
Embeddings)VectorStorec                H    [         R                  " S[        U 5      -  /U Q76 $ )zSerializes a list of floats into a compact "raw bytes" format

Source: https://github.com/asg017/sqlite-vec/blob/21c5a14fc71c83f135f5b00c84115139fd12c492/examples/simple-python/demo.py#L8-L10
z%sf)structpacklen)vectors    b/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/vectorstores/sqlitevec.pyserialize_f32r      s!    
 ;;us6{*4V44    c                  0   \ rS rSrS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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 jrSrg)	SQLiteVec#   a0  SQLite with Vec extension as a vector database.

To use, you should have the ``sqlite-vec`` python package installed.
Example:
    .. code-block:: python
        from langchain_community.vectorstores import SQLiteVec
        from langchain_community.embeddings.openai import OpenAIEmbeddings
        ...
c                
    SSK nU(       d  U R                  U5      n[        U[        5      (       d  [
        R                  " S5        X l        Xl        X0l	        U R                  5         g! [         a    [        S5      ef = f)z1Initialize with sqlite client with vss extension.r   Nz\Could not import sqlite-vec python package. Please install it with `pip install sqlite-vec`.z+embeddings input must be Embeddings object.)
sqlite_vecImportErrorcreate_connection
isinstancer   warningswarn_connection_table
_embeddingcreate_table_if_not_exists)selftable
connection	embeddingdb_filer   s         r   __init__SQLiteVec.__init__.   sy    	 //8J)Z00MMGH%#'')!  	C 	s   A, ,Bc           	        U R                   R                  SU R                   S35        U R                   R                  SU R                   SU R                  5        S35        U R                   R                  SU R                   SU R                   SU R                   S	35        U R                   R	                  5         g )
Nz(
            CREATE TABLE IF NOT EXISTS z
            (
                rowid INTEGER PRIMARY KEY AUTOINCREMENT,
                text TEXT,
                metadata BLOB,
                text_embedding BLOB
            )
            ;
            z0
            CREATE VIRTUAL TABLE IF NOT EXISTS za_vec USING vec0(
                rowid INTEGER PRIMARY KEY,
                text_embedding float[z*]
            )
            ;
            z.
                CREATE TRIGGER IF NOT EXISTS z-_embed_text 
                AFTER INSERT ON z7
                BEGIN
                    INSERT INTO z_vec(rowid, text_embedding)
                    VALUES (new.rowid, new.text_embedding) 
                    ;
                END;
            )r    executer!   get_dimensionalitycommit)r$   s    r   r#   $SQLiteVec.create_table_if_not_existsJ   s      ((,} 5		
 	  004} =&&*&=&=&?%@ A	
 	  ..2kk] ;!!% .!!% .	
	
 	!r   Nc           
        U R                   R                  SU R                   35      R                  5       S   nUc  SnU R                  R                  [        U5      5      nU(       d  U Vs/ sH  n0 PM     nn[        XU5       VVV	s/ sH(  u  pxn	U[        R                  " U5      [        U	5      4PM*     n
nnn	U R                   R                  SU R                   S3U
5        U R                   R                  5         U R                   R                  SU R                   SU 35      nU Vs/ sH  oS   PM	     sn$ s  snf s  sn	nnf s  snf )zAdd more texts to the vectorstore index.
Args:
    texts: Iterable of strings to add to the vectorstore.
    metadatas: Optional list of metadatas associated with the texts.
    kwargs: vectorstore specific parameters
z SELECT max(rowid) as rowid FROM rowidr   zINSERT INTO z/(text, metadata, text_embedding) VALUES (?,?,?)zSELECT rowid FROM z WHERE rowid > )r    r,   r!   fetchoner"   embed_documentslistzipjsondumpsr   executemanyr.   )r$   texts	metadataskwargsmax_idembeds_textmetadataembed
data_inputresultsrows                r   	add_textsSQLiteVec.add_textsm   sD    !!)).t{{m<

(*W >F00e=%*+UUI+ *-Uv)F
)F% 4::h'u)=>)F 	 
 	$$4;;-'VW	
 	!""** _VHE
 )00G00 ,
 1s   .E .E0Ec                l   SU R                    SU R                    S3nU R                  R                  5       nUR                  U[	        U5      U/5        UR                  5       n/ nU HG  n[        R                  " US   5      =(       d    0 n	[        US   U	S9n
UR                  XS   45        MI     U$ )Nzo
            SELECT 
                text,
                metadata,
                distance
            FROM z AS e
            INNER JOIN z_vec AS v on v.rowid = e.rowid  
            WHERE
                v.text_embedding MATCH ?
                AND k = ?
            ORDER BY distance
        r@   r?   )page_contentr@   distance)
r!   r    cursorr,   r   fetchallr6   loadsr   append)r$   r'   kr;   	sql_queryrJ   rC   	documentsrD   r@   docs              r   &similarity_search_with_score_by_vector0SQLiteVec.similarity_search_with_score_by_vector   s    
 ++ } %		 !!((*9%q)	
 //#	Czz#j/28bHFhGCcz?34 
 r   c                    U R                   R                  U5      nU R                  XBS9nU VVs/ sH  u  pgUPM	     snn$ s  snnf z"Return docs most similar to query.r'   rN   r"   embed_queryrR   )r$   queryrN   r;   r'   rP   rQ   r>   s           r   similarity_searchSQLiteVec.similarity_search   sM     OO//6	?? @ 
	 #,,)),,,s   Ac                Z    U R                   R                  U5      nU R                  XBS9nU$ rU   rW   )r$   rY   rN   r;   r'   rP   s         r   similarity_search_with_score&SQLiteVec.similarity_search_with_score   s9     OO//6	?? @ 
	 r   c                X    U R                  XS9nU VVs/ sH  u  pVUPM	     snn$ s  snnf )NrV   )rR   )r$   r'   rN   r;   rP   rQ   r>   s          r   similarity_search_by_vector%SQLiteVec.similarity_search_by_vector   s9     ?? @ 
	 #,,)),,,s   &c                T    U R                  U5      nU " XGXRS9nUR                  XS9  U$ )z9Return VectorStore initialized from texts and embeddings.)r%   r&   r(   r'   )r9   r:   )r   rE   )	clsr9   r'   r:   r%   r(   r;   r&   vecs	            r   
from_textsSQLiteVec.from_texts   s8     **73

 	E7
r   c                    SS K nSS KnUR                  " U 5      nUR                  Ul        UR                  S5        UR                  U5        UR                  S5        U$ )Nr   TF)sqlite3r   connectRowrow_factoryenable_load_extensionload)r(   rh   r   r&   s       r   r   SQLiteVec.create_connection   sP    __W-
!(
((.
#((/r   c                R    SnU R                   R                  U5      n[        U5      $ )z
Function that does a dummy embedding to figure out how many dimensions
this embedding function returns. Needed for the virtual table DDL.
zThis is a dummy text)r"   rX   r   )r$   
dummy_textdummy_embeddings      r   r-   SQLiteVec.get_dimensionality   s(    
 ,
//55jA?##r   )r    r"   r!   )vec.db)r%   strr&   zOptional[sqlite3.Connection]r'   r   r(   rt   )returnNone)N)r9   zIterable[str]r:   Optional[List[dict]]r;   r   ru   	List[str])   )r'   List[float]rN   intr;   r   ru   List[Tuple[Document, float]])rY   rt   rN   r{   r;   r   ru   List[Document])rY   rt   rN   r{   r;   r   ru   r|   )r'   rz   rN   r{   r;   r   ru   r}   )N	langchainrs   )rc   zType[SQLiteVec]r9   rx   r'   r   r:   rw   r%   rt   r(   rt   r;   r   ru   r   )r(   rt   ru   zsqlite3.Connection)ru   r{   )__name__
__module____qualname____firstlineno____doc__r)   r#   rE   rR   rZ   r]   r`   classmethodre   staticmethodr   r-   __static_attributes__ r   r   r   r   #   s     ** 1* 	*
 *8!"L +/"1"1 ("1 	"1
 
"1J 01$),<?	%> $%-- -03-	- $% 03	% 01-$-),-<?-	- 
 +/   (	
    
 " 
 
$r   r   )r   rz   ru   bytes)
__future__r   r6   loggingr   r   typingr   r   r   r   r   r	   r
   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   rh   	getLoggerr   loggerr   r   r   r   r   <module>r      sW    "       . 0 3			8	$5N$ N$r   