Ë
    uPêj»û  ã                   ó¨  — U d Z ddlZddlZddlZddlmZmZmZmZm	Z	 ddl
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 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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*m+Z+m,Z,m-Z- ddl.­ ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z< da=edz  e>d<   da?edz  e>d<   ddiZ@eeAeBeBf      e>d<   deBdeBfd„ZCdefd„ZDdefd„ZEer	ddlFmGZH eHZIneZIdeBdz  deAeBeBf   dz  fd„ZJd eBdz  d!eBdz  deBdz  fd"„ZKd#eLe'   deBdz  fd$„ZMd%e0d&eBdz  d'eAeBeBf   dz  d(eAeBef   dz  de0f
d)„ZNd*eBdeOeBeBf   fd+„ZPd,eBdeQfd-„ZRd.eBdeQfd/„ZSd0edeQfd1„ZTd#eLe'   deQfd2„ZU	 	 ddd3eBd4eBdz  d5edz  deBdz  fd6„ZVdeBd&eBdz  deBfd7„ZW	 	 	 	 	 	 ded3eBd8eBdz  d'eAeBeBf   dz  d&eBdz  d(eAeBef   dz  d4eBdz  d5edz  de0fd9„ZXd:eBdeBfd;„ZYd<eBdeBfd=„ZZd>eBd?e[deBdz  fd@„Z\g fdAeLe0   d%e0dBeLeB   deQfdC„Z]dDe(de^eB   fdE„Z_	 	 	 dfd#eLe'   d&eBdz  dFeAdz  dGeBdz  deLe`   f
dH„Za e^dIdJh«      Zbee^   e>dK<   dLe1dMeAddfdN„ZcdOedz  deQfdP„ZddQe/ddfdR„ZedLe1ddfdS„Zfd#eLe'   d&eBdMeAdGedT   dFeAdUeBdz  de1fdV„ZgdWeBdz  d#eLe'   dXeBdz  d&eBdYedz  dZehejÒ                  z  dz  d[eAdz  dMeAd\eIdGedT   dFeAd4eBdz  d]eBdz  d^eBdz  de1fd_„ZjdWeBdz  d#eLe'   dXeBdz  d&eBdYedz  dZehejÒ                  z  dz  d[eAdz  dMeAd\ejÖ                  jØ                  jŽ                  dGedT   dFeAd4eBdz  d]eBdz  d^eBdz  de1fd`„Zmde-fda„ZndbeQd#eLe'   deOe3dz  eLe'   f   fdc„Zoy)gz|
Transformation logic from OpenAI format to Gemini format.

Why separate file? Make it easy to see how transformation works
é    N)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚcast)Úquote)Ú	BaseModel)Úverbose_logger)Úasyncify)Ú_get_image_mime_type_from_url)Ú _get_thought_signature_from_toolÚ/convert_generic_image_chunk_to_openai_image_objÚconvert_to_anthropic_image_objÚ"convert_to_gemini_tool_call_invokeÚ"convert_to_gemini_tool_call_resultÚresponse_schema_prompt)ÚAsyncHTTPHandlerÚHTTPHandler)Úpop_vertex_request_labels)Ú get_file_mime_type_for_file_typeÚget_file_type_from_extensionÚ is_gemini_1_5_accepted_file_type)ÚAllMessageValuesÚChatCompletionAssistantMessageÚChatCompletionAudioObjectÚChatCompletionFileObjectÚChatCompletionImageObjectÚChatCompletionTextObjectÚChatCompletionUserMessage)Ú*)ÚGenerationConfigÚPartTypeÚRequestBodyÚSafetSettingsConfigÚSystemInstructionsÚ
ToolConfigÚTools)ÚGenericImageParsingChunkÚLlmProvidersé   )Ú_check_text_in_contentÚget_supports_response_schemaÚget_supports_system_messageÚ_GCS_METADATA_VERTEX_BASEÚ_GCS_METADATA_HTTP_HANDLERz	image/jpgz
image/jpegÚ_GEMINI_MIME_TYPE_ALIASESÚ	mime_typeÚreturnc                 ó�   — | j                  dd«      d   j                  «       j                  «       }t        j	                  ||«      S )zæNormalize known MIME aliases only; does not consult the file-type registry.

    Also strips MIME parameters (e.g. ``; charset=utf-8``) so that values
    sourced from GCS object metadata (``contentType``) validate correctly.
    ú;é   r   )ÚsplitÚstripÚlowerr0   Úget)r1   Ú
normalizeds     úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/gemini/transformation.pyÚ_apply_gemini_mime_type_aliasesr<   L   s>   € ð "Ÿ™¨¨QÓ/°Ñ2×8Ñ8Ó:×@Ñ@ÓB€JÜ$×(Ñ(¨°ZÓ@Ð@ó    c                  ó4   — t         €ddlm}   | «       a t         S )zWLazily return the shared VertexBase instance to avoid a module-load-time cyclic import.r*   ©Ú
VertexBase)r.   Úvertex_llm_baser@   r?   s    r;   Ú_get_vertex_baserB   V   s   € ô !Ð(Ý0á$.£LÐ!Ü$Ð$r=   c                  ó2   — t         €t        d¬«      a t         S )Ng      @)Útimeout)r/   r   © r=   r;   Ú_get_gcs_metadata_http_handlerrF   `   s   € ä!Ð)Ü%0¸Ô%=Ð"Ü%Ð%r=   )ÚLoggingÚdetailc                 óL   — | dk(  rddiS | dk(  rddiS | dk(  rddiS | dk(  rdd	iS y )
NÚlowÚlevelÚMEDIA_RESOLUTION_LOWÚmediumÚMEDIA_RESOLUTION_MEDIUMÚhighÚMEDIA_RESOLUTION_HIGHÚ
ultra_highÚMEDIA_RESOLUTION_ULTRA_HIGHrE   )rH   s    r;   Ú(_convert_detail_to_media_resolution_enumrS   o   sV   € ð �‚ØÐ/Ð0Ð0Ø	�8Ò	ØÐ2Ð3Ð3Ø	�6Ò	ØÐ0Ð1Ð1Ø	�<Ò	ØÐ6Ð7Ð7Ør=   ÚcurrentÚ
new_detailc                 óz   — dddddœ}| r|j                  | d«      nd}|r|j                  |d«      nd}||kD  r|S | S )z‹
    Compare two media resolution values and return the highest one.
    Resolution hierarchy: ultra_high > high > medium > low > None
    é   é   r*   r5   )rQ   rO   rM   rJ   r   )r9   )rT   rU   Úresolution_priorityÚcurrent_priorityÚnew_prioritys        r;   Ú_get_highest_media_resolutionr\   }   sY   € ð
 12¸1ÈÐRSÑ!TÐÙELÐ1×5Ñ5°g¸qÔAÐRSÐÙDNÐ-×1Ñ1°*¸aÔ@ÐTU€LàÐ&Ò&ØÐØ€Nr=   Úmessagesc                 óÈ  — d}| D ]Ú  }|j                  d«      }t        |t        «      sŒ%|D ]±  }t        |t        «      sŒd}|j                  d«      dk(  r3|j                  d«      }t        |t        «      rX|j                  d«      }nF|j                  d«      dk(  r2|j                  d«      }t        |t        «      r|j                  d«      }|sŒ¦t	        ||«      }Œ³ ŒÜ |S )aw  
    Extract the highest media resolution (detail) from image content in messages.

    This is used to set the global media_resolution in generation_config for
    Gemini 2.x models which don't support per-part media resolution.

    Args:
        messages: List of messages in OpenAI format

    Returns:
        The highest detail level found ("high", "low", or None)
    NÚcontentÚtypeÚ	image_urlrH   Úfile)r9   Ú
isinstanceÚlistÚdictr\   )r]   Úmax_resolutionÚmsgr_   ÚitemrH   ra   Úfile_objs           r;   Ú+_extract_max_media_resolution_from_messagesrj   ‹   sÛ   € ð "&€NØò [ˆØ—'‘'˜)Ó$ˆÜ�gœtÕ$Øò [�Ü! $¬Ô-ØØ%)�Ø—8‘8˜FÓ# {Ò2Ø $§¡¨Ó 5�IÜ! )¬TÔ2Ø!*§¡¨xÓ!8™Ø—X‘X˜fÓ%¨Ò/Ø#Ÿx™x¨Ó/�HÜ! (¬DÔ1Ø!)§¡¨hÓ!7˜ÚÜ%BÀ>ÐSYÓ%Z‘Nñ[ð[ð" Ðr=   ÚpartÚmodelÚmedia_resolution_enumÚvideo_metadatac                 óÚ   — |€| S ddl m} t        | «      }|�|j                  |«      r||d<   |�-i }d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   |r||d	<   t	        t
        |«      S )
zü
    Apply media_resolution and video_metadata parameters to a Gemini part.

    - Per-part media_resolution: Gemini 3+ only (2.x uses generation_config global).
    - video_metadata (fps, startOffset, endOffset): all Gemini models (1.x, 2.x, 3+).
    r5   ©ÚVertexGeminiConfigÚmedia_resolutionÚfpsÚstart_offsetÚstartOffsetÚ
end_offsetÚ	endOffsetrn   )Ú"vertex_and_google_ai_studio_geminirq   re   Ú_is_gemini_3_or_newerr   r"   )rk   rl   rm   rn   rq   Ú	part_dictÚgemini_video_metadatas          r;   Ú_apply_gemini_metadatar|   ¯   s©   € ð €}ØˆåFä˜D“z€IàÐ(Ð-?×-UÑ-UÐV[Ô-\Ø(=ˆ	Ð$Ñ%àÐ!Ø')ÐØ�NÑ"Ø+9¸%Ñ+@Ð! %Ñ(Ø˜^Ñ+Ø3AÀ.Ñ3QÐ! -Ñ0Ø˜>Ñ)Ø1?ÀÑ1MÐ! +Ñ.Ù Ø*?ˆIÐ&Ñ'ä”˜)Ó$Ð$r=   Úgs_uric                 óÎ   — | j                  d«      st        d| › �«      ‚| dd  }|j                  dd«      }t        |«      dk7  s
|d   r|d   st        d| › �«      ‚|d   |d   fS )Núgs://zInvalid gs URI: é   ú/r5   r*   r   )Ú
startswithÚ
ValueErrorr6   Úlen)r}   Úuri_without_schemeÚ	uri_partss      r;   Ú_parse_gs_urir‡   Ó   s   € Ø×Ñ˜WÔ%ÜÐ+¨F¨8Ð4Ó5Ð5Ø & q r 
ÐØ)×/Ñ/°°QÓ7€IÜ
ˆ9ƒ~˜Ò )¨A¢,°iÀ²lÜÐ+¨F¨8Ð4Ó5Ð5Ø�Q‰<˜ 1™Ð%Ð%r=   Úbucketc                 óò   — t        | «      }d| v rdnd}|dk  s||kD  ryd| v r"t        d„ | j                  d«      D «       «      ryt        j                  d| «      syd| v ryt        j                  d	| «      ryy
)zC
    Validate bucket name against core GCS naming constraints.
    ú.éÞ   é?   rX   Fc              3   óX   K  — | ]"  }t        |«      d k(  xs t        |«      dkD  –— Œ$ y­w)r   rŒ   N)r„   )Ú.0Úlabels     r;   ú	<genexpr>z,_is_valid_gcs_bucket_name.<locals>.<genexpr>å   s(   è ø€ Ò_ÀEœS ›Z¨1™_Ò?´°E³
¸R±Ó?Ñ_ùs   ‚(*z[a-z0-9][a-z0-9._-]*[a-z0-9]z..z\d+\.\d+\.\d+\.\d+T)r„   Úanyr6   ÚreÚ	fullmatch)rˆ   Úbucket_lengthÚmax_bucket_lengths      r;   Ú_is_valid_gcs_bucket_namer–   Ý   s€   € ô ˜v›;€MØ&)¨V¡m™s¸ÐØ�qÒ˜MÐ,=Ò=ØØ
ˆf�}œÑ_ÈVÏ\É\ÐZ]ÓM^Ô_Ô_ØÜ�<‰<Ð7¸Ô@ØØˆv�~ØÜ	‡|�|Ð)¨6Ô2ØØr=   Úurlc                 ó~   — d| vryt         j                  j                  | «      d   }|r|dd nd}t        |«      dk(  S )zœ
    True when _process_gemini_media would call _get_gcs_object_content_type
    (extension-less gs:// and no explicit format passed into that helper).
    r   Féÿÿÿÿr5   NÚ r   )ÚosÚpathÚsplitextr„   )r—   Úextension_with_dotÚ	extensions      r;   Ú&_gs_uri_requires_content_type_metadatar    ð   sI   € ð
 �cÑØÜ "§¡× 0Ñ 0°Ó 5°bÑ 9ÐÙ1CÐ)¨!¨"Ñ-È€IÜˆy‹>˜QÑÐr=   Úraw_image_urlc                 ó*  — d}d}t        | t        «      rZ| j                  d«      }t        |t        «      sy| j                  d«      xs$ | j                  d«      xs | j                  d«      }nt        | t        «      r| }nyd|vs|ryt	        |«      S )z£
    True when this image_url value (content-part image_url or assistant ``images[]``
    entry) can trigger a blocking GCS metadata read for MIME resolution.
    Nr—   FÚformatr1   Úcontent_typer   )rc   re   r9   Ústrr    )r¡   Úfmtr—   s      r;   Ú3_image_url_payload_may_need_sync_gcs_metadata_fetchr§   ü   s�   € ð €CØ€CÜ�-¤Ô&Ø×Ñ Ó&ˆÜ˜#œsÔ#ØØ×Ñ Ó)Òp¨]×->Ñ->¸{Ó-KÒpÈ}×O`ÑO`ÐaoÓOp‰Ü	�M¤3Ô	'Ø‰àØ�cÑ™SØÜ1°#Ó6Ð6r=   c                 ót  — | D �]²  }|}t        |t        «      st        |d«      r|j                  d¬«      }t        |t        «      sŒE|j	                  d«      }t        |t
        «      r5|D ]0  }t        |t        «      sŒt        |j	                  d«      «      sŒ/  y |j	                  d«      }t        |t
        «      sŒ½|D ]ñ  }t        |t        «      sŒ|j	                  d«      }|dk(  rt        |j	                  d«      «      sŒE  y|d	k(  sŒN|j	                  d	«      }t        |t        «      sŒp|j	                  d
«      xs$ |j	                  d«      xs |j	                  d«      }	|j	                  d«      xs |j	                  d«      }
t        |
t        «      sŒÜd|
v sŒá|	rŒät        |
«      sŒð  y �Œµ y)a§  
    Heuristic: True if any message part can trigger a blocking GCS JSON
    metadata read inside _transform_request_body (extension-less gs:// without
    explicit MIME hints). Covers user/system ``content`` parts and assistant
    ``images`` (same paths as ``_gemini_convert_messages_with_history``). Used
    to decide whether ``async_transform_request_body`` should offload the sync
    transform via ``asyncify``.
    Ú
model_dumpF)Úexclude_noneÚimagesra   Tr_   r`   rb   r£   r1   r¤   Úfile_idÚ	file_datar   )	rc   re   Úhasattrr©   r9   rd   r§   r¥   r    )r]   Úrawrg   Úimages_fieldÚ
image_itemr_   rh   Úityperi   r¦   Úpasseds              r;   Ú1_openai_messages_may_need_sync_gcs_metadata_fetchr´     s„  € ð ó $ ˆØˆÜ˜#œtÔ$¬°°lÔ)CØ—.‘.¨e�.Ó4ˆCÜ˜#œtÔ$ØØ—w‘w˜xÓ(ˆÜ�l¤DÔ)Ø*ò  �
Ü! *¬dÔ3ØÜFÀzÇ~Á~ÐVaÓGbÕcÚð	 ð —'‘'˜)Ó$ˆÜ˜'¤4Ô(ØØò 	 ˆDÜ˜d¤DÔ)ØØ—H‘H˜VÓ$ˆEØ˜Ò#ÜFÀtÇxÁxÐP[ÓG\Õ]ÚØ˜&“ØŸ8™8 FÓ+�Ü! (¬DÔ1ØØ—l‘l 8Ó,Òi°·±¸[Ó0IÒiÈXÏ\É\ÐZhÓMi�Ø!Ÿ™ iÓ0ÒM°H·L±LÀÓ4M�ä˜v¤sÕ+Ø 6Ò)ÚÜ>¸vÕFâò'	 ð#$ ðJ r=   ra   Úvertex_projectÚvertex_credentialsc                 ó  — 	 t        | «      \  }}t        |«      syi }|duxs |du}|r'	 t        «       j	                  ||¬«      \  }}d|› �|d<   t        |d¬	«      }
t        |d¬	«      }t        j                  d
dd|
› d|› �ddi¬«      }	 t        «       j                  t        |«      |xs d¬«      }|j"                  r>|r;|j$                  xs ddd }t        j                  d|j&                  › d|›�dd¬«      ‚y	 |j)                  «       }t+        |t,        «      s)|r&t        j                  d|j&                  › d�dd¬«      ‚y|j                  d«      }t+        |t        «      rt/        |«      dkD  r|S |r;|j$                  xs ddd }t        j                  d|j&                  › d|›�dd¬«      ‚y# t        $ r Y yw xY w# t
        $ r }	t        j                  d|	› �dd¬«      ‚d}	~	ww xY w# t        j                  $ r>}	|r2t        j                  dt        |	«      j                   › d|	› �dd¬«      |	‚Y d}	~	yd}	~	ww xY w# t        $ r5}	|r)t        j                  d|j&                  › d|	› �dd¬«      |	‚Y d}	~	yd}	~	ww xY w)a¼  
    Resolve content type from GCS object metadata.

    Only attaches a Bearer token when the caller explicitly supplies Vertex
    credentials, to avoid using the server's default Google credentials on
    the Gemini API-key (Google AI Studio) path and being used as an oracle
    for private GCS object metadata. Without explicit credentials we only
    issue an anonymous request, which only succeeds for publicly-readable
    objects.
    N)ÚcredentialsÚ
project_idzBearer ÚAuthorizationzWUnable to fetch GCS metadata with provided Vertex credentials/project. Original error: Ú	vertex_ai©Úmessagerl   Úllm_providerrš   )ÚsafeÚhttpszstorage.googleapis.comz/storage/v1/b/z/o/ÚfieldsÚcontentType)ÚschemeÚhostrœ   Úparams)r—   ÚheaderszSUnable to reach GCS JSON API for object metadata with provided Vertex credentials. z: i   zJUnable to read GCS object metadata with provided Vertex credentials. HTTP z. Response body (truncated): zVGCS metadata response was not valid JSON when using provided Vertex credentials (HTTP z
). Error: zYGCS metadata response was not a JSON object when using provided Vertex credentials (HTTP z).r   zmGCS metadata JSON did not include a non-empty contentType field when using provided Vertex credentials (HTTP z). Body (truncated): )r‡   rƒ   r–   rB   Úget_access_tokenÚ	ExceptionÚlitellmÚBadRequestErrorr   ÚhttpxÚURLrF   r9   r¥   ÚRequestErrorr`   Ú__name__Úis_errorÚtextÚstatus_codeÚjsonrc   re   r„   )ra   rµ   r¶   rˆ   Úobject_namerÆ   Úexplicit_vertex_auth_providedÚaccess_tokenÚ_ÚeÚencoded_bucketÚencoded_objectÚmetadata_urlÚresponseÚpreviewÚpayloadr¤   s                    r;   Ú_get_gcs_object_content_typerÞ   F  s/  € ðÜ+¨IÓ6Ñˆ�ô % VÔ,Øà%'€GØ+9ÀÐ+EÒ+gÐI[ÐcgÐIgÐ!Ù$ð	Ü.Ó0×AÑAØ.Ø)ð Bó ‰OˆL˜!ð *1°°Ð'?ˆG�OÑ$ô " &¨rÔ2€NÜ! +°BÔ7€NÜŸ)™)ØØ%Ø˜nÐ-¨S°Ð0@ÐAØ˜-Ð(ô	€LðÜ8Ó:×>Ñ>Ü�LÓ!Ø’O˜tð ?ó 
ˆð  ×ÒÙ(Ø—}‘}Ò*¨¨E¨TÐ2ˆGÜ×)Ñ)ðØ$×0Ñ0Ð1Ð1NÈwÈkð[ð Ø(ôð ð ðØ!Ÿ™›ˆô �gœtÔ$Ù(Ü×)Ñ)ð0Ø08×0DÑ0DÐ/EÀRðIð Ø(ôð ð à!Ÿ+™+ mÓ4€LÜ�,¤Ô$¬¨\Ó):¸QÒ)>ØÐá$Ø—=‘=Ò& B¨¨Ð.ˆÜ×%Ñ%ð;Ø;C×;OÑ;OÐ:Pð Q%Ø%, Kð1ð Ø$ô
ð 	
ð øôO ò Ùðûô ò 	Ü×)Ñ)ØrÐstÐruÐvØØ(ôð ûð	ûô. ×Ñò 
Ù(Ü×)Ñ)ð+Ü+/°«7×+;Ñ+;Ð*<¸B¸q¸cðCð Ø(ôð ðô ûð
ûô6 ò 
Ù(Ü×)Ñ)ð0Ø08×0DÑ0DÐ/EÀZÐPQÈsðTð Ø(ôð ðô ûð
úsX   ‚F8 «&G Â(G3 Ä I Æ8	GÇGÇ	G0ÇG+Ç+G0Ç3IÈ4H?È?IÉ	JÉ+J Ê Jc                 óþ   — ddl m} t        | «      }	  ||«      }t        |«      }t        |«      st        j                  d|› �|d¬«      ‚t        |«      S # t        $ r t        j                  d|› �|d¬«      ‚w xY w)Nr   )Ú!get_file_extension_from_mime_typeú$File type not supported by gemini - r»   r¼   )	Úlitellm.types.filesrà   r<   r   rƒ   rÉ   rÊ   r   r   )r1   rl   rà   Únormalized_mime_typeÚfile_extensionÚ	file_types         r;   Ú(_normalize_and_validate_gemini_mime_typeræ   Á  s�   € õ Fä"AÀ)Ó"LÐð
Ù AÐBVÓ WˆÜ7¸ÓGˆ	ô ,¨IÔ6Ü×%Ñ%Ø:¸9¸+ÐFØØ$ô
ð 	
ô ,¨IÓ6Ð6øô ò 
Ü×%Ñ%Ø:Ð;OÐ:PÐQØØ$ô
ð 	
ð
ús   “A Á%A<r£   c                 ó®  — 	 d| v rót         j                  j                  | «      d   }|dd }d}	|smd}
|r=t        |«      }t	        |«      st        j                  d|› �|d¬«      ‚t        |«      }
n0t        | ||¬	«      }
|
€ t        j                  d
| › d�|d¬«      ‚|}
d}	|
€t        j                  d| › �|d¬«      ‚|	rt        |
«      }
nt        |
|¬«      }
t        |
| ¬«      }d|i}t        ||||«      S | j                  d«      r4|rt        || ¬«      }nt        t        d| i«      }d|i}t        ||||«      S d| v r0|xs t        | «      x}�t        || ¬«      }d|i}t        ||||«      S d| v sd| v sd| v r8t!        | |¬«      }|d   |d   dœ}dt        t"        |«      i}t        ||||«      S t%        d| › �«      ‚# t$        $ r}|‚d}~ww xY w)aŠ  
    Given a media URL (image, audio, or video), return the appropriate PartType for Gemini
    By the way, actually video_metadata can only be used with videos; it cannot be used with images, audio, or files. However, I haven't made any special handling because vertex returns a parameter error.

    Args:
        image_url: The URL or base64 string of the media (image, audio, or video)
        format: The MIME type of the media
        media_resolution_enum: Media resolution level (for Gemini 3+)
        model: The model name (to check version compatibility)
        video_metadata: Video-specific metadata (fps, start_offset, end_offset)
    r   r™   r5   NFrá   r»   r¼   )ra   rµ   r¶   z*Unable to determine mime type for gs URI: z·. This gs:// URI has no file extension and GCS metadata lookup failed. Set it explicitly using image_url.format (or image_url.mime_type/content_type) or message.content[].file.format.T)r1   rl   )r1   Úfile_urir­   z7https://generativelanguage.googleapis.com/v1beta/files/rè   zhttps://zhttp://Úbase64)r£   ÚdataÚ
media_type)rê   r1   Úinline_datazInvalid image received - )r›   rœ   r�   r   r   rÉ   rÊ   r   rÞ   r<   ræ   ÚFileDataTyper|   r‚   r   r   r   ÚBlobTyperÈ   )ra   r£   rm   rl   rn   rµ   r¶   rž   rŸ   Úexplicit_gcs_formatr1   rå   r­   rk   Ú
image_typeÚimageÚ_blobr×   s                     r;   Ú_process_gemini_mediaró   Û  sn  € ð*Và�iÑÜ(*¯©×(8Ñ(8¸Ó(CÀBÑ(GÐØ1°!°"Ð5ˆIà"'ÐÙØ(,�	ñ Ü'CÀIÓ'N�Iô <¸IÔFÜ%×5Ñ5Ø&JÈ9È+Ð$VØ"'Ø)4ôð ô !AÀÓ K‘Iä <Ø"+Ø'5Ø+=ô!�Ið
 !Ð(Ü%×5Ñ5à"LÈYÈKð XAð !Að #(Ø)4ô
ð 
ð #�	Ø&*Ð#ØÐ Ü×-Ñ-ØBÀ9À+ÐNØØ!,ôð ñ
 #ô <¸IÓF‘	äDØ'Øô�	ô %¨yÀ9ÔMˆIØ)¨9Ð5ˆDÜ)¨$°Ð7LÈnÓ]Ð]Ø×!Ñ!Ð"[Ô\ñ
 Ü(°6ÀIÔN‘	ô !¤°
¸IÐ/FÓG�	Ø Ð+ˆDÜ)¨$°Ð7LÈnÓ]Ð]Ø˜9Ñ$¸Ò8jÔB_Ð`iÓBjÐ*j¨*Ð)wÜ$¨zÀIÔNˆIØ Ð+ˆDÜ)¨$°Ð7LÈnÓ]Ð]Ø˜)Ñ# z°YÑ'>À(ÈiÑBWÜ9¸)ÈFÔSˆEØ.3°F©mÈ%ÐP\ÑJ]Ñ%^ˆEØ!¤4¬°%Ó#8Ð9ˆDÜ)¨$°Ð7LÈnÓ]Ð]ÜÐ3°I°;Ð?Ó@Ð@øÜò Øˆûðús2   ‚C6G Ã9AG Ä>3G Å2AG Æ6G Ç	GÇGÇGÚ	snake_strc                 óf   — | j                  d«      }|d   dj                  d„ |dd D «       «      z   S )zConvert snake_case to camelCaserÖ   r   rš   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­w©N)Ú
capitalize)rŽ   Úxs     r;   r�   z"_snake_to_camel.<locals>.<genexpr>L  s   è ø€ Ò"J°a 1§<¡<§>Ñ"Jùs   ‚r5   N)r6   Újoin)rô   Ú
componentss     r;   Ú_snake_to_camelrü   I  s4   € à!Ÿ™¨Ó,€JØ�a‰=˜2Ÿ7™7Ñ"J¸:ÀaÀb¸>Ô"JÓJÑJÐJr=   Ú	camel_strc                 óL   — t        j                  dd| «      j                  «       S )zConvert camelCase to snake_casez(?<!^)(?=[A-Z])rÖ   )r’   Úsubr8   )rý   s    r;   Ú_camel_to_snaker   O  s   € ä�6‰6Ð$ c¨9Ó5×;Ñ;Ó=Ð=r=   ÚkeyÚavailable_keysc                 óT   — | |v r| S t        | «      }||v r|S t        | «      }||v r|S y)ze
    Get the equivalent key from available keys, checking both camelCase and snake_case variants
    N)rü   r   )r  r  Ú	camel_keyÚ	snake_keys       r;   Ú_get_equivalent_keyr  T  sH   € ð ˆnÑØˆ
ô ' sÓ+€IØ�NÑ"ØÐô ' sÓ+€IØ�NÑ"ØÐàr=   ÚpartsÚexcluded_keysc                 ó  — t        |j                  «       «      t        |«      z
  }| D ]_  }t        |j                  «       «      }d}|D ]9  }t        ||«      }|�&|j                  |d«      |j                  |d«      k7  sŒ7d} n |sŒ_ y y)z’
    Check if a part exists in a list of parts
    Handles both camelCase and snake_case key variations (e.g., function_call vs functionCall)
    TNF)ÚsetÚkeysr  r9   )	r  rk   r  Úkeys_to_compareÚpÚp_keysÚmatch_foundr  Úequivalent_keys	            r;   Úcheck_if_part_exists_in_partsr  h  s–   € ô
 ! §¡£Ó-´°MÓ0BÑB€OØò ˆÜ�Q—V‘V“X“ˆàˆØ"ò 	ˆCÜ0°°fÓ=ˆNØÐ%¨¯©¨~¸tÓ)DÈÏÉÐQTÐVZÓH[Ó)[Ø#�Ùð		ò Ùðð r=   Úassistant_msgc                 óf  — d}| j                  d«      }t        |t        «      r,|D ]'  }t        |t        «      sŒt	        |«      }|sŒ"||fz  }Œ) | j                  d«      }t        |t        «      rt	        d|i«      }|r||fz  }| j                  d«      }t        |t        «      st        |«      S |j                  d«      }t        |t        «      st        |«      S |D ]E  }t        |t        «      sŒdD ]-  }	|j                  |	«      }
t        |
t        «      sŒ%|
sŒ(||
fz  }Œ/ ŒG t        |«      S )aj  Thought signatures already carried by this message's tool-call parts.

    Gemini returns each thoughtSignature on exactly one part. When the signed
    part is a function call, the signature is replayed on that tool-call part
    by convert_to_gemini_tool_call_invoke, so attaching the same signature to
    the text part as well would send two copies and double-bill the previous
    turn's reasoning tokens on gemini-3 and newer models.

    Only real signatures count here; a synthesized placeholder must not
    suppress a genuine text-part signature (e.g. replaying gemini-2.5 history
    to a newer model).
    rE   Ú
tool_callsÚfunction_callÚfunctionÚprovider_specific_fieldsÚserver_side_tool_invocations)Úthought_signatureÚresponse_thought_signature)r9   rc   rd   re   r   Ú	frozensetr¥   )r  Ú
signaturesr  ÚtoolÚ	signaturer  r  ÚinvocationsÚ
invocationr  Úinvocation_signatures              r;   Ú%_collect_tool_call_thought_signaturesr"  }  sC  € ð #%€Jà%×)Ñ)¨,Ó7€JÜ�*œdÔ#Øò 	+ˆDÜ˜d¤DÔ)ØÜ8¸Ó>ˆIÚØ˜y˜lÑ*‘
ð	+ð )×,Ñ,¨_Ó=€MÜ�-¤Ô&Ü4°jÀ-Ð5PÓQˆ	ÙØ˜9˜,Ñ&ˆJà&3×&7Ñ&7Ð8RÓ&SÐÜÐ.´Ô5Ü˜Ó$Ð$à1×5Ñ5Ð6TÓU€KÜ�k¤4Ô(Ü˜Ó$Ð$à!ò 6ˆ
Ü˜*¤dÔ+ØØFò 	6ˆCØ#-§>¡>°#Ó#6Ð ÜÐ.´Õ4Ò9MØÐ3Ð5Ñ5‘
ñ	6ð6ô �ZÓ Ð r=   Úlitellm_paramsÚcustom_llm_providerc                 óÊ  — ddh}g }d}d}g }d}	d}
|rH|j                  d«      xs |j                  d«      }	|j                  d«      xs |j                  d«      }
d	d
lm} |j                  |xs d«      }	 |t	        | «      k  �	rÞg }|}|t	        | «      k  �rÐ| |   d   |v �rÅ| |   j                  d«      }|��`t        |t        «      �rOg }t        |«      D �],  \  }}|d   dk(  rFd|v rBt	        |d   «      dkD  r1t        t        |«      }t        |d   ¬«      }|j                  |«       ŒU|d   dk(  �rt        t        |«      }|}d}d}|j                  d«      }|€t        j                  d|d¬«      ‚t        |t        «      rœ|j                  d«      }|€t        j                  d|d¬«      ‚t        t        t         t"        f   |«      }|j                  d«      xs$ |j                  d«      xs |j                  d«      }|j                  d«      }t%        |«      }n|}t'        |||||	|
¬«      }|j                  |«       �Œq|d   dk(  r•t        t(        |«      }|d   j                  d«      }|d   j                  d«      }|€�Œµ|€�Œ¹|j+                  d«      du rd|z   n|}t-        t/        d ||¬!«      ¬"«      }t'        ||||	|
¬#«      }|j                  |«       �Œ|d   d$k(  s�Œt        t0        |«      } | j                  d$«      }!|!€t        j                  d%|d¬«      ‚t        t        t         t"        f   |!«      }"|"j                  d&«      }#|"j                  d«      xs$ |"j                  d«      xs |"j                  d«      }|"j                  d'«      }$|"j                  d«      }|"j                  d(«      }%|#xs |$}&|&€t3        d)«      ‚t%        |«      }	 t'        |&||||%|	|
¬*«      }|j                  |«       �Œ/ |j5                  |«       n/|�-t        |t         «      rt        |¬«      }|j                  |«       |d	z  }|t	        | «      k  r| |   d   |v r�ŒÅ|r\	 t7        |«      }(|(du r0t9        j:                  d0«       |j                  t        d1¬«      «       |j                  t=        d|¬2«      «       g })|t	        | «      k  �rž| |   d   d3k(  �r’t        | |   t>        «      r| |   jA                  «       }*n| |   }*tC        dWi |*¤Ž}+|+j                  dd«      }|+j                  d4d«      },|+j                  d5«      }-|,�|)j                  t        d6|,¬7«      «       |-�h|-D ]c  }.|.d   d8k(  sŒ|.j                  d8«      }/|.j                  d9«      }0|/€Œ1|0€Œ4	 |)j                  t        dWd:|0itE        jF                  |/«      ¤Ž«       Œe |�et        |t        «      rUg }|D ]<  }t        |t        «      sŒ|d   dk(  sŒt        |d   ¬«      }|j                  |«       Œ> |)j5                  |«       n·|�µt        |t         «      r¥|}1|+j                  d<«      }2d}3|2r!t        |2t        «      r|2j                  d=«      }3tI        |+«      }4|3rEt        |3t        «      r5t	        |3«      dkD  r'|3d   |4vr |)j                  t        |1|3d   ¬>«      «       n|)j                  t        |1¬«      «       |+j                  d?«      }5|5�Ót        |5t        «      rÃ|5D ]¾  }6t        |6t        «      sŒ|6j                  d«      }7t        |7t        «      sŒ6|7j                  d«      }8|7j                  d«      xs$ |7j                  d«      xs |7j                  d«      }|7j                  d«      }t%        |«      }|8sŒ�t'        |8||||	|
¬«      }|)j                  |«       ŒÀ |+j                  d@g «      €|+j                  dA«      �ZtK        |+||¬B«      }9|9D ]#  }:tM        |)|:d:g¬C«      rŒ|)j                  |:«       Œ% |+j                  d@«      s|+j                  dA«      �|+}|+j                  d<«      };t        |;t        «      rÜ|;j                  dD«      }<t        |<t        «      r»|<D ]¶  }=dE|=j                  dF«      |=j                  dG«      |=j                  dH«      dIœi}>dJ|=v r|=dJ   |>d:<   |)j                  |>«       dK|=v sŒZ|=j                  dG«      |=j                  dK«      dLœ}?|=j                  dF«      r|=dF   |?dM<   dN|?i}@dO|=v r|=dO   @d:<   |)j                  @«       Œ¸ |d	z  }|t	        | «      k  r| |   d   d3k(  r�Œ’|)r|j                  t=        dP|)¬2«      «       dQdRg}A|t	        | «      k  rS| |   d   Av rItO        | |   ||¬S«      }|d	z  }t        |t        «      r|j5                  |«       n|j                  |«       |t	        | «      k  r6| |   d   Avr,t	        |«      dkD  r|j                  t=        d|¬2«      «       g }||k(  rt3        dT| |   › dU�«      ‚|t	        | «      k  r�	ŒÞt	        |«      dkD  r|j                  t=        d|¬2«      «       t	        |«      dk(  r<t9        j:                  dV«       |j                  t=        dt        d1¬«      g¬2«      «       |S # t        j                  $ r ‚ t2        $ r-}'t        j                  d+|#xs d,› d-|› d.|› d/|'› �|d¬«      ‚d}'~'ww xY w# t2        $ r  |)j                  t        |0|/¬;«      «       Y �ŒÜw xY w# t2        $ r}'|'‚d}'~'ww xY w)Xa!  
    Converts given messages from OpenAI format to Gemini format

    - Parts must be iterable
    - Roles must alternate b/w 'user' and 'model' (same as anthropic -> merge consecutive roles)
    - Please ensure that function response turn comes immediately after a function call turn
    ÚuserÚsystemNr   rµ   Úvertex_ai_projectr¶   Úvertex_ai_credentialsr5   rp   rš   Úroler_   r`   rÐ   ©rÐ   ra   zVInvalid message content: element type is 'image_url' but 'image_url' field is missing r»   r¼   r—   zcInvalid message content: element type is 'image_url' but 'url' field is missing inside 'image_url' r£   r1   r¤   rH   )ra   r£   rm   rl   rµ   r¶   Úinput_audiorê   zaudio/Fré   )r`   rë   rê   )Úimage_chunk)ra   r£   rl   rµ   r¶   rb   zFContent block has type='file' but is missing the required 'file' fieldr¬   r­   rn   z8Unknown file type. Please pass in a file_id or file_data)ra   r£   rl   rm   rn   rµ   r¶   z(Unable to determine mime type for file: zprovided dataz$, set this explicitly using message[z
].content[z@].file.format (or file.mime_type/content_type). Original error: z¨No text in user content. Adding a blank text to user content, to ensure Gemini doesn't fail the request. Relevant Issue - https://github.com/BerriAI/litellm/issues/5515ú )r*  r  Ú	assistantÚreasoning_contentÚthinking_blocksT)ÚthoughtrÐ   Úthinkingr  ÚthoughtSignature)r4  rÐ   r  Úthought_signatures)rÐ   r4  r«   r  r  )rl   Úforward_function_call_id)r  r  ÚtoolCallÚ	tool_typeÚidÚargs)ÚtoolTyper9  r:  r  rÛ   )r9  rÛ   r;  ÚtoolResponser  rl   r  r  )r6  zInvalid Message passed in - z9. File an issue https://github.com/BerriAI/litellm/issuesa%  
                No contents in messages. Contents are required. See
                https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.publishers.models/generateContent#request-body.
                If the original request did not comply to OpenAI API requirements it should have failed by now,
                but LiteLLM does not check for missing messages.
                Setting an empty content to prevent an 400 error.
                Relevant Issue - https://github.com/BerriAI/litellm/issues/9733
                rE   )(r9   rx   rq   Ú _forward_gemini_function_call_idr„   rc   rd   Ú	enumerater   r   r"   Úappendr   rÉ   rÊ   re   r¥   r   rS   ró   r   r‚   r   r(   r   rÈ   Úextendr+   r
   ÚwarningÚContentTyper	   r©   r   rÒ   Úloadsr"  r   r  r   )Br]   rl   r#  r$  Úuser_message_typesÚcontentsÚlast_message_with_tool_callsÚmsg_iÚtool_call_responsesrµ   r¶   rq   r6  Úuser_contentÚ
init_msg_iÚ_message_contentÚ_partsÚelement_idxÚelementÚ_partÚimg_elementr£   rm   r¡   ra   Úimage_url_dictrH   Úaudio_elementÚ
audio_dataÚaudio_formatÚaudio_format_modifiedÚopenai_image_strÚfile_elementÚ_file_fieldÚ	file_dictr¬   r­   rn   Úpassed_filer×   Úhas_text_in_contentÚassistant_contentÚmsg_dictr  r0  r1  ÚblockÚblock_thinking_strÚblock_signatureÚassistant_textr  r5  Útool_call_signaturesÚassistant_imagesr±   Úimage_url_objÚassistant_image_urlÚgemini_tool_call_partsÚgemini_tool_call_partÚ_psfÚ_ss_invocationsr   Útc_partÚtr_dictÚtr_partÚtool_call_message_rolessB                                                                     r;   Ú%_gemini_convert_messages_with_historyrn  °  sŠ  € ð "(¨Ð 2ÐØ)+€Hà#'Ð à€EØÐØ€NØÐÙØ'×+Ñ+Ð,<Ó=ÒhÀ×ASÑASÐTgÓAhˆØ+×/Ñ/Ð0DÓEÒtÈ×I[ÑI[Ð\sÓItÐåFà&8×&YÑ&YÐZ_ÒZeÐceÓ&fÐðbØ”c˜(“mÓ#Ø+-ˆLØˆJàœ#˜h›-Ó'¨H°U©O¸FÑ,CÐGYÒ,YØ#+¨E¡?×#6Ñ#6°yÓ#AÐ Ø#Ñ/´JÐ?OÔQUÕ4VØ-/�FÜ09Ð:JÓ0Kó y"Ñ,˜ WØ" 6™?¨fÒ4¸À7Ñ9JÌsÐSZÐ[aÑSbÓOcÐfgÒOgÜ&*Ô+CÀWÓ&M˜GÜ$,°'¸&±/Ô$B˜EØ"ŸM™M¨%Õ0Ø$ V™_°Ó;Ü&*Ô+DÀgÓ&N˜GØ*1˜KØ15˜FØKOÐ1Ø,7¯O©O¸KÓ,H˜MØ,Ð4Ü&-×&=Ñ&=ð -EØ*/Ø1<ô'"ð !"ô
  *¨-¼Ô>Ø,9×,=Ñ,=¸eÓ,D 	Ø#,Ð#4Ü*1×*AÑ*Að 1VØ.3Ø5@ô+&ð %&ô 26´d¼3Ä¸8±nÀmÓ1T à$2×$6Ñ$6°xÓ$@ò %JØ'5×'9Ñ'9¸+Ó'Fò%Jà'5×'9Ñ'9¸.Ó'Ið !'ð
 *8×);Ñ);¸HÓ)E Ü8`ÐagÓ8hÑ 5à,9 	Ü$9Ø*3Ø'-Ø6KØ&+Ø/=Ø3Eô%˜Eð #ŸM™M¨%Ö0Ø$ V™_°Ò=Ü,0Ô1JÈGÓ,T˜MØ)6°}Ñ)E×)IÑ)IÈ&Ó)Q˜JØ+8¸Ñ+G×+KÑ+KÈHÓ+U˜LØ)Ò5¸,Ò:Rð (4×'>Ñ'>¸xÓ'HÈEÑ'Qð %-¨|Ò$;à)5ð !6ô
 4cÜ0HØ-5Ø3HØ-7ô1&ô4"Ð 0ô )>Ø.>Ø+@Ø*/Ø3AØ7Iô)" ð !'§¡¨eÖ 4Ø$ V™_°Ô6Ü+/Ô0HÈ'Ó+R˜LØ*6×*:Ñ*:¸6Ó*B˜KØ*Ð2Ü&-×&=Ñ&=Ø,tØ*/Ø1<ô'"ð !"ô )-¬T´#´s°(©^¸[Ó(I˜IØ&/§m¡m°IÓ&>˜Gà )§¡¨hÓ 7Ò v¸9¿=¹=ÈÓ;UÒ vÐYb×YfÑYfÐguÓYvð #ð )2¯©°kÓ(B˜IØ%.§]¡]°8Ó%<˜FØ-6¯]©]Ð;KÓ-L˜NØ*1Ò*>°Y˜KØ*Ð2Ü&/Ð0jÓ&kÐ kô 5]Ð]cÓ4dÐ1ð"Ü(=Ø.9Ø+1Ø*/Ø:OØ3AØ3AØ7Iô)" ð !'§¡¨eÖ 4ðWy"ðt !×'Ñ'¨Õ/Ø%Ð1´jÐAQÔSVÔ6WÜ$Ð*:Ô;�EØ ×'Ñ'¨Ô.à˜‘
�ðG œ#˜h›-Ò'¨H°U©O¸FÑ,CÐGYÓ,YñJ ðô
 '=¸\Ó&JÐ#Ø&¨%Ñ/Ü"×*Ñ*ð Côð !×'Ñ'Ü  cÔ*ôð —‘¤°¸|Ô LÔMØ "Ðàœ#˜h›-Ó'¨H°U©O¸FÑ,CÀ{Ó,RÜ˜h u™o¬yÔ9ØFNÈuÁo×F`ÑF`ÓFb‘Hà'¨™�HÜ >Ñ JÀÑ J�Ø#0×#4Ñ#4°YÀÓ#EÐ Ø$1×$5Ñ$5Ð6IÈ4Ó$PÐ!Ø"/×"3Ñ"3Ð4EÓ"F�Ø$Ð0Ø%×,Ñ,¬X¸dÐIZÔ-[Ô\Ø"Ð.Ø!0ò &˜Ø  ™=¨JÓ6Ø16·±¸:Ó1FÐ.Ø.3¯i©i¸Ó.D˜OØ1Ñ=À/ÑB]ð!&Ø$5×$<Ñ$<Ü(0ñ )*Ø=Lð)*ä.2¯j©jÐ9KÓ.Lñ)*õ%&ð&ð& $Ð/´JÐ?OÔQUÔ4VØ�FØ#3ò 5˜Ü% g¬tÕ4Ø& v™°&Ó8Ü(0°g¸f±oÔ(F Ø &§¡¨eÕ 4ð	5ð &×,Ñ,¨VÕ4Ø%Ð1´jÐAQÔSVÔ6WØ%5�Nà/<×/@Ñ/@ÐA[Ó/\Ð,Ø)-Ð&Ù/´JÐ?WÔY]Ô4^Ø-E×-IÑ-IÐJ^Ó-_Ð*ô ,QÐQ^Ó+_Ð(ñ +Ü&Ð'9¼4Ô@ÜÐ 2Ó3°aÒ7Ø.¨qÑ1Ð9MÑMð *×0Ñ0Ü$Ø%3Ø1CÀAÑ1Fôõð *×0Ñ0´¸~Ô1NÔOð $1×#4Ñ#4°XÓ#>Ð Ø#Ð/´JÐ?OÔQUÔ4VØ&6ò D˜
Ü% j´$Õ7Ø,6¯N©N¸;Ó,G˜MÜ)¨-¼Õ>Ø6C×6GÑ6GÈÓ6NÐ 3à$1×$5Ñ$5°hÓ$?ò %IØ'4×'8Ñ'8¸Ó'Eò%Ià'4×'8Ñ'8¸Ó'Hð !'ð
 *7×):Ñ):¸8Ó)D Ü8`ÐagÓ8hÐ 5Ú#6Ü,AØ2EØ/5Ø>SØ.3Ø7EØ;Mô-& Eð %6×$<Ñ$<¸UÕ$Cð+Dð2 "×%Ñ% l°BÓ7ÐCÀ}×GXÑGXÐYhÓGiÐGuä-OØ%Ø#Ø1Iô.Ð*ð 2Hò LÐ-Ü<Ø-Ø1Ø+=Ð*>ö ð
 .×4Ñ4Ð5JÕKðLð %×(Ñ(¨Ô6¸-×:KÑ:KÈOÓ:\Ð:hØ7DÐ4ð %×(Ñ(Ð)CÓD�Ü˜d¤DÔ)Ø&*§h¡hÐ/MÓ&N�OÜ! /´4Ô8Ø*9ò B˜Jð !+Ø0:·±¸{Ó0KØ*4¯.©.¸Ó*>Ø,6¯N©N¸6Ó,Bñ-"ð7˜Gð  3°jÑ@Ø>HÐI\Ñ>] Ð(:Ñ ;Ø-×4Ñ4°WÔ=ð  *¨ZÒ7à*4¯.©.¸Ó*>Ø0:·±¸zÓ0Jñ;" ð $.§>¡>°+Ô#>Ø:DÀ[Ñ:Q G¨JÑ$7Ø;IÈ7Ð:S Ø#?À:Ñ#MØBLÐMiÑBj GÐ,>Ñ$?Ø 1× 8Ñ 8¸Õ Að1Bð4 ˜‘
�ðy œ#˜h›-Ò'¨H°U©O¸FÑ,CÀ{Ô,Rñ| !Ø—‘¤°Ð@QÔ RÔSð (.¨zÐ&:Ð#Ø”s˜8“}Ò$¨°%©¸Ñ)@ÐD[Ñ)[Ü:Ø˜U‘OØ0Ø-Eô�ð
 ˜‘
�ä˜e¤TÔ*Ø'×.Ñ.¨uÕ5à'×.Ñ.¨uÔ5Ø”s˜8“}Ò$¨(°5©/¸&Ñ*AÐI`Ñ*`ÜÐ*Ó+¨aÒ/Ø—O‘O¤K°VÐCVÔ$WÔXØ*,Ð'à˜
Ò"ÜØ2°8¸E±?Ð2CÐC|Ð}óð ð_
 ”c˜(“mÔ#ôd
 Ð"Ó# aÒ'Ø�O‰OœK¨VÐ;NÔOÔPäˆx‹=˜AÒÜ×"Ñ"ð $ô ð �O‰OœK¨V¼HÈ#Ô<NÐ;OÔPÔQØˆøôW $+×#:Ñ#:ò &Ø %Ü#,ò "Ü&-×&=Ñ&=à*RØ+2Ò+E°oÐ*Fð G9Ø9>¸¸zÈ+Èð W;à;<¸#ð	)?ð +0Ø1<ô
'"ð 
!"ûð"ûôx (1ò !&Ø$5×$<Ñ$<Ü(0Ø=LØ1Cô)*÷%&ð!&ûô\ ò ØˆûðúsÆ   Á7Hm Êm ÊAm Ë1C1m Ï##kÐA!m Ñ)Dm Õ>$m Ö#m Ö'/l&×+m Øm ØD#m Ü/!m ÝA&m Þ8A)m à"Cm ã7A=m å6C,m é$A5m ël#ë6(lìl#ì#m ì&%mím ímím í	m"ímím"ÚcacheÚtagsÚ!_LITELLM_INTERNAL_EXTRA_BODY_KEYSrê   Úoptional_paramsc                 óö   — |j                  dd«      }|�e| }|j                  «       D ]O  \  }}|t        v rŒ||v r8t        ||   t        «      r%t        |t        «      r||   j                  |«       ŒK|||<   ŒQ yy)zZPop extra_body from optional_params and shallow-merge into data, deep-merging dict values.Ú
extra_bodyN)ÚpopÚitemsrq  rc   re   Úupdate)rê   rr  rt  Ú	data_dictÚkÚvs         r;   Ú_pop_and_merge_extra_bodyr{  7  s†   € à%4×%8Ñ%8¸ÀtÓ%L€JØÐØ!%ˆ	Ø×$Ñ$Ó&ò 	!‰DˆAˆqØÔ5Ñ5ØØ�I‰~¤*¨Y°q©\¼4Ô"@ÄZÐPQÔSWÔEXØ˜!‘×#Ñ# AÕ&à �	˜!’ñ	!ð r=   Útoolsc                 óH   — t        | t        «      syt        d„ | D «       «      S )zBReturn True if any tool object in the list has a 'googleMaps' key.Fc              3   óx   K  — | ]2  }t        |t        «      xr t        j                  j                  |v –— Œ4 y ­wr÷   )rc   re   ÚVertexToolNameÚGOOGLE_MAPSÚvalue)rŽ   Úts     r;   r�   z(_has_google_maps_tool.<locals>.<genexpr>I  s1   è ø€ Ò\ÐQRŒz˜!œTÓ"ÒL¤~×'AÑ'A×'GÑ'GÈ1Ð'LÓLÑ\ùs   ‚8:)rc   rd   r‘   )r|  s    r;   Ú_has_google_maps_toolrƒ  E  s!   € ä�eœTÔ"ØÜÑ\ÐV[Ô\Ó\Ð\r=   Úgeneration_configc                 óž   — | j                  dd«      }|€| j                  dd«      }| j                  dd«       dddii}|�||d   d<   || d	<   y)
a6  
    Convert response_mime_type + response_json_schema/response_schema to the newer
    responseFormat structure when googleMaps is present in tools.

    The Gemini API rejects the combination of googleMaps + response_mime_type:
    'application/json' with the error:
        "Google Maps tool with a response mime type: 'application/json' is unsupported"

    The newer responseFormat field supports this combination on both the Gemini API
    (generativelanguage.googleapis.com) and Vertex AI endpoints.

    Before:
        generationConfig: {
            response_mime_type: "application/json",
            response_json_schema: {...}
        }

    After:
        generationConfig: {
            responseFormat: {
                "text": {"mimeType": "APPLICATION_JSON", "schema": {...}}
            }
        }
    Úresponse_json_schemaNÚresponse_schemaÚresponse_mime_typerÐ   ÚmimeTypeÚAPPLICATION_JSONÚschemaÚresponseFormat)ru  )r„  r‹  Úresponse_formats      r;   Ú%_rewrite_mime_type_to_response_formatrŽ  L  sq   € ð2 ×"Ñ"Ð#9¸4Ó@€FØ€~Ø"×&Ñ&Ð'8¸$Ó?ˆØ×ÑÐ.°Ô5à.4°zÐCUÐ6VÐ-W€OØÐØ,2ˆ˜Ñ Ñ)Ø*9ÐÐ&Ò'r=   c                 óà   — t        t        d z  | j                  d«      «      }t        |t        «      r<t        | j                  d«      «      r!|j                  d«      dk(  rt        |«       y y y y )NÚgenerationConfigr|  rˆ  zapplication/json)r   r!   r9   rc   re   rƒ  rŽ  )rê   r„  s     r;   Ú$_rewrite_google_maps_response_formatr‘  p  si   € Ü#Ô$4°tÑ$;¸T¿X¹XÐFXÓ=YÓZÐäÐ$¤dÔ+Ü! $§(¡(¨7Ó"3Ô4Ø×!Ñ!Ð"6Ó7Ð;MÒMä-Ð.?Õ@ð Nð 5ð 	,r=   )r»   Úvertex_ai_betaÚgeminiÚcached_contentc           
      ó�  — t        ||¬«      }t        || ¬«      \  }} d|v rRt        ||¬«      }|du rAt        ||j	                  d«      ¬«      }	| j                  d|	dœ«       |j                  d«       g }
|j                  «       D ];  \  }}|j                  d«      sŒ|j                  ||i«       |
j                  |«       Œ= |j                  «       D ��ci c]  \  }}||
vsŒ||“Œ }}}	 |d	k(  r't        j                  «       j                  | ||¬
«      }n&t        j                  «       j                  | ||¬
«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«       t        j                  j!                  «       }t#        ||«      }|j                  «       D ��ci c]  \  }}t%        |t'        |«      «      sŒ||“Œ  }}}t        d"i |¤Ž}d|v r$t)        | «      }|rt+        |«      }|r
|�|d   |d<   t-        |¬«      }|du xs t        j.                  du }|r(|�||d<   |�||d<   |�||d<   |rd|vri |d<   d|d   d<   |�||d<   |�t1        |«      dkD  r||d<   |�||d<   |j                  dd«      x}rBt3        |t4        «      r-|j7                  «       dk(  rd|d <   n|j7                  «       |d <   n||d <   |r|t8        j:                  k7  r||d!<   t=        ||«       t?        |«       |S c c}}w c c}}w # t@        $ r}|‚d}~ww xY w)#zX
    Common transformation logic across sync + async Gemini /generateContent calls.
    )rl   r$  )Úsupports_system_messager]   r‡  F)rl   r‡  r&  )r*  r_   Úlitellm_param_r“  )r]   rl   r#  r|  NÚtool_choiceÚ$include_server_side_tool_invocationsÚsafety_settingsÚoutput_configzgemini-2rK   ÚmediaResolution)rE  Úsystem_instructionÚ
toolConfigTÚ includeServerSideToolInvocationsÚsafetySettingsr   r�  ÚcachedContentÚservice_tierÚdefaultÚstandardÚserviceTierÚlabelsrE   )!r-   Ú_transform_system_messager,   r   r9   r?  ru  rv  r‚   rw  rÉ   ÚGoogleAIStudioGeminiConfigÚ_transform_messagesrq   r!   Ú__annotations__r  r   r  r
  rj   rS   r#   Úmodify_paramsr„   rc   r¥   r8   r)   ÚGEMINIr{  r‘  rÈ   )r]   rl   rr  r$  r#  r”  r–  Úsystem_instructionsÚsupports_response_schemaÚuser_response_schema_messageÚremove_keysry  rz  r_   r|  r˜  r™  rš  Úconfig_fieldsr¦  Úfiltered_paramsr„  Úmax_media_resolutionÚmedia_resolution_valuerê   Ú"can_send_cache_incompatible_fieldsr¢  r×   s                               r;   Ú_transform_request_bodyr¶  z  sÛ  € ô &AÀuÐbuÔ%vÐÜ$=Ø 7À(ô%Ñ!Ð˜ð ˜OÑ+Ü#?ÀeÐatÔ#uÐ Ø# uÑ,Ü2HØØ /× 3Ñ 3Ð4EÓ Fô3Ð(ð �O‰O VÐ8TÑUÔVØ×ÑÐ 1Ô2ð €KØ×%Ñ%Ó'ò "‰ˆˆ1Ø�<‰<Ð(Õ)Ø×!Ñ! 1 a &Ô)Ø×Ñ˜qÕ!ð"ð
 )8×(=Ñ(=Ó(?×X¡  1À1ÈKÒCW�q˜!‘tÐX€OÑXðGØ (Ò*Ü×8Ñ8Ó:×NÑNØ!¨¸~ð Oó ‰Gô ×0Ñ0Ó2×FÑFØ!¨¸~ð Gó ˆGð &5×%8Ñ%8¸À$Ó%GˆØ0?×0CÑ0CÀMÐSWÓ0XˆØ5D×5HÑ5HÐIoÐqvÓ5wÐ,Ø<K×<OÑ<OÐPaÐcgÓ<hˆà×Ñ˜O¨TÔ2Ü/×?Ñ?×DÑDÓFˆô 2°/À>ÓRˆà,;×,AÑ,AÓ,C×r¡D A qÔGZÐ[\Ô^aÐboÓ^pÕGq˜1˜a™4ÐrˆÑrä<LÑ<_ÈÑ<_Ðð
 ˜ÑÜ*UÐV^Ó*_Ð Ù#Ü0XÐYmÓ0nÐ&Ù)Ð.?Ð.KØ;QÐRYÑ;ZÐ%Ð&7Ñ8ä!¨7Ô3ˆð 5CÀdÐ4JÒ4lÌg×NcÑNcÐglÐNlÐ*Ù-Ø"Ð.Ø-@�Ð)Ñ*ØÐ Ø %��W‘ØÐ&Ø%0��\Ñ"Ù3Ø tÑ+Ø)+�D˜Ñ&ØIM��\Ñ"Ð#EÑFØÐ&Ø%4ˆDÐ!Ñ"ØÐ(¬SÐ1BÓ-CÀaÒ-GØ'8ˆDÐ#Ñ$ØÐ%Ø$2ˆD�Ñ!à*×.Ñ.¨~¸tÓDÐDˆ<ÐDÜ˜,¬Ô,Ø×%Ñ%Ó'¨9Ò4Ø*4�D˜Ò'à*6×*<Ñ*<Ó*>�D˜Ò'à&2��]Ñ#ñ Ð)¬\×-@Ñ-@Ò@Ø#ˆD�‰NÜ! $¨Ô8Ü,¨TÔ2ð €KùóW Yùó, søôd ò Øˆûðús>   ÃL)Ã$L)Ã-C)L5 ÇL/Ç4L/Ç9D.L5 Ì/L5 Ì5	MÌ>M Í MÚgemini_api_keyÚapi_baseÚclientrD   Úextra_headersÚlogging_objÚvertex_locationÚvertex_auth_headerc                 ó¬   — ddl m}  |«       }|j                  ||| xs d||||||j                  dd «      ||	|||¬«      \  }}}t	        |||	|
||¬«      S ©Nr*   )ÚContextCachingEndpointsÚdummyr”  )r]   rr  Úapi_keyr¸  rl   r¹  rD   rº  r”  r»  r$  rµ   r¼  r½  )r]   rl   r$  r#  r”  rr  )Ú)context_caching.vertex_ai_context_cachingrÀ  Úcheck_and_create_cacheru  r¶  ©r·  r]   r¸  rl   r¹  rD   rº  rr  r»  r$  r#  rµ   r¼  r½  rÀ  Úcontext_caching_endpointsr”  s                    r;   Úsync_transform_request_bodyrÇ  ë  s’   € õ  Tá'>Ó'@Ðð 	"×8Ñ8ØØ'ØÒ) 'ØØØØØ#Ø&×*Ñ*Ð+;¸TÓBØØ/Ø%Ø'Ø-ð 	9ó 	ñ	ØØØô$ #ØØØ/Ø%Ø%Ø'ôð r=   c              ƒ   ó(  K  — ddl m}  |«       }|j                  ||| xs d||||||j                  dd «      ||	|||¬«      ƒ d {  –—† \  }}}t	        |«      r# t        t        «      |||	|
||¬«      ƒ d {  –—† S t        |||	|
||¬«      S 7 ŒG7 Œ­wr¿  )rÃ  rÀ  Úasync_check_and_create_cacheru  r´   r   r¶  rÅ  s                    r;   Úasync_transform_request_bodyrÊ    sß   è ø€ õ  Tá'>Ó'@Ðð (×DÑDØØ'ØÒ) 'ØØØØØ#Ø&×*Ñ*Ð+;¸TÓBØØ/Ø%Ø'Ø-ð Eó ÷ 	ñ	ØØØô$ 9¸ÔBð
 7”XÔ5Ó6ØØØ 3Ø)Ø)Ø+ô
÷ 
ð 	
ô #ØØØ/Ø%Ø%Ø'ôð ð?	øð,
ús$   ‚ABÁBÁ1BÁ8BÁ9BÂBc                  ó   — t        dd¬«      S )zÅ
    Returns a default user message when a "system" message is passed in gemini fails.

    This adds a blank user message to the messages list, to ensure that gemini doesn't fail the request.
    rŠ   r&  )r_   r*  )r   rE   r=   r;   Ú0_default_user_message_when_system_message_passedrÌ  _  s   € ô %¨S°vÔ>Ð>r=   r–  c                 óP  — g }g }| du rØt        |«      D ]›  \  }}|d   dk(  sŒd}t        |d   t        «      rt        |d   ¬«      }nCt        |d   t        «      r0d}|d   D ]  }||j                  d«      xs dz  }Œ t        |¬«      }|€Œz|j                  |«       |j                  |«       Œ� t        |«      d	kD  r!t        |«      D ]  }|j                  |«       Œ t        |«      d	kD  r5t        |«      d	k(  r|j                  t        «       «       t        |¬
«      |fS d|fS )aU  
    Extracts the system message from the openai message list.

    Converts the system message to Gemini format

    Returns
    - system_content_blocks: Optional[SystemInstructions] - the system message list in Gemini format.
    - messages: List[AllMessageValues] - filtered list of messages in OpenAI format (transformed separately)
    Tr*  r'  Nr_   r+  rš   rÐ   r   )r  )r>  rc   r¥   r"   rd   r9   r?  r„   Úreversedru  rÌ  r%   )	r–  r]   Úsystem_prompt_indicesÚsystem_content_blocksÚidxr½   Ú_system_content_blockÚsystem_textr_   s	            r;   r§  r§  h  sK  € ð $&ÐØ35ÐØ $Ñ&Ü% hÓ/ò 	6‰LˆC�Ø�v‰ (Ó*Ø9=Ð%Ü˜g iÑ0´#Ô6Ü,4¸'À)Ñ:LÔ,MÑ)Ü ¨	Ñ 2´DÔ9Ø"$�KØ#*¨9Ñ#5ò A˜Ø# w§{¡{°6Ó':Ò'@¸bÑ@™ðAä,4¸+Ô,FÐ)Ø(Ñ4Ø)×0Ñ0Ð1FÔGØ)×0Ñ0°Õ5ð	6ô Ð$Ó%¨Ò)ÜÐ 5Ó6ò "�Ø—‘˜SÕ!ð"ô Ð Ó! AÒ%ô
 ˆx‹=˜AÒØ�O‰OÔLÓNÔOä!Ð(=Ô>ÀÐHÐHà�ˆ>Ðr=   )NN)NNNNNN)NNN)pÚ__doc__rÒ   r›   r’   Útypingr   r   r   r   r   Úurllib.parser   rË   Úpydanticr	   rÉ   Úlitellm._loggingr
   Ú#litellm.litellm_core_utils.asyncifyr   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr   Ú3litellm.litellm_core_utils.prompt_templates.factoryr   r   r   r   r   r   Ú&litellm.llms.custom_httpx.http_handlerr   r   Ú#litellm.llms.vertex_ai.common_utilsr   râ   r   r   r   Úlitellm.types.llms.openair   r   r   r   r   r   r   Úlitellm.types.llms.vertex_air!   r"   r#   r$   r%   r&   r'   Úlitellm.types.utilsr(   r)   Úcommon_utilsr+   r,   r-   r.   rª  r/   r0   re   r¥   r<   rB   rF   Ú*litellm.litellm_core_utils.litellm_loggingrG   Ú_LiteLLMLoggingObjÚLiteLLMLoggingObjrS   r\   rd   rj   r|   Útupler‡   Úboolr–   r    r§   r´   rÞ   ræ   ró   rü   r   r
  r  r  r  r"  rB  rn  rq  r{  rƒ  rŽ  r‘  r¶  ÚfloatÚTimeoutrÇ  Úlitellm_core_utilsÚlitellm_loggingrÊ  rÌ  r§  rE   r=   r;   ú<module>rë     sú  ðòó Û 	Û 	ß ;Õ ;Ý ã Ý ã Ý +Ý 8õ÷÷ ÷ QÝ I÷ñ ÷
÷ ñ ô +÷÷ ñ ÷ G÷ñ ð )-Ð ˜3 ™:Ó ,ð 26Ð ˜K¨$Ñ.Ó 5à�ð4Ð ˜5  c¨3 h¡Ñ0ó ð
A¨sð A°só Að%˜#ó %ð&¨ó &ñ ÝXà*ÑàÐðØ�$‰Jðà	ˆ#ˆsˆ(�^�dÑóð¨3°©:ð À3ÈÁ:ð ÐRUÐX\ÑR\ó ð!ØÐ#Ñ$ð!àˆ4�Zó!ðH!%Ø
ð!%à�‰:ð!%ð    S ™>¨DÑ0ð!%ð ˜˜c˜‘N TÑ)ð	!%ð
 ó!%ðH&˜#ð & %¨¨S¨¡/ó &ð cð ¨dó ð&	°ð 	¸ó 	ð7Øð7à	ó7ð.0ØÐ#Ñ$ð0à	ó0ðj "&Ø%)ñxØðxà˜$‘Jðxð ˜d™
ðxð 	ˆ4�Zó	xðv7¸ð 7ÀCÈ$ÁJð 7ÐSVó 7ð8 Ø37ØØ,0Ø!%Ø%)ñkØðkà�$‰Jðkð    S ™>¨DÑ0ðkð �‰:ð	kð
 ˜˜c˜‘N TÑ)ðkð ˜$‘Jðkð ˜d™
ðkð ókð\K˜sð K só Kð>˜sð > só >ð
˜Sð °#ð ¸#À¹*ó ð( egñ ¨¨h©ð ¸xð ÐX\Ð]`ÑXað Ðkoó ð*0!Ø1ð0!àˆs�^ó0!ðj Ø"&Ø&*ñ	@ØÐ#Ñ$ð@à�‰:ð@ð ˜4‘Kð@ð ˜t™ð	@ð
 
ˆ+Ñó@ñH 7@ÀÈ&Ð@QÓ6RÐ ! 5¨Ñ#3Ó Rð! Kð !À$ð !È4ó !ð]  t¡ð ]°ó ]ð!:Ð=Mð !:ÐRVó !:ðHA¨{ð A¸tó AðnØÐ#Ñ$ðnàðnð ðnð !Ð!HÑIð	nð
 ðnð ˜$‘Jðnð ónðb0Ø˜$‘Jð0àÐ#Ñ$ð0ð �D‰jð0ð ð	0ð
 ˜$Ñð0ð �U—]‘]Ñ" TÑ)ð0ð ˜$‘;ð0ð ð0ð #ð0ð !Ð!HÑIð0ð ð0ð ˜$‘Jð0ð ˜4‘Zð0ð ˜d™
ð0ð ó0ðf>Ø˜$‘Jð>àÐ#Ñ$ð>ð �D‰jð>ð ð	>ð
 ˜tÑ#ð>ð �U—]‘]Ñ" TÑ)ð>ð ˜$‘;ð>ð ð>ð ×+Ñ+×;Ñ;×CÑCð>ð !Ð!HÑIð>ð ð>ð ˜$‘Jð>ð ˜4‘Zð>ð ˜d™
ð>ð ó>ðB?Ð:Só ?ð+Ø!ð+Ø-1Ð2BÑ-Cð+à
Ð Ñ$ dÐ+;Ñ&<Ð<Ñ=ô+r=   