
    7|hc8                         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!y)    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<   y)TrainResultzTrain result.lossN)__name__
__module____qualname____doc__float__annotations__     c/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/gradient_ai.pyr   r      s
    
Kr!   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+y)(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                 f    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   sZ    
 +?+-D+
&' +?+-D+
&' &:&(:&
!" r!   afterc                    	 ddl }| j
                  t        | j
                        dk  rt        d      | j                  t        | j
                        dk  rt        d      | j                  r| j                  }d|j                  dd	      cxk  rd
k  st        d       t        d      d|j                  dd	      cxk  rd
k  st        d       t        d      d|j                  dd	      k\  rt        d      d|j                  dd
      k\  rt        d      | S # t        $ r t        j                  d       Y =t        $ r Y Hw xY w)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   sT   	 %%-T5O5O1PSU1UOPP%%-T5O5O1PST1TOPP""B}c27a7 !PQQ 8 !PQQw,11 !JKK 2 !JKKBFF7C(( !;<<BFF6:: !OPP;  	OOL  		s   D" "EEEc                 J    | j                   xs 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   s>     ))/R
!4#8#89
}-
 	
r!   c                      y)zReturn type of llm.gradientr    )rM   s    r"   	_llm_typezGradientLLM._llm_type   s     r!   inputskwargsc                 L   | j                   xs i }i ||}|j                  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 
 yw)rV   Nr    ).0inputs     r"   	<genexpr>z=GradientLLM._kwargs_post_fine_tune_request.<locals>.<genexpr>   s!       " %es   c              3   0   K   | ]  \  }}|d |id  yw)
multiplier)rV   fineTuningParametersNr    )rb   rc   rf   s      r"   rd   z=GradientLLM._kwargs_post_fine_tune_request.<locals>.<genexpr>   s-       .E: ', ,j5s   )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(()$--
K#*4+E+E*F!G.2.H.H-I, 2	  #*   &,	    25V[1I 
 	
r!   promptc                 T   | j                   xs i }i ||}t        | j                   d| j                   dd| j                   | j
                   dddt        ||j                  dd      |j                  dd      |j                  d	d      |j                  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#*4+E+E*F!G.2.H.H-I, 2	 '.{{3NPT'U#KKt<[[$/[[$/
 	
r!   stoprun_managerc                 d   	 t        j                  di | j                  ||      }|j                  dk7  r%t	        d|j                   d|j
                         	 |j                         d   }|t        ||      }|S # t         j                  j                  $ r}t	        d|       d}~ww xY w)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}}Qt'@'@'PQH##s*K++,Bx}}o?  + }}01&tT2D ""33 	VPQRPSTUU	Vs   AA? ?B/B**B/c           	        K   | j                   st        j                         4 d{   } |j                  di | j	                  ||      4 d{   }|j
                  dk7  r%t        d|j
                   d|j                         |j                          d{   d   }ddd      d{    ddd      d{    n | j                   j                  di | j	                  ||      4 d{   }|j
                  dk7  r%t        d|j
                   d|j                         |j                          d{   d   }ddd      d{    |t        |      }S 7 F7 7 7 # 1 d{  7  sw Y   xY w7 # 1 d{  7  sw Y   CxY w7 7 _7 N# 1 d{  7  sw Y   ^xY ww)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      ,,. 	F 	F''7<< //vf/M F F#-'S'/r(--B  #+--/13DEDF F	F 	F 	F ,t++ ++6&+I B B??c)#O#??+2hmm_>  'mmo-/@AB B &tT2D3	FF 2F F F F	F 	F 	F 	FB .B B B Bs   %F>E-F>(FE0FAE7E3 E7'F2E53F7F>F6F>9F#:F>=AF)F%F)F>F'F>0F3E75F7F		=F >F		FF>F FF F>%F)'F>)F;/F20F;7F>promptsc                 >    dt         dt        t           f fd}t        |      dk  rt	        t        ||            }nBt        t        dt        |                  5 }t	        |j                  ||            }ddd       t              S # 1 sw Y   xY w)*Run the LLM on the given prompt and input.rr   r5   c           	      F    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=  s7    # %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<=K#C3w<$89 DQ"155'#BCD [11D Ds   #BBc                    K   g }t        j                  |D cg c]  } | j                  |f||d| c}  d{   D ]  }|j                  t	        |      g         t        |      S c c}w 7 6w)r   )ry   rz   Nr   r   )asynciogatherr   appendr   r   )rM   r   ry   rz   rW   r   rr   
generations           r"   
_ageneratezGradientLLM._agenerateN  s       ' & FQ;Q&Q!
 
 	>J 

 ;<=	> [11
s   A5A.A5A37A5c                 l   	 t        j                  di | j                  ||      }|j                  dk7  r%t	        d|j                   d|j
                         	 |j                         }|d   |d   z  }t        |      S # t         j                  j                  $ r}t	        d|       d }~ww xY w)	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H ##s*K++,Bx}}o?  + !Y'-8Q*RR%% ""33 	VPQRPSTUU	Vs   AB B3 B..B3c           	        K   | j                   st        j                         4 d {   } |j                  di | j	                  ||      4 d {   }|j
                  dk7  r%t        d|j
                   d|j                         |j                          d {   }|d   |d   z  }d d d       d {    d d d       d {    n | j                   j                  di | j	                  ||      4 d {   }|j
                  dk7  r%t        d|j
                   d|j                         |j                          d {   }|d   |d   z  }d d d       d {    t              S 7 P7 (7 7 # 1 d {  7  sw Y   xY w7 # 1 d {  7  sw Y   ?xY w7 7 c7 J# 1 d {  7  sw Y   ZxY ww)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  #-'S'/r(--B  +3--/$9M%i0'(ABC     ,t++ 55ffE  ??c)#O#??+2hmm_>  '/mmo 5!),}=V/WW   %%9 %:       !6   s   %GE7G'FE:FAFE=F.F9E?:F>G	F
5G?F- GAF3F/F3G&F1'G:F=F?FF	F
F	FGF*F!F*&G/F31G3G9F<:GG)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 A6Hc6;+/8C=/*+/8C=/
 $(L(4.'19c926J../6I L
 (#$ 3   $ '""4 " #"H 
WS#X%6 
 
 3  -
sm-
-4S#X->-
	c	-
^

#*38#4
	c	
F %):>	   tCy!  67	 
   
 J %)?C	** tCy!* ;<	*
 * 
*^ %):>	2c2 tCy!2 67	2
 2 
2< %)?C	2c2 tCy!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      sS      1 J J J   8 8 5 7 7 " >) |&' |&r!   