
    h/                        d dl mZ d dlZd dlmZmZmZ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rd dlmZ 	 	 	 d	 	 	 	 	 	 	 dd	Z G d
 de      Zy)    )annotationsN)TYPE_CHECKINGAnyDictIterableListOptionalTupleType)Document)
Embeddings)get_from_env)VectorStore)Clientc                   	 dd l }| s5|xs t        dd      }	 |xs t        dd      }|j	                  ||      } n-t        | |j                        st        dt        |              	 | j                          | S # t        $ r t        d      w xY w# t        $ r Y ww xY w# t        $ r}t        d	|       d }~ww xY w)
Nr   z^Could not import meilisearch python package. Please install it with `pip install meilisearch`.urlMEILI_HTTP_ADDRapi_keyMEILI_MASTER_KEY)r   r   z8client should be an instance of meilisearch.Client, got z"Failed to connect to Meilisearch: )	meilisearchImportErrorr   	Exceptionr   
isinstance
ValueErrortypeversion)clientr   r   r   es        j/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/vectorstores/meilisearch.py_create_clientr       s    

 ;\%):;	Li9K!LG ##W#= 2 23FtF|nU
 	
C M)  
@
 	

  		  C=aSABBCs4   A= B +B$ =B	B! B!$	C -B;;C c                  j   e Zd ZdZ	 	 	 	 	 	 ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 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di df
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zy)Meilisearcha  `Meilisearch` vector store.

    To use this, you need to have `meilisearch` python package installed,
    and a running Meilisearch instance.

    To learn more about Meilisearch Python, refer to the in-depth
    Meilisearch Python documentation: https://meilisearch.github.io/meilisearch-python/.

    See the following documentation for how to run a Meilisearch instance:
    https://www.meilisearch.com/docs/learn/getting_started/quick_start.

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import Meilisearch
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            import meilisearch

            # api_key is optional; provide it if your meilisearch instance requires it
            client = meilisearch.Client(url='http://127.0.0.1:7700', api_key='***')
            embeddings = OpenAIEmbeddings()
            embedders = {
                "theEmbedderName": {
                    "source": "userProvided",
                    "dimensions": "1536"
                }
            }
            vectorstore = Meilisearch(
                embedding=embeddings,
                embedders=embedders,
                client=client,
                index_name='langchain_demo',
                text_key='text')
    Nlangchain-demotextmetadata)	embeddersc                   t        |||      }|| _        || _        || _        || _        || _        || _        | j                  j                  t        | j                              j                  |      | _
        y)z#Initialize with Meilisearch client.r   r   r   N)r    _client_index_name
_embedding	_text_key_metadata_key
_embeddersindexstrupdate_embedders_embedders_settings)	self	embeddingr   r   r   
index_nametext_keymetadata_keyr&   s	            r   __init__zMeilisearch.__init__Q   sq      v3H%#!)##'<<#5#5  !$


9
% 	     defaultc           	        t        |      }g }|+|D cg c]   }t        j                         j                  " }}||D cg c]  }i  }}| j                  j                  |      }t        |      D ]H  \  }	}
||	   }||	   }|
|| j                  <   ||	   }|j                  d|d| |i| j                   |i       J | j                  j                  t        | j                              j                  |       |S c c}w c c}w )a!  Run more texts through the embedding and add them to the vector store.

        Args:
            texts (Iterable[str]): Iterable of strings/text to add to the vectorstore.
            embedder_name: Name of the embedder. Defaults to "default".
            metadatas (Optional[List[dict]]): Optional list of metadata.
                Defaults to None.
            ids Optional[List[str]]: Optional list of IDs.
                Defaults to None.

        Returns:
            List[str]: List of IDs of the texts added to the vectorstore.
        id_vectors)listuuiduuid4hexr+   embed_documents	enumerater,   appendr-   r)   r/   r0   r*   add_documents)r3   texts	metadatasidsembedder_namekwargsdocs_embedding_vectorsir$   r<   r%   r4   s                 r   	add_textszMeilisearch.add_textsj   s   * U ;-234::<##3C3%*++I+ OO;;EB ' 	GAtQB |H'+HT^^$)!,IKK"M?Y ?))*X	 	3t//01??E
) 4+s   %C<	Dc                d    | j                  |||||      }|D cg c]  \  }}|	 c}}S c c}}w )a  Return meilisearch documents most similar to the query.

        Args:
            query (str): Query text for which to find similar documents.
            embedder_name: Name of the embedder to be used. Defaults to "default".
            k (int): Number of documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None.

        Returns:
            List[Document]: List of Documents most similar to the query
            text and score for each.
        )queryrI   kfilterrJ   )similarity_search_with_score)	r3   rQ   rR   rS   rI   rJ   docs_and_scoresdocrL   s	            r   similarity_searchzMeilisearch.similarity_search   sB    * ;;' < 
 #22Q222   ,c                h    | j                   j                  |      }| j                  |||||      }|S )a%  Return meilisearch documents most similar to the query, along with scores.

        Args:
            query (str): Query text for which to find similar documents.
            embedder_name: Name of the embedder to be used. Defaults to "default".
            k (int): Number of documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None.

        Returns:
            List[Document]: List of Documents most similar to the query
            text and score for each.
        r4   rI   rR   rS   rJ   )r+   embed_query'similarity_search_by_vector_with_scores)r3   rQ   rR   rS   rI   rJ   _queryrK   s           r   rT   z(Meilisearch.similarity_search_with_score   sC    * ,,U3;;' < 
 r9   c           	     d   g }| j                   j                  t        | j                              j	                  d|d|d||dd      }|d   D ]^  }|| j
                     }	| j                  |	v s!|	j                  | j                        }
|d   }|j                  t        |
|	      |f       ` |S )	#  Return meilisearch documents most similar to embedding vector.

        Args:
            embedding (List[float]): Embedding to look up similar documents.
            embedder_name: Name of the embedder to be used. Defaults to "default".
            k (int): Number of documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None.

        Returns:
            List[Document]: List of Documents most similar to the query
                vector and score for each.
         g      ?)semanticRatioembedderT)vectorhybridlimitrS   showRankingScorehits_rankingScore)page_contentr%   )
r)   r/   r0   r*   searchr-   r,   poprD   r   )r3   r4   rI   rR   rS   rJ   rK   resultsresultr%   r$   semantic_scores               r   r\   z3Meilisearch.similarity_search_by_vector_with_scores   s    * ,,$$S)9)9%:;BB#,/]K $(	
 fo 
	Fd001H~~)||DNN3!'!8 dXF&
	 r9   c                d    | j                  |||||      }|D cg c]  \  }}|	 c}}S c c}}w )r_   rZ   )r\   )	r3   r4   rR   rS   rI   rJ   rK   rV   rL   s	            r   similarity_search_by_vectorz'Meilisearch.similarity_search_by_vector  sB    * ;;' < 
 #''Q'''rX   c                h    t        |||      } | ||||      }|j                  |||||	|
       |S )a  Construct Meilisearch wrapper from raw documents.

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

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

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import Meilisearch
                from langchain_community.embeddings import OpenAIEmbeddings
                import meilisearch

                # The environment should be the one specified next to the API key
                # in your Meilisearch console
                client = meilisearch.Client(url='http://127.0.0.1:7700', api_key='***')
                embedding = OpenAIEmbeddings()
                embedders: Embedders index setting.
                embedder_name: Name of the embedder. Defaults to "default".
                docsearch = Meilisearch.from_texts(
                    client=client,
                    embedding=embedding,
                )
        r(   )r4   r&   r   r5   )rF   rI   rG   rH   r6   r7   )r    rO   )clsrF   r4   rG   r   r   r   r5   rH   r6   r7   r&   rI   rJ   vectorstores                  r   
from_textszMeilisearch.from_texts%  sX    V  v3H!	
 	'% 	 	
 r9   )NNNr#   r$   r%   )r4   r   r   Optional[Client]r   Optional[str]r   rv   r5   r0   r6   r0   r7   r0   r&   Optional[Dict[str, Any]])NNr:   )rF   zIterable[str]rG   Optional[List[dict]]rH   Optional[List[str]]rI   rv   rJ   r   return	List[str])   Nr:   )rQ   r0   rR   intrS   Optional[Dict[str, str]]rI   rv   rJ   r   rz   List[Document])rQ   r0   rR   r}   rS   r~   rI   rv   rJ   r   rz   List[Tuple[Document, float]])r:   r|   N)r4   List[float]rI   rv   rR   r}   rS   rw   rJ   r   rz   r   )r4   r   rR   r}   rS   r~   rI   rv   rJ   r   rz   r   )rr   zType[Meilisearch]rF   r{   r4   r   rG   rx   r   ru   r   rv   r   rv   r5   r0   rH   ry   r6   rv   r7   rv   r&   zDict[str, Any]rI   rv   rJ   r   rz   r"   )__name__
__module____qualname____doc__r8   rO   rW   rT   r\   rp   classmethodrt    r9   r   r"   r"   -   s   !L $(!!%*&& /3&& !& 	&
 & & & & ,&8 +/#''0.. (. !	.
 %. . 
.f +/'033 3 )	3
 %3 3 
3B +/'0  )	
 %  
&F (1+/-- %- 	-
 )- - 
&-d +/'0(( ( )	(
 %( ( 
(< 
 +/#'!!%*#'"(&0$&'0::: : (	:
 !: : : : !:  : $: ": %: : 
: :r9   r"   )NNN)r   ru   r   rv   r   rv   rz   r   )
__future__r   r?   typingr   r   r   r   r   r	   r
   r   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   r   r   r    r"   r   r9   r   <module>r      sh    "  R R R - 0 - 3"  $!	  	<s+ sr9   