o
    Zh/                     @  s   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dZG dd deZdS )    )annotationsN)TYPE_CHECKINGAnyDictIterableListOptionalTupleType)Document)
Embeddings)get_from_env)VectorStore)ClientclientOptional[Client]urlOptional[str]api_keyreturnr   c              
   C  s   zdd l }W n ty   tdw | s6|ptdd}z	|p"tdd}W n	 ty-   Y nw |j||d} nt| |jsEtdt|  z|   W | S  ty_ } ztd	| d }~ww )
Nr   z^Could not import meilisearch python package. Please install it with `pip install meilisearch`.r   ZMEILI_HTTP_ADDRr   Z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)r   r   r   r   e r   c/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/meilisearch.py_create_client   s4   
r    c                   @  s   e Zd ZdZ						d:ddd;ddZ			d<d=d"d#Z	$		d>d?d+d,Z	$		d>d@d.d/Z		$	dAdBd1d2Z	$		d>dCd3d4Z	e
ddddddddi df
dDd8d9ZdS )E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)	embedders	embeddingr   r   r   r   r   r   
index_namestrtext_keymetadata_keyr%   Optional[Dict[str, Any]]c          	      C  sP   t |||d}|| _|| _|| _|| _|| _|| _| jt| j	|| _
dS )z#Initialize with Meilisearch client.r   r   r   N)r    _client_index_name
_embedding	_text_key_metadata_keyZ
_embeddersindexr(   Zupdate_embeddersZ_embedders_settings)	selfr&   r   r   r   r'   r)   r*   r%   r   r   r   __init__Q   s   zMeilisearch.__init__defaulttextsIterable[str]	metadatasOptional[List[dict]]idsOptional[List[str]]embedder_namekwargsr   r   	List[str]c              	   K  s   t |}g }|du rdd |D }|du rdd |D }| j|}t|D ]%\}}	|| }
|| }|	|| j< || }|d|
d| |i| j |i q&| jt	| j
| |S )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.
        Nc                 S  s   g | ]}t  jqS r   )uuiduuid4hex.0_r   r   r   
<listcomp>   s    z)Meilisearch.add_texts.<locals>.<listcomp>c                 S  s   g | ]}i qS r   r   rB   r   r   r   rE      s    idZ_vectors)listr/   Zembed_documents	enumerater0   appendr1   r-   r2   r(   r.   Zadd_documents)r3   r6   r8   r:   r<   r=   docsZembedding_vectorsir#   rF   r$   r&   r   r   r   	add_textsj   s(   

	zMeilisearch.add_texts   querykintfilterOptional[Dict[str, str]]List[Document]c                 K  "   | j |||||d}dd |D S )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.
        )rN   r<   rO   rQ   r=   c                 S     g | ]\}}|qS r   r   rC   docrD   r   r   r   rE          z1Meilisearch.similarity_search.<locals>.<listcomp>)similarity_search_with_score)r3   rN   rO   rQ   r<   r=   Zdocs_and_scoresr   r   r   similarity_search      zMeilisearch.similarity_searchList[Tuple[Document, float]]c                 K  s$   | j |}| j|||||d}|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.
        r&   r<   rO   rQ   r=   )r/   Zembed_query'similarity_search_by_vector_with_scores)r3   rN   rO   rQ   r<   r=   Z_queryrJ   r   r   r   rY      s   z(Meilisearch.similarity_search_with_scoreList[float]c              	   K  s   g }| j t| jd|d|d||dd}|d D ]!}|| j }	| j|	v r=|	| j}
|d }|t	|
|	d|f q|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      ?)ZsemanticRatioZembedderT)ZvectorZhybridlimitrQ   ZshowRankingScorehitsZ_rankingScore)Zpage_contentr$   )
r-   r2   r(   r.   searchr1   r0   poprI   r   )r3   r&   r<   rO   rQ   r=   rJ   resultsresultr$   r#   Zsemantic_scorer   r   r   r^      s,   


z3Meilisearch.similarity_search_by_vector_with_scoresc                 K  rT   )r`   r]   c                 S  rU   r   r   rV   r   r   r   rE   #  rX   z;Meilisearch.similarity_search_by_vector.<locals>.<listcomp>)r^   )r3   r&   rO   rQ   r<   r=   rJ   r   r   r   similarity_search_by_vector  r[   z'Meilisearch.similarity_search_by_vectorclsType[Meilisearch]Dict[str, Any]c                 K  s8   t |||d}| ||||d}|j|||||	|
d |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,   )r&   r%   r   r'   )r6   r<   r8   r:   r)   r*   )r    rL   )ri   r6   r&   r8   r   r   r   r'   r:   r)   r*   r%   r<   r=   Zvectorstorer   r   r   
from_texts%  s    +zMeilisearch.from_texts)NNNr"   r#   r$   )r&   r   r   r   r   r   r   r   r'   r(   r)   r(   r*   r(   r%   r+   )NNr5   )r6   r7   r8   r9   r:   r;   r<   r   r=   r   r   r>   )rM   Nr5   )rN   r(   rO   rP   rQ   rR   r<   r   r=   r   r   rS   )rN   r(   rO   rP   rQ   rR   r<   r   r=   r   r   r\   )r5   rM   N)r&   r_   r<   r   rO   rP   rQ   r+   r=   r   r   r\   )r&   r_   rO   rP   rQ   rR   r<   r   r=   r   r   rS   )ri   rj   r6   r>   r&   r   r8   r9   r   r   r   r   r   r   r'   r(   r:   r;   r)   r   r*   r   r%   rk   r<   r   r=   r   r   r!   )__name__
__module____qualname____doc__r4   rL   rZ   rY   r^   rh   classmethodrl   r   r   r   r   r!   -   sV    &
3!#2r!   )NNN)r   r   r   r   r   r   r   r   )
__future__r   r?   typingr   r   r   r   r   r   r	   r
   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.utilsr   Zlangchain_core.vectorstoresr   r   r   r    r!   r   r   r   r   <module>   s    (