§
    šŠtjš"  ã                   ó~   — d dl Z d dl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ZdZd	Z G d
„ de	¦  «        ZdS )é    N)ÚAnyÚListÚMappingÚOptional)ÚCallbackManagerForLLMRun)ÚLLM)Ú
ConfigDict)Úenforce_stop_tokenszgoogle/flan-t5-largeútext2text-generation)r   útext-generationÚsummarizationc                   ó¸  — e Zd ZU dZdZeed<   eZe	ed<   	 dZ
ee         ed<   	 dZee         ed<   	  ed¬¦  «        Ze	 	 	 	 	 	 	 dde	de	dee         dee	         dee         dee         dee         dee         dee         dedefd„¦   «         Zedee	ef         fd„¦   «         Zede	fd„¦   «         Z	 	 dde	deee	                  dee         dede	f
d„ZdS )ÚWeightOnlyQuantPipelinea  Weight only quantized model.

    To use, you should have the `intel-extension-for-transformers` packabge and
        `transformers` package installed.
    intel-extension-for-transformers:
        https://github.com/intel/intel-extension-for-transformers

    Example using from_model_id:
        .. code-block:: python

            from langchain_community.llms import WeightOnlyQuantPipeline
            from intel_extension_for_transformers.transformers import (
                WeightOnlyQuantConfig
            )
            config = WeightOnlyQuantConfig
            hf = WeightOnlyQuantPipeline.from_model_id(
                model_id="google/flan-t5-large",
                task="text2text-generation"
                pipeline_kwargs={"max_new_tokens": 10},
                quantization_config=config,
            )
    Example passing pipeline in directly:
        .. code-block:: python

            from langchain_community.llms import WeightOnlyQuantPipeline
            from intel_extension_for_transformers.transformers import (
                AutoModelForSeq2SeqLM
            )
            from intel_extension_for_transformers.transformers import (
                WeightOnlyQuantConfig
            )
            from transformers import AutoTokenizer, pipeline

            model_id = "google/flan-t5-large"
            tokenizer = AutoTokenizer.from_pretrained(model_id)
            config = WeightOnlyQuantConfig
            model = AutoModelForSeq2SeqLM.from_pretrained(
                model_id,
                quantization_config=config,
            )
            pipe = pipeline(
                "text-generation",
                model=model,
                tokenizer=tokenizer,
                max_new_tokens=10,
            )
            hf = WeightOnlyQuantPipeline(pipeline=pipe)
    NÚpipelineÚmodel_idÚmodel_kwargsÚpipeline_kwargsÚallow)ÚextraéÿÿÿÿFÚtaskÚdeviceÚ
device_mapÚload_in_4bitÚload_in_8bitÚquantization_configÚkwargsÚreturnc
           	      óì  — |�*t          |t          ¦  «        r|dk    rt          d¦  «        ‚t          j                             d¦  «        €t          d¦  «        ‚	 ddlm}m} ddl	m
} dd	lm} dd
lm} n# t          $ r t          d¦  «        ‚w xY wt          |t          ¦  «        r2|dk    r, |¦   «         st          d¦  «        ‚dt          |¦  «        z   }nt          |t          ¦  «        r|dk     rd}|€|€d}|pi } |j        |fi |¤Ž}	 |dk    r |j        |f|||	d|dœ|¤Ž}n4|dv r |j        |f|||	d|dœ|¤Ž}nt          d|› dt"          › d�¦  «        ‚n&# t          $ r}t          d|› d�¦  «        |‚d}~ww xY wd|v rd„ |                     ¦   «         D ¦   «         }|pi } |d|||||dœ|¤Ž}|j        t"          vr t          d|j        › dt"          › d�¦  «        ‚ | d||||dœ|
¤ŽS )z5Construct the pipeline object from model_id and task.Nr   z7`Device` and `device_map` cannot be set simultaneously!Útorchz;Weight only quantization pipeline only support PyTorch now!r   )ÚAutoModelForCausalLMÚAutoModelForSeq2SeqLM)Úis_ipex_available)ÚAutoTokenizer)r   z“Could not import transformers python package. Please install it with `pip install transformers` and `pip install intel-extension-for-transformers`.z)Don't find out Intel GPU on this machine!zxpu:Úcpur   F)r   r   r   Úuse_llm_runtimer   )r   r   úGot invalid task ú, currently only ú are supportedzCould not load the z# model due to missing dependencies.Útrust_remote_codec                 ó&   — i | ]\  }}|d k    ¯||“ŒS )r*   © )Ú.0ÚkÚvs      úo/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/llms/weight_only_quantization.pyú
<dictcomp>z9WeightOnlyQuantPipeline.from_model_id.<locals>.<dictcomp>¡   s0   € ð ð ð Ù˜˜A¸!Ð?RÒ:RÐ:R��1Ð:RÐ:RÐ:Ró    )r   ÚmodelÚ	tokenizerr   r   )r   r   r   r   r,   )Ú
isinstanceÚintÚ
ValueErrorÚ	importlibÚutilÚ	find_specÚ-intel_extension_for_transformers.transformersr!   r"   Ú,intel_extension_for_transformers.utils.utilsr#   Útransformersr$   r   ÚImportErrorÚstrÚfrom_pretrainedÚVALID_TASKSÚitemsr   )Úclsr   r   r   r   r   r   r   r   r   r   r!   r"   r#   r$   Úhf_pipelineÚ_model_kwargsr4   r3   ÚeÚ_pipeline_kwargsr   s                         r0   Úfrom_model_idz%WeightOnlyQuantPipeline.from_model_idO   s¨  € ð Ð!¥z°&½#Ñ'>Ô'>Ð!À6ÈBÂ;À;ÝÐVÑWÔWÐWÝŒ>×#Ò# GÑ,Ô,Ð4ÝØMñô ð ð	ðð ð ð ð ð ð ð ð WÐVÐVÐVÐVÐVØ2Ð2Ð2Ð2Ð2Ð2Ø<Ð<Ð<Ð<Ð<Ð<Ð<øÝð 	ð 	ð 	ÝðFñô ð ð	øøøõ �f�cÑ"Ô"ð 	 v°¢{ {Ø$Ð$Ñ&Ô&ð NÝ Ð!LÑMÔMÐMØ¥# f¡+¤+Ñ-ˆJˆJÝ˜¥Ñ$Ô$ð 	¨°!ª¨ØˆFàˆ>ØÐ!Ø"�
à$Ð*¨ˆØ1�MÔ1°(ÐLÐL¸mÐLÐLˆ	ð	ØÐ(Ò(Ð(Ø<Ð,Ô<Øðà!-Ø!-Ø(;Ø$)Ø)ðð ð $ðð ��ð ÐBÐBÐBØ=Ð-Ô=Øðà!-Ø!-Ø(;Ø$)Ø)ðð ð $ðð ��õ !ðB¨ð Bð BÝ&1ðBð Bð Bñô ð øøõ ð 	ð 	ð 	ÝØO dÐOÐOÐOñô àðøøøøð	øøøð
  -Ð/Ð/ðð Ø!.×!4Ò!4Ñ!6Ô!6ðñ ô ˆMð +Ð0¨bÐØ�;ð 
ØØØØØ&ð
ð 
ð ð
ð 
ˆð Œ=¥Ð+Ð+Ýð> H¤Mð >ð >Ý"-ð>ð >ð >ñô ð ð ˆsð 
ØØØ&Ø,ð	
ð 
ð
 ð
ð 
ð 	
s%   ÁA7 Á7BÄAE! Å!
FÅ+E?Å?Fc                 ó,   — | j         | j        | j        dœS )zGet the identifying parameters.©r   r   r   rJ   ©Úselfs    r0   Ú_identifying_paramsz+WeightOnlyQuantPipeline._identifying_paramsº   s$   € ð œØ Ô-Ø#Ô3ð
ð 
ð 	
r2   c                 ó   — dS )zReturn type of llm.Úweight_only_quantizationr,   rK   s    r0   Ú	_llm_typez!WeightOnlyQuantPipeline._llm_typeÃ   s
   € ð *Ð)r2   ÚpromptÚstopÚrun_managerc                 ó‚  — |                       |¦  «        }| j         j        dk    r$|d         d         t          |¦  «        d…         }nc| j         j        dk    r|d         d         }nD| j         j        dk    r|d         d         }n%t          d| j         j        › d	t          › d
�¦  «        ‚|rt          ||¦  «        }|S )ab  Call the HuggingFace 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 WeightOnlyQuantPipeline
                llm = WeightOnlyQuantPipeline.from_model_id(
                    model_id="google/flan-t5-large",
                    task="text2text-generation",
                )
                llm.invoke("This is a prompt.")
        r   r   Úgenerated_textNr   r   Úsummary_textr'   r(   r)   )r   r   Úlenr7   rA   r
   )rL   rQ   rR   rS   r   ÚresponseÚtexts          r0   Ú_callzWeightOnlyQuantPipeline._callÈ   sâ   € ð4 —=’= Ñ(Ô(ˆØŒ=ÔÐ!2Ò2Ð2à˜A”;Ð/Ô0µ°V±´°°Ô?ˆDˆDØŒ]ÔÐ#9Ò9Ð9Ø˜A”;Ð/Ô0ˆDˆDØŒ]Ô ?Ò2Ð2Ø˜A”;˜~Ô.ˆDˆDåð> D¤MÔ$6ð >ð >Ý"-ð>ð >ð >ñô ð ð ð 	3õ ' t¨TÑ2Ô2ˆDØˆr2   )r   NNNFFN)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__ÚDEFAULT_MODEL_IDr   r?   r   r   Údictr   r	   Úmodel_configÚclassmethodr6   Úboolr   rH   Úpropertyr   rM   rP   r   r   rZ   r,   r2   r0   r   r      s  € € € € € € ð/ð /ðb €HˆcÐÐÑØ$€HˆcÐ$Ð$Ñ$Ø*à#'€L�(˜4”.Ð'Ð'Ñ'Ø1à&*€O�X˜d”^Ð*Ð*Ñ*Ø4à�:Øðñ ô €Lð ð
 !#Ø$(Ø'+Ø*.Ø',Ø',Ø-1ðh
ð h
àðh
ð ðh
ð ˜”ð	h
ð
 ˜S”Mðh
ð ˜t”nðh
ð " $œðh
ð ˜t”nðh
ð ˜t”nðh
ð & cœ]ðh
ð ðh
ð 
ðh
ð h
ð h
ñ „[ðh
ðT ð
 W¨S°#¨XÔ%6ð 
ð 
ð 
ñ „Xð
ð ð*˜3ð *ð *ð *ñ „Xð*ð %)Ø:>ð	+ð +àð+ð �t˜C”yÔ!ð+ð Ð6Ô7ð	+ð
 ð+ð 
ð+ð +ð +ð +ð +ð +r2   r   )r8   Útypingr   r   r   r   Ú langchain_core.callbacks.managerr   Ú#langchain_core.language_models.llmsr   Úpydanticr	   Úlangchain_community.llms.utilsr
   r`   ÚDEFAULT_TASKrA   r   r,   r2   r0   ú<module>rl      sË   ðØ Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à EÐ EÐ EÐ EÐ EÐ EØ 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð à >Ð >Ð >Ð >Ð >Ð >à)Ð Ø%€ØJ€ðdð dð dð dð d˜cñ dô dð dð dð dr2   