
    h9                        d dl mZ d dlZd dlZd dlmZmZ d dlm	Z	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mZ d d	lmZmZmZmZmZ d
ZdZdZdZdZ  ejB                  e"      Z# G d de      Z$y)    )annotationsN)IteratorMapping)AnyOptional)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                  F   e Zd ZU dZdZded<   dZded<   	 dZded<   	 dZded	<   	 e	Z
d
ed<   	  ed      Z ed      ed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y)HuggingFacePipelineal  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:
        .. code-block:: 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:
        .. code-block:: 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Optional[str]model_idOptional[dict]model_kwargspipeline_kwargsint
batch_sizeforbid)extrabefore)modec                ~    d|vr8|j                  d      r|d   j                  j                  |d<   |S t        |d<   |S )z8Ensure model_id is set either by pipeline or user input.r   r   )getmodelname_or_pathDEFAULT_MODEL_ID)clsvaluess     n/var/www/html/aiagenthome/venv/lib/python3.12/site-packages/langchain_huggingface/llms/huggingface_pipeline.pypre_init_validatorz&HuggingFacePipeline.pre_init_validatorU   sK     V#zz*%%+J%7%=%=%J%Jz"  &6z"    defaultc	           
     l   	 ddl m}
m}m} ddl m} |r|j                         ni }|%|d}t        |      d|v rd}t        |      ||d<    |j                  |fi |}|d	v r|t        vrd
| dt         d}t        |      d| dt        j                  d| d       }t               st        |      |dk(  r|dk7  rdnt        }t        d|      rd| d| d| d}t        |      |dk(  r't               st        |      ddlm}m} |dk(  r|n|}n5t'               st        |      |dk(  r	ddlm} |}nddlm} |}n	|dk(  r|
n|} |j                  |fi |}|j,                  |j.                  j0                  |j.                  j0                  |_        n|j.                  j2                  @t5        |j.                  j2                  t6              r|j.                  j2                  |_        n1|j2                  |j2                  |_        n|j9                  ddi       t;        |dd      st;        |d d      r"| |d!k(  rt<        j?                  d"| d#       d}|t@        jB                  jE                  d$      l|d!k(  rgddl#}|jH                  jK                         }|d%k  s||k\  rd&| d'| d(}t        |      ||dk  rd}| |dk  r|dkD  rt<        j?                  d)|       |||dk(  rt<        j?                  d*       d+|v r)|jM                         D ci c]  \  }}|d+k7  s|| }}}|xs i } |d.||||||d,|}|jN                  t        vr"d
|jN                   dt         d}t        |       | d.|||||d-|	S # t
        $ r}d}t        |      |d}~ww xY wc c}}w )/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[]r9   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_8bitr3   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$    )(transformersr5   r6   r7   r   ImportError
ValueErrorcopyfrom_pretrainedVALID_TASKSr   formatr   _MIN_OPTIMUM_VERSIONr   r   optimum.intelrA   rB   r   rC   rD   rE   configpad_token_ideos_token_id
isinstancer#   add_special_tokensgetattrloggerwarning	importlibutil	find_specrH   cudadevice_countitemsrL   ) r.   r   rL   backendrN   r8   r!   r"   r$   kwargsr5   r6   r7   hf_pipelineemsg_model_kwargsrM   err_msgmin_optimum_versionrA   rB   	model_clsrC   rD   r+   rH   cuda_device_countkv_pipeline_kwargsr   s                                    r0   from_model_idz!HuggingFacePipeline.from_model_id`   s   	) 
 = 0<))+!!$  !o%},L o%*4M,'1M11(LmL	**;&'v .&&1].B  !o%!'!L,?,?(7)ST@U,V+WXG-/!'**
 f$1B)B )  
 (-@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#   N $N02N0	N-N((N-c                J    | j                   | j                  | j                  dS )zGet the identifying parameters.r   r!   r"   rv   selfs    r0   _identifying_paramsz'HuggingFacePipeline._identifying_params&  s'      --#33
 	
r2   c                     y)Nhuggingface_pipelinerO   rw   s    r0   	_llm_typezHuggingFacePipeline._llm_type/  s    %r2   c                F   g }|j                  di       }|j                  dd      }t        dt        |      | j                        D ].  }|||| j                  z    }	 | j                  |	fi |}
t        |
      D ]  \  }}t        |t              r|d   }| j                  j                  dk(  s2| j                  j                  dk(  s| j                  j                  dk(  r|d   }ni| j                  j                  d	k(  r|d
   }nJ| j                  j                  dv r|d   }n,d| j                  j                   dt         d}t        |      |r|t        |	|         d  }|j                  |        1 t        |D cg c]  }t        |      g c}      S c c}w )Nr"   skip_promptFr   r   r   r   generated_textr   summary_textr   translation_textr;   r<   r=   text)generations)r*   rangelenr$   r   	enumerater\   listrL   rU   rR   appendr   r
   )rx   promptsstoprun_managerrh   text_generationsr"   r~   ibatch_prompts	responsesjresponser   rk   s                  r0   	_generatezHuggingFacePipeline._generate3  s    ') **%6;jj6q#g,8A#ADOO(;<M &!I  )38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              +     K   ddl m} dd l}ddlm}m}m}	 |j                  di       }
|j                  dd      }|%| j                  j                  j                  |      }|xs g  G fdd|      } | |       g      } |	| j                  j                  d	|d
      }t        d|||d|
} || j                  |      }|j                          |D ]1  }t        |      }|r|j                  |j                  |       | 3 y w)Nr   )Thread)StoppingCriteriaStoppingCriteriaListTextIteratorStreamerr"   r~   Tc                  *    e Zd Z	 	 	 	 	 	 	 	 d fdZy)1HuggingFacePipeline._stream.<locals>.StopOnTokensc                .    t        fdD              S )Nc              3  4   K   | ]  }d    d   |k(    yw)r   rI   NrO   ).0stop_id	input_idss     r0   	<genexpr>zMHuggingFacePipeline._stream.<locals>.StopOnTokens.__call__.<locals>.<genexpr>  s"     XFW79Q<+w6FWs   )any)rx   r   scoresrh   stopping_ids_lists    `  r0   __call__z:HuggingFacePipeline._stream.<locals>.StopOnTokens.__call__  s     XFWXXXr2   N)r   ztorch.LongTensorr   ztorch.FloatTensorrh   r   returnbool)__name__
__module____qualname__r   )r   s   r0   StopOnTokensr   ~  s3    Y+Y *Y 	Y
 Yr2   r   g      N@)timeoutr~   skip_special_tokens)text_inputsstreamerstopping_criteria)targetrh   r   )chunkrO   )	threadingr   rH   rP   r   r   r   r*   r   rM   convert_tokens_to_idsdictstartr   on_llm_new_tokenr   )rx   promptr   r   rh   r   rH   r   r   r   r"   r~   r   r   r   generation_kwargst1charr   r   s                      @r0   _streamzHuggingFacePipeline._streamg  s     	%	
 	
 !**%6;jj5==**@@FD JB	Y+ 	Y 1,.1AB'MM### $	
 ! 
/
 	
 4==1BC

D#.E,,UZZu,EK s   DD)r/   dict[str, Any]r   r   )r   strrL   r   rg   r   rN   zOptional[int]r8   r   r!   r    r"   r    r$   r#   rh   r   r   r   )r   zMapping[str, Any])r   r   )NN)
r   z	list[str]r   Optional[list[str]]r   "Optional[CallbackManagerForLLMRun]rh   r   r   r   )
r   r   r   r   r   r   rh   r   r   zIterator[GenerationChunk])r   r   r   __doc__r   __annotations__r   r!   r"   DEFAULT_BATCH_SIZEr$   r   model_configr   classmethodr1   rt   propertyry   r|   r   r   rO   r2   r0   r   r   %   s   > Hc"Hm"B $(L.'0&*O^*3(J(HL (#  $ 
 ! $$('+*.,C
C
 C
 	C

 C
 "C
 %C
 (C
 C
 C
 
C
 C
J 
 
 & & %):>	2
2
 "2
 8	2

 2
 
2
n %):>	66 "6 8	6
 6 
#6r2   r   )%
__future__r   importlib.utilra   loggingcollections.abcr   r   typingr   r   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_TASKrU   r   rW   	getLoggerr   r_   r   rO   r2   r0   <module>r      sq    "   -   = 7 I I 0        
		8	$x' xr2   