
    Ngc8                         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e          Z  G 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                       e Zd ZU dZeed<   dS )TrainResultzTrain result.lossN)__name__
__module____qualname____doc__float__annotations__     `/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/llms/gradient_ai.pyr   r      s         
KKKKKr!   r   c                   ~   e Zd ZU dZ e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          Z ed          ededefd                        Z ed          defd            Zedeeef         fd            Zedefd            Zdee         deeef         deeef         fdZdedeeef         deeef         fdZ 	 	 d'dede	e!e                  de	e"         dedef
d Z#	 	 d'dede	e!e                  de	e$         dedef
d!Z%	 	 d'd"e!e         de	e!e                  de	e"         dede&f
d#Z'	 	 d'd"e!e         de	e!e                  de	e$         dede&f
d$Z(dee         dede)fd%Z*dee         dede)fd&Z+dS )(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
aiosessionTforbid)populate_by_nameextrabefore)modevaluesreturnc                 ~    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+   GRADIENT_ACCESS_TOKENr*   GRADIENT_WORKSPACE_IDr-   GRADIENT_API_URLr   )clsr4   s     r"   validate_environmentz GradientLLM.validate_environmentR   si    
 +?+-D+
 +
&' +?+-D+
 +
&' &:&(:&
 &
!" r!   afterc                    	 ddl }n/# t          $ r t          j        d           Y nt          $ r Y nw xY w| j        t          | j                  dk     rt          d          | j        t          | j                  dk     rt          d          | j	        r| j	        }d|
                    dd	          cxk    rd
k    sn t          d          d|
                    dd	          cxk    rd
k    sn t          d          d|
                    dd	          k    rt          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)selfrE   kws      r"   	post_initzGradientLLM.post_initc   s   	 	 	 	OL      	 	 	D	 %-T5O1P1PSU1U1UOPPP%-T5O1P1PST1T1TOPPP 	Q"B}c227777a7777 !PQQQw,,11111111 !JKKKBFF7C(((( !;<<<BFF6:::: !OPPPs    3	33c                 2    | j         pi }i d| j        id|iS )zGet the identifying parameters.r-   r,   )r,   r-   )rM   _model_kwargss     r"   _identifying_paramszGradientLLM._identifying_params   s8     )/R
!4#89
}-
 	
r!   c                     dS )zReturn type of llm.gradientr    )rM   s    r"   	_llm_typezGradientLLM._llm_type   s	     zr!   inputskwargsc                 R   | j         pi }i ||}|                    dd          }t          | j         d| j         dd| j         | j         dddt          |t          d |D                       n&t          d	 t          ||          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              3      K   | ]}d |iV  	dS )rV   Nr    ).0inputs     r"   	<genexpr>z=GradientLLM._kwargs_post_fine_tune_request.<locals>.<genexpr>   s?         " %e     r!   c              3   *   K   | ]\  }}|d |idV  dS )
multiplier)rV   fineTuningParametersNr    )rb   rc   rf   s      r"   rd   z=GradientLLM._kwargs_post_fine_tune_request.<locals>.<genexpr>   sP         .E: ', ,j5      r!   )samplesurlheadersjson)	r,   rL   dictr-   r)   r+   r*   tuplezip)rM   rV   rW   rQ   _paramsrZ   s         r"   _kwargs_post_fine_tune_requestz*GradientLLM._kwargs_post_fine_tune_request   s    )/R-]-f-kk-66(KK$-KKK!G4+E!G!G.2.H+J, 2	   #*    &,	         25V[1I1I      
 
 
 	
r!   promptc                 N   | j         pi }i ||}t          | j         d| j         dd| j         | j         dddt          ||                    dd          |                    dd          |                    d	d          |                    d
d                              S )rY   r[   z	/completer\   r]   r^   rD   Nr@   rC   rB   )querymaxGeneratedTokenCountr@   topKtopPri   )r,   rm   r-   r)   r+   r*   rL   )rM   rr   rW   rQ   rp   s        r"   _kwargs_post_requestz GradientLLM._kwargs_post_request   s     )/R-]-f-(JJ$-JJJ!G4+E!G!G.2.H+J, 2	  '.{{3NPT'U'U#KKt<<[[$//[[$//  
 
 
 	
r!   stoprun_managerc                 \   	 t          j        di |                     ||          }|j        dk    rt	          d|j         d|j                   n.# t           j        j        $ r}t	          d|           d}~ww xY w|                                d         }|t          ||          }|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postrx   status_coderI   text
exceptionsRequestExceptionrl   r   )rM   rr   ry   rz   rW   responseer   s           r"   _callzGradientLLM._call   s     	V}QQt'@'@'P'PQQH#s**?+? ?/7}? ?   +
 "3 	V 	V 	VTQRTTUUU	V }}01&tT22D   AA A=&A88A=c           	        K   | j         st          j                    4 d{V } |j        di |                     ||          4 d{V 	 }|j        dk    rt          d|j         d|j                   |                                 d{V d         }ddd          d{V  n# 1 d{V swxY w Y   ddd          d{V  n# 1 d{V swxY w Y   n | j         j        di |                     ||          4 d{V 	 }|j        dk    rt          d|j         d|j                   |                                 d{V d         }ddd          d{V  n# 1 d{V swxY w Y   |t          ||          }|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)rr   rW   r|   r}   r~   r   r    )
r.   aiohttpClientSessionr   rx   statusrI   r   rl   r   )rM   rr   ry   rz   rW   sessionr   r   s           r"   _acallzGradientLLM._acall  s        	B,.. 	F 	F 	F 	F 	F 	F 	F''7<  //vf/MM  F F F F F F F F#--'B'B B2:-B B   #+--//1111113DEDF F F F F F F F F F F F F F F F F F F F F F F F F F F	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F ,t+  ++6&+II  B B B B B B B B?c))#>#?> >.6m> >   'mmoo------/@AB B B B B B B B B B B B B B B B B B B B B B B B B B B &tT22DsI   )CAB*C*
B4	4C7B4	8C
CCAE**
E47E4promptsc                     dt           dt          t                   f fd}t          |          dk    rt	          t          ||                    }net          t          dt          |                              5 }t	          |                    ||                    }ddd           n# 1 swxY w Y   t          |          S )*Run the LLM on the given prompt and input.rr   r5   c           	      D    t           j        d| d          gS )N)rr   ry   rz   r   r    )r   r   )rr   rW   rz   rM   ry   s    r"   _inner_generatez.GradientLLM._generate.<locals>._inner_generate=  sI    # %Dk MS    r!   rA      Ngenerations)	strr   r   rJ   listmapr   minr   )rM   r   ry   rz   rW   r   r   ps   ` ```   r"   	_generatezGradientLLM._generate3  s    	C 	D,< 	 	 	 	 	 	 	 	 	 w<<1s?G<<==KK#C3w<<$8$899 DQ"155'#B#BCCD D D D D D D D D D D D D D D [1111s   $B22B69B6c                     K   g }t          j         fd|D               d{V D ]&}|                    t          |          g           't	          |          S )r   c                 2    g | ]} j         |fd S ))ry   rz   )r   )rb   rr   rW   rz   rM   ry   s     r"   
<listcomp>z*GradientLLM._agenerate.<locals>.<listcomp>X  sD        FQ;QQ&QQ  r!   Nr   r   )asynciogatherappendr   r   )rM   r   ry   rz   rW   r   
generations   ` ```  r"   
_ageneratezGradientLLM._agenerateN  s        '      %  !
 
 
 
 
 
 
 	> 	>J 

 ; ; ;<====[1111r!   c                 j   	 t          j        di |                     ||          }|j        dk    rt	          d|j         d|j                   n.# t           j        j        $ r}t	          d|           d }~ww xY w|                                }|d         |d         z  }t          |          S )	Nr|   r}   r~   r   sumLossnumberOfTrainableTokensr   r    )
r   r   rq   r   rI   r   r   r   rl   r   )rM   rV   rW   r   r   response_jsonr   s          r"   train_unsupervisedzGradientLLM.train_unsupervised`  s    

	V}  55ffEE H #s**?+? ?/7}? ?   +
 "3 	V 	V 	VTQRTTUUU	V !Y'-8Q*RR%%%%r   c           	      >  K   | j         st          j                    4 d {V } |j        di |                     ||          4 d {V 	 }|j        dk    rt          d|j         d|j                   |                                 d {V }|d         |d         z  }d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  n# 1 d {V swxY w Y   n | j         j        di |                     ||          4 d {V 	 }|j        dk    rt          d|j         d|j                   |                                 d {V }|d         |d         z  }d d d           d {V  n# 1 d {V swxY w Y   t          |          S )Nr|   r}   r~   r   r   r   r    )
r.   r   r   r   rq   r   rI   r   rl   r   )rM   rV   rW   r   r   r   r   s          r"   atrain_unsupervisedzGradientLLM.atrain_unsupervisedu  s     
  	,..       ''7<  99&&II         #--'B'B B2:-B B   +3--//$9$9$9$9$9$9M%i0'(ABC                                                      ,t+  55ffEE         ?c))#>#?> >.6m> >   '/mmoo 5 5 5 5 5 5!),}=V/WW                            %%%%sI   (CAB4"C4
B>	>CB>	C
C!$C!AE>>
FF)NN),r   r   r   r   r   r)   r   r   r*   r   r+   r,   rm   r-   r.   r   r   r   model_configr   classmethodr   r   r;   r   rO   propertyr   rR   rU   r	   rq   rx   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r$   r$      s#         6 EA666Hc666;+/8C=///*+/8C=///
 $(L(4.'''19c99926J./666I :  L
 _(###$ 3    [ $# _'""""4 " " " #""H 
WS#X%6 
 
 
 X
 3    X-
sm-
-4S#X->-
	c	-
 -
 -
 -
^

#*38#4
	c	
 
 
 
F %):>	     tCy!  67	 
   
       J %)?C	* ** tCy!* ;<	*
 * 
* * * *^ %):>	2 2c2 tCy!2 67	2
 2 
2 2 2 2< %)?C	2 2c2 tCy!2 ;<	2
 2 
2 2 2 2$&& & 
	& & & &*"&"& "& 
	"& "& "& "& "& "&r!   r$   )"r   rG   concurrent.futuresr   typingr   r   r   r   r   r	   r
   r   r   langchain_core.callbacksr   r   #langchain_core.language_models.llmsr   langchain_core.outputsr   r   langchain_core.utilsr   pydanticr   r   r   typing_extensionsr   langchain_community.llms.utilsr   r   r$   r    r!   r"   <module>r      s     1 1 1 1 1 1 J J J J J J J J J J J J J J J J J J          8 7 7 7 7 7 8 8 8 8 8 8 8 8 5 5 5 5 5 5 7 7 7 7 7 7 7 7 7 7 " " " " " " > > > > > >    )   |& |& |& |& |&' |& |& |& |& |&r!   