
    Ng3                        d dl mZ d dlZd dlZd dl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mZ d dlmZ d	Zd
ZdZdZ ej        e          Z eddd           G d de                      ZdS )    )annotationsN)AnyIteratorListMappingOptional)
deprecated)CallbackManagerForLLMRun)BaseLLM)
GenerationGenerationChunk	LLMResult)
ConfigDictgpt2text-generation)text2text-generationr   summarizationtranslation   z0.0.37z1.0z)langchain_huggingface.HuggingFacePipeline)sinceremovalalternative_importc                      e Zd ZU dZdZded<   eZded<   	 dZded<   	 dZ	ded	<   	 e
Zd
ed<   	  ed          Zeddddde
fd'd            Zed(d            Zed)d            Z	 	 d*d+d#Z	 	 d*d,d&ZdS )-HuggingFacePipelinea\  HuggingFace Pipeline API.

    To use, you should have the ``transformers`` python package installed.

    Only supports `text-generation`, `text2text-generation`, `summarization` and
    `translation`  for now.

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

            from langchain_community.llms import HuggingFacePipeline
            hf = HuggingFacePipeline.from_model_id(
                model_id="gpt2",
                task="text-generation",
                pipeline_kwargs={"max_new_tokens": 10},
            )
    Example passing pipeline in directly:
        .. code-block:: python

            from langchain_community.llms import HuggingFacePipeline
            from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline

            model_id = "gpt2"
            tokenizer = AutoTokenizer.from_pretrained(model_id)
            model = AutoModelForCausalLM.from_pretrained(model_id)
            pipe = pipeline(
                "text-generation", model=model, tokenizer=tokenizer, max_new_tokens=10
            )
            hf = HuggingFacePipeline(pipeline=pipe)
    Nr   pipelinestrmodel_idOptional[dict]model_kwargspipeline_kwargsint
batch_sizeforbid)extradefaulttaskbackenddeviceOptional[int]
device_mapOptional[str]kwargsreturnc	                   	 ddl m}
m}m} ddl m} n# t
          $ r t          d          w xY w|pi } |j        |fi |}	 |dk    rj|dk    rU	 ddlm} n# t
          $ r t          d          w xY w	  |j        |fi |}n# t          $ r  |j        |fd	d
i|}Y nw xY w |
j        |fi |}n|dv rj|dk    rU	 ddlm
} n# t
          $ r t          d          w xY w	  |j        |fi |}nJ# t          $ r  |j        |fd	d
i|}Y n.w xY w |j        |fi |}nt          d| dt           d          n&# t
          $ r}t          d| d          |d}~ww xY w|j        |j        j        |_        t#          |dd          st#          |dd          r(|&|dk    r t$                              d| d           d}|t(          j                            d          x|dk    rrddl}|j                                        }|dk     s||k    rt          d| d| d          ||dk     rd}|'|dk     r!|dk    rt$                              d|           |"| |dk    rt$                              d           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.r   )AutoModelForCausalLMAutoModelForSeq2SeqLMAutoTokenizer)r   z`Could not import transformers python package. Please install it with `pip install transformers`.r   openvino)OVModelForCausalLMzlCould not import optimum-intel python package. Please install it with: pip install 'optimum[openvino,nncf]' exportT)r   r   r   )OVModelForSeq2SeqLMGot invalid task , currently only  are supportedzCould not load the z# model due to missing dependencies.Nis_loaded_in_4bitFis_loaded_in_8bitr%   z+Setting the `device` argument to None from z to avoid the error caused by attempting to move the model that was already loaded on the GPU using the Accelerate module to the same or another device.torchr&   zGot device==z', device is required to be within [-1, )zDevice has %d GPUs available. Provide device={deviceId} to `from_model_id` to use availableGPUs for execution. deviceId is -1 (default) for CPU and can be a positive integer associated with CUDA device id.z6Please set device for OpenVINO through: `model_kwargs`trust_remote_codec                &    i | ]\  }}|d k    ||S )r>    ).0kvs      i/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/llms/huggingface_pipeline.py
<dictcomp>z5HuggingFacePipeline.from_model_id.<locals>.<dictcomp>   s0       A!?R:R:R1:R:R:R    )r'   model	tokenizerr)   r+   r"   r   )r   r   r   r    r"   r@   )transformersr0   r1   r2   r   ImportErrorfrom_pretrainedoptimum.intel.openvinor4   	Exceptionr6   
ValueErrorVALID_TASKS	pad_tokenconfigeos_token_idpad_token_idgetattrloggerwarning	importlibutil	find_specr<   cudadevice_countitemsr'   )clsr   r'   r(   r)   r+   r   r    r"   r-   r0   r1   r2   hf_pipeline_model_kwargsrH   r4   rG   r6   er<   cuda_device_count_pipeline_kwargsr   s                           rD   from_model_idz!HuggingFacePipeline.from_model_idM   s   	         
 =<<<<<< 	 	 	E  	 %*1M1(LLmLL	=	(((j((MMMMMMM&   )D  
 B 2 B$! !(5! ! %    B 2 B$! !-1!5B! ! A0@  $1 EE QQQj((NNNNNNN&   )D  
 C 3 C$! !(5! ! %    C 3 C$! !-1!5B! ! B1A  $1 EE !B B B&1B B B    	 	 	OdOOO 	
 &%*\%>I" 2E::	 5"5u==	
 "9$$NN"f " " "   F ((11=9$$LLL %
 7 7 9 9{{v)::: Q6 Q Q<MQ Q Q   %&1**!fqjj5F5J5JP &   *"8W
=R=RNNSTTT-// !.!4!4!6!6  M +0b; 	
!!&	
 	
 	
 	
 =++>HM > >"-> > >   s 
&,!
 
 
 
 	
s    -D= A D= A11D= 5B D= B!D=  B!!D= >C D= CD= #C2 1D= 2DD= D-D= =
E EE Mapping[str, Any]c                ,    | j         | j        | j        dS )zGet the identifying parameters.r   r   r    rf   selfs    rD   _identifying_paramsz'HuggingFacePipeline._identifying_params   s$      -#3
 
 	
rF   c                    dS )Nhuggingface_pipeliner@   rg   s    rD   	_llm_typezHuggingFacePipeline._llm_type   s    %%rF   prompts	List[str]stopOptional[List[str]]run_manager"Optional[CallbackManagerForLLMRun]r   c           	        g }| j         r| j         ni }|                    d|          }|                    dd          }t          dt          |          | j                  D ]}	||	|	| j        z            }
 | j        |
fi |}t          |          D ]\  }}t          |t                    r|d         }| j        j	        dk    r	|d         }nn| j        j	        dk    r	|d         }nU| j        j	        dk    r	|d	         }n<| j        j	        d
v r	|d         }n%t          d| j        j	         dt           d          |r|t          |
|                   d          }|                    |           ސt          d |D                       S )Nr    skip_promptFr   r   generated_textr   r   summary_textr   translation_textr7   r8   r9   c                0    g | ]}t          |           gS )text)r   )rA   rz   s     rD   
<listcomp>z1HuggingFacePipeline._generate.<locals>.<listcomp>2  s&    NNNT*$///0NNNrF   )generations)r    getrangelenr"   r   	enumerate
isinstancelistr'   rN   rO   appendr   )rh   rm   ro   rq   r-   text_generationsdefault_pipeline_kwargsr    rt   ibatch_prompts	responsesjresponserz   s                  rD   	_generatezHuggingFacePipeline._generate  s    '):>:N"V$"6"6TV **%68OPPjj66q#g,,88 	. 	.A#ADO(;$;<M & ! I  )33 . .8h-- +'{H=%):::#$45DD]'+AAA#$45DD]'?::#N3DD]'=88#$67DD$FDM,> F F*5F F F    9M!$4 5 5 7 78D ''----+.. NN=MNNN
 
 
 	
rF   promptIterator[GenerationChunk]c              +  v  K   ddl m} dd l}ddlm}m}m}	 |                    di           }
|                    dd          }|| j        j	        
                    |          }|pg  G fdd|          } | |            g          }| j        	                    |d	
          } |	| j        j	        d|d          }t          |f||d|
} || j        j        j        |          }|                                 |D ]4}t          |          }|r|                    |j        |           |V  5d S )Nr   )Thread)StoppingCriteriaStoppingCriteriaListTextIteratorStreamerr    rt   Tc                      e Zd Zd fd	Zd
S )1HuggingFacePipeline._stream.<locals>.StopOnTokens	input_idstorch.LongTensorscorestorch.FloatTensorr-   r   r.   boolc                <    D ]}|d         d         |k    r dS dS )Nr   r&   TFr@   )rh   r   r   r-   stop_idstopping_ids_lists        rD   __call__z:HuggingFacePipeline._stream.<locals>.StopOnTokens.__call__M  s9      1 $ $G |B'722#tt 3urF   N)r   r   r   r   r-   r   r.   r   )__name__
__module____qualname__r   )r   s   rD   StopOnTokensr   L  s3        	 	 	 	 	 	 	 	rF   r   pt)return_tensorsg      N@)timeoutrt   skip_special_tokens)streamerstopping_criteria)targetr-   ry   )chunk)	threadingr   r<   rI   r   r   r   r}   r   rH   convert_tokens_to_idsdictrG   generatestartr   on_llm_new_tokenrz   )rh   r   ro   rq   r-   r   r<   r   r   r   r    rt   r   r   inputsr   generation_kwargst1charr   r   s                       @rD   _streamzHuggingFacePipeline._stream5  s      	%$$$$$	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 !**%6;;jj55=*@@FFD JB
	 
	 
	 
	 
	 
	 
	+ 
	 
	 
	 10,,..1ABB(((EE''M## $	
 
 
 !
/
 
 	
 
 V4=.7@QRRR



 	 	D#...E F,,UZu,EEEKKKK	 	rF   )r   r   r'   r   r(   r   r)   r*   r+   r,   r   r   r    r   r"   r!   r-   r   r.   r   )r.   rd   )r.   r   )NN)
rm   rn   ro   rp   rq   rr   r-   r   r.   r   )
r   r   ro   rp   rq   rr   r-   r   r.   r   )r   r   r   __doc__r   __annotations__DEFAULT_MODEL_IDr   r   r    DEFAULT_BATCH_SIZEr"   r   model_configclassmethodrc   propertyri   rl   r   r   r@   rF   rD   r   r      s^         > H$H$$$$#'L''''0&*O****3(J((((H:  L 
 ! "$('+*.,d
 d
 d
 d
 [d
L 
 
 
 X
 & & & X& %):>	2
 2
 2
 2
 2
n %):>	: : : : : : :rF   r   )
__future__r   importlib.utilrW   loggingtypingr   r   r   r   r   langchain_core._api.deprecationr	   langchain_core.callbacksr
   #langchain_core.language_models.llmsr   langchain_core.outputsr   r   r   pydanticr   r   DEFAULT_TASKrO   r   	getLoggerr   rU   r   r@   rF   rD   <module>r      sO   " " " " " "      9 9 9 9 9 9 9 9 9 9 9 9 9 9 6 6 6 6 6 6 = = = = = = 7 7 7 7 7 7 I I I I I I I I I I          		8	$	$ 
B  
P P P P P' P P 
P P PrF   