o
    Zh                     @   sZ   d dl mZmZmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZ G dd deeZdS )    )AnyListOptional)
Embeddings)	BaseModel
ConfigDictFieldmodel_validator)Selfc                   @   s  e Zd ZU dZdZeed< eddZe	ed< eddd	Z
eed< 	 ed
dd	Zeed< 	 ed
dd	Zeed< 	 eddd	Zeed< 	 eddd	Zeed< 	 eddd	Zeed< 	 eddd	Zeed< 	 eddd	Zee ed< 	 eddd	Zee ed< 	 eddd	Zee ed< 	 eddd	Zeed< 	 eddd	Zee	 ed< 	 edddZedddefddZd ee	 deee  fd!d"Z d#e	dee fd$d%Z!dS )&LlamaCppEmbeddingsa  llama.cpp embedding models.

    To use, you should have the llama-cpp-python library installed, and provide the
    path to the Llama model as a named parameter to the constructor.
    Check out: https://github.com/abetlen/llama-cpp-python

    Example:
        .. code-block:: python

            from langchain_community.embeddings import LlamaCppEmbeddings
            llama = LlamaCppEmbeddings(model_path="/path/to/model.bin")
    Nclient )default
model_pathi   n_ctx)aliasn_partsseedFf16_kv
logits_all
vocab_only	use_mlock	n_threadsn_batchn_gpu_layersTverbosedeviceZforbid )extraZprotected_namespacesafter)modereturnc              
      s    j }g d} fdd|D } jdur j|d<  jsRzddlm} ||fdd	i| _W  S  ty<   td
 tyQ } z
td| d| d}~ww  S )z4Validate that llama-cpp-python library is installed.)r   r   r   r   r   r   r   r   r   r   r   c                    s   i | ]}|t  |qS r   )getattr).0kselfr   ^/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/embeddings/llamacpp.py
<dictcomp>V   s    z;LlamaCppEmbeddings.validate_environment.<locals>.<dictcomp>Nr   r   )Llama	embeddingTzCould not import llama-cpp-python library. Please install the llama-cpp-python library to use this embedding model: pip install llama-cpp-pythonz&Could not load Llama model from path: z. Received error )r   r   r   Z	llama_cppr*   ImportError	Exception
ValueError)r'   r   Zmodel_param_namesZmodel_paramsr*   er   r&   r(   validate_environmentE   s.   

z'LlamaCppEmbeddings.validate_environmenttextsc                 C   s   | j |}g }|d D ]B}z)t|d d tr*|d D ]}|ttt| qn|ttt|d  W q ttfyN   |ttt|d  Y qw |S )zEmbed a list of documents using the Llama model.

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        datar+   r   )	r   Zcreate_embedding
isinstancelistappendmapfloat
IndexError	TypeError)r'   r1   Z
embeddingsZfinal_embeddingsr/   r2   r   r   r(   embed_documentsn   s   	z"LlamaCppEmbeddings.embed_documentstextc                 C   sH   | j |}|rt|trt|d trttt|d S ttt|S )zEmbed a query using the Llama model.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        r   )r   Zembedr3   r4   r6   r7   )r'   r;   r+   r   r   r(   embed_query   s   	zLlamaCppEmbeddings.embed_query)"__name__
__module____qualname____doc__r   r   __annotations__r   r   strr   intr   r   r   boolr   r   r   r   r   r   r   r   r   r   Zmodel_configr	   r
   r0   r   r7   r:   r<   r   r   r   r(   r      sH   
 (r   N)typingr   r   r   Zlangchain_core.embeddingsr   Zpydanticr   r   r   r	   Ztyping_extensionsr
   r   r   r   r   r(   <module>   s
    