a
    bgW%                     @  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
dZG dd deZdS )    )annotationsN)AnyIterableListOptionalType)Document)
Embeddings)get_from_dict_or_env)VectorStorestrreturnc                   C  s
   t  jS N)uuiduuid4hex r   r   s/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/tair.py	_uuid_key   s    r   c                   @  s   e Zd ZdZd-dddddddd	d
dZeddddZdddddddddZd.dddddddZd/dddddddZ	e
d0d dddddddd d!	d"d#Ze
d1dddddddd d$d%d&Zed2dddd'd(d)Ze
d3dddddd d*d+d,ZdS )4Tairz`Tair` vector store.contentmetadataNr	   r   zOptional[dict]r   )embedding_functionurl
index_namecontent_keymetadata_keysearch_paramskwargsc              
   K  s   || _ || _zddlm} W n ty6   tdY n0 z|j|fi |}	W n2 ty }
 ztd|
 W Y d }
~
n
d }
~
0 0 |	| _|| _|| _	|| _
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intbool)dimdistance_type
index_type	data_typer   r   c                 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/   r0   r1   r   indexr   r   r   create_index_if_not_exist9   s    
zTair.create_index_if_not_existzIterable[str]zOptional[List[dict]]z	List[str])texts	metadatasr   r   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 ]\}
}|rv||
 nt	 }|r||
 ni }|r|j
| j||	|
 dfi d|| j|| jt|i n0|j
| j||	|
 dfi | j|| jt|i || qb|  |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   r8   r   Zidsr9   Zuse_hybrid_searchr5   r<   r+   itextkeyr   r   r   r   	add_textsO   sH    
zTair.add_texts   zList[Document])querykr   r   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   r@   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   rC   )
r'   rI   rJ   r   	embeddingZkeys_and_scoresr<   rF   _docsr   r   r   similarity_search   s    zTair.similarity_search	langchainz
Type[Tair])	clsr7   rR   r8   r   r   r   r   r   c              
   K  sn  zddl m} W n ty*   tdY n0 t|dd}	d|v rJ|d |jj}
d|v rd|d}
|jj}d|v r~|d}|j	j
}d|v r|d}i }d	|v r|d	}i }d
|v r|d
}d }d|v r|d}z | ||	|f|||d|}W n4 ty. } ztd| W Y d }~n
d }~0 0 ||}|jt|d |
||fi | |j|||d |S )Nr   )
tairvectorr!   tair_urlTAIR_URLr/   r0   r1   index_paramsr   r9   r   r   r   ztair failed to connect: )r9   )r"   rX   r#   r
   popZDistanceMetricZInnerProductZ	IndexTypeZHNSWZDataTypeZFloat32r%   r=   r6   lenrG   )rW   r7   rR   r8   r   r   r   r   rX   r   r/   r0   r1   r[   r   r9   Ztair_vector_storer)   r+   r   r   r   
from_texts   sh    








	$

zTair.from_texts)	documentsrR   r8   r   r   r   r   r   c           	      K  s8   dd |D }dd |D }| j ||||||fi |S )Nc                 S  s   g | ]
}|j qS r   )rL   rN   r   r   r   rQ          z'Tair.from_documents.<locals>.<listcomp>c                 S  s   g | ]
}|j qS r   )r   rN   r   r   r   rQ      ra   )r_   )	rW   r`   rR   r8   r   r   r   r   r7   r   r   r   from_documents   s    zTair.from_documents)r   r   r   c              
   K  s   zddl m} W n ty*   tdY n0 t|dd}z*d|v rL|d |jf d|i|}W n2 ty } ztd| W Y d}~n
d}~0 0 || }|dkrt	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!   rY   rZ   r   zTair connection error: NzIndex does not existFT)
r"   r   r#   r
   r]   r$   r%   Ztvs_del_indexr3   r4   )r   r   r(   r   r&   r)   retr   r   r   
drop_index   s$    

$

zTair.drop_index)rR   r   r   r   r   r   c                 K  s>   t |dd}i }d|v r"|d}| |||f|||d|S )z"Connect to an existing Tair index.rY   rZ   r   r\   )r
   r]   )rW   rR   r   r   r   r   r   r   r   r   r   from_existing_index  s    

zTair.from_existing_index)r   r   N)N)rH   )NrV   r   r   )NrV   r   r   )rV   )rV   r   r   )__name__
__module____qualname____doc__r*   propertyr+   r6   rG   rU   classmethodr_   rb   staticmethodrd   re   r   r   r   r   r      s@       1 #    "C      $   r   )
__future__r   r@   loggingr   typingr   r   r   r   r   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr	   Zlangchain_core.utilsr
   Zlangchain_core.vectorstoresr   	getLoggerrf   r3   r   r   r   r   r   r   <module>   s   
