o
    |qic8                     @   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   k/home/app/PaddleOCR-VL/.venv_paddleocr/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   )aliasZ
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)selfr9   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(   )rA   _model_kwargsr   r   r   _identifying_params   s   
zGradientLLM._identifying_paramsc                 C   s   dS )zReturn type of llm.Zgradientr   )rA   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 )rG   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)rG   ZfineTuningParametersNr   )rQ   rR   rT   r   r   r   rS      s    
)Zsamplesurlheadersjson)	r'   r@   dictr(   r$   r&   r%   tuplezip)rA   rG   rH   rD   _paramsrJ   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 )rI   rK   z	/completerL   rM   rN   r8   Nr4   r7   r6   )queryZmaxGeneratedTokenCountr4   ZtopKZtopPrU   )r'   rY   r(   r$   r&   r%   r@   )rA   r^   rH   rD   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postr`   status_coder=   text
exceptionsRequestExceptionrX   r   )rA   r^   ra   rb   rH   responseerk   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^   rH   rc   rd   re   rg   r   )
r)   aiohttpClientSessionri   r`   statusr=   rk   rX   r   )rA   r^   ra   rb   rH   sessionrn   rk   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^   ra   rb   rk   r   )r   rp   )r^   rH   rb   rA   ra   r   r   _inner_generate=  s   z.GradientLLM._generate.<locals>._inner_generater5      Ngenerations)	strr   r   r>   listmapr   minr   )rA   rv   ra   rb   rH   rz   r}   pr   ry   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 )rw   c                    s$   g | ]}j |fd  qS ))ra   rb   )ru   )rQ   r^   ry   r   r   
<listcomp>X  s    z*GradientLLM._agenerate.<locals>.<listcomp>Nrx   r|   )asynciogatherappendr   r   )rA   rv   ra   rb   rH   r}   Z
generationr   ry   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 )	Nrc   rd   re   rf   sumLossnumberOfTrainableTokensr   r   )
rh   ri   r]   rj   r=   rk   rl   rm   rX   r   )rA   rG   rH   rn   ro   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 )Nrc   rd   re   r   r   r   r   )
r)   rq   rr   ri   r]   rs   r=   rk   rX   r   )rA   rG   rH   rt   rn   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'   rY   r(   r)   rq   rr   r   Zmodel_configr   classmethodr   r   r0   r   rC   propertyr   rE   rF   r   r]   r`   r   r   rp   r
   ru   r   r   r   r   r   r   r   r   r   r   r       s   
 $


/


#

%

/




r    )"r   r;   concurrent.futuresr   typingr   r   r   r   r   r   r	   rq   rh   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    $