
    7|hCL                       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Z1d"dZ2d"dZ3	 	 	 d#	 	 	 	 	 	 	 	 	 	 	 	 	 d$dZ4	 	 d%	 	 	 	 	 	 	 	 	 	 	 d&d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  d!e6e             Z9y)'    )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)ImageNc                
    d| v S )z/Return True if the model name is a Codey model.code 
model_names    `/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/vertexai.pyis_codey_modelr,   *   s    Z    c                    | duxr d| v S )z0Return True if the model name is a Gemini model.Ngeminir(   r)   s    r+   is_gemini_modelr0   /   s    T!<h*&<<r-   VertexAIc                ^     t         |      }|	 d	 	 	 	 	 	 	 d fd       } |||fi |S )*Use tenacity to retry the completion call.run_managerc                    |rj                   j                  | |      S r  j                   j                  | d   fi |S  j                   j                  | d   fi |S )N)streamgeneration_configr   )clientgenerate_contentpredict_streamingpredict)prompt	is_geminikwargsllmr7   s      r+   _completion_with_retryz5completion_with_retry.<locals>._completion_with_retry?   sp     ::..v /   3szz33F1IHHH%3::%%fQi:6::r-   F)r=   List[Union[str, 'Image']]r>   boolr?   r   returnr   r   )r@   r=   r7   r>   r5   r?   retry_decoratorrA   s   ` `     r+   completion_with_retryrH   4   sZ     -SkJO=B
;)
;6:
;NQ
;	
; 
; "&)>v>>r-   c                v    K   t         |      }|	 d	 	 	 	 	 	 	 d fd       } |||fi | d{   S 7 w)r3   r4   c                   K   |r%j                   j                  | |       d {   S  j                   j                  | fi | d {   S 7 )7 w)N)r8   )r9   generate_content_asyncpredict_async)r=   r>   r?   r@   s      r+   _acompletion_with_retryz7acompletion_with_retry.<locals>._acompletion_with_retryY   s_      ::& ;    .SZZ--f???? @s!   #AA$AAAANrB   )r=   strr>   rD   r?   r   rE   r   rF   )r@   r=   r>   r5   r?   rG   rM   s   `      r+   acompletion_with_retryrO   O   sj      -SkJO',@@ $@8;@	@ @ )EfEEEEs   /979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y)_VertexAIBaser(   )protected_namespacesNOptional[str]projectzus-central1rN   location   intrequest_parallelism   max_retriesTdefaultexcludezClassVar[Optional[Executor]]task_executorOptional[List[str]]stopr*   c                T    | j                   t        |      | _         | j                   S )N)max_workers)r^   r   )clsrX   s     r+   _get_task_executorz _VertexAIBase._get_task_executorx   s(    $ 2?R SC   r-   )rV   )rX   rW   rE   r   )__name__
__module____qualname__r   model_configrT   __annotations__rU   rX   rZ   r   r^   r`   r*   classmethodrd   r(   r-   r+   rQ   rQ   f   s    26L!G]!B!Hc!8  PK@27d2SM/S $D
$9 $J$! !r-   rQ   c                  F   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%	 	 	 	 	 	 	 d&d Zy)'_VertexAICommonNz'_LanguageModel'r9   client_previewrN   r*   g        floattemperature   rW   max_output_tokensgffffff?top_p(   top_kTr[   r   credentials   nFrD   	streamingc                     y)Nvertexair(   selfs    r+   	_llm_typez_VertexAICommon._llm_type   s    r-   c                ,    t        | j                        S N)r,   r*   r{   s    r+   r,   z_VertexAICommon.is_codey_model   s    doo..r-   c                ,    t        | j                        S r   )r0   r*   r{   s    r+   _is_gemini_modelz _VertexAICommon._is_gemini_model   s    t//r-   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JT5I5IJJr-   c                    | j                   | j                  | j                  d}| j                  s(|j	                  | j
                  | j                  d       |S )N)ro   rq   candidate_count)rt   rr   )ro   rq   rw   r,   updatert   rr   )r|   paramss     r+   r   z_VertexAICommon._default_params   sU      ++!%!7!7#vv

 ""MM!ZZ!ZZ r-   c                ~    g d}|j                         D ci c]  \  }}||v s|| }}}t        di | y c c}}w )N)rT   rU   ru   r(   )itemsr   )rc   valuesallowed_paramskvr   s         r+   _try_init_vertexaiz"_VertexAICommon._try_init_vertexai   sC    ?#)<<>I41aQ.5H!Q$II Js   99c                   |xs | j                   }ddi}|j                         D ci c]  \  }}|j                  ||      | }}}i | j                  d|i|}|s| j                  r|j                  d       |S c c}}w )Nrw   r   stop_sequences)r`   r   getr   rx   pop)	r|   r`   r7   r?   r   params_mappingr   r   r   s	            r+   _prepare_paramsz_VertexAICommon._prepare_params   s     *01:@,,.I$!Q.$$Q*A-IIUD((U*:NUfUT^^JJ()	 Js   A=rE   rN   rE   rD   )rE   zDict[str, Any])r   r	   rE   None)NF)r`   r_   r7   rD   r?   r   rE   dict)re   rf   rg   r9   ri   rm   ro   rq   rr   rt   r   ru   rw   rx   propertyr}   r,   r   r   r   rj   r   r   r(   r-   r+   rl   rl      s8   #F#'+N$+OKT s OE5MNE3OONT48K8RSAsJ;It/  / / 0 0 K K     %)!  	
 
r-   rl   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	 	 	 	 	 	 	 	 	 ddZy)r1   z'Google Vertex AI large language models.z
text-bisonrN   r*   NrS   tuned_model_namec                     y)NTr(   r{   s    r+   is_lc_serializablezVertexAI.is_lc_serializable   s    r-   c                
    g dS )z*Get the namespace of the langchain object.)	langchainllmsrz   r(   )rc   s    r+   get_lc_namespacezVertexAI.get_lc_namespace   s
     10r-   c                   |j                  d      }|d   }t        |d         }| j                  |       	 ddlm}m} ddlm} ddlm} |rddlm}	 t        |      r|}
|}n|r	}
|	}n|}
|}|r)|
j                  |      |d<   |j                  |      |d	<   nC|r |
|
      |d<    ||
      |d	<   n(|
j                  |      |d<   |j                  |      |d	<   |d   r|d   dkD  rt        d      |S # t        $ r t                Y /w xY w)7Validate that the python package exists in environment.r   r*   r   )CodeGenerationModelTextGenerationModel)r   )r   )GenerativeModelr9   rm   r)   rx   rw   rv   z3Only one candidate can be generated with streaming!)r   r0   r   vertexai.language_modelsr   r    vertexai.preview.language_models"vertexai.preview.generative_modelsr   r,   get_tuned_modelfrom_pretrainedImportErrorr   
ValueError)rc   r   r   r*   r>   r   r   PreviewCodeGenerationModelPreviewTextGenerationModelr   	model_clspreview_model_clss               r+   validate_environmentzVertexAI.validate_environment   sG    "::&89L)
#F<$89	v&+	(  j)/	$>!+	$3!/	$>!#,#<#<=M#Nx +<+L+L$,'( '0J'GF8$/@J/WF+,'0'@'@'LF8$/@/P/P"0F+, +6#;?RSS  	(%'	(s   B%C6 6DDc                    	 | j                   j                  |g      }|j                  S # t        $ r t                Y j                  S w xY w)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.
        )rm   count_tokensAttributeErrorr   total_tokens)r|   textresults      r+   get_num_tokenszVertexAI.get_num_tokens  sP    	(((55tf=F """  	(%'"""	(s   * A
Ac                    	 |j                   |j                  d}t        |j                  |      S # t        $ r d}Y $w xY w)z1Converts a stream response to a generation chunk.)
is_blockedsafety_attributesN)r   generation_info)r   r   	Exceptionr   r   )r|   responser   s      r+   _response_to_generationz VertexAI._response_to_generation.  sI    	#&11%-%?%?O HMM?SS  	#"O	#s   2 A A c           	        ||n| j                   } | j                  d||d|}g }|D ]  }	|r?t        d      }
 | j                  |	f||d|D ]  }|
|z  }
	 |j	                  |
g       Dt        | |	gf|| j                  |d|}|j	                  |j                  D cg c]  }| j                  |       c}        t        |      S c c}w )Nr`   r7    r   )r`   r5   r7   r>   r5   generationsr(   )
rx   r   r   _streamappendrH   r   
candidatesr   r   )r|   promptsr`   r5   r7   r?   should_streamr   r   r=   
generationchunkresrs                 r+   	_generatezVertexAI._generate;  s    #)"4$..%%%P4PP.0 	F,"5
)T\\!%;BH (E %'J( ""J<0+H )"33 +  "">AnnMT11!4M#	( [11 Ns   #C
c           	       K    | j                   dd|i|}g }|D ]\  }t        | |f| j                  |d| d {   }|j                  |j                  D 	cg c]  }	| j                  |	       c}	       ^ t        |      S 7 Jc c}	w w)Nr`   )r>   r5   r   r(   )r   rO   r   r   r   r   r   )
r|   r   r`   r5   r?   r   r   r=   r   r   s
             r+   
_ageneratezVertexAI._agenerate\  s      &%%:4:6: 
	F. //'	
  C :=..IQ--a0I
	 [11 Js!   9BBBB
1BBc              +     K    | j                   d|dd|}t        | |gfd| j                  |d|D ]A  }| j                  |      }|r(|j	                  |j
                  || j                         | C y w)NTr   r   )r   verboser(   )r   rH   r   r   on_llm_new_tokenr   r   )r|   r=   r`   r5   r?   r   stream_respr   s           r+   r   zVertexAI._streamr  s      &%%G4GG0H
 ++#
 
 	K 00=E,,JJ LL - 
 K	s   A7A9r   )rE   	List[str]r   r	   rE   r	   )r   rN   rE   rW   )r   r#   rE   r   )NNN)r   r   r`   r_   r5   "Optional[CallbackManagerForLLMRun]r7   zOptional[bool]r?   r   rE   r   NN
r   r   r`   r_   r5   'Optional[AsyncCallbackManagerForLLMRun]r?   r   rE   r   )
r=   rN   r`   r_   r5   r   r?   r   rE   zIterator[GenerationChunk])re   rf   rg   __doc__r*   ri   r   rj   r   r   r   r   r   r   r   r   r   r(   r-   r+   r1   r1      s?    2"J"5&*m*D  1 1 5 5n#$T.T	T  %):>!%22 "2 8	2
 2 2 
2H %)?C	22 "2 =	2
 2 
22 %):>	 " 8	
  
#r-   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y) VertexAIModelGardenz-Vertex AI Model Garden large language models.Nz'PredictionServiceClient'r9   z'PredictionServiceAsyncClient'async_clientrN   endpoint_idr_   allowed_model_argsr=   
prompt_arggenerated_textrS   
result_argc                    	 ddl m} ddlm}m} |d   st        d       |d    d      }t        d	
      } ||      |d<    ||      |d<   |S # t
        $ r t                Y \w xY w)r   r   )ClientOptionsr   rT   zBA GCP project should be provided to run inference on Model Garden!rU   z-aiplatform.googleapis.com)api_endpointzvertex-ai-model-garden)module)client_optionsclient_infor9   r   )	google.api_core.client_optionsr   google.cloud.aiplatform.gapicr   r   r   r   r   r   )rc   r   r   r   r   r   r   s          r+   r   z(VertexAIModelGarden.validate_environment  s    	(D i T  '":.//IJ
 &-EF2){
x ">){"
~ %  	(%'	(s   A A-,A-c                z    | j                   j                  | j                  | j                  | j                        S )N)rT   rU   endpoint)r9   endpoint_pathrT   rU   r   r{   s    r+   r   z!VertexAIModelGarden.endpoint_path  s5    {{((LL]]%% ) 
 	
r-   c                     y)Nvertexai_model_gardenr(   r{   s    r+   r}   zVertexAIModelGarden._llm_type  s    &r-   c                   	 ddl m} ddlm} g }|D ]c  }| j
                  r3|j                         D ci c]  \  }}|| j
                  v s|| }	}}ni }	||	| j                  <   |j                  |	       e |D 
cg c]  }
|j                  |
 |              }}
|S # t        $ r t	        d      w xY wc c}}w c c}
w )Nr   )json_formatr!   zIprotobuf package not found, please install it with `pip install protobuf`)
google.protobufr   google.protobuf.struct_pb2r"   r   r   r   r   r   	ParseDict)r|   r   r?   r   r"   	instancesr=   r   r   instanceinstance_dictpredict_instancess               r+   _prepare_requestz$VertexAIModelGarden._prepare_request  s    	38 	 	'F&&%+\\^!QqD<S<S7SAqD  (.HT__%X&	' PY
>KK!!-9
 
 ! '  	* 	
s   B B6B6<B<B3c                     | j                   |fi |}| j                  j                  | j                  |      }| j	                  |      S )*Run the LLM on the given prompt and input.r   r   )r  r9   r<   r   _parse_responser|   r   r`   r5   r?   r   r   s          r+   r   zVertexAIModelGarden._generate  sK     *D))'<V<	;;&&0B0Bi&X##H--r-   c                    g }|j                   D ]:  }|j                  |D cg c]  }t        | j                  |             c}       < t	        |      S c c}w )Nr   r   )predictionsr   r   _parse_predictionr   )r|   r  r   r   
predictions        r+   r  z#VertexAIModelGarden._parse_response  sd    .0!-- 	F '-" D$:$::$FG	 [11s   "A
c                   t        |t              r|S | j                  r	 || j                     S |S # t        $ rP t        |t              r'd| j                   dt	        |       d}t        |      t        | j                   d      w xY w)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!)
isinstancerN   r   KeyErrortyper   )r|   r
  
error_descs      r+   r	  z%VertexAIModelGarden._parse_prediction  s    j#&??X!$//22   Xj#.E??++I
+, -**  %Z00$'88U%VWWXs
   1 AB
c                   K    | j                   |fi |}| j                  j                  | j                  |       d{   }| j	                  |      S 7 w)r  r  N)r  r   r<   r   r  r  s          r+   r   zVertexAIModelGarden._agenerate  sb      *D))'<V<	**22''9 3 
 
 ##H--
s   >A AAr   r   )r   r   r?   r   rE   zList['Value']r   )
r   r   r`   r_   r5   r   r?   r   rE   r   )r  z'Prediction'rE   r   )r
  r   rE   rN   r   )re   rf   rg   r   r9   ri   r   r   r   r   r   r   r   r   r}   r  r   r  r	  r   r(   r-   r+   r   r     s"    8 	 %  	 0  >.2+26J 0J0OO 8 
 
 ' '!8 %):>	
.
. "
. 8	
.
 
. 

.	22 %)?C	.. ". =	.
 . 
.r-   r   )r*   rN   rE   rD   )FFN)r@   r1   r=   rC   r7   rD   r>   rD   r5   r   r?   r   rE   r   )FN)r@   r1   r=   rN   r>   rD   r5   r   r?   r   rE   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,   r0   rH   rO   rQ   rl   r1   r   r(   r-   r+   <module>r     s   " ; V V V 6 8 I I ) 1 1   :0 9  #  
= 6:?	?%? ? 	?
 4? ? 	?< ;?	F	FF F 9	F
 F 	F.!I !2Lm L^ 
;
v v
vr 
F
M.- M.
M.r-   