Ë
    uPêjTº  ã                   óÖ  — U d dl Z d dlmZ d dlmZ d dl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 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mZmZ d dlmZ d dlm Z m!Z!  G d„ de«      Z"deddfd„Z#de$ddfd„Z%de$dz  de$e&e&f   dz  fd„Z'de$dz  de$dz  de$e&e&f   dz  fd„Z( G d„ de&e«      Z)e)D � cg c]  } | jT                  › d�‘Œ c} Z+ee,d<   dUde&de$dz  de)fd„Z-de&ded    de.fd!„Z/de&ded    de.fd"„Z0de&de.fd#„Z1d d$lmZ ed%   Z2de&de&fd&„Z3d'e&dz  de&fd(„Z4d'e&dz  de&fd)„Z5de&d*e&dz  d'e&dz  d+ed,   de6e&e&f   f
d-„Z7d.e2de&d/e.dz  d*e&dz  d'e&dz  d+ed,   de6e&e&f   fd0„Z8d.e2de&d/e.dz  de6e&e&f   fd1„Z9d2e:e   de.fd3„Z;dVd4„Z<dVd5„Z=dWd6e$d7e.fd8„Z>d6e$de$fd9„Z?d:e$e&ef   de$e&ef   fd;„Z@dVd<„ZAdVd=e$e&ef   d>eBde$e&ef   fd?„ZCdUd:e$e&ef   d@eDe&   de$e&ef   fdA„ZEdVdB„ZFdC„ ZGdDe&fdE„ZHdFe&deBfdG„ZIdVdH„ZJdIe&de&dz  fdJ„ZKdIe&de&dz  fdK„ZLdIe&de&dz  fdL„ZMdMe&d*e&d'e&de&fdN„ZNdOe&dMe&d'e&dz  d*e&dz  de
jž                  f
dP„ZP G dQ„ dRe«      ZQ G dS„ dTe«      ZRyc c} w )Xé    N)Údeepcopy)ÚEnum)ÚAnyÚFinalÚLiteralÚget_type_hints)Úverbose_logger)ÚDEFAULT_MAX_RECURSE_DEPTH)Úunpack_defs)ÚBaseLLMModelInfoÚBaseTokenCounter)ÚBaseLLMException)ÚAllMessageValues)Ú"VERTEX_AI_PROVIDER_METADATA_FIELDSÚPartTypeÚSchema)ÚTokenCountResponse)Úsupports_response_schemaÚsupports_system_messagesc                   óP   ‡ — e Zd Z	 ddededeej                  z  dz  fˆ fd„Zˆ xZ	S )ÚVertexAIErrorNÚstatus_codeÚmessageÚheadersc                 ó*   •— t         ‰| �  |||¬«       y )N)r   r   r   )ÚsuperÚ__init__)Úselfr   r   r   Ú	__class__s       €úh/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/common_utils.pyr   zVertexAIError.__init__   s   ø€ ô 	‰Ñ °kÈ7ÐÕSó    ©N)
Ú__name__Ú
__module__Ú__qualname__ÚintÚstrÚdictÚhttpxÚHeadersr   Ú__classcell__)r   s   @r    r   r      sA   ø„ ð
 04ñ	TàðTð ðTð ˜Ÿ™Ñ%¨Ñ,÷	Tñ Tr!   r   ÚobjÚreturnc                 óŒ  — t        | t        «      rTt        D ]  }|| v sŒg | |<   Œ | j                  d«      }t        |t        «      rt        D ]  }|j	                  |d «       Œ y t        D ]  }t        | |«      sŒt        | |g «       Œ t        | dd «      }t        |t        «      rt        D ]  }|j	                  |d «       Œ y y )NÚ_hidden_params)Ú
isinstancer(   r   ÚgetÚpopÚhasattrÚsetattrÚgetattr)r,   ÚfieldÚhidden_paramss      r    Ú,redact_vertex_ai_metadata_from_logged_objectr8   "   sÌ   € Ü�#”tÔÜ7ò 	 ˆEØ˜Š|Ø��E’
ð	 ð Ÿ™Ð 0Ó1ˆÜ�m¤TÔ*Ü;ò /�Ø×!Ñ! %¨Õ.ð/àä3ò $ˆÜ�3˜ÕÜ�C˜ Õ#ð$ô ˜CÐ!1°4Ó8€MÜ�-¤Ô&Ü7ò 	+ˆEØ×Ñ˜e TÕ*ñ	+ð 'r!   Úmodel_call_detailsc                 ó  — | j                  d«      }t        |t        «      sydD ]c  }|j                  |«      }t        |t        «      sŒ%|j                  d«      }t        |t        «      sŒGt        D ]  }|j	                  |d«       Œ Œe y)zÃ
    success_handler() merges response._hidden_params into
    litellm_params.metadata['hidden_params'] before redaction runs, so the Vertex
    metadata must be scrubbed from that copy too.
    Úlitellm_paramsN©ÚmetadataÚlitellm_metadatar7   )r1   r0   r(   r   r2   )r9   r;   Úmetadata_keyr=   r7   r6   s         r    Ú-redact_vertex_ai_metadata_from_litellm_paramsr@   6   sˆ   € ð /×2Ñ2Ð3CÓD€NÜ�n¤dÔ+Øà8ò +ˆØ!×%Ñ% lÓ3ˆÜ˜(¤DÔ)ØØ Ÿ™ _Ó5ˆÜ˜-¬Ô.ØÜ7ò 	+ˆEØ×Ñ˜e TÕ*ñ	+ñ+r!   r;   c           	      ó  — | sydD ]t  }|| vrŒ| |   }|�t        |t        «      sŒ d|vrŒ%|d   }t        |t        «      sŒ;|j                  «       D ��ci c]  \  }}t        |t        «      sŒ||“Œ }}}|sŒr|c S  yc c}}w )a5  
    Build Vertex/GCP billing labels from LiteLLM user metadata on ``litellm_params``:
    ``metadata`` (``completion(..., metadata=...)``) or ``litellm_metadata``,
    using ``requester_metadata`` string key-value pairs (same convention as Gemini).
    ``metadata`` is tried first when both are present.
    Nr<   Úrequester_metadata)r0   r(   Úitemsr'   )r;   Úkeyr=   ÚrmÚkÚvÚlabelss          r    Ú)vertex_request_labels_from_litellm_paramsrI   K   s    € ñ ØØ/ò ˆØ�nÑ$ØØ! #Ñ&ˆØÐ¤:¨h¼Ô#=ØØ xÑ/ØØÐ*Ñ+ˆÜ˜"œdÔ#ØØ#%§8¡8£:×D™4˜1˜a´¸A¼sÕ1C�!�Q‘$ÐDˆÑDÚØŠMðð ùó Es   ÁA>Á-A>Úoptional_paramsc                 óî   — d}| �Yd| v rU| j                  d«      }t        |t        «      r4|j                  «       D ��ci c]  \  }}t        |t        «      sŒ||“Œ }}}|st        |«      }|r|S dS c c}}w )zä
    Resolve labels from optional ``labels`` (Gemini-style) and/or
    ``litellm_params["metadata"]`` / ``litellm_params["litellm_metadata"]``
    (``requester_metadata``). Pops ``labels`` from optional_params when present.
    NrH   )r2   r0   r(   rC   r'   rI   )rJ   r;   rH   ÚrawrF   rG   s         r    Úpop_vertex_request_labelsrM   g   sz   € ð %)€FØÐ" x°?Ñ'BØ$×(Ñ(¨Ó2ˆÜ�cœ4Ô Ø'*§y¡y£{×I™t˜q !´jÀÄCÕ6H�a˜‘dÐIˆFÑIÙÜ:¸>ÓJˆÙˆ6Ð% Ð%ùó Js   ½A1ÁA1c                   ó0   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)ÚVertexAIModelRoutez Enum for Vertex AI model routingÚpartner_modelsÚgeminiÚgemmaÚbgeÚmodel_gardenÚ
non_geminiÚopenaiÚagent_engineN)r#   r$   r%   Ú__doc__ÚPARTNER_MODELSÚGEMINIÚGEMMAÚBGEÚMODEL_GARDENÚ
NON_GEMINIÚOPENAI_COMPATIBLEÚAGENT_ENGINE© r!   r    rO   rO   z   s.   „ Ù*à%€NØ€FØ€EØ
€CØ!€LØ€JØ ÐØ!�Lr!   rO   ú/ÚVERTEX_AI_MODEL_ROUTESÚmodelc                 ó:  — ddl m} |r(|j                  d«      �d|d   v rt        j                  S d| v rt        j
                  S | j                  «       r#|r!|j                  d«      rt        j                  S |j                  | ¬«      rt        j                  S d| v sd	| j                  «       v rt        j                  S d
| v rt        j                  S d| v s| j                  d«      rt        j                  S d| v rt        j                  S t        j                  S )aã  
    Determine which handler to use for a Vertex AI model based on the model name.

    Args:
        model: The model name (e.g., "llama3-405b", "gemini-pro", "gemma/gemma-3-12b-it", "xai/grok-4.1-fast-non-reasoning")
        litellm_params: Optional litellm parameters dict that may contain base_model for routing

    Returns:
        VertexAIModelRoute: The route enum indicating which handler should be used

    Examples:
        >>> get_vertex_ai_model_route("llama3-405b")
        VertexAIModelRoute.PARTNER_MODELS

        >>> get_vertex_ai_model_route("gemini-pro")
        VertexAIModelRoute.GEMINI

        >>> get_vertex_ai_model_route("gemma/gemma-3-12b-it")
        VertexAIModelRoute.GEMMA

        >>> get_vertex_ai_model_route("xai/grok-4.1-fast-non-reasoning")
        VertexAIModelRoute.MODEL_GARDEN

        >>> get_vertex_ai_model_route("1234567890", {"api_base": "http://10.96.32.8"})
        VertexAIModelRoute.GEMINI  # Numeric endpoints with api_base use HTTP path
    r   ©ÚVertexAIPartnerModelsÚ
base_modelrQ   zagent_engine/Úapi_base©rd   zbge/rS   zgemma/rV   zxai/)Ú4litellm.llms.vertex_ai.vertex_ai_partner_models.mainrg   r1   rO   rZ   r`   ÚisdigitÚis_vertex_partner_modelrY   Úlowerr\   r[   Ú
startswithr]   r^   )rd   r;   rg   s      r    Úget_vertex_ai_model_routerp   Š   s  € õ6ñ
 ˜.×,Ñ,¨\Ó:ÐFØ�~ lÑ3Ñ3Ü%×,Ñ,Ð,ð ˜%ÑÜ!×.Ñ.Ð.ð ‡}�}„™>¨n×.@Ñ.@ÀÔ.LÜ!×(Ñ(Ð(ð ×4Ñ4¸5Ð4ÔAÜ!×0Ñ0Ð0ð ��˜% 5§;¡;£=Ñ0Ü!×%Ñ%Ð%ð �5ÑÜ!×'Ñ'Ð'ð �5Ñ˜E×,Ñ,¨VÔ4Ü!×.Ñ.Ð.ð �5ÑÜ!×(Ñ(Ð(ô ×(Ñ(Ð(r!   Úcustom_llm_provider)Ú	vertex_aiÚvertex_ai_betarQ   c                 óÔ   — 	 |}|dk(  rd}t        | |¬«      }t        j                  j                  | «      rd}|S # t        $ r#}t        j                  d|«       d}Y d }~|S d }~ww xY w)Nrs   rr   ©rd   rq   TzÂUnable to identify if system message supported. Defaulting to 'False'. Received error message - %s
Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.jsonF)r   ÚlitellmÚVertexGeminiConfigÚ_is_model_gemini_spec_modelÚ	Exceptionr	   Úwarning)rd   rq   Ú_custom_llm_providerÚsupports_system_messageÚes        r    Úget_supports_system_messager~   Ò   s…   € ð(Ø2ÐØÐ"2Ò2Ø#.Ð Ü":ÀÐ\pÔ"qÐô ×%Ñ%×AÑAÀ%ÔHØ&*Ð#ð #Ð"øô ò (Ü×Ñð RØô	
ð #(Ôà"Ð"ûð(ús   ‚7; »	A'ÁA"Á"A'c                 ó2   — |}|dk(  rd}t        | |¬«      }|S )Nrs   rr   ru   )r   )rd   rq   r{   Ú_supports_response_schemas       r    Úget_supports_response_schemar�   è   s-   € ð /ÐØÐ.Ò.Ø*Ðä'?ÀeÐauÔ'vÐà$Ð$r!   c                 ó€   — | j                  «       }t        j                  d«      }t        |j	                  |«      «      S )aÐ  
    Check if the model supports responseJsonSchema (JSON Schema format).

    responseJsonSchema is supported by Gemini 2.0+ models and uses standard
    JSON Schema format with lowercase types (string, object, etc.) instead of
    the OpenAPI-style responseSchema with uppercase types (STRING, OBJECT, etc.).

    Benefits of responseJsonSchema:
    - Supports additionalProperties for stricter schema validation
    - Uses standard JSON Schema format (no type conversion needed)
    - Better compatibility with Pydantic's model_json_schema()

    Args:
        model: The model name (e.g., "gemini-2.0-flash", "gemini-2.5-pro")

    Returns:
        True if the model supports responseJsonSchema, False otherwise
    z"gemini-(?:[2-9]|[1-9]\d+)(?:\.|\-))rn   ÚreÚcompileÚboolÚsearch)rd   Úmodel_lowerÚgemini_2_plus_patterns      r    Úsupports_response_json_schemar‰   ô   s8   € ð& Ÿ™›€Kô $&§:¡:Ð.SÓ#TÐäÐ%×,Ñ,¨[Ó9Ó:Ð:r!   )r   )ÚchatÚ	embeddingÚbatch_embeddingÚimage_generationÚcount_tokensc                 óh   — t         D ](  }| j                  |«      sŒ| j                  |dd«      c S  | S )an  
    Strip routing prefixes from model name for PSC/endpoint URL construction.

    Patterns like "bge/", "gemma/", "openai/" are used for internal routing but
    should not appear in the actual endpoint URL. Routing prefixes are derived
    from VertexAIModelRoute enum values.

    Args:
        model: The model name with potential prefix (e.g., "bge/123456", "gemma/gemma-3-12b-it")

    Returns:
        str: The model name without routing prefix (e.g., "123456", "gemma-3-12b-it")

    Examples:
        >>> get_vertex_base_model_name("bge/378943383978115072")
        "378943383978115072"

        >>> get_vertex_base_model_name("gemma/gemma-3-12b-it")
        "gemma-3-12b-it"

        >>> get_vertex_base_model_name("xai/grok-4.1-fast-non-reasoning")
        "grok-4.1-fast-non-reasoning"

        >>> get_vertex_base_model_name("1234567890")
        "1234567890"
    Ú é   )rc   ro   Úreplace)rd   Úroutes     r    Úget_vertex_base_model_namer”     s;   € ô: (ò /ˆØ×Ñ˜EÕ"Ø—=‘= ¨¨AÓ.Ò.ð/ð €Lr!   Úvertex_locationc                 óp   — | dk(  r| S | €t        d«      ‚t        j                  d| «      st        d«      ‚| S )aR  
    Validate a Vertex AI location before interpolating it into a request host or
    URL path.

    ``vertex_location`` is client-controllable on the proxy (it flows in from the
    request body), so it must never be trusted verbatim in a URL or an attacker
    could point the host at their own server and exfiltrate the admin's Google
    access token. Allow the special ``global`` control plane and otherwise require
    a lowercase alphanumeric-plus-hyphen token (e.g. ``us``, ``us-central1``,
    ``eu``), which rejects host injection like ``attacker.example/`` or
    ``evil.com#``.
    Úglobalzvertex_location is requiredz^[a-z][a-z0-9-]*$zInvalid vertex_location format)Ú
ValueErrorrƒ   Úmatch)r•   s    r    Úvalidate_vertex_locationrš   9  sE   € ð ˜(Ò"ØÐØÐÜÐ6Ó7Ð7Ü�8‰8Ð(¨/Ô:ÜÐ9Ó:Ð:ØÐr!   c                 óD   — t        | «      }|dk(  ryd|vrd|› d�S d|› d�S )a'  
    Get the base URL for Vertex AI API calls.

    - ``global`` uses the global control plane host.
    - Multi-region geographies (e.g. ``us``, ``eu``) use ``aiplatform.{geo}.rep.googleapis.com``.
    - Regional locations (e.g. ``us-central1``) use ``{region}-aiplatform.googleapis.com``.
    r—   z!https://aiplatform.googleapis.comú-zhttps://aiplatform.z.rep.googleapis.comzhttps://z-aiplatform.googleapis.com)rš   )r•   Úvalidated_locations     r    Úget_vertex_base_urlrž   O  sG   € ô !9¸Ó IÐØ˜XÒ%Ø2Ø
Ð$Ñ$Ø$Ð%7Ð$8Ð8KÐLÐLØÐ(Ð)Ð)CÐDÐDr!   Úvertex_projectÚvertex_api_version)Úv1Úv1beta1c                 ó,  — | }t        | ¬«      } 	 t        j                  |d¬«      }|j                  dd«      }|rdnd}t        |«      }| j                  «       r|› d|› d	|› d
|› d| › d|› �}	|	|fS |› d|› d
|› d| › d|› �	}	|	|fS # t        $ r d}Y ŒYw xY w)aM  
    Get URL for embedding models.

    Handles special patterns:
    - bge/endpoint_id -> strips to endpoint_id for endpoints/ routing
    - numeric model -> routes to endpoints/
    - regular model -> routes to publishers/google/models/
    - models with uses_embed_content flag -> use embedContent endpoint instead of predict
    rj   rr   ru   Úuses_embed_contentFÚembedContentÚpredictrb   ú
/projects/ú/locations/ú/endpoints/ú:ú/v1/projects/ú/publishers/google/models/)r”   rv   Úget_model_infor1   ry   rž   rl   )
rd   rŸ   r•   r    Úoriginal_modelÚ
model_infor¤   ÚendpointÚbase_urlÚurls
             r    Ú_get_embedding_urlr³   a  sú   € ð "€NÜ&¨UÔ3€Eð#Ü#×2Ñ2Ø Ø +ô
ˆ
ð (Ÿ^™^Ð,@À%ÓHÐñ );‘nÀ	€Hä)¨/Ó:€Hà‡}�}„Ø�
˜!Ð.Ð/¨z¸.Ð9IÈÐUdÐTeÐepÐqvÐpwÐwxð  zBð  yCð  Dˆð �ˆ=Ðð �
˜-¨Ð'7°{À?ÐBSÐSmÐnsÐmtÐtuÐv~Ðuð  Aˆà�ˆ=Ðøô ò #Ø"Òð#ús   �)B ÂBÂBÚmodeÚstreamc                 ó(  — d }d }t         j                  j                  |¬«      }| dk(  rTd}t        |«      }|du rd}|j	                  «       r|› d|› d|› d|› d	|› d
|› �}n|› d|› d|› d|› d|› d
|› �}|du r†|dz  }n€| dk(  rt        ||||¬«      S | dk(  rBd}t        |«      }|j	                  «       r|› d|› d|› d|› d	|› d
|› �}n6|› d|› d|› d|› d
|› �	}n%| dk(  r d}t        |«      }|› d|› d|› d|› d|› d
|› �}|r|st        d| › �«      ‚||fS )Nrj   rŠ   ÚgenerateContentTÚstreamGenerateContentrb   r§   r¨   r©   rª   r¬   ú?alt=sser‹   )rd   rŸ   r•   r    r�   r¦   r«   rŽ   ÚcountTokensz,Unable to get vertex url/endpoint for mode: )rv   rw   Úget_model_for_vertex_ai_urlrž   rl   r³   r˜   )	r´   rd   rµ   rŸ   r•   r    r²   r°   r±   s	            r    Ú_get_vertex_urlr¼   ˆ  s/  € ð €CØ€Hä×&Ñ&×BÑBÈÐBÓO€Eàˆv‚~à$ˆÜ& Ó7ˆà�T‰>Ø.ˆHð
 �=‰=Œ?à�J˜aÐ 2Ð3°:¸nÐ=MÈ[ÐYhÐXiÐitÐuzÐt{Ð{|ð  ~Fð  }Gð  H‰Cð �J˜aÐ 2Ð3°:¸nÐ=MÈ[ÐYhÐXið  jDð  EJð  DKð  KLð  MUð  LVð  WˆCà�T‰>Ø�:Ñ‰CØ	�Ò	Ü!ØØ)Ø+Ø1ô	
ð 	
ð 
Ð#Ò	#ØˆÜ& Ó7ˆØ�=‰=Œ?à�J˜aÐ 2Ð3°:¸nÐ=MÈ[ÐYhÐXiÐitÐuzÐt{Ð{|ð  ~Fð  }Gð  H‰Cð �J˜m¨NÐ+;¸;ÀÐFWÐWqÐrwÐqxÐxyð  {Cð  zDð  E‰CØ	�Ò	Ø ˆÜ& Ó7ˆØ�
˜!Ð.Ð/¨z¸.Ð9IÈÐUdÐTeÐeð  AFð  @Gð  GHð  IQð  HRð  SˆÙ‘hÜÐGÈÀvÐNÓOÐOØ�ˆ=Ðr!   c                 óH  — ddl m} d|› �}|j                  |«      rdnd}| dk(  r'd}|du rd	}d
|› d|› d|› d�}||fS d
|› d|› d|› �}||fS | dk(  rd}d|› d|› �}||fS | dk(  rd}d|› d|› �}||fS | dk(  rd}d|› d|› �}||fS | dk(  rt        d«      ‚t        d| › �«      ‚)z×Build the Gemini API URL for the given mode.

    The API key is NOT included in the URL. Callers must pass it via the
    ``x-goog-api-key`` header instead to avoid leaking credentials in
    error tracebacks.
    r   )rw   zmodels/Úv1alphaÚv1betarŠ   r·   Tr¸   z*https://generativelanguage.googleapis.com/rb   rª   r¹   r‹   r¥   z1https://generativelanguage.googleapis.com/v1beta/rŒ   ÚbatchEmbedContentsrŽ   rº   r�   z¦LiteLLM's `gemini/` route does not support image generation yet. Let us know if you need this feature by opening an issue at https://github.com/BerriAI/litellm/issueszUnsupported mode: )Ú@litellm.llms.vertex_ai.gemini.vertex_and_google_ai_studio_geminirw   Ú_is_gemini_3_or_newerr˜   )r´   rd   rµ   rw   Ú_gemini_model_nameÚapi_versionr°   r²   s           r    Ú_get_gemini_urlrÅ   Â  sd  € õð #*¨%¨Ð 1ÐØ&8×&NÑ&NÈuÔ&U™Ð[c€Kàˆv‚~Ø$ˆØ�T‰>Ø.ˆHØ>¸{¸mÈ1ÐM_ÐL`Ð`aÐbjÐakÐksÐtˆCð& �ˆ=Ðð# ?¸{¸mÈ1ÐM_ÐL`Ð`aÐbjÐakÐlˆCð" �ˆ=Ðð! 
�Ò	Ø!ˆØAÐBTÐAUÐUVÐW_ÐV`Ðaˆð �ˆ=Ðð 
Ð"Ò	"Ø'ˆØAÐBTÐAUÐUVÐW_ÐV`Ðaˆð �ˆ=Ðð 
�Ò	Ø ˆØAÐBTÐAUÐUVÐW_ÐV`Ðaˆð �ˆ=Ðð 
Ð#Ò	#Üð uó
ð 	
ô Ð-¨d¨VÐ4Ó5Ð5r!   Úpartsc                 óJ   — d}| D ]  }d|v sŒ|j                  d«      €Œd}Œ |S )a#  
    check that user_content has 'text' parameter.
        - Known Vertex Error: Unable to submit request because it must have a text parameter.
        - 'text' param needs to be present (empty strings are valid)
        - Relevant Issue: https://github.com/BerriAI/litellm/issues/5515
    FÚtextT)r1   )rÆ   Úhas_text_paramÚparts      r    Ú_check_text_in_contentrË   î  s:   € ð €NØò "ˆØ�TŠ>˜dŸh™h vÓ.Ñ:Ø!‰Nð"ð Ðr!   c                 óp  — |t         kD  rt        dt         › d�«      ‚d| v r0t        | d   t        «      r| d   D �cg c]  }|dk(  rdn|‘Œ c}| d<   | j	                  dd«      }|�(|j                  «       D ]  \  }}t        ||dz   ¬«       Œ | j	                  d	d«      }|�t        ||dz   ¬«       yyc c}w )
zkFix empty strings in enum values by replacing them with None. Gemini doesn't accept empty strings in enums.úMax depth of ú" exceeded while processing schema.Úenumr�   NÚ
propertiesr‘   ©ÚdepthrC   )r
   r˜   r0   Úlistr1   rC   Ú_fix_enum_empty_strings)ÚschemarÒ   ÚvaluerÐ   Ú_rC   s         r    rÔ   rÔ   ý  sÍ   € àÔ(Ò(Ü˜=Ô)BÐ(CÐCeÐfÓgÐgà�ÑœJ v¨f¡~´tÔ<ØFLÈVÁnÖU¸U %¨2¢+™$°5Ñ8ÒUˆˆv‰ð Ÿ
™
 <°Ó6€JØÐØ"×(Ñ(Ó*ò 	<‰HˆAˆuÜ# E°¸±Ö;ð	<ð —:‘:˜g tÓ,€EØÐÜ ¨U°Q©YÖ7ð ùò Vs   »B3c                 óf  — |t         kD  rt        dt         › d�«      ‚t        | t        «      syd| v rÒt        | d   t        «      r¿| j                  d«      }d}t        |t        «      r|j                  «       dk(  rd}nr| j                  d	«      }t        |t        «      rQ|D ]L  }t        |t        «      sŒ|j                  d«      }t        |t        «      sŒ6|j                  «       dk(  sŒJd} n |s| j                  dd«       | j                  d
d«      }|�(|j                  «       D ]  \  }}	t        |	|dz   ¬«       Œ | j                  dd«      }
|
�t        |
|dz   ¬«       | j                  d	d«      }|�:t        |t        «      r)|D ]#  }t        |t        «      sŒt        ||dz   ¬«       Œ% yyy)a+  Remove `enum` fields when the schema type is not string.

    Gemini / Vertex APIs only allow enums for string-typed fields. When an enum
    is present on a non-string typed property (or when `anyOf` types do not
    include a string type), remove the enum to avoid provider validation errors.
    rÍ   rÎ   NrÏ   ÚtypeFÚstringTÚanyOfrÐ   r‘   rÑ   rC   )r
   r˜   r0   r(   rÓ   r1   r'   rn   r2   rC   Ú_fix_enum_types)rÕ   rÒ   Úschema_typeÚ	keep_enumÚanyofÚitemÚ	item_typerÐ   r×   rÖ   rC   s              r    rÜ   rÜ     s¢  € ð Ô(Ò(Ü˜=Ô)BÐ(CÐCeÐfÓgÐgä�fœdÔ#Øð �ÑœJ v¨f¡~´tÔ<Ø#ŸZ™Z¨Ó/ˆØˆ	Ü�k¤3Ô'¨K×,=Ñ,=Ó,?À8Ò,KØ‰Ià—J‘J˜wÓ'ˆEÜ˜%¤Ô&Ø!ò "�DÜ! $¬Õ-Ø$(§H¡H¨VÓ$4˜	Ü% i´Õ5¸)¿/¹/Ó:KÈxÓ:WØ(,˜IÙ!ð"ñ Ø�J‰J�v˜tÔ$ð Ÿ
™
 <°Ó6€JØÐØ"×(Ñ(Ó*ò 	4‰HˆAˆuÜ˜E¨°©Ö3ð	4ð —:‘:˜g tÓ,€EØÐÜ˜ U¨Q¡YÕ/à�J‰J�w Ó%€EØÐœZ¨¬tÔ4Øò 	7ˆDÜ˜$¤Õ%Ü ¨E°A©IÖ6ñ	7ð 5Ðr!   Ú
parametersÚadd_property_orderingc                 óD  — t        t        t        «      j                  «       «      }| j	                  di «      }t        | |«       t        | «       t        | «       t        | «       t        | «       t        | «       t        | «       t        | |«      } |rt        | «       | S )aÏ  
    This is a modified version of https://github.com/google-gemini/generative-ai-python/blob/8f77cc6ac99937cd3a81299ecf79608b91b06bbb/google/generativeai/types/content_types.py#L419

    Updates the input parameters, removing extraneous fields, adjusting types, unwinding $defs, and adding propertyOrdering if specified, returning the updated parameters.

    Parameters:
        parameters: dict - the json schema to build from
        add_property_ordering: bool - whether to add propertyOrdering to the schema. This is only applicable to schemas for structured outputs. See
          set_schema_property_ordering for more details.
    Returns:
        parameters: dict - the input parameters, modified in place
    z$defs)Úsetr   r   Úkeysr2   r   Úconvert_anyof_null_to_nullableÚ_convert_schema_typesrÔ   rÜ   Úprocess_itemsÚadd_object_typeÚfilter_schema_fieldsÚset_schema_property_ordering)râ   rã   Úvalid_schema_fieldsÚdefss       r    Ú_build_vertex_schemarï   A  s‘   € ô "%¤^´FÓ%;×%@Ñ%@Ó%BÓ!CÐà—.‘. ¨"Ó-€Dô
 �
˜DÔ!ô # :Ô.ä˜*Ô%ô ˜JÔ'ô �JÔô �*ÔÜ�JÔô & jÐ2EÓF€JáÜ$ ZÔ0àÐr!   c                 ó   — | S )a3  
    Build a JSON Schema for use with Gemini's responseJsonSchema parameter.

    Unlike _build_vertex_schema (used for responseSchema), this function:
    - Does NOT convert types to uppercase (keeps standard JSON Schema format)
    - Does NOT add propertyOrdering
    - Does NOT filter fields (allows additionalProperties)
    - Preserves $defs/$ref (Gemini 2.0+ supports JSON Schema references natively)

    Parameters:
        parameters: dict - the JSON schema to process

    Returns:
        dict - the processed schema in standard JSON Schema format
    ra   )râ   s    r    Ú_build_json_schemarñ   t  s
   € ð. Ðr!   Úschema_dictc                 ó  — | j                  dd«      }| j                  dd«      }t        | t        «      rV| j                  d«      rE| d   }|s|r8t        |t        «      r(t	        d„ |D «       «      r|D ]  }|r||d<   |sŒ||d<   Œ d|iS | S )aM  
    When anyof is present, only keep the anyof field and its contents - otherwise VertexAI will throw an error - https://github.com/BerriAI/litellm/issues/11164
    Filter out other fields in the same dict.

    E.g. {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "test"} -> {"anyOf": [{"type": "string"}, {"type": "null"}]}

    Case 2: If additional metadata is present, try to keep it
    E.g. {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "test", "title": "test"} -> {"anyOf": [{"type": "string", "title": "test"}, {"type": "null", "title": "test"}]}
    ÚtitleNÚdescriptionrÛ   c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr"   )r0   r(   )Ú.0rà   s     r    ú	<genexpr>z'_filter_anyof_fields.<locals>.<genexpr>�  s   è ø€ ÒFqÐbfÄzÐRVÔX\×G]ÑFqùs   ‚)r1   r0   r(   rÓ   Úall)rò   rô   rõ   Úany_ofrà   s        r    Ú_filter_anyof_fieldsrû   Ž  sš   € ð —?‘? 7¨DÓ1€EØ$Ÿ™¨¸Ó=€Kä�+œtÔ$¨¯©¸Ô)AØ# GÑ,ˆÙ‘[¤j°¼Ô&>Ä3ÑFqÐjpÔFqÔCqØò 6�ÙØ$)�D˜‘MÚØ*5�D˜Ò'ð	6ð
 ˜Ð Ð ØÐr!   c                 ó  — |t         kD  rt        dt         › d�«      ‚t        | t        «      rÜ| j	                  d«      }t        |t
        «      r+|j                  «       dk(  rd| vs,| j	                  d«      i k(  s| j	                  d«      dk(  rd| vrddi| d<   | j                  «       D ]]  \  }}t        |t        «      rt        ||dz   «       Œ&t        |t        «      sŒ7|D ]"  }t        |t        «      sŒt        ||dz   «       Œ$ Œ_ y y )NrÍ   úQ exceeded while processing schema. Please check the schema for excessive nesting.rÙ   ÚarrayrC   Úobjectr‘   )
r
   r˜   r0   r(   r1   r'   rn   rC   ré   rÓ   )rÕ   rÒ   Útype_valrD   rÖ   rà   s         r    ré   ré   §  s
  € ØÔ(Ò(ÜØÔ5Ð6ð  7Hð  Ió
ð 	
ô �&œ$Ôð !Ÿ*™* VÓ,ˆô ˜8¤SÔ)Ø—N‘NÓ$¨Ò/Ø FÑ*¨f¯j©j¸Ó.AÀRÒ.Gà�z‰z˜&Ó! WÒ,Ø˜vÑ%à% xÐ0ˆF�7‰OØ Ÿ,™,›.ò 	7‰JˆC�Ü˜%¤Ô&Ü˜e U¨Q¡YÕ/Ü˜E¤4Õ(Ø!ò 7�DÜ! $¬Õ-Ü% d¨E°A©IÕ6ñ7ñ		7ð  r!   rÕ   rÒ   c                 óR  — |t         kD  rt        dt         › d�«      ‚d| v rjt        | d   t        «      rWd| vr)| d   j	                  «       D ��cg c]  \  }}|‘Œ	 c}}| d<   | d   j	                  «       D ]  \  }}t        ||dz   «       Œ d| v rt        | d   |dz   «       | S c c}}w )ay  
    vertex ai and generativeai apis order output of fields alphabetically, unless you specify the order.
    python dicts retain order, so we just use that. Note that this field only applies to structured outputs, and not tools.
    Function tools are not afflicted by the same alphabetical ordering issue, (the order of keys returned seems to be arbitrary, up to the model)
    https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.cachedContents#Schema.FIELDS.property_ordering

    Args:
        schema: The schema dictionary to process
        depth: Current recursion depth to prevent infinite loops
    rÍ   rý   rÐ   ÚpropertyOrderingr‘   rC   )r
   r˜   r0   r(   rC   rì   )rÕ   rÒ   rF   rG   s       r    rì   rì   Ã  sË   € ð Ô(Ò(ÜØÔ5Ð6ð  7Hð  Ió
ð 	
ð �vÑ¤*¨V°LÑ-AÄ4Ô"Hà VÑ+Ø8>¸|Ñ8L×8RÑ8RÓ8T×)U±°°1ª!Ó)UˆFÐ%Ñ&Ø˜<Ñ(×.Ñ.Ó0ò 	7‰DˆAˆqÜ(¨¨E°A©IÕ6ð	7à�&ÑÜ$ V¨G¡_°e¸a±iÔ@Ø€Mùó *Vs   ÁB#Úvalid_fieldsc                 ó^  — |€
t        «       }t        | «      }||v r| S |j                  |«       t        | t        «      s| S i }t        | «      } | j                  «       D ]Á  \  }}||vrŒ|dk(  rCt        |t        «      r3|j                  «       D ��ci c]  \  }}|t        |||«      “Œ c}}||<   ŒS|dk(  r|dv r|||<   ŒbŒc|dk(  r!t        |t        «      rt        |||«      ||<   Œ‰|dk(  r/t        |t        «      r|D �	cg c]  }	t        |	||«      ‘Œ c}	||<   Œ½|||<   ŒÃ |S c c}}w c c}	w )zK
    Recursively filter a schema dictionary to keep only valid fields.
    rÐ   Úformat>   ú	date-timerÏ   rC   rÛ   )	rå   ÚidÚaddr0   r(   rû   rC   rë   rÓ   )
rò   r  Ú	processedÚ	schema_idÚresultrD   rÖ   rF   rG   rà   s
             r    rë   rë   Þ  sI  € ð ÐÜ“Eˆ	ô ˜+“€IØ�IÑØÐØ‡M�M�)Ôä�k¤4Ô(ØÐà€FÜ& {Ó3€KØ!×'Ñ'Ó)ò  ‰
ˆˆUØ�lÑ"Øà�,Ò¤:¨e´TÔ#:Ø[`×[fÑ[fÓ[h×iÑSWÐSTÐVW˜1Ô2°1°lÀIÓNÑNÓiˆF�3ŠKØ�HŠ_ØÐ-Ñ-Ø#��s’àØ�GŠ^¤
¨5´$Ô 7Ü.¨u°lÀIÓNˆF�3ŠKØ�GŠ^¤
¨5´$Ô 7Ø[`ÖaÐSWÔ/°°lÀIÕNÒaˆF�3ŠKàˆF�3ŠKð! ð$ €Mùó jùò bs   ÂD$Ä D*c                 ó*  — |t         kD  rt        dt         › d�«      ‚	 | j                  dd «      }|��d}|D ]S  }t        |t        «      r(|j                  d«      dk(  r|j                  |«       d}Œ;d|vsŒ@t        |«      dk(  sŒOd	|d<   ŒU t        |«      dk(  rt        d
«      ‚|r|D ]  }d|d<   Œ	 | j                  dd «      }|�(|j                  «       D ]  \  }}t        ||dz   ¬«       Œ | j                  dd «      }|�t        ||dz   ¬«       y y )NrÍ   rý   rÛ   FrÙ   ÚnullTr   rÿ   zaInvalid input: AnyOf schema with only null type is not supported. Please provide a non-null type.ÚnullablerÐ   r‘   rÑ   rC   )	r
   r˜   r1   r0   r(   ÚremoveÚlenrC   rç   )	rÕ   rÒ   rß   Úcontains_nullÚatyperÐ   ÚnamerÖ   rC   s	            r    rç   rç     sO  € ØÔ(Ò(ÜØÔ5Ð6ð  7Hð  Ió
ð 	
ð mØ—:‘:˜g tÓ,€EØÐØˆØò 	)ˆEÜ˜%¤Ô&¨5¯9©9°VÓ+<ÀÒ+Fà—‘˜UÔ#Ø $‘Ø˜uÒ$¬¨U«°q«à (��f’ð	)ô ˆu‹:˜Š?äØsóð ñ ð
 ò )�Ø$(��jÒ!ð)ð Ÿ
™
 <°Ó6€JØÐØ%×+Ñ+Ó-ò 	C‰KˆD�%Ü*¨5¸À¹	ÖBð	Cð —:‘:˜g tÓ,€EØÐÜ& u°E¸A±IÖ>ð r!   c                 ó  — d| vrd| vrd| vr	d| vrd| d<   | j                  dd «      }|�od| v r| d   €| j                  dd «       |s*| j                  dd «       | j                  dd «       d| d<   n(d| d<   |j                  «       D ]  \  }}t        |«       Œ | j                  dd «      }|�t        |«       d	D ]K  }| j                  |d «      }|€Œt	        |t
        «      sŒ)|D ]  }t	        |t        «      sŒt        |«       Œ  ŒM y )
NrÙ   rÛ   ÚoneOfÚallOfrÿ   rÐ   ÚrequiredrC   )rÛ   r  r  )r1   r2   rC   rê   r0   rÓ   r(   )rÕ   rÐ   r  rÖ   rC   rD   Úvaluess          r    rê   rê   /  s(  € ð �VÑ ¨vÑ 5¸'ÈÑ:OÐT[ÐciÑTiØ!ˆˆv‰àŸ
™
 <°Ó6€JØÐØ˜Ñ F¨:Ñ$6Ð$>Ø�J‰J�z 4Ô(ñ Ø�J‰J�| TÔ*Ø�J‰J�z 4Ô(Ø%ˆF�6ŠNà%ˆF�6‰NØ)×/Ñ/Ó1ò '‘��eÜ Õ&ð'ð —:‘:˜g tÓ,€EØÐÜ˜Ôà*ò +ˆØ—‘˜C Ó&ˆØÑ¤*¨V´TÕ":Øò +�Ü˜e¤TÕ*Ü# EÕ*ñ+ñ+r!   Ú
field_namec                 óÚ   — | j                  |d «       | j                  dd «      }|�$|j                  «       D ]  \  }}t        ||«       Œ | j                  dd «      }|�t        ||«       y y )NrÐ   rC   )r2   r1   rC   Ústrip_field)rÕ   r  rÐ   r  rÖ   rC   s         r    r  r  P  ss   € Ø
‡J�Jˆz˜4Ô àŸ
™
 <°Ó6€JØÐØ%×+Ñ+Ó-ò 	+‰KˆD�%Ü˜˜zÕ*ð	+ð —:‘:˜g tÓ,€EØÐÜ�E˜:Õ&ð r!   Úvertex_datetimec                 ód   — ddl m } |j                  | d«      }t        |j                  «       «      S )z¤
    Converts a Vertex AI datetime string to an OpenAI datetime integer

    vertex_datetime: str = "2024-12-04T21:53:12.120184Z"
    returns: int = 1722729192
    r   )Údatetimez%Y-%m-%dT%H:%M:%S.%fZ)r  Ústrptimer&   Ú	timestamp)r  r  Údts      r    Ú+_convert_vertex_datetime_to_openai_datetimer"  ]  s-   € õ "ð ×!Ñ! /Ð3JÓK€Bäˆr�|‰|‹~ÓÐr!   c                 óÊ  — |t         kD  rt        dt         › d�«      ‚t        | t        «      syd| v �r$| d   }t        |t        «      rÓt        |«      dkD  rÅh d£}g }|D ]v  }t        |t        «      sŒ|dk(  r|j                  ddi«       Œ-|dv r3d|i}|D ]  }|| v sŒt        | |   «      ||<   Œ |j                  |«       Œd|j                  d|i«       Œx t        d	„ |D «       «      }|r|D ]  }| j                  |d«       Œ || d
<   | j                  d«       n<t        |t        «      rt        |«      dk(  r	|d   | d<   nt        |t        «      r|| d<   dD ]ˆ  }	|	| v sŒ| |	   }
|	dk(  r5t        |
t        «      r%|
j                  «       D ]  }t        ||dz   «       Œ ŒG|	dk(  rt        |
|dz   «       Œ\|	d
k(  sŒbt        |
t        «      sŒs|
D ]  }t        ||dz   «       Œ ŒŠ y)zö
    Convert type arrays and lowercase types for Vertex AI compatibility.

    Transforms OpenAI-style schemas to Vertex AI format by converting type arrays
    like ["string", "number"] to anyOf format and converting all types to uppercase.
    rÍ   rý   NrÙ   r‘   >   rC   ÚmaxItemsÚminItemsr  rÐ   ÚmaxPropertiesÚminPropertiesÚadditionalPropertiesr  ©rÿ   rþ   c              3   óF   K  — | ]  }t        |t        «      sŒ|d v –— Œ y­w)r)  N)r0   r'   )r÷   Úts     r    rø   z(_convert_schema_types.<locals>.<genexpr>¢  s"   è ø€ Ò,nÈ!Ô[eÐfgÔilÕ[m¨QÐ2EÔ-EÑ,nùs   ‚!˜	!rÛ   r   )rÐ   rC   rÛ   rÐ   rC   )r
   r˜   r0   r(   rÓ   r  r'   Úappendr   Úanyr2   r  rè   )rÕ   rÒ   r   Útype_specific_fieldsrú   r+  Úitem_schemar6   Úhas_object_or_arrayrD   rÖ   Úprop_schemaÚanyof_schemas                r    rè   rè   l  s'  € ð Ô(Ò(ÜØÔ5Ð6ð  7Hð  Ió
ð 	
ô �fœdÔ#Øð �ÒØ  ™.ˆÜ�h¤Ô%¬#¨h«-¸!Ò*;ò	+Ð ð 35ˆFØò /�Ü! !¤SÔ)ØØ˜’;à—M‘M 6¨6Ð"2Ô3Øð Ð+Ñ+Ø#)¨1 +�Kà!5ò I˜Ø  Fš?Ü19¸&À¹-Ó1H˜K¨Ò.ðIð —M‘M +Õ.ð —M‘M 6¨1 +Õ.ð%/ô* *-Ñ,nÈxÔ,nÓ)nÐÙ"Ø1ò ,�EØ—J‘J˜u dÕ+ð,ð %ˆF�7‰OØ�J‰J�vÕÜ˜¤$Ô'¬C°«M¸QÒ,>Ø% a™[ˆF�6ŠNÜ˜¤#Ô&Ø%ˆF�6‰Nð 0ò 
CˆØ�&Š=Ø˜3‘KˆEØ�lÒ"¤z°%¼Ô'>Ø#(§<¡<£>ò B�KÜ)¨+°u¸q±yÕAñBà˜’Ü% e¨U°Q©YÕ7Ø˜“¤J¨u´dÕ$;Ø$)ò C�LÜ)¨,¸À¹	ÕBñCñ
Cr!   r²   c                 óX   — t        j                  d| «      }|r|j                  d«      S dS )zÐ
    Get the vertex project id from the url

    `https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:streamGenerateContent`
    z/projects/([^/]+)r‘   N©rƒ   r†   Úgroup©r²   r™   s     r    Úget_vertex_project_id_from_urlr7  ¼  s*   € ô —9‘9Ð1°3Ó7€EÙ"ˆ5�;‰;�q‹>Ð,¨Ð,r!   c                 óX   — t        j                  d| «      }|r|j                  d«      S dS )zÎ
    Get the vertex location from the url

    `https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:streamGenerateContent`
    z/locations/([^/]+)r‘   Nr4  r6  s     r    Úget_vertex_location_from_urlr9  Æ  s*   € ô —9‘9Ð2°CÓ8€EÙ"ˆ5�;‰;�q‹>Ð,¨Ð,r!   c                 óX   — t        j                  d| «      }|r|j                  d«      S dS )zÎ
    Get the vertex model id from the url

    `https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:streamGenerateContent`
    z/models/([^:]+)r‘   Nr4  r6  s     r    Úget_vertex_model_id_from_urlr;  Ð  s*   € ô —9‘9Ð/°Ó5€EÙ"ˆ5�;‰;�q‹>Ð,¨Ð,r!   Úrequested_routec                 óB   — t        j                  dd|› d|› d�| «      }|S )zS
    Replace project and location values in the route with the provided values
    z /projects/[^/]+/locations/[^/]+/r§   r¨   rb   )rƒ   Úsub)r<  rŸ   r•   Úmodified_routes       r    Ú%replace_project_and_location_in_router@  Ú  s4   € ô
 ŸF™FØ+Ø
�^Ð$ K°Ð/@ÀÐBØó€Nð
 Ðr!   r±   c                 ór  — t        j                  | «      }d|v r#|r|rt        |||«      }|j                  |¬«      S 	 d}d|v rd}|j	                  d«      rd}|j                  ddd«      }n&|j	                  d	«      rd}|j                  d	dd«      }|› d
|› d|› �}d|z   |z   }|j                  |¬«      }|S )a<  
    Allow user to specify their own project id / location.

    If missing, use defaults

    Handle cachedContent scenario - https://github.com/BerriAI/litellm/issues/5460

    Constructed Url:
    POST https://LOCATION-aiplatform.googleapis.com/{version}/projects/PROJECT_ID/locations/LOCATION/cachedContents
    Ú	locations)Úpathr¡   ÚcachedContentr¢   z/v1/rb   r‘   z	/v1beta1/r§   r¨   )r)   ÚURLr@  Ú	copy_withro   r’   )	r±   r<  r•   rŸ   Únew_base_urlÚvertex_versionÚbase_requested_routeÚupdated_requested_routeÚupdated_urls	            r    Úconstruct_target_urlrL  ç  sò   € ô"  Ÿ)™) HÓ-€LØ�oÑ%Ù™oÜCÀOÐUcÐetÓuˆOØ×%Ñ%¨?Ð%Ó;Ð;ðð
 04€NØ˜/Ñ)Ø"ˆð ×!Ñ! &Ô)ØˆØ)×1Ñ1°&¸#¸qÓA‰Ø	×	#Ñ	# KÔ	0Ø"ˆØ)×1Ñ1°+¸sÀAÓFˆà%3Ð$4°J¸~Ð>NÈkÐZiÐYjÐ"kÐà%(Ð+?Ñ%?À/Ñ%QÐà%×/Ñ/Ð5LÐ/ÓM€KØÐr!   c                   óø   — e Zd Zdedz  fd„Z	 	 ddededee   deded	edz  d
edz  defd„Z	dd	edz  d
edz  dee   fd„Z
edd	edz  dedz  fd„«       Ze	 dd
edz  dedz  fd„«       Zedededz  fd„«       Zy)ÚVertexAIModelInfor-   Nc                 ó   — t        «       S )zä
        Factory method to create a token counter for this provider.

        Returns:
            Optional TokenCounterInterface implementation for this provider,
            or None if token counting is not supported.
        ©ÚVertexAITokenCounter)r   s    r    Úget_token_counterz#VertexAIModelInfo.get_token_counter  s   € ô $Ó%Ð%r!   r   rd   ÚmessagesrJ   r;   Úapi_keyri   c                 ó   — t        d«      ‚©Nú&Vertex AI models are not supported yet©ÚNotImplementedError)r   r   rd   rS  rJ   r;   rT  ri   s           r    Úvalidate_environmentz&VertexAIModelInfo.validate_environment#  s   € ô "Ð"JÓKÐKr!   c                 ó   — t        d«      ‚)zF
        Returns a list of models supported by this provider.
        rW  rX  )r   rT  ri   s      r    Ú
get_modelszVertexAIModelInfo.get_models/  ó   € ô "Ð"JÓKÐKr!   c                 ó   — t        d«      ‚rV  rX  )rT  s    r    Úget_api_keyzVertexAIModelInfo.get_api_key5  s   € ä!Ð"JÓKÐKr!   c                 ó   — t        d«      ‚rV  rX  )ri   s    r    Úget_api_basezVertexAIModelInfo.get_api_base9  r]  r!   c                 ó   — t        d«      ‚)a2  
        Returns the base model name from the given model name.

        Some providers like bedrock - can receive model=`invoke/anthropic.claude-3-opus-20240229-v1:0` or `converse/anthropic.claude-3-opus-20240229-v1:0`
            This function will return `anthropic.claude-3-opus-20240229-v1:0`
        rW  rX  rj   s    r    Úget_base_modelz VertexAIModelInfo.get_base_model?  s   € ô "Ð"JÓKÐKr!   )NNr"   )r#   r$   r%   r   rR  r(   r'   rÓ   r   rZ  r\  Ústaticmethodr_  ra  rc  ra   r!   r    rN  rN    s>  „ ð&Ð#3°dÑ#:ó &ð" #Ø#ñ
Làð
Lð ð
Lð Ð'Ñ(ð	
Lð
 ð
Lð ð
Lð �t‘ð
Lð ˜‘*ð
Lð 
ó
LñL #¨¡*ð L¸sÀT¹zð LÐUYÐZ]ÑU^ó Lð ñL˜S 4™Zð L°3¸±:ò Ló ðLð à#ñLØ˜‘*ðLà	ˆt‰òLó ðLð
 ðL˜cð L c¨D¡jò Ló ñLr!   rN  c                   óº   — e Zd ZdZ	 ddedz  defd„Z	 	 	 	 ddedeeee	f      dz  deeee	f      dz  d	eee	f   dz  d
edeeee	f      dz  de	dz  de
dz  fd„Zy)rQ  z;Token counter implementation for Google AI Studio provider.Nrq   r-   c                 ó@   — ddl m} ||j                  j                  k(  S )Nr   )ÚLlmProviders)Úlitellm.types.utilsrg  Ú	VERTEX_AIrÖ   )r   rq   rg  s      r    Úshould_use_token_counting_apiz2VertexAITokenCounter.should_use_token_counting_apiM  s   € õ 	5à" l×&<Ñ&<×&BÑ&BÑBÐBr!   Úmodel_to_userS  ÚcontentsÚ
deploymentÚrequest_modelÚtoolsÚsystemc           	   ƒ   óJ  K  — dd l }ddlm}	 |xs i }|j                  |j	                  di «      «      }
|	j                  |«      rÞ |	«       }|
j	                  d«      xs |
j	                  d«      }|
j	                  d«      xs |
j	                  d«      }|
j	                  d«      xs |}|
j	                  d	«      xs |
j	                  d
«      }|j                  ||xs g |
|||¬«      ƒ d {  –—† }|�0t        |j	                  dd«      |||j	                  dd«      |¬«      S y ddlm	} ddl
m} |�|n ||xs g ¬«      }||dœ}|
j                  |«         |«       j                  di |
¤Žƒ d {  –—† }|�'d|v r#t        |d   |||j	                  dd«      |¬«      S y 7 Œ³7 Œ0­w)Nr   rf   r;   rŸ   Úvertex_ai_projectr•   Úvertex_ai_locationÚvertex_count_tokens_locationÚvertex_credentialsÚvertex_ai_credentials)rd   rS  r;   rŸ   r•   ru  Úinput_tokensÚtokenizer_usedr�   )Útotal_tokensrn  Ú
model_usedÚtokenizer_typeÚoriginal_responserP  )Ú%_gemini_convert_messages_with_history)rS  )rd   rl  ÚtotalTokensra   )Úcopyrk   rg   r   r1   rm   rŽ   r   Ú+litellm.llms.vertex_ai.count_tokens.handlerrQ  Ú,litellm.llms.vertex_ai.gemini.transformationr}  ÚupdateÚacount_tokens)r   rk  rS  rl  rm  rn  ro  rp  r  rg   Úcount_tokens_params_requestÚpartner_models_handlerrŸ   r•   ru  r  rQ  r}  Úresolved_contentsÚcount_tokens_paramss                       r    rŽ   z!VertexAITokenCounter.count_tokensU  s  è ø€ ó 	õ	
ð  Ò% 2ˆ
Ø-1¯]©]¸:¿>¹>ÐJZÐ\^Ó;_Ó-`Ð#ð !×8Ñ8¸ÔFá,AÓ,CÐ"ð 9×<Ñ<Ð=MÓNò ÐRm×RqÑRqØ#óSˆNð :×=Ñ=Ð>OÓPò ÐTo×TsÑTsØ$óUˆOð
 :×=Ñ=Ð>\Ó]ÒpÐapˆOà(C×(GÑ(GØ$ó)ò )Jà,×0Ñ0Ð1HÓIð ð 2×>Ñ>Ø"Ø!š RØ:Ø-Ø /Ø#5ð ?ó ÷ ˆFð Ð!Ü)Ø!'§¡¨N¸AÓ!>Ø"/Ø+Ø#)§:¡:Ð.>ÀÓ#CØ&,ôð ðN õ? Yõð Ð'ñ á:Ø%š^¨ôð ð &Ø-ñ*Ðð (×.Ñ.Ð/BÔCØ?Ñ/Ó1×?Ñ?ñ Ø-ñ÷ ˆFð Ð! m°vÑ&=Ü)Ø!'¨Ñ!6Ø"/Ø+Ø#)§:¡:Ð.>ÀÓ#CØ&,ôð ð ðcøðHús%   ‚C)F#Ã+FÃ,BF#Å0F!Å1/F#Æ!F#r"   )Nr�   NN)r#   r$   r%   rX   r'   r…   rj  rÓ   r(   r   r   rŽ   ra   r!   r    rQ  rQ  J  sÞ   „ ÙEð +/ñCà  4™ZðCð 
óCð -1ØØ-1Ø!ñYàðYð �t˜C ˜H‘~Ñ&¨Ñ-ðYð �t˜C ˜H‘~Ñ&¨Ñ-ð	Yð
 ˜˜c˜‘N TÑ)ðYð ðYð �D˜˜c˜‘NÑ# dÑ*ðYð �d‘
ðYð 
˜dÑ	"ôYr!   rQ  r"   )r   )F)Srƒ   r  r   rÏ   r   Útypingr   r   r   r   r)   rv   Úlitellm._loggingr	   Úlitellm.constantsr
   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr   Ú litellm.llms.base_llm.base_utilsr   r   Ú)litellm.llms.base_llm.chat.transformationr   Úlitellm.types.llms.openair   Úlitellm.types.llms.vertex_air   r   r   rh  r   Úlitellm.utilsr   r   r   r8   r(   r@   r'   rI   rM   rO   rÖ   rc   Ú__annotations__rp   r…   r~   r�   r‰   Úall_gemini_url_modesr”   rš   rž   Útupler³   r¼   rÅ   rÓ   rË   rÔ   rÜ   rï   rñ   rû   ré   r&   rì   rå   rë   rç   rê   r  r"  rè   r7  r9  r;  r@  rE  rL  rN  rQ  )r“   s   0r    ú<module>r”     s‰  ðÜ 	Ý Ý ß 6Ó 6ã ã Ý +Ý 7Ý Pß OÝ FÝ 6÷ñ õ
 3ß LôTÐ$ô Tð+°cð +¸dó +ð(+Àdð +Ètó +ð*Ø˜4‘Kðà	ˆ#ˆsˆ(�^�dÑóð8&Ø˜D‘[ð&à˜4‘Kð&ð 
ˆ#ˆsˆ(�^�dÑó&ô&
"˜˜dô 
"ð ASÖ S°u E§K¡K =°Ò!2Ò SÐ ˜Ó SñE) Sð E)¸$À¹+ð E)ÐQcó E)ðP#Øð#Ø%,Ð-TÑ%Uð#à	ó#ð,	%Øð	%Ø%,Ð-TÑ%Uð	%à	ó	%ð;¨ð ;°ó ;õ8 àÐiÑjÐ ð! cð !¨có !ðH¨c°D©jð ¸Só ð,EØ˜4‘ZðEàóEð$$Øð$à˜$‘Jð$ð ˜4‘Zð$ð   Ñ0ð	$ð
 ˆ3�ˆ8�_ó$ðN7Ø
ð7àð7ð �4‰Kð7ð ˜$‘Jð	7ð
 ˜4‘Zð7ð   Ñ0ð7ð ˆ3�ˆ8�_ó7ðt)Ø
ð)àð)ð �4‰Kð)ð ˆ3�ˆ8�_ó	)ðX $ x¡.ð °Tó ó8ó&.7ñb0 Tð 0À$ó 0ðf 4ð ¨Dó ð4 d¨3°¨8¡nð ¸¸cÀ3¸h¹ó ó27ñ8¨¨c°3¨h©ð Àð ÈDÐQTÐVYÐQYÉNó ñ6$ d¨3°¨8¡nð $ÀCÈÁHð $ÐaeÐfiÐknÐfnÑaoó $óN'?òT+ðB
' Có 
'ðÀð Èó óMCð`-¨ð -°°d±
ó -ð- cð -¨c°D©jó -ð- cð -¨c°D©jó -ð
¸3ð 
ÐPSð 
Ðfið 
Ðnqó 
ð.Øð.àð.ð ˜4‘Zð.ð ˜$‘Jð	.ð
 ‡Y�Yó.ôb/LÐ(ô /LôddÐ+õ dùòG !Ts   Â:I&