
    KKi9                        S SK Jr  S SKrS SKrS SKJrJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJrJrJr  S SKJrJr  S S	KJrJrJrJrJr  S
rSrSrSrSr\R@                  " \!5      r" " S S\5      r#g)    )annotationsN)IteratorMapping)Any)CallbackManagerForLLMRun)BaseLLM)
GenerationGenerationChunk	LLMResult)
ConfigDictmodel_validator)IMPORT_ERRORis_ipex_availableis_openvino_availableis_optimum_intel_availableis_optimum_intel_versiongpt2text-generation)text2text-generationr   image-text-to-textsummarizationtranslation   z1.21c                  T   \ rS rSr% SrSrS\S'   SrS\S'    SrS\S	'    Sr	S\S
'    \
rS\S'    \" SS9r\" SS9\SS j5       5       r\SSSSS\
4                   SS jj5       r\SS j5       r\SS j5       r  S         SS jjr  S         SS jjrSrg) HuggingFacePipeline%   a  HuggingFace Pipeline API.

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

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

Example using from_model_id:
    ```python
    from langchain_huggingface import HuggingFacePipeline

    hf = HuggingFacePipeline.from_model_id(
        model_id="gpt2",
        task="text-generation",
        pipeline_kwargs={"max_new_tokens": 10},
    )
    ```

Example passing pipeline in directly:
    ```python
    from langchain_huggingface 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 | Nonemodel_iddict | Nonemodel_kwargspipeline_kwargsint
batch_sizeforbid)extrabefore)modec                    SU;  a=  UR                  S5      (       a  US   R                  R                  US'   U$ [        US'   U$ )z8Ensure model_id is set either by pipeline or user input.r   r   )getmodelname_or_pathDEFAULT_MODEL_ID)clsvaluess     q/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/langchain_huggingface/llms/huggingface_pipeline.pypre_init_validator&HuggingFacePipeline.pre_init_validator^   sN     V#zz*%%%+J%7%=%=%J%Jz"  &6z"    defaultc	           
         SSK Jn
JnJn  SSK Jn  U(       a  UR                  5       O0 nUb(  Ub  Sn[        U5      eSU;   a  Sn[        U5      eUUS'   UR                  " U40 UD6nUS	;   a  U[        ;  a  S
U S[         S3n[        U5      eSU S[        R                  " SU S35       3n[        5       (       d  [        U5      eUS:X  a  US:w  a  SO[        n[        SU5      (       a  SU SU SU S3n[        U5      eUS:X  a-  [        5       (       d  [        U5      eSSKJnJn  US:X  a  UOUnO<['        5       (       d  [        U5      eUS:X  a	  SSKJn  UnOSSKJn  UnO
US:X  a  U
OUnUR                  " U40 UD6nUR,                  c  UR.                  R0                  b  UR.                  R0                  Ul        OUR.                  R2                  bE  [5        UR.                  R2                  [6        5      (       a  UR.                  R2                  Ul        O2UR2                  b  UR2                  Ul        OUR9                  SS05        [;        USS5      (       d  [;        US S5      (       a$  Ub!  US!:X  a  [<        R?                  S"U S#35        SnUb  [@        RB                  RE                  S$5      bt  US!:X  an  SSK#nURH                  RK                  5       nUS%:  d  UU:  a  S&U S'U S(3n[        U5      eUb  US:  a  SnUb"  US:  a  US:  a  [<        R?                  S)U5        Ub  Ub  US:X  a  [<        R?                  S*5        S+U;   a.  URM                  5        VVs0 s H  u  nnUS+:w  d  M  UU_M     nnnU=(       d    0 nU" S.UUUUUUS,.UD6nURN                  [        ;  a"  S
URN                   S[         S3n[        U5      eU " S.UUUUUS-.U	D6$ ! [
         a  nSn[        U5      UeSnAff = fs  snnf )/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`.NzBoth `device` and `device_map` are specified. `device` will override `device_map`. You will most likely encounter unexpected behavior.Please remove `device` and keep `device_map`.
device_mapz4`device_map` is already specified in `model_kwargs`.>   ipexopenvinoGot invalid task , currently only  are supportedz	Backend:  zoptimum[]r:   r   z1.22<z requires optimum-intel>=zX. You can install it with pip: `pip install --upgrade --upgrade-strategy eager `optimum[z]`.r;   )OVModelForCausalLMOVModelForSeq2SeqLM)IPEXModelForCausalLM)IPEXModelForSeq2SeqLM	pad_tokenz[PAD]is_loaded_in_4bitFis_loaded_in_8bitr4   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.torchz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_code)taskr+   	tokenizerdevicer$   r!   )r   r   r!   r"   r$    )(transformersr6   r7   r8   r   ImportError
ValueErrorcopyfrom_pretrainedVALID_TASKSr   formatr   _MIN_OPTIMUM_VERSIONr   r   optimum.intelrB   rC   r   rD   rE   rF   configpad_token_ideos_token_id
isinstancer#   add_special_tokensgetattrloggerwarning	importlibutil	find_specrI   cudadevice_countitemsrM   ) r.   r   rM   backendrO   r9   r!   r"   r$   kwargsr6   r7   r8   hf_pipelineemsg_model_kwargsrN   err_msgmin_optimum_versionrB   rC   	model_clsrD   rE   r+   rI   cuda_device_countkv_pipeline_kwargsr   s                                    r0   from_model_id!HuggingFacePipeline.from_model_idi   s   	) 
 = 0<))+!!$  !o%},L o%*4M,'!11(LmL	**;&'v .&&1].B  !o%!'!L,?,?(7)ST@U,V+WXG-//!'**
 f$1B)B )  
 (-@AAy(A*+ ,  'y-  "#&&*$,..%g.. 00 ',  )**%g..,, !5I !6I
 ,, %*  ))(DmD&||((4).)B)B	&**6:))3< < */)B)B	&''3)2)?)?	&,,k7-CD 2E::5"5u=="9$NN=fX F" " F ((1=9$ %

 7 7 9{v)::"6( +<<M;NaQ  !o%%&1*!fqj5F5JP & *"8W
=RNNST-/!.!4!4!6!6A!?R:R1!6   +0b 
!&
 
 ==+#HMM? 3""-n>  S/! 
&,!
 
 	
O  	)E  S/q(	)hs#   O) 0P	P	)
P3PPc                J    U R                   U R                  U R                  S.$ )zGet the identifying parameters.r   r!   r"   rx   selfs    r0   _identifying_params'HuggingFacePipeline._identifying_params/  s'      --#33
 	
r3   c                    g)Nhuggingface_pipelinerP   ry   s    r0   	_llm_typeHuggingFacePipeline._llm_type8  s    %r3   c           	     d   / nUR                  S0 5      nUR                  SS5      n[        S[        U5      U R                  5       GH?  nXXR                  -    n	U R                  " U	40 UD6n
[        U
5       GH  u  p[        U[        5      (       a  US   nU R                  R                  S:X  d4  U R                  R                  S:X  d  U R                  R                  S:X  a  US   nOlU R                  R                  S	:X  a  US
   nOLU R                  R                  S;   a  US   nO,SU R                  R                   S[         S3n[        U5      eU(       a  U[        X   5      S  nUR                  U5        GM     GMB     [        U Vs/ s H  n[        US9/PM     snS9$ s  snf )Nr"   skip_promptFr   r   r   r   generated_textr   summary_textr   translation_textr<   r=   r>   text)generations)r*   rangelenr$   r   	enumerater]   listrM   rV   rS   appendr   r	   )rz   promptsstoprun_managerri   text_generationsr"   r   ibatch_prompts	responsesjresponser   rl   s                  r0   	_generateHuggingFacePipeline._generate<  s    ') **%6;jj6q#g,8A#OO(;<M !I  )3h--'{H MM&&*;;}}))-CC}}))-AA#$45D]]''?:#N3D]]''=8#$67D ,DMM,>,>+? @**5nF  %S/)M$4 5 78D ''-1  4 9H =MN=MT*$/0=MN
 	
Ns   F-c              +  $  ^#    SSK Jn  SS KnSSKJnJnJn	  UR                  S0 5      n
UR                  SS5      nUb%  U R                  R                  R                  U5      nU=(       d    / m " U4S jSU5      nU" U" 5       /5      nU	" U R                  R                  S	USS
9n[        SUUUS.U
D6nU" U R                  US9nUR                  5         U H1  n[        US9nU(       a  UR                  UR                  US9  Uv   M3     g 7f)Nr   )Thread)StoppingCriteriaStoppingCriteriaListTextIteratorStreamerr"   r   Tc                  6   > \ rS rSr        SU 4S jjrSrg)1HuggingFacePipeline._stream.<locals>.StopOnTokensi  c                0   >^ [        U4S jT 5       5      $ )Nc              3  :   >#    U  H  nTS    S   U:H  v   M     g7f)r   rJ   NrP   ).0stop_id	input_idss     r0   	<genexpr>MHuggingFacePipeline._stream.<locals>.StopOnTokens.__call__.<locals>.<genexpr>  s!     XFW79Q<+w6FWs   )any)rz   r   scoresri   stopping_ids_lists    `  r0   __call__:HuggingFacePipeline._stream.<locals>.StopOnTokens.__call__  s     XFWXXXr3   rP   N)r   ztorch.LongTensorr   ztorch.FloatTensorri   r   returnbool)__name__
__module____qualname____firstlineno__r   __static_attributes__)r   s   r0   StopOnTokensr     s9    Y+Y *Y 	Y
 Y Yr3   r   g      N@)timeoutr   skip_special_tokens)text_inputsstreamerstopping_criteria)targetri   r   )chunkrP   )	threadingr   rI   rQ   r   r   r   r*   r   rN   convert_tokens_to_idsdictstartr
   on_llm_new_tokenr   )rz   promptr   r   ri   r   rI   r   r   r   r"   r   r   r   r   generation_kwargst1charr   r   s                      @r0   _streamHuggingFacePipeline._streamp  s     	%	
 	
 !**%6;jj5==**@@FD JB	Y+ 	Y 1,.1AB'MM### $	
 ! 
/
 	
 4==1BC

D#.E,,UZZu,EK s   DDrP   )r/   dict[str, Any]r   r   )r   strrM   r   rh   r   rO   z
int | Noner9   r   r!   r    r"   r    r$   r#   ri   r   r   r   )r   zMapping[str, Any])r   r   )NN)
r   z	list[str]r   list[str] | Noner   CallbackManagerForLLMRun | Noneri   r   r   r   )
r   r   r   r   r   r   ri   r   r   zIterator[GenerationChunk])r   r   r   r   __doc__r   __annotations__r   r!   r"   DEFAULT_BATCH_SIZEr$   r   model_configr   classmethodr1   ru   propertyr{   r   r   r   r   rP   r3   r0   r   r   %   s   "H HcHjB !%L+$0#'O['3(J(HL (#  $ 
 !!!%$('+,C
C
 C
 	C

 C
 C
 "C
 %C
 C
 C
 
C
 C
J 
 
 & & "&7;	2
2
 2
 5	2

 2
 
2
n "&7;	66 6 5	6
 6 
#6 6r3   r   )$
__future__r   importlib.utilrb   loggingcollections.abcr   r   typingr   langchain_core.callbacksr   #langchain_core.language_models.llmsr   langchain_core.outputsr	   r
   r   pydanticr   r   (langchain_huggingface.utils.import_utilsr   r   r   r   r   r-   DEFAULT_TASKrV   r   rX   	getLoggerr   r`   r   rP   r3   r0   <module>r      so    "   -  = 7 I I 0        
		8	$A' Ar3   