
    g8                         d dl Z d dlZd dlmZ d dlmZmZmZ d dlZd dlm	Z	 d dl
Z
d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZmZ  G d de      Zy)    N)datetime)LiteralOptionalUnion)FineTuningJob)verbose_logger)HTTPHandlerget_async_httpx_client)	VertexLLM)OpenAIFineTuningHyperparameters)FineTuningJobCreate)FineTuneHyperparametersFineTuneJobCreateFineTunesupervisedTuningSpecResponseSupervisedTuningSpecResponseTuningJobc                   <    e Zd ZdZd fdZdefdZi dfdeded	e	e   de
fd
Zi dfdeded	e	e   defdZdedefdZdedefdZdedede
fdZdi fdedede	e   de	e   de	e   de	e   deeej0                  f   d	e	e   de	e   fdZdededededef
dZ xZS )VertexFineTuningAPIz/
    Vertex methods to support for batches
    returnNc                 z    t         |           t        t        j                  j
                  ddi      | _        y )Ntimeout     @)llm_providerparams)super__init__r
   litellmLlmProviders	VERTEX_AIasync_handler)self	__class__s    _/var/www/openai/venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/fine_tuning/handler.pyr   zVertexFineTuningAPI.__init__   s2    3 --77u%
    responsec                     	 |j                  dd      xs d}t        j                  |j                  dd            }t	        |j                               }|S # t        $ r Y yw xY w)N
createTime Zz+00:00r   )getr   fromisoformatreplaceint	timestamp	Exception)r!   r%   create_time_strcreate_time_datetime
created_ats        r#   convert_response_created_atz/VertexFineTuningAPI.convert_response_created_at$   sk    	&ll<<BO#+#9#9''X6$  1;;=>J 		s   AA 	A$#A$create_fine_tuning_job_dataoriginal_hyperparameterskwargsc                     t        |j                        }|j                  r|j                  |d<   | j                  |||      }|rt	        |      dkD  r||d<   t        |j                  ||j                        }|S )z
        convert request from OpenAI format to Vertex format
        https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning
        supervised_tuning_spec = FineTunesupervisedTuningSpec(
        )training_dataset_urivalidation_datasetr4   r6   r5   r   hyperParameters)	baseModelsupervisedTuningSpectunedModelDisplayName)r   training_filevalidation_file;_transform_openai_hyperparameters_to_vertex_hyperparameterslenr   modelsuffix)r!   r4   r5   r6   supervised_tuning_spec_vertex_hyperparametersfine_tune_jobs          r#    convert_openai_request_to_vertexz4VertexFineTuningAPI.convert_openai_request_to_vertex2   s     ">!<!J!J"
 '66+;; ##78
 LL,G)A M  	  #s+B'Ca'G8O"#45)177!7"="D"D
 r$   c                     |j                   }t               }|rH|j                  rt        |j                        |d<   |j                  rt        |j                        |d<   |j                  dd       }|r||d<   |S )Nepoch_countlearning_rate_multiplieradapter_size)hyperparametersr   n_epochsr-   rK   floatr*   )r!   r4   r5   r6   _oai_hyperparametersrF   _adapter_sizes          r#   rA   zOVertexFineTuningAPI._transform_openai_hyperparameters_to_vertex_hyperparametersZ   s      ;JJ"9";#,,9<(11:'6 $<<FK(AAG'(BC 144^TJ6C#N3&&r$   c                    d}|d   dk(  rd}|d   dk(  rd}|d   dk(  rd}|d   dk(  rd	}|d   d
k(  rd}| j                  |      }|j                  dd       xs i }|j                  dd      xs d}t        d&i d|j                  dd      xs dd|d|j                  dd      dd d| j                  |j                  di       xs i       d|j                  dd      xs ddddddg ddd |d!d d"|d#d d$d d%g S )'NqueuedstateJOB_STATE_PENDINGJOB_STATE_SUCCEEDED	succeededJOB_STATE_FAILEDfailedJOB_STATE_CANCELLED	cancelledJOB_STATE_RUNNINGrunningr=   trainingDatasetUrir(   idnamer2   fine_tuned_modelr>   finished_atrM   r;   )vertex_hyper_parametersrC   r<   objectzfine_tuning.joborganization_idresult_filesseedr   statustrained_tokensr?   r@   estimated_finishintegrations )r3   r*   r   *_translate_vertex_response_hyperparameters)r!   r%   rh   r2   _supervisedTuningSpectraining_uris         r#   +convert_vertex_response_to_open_ai_responsez?VertexFineTuningAPI.convert_vertex_response_to_open_ai_responser   s   
  	 G 33FG 55 FG 22FG 55 FG 33F55h?
 LL/6<" 	 2556JBOUSU 
||FB'-2
!
 &\\*A2F
 	

 !KK(=(A(ABSUW(X ) L 
 ,,{B/52
 %
 
 
 
 
  
  '!
" !#
$ "%
& '
 	
r$   rc   c                 R    t        |      }t        dd|j                  dd      i|S )zT
        translate vertex responsehyperparameters to openai hyperparameters
        rN   rJ   r   rl   )dictr   pop)r!   rc   _dict_remaining_hyperparameterss      r#   rm   z>VertexFineTuningAPI._translate_vertex_response_hyperparameters   s:     155L0M'. 
488J
-
 	
r$   fine_tuning_urlheadersrequest_datac                   K   	 t        j                  d|t        j                  |d             | j                  t        d      | j                  j                  |||       d {   }|j                  dk7  r%t        d|j                   d|j                         t        j                  d	|j                                t        di |j                         }t        j                  d
|       | j                  |      }|S 7 # t        $ rF}t        j                  d|       t        j                         }t        j                  |       |d }~ww xY ww)N5about to create fine tuning job: %s, request_data: %s   )indent7VertexAI Fine Tuning - async_handler is not initializedrv   urljson   -Error creating fine tuning job. Status code: . Response: .got response from creating fine tuning job: %svertex_response %sz&asyncerror creating fine tuning job %srl   )r   debugr   dumpsr    
ValueErrorpoststatus_coder/   textr   rp   error	traceback
format_exc)	r!   ru   rv   rw   r%   vertex_responseopen_ai_responseetrace_back_strs	            r#   acreate_fine_tuning_jobz+VertexFineTuningAPI.acreate_fine_tuning_job   s_    '	  G

<2
 !!) M  "//44#! 5  H ##s*CHDXDXCYYefnfsfsetu    @(--/ 0 --/O   !5G#OO  $#/2  	  !I1M&113N  0G		s=   EA$D	 (D)BD	 ED	 		EAEEE	_is_asyncvertex_projectvertex_locationvertex_credentialsapi_baser   c
                    t        j                  d|       | j                  ||d      \  }
}| j                  d|
d |||dd|	      \  }}d| dd	}| j	                  |||	xs i 
      }d| d| d| d}|du r| j                  |||      S t        t        j                  dd            }t        j                  d||       |j                  |||      }|j                  dk7  r%t        d|j                   d|j                         t        j                  d|j                                t        di |j                         }t        j                  d|       | j                  |      }|S )Nz"creating fine tuning job, args= %svertex_ai_betacredentials
project_idcustom_llm_providerr(   F	rC   auth_headergemini_api_keyr   r   r   streamr   r   Bearer application/jsonAuthorizationzContent-Typer:   https://'-aiplatform.googleapis.com/v1/projects//locations//tuningJobsT)ru   rv   rw   r   g      @)r   connect)r   ry   r}   r   r   r   r   r   rl   )r   r   _ensure_access_token_get_token_and_urlrH   r   r	   httpxTimeoutr   r   r/   r   r   r   rp   )r!   r   r4   r   r   r   r   r   r6   r5   _auth_headerr   _rv   rG   ru   sync_handlerr%   r   r   s                       r#   create_fine_tuning_jobz*VertexFineTuningAPI.create_fine_tuning_job   s    	02M	
 (,'@'@*% 0 (A (
$n 00$1)+ 0 1 

Q  '{m4.

 ==(C%=%C > 
 %_$55\]k\llw  yH  xI  IT  U// /* 0  
 #5==PS+TUC	

  $$ % 
 3&?@T@T?UUabjboboapq  	<hmmo	
 , 
mmo
 	1?CKK
  r$   request_routec                   K   | j                  ||d       d {   \  }}| j                  d|d |||ddd	      \  }}d| dd}	d }
|d	k(  rd
| d| d| d	}
nd|v rd|v rd
| d| d| d	| }
nd|v rd
| d| d| | }
n{d|v rd
| d| d| | }
nid|v rd
| d| d| | }
nWd|v rd
| d| d| | }
nEd|v r3|j                  d      }|d|vrd| d| d| |d<   d
| d| d| | }
nt        d|       | j                  t        d      | j                  j                  |	|
|       d {   }|j                  dk7  r%t        d|j                   d|j                         |j                         }|S 7 h7 Mw)Nr   r   r(   Fr   r   r   r   r   r   r   r   z/tuningJobs/cancelgenerateContentpredictz/batchPredictionJobscountTokenscachedContentsrC   z/publishers/google/models/z	projects/z,-aiplatform.googleapis.com/v1beta1/projects/z%Unsupported Vertex AI request route: r|   r}   r   r   r   )
_ensure_access_token_asyncr   r*   r   r    r   r   r/   r   r   )r!   rw   r   r   r   r   r   r   r   rv   r~   _modelr%   response_jsons                 r#   #pass_through_vertex_ai_POST_requestz7VertexFineTuningAPI.pass_through_vertex_ai_POST_request.  s)     .2-L-L*% 0 .M .
 (
$n
 00$1)+ 0 1 

Q  '{m4.

 M)_--TUcTddop  pA  AL  MC},]1J_--TUcTddop  pA  AL  MZ  L[  \C-/_--TUcTddop  pA  BO  AP  QC-'_--TUcTddop  pA  BO  AP  QC#}4_--TUcTddop  pA  BO  AP  QCm+_--TUcTddop  pA  BO  AP  QC.!%%g.F!&B&&P/{?:KKeflemn W% _--YZhYiit  vE  uF  GT  FU  VCD]OTUU%VWW++00 1 
 
 3&?@T@T?UUabjboboapq  !y(
`
s#   FFDF7F8AFF)r   N)__name__
__module____qualname____doc__r   r   r3   r   rr   r   r   rH   r   rA   r   rp   r   rm   strr   boolr   rO   r   r   r   r   __classcell__)r"   s   @r#   r   r      s   
4E " *,!%	&%8& #'& 	&
 
&V *,!%	'%8' #'' 	'
 
!'0+
)+
	+
Z

'>

	(

.. . (	.r "&35Q Q  &9Q  !	Q 
 "#Q  %SMQ  3-Q  uemm+,Q  Q  #+4.Q fDD D 	D
  D Dr$   r   )r   r   r   typingr   r   r   r   (openai.types.fine_tuning.fine_tuning_jobr   r   litellm._loggingr   &litellm.llms.custom_httpx.http_handlerr	   r
   @litellm.llms.vertex_ai.gemini.vertex_and_google_ai_studio_geminir   litellm.types.fine_tuningr   litellm.types.llms.openair   litellm.types.llms.vertex_air   r   r   r   r   r   rl   r$   r#   <module>r      sD       + +  B  + V V E 9 Z) Zr$   