
    Ng7                        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
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Zd	Zd
ZdZ ej        e          Z G d de          ZdS )    )annotationsN)AnyDictIteratorListMappingOptional)CallbackManagerForLLMRun)BaseLLM)
GenerationGenerationChunk	LLMResult)
ConfigDictmodel_validatorgpt2text-generation)text2text-generationr   summarizationtranslation   c                  (   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/d0d'Z	 	 d/d1d*ZdS )2HuggingFacePipelineaV  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_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)modevaluesDict[str, Any]returnc                f    d|vr,d|v r|d         r|d         j         j        |d<   n
t          |d<   |S )z8Ensure model_id is set either by pipeline or user input.r   r   )modelname_or_pathDEFAULT_MODEL_ID)clsr%   s     k/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_huggingface/llms/huggingface_pipeline.pypre_init_validatorz&HuggingFacePipeline.pre_init_validatorI   sK     V##V##z(:#%+J%7%=%Jz""%5z"    defaultstrtaskbackenddeviceOptional[int]
device_mapkwargsc	           
     d   	 ddl m}
m}m} ddl m} n# t
          $ r t          d          w xY w|r|                                ni }|)|t          d          d|v rt          d          ||d<    |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`.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`.r6   z4`device_map` is already specified in `model_kwargs`.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.is_loaded_in_4bitFis_loaded_in_8bitr0   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_codec                &    i | ]\  }}|d k    ||S )rH    ).0kvs      r-   
<dictcomp>z5HuggingFacePipeline.from_model_id.<locals>.<dictcomp>   s0       A!?R:R:R1:R:R:Rr/   )r2   r)   	tokenizerr4   r    r   )r   r   r   r   r    rJ   )transformersr9   r:   r;   r   ImportError
ValueErrorcopyfrom_pretrainedoptimum.intel.openvinor=   	Exceptionr?   VALID_TASKS	pad_tokenconfigeos_token_idpad_token_idgetattrloggerwarning	importlibutil	find_specrE   cudadevice_countitemsr2   )r,   r   r2   r3   r4   r6   r   r   r    r7   r9   r:   r;   hf_pipeline_model_kwargsrO   r=   r)   r?   erE   cuda_device_count_pipeline_kwargsr   s                           r-   from_model_idz!HuggingFacePipeline.from_model_idT   s>   	         
 =<<<<<< 	 	 	E  	 0<C))+++!! $   },, !WXXX*4M,'1M1(LLmLL	?	(((j((
       '   (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    -E< B E< B00E< 4C E< C E< C  E< =D E< DE< "D1 0E< 1EE< E-E< <
FFFMapping[str, Any]c                ,    | j         | j        | j        dS )zGet the identifying parameters.r   r   r   rm   selfs    r-   _identifying_paramsz'HuggingFacePipeline._identifying_params
  s$      -#3
 
 	
r/   c                    dS )Nhuggingface_pipelinerJ   rn   s    r-   	_llm_typezHuggingFacePipeline._llm_type  s    %%r/   prompts	List[str]stopOptional[List[str]]run_manager"Optional[CallbackManagerForLLMRun]r   c           	        g }|                     di           }|                     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_textr@   rA   rB   c                0    g | ]}t          |           gS )text)r   )rK   r   s     r-   
<listcomp>z1HuggingFacePipeline._generate.<locals>.<listcomp>E  s&    NNNT*$///0NNNr/   )generations)getrangelenr    r   	enumerate
isinstancelistr2   rR   rW   appendr   )ro   rt   rv   rx   r7   text_generationsr   r{   ibatch_prompts	responsesjresponser   s                 r-   	_generatezHuggingFacePipeline._generate  s    ') **%6;;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
 
 
 	
r/   promptIterator[GenerationChunk]c              +  *  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        j	        d	|d
          }t          d|||d|
} || j        |          }|                                 |D ]4}t          |          }|r|                    |j        |           |V  5d S )Nr   )Thread)StoppingCriteriaStoppingCriteriaListTextIteratorStreamerr   r{   Tc                      e Zd Zd fd	Zd
S )1HuggingFacePipeline._stream.<locals>.StopOnTokens	input_idstorch.LongTensorscorestorch.FloatTensorr7   r   r'   boolc                <    D ]}|d         d         |k    r dS dS )Nr   rF   TFrJ   )ro   r   r   r7   stop_idstopping_ids_lists        r-   __call__z:HuggingFacePipeline._stream.<locals>.StopOnTokens.__call__`  s9      1 $ $G |B'722#tt 3ur/   N)r   r   r   r   r7   r   r'   r   )__name__
__module____qualname__r   )r   s   r-   StopOnTokensr   _  s3        	 	 	 	 	 	 	 	r/   r   g      N@)timeoutr{   skip_special_tokens)text_inputsstreamerstopping_criteria)targetr7   r   )chunkrJ   )	threadingr   rE   rP   r   r   r   r   r   rO   convert_tokens_to_idsdictstartr   on_llm_new_tokenr   )ro   r   rv   rx   r7   r   rE   r   r   r   r   r{   r   r   r   generation_kwargst1charr   r   s                      @r-   _streamzHuggingFacePipeline._streamH  s      	%$$$$$	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 !**%6;;jj55=*@@FFD JB
	 
	 
	 
	 
	 
	 
	+ 
	 
	 
	 10,,..1ABB''M## $	
 
 
 ! 
/
 
 	
 
 V4=1BCCC



 	 	D#...E F,,UZu,EEEKKKK	 	r/   )r%   r&   r'   r&   )r   r1   r2   r1   r3   r1   r4   r5   r6   r   r   r   r   r   r    r   r7   r   r'   r   )r'   rk   )r'   r1   )NN)
rt   ru   rv   rw   rx   ry   r7   r   r'   r   )
r   r1   rv   rw   rx   ry   r7   r   r'   r   )r   r   r   __doc__r   __annotations__r   r   r   DEFAULT_BATCH_SIZEr    r   model_configr   classmethodr.   rj   propertyrp   rs   r   r   rJ   r/   r-   r   r      s         > H"H""""B $(L''''0&*O****3(J((((H:  L _(###   [ $# 
 ! $$('+*.,s
 s
 s
 s
 [s
j 
 
 
 X
 & & & X& %):>	/
 /
 /
 /
 /
h %):>	9 9 9 9 9 9 9r/   r   )
__future__r   importlib.utilr_   loggingtypingr   r   r   r   r   r	   langchain_core.callbacksr
   #langchain_core.language_models.llmsr   langchain_core.outputsr   r   r   pydanticr   r   r+   DEFAULT_TASKrW   r   	getLoggerr   r]   r   rJ   r/   r-   <module>r      s    " " " " " "      ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = = = = = = 7 7 7 7 7 7 I I I I I I I I I I 0 0 0 0 0 0 0 0    		8	$	$h h h h h' h h h h hr/   