a
    bg3                     @  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                   @  s2  e Zd ZdZdddddddddd	d
dddd	d	dd	ddZeddddZd9dddd	dd
ddddZd:d	ddd d
d!d"d#d$Zd;d	ddd d
d%d"d&d'Z	d<d*ddd+dd
d!d,d-d.Z
d=d	ddd+dd
d!d/d0d1Zeddddddd2gdddf
ddddd	ddd
dd	d	dd
d d3d4d5Zd>dd
d
d6d7d8Zd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_idr	   strr   zOptional[str]intzOptional[List[str]]bool)		embeddingtext_keyr   r   r   r   r   r   r   c             
   C  s   zddl }
W n ty&   tdY n0 |dur4|ndg}|durH|}nFz|
|||}W n2 ty } ztd| W Y d}~n
d}~0 0 || _|| _|dur|| vr| | vr|	du r|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,   t/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/dingo.py__init__    s8    
$
zDingo.__init__zOptional[Embeddings])returnc                 C  s   | j S )N)r(   r)   r,   r,   r-   
embeddingsT   s    zDingo.embeddingstext  zIterable[str]zOptional[List[dict]]z	List[str])texts	metadatasidsr   
batch_sizekwargsr/   c              	   K  s   |pdd |D }g }t |}| j|}t|D ],\}	}
|rF||	 ni }|
|| j< || q2tdtt ||D ]D}	|	| }| j	| j
||	| ||	| ||	| }|sttdqt|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  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)   r4   r5   r6   r   r7   r8   metadatas_listembedsir2   metadatajadd_resr,   r,   r-   	add_textsX   s     
"
zDingo.add_texts   zOptional[dict]zOptional[int]zList[Document])queryksearch_paramstimeoutr8   r/   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
        )rU   rV   c                 S  s   g | ]\}}|qS r,   r,   )r?   docr@   r,   r,   r-   rA      rB   z+Dingo.similarity_search.<locals>.<listcomp>)similarity_search_with_score)r)   rT   rU   rV   rW   r8   Zdocs_and_scoresr,   r,   r-   similarity_search   s    zDingo.similarity_searchzList[Tuple[Document, float]]c                 K  s   g }| j |}| jj| j|||d}|s.g S |d d D ]}	|	d }
d|v rl|ddurl|
|dkrlq:|	d }|	d }|| j d	 d d
 }|||
d}| D ]}|| d	 d d
 ||< q|t	||d|
f q:|S )rX   )xqtop_krV   r   vectorWithDistancesZdistanceZscore_thresholdN
scalarDataidfieldsdata)r`   r2   scoreZpage_contentrO   )
r(   embed_queryr#   vector_searchr'   getr"   keysrG   r   )r)   rT   rU   rV   rW   r8   docsZ	query_objresultsresrc   r5   r`   r2   rO   Zmeta_keyr,   r,   r-   rZ      s.    
z"Dingo.similarity_search_with_score         ?zList[float]float)r   rU   fetch_klambda_multrV   r8   r/   c                   s    j j j|g||d}ttj|gtjddd |d d D ||d}g }	|D ]R}
i }|d d |
 d  D ]&\}}|t	||d	 d d
 i qp|	
| qP 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.
        )rV   r]   )Zdtypec                 S  s   g | ]}|d  d qS )ZvectorZfloatValuesr,   )r?   itemr,   r,   r-   rA      s   zADingo.max_marginal_relevance_search_by_vector.<locals>.<listcomp>r   r^   )rU   rp   r_   ra   rb   c                   s    g | ]}t | j|d qS )rd   )r   popr"   )r?   rO   r0   r,   r-   rA      s   )r#   rf   r'   r   nparrayZfloat32itemsupdater   rG   )r)   r   rU   ro   rp   rV   r8   rj   Zmmr_selectedselectedrN   Z	meta_datavr,   r0   r-   'max_marginal_relevance_search_by_vector   s(    
	  
z-Dingo.max_marginal_relevance_search_by_vector)rT   rU   ro   rp   rV   r8   r/   c                 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(   re   ry   )r)   rT   rU   ro   rp   rV   r8   r   r,   r,   r-   max_marginal_relevance_search   s    
z#Dingo.max_marginal_relevance_searchr   )r4   r   r5   r6   r   r   r   r   r   r   r   r7   r8   r/   c              
   K  s  zddl }W n ty&   tdY n0 |dur6|}nFz||
||	}W n2 tyz } ztd| W Y d}~n
d}~0 0 |dur|ddu r|dur|| vr| | vr|j||dd n2|dur|| vr| | vr|j||d	 |pd
d |D }g }t|}|	|}t
|D ].\}}|rB|| ni }|||< || q,tdtt||D ]D}|| }||||| ||| ||| }|sptdqp| ||||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  s"   g | ]}t t jd d qS r9   r;   r>   r,   r,   r-   rA   ^  rB   z$Dingo.from_texts.<locals>.<listcomp>rC   )r   r   )r   r   r    r!   rg   r$   r%   r&   rD   rE   rF   rG   rH   rI   rJ   rK   )clsr4   r   r5   r6   r   r   r   r   r   r   r   r7   r8   r   r*   r+   rL   rM   rN   r2   rO   rP   rQ   r,   r,   r-   
from_texts  sZ    '
$


 zDingo.from_texts)r6   r8   r/   c                 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.)r6   )r!   r#   Zvector_deleter'   )r)   r6   r8   r,   r,   r-   deleteq  s    
zDingo.delete)NNr2   r3   )rS   NN)rS   NN)rS   rl   rm   N)rS   rl   rm   N)N)__name__
__module____qualname____doc__r.   propertyr1   rR   r[   rZ   ry   rz   classmethodr|   r}   r,   r,   r,   r-   r      s`   "4    ,      0    4    ,^ r   )
__future__r   loggingr<   typingr   r   r   r   r   numpyrs   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   
