a
    bg_/                     @  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
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Optional[Client]Optional[str]r   )clienturlapi_keyreturnc              
   C  s   zdd l }W n ty&   tdY n0 | sp|p8tdd}z|pHtdd}W n ty^   Y n0 |j||d} nt| |jstdt|  z|   W n2 ty } ztd	| W Y d }~n
d }~0 0 | S )
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   z/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/vectorstores/meilisearch.py_create_client   s0    
$r    c                   @  s   e Zd ZdZd.ddddd	d	d
d
d
ddddZd/dddd	dddddZd0d
ddd	dddddZd1d
ddd	dddd d!Zd2d"d	ddddd#d$d%Zd3d"ddd	ddd&d'd(Z	e
ddddddddi df
d)ddddd	d	d
dd	d	d*d	dd d+d,d-ZdS )4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)	embeddersr   r   r   strzOptional[Dict[str, Any]])	embeddingr   r   r   
index_nametext_keymetadata_keyr%   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__R   s    zMeilisearch.__init__defaultzIterable[str]zOptional[List[dict]]zOptional[List[str]]r   z	List[str])texts	metadatasidsembedder_namekwargsr   c              	   K  s   t |}g }|du r"dd |D }|du r8dd |D }| j|}t|D ]J\}}	|| }
|| }|	|| j< || }|d|
d| |i| j |i qL| 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>       z)Meilisearch.add_texts.<locals>.<listcomp>c                 S  s   g | ]}i qS r   r   r=   r   r   r   r@      rA   idZ_vectors)listr.   Zembed_documents	enumerater/   appendr0   r,   r1   r&   r-   Zadd_documents)r2   r5   r6   r7   r8   r9   docsZembedding_vectorsir#   rB   r$   r'   r   r   r   	add_textsk   s(    

	zMeilisearch.add_texts   intzOptional[Dict[str, str]]zList[Document])querykfilterr8   r9   r   c                 K  s"   | 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.
        )rK   r8   rL   rM   r9   c                 S  s   g | ]\}}|qS r   r   r>   docr?   r   r   r   r@      rA   z1Meilisearch.similarity_search.<locals>.<listcomp>)similarity_search_with_score)r2   rK   rL   rM   r8   r9   Zdocs_and_scoresr   r   r   similarity_search   s    zMeilisearch.similarity_searchz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'   r8   rL   rM   r9   )r.   Zembed_query'similarity_search_by_vector_with_scores)r2   rK   rL   rM   r8   r9   Z_queryrF   r   r   r   rP      s    z(Meilisearch.similarity_search_with_scorezList[float])r'   r8   rL   rM   r9   r   c              	   K  s   g }| j t| jd|d|d||dd}|d D ]B}|| j }	| j|	v r8|	| j}
|d }|t	|
|	d|f q8|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limitrM   ZshowRankingScorehitsZ_rankingScore)Zpage_contentr$   )
r,   r1   r&   r-   searchr0   r/   poprE   r   )r2   r'   r8   rL   rM   r9   rF   resultsresultr$   r#   Zsemantic_scorer   r   r   rS      s&    

z3Meilisearch.similarity_search_by_vector_with_scores)r'   rL   rM   r8   r9   r   c                 K  s"   | j |||||d}dd |D S )rT   rR   c                 S  s   g | ]\}}|qS r   r   rN   r   r   r   r@   !  rA   z;Meilisearch.similarity_search_by_vector.<locals>.<listcomp>)rS   )r2   r'   rL   rM   r8   r9   rF   r   r   r   similarity_search_by_vector  s    z'Meilisearch.similarity_search_by_vectorzType[Meilisearch]zDict[str, Any])clsr5   r'   r6   r   r   r   r(   r7   r)   r*   r%   r8   r9   r   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(   )r5   r8   r6   r7   r)   r*   )r    rH   )r]   r5   r'   r6   r   r   r   r(   r7   r)   r*   r%   r8   r9   Zvectorstorer   r   r   
from_texts#  s     +zMeilisearch.from_texts)NNNr"   r#   r$   )NNr4   )rI   Nr4   )rI   Nr4   )r4   rI   N)rI   Nr4   )__name__
__module____qualname____doc__r3   rH   rQ   rP   rS   r\   classmethodr^   r   r   r   r   r!   .   sT   &      
    3   !   #   /   r!   )NNN)
__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   (   