o
    Zh3                     @  s   d dl m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
Zd dlmZ d dlmZ d dlmZ d dlmZ eeZG dd	 d	eZdS )
    )annotationsN)AnyIterableListOptionalTuple)Document)
Embeddings)VectorStore)maximal_marginal_relevancec                   @  s   e Zd ZdZdddddddddFddZedGddZ				dHdId(d)Z	*		dJdKd2d3Z	*		dJdLd5d6Z		*	7	8	dMdNd=d>Z
	*	7	8	dMdOd?d@ZedddddddAgdddf
dPdBdCZ	dQdRdDdEZdS )SDingoax  `Dingo` vector store.

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

    Example:
        .. code-block:: python

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

            embeddings = OpenAIEmbeddings()
            dingo = Dingo(embeddings, "text")
    Ni   rootZ123123F)client
index_name	dimensionhostuserpasswordself_id	embeddingr	   text_keystrr   r   r   Optional[str]r   intr   Optional[List[str]]r   r   r   boolc             
   C  s   zddl }
W n ty   tdw |dur|ndg}|dur"|}nz	|
|||}W n ty> } ztd| d}~ww || _|| _|durk|| vrk| | vrk|	du rd|j||dd n|j||d	 || _	|| _
dS )
zInitialize with Dingo client.r   NzSCould not import dingo python package. Please install it with `pip install dingodb.172.20.31.10:13000Dingo failed to connect: TFr   Zauto_idr   )dingodbImportErrorDingoDB
ValueError	_text_key_client	get_indexuppercreate_index_index_name
_embedding)selfr   r   r   r   r   r   r   r   r   r    dingo_cliente r.   ]/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/dingo.py__init__    s8   
zDingo.__init__returnOptional[Embeddings]c                 C  s   | j S N)r*   r+   r.   r.   r/   
embeddingsT   s   zDingo.embeddingstext  textsIterable[str]	metadatasOptional[List[dict]]ids
batch_sizekwargs	List[str]c              	   K  s   |pdd |D }g }t |}| j|}t|D ]\}	}
|r#||	 ni }|
|| j< || qtdtt ||D ]"}	|	| }| j	| j
||	| ||	| ||	| }|s\tdq:|S )a  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.
            ids: Optional list of ids to associate with the texts.

        Returns:
            List of ids from adding the texts into the vectorstore.

        c                 S  "   g | ]}t t jd d qS N   r   uuiduuid4r   .0_r.   r.   r/   
<listcomp>n      " z#Dingo.add_texts.<locals>.<listcomp>r   vector add fail)listr*   embed_documents	enumerater$   appendrangelenr%   
vector_addr)   	Exception)r+   r8   r:   r<   r   r=   r>   metadatas_listembedsir6   metadatajadd_resr.   r.   r/   	add_textsX   s"   
"zDingo.add_texts   queryksearch_paramsOptional[dict]timeoutOptional[int]List[Document]c                 K  s&   | j |f||d|}dd |D S )v  Return Dingo documents most similar to query, along with scores.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            search_params: Dictionary of argument(s) to filter on metadata

        Returns:
            List of Documents most similar to the query and score for each
        )r]   r^   c                 S  s   g | ]\}}|qS r.   r.   )rG   docrH   r.   r.   r/   rI      s    z+Dingo.similarity_search.<locals>.<listcomp>)similarity_search_with_score)r+   r\   r]   r^   r`   r>   Zdocs_and_scoresr.   r.   r/   similarity_search   s   zDingo.similarity_searchList[Tuple[Document, float]]c                 K  s   g }| j |}| jj| j|||d}|sg S |d d D ]P}	|	d }
d|v r6|ddur6|
|dkr6q|	d }|	d }|| j d	 d d
 }|||
d}| D ]}|| d	 d d
 ||< qS|t	||d|
f q|S )rc   )xqtop_kr^   r   vectorWithDistancesZdistanceZscore_thresholdN
scalarDataidfieldsdata)rl   r6   scoreZpage_contentrW   )
r*   embed_queryr%   vector_searchr)   getr$   keysrO   r   )r+   r\   r]   r^   r`   r>   docsZ	query_objresultsresro   r:   rl   r6   rW   Zmeta_keyr.   r.   r/   re      s*   
z"Dingo.similarity_search_with_score         ?List[float]fetch_klambda_multfloatc                   s    j j j|g||d}ttj|gtjddd |d d D ||d}g }	|D ])}
i }|d d |
 d  D ]\}}|t	||d	 d d
 i q8|	
| q( fdd|	D S )a  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.
        Returns:
            List of Documents selected by maximal marginal relevance.
        )r^   ri   )Zdtypec                 S  s   g | ]}|d  d qS )ZvectorZfloatValuesr.   )rG   itemr.   r.   r/   rI      s    
zADingo.max_marginal_relevance_search_by_vector.<locals>.<listcomp>r   rj   )r]   r|   rk   rm   rn   c                   s    g | ]}t | j|d qS )rp   )r   popr$   )rG   rW   r4   r.   r/   rI      s    )r%   rr   r)   r   nparrayZfloat32itemsupdater   rO   )r+   r   r]   r{   r|   r^   r>   rv   Zmmr_selectedselectedrV   Z	meta_datavr.   r4   r/   'max_marginal_relevance_search_by_vector   s(   
	  
z-Dingo.max_marginal_relevance_search_by_vectorc                 K  s   | j |}| |||||S )a  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text 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.
        Returns:
            List of Documents selected by maximal marginal relevance.
        )r*   rq   r   )r+   r\   r]   r{   r|   r^   r>   r   r.   r.   r/   max_marginal_relevance_search   s   
z#Dingo.max_marginal_relevance_searchr   c              
   K  s  zddl }W n ty   tdw |dur|}nz	||
||	}W n ty5 } ztd| d}~ww |dur\|ddu r\|dur[|| vr[| | vr[|j||dd n|duru|| vru| | vru|j||d	 |p}d
d |D }g }t|}|	|}t
|D ]\}}|r|| ni }|||< || qtdtt||D ] }|| }||||| ||| ||| }|stdq| ||||dS )a=  Construct Dingo wrapper from raw documents.

                This is a user friendly interface that:
                    1. Embeds documents.
                    2. Adds the documents to a provided Dingo index

                This is intended to be a quick way to get started.

                Example:
                    .. code-block:: python

                        from langchain_community.vectorstores import Dingo
                        from langchain_community.embeddings import OpenAIEmbeddings
                        import dingodb
        sss
                        embeddings = OpenAIEmbeddings()
                        dingo = Dingo.from_texts(
                            texts,
                            embeddings,
                            index_name="langchain-demo"
                        )
        r   NzTCould not import dingo python package. Please install it with `pip install dingodb`.r   r   TFr   r   c                 S  r@   rA   rC   rF   r.   r.   r/   rI   ^  rJ   z$Dingo.from_texts.<locals>.<listcomp>rK   )r   r   )r    r!   r"   r#   rs   r&   r'   r(   rL   rM   rN   rO   rP   rQ   rR   rS   )clsr8   r   r:   r<   r   r   r   r   r   r   r   r=   r>   r    r,   r-   rT   rU   rV   r6   rW   rX   rY   r.   r.   r/   
from_texts  sX   '
 zDingo.from_textsc                 K  s"   |du rt d| jj| j|dS )z^Delete by vector IDs or filter.
        Args:
            ids: List of ids to delete.
        NzNo ids provided to delete.)r<   )r#   r%   Zvector_deleter)   )r+   r<   r>   r.   r.   r/   deleteq  s   
zDingo.delete)r   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r1   r2   )NNr6   r7   )r8   r9   r:   r;   r<   r   r   r   r=   r   r>   r   r1   r?   )r[   NN)r\   r   r]   r   r^   r_   r`   ra   r>   r   r1   rb   )r\   r   r]   r   r^   r_   r`   ra   r>   r   r1   rg   )r[   rx   ry   N)r   rz   r]   r   r{   r   r|   r}   r^   r_   r>   r   r1   rb   )r\   r   r]   r   r{   r   r|   r}   r^   r_   r>   r   r1   rb   )r8   r?   r   r	   r:   r;   r<   r   r   r   r   r   r   r   r   r   r   r?   r   r   r   r   r=   r   r>   r   r1   r   r3   )r<   r   r>   r   r1   r   )__name__
__module____qualname____doc__r0   propertyr5   rZ   rf   re   r   r   classmethodr   r   r.   r.   r.   r/   r      sb    4,04^r   )
__future__r   loggingrD   typingr   r   r   r   r   numpyr   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr	   Zlangchain_core.vectorstoresr
   Z&langchain_community.vectorstores.utilsr   	getLoggerr   loggerr   r.   r.   r.   r/   <module>   s    
