
    h8                         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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)	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    f/var/www/Befach/backend/env/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r7   r9   r8   r   hyperParameters)	baseModelsupervisedTuningSpectunedModelDisplayName)r   training_filevalidation_file;_transform_openai_hyperparameters_to_vertex_hyperparameterslenr   modelsuffix)r$   r7   r8   r9   supervised_tuning_spec_vertex_hyperparametersfine_tune_jobs          r&    convert_openai_request_to_vertexz4VertexFineTuningAPI.convert_openai_request_to_vertex2   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_epochsr0   rN   floatr-   )r$   r7   r8   r9   _oai_hyperparametersrI   _adapter_sizes          r&   rD   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namer5   fine_tuned_modelrA   finished_atrP   r>   )vertex_hyper_parametersrF   r?   objectzfine_tuning.joborganization_idresult_filesseedr   statustrained_tokensrB   rC   estimated_finishintegrations )r6   r-   r   *_translate_vertex_response_hyperparameters)r$   r(   rk   r5   _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'   rf   c                 R    t        |      }t        dd|j                  dd      i|S )zT
        translate vertex responsehyperparameters to openai hyperparameters
        rQ   rM   r   ro   )dictr   pop)r$   rf   _dict_remaining_hyperparameterss      r&   rp   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ry   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 %sro   )r	   debugr   dumpsr#   
ValueErrorpoststatus_coder2   textr   rs   error	traceback
format_exc)	r$   rx   ry   rz   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	rF   auth_headergemini_api_keyr   r   r   streamr   r   Bearer application/jsonAuthorizationzContent-Typer=   https://'-aiplatform.googleapis.com/v1/projects//locations//tuningJobsT)rx   ry   rz   r   g      @)r   connect)r   r|   r   r   r   r   r   r   ro   )r	   r   _ensure_access_token_get_token_and_urlrK   r   r
   httpxTimeoutr   r   r2   r   r   r   rs   )r$   r   r7   r   r   r   r   r   r9   r8   _auth_headerr   _ry   rJ   rx   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cachedContentsrF   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   r2   r   r   )r$   rz   r   r   r   r   r   r   r   ry   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  _--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   r6   r   ru   r   r   rK   r   rD   r   rs   r   rp   strr   boolr   r   rR   r   r   r   r   r   r   __classcell__)r%   s   @r&   r   r      s   
4E   *,!%	&%8& #'& 	&
 
&V *,!%	'%8' #'' 	'
 
!'0+
)+
	+
Z

'>

	(

-- - (	-p "&35P P  &9P  !	P 
 "#P  %%=>P  3-P  uemm+,P  P  #+4.P  
#YsC9M/M%NN	OP dDD D 	D
  D D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.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   ro   r'   r&   <module>r      sF       ; ;   + V V E 9  5W) Wr'   