§
    šŠtj`  ã                   ó~   — 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 d dlmZ  G d„ de
¦  «        Zd	S )
é    )ÚAnyÚCallableÚDictÚIteratorÚListÚOptional)ÚCallbackManagerForLLMRun)ÚLLM)ÚGenerationChunk)Úpre_init)ÚFieldc                   óR  — e Zd ZU dZdZeed<   eed<   dZeed<   dZ	eed<   dZ
eed<   dZeed<   dZeed	<   eZeed
<    eg ¦  «        Zee         ed<   	  ed¦  «        Zeed<   	  ed¦  «        Zeed<   	  ed¦  «        Zeed<   	  ed¦  «        Zeee                  ed<   	 edeeef         deeef         fd„¦   «         Zedefd„¦   «         Zdedefd„Z	 	 ddedeee                  dee          dedef
d„Z!	 	 ddedeee                  dee          dede"e#         f
d„Z$dS )Ú	ExLlamaV2a+  ExllamaV2 API.

    - working only with GPTQ models for now.
    - Lora models are not supported yet.

    To use, you should have the exllamav2 library installed, and provide the
    path to the Llama model as a named parameter to the constructor.
    Check out:

    Example:
        .. code-block:: python

            from langchain_community.llms import Exllamav2

            llm = Exllamav2(model_path="/path/to/llama/model")

    #TODO:
    - Add loras support
    - Add support for custom settings
    - Add support for custom stop sequences
    NÚclientÚ
model_pathÚexllama_cacheÚconfigÚ	generatorÚ	tokenizerÚsettingsÚlogfuncÚstop_sequencesé–   Úmax_new_tokensTÚ	streamingÚverboseÚdisallowed_tokensÚvaluesÚreturnc                 ó´  — 	 dd l }n"# t          $ r}t          d¦  «        |‚d }~ww xY w|j                             ¦   «         st	          d¦  «        ‚	 ddlm}m}m}m	} ddl
m}m}	 n# t          $ r t          d¦  «        ‚w xY w|d         }
|
sd„ |d	<   |d	         }|d
         r|d
         } ||j        ¦  «         nt          d¦  «        ‚ |¦   «         }|d         |_        |                     ¦   «           ||¦  «        } ||d¬¦  «        }|                     |¦  «          ||¦  «        }|d         r |	|||¦  «        }n ||||¦  «        }d„ |d         D ¦   «         |d<   t%          |d|d         ¦  «          |d|d         › �¦  «         |                     d¦  «        }|r|                     ||¦  «         ||d<   ||d<   ||d<   ||d<   ||d<   |S )Nr   z@Unable to import torch, please install with `pip install torch`.z/CUDA is not available. ExllamaV2 requires CUDA.)r   ÚExLlamaV2CacheÚExLlamaV2ConfigÚExLlamaV2Tokenizer)ÚExLlamaV2BaseGeneratorÚExLlamaV2StreamingGeneratorzúCould not import exllamav2 library. Please install the exllamav2 library with (cuda 12.1 is required)example : !python -m pip install https://github.com/turboderp/exllamav2/releases/download/v0.0.12/exllamav2-0.0.12+cu121-cp311-cp311-linux_x86_64.whlr   c                  ó   — d S )N© )ÚargsÚkwargss     ú`/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/llms/exllamav2.pyú<lambda>z0ExLlamaV2.validate_environment.<locals>.<lambda>_   s   € ¸€ ó    r   r   z<settings is required. Custom settings are not supported yet.r   T)Úlazyr   c                 óZ   — g | ](}|                      ¦   «                              ¦   «         ‘Œ)S r'   )ÚstripÚlower)Ú.0Úxs     r*   ú
<listcomp>z2ExLlamaV2.validate_environment.<locals>.<listcomp>z   s*   € Ð#XÐ#XÐ#X¸! A§G¢G¡I¤I§O¢OÑ$5Ô$5Ð#XÐ#XÐ#Xr,   r   zstop_sequences r   r   r   r   r   r   )ÚtorchÚImportErrorÚcudaÚis_availableÚEnvironmentErrorÚ	exllamav2r   r!   r"   r#   Úexllamav2.generatorr$   r%   Ú__dict__ÚNotImplementedErrorÚ	model_dirÚprepareÚload_autosplitÚsetattrÚgetÚdisallow_tokens)Úclsr   r4   Úer   r!   r"   r#   r$   r%   r   r   r   r   Úmodelr   r   r   Ú
disalloweds                      r*   Úvalidate_environmentzExLlamaV2.validate_environment>   sí  € ð	ØˆLˆLˆLˆLøÝð 	ð 	ð 	ÝØRñô àðøøøøð	øøøð
 Œz×&Ò&Ñ(Ô(ð 	VÝ"Ð#TÑUÔUÐUð	ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	Ýð^ñô ð ð	øøøð ˜Ô#ˆØð 	=Ø <Ð <ˆF�9ÑØ˜Ô#ˆà�*Ôð 	Ø˜jÔ)ˆHØˆG�HÔ%Ñ&Ô&Ð&Ð&å%ØNñô ð ð !�Ñ"Ô"ˆØ! ,Ô/ˆÔØ�ŠÑÔÐà�	˜&Ñ!Ô!ˆà&˜ u°4Ð8Ñ8Ô8ˆØ×Ò˜]Ñ+Ô+Ð+à&Ð& vÑ.Ô.ˆ	Ø�+Ôð 	PØ3Ð3°E¸=È)ÑTÔTˆIˆIà.Ð.¨u°mÀYÑOÔOˆIð $YÐ#X¸vÐFVÔ?WÐ#XÑ#XÔ#XˆÐÑ Ý�Ð*¨FÐ3CÔ,DÑEÔEÐEØˆÐ< &Ð)9Ô":Ð<Ð<Ñ=Ô=Ð=à—Z’ZÐ 3Ñ4Ô4ˆ
Øð 	<Ø×$Ò$ Y°
Ñ;Ô;Ð;à ˆˆxÑØ'ˆˆ{ÑØ!ˆˆxÑØ'ˆˆ{ÑØ"/ˆˆÑàˆs   ‚ ‡
&‘!¡&ÁA' Á'Bc                 ó   — dS )zReturn type of llm.r   r'   )Úselfs    r*   Ú	_llm_typezExLlamaV2._llm_typeŠ   s	   € ð ˆ{r,   Útextc                 ó@   — | j         j                             |¦  «        S )z-Get the number of tokens present in the text.)r   r   Ú
num_tokens)rI   rK   s     r*   Úget_num_tokenszExLlamaV2.get_num_tokens�   s   € àŒ~Ô'×2Ò2°4Ñ8Ô8Ð8r,   ÚpromptÚstopÚrun_managerr)   c                 óø   — | j         }| j        r2d}|                      ||||¬¦  «        D ]}|t          |¦  «        z  }Œ|S |                     || j        | j        ¬¦  «        }|t          |¦  «        d …         }|S )NÚ )rO   rP   rQ   r)   )rO   Úgen_settingsrM   )r   r   Ú_streamÚstrÚgenerate_simpler   r   Úlen)	rI   rO   rP   rQ   r)   r   Úcombined_text_outputÚchunkÚoutputs	            r*   Ú_callzExLlamaV2._call“   s¥   € ð ”Nˆ	àŒ>ð 	Ø#%Ð ØŸšØ D°kÈ&ð &ñ ô ð 3ð 3�ð %­¨E©
¬
Ñ2Ð$Ð$Ø'Ð'à×.Ò.ØØ!œ]ØÔ.ð /ñ ô ˆFð �C ™KœK˜M˜MÔ*ˆFØˆMr,   c              +   ó�  K  — | j                              |¦  «        }| j                             ¦   «          | j                             g ¦  «         | j                             || j        ¦  «         d}	 | j                             ¦   «         \  }}}	|dz  }|r|                     || j	        ¬¦  «         |V — |s|| j
        k    rnŒSd S )Nr   Té   )Útokenr   )r   Úencoder   ÚwarmupÚset_stop_conditionsÚbegin_streamr   ÚstreamÚon_llm_new_tokenr   r   )
rI   rO   rP   rQ   r)   Ú	input_idsÚgenerated_tokensrZ   ÚeosÚ_s
             r*   rU   zExLlamaV2._stream­   sí   è è € ð ”N×)Ò)¨&Ñ1Ô1ˆ	ØŒ×ÒÑÔÐØŒ×*Ò*¨2Ñ.Ô.Ð.ØŒ×#Ò# I¨t¬}Ñ=Ô=Ð=àÐð	Ø œN×1Ò1Ñ3Ô3‰MˆE�3˜Ø Ñ!Ðàð Ø×,Ò,ØØ œLð -ñ ô ð ð ˆKˆKˆKØð Ð&¨$Ô*=Ò=Ð=Øð	ð 	ˆr,   )NN)%Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__rV   r   r   r   r   r   Úprintr   r   r   r   r   r   Úintr   Úboolr   r   r   r   r   rG   ÚpropertyrJ   rN   r	   r\   r   r   rU   r'   r,   r*   r   r   
   s‡  € € € € € € ðð ð, €FˆCÐÐÑØ€O€O�OØ€M�3ÐÐÑØ€FˆCÐÐÑØ€IˆsÐÐÑØ€IˆsÐÐÑð €HˆcÐÐÑð €GˆXÐÐÑà %  b¡	¤	€N�D˜”IÐ)Ð)Ñ)Ø=à˜% ™*œ*€N�CÐ$Ð$Ñ$Ø/à�e˜D‘k”k€IˆtÐ!Ð!Ñ!Ø8à�E˜$‘K”K€GˆTÐÐÑØ-ð .3¨U°4©[¬[Ð�x  S¤	Ô*Ð8Ð8Ñ8Ø7àðI¨$¨s°C¨x¬.ð I¸TÀ#ÀsÀ(¼^ð Ið Ið Iñ „XðIðV ð˜3ð ð ð ñ „Xðð9 3ð 9¨3ð 9ð 9ð 9ð 9ð %)Ø:>ð	ð àðð �t˜C”yÔ!ðð Ð6Ô7ð	ð
 ðð 
ðð ð ð ð: %)Ø:>ð	ð àðð �t˜C”yÔ!ðð Ð6Ô7ð	ð
 ðð 
�/Ô	"ðð ð ð ð ð r,   r   N)Útypingr   r   r   r   r   r   Úlangchain_core.callbacksr	   Úlangchain_core.language_modelsr
   Úlangchain_core.outputsr   Úlangchain_core.utilsr   Úpydanticr   r   r'   r,   r*   ú<module>ry      sÍ   ðØ @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @à =Ð =Ð =Ð =Ð =Ð =Ø .Ð .Ð .Ð .Ð .Ð .Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð ð~ð ~ð ~ð ~ð ~�ñ ~ô ~ð ~ð ~ð ~r,   