o
    Zh7                     @   s   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mZmZ d dlmZ d dlmZmZmZmZ d dlmZ e eZG d	d
 d
e
ZdS )    N)AnyDictListMappingOptional)CallbackManagerForLLMRun)LLM)convert_to_secret_strget_from_dict_or_envpre_init)
get_fields)
ConfigDictField	SecretStrmodel_validator)enforce_stop_tokensc                   @   s  e Zd ZU dZdZeed< 	 dZeed< 	 dZe	ed< 	 dZ
eed< 	 d	Zeed
< 	 dZeed< 	 dZee ed< 	 dZeed< 	 dZee ed< 	 eedZee	ef ed< 	 dZee ed< eddZeddedee	ef defddZededefddZ e!dee	ef fddZ"e!de#e	ef fd d!Z$e!de	fd"d#Z%		d*d$e	d%ee&e	  d&ee' d'ede	f
d(d)Z(dS )+Petalsa  Petals Bloom models.

    To use, you should have the ``petals`` python package installed, and the
    environment variable ``HUGGINGFACE_API_KEY`` set with your API key.

    Any parameters that are valid to be passed to the call can be passed
    in, even if not explicitly saved on this class.

    Example:
        .. code-block:: python

            from langchain_community.llms import petals
            petals = Petals()

    Nclient	tokenizerzbigscience/bloom-petals
model_namegffffff?temperature   max_new_tokensg?top_ptop_kT	do_sample
max_length)default_factorymodel_kwargshuggingface_api_keyZforbid)extrabefore)modevaluesreturnc              
   C   s   dd t |  D }|di }t|D ](}||vr=||v r'td| dtd| d| d| d	 ||||< q||d< |S )
z>Build extra kwargs from additional params that were passed in.c                 S   s   h | ]}|j qS  )alias).0fieldr%   r%   V/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/llms/petals.py	<setcomp>J   s    z%Petals.build_extra.<locals>.<setcomp>r   zFound z supplied twice.z	WARNING! z/ is not default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.)r   r#   getlist
ValueErrorloggerwarningpop)clsr#   Zall_required_field_namesr    
field_namer%   r%   r)   build_extraF   s"   zPetals.build_extrac                 C   sv   t t|dd}z'ddlm} ddlm} |d }|||d< |||d< | |d< W |S  ty:   td	w )
z?Validate that api key and python package exists in environment.r   ZHUGGINGFACE_API_KEYr   )AutoDistributedModelForCausalLM)AutoTokenizerr   r   r   zpCould not import transformers or petals python package.Please install with `pip install -U transformers petals`.)	r	   r
   petalsr4   Ztransformersr5   Zfrom_pretrainedZget_secret_valueImportError)r1   r#   r   r4   r5   r   r%   r%   r)   validate_environmentZ   s$   
zPetals.validate_environmentc                 C   s,   | j | j| j| j| j| jd}i || jS )z2Get the default parameters for calling Petals API.)r   r   r   r   r   r   )r   r   r   r   r   r   r   )selfZnormal_paramsr%   r%   r)   _default_paramsr   s   zPetals._default_paramsc                 C   s   i d| j i| jS )zGet the identifying parameters.r   )r   r:   r9   r%   r%   r)   _identifying_params   s   zPetals._identifying_paramsc                 C   s   dS )zReturn type of llm.r6   r%   r;   r%   r%   r)   	_llm_type   s   zPetals._llm_typepromptstoprun_managerkwargsc           	      K   s^   | j }i ||}| j|ddd }| jj|fi |}| j|d }|dur-t||}|S )zCall the Petals API.pt)Zreturn_tensorsZ	input_idsr   N)r:   r   r   generatedecoder   )	r9   r>   r?   r@   rA   paramsZinputsZoutputstextr%   r%   r)   _call   s   
zPetals._call)NN))__name__
__module____qualname____doc__r   r   __annotations__r   r   strr   floatr   intr   r   r   r   boolr   r   dictr   r   r   r   r   Zmodel_configr   classmethodr3   r   r8   propertyr:   r   r<   r=   r   r   rG   r%   r%   r%   r)   r      sd   
 
r   )loggingtypingr   r   r   r   r   Zlangchain_core.callbacksr   Z#langchain_core.language_models.llmsr   Zlangchain_core.utilsr	   r
   r   Zlangchain_core.utils.pydanticr   Zpydanticr   r   r   r   Zlangchain_community.llms.utilsr   	getLoggerrH   r.   r   r%   r%   r%   r)   <module>   s    
