Ë
    uPêjÖ5  ã                   óÞ   — d dl Z d dlZd dlmZ d dlmZ d dl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)Ú	Coroutine)Údatetime)ÚAnyÚFinalÚLiteral)Úverbose_logger)ÚHTTPHandlerÚget_async_httpx_client)Úget_vertex_base_url)Ú	VertexLLM)ÚOpenAIFineTuningHyperparameters)ÚFineTuningJobCreate)ÚVERTEX_CREDENTIALS_TYPESÚFineTuneHyperparametersÚFineTuneJobCreateÚFineTunesupervisedTuningSpecÚResponseSupervisedTuningSpecÚResponseTuningJob)ÚLiteLLMFineTuningJobc                   óN  ‡ — e Zd ZdZdˆ fd„Zdefd„Zi dfdeded	edz  de	fd
„Z
i dfdeded	edz  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dz  dedz  dedz  dedz  deej.                  z  d	edz  dedz  deeeeef   z  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    €úo/home/oem/CyberBrain26-unified/.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'   sh   € ð	Ø%-§\¡\°,ÀÓ%CÒ%IÀrˆOÜ*2×*@Ñ*@À×AXÑAXÐY\Ð^fÓAgÓ*hÐ ä #Ð$8×$BÑ$BÓ$DÓ Eˆ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›   € ô )EØ!<×!JÑ!Jô)
Ðð '×6Ò6Ø;V×;fÑ;fÐ"Ð#7Ñ8à)-×)iÑ)iØ(CØØ%=ð *jó *
Ðñ #¤sÐ+BÓ'CÀaÒ'GØ8OÐ"Ð#4Ñ5ä0Ø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_hyperparametersV   s‰   € ð 'B×&QÑ&QÐÜ)@Ó)BÐÙØ#×,Ò,Ü9<Ð=Q×=ZÑ=ZÓ9[Ð'¨Ñ6Ø#×<Ò<ÜFKØ(×AÑAóGÐ'Ð(BÑCð  8×;Ñ;¸NÈDÓQˆÙØ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Ú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_hyperparametersr   )r$   r(   rk   r5   Ú_supervisedTuningSpecÚtraining_uris         r&   Ú+convert_vertex_response_to_open_ai_responsez?VertexFineTuningAPI.convert_vertex_response_to_open_ai_responsel   s¬  € ØgoˆØ�GÑÐ 3Ò3ØˆFØ�GÑÐ 5Ò5Ø ˆFØ�GÑÐ 2Ò2ØˆFØ�GÑÐ 5Ò5Ø ˆFØ�GÑÐ 3Ò3ØˆFà ×<Ñ<¸XÓFˆ
àEMÇ\Á\ÐRhÐjnÓEoÒEuÐsuÐØ#8×#<Ñ#<Ð=QÐSUÓ#VÒ#\ÐZ\ˆÜ#ò 
Ø�|‰|˜F BÓ'Ò-¨2øð
á!ð
ð &Ÿ\™\Ð*AÀ2ÔFð
ñ ð	
ð
 !×KÑKØ(=×(AÑ(AÐBSÔUlÓUnÓ(oÒ(uÐsuð Lô ð
ð —,‘,˜{¨BÓ/Ò5°2øð
ñ %ð
ñ ð
ñ ð
ñ ð
ñ ð
ñ  ð
ñ 'ð
ñ  !ð!
ñ" "ð#
ñ$ ð%
ð 	
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:   € ô 8<Ð<SÓ7TÐ'Ü.ñ 
Ø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)Nú5about to create fine tuning job: %s, request_data: %sé   )Úindentú7VertexAI 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ž   sU  è ø€ ð!	Ü× Ñ ØGØÜ—
‘
˜<°Ô2ôð
 ×!Ñ!Ð)Ü Ð!ZÓ[Ð[Ø$(×$6Ñ$6×$;Ñ$;ØØ#Ø!ð %<ó %÷ ˆHð ×#Ñ# sÒ*ÜØCÀH×DXÑDXÐCYÐYeÐfn×fsÑfsÐetÐuóð ô × Ñ Ð!QÐS[×S`ÑS`ÓSbÔcä%6ñ &Ø—-‘-“/ñ&ˆOô × Ñ Ð!5°ÔGØ&*×&VÑ&VÐWfÓ&gÐØ#Ð#ð'ùô* ò 	Ü× Ñ Ð!IÈ1ÔMÜ$-×$8Ñ$8Ó$:ˆNÜ× Ñ  Ô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©	rF   Úauth_headerÚgemini_api_keyr™   r—   r˜   Ústreamr    rš   úBearer úapplication/json©ÚAuthorizationzContent-Typer=   ú/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•   r	   ÚhttpxÚTimeoutr‹   rŒ   r2   r�   r‚   r   rs   )r$   r–   r7   r—   r˜   r™   rš   r   r9   r8   Ú_auth_headerr¢   Ú_ry   rJ   Úbase_urlrx   Úsync_handlerr(   r‘   r’   s                        r&   Úcreate_fine_tuning_jobz*VertexFineTuningAPI.create_fine_tuning_jobÇ   så  € ô 	×ÑÐAÐC^Ô_Ø'+×'@Ñ'@Ø*Ø%Ø 0ð (Aó (
Ñ$ˆ�nð ×0Ñ0ØØ$ØØ1Ø)Ø+ØØ 0Øð 1ó 

‰ˆ�Qð  ' { mÐ4Ø.ñ
ˆð
  $×DÑDØ(CØØ%=Ò%CÀð  Eó  
ˆô .¨oÓ>ˆØ$, :¨]¸>Ð:JÈ+ÐVeÐUfÐfqÐ!rˆØ˜ÑØ×/Ñ/Ø /ØØ*ð 0ó ð ô
 *´%·-±-ÈÐWZÔ2[Ô\ˆä×ÑØCØØô	
ð
 '×+Ñ+ØØØð ,ó 
ˆð ×Ñ 3Ò&ÜØ?À×@TÑ@TÐ?UÐUaÐbj×boÑboÐapÐqóð ô 	×ÑÐMÈxÏ}É}ËÔ_Ü!2ñ "
Ø�m‰m‹oñ"
ˆô 	×ÑÐ1°?ÔCØ"&×"RÑ"RÐSbÓ"cÐØÐr'   Úrequest_routec              ƒ   óÌ  K  — | j                  ||d¬«      ƒ d {  –—† \  }}| j                  d|d |||ddd¬«	      \  }}d|› �ddœ}	t        |«      }
d }|d	k(  r|
› d
|› d|› d	�}nwd|v rd|v r|
› d
|› d|› d	|› �}nad|v sd|v sd|v sd|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 �ŒE7 ŒM­w)Nrœ   r�   r+   Fr¡   r¥   r¦   r§   r«   r©   rª   z/tuningJobs/ÚcancelÚgenerateContentÚpredictz/batchPredictionJobsÚcountTokensÚcachedContentsrF   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Œ   r2   r�   r‚   )r$   rz   r—   r˜   r™   r¶   r±   r¢   r²   ry   r³   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Ø.ñ
ˆô
 .¨oÓ>ˆàˆØ˜MÒ)Ø�J˜m¨NÐ+;¸;ÀÐFWÐWbÐc‰CØ˜}Ñ,°¸]Ñ1JØ�J˜m¨NÐ+;¸;ÀÐFWÐWbÐcpÐbqÐr‰Cà Ñ.Ø˜MÑ)Ø%¨Ñ6Ø Ñ-à�J˜m¨NÐ+;¸;ÀÐFWÐXeÐWfÐg‰CØ Ñ.Ø(×,Ñ,¨WÓ5ˆFØÐ!Ð&BÈ&Ñ&Pà Ð/¨{¸?Ð:KÐKeÐflÐemÐnð ˜WÑ%ð �JÐ0°Ð0@ÀÈOÐK\Ð]jÐ\kÐl‰CäÐDÀ]ÀOÐTÓUÐUØ×ÑÐ%ÜÐVÓWÐWà $× 2Ñ 2× 7Ñ 7ØØØð !8ó !
÷ 
ˆð ×Ñ 3Ò&ÜØ?À×@TÑ@TÐ?UÐUaÐbj×boÑboÐapÐqóð ð  (Ÿ}™}›ˆØÐð{(
ùðb
ús#   ‚E$šE›C9E$ÄE"ÄAE$Å"E$)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r6   r   ru   r   rK   r   rD   r   rs   r   rp   Ústrr•   Úboolr   rR   r¯   r°   r   r   rµ   rÀ   Ú__classcell__)r%   s   @r&   r   r      sÀ  ø„ ñõ
ð	Ð4Eó 	ð *,Ø"ñ	"à%8ð"ð #'ð"ð �t‘ð	"ð
 
ó"ðN *,Ø"ñ	'à%8ð'ð #'ð'ð �t‘ð	'ð
 
!ó'ð,$
ÐDUð $
ÐZnó $
ðL

Ø'>ð

à	(ó

ð'àð'ð ð'ð (ó	'ðd #Ø02ñK àðK ð &9ðK ð ˜d™
ð	K ð
 ˜t™ðK ð 5°tÑ;ðK ð ˜‘*ðK ð ˜Ÿ™Ñ&ðK ð �t‘ðK ð #'¨¡+ðK ð 
 	¨#¨sÐ4HÐ*HÑ IÑ	IóK ðZEàðEð ðEð ð	Eð
  ðEð ÷Er'   r   )"r‚   r�   Úcollections.abcr   r   Útypingr   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   ro   r'   r&   ú<module>rÒ      sL   ðÛ Û Ý %Ý ß &Ñ &ã ã Ý +ß VÝ CÝ VÝ EÝ 9÷÷ õ 5ô~˜)õ ~r'   