
    NgCL                        d dl mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
mZ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mZmZ d d
lm Z m!Z!m"Z"m#Z# er"d dl$m%Z%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z,m-Z- d dl.m/Z/ dZ0dZ1d1dZ2d1dZ3	 	 	 d2d3d"Z4	 	 d4d5d$Z5 G d% d&e          Z6 G d' d(e6          Z7 ed)d*d+,           G d- de7e                      Z8 ed)d*d.,           G d/ d0e6e                      Z9dS )6    )annotations)ExecutorThreadPoolExecutor)TYPE_CHECKINGAnyClassVarDictIteratorListOptionalUnion)
deprecated)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseLLM)
GenerationGenerationChunk	LLMResult)pre_init)	BaseModel
ConfigDictField)create_retry_decoratorget_client_infoinit_vertexairaise_vertex_import_errorPredictionServiceAsyncClientPredictionServiceClient)
PredictionValue)TextGenerationResponse_LanguageModel)ImageN
model_namestrreturnboolc                
    d| v S )z/Return True if the model name is a Codey model.code r&   s    ]/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/llms/vertexai.pyis_codey_modelr/   *   s    Z    c                    | duod| v S )z0Return True if the model name is a Gemini model.Ngeminir,   r-   s    r.   is_gemini_modelr3   /   s    T!<h*&<<r0   FllmVertexAIpromptList[Union[str, 'Image']]stream	is_geminirun_manager"Optional[CallbackManagerForLLMRun]kwargsr   c                ^     t           |          }|	 dd fd
            } |||fi |S )*Use tenacity to retry the completion call.r:   Fr6   r7   r9   r)   r<   r   r(   c                    |rj                             | |          S r j         j        | d         fi |S  j         j        | d         fi |S )N)r8   generation_configr   )clientgenerate_contentpredict_streamingpredict)r6   r9   r<   r4   r8   s      r.   _completion_with_retryz5completion_with_retry.<locals>._completion_with_retry?   s      	;:..v /     I3sz3F1IHHHHH%3:%fQi::6:::r0   F)r6   r7   r9   r)   r<   r   r(   r   r   )r4   r6   r8   r9   r:   r<   retry_decoratorrF   s   ` `     r.   completion_with_retryrJ   4   sj     -SkJJJO=B
; 
; 
; 
; 
; 
; 
; _
; "!&)>>v>>>r0   'Optional[AsyncCallbackManagerForLLMRun]c                j    K   t           |          }|	 dd fd
            } |||fi | d{V S )r>   r?   Fr6   r'   r9   r)   r<   r   r(   c                   K   |r"j                             | |           d {V S  j         j        | fi | d {V S )N)rA   )rB   generate_content_asyncpredict_async)r6   r9   r<   r4   s      r.   _acompletion_with_retryz7acompletion_with_retry.<locals>._acompletion_with_retryY   s        	::& ;          .SZ-f???????????r0   NrG   )r6   r'   r9   r)   r<   r   r(   r   rH   )r4   r6   r9   r:   r<   rI   rP   s   `      r.   acompletion_with_retryrQ   O   s       -SkJJJO',@ @ @ @ @ @ _@ )(EEfEEEEEEEEEr0   c                      e Zd ZU  ed          ZdZded<   	 dZded<   	 d	Zd
ed<   	 	 dZ	d
ed<   	  e
dd          Zded<   dZded<   	 dZded<   	 eddd            ZdS )_VertexAIBaser,   )protected_namespacesNOptional[str]projectzus-central1r'   location   intrequest_parallelism   max_retriesTdefaultexcludezClassVar[Optional[Executor]]task_executorOptional[List[str]]stopr&   r(   r   c                H    | j         t          |          | _         | j         S )N)max_workers)r`   r   )clsrZ   s     r.   _get_task_executorz _VertexAIBase._get_task_executorx   s(    $ 2?R S S SC  r0   )rX   )rZ   rY   r(   r   )__name__
__module____qualname__r   model_configrV   __annotations__rW   rZ   r\   r   r`   rb   r&   classmethodrf   r,   r0   r.   rS   rS   f   s         :2666L!G!!!!B!H!!!!8     PK@27%d2S2S2SMSSSS $D$$$$9 $J$$$$! ! ! ! [! ! !r0   rS   c                  d   e Zd ZU dZded<   dZded<   ded<   	 dZded	<   	 d
Zded<   	 dZded<   	 	 dZ	ded<   	 	  e
dd          Zded<   	 	 	 dZded<   	 dZded<   	 ed+d            Zed,d            Zed,d            Zed-d            Zed-d             Zed.d$            Z	 	 d/d0d*ZdS )1_VertexAICommonNz'_LanguageModel'rB   client_previewr'   r&   g        floattemperature   rY   max_output_tokensgffffff?top_p(   top_kTr]   r   credentials   nFr)   	streamingr(   c                    dS )Nvertexair,   selfs    r.   	_llm_typez_VertexAICommon._llm_type   s    zr0   c                *    t          | j                  S N)r/   r&   r}   s    r.   r/   z_VertexAICommon.is_codey_model   s    do...r0   c                *    t          | j                  S r   )r3   r&   r}   s    r.   _is_gemini_modelz _VertexAICommon._is_gemini_model   s    t///r0   Dict[str, Any]c                &    i d| j         i| j        S )z Gets the identifying parameters.r&   )r&   _default_paramsr}   s    r.   _identifying_paramsz#_VertexAICommon._identifying_params   s     K<1JT5IJJr0   c                    | j         | j        | j        d}| j        s"|                    | j        | j        d           |S )N)rq   rs   candidate_count)rv   rt   )rq   rs   ry   r/   updaterv   rt   )r~   paramss     r.   r   z_VertexAICommon._default_params   s_      +!%!7#v
 

 " 	MM!Z!Z    r0   valuesr	   Nonec                h    g dfd|                                 D             }t          di | d S )N)rV   rW   rw   c                $    i | ]\  }}|v 	||S r,   r,   ).0kvallowed_paramss      r.   
<dictcomp>z6_VertexAICommon._try_init_vertexai.<locals>.<dictcomp>   s)    III41aQ.5H5H!Q5H5H5Hr0   r,   )itemsr   )re   r   r   r   s      @r.   _try_init_vertexaiz"_VertexAICommon._try_init_vertexai   sH    ???IIII6<<>>IIItr0   rb   ra   r8   r<   dictc                    |p| j         }ddifd|                                D             }i | j        d|i|}|s| j        r|                    d           |S )Nry   r   c                D    i | ]\  }}                     ||          |S r,   )get)r   r   r   params_mappings      r.   r   z3_VertexAICommon._prepare_params.<locals>.<dictcomp>   s/    III$!Q.$$Q**AIIIr0   stop_sequences)rb   r   r   rz   pop)r~   rb   r8   r<   r   r   r   s         @r.   _prepare_paramsz_VertexAICommon._prepare_params   s     *01IIII&,,..IIIUD(U*:NUUfU 	*T^ 	*JJ()))r0   r(   r'   r(   r)   )r(   r   )r   r	   r(   r   )NF)rb   ra   r8   r)   r<   r   r(   r   )rg   rh   ri   rB   rk   ro   rq   rs   rt   rv   r   rw   ry   rz   propertyr   r/   r   r   r   rl   r   r   r,   r0   r.   rn   rn      s        #F####'+N++++OOOKT     OEMNEOOOOONuT4888K8888RSAJJJJ;I/   X / / / X/ 0 0 0 X0 K K K XK    X    [ %)      r0   rn   z0.0.12z1.0z"langchain_google_vertexai.VertexAI)sinceremovalalternative_importc                      e Zd ZU dZdZded<   	 dZded<   	 ed'd
            Zed(d            Z	e
d)d            Zd*dZd+dZ	 	 	 d,d-d!Z	 	 d.d/d#Z	 	 d.d0d&ZdS )1r5   z'Google Vertex AI large language models.z
text-bisonr'   r&   NrU   tuned_model_namer(   r)   c                    dS )NTr,   r}   s    r.   is_lc_serializablezVertexAI.is_lc_serializable   s    tr0   	List[str]c                
    g dS )z*Get the namespace of the langchain object.)	langchainllmsr|   r,   )re   s    r.   get_lc_namespacezVertexAI.get_lc_namespace   s     1000r0   r   r	   c                   |                     d          }|d         }t          |d                   }|                     |           	 ddlm}m} ddlm} ddlm} |rddlm}	 t          |          r|}
|}n|r|	}
|	}n|}
|}|r1|

                    |          |d<   |
                    |          |d	<   nQ|r |
|
          |d<    ||
          |d	<   n0|
                    |          |d<   |                    |          |d	<   n# t          $ r t                       Y nw xY w|d         r|d         dk    rt          d          |S )7Validate that the python package exists in environment.r   r&   r   )CodeGenerationModelTextGenerationModel)r   )r   )GenerativeModelrB   ro   r-   rz   ry   rx   z3Only one candidate can be generated with streaming!)r   r3   r   vertexai.language_modelsr   r    vertexai.preview.language_models"vertexai.preview.generative_modelsr   r/   get_tuned_modelfrom_pretrainedImportErrorr   
ValueError)re   r   r   r&   r9   r   r   PreviewCodeGenerationModelPreviewTextGenerationModelr   	model_clspreview_model_clss               r.   validate_environmentzVertexAI.validate_environment   s.    "::&899L)
#F<$899	v&&&+	(                         j)) ?/	$>!! ?+	$3!!/	$>! #,#<#<=M#N#Nx +<+L+L$, ,'((  '0yJ'G'G'GF8$/@/@J/W/W/WF+,,'0'@'@'L'LF8$/@/P/P"0 0F+,  	( 	( 	(%'''''	( + 	T6#;??RSSSs   	B?D	 	D$#D$textrY   c                    	 | j                             |g          }n# t          $ r t                       Y nw xY w|j        S )a  Get the number of tokens present in the text.

        Useful for checking if an input will fit in a model's context window.

        Args:
            text: The string input to tokenize.

        Returns:
            The integer number of tokens in the text.
        )ro   count_tokensAttributeErrorr   total_tokens)r~   r   results      r.   get_num_tokenszVertexAI.get_num_tokens  sY    	((55tf==FF 	( 	( 	(%'''''	( ""s    99responser#   r   c                t    	 |j         |j        d}n# t          $ r d}Y nw xY wt          |j        |          S )z1Converts a stream response to a generation chunk.)
is_blockedsafety_attributesN)r   generation_info)r   r   	Exceptionr   r   )r~   r   r   s      r.   _response_to_generationz VertexAI._response_to_generation.  s\    	#&1%-%? OO  	# 	# 	#"OOO	#HM?SSSSs    !!promptsrb   ra   r:   r;   r8   Optional[bool]r<   r   r   c                h    ||n j         }  j        d||d|}g }|D ]}	|r@t          d          }
  j        |	f||d|D ]}|
|z  }
|                    |
g           Dt           |	gf| j        |d|}|                     fd|j        D                        t          |          S )	Nrb   r8    r   )rb   r:   r8   r9   r:   c                :    g | ]}                     |          S r,   r   r   rr~   s     r.   
<listcomp>z&VertexAI._generate.<locals>.<listcomp>X  s'    MMMT11!44MMMr0   generationsr,   )	rz   r   r   _streamappendrJ   r   
candidatesr   )r~   r   rb   r:   r8   r<   should_streamr   r   r6   
generationchunkress   `            r.   	_generatezVertexAI._generate;  sB    #)"4$.%%P4PPPP.0 	 	F ,"555
)T\!%; BH  ( (E %'JJ""J<0000+H )"3 +    ""MMMMcnMMM    [1111r0   rK   c                    K     j         dd|i|}g }|D ]D}t           |f j        |d| d {V }|                     fd|j        D                        Et          |          S )Nrb   )r9   r:   c                :    g | ]}                     |          S r,   r   r   s     r.   r   z'VertexAI._agenerate.<locals>.<listcomp>n  s'    IIIQ--a00IIIr0   r   r,   )r   rQ   r   r   r   r   )	r~   r   rb   r:   r<   r   r   r6   r   s	   `        r.   
_ageneratezVertexAI._agenerate\  s       &%::4:6:: 
	 
	F. /'	 
        C IIII#.III    [1111r0   r6   Iterator[GenerationChunk]c              +     K    | j         d|dd|}t          | |gfd| j        |d|D ]?}|                     |          }|r"|                    |j        || j                   |V  @d S )NTr   r   )r   verboser,   )r   rJ   r   r   on_llm_new_tokenr   r   )r~   r6   rb   r:   r<   r   stream_respr   s           r.   r   zVertexAI._streamr  s       &%G4GGGG0H
 +#
 
 
 
 	 	K 00==E ,,J L -   
 KKKK	 	r0   r   )r(   r   r   r	   r(   r	   )r   r'   r(   rY   )r   r#   r(   r   )NNN)r   r   rb   ra   r:   r;   r8   r   r<   r   r(   r   NN
r   r   rb   ra   r:   rK   r<   r   r(   r   )
r6   r'   rb   ra   r:   r;   r<   r   r(   r   )rg   rh   ri   __doc__r&   rk   r   rl   r   r   r   r   r   r   r   r   r   r,   r0   r.   r5   r5      s9         21"J""""5&*****D   [ 1 1 1 [1 5 5 5 X5n# # # #$T T T T  %):>!%2 2 2 2 2H %)?C	2 2 2 2 22 %):>	      r0   z-langchain_google_vertexai.VertexAIModelGardenc                      e Zd ZU dZdZded<   dZded<   ded<   	 dZd	ed
<   	 dZded<   dZ	ded<   	 	 e
d(d            Zed)d            Zed)d            Zd*dZ	 	 d+d,d Zd-d#Zd.d%Z	 	 d+d/d'ZdS )0VertexAIModelGardenz-Vertex AI Model Garden large language models.Nz'PredictionServiceClient'rB   z'PredictionServiceAsyncClient'async_clientr'   endpoint_idra   allowed_model_argsr6   
prompt_arggenerated_textrU   
result_argr   r	   r(   c                   	 ddl m} ddlm}m} n# t
          $ r t                       Y nw xY w|d         st          d           ||d          d          }t          d	
          } |||          |d<    |||          |d<   |S )r   r   )ClientOptionsr   rV   zBA GCP project should be provided to run inference on Model Garden!rW   z-aiplatform.googleapis.com)api_endpointzvertex-ai-model-garden)module)client_optionsclient_inforB   r   )	google.api_core.client_optionsr   google.cloud.aiplatform.gapicr   r   r   r   r   r   )re   r   r   r   r   r   r   s          r.   r   z(VertexAIModelGarden.validate_environment  s    	(DDDDDD          	( 	( 	(%'''''	( i  	T   '":.JJJ
 
 
 &-EFFF22){
 
 
x ">!=){"
 "
 "
~ s    ,,c                Z    | j                             | j        | j        | j                  S )N)rV   rW   endpoint)rB   endpoint_pathrV   rW   r   r}   s    r.   r  z!VertexAIModelGarden.endpoint_path  s1    {((L]% ) 
 
 	
r0   c                    dS )Nvertexai_model_gardenr,   r}   s    r.   r   zVertexAIModelGarden._llm_type  s    &&r0   r   r   r<   r   List['Value']c                     	 ddl m ddlm n# t          $ r t	          d          w xY wg }|D ]K} j        r! fd|                                D             }ni }|| j        <   |                    |           Lfd|D             }|S )Nr   )json_formatr!   zIprotobuf package not found, please install it with `pip install protobuf`c                .    i | ]\  }}|j         v ||S r,   )r   )r   r   r   r~   s      r.   r   z8VertexAIModelGarden._prepare_request.<locals>.<dictcomp>  s3       !QqD<S7S7SAq7S7S7Sr0   c                L    g | ] }                     |                       !S r,   )	ParseDict)r   instance_dictr"   r  s     r.   r   z8VertexAIModelGarden._prepare_request.<locals>.<listcomp>  s<     
 
 
>KK!!-99
 
 
r0   )	google.protobufr  google.protobuf.struct_pb2r"   r   r   r   r   r   )	r~   r   r<   	instancesr6   instancepredict_instancesr"   r  s	   `      @@r.   _prepare_requestz$VertexAIModelGarden._prepare_request  s   	3333338888888 	 	 	*  	
 	 	' 	'F&    %+\\^^   (.HT_%X&&&&
 
 
 
 
OX
 
 
 ! s    ,rb   r:   r;   r   c                     | j         |fi |}| j                            | j        |          }|                     |          S )*Run the LLM on the given prompt and input.r   r  )r  rB   rE   r  _parse_responser~   r   rb   r:   r<   r  r   s          r.   r   zVertexAIModelGarden._generate  sO     *D)'<<V<<	;&&0Bi&XX##H---r0   predictions'Prediction'c                ~     g }|j         D ]#}|                     fd|D                        $t          |          S )Nc                V    g | ]%}t                              |                     &S )r   )r   _parse_prediction)r   
predictionr~   s     r.   r   z7VertexAIModelGarden._parse_response.<locals>.<listcomp>  sB       " D$:$::$F$FGGG  r0   r   )r  r   r   )r~   r  r   r   s   `   r.   r  z#VertexAIModelGarden._parse_response  sp    .0!- 	 	F   &,      [1111r0   r  c                &   t          |t                    r|S | j        rr	 || j                 S # t          $ rW t          |t                    r*d| j         dt	          |           d}t          |          t          | j         d          w xY w|S )Nz+Provided non-None `result_arg` (result_arg=z). But got prediction of type zl instead of dict. Most probably, youneed to set `result_arg=None` during VertexAIModelGarden initialization.z key not found in prediction!)
isinstancer'   r   KeyErrortyper   )r~   r  
error_descs      r.   r  z%VertexAIModelGarden._parse_prediction  s    j#&& 	? 	XX!$/22 X X Xj#.. 
X*?* *
++* * *  %Z000$%V%V%VWWWX s
   - A!BrK   c                   K    | j         |fi |}| j                            | j        |           d{V }|                     |          S )r  r  N)r  r   rE   r  r  r  s          r.   r   zVertexAIModelGarden._agenerate  s{       *D)'<<V<<	*22'9 3 
 
 
 
 
 
 
 
 ##H---r0   r   r   )r   r   r<   r   r(   r  r   )
r   r   rb   ra   r:   r;   r<   r   r(   r   )r  r  r(   r   )r  r   r(   r'   r   )rg   rh   ri   r   rB   rk   r   r   r   r   r   r   r   r  r   r  r   r  r  r   r,   r0   r.   r   r     s         87 	      	      >.222226J 0J0000OO   X8 
 
 
 X
 ' ' ' X'! ! ! !8 %):>	
. 
. 
. 
. 
.	2 	2 	2 	2   2 %)?C	. . . . . . .r0   r   )r&   r'   r(   r)   )FFN)r4   r5   r6   r7   r8   r)   r9   r)   r:   r;   r<   r   r(   r   )FN)r4   r5   r6   r'   r9   r)   r:   rK   r<   r   r(   r   ):
__future__r   concurrent.futuresr   r   typingr   r   r   r	   r
   r   r   r   langchain_core._api.deprecationr    langchain_core.callbacks.managerr   r   #langchain_core.language_models.llmsr   langchain_core.outputsr   r   r   langchain_core.utilsr   pydanticr   r   r   &langchain_community.utilities.vertexair   r   r   r   r   r   r   google.cloud.aiplatform.modelsr    r  r"   )vertexai.language_models._language_modelsr#   r$   r   r%   r   stream_completion_with_retryr/   r3   rJ   rQ   rS   rn   r5   r   r,   r0   r.   <module>r/     s{   " " " " " " ; ; ; ; ; ; ; ; V V V V V V V V V V V V V V V V V V V V 6 6 6 6 6 6        8 7 7 7 7 7 I I I I I I I I I I ) ) ) ) ) ) 1 1 1 1 1 1 1 1 1 1             9        :99999000000        988888  #        
= = = = 6:? ? ? ? ?< ;?	F F F F F.! ! ! ! !I ! ! !2L L L L Lm L L L^ 
;  
v v v v v v v 
vr 
F  
M. M. M. M. M.- M. M. 
M. M. M.r0   