o
    Zhf0                     @  s   d dl mZ d dlZd dlmZ d dl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mZ d d	lmZ d d
lmZmZ eeZG dd deZdS )    )annotationsN)Path)AnyDictIteratorListOptionalUnion)CallbackManagerForLLMRun)LLM)GenerationChunk)get_pydantic_field_namespre_init)_build_model_kwargs)Fieldmodel_validatorc                   @  s  e Zd ZU dZdZded< ded< 	 dZded< 	 dZded	< 	 ed
ddZ	ded< 	 edddZ
ded< 	 edddZded< 	 edddZded< 	 edddZded< 	 edddZded< 	 edddZded< 	 edddZded< 	 edddZded< 	 edddZded< 	 edZded< 	 dZded< 	 d Zd!ed"< 	 d#Zd!ed$< 	 edZded%< 	 dZd&ed'< 	 g Zd(ed)< 	 d*Zd!ed+< 	 d,Zded-< 	 d.Zded/< 	 dZd&ed0< 	 d1Zd2ed3< 	 d4Zd2ed5< 	 ee d6Z!d7ed8< 	 dZ"ded9< 	 dZ#d:ed;< 	 dZ$d<ed=< 	 dZ%ded>< 	 e&d\dBdCZ'e(dDdEe)d]dFdGZ*e+d^dHdIZ,e+d^dJdKZ-e+d_dLdMZ.d`dadNdOZ/		dbdcdTdUZ0		dbdddWdXZ1dedZd[Z2dS )fLlamaCppa  llama.cpp model.

    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.llms import LlamaCpp
            llm = LlamaCpp(model_path="/path/to/llama/model")
    Nr   clientstr
model_pathzOptional[str]	lora_base	lora_pathi   n_ctx)aliasintn_partsseedTf16_kvboolF
logits_all
vocab_only	use_mlock	n_threadszOptional[int]   n_batchn_gpu_layerssuffix   
max_tokensg?zOptional[float]temperaturegffffff?top_plogprobszOptional[bool]echoOptional[List[str]]stopg?repeat_penalty(   top_k@   last_n_tokens_sizeuse_mmapg      ?floatrope_freq_scaleg     @rope_freq_base)default_factoryDict[str, Any]model_kwargs	streamingzOptional[Union[str, Path]]grammar_pathzOptional[Union[str, Any]]grammarverbosevaluesr   returnc           
   
     s8  z
ddl m}m} W n ty   tdw  d }g d} fdd|D } d d	ur3 d |d< | d
  z||fi | d< W n ty\ } z
td| d| d	}~ww  d rx d rx d } d }	td|d|	dt d tr|	 d  d<  S  d r|
 d  d<  S 	  S )z4Validate that llama-cpp-python library is installed.r   )LlamaLlamaGrammarzCould not import llama-cpp-python library. Please install the llama-cpp-python library to use this embedding model: pip install llama-cpp-pythonr   )r7   r8   r   r   r   r   r   r   r    r!   r"   r#   r%   r5   r4   r?   c                   s   i | ]}| | qS  rD   ).0kr@   rD   X/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/llms/llamacpp.py
<dictcomp>   s    z1LlamaCpp.validate_environment.<locals>.<dictcomp>r&   Nr;   r   z&Could not load Llama model from path: z. Received error r>   r=   zCCan only pass in one of grammar and grammar_path. Received grammar=z and grammar_path=.)Z	llama_cpprB   rC   ImportErrorupdate	Exception
ValueError
isinstancer   Zfrom_string	from_file)
clsr@   rB   rC   r   Zmodel_param_namesZmodel_paramser>   r=   rD   rG   rH   validate_environment   sR   zLlamaCpp.validate_environmentbefore)modec                 C  s   t | }t||}|S )z>Build extra kwargs from additional params that were passed in.)r   r   )rQ   r@   Zall_required_field_namesrD   rD   rH   build_model_kwargs   s   
zLlamaCpp.build_model_kwargsc              
   C  s>   | j | j| j| j| j| j| j| j| jd	}| j	r| j	|d< |S )z1Get the default parameters for calling llama_cpp.)	r'   r)   r*   r+   r,   r-   stop_sequencesr0   r2   r>   )
r'   r)   r*   r+   r,   r-   r/   r0   r2   r>   )selfparamsrD   rD   rH   _default_params   s   
zLlamaCpp._default_paramsc                 C  s   i d| j i| jS )zGet the identifying parameters.r   )r   rZ   rX   rD   rD   rH   _identifying_params   s   zLlamaCpp._identifying_paramsc                 C  s   dS )zReturn type of llm.ZllamacpprD   r[   rD   rD   rH   	_llm_type   s   zLlamaCpp._llm_typec                 C  s<   | j r|durtd| j}|d | j p|pg |d< |S )a  
        Performs sanity check, preparing parameters in format needed by llama_cpp.

        Args:
            stop (Optional[List[str]]): List of stop sequences for llama_cpp.

        Returns:
            Dictionary containing the combined parameters.
        Nz2`stop` found in both the input and default params.rW   r/   )r/   rN   rZ   pop)rX   r/   rY   rD   rD   rH   _get_parameters   s   
zLlamaCpp._get_parameterspromptrun_manager"Optional[CallbackManagerForLLMRun]kwargsc           	      K  sp   | j rd}| jd|||d|D ]}||j7 }q|S | |}i ||}| jdd|i|}|d d d S )	a  Call the Llama model and return the output.

        Args:
            prompt: The prompt to use for generation.
            stop: A list of strings to stop generation when encountered.

        Returns:
            The generated text.

        Example:
            .. code-block:: python

                from langchain_community.llms import LlamaCpp
                llm = LlamaCpp(model_path="/path/to/local/llama/model.bin")
                llm.invoke("This is a prompt.")
         )r`   r/   ra   r`   choicesr   textNrD   )r<   _streamrf   r_   r   )	rX   r`   r/   ra   rc   Zcombined_text_outputchunkrY   resultrD   rD   rH   _call  s   

zLlamaCpp._callIterator[GenerationChunk]c           
      k  s    i |  ||}| jd
|dd|}|D ])}|d d dd}t|d d d d|id}	|r=|j|	j| j|d	 |	V  qdS )a\  Yields results objects as they are generated in real time.

        It also calls the callback manager's on_llm_new_token event with
        similar parameters to the OpenAI LLM class method of the same name.

        Args:
            prompt: The prompts to pass into the model.
            stop: Optional list of stop words to use when generating.

        Returns:
            A generator representing the stream of tokens being generated.

        Yields:
            A dictionary like objects containing a string token and metadata.
            See llama-cpp-python docs and below for more.

        Example:
            .. code-block:: python

                from langchain_community.llms import LlamaCpp
                llm = LlamaCpp(
                    model_path="/path/to/local/model.bin",
                    temperature = 0.5
                )
                for chunk in llm.stream("Ask 'Hi, how are you?' like a pirate:'",
                        stop=["'","
"]):
                    result = chunk["choices"][0]
                    print(result["text"], end='', flush=True)  # noqa: T201

        T)r`   streamre   r   r,   Nrf   )rf   Zgeneration_info)tokenr?   Z	log_probsrD   )r_   r   getr   Zon_llm_new_tokenrf   r?   )
rX   r`   r/   ra   rc   rY   ri   partr,   rh   rD   rD   rH   rg   ,  s   %
zLlamaCpp._streamrf   c                 C  s   | j |d}t|S )Nzutf-8)r   tokenizeencodelen)rX   rf   Ztokenized_textrD   rD   rH   get_num_tokens_  s   zLlamaCpp.get_num_tokens)r@   r   rA   r   )r@   r:   rA   r   )rA   r:   )rA   r   )N)r/   r.   rA   r:   )NN)
r`   r   r/   r.   ra   rb   rc   r   rA   r   )
r`   r   r/   r.   ra   rb   rc   r   rA   rk   )rf   r   rA   r   )3__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r   r   r    r!   r"   r#   r%   r&   r'   r)   r*   r+   r,   r-   r/   r0   r2   r4   r5   r7   r8   dictr;   r<   r=   r>   r?   r   rS   r   classmethodrV   propertyrZ   r\   r]   r_   rj   rg   rs   rD   rD   rD   rH   r      s   
 <-3r   )
__future__r   loggingpathlibr   typingr   r   r   r   r   r	   Zlangchain_core.callbacksr
   Z#langchain_core.language_models.llmsr   Zlangchain_core.outputsr   Zlangchain_core.utilsr   r   Zlangchain_core.utils.utilsr   Zpydanticr   r   	getLoggerrt   loggerr   rD   rD   rD   rH   <module>   s     
