o
    Zhc8                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZ d dlZd dlZd dlmZmZ d dlmZ d dlmZ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 G dd deZ G dd deZ!dS )    N)ThreadPoolExecutor)AnyDictListMappingOptionalSequence	TypedDict)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseLLM)
Generation	LLMResultget_from_dict_or_env)
ConfigDictFieldmodel_validator)Self)enforce_stop_tokensc                   @   s   e Zd ZU dZeed< dS )TrainResultzTrain result.lossN)__name__
__module____qualname____doc__float__annotations__ r   r   [/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/llms/gradient_ai.pyr      s   
 r   c                   @   s<  e Zd ZU dZedddZeed< 	 dZe	e ed< 	 dZ
e	e ed< 	 dZe	e ed	< 	 d
Zeed< 	 dZe	ej ed< 	 edddZeddededefddZedddefddZedeeef fddZedefddZdee deeef deeef fdd Zd!edeeef deeef fd"d#Z 		d3d!ed$e	e!e  d%e	e" dedef
d&d'Z#		d3d!ed$e	e!e  d%e	e$ dedef
d(d)Z%		d3d*e!e d$e	e!e  d%e	e" dede&f
d+d,Z'		d3d*e!e d$e	e!e  d%e	e$ dede&f
d-d.Z(dee dede)fd/d0Z*dee dede)fd1d2Z+dS )4GradientLLMa  Gradient.ai LLM Endpoints.

    GradientLLM is a class to interact with LLMs on gradient.ai

    To use, set the environment variable ``GRADIENT_ACCESS_TOKEN`` with your
    API token and ``GRADIENT_WORKSPACE_ID`` for your gradient workspace,
    or alternatively provide them as keywords to the constructor of this class.

    Example:
        .. code-block:: python

            from langchain_community.llms import GradientLLM
            GradientLLM(
                model="99148c6d-c2a0-4fbe-a4a7-e7c05bdb8a09_base_ml_model",
                model_kwargs={
                    "max_generated_token_count": 128,
                    "temperature": 0.75,
                    "top_p": 0.95,
                    "top_k": 20,
                    "stop": [],
                },
                gradient_workspace_id="12345614fc0_workspace",
                gradient_access_token="gradientai-access_token",
            )

    model   )alias
min_lengthmodel_idNgradient_workspace_idgradient_access_tokenmodel_kwargszhttps://api.gradient.ai/apigradient_api_url
aiosessionTZforbid)Zpopulate_by_nameextrabefore)modevaluesreturnc                 C   s4   t |dd|d< t |dd|d< t |dd|d< |S )z?Validate that api key and python package exists in environment.r'   ZGRADIENT_ACCESS_TOKENr&   ZGRADIENT_WORKSPACE_IDr)   ZGRADIENT_API_URLr   )clsr.   r   r   r   validate_environmentR   s   z GradientLLM.validate_environmentafterc                 C   s  zddl }W n ty   td Y n	 ty   Y nw | jdu s)t| jdk r-td| jdu s9t| jdk r=td| j	r| j	}d|
dd	  krTd
ksYtd tdd|
dd	  krjd
ksotd tdd|
dd	kr{tdd|
dd
krtd| S )zPost init validation.r   NzdDeprecationWarning: `GradientLLM` will use `pip install gradientai` in future releases of langchain.
   z0env variable `GRADIENT_ACCESS_TOKEN` must be set   z0env variable `GRADIENT_WORKSPACE_ID` must be settemperatureg      ?   z-`temperature` must be in the range [0.0, 1.0]top_pz'`top_p` must be in the range [0.0, 1.0]top_kz`top_k` must be positivemax_generated_token_countz,`max_generated_token_count` must be positive)
gradientaiImportErrorloggingwarning	Exceptionr'   len
ValueErrorr&   r(   get)selfr:   kwr   r   r   	post_initc   s8   zGradientLLM.post_initc                 C   s    | j pi }i d| jid|iS )zGet the identifying parameters.r)   r(   )r(   r)   )rB   _model_kwargsr   r   r   _identifying_params   s   
zGradientLLM._identifying_paramsc                 C   s   dS )zReturn type of llm.Zgradientr   )rB   r   r   r   	_llm_type   s   zGradientLLM._llm_typeinputskwargsc              	   C   s   | j pi }i ||}|dd}t| j d| j dd| j | j dddt|du r5tdd	 |D ntd
d	 t||D ddS )Build the kwargs for the Post request, used by sync

        Args:
            prompt (str): prompt used in query
            kwargs (dict): model kwargs in payload

        Returns:
            Dict[str, Union[str,dict]]: _description_
        multipliersN/models/z
/fine-tuneBearer application/jsonauthorizationzx-gradient-workspace-idacceptzcontent-typec                 s   s    | ]}d |iV  qdS )rH   Nr   ).0inputr   r   r   	<genexpr>   s    
z=GradientLLM._kwargs_post_fine_tune_request.<locals>.<genexpr>c                 s   s"    | ]\}}|d |idV  qdS )
multiplier)rH   ZfineTuningParametersNr   )rR   rS   rU   r   r   r   rT      s    
)Zsamplesurlheadersjson)	r(   rA   dictr)   r%   r'   r&   tuplezip)rB   rH   rI   rE   _paramsrK   r   r   r   _kwargs_post_fine_tune_request   s(   

z*GradientLLM._kwargs_post_fine_tune_requestpromptc                 C   sx   | j pi }i ||}t| j d| j dd| j | j dddt||dd|dd|d	d|d
dddS )rJ   rL   z	/completerM   rN   rO   r9   Nr5   r8   r7   )queryZmaxGeneratedTokenCountr5   ZtopKZtopPrV   )r(   rZ   r)   r%   r'   r&   rA   )rB   r_   rI   rE   r]   r   r   r   _kwargs_post_request   s"   





z GradientLLM._kwargs_post_requeststoprun_managerc              
   K   s   zt jdi | ||}|jdkrtd|j d|j W n t jjy4 } ztd| d}~ww | d }|durDt	||}|S )a  Call to Gradients API `model/{id}/complete`.

        Args:
            prompt: The prompt to pass into the model.
            stop: Optional list of stop words to use when generating.

        Returns:
            The string generated by the model.
           5Gradient returned an unexpected response with status : 2RequestException while calling Gradient Endpoint: NgeneratedOutputr   )
requestspostra   status_coder>   text
exceptionsRequestExceptionrY   r   )rB   r_   rb   rc   rI   responseerl   r   r   r   _call   s&   

zGradientLLM._callc              
      sb  | j sdt 4 I dH L}|jdi | j||d4 I dH %}|jdkr0td|j d|j | I dH d }W d  I dH  n1 I dH sIw   Y  W d  I dH  n1 I dH s^w   Y  nB| j jdi | j||d4 I dH %}|jdkrtd|j d|j | I dH d }W d  I dH  n1 I dH sw   Y  |durt	||}|S )a  Async Call to Gradients API `model/{id}/complete`.

        Args:
            prompt: The prompt to pass into the model.
            stop: Optional list of stop words to use when generating.

        Returns:
            The string generated by the model.
        N)r_   rI   rd   re   rf   rh   r   )
r*   aiohttpClientSessionrj   ra   statusr>   rl   rY   r   )rB   r_   rb   rc   rI   sessionro   rl   r   r   r   _acall  sH   
*(

(

zGradientLLM._acallpromptsc                    s   dt dtt f fdd}t|dkrtt||}n!ttdt|}t|||}W d   n1 s:w   Y  t|dS )	*Run the LLM on the given prompt and input.r_   r/   c                    s    t jd| d dgS )N)r_   rb   rc   rl   r   )r   rq   )r_   rI   rc   rB   rb   r   r   _inner_generate=  s   z.GradientLLM._generate.<locals>._inner_generater6      Ngenerations)	strr   r   r?   listmapr   minr   )rB   rw   rb   rc   rI   r{   r~   pr   rz   r   	_generate3  s    
	
zGradientLLM._generatec                    sL   g }t j fdd|D  I dH D ]}|t|dg qt|dS )rx   c                    s$   g | ]}j |fd  qS ))rb   rc   )rv   )rR   r_   rz   r   r   
<listcomp>X  s    z*GradientLLM._agenerate.<locals>.<listcomp>Nry   r}   )asynciogatherappendr   r   )rB   rw   rb   rc   rI   r~   Z
generationr   rz   r   
_agenerateN  s   
zGradientLLM._ageneratec              
   K   s   zt jdi | ||}|jdkrtd|j d|j W n t jjy4 } ztd| d }~ww | }|d |d  }t	|dS )	Nrd   re   rf   rg   sumLossnumberOfTrainableTokensr   r   )
ri   rj   r^   rk   r>   rl   rm   rn   rY   r   )rB   rH   rI   ro   rp   response_jsonr   r   r   r   train_unsupervised`  s(   


zGradientLLM.train_unsupervisedc              
      sj  | j sit 4 I d H Q}|jdi | ||4 I d H +}|jdkr/td|j d|j | I d H }|d |d  }W d   I d H  n1 I d H sNw   Y  W d   I d H  n1 I d H scw   Y  nG| j jdi | ||4 I d H +}|jdkrtd|j d|j | I d H }|d |d  }W d   I d H  n1 I d H sw   Y  t	|dS )Nrd   re   rf   r   r   r   r   )
r*   rr   rs   rj   r^   rt   r>   rl   rY   r   )rB   rH   rI   ru   ro   r   r   r   r   r   atrain_unsupervisedu  sP   

*(


(
zGradientLLM.atrain_unsupervised)NN),r   r   r   r   r   r%   r   r   r&   r   r'   r(   rZ   r)   r*   rr   rs   r   Zmodel_configr   classmethodr   r   r1   r   rD   propertyr   rF   rG   r   r^   ra   r   r   rq   r
   rv   r   r   r   r   r   r   r   r   r   r   r       s   
 $


/


#

%

/




r    )"r   r<   concurrent.futuresr   typingr   r   r   r   r   r   r	   rr   ri   Zlangchain_core.callbacksr
   r   Z#langchain_core.language_models.llmsr   Zlangchain_core.outputsr   r   Zlangchain_core.utilsr   Zpydanticr   r   r   Ztyping_extensionsr   Zlangchain_community.llms.utilsr   r   r    r   r   r   r   <module>   s    $