
    3fizt                        d Z ddlmZ ddl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m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	rddlmZ ej>                  Z dZ!dZ" G d de      Z#y)z?VectorStore wrapper around a Postgres-TimescaleVector database.    )annotationsN)	timedelta)
TYPE_CHECKINGAnyCallableDictIterableListOptionalTupleTypeUnion)Document)
Embeddings)get_from_dict_or_env)VectorStore)DistanceStrategy)
Predicatesi   langchain_storec                     e Zd ZdZeeeddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&dZ	 	 d'dZe	d(d       Z
d'dZeddeeddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d)d       Zeddeeddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d)d	       Z	 	 d*	 	 	 	 	 	 	 	 	 	 	 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	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 d0dZ	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 d0dZd1dZ	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 d2dZ	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 d2dZ	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 d3dZ	 	 	 d.	 	 	 	 	 	 	 	 	 	 	 d3dZedeeddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d4d       Zedeeddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d4d       Zedeeddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d5d       Zedeeddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d5d       Z eeedf	 	 	 	 	 	 	 	 	 	 	 	 	 d6d       Z!ed7d       Z"e	 	 	 	 	 	 	 	 	 	 	 	 d8d       Z#d9dZ$d:d;d Z%	 	 	 	 	 	 d<d!Z& G d" d#e'e(jR                        Z*e*jV                  Z,e,f	 	 	 	 	 d=d$Z-d'd%Z.y)>TimescaleVectora  Timescale Postgres vector store

    To use, you should have the ``timescale_vector`` python package installed.

    Args:
        service_url: Service url on timescale cloud.
        embedding: Any embedding function implementing
            `langchain.embeddings.base.Embeddings` interface.
        collection_name: The name of the collection to use. (default: langchain_store)
            This will become the table name used for the collection.
        distance_strategy: The distance strategy to use. (default: COSINE)
        pre_delete_collection: If True, will delete the collection if it exists.
            (default: False). Useful for testing.

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import TimescaleVector
            from langchain_community.embeddings.openai import OpenAIEmbeddings

            SERVICE_URL = "postgres://tsdbadmin:<password>@<id>.tsdb.cloud.timescale.com:<port>/tsdb?sslmode=require"
            COLLECTION_NAME = "state_of_the_union_test"
            embeddings = OpenAIEmbeddings()
            vectorestore = TimescaleVector.from_documents(
                embedding=embeddings,
                documents=docs,
                collection_name=COLLECTION_NAME,
                service_url=SERVICE_URL,
            )
    FNc
                   	 ddl m} || _        || _        || _        || _        || _        || _        |xs t        j                  t              | _        || _        |	| _         |j                  | j                  | j
                  | j                  | j                  j                   j#                         fd| j                  i|
| _         |j&                  | j                  | j
                  | j                  | j                  j                   j#                         fd| j                  i|
| _        | j+                          y # t        $ r t        d      w xY w)Nr   clienthCould not import timescale_vector python package. Please install it with `pip install timescale-vector`.time_partition_interval)timescale_vectorr   ImportErrorservice_url	embeddingcollection_namenum_dimensions_distance_strategypre_delete_collectionlogging	getLogger__name__loggeroverride_relevance_score_fn_time_partition_intervalSyncvaluelowersync_clientAsyncasync_client__post_init__)selfr   r    r!   r"   distance_strategyr$   r(   relevance_score_fnr   kwargsr   s               n/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/vectorstores/timescalevector.py__init__zTimescaleVector.__init__H   sV   	/ '".,"3%:"; 1 1( ;+=((?%&6;;  ##))//1	

 %)$A$A
 
 )FLL  ##))//1	

 %)$A$A
 
 	?  	I 	s   E Ec                    | j                   j                          | j                  r| j                   j                          yy)z'
        Initialize the store.
        N)r.   create_tablesr$   
delete_allr2   s    r6   r1   zTimescaleVector.__post_init__x   s6     	&&(%%'') &    c                    | j                   S N)r    r;   s    r6   
embeddingszTimescaleVector.embeddings   s    ~~r<   c                8    | j                   j                          y r>   )r.   
drop_tabler;   s    r6   drop_tableszTimescaleVector.drop_tables   s    ##%r<   c
           
     "   t        |d         }|*|D cg c]  }t        t        j                               ! }}|s|D cg c]  }i  }}|| j	                  |
      } | d||||||	d|
} |j
                  d||||d|
 |S c c}w c c}w Nr   )r   r"   r!   r    r3   r$   textsr?   	metadatasids )lenstruuiduuid4get_service_urladd_embeddingsclsrF   r?   r    rG   rH   r!   r3   r   r$   r5   r"   _stores                 r6   __fromzTimescaleVector.__from   s     Z]+;.343tzz|$4C4%*++I+--f5K 
#)+/"7
 
 	 	
J)	
PV	
 - 5 ,s   $B	Bc
           
     >  K   t        |d         }|*|D cg c]  }t        t        j                               ! }}|s|D cg c]  }i  }}|| j	                  |
      } | d||||||	d|
} |j
                  d||||d|
 d {    |S c c}w c c}w 7 wrD   )rJ   rK   rL   rM   rN   aadd_embeddingsrP   s                 r6   __afromzTimescaleVector.__afrom   s      Z]+;.343tzz|$4C4%*++I+--f5K 
#)+/"7
 
 $e## 
J)
PV
 	
 	
 - 5 ,	
s'   B$BB	B>B
BBc                    |*|D cg c]  }t        t        j                               ! }}|s|D cg c]  }i  }}t        t	        ||||            }| j
                  j                  |       |S c c}w c c}w )/  Add embeddings to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            embeddings: List of list of embedding vectors.
            metadatas: List of metadatas associated with the texts.
            kwargs: vectorstore specific parameters
        )rK   rL   rM   listzipr.   upsertr2   rF   r?   rG   rH   r5   rR   recordss           r6   rO   zTimescaleVector.add_embeddings   su      ;.343tzz|$4C4%*++I+s3	5*=>(
 5 ,s
   $A2	A7c                  K   |*|D cg c]  }t        t        j                               ! }}|s|D cg c]  }i  }}t        t	        ||||            }| j
                  j                  |       d{    |S c c}w c c}w 7 w)rY   N)rK   rL   rM   rZ   r[   r0   r\   r]   s           r6   rV   zTimescaleVector.aadd_embeddings   s       ;.343tzz|$4C4%*++I+s3	5*=>&&w///
 5 , 	0s%   B$A<B	B7B5B6Bc                x    | j                   j                  t        |            } | j                  d||||d|S )r  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.
            kwargs: vectorstore specific parameters

        Returns:
            List of ids from adding the texts into the vectorstore.
        rE   rI   )r    embed_documentsrZ   rO   r2   rF   rG   rH   r5   r?   s         r6   	add_textszTimescaleVector.add_texts  sG    " ^^33DK@
"t"" 
J)
PV
 	
r<   c                   K   | j                   j                  t        |            } | j                  d||||d| d{   S 7 w)ra   rE   NrI   )r    rb   rZ   rV   rc   s         r6   
aadd_textszTimescaleVector.aadd_texts'  sU     " ^^33DK@
)T)) 
J)
PV
 
 	
 
s   ?AAAc                h    ||dk(  s|j                         ry | j                  j                  |      S )N )isspacer    embed_query)r2   querys     r6   _embed_queryzTimescaleVector._embed_query=  s-    =ERK5==?>>--e44r<   c                R    | j                  |      } | j                  d||||d|S )e  Run similarity search with TimescaleVector with distance.

        Args:
            query (str): Query text to search for.
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query.
        r    kfilter
predicatesrI   )rl   similarity_search_by_vectorr2   rk   rp   rq   rr   r5   r    s          r6   similarity_searchz!TimescaleVector.similarity_searchD  sD    $ %%e,	/t// 
!	

 
 	
r<   c                n   K   | j                  |      } | j                  d||||d| d{   S 7 w)rn   ro   NrI   )rl   asimilarity_search_by_vectorrt   s          r6   asimilarity_searchz"TimescaleVector.asimilarity_search_  sR     $ %%e,	6T66 
!	

 
 
 	
 
   ,535c                V    | j                  |      } | j                  d||||d|}|S )b  Return docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query and score for each
        ro   rI   )rl   &similarity_search_with_score_by_vector)r2   rk   rp   rq   rr   r5   r    docss           r6   similarity_search_with_scorez,TimescaleVector.similarity_search_with_scorez  sH    $ %%e,	:t:: 
!	

 
 r<   c                n   K   | j                  |      } | j                  d||||d| d{   S 7 w)r{   ro   NrI   )rl   'asimilarity_search_with_score_by_vectorrt   s          r6   asimilarity_search_with_scorez-TimescaleVector.asimilarity_search_with_score  sR     & %%e,	ATAA 
!	

 
 
 	
 
ry   c                    dD ci c]  }||v r|||    }}|rt        |      dk(  ry 	 ddlm}  |j                  di |S c c}w # t        $ r t        d      w xY w)N)
start_dateend_date
time_deltastart_inclusiveend_inclusiver   r   r   rI   )rJ   r   r   r   UUIDTimeRange)r2   r5   keyconstructor_argsr   s        r6   date_to_range_filterz$TimescaleVector.date_to_range_filter  s    

 f} 

 

  3'7#8A#=	/ $v##7&677+

   	I 	s   AA Ac                4   	 ddl m} | j                  j	                  |||| | j
                  di |      }|D cg c]8  }t        ||j                     ||j                           ||j                     f: }	}|	S # t        $ r t        d      w xY wc c}w Nr   r   r   )limitrq   rr   uuid_time_filter)page_contentmetadatarI   )
r   r   r   r.   searchr   r   SEARCH_RESULT_CONTENTS_IDXSEARCH_RESULT_METADATA_IDXSEARCH_RESULT_DISTANCE_IDX
r2   r    rp   rq   rr   r5   r   resultsresultr}   s
             r6   r|   z6TimescaleVector.similarity_search_with_score_by_vector  s    	/ ""))!6T66@@ * 
  "	
  !'(I(I!J#F$E$EF v889	
 	
 1  	I 		
s   A= =B=Bc                P  K   	 ddl m} | j                  j	                  |||| | j
                  di |       d {   }|D cg c]8  }t        ||j                     ||j                           ||j                     f: }	}|	S # t        $ r t        d      w xY w7 ac c}w wr   )
r   r   r   r0   r   r   r   r   r   r   r   s
             r6   r   z7TimescaleVector.asimilarity_search_with_score_by_vector  s     	/ ))00!6T66@@ 1 
 
  "	
  !'(I(I!J#F$E$EF v889	
 	
 1  	I 	
	
s7   B&B 3B&BB&=B!B&BB&!B&c                f     | j                   d||||d|}|D cg c]  \  }}|	 c}}S c c}}w )k  Return docs most similar to embedding vector.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query vector.
        ro   rI   )r|   	r2   r    rp   rq   rr   r5   docs_and_scoresdocrR   s	            r6   rs   z+TimescaleVector.similarity_search_by_vector  sG    $ F$EE 
1V

NT
 #22Q222s   -c                   K    | j                   d||||d| d{   }|D cg c]  \  }}|	 c}}S 7 c c}}w w)r   ro   NrI   )r   r   s	            r6   rw   z,TimescaleVector.asimilarity_search_by_vector)  sW     $ !M L L !
1V
!
NT!
 
 #22Q22
 3s   ?7	?9??c           	     l    |j                  t        |            }	 | j                  ||	|f|||||d|S )
        Return VectorStore initialized from texts and embeddings.
        Postgres connection string is required
        "Either pass it as a parameter
        or set the TIMESCALE_SERVICE_URL environment variable.
        rG   rH   r!   r3   r$   )rb   rZ   _TimescaleVector__from
rQ   rF   r    rG   r!   r3   rH   r$   r5   r?   s
             r6   
from_textszTimescaleVector.from_texts@  sT    $ ..tE{;
szz

  +/"7

 

 
	
r<   c           	        K   |j                  t        |            }	 | j                  ||	|f|||||d| d{   S 7 w)r   r   N)rb   rZ   _TimescaleVector__afromr   s
             r6   afrom_textszTimescaleVector.afrom_texts`  sb     $ ..tE{;
 S[[

  +/"7

 

 

 
	
 

s   9AA Ac           	         |D 	cg c]  }	|	d   	 }
}	|D 	cg c]  }	|	d   	 }}	 | j                   |
||f|||||d|S c c}	w c c}	w )$  Construct TimescaleVector wrapper from raw documents and pre-
        generated embeddings.

        Return VectorStore initialized from documents and embeddings.
        Postgres connection string is required
        "Either pass it as a parameter
        or set the TIMESCALE_SERVICE_URL environment variable.

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import TimescaleVector
                from langchain_community.embeddings import OpenAIEmbeddings
                embeddings = OpenAIEmbeddings()
                text_embeddings = embeddings.embed_documents(texts)
                text_embedding_pairs = list(zip(texts, text_embeddings))
                tvs = TimescaleVector.from_embeddings(text_embedding_pairs, embeddings)
        r      r   )r   rQ   text_embeddingsr    rG   r!   r3   rH   r$   r5   trF   r?   s               r6   from_embeddingszTimescaleVector.from_embeddings  sv    <  //!1//$34qad4
4szz

  +/"7

 

 
	
 04s
   A Ac           	        K   |D 	cg c]  }	|	d   	 }
}	|D 	cg c]  }	|	d   	 }}	 | j                   |
||f|||||d| d{   S c c}	w c c}	w 7 w)r   r   r   r   N)r   r   s               r6   afrom_embeddingsz TimescaleVector.afrom_embeddings  s     <  //!1//$34qad4
4 S[[

  +/"7

 

 

 
	
 04

s%   AA
AA AAAc                B    | j                  |      } | |||||      }|S )z
        Get instance of an existing TimescaleVector store.This method will
        return the instance of the store without inserting any new
        embeddings
        )r   r!   r    r3   r$   )rN   )rQ   r    r!   r3   r$   r5   r   rS   s           r6   from_existing_indexz#TimescaleVector.from_existing_index  s4     ))&1#+/"7
 r<   c                <    t        |dd      }|st        d      |S )Nr   TIMESCALE_SERVICE_URL)datar   env_keyzyPostgres connection string is requiredEither pass it as a parameteror set the TIMESCALE_SERVICE_URL environment variable.)r   
ValueError)rQ   r5   r   s      r6   rN   zTimescaleVector.get_service_url  s5    /+
 I  r<   c           
     $    d| d| d| d| d| 
S )z2Return connection string from database parameters.zpostgresql://:@/rI   )rQ   hostportdatabaseuserpasswords         r6   service_url_from_db_paramsz*TimescaleVector.service_url_from_db_params  s)     tfAhZqavQxjIIr<   c                Z   | j                   | j                   S | j                  t        j                  k(  r| j                  S | j                  t        j
                  k(  r| j                  S | j                  t        j                  k(  r| j                  S t        d| j                   d      )a8  
        The 'correct' relevance function
        may differ depending on a few things, including:
        - the distance / similarity metric used by the VectorStore
        - the scale of your embeddings (OpenAI's are unit normed. Many others are not!)
        - embedding dimensionality
        - etc.
        z=No supported normalization function for distance_strategy of zF.Consider providing relevance_score_fn to TimescaleVector constructor.)
r)   r#   r   COSINE_cosine_relevance_score_fnEUCLIDEAN_DISTANCE_euclidean_relevance_score_fnMAX_INNER_PRODUCT%_max_inner_product_relevance_score_fnr   r;   s    r6   _select_relevance_score_fnz*TimescaleVector._select_relevance_score_fn  s     ++7333 ""&6&=&==222$$(8(K(KK555$$(8(J(JJ===--1-D-D,E FXX r<   c                T    |t        d      | j                  j                  |       y)3  Delete by vector ID or other criteria.

        Args:
            ids: List of ids to delete.
            **kwargs: Other keyword arguments that subclasses might use.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise, None if not implemented.
        zNo ids provided to delete.T)r   r.   delete_by_ids)r2   rH   r5   s      r6   deletezTimescaleVector.delete-  s,     ;9::&&s+r<   c                :    | j                   j                  |       y)r   T)r.   delete_by_metadata)r2   rq   r5   s      r6   r   z"TimescaleVector.delete_by_metadata?  s     	++F3r<   c                      e Zd ZdZdZdZdZy)TimescaleVector.IndexTypez(Enumerator for the supported Index typestsvivfflathnswN)r'   
__module____qualname____doc__TIMESCALE_VECTORPGVECTOR_IVFFLATPGVECTOR_HNSWrI   r<   r6   	IndexTyper   P  s    6 $r<   r   c                `   	 ddl m} t        || j                        r|j
                  n|}|| j                  j                  j
                  k(  r+| j                  j                   |j                  di |       || j                  j                  j
                  k(  r+| j                  j                   |j                  di |       || j                  j                  j
                  k(  r,| j                  j                   |j                  di |       y y # t        $ r t        d      w xY w)Nr   r   r   rI   )r   r   r   
isinstancer   r,   r   r.   create_embedding_indexIvfflatIndexr   	HNSWIndexr   TimescaleVectorIndex)r2   
index_typer5   r   s       r6   create_indexzTimescaleVector.create_indexY  s   	/ !+:t~~ FJJ 	 88>>>334GF4G4G4Q&4QR55;;;334DF4D4D4Nv4NO88>>>33+++5f5 ?  	I 	s   D D-c                8    | j                   j                          y r>   )r.   drop_embedding_indexr;   s    r6   
drop_indexzTimescaleVector.drop_indexr  s    --/r<   )r   rK   r    r   r!   rK   r"   intr3   r   r$   boolr(   zOptional[logging.Logger]r4   z"Optional[Callable[[float], float]]r   zOptional[timedelta]r5   r   returnNone)r   r   )r   r   )rF   	List[str]r?   List[List[float]]r    r   rG   Optional[List[dict]]rH   Optional[List[str]]r!   rK   r3   r   r   zOptional[str]r$   r   r5   r   r   r   )NN)rF   Iterable[str]r?   r   rG   r   rH   r   r5   r   r   r   )
rF   r   rG   r   rH   r   r5   r   r   r   )rk   rK   r   Optional[List[float]])   NN)rk   rK   rp   r   rq   Optional[Union[dict, list]]rr   Optional[Predicates]r5   r   r   List[Document])rk   rK   rp   r   rq   r   rr   r   r5   r   r   List[Tuple[Document, float]])r5   r   r   r   )r    r   rp   r   rq   r   rr   r   r5   r   r   r   )r    r   rp   r   rq   r   rr   r   r5   r   r   r   )rQ   Type[TimescaleVector]rF   r   r    r   rG   r   r!   rK   r3   r   rH   r   r$   r   r5   r   r   r   )r   zList[Tuple[str, List[float]]]r    r   rG   r   r!   rK   r3   r   rH   r   r$   r   r5   r   r   r   )rQ   r   r    r   r!   rK   r3   r   r$   r   r5   r   r   r   )r5   zDict[str, Any]r   rK   )r   rK   r   r   r   rK   r   rK   r   rK   r   rK   )r   zCallable[[float], float]r>   )rH   r   r5   r   r   Optional[bool])rq   z+Union[Dict[str, str], List[Dict[str, str]]]r5   r   r   r   )r   zUnion[IndexType, str]r5   r   r   r   )/r'   r   r   r   "_LANGCHAIN_DEFAULT_COLLECTION_NAMEADA_TOKEN_COUNTDEFAULT_DISTANCE_STRATEGYr7   r1   propertyr?   rB   classmethodr   r   rO   rV   rd   rf   rl   ru   rx   r~   r   r   r|   r   rs   rw   r   r   r   r   r   rN   r   r   r   r   rK   enumEnumr   r   DEFAULT_INDEX_TYPEr   r   rI   r<   r6   r   r   (   s   F  B-.G&++/AE7;.. . 	.
 . ,.  $. ). ?. "5. . 
.`*	*  &  +/#'A.G%)&+&& && 	&
 (& !& & ,& #&  $& & 
& &P  +/#'A.G%)&+&& && 	&
 (& !& & ,& #&  $& & 
& &X +/#' & (	
 !  
> +/#' & (	
 !  
< +/#'	

 (
 !	

 
 

2 +/#'	

 (
 !	

 
 

,5 .2+/

 
 ,	

 )
 
 

< .2+/

 
 ,	

 )
 
 

< .2+/  ,	
 )  
&> .2+/

 
 ,	

 )
 
 
&
886 .2+/"(" " ,	"
 )" " 
&"N .2+/"(" " ,	"
 )" " 
&"N .2+/3(3 3 ,	3
 )3 3 
34 .2+/3(3 3 ,	3
 )3 3 
3. 
 +/A.G#'&+
"

 
 (	

 
 ,
 !
  $
 
 

 
> 
 +/A.G#'&+
"

 
 (	

 
 ,
 !
  $
 
 

 
> 
 +/A.G#'&+*
6*
 *
 (	*

 *
 ,*
 !*
  $*
 *
 
*
 *
X 
 +/A.G#'&+*
6*
 *
 (	*

 *
 ,*
 !*
  $*
 *
 
*
 *
X   B.G&+"  ,	
  $  
 4    	J	J 	J 		J
 	J 	J 
	J 	J6$AMP	"C  #33 3E/PS	20r<   r   )$r   
__future__r   r   r%   rL   datetimer   typingr   r   r   r   r	   r
   r   r   r   r   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   r   r   r   r   r   r   r   rI   r<   r6   <module>r	     sd    E "       . 0 5 3 C+ -33 %6 "K0k K0r<   