o
    Zhv5                     @  s   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eZeddddG dd deZdS )    )annotationsN)AnyIteratorListMappingOptional)
deprecated)CallbackManagerForLLMRun)BaseLLM)
GenerationGenerationChunk	LLMResult)
ConfigDictZgpt2text-generation)text2text-generationr   summarizationtranslation   z0.0.37z1.0z)langchain_huggingface.HuggingFacePipeline)ZsinceZremovalZalternative_importc                   @  s   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dZeddddde
fd,ddZed-ddZed.ddZ		d/d0d&d'Z		d/d1d*d+ZdS )2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_sizeZforbid)extradefaulttaskbackenddeviceOptional[int]
device_mapOptional[str]kwargsreturnc	              
   K  s  zddl m}
m}m} ddl m} W n ty   tdw |p!i }|j|fi |}z|dkrr|dkrhzddlm} W n tyG   tdw z|j|fi |}W no t	yg   |j|fd	d
i|}Y n\w |
j|fi |}nQ|dv r|dkrzddlm
} W n ty   tdw z|j|fi |}W n) t	y   |j|fd	d
i|}Y nw |j|fi |}ntd| dt dW n ty } z	td| d|d}~ww |jdu r|jjdur|jj|_n%|jjdurt|jjtr|jj|_n|jdur
|j|_n|ddi t|ddst|ddr4|dur4|dkr4td| d d}|durtjddur|dkrddl}|j }|dk sZ||kretd| d| d|durq|dk rqd}|dur|dk r|dkrtd | |dur|dur|dkrtd! d"|v rd#d$ | D }|pi }|d'|||||||d%|}|jtvrt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   Zopenvino)OVModelForCausalLMzlCould not import optimum-intel python package. Please install it with: pip install 'optimum[openvino,nncf]' ZexportT)r   r   r   )OVModelForSeq2SeqLMGot invalid task , currently only  are supportedzCould not load the z# model due to missing dependencies.N	pad_tokenz[PAD]Zis_loaded_in_4bitFZ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                 S  s   i | ]\}}|d kr||qS )r3    ).0kvr4   r4   d/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/llms/huggingface_pipeline.py
<dictcomp>   s    z5HuggingFacePipeline.from_model_id.<locals>.<dictcomp>)r    model	tokenizerr"   r$   r   r   )r   r   r   r   r   r4   )transformersr(   r)   r*   r   ImportErrorZfrom_pretrainedZoptimum.intel.openvinor+   	Exceptionr,   
ValueErrorVALID_TASKSr0   configZpad_token_idZeos_token_id
isinstancer   Zadd_special_tokensgetattrloggerwarning	importlibutil	find_specr1   cudaZdevice_countitemsr    )clsr   r    r!   r"   r$   r   r   r   r&   r(   r)   r*   Zhf_pipelineZ_model_kwargsr;   r+   r:   r,   er1   Zcuda_device_countZ_pipeline_kwargsr   r4   r4   r8   from_model_idM   s4  


















z!HuggingFacePipeline.from_model_idMapping[str, Any]c                 C  s   | j | j| jdS )zGet the identifying parameters.r   r   r   rO   selfr4   r4   r8   _identifying_params   s   z'HuggingFacePipeline._identifying_paramsc                 C  s   dS )NZhuggingface_pipeliner4   rP   r4   r4   r8   	_llm_type  s   zHuggingFacePipeline._llm_typeprompts	List[str]stopOptional[List[str]]run_manager"Optional[CallbackManagerForLLMRun]r   c                 K  s4  g }| j r| j ni }|d|}|dd}tdt|| jD ]p}	||	|	| j  }
| j|
fi |}t|D ]W\}}t|trD|d }| jj	dkrO|d }n.| jj	dkrZ|d }n#| jj	dkre|d	 }n| jj	d
v rp|d }nt
d| jj	 dt d|r|t|
| d  }|| q7qtdd |D dS )Nr   skip_promptFr   r   Zgenerated_textr   r   Zsummary_textr   Ztranslation_textr-   r.   r/   c                 S  s   g | ]}t |d gqS )text)r   )r5   r\   r4   r4   r8   
<listcomp>;  s    z1HuggingFacePipeline._generate.<locals>.<listcomp>)Zgenerations)r   getrangelenr   r   	enumeraterB   listr    r?   r@   appendr   )rQ   rT   rV   rX   r&   Ztext_generationsZdefault_pipeline_kwargsr   rZ   iZbatch_prompts	responsesjresponser\   r4   r4   r8   	_generate
  sD   




zHuggingFacePipeline._generatepromptIterator[GenerationChunk]c                 +  s   ddl m} dd l}ddlm}m}m}	 |di }
|dd}|d ur,| jj	
|}|p/g  G  fddd|}|| g}| jj	|d	d
}|	| jj	d|dd}t|f||d|
}|| jjj|d}|  |D ]}t|d}|r}|j|j|d |V  qld S )Nr   )Thread)StoppingCriteriaStoppingCriteriaListTextIteratorStreamerr   rZ   Tc                      s   e Zd Zd fd	d
ZdS )z1HuggingFacePipeline._stream.<locals>.StopOnTokens	input_idstorch.LongTensorscorestorch.FloatTensorr&   r   r'   boolc                   s$    D ]}|d d |kr dS qdS )Nr   r   TFr4   )rQ   ro   rq   r&   Zstop_idZstopping_ids_listr4   r8   __call__V  s
   z:HuggingFacePipeline._stream.<locals>.StopOnTokens.__call__N)ro   rp   rq   rr   r&   r   r'   rs   )__name__
__module____qualname__ru   r4   rt   r4   r8   StopOnTokensU  s    ry   pt)Zreturn_tensorsg      N@)timeoutrZ   Zskip_special_tokens)streamerstopping_criteria)targetr&   r[   )chunk)	threadingrk   r1   r<   rl   rm   rn   r^   r   r;   Zconvert_tokens_to_idsdictr:   generatestartr   Zon_llm_new_tokenr\   )rQ   ri   rV   rX   r&   rk   r1   rl   rm   rn   r   rZ   ry   r}   Zinputsr|   Zgeneration_kwargst1charr   r4   rt   r8   _stream>  sD   
zHuggingFacePipeline._stream)r   r   r    r   r!   r   r"   r#   r$   r%   r   r   r   r   r   r   r&   r   r'   r   )r'   rN   )r'   r   )NN)
rT   rU   rV   rW   rX   rY   r&   r   r'   r   )
ri   r   rV   rW   rX   rY   r&   r   r'   rj   )rv   rw   rx   __doc__r   __annotations__DEFAULT_MODEL_IDr   r   r   DEFAULT_BATCH_SIZEr   r   Zmodel_configclassmethodrM   propertyrR   rS   rh   r   r4   r4   r4   r8   r      sB   
  07r   )
__future__r   importlib.utilrF   loggingtypingr   r   r   r   r   Zlangchain_core._api.deprecationr   Zlangchain_core.callbacksr	   Z#langchain_core.language_models.llmsr
   Zlangchain_core.outputsr   r   r   Zpydanticr   r   ZDEFAULT_TASKr@   r   	getLoggerrv   rD   r   r4   r4   r4   r8   <module>   s(    
