Ë
    µŒjf0  ã                  óÎ   — 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j4                  e«      Z G d„ de«      Zy)é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚIteratorÚListÚOptionalÚUnion)ÚCallbackManagerForLLMRun)ÚLLM)ÚGenerationChunk)Úget_pydantic_field_namesÚpre_init)Ú_build_model_kwargs)ÚFieldÚmodel_validatorc                  ó–  — 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¬«      Z	ded<   	  edd¬«      Z
ded<   	  edd¬«      Zded<   	  edd¬«      Zded<   	  edd¬«      Zded<   	  edd¬«      Zded<   	  edd¬«      Zded<   	  edd¬«      Zded<   	  edd¬«      Zded<   	  e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 ¬6«      Z!d7ed8<   	 dZ"ded9<   	 dZ#d:ed;<   	 dZ$d<ed=<   	 dZ%ded><   	 e&dJd?„«       Z' e(d@¬A«      e)dKdB„«       «       Z*e+dLdC„«       Z,e+dLdD„«       Z-e+dMdE„«       Z.dNdOdF„Z/	 	 dP	 	 	 	 	 	 	 	 	 dQdG„Z0	 	 dP	 	 	 	 	 	 	 	 	 dRdH„Z1dSdI„Z2y)TÚ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Úverbosec                ó  — 	 ddl m}m} |d   }g d¢}|D �ci c]  }|||   “Œ
 }}|d   �|d   |d<   |j	                  |d   «       	  ||fi |¤Ž|d	<   |d   r!|d   r|d   }	|d   }
t        d|	›d|
›d�«      ‚t        |d   t        «      r|j                  |d   «      |d<   |S |d   r|j                  |d   «      |d<   |S 	 |S # t        $ r t        d«      ‚w xY wc c}w # t
        $ r}t        d
|› d|› �«      ‚d}~ww xY w)z4Validate that llama-cpp-python library is installed.r   )ÚLlamaÚLlamaGrammarz�Could not import llama-cpp-python library. Please install the llama-cpp-python library to use this embedding model: pip install llama-cpp-pythonr   )r9   r:   r   r   r   r   r   r    r"   r#   r$   r%   r'   r7   r6   rA   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=Ú.)Ú	llama_cpprC   rD   ÚImportErrorÚupdateÚ	ExceptionÚ
ValueErrorÚ
isinstancer   Úfrom_stringÚ	from_file)ÚclsÚvaluesrC   rD   r   Úmodel_param_namesÚkÚmodel_paramsÚer@   r?   s              úk/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/llms/llamacpp.pyÚvalidate_environmentzLlamaCpp.validate_environmentˆ   s–  € ð	ß5ð ˜LÑ)ˆ
ò
Ðñ$ /@Ó@Ñ.?¨˜˜6 !™9™Ð.?ˆÐ@à�.Ñ!Ð-Ø+1°.Ñ+AˆL˜Ñ(à×Ñ˜F >Ñ2Ô3ð	Ù$ ZÑ@°<Ñ@ˆF�8Ñð �)Ò ¨Ò!7Ø˜YÑ'ˆGØ! .Ñ1ˆLÜðØ�*Ð/ , °ð3óð ô ˜˜yÑ)¬3Ô/Ø ,× 8Ñ 8¸À	Ñ9JÓ KˆF�9Ñð
 ˆð	 �NÒ#Ø ,× 6Ñ 6°v¸nÑ7MÓ NˆF�9Ñð ˆð Øˆøôm ò 	ÜðIóð ð	üò4 Aøô ò 	ÜØ8¸¸ð E"Ø"# ð&óð ûð	ús(   ‚C —CÁC$ ÃCÃ$	DÃ-C>Ã>DÚbefore)Úmodec                ó4   — t        | «      }t        ||«      }|S )z>Build extra kwargs from additional params that were passed in.)r   r   )rN   rO   Úall_required_field_namess      rT   Úbuild_model_kwargszLlamaCpp.build_model_kwargsÅ   s!   € ô $<¸CÓ#@Ð Ü$ VÐ-EÓFˆØˆó    c           
     ó  — | 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_sequencesr2   r4   r@   )
r)   r+   r,   r-   r.   r/   r1   r2   r4   r@   )ÚselfÚparamss     rT   Ú_default_paramszLlamaCpp._default_paramsÍ   sj   € ð —k‘kØŸ/™/Ø×+Ñ+Ø—Z‘ZØŸ™Ø—I‘IØ"Ÿi™iØ"×1Ñ1Ø—Z‘Zñ

ˆð �<Š<Ø $§¡ˆF�9ÑØˆr[   c                ó:   — i d| j                   i¥| j                  ¥S )zGet the identifying parameters.r   )r   r`   ©r^   s    rT   Ú_identifying_paramszLlamaCpp._identifying_paramsß   s$   € ð K�< §¡Ð1ÐJ°T×5IÑ5IÐJÐJr[   c                 ó   — y)zReturn type of llm.Úllamacpp© rb   s    rT   Ú	_llm_typezLlamaCpp._llm_typeä   s   € ð r[   c                ó    — | j                   r|�t        d«      ‚| j                  }|j                  d«       | j                   xs |xs 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.
        z2`stop` found in both the input and default params.r]   r1   )r1   rJ   r`   Úpop)r^   r1   r_   s      rT   Ú_get_parameterszLlamaCpp._get_parametersé   sT   € ð �9Š9˜Ð)ÜÐQÓRÐRà×%Ñ%ˆð 	�
‰
Ð#Ô$ð Ÿ™Ò0 dÒ0¨bˆˆv‰àˆr[   c                óâ   — | j                   r.d} | j                  d|||dœ|¤ŽD ]  }||j                  z  }Œ |S | j                  |«      }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.")
        Ú )Úpromptr1   Úrun_managerrm   Úchoicesr   Útextrf   )r>   Ú_streamrp   rj   r   )	r^   rm   r1   rn   ÚkwargsÚcombined_text_outputÚchunkr_   Úresults	            rT   Ú_callzLlamaCpp._call  s¥   € ð. �>Š>ð $&Ð Ø%˜Ÿ™ð ØØØ'ñð ô	�ð %¨¯
©
Ñ2Ñ$ðð (Ð'à×)Ñ)¨$Ó/ˆFØ)˜Ð) &Ð)ˆFØ �T—[‘[Ñ9¨Ð9°&Ñ9ˆFØ˜)Ñ$ QÑ'¨Ñ/Ð/r[   c              +  ó*  K  — i | j                  |«      ¥|¥} | j                  d
|ddœ|¤Ž}|D ]`  }|d   d   j                  dd«      }t        |d   d   d   d|i¬«      }	|r(|j	                  |	j
                  | j                  |¬	«       |	–— Œb y­w)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)rm   Ústreamro   r   r.   Nrp   )rp   Úgeneration_info)ÚtokenrA   Ú	log_probsrf   )rj   r   Úgetr   Úon_llm_new_tokenrp   rA   )
r^   rm   r1   rn   rr   r_   ru   Úpartr.   rt   s
             rT   rq   zLlamaCpp._stream,  s³   è ø€ ðJ :�D×(Ñ(¨Ó.Ð9°&Ð9ˆØ�—‘ÐB F°4ÑB¸6ÑBˆÛˆDØ˜I‘ qÑ)×-Ñ-¨j¸$Ó?ˆHÜ#Ø˜)‘_ QÑ'¨Ñ/Ø!+¨XÐ 6ôˆEñ Ø×,Ñ,ØŸ*™*¨d¯l©lÀhð -ô ð ‹Kñ ùs   ‚BBc                ól   — | j                   j                  |j                  d«      «      }t        |«      S )Nzutf-8)r   ÚtokenizeÚencodeÚlen)r^   rp   Útokenized_texts      rT   Úget_num_tokenszLlamaCpp.get_num_tokens_  s*   € ØŸ™×-Ñ-¨d¯k©k¸'Ó.BÓCˆÜ�>Ó"Ð"r[   )rO   r   Úreturnr   )rO   r<   r…   r   )r…   r<   )r…   r   )N)r1   r0   r…   r<   )NN)
rm   r   r1   r0   rn   ú"Optional[CallbackManagerForLLMRun]rr   r   r…   r   )
rm   r   r1   r0   rn   r†   rr   r   r…   zIterator[GenerationChunk])rp   r   r…   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/   r1   r2   r4   r6   r7   r9   r:   Údictr=   r>   r?   r@   rA   r   rU   r   ÚclassmethodrZ   Úpropertyr`   rc   rg   rj   rv   rq   r„   rf   r[   rT   r   r      s  … ñð €FˆCÓØƒOØ+à#€Iˆ}Ó#Ø0à#€Iˆ}Ó#ØAá�s 'Ô*€Eˆ3Ó*Øá˜ 9Ô-€GˆSÓ-ð?ñ �b Ô'€Dˆ#Ó'Ø-á˜ XÔ.€FˆDÓ.Ø1á˜U¨,Ô7€J�Ó7Ø@á˜U¨,Ô7€J�Ó7Ø/á˜E¨Ô5€IˆtÓ5Ø,á$ T°Ô=€Iˆ}Ó=ðCñ # 1¨IÔ6€Gˆ]Ó6ð/ñ #(¨°NÔ"C€L�-ÓCØFá! $›K€FˆMÓ'ØSà #€J�Ó#Ø3à#&€K�Ó&Ø.à!€Eˆ?Ó!Ø.á# D›k€HˆmÓ)ØNà €Dˆ.Ó Ø%à "€DÐ
Ó"Ø@à&)€N�OÓ)Ø2à€Eˆ=ÓØ.à(*Ð˜Ó*ØMà#€HˆnÓ#Ø1à €O�UÓ Ø)à#€N�EÓ#Ø+á#(¸Ô#>€L�.Ó>Ø?à€IˆtÓØ8à/3€LÐ,Ó3ðð *.€GÐ&Ó-ðð €GˆTÓØ)àò:ó ð:ñx ˜(Ô#Øòó ó $ðð òó ðð" òKó ðKð òó ðôð8 %)Ø:>ð	(0àð(0ð "ð(0ð 8ð	(0ð
 ð(0ð 
ó(0ðZ %)Ø:>ð	1àð1ð "ð1ð 8ð	1ð
 ð1ð 
#ó1ôf#r[   r   )Ú
__future__r   ÚloggingÚpathlibr   Útypingr   r   r   r   r	   r
   Úlangchain_core.callbacksr   Ú#langchain_core.language_models.llmsr   Úlangchain_core.outputsr   Úlangchain_core.utilsr   r   Úlangchain_core.utils.utilsr   Úpydanticr   r   Ú	getLoggerr‡   Úloggerr   rf   r[   rT   Ú<module>r›      sF   ðÝ "ã Ý ß =× =å =Ý 3Ý 2ß CÝ :ß +à	ˆ×	Ñ	˜8Ó	$€ôP#ˆsõ P#r[   