Ë
    tPêjã“  ã                   óÂ  — U d dl Z d dlZd dlZd dlZd dlZd dl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mZ d dlZerd dlmZ  ej.                  e«      Zeed<    ed	eeef   ¬
«      Zeed	<   d dlmZm Z m!Z!m"Z" d dl#m$Z$m%Z%m&Z& g d¢Z'eed<   dZ(eed<   ddgZ)eed<    e*h d£«      Z+ee*e      ed<   deeef   deeef   dedz  fd„Z,deeef   dedz  de-fd„Z. e*d«      Z/eed<   de0dz  fd„Z1defd„Z2d „ Z3dYd!e4d"e-dz  fd#„Z5d$e4dz  de4fd%„Z6d$eeef   dz  de*e   dz  fd&„Z7d'ee   d(e
e   dz  de8ed)f   fd*„Z9d'eeeef      de:fd+„Z;d,„ Z<d-eeef   de-fd.„Z=d'eeeef      d/e-de8eeef   d)f   fd0„Z>d-eeef   dedz  fd1„Z?d'eeeef      dedz  d2edz  de8eeef   d)f   fd3„Z@deeef   de-fd4„ZAd-eeef   de-fd5„ZBd-eeef   dedz  fd6„ZCd7d8d9ede*e   dz  fd:„ZDd;e$d7d8d<e*e   dedz  fd=„ZEd-eeef   d7d8d<e*e   dedz  fd>„ZFd?eeeef      d@e*e   de8eeef   d)f   fdA„ZGdBeeeef      d?eeeef      d7d8de8eeef   d)f   fdC„ZHdDeeeef      dEeeeef      dBeeeef      d7d8deeef   f
dF„ZIdDeeeef      dEeeeef      dBeeeef      d7dGdHeeeef      de8eeeef      eeeef      f   fdI„ZJde4fdJ„ZKdKe:dLeLde8e:eLf   fdM„ZM	 	 	 dZd'e:d"e-dz  dNeLdz  dOe4dz  fdP„ZNdDe:dEe:de4fdQ„ZOde4defdR„ZPde4de-fdS„ZQde4de4deLdz  fdT„ZRde4de4de4fdU„ZS	 	 	 	 	 	 	 	 d[d'e:dedz  dVedz  d"e-dz  d2edz  dNeLdz  dOe4dz  dWe-d7dGfdX„ZTy)\é    N)ÚMappingÚSequence)ÚSet)ÚMappingProxyType)ÚTYPE_CHECKINGÚFinalÚTypeVar)ÚTypeAdapterÚValidationError)ÚRouterÚloggerÚ_DeploymentT)Úbound)Ú"BACKGROUND_HEALTH_CHECK_MAX_TOKENSÚ,BACKGROUND_HEALTH_CHECK_MAX_TOKENS_REASONINGÚDEFAULT_HEALTH_CHECK_PROMPTÚHEALTH_CHECK_TIMEOUT_SECONDS)ÚStrategyRouterDependencyÚclassify_strategy_router_modelÚstrategy_router_dependencies)ÚmessagesÚapi_keyÚpromptÚinputÚclient_secretÚazure_ad_tokenÚazure_usernameÚazure_passwordÚvertex_credentialsÚvertex_ai_credentialsÚaws_access_key_idÚaws_secret_access_keyÚaws_session_tokenÚaws_web_identity_tokenÚextra_headersÚheadersÚ	exceptionÚlitellm_metadataÚILLEGAL_DISPLAY_PARAMS)Úapi_baseÚapi_versionÚ ADMIN_ONLY_HEALTH_DISPLAY_PARAMSÚmodelÚ
mode_errorÚMINIMAL_DISPLAY_PARAMS>   ÚchatÚ	responsesÚ
completionÚ_MAX_TOKEN_SUPPORT_MODESÚ
model_infoÚlitellm_paramsÚreturnc                 óö   — | j                  d«      }t        |t        «      r|S |j                  d«      }t        |t        «      sy	 t        j                  |¬«      j                  d«      S # t
        $ r Y yw xY w)a±  
    Effective mode for a deployment's health-check probe.

    Prefers operator-set `model_info.mode`; otherwise resolves it from the model
    cost map, which understands `bedrock/` and cross-region inference-profile
    prefixes (`us.`, `eu.`, `apac.`). Without this, non-chat Bedrock deployments
    (e.g. embeddings) are probed as chat, so `max_tokens` is injected and the
    request 400s on "extraneous key [max_tokens]".
    Úmoder-   N)r-   )ÚgetÚ
isinstanceÚstrÚlitellmÚget_model_infoÚ	Exception)r4   r5   Úexplicit_moder-   s       ú_/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/health_check.pyÚ_resolve_health_check_moderA   G   sr   € ð &Ÿ>™>¨&Ó1€MÜ�-¤Ô%ØÐØ!×%Ñ% gÓ.€EÜ�eœSÔ!ØðÜ×%Ñ%¨EÔ2×6Ñ6°vÓ>Ð>øÜò Ùðús   Á$A, Á,	A8Á7A8r8   c                 óV   — | j                  d«      }|�t        |«      S |xs dt        v S )a  
    Whether the health-check probe should include `max_tokens`.

    Order:
      1. `model_info.health_check_supports_max_tokens` (operator override).
      2. `_MAX_TOKEN_SUPPORT_MODES`. An unresolvable mode is treated as `chat`
         for backward compatibility.
    Ú health_check_supports_max_tokensr0   )r9   Úboolr3   )r4   r8   Úexplicits      r@   Ú&_should_inject_health_check_max_tokensrF   ]   s3   € ð !—n‘nÐ%GÓH€HØÐÜ�H‹~ÐØŠN�FÔ7Ð7Ð7ó    )Nr0   r2   Ú/_HEALTH_CHECK_MODES_SUPPORTING_REASONING_EFFORTc                  óÒ   — 	 ddl } | j                  | j                  «      j                  }t        j
                  dk(  rt        |«      dz  S t        |«      dz  S # t        $ r Y yw xY w)zj
    Get process RSS memory in MB.
    On Linux, ru_maxrss is in KB. On macOS, ru_maxrss is in bytes.
    r   NÚdarwini   i   )ÚresourceÚ	getrusageÚRUSAGE_SELFÚ	ru_maxrssÚsysÚplatformÚfloatr>   )rK   rN   s     r@   Ú_get_process_rss_mbrR   p   sd   € ð
Ûà#×-Ñ-¨h×.BÑ.BÓC×MÑMˆ	Ü�<‰<˜8Ò#Ü˜Ó# {Ñ3Ð3Ü�YÓ $Ñ&Ð&øÜò Ùðús   ‚A	A ÁA Á	A&Á%A&c                  ó$   — t        «       } | €y| d›S )NÚunknownz.2f)rR   )Úrss_mbs    r@   Ú_rss_mb_for_logrV   €   s   € Ü'Ó)€FØ€~ØØ�Sˆ\ÐrG   c                  ó<   — ddg} dt        j                  | «      dœgS )z,
    Get a random message from the LLM.
    zHey how's it going?zWhat's 1 + 1?Úuser)ÚroleÚcontent)ÚrandomÚchoice)r   s    r@   Ú_get_random_llm_messager]   ‡   s%   € ð -¨oÐ>€Hà¬¯©°hÓ(?Ñ@ÐAÐArG   Úendpoint_dataÚdetailsc                 óú   — | j                  dd«       |dur-| j                  «       D ��ci c]  \  }}|t        vsŒ||“Œ c}}S | j                  «       D ��ci c]  \  }}|t        v sŒ||“Œ c}}S c c}}w c c}}w )z7
    Clean the endpoint data for display to users.
    Úlitellm_logging_objNF)ÚpopÚitemsr)   r/   )r^   r_   ÚkÚvs       r@   Ú_clean_endpoint_datarf   �   s�   € ð ×ÑÐ+¨TÔ2ð ˜%Ñð (×-Ñ-Ó/×S‘$�!�Q°1Ô<RÒ3RˆˆA‰ÓSðð  -×2Ñ2Ó4×T‘t�q˜!¸Ô=SÒ8Sˆa�‰dÓTðùÛSùãTs   ªA1»A1ÁA7Á(A7Úgeneral_settingsc                 óH   — | xs i }dt        |j                  dd«      «      iS )aE  
    Build kwargs for ``perform_health_check`` from ``general_settings``.

    When ``health_check_skip_disabled_background_models`` is true, deployments with
    ``model_info.disable_background_health_check`` are omitted from health runs
    (including on-demand ``GET /health``), matching the background loop behavior.
    Ú,health_check_skip_disabled_background_modelsF)rD   r9   )rg   Úgs     r@   Ú0health_check_filter_kwargs_from_general_settingsrk   œ   s1   € ð  Ò% 2€Aà6¼Ø�E‰EÐ@À%ÓHó9
ðð rG   c                 óÊ   — | xs i j                  d«      }|€y	 t        t        t        t           «      j                  |«      «      S # t        $ r}t        d«      |‚d}~ww xY w)aƒ  
    Read ``general_settings.background_health_check_model_groups``.

    ``None`` means the allowlist is unset and every deployment participates
    (legacy behavior). A list scopes background health checks and health-check
    routing to deployments whose ``model_name`` is listed. A malformed value
    raises so the proxy fails at startup instead of silently probing everything.
    Ú$background_health_check_model_groupsNzYgeneral_settings.background_health_check_model_groups must be a list of model group names)r9   Ú	frozensetr
   Úlistr;   Úvalidate_pythonr   Ú
ValueError)rg   ÚrawÚes      r@   Ú*parse_background_health_check_model_groupsrt   ®   si   € ð #Ò( b×-Ñ-Ð.TÓU€CØ
€{ØðÜœ¤T¬#¡YÓ/×?Ñ?ÀÓDÓEÐEøÜò ÜØgó
àð	ûðús   š-A Á	A"ÁAÁA"Ú
model_listÚmodel_groups.c                 óF   ‡— ‰€t        | «      S t        ˆfd„| D «       «      S )zPDeployments whose ``model_name`` is in ``model_groups``; all of them when unset.c              3   óJ   •K  — | ]  }|j                  d «      ‰v sŒ|–— Œ y­w©Ú
model_nameN©r9   )Ú.0Úxrv   s     €r@   ú	<genexpr>z5filter_deployments_to_model_groups.<locals>.<genexpr>Ë   s!   øè ø€ ÒN�q¨!¯%©%°Ó*=ÀÒ*M”ÑNùs   ƒ#œ#©Útuple)ru   rv   s    `r@   Ú"filter_deployments_to_model_groupsr�   Ä   s'   ø€ ð
 ÐÜ�ZÓ Ð ÜÓN˜JÔNÓNÐNrG   c                 óÔ   — t        «       }g }| D ]V  }|j                  d«      xs i }|j                  d«      xs d }|€Œ0||vsŒ5|j                  |«       |j                  |«       ŒX |S ©Nr4   Úid)Úsetr9   ÚaddÚappend)ru   Úseen_idsÚfiltered_deploymentsÚ
deploymentÚ_model_infoÚ_ids         r@   Úfilter_deployments_by_idr�   Î   sx   € ô “e€HØ"$Ðà ò 4ˆ
Ø —n‘n \Ó2Ò8°bˆØ�o‰o˜dÓ#Ò+ tˆØˆ;Øà�hÒØ�L‰L˜ÔØ ×'Ñ'¨
Õ3ð4ð  ÐrG   c              ƒ   ó¸   K  — 	 t        j                  | |«      ƒ d {  –—† S 7 Œ# t         j                  $ r  t        j                  ddd¬«      }d|dœcY S w xY w­w)NzHealth check timeout exceededÚ )Úmessager-   Úllm_providerzTimeout exceeded)Úerrorr'   )ÚasyncioÚwait_forÚTimeoutErrorr<   ÚTimeout)ÚtaskÚtimeoutÚtimeout_exceptions      r@   Úrun_with_timeoutrš   á   sc   è ø€ ð
MÜ×%Ñ% d¨GÓ4×4Ð4Ð4ùÜ×Ñò Mô $+§?¡?Ø3ØØô$
Ðð
 ,Ð:KÑLÒLðMüs1   ‚A„$ �"ž$ ¡A¢$ ¤0AÁAÁAÁArŠ   c                 ó~   — | j                  d«      }t        |t        «      rt        |j                  dd«      «      S dS )Nr4   Údisable_background_health_checkF)r9   r:   r   rD   )rŠ   Úinfos     r@   Ú_skips_health_checksrž   ï   s8   € Ø—.‘. Ó.€DÜGQÐRVÔX_ÔG`Œ4�—‘Ð:¸EÓBÓCÐkÐfkÐkrG   Úskip_disabledc                 ó,   ‡— t        ˆfd„| D «       «      S )a  Deployments this run is allowed to contact.

    The one eligibility gate, applied to the requested set and to the pool a router's
    dependencies are drawn from alike, so an opted-out deployment cannot re-enter through a
    router that depends on it.
    c              3   ó>   •K  — | ]  }‰rt        |«      rŒ|–— Œ y ­w©N)rž   )r|   r}   rŸ   s     €r@   r~   z)_health_check_eligible.<locals>.<genexpr>ý   s   øè ø€ ÒZ�q©}ÔAUÐVWÕAX”ÑZùó   ƒ–r   )ru   rŸ   s    `r@   Ú_health_check_eligibler¤   ô   s   ø€ ô ÓZ˜JÔZÓZÐZrG   c                 ój   — | j                  d«      }t        |t        «      r|j                  d«      S d S )Nr5   r-   )r9   r:   r   ©rŠ   Úparamss     r@   Ú_deployment_modelr¨      s.   € Ø—N‘NÐ#3Ó4€FÜ",¨V´WÔ"=ˆ6�:‰:�gÓÐGÀ4ÐGrG   Úmodel_idc                 óÂ   ‡‡— ‰�#t        ˆfd„| D «       «      }|xs t        | «      S ‰€t        | «      S t        ˆfd„| D «       «      }|xs t        ˆfd„| D «       «      S )zPNarrow to the requested deployment. An id matching nothing keeps the whole list.c              3   ó@   •K  — | ]  }t        |«      ‰k(  sŒ|–— Œ y ­wr¢   ©Ú_deployment_id)r|   r}   r©   s     €r@   r~   z$_narrow_to_target.<locals>.<genexpr>
  s   øè ø€ ÒT 1´nÀQÓ6GÈ8Ó6SœQÑTùó   ƒ—c              3   ó@   •K  — | ]  }t        |«      ‰k(  sŒ|–— Œ y ­wr¢   )r¨   ©r|   r}   r-   s     €r@   r~   z$_narrow_to_target.<locals>.<genexpr>  s   øè ø€ ÒS !Ô5FÀqÓ5IÈUÓ5RœAÑSùr®   c              3   óL   •K  — | ]  }|j                  d «      ‰k(  sŒ|–— Œ y­wry   r{   r°   s     €r@   r~   z$_narrow_to_target.<locals>.<genexpr>  s!   øè ø€ ÒS 1°a·e±e¸LÓ6IÈUÓ6RœQÑSùs   ƒ$�$r   )ru   r-   r©   Úby_idÚby_params    ``  r@   Ú_narrow_to_targetr´     sa   ù€ ð ÐÜÓT¨
ÔTÓTˆØÒ)œ˜jÓ)Ð)Ø€}Ü�ZÓ Ð ÜÓS zÔSÓS€HØÒS”uÓS¨
ÔSÓSÐSrG   c                 ód   — | j                  dd«      }t        |t        «      xr t        |«      duS )z%True for strategy-router deployments.r-   r�   N)r9   r:   r;   r   )r5   r-   s     r@   Ú_is_strategy_router_deploymentr¶     s2   € à)×-Ñ-¨g°rÓ:€EÜ�eœSÓ!ÒWÔ&DÀUÓ&KÐSWÐ&WÐWrG   c                 ó^   — | j                  d«      }t        |t        «      xr t        |«      S )Nr5   )r9   r:   r   r¶   r¦   s     r@   Ú
_is_markerr¸     s)   € Ø—N‘NÐ#3Ó4€FÜ�fœgÓ&ÒQÔ+IÈ&Ó+QÐQrG   c                 óˆ   — | j                  d«      }t        |t        «      r|j                  d«      nd }|rt        |«      S d S rƒ   )r9   r:   r   r;   )rŠ   r�   Úidents      r@   r­   r­     s9   € Ø—.‘. Ó.€DÜ%/°´gÔ%>�4—8‘8˜D”>ÀD€EÙŒ3ˆu‹:Ð( DÐ(rG   Úrouterr   rz   c                 óV   ‡— | j                  |¬«      }|syt        ˆfd„|D «       «      S )a‹  Deployment ids backing `model_name`, or None when the name resolves to nothing.

    `get_model_list` composes every channel the request path itself uses (exact name,
    model_group_alias, routing groups, wildcards); a mirror of any one channel would call a
    working tier broken. An alias whose target is gone resolves to nothing, which fails a
    request exactly like an unknown name.
    )rz   Nc              3   ó>   •K  — | ]  }t        |«      xŠsŒ‰–— Œ y ­wr¢   r¬   )r|   Úentryrº   s     €r@   r~   z+_resolved_deployment_ids.<locals>.<genexpr>.  s    øè ø€ ÒU˜u¼nÈUÓ>SÐ5S°UÑ5S”UÑUùr£   )Úget_model_listrn   )r»   rz   Úresolvedrº   s      @r@   Ú_resolved_deployment_idsrÁ   #  s/   ø€ ð ×+Ñ+°zÐ+ÓB€HÙØÜÓU¨ÔUÓUÐUrG   Ú
dependencyÚunhealthy_idsc                 ó²   — t        || j                  «      }|€| j                  › d| j                  › d�S |r||k  sy| j                  › d| j                  › d�S )ac  Why this dependency makes its router unable to serve, or None when it does not.

    A name reds its router only when *every* deployment behind it is known unhealthy. One
    replica this run never judged, hidden from the caller or opted out of health checks, can
    still serve what the dead one drops, so partial evidence leaves the verdict green.
    Nz model 'z%' matches no deployment on this proxyz' has no healthy deployment)rÁ   rz   rY   )rÂ   r»   rÃ   rÀ   s       r@   Ú_dependency_failurerÅ   1  si   € ô /¨v°z×7LÑ7LÓM€HØÐØ—/‘/Ð" (¨:×+@Ñ+@Ð*AÐAfÐgÐgÙ˜8 }Ò4ØØ�o‰oÐ˜h z×'<Ñ'<Ð&=Ð=XÐYÐYrG   c                 óŒ   ‡‡‡— | j                  d«      }t        |t        «      syt        ˆˆˆfd„t	        |«      D «       d«      S )zJThe first dependency fault that makes this router unable to serve, if any.r5   Nc              3   ó@   •K  — | ]  }t        |‰‰«      xŠr‰–— Œ y ­wr¢   )rÅ   )r|   rÂ   Úfailurer»   rÃ   s     €€€r@   r~   z4_strategy_router_dependency_error.<locals>.<genexpr>N  s-   øè ø€ ò 	
àÜ.¨z¸6À=ÓQÐQ�ÐQô ñ	
ùs   ƒ)r9   r:   r   Únextr   )rŠ   r»   rÃ   r§   rÈ   s    `` @r@   Ú!_strategy_router_dependency_errorrÊ   D  sE   ú€ ð —N‘NÐ#3Ó4€FÜ�fœgÔ&ØÜõ	
ä:¸6ÓBô	
ð
 	óð rG   ÚuniverseÚidsc                 óZ   ‡‡— t        ˆˆfd„| D «       «      }t        t        |¬«      «      S )zàThe deployments for `ids`, one row per id.

    Reuses the requested set's own dedupe rule, so an alias that duplicates a row cannot get
    it probed twice or split a single id's verdict across two disagreeing results.
    c              3   óH   •K  — | ]  }t        |«      xŠsŒ‰‰v sŒ|–— Œ y ­wr¢   r¬   )r|   ÚdrÌ   Úuids     €€r@   r~   z%_deployments_by_id.<locals>.<genexpr>_  s)   øè ø€ Ò\ ¼.ÈÓ:KÐ3K°3Ñ3KÐQTÐX[ÒQ[œ1Ñ\ùs   ƒ"–"›"©ru   )r€   r�   )rË   rÌ   ÚmatchedrÐ   s    ` @r@   Ú_deployments_by_idrÓ   W  s&   ù€ ô Ô\ hÔ\Ó\€GÜÔ)°WÔ=Ó>Ð>rG   Úcheckedc                 ó  ‡‡	‡
— t        ˆ	fd„| D «       «      }|}t        | «      }t        t        |«      «      D ]B  }t        ˆ
fd„|D «       «      }t        ˆfd„|D «       «      |z
  }|s nt	        ||«      }||z  }ŒD t	        |||z
  «      S )a·  Deployments backing the checked routers' dependencies that are not already checked.

    Empty on a full-list run, which therefore gains no probe; it is the targeted
    `/health?model_id=<router>` call the dashboard makes per deployment that needs them,
    since a router's verdict is a statement about models the request never named. Drawn from
    `universe`, the caller's access-filtered list, so no deployment is probed that the caller
    was not already granted. Expansion follows routers through routers, one hop per round,
    because a child router's own models must be probed for the parent to fail; stopping when
    a round adds nothing is what makes a router cycle terminate.
    c              3   ó>   •K  — | ]  }t        |«      xŠsŒ‰–— Œ y ­wr¢   r¬   )r|   rÏ   Úcids     €r@   r~   z3_dependency_deployments_to_probe.<locals>.<genexpr>r  s!   øè ø€ Ò"V¨1Ä>ÐRSÓCTÐ<T¸CÑ<T¤3Ñ"Vùr£   c              3   ó˜   •K  — | ]A  }t        |j                  d «      xŠt        «      rt        ‰«      D ]  }|j                  –— Œ ŒC y­w)r5   N)r:   r9   r   r   rz   )r|   rŠ   rÂ   r§   s      €r@   r~   z3_dependency_deployments_to_probe.<locals>.<genexpr>v  sR   øè ø€ ò 
àÜ J§N¡NÐ3CÓ$DÐD˜&ÄgÔNÜ:¸6ÓBò	
ð ð ×!Õ!ð
Ø!ñ
ùs   ƒAA
c              3   óL   •K  — | ]  }t        ‰|«      xs d D ]  }|–— Œ Œ y­w)© N)rÁ   )r|   Únamerº   r»   s      €r@   r~   z3_dependency_deployments_to_probe.<locals>.<genexpr>}  s-   øè ø€ Òj Ô<TÐU[Ð]aÓ<bÒ<hÐfhÒj°%”eÐj�eÑjùó   ƒ!$)rn   r€   ÚrangeÚlenrÓ   )rÔ   rË   r»   Úchecked_idsÚreachedÚfrontierÚ_ÚnamesÚ	fresh_idsr×   r§   s     `      @@r@   Ú _dependency_deployments_to_proberå   c  sŸ   ú€ ô #Ó"V°Ô"VÓV€KØ€GÜ�W‹~€HÜ”3�x“=Ó!ò &ˆÜó 
à&ô
ó 
ˆô Ój¨ÔjÓjÐmtÑtð 	ñ ÙÜ% h°	Ó:ˆØ˜IÑ%‰ð&ô ˜h¨°+Ñ(=Ó>Ð>rG   Úhealthy_endpointsÚunhealthy_endpointsc                 óH  ‡— t        |D �ci c]  }t        |«      x}sŒ||“Œ c}«      }t        | D �ci c];  }t        |j                  d«      x}t        «      r||v rt        ||   «      r|||   “Œ= c}«      }	t        ˆfd„|D «       «      }
t        i «      }t        t        |	«      «      D ]b  }t        |	j                  «       D ��ci c]'  \  }}||vrt        |||
t        |«      z  «      x}r||“Œ) c}}«      }|s |S t        i |¥|¥«      }Œd |S c c}w c c}w c c}}w )a±  The dependency fault, per model id, for every strategy router that cannot serve.

    A marker is filed healthy by `_run_model_health_check` returning `{}`, which says only
    that nothing was probed. This is where that placeholder becomes a verdict, derived from
    this run's own results rather than a re-probe or a cache that is empty unless
    `enable_health_check_routing` is on. A marker never fails a probe of its own, so verdicts
    settle over rounds, each feeding the last round's reds back in as unhealthy; without that
    the parent of a red child would stay green. Bounded by the marker count, which is what
    makes a router cycle terminate green rather than spin.
    r©   c              3   óf   •K  — | ](  }t        |j                  d «      xŠt        «      sŒ%‰–— Œ* y­w)r©   N)r:   r9   r;   )r|   Úendpointrº   s     €r@   r~   z,_strategy_router_verdicts.<locals>.<genexpr>Ÿ  s/   øè ø€ ò &Ø´ZÈÏÉÐV`ÓIaÐ@aÀÔcfÕ5gŒñ&ùs   ƒ&1ª1)r   r­   r:   r9   r;   r¸   rn   rÝ   rÞ   rc   rÊ   )ræ   rç   rÔ   r»   rÏ   Úir²   rê   Ú	marker_idÚmarkersÚprobe_failuresÚsettledrâ   rŠ   r’   Úfreshrº   s                   @r@   Ú_strategy_router_verdictsrñ   †  sY  ø€ ô  $°7Ö$W¨aÄNÐSTÓDUÐ?U¸qÑ?U Q¨¡TÒ$WÓX€EÜ%ð .ö	
àÜ x§|¡|°JÓ'?Ð?˜)ÄÔEÈ)ÐW\ÑJ\Ü˜% 	Ñ*Ô+ð �u˜YÑ'Ñ'ò	
ó€Gô &ó &Ø1ô&ó €Nô "2°"Ó!5€GÜ”3�w“<Ó ò 9ˆÜ ð .5¯]©]«_÷á)�I˜zØ GÑ+Ü>¸zÈ6ÐSaÔdmÐnuÓdvÑSvÓwÐw�EÐwð ˜5Ñ óó
ˆñ Øà€Nô #Ð#7 gÐ#7°Ð#7Ó8‰ð9ð €Nùò3 %Xùò	
ùós   ‹DžD³A DÃ,DzRouter | NoneÚdependency_probesc                 ó’  ‡‡‡‡	‡
‡— |�t        | |||«      n
t        i «      Št        ˆfd„|D «       «      Šdt        t        t
        f   dt        fˆfd„Š	dt        t        t
        f   dt        dz  fˆfd„Š
t        ˆ	fd„| D «       «      }t        ˆ
fd„|D «       «      t        ˆ	fd	„|D «       «      t        ˆˆ
fd
„|D «       «      z   fS )zòApply router verdicts, then drop the deployments probed only to reach them.

    The probes exist to judge the routers that depend on them; reporting them would answer a
    targeted request with deployments the caller never asked about.
    Nc              3   ó>   •K  — | ]  }t        |«      xŠsŒ‰–— Œ y ­wr¢   r¬   )r|   rÏ   rë   s     €r@   r~   z6_finalize_strategy_router_endpoints.<locals>.<genexpr>Ã  s!   øè ø€ ÒX QÄ^ÐTUÓEVÐ@VÀÑ@VœqÑXùr£   rê   r6   c                 óT   •— | j                  d«      }t        |t        «      xr |‰v  S ©Nr©   ©r9   r:   r;   )rê   r©   Údroppeds     €r@   Úkeepz1_finalize_strategy_router_endpoints.<locals>.keepÅ  s+   ø€ Ø"Ÿ,™, zÓ2ˆÜ˜x¬Ó-ÒE°(¸gÐ2EÐFÐFrG   c                 ól   •— | j                  d«      }t        |t        «      r‰j                  |«      S d S rö   r÷   )rê   r©   Úverdictss     €r@   Úverdict_forz8_finalize_strategy_router_endpoints.<locals>.verdict_forÉ  s.   ø€ Ø"Ÿ,™, zÓ2ˆÜ)3°H¼cÔ)Bˆx�|‰|˜HÓ%ÐLÈÐLrG   c              3   ó4   •K  — | ]  } ‰|«      sŒ|–— Œ y ­wr¢   rÚ   ©r|   rs   rù   s     €r@   r~   z6_finalize_strategy_router_endpoints.<locals>.<genexpr>Í  s   øè ø€ ÒH aÁÀQÅ¤ÑHùó   ƒ‘c              3   ó4   •K  — | ]  } ‰|«      �Œ|–— Œ y ­wr¢   rÚ   )r|   rs   rü   s     €r@   r~   z6_finalize_strategy_router_endpoints.<locals>.<genexpr>Ï  s   øè ø€ Ò@�A©°Q«Ñ)?ŒaÑ@ùrÿ   c              3   ó4   •K  — | ]  } ‰|«      sŒ|–— Œ y ­wr¢   rÚ   rþ   s     €r@   r~   z6_finalize_strategy_router_endpoints.<locals>.<genexpr>Ð  s   øè ø€ Ò8�A±°QµŒaÑ8ùrÿ   c              3   óL   •K  — | ]  } ‰|«      xŠ�t        |‰¬«      –— Œ y ­w)N)r’   )Údict)r|   rs   r’   rü   s     €€r@   r~   z6_finalize_strategy_router_endpoints.<locals>.<genexpr>Ñ  s2   øè ø€ ò 
àÙ$ Q›Ð'�Ð4ô �˜%× Ð ñ
ùrÜ   )rñ   r   rn   r   r;   ÚobjectrD   r€   )ræ   rç   rÔ   r»   rò   Úkept_healthyrø   r’   rë   rù   rü   rû   s         @@@@@@r@   Ú#_finalize_strategy_router_endpointsr  ²  sÔ   ý€ ð Ðô 	"Ð"3Ð5HÈ'ÐSYÔZä˜bÓ!ð ô
 ÓXÐ*;ÔXÓX€GðG”wœs¤F˜{Ñ+ð G´õ GðMœg¤c¬6 kÑ2ð M´s¸T±zõ Mô  ÓHÐ+<ÔHÓH€LäÓ@˜Ô@Ó@ÜÓ8Ð,Ô8Ó8Ü
ô 
à!ô
ó 
ñ	
ðð rG   c              ƒ   ó  K  — | d   }| j                  di «      }t        |«      ri S t        ||«      }t        ||«      }|j                  d«      xs t        }t        t        j                  ||t        dg¬«      |«      ƒ d {  –—† S 7 Œ­w)Nr5   r4   Úhealth_check_timeoutztest from litellm)r8   r   r   )	r9   r¶   rA   Ú'_update_litellm_params_for_health_checkr   rš   r<   Úahealth_checkr   )r-   r5   r4   r8   r˜   s        r@   Ú_run_model_health_checkr  Ù  sš   è ø€ ØÐ+Ñ,€NØŸ	™	 ,°Ó3€Jä% nÔ5Øˆ	ä,ØØó€Dô =¸ZÈÓX€NØ—^‘^Ð$:Ó;Ò[Ô?[€Gä!Ü×ÑØØÜ.Ø&Ð'ô		
ð 	ó÷ ð ð ús   ‚BB
ÂBÂB
ÚmodelsÚconcurrency_limitc              ƒ   ó  ‡	‡
‡K  — dgt        | «      z  }i Št        t        | «      «      Š	dŠ
dt        fˆ	ˆ
ˆfd„}t	        t        |t        | «      «      «      D ]	  } |«        Œ ‰r}t        j                  t        ‰j                  «       «      t        j                  ¬«      ƒ d{  –—† \  }}|D ].  }‰j                  |«      }	 |j                  «       ||<    |«        Œ0 ‰rŒ}|‰
fS 7 ŒA# t        $ r}|||<   Y d}~Œ%d}~ww xY w­w)z{
    Run health checks with at most `concurrency_limit` active tasks.
    Preserves result ordering to match `models`.
    Nr   r6   c                  ó²   •— 	 t        ‰«      \  } }t        j                  t	        |«      «      }| ‰|<   t        ‰t        ‰«      «      Šy# t        $ r Y yw xY w)NFT)rÉ   ÚStopIterationr“   Úcreate_taskr  ÚmaxrÞ   )ÚidxÚ
next_modelr—   Ú
model_iterÚpeak_in_flightÚtasks_to_indexs      €€€r@   Ú_schedule_nextzC_run_health_checks_with_bounded_concurrency.<locals>._schedule_nextü  s`   ø€ ð	Ü" :Ó.‰OˆC�ô ×)Ñ)Ô*AÀ*Ó*MÓNˆØ"ˆ�tÑÜ˜^¬S°Ó-@ÓAˆØøô ò 	Ùð	ús   ƒA
 Á
	AÁA)Úreturn_when)rÞ   ÚiterÚ	enumeraterD   rÝ   Úminr“   Úwaitr…   ÚkeysÚFIRST_COMPLETEDrb   Úresultr>   )r  r  Úresultsr  râ   Údoner—   r  rs   r  r  r  s            @@@r@   Ú+_run_health_checks_with_bounded_concurrencyr#  ò  s
  úè ø€ ð
 !˜6¤C¨£KÑ/€GØ57€NÜœY vÓ.Ó/€JØ€Nð	œD÷ 	ô ”3Ð(¬#¨f«+Ó6Ó7ò ˆÙÕðñ ÜŸ™Ü�×#Ñ#Ó%Ó&Ü×/Ñ/ô
÷ 
‰ˆˆað ò 	ˆDØ ×$Ñ$ TÓ*ˆCð!Ø#Ÿ{™{›}�˜‘ñ Õð	ò ð �NÐ"Ð"ð
ùô ò !Ø �˜–ûð!üsB   …B!DÂ&C(Â'DÃC*ÃDÃ$DÃ*	DÃ3C=Ã8DÃ=DÄDÚmax_concurrencyÚinstrumentation_contextc              ƒ   óˆ  K  — |xs i }t        |j                  dd«      «      }|j                  dd«      }|j                  dd«      }d}d}t        |t        «      r|dkD  rd}t	        | |«      ƒ d	{  –—† \  }	}nS| D �
cg c]   }
t        j                  t        |
«      «      ‘Œ" }}
t        |«      }t        j                  |d
diŽƒ d	{  –—† }	|r@t        j                  d|||t        | «      ||t        j                  «       t        «       «	       g }g }i }t        |	| «      D �]  \  }}
|
d   }|
j                  d«      xs i j                  d«      }t        |t         «      r-d|vr)t#        i |¥|¥|«      }|r||d<   |j%                  |«       Œmt        |t         «      rGt#        i |¥|¥|«      }|r#||d<   d|v r|d   }|||<   t'        |dd«      |d<   |j%                  |«       ŒÄt#        ||«      }|r*||d<   t        |t(        «      r|||<   t'        |dd«      |d<   |j%                  |«       �Œ |||fS 7 �ŒÅc c}
w 7 �Œv­w)z†
    Perform a health check for each model in the list.

    max_concurrency: Optional limit on concurrent health check requests.
    ÚenabledFÚcycle_idrT   ÚsourceÚ	unboundedr   ÚboundedNÚreturn_exceptionsTz‰health_check_dispatch_summary source=%s cycle_id=%s mode=%s model_count=%d max_concurrency=%s peak_in_flight=%d thread_count=%d rss_mb=%sr5   r4   r„   r’   r©   r'   Ústatus_codeiô  Úexception_status)rD   r9   r:   Úintr#  r“   r  r  rÞ   Úgatherr   ÚdebugÚ	threadingÚactive_countrV   Úzipr  rf   r‡   Úgetattrr>   )ru   r_   r$  r%  Úinstrumentation_enabledr(  r)  Údispatch_moder  r!  r-   Útasksræ   rç   Úexceptions_by_model_idÚ
is_healthyr5   Ú	_model_idÚcleanedÚexcs                       r@   Ú_perform_health_checkr>    sƒ  è ø€ ð 6Ò;¸ÐÜ%)Ð*A×*EÑ*EÀiÐQVÓ*WÓ%XÐØ-×1Ñ1°*¸iÓH€HØ+×/Ñ/°¸)ÓD€Fà€MØ€NÜ�/¤3Ô'¨O¸aÒ,?Ø!ˆÜ(SÐT^Ð`oÓ(p×"pÑˆ‘àYcÖdÐPUœ×+Ñ+Ô,CÀEÓ,JÕKÐdˆÐdÜ˜U›ˆÜŸ™¨ÐFÀÑF×FˆáÜ�‰ð XØØØÜ�
‹OØØÜ×"Ñ"Ó$ÜÓô
	
ð  "ÐØ!#Ðð +-Ðä  ¨*Ó5ó 0Ñˆ
�EØÐ/Ñ0ˆØ—Y‘Y˜|Ó,Ò2°×7Ñ7¸Ó=ˆ	ä�j¤$Ô'¨G¸:Ñ,EÜ*Ð+K¨nÐ+KÀ
Ð+KÈWÓUˆGÙØ&/�˜
Ñ#Ø×$Ñ$ WÕ-Ü˜
¤DÔ)Ü*Ð+K¨nÐ+KÀ
Ð+KÈWÓUˆGÙØ&/�˜
Ñ#Ø *Ñ,Ø$ [Ñ1�CØ8;Ð*¨9Ñ5ô 3:¸#¸}ÈcÓ2R�GÐ.Ñ/Ø×&Ñ& wÕ/ä*¨>¸7ÓCˆGÙØ&/�˜
Ñ#Ü˜j¬)Ô4Ø8BÐ*¨9Ñ5Ü29¸*ÀmÐUXÓ2Y�GÐ.Ñ/Ø×&Ñ& wÖ/ð70ð: Ð1Ð3IÐIÐIðo #qûâdàFûs1   ‚A0IÁ2H7Á3IÁ?%H:Â$%IÃ	H?Ã
E.IÈ:Ic                 óÂ   — t        j                   «       }i }| D ]  }|j                  d«      }|sŒd|ddœ||<   Œ! |D ]  }|j                  d«      }|sŒd|ddœ||<   Œ! |S )a�  
    Build a dict mapping deployment_id -> DeploymentHealthStateValue from
    health check endpoint results.

    Each endpoint dict includes a 'model_id' field (added by _perform_health_check)
    that maps back to the deployment's model_info.id.

    Used by the background health check loop to feed health state into
    the router's DeploymentHealthCache for health-check-driven routing.
    r©   Tr�   )r:  Ú	timestampÚreasonFÚbackground_health_check_failed)Útimer9   )ræ   rç   ÚnowÚstatesÚepr©   s         r@   Úbuild_deployment_health_statesrG  i  s‡   € ô —‘“€CØ€Fàò ˆØ—6‘6˜*Ó%ˆÚà"Ø Øñ ˆF�8Òðð "ò ˆØ—6‘6˜*Ó%ˆÚà#Ø Ø:ñ ˆF�8Òðð €MrG   c                 ó,   — | j                  d«      xs dS )zéDeployment model from litellm_params (before Bedrock rewrite).

    Used for reasoning vs non-reasoning max_tokens and wildcard detection only.
    Does not use ``health_check_model``; that override applies later to the request.
    r-   r�   r{   ©r5   s    r@   Ú)_deployment_model_string_for_health_checkrJ  �  s   € ð ×Ñ˜gÓ&Ò,¨"Ð,rG   c                 ó   — dt        | «      v S )NÚ*)rJ  rI  s    r@   Ú$_health_check_deployment_is_wildcardrM  ˜  s   € ØÔ;¸NÓKÐKÐKrG   c                 óª  — | j                  dd«      }|�t        |«      S t        |«      }t        |«      }|ss	 t	        j
                  |«      }| j                  dd«      }| j                  dd«      }|€|�|r|�t        |«      S |s|�t        |«      S |rt        �t        t        «      S t        �t        t        «      S |syy# t        $ r d}Y Œƒw xY w)a\  
    Pick max_tokens for the health check request.

    Priority:
    1. model_info.health_check_max_tokens (explicit override)
    2. For non-wildcard routes: health_check_max_tokens_reasoning / _non_reasoning
       from model_info based on litellm.supports_reasoning(litellm_params["model"])
    3. For non-wildcard reasoning routes: BACKGROUND_HEALTH_CHECK_MAX_TOKENS_REASONING
       from env (if set)
    4. BACKGROUND_HEALTH_CHECK_MAX_TOKENS (global, any route including wildcards)
    5. Non-wildcard default: 16
    6. Wildcard and nothing from (1)(4): leave unset (caller omits max_tokens)
    Úhealth_check_max_tokensNFÚ!health_check_max_tokens_reasoningÚ%health_check_max_tokens_non_reasoningé   )	r9   r/  rM  rJ  r<   Úsupports_reasoningr>   r   r   )r4   r5   rE   Úis_wildcardÚdeployment_modelÚis_reasoningÚtokens_reasoningÚtokens_non_reasonings           r@   Ú _resolve_health_check_max_tokensrY  œ  s÷   € ð !—n‘nÐ%>ÀÓE€HØÐÜ�8‹}Ðä=¸nÓM€KÜGÈÓWÐáð	!Ü"×5Ñ5Ð6FÓGˆLð #-§.¡.Ð1TÐVZÓ"[ÐØ&0§n¡nÐ5\Ð^bÓ&cÐØÐ'Ð+?Ð+KÙÐ 0Ð <ÜÐ+Ó,Ð,ÙÐ$8Ð$DÜÐ/Ó0Ð0ÙÔHÐTÜÔCÓDÐDä)Ð5ÜÔ5Ó6Ð6áØàøô% ò 	!Ø ŠLð	!ús   ¹C ÃCÃCc                 ó(  — t        | |«      }| j                  dd«      }t        |t        «      r|j	                  |«       n;|�9t
        j                  d|j                  d«      t        |«      j                  «       t        «       |d<   t        | |«      rt        | |«      }|�||d<   |t        v r| j                  dd«      }|�||d<   | j                  d	d«      }|�||d<   |d
k(  r| j                  dd«      |d<   |d   j                  d«      r‚ddlm} |d   }|j!                  d«      }|j#                  d«      }	g }
|	D ]"  }||j$                  vsŒ|
j'                  |«       Œ$ dj)                  |
«      }||d<   |j                  d«      sd|d<   |S )a¼  
    Update the litellm params for health check.

    - merges `model_info.health_check_params` into the probe request, so a deployment whose provider
      requires a payload field litellm does not synthesize (e.g. `mediaSource` for Bedrock TwelveLabs
      Pegasus) can supply it. The dedicated knobs below are applied afterwards and win on conflict.
    - gets a short `messages` param for health check
    - adds a bounded `max_tokens` when the deployment is a chat-style mode
      (`chat`, `completion`, `responses`) or the operator explicitly opts in
      via `model_info.health_check_supports_max_tokens`. Non-chat endpoints
      (image, embedding, audio_*, rerank, video, ocr, search, moderation, ...)
      reject unknown fields with 400 "Unknown parameter: 'max_tokens'".
    - updates the `model` param with the `health_check_model` if it exists Doc: https://docs.litellm.ai/docs/proxy/health#wildcard-routes
    - updates the `voice` param with the `health_check_voice` for `audio_speech` mode if it exists Doc: https://docs.litellm.ai/docs/proxy/health#text-to-speech-models
    - for Bedrock models with region routing (bedrock/region/model), strips the litellm routing prefix but preserves the model ID, and pins `custom_llm_provider` to `bedrock` (only when the deployment hasn't already set one, so an explicit `bedrock_converse` survives) so the bare model id still resolves to the provider (e.g. cross-region ids like `us.cohere.embed-v4:0`)
    Úhealth_check_paramsNzGhealth_check_params for model %s is a %s, expected a dict. Ignoring it.r-   r   Ú
max_tokensÚhealth_check_reasoning_effortÚreasoning_effortÚhealth_check_modelÚaudio_speechÚhealth_check_voiceÚalloyÚvoicezbedrock/r   )ÚBedrockModelInfoú/Úcustom_llm_providerÚbedrock)rA   r9   r:   r  Úupdater   ÚwarningÚtypeÚ__name__r]   rF   rY  rH   Ú
startswithÚ!litellm.llms.bedrock.common_utilsrd  ÚremoveprefixÚsplitÚall_global_regionsr‡   Újoin)r4   r5   r8   Ú_health_check_paramsÚ_resolved_max_tokensÚ_hc_reasoning_effortÚ_health_check_modelrd  r-   ÚpartsÚfiltered_partsÚparts               r@   r	  r	  É  sÓ  € ô" -ØØó€Dð #-§.¡.Ð1FÈÓ"MÐÜÐ&¬Ô-Ø×ÑÐ2Õ3Ø	Ð	)Ü�‰ØUØ×Ñ˜wÓ'ÜÐ%Ó&×/Ñ/ô	
ô "9Ó!:€N�:ÑÜ-ØØôô 'GÀzÐSaÓ&bÐØÐ+Ø+?ˆN˜<Ñ(ð Ô>Ñ>Ø&0§n¡nÐ5TÐVZÓ&[ÐØÐ+Ø1EˆNÐ-Ñ.à!+§¡Ð0DÀdÓ!KÐØÐ&Ø"5ˆ�wÑØˆ~ÒØ",§.¡.Ð1EÀwÓ"Oˆ�wÑð �gÑ×)Ñ)¨*Ô5ÝFà˜wÑ'ˆà×"Ñ" :Ó.ˆð —{‘{ 3Ó'ˆØ "ˆàò 	,ˆDàÐ+×>Ñ>Ò>Ø×%Ñ% dÕ+ð	,ð
 —‘˜Ó(ˆØ"'ˆ�wÑØ×!Ñ!Ð"7Ô8àð Ð0Ñ1ð ÐrG   Ú	cli_modelri   c	              ƒ   ó¸  K  — |xs i }t        |j                  dd«      «      }	|j                  dd«      }
|j                  dd«      }| s)|r	|d|idœg} n|	rt        j                  d||
«       g g i fS t	        j
                  «       }t        | «      }|}t        t        | ||«      |«      }|s|	rt        j                  d	||
«       g g i fS t        |«      }t        |¬
«      }t        |«      }|�t        |t        | |«      |«      nd}|t        |«      z   }|	r7t        j                  d||
||||t        j                  «       t        «       «	       	 t        ||||¬«      ƒ d{  –—† \  }}}t!        |||||«      \  }}t        |«      }t        |«      }|	rat        j                  d||
|t        |«      t        |«      t	        j
                  «       |z
  dz  t        j                  «       t        «       «	       |||fS 7 Œ˜# t"        $ rQ |	rMt        j%                  d||
|t	        j
                  «       |z
  dz  t        j                  «       t        «       «       ‚ w xY w­w)aÈ  
    Perform a health check on the system.

    When model_id is provided, only the deployment with that id is checked
    (so models that share the same name but have different ids are checked separately).
    When model (name) is provided, all deployments matching that name are checked.

    When ``health_check_skip_disabled_background_models`` is True (via
    ``general_settings.health_check_skip_disabled_background_models``), deployments
    with ``model_info.disable_background_health_check: true`` are omitted from
    this run (including targeted ``/health`` queries), consistent with the
    background health loop.

    Returns:
        (bool): True if the health check passes, False otherwise.
    r'  Fr(  rT   r)  r-   )rz   r5   zAhealth_check_cycle_skipped source=%s cycle_id=%s reason=no_modelszNhealth_check_cycle_skipped source=%s cycle_id=%s reason=no_models_after_filterrÑ   NrÚ   z¦health_check_cycle_start source=%s cycle_id=%s requested_model_count=%d post_model_filter_count=%d deduped_model_count=%d max_concurrency=%s thread_count=%d rss_mb=%s)r$  r%  zihealth_check_cycle_failed source=%s cycle_id=%s model_count=%d duration_ms=%.2f thread_count=%d rss_mb=%siè  z�health_check_cycle_complete source=%s cycle_id=%s model_count=%d healthy_count=%d unhealthy_count=%d duration_ms=%.2f thread_count=%d rss_mb=%s)rD   r9   r   r1  rC  Ú	monotonicrÞ   r¤   r´   r�   rå   ro   r2  r3  rV   r>  r  r>   r'   )ru   r-   ry  r_   r©   r$  r%  ri   r»   r6  r(  r)  Úcycle_start_timeÚrequested_model_countrŸ   ÚnarrowedÚpost_filter_model_countÚ	requestedÚdeduped_model_countrò   rÔ   Úprobed_healthyÚprobed_unhealthyr9  Úgraded_healthyÚgraded_unhealthyræ   rç   s                               r@   Úperform_health_checkr†  &  s®  è ø€ ð6 6Ò;¸ÐÜ%)Ð*A×*EÑ*EÀiÐQVÓ*WÓ%XÐØ-×1Ñ1°*¸iÓH€HØ+×/Ñ/°¸)ÓD€FáÙØ)2ÀwÐPYÐFZÑ[Ð\‰Já&Ü—‘ØWØØôð
 �r˜2�:Ðä"Ÿn™nÓ.ÐÜ#& z£?ÐØG€MÜ,Ô->¸zÈ5ÐRZÓ-[Ð]jÓk€HÙÙ"Ü�L‰LØ`ØØôð
 �2�rˆzÐä%(¨£]ÐÜ/¸8ÔD€IÜ!$ Y£Ðð Ðô 	)¨Ô4JÈ:ÐWdÓ4eÐgmÔnàð ð
 ¤Ð&7Ó!8Ñ8€GáÜ�‰ð uØØØ!Ø#ØØÜ×"Ñ"Ó$ÜÓô
	
ðô
 (ØØØ+Ø$;ô	
÷ 
ñ		
ØØØ"ô ,OØÐ,¨g°vÐ?Pó,
Ñ(ˆÐ(ô $(¨Ó#7ÐÜ%)Ð*:Ó%;Ðñ Ü�‰ð ^ØØØÜÐ!Ó"ÜÐ#Ó$Ü�^‰^ÓÐ 0Ñ0°DÑ8Ü×"Ñ"Ó$ÜÓô
	
ð Ð1Ð3IÐIÐIðK
ùô ò Ù"Ü×ÑØ{ØØØ#Ü—‘Ó!Ð$4Ñ4¸Ñ<Ü×&Ñ&Ó(ÜÓ!ôð 	ðüs2   ‚EIÅG= Å"G;Å#0G= ÆA(IÇ;G= Ç=AIÉI)T)TNN)NNTNNNFN)Ur“   Úloggingr[   rO   r2  rC  Úcollections.abcr   r   r   ÚAbstractSetÚtypesr   Útypingr   r   r	   Úpydanticr
   r   r<   Úlitellm.routerr   Ú	getLoggerrk  r   Ú__annotations__r;   r  r   Úlitellm.constantsr   r   r   r   Ú-litellm.router_utils.auto_router_model_namingr   r   r   r)   r,   r/   rn   r3   rA   rD   rF   rH   rQ   rR   rV   r]   r  rf   rk   rt   r€   r�   ro   r�   rš   rž   r¤   r¨   r´   r¶   r¸   r­   rÁ   rÅ   rÊ   rÓ   rå   rñ   r  r  r/  r#  r>  rG  rJ  rM  rY  r	  r†  rÚ   rG   r@   ú<module>r’     s3  ðô Û Û Û 
Û Û ß -Ý .Ý "ß 0Ñ 0ç 1ã áÝ%à!�×!Ñ! (Ó+€ˆÓ +Ù˜n°G¸CÀ¸KÑ4HÔI€ˆeÓ I÷ó ÷ñ ò!Ð ˜ó ð. +FÐ   %Ó Eà!(¨,Ð 7Ð ˜Ó 7ñ 3<Ò<_Ó2`Ð ˜% 	¨#¡Ñ/Ó `ð¨7°3¸°;Ñ+?ð ÐQXÐY\Ð^dÐYdÑQeð ÐjmÐptÑjtó ð,8°w¸sÀF¸{Ñ7Kð 8ÐSVÐY]ÑS]ð 8Ðbfó 8ñ  :CÐC_Ó9`Ð /°Ó `ð˜U T™\ó ð ˜ó òBñ	¨ð 	°t¸d±{ó 	ðØ˜T‘kðà	óð$Ø˜c 6˜kÑ*¨TÑ1ðàˆs�^�dÑóð,OØ˜Ñ&ðOà˜cÑ" TÑ)ðOð ˆ<˜ÐÑóOð Ø˜  f Ñ-Ñ.ð à	ó ò&Mðl W¨S°&¨[Ñ%9ð l¸dó lð
	[Ø˜  f Ñ-Ñ.ð	[Ø?Cð	[à
ˆ7�3˜�;Ñ Ð$Ñ%ó	[ðH '¨#¨v¨+Ñ"6ð H¸3À¹:ó Hð

TØ˜  f Ñ-Ñ.ð
TØ7:¸T±zð
TØMPÐSWÉZð
Tà
ˆ7�3˜�;Ñ Ð$Ñ%ó
TðX°7¸3À¸;Ñ3Gð XÈDó XðR˜7 3¨ ;Ñ/ð R°Dó Rð
)˜w s¨F {Ñ3ð )¸¸d¹
ó )ðV Xð V¸3ð VÀ9ÈSÁ>ÐTXÑCXó VðZØ(ðZàðZð ˜S‘>ðZð 	ˆ4�Zó	Zð&Ø˜˜V˜Ñ$ðàðð ˜S‘>ðð 	ˆ4�Zó	ð&	?Ø�w˜s F˜{Ñ+Ñ,ð	?Ø3<¸S±>ð	?à
ˆ7�3˜�;Ñ Ð$Ñ%ó	?ð ?Ø�g˜c 6˜kÑ*Ñ+ð ?à�w˜s F˜{Ñ+Ñ,ð ?ð ð ?ð ˆ7�3˜�;Ñ Ð$Ñ%ó	 ?ðF)Ø ¨¨V¨Ñ 4Ñ5ð)à! '¨#¨v¨+Ñ"6Ñ7ð)ð �g˜c 6˜kÑ*Ñ+ð)ð ð	)ð
 ˆS�#ˆXÑó)ðX$Ø ¨¨V¨Ñ 4Ñ5ð$à! '¨#¨v¨+Ñ"6Ñ7ð$ð �g˜c 6˜kÑ*Ñ+ð$ð ð	$ð
   ¨¨V¨Ñ 4Ñ5ð$ð ˆ8�G˜C ˜KÑ(Ñ)¨8°G¸CÀ¸KÑ4HÑ+IÐIÑJó$ðN¨ó ð2%#¸dð %#ÐWZð %#Ð_dÐeiÐknÐenÑ_oó %#ðT  Ø"&Ø+/ñ	LJØðLJà�D‰[ðLJð ˜4‘ZðLJð " D™[ó	LJð^#Øð#àð#ð 
ó#ðL-¸dð -Àsó -ðL¸ð LÀ$ó Lð*°ð *Àtð *ÐPSÐVZÑPZó *ðZZ¸ð ZÈdð ZÐW[ó Zð~ Ø ØØØ"&Ø+/Ø9>Ø"ñ{JØð{Jà�‰:ð{Jð �T‰zð{Jð �D‰[ð	{Jð
 �D‰jð{Jð ˜4‘Zð{Jð " D™[ð{Jð 37ð{Jð ô{JrG   