a
    bgc8                     @   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   r/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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eedddZeddedddZeeeef dddZeedddZee eeef eeef dddZeeeef eeef d d!d"Z d1ee	e!e  e	e" eed#d$d%Z#d2ee	e!e  e	e$ eed#d&d'Z%d3e!e e	e!e  e	e" ee&d(d)d*Z'd4e!e e	e!e  e	e$ ee&d(d+d,Z(ee ee)dd-d.Z*ee ee)dd/d0Z+dS )5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after)r.   c                 C   s
  zddl }W n, ty(   td Y n ty8   Y n0 | jdu sRt| jdk rZtd| jdu srt| jdk rztd| j	r| j	}d|
dd	  krd
ksn tdd|
dd	  krd
ksn tdd|
dd	krtdd|
dd
krt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   s.    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kwargsr.   c              	   C   s   | j pi }i ||}|dd}t| j d| j dd| j | j dddt|du rjt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)promptrH   r.   c                 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)r^   stoprun_managerrH   r.   c              
   K   s   z>t jf i | ||}|jdkr<td|j d|j W n6 t jjyt } ztd| W Y d}~n
d}~0 0 | d }|durt	||}|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generatedOutput)
requestspostr`   status_coder=   text
exceptionsRequestExceptionrX   r   )rA   r^   ra   rb   rH   responseerk   r   r   r   _call   s     
$
zGradientLLM._callc              
      sh  | j st 4 I dH }|jf i | j||d4 I dH J}|jdkr^td|j d|j | I dH d }W d  I dH  q1 I dH s0    Y  W d  I dH  q1 I dH s0    Y  n| j jf i | j||d4 I dH N}|jdkrtd|j d|j | I dH d }W d  I dH  qP1 I dH sF0    Y  |durdt	||}|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)   aiohttpClientSessionri   r`   statusr=   rk   rX   r   )rA   r^   ra   rb   rH   sessionrn   rk   r   r   r   _acall  s>    
h
@

zGradientLLM._acall)promptsra   rb   rH   r.   c                    s   t tt d fdd}t|dkr:tt||}nBttdt| }t|||}W d   n1 sr0    Y  t|dS )*Run the LLM on the given prompt and input.)r^   r.   c                    s    t jf | d dgS )N)r^   ra   rb   rk   )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                    sJ   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f i | ||}|jdkr<td|j d|j W n6 t jjyt } ztd| W Y d }~n
d }~0 0 | }|d |d  }t	|dS )Nrc   rd   re   rf   sumLossnumberOfTrainableTokens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              
      sn  | j st 4 I d H }|jf i | ||4 I d H V}|jdkr\td|j d|j | I d H }|d |d  }W d   I d H  q1 I d H s0    Y  W d   I d H  q1 I d H s0    Y  n| j jf i | ||4 I d H Z}|jdkrtd|j d|j | I d H }|d |d  }W d   I d H  qd1 I d H sZ0    Y  t	|dS )Nrc   rd   re   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  sF    

X

0zGradientLLM.atrain_unsupervised)NN)NN)NN)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   
$
0
#  
%  
/  
  
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   $