§
    šŠtjQ0  ã                  óÒ   — 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j        e¦  «        Z G 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                  óì  — 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&dSdB„¦   «         Z' e(dC¬D¦  «        e)dTdE„¦   «         ¦   «         Z*e+dUdF„¦   «         Z,e+dUdG„¦   «         Z-e+dVdH„¦   «         Z.dWdXdI„Z/	 	 dYdZdN„Z0	 	 dYd[dP„Z1d\dR„Z2dS )]Ú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                ó€  ‡— 	 ddl m}m} n# t          $ r t          d¦  «        ‚w xY w‰d         }g d¢}ˆfd„|D ¦   «         }‰d         �‰d         |d<   |                     ‰d	         ¦  «         	  ||fi |¤Ž‰d
<   n'# t
          $ r}t          d|› d|› �¦  «        ‚d}~ww xY w‰d         r.‰d         r&‰d         }‰d         }	t          d|›d|	›d�¦  «        ‚t          ‰d         t          ¦  «        r| 	                    ‰d         ¦  «        ‰d<   n(‰d         r| 
                    ‰d         ¦  «        ‰d<   n	 ‰S )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   c                ó"   •— i | ]}|‰|         “ŒS © rH   )Ú.0ÚkrB   s     €ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/llms/llamacpp.pyú
<dictcomp>z1LlamaCpp.validate_environment.<locals>.<dictcomp>§   s   ø€ Ð@Ð@Ð@¨˜˜6 !œ9Ð@Ð@Ð@ó    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_cpprE   rF   ÚImportErrorÚupdateÚ	ExceptionÚ
ValueErrorÚ
isinstancer   Úfrom_stringÚ	from_file)
ÚclsrB   rE   rF   r   Úmodel_param_namesÚmodel_paramsÚer@   r?   s
    `        rK   Úvalidate_environmentzLlamaCpp.validate_environmentˆ   s
  ø€ ð	Ø5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5øÝð 	ð 	ð 	ÝðIñô ð ð	øøøð ˜LÔ)ˆ
ð
ð 
ð 
Ðð$ AÐ@Ð@Ð@Ð.?Ð@Ñ@Ô@ˆà�.Ô!Ð-Ø+1°.Ô+AˆL˜Ñ(à×Ò˜F >Ô2Ñ3Ô3Ð3ð	Ø$˜u ZÐ@Ð@°<Ð@Ð@ˆF�8ÑÐøÝð 	ð 	ð 	Ýð&¸ð &ð &Ø"#ð&ð &ñô ð øøøøð	øøøð �)Ôð 	 ¨Ô!7ð 	Ø˜YÔ'ˆGØ! .Ô1ˆLÝð3Øð3ð 3Ø".ð3ð 3ð 3ñô ð õ ˜˜yÔ)­3Ñ/Ô/ð 	Ø ,× 8Ò 8¸À	Ô9JÑ KÔ KˆF�9ÑÐØ�NÔ#ð 	Ø ,× 6Ò 6°v¸nÔ7MÑ NÔ NˆF�9ÑÐàØˆs    ƒ Œ&Á2A? Á?
B#Â	BÂB#Úbefore)Úmodec                óD   — t          | ¦  «        }t          ||¦  «        }|S )z>Build extra kwargs from additional params that were passed in.)r   r   )rW   rB   Úall_required_field_namess      rK   Úbuild_model_kwargszLlamaCpp.build_model_kwargsÅ   s'   € õ $<¸CÑ#@Ô#@Ð Ý$ VÐ-EÑFÔFˆØˆrM   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     rK   Ú_default_paramszLlamaCpp._default_paramsÍ   s\   € ð ”kØœ/ØÔ+Ø”ZØœØ”IØ"œiØ"Ô1Ø”Zð

ð 

ˆð Œ<ð 	-Ø $¤ˆF�9ÑØˆrM   c                ó&   — i d| j         i¥| j        ¥S )zGet the identifying parameters.r   )r   re   ©rc   s    rK   Ú_identifying_paramszLlamaCpp._identifying_paramsß   s   € ð K�< ¤Ð1ÐJ°TÔ5IÐJÐJrM   c                ó   — dS )zReturn type of llm.ÚllamacpprH   rg   s    rK   Ú	_llm_typezLlamaCpp._llm_typeä   s	   € ð ˆzrM   c                óŠ   — | j         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.rb   r1   )r1   rS   re   Úpop)rc   r1   rd   s      rK   Ú_get_parameterszLlamaCpp._get_parametersé   s\   € ð Œ9ð 	S˜Ð)ÝÐQÑRÔRÐRàÔ%ˆð 	�
Š
Ð#Ñ$Ô$Ð$ð œÐ0 dÐ0¨bˆˆv‰àˆrM   ÚpromptÚrun_managerú"Optional[CallbackManagerForLLMRun]Úkwargsc                óÐ   — | j         r"d} | j        d|||dœ|¤ŽD ]}||j        z  }Œ|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.")
        Ú )ro   r1   rp   ro   Úchoicesr   ÚtextNrH   )r>   Ú_streamrv   rn   r   )	rc   ro   r1   rp   rr   Úcombined_text_outputÚchunkrd   Úresults	            rK   Ú_callzLlamaCpp._call  s»   € ð. Œ>ð 	0ð $&Ð Ø%˜œð ØØØ'ðð ð ð	ð ð 3ð 3�ð %¨¬
Ñ2Ð$Ð$Ø'Ð'à×)Ò)¨$Ñ/Ô/ˆFØ)˜Ð) &Ð)ˆFØ �T”[Ð9Ð9¨Ð9°&Ð9Ð9ˆFØ˜)Ô$ QÔ'¨Ô/Ð/rM   úIterator[GenerationChunk]c              +  óD  K  — i |                       |¦  «        ¥|¥} | j        d
|ddœ|¤Ž}|D ]q}|d         d                              dd¦  «        }t          |d         d         d         d|i¬¦  «        }	|r"|                     |	j        | j        |¬	¦  «         |	V — Œrd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)ro   Ústreamru   r   r.   Nrv   )rv   Úgeneration_info)ÚtokenrA   Ú	log_probsrH   )rn   r   Úgetr   Úon_llm_new_tokenrv   rA   )
rc   ro   r1   rp   rr   rd   rz   Úpartr.   ry   s
             rK   rw   zLlamaCpp._stream,  sç   è è € ðJ :�D×(Ò(¨Ñ.Ô.Ð9°&Ð9ˆØ�”ÐB F°4ÐBÐB¸6ÐBÐBˆØð 
	ð 
	ˆDØ˜I” qÔ)×-Ò-¨j¸$Ñ?Ô?ˆHÝ#Ø˜)”_ QÔ'¨Ô/Ø!+¨XÐ 6ðñ ô ˆEð ð Ø×,Ò,Øœ*¨d¬lÀhð -ñ ô ð ð ˆKˆKˆKˆKð
	ð 
	rM   rv   c                óz   — | j                              |                     d¦  «        ¦  «        }t          |¦  «        S )Nzutf-8)r   ÚtokenizeÚencodeÚlen)rc   rv   Útokenized_texts      rK   Úget_num_tokenszLlamaCpp.get_num_tokens_  s1   € Øœ×-Ò-¨d¯kªk¸'Ñ.BÔ.BÑCÔCˆÝ�>Ñ"Ô"Ð"rM   )rB   r   rC   r   )rB   r<   rC   r   )rC   r<   )rC   r   )N)r1   r0   rC   r<   )NN)
ro   r   r1   r0   rp   rq   rr   r   rC   r   )
ro   r   r1   r0   rp   rq   rr   r   rC   r|   )rv   r   rC   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   r[   r   Úclassmethodr`   Úpropertyre   rh   rk   rn   r{   rw   rŠ   rH   rM   rK   r   r      sŒ  € € € € € € ðð ð €FÐÐÐÑØ€O€O�OØ+à#€IÐ#Ð#Ð#Ñ#Ø0à#€IÐ#Ð#Ð#Ñ#ØAà��s 'Ð*Ñ*Ô*€EÐ*Ð*Ð*Ñ*Øà�5˜ 9Ð-Ñ-Ô-€GÐ-Ð-Ð-Ñ-ð?ð ��b Ð'Ñ'Ô'€DÐ'Ð'Ð'Ñ'Ø-à�5˜ XÐ.Ñ.Ô.€FÐ.Ð.Ð.Ñ.Ø1à�u˜U¨,Ð7Ñ7Ô7€JÐ7Ð7Ð7Ñ7Ø@à�u˜U¨,Ð7Ñ7Ô7€JÐ7Ð7Ð7Ñ7Ø/à�e˜E¨Ð5Ñ5Ô5€IÐ5Ð5Ð5Ñ5Ø,à$˜u T°Ð=Ñ=Ô=€IÐ=Ð=Ð=Ñ=ðCð #˜U 1¨IÐ6Ñ6Ô6€GÐ6Ð6Ð6Ñ6ð/ð #( %¨°NÐ"CÑ"CÔ"C€LÐCÐCÐCÑCØFà!˜E $™KœK€FÐ'Ð'Ð'Ñ'ØSà #€JÐ#Ð#Ð#Ñ#Ø3à#&€KÐ&Ð&Ð&Ñ&Ø.à!€EÐ!Ð!Ð!Ñ!Ø.à#˜e D™kœk€HÐ)Ð)Ð)Ñ)ØNà €DÐ Ð Ð Ñ Ø%à "€DÐ"Ð"Ð"Ñ"Ø@à&)€NÐ)Ð)Ð)Ñ)Ø2à€EÐÐÐÑØ.à(*ÐÐ*Ð*Ð*Ñ*ØMà#€HÐ#Ð#Ð#Ñ#Ø1à €OÐ Ð Ð Ñ Ø)à#€NÐ#Ð#Ð#Ñ#Ø+à#( 5¸Ð#>Ñ#>Ô#>€LÐ>Ð>Ð>Ñ>Ø?à€IÐÐÐÑØ8à/3€LÐ3Ð3Ð3Ñ3ðð *.€GÐ-Ð-Ð-Ñ-ðð €GÐÐÐÑØ)àð:ð :ð :ñ „Xð:ðx €_˜(Ð#Ñ#Ô#Øðð ð ñ „[ñ $Ô#ðð ðð ð ñ „Xðð" ðKð Kð Kñ „XðKð ðð ð ñ „Xððð ð ð ð ð8 %)Ø:>ð	(0ð (0ð (0ð (0ð (0ðZ %)Ø:>ð	1ð 1ð 1ð 1ð 1ðf#ð #ð #ð #ð #ð #rM   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   rH   rM   rK   ú<module>rŸ      s*  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =à =Ð =Ð =Ð =Ð =Ð =Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ :Ð :Ð :Ð :Ð :Ð :Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +à	ˆÔ	˜8Ñ	$Ô	$€ðP#ð P#ð P#ð P#ð P#ˆsñ P#ô P#ð P#ð P#ð P#rM   