o
    ZhW%                     @  s   d dl mZ d dlZd dlZd dlZd dl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 eeZdd
dZG dd deZdS )    )annotationsN)AnyIterableListOptionalType)Document)
Embeddings)get_from_dict_or_env)VectorStorereturnstrc                   C  s
   t  jS N)uuiduuid4hex r   r   \/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/tair.py	_uuid_key   s   
r   c                   @  s   e Zd ZdZ			d7d8ddZed9ddZd:ddZ	d;d<d"d#Z	$d=d>d(d)Z	e
		*		d?d@d.d/Ze
		*		d?dAd1d2Ze	*dBdCd3d4Ze
	*		dDdEd5d6ZdS )FTairz`Tair` vector store.contentmetadataNembedding_functionr	   urlr   
index_namecontent_keymetadata_keysearch_paramsOptional[dict]kwargsr   c              
   K  s   || _ || _zddlm} W n ty   tdw z|j|fi |}	W n ty8 }
 ztd|
 d }
~
ww |	| _|| _|| _	|| _
d S )Nr   r   PCould not import tair python package. Please install it with `pip install tair`.zTair failed to connect: )r   r   tairr   ImportErrorfrom_url
ValueErrorclientr   r   r   )selfr   r   r   r   r   r   r   
TairClientr&   er   r   r   __init__   s&   

zTair.__init__r   c                 C  s   | j S r   )r   )r'   r   r   r   
embeddings5   s   zTair.embeddingsdimintdistance_type
index_type	data_typeboolc                 K  sF   | j | j}|d urtd dS | j j| j||||fi | dS )NzIndex already existsFT)r&   tvs_get_indexr   loggerinfoZtvs_create_index)r'   r,   r.   r/   r0   r   indexr   r   r   create_index_if_not_exist9   s   
zTair.create_index_if_not_existtextsIterable[str]	metadatasOptional[List[dict]]	List[str]c                 K  s  g }| dd}d}| j| j}|dur| ddkrd}| jjdd}| jt|}	t|D ]O\}
}|r;||
 nt	 }|rD||
 ni }|rc|j
| j||	|
 dfi d|| j|| jt|i n|j
| j||	|
 dfi | j|| jt|i || q1|  |S )	z$Add texts data to an existing index.keysNFZlexical_algorithmZbm25TZtransactionZTEXT)getr&   r2   r   pipeliner   embed_documentslist	enumerater   Ztvs_hsetr   r   jsondumpsappendexecute)r'   r7   r9   r   Zidsr<   Zuse_hybrid_searchr5   r?   r+   itextkeyr   r   r   r   	add_textsO   sH   
zTair.add_texts   querykList[Document]c           
      K  sr   | j |}| jj| j||ddfi |}| jjdd}|D ]\}}|| j|| j| j q|	 }	dd |	D S )a\  
        Returns the most similar indexed documents to the query text.

        Args:
            query (str): The query text for which to find similar documents.
            k (int): The number of documents to return. Default is 4.

        Returns:
            List[Document]: A list of documents that are most similar to the query text.
        FNr=   c                 S  s&   g | ]}t |d  t|d dqS )   r   )page_contentr   )r   rC   loads.0dr   r   r   
<listcomp>   s    z*Tair.similarity_search.<locals>.<listcomp>)
r   Zembed_queryr&   Ztvs_knnsearchr   r?   Z	tvs_hmgetr   r   rF   )
r'   rL   rM   r   	embeddingZkeys_and_scoresr?   rI   _docsr   r   r   similarity_search   s   zTair.similarity_search	langchaincls
Type[Tair]rV   c              
   K  s\  zddl m} W n ty   tdw t|dd}	d|v r#|d |jj}
d|v r0|d}
|jj}d|v r=|d}|j	j
}d|v rJ|d}i }d	|v rU|d	}i }d
|v r`|d
}d }d|v rk|d}z| ||	|f|||d|}W n ty } ztd| d }~ww ||}|jt|d |
||fi | |j|||d |S )Nr   )
tairvectorr!   tair_urlTAIR_URLr.   r/   r0   index_paramsr   r<   r   r   r   ztair failed to connect: )r<   )r"   r]   r#   r
   popZDistanceMetricZInnerProductZ	IndexTypeZHNSWZDataTypeZFloat32r%   r@   r6   lenrJ   )r[   r7   rV   r9   r   r   r   r   r]   r   r.   r/   r0   r`   r   r<   Ztair_vector_storer)   r+   r   r   r   
from_texts   sn   







	

zTair.from_texts	documentsc           	      K  s8   dd |D }dd |D }| j ||||||fi |S )Nc                 S     g | ]}|j qS r   )rP   rR   r   r   r   rU          z'Tair.from_documents.<locals>.<listcomp>c                 S  rf   r   )r   rR   r   r   r   rU      rg   )rd   )	r[   re   rV   r9   r   r   r   r   r7   r   r   r   from_documents   s   zTair.from_documentsc              
   K  s   zddl m} W n ty   tdw t|dd}zd|v r$|d |jdd|i|}W n tyB } ztd| d}~ww || }|dkrSt	d	 d
S dS )z
        Drop an existing index.

        Args:
            index_name (str): Name of the index to drop.

        Returns:
            bool: True if the index is dropped successfully.
        r   r    r!   r^   r_   r   zTair connection error: NzIndex does not existFTr   )
r"   r   r#   r
   rb   r$   r%   Ztvs_del_indexr3   r4   )r   r   r(   r   r&   r)   retr   r   r   
drop_index   s*   


zTair.drop_indexc                 K  s>   t |dd}i }d|v r|d}| |||f|||d|S )z"Connect to an existing Tair index.r^   r_   r   ra   )r
   rb   )r[   rV   r   r   r   r   r   r   r   r   r   from_existing_index  s   

zTair.from_existing_index)r   r   N)r   r	   r   r   r   r   r   r   r   r   r   r   r   r   )r   r	   )r,   r-   r.   r   r/   r   r0   r   r   r   r   r1   r   )r7   r8   r9   r:   r   r   r   r;   )rK   )rL   r   rM   r-   r   r   r   rN   )NrZ   r   r   )r[   r\   r7   r;   rV   r	   r9   r:   r   r   r   r   r   r   r   r   r   r   )re   rN   rV   r	   r9   r:   r   r   r   r   r   r   r   r   r   r   )rZ   )r   r   r   r   r   r1   )rZ   r   r   )rV   r	   r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__r*   propertyr+   r6   rJ   rY   classmethodrd   rh   staticmethodrj   rk   r   r   r   r   r      sB    
1#C$r   )r   r   )
__future__r   rC   loggingr   typingr   r   r   r   r   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr	   Zlangchain_core.utilsr
   Zlangchain_core.vectorstoresr   	getLoggerrl   r3   r   r   r   r   r   r   <module>   s    

