
    h3                        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j(                  e      Z G d d	e      Zy)
    )annotationsN)AnyIterableListOptionalTuple)Document)
Embeddings)VectorStore)maximal_marginal_relevancec                     e Zd ZdZdddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd	       Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ		 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ
	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZeddd
ddddgdddf
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z	 d	 	 	 	 	 d dZy)!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   root123123F)client
index_name	dimensionhostuserpasswordself_idc                  	 ddl }
||ndg}||}n	 |
j                  |||      }|| _        || _        |^||j                         vrL|j                         |j                         vr,|	du r|j                  ||d       n|j                  ||	       || _	        || _
        y# t        $ r t        d      w xY w# t        $ r}t        d|       d}~ww xY w)
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   auto_idr   )dingodbImportErrorDingoDB
ValueError	_text_key_client	get_indexuppercreate_index_index_name
_embedding)self	embeddingtext_keyr   r   r   r   r   r   r   r   dingo_clientes                d/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/dingo.py__init__zDingo.__init__    s   	 't.B-C !LB&tXtD "# ","8"8"::  ",*@*@*BB$)))U *  ))*	)J%#E  	? 	  B #<QC!@AABs"   B# B; #B8;	CCCc                    | j                   S N)r(   )r)   s    r.   
embeddingszDingo.embeddingsT   s        text  c           	        |xs8 |D cg c],  }t        t        j                         j                        dd . c}}g }t	        |      }| j
                  j                  |      }	t        |      D ].  \  }
}|r||
   ni }||| j                  <   |j                  |       0 t        dt        t	        |            |      D ]E  }
|
|z   }| j                  j                  | j                  ||
| |	|
| ||
|       }|r<t        d       |S c c}w )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.

        N   r   vector add fail)struuiduuid4intlistr(   embed_documents	enumerater"   appendrangelenr#   
vector_addr'   	Exception)r)   texts	metadatasidsr+   
batch_sizekwargs_metadatas_listembedsir4   metadatajadd_ress                  r.   	add_textszDingo.add_textsX   s   , @%@Qc$**,**+CR0@U007 ' 	,GAt'0y|bH'+HT^^$!!(+	,
 q#d5k*J7 	3AJAll--  .1"5va{C!HG  122	3 
# As   1D
c                d     | j                   |f||d|}|D cg c]  \  }}|	 c}}S c c}}w )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
        )ksearch_params)similarity_search_with_score)	r)   queryrT   rU   timeoutrI   docs_and_scoresdocrJ   s	            r.   similarity_searchzDingo.similarity_search   sE    $ <$;;
m
7=
 #22Q222s   ,c                   g }| j                   j                  |      }| j                  j                  | j                  |||      }|sg S |d   d   D ]  }	|	d   }
d|v r&|j                  d      |
|j                  d      kD  r2|	d   }|	d   }|| j                     d   d   d	   }|||
d
}|j                         D ]  }||   d   d   d	   ||<    |j                  t        ||      |
f        |S )rS   )xqtop_krU   r   vectorWithDistancesdistancescore_threshold
scalarDataidfieldsdata)rc   r4   scorepage_contentrN   )
r(   embed_queryr#   vector_searchr'   getr"   keysr@   r	   )r)   rW   rT   rU   rX   rI   docs	query_objresultsresrf   rF   rc   r4   rN   meta_keys                   r.   rV   z"Dingo.similarity_search_with_score   s1   $ OO//6	,,,,!= - 
 I1:34 	QC
OE!V+JJ01=6::&788L)ITBT^^,X6q9&AD $?H%NN, N%.x%8%B1%Ef%M"NKKthGOP	Q  r3   c                6   | j                   j                  | j                  |g||      }t        t	        j
                  |gt        j                        |d   d   D cg c]
  }|d   d    c}||      }	g }
|	D ]^  }i }|d   d   |   d   j                         D ]*  \  }}|j                  t        |      |d	   d   d
   i       , |
j                  |       ` |
D cg c](  }t        |j                  | j                        |      * c}S c c}w c c}w )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.
        )rU   r^   )dtyper   r_   vectorfloatValues)rT   lambda_multrb   rd   re   rg   )r#   rj   r'   r   nparrayfloat32itemsupdater9   r@   r	   popr"   )r)   r*   rT   fetch_krv   rU   rI   ro   itemmmr_selectedselectedrM   	meta_datavrN   s                  r.   'max_marginal_relevance_search_by_vectorz-Dingo.max_marginal_relevance_search_by_vector   s9   2 ,,,,yka - 
 2HHi[

3 $AJ'<= X}- #
  	'AI
#89!<\JPPR C1  #a&!H+a.*@!ABCOOI&		' %
 (,,t~~">R
 	

s   D
!-Dc                b    | j                   j                  |      }| 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(   ri   r   )r)   rW   rT   r}   rv   rU   rI   r*   s           r.   max_marginal_relevance_searchz#Dingo.max_marginal_relevance_search   s6    2 OO//6	;;q';
 	
r3   r   c           	        	 ddl }||}n	 |j                  |
||	      }|\|j	                  d      du rI|||j                         vr||j                         |j                         vr\|j                  ||d       nG|E||j                         vr3|j                         |j                         vr|j                  ||	       |xs8 |D cg c],  }t        t        j                         j                        dd
 . c}}g }t        |      }|j                  |      }t        |      D ]$  \  }}|r||   ni }|||<   |j                  |       & t!        dt#        t        |            |      D ]1  }||z   }|j%                  |||| ||| |||       }|r(t'        d        | ||||      S # t        $ r t        d      w xY w# t        $ r}t        d|       d}~ww xY wc c}w )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   r7   r8   )r   r   )r   r   r    r!   rk   r$   r%   r&   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   )clsrE   r*   rF   rG   r+   r   r   r   r   r   r   rH   rI   r   r,   r-   rJ   rK   rL   rM   r4   rN   rO   rP   s                            r.   
from_textszDingo.from_texts  s/   N	 !LB&tXtD &**Y"74"?&l&<&<&>>$$&l.D.D.FF)))U * 
 &l&<&<&>>$$&l.D.D.FF))*	)J @%@Qc$**,**+CR0@U**51 ' 	,GAt'0y|bH!%HX!!(+	, q#d5k*J7 	3AJA"--N1Q/!c!AhG  122	3 9h|
SSe  	@ 	  B #<QC!@AAB* As(   F/ G 1G&/G	G#GG#c                j    |t        d      | j                  j                  | j                  |      S )z^Delete by vector IDs or filter.
        Args:
            ids: List of ids to delete.
        zNo ids provided to delete.)rG   )r!   r#   vector_deleter'   )r)   rG   rI   s      r.   deletezDingo.deleteq  s5     ;9::||))$*:*:)DDr3   )r*   r
   r+   r9   r   r   r   Optional[str]r   r<   r   Optional[List[str]]r   r9   r   r9   r   bool)returnzOptional[Embeddings])NNr4   r5   )rE   zIterable[str]rF   Optional[List[dict]]rG   r   r+   r9   rH   r<   rI   r   r   	List[str])   NN)rW   r9   rT   r<   rU   Optional[dict]rX   Optional[int]rI   r   r   List[Document])rW   r9   rT   r<   rU   r   rX   r   rI   r   r   zList[Tuple[Document, float]])r      g      ?N)r*   zList[float]rT   r<   r}   r<   rv   floatrU   r   rI   r   r   r   )rW   r9   rT   r<   r}   r<   rv   r   rU   r   rI   r   r   r   )rE   r   r*   r
   rF   r   rG   r   r+   r9   r   r   r   r<   r   r   r   r   r   r9   r   r9   rH   r<   rI   r   r   r   r1   )rG   r   rI   r   r   r   )__name__
__module____qualname____doc__r/   propertyr2   rQ   r[   rV   r   r   classmethodr   r    r3   r.   r   r      s8   & $($( 2$2$ 2$
 2$ "2$ 2$ "2$ 2$ 2$ 2$h   +/#''' (' !	'
 ' ' ' 
'X (,!%33 3 &	3
 3 3 
34 (,!%++ + &	+
 + + 
&+`  (,/
/
 /
 	/

 /
 &/
 /
 
/
h  (,

 
 	

 
 &
 
 

< 
 +/#'$(/0 ZTZT ZT (	ZT
 !ZT ZT "ZT ZT ZT ZT ZT ZT ZT ZT 
ZT ZT| $(E E E 
	Er3   r   )
__future__r   loggingr:   typingr   r   r   r   r   numpyrw   langchain_core.documentsr	   langchain_core.embeddingsr
   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   	getLoggerr   loggerr   r   r3   r.   <module>r      sE    "   7 7  - 0 3 M			8	$mEK mEr3   