o
    Zh                     @  s6  U d dl mZ d dl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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 d d	l m!Z! e	rcd dl"Z"ed
 Z#e$ee#Z%de&d< ed Z'e$ee'Z(de&d< dZ)dZ*dZ+e+d Z,g dZ-g dZ.ddi gZ/e0e1Z2ddd Z3dd#d$Z4dd&d'Z5ddd.d/Z6ed0d1d2d3G d4d5 d5eZ7							dddBdCZ8							D		dddMdNZ9ddSdTZ:dUg dfddXdYZ;dd\d]Z<dd_d`Z=ddddeZ>ddhdiZ?ddmdnZ@ddrdsZA	D	DdddwdxZBddzd{ZCdd~dZDdS )    )annotationsN)deepcopy)TYPE_CHECKINGAnyCallableDictIterableListLiteralOptionalSizedTupleTypeUnionget_args)
deprecated)Document)
Embeddings)VectorStore)maximal_marginal_relevance)L2ZIPzList[DISTANCE_METRICS]AVAILABLE_DISTANCE_METRICS)ZTileDBDenseZTileDBSparse	FaissFlatZFaissIVFFlatZFlinngzList[ENGINES]AVAILABLE_ENGINESZ	langchain          )	_distanceidcontent)r   r   blobzMissing propertyxr   yx_namestry_namereturnNonec                 C  sZ   t | tr+t |tr+t| t|kr+t| d| d| dt|  d| dt| dS )z
    Check that sizes of two variables are the same

    Args:
        x: Variable to compare
        y: Variable to compare
        x_name: Name for variable x
        y_name: Name for variable y
    z and z% expected to be equal length but len(z)=z	 and len(N)
isinstancer   len
ValueError)r!   r"   r#   r%    r+   \/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/vdms.py_len_check_if_sized?   s   $
r-   resultsList[Document]c                 C  s   dd t | D S )Nc                 S     g | ]\}}|qS r+   r+   .0doc_r+   r+   r,   
<listcomp>R       z$_results_to_docs.<locals>.<listcomp>)_results_to_docs_and_scores)r.   r+   r+   r,   _results_to_docsQ   s   r8   List[Tuple[Document, float]]c              
   C  s   g }z^| d \}}t |dkrUd|d v rXd|d d v r[|d d d }|D ]6}t|d d}|d }tD ]	}||v r?||= q6dd | D }	|t||	d	|f q'W |S W |S W |S W |S  ty{ }
 ztd
|
  W Y d }
~
|S d }
~
ww )Nr   FindDescriptorentitiesr   
   r   c                 S  s   i | ]\}}|t vr||qS r+   )INVALID_METADATA_VALUE)r2   ZmkeyZmvalr+   r+   r,   
<dictcomp>f   s
    z/_results_to_docs_and_scores.<locals>.<dictcomp>)page_contentmetadataz2No results returned. Error while parsing results: )	r)   roundINVALID_DOC_METADATA_KEYSitemsappendr   	Exceptionloggerwarning)r.   Z	final_res	responsesZblobsZresult_entitiesentZdistanceZtxt_contentsppropser+   r+   r,   r7   U   sF   
r7   	localhost  hostportint	vdms.vdmsc                 C  s<   zddl }W n ty   tdw |  }|| | |S )zVDMS client for the VDMS server.

    Args:
        host: IP or hostname of VDMS server
        port: Port to connect to VDMS server
    r   NzOCould not import vdms python package. Please install it with `pip install vdms.)vdmsImportErrorconnect)rO   rP   rS   clientr+   r+   r,   VDMS_Clientw   s   rW   z0.3.18z1.0.0zlangchain_vdms.VDMS)ZsinceZremovalZalternative_importc                   @  s  e Zd ZdZdeddddddddZedddZdddZdd"d#Z	dd%d&Z
dd)d*Zdd,d-Zeedfdd5d6Z		ddd=d>Z		ddd@dAZ		dddFdGZ				dddOdPZ	Q	QdddUdVZg dQfdd]d^Z	ddd`daZddddeZddedffddjdkZ				l	fdddmdnZddefddpdqZdefddrdsZddudvZddwdxZdd{d|Z			ddd~dZ 			QddddZ!eeddddQfdddZ"dddZ#e$ddeefdddZ%e$dddeefdddZ&dddHgfdddZ'eeddfdddZ(eeddfdddZ)eeddfdddZ*eeddfdddZ+ddeedddQfdddZ,eedfdddZ-eedfdddZ.eedfdddZ/eedfdddZ0dddZ1dddZ2dS )VDMSa  Intel Lab's VDMS for vector-store workloads.

    To use, you should have both:
    - the ``vdms`` python package installed
    - a host (str) and port (int) associated with a deployed VDMS Server

    Visit https://github.com/IntelLabs/vdms/wiki more information.

    IT IS HIGHLY SUGGESTED TO NORMALIZE YOUR DATA.

    Args:
        client: VDMS Client used to connect to VDMS server
        collection_name: Name of data collection [Default: langchain]
        distance_strategy: Method used to calculate distances. VDMS supports
            "L2" (euclidean distance) or "IP" (inner product) [Default: L2]
        engine: Underlying implementation for indexing and computing distances.
            VDMS supports TileDBDense, TileDBSparse, FaissFlat, FaissIVFFlat,
            and Flinng [Default: FaissFlat]
        embedding: Any embedding function implementing
            `langchain_core.embeddings.Embeddings` interface.
        relevance_score_fn: Function for obtaining relevance score

    Example:
        .. code-block:: python

            from langchain_huggingface import HuggingFaceEmbeddings
            from langchain_community.vectorstores.vdms import VDMS, VDMS_Client

            model_name = "sentence-transformers/all-mpnet-base-v2"
            vectorstore = VDMS(
                client=VDMS_Client("localhost", 55555),
                embedding=HuggingFaceEmbeddings(model_name=model_name),
                collection_name="langchain-demo",
                distance_strategy="L2",
                engine="FaissFlat",
            )
    Nr   r   )	embeddingcollection_namedistance_strategyenginerelevance_score_fnembedding_dimensionsrV   rR   rY   Optional[Embeddings]rZ   r$   r[   DISTANCE_METRICSr\   ENGINESr]   "Optional[Callable[[float], float]]r^   Optional[int]r&   r'   c                C  sD   || _ || _|| _|| _| || || _| j|| j| jd| _d S )Nr\   metric)_clientsimilarity_search_enginer[   rY   _check_required_inputsoverride_relevance_score_fnadd_set_collection_name)selfrV   rY   rZ   r[   r\   r]   r^   r+   r+   r,   __init__   s   zVDMS.__init__c                 C  s   | j S N)rY   rl   r+   r+   r,   
embeddings   s   zVDMS.embeddingstexts	List[str]List[List[float]]c                 C  s,   t | jtr| j|S d}|d7 }t|)Nz*Must provide `embedding` which is expectedz to be an Embeddings object)r(   rY   r   Zembed_documentsr*   )rl   rq   p_strr+   r+   r,   _embed_documents   s
   zVDMS._embed_documentspathskwargsr   c                 K  s4   | j d urt| j dr| j jdd|i|S td)Nembed_videorv   z:Must provide `embedding` which has attribute `embed_video`r+   )rY   hasattrrx   r*   )rl   rv   rw   r+   r+   r,   _embed_video   s
   zVDMS._embed_videourisc                 C  s,   | j d urt| j dr| j j|dS td)Nembed_imager{   z:Must provide `embedding` which has attribute `embed_image`)rY   ry   r|   r*   )rl   r{   r+   r+   r,   _embed_image   s
   zVDMS._embed_imagetextList[float]c                 C  s    t | jtr| j|S td)NzEMust provide `embedding` which is expected to be an Embeddings object)r(   rY   r   embed_queryr*   )rl   r   r+   r+   r,   _embed_query   s
   zVDMS._embed_queryCallable[[float], float]c                 C  s8   | j dur| j S | j dv rdd 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.
        N)ipl2c                 S  s   | S rn   r+   )r!   r+   r+   r,   <lambda>  s    z1VDMS._select_relevance_score_fn.<locals>.<lambda>z=No supported normalization function for distance_strategy of z;.Consider providing relevance_score_fn to VDMS constructor.)ri   r[   lowerr*   ro   r+   r+   r,   _select_relevance_score_fn   s   
	zVDMS._select_relevance_score_fnquerykrQ   fetch_kfilterOptional[Dict[str, Any]]r9   c           
      K  sp   | j du r	d|d< | jd||||d|}g }|D ]\}}	| j du r+|||	f q|||  |	f q|S )z?Return docs and their similarity scores on a scale from 0 to 1.NTnormalize_distance)r   r   r   r   r+   )ri   similarity_search_with_scorerD   )
rl   r   r   r   r   rw   docs_and_scoresZdocs_and_rel_scoresr3   Zscorer+   r+   r,   (_similarity_search_with_relevance_scores
  s(   
	
z-VDMS._similarity_search_with_relevance_scoresrp   	metadatas1Optional[Union[List[None], List[Dict[str, Any]]]]idsOptional[List[str]]r	   c                 C  s   t ||dd |d ur|ndd |D }t ||dd |d ur!|ndd |D }t ||dd g }g }g }t||||D ]%\}	}
}}| j||	|
||d\}}|d ura|| || || q<| ||\}}|S )	Nrq   rp   c                 S     g | ]}d qS rn   r+   r2   r4   r+   r+   r,   r5   4      zVDMS.add.<locals>.<listcomp>r   c                 S     g | ]}t t qS r+   r$   uuiduuid4r   r+   r+   r,   r5   7      r   r@   rY   documentr   )r-   zip_VDMS__get_add_queryrD   _VDMS__run_vdms_query)rl   rZ   rq   rp   r   r   all_queries	all_blobsinserted_idsmetaembr3   r   r   r    responseresponse_arrayr+   r+   r,   add*  s&   




zVDMS.addre   c              	   C  sR   t d|| jt|d|t|d|d}| |g\}}d|d v r'td| |S )NAddDescriptorSetvaluerd   ZFailedCommandr   zFailed to add collection )_add_descriptorsetembedding_dimensiongetattrr   r*   )rl   rZ   r\   re   r   r   r4   r+   r+   r,   rj   K  s   

zVDMS.add_setUnion[None, List[str]]constraintsUnion[None, Dict[str, Any]]boolc                 C  s   g }g }|  |}d|i}|du rdddgi}nddg|d< |dur*d|d g|d< td|ddddd||d		}|| | ||\}	}
td
|dd}| |g|\}}d|	d v S )zA
        Deletes entire collection if id is not provided
        listN	_deletion==   r   r   r:   labelrefrK   linkk_neighborsr   r.   FindDescriptorSetT)
storeIndex)_VDMS__get_properties_add_descriptorrD   r   r   )rl   rZ   r   r   r   r   collection_propertiesr.   r   r   r   ZresponseSetr4   r+   r+   r,   Z__delete`  s6   	

zVDMS.__deleter@   Optional[Any]Union[List[float], None]r   r   Optional[str]4Tuple[Dict[str, Dict[str, Any]], Union[bytes, None]]c                 C  s   |d u ri }n5d|i}t | j||\}}|r<dd |d d  D }	d| d}
|
d7 }
t|
 td	|	  |d fS |rC|| |d
vrK||d< | D ]}|| jvr\| j| qOtd|d d |d d d d d	}t	|}||fS )Nr   c                 S  s   i | ]	\}}||d  qS )r+   )r2   Zprop_keyZprop_valr+   r+   r,   r>     s    z(VDMS.__get_add_query.<locals>.<dictcomp>r:   r   z[!] Embedding with id (z) exists in DB;z#Therefore, skipped and not insertedz	Skipped values are: )N r   ZAddDescriptorr   )
_check_descriptor_exists_by_idrf   rC   printupdatekeysr   rD   r   embedding2bytes)rl   rZ   r@   rY   r   r   rK   Z	id_existsr   Zskipped_valuepstrr   r    r+   r+   r,   Z__get_add_query  sR   

zVDMS.__get_add_queryFunique_entityOptional[bool]deletionc                 C  sL   t |||d}| |g\}}t|dkr t|d d}|S tt}|S )N)r   r   r   ,)_find_property_entityr   r)   
_bytes2strsplitr   DEFAULT_PROPERTIES)rl   rZ   r   r   Z
find_queryr   Zresponse_blobr   r+   r+   r,   Z__get_properties  s   zVDMS.__get_propertiesr   
List[Dict]r   Optional[List]print_last_responseTuple[Any, Any]c                 C  s2   | j ||\}}t||}|r| j   ||fS rn   )rf   r   _check_valid_responser   )rl   r   r   r   r   r   r4   r+   r+   r,   Z__run_vdms_query  s
   

zVDMS.__run_vdms_query	documentsc                 C  s  t ||dd t ||dd |dur|ndd |D }t ||dd | |}g }t||||D ]O\}}	}
}d| ji}d	d
dgi}|durKd
|g|d< td|ddddd||d	}| |g\}}| j|||	|
|d\}}|dur| |g|g\}}|| q0| ||| j dS )z
        Updates (find, delete, add) a collection based on id.
        If more than one collection returned with id, error occuers
        r   r   rp   Nc                 S  r   rn   r+   r   r+   r+   r,   r5     r   z!VDMS.__update.<locals>.<listcomp>r   r   r   r   r   r   r:   r   r   )	r-   r   r   r   r   r   r   rD   _VDMS__update_properties)rl   rZ   r   r   rp   r   
orig_propsZupdated_idsr   r   r3   r   r.   r   r   r   r   r    r+   r+   r,   Z__update  sJ   



zVDMS.__updatecurrent_collection_propertiesnew_collection_propertiesc           
      C  sd   |d ur.t |}|D ]}||vr|| q
||kr0t|d|d\}}| ||g\}}	d S d S d S )Nr   )command_typeall_properties)r   rD   _build_property_queryr   )
rl   rZ   r   r   Zold_collection_propertiespropr   blob_arrr   r4   r+   r+   r,   Z__update_properties  s   

zVDMS.__update_propertiesTOptional[List[dict]]
batch_sizeadd_pathc                   s    fdd|D }|r|rt |D ]
\}}	|	|| d< qn|r-g }|D ]	}	|d|	i q#|dur3|ndd |D } j|d}
|du rLdd |D }ndd |D } jd
||
|||d	| |S )a  Run more images through the embeddings and add to the vectorstore.

        Images are added as embeddings (AddDescriptor) instead of separate
        entity (AddImage) within VDMS to leverage similarity search capability

        Args:
            uris: List of paths to the images to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the images.
            ids: Optional list of unique IDs.
            batch_size (int): Number of concurrent requests to send to the server.
            add_path: Bool to add image path as metadata

        Returns:
            List of ids from adding images into the vectorstore.
        c                   s   g | ]} j |d qS ))
image_path)encode_image)r2   uriro   r+   r,   r5   J  r   z#VDMS.add_images.<locals>.<listcomp>r   Nc                 S  r   r+   r   r   r+   r+   r,   r5   U  r   r}   c                 S     g | ]}i qS r+   r+   r   r+   r+   r,   r5   [  r   c                 S     g | ]}t |qS r+   _validate_vdms_propertiesr2   mr+   r+   r,   r5   ]  r6   rq   rp   r   r   r   r+   )	enumeraterD   r~   add_from)rl   r{   r   r   r   r   rw   Z	b64_textsmidxr   rp   r+   ro   r,   
add_images1  s0   zVDMS.add_imagesr   c                 K  s   |du rdd |D }|r|rt |D ]
\}}	|	|| d< qn|r/g }|D ]	}	|d|	i q%|dur5|ndd |D }| jd	d|i|}
|du rQdd |D }| jd	||
|||d| |S )
a  Run videos through the embeddings and add to the vectorstore.

        Videos are added as embeddings (AddDescriptor) instead of separate
        entity (AddVideo) within VDMS to leverage similarity search capability

        Args:
            paths: List of paths to the videos to add to the vectorstore.
            metadatas: Optional list of text associated with the videos.
            metadatas: Optional list of metadatas associated with the videos.
            ids: Optional list of unique IDs.
            batch_size (int): Number of concurrent requests to send to the server.
            add_path: Bool to add video path as metadata

        Returns:
            List of ids from adding videos into the vectorstore.
        Nc                 S  r   )r   r+   r   r+   r+   r,   r5     r   z#VDMS.add_videos.<locals>.<listcomp>Z
video_pathc                 S  r   r+   r   r   r+   r+   r,   r5     r   rv   c                 S  r   r+   r+   r   r+   r+   r,   r5     r   r   r+   )r   rD   rz   r   )rl   rv   rq   r   r   r   r   rw   r   pathrp   r+   r+   r,   
add_videosi  s0   zVDMS.add_videosIterable[str]c                 K  sn   t |}|du rdd |D }| |}|du r dd |D }ndd |D }| jd|||||d|}|S )a  Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts: List of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of unique IDs.
            batch_size (int): Number of concurrent requests to send to the server.

        Returns:
            List of ids from adding the texts into the vectorstore.
        Nc                 S  r   r+   r   r   r+   r+   r,   r5     r   z"VDMS.add_texts.<locals>.<listcomp>c                 S  r   r+   r+   r   r+   r+   r,   r5     r   c                 S  r   r+   r   r   r+   r+   r,   r5     r6   r   r+   )r   ru   r   )rl   rq   r   r   r   rw   rp   r   r+   r+   r,   	add_texts  s"   
zVDMS.add_textsc                 K  s   |  | j}g }tdt||D ]5}	t|	| t|}
||	|
 }||	|
 }||	|
 }|r5||	|
 }| j| j||||d}|| q| | j|| j |S )Nr   )rp   rq   r   r   )	r   rk   ranger)   minr   extendr   r   )rl   rq   rp   r   r   r   rw   r   r   Z	start_idxZend_idxZbatch_textsZbatch_embedding_vectorsZ	batch_idsZbatch_metadatasresultr+   r+   r,   r     s*   

zVDMS.add_fromUnion[int, None]c                 C  s  | j  s	td| jtvrtd| jtvrtd| jd u r$td|d ur,|| _nD| jd ur@t	| jdr@t
| d| _n0| jd urpt	| jdsQt	| jdrpt	| jd	rlz	| jjjj| _W n tyk   td
w td
| |}t	| dr| j| d S || _d S )Nz_VDMS client must be connected to a VDMS server.Please use VDMS_Client to establish a connectionz-distance_strategy must be either 'L2' or 'IP'z]engine must be either 'TileDBDense', 'TileDBSparse', 'FaissFlat', 'FaissIVFFlat', or 'Flinng'Must provide embedding functionr   zThis is a sample sentence.r|   rx   modelz>Embedding dimension needed. Please define embedding_dimensionsr   )rf   Zis_connectedr*   r[   r   rg   r   rY   r   ry   r)   r   r   Ztoken_embeddingZembedding_dimr   r   r   )rl   rZ   r^   Zcurrent_propsr+   r+   r,   rh     sN   










zVDMS._check_required_inputsc                 C  sX   g }g }ddgd}t d|d d d d d d |d	}|| | ||\}}|d d d S )Nr   r   )countr   r:   r   r   returned)r   rD   r   )rl   rZ   r   r   r.   r   r   r   r+   r+   r,   r  '  s"   
z
VDMS.countbase64_imagebytesc                 C  s
   t |S rn   )base64	b64decode)rl   r  r+   r+   r,   decode_image=     
zVDMS.decode_imageOptional[Dict]c                 K  s"   |dur|n| j }| j|||dS )zDelete by ID. These are the IDs in the vectorstore.

        Args:
            ids: List of ids to delete.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise, None if not implemented.
        N)r   r   )rk   _VDMS__delete)rl   r   rZ   r   rw   namer+   r+   r,   delete@  s   zVDMS.deletesetnamer.   	normalize(Tuple[List[Dict[str, Any]], List, float]c                 C  s\   d}d}t ||||d}| |g|\}	}
|r)||	d v r)|	d | d d d }|	|
|fS )Nr   r:   )r   r.   r   r;   r   r   )r   r   )rl   r  r   r.   r   r  max_distcommand_strr   r   r   r+   r+   r,   get_k_candidatesS  s   
zVDMS.get_k_candidatesr  r   Optional[dict]query_embeddingOptional[List[float]]r   !Tuple[List[Dict[str, Any]], List]c	                 C  s   g }	t |}
|
d ur|	|
 |d u r!| j||||	|d\}}}n|d u r+ddgi}nd|vr5dg|d< nd|d vrB|d d t||||d}| |g\}}||d v rp|d | d dkrpdd |d | d	 D }ng g fS | j||||	|d\}}}||d vs||d v r|d | d dkrg g fS g }|d | d	 D ]}|d |v r|| t||kr nq||d | d	< t||d | d< t||k rd
}t| |r|dtjfv rdn|}t	|d | d	 D ]\}}|d | |d< |d |d | d	 | d< q||fS )N)r  r   r   r   r.   r   r  c                 S  s   g | ]}|d  qS )r   r+   )r2   rI   r+   r+   r,   r5     s    z0VDMS.get_descriptor_response.<locals>.<listcomp>r;   z4Returned items < k_neighbors; Try increasing fetch_kg      ?r   )
r   rD   r  r   r   r)   r   npinfr   )rl   r  r  r   r   r   r.   r  r   r   r    r   r   r  r   Zids_of_interestZnew_entitiesrI   rt   Zent_idxr+   r+   r,   get_descriptor_responsej  sh   

 
 
zVDMS.get_descriptor_responser   c                 C  sF   t |d}| }t|dW  d    S 1 sw   Y  d S )Nrbzutf-8)openreadr  	b64encodedecode)rl   r   fr    r+   r+   r,   r     s   $zVDMS.encode_imagecls
Type[VDMS]r/   c              	   K  s4   |d }| j |dd |D dd |D ||||dS )a  Create a VDMS vectorstore from a list of documents.

        Args:
            collection_name (str): Name of the collection to create.
            documents (List[Document]): List of documents to add to vectorstore.
            embedding (Embeddings): Embedding function. Defaults to None.
            ids (Optional[List[str]]): List of document IDs. Defaults to None.
            batch_size (int): Number of concurrent requests to send to the server.

        Returns:
            VDMS: VDMS vectorstore.
        rV   c                 S     g | ]}|j qS r+   r?   r2   r3   r+   r+   r,   r5         z'VDMS.from_documents.<locals>.<listcomp>c                 S  r#  r+   )r@   r%  r+   r+   r,   r5     r&  )rV   rq   r   rY   r   r   rZ   )
from_texts)r!  r   rY   r   r   rZ   rw   rV   r+   r+   r,   from_documents  s   zVDMS.from_documentsc           
      K  sB   |d }| |||d}	|du rdd |D }|	j ||||d |	S )aH  Create a VDMS vectorstore from a raw documents.

        Args:
            texts (List[str]): List of texts to add to the collection.
            embedding (Embeddings): Embedding function. Defaults to None.
            metadatas (Optional[List[dict]]): List of metadatas. Defaults to None.
            ids (Optional[List[str]]): List of document IDs. Defaults to None.
            batch_size (int): Number of concurrent requests to send to the server.
            collection_name (str): Name of the collection to create.

        Returns:
            VDMS: VDMS vectorstore.
        rV   )rZ   rY   rV   Nc                 S  r   r+   r   r   r+   r+   r,   r5     r   z#VDMS.from_texts.<locals>.<listcomp>)rq   r   r   r   )r   )
r!  rq   rY   r   r   r   rZ   rw   rV   Zvdms_collectionr+   r+   r,   r'    s   zVDMS.from_textslimitincludec                 C  s~   g }g }ddi}|dur||d< d|v r|  |}||d< d|v r%d|d	< td
|d||d}	||	 | ||\}
}|
|fS )a  Gets the collection.
        Get embeddings and their associated data from the data store.
        If no constraints provided returns all embeddings up to limit.

        Args:
            constraints: A dict used to filter results by.
                   E.g. `{"color" : ["==", "red"], "price": [">", 4.00]}`. Optional.
            limit: The number of documents to return. Optional.
            include: A list of what to include in the results.
                     Can contain `"embeddings"`, `"metadatas"`, `"documents"`.
                     Ids are always included.
                     Defaults to `["metadatas", "documents"]`. Optional.
        r  r   Nr)  r@   r   rp   Tr    r:   )r   r   r.   )r   r   rD   r   )rl   rZ   r   r)  r*  r   r   r.   r   r   r   r   r+   r+   r,   get  s(   

zVDMS.getg      ?lambda_multfloatOptional[Dict[str, List]]c           
      K     | j du r	tdtj|st| j dr| |}n>tj|r1t| j dr1| j|gdd }n(tj|rGt| j drG| j|gdd }nd	| d
}|d7 }|d7 }t|| j	|||||d}	|	S aR  Return docs selected using the maximal marginal relevance.
        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query (str): Query to look up. Text or path for image or video.
            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.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        NzBFor MMR search, you must specify an embedding function oncreation.r   r|   r}   r   rx   rv   (Could not generate embedding for query ''.9If using path for image or video, verify embedding model 6has callable functions 'embed_image' or 'embed_video'.)r,  r   )
rY   r*   osr   isfilery   r   r~   rz   'max_marginal_relevance_search_by_vector)
rl   r   r   r   r,  r   rw   Zembedding_vector	error_msgdocsr+   r+   r,   max_marginal_relevance_search9  s,   
z"VDMS.max_marginal_relevance_searchc                      | j |g||g dd}t|d d dkrg S dd |d d D }ttj|tjd|||d t|}	 fd	dt|	D }
|
S )
H  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.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r   r   Z	distancesrp   query_embeddings	n_resultsr   r*  r   r   c                 S     g | ]}t t|qS r+   r   _bytes2embeddingr2   r   r+   r+   r,   r5         z@VDMS.max_marginal_relevance_search_by_vector.<locals>.<listcomp>Zdtyper   r,  c                   s   g | ]
\}}| v r|qS r+   r+   )r2   irZmmr_selectedr+   r,   r5     s    )query_collection_embeddingsr)   r   r  arrayfloat32r8   r   rl   rY   r   r   r,  r   rw   r.   Zembedding_list
candidatesZselected_resultsr+   rK  r,   r8  o  ,   

z,VDMS.max_marginal_relevance_search_by_vectorc           
      K  r/  r0  )
rY   r*   r6  r   r7  ry   r   r~   rz   2max_marginal_relevance_search_with_score_by_vector)
rl   r   r   r   r,  r   rw   rY   r9  r:  r+   r+   r,   (max_marginal_relevance_search_with_score  s,   
z-VDMS.max_marginal_relevance_search_with_scorec                   r<  )
r=  r>  r?  r   r   c                 S  rB  r+   rC  rE  r+   r+   r,   r5     rF  zKVDMS.max_marginal_relevance_search_with_score_by_vector.<locals>.<listcomp>rG  rH  c                   s$   g | ]\}\}}| v r||fqS r+   r+   )r2   rI  rJ  srK  r+   r,   r5     s    )rL  r)   r   r  rM  rN  r7   r   rO  r+   rK  r,   rR    rQ  z7VDMS.max_marginal_relevance_search_with_score_by_vectorr@  Optional[List[List[float]]]rA  !List[Tuple[Dict[str, Any], List]]c                 K  s   g }	|d u r	| j }|d u r|	S |ddg}
|d u r&d|
v r&| jd|
v d}|D ]}| jd|||||||d\}}|	||g q(|	S )Nr*  r   rp   )r   r    r:   )r   r   r   r.   r   r  )rk   r+  r   r  rD   )rl   r@  rZ   rA  r   r   r.   r   rw   Zall_responsesr*  Zqembr   r   r+   r+   r,   rL    s.   

z VDMS.query_collection_embeddingsc                 K  s(   | j |f|||d|}dd |D S )a  Run similarity search with VDMS.

        Args:
            query (str): Query to look up. Text or path for image or video.
            k (int): Number of results to return. Defaults to 3.
            fetch_k (int): Number of candidates to fetch for knn (>= k).
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List[Document]: List of documents most similar to the query text.
        )r   r   r   c                 S  r0   r+   r+   r1   r+   r+   r,   r5   P  r6   z*VDMS.similarity_search.<locals>.<listcomp>)r   )rl   r   r   r   r   rw   r   r+   r+   r,   similarity_search:  s   zVDMS.similarity_searchc                 K  $   | j d|g|||d|}t|S )a  Return docs most similar to embedding vector.
        Args:
            embedding (List[float]): Embedding to look up documents similar to.
            k (int): Number of Documents to return. Defaults to 3.
            fetch_k (int): Number of candidates to fetch for knn (>= k).
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.
        Returns:
            List of Documents most similar to the query vector.
        r@  rA  r   r   Nr+   )rL  r8   rl   rY   r   r   r   rw   r.   r+   r+   r,   similarity_search_by_vectorR  s   z VDMS.similarity_search_by_vectorc           	      K  s   | j du r	tdtj|st| j dr| |}n>tj|r1t| j dr1| j|gdd }n(tj|rGt| j drG| j|gdd }nd	| d
}|d7 }|d7 }t|| j	d|g|||d|}t
|S )aE  Run similarity search with VDMS with distance.

        Args:
            query (str): Query to look up. Text or path for image or video.
            k (int): Number of results to return. Defaults to 3.
            fetch_k (int): Number of candidates to fetch for knn (>= k).
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List[Tuple[Document, float]]: List of documents most similar to
            the query text and cosine distance in float for each.
            Lower score represents more similarity.
        Nr   r   r|   r}   r   rx   r1  r2  r3  r4  r5  rY  r+   )rY   r*   r6  r   r7  ry   r   r~   rz   rL  r7   )	rl   r   r   r   r   rw   r  r9  r.   r+   r+   r,   r   m  s*   
z!VDMS.similarity_search_with_scorec                 K  rX  )a6  
        Return docs most similar to embedding vector and similarity score.

        Args:
            embedding (List[float]): Embedding to look up documents similar to.
            k (int): Number of Documents to return. Defaults to 3.
            fetch_k (int): Number of candidates to fetch for knn (>= k).
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List[Tuple[Document, float]]: List of documents most similar to
            the query text. Lower score represents more similarity.
        rY  Nr+   )rL  r7   rZ  r+   r+   r,   &similarity_search_with_score_by_vector  s   z+VDMS.similarity_search_with_score_by_vectordocument_idr   c                 C  s   |  ||g|gS )zUpdate a document in the collection.

        Args:
            document_id (str): ID of the document to update.
            document (Document): Document to update.
        )update_documents)rl   rZ   r]  r   r+   r+   r,   update_document  s   	zVDMS.update_documentc                 C  s>   dd |D }dd |D }|  |}| j|||||d dS )zUpdate a document in the collection.

        Args:
            ids (List[str]): List of ids of the document to update.
            documents (List[Document]): List of documents to update.
        c                 S  r#  r+   r$  r2   r   r+   r+   r,   r5     r&  z)VDMS.update_documents.<locals>.<listcomp>c                 S  s   g | ]}t |jqS r+   )r   r@   r`  r+   r+   r,   r5     s    
)r   rp   r   N)ru   _VDMS__update)rl   rZ   r   r   r   r@   rp   r+   r+   r,   r^    s   	

zVDMS.update_documents)rV   rR   rY   r_   rZ   r$   r[   r`   r\   ra   r]   rb   r^   rc   r&   r'   )r&   r_   )rq   rr   r&   rs   )rv   rr   rw   r   r&   rs   )r{   rr   r&   rs   )r   r$   r&   r   )r&   r   )r   r$   r   rQ   r   rQ   r   r   rw   r   r&   r9   )NN)rZ   r$   rq   rr   rp   rs   r   r   r   r   r&   r	   )r   r   )rZ   r$   r\   ra   re   r`   r&   r$   )rZ   r$   r   r   r   r   r&   r   )NNNN)rZ   r$   r@   r   rY   r   r   r   r   r   r&   r   FF)rZ   r$   r   r   r   r   r&   rr   )r   r   r   r   r   r   r&   r   rn   )rZ   r$   r   rr   r   rr   rp   rs   r   r   r&   r'   )rZ   r$   r   r	   r   r   r&   r'   )r{   rr   r   r   r   r   r   rQ   r   r   rw   r   r&   rr   )NNNr   T)rv   rr   rq   r   r   r   r   r   r   rQ   r   r   rw   r   r&   rr   )rq   r   r   r   r   r   r   rQ   rw   r   r&   rr   )rq   rr   rp   rs   r   rr   r   r   r   rQ   rw   r   r&   rr   )rZ   r$   r^   r   r&   r'   )rZ   r$   r&   rQ   )r  r$   r&   r  )NNN)
r   r   rZ   r   r   r	  rw   r   r&   r   )NNF)r  r$   r   rc   r.   r   r   r   r  r   r&   r  )r  r$   r  r$   r   rQ   r   rQ   r   r  r.   r   r  r  r   r   r&   r  )r   r$   r&   r$   )r!  r"  r   r/   rY   r_   r   r   r   rQ   rZ   r$   rw   r   r&   rX   )r!  r"  rq   rr   rY   r_   r   r   r   r   r   rQ   rZ   r$   rw   r   r&   rX   )
rZ   r$   r   r	  r)  rc   r*  rr   r&   r   )r   r$   r   rQ   r   rQ   r,  r-  r   r.  rw   r   r&   r/   )rY   r   r   rQ   r   rQ   r,  r-  r   r.  rw   r   r&   r/   )r   r$   r   rQ   r   rQ   r,  r-  r   r.  rw   r   r&   r9   )rY   r   r   rQ   r   rQ   r,  r-  r   r.  rw   r   r&   r9   )r@  rU  rZ   r   rA  rQ   r   rQ   r   r   r.   r   r   r   rw   r   r&   rV  )r   r$   r   rQ   r   rQ   r   r.  rw   r   r&   r/   )rY   r   r   rQ   r   rQ   r   r.  rw   r   r&   r/   )r   r$   r   rQ   r   rQ   r   r.  rw   r   r&   r9   )rY   r   r   rQ   r   rQ   r   r.  rw   r   r&   r9   )rZ   r$   r]  r$   r   r   r&   r'   )rZ   r$   r   rr   r   r/   r&   r'   )3__name__
__module____qualname____doc__DEFAULT_COLLECTION_NAMErm   propertyrp   ru   rz   r~   r   r   	DEFAULT_KDEFAULT_FETCH_Kr   r   rj   r
  r   r   r   ra  r   DEFAULT_INSERT_BATCH_SIZEr   r   r   r   rh   r  r  r  r  r  r   classmethodr(  r'  r+  r;  r8  rS  rR  rL  rW  r[  r   r\  r_  r^  r+   r+   r+   r,   rX      s   *




%$0;
;;;.
%
8

L"+59:79,1
!rX   r  r  r   r   r   rc   rK   r  r   r   r   Dict[str, Dict[str, Any]]c	                 C  s   d|i}	d| v r|r||	d< |d ur||	d< |t vr||	d< d| v r*|d ur*||	d< d| v r8|d ur8t||	d< d| v rD|t vrD||	d	< d| v rP|t vrP||	d
< | |	i}
|
S )NsetAddr   _ref
propertiesr   ZFindr   r   r.   )r=   rQ   )r  r  r   r   rK   r   r   r   r.   entityr   r+   r+   r,   r     s"   r   Fr  num_dimsr\   re   r	  r   r   Dict[str, Any]c                 C  s   | dkr?t dd ||fD r?||d}|d ur||d< |d ur$||d< |d ur,||d< |d i fvr6||d< |d ur>||d	< n(| d
kr`d|i}|rM||d< |	d i fvrW|	|d< |
d ur_|
|d< ntd|  | |i}|S )Nr   c                 s  s    | ]}|d uV  qd S rn   r+   )r2   varr+   r+   r,   	<genexpr>  s    
z%_add_descriptorset.<locals>.<genexpr>)r  
dimensionsr\   re   rp  rq  r   r   rn  r   r   r.   zUnknown command: )allr*   )r  r  rs  r\   re   r   rK   r   r   r   r.   rr  r   r+   r+   r,   r     s:   r   rZ   r   r	   Tuple[Dict[str, Any], bytes]c                 C  sn   t |dkrd|nd}d}i }d|d< d|d< d	| i}d
|d< ||d< ||d< t|}i }|||< ||fS )Nr   r   r   Z	AddEntityrq  classTr    r  zqueryable propertiestyper   )r)   join
_str2bytes)rZ   r   Zall_properties_str	querytyperr  rK   	byte_datar   r+   r+   r,   _add_entity_with_blob?  s   r  findr   r   c           	      C  s   g }g }g d}|  |vrtdd||  dkr-t| dd}|| ||fS |  dkrHt| |\}}|| || ||fS |  dkrjt| dd	}|| t| |\}}|| || ||fS )
N)r  r   r   z"[!] Invalid type. Choices are : {}r   r  T)r   r   r   )r   )r   r*   formatr|  r   rD   r  )	rZ   r   r   r   r   r   choicesr   r  r+   r+   r,   r   U  s*   





r   r    r  c                 C  s   t j| dd}|S )NrN  rG  )r  Z
frombuffer)r    r   r+   r+   r,   rD  x  s   rD  in_bytesc                 C  s   |   S rn   )r  )r  r+   r+   r,   r   }  s   r   r   r   rr   c                 C  s   t tdd | D S )Nc                 S  s   g | ]}|  D ]}|qqS r+   )r   )r2   qr   r+   r+   r,   r5     s    z(_get_cmds_from_query.<locals>.<listcomp>)r   rn  )r   r+   r+   r,   _get_cmds_from_query  s   r  
List[dict]r   c                   s,   t | }t tot fdd|D }|S )Nc                 3  s@    | ]}| d  v od d  | v o d  | d d kV  qdS )r   r  Nr+   )r2   cmdr   r+   r,   rv    s    
z(_check_valid_response.<locals>.<genexpr>)r  r(   r   any)r   r   Zcmd_list	valid_resr+   r  r,   r     s
   r   rV   r   Tuple[bool, Any]c           	      C  sJ   dd|gi}t d||dgddd}|g}| |\}}t||}||fS )Nr   r   r:   r   )r   r  r  )r   r   r   )	rV   r  r   r   ZfindDescriptorr   resr4   r  r+   r+   r,   r     s   

r   rY   r   Union[bytes, None]c                 C  s&   d}| durt j| dd}| }|S )zConvert embedding to bytes.NrN  rG  )r  rM  tobytes)rY   r    r   r+   r+   r,   r     s
   r   r   r   r   c                 C  sz   d}i }d|d< |r||d< i }d|d< d|d< d	g|d
< ||d< i }|r+ddg|d< d| g|d< ||d< i }|||< |S )NZ
FindEntityrq  rz  uniqueTr    r   r  r   r   r.   r   r   r   r  r   r+   )rZ   r   r   r~  rr  r.   r   r   r+   r+   r,   r     s$   
r   in_strc                 C  s
   t | S rn   )r$   encode)r  r+   r+   r,   r}    r  r}  r@   r   c                 C  s0   i }|   D ]\}}t|ts||t|< q|S rn   )rC   r(   r   r$   )r@   Znew_metadatakeyr   r+   r+   r,   r     s   
r   )
r!   r   r"   r   r#   r$   r%   r$   r&   r'   )r.   r   r&   r/   )r.   r   r&   r9   )rM   rN   )rO   r$   rP   rQ   r&   rR   )NNNNNNN)r  r$   r  r$   r   r   r   rc   rK   r  r   r  r   rc   r   r  r.   r  r&   rm  )	NNNNNNFNN)r  r$   r  r$   rs  rc   r\   r   re   r   r   rc   rK   r	  r   r	  r   r   r   r	  r.   r	  r&   rt  )rZ   r$   r   r	   r&   ry  )
rZ   r$   r   r$   r   r	   r   rc   r&   r   )r    r  r&   r   )r  r  r&   r$   )r   r   r&   rr   )r   r  r   r   r&   r   )rV   rR   r  r$   r   r$   r&   r  )rY   r   r&   r  rb  )rZ   r$   r   r   r   r   r&   rm  )r  r$   r&   r  )r@   rt  r&   r   )E
__future__r   r  loggingr6  r   copyr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   numpyr  Zlangchain_core._api.deprecationr   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.vectorstoresr   Z&langchain_community.vectorstores.utilsr   rS   r`   r   r   __annotations__ra   r   rg  rk  ri  rj  r   rB   r=   	getLoggerrc  rF   r-   r8   r7   rW   rX   r   r   r  r   rD  r   r  r   r   r   r   r}  r   r+   r+   r+   r,   <module>   s    <




"          c)
7
#





