
    i28                         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 d dl	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 d d
lmZmZmZmZmZmZ d dlm Z   G d de      Z!y)    N)datetime)Any	CoroutineLiteralOptionalUnion)verbose_logger)HTTPHandlerget_async_httpx_client)get_vertex_base_url)	VertexLLM)OpenAIFineTuningHyperparameters)FineTuningJobCreate)VERTEX_CREDENTIALS_TYPESFineTuneHyperparametersFineTuneJobCreateFineTunesupervisedTuningSpecResponseSupervisedTuningSpecResponseTuningJob)LiteLLMFineTuningJobc                   V    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j2                  f   d	e	e   de	e   deeeeeef   f   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    {/Users/manta/Documents/Projects/TheRoad-I1/.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r8   r:   r9   r   hyperParameters)	baseModelsupervisedTuningSpectunedModelDisplayName)r   training_filevalidation_file;_transform_openai_hyperparameters_to_vertex_hyperparameterslenr   modelsuffix)r%   r8   r9   r:   supervised_tuning_spec_vertex_hyperparametersfine_tune_jobs          r'    convert_openai_request_to_vertexz4VertexFineTuningAPI.convert_openai_request_to_vertex3   s     ">!<!J!J"
 '66 ,;; #$
 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_epochsr1   rO   floatr.   )r%   r8   r9   r:   _oai_hyperparametersrJ   _adapter_sizes          r'   rE   zOVertexFineTuningAPI._transform_openai_hyperparameters_to_vertex_hyperparameters[   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t	                     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runningrA   trainingDatasetUrir,   idnamer6   fine_tuned_modelrB   finished_atrQ   r?   )vertex_hyper_parametersrG   r@   objectzfine_tuning.joborganization_idresult_filesseedr   statustrained_tokensrC   rD   estimated_finishintegrations )r7   r.   r   *_translate_vertex_response_hyperparametersr   )r%   r)   rl   r6   _supervisedTuningSpectraining_uris         r'   +convert_vertex_response_to_open_ai_responsez?VertexFineTuningAPI.convert_vertex_response_to_open_ai_responses   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(A%'>'@) ) 	 L 
 ,,{B/52
 %
 
 
 
  !
"  #
$ '%
& !'
( ")
* +
 	
r(   rg   c                 R    t        |      }t        dd|j                  dd      i|S )zT
        translate vertex responsehyperparameters to openai hyperparameters
        rR   rN   r   rp   )dictr   pop)r%   rg   _dict_remaining_hyperparameterss      r'   rq   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rz   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 %srp   )r	   debugr   dumpsr$   
ValueErrorpoststatus_coder3   textr   rt   error	traceback
format_exc)	r%   ry   rz   r{   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 
      }t        |      }| 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	rG   auth_headergemini_api_keyr   r   r   streamr   r   Bearer application/jsonAuthorizationzContent-Typer>   /v1/projects//locations//tuningJobsT)ry   rz   r{   r   g      @)r   connect)r   r}   r   r   r   r   r   r   rp   )r	   r   _ensure_access_token_get_token_and_urlrL   r   r   r
   httpxTimeoutr   r   r3   r   r   r   rt   )r%   r   r8   r   r   r   r   r   r:   r9   _auth_headerr   _rz   rK   base_urlry   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 > 
 '7%JmN3C;N__jk// /* 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}	t        |      }
d }|d	k(  r|
 d
| d| d	}nd|v rd|v r|
 d
| d| d	| }nd|v r|
 d
| d| | }nwd|v r|
 d
| d| | }nfd|v r|
 d
| d| | }nUd|v r|
 d
| d| | }nDd|v r2|j                  d      }|d|vr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 l7 Mw)Nr   r   r,   Fr   r   r   r   r   r   r   z/tuningJobs/cancelgenerateContentpredictz/batchPredictionJobscountTokenscachedContentsrG   z/publishers/google/models/z	projects/z/v1beta1/projects/z%Unsupported Vertex AI request route: r   r   r   r   r   )_ensure_access_token_asyncr   r   r.   r   r$   r   r   r3   r   r   )r%   r{   r   r   r   r   r   r   r   rz   r   r   _modelr)   response_jsons                  r'   #pass_through_vertex_ai_POST_requestz7VertexFineTuningAPI.pass_through_vertex_ai_POST_request0  s     .2-L-L*% 0 .M .
 (
$n
 00$1)+ 0 1 

Q  '{m4.

 '7M)JmN+;;FWWbcC},]1JJmN+;;FWWbcpbqrC-/JmN+;;FWXeWfgC-'JmN+;;FWXeWfgC#}4JmN+;;FWXeWfgCm+JmN+;;FWXeWfgC.!%%g.F!&B&&P  /{?:KKeflemn  J00@OK\]j\klCD]OTUU%VWW++00 1 
 
 3&?@T@T?UUabjboboapq  !}(
d
s#   FFD F;F	<AF	F)r   N)__name__
__module____qualname____doc__r    r   r7   r   rv   r   r   rL   r   rE   r   rt   r   rq   strr   boolr   r   rS   r   r   r   r   r   r   __classcell__)r&   s   @r'   r   r      s   
4E   *,!%	&%8& #'& 	&
 
&V *,!%	'%8' #'' 	'
 
!'0-
)-
	-
^

'>

	(

-- - (	-p "&35Q Q  &9Q  !	Q 
 "#Q  %%=>Q  3-Q  uemm+,Q  Q  #+4.Q  
#YsC9M/M%NN	OQ fFF F 	F
  F Fr(   r   )"r   r   r   typingr   r   r   r   r   r   r!   litellm._loggingr	   &litellm.llms.custom_httpx.http_handlerr
   r   #litellm.llms.vertex_ai.common_utilsr   @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   litellm.types.utilsr   r   rp   r(   r'   <module>r      sI       ; ;   + V C V E 9  5\) \r(   