Ë
    uPêjhN	 ã                   ó 	  — 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Z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 d dlmZmZmZmZmZ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 m!Z!m"Z"m#Z# d dl$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,Z,d dl-Z,d d
l,m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@ d dlAmBZBmCZC d dlDmEZEmFZFmGZGmHZHmIZI d dlJmKZK d dlLmMZM d dlNmOZO d dlPmQZQ d dlRmSZT d dlUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\ d dl]m^Z^ d dl_m`Z` d dlambZbmcZcmdZd d dlemfZf d dlgmhZh d dlimjZj d dlkmlZl d dlmmnZn d d lompZp d d!lqmrZr d d"lsmtZt d d#lumvZvmwZwmxZx d d$lymzZzm{Z{m|Z|m}Z}m~Z~mZm€Z€m�Z�m‚Z‚ d d%lƒm„Z„m…Z… d d&l†m‡Z‡mˆZˆm‰Z‰ d d'lŠm‹Z‹ d d(lŒm�Z�mŽZŽ d d)l�m�Z�m‘Z‘m’Z’m“Z“m”Z”m•Z• d d*l–m—Z— d d+l˜m™Z™mšZšm›Z›mœZœm�Z�mžZžmŸZŸ d d,l m¡Z¡m¢Z¢m£Z£m¤Z¤ d d-l¥m¦Z§ d d.l¨m©Z©mªZª d d/l«m¬Z¬ d d0l­m®Z®m¯Z¯ d d1l°m±Z±m²Z²m³Z³m´Z´ d d2lµm¶Z¶ d d3l·m¸Z¸ d d4l¹mºZºm»Z»m¼Z¼ d d5l½m¾Z¾m¿Z¿ d d6lÀmÁZÁmÂZÂ d d7lÃmÄZÄmÅZÅmÆZÆmÇZÇ d d8lÈmÉZÉmÊZÊmËZËmÌZÌmÍZÍmÎZÎmÏZÏmÐZÐmÑZÑmÒZÒmÓZÓmÔZÔmÕZÕmÖZÖm×Z×mØZØmÙZÙmÚZÚmÛZÛmÜZÜmÝZÝmÞZÞmßZßmàZàmáZámâZâmãZãmäZämåZåmæZæ d d9lçmèZè d d:lémêZêmëZëmìZìmíZímîZîmïZïmðZðmñZñmòZòmóZómôZômõZõ d d;lémïZö d d<l÷møZømùZùmúZúmûZûmüZümýZýmþZþmÿZÿ�m �Z �m�Z�m�Z�m�Z d=d>�l�m�Z erjd d?�l�m�Z d d@�l	�m
�Z
 d dA�l�m�Z d dB�l�m�Z d dC�l�m�Z�m�Z d dD�l�m�Z d dE�l�m�Z d dF�l�m�Z d dG�l�m�Z d dHlÃ�m�Z�m�Z�m�Z �e�Zne�Ze�Ze�Ze�Ze�Ze�Zejelz  enz  epz  erz  �Ze �edI<   dJ�e�e z  dz  dK�e dz  fdL„�Z!dMe�e�e"f   dz  dK�e#fdN„�Z$ e!dO«      �Z% �e&h dP£«      �Z'e�edQ<   dR�Z(e�edS<   dTeeð   dK�e#fdU„�Z)dV�Z*e�edW<   dX�e"dY�e#dK�e#fdZ„�Z+dX�e"dY�e#d[�e,dK�e#fd\„�Z-d]�e,dK�e#fd^„�Z.dX�e"dK�e#fd_„�Z/dY�e#d`dadK�e#fdb„�Z0d`�e1dK�e,dz  fdc„�Z2d`�e1dd�edY�e#dKdefdf„�Z3dX�e"dY�e#d[�e,dK�e#fdg„�Z4 G dh„ di«      �Z5 G dj„ dke�jl                  «      �Z7 e�jp                  «       �Z9edl   �edm<   dudn„�Z: �e�e:«        �e&do«      �Z;e�edp<   dq�Z<e�edr<    G ds„ dt«      �Z=y)vé    N©Údefaultdict)ÚAsyncGeneratorÚAsyncIteratorÚCallableÚ	GeneratorÚMappingÚSequence)Ú	lru_cache)ÚMappingProxyType)	ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚOptionalÚ	TypeAliasÚTypeVarÚUnionÚcast)ÚAsyncOpenAI)Ú	BaseModel)Úoverload)Úget_secret_str)Úverbose_router_logger)Úuuid)Ú	DualCacheÚInMemoryCacheÚ
RedisCacheÚRedisClusterCache)Ú"CONSUMED_REQUEST_TAGS_METADATA_KEYÚ#DEFAULT_AUTO_ROUTER_MAX_INPUT_CHARSÚDEFAULT_HEALTH_CHECK_INTERVALÚ)DEFAULT_HEALTH_CHECK_STALENESS_MULTIPLIERÚDEFAULT_MAX_LRU_CACHE_SIZEÚ,SESSION_DEPLOYMENT_AFFINITY_TTL_METADATA_KEY)ÚCustomLogger)ÚasyncifyÚrun_async_function)Ú!_get_parent_otel_span_from_kwargsÚcoerce_token_limitÚ get_litellm_metadata_from_kwargsÚ&get_metadata_variable_name_from_kwargsÚget_or_create_metadata_bucket)Úcoroutine_checker)ÚCredentialAccessor)Útracer)Ú declared_authenticating_provider)ÚLogging)ÚPTU_COST_ATTRIBUTION_ENV_VARÚdeclares_ptuÚis_ptu_cost_attribution_enabledÚptu_config_errorÚptu_identity_errorÚ	ptu_termsÚzeroed_ptu_pricing)Úget_configured_request_timeout)Úredact_string)ÚSensitiveDataMaskerÚmask_credentials_in_payloadÚmask_sensitive_structure)ÚJSONProviderRegistry)ÚRouterBudgetLimiting)ÚLeastBusyLoggingHandler)ÚLowestCostLoggingHandler)ÚLowestLatencyLoggingHandler)ÚLowestTPMLoggingHandler)ÚLowestTPMLoggingHandler_v2©Úsimple_shuffle)Ú_get_tags_from_request_kwargsÚget_deployments_for_tagÚis_valid_deployment_tag)	Ú_HiddenParamsHostÚ add_fallback_headers_to_responseÚadd_retry_headers_to_responseÚ%apply_quality_router_decision_headersÚapply_remaining_usage_headersÚ"ensure_response_additional_headersÚget_hidden_params_dictÚ&prepare_response_for_header_attachmentÚresponse_in_flight_token_count)ÚAUTO_ROUTER_MODEL_PREFIXÚclassify_strategy_router_model)Ú"_get_router_metadata_variable_nameÚreplace_model_in_jsonlÚshould_replace_model_in_jsonl)ÚInitalizeCachedClient)Úget_dynamic_litellm_paramsÚis_clientside_credential)Ú_is_proxy_admin_requestÚfilter_team_based_modelsÚfilter_web_search_deploymentsÚresolve_model_group_aliasÚtruncate_fallback_error_detailÚ$warn_on_provider_credential_mismatch)ÚCooldownCache)ÚDEFAULT_COOLDOWN_TIME_SECONDSÚ_async_get_cooldown_deploymentsÚ/_async_get_cooldown_deployments_with_debug_infoÚ_first_presentÚ_get_cooldown_deploymentsÚ_set_cooldown_deploymentsÚ is_advisor_orchestration_failure)ÚAttemptedFallbackTargetsÚ#_check_non_standard_fallback_formatÚget_fallback_model_groupÚrun_async_fallback)Ú!get_num_retries_from_retry_policy)Ú#async_raise_no_deployment_exceptionÚsend_llm_exception_alert)ÚDeploymentHealthCache)ÚDeploymentAffinityCheckÚ*warn_on_unknown_model_group_affinity_flags)Ú!build_io_token_rate_limit_headersÚdeployment_has_io_token_limitsÚ%refund_stale_reservation_before_retryÚ&set_io_token_rate_limit_request_kwargs)ÚModelRateLimitingCheck)ÚPromptCachingDeploymentCheck)Údeployment_is_catalog_mappedÚ%intersect_supported_reasoning_effortsÚ#resolve_supported_reasoning_efforts)Ú0increment_deployment_failures_for_current_minuteÚ1increment_deployment_successes_for_current_minute)ÚFlowItemÚ	Scheduler)ÚAllMessageValuesÚ	FileTypesÚOpenAIFileObjectÚOpenAIFilesPurpose)Ú#CONFIGURABLE_CLIENTSIDE_AUTH_PARAMSÚVALID_LITELLM_ENVIRONMENTSÚAlertingConfigÚAllowedFailsPolicyÚAssistantsTypedDictÚConsumedRequestTagsStampÚCredentialLiteLLMParamsÚCustomRoutingStrategyBaseÚ
DeploymentÚDeploymentTypedDictÚFallbackAccessCheckÚGuardrailTypedDictÚLiteLLM_ParamsÚMockRouterTestingParamsÚModelGroupInfoÚOptionalPreCallChecksÚPreRoutingStrategyÚRetryPolicyÚRouterCacheEnumÚRouterErrorsÚRouterGeneralSettingsÚRouterModelGroupAliasItemÚRouterRateLimitErrorÚRouterRateLimitErrorBasicÚRoutingContextÚRoutingGroupÚRoutingPluginÚRoutingStrategyÚSearchToolTypedDictÚTaggedPreRoutingStrategy)ÚServiceTypes)Ú&PROMPT_QUOTING_ROUTING_DECISION_FIELDSÚCustomPricingLiteLLMParamsÚGenericBudgetConfigTypeÚLiteLLMBatchÚLlmProvidersÚ	ModelInfoÚModelResponseStreamÚStandardLoggingPayloadÚStandardLoggingRoutingDecisionÚUsageÚall_litellm_paramsÚshared_backend_model_info)r©   )ÚCustomStreamWrapperÚEmbeddingResponseÚModelResponseÚRulesÚfunction_setupÚget_llm_providerÚ!get_non_default_completion_paramsÚ
get_secretÚget_utc_datetimeÚis_region_allowedÚprovider_rejectable_paramsÚset_live_deployment_replayé   )ÚPatternMatchRouter)ÚSpan©ÚMidStreamFallbackError©Ú!BaseResponsesAPIStreamingIterator©ÚAdaptiveRouter)Ú
AutoRouterÚPreRoutingHookResponse©ÚComplexityRouter©ÚQualityRouter)ÚAnthropicMessagesResponse)ÚBaseLiteLLMOpenAIResponseObject)ÚResponseAPIUsageÚResponseInputParamÚResponsesAPIResponseÚRouterStrategySelectorÚvalueÚreturnc                 óJ   — | €y 	 t        | «      S # t        t        f$ r Y y w xY w©N)ÚfloatÚ	TypeErrorÚ
ValueError©rÑ   s    úS/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/router.pyÚ_cost_value_as_floatrÚ   .  s0   € Ø€}ØðÜ�U‹|ÐøÜ”zÐ"ò Ùðús   …
 �"¡"Ú
model_infoc           	      óR  — | €y| j                  d«      }|€yt        |t        t        f«      st	        dt
        › d|› d| › �«      ‚t        d¬«      }|€t	        d«      ‚|t
        vrt	        d	t
        › d|› �«      ‚|D ]"  }|t
        vsŒt	        d
t
        › d|› d| › �«      ‚ ||v ryy)a}  Single owner of the environment-gating rule: a deployment whose model_info names
    `supported_environments` loads only on pods whose LITELLM_ENVIRONMENT is in that list.
    `Router.deployment_is_active_for_environment` delegates here, and the model-write
    endpoints consult the same rule to tell a deliberately inactive model from one that
    was dropped by a failed reload.TÚsupported_environmentsz)supported_environments must be a list of z. but set as: z for model_info: ÚLITELLM_ENVIRONMENT)Úsecret_namezPSet 'supported_environments' for model but not 'LITELLM_ENVIRONMENT' set in .envz#LITELLM_ENVIRONMENT must be one of z&supported_environments must be one of F)ÚgetÚ
isinstanceÚlistÚtupler×   r†   r   )rÛ   rÝ   Úlitellm_environmentÚ_envs       rÙ   Ú$model_info_is_active_for_environmentræ   7  s  € ð ÐØØ$.§N¡NÐ3KÓ$LÐØÐ%ØÜÐ,¬t´U¨mÔ<ÜØ7Ô8RÐ7Sð TØ1Ð2Ð2CÀJÀ<ðQó
ð 	
ô "0Ð<QÔ!RÐØÐ"ÜÐkÓlÐlàÔ"<Ñ<ÜØ1Ô2LÐ1MÈ^Ð\oÐ[pÐqó
ð 	
ð 'ò ˆØÔ1Ò1ÜØ8Ô9SÐ8TÐTbÐcgÐbhð i#Ø#- ,ð0óð ðð Ð4Ñ4ØØó    Ú_PreRoutingStrategyT>   ÚmodelÚapi_keyÚapi_baseÚapi_versionÚ_ALIAS_PARAMS_NEVER_FORWARDEDÚ_alias_marker_forwarded_paramsÚ$_ALIAS_MARKER_FORWARDED_PARAMS_KWARGÚchunksc                 ó”  — | D ]Ã  }|j                   sŒ|j                   d   j                  }|j                  d«      s‰|j                  d«      sx|j                  d«      sg|j                  d«      sV|j                  d«      sE|j                  d«      s4|j                  d«      s#|j                  d	«      s|j                  d
«      sŒÃ y y)Nr   ÚcontentÚ
tool_callsÚfunction_callÚreasoning_contentÚthinking_blocksÚreasoning_itemsÚaudioÚimagesÚannotationsTF)ÚchoicesÚdeltarà   )rð   Úchunkrü   s      rÙ   Ú%_stream_chunks_have_generated_contentrþ   b  s¦   € Øò ˆØ�}Š}ØØ—‘˜aÑ ×&Ñ&ˆà�I‰I�iÔ Ø�y‰y˜Ô&Ø�y‰y˜Ô)Ø�y‰yÐ,Ô-Ø�y‰yÐ*Ô+Ø�y‰yÐ*Ô+Ø�y‰y˜Ô!Ø�y‰y˜Ô"Ø�y‰y˜Õ'áðð  rç   éÈ   Ú)MAX_BUFFERED_PRE_CONTENT_ANTHROPIC_CHUNKSrý   Úhas_generated_contentc                 ó$   — ddl m} |ry || «      S )z¾A `ping` keepalive seen before any real content is dropped outright - it recurs indefinitely on a
    slow-starting connection and carries nothing worth buffering toward a possible fallback.r   ©Úis_anthropic_ping_chunkF©ÚLlitellm.llms.anthropic.experimental_pass_through.messages.streaming_iteratorr  )rý   r  r  s      rÙ   Ú._anthropic_stream_should_drop_pre_content_pingr  }  s   € õ uáØÙ" 5Ó)Ð)rç   Úbuffered_chunk_countc                 ó(   — ddl m} |s|ry || «      S )zñA `ping` that no lifecycle frame precedes reaches the client live: a fallback's own message_start can still
    follow it without overlapping lifecycles, and AgenticAnthropicStreamingIterator's hold-back keepalive is exactly
    such a ping.r   r  Fr  )rý   r  r  r  s       rÙ   Ú$_anthropic_stream_forwards_ping_liver
  ‡  s   € õ uáÑ 4ØÙ" 5Ó)Ð)rç   Ústatus_codec                 ó   — | dk(  xs | dk\  S )Ni­  iô  © )r  s    rÙ   Ú_is_retriable_anthropic_statusr  ’  s   € Ø˜#ÑÒ3 °Ñ!3Ð3rç   c                 ó   — ddl m}  || «      S )zÜAgenticAnthropicStreamingIterator's own retrieval-failure frame is the gateway's verdict, not a provider
    failure: another deployment would rerun the same failed hook, so it reaches the client instead of falling back.r   )Ú#is_server_fulfilled_tool_leak_error)ÚTlitellm.llms.anthropic.experimental_pass_through.messages.agentic_streaming_iteratorr  )rý   r  s     rÙ   Ú*_anthropic_stream_error_is_gateway_verdictr  –  s   € õñ /¨uÓ5Ð5rç   ÚerrorrÀ   c                 ó$   — | xs |j                    S )ad  
    A MidStreamFallbackError raised directly by the source iterator (the
    completion-bridge path's CustomStreamWrapper, e.g. on a transport drop)
    carries its own pre_first_chunk bookkeeping - gated the same way a
    detected SSE error event is, so a fallback is never appended after real
    content already reached the client on either path.
    )Úis_pre_first_chunk)r  r  s     rÙ   Ú)_anthropic_stream_should_decline_fallbackr     s   € ð !Ò@¨×(@Ñ(@Ð$@Ð@rç   c                 óî   — t        | dd «      }t        |t        «      r|S t        |t        «      r|j	                  «       rt        |«      S t        t        | dd «      dd «      }t        |t        «      r|S d S )Nr  Úresponse)Úgetattrrá   ÚintÚstrÚisdigit)r  Ú
raw_statusÚresponse_statuss      rÙ   Ú%_anthropic_stream_raised_error_statusr  «  sk   € Ü  }°dÓ;€JÜ�*œcÔ"ØÐÜ�*œcÔ" z×'9Ñ'9Ô';Ü�:‹ÐÜ$¤W¨U°JÀÓ%EÀ}ÐVZÓ[€OÜ(¨¼#Ô>ˆ?ÐHÀDÐHrç   ré   zMidStreamFallbackError | Nonec                 ór   — ddl m} |ryt        | «      }|�t        |«      sy |t	        | «      |d| d¬«      S )zSSame gate as a detected SSE error event; None means the raise propagates unchanged.r   r¿   NÚ	anthropicT©Úmessageré   Úllm_providerÚoriginal_exceptionr  )Úlitellm.exceptionsrÀ   r  r  r  )r  ré   r  rÀ   r  s        rÙ   Ú+_anthropic_stream_fallback_error_for_raisedr'  µ  sH   € õ :áØÜ>¸uÓE€KØÐÔ'EÀkÔ'RØÙ!Ü�E“
ØØ Ø Øôð rç   c                 ó:   — ddl m} |ry || «      xs	 |t        k\  S )a  
    Whether `chunk` should make Router._aanthropic_messages_streaming_iterator
    commit to the primary Anthropic stream (real content arrived, or the
    pre-content buffer cap was hit) rather than keep buffering lifecycle
    frames toward a possible fallback.
    r   )Ú is_anthropic_content_delta_chunkF)r  r)  r   )rý   r  r  r)  s       rÙ   Ú_anthropic_stream_commits_nowr*  É  s&   € õñ ØÙ+¨EÓ2ÒwÐ6JÔNwÑ6wÐwrç   c                   ó˜   — e Zd ZdZdeedf   deddfd„Zede	fd„«       Z
deddfd	„Zdd
„Zdefd„Zdd„Zdeeef   deeef   ddfd„Zy)Ú$FallbackAwareAnthropicMessagesStreamas  
    Bare async generators can't carry the `_hidden_params` attribute the
    proxy reads response headers off of (see
    router_utils.add_retry_fallback_headers.get_hidden_params_dict), so this
    thin wrapper carries it through from the source iterator - mirrors
    AnthropicMessagesStreamingResponse. Used by
    Router._aanthropic_messages_streaming_iterator.
    Úasync_generatorNÚsource_iteratorrÒ   c                 ó^   — || _         || _        t        t        |dd «      xs i «      | _        y )NÚ_hidden_params)Ú_async_generatorÚ_source_iteratorÚdictr  r0  )Úselfr-  r.  s      rÙ   Ú__init__z-FallbackAwareAnthropicMessagesStream.__init__ã  s1   € Ø /ˆÔØ /ˆÔÜ"Ü�OÐ%5°tÓ<ÒBÀó
ˆÕrç   c                 ó4   — t        | j                  dd«      du S )NÚhas_buffered_provider_outputFT)r  r2  ©r4  s    rÙ   r7  zAFallbackAwareAnthropicMessagesStream.has_buffered_provider_outputê  s   € ä�t×,Ñ,Ð.LÈeÓTÐX\Ð\Ð\rç   Úfallback_responsec                 ó   — || _         y rÔ   )r2  )r4  r9  s     rÙ   Úadopt_fallback_sourcez:FallbackAwareAnthropicMessagesStream.adopt_fallback_sourceî  s
   € Ø 1ˆÕrç   c                 ó   — | S rÔ   r  r8  s    rÙ   Ú	__aiter__z.FallbackAwareAnthropicMessagesStream.__aiter__ñ  s   € Øˆrç   c              ƒ   óR   K  — | j                   j                  «       ƒ d {  –—† S 7 Œ­wrÔ   ©r1  Ú	__anext__r8  s    rÙ   r@  z.FallbackAwareAnthropicMessagesStream.__anext__ô  s!   è ø€ Ø×*Ñ*×4Ñ4Ó6×6Ð6Ð6úó   ‚' %¡'c              ƒ   óT   K  — | j                   j                  «       ƒ d {  –—†  y 7 Œ­wrÔ   ©r1  Úacloser8  s    rÙ   rD  z+FallbackAwareAnthropicMessagesStream.aclose÷  s   è ø€ Ø×#Ñ#×*Ñ*Ó,×,Ò,úó   ‚( &¡(Úfallback_hidden_paramsÚfallback_headersc                 ó�   — t        d| j                  j                  d«      xs i «      }i | j                  ¥|¥di |¥|¥i¥| _        y)aU  
        Raw bytes can't carry their own _hidden_params the way a
        ModelResponseStream/ResponsesAPI event can, so a mid-stream
        fallback's provider headers (e.g. Bedrock's x-amzn-requestid) are
        merged onto the wrapper itself instead - mirrors
        Router._apply_fallback_hidden_params_to_item's merge shape.
        údict[str, object]Úadditional_headersN)r   r0  rà   )r4  rF  rG  Úexisting_headerss       rÙ   Úmerge_fallback_hidden_paramszAFallbackAwareAnthropicMessagesStream.merge_fallback_hidden_paramsú  se   € ô #'Ø ×!4Ñ!4×!8Ñ!8Ð9MÓ!NÒ!TÐRTó#
Ðð
Ø×!Ñ!ð
à$ð
ð !Ð"JÐ%5Ð"JÐ9IÐ"Jñ
ˆÕrç   )rÒ   r,  ©rÒ   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚbytesÚobjectr5  ÚpropertyÚboolr7  r;  r=  r@  rD  r	   r  rL  r  rç   rÙ   r,  r,  Ù  s¦   „ ñð
¨°u¸d°{Ñ(Cð 
ÐV\ð 
Ðaeó 
ð ð]¨dò ]ó ð]ð2°vð 2À$ó 2óð7 ó 7ó-ð
à '¨¨V¨Ñ 4ð
ð " # v +Ñ.ð
ð 
ô	
rç   r,  c                   ó   — e Zd ZdZy)ÚRoutingArgsé<   N)rN  rO  rP  Úttlr  rç   rÙ   rW  rW    s   „ Ø
�Crç   rW  zweakref.WeakSet[Router]Ú_live_routersc                  óL   — t        t        «      D ]  } | j                  «        Œ y)zJRe-assert every live router's deployments after the cost map is refreshed.N)rã   rZ  Ú _replay_model_cost_registrations)Úrouters    rÙ   Ú_replay_live_router_model_costr^    s"   € äœÓ&ò 2ˆØ×/Ñ/Õ1ñ2rç   )ÚmessagesÚoriginal_functionÚattempted_targetsÚproxy_server_requestÚ RETRY_BREADCRUMB_EXCLUDED_KWARGSé   ÚRETRY_BREADCRUMB_LIMITc            s       óþ*  — e Zd ZU  e«       Zeed<   dZedz  ed<   dZe	ed<   dZ
dZedz  ed<   dZedz  ed<   dZeeez  ez     dz  ed	<   ddddddddddi dddddddddddd
dg g g i dddddddi ddddddi ddd e«       dddddddddf8dee   eeeef      z  dz  dedz  dee   dz  dee   dz  dedz  dedz  de	dz  dedz  de	dz  dedz  dedee   dz  de	dedz  de	dz  de	dz  de	dz  dedz  d edz  d!edz  d"e	dz  d#ed$ed%   d&ee   dz  d'ed(ed)ed*eeeez  f   dz  d+ed,ed-ed.ed/ee   dz  d0e	d1e ez  dz  d2eee f   d3e	dz  d4e!dz  d5edz  d6edz  d7ed8   d9e"dz  d:ed;ee#ez     dz  d<e$dz  d=e%dz  d>edz  d?e	d@eeee   f   dz  dAedBedCe	dz  dDedEe&e   dz  dFedGe'dz  dHdfrdI„Z(e)dHee   fdJ„«       Z*dK„ Z+dL„ Z,e)dMeeef   dHe-e.z  fdN„«       Z/dOe-fdP„Z0dddQdRdSdTœZ1eeef   edU<   e)dVe2ez  dz  dHedz  fdW„«       Z3d7e2ez  dz  dHdfdX„Z4	 �dþdVe2ez  d:edYedHe5dz  fdZ„Z6d[e&e7   dHdfd\„Z8d7e2ez  d:efd]„Z9d^ee#ez     dz  dHdfd_„Z:d`edHe#dz  fda„Z;	 �dÿdbedcedz  dHee   dz  fdd„Z<dbedHefde„Z=dfedz  dHefdg„Z> e?dhe1£«      Z@e?e   edh<   diedz  dHedz  fdj„ZAdVedHe5dz  fdk„ZB	 �dÿdbediedz  dHeedz  e5dz  f   fdl„ZCdVedz  dmedz  dbednedoeeeef      dz  dpeez  dz  diedz  dHedz  fdq„ZDdVedz  dmedz  dbednedoeeeef      dz  dpeez  dz  diedz  dHedz  fdr„ZEds„ ZFdt„ ZGdu„ ZHdv„ ZIdw„ ZJdx„ ZKdy„ ZLdz„ ZMd{„ ZNd|„ ZOd}„ ZPd~„ ZQd„ ZRd€edz  fd�„ZSd‚edHdfdƒ„ZT�d d„„ZUd9e"dz  fd…„ZVd†efd‡„ZWdbedoeeeef      dHeXeYz  fdˆ„ZZdbedoeeeef      dHeXeYz  fd‰„Z[dHefdŠ„Z\d‹edoe&e]eef      fdŒ„Z^e_dbedoee`   d�ed   dHeYfdŽ„«       Zae_	 �ddbedoee`   d�ed   dHeXfd�„«       Zae_	 �ddbedoee`   d�ed�   dHeYeXz  fd‘„«       Za	 �ddbedoee`   d�efd’„Zae)d“ebd”ecdz  dHdfd•„«       Zde)d–e7dHeeee7f   eee7f   f   fd—„«       Zee)d“e7d˜eeee7f   eee7f   f   dHdfd™„«       ZfdšeYdoeeeef      d›edHeYfdœ„Zge)d�dždHehdŸ   fd „«       Zie)	 	 	 	 	 	 �dd¡„«       Zje)d¢eked£f   dz  d¤edHd£fd¥„«       Zld¦džd›eeef   dHdžfd§„ZmdšeYdoeeeef      d›edHeYfd¨„Znd‹edoe&e]eef      fd©„Zodbedoeeeef      dHeXeYz  fdª„Zp	 �ddbed«ed¬edz  dHdfd­„Zqd®erd†edHdfd¯„Zsd®erd†e]eef   dHdfd°„Ztd®erd†e]ee7f   d«e]ee7f   dHdfd±„Zu	 �dd«ed¬edz  dHdfd²„Zv	 �dÿd†ed«ed³edz  dHewfd´„Zxe)d†ed«edHdfdµ„«       Zy	 �dÿd†ed«ed³edz  dHdfd¶„Zzd†ed«efd·„Z{d«ed¸edHee	z  dz  fd¹„Z|d«ed¸edHee	z  dz  fdº„Z}d«ed¸edHee	z  dz  fd»„Z~d¼ee   doeeeef      eeeeef         z  fd½„Zdbedoeee`      fd¾„Z€e_dbedoeeeef      d�ed   dHeYfd¿„«       Z�e_	 �ddbedoeeeef      d�ed   dHeXfdÀ„«       Z�	 �ddbedoeeeef      d�efdÁ„Z�e_	 �ddbedoee`   dÂe	d�ed   dHeXf
dÃ„«       Z‚e_dbedoee`   dÂe	d�ed   dHeYf
dÄ„«       Z‚	 �ddbedoee`   dÂe	fdÅ„Z‚dbedÂe	dÆedÇee7dÈf   d«eee7f   f
dÉ„ZƒdbedHefdÊ„Z„dbedoee`   d«eeef   fdË„Z…dÌedbefdÍ„Z†dÌedbefdÎ„Z‡dÌedbefdÏ„ZˆdÌedbefdÐ„Z‰dÑeŠdbefdÒ„Z‹dÑeŠdbefdÓ„ZŒdbedpedÔefdÕ„Z�dbedpedÔefdÖ„ZŽdbefd×„Z�dbefdØ„Z�	 	 	 �ddbedÌedÙedz  dÚedz  dÛedz  f
dÜ„Z‘	 	 	 �ddbedÌedÙedz  dÚedz  dÛedz  f
dÝ„Z’dbedÌefdÞ„Z“	 	 	 �ddßedbedÙedz  dÚedz  dÛedz  f
dà„Z”dßedbefdá„Z•dÆefdâ„Z–dbedãefdä„Z—dåedÆefdæ„Z˜dbedãefdç„Z™dåedHdèfdé„ZšdbedÆefdê„Z›d«eeef   dbed`edHeeef   fdë„Zœdbedãefdì„Z�dÆed«edHekdí   fdî„Zžd¦eŸe    d›eeef   dHeŸe    fdï„Z¡dðerdñedòee dÈf   dbed›eeef   dódôdHe¢e df   fdõ„Z£död÷d›eeef   dódôdHe¢e df   fdø„Z¤dÆed«e7dHekdùeŸe    f   fdú„Z¥dûedÆed«e7fdü„Z¦dbedÆefdý„Z§	 �ddbedpeez  dÛedz  dHe¨fdþ„Z©dpeez  dbefdÿ„Zª	 �dþdbedpeez  dÛedz  dHe¨f�d „Z«dpeez  dbef�d„Z¬dbedHe­f�d„Z®dbedHe­f�d„Z¯dbedz  f�d„Z°�d„ Z±dbedHe²f�d„Z³dbedHe²f�d„Z´	 �dÿdbedz  dHe²f�d„ZµdbedHe²f�d	„Z¶dbedHe²f�d
„Z·dbef�d„Z¸	 �dÿdÆe�dedz  f�d„Z¹	 �ddÆedûe�d   f�d„Zº	 �dÿdÆe�dedz  f�d„Z»	 �dÿdÆe�dedz  f�d„Z¼dÆef�d„Z½	 �dÿdÆe�dedz  f�d„Z¾	 �dÿdÆe�dedz  f�d„Z¿	 	 �ddÆe�dedz  �deÀdz  f�d„ZÁd®er�de�dee   dÇed«e�dedHedz  f�d„ZÂ	 �ddöer�dedz  d'edz  d(edz  d)edz  dfedz  dÇed«e�def�d„ZÃ eÄ�jŠ                  «       �d„ «       ZÆ	 	 	 	 �dd«edfedz  d'edz  d(edz  d)edz  f
�d„ZÇ eÄ�jŠ                  «       �d „ «       ZÈdÆef�d!„ZÉ�dÿd«edfedz  f�d"„ZÊ	 	 	 	 	 �d�d#erdnedz  �dedz  d(edz  d)edz  �d$edz  f�d%„ZË�d&„ ZÌ	 �dÿd'eeeee   f      dfedz  dHee   dz  f�d'„ZÍdHedz  f�d(„ZÎ	 	 �ddöer�d)e	de	dnedz  �dedz  dHe	ez  f�d*„ZÏ�d+„ ZÐdHedz  f�d,„ZÑdHef�d-„ZÒ�d.e7dz  f�d/„ZÓd«edHe�d0   f�d1„ZÔd«edöerdHef�d2„ZÕ�d3e�d4eÖdz  dHe	f�d5„Z×dHef�d6„ZØdbed¦eXd«edHef�d7„ZÙdbe�d4eÖdz  f�d8„ZÚdbe�d4eÖdz  dHeee   ee   f   f�d9„ZÛd†ef�d:„ZÜ	 �dÿd†e�d4eÖdz  �d;eÝdz  f�d<„ZÞ	 	 �ddbednee   doee`   dz  �d4eÖdz  diedz  �d;eÝdz  f�d=„Zße)�d>e7dHef�d?„«       Zàe)dfe�d@edHef�dA„«       Záe)�dBe�dCe�dedz  dHdf�dD„«       Zâe)�dBe�dCe�dedz  dHdf�dE„«       Zãd e?«       �dFœ�dGe�dHe�dIe�dJe�dKedz  �dLe?e   dHewdz  f�dM„Zä�d@eådHef�dN„Zæe)d†ewdHeedÈf   f�dO„«       Zçd†ewf�dP„Zè�d@eådHef�dQ„Zéd†ewf�dR„Zê�d@eådHef�dS„Zë�d@eådHef�dT„Zìe)�dUeeeeíeî      f   d`e�dVeedÈf   dHef�dW„«       Zï�dUeeeeíeî      f   d†ewdVeî�dXedHdf
�dY„Zðe)�dUeeeeíeî      f   d`e�dVeedÈf   dHef�dZ„«       Zñd†ewdHdf�d[„Zò�d �d\„Zó�d �d]„Zôd†ewdHdf�d^„Zõ�d@eådHef�d_„Zöd†ewf�d`„Z÷d†ewdHef�da„Zødef�db„Zùd†ewdHewf�dc„Zúd†ew�def�dd„Zûd†ewdHewdz  f�de„Zü�dfe�dge	dHdf�dh„Zýdbe�die	dHdf�dj„Zþ�dÿdbe�dfedz  dHdf�dk„Zÿd†ewdHewdz  f�dl„�Z �dmewdz  �dfedHdf�dn„�Ze)dbe�dedz  dHeedÈf   f�do„«       �Ze)d†ewdHef�dp„«       �Ze)�dfedz  �dBedbe�dedz  dHdf
�dq„«       �Z�d �dr„�Z�dsedHewdz  f�dt„�ZdH�edz  f�du„�Zd†ewdHef�dv„�Z	d†ewdHdf�dw„�Z
�dfedHewdz  f�dx„�Z�dfedHedz  f�dy„�Z�dzedHewdz  f�d{„�Ze)dbe]ewz  dcedz  dHef�d|„«       �Z�dzedcedz  dHewdz  f�d}„�Zd`edH�d~f�d„�Z	 �dÿ�dfedcedz  dHeeef   dz  f�d€„�Ze_	 �dÿd†eke�d�f   �d‚e�dsddH�ef�dƒ„«       �Ze_d†d�d‚e�dsedH�ef�d„„«       �Z	 �dÿd†eke�d�f   dz  �d‚e�dsedz  dH�ef�d…„�Z�dsedHedz  f�d†„�Z�dsedHedz  f�d‡„�Z�dfed`edH�edz  f�dˆ„�Zdfe�d‰edH�edz  f�dŠ„�ZdfedH�edz  f�d‹„�ZdfedHee	dz  e	dz  f   f�dŒ„�ZdfedHee	dz  e	dz  f   f�d�„�Z �e�e�¬Ž«      dfedH�edz  f�d�„«       �ZdfedHeee	f   f�d�„�Z 	 	 �dd¦e7dfedz  diedz  dHef�d‘„�Z!dedHdf�d’„�Z"def�d“„�Z#�d	d`edz  �d”edHee   f�d•„�Z$�d–edHef�d—„�Z%�dfedz  dHedz  f�d˜„�Z&�d™edz  dcedHedz  f�dš„�Z'�dÿd`edbedcedz  dHef�d›„�Z(	 	 �dd`e�dœedz  dcedz  dHee   f�d�„�Z)�dÿdcedz  dHee   f�dž„�Z*dHee   f�dŸ„�Z+e)�d ee   dHef�d¡„«       �Z,dbedHef�d¢„�Z-dHee   f�d£„�Z.�dÿd†edcedz  dHedz  f�d¤„�Z/�dBedz  dHef�d¥„�Z0�dÿd`edz  dHee   f�d¦„�Z1�dÿd`edz  dHe&e   f�d§„�Z2�d¨ee#dÈf   dHeedÈf   f�d©„�Z3e)d†edHef�dª„«       �Z4 e?�e5«       e?h �d«£«      z  �Z6�e7e�d¬<   e)�d­e]ee7f   dHe?e   f�d®„«       �Z8e)d†e�d¯e�d°edHef�d±„«       �Z9dbe�d²e]ee7f   die]ee7f   dHe]ee7f   f�d³„�Z:	 �dd`edz  dcedz  dHee   dz  f�d´„�Z;�dÿd`edcedz  dHeedÈf   f�dµ„�Z<�d �d¶„�Z=�d �d·„�Z>	 	 	 �d
d`edz  �d¸edz  dcedz  dHeeee   f   f�d¹„�Z?�d¸edHef�dº„�Z@�d»„ �ZA�d¼„ �ZB�dÿ�d½„�ZC	 �dÿdoeeeef      dz  dpeez  dz  �d¾edz  dHe	f�d¿„�ZDdbed†e]ee7f   dHe	dz  f�dÀ„�ZEdbedne&e]ee7f      dHef�dÁ„�ZFdbedne&e]ee7f      doe&e]eef      dz  dpee&e7   z  dz  die]ee7f   dz  dHe	dz  f�dÂ„�ZG	 	 	 	 	 �ddbednedoeeeef      dz  dpeez  dz  diedz  �dÃe	dz  �dÄef�dÅ„�ZHdbedHedz  f�dÆ„�ZIdbedHef�dÇ„�ZJ	 �ddbe�dÈedz  �dÉedHeeeez  f   dz  f�dÊ„�ZKe)d†e]ee7f   dHef�dË„«       �ZL	 	 	 	 �ddbedoeeeef      dz  dpeez  dz  �dÌedz  diedz  dHeeeez  f   f�dÍ„�ZMdbednediedz  �dÈedz  dHef
�dÎ„�ZN	 	 	 	 �ddbediedoeeeef      dz  dpeez  dz  �dÌedz  �d4eÖdz  dHee   ez  f�dÏ„�ZOe)dieee7f   �dÐedHdf�dÑ„«       �ZPe)dieee7f   �dÒe]ee7f   dHdf�dÓ„«       �ZQ	 	 	 �ddbediedoeeeef      dz  dpeez  dz  �dÌedz  f
�dÔ„�ZR	 	 	 �ddbediedoeeeef      dz  dpeez  dz  �dÌedz  f
�dÕ„�ZSdbediedoeeeef      dz  dH�eTf�dÖ„�ZUdnee   ez  diedHee   ez  f�d×„�ZVdbedHef�dØ„�ZWdbediedH�dÙf�dÚ„�ZX	 	 	 �ddbediedoeeeef      dz  dpeez  dz  �dÌedz  dH�eYdz  f�dÛ„�ZZdbe�dÜeedÈf   dHeeee7f   dÈf   f�dÝ„�Z[e)d†e]ee7f   �dÞe7dHeedÈf   f�dß„«       �Z\e)�dàe]ee7f   �dáedHef�dâ„«       �Z]�dã�dä�då�eYdz  �dæe&e   dH�e^dz  f�dç„�Z_e)die�dè�e`dz  dHdf�dé„«       �Zae)die�dáe�d>e7dz  dHdf�dê„«       �Zbe)die]ee7f   �dè�e`dH�e`f�dë„«       �Zc	 	 	 	 �ddbedoeeeef      dz  dpeez  dz  �dÌedz  diedz  f
�dì„�Zd	 	 	 	 �ddbedoeeeef      dz  dpeez  dz  �dÌedz  diedz  f
�dí„�Zednee   �dîee   dHee   f�dï„�Zfdnee   dHee   f�dð„�Zge)d†�d�dHef�dñ„«       �Zh	 �dÿdnee   �d4eÖdz  dHee   f�dò„�Zi	 �dÿdnee   �d4eÖdz  dHee   f�dó„�Zjdnee   dHee   f�dô„�Zk�dÿ�d4eÖdz  f�dõ„�Zl�dÿd®erdfedz  f�dö„�Zmd®erf�d÷„�Zn�dø„ �Zo�dù�epf�dú„�Zq�d �dû„�Zr�dü„ �Zs�dý„ �Zty(  ÚRouterÚmodel_namesFNÚcache_responsesi  Údefault_cache_time_secondsÚleastbusy_loggerÚlowesttpm_loggerÚoptional_callbacksÚINFOTÚ r   úsimple-shuffleÚ
model_listÚassistants_configÚsearch_toolsÚguardrail_listÚ	redis_urlÚ
redis_hostÚ
redis_portÚredis_passwordÚredis_dbÚcache_kwargsÚcaching_groupsÚ
client_ttlÚpolling_intervalÚdefault_priorityÚnum_retriesÚmax_fallbacksÚtimeoutÚstream_timeoutÚdefault_litellm_paramsÚdefault_max_parallel_requestsÚset_verboseÚdebug_level)ÚDEBUGrn  Údefault_fallbacksÚ	fallbacksÚcontext_window_fallbacksÚcontent_policy_fallbacksÚmodel_group_aliasÚenable_pre_call_checksÚenable_tag_filteringÚtag_filtering_match_anyÚtag_routing_prefixÚpluginsÚretry_afterÚretry_policyÚmodel_group_retry_policyÚallowed_failsÚallowed_fails_policyÚcooldown_timeÚdisable_cooldownsÚrouting_strategy)rp  ú
least-busyúusage-based-routingúlatency-based-routingúcost-based-routingúusage-based-routing-v2Úlar1Úoptional_pre_call_checksÚrouting_strategy_argsÚrouting_groupsÚprovider_budget_configÚalerting_configÚrouter_general_settingsÚdeployment_affinity_ttl_secondsÚmodel_group_affinity_configÚignore_invalid_deploymentsÚenable_health_check_routingÚ health_check_staleness_thresholdÚ$health_check_ignore_transient_errorsÚ$background_health_check_model_groupsÚenable_weighted_failoverÚfallback_access_checkrÒ   c9                 ó¬  — || _         |2| _        |8| _        || _        || _        || _        || _        | | _        ddlm	}9  |9«       | _
        dt        _        | j                   du rQ|dk(  r$t        j                  t        j                   «       n(|dk(  r#t        j                  t        j"                  «       |/xs
 t%        «       | _        || _        |xs g | _        |xs g | _        g | _        i | _        d}:d};i }<|| _        |€|�p|�nd}:|�||<d	<   |�||<d
<   |�t5        |«      |<d<   |�||<d<   |	�#t        j6                  d«       t5        |	«      |<d<   |<j9                  |«       | j;                  |<«      };|
r7t        j<                  € t        j>                  d%d|:i|<¤Žt        _        |
| _         tC        |;tE        «       ¬«      | _        tG        ||;¬«      | _$        || _%        d| _&        || _'        g | _(        tS        «       | _*        i | _+        i | _,        i | _-        i | _.        i | _/        |!rta        |!«      ng | _1        |xs i | _2        i | _3        i | _4        i | _5        tm        «       | _7        d| _8        i | _9        d| _:        | jw                  d«       |0| _<        |1| _=        t}        |1«       |�\| j                  |«       t€        jƒ                  | «       | j„                  | _C        |D ]  }=d|=d   v sŒd| j0                  |=d   d   <   Œ! ng | _B        |%�|%| _D        nt        jˆ                  | _D        |'xs tŠ        | _F        t�        | j<                  | jŒ                  ¬«      | _H        |(| _I        |3| _J        |7| _K        |5| _L        |6�tm        |6«      nd| _M        |4xs tœ        tž        z  }>t¡        | j<                  t£        |>«      ¬«      | _R        tE        «       | _S        |�|| _T        n;t        j¨                  �t        j¨                  | _T        ntª        j¬                  | _T        |�|| _W        n;t        j®                  �t        j®                  | _W        nt        j°                  | _W        || _Y        |xs t        j´                  | _[        |�
t¹        «       nd| _Z        || _]        |"| _^        | j¿                  |)«      | _`        |,| _a        |xs t        jÄ                  }?| jÇ                  |?¬«       |?| _b        |€t        jÈ                  �H|xs t        jÈ                  }?| jÄ                  �| jÄ                  jË                  d|?i«       n
d|?ig| _b        |xs t        jÌ                  | _f        |xs t        jÎ                  }@| jÇ                  |@¬«       |@| _g        tÑ        tÒ        «      | _j        tÑ        tÒ        «      | _k        tÑ        tÒ        «      | _l        |xs i }t        jÚ                  || ¬«      | _n        || _o        | jÞ                  já                  d|«       | jÞ                  já                  dd«       | jÞ                  já                  di «      j9                  d|i«       i | _q        	 | j¿                  |)«      dk(  rddlrms}A  |A| |+«       n| jé                  |)|+¬«       | jw                  | jÂ                  «       i | _u        tí        jî                  «       | _x        d| _y        tõ        t        jö                  t`        «      r*t        jø                  jû                  | jü                  «       n)t        jø                  jû                  | jü                  «       tõ        t        jþ                  t`        «      r,t        jø                  �j                  | �j                  «       n| �j                  gt        _        tõ        t        �j                  t`        «      r,t        jø                  �j                  | �j                  «       n| �j                  gt        _‚        tõ        t        �j
                  t`        «      r,t        jø                  �j                  | �j                  «       n| �j                  gt        _…        |+| _ˆ        |-| _‰        d| _Š        �t        �j                  || �j                  ¬ «      r|*�|*jË                  d!«       nd!g}*d| _�        |#�{tõ        |#�t        «      r�t        d%i |#¤Ž| _�        ntõ        |#�t        «      r|#| _�        | �j                  �3t        �j                   d"| �j                  �j#                  d¬#«      «       |$| _’        d| _“        |&�{tõ        |&�t        «      r�t)        d%i |&¤Ž| _“        ntõ        |&�t(        «      r|&| _“        | �j&                  �3t        �j                   d$| �j&                  �j#                  d¬#«      «       |.| _•        |*�| �j-                  |*«       | jz                  r| �j/                  «        | �j*                  �| �j1                  «        | �j3                  «        | �j5                  «        | �j7                  «        y)&an  
        Initialize the Router class with the given parameters for caching, reliability, and routing strategy.

        Args:
            model_list (Optional[list]): List of models to be used. Defaults to None.
            redis_url (Optional[str]): URL of the Redis server. Defaults to None.
            redis_host (Optional[str]): Hostname of the Redis server. Defaults to None.
            redis_port (Optional[int]): Port of the Redis server. Defaults to None.
            redis_password (Optional[str]): Password of the Redis server. Defaults to None.
            cache_responses (Optional[bool]): Flag to enable caching of responses. Defaults to False.
            cache_kwargs (dict): Additional kwargs to pass to RedisCache. Defaults to {}.
            caching_groups (Optional[List[tuple]]): List of model groups for caching across model groups. Defaults to None.
            client_ttl (int): Time-to-live for cached clients in seconds. Defaults to 3600.
            polling_interval: (Optional[float]): frequency of polling queue. Only for '.scheduler_acompletion()'. Default is 3ms.
            default_priority: (Optional[int]): the default priority for a request. Only for '.scheduler_acompletion()'. Default is None.
            num_retries (Optional[int]): Number of retries for failed requests. Defaults to 2.
            timeout (Optional[float]): Timeout for requests. Defaults to None.
            default_litellm_params (dict): Default parameters for Router.chat.completion.create. Defaults to {}.
            set_verbose (bool): Flag to set verbose mode. Defaults to False.
            debug_level (Literal["DEBUG", "INFO"]): Debug level for logging. Defaults to "INFO".
            fallbacks (List): List of fallback options. Defaults to [].
            context_window_fallbacks (List): List of context window fallback options. Defaults to [].
            enable_pre_call_checks (boolean): Filter out deployments which are outside context window limits for a given prompt
            model_group_alias (Optional[dict]): Alias for model groups. Defaults to {}.
            retry_after (int): Minimum time to wait before retrying a failed request. Defaults to 0.
            allowed_fails (Optional[int]): Number of allowed fails before adding to cooldown. Defaults to None.
            cooldown_time (float): Time to cooldown a deployment after failure in seconds. Defaults to 1.
            routing_strategy (Literal["simple-shuffle", "least-busy", "usage-based-routing", "latency-based-routing", "cost-based-routing"]): Routing strategy used for the implicit "default" group (any model not claimed by an entry in `routing_groups`). Defaults to "simple-shuffle".
            routing_strategy_args (dict): Additional args for the default group's routing strategy (e.g. latency window). Defaults to {}.
            routing_groups (Optional[List[RoutingGroup]]): Named subsets of `model_name`s that use a per-group routing strategy and args. Each model belongs to at most one explicit group; everything else lands in the implicit "default" group driven by `routing_strategy` / `routing_strategy_args`. Defaults to None.
            alerting_config (AlertingConfig): Slack alerting configuration. Defaults to None.
            provider_budget_config (ProviderBudgetConfig): Provider budget configuration. Use this to set llm_provider budget limits. example $100/day to OpenAI, $100/day to Azure, etc. Defaults to None.
            deployment_affinity_ttl_seconds (int): TTL for user-key -> deployment affinity mapping. Defaults to 3600.
            ignore_invalid_deployments (bool): Ignores invalid deployments, and continues with other deployments. Default is to raise an error.
            enable_weighted_failover (bool): When True and the routing strategy is "simple-shuffle", a retryable failure on one deployment causes the request to re-pick (weighted) across the other deployments in the same model group before any cross-group fallback runs. Bounded by `max_fallbacks`. Async-only: currently honored by `router.acompletion()` and other async entrypoints. The sync `router.completion()` path falls back to the regular fallback flow. Defaults to False.
            fallback_access_check (Optional[FallbackAccessCheck]): Awaited before each cross-model-group fallback attempt on the async path; a fallback target it rejects is skipped. Defaults to None (every configured fallback is attempted).
        Returns:
            Router: An instance of the litellm.Router class.

        Example Usage:
        ```python
        from litellm import Router
        model_list = [
        {
            "model_name": "azure-gpt-3.5-turbo", # model alias
            "litellm_params": { # params for litellm completion/embedding call
                "model": "azure/<your-deployment-name-1>",
                "api_key": <your-api-key>,
                "api_version": <your-api-version>,
                "api_base": <your-api-base>
            },
        },
        {
            "model_name": "azure-gpt-3.5-turbo", # model alias
            "litellm_params": { # params for litellm completion/embedding call
                "model": "azure/<your-deployment-name-2>",
                "api_key": <your-api-key>,
                "api_version": <your-api-version>,
                "api_base": <your-api-base>
            },
        },
        {
            "model_name": "openai-gpt-3.5-turbo", # model alias
            "litellm_params": { # params for litellm completion/embedding call
                "model": "gpt-3.5-turbo",
                "api_key": <your-api-key>,
            },
        ]

        router = Router(model_list=model_list, fallbacks=[{"azure-gpt-3.5-turbo": "openai-gpt-3.5-turbo"}])
        ```
        r   )ÚServiceLoggingTrn  r‡  ÚlocalNÚredisÚurlÚhostÚportÚpasswordzwDeprecated 'redis_db' argument used. Please remove 'redis_db' from your config/database and use 'cache_kwargs' instead.ÚdbÚtype)Úredis_cacheÚin_memory_cache)r}  r¹  ré   Úlitellm_params)ÚcacheÚdefault_cooldown_time)r¼  Ústaleness_threshold)Úfallback_paramÚ*)ÚparamsÚ
router_objr�  Úmax_retriesÚmetadatar{  rŸ  ©Úapply_lar1_routing_strategy©r™  r¡  )rq  r£  Úrouter_budget_limitingz+[32mRouter Custom Retry Policy Set:
%s[0m©Úexclude_nonez3[32mRouter Custom Allowed Fails Policy Set:
%s[0mr  )œr…  r¨  r®  r†  r�  rŽ  r�  r�  Úlitellm._service_loggerr°  Úservice_logger_objÚlitellmÚsuppress_debug_infor   ÚsetLevelÚloggingrn  r‡  r™   r¥  rr  rs  rt  Údeployment_namesÚdeployment_latency_mapr|  r  ÚwarningÚupdateÚ_create_redis_cacher¼  ÚCacheri  r   r   r€   Ú	schedulerr~  Údefault_deploymentr„  Úprovider_default_deployment_idsr½   Úpattern_routerÚteam_pattern_routersÚauto_routersÚcomplexity_routersÚadaptive_routersÚquality_routersrâ   Úrouting_pluginsrŒ  Ú model_id_to_deployment_index_mapÚ model_name_to_deployment_indicesÚ team_model_to_deployment_indicesÚ	frozensetÚteam_public_model_namesÚ_access_groups_cacheÚ_zero_cost_cacheÚ_routing_group_rowsÚ_init_routing_groupsr¦  r§  rs   Úset_model_listrZ  Úaddrq  Úhealthy_deploymentsr•  rc   r—  rb   Úcooldown_cacher˜  r©  r­  r«  r¬  r"   r#   rq   rÕ   Úhealth_state_cacheÚfailed_callsr  ÚopenaiÚDEFAULT_MAX_RETRIESr€  ÚROUTER_MAX_FALLBACKSÚ_explicit_timeoutÚrequest_timeoutr�  r:   r‚  r’  Ú_normalize_strategyr™  Ú_routing_groups_inputr‰  Úvalidate_fallbacksrˆ  ÚappendrŠ  r‹  r   r  Útotal_callsÚ
fail_callsÚsuccess_callsÚChatÚchatrƒ  Ú
setdefaultÚdeployment_statsÚ$litellm.router_strategy.lar1_routingrÆ  Úrouting_strategy_initÚ_override_selectorsÚ	threadingÚLockÚ_override_selectors_lockÚaccess_groupsrá   Ú_async_success_callbackÚlogging_callback_managerÚ"add_litellm_async_success_callbackÚdeployment_callback_on_successÚsuccess_callbackÚadd_litellm_success_callbackÚ#sync_deployment_callback_on_successÚ_async_failure_callbackÚ"add_litellm_async_failure_callbackÚ$async_deployment_callback_on_failureÚfailure_callbackÚadd_litellm_failure_callbackÚdeployment_callback_on_failurer¡  r£  Úrouter_budget_loggerr@   Ú!should_init_router_budget_limiterr“  r3  r–   ÚinfoÚ
model_dumpr”  r–  rˆ   r¤  Úadd_optional_pre_call_checksÚ$_ensure_deployment_affinity_callbackÚ_initialize_alertingÚinitialize_assistants_endpointÚinitialize_router_endpointsÚapply_default_settings)Br4  rq  rr  rs  rt  ru  rv  rw  rx  ry  ri  rz  r{  r|  r}  r~  r  r€  r�  r‚  rƒ  r„  r…  r†  rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  r�  r�  r‘  r’  r“  r”  r•  r–  r—  r˜  r™  r   r¡  r¢  r£  r¤  r¥  r¦  r§  r¨  r©  rª  r«  r¬  r­  r®  r°  Ú
cache_typer¹  Úcache_configÚmÚ
_stalenessÚ
_fallbacksÚ_content_policy_fallbacksrÆ  sB                                                                     rÙ   r5  zRouter.__init__>  s[	  € ðd 'ˆÔØ*DˆÔ'Ø,AˆÔ"Ø&ˆÔØ&<ˆÔ#Ø$8ˆÔ!Ø'>ˆÔ$Ø"4ˆÔÝ:á2@Ó2BˆÔØ&*ŒÔ#Ø×Ñ˜tÑ#Ø˜fÒ$Ü%×.Ñ.¬w¯|©|Õ<Ø Ò'Ü%×.Ñ.¬w¯}©}Ô=Ø>UÒ>pÔYnÓYpˆÔ$à!2ˆÔØ(Ò.¨BˆÔØ,Ò2°ˆÔØ&(ˆÔØ&(ˆÔ#àPWˆ
ØˆØ.0ˆà$ˆŒØÐ  ZÐ%;À
Ð@VØ ˆJàÐ$Ø&/�˜UÑ#àÐ%Ø'1�˜VÑ$àÐ%Ü'*¨:£�˜VÑ$àÐ)Ø+9�˜ZÑ(àÐ#Ü%×-Ñ-ð Nôô &)¨£]�˜TÑ"ð ×Ñ Ô-Ø×2Ñ2°<Ó@ˆKáÜ�}‰}Ð$ä '§¡Ñ N°:Ð NÀÑ N””Ø#2ˆDÔ ÜØ#´]³_ô
ˆŒ
ô
 #Ð4DÐR]Ô^ˆŒØ 0ˆÔàð 	Ôð .KˆÔ*Ø:<ˆÔ,Ü0Ó2ˆÔØCEˆÔ!ØSUˆÔØ_aˆÔØ[]ˆÔØY[ˆÔÙEL´D¸´MÐRTˆÔð Ò# ð 	Ôð
 ACˆÔ-ð GIˆÔ-àRTˆÔ-Ü7@³{ˆÔ$ð BFˆÔ!ð 24ˆÔØKOˆÔ Ø×!Ñ! $Ô'à/NˆÔ,Ø+FˆÔ(Ü2Ð3NÔOàÐ!à×Ñ 
Ô+ô ×Ñ˜dÔ#Ø-1¯_©_ˆDÔ$Øò R�Ø˜aÐ 0Ñ1Ò1ØPQ�D×/Ñ/°Ð2BÑ0CÀGÑ0LÒMñRð %'ˆDŒOàÐ$Ø!.ˆDÕä!(×!6Ñ!6ˆDÔØ*ÒKÔ.KˆÔÜ+°$·*±*ÐTX×TfÑTfÔgˆÔØ!2ˆÔØ+FˆÔ(Ø(@ˆÔ%Ø4XˆÔ1ð 4Ð?ô Ð:Ô;àð 	Ô1ð
 =ò 
Ü)Ô,UÑUð 	ô #8¸d¿j¹jÔ^cÐdnÓ^oÔ"pˆÔÜ)›OˆÔàÐ"Ø*ˆDÕÜ× Ñ Ð,Ü&×2Ñ2ˆDÕä%×9Ñ9ˆDÔàÐ$Ø!.ˆDÕÜ×"Ñ"Ð.Ü!(×!6Ñ!6ˆDÕä!(×!=Ñ!=ˆDÔà!(ˆÔØÒ9¤'×"9Ñ"9ˆŒð DKÐCVÔ=Ô?Ð\`ˆÔØ,ˆÔà&ˆÔØ $× 8Ñ 8Ð9IÓ JˆÔØGUˆÔ"ð Ò3¤'×"3Ñ"3ˆ
à×Ñ¨zÐÔ:à#ˆŒàÐ(¬G×,EÑ,EÐ,QØ*ÒG¬g×.GÑ.GˆJØ�~‰~Ð)Ø—‘×%Ñ% s¨JÐ&7Õ8à#&¨
Ð"3Ð!4�”à(@Ò(dÄG×DdÑDdˆÔ%à+CÒ+gÄw×GgÑGgÐ!Ø×ÑÐ/HÐÔIØ(AˆÔ%Ü(3´CÓ(8ˆÔÜ'2´3Ó'7ˆŒÜ*5´cÓ*:ˆÔð "8Ò!=¸2ÐÜ—L‘LÐ(>È4ÔPˆŒ	ð '=ˆÔ#Ø×#Ñ#×.Ñ.¨y¸'ÔBØ×#Ñ#×.Ñ.¨}¸aÔ@Ø×#Ñ#×.Ñ.¨z¸2Ó>×EÑEÐGWÐYgÐFhÔià&(ˆÔð	ð ×#Ñ#Ð$4Ó5¸Ò?ÝXá'¨Ð.CÕDà×&Ñ&Ø!1Ø&;ð 'ô ð 	×!Ñ! $×"<Ñ"<Ô=ØMOˆÔ Ü(1¯©Ó(8ˆÔ%Ø!ˆÔä”g×5Ñ5´tÔ<Ü×,Ñ,×OÑOÐPT×PsÑPsÕtä×,Ñ,×OÑOÐPT×PsÑPsÔtÜ”g×.Ñ.´Ô5Ü×,Ñ,×IÒIÈ$×JrÒJrÕsà(,×(PÒ(PÐ'QŒGÔ$Ü”g×5Ò5´tÔ<Ü×,Ñ,×OÒOØ×9Ò9õð 04×/XÒ/XÐ.YŒGÔ+ä”g×.Ò.´Ô5Ü×,Ñ,×IÒIÈ$×JmÒJmÕnà(,×(KÒ(KÐ'LŒGÔ$Ø%:ˆÔ"Ø&<ˆÔ#ØAEˆÔ!Ý×AÒAØ!¸$×:UÒ:Uõ
ð (Ð3Ø(×/Ñ/Ð0HÕIà,DÐ+EÐ(Ø04ˆÔØÐ#Ü˜,­Ô-Ý$/Ñ$?°,Ñ$?�Õ!Ü˜L­+Ô6Ø$0�Ô!Ø× Ò Ð,Ü%×*Ò*ØHØ×%Ò%×0Ò0¸dÐ0ÓCôð
 H`ˆÔ%à?CˆÔ!ØÐ+ÜÐ.µÔ5Ý,>Ñ,VÐAUÑ,V�Õ)ÜÐ0Õ2DÔEØ,@�Ô)à×(Ò(Ð4Ü%×*Ò*ØPØ×-Ò-×8Ò8ÀdÐ8ÓKôð
 7FˆÔà#Ð/Ø×-Ò-Ð.FÔGð
 ×+Ò+Ø×5Ò5Ô7à×ÒÐ+Ø×%Ò%Ô'à×+Ò+Ô-Ø×(Ò(Ô*Ø×#Ò#Õ%rç   c                  ó¨   — t        j                  t        j                  «      } | j                  | j
                  z   }d|v r|j                  d«       |S )zS
        Returns a list of valid arguments for the Router.__init__ method.
        r4  )ÚinspectÚgetfullargspecrg  r5  ÚargsÚ
kwonlyargsÚremove)Úarg_specÚ
valid_argss     rÙ   Úget_valid_argszRouter.get_valid_args  sH   € ô
 "×0Ñ0´·±ÓAˆØ$ŸM™M¨H×,?Ñ,?Ñ?ˆ
Ø�ZÑØ×Ñ˜fÔ%ØÐrç   c                 ó*   — g }| j                  |«       y)z;
        Apply the default settings to the router.
        N)r  )r4  Údefault_pre_call_checkss     rÙ   r  zRouter.apply_default_settings  s   € ð
 ACÐØ×)Ñ)Ð*AÕBrç   c                 óN  — t         j                  | «       t        j                  j	                  t        j
                  | «       t        j                  j	                  t        j                  | «       t        j                  j	                  t        j                  | «       t        j                  j	                  t        j                  | «       t        j                  j	                  t        j                  | «       t        j                  j	                  t        j                  | «       t        j                  j	                  t        j                  | «       | j                  �B| j                  D ]2  }t        j                  j	                  t        j                  |d¬«       Œ4 yy)z­
        Pseudo-destructor to be invoked to clean up global data structures when router is no longer used.
        For now, unhook router's callbacks from all lists
        NF)Úrequire_self)rZ  ÚdiscardrÍ  r  Ú#remove_callback_from_list_by_objectr  r  r  r  Úinput_callbackÚservice_callbackÚ	callbacksrm  )r4  Úcallbacks     rÙ   r1  zRouter.discard  s,  € ô 	×Ñ˜dÔ#Ü×(Ñ(×LÑLÌW×MlÑMlÐnrÔsÜ×(Ñ(×LÑLÌW×MeÑMeÐgkÔlÜ×(Ñ(×LÑLÌW×MlÑMlÐnrÔsÜ×(Ñ(×LÑLÌW×MeÑMeÐgkÔlÜ×(Ñ(×LÑLÌW×McÑMcÐeiÔjÜ×(Ñ(×LÑLÌW×MeÑMeÐgkÔlÜ×(Ñ(×LÑLÌW×M^ÑM^Ð`dÔeð ×"Ñ"Ð.Ø ×3Ñ3ò �Ü×0Ñ0×TÑTÜ×%Ñ% x¸eð Uõ ñð /rç   r  c                 óÈ   — | j                  d«      }|s2t        d«      }|�%t        |t        «      rt	        j
                  |«      }|rt        di i | ¥d|i¥¤ŽS t        di | ¤ŽS )za
        Initializes either a RedisCache or RedisClusterCache based on the cache_config.
        Ústartup_nodesÚREDIS_CLUSTER_NODESr  )rà   r·   rá   r  ÚjsonÚloadsr   r   )r  r8  Ú_env_cluster_nodess      rÙ   rÕ  zRouter._create_redis_cache1  so   € ð %×(Ñ(¨Ó9ˆÙÜ(2Ð3HÓ(IÐØ!Ð-´*Ð=OÔQTÔ2UÜ $§
¡
Ð+=Ó >�áÜ$ÑXÐ'W¨,Ð'W¸ÈÑ'WÑXÐXäÑ- Ñ-Ð-rç   r¼  c                 óT   — | j                   j                  €|| j                   _        yy)zÛ
        Update the redis cache for the router, if none set.

        Allows proxy user to just do
        ```yaml
        litellm_settings:
            cache: true
        ```
        and caching to just work.
        N)r¼  r¹  )r4  r¼  s     rÙ   Ú_update_redis_cachezRouter._update_redis_cacheC  s%   € ð �:‰:×!Ñ!Ð)Ø%*ˆD�J‰JÕ"ð *rç   Úlowesttpm_logger_v2Úlowestlatency_loggerÚlowestcost_logger)rš  r›  rž  rœ  r�  Ú"_DEFAULT_SELECTOR_ATTR_BY_STRATEGYÚstrategyc                 óD   — | €y t        | t        «      r| j                  S | S rÔ   )rá   r    rÑ   )rC  s    rÙ   rõ  zRouter._normalize_strategy\  s&   € ð ÐØÜ�h¤Ô0Ø—>‘>Ð!Øˆrç   c                 óÔ   — ddgt         D �cg c]  }|j                  ‘Œ c}z   }|€y t        |t        «      xr ||v }t        |t         «      }|s|st	        d|› d|› d�«      ‚y y c c}w )Nrp  rŸ  zInvalid routing_strategy: 'z'. Valid options: z„. Check 'router_settings.routing_strategy' in your config.yaml or the 'routing_strategy' parameter if using the Router SDK directly.)r    rÑ   rá   r  r×   )r4  r™  ÚsÚvalid_strategy_stringsÚis_valid_stringÚis_valid_enums         rÙ   Ú_validate_routing_strategyz!Router._validate_routing_strategyf  s“   € à)9¸6Ð(BÔWfÖEgÐRSÀaÇgÃgÒEgÑ(gÐØÐ#ØÜ!+Ð,<¼cÓ!BÒ!qÐGWÐ[qÐGqˆÜ)Ð*:¼OÓLˆÙ¡}ÜØ-Ð.>Ð-?ð @"Ø"8Ð!9ð :XðYóð ð (5ˆùò Fhs   ŒA%Úregister_callbacksc                 ó`  — d}| j                  |«      xt        j                  j                  k(  re t	        | j
                  ¬«      }|�r#t        t        j                  t        «      r t        j                  j                  |«       nå|gt        _        nØxt        j                  j                  k(  r t        | j
                  |¬«      }n¢xt        j                  j                  k(  r t        | j
                  |¬«      }nlxt        j                  j                  k(  r t!        | j
                  |¬«      }n6t        j"                  j                  k(  rt%        | j
                  i ¬«      }n	 	 |�?|r=t        t        j&                  t        «      rt        j(                  j+                  |«       |S )z¥
        Constructs a strategy selector for a given strategy.
        Returns None for `simple-shuffle` (no selector needed) and unknown
        strategies.
        N)Úrouter_cache)rM  Úrouting_args)rõ  r    Ú
LEAST_BUSYrÑ   rA   r¼  rá   rÍ  r3  râ   rø  ÚUSAGE_BASED_ROUTINGrD   ÚUSAGE_BASED_ROUTING_V2rE   ÚLATENCY_BASEDrC   Ú
COST_BASEDrB   r5  r  Úadd_litellm_callback)r4  rC  r¡  rK  Úselectors        rÙ   Ú_build_strategy_selectorzRouter._build_strategy_selectoru  s9  € ð 37ˆØ×&Ñ& xÓ0Ø1”×+Ñ+×1Õ1Ü2ÀÇ
Á
ÔK�Ú%Ü!¤'×"8Ñ"8¼$Ô?Ü×.Ñ.×5Ñ5°hÕ?à2:°œÕ.Ø:”×4Ñ4×:Õ:Ü2Ø!%§¡Ø!6ô‘ð >”×7Ñ7×=Õ=Ü5Ø!%§¡Ø!6ô‘ð 5”×.Ñ.×4Õ4Ü6Ø!%§¡Ø!6ô‘ô !×+Ñ+×1Ô1Ü3Ø!%§¡Ø!#ô‘ð ØàÐÑ$6¼:Äg×FWÑFWÔY]Ô;^Ü×,Ñ,×AÑAÀ(ÔKàˆrç   Ú	selectorsc                 ó¬  — |D �ch c]  }|€Œt        |«      ’Œ }}|syt        t        j                  t        «      r5t        j                  D �cg c]  }t        |«      |vsŒ|‘Œ c}t        _        t        t        j
                  t        «      r6t        j
                  D �cg c]  }t        |«      |vsŒ|‘Œ c}t        _        yyc c}w c c}w c c}w )a0  
        Drop router-owned strategy selectors from litellm's global callback
        lists by identity. Used before re-init (`routing_strategy_init` /
        `_init_routing_groups`) so repeated `update_settings` calls don't
        accumulate dead selectors that keep receiving callback events.
        N)Úidrá   rÍ  r5  râ   r3  )r4  rW  rF  Úselector_idsÚcs        rÙ   Ú_unregister_router_selectorsz#Router._unregister_router_selectors¥  s¢   € ð /8ÖI¨¸1¹=œr !�uÐIˆÐIÙØÜ”g×'Ñ'¬Ô.Ü,3×,=Ñ,=Ö [ qÄÀAÃÈlÒAZ¢Ò [ŒGÔÜ”g×,Ñ,¬dÔ3Ü18×1GÑ1GÖ%e¨AÌ2ÈaË5ÐXdÒKd¢aÒ%eŒGÕ"ð 4ùò Jùò !\ùâ%es"   …C�CÁCÁ"CÂ"CÂ5Cc           
      ó@  — t        j                  d|«       | j                  |«       | j                  «        | j	                  | j
                  j                  «       D �cg c]  }t        | |d «      ‘Œ c}t        t        | di «      j                  «       «      z   «       i | _	        d | _
        d | _        d | _        d | _        d | _        | j                  ||¬«      }| j
                  j!                  | j#                  |«      xs d«      }|�t%        | ||«       y y c c}w )NzRouting strategy: %sr  ©rC  r¡  ro  )r   r  rJ  Ú_reset_custom_routing_strategyr\  rB  Úvaluesr  râ   r  rk  rl  r?  r@  rA  rV  rà   rõ  Úsetattr)r4  r™  r¡  ÚattrrU  s        rÙ   r  zRouter.routing_strategy_init´  s  € Ü×"Ñ"Ð#9Ð;KÔLØ×'Ñ'Ð(8Ô9Ø×+Ñ+Ô-à×)Ñ)Ø37×3ZÑ3Z×3aÑ3aÓ3cÖd¨4ŒW�T˜4 Õ&ÒdÜ”7˜4Ð!6¸Ó;×BÑBÓDÓEñFô	
ð $&ˆÔ à@DˆÔØ@DˆÔØFJˆÔ ØHLˆÔ!ØBFˆÔà×7Ñ7Ø%Ø"7ð 8ó 
ˆð ×=Ñ=×AÑAÀ$×BZÑBZÐ[kÓBlÒBrÐprÓsˆð
 ÐÜ�D˜$ Õ)ð ùò) es   ÁDÚgroups_inputc                 óÒ  — t        | di «      }| j                  |j                  «       D ��cg c]  }|j                  «       D ]  }|‘Œ Œ c}}«       i | _        i | _        i | _        | j                  «        | j                  «        |sy| j                  xs g D �ch c]%  }|j                  d«      sŒ|j                  d«      ’Œ' }}t        «       }|D �]  }t        |t        «      r|n
t        di |¤Ž}	|	j                  st        d«      ‚|	j                  dk(  rt        d«      ‚|	j                  |v s|	j                  | j                  xs i v r t!        j"                  d|	j                  «       |	j                  |v rt        d|	j                  › d	�«      ‚|j%                  |	j                  «       | j'                  |	j(                  «       |	j*                  D ]|  }
|
| j                  v r,t        d
|
› d| j                  |
   › d|	j                  › d�«      ‚|r%|
|vr!t!        j"                  d|
|	j                  «       |	j                  | j                  |
<   Œ~ |	| j                  |	j                  <   | j-                  |	j(                  «      xs d}| j/                  |	j(                  |	j0                  xs i ¬«      }|�||ini | j
                  |	j                  <   �Œ yc c}}w c c}w )aÆ  
        Validates and indexes `routing_groups`. Each `model_name` may belong to
        at most one explicit group. Constructs per-group strategy selectors so
        groups with different `routing_strategy_args` track independent state.

        Models not claimed by any explicit group are served by the implicit
        `"default"` group, whose selectors are the `self.<strategy>_logger`
        attributes set up in `routing_strategy_init`.
        Ú_group_selectorsNÚ
model_namez-routing_groups: group_name must be non-empty.ÚdefaultzFrouting_groups: 'default' is reserved for the implicit fallback group.zºrouting_groups: group_name '%s' is shadowed by an existing model_name or model_group_alias; the group's strategy still applies to its members, but the name is not callable until renamed.zBrouting_groups: group names must be unique, duplicate group_name 'z'.zrouting_groups: model_name 'z' appears in both 'z' and 'z.'. Each model may belong to at most one group.z™routing_groups: model_name '%s' (group '%s') is not in model_list; the group entry will only take effect once a deployment with that model_name is added.ro  r^  r  )r  r\  r`  Ú_routing_groupsÚ_model_to_groupre  Ú"_invalidate_model_group_info_cacheÚ_invalidate_access_groups_cacherq  rà   Úsetrá   rž   Ú
group_namer×   rŒ  r   rÓ  rë  rJ  r™  Úmodelsrõ  rV  r¡  )r4  rc  Úgroup_selectorsrW  Úselr   Úknown_model_namesÚseen_group_namesÚrawÚgrouprf  Ústrategy_valueÚgroup_selectors                rÙ   ré  zRouter._init_routing_groupsÑ  s  € ô V]ØÐ$ bóV
ˆð 	×)Ñ)À×@VÑ@VÓ@X×*w°9Ðdm×dtÑdtÓdvÒ*wÐ]`ª3Ð*w¨3Ó*wÔxà8:ˆÔØ/1ˆÔØNPˆÔØ×/Ñ/Ô1Ø×,Ñ,Ô.áØàBFÇ/Á/ÒBWÐUWÖ#p¸AÐ\]×\aÑ\aÐbnÕ\o A§E¡E¨,Õ$7Ð#pÐÐ#pä'*£uÐØó /	ˆCÜ% c¬<Ô8‘C¼lÑ>QÈSÑ>QˆEà×#Ò#Ü Ð!PÓQÐQØ×Ñ 9Ò,Ü Ð!iÓjÐjØ×ÑÐ#4Ñ4¸×8HÑ8HÈT×McÑMcÒMiÐgiÑ8jÜ%×-Ñ-ðuà×$Ñ$ôð
 ×ÑÐ#3Ñ3Ü ØXÐY^×YiÑYiÐXjÐjlÐmóð ð × Ñ  ×!1Ñ!1Ô2à×+Ñ+¨E×,BÑ,BÔCà#Ÿl™lò D�
Ø ×!5Ñ!5Ñ5Ü$Ø6°z°lð C!Ø!%×!5Ñ!5°jÑ!AÐ Bð CØ!×,Ñ,Ð-Ð-[ð]óð ñ
 %¨Ð;LÑ)LÜ)×1Ñ1ð/ð #Ø×(Ñ(ôð 49×3CÑ3C�×$Ñ$ ZÒ0ðDð" 6;ˆD× Ñ  ×!1Ñ!1Ñ2à!×5Ñ5°e×6LÑ6LÓMÒSÐQSˆNØ!×:Ñ:Ø×/Ñ/Ø&+×&AÑ&AÒ&GÀRð ;ó ˆNð
 5CÐ4N� Ñ0ÐTVð ×!Ñ! %×"2Ñ"2Ó3ñ[/	ùó +xùò $qs   ¬K
ÂK$Â3K$rf  c                 óœ   — | j                   sy| j                   j                  |«      }|� || j                  v s|| j                  xs i v ry|S )aa  
        The routing group callable as `model_name`, or None. A real deployment
        `model_name` added after init shadows a same-named group (mirroring
        `_try_early_resolve_deployments_for_model_not_in_names`, where concrete
        models win over indirection); config-time collisions are rejected by
        `_init_routing_groups`.
        N)rh  rà   râ  rŒ  )r4  rf  rt  s      rÙ   Úget_routing_groupzRouter.get_routing_group   sT   € ð ×#Ò#ØØ×+Ñ+×/Ñ/°
Ó;ˆàˆMØ˜T×BÑBÑBØ˜d×4Ñ4Ò:¸Ñ;àØˆrç   ré   Úteam_idc                 ó¸   — | j                   sy| j                  |«      }|€y|j                  D ��cg c]  }| j                  ||¬«      D ]  }|‘Œ Œ c}}S c c}}w )aM  
        The union of member deployments for a routing group called as `model`,
        or None when `model` is not a callable group. The requested name stays
        the group name so strategy selectors key their state by it.

        `_common_checks_available_deployment` consults this BEFORE its
        early-resolve step so a wildcard `default_deployment` or pattern route
        cannot hijack a group call. Overall resolution precedence there:
        specific deployment > model id > model_group_alias > routing group >
        model_name > team/pattern/default fallbacks.
        N©rf  ry  )rh  rx  rn  Ú_get_all_deployments)r4  ré   ry  Úrouting_groupÚmemberÚ
deployments         rÙ   Ú_get_routing_group_deploymentsz%Router._get_routing_group_deployments3  sw   € ð ×#Ò#ØØ#×5Ñ5°eÓ<ˆØÐ Øð (×.Ñ.÷
àØ"×7Ñ7À6ÐSZÐ7Ó[ò
ð ò ð
Øó
ð 	
ùó 
s   ±!Ac                 ó®   — || j                   v xsF | j                  |«      xs3 | j                  duxr || j                  v xs | j                  |«      duS )a…  
        Whether `model` names something this router serves directly: a
        deployment model_name, a deployment id, a `model_group_alias`, or a
        callable routing group. Proxy request gates share this predicate so a
        new virtual-model kind cannot be forgotten at one of them; wildcard,
        default-deployment, and deployment-name fallbacks stay caller policy.
        N)rh  Úhas_model_idrŒ  rx  ©r4  ré   s     rÙ   Úis_recognized_modelzRouter.is_recognized_modelL  sg   € ð �T×%Ñ%Ð%ò 9Ø× Ñ  Ó'ò9à×&Ñ&¨dÐ2ÒV°uÀ×@VÑ@VÐ7Vò9ð ×%Ñ% eÓ,°DÐ8ð		
rç   Úmodel_groupc                 ó    ‡ — |€y‰ j                  |¬«      xs |}‰ j                  |«      }|€yt        ˆ fd„|j                  D «       «      dkD  S )a®  
        True when `model_group` names a callable routing group whose member
        union spans more than one deployment. Cooldown handling passes the
        FAILING REQUEST's model group here: a 429 on a group call cools the
        member down so selection moves to the group's alternatives, while a
        direct call to a single-deployment member keeps the
        single-deployment-model-group cooldown exemption.
        F©ré   c              3   ón   •K  — | ],  }t        ‰j                  j                  |«      xs d «      –— Œ. y­w)r  N)Úlenrâ  rà   )Ú.0r~  r4  s     €rÙ   ú	<genexpr>z8Router.routing_group_has_alternatives.<locals>.<genexpr>j  s-   øè ø€ ÒkÐTZ”3�t×<Ñ<×@Ñ@ÀÓHÒNÈB×OÑkùó   ƒ25r¼   )Ú_get_model_from_aliasrx  Úsumrn  )r4  r…  Úresolvedrt  s   `   rÙ   Úrouting_group_has_alternativesz%Router.routing_group_has_alternatives[  s\   ø€ ð ÐØØ×4Ñ4¸;Ð4ÓGÒVÈ;ˆØ×-Ñ-¨hÓ7ˆØˆ=ØÜÓkÐ^c×^jÑ^jÔkÓkÐnoÑoÐorç   Ú_OVERRIDABLE_ROUTING_STRATEGIESÚrequest_kwargsc                 ó  — |sy|j                  d«      }|€yt        |t        t        f«      r| j	                  |«      nd}t        |t        «      r|| j
                  vr+t        j                  d|t        | j
                  «      «       y|S )a®  
        Reads a per-request `routing_strategy` override (forwarded by the proxy
        from key/team `router_settings`) out of the request kwargs.

        Only strategies with a per-request-capable selector are honored;
        anything else (unknown strings, `lar1`, `provider-budget-routing`) is
        ignored with a warning so a bad value stored on a key or team can
        never take down that caller's traffic.
        Nr™  zMIgnoring per-request routing_strategy override '%s'; supported overrides: %s.)	rà   rá   r  r    rõ  r‘  r   rÓ  Úsorted)r4  r’  Úraw_strategyrC  s       rÙ   Ú&_get_request_routing_strategy_overridez-Router._get_request_routing_strategy_overriden  sŠ   € ñ ØØ,×0Ñ0Ð1CÓDˆØÐØÜ=GÈÔWZÔ\kÐVlÔ=m�4×+Ñ+¨LÔ9ÐswˆÜ˜(¤CÔ(¨H¸D×<`Ñ<`Ñ,`Ü!×)Ñ)Ø_ØÜ�t×;Ñ;Ó<ôð
 Øˆrç   c                 óT  — || j                  | j                  «      k(  r,| j                  j                  |«      }|�t	        | |d«      S dS | j
                  5  || j                  vr | j                  |i ¬«      | j                  |<   | j                  |   cddd«       S # 1 sw Y   yxY w)a•  
        Returns the selector for a per-request strategy override.

        Reuses the default group's selector when the override matches the
        router's configured strategy (so shared state keeps accumulating in
        one place); otherwise lazily builds one selector per strategy and
        caches it for the router's lifetime so its usage/latency state
        persists across requests.
        Nr^  )rõ  r™  rB  rà   r  r  r  rV  )r4  rC  rb  s      rÙ   Ú_get_override_strategy_selectorz&Router._get_override_strategy_selector‡  s¯   € ð �t×/Ñ/°×0EÑ0EÓFÒFØ×AÑA×EÑEÀhÓOˆDØ04Ð0@”7˜4  tÓ,ÐJÀdÐJØ×*Ñ*ñ 	6Ø˜t×7Ñ7Ñ7Ø59×5RÑ5RØ%Ø*,ð 6Só 6�×(Ñ(¨Ñ2ð ×+Ñ+¨HÑ5÷	6÷ 	6ò 	6ús   Á=BÂB'c                 ó’  — | j                  |«      }|�*t        j                  d||«       || j                  |«      fS | j	                  |«      �|n| j
                  j                  |«      }|€f| j                  | j                  «      }| j                  j                  |xs d«      }|�t        | |d«      nd}t        j                  d||«       ||fS | j                  |   }| j                  |j                  «      }| j                  j                  |i «      j                  |xs d«      }t        j                  d|||«       ||fS )a×  
        Resolves the routing strategy and selector to use for the given model.

        A per-request `routing_strategy` in `request_kwargs` (forwarded by the
        proxy from key/team `router_settings`) takes precedence over both the
        model's routing group and the router's top-level strategy, since it is
        the most specific expression of caller intent.

        Otherwise every model belongs to exactly one group: an explicit entry
        from `routing_groups` (either because `model` IS a callable group name,
        or because it is a member of one), or the implicit `"default"` group
        driven by the router's top-level `routing_strategy` /
        `routing_strategy_args`.

        `self.routing_strategy` may be either a string or a `RoutingStrategy`
        enum member (the constructor accepts both), so it is normalized to a
        string here. Downstream call sites and `_select_deployment_*` arms
        compare against string literals.
        Nz3routing_group=request-override model=%s strategy=%sro  z*routing_group=default model=%s strategy=%sz%routing_group=%s model=%s strategy=%s)r–  r   Údebugr˜  rx  ri  rà   rõ  r™  rB  r  rh  re  )	r4  ré   r’  Úoverriderm  rC  rb  rU  rt  s	            rÙ   Ú_get_routing_contextzRouter._get_routing_contextœ  sJ  € ð, ×EÑEÀnÓUˆØÐÜ!×'Ñ'Ð(]Ð_dÐfnÔoØ˜T×AÑAÀ(ÓKÐKÐKà%)×%;Ñ%;¸EÓ%BÐ%N™EÐTX×ThÑTh×TlÑTlÐmrÓTsˆ
ØÐØ×/Ñ/°×0EÑ0EÓFˆHØ×AÑA×EÑEÀhÂnÐRTÓUˆDØ48Ð4D”w˜t T¨4Ô0È$ˆHÜ!×'Ñ'Ð(TÐV[Ð]eÔfØ˜XÐ%Ð%à×+Ñ+¨JÑ7ˆØ×+Ñ+¨E×,BÑ,BÓCˆØ×(Ñ(×,Ñ,¨Z¸Ó<×@Ñ@ÀÂÈRÓPˆÜ×#Ñ#Ð$KÈZÐY^Ð`hÔiØ˜Ð!Ð!rç   rU  rì  r_  Úinputc             ƒ   ó:  K  — |€y|xdk(  r |j                  ||¬«      ƒ d{  –—† S xdk(  r |j                  ||||¬«      S xxdk(  rnxdk(  rn n  |j                  ||||¬«      ƒ d{  –—† S dk(  r|j                  |||||¬	«      ƒ d{  –—† S 	 y7 Œq7 Œ*7 Œ
­w)
zå
        Asks the strategy selector for a deployment. Caller handles
        `simple-shuffle` separately (it does not flow through a selector).
        Returns None for unknown strategies or when the selector is missing.
        Nrš  ©r…  rì  r›  ©r…  rì  r_  r�  rž  r�  rœ  ©r…  rì  r_  r�  r’  )Úasync_get_available_deploymentsÚget_available_deployments©r4  rC  rU  ré   rì  r_  r�  r’  s           rÙ   Ú_select_deployment_asynczRouter._select_deployment_asyncÅ  sê   è ø€ ð  ÐØØÝØ%×EÑEØ %Ø(;ð Fó ÷ ð õ 'ð
  ×9Ñ9Ø %Ø(;Ø%Øð	 :ó ð ð AÕ)Õ,@Ó@Ø%×EÑEØ %Ø(;Ø%Øð	 Fó ÷ ð ó )Ø%×EÑEØ %Ø(;Ø%ØØ#1ð Fó ÷ ð ð Øð?øð øðús4   ‚!B£B¤ABÁ,BÁ-!BÂBÂBÂBÂBc                óÀ   — |€y|xdk(  r |j                  ||¬«      S xxdk(  rnxdk(  rn n  |j                  ||||¬«      S dk(  r|j                  |||||¬«      S 	 y)	zq
        Sync sibling of `_select_deployment_async`. Caller handles
        `simple-shuffle` separately.
        Nrš  rŸ  r›  rž  r   rœ  r¡  )r£  r¤  s           rÙ   Ú_select_deployment_synczRouter._select_deployment_syncú  sš   € ð ÐØð
 ÝØ×9Ñ9Ø %Ø(;ð :ó ð ð BÕ&Õ)AÓAØ×9Ñ9Ø %Ø(;Ø%Øð	 :ó ð ó )Ø×9Ñ9Ø %Ø(;Ø%ØØ#1ð :ó ð ð Ørç   c                 óD  — | j                  t        j                  «      | _        | j                  t        j                  «      | _        | j                  t        j                  «      | _        | j                  t        j
                  «      | _        | j                  t        j                  «      | _        | j                  t        j                  «      | _        | j                  t        j                  «      | _        | j                  t        j                  «      | _	        y rÔ   )
Úfactory_functionrÍ  Úacreate_assistantsÚadelete_assistantÚaget_assistantsÚacreate_threadÚaget_threadÚa_add_messageÚaget_messagesÚarun_threadr8  s    rÙ   r  z%Router.initialize_assistants_endpoint'  sÊ   € à"&×"7Ñ"7¼×8RÑ8RÓ"SˆÔØ!%×!6Ñ!6´w×7PÑ7PÓ!QˆÔØ#×4Ñ4´W×5LÑ5LÓMˆÔØ"×3Ñ3´G×4JÑ4JÓKˆÔØ×0Ñ0´×1DÑ1DÓEˆÔØ!×2Ñ2´7×3HÑ3HÓIˆÔØ!×2Ñ2´7×3HÑ3HÓIˆÔØ×0Ñ0´×1DÑ1DÓEˆÕrç   c                 ó¼  — | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j
                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _	        | j                  t        j                  d	¬«      | _
        | j                  t        j                  d
¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j                   d¬«      | _        | j                  t        j"                  d¬«      | _        | j                  t        j$                  d¬«      | _        | j                  t        j&                  d¬«      | _        | j                  t        j(                  d¬«      | _        | j                  t        j*                  d¬«      | _        | j                  t        j,                  d¬«      | _        | j                  t        j.                  d¬«      | _        | j                  t        j0                  d¬«      | _        | j                  t        j2                  d¬«      | _        | j                  t        j4                  d¬«      | _        | j                  t        j6                  d¬«      | _        y)z+Helper to initialize core router endpoints.Ú
moderation©Ú	call_typeÚanthropic_messagesÚagenerate_contentÚaadapter_generate_contentÚ
aresponsesÚafile_deleteÚafile_contentÚ	responsesÚaget_responsesÚacancel_responsesÚacompact_responsesÚadelete_responsesÚalist_input_itemsÚ
_arealtimeÚacreate_realtime_client_secretÚarealtime_callsÚ&acreate_realtime_transcription_sessionÚ_aresponses_websocketÚacreate_fine_tuning_jobÚacancel_fine_tuning_jobÚalist_fine_tuning_jobsÚaretrieve_fine_tuning_jobÚalist_filesÚaimage_editÚallm_passthrough_routeN)r©  rÍ  Úamoderationr¶  Úaanthropic_messagesr·  r¸  r¹  rº  r»  r¼  r½  r¾  r¿  rÀ  rÁ  rÂ  rÃ  rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  rÊ  Ú
afile_listrÌ  rÍ  r8  s    rÙ   Ú_initialize_core_endpointsz!Router._initialize_core_endpoints2  s_  € à×0Ñ0´×1DÑ1DÐP\Ð0Ó]ˆÔØ#'×#8Ñ#8¼×9SÑ9SÐ_sÐ#8Ó#tˆÔ Ø"&×"7Ñ"7¼×8RÑ8RÐ^rÐ"7Ó"sˆÔØ!%×!6Ñ!6´w×7PÑ7PÐ\oÐ!6Ó!pˆÔØ)-×)>Ñ)>Ü×-Ñ-Ð9Tð *?ó *
ˆÔ&ð ×/Ñ/´×0BÑ0BÈlÐ/Ó[ˆŒØ ×1Ñ1´'×2FÑ2FÐR`Ð1ÓaˆÔØ!×2Ñ2´7×3HÑ3HÐTcÐ2ÓdˆÔØ×.Ñ.¬w×/@Ñ/@ÈKÐ.ÓXˆŒØ"×3Ñ3´G×4JÑ4JÐVfÐ3ÓgˆÔØ!%×!6Ñ!6´w×7PÑ7PÐ\oÐ!6Ó!pˆÔØ"&×"7Ñ"7¼×8RÑ8RÐ^rÐ"7Ó"sˆÔØ!%×!6Ñ!6´w×7PÑ7PÐ\oÐ!6Ó!pˆÔØ!%×!6Ñ!6´w×7PÑ7PÐ\oÐ!6Ó!pˆÔØ×/Ñ/´×0BÑ0BÈlÐ/Ó[ˆŒØ.2×.CÑ.CÜ×2Ñ2Ð>^ð /Dó /
ˆÔ+ð  $×4Ñ4´W×5LÑ5LÐXiÐ4ÓjˆÔØ6:×6KÑ6KÜ×:Ñ:ÐFnð 7Ló 7
ˆÔ3ð &*×%:Ñ%:Ü×)Ñ)Ð5Lð &;ó &
ˆÔ"ð (,×'<Ñ'<Ü×+Ñ+Ð7Pð (=ó (
ˆÔ$ð (,×'<Ñ'<Ü×+Ñ+Ð7Pð (=ó (
ˆÔ$ð '+×&;Ñ&;Ü×*Ñ*Ð6Nð '<ó '
ˆÔ#ð *.×)>Ñ)>Ü×-Ñ-Ð9Tð *?ó *
ˆÔ&ð ×/Ñ/´×0BÑ0BÈmÐ/Ó\ˆŒØ×0Ñ0´×1DÑ1DÐP]Ð0Ó^ˆÔØ&*×&;Ñ&;Ü×*Ñ*Ð6Nð '<ó '
ˆÕ#rç   c                 óH  — ddl m}m}m}m}m}m}m}m}m	}	m
}
m} | j                  |d¬«      | _        | j                  |
d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |	d¬«      | _        | j                  |d	¬«      | _        | j                  |d
¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        y)z"Initialize vector store endpoints.r   )ÚadeleteÚalistÚ	aretrieveÚasearchÚaupdateÚcreateÚdeleterâ   ÚretrieveÚsearchrÔ  Úavector_store_searchr´  Úvector_store_searchÚvector_store_createÚavector_store_retrieveÚvector_store_retrieveÚavector_store_listÚvector_store_listÚavector_store_updateÚvector_store_updateÚavector_store_deleteÚvector_store_deleteN)Úlitellm.vector_stores.mainrÓ  rÔ  rÕ  rÖ  r×  rØ  rÙ  râ   rÚ  rÛ  rÔ  r©  rÜ  rÝ  rÞ  rß  rà  rá  râ  rã  rä  rå  ræ  )r4  rÓ  rÔ  rÕ  rÖ  r×  rØ  rÙ  râ   rÚ  rÛ  rÔ  s               rÙ   Ú"_initialize_vector_store_endpointsz)Router._initialize_vector_store_endpointsc  s+  € ÷	
÷ 	
÷ 	
ñ 	
ð %)×$9Ñ$9¸'ÐMcÐ$9Ó$dˆÔ!Ø#'×#8Ñ#8¸ÐK`Ð#8Ó#aˆÔ Ø#'×#8Ñ#8¸ÐK`Ð#8Ó#aˆÔ Ø&*×&;Ñ&;¸IÐQiÐ&;Ó&jˆÔ#Ø%)×%:Ñ%:¸8ÐOfÐ%:Ó%gˆÔ"Ø"&×"7Ñ"7¸ÐI]Ð"7Ó"^ˆÔØ!%×!6Ñ!6°tÐGZÐ!6Ó![ˆÔØ$(×$9Ñ$9¸'ÐMcÐ$9Ó$dˆÔ!Ø#'×#8Ñ#8¸ÐK`Ð#8Ó#aˆÔ Ø$(×$9Ñ$9¸'ÐMcÐ$9Ó$dˆÔ!Ø#'×#8Ñ#8¸ÐK`Ð#8Ó#aˆÕ rç   c                 óÔ  — ddl m} ddl m} ddl m} ddl m} ddl m} ddl m} ddl m} dd	l m} dd
l m	}	 ddl m
}
 ddl m} ddl m} | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |	d¬«      | _        | j                  |d¬«      | _        | j                  |
d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        y)z'Initialize vector store file endpoints.r   ©Úacreate©rÓ  ©rÔ  )rÕ  )Úaretrieve_content)r×  ©rØ  ©rÙ  ©râ   )rÚ  )Úretrieve_content)rÔ  Úavector_store_file_creater´  Úvector_store_file_createÚavector_store_file_listÚvector_store_file_listÚavector_store_file_retrieveÚvector_store_file_retrieveÚavector_store_file_contentÚvector_store_file_contentÚavector_store_file_updateÚvector_store_file_updateÚavector_store_file_deleteÚvector_store_file_deleteN)Úlitellm.vector_store_files.mainrë  rÓ  rÔ  rÕ  rî  r×  rØ  rÙ  râ   rÚ  rò  rÔ  r©  ró  rô  rõ  rö  r÷  rø  rù  rú  rû  rü  rý  rþ  )r4  Úavector_store_file_create_fnÚavector_store_file_delete_fnÚavector_store_file_list_fnÚavector_store_file_retrieve_fnÚavector_store_file_content_fnÚavector_store_file_update_fnÚvector_store_file_create_fnÚvector_store_file_delete_fnÚvector_store_file_list_fnÚvector_store_file_retrieve_fnÚvector_store_file_content_fnÚvector_store_file_update_fns                rÙ   Ú'_initialize_vector_store_file_endpointsz.Router._initialize_vector_store_file_endpoints  sÃ  € õ	
õ	
õ 	Xõ	
õ	
õ	
õ	
õ	
õ 	Võ	
õ	
õ	
ð *.×)>Ñ)>Ø(Ð4Oð *?ó *
ˆÔ&ð )-×(=Ñ(=Ø'Ð3Mð )>ó )
ˆÔ%ð (,×'<Ñ'<Ø&Ð2Kð (=ó (
ˆÔ$ð '+×&;Ñ&;Ø%Ð1Ið '<ó '
ˆÔ#ð ,0×+@Ñ+@Ø*Ð6Sð ,Aó ,
ˆÔ(ð +/×*?Ñ*?Ø)Ð5Qð +@ó +
ˆÔ'ð +/×*?Ñ*?Ø)Ð5Qð +@ó +
ˆÔ'ð *.×)>Ñ)>Ø(Ð4Oð *?ó *
ˆÔ&ð *.×)>Ñ)>Ø(Ð4Oð *?ó *
ˆÔ&ð )-×(=Ñ(=Ø'Ð3Mð )>ó )
ˆÔ%ð *.×)>Ñ)>Ø(Ð4Oð *?ó *
ˆÔ&ð )-×(=Ñ(=Ø'Ð3Mð )>ó )
ˆÕ%rç   c                 óÜ   — ddl m}m}m}m} | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        y)	z"Initialize Google GenAI endpoints.r   )r·  Úagenerate_content_streamÚgenerate_contentÚgenerate_content_streamr·  r´  r  r  r  N)Úlitellm.google_genair·  r  r  r  r©  )r4  r·  r  r  r  s        rÙ   Ú"_initialize_google_genai_endpointsz)Router._initialize_google_genai_endpointsÇ  s€   € ÷	
ó 	
ð "&×!6Ñ!6Ð7HÐTgÐ!6Ó!hˆÔØ $× 5Ñ 5Ð6FÐRdÐ 5Ó eˆÔØ(,×(=Ñ(=Ø$Ð0Jð )>ó )
ˆÔ%ð (,×'<Ñ'<Ø#Ð/Hð (=ó (
ˆÕ$rç   c                 óä   — ddl m}m} | j                  |d¬«      | _        | j                  |d¬«      | _        ddlm}m} | j                  |d¬«      | _        | j                  |d¬«      | _        y	)
z$Initialize OCR and search endpoints.r   )ÚaocrÚocrr  r´  r  ©rÖ  rÛ  rÖ  rÛ  N)Úlitellm.ocrr  r  r©  Úlitellm.searchrÖ  rÛ  )r4  r  r  rÖ  rÛ  s        rÙ   Ú _initialize_ocr_search_endpointsz'Router._initialize_ocr_search_endpointsÙ  sd   € ç)à×)Ñ)¨$¸&Ð)ÓAˆŒ	Ø×(Ñ(¨¸Ð(Ó>ˆŒç2à×,Ñ,¨WÀ	Ð,ÓJˆŒØ×+Ñ+¨F¸hÐ+ÓGˆ�rç   c                 ó´  — ddl m}m}m}m}m}m}m}m}m	}	m
}
m}m}m}m}m}m}m}m} | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |	d¬«      | _	        | j'                  |d	¬«      | _        | j'                  |d
¬«      | _        | j'                  |
d¬«      | _
        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        | j'                  |d¬«      | _        y)zInitialize video endpoints.r   )Úavideo_contentÚavideo_create_characterÚavideo_editÚavideo_extensionÚavideo_generationÚavideo_get_characterÚavideo_listÚavideo_remixÚavideo_statusÚvideo_contentÚvideo_create_characterÚ
video_editÚvideo_extensionÚvideo_generationÚvideo_get_characterÚ
video_listÚvideo_remixÚvideo_statusr  r´  r(  r!  r*  r#  r,  r  r$  r"  r+  r  r%  r   r)  r  r&  r  r'  N)Úlitellm.videosr  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r©  )r4  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  s                      rÙ   Ú_initialize_video_endpointsz"Router._initialize_video_endpointså  sá  € ÷	
÷ 	
÷ 	
÷ 	
÷ 	
ð* "&×!6Ñ!6Ð7HÐTgÐ!6Ó!hˆÔØ $× 5Ñ 5Ð6FÐRdÐ 5Ó eˆÔØ×0Ñ0°ÈÐ0ÓVˆÔØ×/Ñ/°
ÀlÐ/ÓSˆŒØ!×2Ñ2°=ÈOÐ2Ó\ˆÔØ ×1Ñ1°,È.Ð1ÓYˆÔØ"×3Ñ3°NÐN^Ð3Ó_ˆÔØ!×2Ñ2°=ÈOÐ2Ó\ˆÔØ ×1Ñ1°,È.Ð1ÓYˆÔØ×0Ñ0°ÈÐ0ÓVˆÔØ'+×'<Ñ'<Ø#Ð/Hð (=ó (
ˆÔ$ð '+×&;Ñ&;Ð<RÐ^vÐ&;Ó&wˆÔ#Ø$(×$9Ñ$9Ð:NÐZpÐ$9Ó$qˆÔ!Ø#'×#8Ñ#8Ð9LÐXmÐ#8Ó#nˆÔ Ø×0Ñ0°ÈÐ0ÓVˆÔØ×/Ñ/°
ÀlÐ/ÓSˆŒØ $× 5Ñ 5Ð6FÐRdÐ 5Ó eˆÔØ#×4Ñ4°_ÐPaÐ4ÓbˆÕrç   c           	      ó$  — ddl m}m}m}m}m}m}m}m} ddl	m
}	 | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d	¬«      | _        | j                  |d
¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        |	j                  «       D ]#  \  }
}t        | |
| j                  ||
¬«      «       Œ% y)zInitialize container endpoints.r   )Úacreate_containerÚadelete_containerÚalist_containersÚaretrieve_containerÚcreate_containerÚdelete_containerÚlist_containersÚretrieve_container)Ú_generated_endpointsr0  r´  r4  r2  r6  r3  r7  r1  r5  N)Úlitellm.containersr0  r1  r2  r3  r4  r5  r6  r7  Ú#litellm.containers.endpoint_factoryr8  r©  Úitemsra  )r4  r0  r1  r2  r3  r4  r5  r6  r7  Úcontainer_file_endpointsÚnameÚfuncs               rÙ   Ú_initialize_container_endpointsz&Router._initialize_container_endpoints  s#  € ÷		
÷ 		
ó 		
õ	
ð "&×!6Ñ!6Ð7HÐTgÐ!6Ó!hˆÔØ $× 5Ñ 5Ð6FÐRdÐ 5Ó eˆÔØ $× 5Ñ 5Ð6FÐRdÐ 5Ó eˆÔØ#×4Ñ4°_ÐPaÐ4ÓbˆÔØ#'×#8Ñ#8Ð9LÐXmÐ#8Ó#nˆÔ Ø"&×"7Ñ"7Ð8JÐVjÐ"7Ó"kˆÔØ!%×!6Ñ!6Ð7HÐTgÐ!6Ó!hˆÔØ $× 5Ñ 5Ð6FÐRdÐ 5Ó eˆÔð 3×8Ñ8Ó:ò 	M‰JˆD�$Ü�D˜$ × 5Ñ 5°dÀdÐ 5Ó KÕLñ	Mrç   c                 ó4  — | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j                  d¬«      | _        | j                  t        j
                  d¬«      | _        y)z*Initialize Anthropic Skills API endpoints.Úacreate_skillr´  Úalist_skillsÚ
aget_skillÚadelete_skillN)r©  rÍ  rA  rB  rC  rD  r8  s    rÙ   Ú_initialize_skills_endpointsz#Router._initialize_skills_endpoints.  s|   € à!×2Ñ2´7×3HÑ3HÐTcÐ2ÓdˆÔØ ×1Ñ1´'×2FÑ2FÐR`Ð1ÓaˆÔØ×/Ñ/´×0BÑ0BÈlÐ/Ó[ˆŒØ!×2Ñ2´7×3HÑ3HÐTcÐ2ÓdˆÕrç   c                 óä  — ddl m} ddl m} ddl m} ddl m} ddl m} ddl m} ddl m} dd	l m} | j                  |d
¬«      | _
        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        y)z-Initialize Google Interactions API endpoints.r   )Úacancelrê  rì  ©Úaget)Úcancelrï  rð  ©rà   Úacreate_interactionr´  Úcreate_interactionÚaget_interactionÚget_interactionÚadelete_interactionÚdelete_interactionÚacancel_interactionÚcancel_interactionN)Úlitellm.interactionsrG  rë  rÓ  rI  rJ  rØ  rÙ  rà   r©  rL  rM  rN  rO  rP  rQ  rR  rS  )	r4  rR  rL  rP  rN  rS  rM  rQ  rO  s	            rÙ   Ú"_initialize_interactions_endpointsz)Router._initialize_interactions_endpoints5  sé   € åGÝGÝGÝAÝEÝEÝEÝ?à#'×#8Ñ#8Ð9LÐXmÐ#8Ó#nˆÔ Ø"&×"7Ñ"7Ð8JÐVjÐ"7Ó"kˆÔØ $× 5Ñ 5Ð6FÐRdÐ 5Ó eˆÔØ#×4Ñ4°_ÐPaÐ4ÓbˆÔØ#'×#8Ñ#8Ð9LÐXmÐ#8Ó#nˆÔ Ø"&×"7Ñ"7Ð8JÐVjÐ"7Ó"kˆÔØ#'×#8Ñ#8Ð9LÐXmÐ#8Ó#nˆÔ Ø"&×"7Ñ"7Ð8JÐVjÐ"7Ó"kˆÕrç   c                 ó\  — ddl m} ddl m} ddl m} ddl m} ddl m} ddl m} ddl m} dd	l m} dd
l m	}	 ddl m
}
 | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |	d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |d¬«      | _        | j                  |
d¬«      | _        y)z?Initialize Google Managed Agents API endpoints (v1beta/agents).r   rê  rì  rH  rí  )Úalist_versionsrï  rð  rK  rñ  )Úlist_versionsÚacreate_agentr´  Úcreate_agentÚalist_agentsÚlist_agentsÚ
aget_agentÚ	get_agentÚadelete_agentÚdelete_agentÚalist_agent_versionsÚlist_agent_versionsN)Úlitellm.interactions.agentsrë  rÓ  rI  rÔ  rW  rØ  rÙ  rà   râ   rX  r©  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  )r4  rY  r_  r]  r[  ra  rZ  r`  r^  r\  rb  s              rÙ   Ú$_initialize_managed_agents_endpointsz+Router._initialize_managed_agents_endpointsI  s  € åHÝHÝBÝEÝVÝFÝFÝ@ÝCÝTà!×2Ñ2°=ÈOÐ2Ó\ˆÔØ ×1Ñ1°,È.Ð1ÓYˆÔØ ×1Ñ1°,È.Ð1ÓYˆÔØ×0Ñ0°ÈÐ0ÓVˆÔØ×/Ñ/°
ÀlÐ/ÓSˆŒØ×.Ñ.¨yÀKÐ.ÓPˆŒØ!×2Ñ2°=ÈOÐ2Ó\ˆÔØ ×1Ñ1°,È.Ð1ÓYˆÔØ$(×$9Ñ$9Ð:NÐZpÐ$9Ó$qˆÔ!Ø#'×#8Ñ#8Ð9LÐXmÐ#8Ó#nˆÕ rç   c                 óD  — | j                  «        | j                  «        | j                  «        | j                  «        | j	                  «        | j                  «        | j                  «        | j                  «        | j                  «        | j                  «        y)zvHelper to initialize specialized router endpoints (vector store, OCR, search, video, container, skills, interactions).N)
rè  r  r  r  Ú)_override_vector_store_methods_for_routerr.  r?  rE  rU  rd  r8  s    rÙ   Ú!_initialize_specialized_endpointsz(Router._initialize_specialized_endpointsa  sz   € à×/Ñ/Ô1Ø×4Ñ4Ô6Ø×/Ñ/Ô1Ø×-Ñ-Ô/à×6Ñ6Ô8Ø×(Ñ(Ô*Ø×,Ñ,Ô.Ø×)Ñ)Ô+Ø×/Ñ/Ô1Ø×1Ñ1Õ3rç   c                 óD   — | j                  «        | j                  «        y rÔ   )rÑ  rg  r8  s    rÙ   r  z"Router.initialize_router_endpointso  s   € Ø×'Ñ'Ô)Ø×.Ñ.Õ0rç   r¿  c           	      ó¨   — |€y|D ]J  }t        |t        «      st        d|› d�«      ‚t        |«      dk7  sŒ1t        d|› dt        |«      › d�«      ‚ y)z3
        Validate the fallbacks parameter.
        NzItem 'z' is not a dictionary.r¼   zDictionary 'z%' must have exactly one key, but has z keys.)rá   r3  r×   r‰  )r4  r¿  Úfallback_dicts      rÙ   r÷  zRouter.validate_fallbackss  sq   € ð Ð!ØØ+ò 	ˆMÜ˜m¬TÔ2Ü  6¨-¨Ð8NÐ!OÓPÐPÜ�=Ó! QÓ&Ü Ø" = /Ð1VÔWZÐ[hÓWiÐVjÐjpÐqóð ñ		rç   Úenable_global_affinityc                 ó@  — ddl m} dt        t           d|dd fd„}|s|j	                  | j
                  «      ræ| j                  €g | _        d }| j                  D ]  }t        ||«      sŒ|} n |�4| |_        |j                  xs ||_	        | j
                  xs i |_        |}nO || || j
                  ¬«      }| j                  j                  |«       t        j                  j                  |«        || j                  |«        |t        j                  |«       y y )Nr   )ÚEncryptedContentAffinityCheckÚcallback_listÚcallback_to_moverÒ   c                 óž   — || vry | j                  |«       t        d„ t        | «      D «       t        | «      «      }| j	                  ||«       y )Nc              3   óH   K  — | ]  \  }}t        |t        «      sŒ|–— Œ y ­wrÔ   ©rá   rr   )rŠ  Úidxr6  s      rÙ   r‹  ziRouter._add_encrypted_content_affinity_check.<locals>._move_before_deployment_affinity.<locals>.<genexpr>Ž  s   è ø€ Òt™˜˜hÄjÐQYÔ[rÕFs”Ñtùs   ‚"›")r)  ÚnextÚ	enumerater‰  Úinsert)rn  ro  Úinsert_indexs      rÙ   Ú _move_before_deployment_affinityzVRouter._add_encrypted_content_affinity_check.<locals>._move_before_deployment_affinity†  sP   € ð   }Ñ4ØØ× Ñ Ð!1Ô2Ü"&Ùt¬)°MÓ*BÔtÜ�MÓ"ó#ˆLð × Ñ  Ð/?Õ@rç   )r]  rk  r§  )ÚElitellm.router_utils.pre_call_checks.encrypted_content_affinity_checkrm  râ   r   Ú has_model_group_affinity_enabledr§  rm  rá   r]  rk  rø  rÍ  r  rT  r5  )r4  rk  rm  rx  Úexisting_ec_callbackÚcbÚec_callbacks          rÙ   Ú%_add_encrypted_content_affinity_checkz,Router._add_encrypted_content_affinity_check�  s=  € õ	
ð	AÜ¤™9ð	Aà;ð	Að ó	Añ "Ð%B×%cÑ%cØ×,Ñ,ô&
ð ×&Ñ&Ð.Ø*,�Ô'àIMÐ Ø×-Ñ-ò �Ü˜bÐ"?Õ@Ø+-Ð(Ùðð
 $Ð/Ø.2Ð$Ô+à(×?Ñ?ÒYÐCYð %Ô;ð DH×CcÑCcÒCiÐgiÐ$Ô@Ø2‘á;ØØ+AØ04×0PÑ0Pô�ð
 ×'Ñ'×.Ñ.¨{Ô;Ü×0Ñ0×EÑEÀkÔRá,¨T×-DÑ-DÀkÔRÙ,¬W×->Ñ->ÀÕLð;&
rç   c                 ó>  — t        d„ | j                  xs g D «       «      ry| j                  €g | _        t        | j                  | j                  ddd| j
                  ¬«      }| j                  j                  |«       t        j                  j                  |«       y)aS  Register the DeploymentAffinityCheck callback (global flags all False) if absent.

        Needed when nothing enabled a global affinity flag but affinity can still
        activate per request: per-group `model_group_affinity_config` entries, or the
        session-affinity marker a complexity router stamps at pre-routing time.
        c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wrÔ   rr  )rŠ  r|  s     rÙ   r‹  z>Router._ensure_deployment_affinity_callback.<locals>.<genexpr>¹  s   è ø€ Òa¸2Œz˜"Ô5×6Ñaùó   ‚NF©r¼  Úttl_secondsÚenable_user_key_affinityÚenable_responses_api_affinityÚenable_session_id_affinityr§  )
Úanyrm  rr   r¼  r¦  r§  rø  rÍ  r  rT  )r4  Úaffinity_callbacks     rÙ   r  z+Router._ensure_deployment_affinity_callback²  sŽ   € ô ÑaÀ$×BYÑBYÒB_Ð]_ÔaÔaØØ×"Ñ"Ð*Ø&(ˆDÔ#Ü#:Ø—*‘*Ø×<Ñ<Ø%*Ø*/Ø',Ø(,×(HÑ(Hô$
Ðð 	×Ñ×&Ñ&Ð'8Ô9Ü×(Ñ(×=Ñ=Ð>OÕPrç   c                 ó<  — |€y d|v }d|v }d|v }|s|s|�r| j                   €g | _         d }| j                   D ]  }t        |t        «      sŒ|} n |�n|j                  xs ||_        |j                  xs ||_        |j
                  xs ||_        | j                  |_        | j                  r{| j                  |_        nit        | j                  | j                  |||| j                  ¬«      }| j                   j                  |«       t        j                  j                  |«       | j                  d|v ¬«       |D ]Ú  }d }	|dv rŒ
|dk(  rt        | j                  ¬	«      }	ne|d
k(  rE| j!                  «       �Œ<t#        | j                  | j$                  | j&                  ¬«      }	|	| _        n|dk(  rt+        | j                  ¬«      }	|	€ŒŽ| j                   €g | _         | j                   j                  |	«       t        j                  j                  |	«       ŒÜ y )NÚdeployment_affinityÚresponses_api_deployment_checkÚsession_affinityr‚  Úencrypted_content_affinity)rk  )rŠ  r‹  rŒ  r�  Úprompt_caching)r¼  rÈ  )Ú
dual_cacher£  rq  Úenforce_model_rate_limits)r�  )rm  rá   rr   r„  r…  r†  r¦  rƒ  r§  r¼  rø  rÍ  r  rT  r~  ry   Ú%_get_router_deployment_budget_limiterr@   r£  rq  r  rx   )
r4  r   r„  r…  r†  Úexisting_affinity_callbackr|  rˆ  Úpre_call_checkÚ	_callbacks
             rÙ   r  z#Router.add_optional_pre_call_checksÈ  sR  € Ø#Ð+Øð
 +@ÐC[Ð*[Ð Ø/OÐSkÐ/kÐ%Ø,>ÐBZÐ,ZÐ"Ù#Ñ'DÒHbØ×&Ñ&Ð.Ø*,�Ô'àIMÐ&Ø×-Ñ-ò �Ü˜bÔ"9Õ:Ø13Ð.Ùðð
 *Ð5à.×GÑGÒcÐKcð +ÔCð /×LÑLÒmÐPmð +ÔHð /×IÑIÒgÐMgð +ÔEð :>×9]Ñ9]Ð*Ô6Ø×3Ò3ØMQ×MmÑMmÐ.ÕJä+BØŸ*™*Ø $× DÑ DØ-EØ2OØ/IØ04×0PÑ0Pô,Ð!ð ×'Ñ'×.Ñ.Ð/@ÔAÜ×0Ñ0×EÑEÐFWÔXð
 	×2Ñ2Ø$@ÐD\Ð$\ð 	3ô 	
ð 7ò 	MˆNØ-1ˆIØð "ñ ð ØÐ!1Ò1Ü8¸t¿z¹zÔJ‘	ØÐ#;Ò;Ø×=Ñ=Ó?ÐKØÜ0Ø#Ÿz™zØ+/×+FÑ+FØ#Ÿ™ô�	ð
 -6�Õ)ØÐ#>Ò>Ü2¸d¿j¹jÔI�	àÐ Øà×&Ñ&Ð.Ø*,�Ô'Ø×#Ñ#×*Ñ*¨9Ô5Ü×,Ñ,×AÑAÀ)ÕLñ;	Mrç   r  c                 ó  — 	 t        j                  |«      }|d   }t        j                  r#t	        dd¬«      }|j                  |«      |d<   |S d|v r|d   dd dz   |d<   |S # t        $ r}t        j                  d|«       |‚d}~ww xY w)	zž
        returns a copy of the deployment with the api key masked

        Only returns 2 characters of the api key and masks the rest with * (10 *).
        r»  é   r   )Úvisible_prefixÚvisible_suffixrê   Nz
**********z-Error occurred while printing deployment - %s)	ÚcopyÚdeepcopyrÍ  Úredact_user_api_key_infor<   Ú	mask_dictÚ	Exceptionr   rš  )r4  r  Ú_deployment_copyr»  ÚmaskerÚes         rÙ   Úprint_deploymentzRouter.print_deployment  s¨   € ð	Ü&*§m¡m°JÓ&?ÐØ*:Ð;KÑ*LˆNä×/Ò/Ü 3À1ÐUVÔ W�Ø5;×5EÑ5EÀnÓ5UÐ Ð!1Ñ2ð $Ð#ð ˜nÑ,Ø,:¸9Ñ,EÀbÀqÐ,IÈHÑ,T�˜yÑ)à#Ð#øÜò 	Ü!×'Ñ'Ð(WÐYZÔ[ØˆGûð	ús   ‚AA# ÁA# Á#	B	Á,BÂB	c                 óÖ   — 	 t        j                  d|«       ||d<   ||d<   | j                  |d<   | j                  ||¬«        | j                  di |¤Ž}|S # t
        $ r}|‚d}~ww xY w)z›
        Example usage:
        response = router.completion(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hey, how's it going?"}]
        zrouter.completion(model=%s,..)ré   r_  r`  ©ré   ÚkwargsNr  )r   rš  Ú_completionÚ_update_kwargs_before_fallbacksÚfunction_with_fallbacksr�  )r4  ré   r_  r¤  r  r   s         rÙ   Ú
completionzRouter.completion5  s~   € ð

	Ü!×'Ñ'Ð(HÈ%ÔPØ#ˆF�7‰OØ!)ˆF�:ÑØ*.×*:Ñ*:ˆFÐ&Ñ'Ø×0Ñ0°uÀVÐ0ÔLà:˜d×:Ñ:ÑD¸VÑDˆHØˆOøÜò 	ØˆGûð	ús   ‚AA Á	A(Á!A#Á#A(c                 óÌ  — d }d }	 |j                  «       }||d<   | j                  |||j                  dd «      |¬«      }|d   j                  «       }|j                  dd «      }|�5t        j                  | j
                  ||f|d¬«      }	|	j                  «        |j                  d|«       | j                  ||¬	«       |j                  dd «       |d   }| j                  ||¬	«      }
|j                  d
d «      }|�|
�||
j                  k7  rd }n|
}| j                  |«      s| j                  |¬«       i |¥|| j                  |dœ¥|¥}t        j                   di |¤Ž}t#        j$                  d|«       t'        |t(        «      r.| j+                  |||¬«      }|rt        j,                  d|d¬«      ‚t'        |t.        «      r(|j0                  €|j2                  �|j5                  «        t'        |t.        «      r| j7                  |||¬«      S |S # t8        $ rE}t#        j$                  d||«       |�%| j;                  ||«       | j=                  |||«       |‚d }~ww xY w)Nré   Úspecific_deployment©ré   r_  rª  r’  r»  Úsilent_modelT)Útargetr'  r¤  Údaemonr_  ©r  r¤  rê   ©r  ©r_  ÚcachingÚclientz,litellm.completion(model=%s)[32m 200 OK[0m©ré   r  r¤  úResponse output was blocked.ro  ©r#  ré   r$  ©Úmodel_responser_  Úinitial_kwargsz2litellm.completion(model=%s)[31m Exception %s[0mr  )r™  Úget_available_deploymentÚpopr  ÚThreadÚ_silent_experiment_completionÚstartrþ  Ú_update_kwargs_with_deploymentÚ_get_clientrà   rê   r‚  Ú routing_strategy_pre_call_checksri  rÍ  r¨  r   r  rá   r²   Ú"_should_raise_content_policy_errorÚContentPolicyViolationErrorr°   Úcompletion_streamÚ	make_callÚfetch_sync_streamÚ_completion_streaming_iteratorr�  Ú(_set_deployment_num_retries_on_exceptionÚ5_stamp_failed_deployment_id_with_effective_model_info)r4  ré   r_  r¤  rf  r  Ú#input_kwargs_for_streaming_fallbackr»  r¬  ÚthreadÚpotential_model_clientÚdynamic_api_keyÚmodel_clientÚinput_kwargsr  Ú_should_raiser   s                    rÙ   r¥  zRouter._completionF  s¶  € Øˆ
Øˆ
ð_	ð :@¿¹»Ð/Ø;@Ð/°Ñ8ð ×6Ñ6ØØ!Ø$*§J¡JÐ/DÀdÓ$KØ%ð	 7ó ˆJð %/Ð/?Ñ$@×$EÑ$EÓ$GˆNØ"0×"4Ñ"4°^ÀTÓ"JˆLàÐ'ô
 !*× 0Ñ 0Ø×=Ñ=Ø&¨Ð1Ø!Øô	!�ð —‘”à×Ñ˜j¨(Ô3Ø×/Ñ/¸:ÈfÐ/ÔUØ�J‰J�~ tÔ,Ø'¨Ñ0ˆJØ,0×,<Ñ,<È
Ð[aÐ,<Ó,bÐ"à%+§Z¡Z°	¸4Ó%@ˆOàÐ+Ø*Ð6Ø#Ð'=×'EÑ'EÒEà#‘à5�ð ×$Ñ$ UÔ+Ø×5Ñ5ÀÐ5ÔLð#Ø ð#à$Ø×/Ñ/Ø&ò	#ð
 ð#ˆLô &×0Ñ0Ñ@°<Ñ@ˆHÜ!×&Ñ&Ð'[Ð]gÔhô ˜(¤MÔ2Ø $× GÑ GÈeÐ^fÐouÐ GÓ v�Ù Ü!×=Ñ=Ø >Ø#Ø%'ôð ô ˜8Ô%8Ô9Ø×.Ñ.Ð6Ø×&Ñ&Ð2à×*Ñ*Ô,ô ˜(Ô$7Ô8Ø×:Ñ:Ø#+Ø%Ø#Fð ;ó ð ð ˆOøÜò 	Ü!×&Ñ&Ð'aÐcmÐopÔqàÐ%Ø×=Ñ=¸aÀÔLØ×JÑJÈ1ÈjÐZ`ÔaØˆGûð	ús   †HH ÈH È	I#ÈA IÉI#c                 óL  — ddl m}  ||«      }|j                  d«      }|�!|j                  d«      |u rt        |«      |d<   d|vri |d<   |d   j	                  dd«       d|d   d<   d|d	<   |j	                  d
d«       |j	                  dd«       |j	                  dd«       |S )uá  
        Prepare kwargs for a silent experiment by ensuring isolation from the primary call.

        Guarantee metadata isolation: safe_deep_copy falls back to the original
        reference when deepcopy fails (e.g. metadata contains UserAPIKeyAuth with
        parent_otel_span â€” an OTel Span that is not deepcopy-able). Force a shallow
        copy of the metadata dict so mutations (model_group, is_silent_experiment)
        never corrupt the main call's metadata.
        r   ©Úsafe_deep_copyrÄ  NÚlitellm_parent_otel_spanTÚis_silent_experimentFÚstreamÚlitellm_call_idÚlitellm_logging_objÚstandard_logging_object)Ú'litellm.litellm_core_utils.core_helpersrÓ  rà   r3  r»  )r4  r¤  rÓ  Úsilent_kwargsÚoriginal_metadatas        rÙ   Ú_get_silent_experiment_kwargsz$Router._get_silent_experiment_kwargsª  sÏ   € õ 	Ká-¨fÓ5ˆð $*§:¡:¨jÓ#9ÐØÐ(¨]×->Ñ->¸zÓ-JÐN_Ñ-_Ü(,Ð->Ó(?ˆM˜*Ñ%à˜]Ñ*Ø(*ˆM˜*Ñ%ð
 	�jÑ!×%Ñ%Ð&@À$ÔGà<@ˆ�jÑ!Ð"8Ñ9ð #(ˆ�hÑð 	×ÑÐ+¨TÔ2Ø×ÑÐ/°Ô6Ø×ÑÐ3°TÔ:ð Ðrç   r¬  c                 ó  ‡ ‡‡‡— 	 |j                  di «      j                  dd«      ryt        j                  ‰«      Št        j                  d‰«        ‰ j
                  d	i |¤ŽŠ‰‰d   d<   t        j                  «       }t        j                  |«       	 ˆˆ ˆˆfd„}|j                   |«       «       |j                  «        y# |j                  «        w xY w# t        $ r!}t        j                  d‰|«       Y d}~yd}~ww xY w)
zE
        Run a silent experiment in the background (thread).
        rÄ  rÕ  FNú'Starting silent experiment for model %sr…  c               “   ó0  •K  —  ‰j                   d‰t        t        t           ‰«      dœ‰¤Žƒ d {  –—†  t	        j
                  «       } t	        j                  «       }|�| j                  |«       | rt	        j                  | ddiŽƒ d {  –—†  y y 7 Œ`7 Œ­w)N©ré   r_  Úreturn_exceptionsTr  )	Úacompletionr   râ   r�   ÚasyncioÚ	all_tasksÚcurrent_taskr1  Úgather)ÚpendingÚcurrentr_  r4  rÛ  r¬  s     €€€€rÙ   Ú_run_silent_completionzDRouter._silent_experiment_completion.<locals>._run_silent_completionï  sž   øè ø€ Ø*˜$×*Ñ*ð Ø*Ü!%¤dÔ+;Ñ&<¸hÓ!Gñð (ñ÷ ð ô &-×%6Ñ%6Ó%8�GÜ%,×%9Ñ%9Ó%;�GØÐ*ØŸ™¨Ô0ÙÜ%Ÿn™n¨gÐNÈÑN×NÑNð ðøð Oús"   ƒ.B±B²ABÂBÂBÂBú)Silent experiment failed for model %s: %sr  )rà   r™  rš  r   r  rÝ  rä  Únew_event_loopÚset_event_loopÚrun_until_completeÚcloser�  r  )r4  r¬  r_  r¤  Úlooprê  r   rÛ  s   ```    @rÙ   r½  z$Router._silent_experiment_completion×  sè   û€ ð'	fà�z‰z˜* bÓ)×-Ñ-Ð.DÀeÔLØä—}‘} XÓ.ˆHä!×&Ñ&Ð'PÐR^Ô_à#E 4×#EÑ#EÑ#OÈÑ#OˆMð 8DˆM˜*Ñ% mÑ4ô "×0Ñ0Ó2ˆDÜ×"Ñ" 4Ô(ð÷Oð ×'Ñ'Ñ(>Ó(@ÔAà—
‘
•ø�—
‘
•ûÜò 	fÜ!×'Ñ'Ð(SÐUaÐcd×eÑeûð	fús5   †"C ©A.C ÂC Â6C ÃCÃC Ã	DÃ%DÄDrÖ  c              ‹   ó   K  — y ­wrÔ   r  ©r4  ré   r_  rÖ  r¤  s        rÙ   rã  zRouter.acompletion	  ó   è ø€ ð 	ùó   ‚c              ‹   ó   K  — y ­wrÔ   r  rò  s        rÙ   rã  zRouter.acompletion	  ró  rô  )TFc              ‹   ó   K  — y ­wrÔ   r  rò  s        rÙ   rã  zRouter.acompletion	  ró  rô  c              ‹   ó&  K  — 	 ||d<   ||d<   ||d<   | j                   |d<   | j                  ||¬«       |j                  d«      xs | j                  }t	        j                  «       }| j                  |«      }|r| j                  |||¬«      ƒ d {  –—† S |�+t        |t        «      r | j                  di |¤Žƒ d {  –—† }n | j                  di |¤Žƒ d {  –—† }t	        j                  «       }	|	|z
  }
t        j                  | j                  j                  t        j                   |
d||	t#        |«      ¬	«      «       |S 7 Œ±7 Œ‡7 Œn# t$        $ r;}t        j                  t'        | |t)        j*                  «       |¬
«      «       |‚d }~ww xY w­w)Nré   r_  rÖ  r`  r£  Úpriority)ré   r_  r¤  rã  ©ÚserviceÚdurationrµ  Ú
start_timeÚend_timeÚparent_otel_span©Úlitellm_router_instancer’  Úerror_traceback_strr%  r  )Ú_acompletionr¦  rà   r~  ÚtimeÚ_is_prompt_management_modelÚ_prompt_management_factoryrá   r  Úschedule_acompletionÚasync_function_with_fallbacksrä  Úcreate_taskrÌ  Úasync_service_success_hookr£   ÚROUTERr)   r�  rp   Ú	tracebackÚ
format_exc)r4  ré   r_  rÖ  r¤  Úrequest_priorityrü  r  r  rý  Ú	_durationr   s               rÙ   rã  zRouter.acompletion	  s¢  è ø€ ð,	Ø#ˆF�7‰OØ!)ˆF�:ÑØ%ˆF�8ÑØ*.×*;Ñ*;ˆFÐ&Ñ'à×0Ñ0°uÀVÐ0ÔLØ&,§j¡j°Ó&<Ò&UÀ×@UÑ@UÐÜ $§	¡	£ˆJØ15×1QÑ1QÐRWÓ1XÐ'á*Ø!×<Ñ<ØØ%Ø!ð =ó ÷ ð ð
  Ð+´
Ð;KÌSÔ0QØ!: ×!:Ñ!:Ñ!D¸VÑ!D×D‘à!C ×!CÑ!CÑ!MÀfÑ!M×M�Ü"Ÿi™i›kˆHØ'¨*Ñ4ˆIÜ×ÑØ×'Ñ'×BÑBÜ(×/Ñ/Ø&Ø+Ø)Ø%Ü%FÀvÓ%Nð Có ô	ð ˆOð-øð EøàMùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üsl   ‚F„BE
 ÂEÂE
 ÂFÂ'E
 Â>EÂ?E
 ÃEÃA)E
 ÅFÅE
 ÅE
 ÅE
 Å
	FÅ6F	Æ	FÆFÚfallback_itemÚcomplete_response_object_usagec                 óî   — ddl m} t        t        dz  t	        | dd«      «      }|�|gng }|�)t        |d«      r|j                  �|j                  |«       |j                  |¬«      }t        | d|«       y)zCMerge partial-stream usage with fallback-stream usage on the chunk.r   )ÚBaseTokenUsageProcessorNÚusage)Úusage_objects)
Úlitellm.cost_calculatorr  r   r­   r  Úhasattrr  rø  Úcombine_usage_objectsra  )r  r  r  r  r  Úcombined_usages         rÙ   Ú_combine_fallback_usagezRouter._combine_fallback_usageP	  s{   € õ 	DäœE D™L¬'°-ÀÈ$Ó*OÓPˆØ*/Ð*; ™wÀˆà*Ð6ÜÐ6¸Ô@Ø.×4Ñ4Ð@à× Ñ Ð!?Ô@Ø 7× MÑ MÐ\iÐ MÓ jˆÜ�˜w¨Õ7rç   r9  c                 ó~   — t        | «      }|j                  d«      }t        |t        «      s|i fS |t	        d|«      fS )NrJ  rI  )rQ   rà   rá   r3  r   )r9  rF  rG  s      rÙ   Ú_prepare_fallback_hidden_paramsz&Router._prepare_fallback_hidden_paramsc	  sL   € ô )?Ð?PÓ(QÐØ"8×"<Ñ"<Ð=QÓ"RÐÜÐ*¬DÔ1Ø)¨2Ð-Ð-Ø%¤tÐ,?ÐAQÓ'RÐRÐRrç   Úprepared_fallback_hidden_paramsc                 óÊ   — | �t        | d«      sy |\  }}t        | «      }|j                  d«      }t        |t        «      si }i |¥|¥di |¥|¥i¥t        t        | «      _        y )Nr0  rJ  )r  rQ   rà   rá   r3  r   rK   r0  )r  r  rF  rG  Úitem_hidden_paramsÚitem_headerss         rÙ   Ú%_apply_fallback_hidden_params_to_itemz,Router._apply_fallback_hidden_params_to_itemm	  sŒ   € ð
 Ð ¬°Ð?OÔ(PØà3RÑ0ÐÐ 0Ü$:¸=Ó$IÐØ)×-Ñ-Ð.BÓCˆÜ˜,¬Ô-ØˆLðA
Ø ðA
à$ðA
ð !Ð"F \Ð"FÐ5EÐ"FñA
ŒÔ Ó.Õ=rç   r¸  r¹  c              ƒ   ón   ‡ ‡‡‡‡K  — ddl mŠ  G ˆfd„dt        «      }ˆˆˆˆˆ fd„} | |«       «      S ­w)z‡
        Helper to iterate over a streaming response.

        Catches errors for fallbacks using the router's fallback system
        r   r¿   c                   ó4   •‡ — e Zd Zdefˆ ˆfd„Zd„ Zd„ Zˆ xZS )úERouter._acompletion_streaming_iterator.<locals>.FallbackStreamWrapperr-  c                 ó  •— t         ‰| �  |‰j                  ‰j                  ‰j                  ¬«       || _        t        ‰dd «      }t        |t        «      r|| _	        t        ‰d«      r ‰j                  j                  «       | _        y y )N©rÄ  ré   Úcustom_llm_providerÚlogging_objrð   r0  )Úsuperr5  ré   r&  r'  r1  r  rá   râ   rð   r  r0  r™  )r4  r-  Úinner_chunksÚ	__class__r¸  s      €€rÙ   r5  zNRouter._acompletion_streaming_iterator.<locals>.FallbackStreamWrapper.__init__�	  s„   ø€ ä‘Ñ Ø&5Ø(×.Ñ.Ø(6×(JÑ(JØ .× :Ñ :ð	 !ô ð )8�Ô%Ü.5°nÀhÐPTÓ.U�Ü˜l¬DÔ1Ø".�D”Kä˜>Ð+;Ô<Ø*8×*GÑ*G×*LÑ*LÓ*N�DÕ'ð =rç   c                 ó   — | S rÔ   r  r8  s    rÙ   r=  zORouter._acompletion_streaming_iterator.<locals>.FallbackStreamWrapper.__aiter__Ÿ	  ó   € Ø�rç   c              “   óR   K  — | j                   j                  «       ƒ d {  –—† S 7 Œ­wrÔ   r?  r8  s    rÙ   r@  zORouter._acompletion_streaming_iterator.<locals>.FallbackStreamWrapper.__anext__¢	  s!   è ø€ Ø!×2Ñ2×<Ñ<Ó>×>Ð>Ð>úrA  )rN  rO  rP  r   r5  r=  r@  Ú__classcell__©r*  r¸  s   @€rÙ   ÚFallbackStreamWrapperr#  Ž	  s   ù„ ðO°ö Oò ö?rç   r0  c                 óö  •K  — d } 	 ‰2 3 d {  –—† }|­–— Œ7 Œ
6 �n0# ‰$ �r'}|j                   s;|j                  st        ‰j                  «      r|j                  �|j                  |‚‚ ddlm}  |‰j                  ¬«      }t        t        d z  t        |dd «      «      }	 t        t        ‰j                  d«      «      }‰j                  d‰j                  «      }‰j                  d‰j                  «      }‰j                  d‰j                  «      }	‰j                  ‰d	<   ‰‰d
<   ‰j!                  |‰¬«       ‰j#                  |d|||	|d‰‰j                  dd«      du ¬«	      ƒ d {  –—†7  } t%        | d«      rot&        j)                  | «      }
| 2 3 d {  –—†7  }t&        j+                  ||
«       |r.t-        |t.        «      rt%        |d«      r‰j1                  ||«       |­–— ŒV6 nd ­–— nN# t2        $ rB}t5        j6                  d|«       t-        |‰«      r|j                  �|j                  |‚|‚d }~ww xY wY d }~nd }~ww xY wt9        j:                  d¬«      5  t%        ‰d«      rG	 ‰j=                  «       ƒ d {  –—†7   n,# t>        $ r }t5        j@                  d|«       Y d }~nd }~ww xY w| �St%        | d«      rG	 | j=                  «       ƒ d {  –—†7   n,# t>        $ r }t5        j@                  d|«       Y d }~nd }~ww xY wd d d «       y # 1 sw Y   y xY w# t9        j:                  d¬«      5  t%        ‰d«      rG	 ‰j=                  «       ƒ d {  –—†7   n,# t>        $ r }t5        j@                  d|«       Y d }~nd }~ww xY w| �St%        | d«      rG	 | j=                  «       ƒ d {  –—†7   n,# t>        $ r }t5        j@                  d|«       Y d }~nd }~ww xY wd d d «       w # 1 sw Y   w xY wxY w­w)Nr   ©Ústream_chunk_builder©rð   r  ré   r‰  rŠ  r‹  r`  r_  r£  Fr  Úinclude_fallback_errorsT©	r   Údisable_fallbacksr‰  rŠ  r‹  r…  r'  r¤  r5  r=  úFallback also failed: %s©ÚshieldrD  ú7stream_with_fallbacks: error closing model_response: %sú:stream_with_fallbacks: error closing fallback_response: %s)!r  Úgenerated_contentrþ   rð   r%  Úlitellm.mainr3  r   r­   r  r  rà   r‰  rŠ  r‹  r  r¦  Ú*async_function_with_fallbacks_common_utilsr  rg  r  r   rá   rª   r  r�  r   r  ÚanyioÚCancelScoperD  ÚBaseExceptionrš  )r9  Úitemr   r3  Úcomplete_response_objectr  r…  r‰  rŠ  r‹  r  r  Úfallback_errorrÀ   r¹  r_  r¸  r4  s                €€€€€rÙ   Ústream_with_fallbackszERouter._acompletion_streaming_iterator.<locals>.stream_with_fallbacks¥	  sò  øè ø€ Ø $Ðð\Ø"0÷ ð ˜$Ø”Jðø¢.øà)ó C)Ø×+Ò+Ø×'Ò'Ô+PÐQ_×QfÑQfÔ+gà×+Ñ+Ð7Ø×2Ñ2¸Ð9Øå=á2FÈn×NcÑNcÔ2dÐ(Ü8<Ü˜D‘LÜÐ4°g¸tÓDó9Ð.ð4)ä)-¬c°>×3EÑ3EÀgÓ3NÓ)O�KØ4B×4FÑ4FÀ{ÐTX×TbÑTbÓ4c�IØCQ×CUÑCUØ2°D×4QÑ4QóDÐ,ð DR×CUÑCUØ2°D×4QÑ4QóDÐ,ð ;?×:KÑ:K�NÐ#6Ñ7Ø19�N :Ñ.Ø×8Ñ8¸{ÐSaÐ8ÔbØ.2×.]Ñ.]ØØ*/Ø"+Ø1IØ1IØ$/ØØ-Ø0>×0BÑ0BÐC\Ð^cÓ0dÐhlÐ0lð /^ó 
/÷ 
)ð 
)Ð%ô Ð0°+Ô>Ü:@×:`Ñ:`ÐarÓ:sÐ7Ø3D÷ 0ñ 0 -Ü"×HÑHÈÐXwÔxá -Ü$.¨}Ô>QÔ$RÜ$+¨M¸7Ô$Cà $× <Ñ <¸]ÐLjÔ kØ"/Ô/ñ 4Eð #›
ùä ò )ä)×/Ñ/Ð0JÈNÔ[ô
 # >Ð3IÔJØ*×=Ñ=ÐIà,×?Ñ?À^ÐSØ(Ð(ûð)ÿûðqC)úôR ×&Ñ&¨dÔ3ñ Ü˜~¨xÔ8ðØ"0×"7Ñ"7Ó"9×9Ò9øÜ,ò Ü1×7Ñ7Ø YØ !÷ñ ûðúð
 )Ð4¼ÐARÐT\Ô9]ðØ"3×":Ñ":Ó"<×<Ò<øÜ,ò Ü1×7Ñ7Ø \Ø !÷ñ ûðú÷÷ ñ û”U×&Ñ&¨dÔ3ñ Ü˜~¨xÔ8ðØ"0×"7Ñ"7Ó"9×9Ò9øÜ,ò Ü1×7Ñ7Ø YØ !÷ñ ûðúð
 )Ð4¼ÐARÐT\Ô9]ðØ"3×":Ñ":Ó"<×<Ò<øÜ,ò Ü1×7Ñ7Ø \Ø !÷ñ ûðú÷÷ ñ ÿs§  ƒO9‡ ‰�Ž‘ ˜š ›L! �I
£A>IÂ"C	G2Å+E.Å,(G2ÆG*ÆFÆG*ÆAG2Ç1IÇ2	H=Ç;=H8È8H=È=IÉ L! ÉI
É
L! ÉO9É#LÉ1JÊJÊJÊ
LÊ	J4ÊJ/Ê*LÊ/J4Ê4LËK ËKËK ËLË 	L	Ë)LË?LÌL	Ì	LÌ	O9ÌLÌO9Ì!O6Ì8O*ÍM ÍM
ÍM ÍO*Í 	N		Í)N	Í?O*ÎN		Î	O*ÎN5Î.N1
Î/N5Î4O*Î5	O	Î>O	ÏO*ÏO	ÏO*Ï!	O6Ï*O3Ï/O6Ï6O9©r&  rÀ   r°   )r4  r¸  r_  r¹  r0  rF  rÀ   s   ````  @rÙ   Ú_acompletion_streaming_iteratorz&Router._acompletion_streaming_iterator�	  s7   üè ø€ õ 	>ö	?Ô$7ô 	?÷.^	ð ^	ñ@ %Ñ%:Ó%<Ó=Ð=ùs   ‡.5r.  rÂ   rÍ   c                 óâ  — ddl m} ddlm}m}m}m} t        | |«      r‘| j                  }|rƒ	 ddl	m
}  ||¬«      }|�t        |dd«      nd}	|	�_t        t        |	dd«      xs d«      }
t        t        |	d	d«      xs d«      }t        t        |	d
|
|z   «      xs |
|z   «      } ||
||¬«      S 	 | j                  }t        ||||f«      r|j                  j                   S y# t        $ r Y Œ=w xY w)u”  
        Best-effort: pull partial token usage from a Responses-API streaming
        iterator that errored mid-stream, normalized to ResponseAPIUsage so
        the caller can combine without crossing token-naming conventions.

        Two sources, in priority order:
          1. The bridge path (LiteLLMCompletionStreamingIterator) accumulates
             chat-completion chunks while streaming â€” feed them through
             stream_chunk_builder to recover chat Usage, then translate
             (prompt_tokens â†’ input_tokens, completion_tokens â†’ output_tokens).
          2. The native path (ResponsesAPIStreamingIterator) only has a
             completed_response object if the stream reached
             RESPONSE_COMPLETED before erroring â€” uncommon mid-stream but
             worth checking. Already ResponseAPIUsage-shaped.

        Returns None when no partial usage is recoverable.
        r   )Ú"LiteLLMCompletionStreamingIterator©rÍ   ÚResponseCompletedEventÚResponseFailedEventÚResponseIncompleteEventr2  r4  Nr  Úprompt_tokensÚcompletion_tokensÚtotal_tokens©Úinput_tokensÚoutput_tokensrQ  )ÚFlitellm.responses.litellm_completion_transformation.streaming_iteratorrJ  Úlitellm.types.llms.openairÍ   rL  rM  rN  rá   Ú collected_chat_completion_chunksr>  r3  r  r  r�  Úcompleted_responser  r  )r.  rJ  rÍ   rL  rM  rN  rð   r3  Úbuiltrý  Úpromptr¨  ÚtotalÚ	completeds                 rÙ   Ú _extract_partial_responses_usagez'Router._extract_partial_responses_usage
  s#  € õ*	
÷	
ó 	
ô �oÐ'IÔJØ+×LÑLˆFÙðÝAá#7¸vÔ#F�Eð SXÐRc´¸ÀÈÔ1NÐim�DØÐ'ô ),¬G°D¸/È1Ó,MÒ,RÐQRÓ(S˜Ü,/´¸Ð>QÐSTÓ0UÒ0ZÐYZÓ,[˜
Ü'*¬7°4¸ÈÐR\ÑI\Ó+]Ò+vÐbhÐkuÑbuÓ'w˜Ù/Ø)/Ø*4Ø).ô ð ð (ð& +×=Ñ=ˆ	ÜØØ#Ð%8Ð:QÐRô
ð ×%Ñ%×+Ñ+Ð+Øøô !ò áðús   ®B C" Ã"	C.Ã-C.c                 ó`  — ddl m}m}m}m} t        | |||f«      sy| j                  }|j                  €y|j                  } ||j                  xs d|j                  xs dz   |j                  xs d|j                  xs dz   |j                  xs d|j                  xs dz   ¬«      |_        y)u`  
        Merge partial-stream usage with fallback-stream usage on a
        Responses-API streaming event.

        Only mutates events that carry a `response` with a `usage` field
        (response.completed / response.failed / response.incomplete). Other
        events pass through unchanged.

        Both inputs are ResponseAPIUsage-shaped (see
        _extract_partial_responses_usage which normalizes the bridge path),
        so we can sum input_tokens / output_tokens / total_tokens directly
        and produce a clean ResponseAPIUsage â€” no token-naming split, no
        setattr bypass.
        r   rK  NrR  )rV  rÍ   rL  rM  rN  rá   r  r  rS  rT  rQ  )r  Úpartial_usagerÍ   rL  rM  rN  r  Úfbs           rÙ   Ú!_combine_responses_fallback_usagez(Router._combine_responses_fallback_usageQ
  s°   € ÷&	
ó 	
ô ØØ#Ð%8Ð:QÐRô
ð Ø'×0Ñ0ˆØ�>‰>Ð!Øà—N‘NˆÙ)Ø'×4Ñ4Ò9¸¸b¿o¹oÒ>RÐQRÑSØ(×6Ñ6Ò;¸!À×@PÑ@PÒ@UÐTUÑVØ'×4Ñ4Ò9¸¸b¿o¹oÒ>RÐQRÑSô
ˆ�rç   Ú	input_valrÎ   r=  c                 ó¼   — t        | t        «      rddd| dœgdœg}nt        | t        «      rt        | «      }ng }dddddœgdœddd	|dœgdœg}t        d
||z   «      S )uä  
        Convert Responses-API input + partial assistant output into a
        continuation input that asks the fallback model to pick up where the
        prior assistant message stopped.

        Best effort across providers. The chat-completions path uses
        Anthropic's `prefix: True` prefill trick on the assistant message;
        the Responses-API input schema has no direct equivalent, so we
        append an instruction (developer role) plus a prior assistant
        message containing the partial output. Providers without prefill
        semantics (OpenAI, Vertex) treat this as conversational context
        and may regenerate â€” same trade-off as the chat-completions path
        for non-Anthropic fallbacks.
        r#  ÚuserÚ
input_text)r¸  Útext)r¸  Úrolerò   Ú	developeru·   The previous assistant response was interrupted mid-stream. Continue exactly where it stopped â€” do not repeat any of its content. Your response must read as a seamless continuation.Ú	assistantÚoutput_textrÎ   )rá   r  râ   r   )rb  r=  ÚbaseÚcontinuations       rÙ   Ú#_build_responses_continuation_inputz*Router._build_responses_continuation_input{
  sž   € ô2 �i¤Ô%ð &Ø"Ø)5¸yÑ IÐJñð‰Dô ˜	¤4Ô(Ü˜	“?‰DàˆDð "Ø#ð !-ðDñð
ñð  "Ø#Ø%2Ð<MÑNÐOñð!-
ˆô, Ð(¨$°Ñ*=Ó>Ð>rç   r  c              ƒ   ó
  ‡ ‡‡‡	‡
K  — ddl mŠ ddlm}m} |Š
 |«       }|j
                  j                  |j
                  j                  |j
                  j                  fŠ	 G ˆ	ˆ
fd„d|«      }ˆˆˆ ˆ
fd„} | |«       «      S ­w)a0  
        Wrap a Responses-API streaming iterator so MidStreamFallbackError
        triggers the Router's fallback chain (parity with
        _acompletion_streaming_iterator for the chat-completions path).

        The Responses-API streaming path goes through
        _ageneric_api_call_with_fallbacks rather than _acompletion, so the
        returned iterator is never wrapped by the chat completions
        fallback handler. Without this wrapper, MidStreamFallbackError
        raised mid-stream from the underlying CustomStreamWrapper (used by
        LiteLLMCompletionStreamingIterator when the Responses API is
        served via the completion bridge) propagates unhandled and the
        configured cross-provider fallback never fires.

        Full parity with the chat-completions path:
          - Pre-first-chunk: retry with the original input unchanged.
          - Partial content: inject a developer instruction + prior
            assistant message carrying the generated text so the fallback
            model continues rather than restarts.
          - Usage combining: merge partial-stream usage onto the fallback's
            response.completed event so accounting reflects both attempts.
          - Stream cleanup: shielded aclose() on both source and fallback
            iterators on terminate.
        r   r¿   )rÂ   Ú_get_openai_response_typesc                   ó:   •— e Zd ZdZdefˆfd„Zd„ Zˆ ˆfd„Zd„ Zy)úMRouter._aresponses_streaming_iterator.<locals>.FallbackResponsesStreamWrappera  
            Subclasses BaseResponsesAPIStreamingIterator only for isinstance
            compatibility (proxy + interactions code paths check the type).
            Bypasses the parent constructor and delegates iteration to an
            async generator.
            r-  c           	      óŽ  •— dd l }ddlm} || _        t        ‰dd «      | _        t        ‰dd «      | _        t        ‰dt        ‰dd «      «      | _        d| _        t        ‰dd «      | _        d | _	        t        ‰d	|j                  «       «      | _        d| _        d| _        d
| _        d| _        d| _        d | _        d| _         |j                   «       | _        t        ‰dd «      | _        t        ‰dd «      | _        t        ‰di «      xs i | _        t        ‰dd «      | _        t1        t        ‰dd «      xs i «      | _        y )Nr   )Údatetimer  ré   r'  rØ  FÚresponses_api_provider_configrü  ro  TÚlitellm_metadatar&  Úrequest_datarµ  r0  )r  rs  r1  r  r  ré   r'  Úfinishedrt  rX  Únowrü  Ú_failure_handledÚ_yielded_first_chunkÚ_generated_contentÚ_completed_response_cachedÚ_completed_response_loggedÚ_completed_response_cache_hitÚ*_persist_completed_response_before_loggingÚ_stream_created_timeru  r&  rv  rµ  r3  r0  )r4  r-  r  rs  r.  s       €rÙ   r5  zVRouter._aresponses_streaming_iterator.<locals>.FallbackResponsesStreamWrapper.__init__ð
  sB  ø€ ÛÝ-à(7�Ô%ô( !(¨¸ÀTÓ J�”Ü$ _°g¸tÓD�”
Ü#*Ø#Ø!Ü˜OÐ-BÀDÓIó$�Ô ð
 !&�”Ü5<¸_ÐNmÐosÓ5t�Ô2Ø*.�Ô'Ü")¨/¸<ÈÏÉËÓ"X�”Ø(-�Ô%Ø,1�Ô)Ø*,�Ô'Ø27�Ô/Ø27�Ô/Ø59�Ô2ØBF�Ô?Ø,5¨D¯I©I«K�Ô)Ü(/°ÐASÐUYÓ(Z�Ô%Ü+2°?ÐDYÐ[_Ó+`�Ô(Ü$+¨O¸^ÈRÓ$PÒ$VÐTV�Ô!Ü!(¨¸+ÀtÓ!L�”ô '+¬7°?ÐDTÐVZÓ+[Ò+aÐ_aÓ&b�Õ#rç   c                 ó   — | S rÔ   r  r8  s    rÙ   r=  zWRouter._aresponses_streaming_iterator.<locals>.FallbackResponsesStreamWrapper.__aiter__#  r,  rç   c              “   óö   •K  — 	 | j                   j                  «       ƒ d {  –—† }| j                  €t	        |dd «      ‰v r|| _        |S 7 Œ(# t        $ r  | j                  €t	        ‰dd «      | _        ‚ w xY w­w)NrX  r¸  )r1  r@  ÚStopAsyncIterationrX  r  )r4  rý   Ú_RESPONSES_TERMINAL_EVENT_TYPESr.  s     €€rÙ   r@  zWRouter._aresponses_streaming_iterator.<locals>.FallbackResponsesStreamWrapper.__anext__&  s‡   øè ø€ ðØ)-×)>Ñ)>×)HÑ)HÓ)J×#J�Eð. ×*Ñ*Ð2´w¸uÀfÈdÓ7SÐWvÑ7vØ.3�DÔ+Ø�ð3 $KùÜ)ò ð ×.Ñ.Ð6Ü29¸/ÐK_ÐaeÓ2f˜Ô/Øðüs+   ƒA9…A ¢A£A §$A9ÁA Á)A6Á6A9c              “   óT   K  — | j                   j                  «       ƒ d {  –—†  y 7 Œ­wrÔ   rC  r8  s    rÙ   rD  zTRouter._aresponses_streaming_iterator.<locals>.FallbackResponsesStreamWrapper.acloseC  s   è ø€ à×+Ñ+×2Ñ2Ó4×4Ò4úrE  N)	rN  rO  rP  rQ  r   r5  r=  r@  rD  )r„  r.  s   €€rÙ   ÚFallbackResponsesStreamWrapperrq  è
  s&   ø„ ñð1c°õ 1còfõó:5rç   r†  c                 óæ  •K  — d } 	 ‰2 3 d {  –—† }|­–— Œ7 Œ
6 �n(# ‰$ �r}t         j                  ‰«      }	 t        t        ‰j	                  d«      «      }‰j	                  d‰j
                  «      }‰j	                  d‰j                  «      }‰j	                  d‰j                  «      }‰j                  ‰d<   |j                  s|j                  sn2t         j                  ‰j	                  d«      |j                  «      ‰d<   ‰j                  |‰d¬«       t        |j                  t        j                   «      r|j                  n|}‰j#                  |d	||||d
‰‰j	                  dd	«      du ¬«	      ƒ d {  –—†7  } t%        | d«      rWt         j'                  | «      }	| 2 3 d {  –—†7  }
t         j)                  |
|	«       |�t         j+                  |
|«       |
­–— Œ>6 n| ­–— nN# t,        $ rB}t/        j0                  d|«       t        |‰«      r|j                  �|j                  |‚|‚d }~ww xY wY d }~nd }~ww xY wt3        j4                  d¬«      5  t%        ‰d«      rG	 ‰j7                  «       ƒ d {  –—†7   n,# t8        $ r }t/        j:                  d|«       Y d }~nd }~ww xY w| �St%        | d«      rG	 | j7                  «       ƒ d {  –—†7   n,# t8        $ r }t/        j:                  d|«       Y d }~nd }~ww xY wd d d «       y # 1 sw Y   y xY w# t3        j4                  d¬«      5  t%        ‰d«      rG	 ‰j7                  «       ƒ d {  –—†7   n,# t8        $ r }t/        j:                  d|«       Y d }~nd }~ww xY w| �St%        | d«      rG	 | j7                  «       ƒ d {  –—†7   n,# t8        $ r }t/        j:                  d|«       Y d }~nd }~ww xY wd d d «       w # 1 sw Y   w xY wxY w­w)Nré   r‰  rŠ  r‹  r`  r�  ru  ©ré   r¤  Úmetadata_variable_nameFr  r5  Tr6  r=  z,Responses streaming fallback also failed: %sr9  rD  z;stream_with_fallbacks(aresponses): error closing source: %sz=stream_with_fallbacks(aresponses): error closing fallback: %s)rg  r]  r   r  rà   r‰  rŠ  r‹  Ú(_ageneric_api_call_with_fallbacks_helperr  r=  rm  r¦  rá   r%  rÍ  rÃ  r?  r  r  r   ra  r�  r   r  r@  rA  rD  rB  rš  )r9  rC  r   r_  r…  r‰  rŠ  r‹  Úfallback_triggerr  r  rE  ÚexcrÀ   r¹  r4  r.  s                €€€€rÙ   rF  zDRouter._aresponses_streaming_iterator.<locals>.stream_with_fallbacksG  sï  øè ø€ Ø $Ðð]Ø"1÷ ð ˜$Ø”Jðø¢/øà)ó H)Ü'-×'NÑ'NÈÓ'_�ðF)Ü)-¬c°>×3EÑ3EÀgÓ3NÓ)O�KØ4B×4FÑ4FÀ{ÐTX×TbÑTbÓ4c�IØCQ×CUÑCUØ2°D×4QÑ4QóDÐ,ð DR×CUÑCUØ2°D×4QÑ4QóDÐ,ð ;?×:gÑ:g�NÐ#6Ñ7Ø×+Ò+°1×3FÒ3Fð ä28×2\Ñ2\Ø*×.Ñ.¨wÓ7Ø×/Ñ/ó3˜ wÑ/ð ×8Ñ8Ø)Ø-Ø/Að 9ô ô & a×&:Ñ&:¼G×<_Ñ<_Ô`ð ×,Ò,àð %ð
 /3×.]Ñ.]Ø*Ø*/Ø"+Ø1IØ1IØ$/ØØ-Ø0>×0BÑ0BÐC\Ð^cÓ0dÐhlÐ0lð /^ó 
/÷ 
)ð 
)Ð%ô Ð0°+Ô>Ü:@×:`Ñ:`ÐarÓ:sÐ7Ø3D÷ 0ñ 0 -Ü"×HÑHÈÐXwÔxØ,Ð8Ü &× HÑ HÈÐXeÔ fØ"/Ô/ñ	 4Eð 0Ó/ùÜ ò )Ü)×/Ñ/Ð0^Ð`nÔoä" >Ð3IÔJØ*×=Ñ=ÐIà,×?Ñ?À^ÐSØ(Ð(ûð)ÿûðCH)úôT ×&Ñ&¨dÔ3ñ Ü˜°Ô9ðØ"1×"8Ñ"8Ó":×:Ò:øÜ,ò Ü1×7Ñ7Ø ]Ø #÷ñ ûðúð
 )Ð4¼ÐARÐT\Ô9]ðØ"3×":Ñ":Ó"<×<Ò<øÜ,ò Ü1×7Ñ7Ø _Ø #÷ñ ûðú÷÷ ñ û”U×&Ñ&¨dÔ3ñ Ü˜°Ô9ðØ"1×"8Ñ"8Ó":×:Ò:øÜ,ò Ü1×7Ñ7Ø ]Ø #÷ñ ûðúð
 )Ð4¼ÐARÐT\Ô9]ðØ"3×":Ñ":Ó"<×<Ò<øÜ,ò Ü1×7Ñ7Ø _Ø #÷ñ ûðú÷÷ ñ ÿs¤  ƒO1‡ ‰�Ž‘ ˜š ›L �I£H=¹EG*Å;E>Å<(G*Æ$G"Æ(F+Æ)G"Æ-<G*Ç)H=Ç*	H5Ç3=H0È0H5È5H=È8L È=IÉL ÉO1ÉLÉ)JÉ<I?É=JÊLÊ	J,ÊJ'Ê"LÊ'J,Ê,LÊ>KËKËKËLË	LË!K<Ë7LË<LÌLÌ	O1ÌLÌO1ÌO.Ì0O"Ì>MÍM
ÍMÍO"Í	N	Í!M<	Í7O"Í<N	ÎO"ÎN-Î&N)
Î'N-Î,O"Î-	O	Î6O	ÏO"ÏO	ÏO"Ï	O.Ï"O+Ï'O.Ï.O1)	r&  rÀ   Ú$litellm.responses.streaming_iteratorrÂ   ro  ÚResponsesAPIStreamEventsÚRESPONSE_COMPLETEDÚRESPONSE_INCOMPLETEÚRESPONSE_FAILED)r4  r  r¹  rÂ   ro  Ú_openai_typesr†  rF  rÀ   r„  r.  s   ` `     @@@rÙ   Ú_aresponses_streaming_iteratorz%Router._aresponses_streaming_iterator¸
  s   üè ø€ õ: 	>÷	
ð
 "*ˆñ  :Ó;ˆà×2Ñ2×EÑEØ×2Ñ2×FÑFØ×2Ñ2×BÑBð2
Ð'÷]	5Ð-Nô ]	5÷~_	ñB .Ñ.CÓ.EÓFÐFùs   ‡A<Bc                 ój   ‡‡‡‡‡— ddl mŠ  G ˆfd„dt        «      }| Šˆˆˆˆˆfd„} | |«       «      S )a  
        Sync equivalent of _acompletion_streaming_iterator.

        Wraps a sync streaming response so that MidStreamFallbackError
        (raised by CustomStreamWrapper.__next__) triggers the Router's
        fallback chain instead of surfacing directly to the caller.
        r   r¿   c                   ó4   •‡ — e Zd Zdefˆ ˆfd„Zd„ Zd„ Zˆ xZS )úHRouter._completion_streaming_iterator.<locals>.SyncFallbackStreamWrapperÚsync_generatorc                 óÎ   •— t         ‰| �  |‰j                  ‰j                  ‰j                  ¬«       || _        t        ‰d«      r ‰j                  j                  «       | _        y y )Nr%  r0  )	r(  r5  ré   r&  r'  Ú_sync_generatorr  r0  r™  )r4  r—  r*  r¸  s     €€rÙ   r5  zQRouter._completion_streaming_iterator.<locals>.SyncFallbackStreamWrapper.__init__º  sd   ø€ Ü‘Ñ Ø&4Ø(×.Ñ.Ø(6×(JÑ(JØ .× :Ñ :ð	 !ô ð (6�Ô$Ü˜>Ð+;Ô<Ø*8×*GÑ*G×*LÑ*LÓ*N�DÕ'ð =rç   c                 ó   — | S rÔ   r  r8  s    rÙ   Ú__iter__zQRouter._completion_streaming_iterator.<locals>.SyncFallbackStreamWrapper.__iter__Å  r,  rç   c                 ó,   — t        | j                  «      S rÔ   )rt  r™  r8  s    rÙ   Ú__next__zQRouter._completion_streaming_iterator.<locals>.SyncFallbackStreamWrapper.__next__È  s   € Ü˜D×0Ñ0Ó1Ð1rç   )rN  rO  rP  r   r5  r›  r�  r.  r/  s   @€rÙ   ÚSyncFallbackStreamWrapperr–  ¹  s   ù„ ð	O¨yö 	Oòö2rç   rž  c            	   3   ó¨  •K  — d } 	 ‰D ]  }|–— Œ 	 t%        ‰d«      r	 ‰j9                  «        | �t%        | d«      r	 | j9                  «        y y y # ‰$ �r}|j                   s;|j                  st        ‰j                  «      r|j                  �|j                  |‚‚ ddlm}  |‰j                  ¬«      }t        t        d z  t        |dd «      «      }	 t        t        ‰j                  d«      «      }‰j                  d‰j                  «      }‰j                  d‰j                  «      }‰j                  d‰j                  «      }	‰j                  ‰d	<   ‰‰d
<   ‰j!                  |‰¬«        ‰j"                  di ‰¤|||	dœ¤Ž} t%        | d«      rgt&        j)                  | «      }
| D ]L  }t&        j+                  ||
«       |r.t-        |t.        «      rt%        |d«      r‰j1                  ||«       |–— ŒN nd –— nN# t2        $ rB}t5        j6                  d|«       t-        |‰«      r|j                  �|j                  |‚|‚d }~ww xY wY d }~�ŒBd }~ww xY w# t:        $ r!}t5        j<                  d|«       Y d }~�ŒRd }~ww xY w# t:        $ r }t5        j<                  d|«       Y d }~y d }~ww xY w# t%        ‰d«      r>	 ‰j9                  «        n,# t:        $ r }t5        j<                  d|«       Y d }~nd }~ww xY w| �Kt%        | d«      r>	 | j9                  «        w # t:        $ r }t5        j<                  d|«       Y d }~w d }~ww xY ww w xY w­w)Nr   r2  r4  r  ré   r‰  rŠ  r‹  r`  r_  r£  )r‰  rŠ  r‹  r›  r8  rï  r;  r<  r  )r  r=  rþ   rð   r%  r>  r3  r   r­   r  r  rà   r‰  rŠ  r‹  r¥  r¦  r§  r  rg  r  r   rá   rª   r  r�  r   r  rï  rB  rš  )r9  rC  r   r3  rD  r  r…  r‰  rŠ  r‹  r  r  rE  Ú	close_errrÀ   r¹  r_  r¸  Úrouter_selfs                 €€€€€rÙ   rF  zDRouter._completion_streaming_iterator.<locals>.stream_with_fallbacksÍ  sy  øè ø€ Ø $ÐðMØ*ò �DØ“Jñôz ˜>¨7Ô3ðØ&×,Ñ,Ô.ð %Ð0´WÐ=NÐPWÔ5XðØ)×/Ñ/Õ1ð 6YÐ0øðG *ó 9)Ø×+Ò+Ø×'Ò'Ô+PÐQ_×QfÑQfÔ+gà×+Ñ+Ð7Ø×2Ñ2¸Ð9Øå=á2FÈn×NcÑNcÔ2dÐ(Ü8<Ü˜D‘LÜÐ4°g¸tÓDó9Ð.ð*)Ü)-¬c°>×3EÑ3EÀgÓ3NÓ)O�KØ4B×4FÑ4FÀ{ÐT_×TiÑTiÓ4j�IØCQ×CUÑCUØ2Ø#×<Ñ<óDÐ,ð DR×CUÑCUØ2Ø#×<Ñ<óDÐ,ð ;F×:QÑ:Q�NÐ#6Ñ7Ø19�N :Ñ.Ø×?Ñ?ÀkÐZhÐ?ÔiØ(K¨×(KÑ(Kñ )Ø(ð)à"+Ø1IØ1Ió	)Ð%ô Ð0°*Ô=Ü:@×:`Ñ:`ÐarÓ:sÐ7Ø->ò 0˜MÜ"×HÑHÈÐXwÔxá -Ü$.¨}Ô>QÔ$RÜ$+¨M¸7Ô$Cà +× CÑ CÀMÐSqÔ rØ"/Ó/ñ0ð #š
ùä ò )Ü)×/Ñ/Ð0JÈNÔ[ä" >Ð3IÔJØ*×=Ñ=ÐIà,×?Ñ?À^ÐSØ(Ð(ûð)ÿüðe9)ûô| )ò Ü-×3Ñ3ØUØ%÷ò ûðûô )ò Ü-×3Ñ3ØXØ%÷ñ ûðûô ˜>¨7Ô3ðØ&×,Ñ,Õ.øÜ(ò Ü-×3Ñ3ØUØ%÷ñ ûðúð
 %Ð0´WÐ=NÐPWÔ5XðØ)×/Ñ/Õ1øÜ(ò Ü-×3Ñ3ØXØ%÷ñ ûðúð 6YÐ0üs	  ƒM‡A ’J6 “M I °M¿J
 ÁMÁIÁA>IÃD)HÈ IÈ	IÈ
=IÉIÉIÉJ6 ÉIÉJ6 É	JÉ&JÉ<MÊJÊMÊ
	J3ÊJ.Ê)MÊ.J3Ê3MÊ6MËKËMË	K>ËK9Ë4MË9K>Ë>MÌL!Ì MÌ!	M
Ì*MÍ MÍM
Í
MÍMrG  )r4  r¸  r_  r¹  rž  rF  rÀ   r¡  s    ```  @@rÙ   rÇ  z%Router._completion_streaming_iteratorª  s:   ü€ õ 	>ö	2Ô(;ô 	2ð$ "ˆ÷O	ð O	ñb )Ñ)>Ó)@ÓAÐArç   c              ‹   ó   K  — 	 |j                  di «      j                  dd«      ryt        j                  |«      }t        j                  d|«        | j
                  d	i |¤Ž}||d   d<    | j                  d	|t        t        t           |«      dœ|¤Žƒ d{  –—†  y7 Œ# t        $ r!}t        j                  d||«       Y d}~yd}~ww xY w­w)
z<
        Run a silent experiment in the background.
        rÄ  rÕ  FNrß  r…  rá  rë  r  )rà   r™  rš  r   r  rÝ  rã  r   râ   r�   r�  r  )r4  r¬  r_  r¤  rÛ  r   s         rÙ   Ú_silent_experiment_acompletionz%Router._silent_experiment_acompletion   sØ   è ø€ ð	fà�z‰z˜* bÓ)×-Ñ-Ð.DÀeÔLØä—}‘} XÓ.ˆHä!×&Ñ&Ð'PÐR^Ô_à#E 4×#EÑ#EÑ#OÈÑ#OˆMà7CˆM˜*Ñ% mÑ4ð #�$×"Ñ"ð Ø"ÜœdÔ#3Ñ4°hÓ?ñð  ñ÷ ò ùô
 ò 	fÜ!×'Ñ'Ð(SÐUaÐcd×eÑeûð	füsK   ‚C„"B! ¦C§A2B! ÂBÂB! ÂCÂB! Â!	CÂ*CÃCÃCÃCc              ‹   ó’	  K  — d}d}i }	 |j                  «       }||d<   t        |«      }t        j                  «       }	| j                  |||j	                  dd«      |¬«      ƒ d{  –—† }|}t        j                  «       }
|
|	z
  }t        j                  | j                  j                  t        j                  |d|	|
t        |«      ¬«      «       | j                  ||¬«       |d   j                  «       }|j	                  d	d«      }|�(t        j                   | j                  d ||d
œ|¤Ž«       |j                  d|«       | j                  ||¬«       |j	                  d	d«       |d   }| j                  ||¬«      }| j                   |xx   dz  cc<   i |¥|| j"                  |dœ¥|¥}|j	                  d	d«       |j	                  dd«       t%        j&                  d i |¤Ž}|j)                  dd«      }| j+                  ||d¬«      }|�]t-        |t
        j.                  «      rC|4 ƒd{  –—†  	 | j1                  |||¬«      ƒ d{  –—†  |ƒ d{  –—† }ddd«      ƒd{  –—†  n&| j1                  |||¬«      ƒ d{  –—†  |ƒ d{  –—† }t-        t2        «      r.| j5                  |||¬«      }|rt%        j6                  d|d¬«      ‚t-        |t8        «      r0|j:                  €$|j<                  �|j?                  «       ƒ d{  –—†  | j@                  |xx   dz  cc<   tC        jD                  d|«       | j                  |||¬«       t-        |t8        «      r| jG                  |||¬«      ƒ d{  –—† S |S 7 �Œ7 �ŒS7 �Œ97 �Œ27 �Œ%# 1 ƒd{  –—†7  sw Y   �ŒxY w7 �Œ!7 �Œ7 Œž7 Œ3# t$        jH                  $ r�}|j)                  di «      j)                  dd«      }|j)                  di «      j)                  dd«      }t$        jJ                  r|xjL                  d|› d|› �z  c_&        |�%| jO                  ||«       | jQ                  |||«       |‚d}~wtR        $ r^}tC        jD                  d||«       |�| jT                  |xx   dz  cc<   |�%| jO                  ||«       | jQ                  |||«       |‚d}~ww xY w­w)!zÙ
        - Get an available deployment
        - call it with a semaphore over the call
        - semaphore specific to it's rpm
        - in the semaphore,  make a check against it's local rpm before running
        Nré   rª  r«  Úasync_get_available_deploymentrù  ©r  rþ  r»  r¬  )r¬  r_  r_  r¯  r¼   r±  r5  rØ  Úmax_parallel_requests©r  r¤  Úclient_type)r  r'  rþ  r´  rµ  ro  r¶  z-litellm.acompletion(model=%s)[32m 200 OK[0m)r  r  rþ  r·  rô  r�  z$

Deployment Info: request_timeout: z

timeout: z3litellm.acompletion(model=%s)[31m Exception %s[0mr  )+r™  r)   r  r¥  r»  rä  r  rÌ  r	  r£   r
  Ú_track_deployment_metricsr£  rþ  r¿  Ú_get_async_openai_model_clientrù  ri  rÍ  rã  rà   rÀ  rá   Ú	SemaphoreÚ&async_routing_strategy_pre_call_checksr²   rÂ  rÃ  r°   rÄ  rÅ  Úfetch_streamrû  r   r  rH  ÚTimeoutÚexpose_router_debug_in_errorsr#  rÈ  rÉ  r�  rú  )r4  ré   r_  r¤  rf  r  Ú_timeout_debug_deployment_dictrÊ  rþ  rü  rý  r  r»  r¬  rÎ  rÏ  Ú	_responser'  Úrpm_semaphorer  rÐ  r   Ú deployment_request_timeout_paramÚdeployment_timeout_params                           rÙ   r  zRouter._acompletion:  sg  è ø€ ð ˆ
Øˆ
Ø)+Ð&ðY	Ø9?¿¹»Ð/Ø;@Ð/°Ñ8ä&GÈÓ&OÐÜ $§	¡	£ˆJØ#×BÑBØØ!Ø$*§J¡JÐ/DÀdÓ$KØ%ð	  Có  ÷ ˆJð .8Ð*Ü"Ÿi™i›kˆHØ'¨*Ñ4ˆIÜ×ÑØ×'Ñ'×BÑBÜ(×/Ñ/Ø&Ø>Ø)Ø%Ü%FÀvÓ%Nð Có ô	ð ×*Ñ*°jÐScÐ*Ôdð %/Ð/?Ñ$@×$EÑ$EÓ$GˆNØ"0×"4Ñ"4°^ÀTÓ"JˆLàÐ'ô ×#Ñ#Ø7�D×7Ñ7ð Ø%1Ø!)ñð !ñôð ×Ñ˜j¨(Ô3Ø×/Ñ/¸:ÈfÐ/ÔUØ�J‰J�~ tÔ,à'¨Ñ0ˆJà"&×"EÑ"EØ%Øð #Fó #ˆLð ×Ñ˜ZÓ(¨AÑ-Ó(ð#Ø ð#à$Ø×/Ñ/Ø&ò	#ð
 ð#ˆLð ×Ñ˜^¨TÔ2Ø×ÑÐ6¸Ô=ä&×2Ñ2ÑB°\ÑBˆIà8>¿
¹
ÐCXÐZ^Ó8_ˆKà#'×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð
 Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ 
/ñ 
/ðð ×EÑEØ#-Ø$/Ø)9ð Fó ÷ ð ð
 &/Ÿ�H÷
/÷ 
/ð 
/ð ×AÑAØ)Ø +Ø%5ð Bó ÷ ð ð "+Ÿ?�ô ˜(¤MÔ2Ø $× GÑ GÈeÐ^fÐouÐ GÓ v�Ù Ü!×=Ñ=Ø >Ø#Ø%'ôð ô ˜8Ô%8Ô9Ø×.Ñ.Ð6Ø×&Ñ&Ð2à×+Ñ+Ó-×-Ð-à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'\Ð^hÔià×*Ñ*Ø%Ø!Ø!1ð +ô ô ˜(Ô$7Ô8Ø!×AÑAØ#+Ø%Ø#Fð Bó ÷ ð ð ˆOð}ùðR
/ùð
ùð
  /ùð
/ù÷ 
/÷ 
/ò 
/úðùð +ùð" .øðùô �‰ò 	Ø6T×6XÑ6XÐYiÐkmÓ6n×6rÑ6rØ! 4ó7Ð,ð (F×'IÑ'IÐJZÐ\^Ó'_×'cÑ'cÐdmÐosÓ'tÐ$Ü×4Ò4Ø—	’	ÐEÐFfÐEgÐgrð  tLð  sMð  Nñ  N•	àÐ%Ø×=Ñ=¸aÀÔLØ×JÑJÈ1ÈjÐZ`ÔaØˆGûÜò 	Ü!×&Ñ&Ð'bÐdnÐpqÔrØÐ%Ø—‘ 
Ó+¨qÑ0Ó+àÐ%Ø×=Ñ=¸aÀÔLØ×JÑJÈ1ÈjÐZ`ÔaØˆGûð	üs  ‚SŠAN/ Á&N Á'G	N/ È0NÈ1N/ È4NÉNÉ	NÉN	ÉNÉN/ É'NÉ(N/ ÊN%Ê	N/ ÊN(ÊA=N/ ÌN+ÌA,N/ Í9N-Í:N/ Í=SÍ>N/ Í?SÎ N/ ÎN/ ÎNÎ	NÎN/ ÎN"ÎNÎN"Î	N/ Î(N/ Î+N/ Î-N/ Î/SÏBQÑSÑ&AR?Ò?SÓSr¤  r‰  c                 óÒ   — |j                  dt        t        j                  «       «      «       d}| j	                  |¬«      r|}|j                  |i «      j                  ||dœ«       y)a»  
        Adds/updates to kwargs:
        - litellm_trace_id
        - metadata

        num_retries is deliberately left as the caller passed it, with no default filled in.
        async_function_with_retries resolves the router/global default itself, and it can only
        honour the precedence request > deployment litellm_params > litellm_settings while an
        absent num_retries still means "the caller did not ask for one".
        Úlitellm_trace_idNr‡  )r…  rŒ  )rþ  r  r   Úuuid4r�  rÔ  )r4  ré   r¤  r‰  rŒ  s        rÙ   r¦  z&Router._update_kwargs_before_fallbacksá  sb   € ð  	×ÑÐ,¬c´$·*±*³,Ó.?Ô@Ø(,ÐØ×%Ñ%¨EÐ%Ô2Ø %ÐØ×ÑÐ0°"Ó5×<Ñ<Ø!Ð8IÑJõ	
rç   Ú	exceptionc                 óÎ   — t        |d«      r|j                  �y|j                  di «      }|j                  d«      }|�	 t        |«      |_        yy# t        t
        f$ r Y yw xY w)zâ
        Set num_retries from deployment litellm_params on the exception.

        This allows the retry logic in async_function_with_retries to use
        per-deployment retry settings instead of the global setting.
        r  Nr»  )r  r  rà   r  r×   rÖ   )r4  r¹  r  r»  Údep_num_retriess        rÙ   rÈ  z/Router._set_deployment_num_retries_on_exceptionù  ss   € ô �9˜mÔ,°×1FÑ1FÐ1RØà *§¡Ð/?ÀÓ DˆØ!/×!3Ñ!3°MÓ!BˆØÐ&ðÜ(+¨OÓ(<�	Õ%ð 'øô ¤	Ð*ò Ùðús   Á A ÁA$Á#A$c                 óœ   — t        |dd«      ry|j                  d«      xs i j                  d«      }|r		 ||_        yy# t        $ r Y yw xY w)a‰  
        Stamp the failed deployment's `model_info.id` on the exception so the
        fallback layer can exclude it from subsequent re-picks within the same
        request (used by weighted-routing failover).

        Idempotent: never overwrites an existing value, so the id of the
        deployment that *first* failed in a chain is preserved if multiple
        layers re-raise.
        Úfailed_deployment_idNrÛ   rY  )r  rà   r½  r�  )r4  r¹  r  Údeployment_ids       rÙ   Ú&_set_failed_deployment_id_on_exceptionz-Router._set_failed_deployment_id_on_exception  s[   € ô �9Ð4°dÔ;ØØ *§¡¨|Ó <Ò BÀ×GÑGÈÓMˆÙðØ1>�	Õ.ð øô ò Ùðús   ¶? ¿	AÁ
Ac                 ó    — |j                  d«      xs |j                  d«      xs t        i «      }| j                  |t        d|i«      «       y )NrÛ   )rà   r   r¿  )r4  r¹  r  r¤  Úeffective_model_infos        rÙ   rÉ  z<Router._stamp_failed_deployment_id_with_effective_model_info  sK   € ð '-§j¡j°Ó&>Ò&vÀ*Ç.Á.ÐQ]ÓB^Ò&vÔbrÐsuÓbvÐØ×3Ñ3°IÔ?OÐQ]Ð_sÐPtÓ?uÕvrç   c                 ó   — | j                   j                  «       }|j                  di «      xs i }|j                  «       D ]  \  }}|€Œ	|j	                  ||«       Œ |j	                  |i «      j                  |«       y)z³
        Adds default litellm params to kwargs, if set.

        Handles inserting this as either "metadata" or "litellm_metadata" depending on the metadata_variable_name
        rÄ  N)rƒ  r™  r»  r;  rþ  rÔ  )r4  r¤  r‰  ÚdefaultsÚmetadata_defaultsÚkeyrÑ   s          rÙ   Ú*_update_kwargs_with_default_litellm_paramsz1Router._update_kwargs_with_default_litellm_params)  s�   € ð ×5Ñ5×:Ñ:Ó<ˆØ#+§<¡<°
¸BÓ#?Ò#EÀ2Ðð #Ÿ.™.Ó*ò 	*‰JˆC�Øˆ}ØØ×Ñ˜c 5Õ)ð	*ð 	×ÑÐ0°"Ó5×<Ñ<Ð=NÕOrç   Úfunction_namec                 óŽ  — |j                  di «      j                  «       }|d   j                  «       }t        ||¬«      }t        |¬«      }|j                  |i «      j                  d«      }| j	                  ||¬«      }	|j                  d«      }
|	|d<   |
|d<   t        |t        di |¤Ž|¬	«      }| j                  |¬
«       |S )z.
        Handle clientside credential
        rÛ   r»  )r»  r’  ©rÇ  r…  )r…  r»  rY  Úoriginal_model_id©rf  r»  rÛ   r°  r  )rà   r™  rZ   rV   Úgenerate_model_idr�   r‘   Úupsert_deployment)r4  r  r¤  rÇ  rÛ   r»  Údynamic_litellm_paramsr‰  r…  Ú	_model_idrÊ  Údeployment_pydantic_objs               rÙ   Ú_handle_clientside_credentialz$Router._handle_clientside_credential>  sÝ   € ð 'ŸN™N¨<¸Ó<×AÑAÓCˆ
Ø *Ð+;Ñ <× AÑ AÓ CˆÜ(BÐR`ÐqwÔ(xÐä(JØ'ô)
Ðð $ŸZ™ZÐ(>ÀÓC×GÑGÈÓVˆØ×1Ñ1¸kÐZpÐ1Óqˆ	Ø#-§>¡>°$Ó#7ÐØ$ˆ
�4ÑØ*;ˆ
Ð&Ñ'Ü)3Ø"Ü)ÑCÐ,BÑCØ!ô*
Ðð
 	×ÑÐ*AÐÔBØ&Ð&rç   c                 óL  — | j                  di «      xs i }t        |t        «      r|}n|j                  d¬«      }|j                  d«      xs g }|j                  d«      xs g }|s|rt	        |«      t	        |«      z   }||d<   d|vr|j                  d«      �	|d   |d<   yyy)zõ
        Merge tools from deployment litellm_params with request kwargs.
        When both have tools, concatenate them (deployment tools first, then request tools).
        tool_choice: use request value if provided, else deployment's.
        r»  TrÉ  ÚtoolsÚtool_choiceN)rà   rá   r3  r  râ   )r  r¤  Údep_params_rawÚ
dep_paramsÚ	dep_toolsÚ	req_toolsÚmergeds          rÙ   Ú_merge_tools_from_deploymentz#Router._merge_tools_from_deploymentX  s°   € ð !+§¡Ð/?ÀÓ DÒ JÈˆÜ�n¤dÔ+Ø'‰Jà'×2Ñ2ÀÐ2ÓEˆJØ%Ÿ>™>¨'Ó2Ò8°bˆ	Ø!Ÿ:™: gÓ.Ò4°"ˆ	Ù™	Ü  ›O¬d°9«oÑ=ˆFØ$ˆF�7‰OØ Ñ&¨:¯>©>¸-Ó+HÐ+TØ$.¨}Ñ$=ˆF�=Ò!ð ,UÐ&rç   c                 óJ  — | j                  ||j                  t        d«      ¬«      D ]  }|j                  |d«       Œ | j                  ||¬«       |j	                  di «      j                  «       }|d   d   }|d   j	                  d«      }|d	   }t        |¬
«      rZ| j                  |||¬«      }	|	j                  j                  «       }|	j                  j                  }|	j                  j                  }t        |¬«      }
|j                  |
i «      j                  ||||dœ«       t!        | j"                  |«       t%        |t'        |«      ¬«       |j	                  di «      j	                  d«      }|rH||
   j	                  d«      xs g }t)        |«      }|D ]  }||vsŒ|j+                  |«       Œ |||
   d<   |j	                  di «      j	                  d«      }|r:d|› �}||
   j	                  d«      xs g }||vr|j+                  |«       |||
   d<   ||d<   |dk(  rOddlm} t1        | j2                  t4        t6        f«      rt7        | j2                  «      nd} |||d   |¬«      |d<   n| j9                  ||d   ¬«      |d<   | j;                  ||
¬«       y)a  
        3 jobs:
        - Adds selected deployment, model_info and api_base to kwargs["metadata"] (used for logging)
        - Adds default litellm params to kwargs, if set.
        - Merges tools from deployment with request (proxy-configured tools + request tools).
        r  )r  Úforwarded_keysNr¯  rÛ   r»  ré   rë   rf  )r’  ©r  r¤  rÇ  rÉ  )r  rÛ   rë   Údeployment_model_name)Ústore_in_contextÚtagsÚlitellm_credential_namezCredential: Ú!_ageneric_api_call_with_fallbacksr   )Úresolve_llm_passthrough_timeout)r¤  r»  Úrouter_timeoutr�  ©r¤  Údata)r¤  r‰  )Ú0_forwarded_alias_marker_keys_the_deployment_setsr»  rï   rÚ  rà   r™  r[   rÑ  rÛ   r  r»  ré   rë   rV   rþ  rÔ  rv   r¼  rw   ru   râ   rø  Ú!litellm.passthrough.timeout_utilsrã  rá   ró  r  rÕ   Ú_get_timeoutrÆ  )r4  r  r¤  rÇ  rÅ  rÛ   Údeployment_litellm_model_nameÚdeployment_api_baserÞ  rÐ  r‰  Údeployment_tagsÚexisting_tagsÚmerged_tagsÚtagÚcredential_nameÚcredential_tagrã  Ú_router_timeouts                      rÙ   r¿  z%Router._update_kwargs_with_deploymentl  sð  € ð ×HÑHØ!°&·*±*Ô=aÐceÓ2fð Ió 
ò 	"ˆCð �J‰J�s˜DÕ!ð	"ð 	×)Ñ)°ZÈÐ)ÔOà—^‘^ L°"Ó5×:Ñ:Ó<ˆ
Ø(2Ð3CÑ(DÀWÑ(MÐ%Ø(Ð)9Ñ:×>Ñ>¸zÓJÐØ'1°,Ñ'?ÐÜ#°6Õ:Ø-1×-OÑ-OØ%¨fÀMð .Pó .Ð#ð 1×;Ñ;×FÑFÓHˆJØ,C×,RÑ,R×,XÑ,XÐ)Ø"9×"HÑ"H×"QÑ"QÐä(JØ'ô)
Ðð 	×ÑÐ0°"Ó5×<Ñ<à;Ø(Ø/Ø)>ñ	ô	
ô 	.¨d¯j©j¸&ÔAÜ.¨vÔHfÐgqÓHrÕsð ",§¡Ð0@À"Ó!E×!IÑ!IÈ&Ó!QˆÙØ"Ð#9Ñ:×>Ñ>¸vÓFÒLÈ"ˆMÜ!% mÓ!4ˆKØ&ò ,�Ø˜kÒ)Ø×&Ñ& sÕ+ð,ð 6AˆFÐ)Ñ*¨6Ñ2ð ",§¡Ð0@À"Ó!E×!IÑ!IÐJcÓ!dˆÙØ&2°?Ð2CÐ$DˆNØ"Ð#9Ñ:×>Ñ>¸vÓFÒLÈ"ˆMØ ]Ñ2Ø×$Ñ$ ^Ô4Ø5BˆFÐ)Ñ*¨6Ñ2à)ˆˆ|ÑàÐ?Ò?õô
 2<¸D×<RÑ<RÔUXÔZ_ÐT`Ô1a”�d×,Ñ,Ô-Ðgkð ñ !@ØØ)Ð*:Ñ;Ø.ô!ˆF�9Òð !%× 1Ñ 1¸ÀjÐQaÑFbÐ 1Ó cˆF�9Ñà×7Ñ7¸vÐ^tÐ7Õurç   c                 ó„   — | j                  ||d¬«      }|j                  dd«      }|�|�||j                  k7  rd}|S |}|S )a�  
        Helper to get AsyncOpenAI or AsyncAzureOpenAI client that was created for the deployment

        The same OpenAI client is re-used to optimize latency / performance in production

        If dynamic api key is provided:
            Do not re-use the client. Pass model_client=None. The OpenAI/ AzureOpenAI client will be recreated in the handler for the llm provider
        Úasyncr¨  rê   N)rÀ  rà   rê   )r4  r  r¤  rÌ  rÍ  rÎ  s         rÙ   r«  z%Router._get_async_openai_model_clientÅ  se   € ð )-×(8Ñ(8ÀJÐW]ÐkrÐ(8Ó(sÐð "(§¡¨I°tÓ!<ˆàÐ'Ø&Ð2ØÐ#9×#AÑ#AÒAàˆLð Ðð 2ˆLàÐrç   ræ  c                 óÂ   — |j                  dd«      xsL |j                  dd«      xs8 | j                  xs* | j                  xs | j                  j                  dd«      S )z=Helper to get stream timeout from kwargs or deployment paramsr‚  N)rà   r‚  rô  rƒ  )r4  r¤  ræ  s      rÙ   Ú_get_stream_timeoutzRouter._get_stream_timeoutÝ  sl   € ð �J‰JÐ'¨Ó.ò GØ�x‰xÐ(¨$Ó/òGà×"Ñ"òGð ×#Ñ#òGð ×*Ñ*×.Ñ.Ð/?ÀÓFð	
rç   c                 ó  — |j                  dd«      xst |j                  dd«      xs` |j                  dd«      xsL |j                  dd«      xs8 | j                  xs* | j                  xs | j                  j                  dd«      }|S )zAHelper to get non-stream timeout from kwargs or deployment paramsr�  Nrô  )rà   rô  r�  rƒ  ©r4  r¤  ræ  r�  s       rÙ   Ú_get_non_stream_timeoutzRouter._get_non_stream_timeoutç  sœ   € ð �J‰J�y $Ó'ò @Ø�z‰zÐ+¨TÓ2ò@à�x‰x˜	 4Ó(ò@ð �x‰xÐ)¨4Ó0ò@ð ×#Ñ#ò	@ð
 �|‰|ò@ð ×*Ñ*×.Ñ.¨y¸$Ó?ð 	ð ˆrç   c                 ó~   — d}|j                  dd«      r| j                  ||¬«      }|€| j                  ||¬«      }|S )z6Helper to get timeout from kwargs or deployment paramsNrÖ  Frå  )rà   rö  rù  rø  s       rÙ   ré  zRouter._get_timeoutô  sP   € à&*ˆØ�:‰:�h Ô&Ø×.Ñ.°fÀ4Ð.ÓHˆGØˆ?Ø×2Ñ2Ø Dð 3ó ˆGð ˆrç   rn  c              ‹   ó  ‡ K  — dt         dt        t           fˆ fd„}dt         dt        t           dt        fˆ fd„}t	        |t        «      rQt        d„ |D «       «      r?g }|D ]  }|j                   |d||dœ|¤Ž«       Œ t        j                  |Ž ƒ d{  –—† }|S t	        |t        «      rÍt        d	„ |D «       «      rºg }t        |«      D ]'  \  }	}
|D ]  }|j                   |d||	|
d
œ|¤Ž«       Œ Œ) t        j                  |Ž ƒ d{  –—† }t        t        |«      «      D �cg c]  }g ‘Œ }}|D ]A  }t	        |t        «      r||d      j                  |d   «       Œ.|d   j                  |«       ŒC |S yy7 Œä7 Œqc c}w ­w)a6  
        Async Batch Completion. Used for 2 scenarios:
        1. Batch Process 1 request to N models on litellm.Router. Pass messages as List[Dict[str, str]] to use this
        2. Batch Process N requests to M models on litellm.Router. Pass messages as List[List[Dict[str, str]]] to use this

        Example Request for 1 request to N models:
        ```
            response = await router.abatch_completion(
                models=["gpt-3.5-turbo", "groq-llama"],
                messages=[
                    {"role": "user", "content": "is litellm becoming a better product ?"}
                ],
                max_tokens=15,
            )
        ```


        Example Request for N requests to M models:
        ```
            response = await router.abatch_completion(
                models=["gpt-3.5-turbo", "groq-llama"],
                messages=[
                    [{"role": "user", "content": "is litellm becoming a better product ?"}],
                    [{"role": "user", "content": "who is this"}],
                ],
            )
        ```
        ré   r_  c              ›   ó|   •K  — 	  ‰j                   d| |dœ|¤Žƒ d{  –—† S 7 Œ# t        $ r}|cY d}~S d}~ww xY w­w©zs
            Wrapper around self.async_completion that catches exceptions and returns them as a result
            rá  Nr  ©rã  r�  ©ré   r_  r¤  r   r4  s       €rÙ   Ú_async_completion_no_exceptionszARouter.abatch_completion.<locals>._async_completion_no_exceptions#  óD   øè ø€ ðØ-˜T×-Ñ-ÐW°EÀHÑWÐPVÑW×WÐWÐWùÜò Ø•ûðüó0   ƒ<…$ �"ž$ ¡<¢$ ¤	9­4®9¯<´9¹<rs  c              ›   ó„   •K  — 	  ‰j                   d| |dœ|¤Žƒ d{  –—† |fS 7 Œ# t        $ r}||fcY d}~S d}~ww xY w­wrý  rþ  )ré   r_  rs  r¤  r   r4  s        €rÙ   Ú*_async_completion_no_exceptions_return_idxzLRouter.abatch_completion.<locals>._async_completion_no_exceptions_return_idx,  sS   øè ø€ ðà*˜$×*Ñ*ÐT°ÀÑTÈVÑT×TØðð ØTùô ò Ø˜#�v•ûðüs4   ƒA …& �$ž& £A ¤& ¦	=¯8²=³A ¸=½A c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wrÔ   ©rá   r3  ©rŠ  r   s     rÙ   r‹  z+Router.abatch_completion.<locals>.<genexpr>?  s   è ø€ Ò-TÀa¬j¸¼D×.AÑ-Tùr�  rá  Nc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wrÔ   )rá   râ   r  s     rÙ   r‹  z+Router.abatch_completion.<locals>.<genexpr>F  s   è ø€ Ò/VÈ´
¸1¼d×0CÑ/Vùr�  )ré   rs  r_  r¼   r   r  )r  râ   r�   r  rá   Úallrø  rä  rç  ru  Úranger‰  rã   )r4  rn  r_  r¤  r   r  Ú_tasksré   r  rs  r#  r¼  Ú_Úfinal_responsess   `             rÙ   Úabatch_completionzRouter.abatch_completionÿ  s¯  øè ø€ ðH	¼ð 	ÌÔM]ÑH^õ 	ð	Üð	äÔ+Ñ,ð	ô õ	ô& �h¤Ô%¬#Ñ-TÈ8Ô-TÔ*TØˆFØò i�à—‘Ñ=ÐgÀEÐT\ÑgÐ`fÑgÕhðiô %Ÿ^™^¨VÐ4×4ˆHØˆOÜ˜¤$Ô'¬CÑ/VÈXÔ/VÔ,VØˆFÜ )¨(Ó 3ò 
‘��WØ#ò 	�Eà—M‘MÙBð Ø"'Ø #Ø%,ñð %ñ	õñ	ð
ô &-§^¡^°VÐ%<×<ˆIÜCHÌÈXËÓCWÖ6X¸a²rÐ6XˆOÐ6XØ%ò 8�Ü˜h¬Ô.Ø# H¨Q¡KÑ0×7Ñ7¸À¹ÕDà# AÑ&×-Ñ-¨hÕ7ð	8ð
 #Ð"ð) -WÐ'ð 5øð  =úÚ6Xùs8   ƒBFÂE;ÂA4FÄE=ÄFÄ&	E?Ä/AFÅ=FÅ?Fc           	   ‹   óÀ   ‡ K  — dt         dt        t           fˆ fd„}g }|D ]  }|j                   |d||dœ|¤Ž«       Œ t	        j
                  |Ž ƒ d{  –—† }|S 7 Œ­w)aø  
        Async Batch Completion - Batch Process multiple Messages to one model_group on litellm.Router

        Use this for sending multiple requests to 1 model

        Args:
            model (List[str]): model group
            messages (List[List[Dict[str, str]]]): list of messages. Each element in the list is one request
            **kwargs: additional kwargs
        Usage:
            response = await self.abatch_completion_one_model_multiple_requests(
                model="gpt-3.5-turbo",
                messages=[
                    [{"role": "user", "content": "hello"}, {"role": "user", "content": "tell me something funny"}],
                    [{"role": "user", "content": "hello good mornign"}],
                ]
            )
        ré   r_  c              ›   ó|   •K  — 	  ‰j                   d| |dœ|¤Žƒ d{  –—† S 7 Œ# t        $ r}|cY d}~S d}~ww xY w­wrý  rþ  rÿ  s       €rÙ   r   z]Router.abatch_completion_one_model_multiple_requests.<locals>._async_completion_no_exceptionsr  r  r  rá  Nr  )r  râ   r�   rø  rä  rç  )r4  ré   r_  r¤  r   r  Úmessage_requestr  s   `       rÙ   Ú-abatch_completion_one_model_multiple_requestsz4Router.abatch_completion_one_model_multiple_requests\  ss   øè ø€ ð,	¼ð 	ÌÔM]ÑH^õ 	ð ˆØ'ò 	lˆOà�M‰MÑ9ÐjÀÐP_ÑjÐciÑjÕkð	lô !(§¡°Ð 7×7ˆØˆð 8ús   ƒAAÁAÁAc              ‹   ó   K  — y ­wrÔ   r  rò  s        rÙ   Ú"abatch_completion_fastest_responsez)Router.abatch_completion_fastest_response…  ró  rô  c              ‹   ó   K  — y ­wrÔ   r  rò  s        rÙ   r  z)Router.abatch_completion_fastest_response�  ró  rô  c              ‹   óz  ‡ ‡K  — |j                  d«      D �cg c]  }|j                  «       ‘Œ }}dt        dt        t        t        t        f      dt
        dt        dt        t        z  t        z  f
ˆ fd„}g Šdt        j                  fˆfd	„}|D ]2  }t        j                   |d|||d
œ|¤Ž«      }	‰j                  |	«       Œ4 ‰r_t        j                  ‰t        j                  ¬«      ƒ d{  –—† \  }
Š|
D ]'  } ||«      ƒ d{  –—† }|€Œd|j                   d<   |c S  ‰rŒ_t        d«      ‚c c}w 7 ŒF7 Œ0­w)z¸
        model - List of comma-separated model names. E.g. model="gpt-4, gpt-3.5-turbo"

        Returns fastest response from list of model names. OpenAI-compatible endpoint.
        ú,ré   r_  rÖ  r¤  rÒ   c              ›   óÔ   •K  — 	  ‰j                   d| ||dœ|¤Žƒ d{  –—† }|S 7 Œ# t        j                  $ r t        j                  d| «       ‚ t
        $ r}|cY d}~S d}~ww xY w­w)zn
            Wrapper around self.acompletion that catches exceptions and returns them as a result
            ©ré   r_  rÖ  Nz4Received 'task.cancel'. Cancelling call w/ model=%s.r  )rã  rä  ÚCancelledErrorr   rš  r�  )ré   r_  rÖ  r¤  Úresultr   r4  s         €rÙ   r   zRRouter.abatch_completion_fastest_response.<locals>._async_completion_no_exceptions£  sq   øè ø€ ðØ/˜t×/Ñ/Ðh°eÀhÐW]ÑhÐagÑh×h�Ø�ð iùä×)Ñ)ò Ü%×+Ñ+Ð,bÐdiÔjØÜò Ø•ûðüs=   ƒA(…' ž%Ÿ' ¤A(¥' §2A%ÁA ÁA%ÁA(Á A%Á%A(Útaskc              “   ó   •K  — 	 | ƒ d {  –—† }t        |t        t        f«      r@t        j                  d«       ‰D ]  }|j                  «        Œ |	 ‰j                  | «       S 	 	 ‰j                  | «       y 7 Œn# t        $ r Y S w xY w# t        $ r Y Œ/w xY w# t        $ r Y y w xY w# 	 ‰j                  | «       w # t        $ r Y w w xY wxY w­w)Nz=Received successful response. Cancelling other LLM API calls.)	rá   r²   r°   r   rš  rJ  r)  ÚKeyErrorr�  )r  r  ÚtÚpending_taskss      €rÙ   Úcheck_responsezARouter.abatch_completion_fastest_response.<locals>.check_response´  sÜ   øè ø€ ðØ&*§
�Ü˜f¤}Ô6IÐ&JÔKÜ)×/Ñ/Ð0oÔpà*ò #˜ØŸ™�
ð#à!ðØ!×(Ñ(¨Õ.ð LðØ!×(Ñ(¨Õ.ð !+ùô  ò Ùðûô ò áðûô  ò ÙðûðØ!×(Ñ(¨Õ.øÜò Ùðÿs±   ƒC…B
 ŠA9‹AB
 ÁA;Á$CÁ%B( Á'B Á8CÁ9B
 Á;	BÂCÂBÂCÂ
	BÂB( ÂBÂB( Â	B%Â"CÂ$B%Â%CÂ(CÂ*B<Â;CÂ<	CÃCÃCÃCÃCr  )Úreturn_whenNTÚ!fastest_response_batch_completionzAll tasks failedr  )ÚsplitÚstripr  râ   r3  rU  r   r²   r°   r�  rä  ÚTaskr  rø  ÚwaitÚFIRST_COMPLETEDr0  )r4  ré   r_  rÖ  r¤  r   rn  r   r!  r  ÚdoneÚcompleted_taskr  r   s   `            @rÙ   r  z)Router.abatch_completion_fastest_response•  sN  ùè ø€ ð -2¯K©K¸Ó,<Ö= q˜Ÿ™�Ð=ˆÐ=ð	Üð	Ü"&¤t¬C´¨H¡~Ñ"6ð	Ü@Dð	ÜPSð	äÔ0Ñ0´9Ñ<õ	ð ˆð	¤w§|¡|õ 	ð( ò 	'ˆEÜ×&Ñ&Ù/Ðh°eÀhÐW]ÑhÐagÑhóˆDð × Ñ  Õ&ð		'ñ Ü(/¯©°]ÔPW×PgÑPgÔ(h×"hÑˆD�-Ø"&ò "�Ù-¨nÓ=×=�àÑ%àQU�F×)Ñ)Ð*MÑNØ!’Mð"ò ô Ð*Ó+Ð+ùòs >ð^ #iøà=ús:   „D;˜D2¯CD;Ã0D7Ã1D;ÄD9Ä	D;ÄD;Ä'D;Ä9D;rø  c              ‹   ó   K  — y ­wrÔ   r  ©r4  ré   r_  rø  rÖ  r¤  s         rÙ   r  zRouter.schedule_acompletionà  ró  rô  c              ‹   ó   K  — y ­wrÔ   r  r,  s         rÙ   r  zRouter.schedule_acompletionæ  ró  rô  c              ‹   óB  K  — t        |«      }t        t        j                  «       «      }t	        |||¬«      }| j
                  j                  |¬«      ƒ d {  –—†  t        j                  «       | j                  z   }	t        j                  «       }
| j
                  j                  }d}|
|	k  r’| j                  ||¬«      ƒ d {  –—† \  }}| j
                  j                  |j                  |j                  |¬«      ƒ d {  –—† }|rn7t        j                   |«      ƒ d {  –—†  t        j                  «       }
|
|	k  rŒ’|r]	  | j"                  d|||dœ|¤Žƒ d {  –—† }|j$                  j'                  di «       |j$                  d   j)                  dd	i«       |S | j
                  j/                  |j                  |j                  ¬«      ƒ d {  –—†  t1        j2                  d|d¬«      ‚7 �Œ™7 �Œ/7 Œô7 ŒÖ7 Œ�# t*        $ r}t-        |d
|«       |‚d }~ww xY w7 ŒH­w)N©rø  Ú
request_idrf  ©ÚrequestF©ré   rþ  ©rY  rf  Úhealth_deploymentsr  rJ  ú%x-litellm-request-prioritization-usedTrø  ©r0  rf  ú%Request timed out while polling queuerð  r¶  r  )r)   r  r   r¸  r   r×  Úadd_requestr  Ú	monotonicr�  r}  Ú_async_get_healthy_deploymentsÚpollr0  rf  rä  Úsleeprã  r0  rþ  rÔ  r�  ra  Úremove_requestrÍ  r¯  )r4  ré   r_  rø  rÖ  r¤  rþ  Ú_request_idrC  rý  Ú	curr_timeÚpoll_intervalÚmake_requestÚ_healthy_deploymentsr  r²  r   s                    rÙ   r  zRouter.schedule_acompletionî  s  è ø€ ô #DÀFÓ"KÐä ¤§¡£Ó.ˆÜØØ"Øô
ˆð �n‰n×(Ñ(°Ð(Ó6×6Ð6ô Ÿ.™.Ó*¨T¯\©\Ñ9ˆÜ—N‘NÓ$ˆ	Ø#Ÿ~™~×>Ñ>ˆØˆà˜(Ò"Ø,0×,OÑ,OØÐ.>ð -Pó -÷ 'Ñ#Ð  !ð "&§¡×!4Ñ!4Ø—?‘?ØŸ?™?Ø#7ð "5ó "÷ ˆLñ
 Øä—m‘m MÓ2×2Ð2Ü ŸN™NÓ,�	ð ˜(Ó"ñ ðØ)9¨×)9Ñ)9Ð)rÀÐPXÐagÑ)rÐkqÑ)r×#r�	Ø×(Ñ(×3Ñ3Ð4HÈ"ÔMØ×(Ñ(Ð)=Ñ>×EÑEÐGnÐptÐFuÔvØ Ð ð —.‘.×/Ñ/¸4¿?¹?ÐW[×WfÑWfÐ/Óg×gÐgÜ—/‘/Ø?ØØ%ôð ðG 	7ùð'ùðøð 3øð
 $sùô ò Ü˜˜: xÔ0Ø�ûðúð
 hús’   ‚AHÁG1ÁA,HÃG4Ã<HÄG7ÄHÄ"G9Ä#HÅHÅG= ÅG;ÅAG= Æ5HÇHÇHÇ4HÇ7HÇ9HÇ;G= Ç=	HÈHÈHÈHr`  r'  .c              ƒ   ó\  K  — t        |«      }t        t        j                  «       «      }t	        |||¬«      }| j
                  j                  |¬«      ƒ d {  –—†  t        j                  «       | j                  z   }	t        j                  «       }
| j
                  j                  }d}|
|	k  r’| j                  ||¬«      ƒ d {  –—† \  }}| j
                  j                  |j                  |j                  |¬«      ƒ d {  –—† }|rn7t        j                   |«      ƒ d {  –—†  t        j                  «       }
|
|	k  rŒ’|ri	  ||i |¤Žƒ d {  –—† }t#        |j$                  t&        «      r<|j$                  j)                  di «       |j$                  d   j+                  ddi«       |S | j
                  j1                  |j                  |j                  ¬
«      ƒ d {  –—†  t3        j4                  d|d¬«      ‚7 �Œ¥7 �Œ;7 �Œ7 Œã7 Œ¸# t,        $ r}t/        |d	|«       |‚d }~ww xY w7 ŒI­w)Nr/  r1  Fr3  r4  rJ  r6  Trø  r7  r8  rð  r¶  )r)   r  r   r¸  r   r×  r9  r  r:  r�  r}  r;  r<  r0  rf  rä  r=  rá   r0  r3  rþ  rÔ  r�  ra  r>  rÍ  r¯  )r4  ré   rø  r`  r'  r¤  rþ  r?  rC  rý  r@  rA  rB  rC  r  r²  r   s                    rÙ   Ú_schedule_factoryzRouter._schedule_factory*  s  è ø€ ô #DÀFÓ"KÐä ¤§¡£Ó.ˆÜØØ"Øô
ˆð �n‰n×(Ñ(°Ð(Ó6×6Ð6ô Ÿ.™.Ó*¨T¯\©\Ñ9ˆÜ—N‘NÓ$ˆ	Ø#Ÿ~™~×>Ñ>ˆØˆà˜(Ò"Ø,0×,OÑ,OØÐ.>ð -Pó -÷ 'Ñ#Ð  !ð "&§¡×!4Ñ!4Ø—?‘?ØŸ?™?Ø#7ð "5ó "÷ ˆLñ
 Øä—m‘m MÓ2×2Ð2Ü ŸN™NÓ,�	ð ˜(Ó"ñ ð
Ù):¸DÐ)KÀFÑ)K×#K�	Ü˜i×6Ñ6¼Ô=Ø×,Ñ,×7Ñ7Ð8LÈbÔQØ×,Ñ,Ð-AÑB×IÑIØ@À$ÐGôð !Ð ð —.‘.×/Ñ/¸4¿?¹?ÐW[×WfÑWfÐ/Óg×gÐgÜ—/‘/Ø?ØØ%ôð ðM 	7ùð'ùðùð 3øð
 $Lùô ò Ü˜˜: xÔ0Ø�ûðúð
 hús’   ‚AH,ÁG=ÁA,H,ÃH Ã<H,ÄHÄH,Ä"HÄ#H,ÅH,ÅH
 ÅHÅAH
 Æ+5H,Ç H*Ç!H,È H,ÈH,ÈH,ÈH
 È
	H'ÈH"È"H'È'H,c                 óÒ   — | j                  |¬«      }|�t        |«      dk7  ry|d   d   j                  dd «      }|�d|vry|j                  d«      d   }|t        j
                  v S )N©rf  r¼   Fr   r»  ré   ú/)Úget_model_listr‰  rà   r$  rÍ  Ú)_known_custom_logger_compatible_callbacks)r4  ré   rq  Úlitellm_modelÚsplit_litellm_models        rÙ   r  z"Router._is_prompt_management_modeli  s|   € Ø ×/Ñ/¸5Ð/ÓAˆ
ØÐ¤ Z£°AÒ!5Øà)¨!™}Ð-=Ñ>×BÑBÀ7ÈDÓQˆØÐ  C¨}Ñ$<Øà%2×%8Ñ%8¸Ó%=¸aÑ%@ÐØ"¤g×&WÑ&WÐWÐWrç   c           	   ƒ   ó  K  — |j                  dd «      }|€$t        di dt        «       t        «       dœ|¥¤Ž\  }}t	        t
        |«      }| j                  |dddœg|j                  dd «      ¬«      }| j                  ||¬	«       |d
   j                  «       }|j                  dd «      }t        |t        «      xr |j                  d«      }|j                  d«      xs |d
   j                  dd «      }	|j                  d«      xs |d
   j                  dd «      }
|j                  dd «      xs |d
   j                  dd «      }|s,|	�t        |	t        «      st        d|	› dt        |	«      › �«      ‚|
�*t        |
t        «      st        d|
› dt        |
«      › �«      ‚|j!                  ||t#        |¬«      |	|
||¬«      \  }}}h d£}|j%                  «       D ��ci c]  \  }}||vsŒ||“Œ }}}i |¥|¥|¥}||d<   ||d<   ||d<   |	|d<   |
|d<   ||d<   | j'                  |¬«      }|�t)        |«      dk(  r.|j                  d«       t+        j,                  di |¤Žƒ d {  –—† S  | j.                  di |¤Žƒ d {  –—† S c c}}w 7 Œ$7 Œ­w)NrØ  rã  )r`  Ú	rules_objrü  rd  rZ  ©rg  rò   rª  ©ré   r_  rª  r¯  r»  ré   zlitellm_agent/Ú	prompt_idÚprompt_variablesÚprompt_labelz*Prompt ID is not set or not a string. Got=z, type=z2Prompt variables is set but not a dictionary. Got=)r¤  )ré   r_  Únon_default_paramsrQ  rR  rS  r’  >   rQ  rS  Úprompt_versionÚbitbucket_configÚdotprompt_configrR  r_  rG  r   r`  r  )rà   r´   r³   r¸   r   ÚLiteLLMLoggingrº  r»  r¿  r™  rá   r  Ú
startswithr×   r¸  r3  Úget_chat_completion_promptr¶   r;  rI  r‰  rÍ  rã  r  )r4  ré   r_  r¤  Úlitellm_logging_objectÚprompt_management_deploymentræ  rK  Úis_litellm_agent_modelrQ  rR  rS  Úoptional_paramsÚprompt_management_paramsÚkÚvÚfiltered_dataÚ_model_lists                     rÙ   r  z!Router._prompt_management_factoryu  s  è ø€ ð "(§¡Ð,AÀ4Ó!HÐØ!Ð)Ü-;ñ .à)6Ü!&£Ü"2Ó"4ñð ð	ñ.Ñ*Ð" Fô "&¤nÐ6LÓ!MÐØ.2×.KÑ.KØØ%°(Ñ;Ð<Ø &§
¡
Ð+@À$Ó Gð /Ló /
Ð$ð 	×+Ñ+Ð7SÐ\bÐ+ÔcØ2Ð3CÑD×IÑIÓKˆà#Ÿx™x¨°Ó6ˆô )3°=Ä#Ó(FÒ(uÈ=×KcÑKcÐdtÓKuÐà—J‘J˜{Ó+ÒtÐ/KÐL\Ñ/]×/aÑ/aÐbmÐosÓ/tˆ	Ø"(§*¡*Ð-?Ó"@ò #
ÐD`ÐaqÑDr×DvÑDvØ óE
Ðð %Ÿj™j¨¸Ó>ò 
ÐB^Ð_oÑBp×BtÑBtØ˜DóC
ˆñ &¨9Ð+<ÄJÈyÔZ]ÔD^ÜÐIÈ)ÈÐT[Ô\`ÐajÓ\kÐ[lÐmÓnÐnØÐ'´
Ð;KÌTÔ0RÜØDÐEUÐDVÐV]Ô^bÐcsÓ^tÐ]uÐvóð ð #×=Ñ=ØØÜ@ÈÔOØØ-Ø%Ø!ð >ó 
ñ		
ØØØò+
Ð ð 26·±³×c©¨¨AÀÐJbÒAb  1¡ÐcˆÑcà?�MÐ? VÐ?¨Ð?ˆØˆˆw‰Ø%ˆˆzÑØ(>ˆÐ$Ñ%Ø'ˆˆ{ÑØ%5ˆÐ!Ñ"Ø!-ˆˆ~Ñà!×0Ñ0¸EÐ0ÓBˆØÐ¤# kÓ"2°aÒ"7Ø�J‰JÐ*Ô+Ü ×,Ñ,Ñ6¨vÑ6×6Ð6à7�T×7Ñ7ÑA¸&ÑA×AÐAùó  dð 7øàAús7   ‚GJÇJÇ+JÇ0A4JÉ$J	É%JÉ>JÉ?JÊJrZ  c                 óÊ   — 	 ||d<   ||d<   | j                   |d<   |j                  di «      j                  d|i«        | j                  di |¤Ž}|S # t        $ r}|‚d }~ww xY w)Nré   rZ  r`  rÄ  r…  r  )Ú_image_generationrþ  rÔ  r§  r�  ©r4  rZ  ré   r¤  r  r   s         rÙ   Úimage_generationzRouter.image_generationË  sz   € ð		Ø#ˆF�7‰OØ%ˆF�8ÑØ*.×*@Ñ*@ˆFÐ&Ñ'Ø×Ñ˜j¨"Ó-×4Ñ4°mÀUÐ5KÔLØ:˜d×:Ñ:ÑD¸VÑDˆHàˆOøÜò 	ØˆGûð	ús   ‚AA Á	A"ÁAÁA"c           	      ó€  — d}	 t        j                  d||«       | j                  |dddœg|j                  dd «      ¬«      }| j	                  ||¬«       |d	   j                  «       }| j                  ||¬«      }| j                  |xx   d
z  cc<   | j                  |¬«       t        j                  di i |¥|| j                  |dœ¥|¥¤Ž}| j                  |xx   d
z  cc<   t        j                  d|«       |S # t        $ r7}	t        j                  d||	«       |�| j                  |xx   d
z  cc<   |	‚d }	~	ww xY w)Nro  ú1Inside _image_generation()- model: %s; kwargs: %srd  rZ  rO  rª  rP  r¯  r»  r¼   r°  ©rZ  r²  r³  z2litellm.image_generation(model=%s)[32m 200 OK[0mz8litellm.image_generation(model=%s)[31m Exception %s[0mr  )r   rš  rº  r»  r¿  r™  r«  rù  rÁ  rÍ  rg  ri  rû  r  r�  rú  )
r4  rZ  ré   r¤  rf  r  ræ  rÎ  r  r   s
             rÙ   re  zRouter._image_generation×  sv  € Øˆ
ð$	Ü!×'Ñ'Ð([Ð]bÐdjÔkØ $× =Ñ =ØØ#)°hÑ?Ð@Ø$*§J¡JÐ/DÀdÓ$Kð !>ó !ˆJð
 ×/Ñ/¸:ÈfÐ/ÔUØ$Ð%5Ñ6×;Ñ;Ó=ˆDà"&×"EÑ"EØ%Øð #Fó #ˆLð
 ×Ñ˜ZÓ(¨AÑ-Ó(ð ×1Ñ1¸ZÐ1ÔHä%×6Ñ6ñ ðØðà$Ø#×3Ñ3Ø*ò	ð
 ðñˆHð ×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'aÐcmÔnØˆOøÜò 	Ü!×&Ñ&Ð'gÐisÐuvÔwØÐ%Ø—‘ 
Ó+¨qÑ0Ó+ØˆGûð		ús   „C8C= Ã=	D=Ä2D8Ä8D=c           	   ‹   ó.  K  — 	 ||d<   ||d<   | j                   |d<   | j                  ||¬«        | j                  di |¤Žƒ d {  –—† }|S 7 Œ# t        $ r;}t	        j
                  t        | |t        j                  «       |¬«      «       |‚d }~ww xY w­w)Nré   rZ  r`  r£  rÿ  r  )	Ú_aimage_generationr¦  r  r�  rä  r  rp   r  r  rf  s         rÙ   Úaimage_generationzRouter.aimage_generationÿ  s¨   è ø€ ð	Ø#ˆF�7‰OØ%ˆF�8ÑØ*.×*AÑ*AˆFÐ&Ñ'Ø×0Ñ0°uÀVÐ0ÔLØ$F D×$FÑ$FÑ$PÈÑ$P×PˆHàˆOð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üó;   ‚B„AA ÁAÁA ÁBÁA Á	BÁ6BÂBÂBc           	   ‹   ó  K  — |}	 t        j                  d||«       t        |«      }| j                  |dddœg|j	                  dd «      |¬«      ƒ d {  –—† }| j                  ||¬«       |d   j                  «       }|d	   }| j                  ||¬«      }| j                  |xx   d
z  cc<   t        j                  di i |¥|| j                  |dœ¥|¥¤Ž}	| j                  ||d¬«      }
|
�\t        |
t        j                  «      rB|
4 ƒd {  –—†  	 | j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	d d d «      ƒd {  –—†  n%| j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	| j"                  |xx   d
z  cc<   t        j$                  d|«       |	S 7 �ŒI7 Œ’7 Œx7 Œp7 Œb# 1 ƒd {  –—†7  sw Y   ŒLxY w7 Œ]7 ŒU# t&        $ r7}t        j$                  d||«       |�| j(                  |xx   d
z  cc<   |‚d }~ww xY w­w)Nri  rd  rZ  rO  rª  r«  r¯  r»  ré   r¼   rj  r§  r¨  r¦  z3litellm.aimage_generation(model=%s)[32m 200 OK[0mz9litellm.aimage_generation(model=%s)[31m Exception %s[0mr  )r   rš  r)   r¥  r»  r¿  r™  r«  rù  rÍ  rm  ri  rÀ  rá   rä  r¬  r­  rû  r  r�  rú  )r4  rZ  ré   r¤  rf  rþ  r  ræ  rÎ  r  r³  r   s               rÙ   rl  zRouter._aimage_generation  st  è ø€ Øˆ
ð<	Ü!×'Ñ'Ð([Ð]bÐdjÔkÜ&GÈÓ&OÐØ&*×&IÑ&IØØ#)°hÑ?Ð@Ø$*§J¡JÐ/DÀdÓ$KØ%ð	 'Jó '÷ !ˆJð ×/Ñ/¸:ÈfÐ/ÔUà$Ð%5Ñ6×;Ñ;Ó=ˆDØ˜g™ˆJà"&×"EÑ"EØ%Øð #Fó #ˆLð
 ×Ñ˜ZÓ(¨AÑ-Ó(Ü×0Ñ0ñ ðØðà$Ø#×3Ñ3Ø*ò	ð
 ðñˆHð $(×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .ðð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'bÐdnÔoØˆOði!ùðF.øð
øð  .øð.ø÷ .÷ .ñ .úðøð *ùô
 ò 	Ü!×&Ñ&Ð'hÐjtÐvwÔxØÐ%Ø—‘ 
Ó+¨qÑ0Ó+ØˆGûð		üsÆ   ‚H†AG ÁFÁB8G ÄF ÄG ÄF(Ä)F"Ä*	F(Ä3F$Ä4F(Ä8G ÅF&ÅG ÅF=Å 	G Å)F?Å*2G ÆHÆG Æ G Æ"F(Æ$F(Æ&G Æ(F:Æ.F1Æ/F:Æ6G Æ?G Ç	HÇ
2G<Ç<HÈHÚfilec           	   ‹   ó.  K  — 	 ||d<   ||d<   | j                   |d<   | j                  ||¬«        | j                  di |¤Žƒ d{  –—† }|S 7 Œ# t        $ r;}t	        j
                  t        | |t        j                  «       |¬«      «       |‚d}~ww xY w­w)aÒ  
        Example Usage:

        ```
        from litellm import Router
        client = Router(model_list = [
            {
                "model_name": "whisper",
                "litellm_params": {
                    "model": "whisper-1",
                },
            },
        ])

        audio_file = open("speech.mp3", "rb")
        transcript = await client.atranscription(
        model="whisper",
        file=audio_file
        )

        ```
        ré   rp  r`  r£  Nrÿ  r  )	Ú_atranscriptionr¦  r  r�  rä  r  rp   r  r  )r4  rp  ré   r¤  r  r   s         rÙ   ÚatranscriptionzRouter.atranscriptionS  s§   è ø€ ð.	Ø#ˆF�7‰OØ!ˆF�6‰NØ*.×*>Ñ*>ˆFÐ&Ñ'Ø×0Ñ0°uÀVÐ0ÔLØ$F D×$FÑ$FÑ$PÈÑ$P×PˆHàˆOð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		ürn  c           	   ‹   ó  K  — |}	 t        j                  d||«       t        |«      }| j                  |dddœg|j	                  dd «      |¬«      ƒ d {  –—† }| j                  ||¬«       |d   j                  «       }| j                  ||¬«      }| j                  |xx   d	z  cc<   t        j                  di i |¥|| j                  |d
œ¥|¥¤Ž}	| j                  ||d¬«      }
|
�\t        |
t        j                  «      rB|
4 ƒd {  –—†  	 | j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	d d d «      ƒd {  –—†  n%| j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	| j"                  |xx   d	z  cc<   t        j$                  d|«       |	S 7 �ŒD7 Œ’7 Œx7 Œp7 Œb# 1 ƒd {  –—†7  sw Y   ŒLxY w7 Œ]7 ŒU# t&        $ r7}t        j$                  d||«       |�| j(                  |xx   d	z  cc<   |‚d }~ww xY w­w)Nz/Inside _atranscription()- model: %s; kwargs: %srd  rZ  rO  rª  r«  r¯  r»  r¼   )rp  r²  r³  r§  r¨  r¦  z0litellm.atranscription(model=%s)[32m 200 OK[0mz6litellm.atranscription(model=%s)[31m Exception %s[0mr  )r   rš  r)   r¥  r»  r¿  r™  r«  rù  rÍ  rs  ri  rÀ  rá   rä  r¬  r­  rû  r  r�  rú  )r4  rp  ré   r¤  rf  rþ  r  ræ  rÎ  r  r³  r   s               rÙ   rr  zRouter._atranscription}  sk  è ø€ Ø!ˆ
ð:	Ü!×'Ñ'Ð(YÐ[`ÐbhÔiÜ&GÈÓ&OÐØ&*×&IÑ&IØØ#)°hÑ?Ð@Ø$*§J¡JÐ/DÀdÓ$KØ%ð	 'Jó '÷ !ˆJð ×/Ñ/¸:ÈfÐ/ÔUØ$Ð%5Ñ6×;Ñ;Ó=ˆDØ"&×"EÑ"EØ%Øð #Fó #ˆLð
 ×Ñ˜ZÓ(¨AÑ-Ó(Ü×-Ñ-ñ ðØðà Ø#×3Ñ3Ø*ò	ð
 ðñˆHð $(×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .ðð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'_ÐakÔlØˆOðe!ùðB.øð
øð  .øð.ø÷ .÷ .ñ .úðøð *ùô
 ò 	Ü!×&Ñ&Ð'eÐgqÐstÔuØÐ%Ø—‘ 
Ó+¨qÑ0Ó+ØˆGûð		üsÆ   ‚G?†AF< ÁFÁB3F< ÄFÄ	F< ÄF#Ä$FÄ%	F#Ä.FÄ/F#Ä3F< Ä>F!Ä?F< ÅF8Å	F< Å$F:Å%2F< ÆG?ÆF< ÆF< ÆF#ÆF#Æ!F< Æ#F5Æ)F,Æ*F5Æ1F< Æ:F< Æ<	G<Ç2G7Ç7G<Ç<G?Úvoicec           	   ‹   ó8  K  — 	 ||d<   ||d<   ||d<   | j                   |d<   | j                  ||¬«        | j                  di |¤Žƒ d{  –—† }|S 7 Œ# t        $ r;}t	        j
                  t        | |t        j                  «       |¬«      «       |‚d}~ww xY w­w)	añ  
        Example Usage:

        ```
        from litellm import Router
        client = Router(model_list = [
            {
                "model_name": "tts",
                "litellm_params": {
                    "model": "tts-1",
                },
            },
        ])

        async with client.aspeech(
            model="tts",
            voice="alloy",
            input="the quick brown fox jumped over the lazy dogs",
            api_base=None,
            api_key=None,
            organization=None,
            project=None,
            max_retries=1,
            timeout=600,
            client=None,
            optional_params={},
        ) as response:
            response.stream_to_file(speech_file_path)

        ```
        ré   r�  ru  r`  r£  Nrÿ  r  )	Ú_aspeechr¦  r  r�  rä  r  rp   r  r  )r4  ré   r�  ru  r¤  r  r   s          rÙ   ÚaspeechzRouter.aspeech»  s¯   è ø€ ð@	Ø#ˆF�7‰OØ#ˆF�7‰OØ#ˆF�7‰OØ*.¯-©-ˆFÐ&Ñ'Ø×0Ñ0°uÀVÐ0ÔLØ$F D×$FÑ$FÑ$PÈÑ$P×PˆHàˆOð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üs;   ‚B„AA Á
AÁA ÁBÁA Á	BÁ6BÂBÂBc           	   ‹   óî  K  — |}	 t        j                  d||«       t        |«      }| j                  |dddœg|j	                  dd «      |¬«      ƒ d {  –—† }| j                  ||¬«       |d   j                  «       }| j                  ||¬«      }	| j                  |xx   d	z  cc<   t        j                  di i |¥|||	d
œ¥|¥¤Ž}
| j                  ||d¬«      }|�\t        |t        j                  «      rB|4 ƒd {  –—†  	 | j                  ||¬«      ƒ d {  –—†  |
ƒ d {  –—† }
d d d «      ƒd {  –—†  n%| j                  ||¬«      ƒ d {  –—†  |
ƒ d {  –—† }
| j                   |xx   d	z  cc<   t        j"                  d|«       |
S 7 �Œ:7 Œ’7 Œx7 Œp7 Œb# 1 ƒd {  –—†7  sw Y   ŒLxY w7 Œ]7 ŒU# t$        $ r7}t        j"                  d||«       |�| j&                  |xx   d	z  cc<   |‚d }~ww xY w­w)Nz(Inside _aspeech()- model: %s; kwargs: %srd  rZ  rO  rª  r«  r¯  r»  r¼   )r�  ru  r³  r§  r¨  r¦  z)litellm.aspeech(model=%s)[32m 200 OK[0mz/litellm.aspeech(model=%s)[31m Exception %s[0mr  )r   rš  r)   r¥  r»  r¿  r™  r«  rù  rÍ  rx  rÀ  rá   rä  r¬  r­  rû  r  r�  rú  )r4  ré   r�  ru  r¤  rf  rþ  r  ræ  rÎ  r  r³  r   s                rÙ   rw  zRouter._aspeechï  sc  è ø€ Ø!ˆ
ð:	Ü!×'Ñ'Ð(RÐTYÐ[aÔbÜ&GÈÓ&OÐØ&*×&IÑ&IØØ#)°hÑ?Ð@Ø$*§J¡JÐ/DÀdÓ$KØ%ð	 'Jó '÷ !ˆJð ×/Ñ/¸:ÈfÐ/ÔUØ$Ð%5Ñ6×;Ñ;Ó=ˆDØ"&×"EÑ"EØ%Øð #Fó #ˆLð
 ×Ñ˜ZÓ(¨AÑ-Ó(Ü—‘ñ ðØðà"Ø"Ø*ò	ð
 ðñˆHð $(×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .ðð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'XÐZdÔeØˆOðe!ùðB.øð
øð  .øð.ø÷ .÷ .ñ .úðøð *ùô
 ò 	Ü!×&Ñ&Ð'^Ð`jÐlmÔnØÐ%Ø—‘ 
Ó+¨qÑ0Ó+ØˆGûð		üsÆ   ‚G5†AF2 ÁFÁB)F2 Ã>FÃ?F2 ÄFÄFÄ	FÄ$FÄ%FÄ)F2 Ä4FÄ5F2 ÅF.Å	F2 ÅF0Å2F2 ÆG5ÆF2 ÆF2 ÆFÆFÆF2 ÆF+ÆF"Æ F+Æ'F2 Æ0F2 Æ2	G2Æ;2G-Ç-G2Ç2G5c           	   ‹   ó6  K  — 	 ||d<   t         |d<   | j                  |d<   | j                  ||¬«        | j                  di |¤Žƒ d {  –—† }|S 7 Œ# t        $ r;}t        j                  t        | |t        j                  «       |¬«      «       |‚d }~ww xY w­w©Nré   r�  r`  r£  rÿ  r  )
r�  Ú_arerankr¦  r  r�  rä  r  rp   r  r  ©r4  ré   r¤  r  r   s        rÙ   ÚarerankzRouter.arerank-  s¥   è ø€ ð	Ø#ˆF�7‰OÜ#ˆF�7‰OØ*.¯-©-ˆFÐ&Ñ'Ø×0Ñ0°uÀVÐ0ÔLà$F D×$FÑ$FÑ$PÈÑ$P×PˆHàˆOð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üs;   ‚B„AA Á	AÁ
A ÁBÁA Á	BÁ6BÂBÂBc              ‹   óŒ  K  — d }	 t        j                  d||«       | j                  ||j                  dd «      |¬«      ƒ d {  –—† }| j	                  ||¬«       |d   j                  «       }|d   }| j                  ||¬«      }| j                  |xx   dz  cc<   t        j                  di i |¥| j                  |dœ¥|¥¤Žƒ d {  –—† }| j                  |xx   dz  cc<   t        j                  d	|«       |S 7 Œ¸7 Œ5# t        $ r7}t        j                  d
||«       |�| j                  |xx   dz  cc<   |‚d }~ww xY w­w)Nz'Inside _rerank()- model: %s; kwargs: %srª  )ré   rª  r’  r¯  r»  ré   r¼   )r²  r³  z)litellm.arerank(model=%s)[32m 200 OK[0mz/litellm.arerank(model=%s)[31m Exception %s[0mr  )r   rš  r¥  r»  r¿  r™  r«  rù  rÍ  r~  ri  rû  r  r�  rú  )	r4  ré   r¤  rf  r  ræ  rÎ  r  r   s	            rÙ   r|  zRouter._arerankB  sz  è ø€ Øˆ
ð!	Ü!×'Ñ'Ð(QÐSXÐZ`ÔaØ&*×&IÑ&IØØ$*§J¡JÐ/DÀdÓ$KØ%ð 'Jó '÷ !ˆJð
 ×/Ñ/¸:ÈfÐ/ÔUØ$Ð%5Ñ6×;Ñ;Ó=ˆDØ˜g™ˆJà"&×"EÑ"EØ%Øð #Fó #ˆLð ×Ñ˜ZÓ(¨AÑ-Ó(ä$+§O¡Oñ %ðØðà#×3Ñ3Ø*òð ð	ñ%÷ ˆHð ×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'XÐZdÔeØˆOð5!øðùô ò 	Ü!×&Ñ&Ð'^Ð`jÐlmÔnØÐ%Ø—‘ 
Ó+¨qÑ0Ó+ØˆGûð		üsM   ‚E†>D ÁC=ÁBD Ã	C?Ã
2D Ã<EÃ=D Ã?D Ä	EÄ
2D<Ä<EÅEÚis_retryÚis_fallbackÚis_asyncc                 ó  — d|dœg}	 ||d<   ||d<   |j                  d| j                  «      |d<   |j                  di «      j                  d|i«       | j	                  |||j                  dd «      ¬	«      }|d
   j                  «       }	| j                  j                  «       D ])  \  }
}|
|vr|||
<   Œ|
dk(  sŒ||
   j                  |«       Œ+ t        j                  di i |	¥|| j                  dœ¥|¥¤ŽS # t        $ r}|‚d }~ww xY w)Nrd  rO  ré   rZ  r  rÄ  r…  rª  rP  r»  )rZ  r²  r  )rà   r  rþ  rÔ  rº  r»  r™  rƒ  r;  rÍ  Útext_completionri  r�  )r4  ré   rZ  r€  r�  r‚  r¤  r_  r  ræ  r`  ra  r   s                rÙ   r„  zRouter.text_completiong  s6  € ð %+°vÑ>Ð?ˆð	Ø#ˆF�7‰OØ%ˆF�8ÑØ$*§J¡J¨}¸d×>NÑ>NÓ$OˆF�=Ñ!Ø×Ñ˜j¨"Ó-×4Ñ4°mÀUÐ5KÔLð !%× =Ñ =ØØ!Ø$*§J¡JÐ/DÀdÓ$Kð !>ó !ˆJð %Ð%5Ñ6×;Ñ;Ó=ˆDØ×3Ñ3×9Ñ9Ó;ò (‘��1Ø˜F‘?Ø !�F˜1’IØ˜*“_Ø˜1‘I×$Ñ$ QÕ'ð	(ô ×*Ñ*ÑsÐ-r°Ð-rÀÐSW×SgÑSgÒ-rÐkqÐ-rÑsÐsøÜò 	ØˆGûð	ús   ˆB2C9 Â;=C9 Ã9	D	ÄDÄD	c           	   ‹   óÈ  K  — |j                  dd «      �9| j                  ||j                  d«      | j                  ||f|¬«      ƒ d {  –—† S 	 ||d<   ||d<   | j                  |d<   | j                  ||¬«        | j                  di |¤Žƒ d {  –—† }|S 7 ŒM7 Œ# t        $ r;}t        j                  t        | |t        j                  «       |¬«      «       |‚d }~ww xY w­w)	Nrø  )ré   rø  r`  r'  r¤  ré   rZ  r`  r£  rÿ  r  )rà   rE  r»  Úatext_completionÚ_atext_completionr¦  r  r�  rä  r  rp   r  r  )	r4  ré   rZ  r€  r�  r‚  r¤  r  r   s	            rÙ   r†  zRouter.atext_completionŠ  s   è ø€ ð �:‰:�j $Ó'Ð3Ø×/Ñ/ØØŸ™ JÓ/Ø"&×"7Ñ"7Ø˜V�_Øð 0ó ÷ ð ð	Ø#ˆF�7‰OØ%ˆF�8ÑØ*.×*@Ñ*@ˆFÐ&Ñ'à×0Ñ0°uÀVÐ0ÔLØ$F D×$FÑ$FÑ$PÈÑ$P×PˆHàˆOðøð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üsI   ‚AC"Á	BÁ
C"ÁAB ÂBÂB ÂC"ÂB Â	CÂ$6CÃCÃC"c           	   ‹   ó  K  — 	 t        j                  d||«       t        |«      }| j                  |d|dœg|j	                  dd «      |¬«      ƒ d {  –—† }| j                  ||¬«       |d   j                  «       }|d   }| j                  ||¬«      }| j                  |xx   d	z  cc<   t        j                  di i |¥|| j                  |d
œ¥|¥¤Ž}	| j                  ||d¬«      }
|
�\t        |
t        j                  «      rB|
4 ƒd {  –—†  	 | j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	d d d «      ƒd {  –—†  n%| j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	| j"                  |xx   d	z  cc<   t        j$                  d|«       |	S 7 �ŒI7 Œ’7 Œx7 Œp7 Œb# 1 ƒd {  –—†7  sw Y   ŒLxY w7 Œ]7 ŒU# t&        $ r7}t        j$                  d||«       |�| j(                  |xx   d	z  cc<   |‚d }~ww xY w­w)Nú1Inside _atext_completion()- model: %s; kwargs: %srd  rO  rª  r«  r¯  r»  ré   r¼   rj  r§  r¨  r¦  z2litellm.atext_completion(model=%s)[32m 200 OK[0mz8litellm.atext_completion(model=%s)[31m Exception %s[0mr  )r   rš  r)   r¥  r»  r¿  r™  r«  rù  rÍ  r†  ri  rÀ  rá   rä  r¬  r­  rû  r  r�  rú  )r4  ré   rZ  r¤  rþ  r  ræ  rf  rÎ  r  r³  r   s               rÙ   r‡  zRouter._atext_completion¯  so  è ø€ ð;	Ü!×'Ñ'Ð([Ð]bÐdjÔkÜ&GÈÓ&OÐØ&*×&IÑ&IØØ#)°fÑ=Ð>Ø$*§J¡JÐ/DÀdÓ$KØ%ð	 'Jó '÷ !ˆJð ×/Ñ/¸:ÈfÐ/ÔUà$Ð%5Ñ6×;Ñ;Ó=ˆDØ $ W¡ˆJà"&×"EÑ"EØ%Øð #Fó #ˆLð ×Ñ˜ZÓ(¨AÑ-Ó(ä×/Ñ/ñ ðØðà$Ø#×3Ñ3Ø*ò	ð
 ðñˆHð $(×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .ðð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'aÐcmÔnØˆOðg!ùðD.øð
øð  .øð.ø÷ .÷ .ñ .úðøð *ùô
 ò 	Ü!×&Ñ&Ð'gÐinÐpqÔrØÐ Ø—‘ Ó&¨!Ñ+Ó&ØˆGûð		üóÆ   ‚H„AF? ÁFÁB8F? ÄFÄF? ÄF&Ä'F Ä(	F&Ä1F"Ä2F&Ä6F? ÅF$ÅF? ÅF;Å	F? Å'F=Å(2F? ÆHÆF? ÆF? Æ F&Æ"F&Æ$F? Æ&F8Æ,F/Æ-F8Æ4F? Æ=F? Æ?	G?Ç2G:Ç:G?Ç?HÚ
adapter_idc           	   ‹   óN  K  — 	 ||d<   ||d<   | j                   |d<   |j                  di «      j                  d|i«        | j                  di |¤Žƒ d {  –—† }|S 7 Œ# t        $ r;}t        j                  t        | |t        j                  «       |¬«      «       |‚d }~ww xY w­w)Nré   r‹  r`  rÄ  r…  rÿ  r  )
Ú_aadapter_completionrþ  rÔ  r  r�  rä  r  rp   r  r  )	r4  r‹  ré   r€  r�  r‚  r¤  r  r   s	            rÙ   Úaadapter_completionzRouter.aadapter_completioní  sµ   è ø€ ð	Ø#ˆF�7‰OØ#-ˆF�<Ñ Ø*.×*CÑ*CˆFÐ&Ñ'Ø×Ñ˜j¨"Ó-×4Ñ4°mÀUÐ5KÔLØ$F D×$FÑ$FÑ$PÈÑ$P×PˆHàˆOð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üs;   ‚B%„AA ÁAÁA ÁB%ÁA Á	B"Á'6BÂB"Â"B%c           	   ‹   ó  K  — 	 t        j                  d||«       t        |«      }| j                  |dddœg|j	                  dd «      |¬«      ƒ d {  –—† }| j                  ||¬«       |d   j                  «       }|d	   }| j                  ||¬«      }| j                  |xx   d
z  cc<   t        j                  di i |¥|| j                  |dœ¥|¥¤Ž}	| j                  ||d¬«      }
|
�\t        |
t        j                  «      rB|
4 ƒd {  –—†  	 | j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	d d d «      ƒd {  –—†  n%| j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	| j"                  |xx   d
z  cc<   t        j$                  d|«       |	S 7 �ŒI7 Œ’7 Œx7 Œp7 Œb# 1 ƒd {  –—†7  sw Y   ŒLxY w7 Œ]7 ŒU# t&        $ r7}t        j$                  d||«       |�| j(                  |xx   d
z  cc<   |‚d }~ww xY w­w)Nz4Inside _aadapter_completion()- model: %s; kwargs: %srd  zdefault textrO  rª  r«  r¯  r»  ré   r¼   )r‹  r²  r³  r§  r¨  r¦  z5litellm.aadapter_completion(model=%s)[32m 200 OK[0mz;litellm.aadapter_completion(model=%s)[31m Exception %s[0mr  )r   rš  r)   r¥  r»  r¿  r™  r«  rù  rÍ  rŽ  ri  rÀ  rá   rä  r¬  r­  rû  r  r�  rú  )r4  r‹  ré   r¤  rþ  r  ræ  rf  rÎ  r  r³  r   s               rÙ   r�  zRouter._aadapter_completion	  so  è ø€ ð;	Ü!×'Ñ'Ð(^Ð`eÐgmÔnÜ&GÈÓ&OÐØ&*×&IÑ&IØØ#)°nÑEÐFØ$*§J¡JÐ/DÀdÓ$KØ%ð	 'Jó '÷ !ˆJð ×/Ñ/¸:ÈfÐ/ÔUà$Ð%5Ñ6×;Ñ;Ó=ˆDØ $ W¡ˆJà"&×"EÑ"EØ%Øð #Fó #ˆLð ×Ñ˜ZÓ(¨AÑ-Ó(ä×2Ñ2ñ ðØðà",Ø#×3Ñ3Ø*ò	ð
 ðñˆHð $(×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .ðð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'dÐfpÔqØˆOðg!ùðD.øð
øð  .øð.ø÷ .÷ .ñ .úðøð *ùô
 ò 	Ü!×&Ñ&Ð'jÐlqÐstÔuØÐ Ø—‘ Ó&¨!Ñ+Ó&ØˆGûð		ürŠ  c              ‹   óT   K  — ddl m}  |j                  d| |dœ|¤Žƒ d{  –—† S 7 Œ­w)z¬
        Helper function to make a search API call through the router with load balancing and fallbacks.
        Reuses the router's retry/fallback infrastructure.
        r   ©ÚSearchAPIRouter)Úrouter_instancer`  Nr  )Ú&litellm.router_utils.search_api_routerr’  Úasync_search_with_fallbacks)r4  r`  r¤  r’  s       rÙ   Ú_asearch_with_fallbackszRouter._asearch_with_fallbacksG  s@   è ø€ õ
 	Kà@�_×@Ñ@ð 
Ø Ø/ñ
ð ñ
÷ 
ð 	
ð 
ús   ‚(¡&¢(Úoriginal_generic_functionc              ‹   óV   K  — ddl m}  |j                  d| ||dœ|¤Žƒ d{  –—† S 7 Œ­w)z·
        Helper function for search API calls - selects a search tool and calls the original function.
        Called by async_function_with_fallbacks for each retry attempt.
        r   r‘  )r“  ré   r—  Nr  )r”  r’  Ú"async_search_with_fallbacks_helper)r4  ré   r—  r¤  r’  s        rÙ   Ú_asearch_with_fallbacks_helperz%Router._asearch_with_fallbacks_helperT  sC   è ø€ õ
 	KàG�_×GÑGð 
Ø ØØ&?ñ
ð ñ	
÷ 
ð 	
ð 
úó   ‚ )¢'£)Úguardrail_namec              ‹   óÎ   K  — ||d<   ||d<   | j                   |d<   | j                  ||d¬«       t        j                  d||«        | j                  di |¤Žƒ d{  –—† }|S 7 Œ­w)	aw  
        Execute a guardrail with load balancing and fallbacks.

        Args:
            guardrail_name: Name of the guardrail to execute
            original_function: The guardrail's execution function (e.g., async_pre_call_hook)
            **kwargs: Additional arguments passed to the guardrail

        Returns:
            Result from the guardrail execution
        ré   r—  r`  ru  rˆ  z4Inside aguardrail() - guardrail_name: %s; kwargs: %sNr  )Ú_aguardrail_helperr¦  r   rš  r  )r4  rœ  r`  r¤  r  s        rÙ   Ú
aguardrailzRouter.aguardrailb  sƒ   è ø€ ð" )ˆˆw‰Ø.?ˆÐ*Ñ+Ø&*×&=Ñ&=ˆÐ"Ñ#Ø×,Ñ,Ø ØØ#5ð 	-ô 	
ô
 	×#Ñ#Ð$ZÐ\jÐlrÔsØ B × BÑ BÑ LÀVÑ L×LˆØˆð Múó   ‚AA%ÁA#ÁA%c              ‹   óÎ   K  — |}| j                  |¬«      }t        j                  d|j                  di «      j                  d«      «       ||d<    |di |¤Žƒ d{  –—† }|S 7 Œ­w)a}  
        Helper for aguardrail - selects a guardrail deployment and executes it.
        Called by async_function_with_fallbacks for each retry attempt.

        Args:
            model: The guardrail_name (named 'model' for fallback system compatibility)
            original_generic_function: The guardrail's execution function
            **kwargs: Additional arguments
        )rœ  z!Selected guardrail deployment: %sr»  Ú	guardrailÚselected_guardrailNr  )Úget_available_guardrailr   rš  rà   )r4  ré   r—  r¤  rœ  r£  r  s          rÙ   rž  zRouter._aguardrail_helper  s€   è ø€ ð !&ˆØ$(×$@Ñ$@Ø)ð %Aó %
Ðô 	×#Ñ#Ø/Ð1C×1GÑ1GÐHXÐZ\Ó1]×1aÑ1aÐbmÓ1nô	
ð
 (:ˆÐ#Ñ$Ù 9Ñ C¸FÑ C×CˆØˆð Dúr   r�   c                 óì   — ddl m} | j                  D �cg c]  }|j                  d«      |k(  sŒ|‘Œ }}|st	        d|› �«      ‚t        |«      dk(  r|d   S t        t         || ||¬«      «      S c c}w )zê
        Select a guardrail deployment using the router's load balancing strategy.

        Args:
            guardrail_name: Name of the guardrail to select

        Returns:
            Selected guardrail configuration dict
        r   rF   rœ  zNo guardrail found with name: r¼   ©Úllm_router_instancerì  ré   )Ú&litellm.router_strategy.simple_shufflerG   rt  rà   r×   r‰  r   r�   )r4  rœ  rG   Úgrì  s        rÙ   r¤  zRouter.get_available_guardrailœ  s�   € õ 	Jà15×1DÑ1DÖ%r¨AÈÏÉÐN^ÓH_ÐcqÓHq¢aÐ%rÐÐ%rá"ÜÐ=¸nÐ=MÐNÓOÐOäÐ"Ó# qÒ(Ø& qÑ)Ð)ô ÜÙØ$(Ø$7Ø$ôó
ð 	
ùò &ss
   •A1¯A1c           	   ‹   ó^  K  — 	 ||d<   ||d<   | j                   |d<   | j                  ||d¬«       t        j                  d||«        | j                  d	i |¤Žƒ d{  –—† }|S 7 Œ# t
        $ r;}t        j                  t        | |t        j                  «       |¬«      «       |‚d}~ww xY w­w)
ú‘
        Helper function to make a generic LLM API call through the router, this allows you to use retries/fallbacks with litellm router
        ré   r—  r`  ru  rˆ  zAInside ageneric_api_call_with_fallbacks() - model: %s; kwargs: %sNrÿ  r  )rŠ  r¦  r   rš  r  r�  rä  r  rp   r  r  )r4  ré   r`  r¤  r  r   s         rÙ   râ  z(Router._ageneric_api_call_with_fallbacks½  sÆ   è ø€ ð	Ø#ˆF�7‰OØ2CˆFÐ.Ñ/Ø*.×*WÑ*WˆFÐ&Ñ'Ø×0Ñ0°uÀVÐdvÐ0ÔwÜ!×'Ñ'ØSÐUZÐ\bôð %G D×$FÑ$FÑ$PÈÑ$P×PˆHØˆOð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üs;   ‚B-„AA& ÁA$ÁA& Á#B-Á$A& Á&	B*Á/6B%Â%B*Â*B-c                 óØ   — d|v rT|d   rOddl m} 	  |||j                  d«      |j                  d«      ¬«      \  }}}}|}|d   j	                  ||«      |d<   |S # t        $ r |}Y Œ'w xY w)a  
        Add the deployment model to the endpoint for LLM passthrough route.

        e.g for bedrock invoke users can pass endpoint as /model/special-bedrock-model/invoke
          it should be actually sent as /model/us.anthropic.claude-3-5-sonnet-20240620-v1:0/invoke
        Úendpointr   )rµ   r&  rë   ©ré   r&  rë   )rÍ  rµ   rà   r�  Úreplace)r4  r¤  ré   rf  rµ   Ústripped_model_namer  Úreplacement_model_names           rÙ   Ú;_add_deployment_model_to_endpoint_for_llm_passthrough_routezBRouter._add_deployment_model_to_endpoint_for_llm_passthrough_routeØ  s�   € ð ˜Ñ F¨:Ò$6õ 1ð
4á/?Ø$Ø(.¯
©
Ð3HÓ(IØ#ŸZ™Z¨
Ó3ô0Ñ,Ð# Q¨¨1ð
 *=Ð&ð
 "(¨
Ñ!3×!;Ñ!;¸EÐCYÓ!ZˆF�:ÑØˆøô ò 4à)3Ò&ð4ús   ‘0A ÁA)Á(A)c           
   ‹   óD  K  — |j                  dd«      }d}d}	 t        |«      }	 | j                  |||j                  dd«      |j                  dd«      |j                  dd«      ¬«      ƒ d{  –—† }| j                  |||¬
«       |d   j                  «       }	|	d	   }
| j                  |
xx   dz  cc<   | j                  |||
¬«       	 |	j                  d«      }t        |	d	   |¬«      \  }}}}|xs |}i |	¥d| j                  i¥|¥d	|
i¥}|�||d<    |di |¤Ž}| j                  ||d¬«      }|�\t        |t        j                  «      rB|4 ƒd{  –—†  	 | j                  ||¬«      ƒ d{  –—†  |ƒ d{  –—† }ddd«      ƒd{  –—†  n%| j                  ||¬«      ƒ d{  –—†  |ƒ d{  –—† }| j                   |
xx   dz  cc<   t#        j$                  d|
«       |S 7 �Œv# t        $ r!}|r |dd	|i|¤Žƒ d{  –—†7  cY d}~S |‚d}~ww xY w# t        $ r d}Y �Œ+w xY w7 ŒÑ7 Œ·7 Œ¯7 Œ¡# 1 ƒd{  –—†7  sw Y   Œ‹xY w7 Œœ7 Œ”# t        $ rL}t#        j$                  d||«       |�| j&                  |xx   dz  cc<   |�| j)                  |||«       |‚d}~ww xY w­w)r«  Úpassthrough_on_no_deploymentFrâ  Nr_  r�  rª  ©ré   r’  r_  r�  rª  ré   rÝ  r»  r¼   )r¤  ré   rf  r&  ©ré   r&  r²  r§  r¨  r¦  z:ageneric_api_call_with_fallbacks(model=%s)[32m 200 OK[0mz@ageneric_api_call_with_fallbacks(model=%s)[31m Exception %s[0mr  )r»  r)   r¥  rà   r�  r¿  r™  rù  r²  rµ   ri  rÀ  rá   rä  r¬  r­  rû  r   r  rú  rÉ  )r4  ré   r—  r¤  r´  rÇ  r  rþ  r   ræ  rf  r&  r  Úinferred_custom_llm_providerÚresponse_kwargsr  r³  s                    rÙ   rŠ  z/Router._ageneric_api_call_with_fallbacks_helperõ  sH  è ø€ ð
 /5¯j©jÐ9WÐY^Ó._Ð$ØBˆØˆ
ðR	Ü&GÈÓ&OÐðØ#'×#FÑ#FØØ#)Ø#ŸZ™Z¨
°DÓ9Ø Ÿ*™* W¨dÓ3Ø(.¯
©
Ð3HÈ$Ó(Oð $Gó $÷ �
ð ×/Ñ/¸:ÈfÐdqÐ/Ôrà$Ð%5Ñ6×;Ñ;Ó=ˆDØ $ W¡ˆJØ×Ñ˜ZÓ(¨AÑ-Ó(à×LÑLØ U°zð Mô ð
+Ø&*§h¡hÐ/DÓ&EÐ#Ü8HØ˜w™-Ø(;ô9Ñ5�Ð/°°Að ':Ò&YÐ=YÐ#ð&Øð&à˜4×/Ñ/ñ&ð ð&ð ˜ñ	&ˆOð #Ð.Ø9L�Ð 5Ñ6á0ÑC°?ÑCˆHà#'×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .ðð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'iÐkuÔvàˆOðMúô ò Ù/Ù!:Ñ!QÀÐ!QÈ&Ñ!Q×QÐQÕQØ�ûðûô. ò +Ø&*Ó#ð+úð,.øð
øð  .øð.ø÷ .÷ .ñ .úðøð *ùô ò 	Ü!×&Ñ&ØXÐZ_Ðabôð Ð Ø—‘ Ó&¨!Ñ+Ó&ØÐ%Ø×JÑJÈ1ÈjÐZ`ÔaØˆGûð	üs-  ‚J šI ¦A	G( Á/G%Á0G( Á4AI Ã,H Ã8AI ÅH'ÅI ÅH/Å1H)Å2	H/Å;H+Å<H/Æ I ÆH-ÆI Æ'IÆ(	I Æ1IÆ22I Ç$J Ç%G( Ç(	HÇ1HÈ HÈHÈHÈI È
J ÈHÈHÈI ÈH$È I È#H$È$I È)H/È+H/È-I È/IÈ5H8È6IÈ=I ÉI É	JÉAJÊJÊJ )rÏ   rÂ   c              ‹   ó´  K  — ddl m} ddlm} |j	                  «       }t        |j                  d«      t        «      r ||d   «      |d<   t        |j                  d«      t        «      r ||d   «      |d<   ||d<    | j                  dd|i|¤Žƒ d{  –—† }|j                  d	«      r't        ||«      r| j                  ||¬
«      ƒ d{  –—† S |S 7 Œ>7 Œ­w)a�  
        _ageneric_api_call_with_fallbacks for the Responses API, with the
        addition of mid-stream fallback handling.

        When stream=True and the underlying call returns a
        BaseResponsesAPIStreamingIterator, wrap it with
        _aresponses_streaming_iterator so MidStreamFallbackError raised
        during iteration triggers the Router's cross-provider fallback chain.
        r   rÒ  rÁ   ru  rÄ  r—  r`  NrÖ  ©r  r¹  r  )
rÚ  rÓ  r�  rÂ   r™  rá   rà   r3  râ  r“  )r4  r`  r¤  rÓ  rÂ   Úfallback_kwargsr  s          rÙ   Ú$_aresponses_with_streaming_fallbacksz+Router._aresponses_with_streaming_fallbacksQ  sé   è ø€ õ 	Kõ	
ð& 5;·K±K³MˆÜ�o×)Ñ)Ð*<Ó=¼tÔDÙ2@ÀÐQcÑAdÓ2eˆOÐ.Ñ/Ü�o×)Ñ)¨*Ó5´tÔ<Ù*8¸ÈÑ9TÓ*UˆO˜JÑ'Ø7HˆÐ3Ñ4à F × FÑ FÑ uÐYjÐ uÐntÑ u×uˆà�:‰:�hÔ¤J¨xÐ9ZÔ$[Ø×<Ñ<Ø!Ø.ð =ó ÷ ð ð ˆð vøðús$   ‚BCÂCÂ7CÃCÃCÃCc              ƒ   ó„   ‡ ‡‡‡‡‡K  — ddl mŠmŠ |Šdt        t        df   fˆˆˆˆ ˆˆfd„}t         |«       ‰«      Š‰S ­w)aŠ	  
        Wrap an anthropic_messages (/v1/messages) streaming response so a
        mid-stream provider error triggers the Router's fallback chain
        (parity with _acompletion_streaming_iterator for the
        chat-completions path). See #24004.

        anthropic_messages goes through _ageneric_api_call_with_fallbacks
        rather than _acompletion, so the returned byte iterator is never
        wrapped by the chat-completions fallback handler. Two failure
        shapes land here:
          - the completion-bridge path (deployments with no native
            /v1/messages endpoint, via
            LiteLLMMessagesToCompletionTransformationHandler) already
            raises MidStreamFallbackError out of its underlying
            CustomStreamWrapper; this wrapper only needs to catch it.
          - a native Anthropic/Bedrock passthrough never raises anything
            for a provider SSE `event: error` frame (e.g. `overloaded_error`,
            `internal_server_error`) - it is forwarded to the client as-is -
            so this wrapper detects it via parse_anthropic_error_event and
            raises MidStreamFallbackError itself.

        Only an error before any real content (a content_block_delta frame)
        has reached the caller triggers a fallback attempt, mirroring the
        restriction _acompletion_streaming_iterator applies: once generated
        output has already reached the caller, retrying would start a
        second, overlapping Anthropic message lifecycle on the same SSE
        stream, so the error is left to propagate instead of being retried
        invisibly. A non-retriable client error (4xx other than 429) is
        never worth a fallback attempt either, so it is also left to
        propagate.

        Lifecycle/bookkeeping frames (message_start, content_block_start,
        ping, ...) do not by themselves disqualify a fallback attempt -
        Anthropic routinely sends message_start before an overload error -
        but they are BUFFERED rather than forwarded immediately, since
        forwarding one and then appending a fallback attempt's own
        message_start would produce two overlapping message lifecycles on
        one SSE stream. Buffered frames are flushed, in order, the moment
        real content arrives (the primary attempt has committed by then
        anyway) or once the stream ends without ever producing content or
        an error.
        r   )Úaclose_if_supportedÚparse_anthropic_error_eventrÒ   Nc                 ó`  •K  — ddl m}  d}d}t        t        ‰j	                  d«      «      }	 ‰2 3 d {  –—† }t        ||t        |«      «      r|­–— Œ%t        ||«      rŒ2t        ||t        |«      «      rd} ‰|«      }| xr" |d uxr t        |d   «      xr t        |«       }|s|s
|€g |¢|‘­}Œ‡|r8|€J ‚|\  }}}	 | ||dt        j                  j                  |	|d|¬	«      d¬
«      ‚|D ]  }
|
­–— Œ	 d}|­–— ŒÕ7 ŒÐ6 |D ]  }
|
­–— Œ	 n=# t        $ r1}‰j                  ||||‰‰«      2 3 d {  –—†7  }|­–— Œ6 Y d }~nd }~ww xY wt!        j"                  d¬«      5  t%        j&                  t(        «      5   ‰‰«      ƒ d {  –—†7   d d d «       n# 1 sw Y   nxY wd d d «       y # 1 sw Y   y xY w# t!        j"                  d¬«      5  t%        j&                  t(        «      5   ‰‰«      ƒ d {  –—†7   d d d «       n# 1 sw Y   nxY wd d d «       w # 1 sw Y   w xY wxY w­w)Nr   r¿   Fr  ré   Tr–  r!  )r  r#  r$  ré   r"  r9  )r&  rÀ   r   r  rà   r
  r‰  r  r*  r  r  rÍ  Ú
exceptionsÚAPIErrorr�  Ú)_aanthropic_messages_recover_stream_errorr@  rA  Ú
contextlibÚsuppressrB  )rÀ   r  Úbuffered_lifecycle_chunksré   rý   Úerror_eventÚretriable_pending_errorÚ_error_typer#  r  Úbuffered_chunkÚstream_errorrC  r¾  r¹  r¿  r4  r.  Úwrappers                €€€€€€rÙ   rF  zMRouter._aanthropic_messages_streaming_iterator.<locals>.stream_with_fallbacks·  s†  øè ø€ ÝAð& %*Ð!Ø;=Ð%Ü¤ ^×%7Ñ%7¸Ó%@ÓAˆEð6?Ø#2÷ & ð & ˜%Ü;ØÐ4´cÐ:SÓ6Tôð $›Ø ÜEÀeÐMbÔcØ Ü4°UÐ<QÔSVÐWpÓSqÔrØ04Ð-Ù"=¸eÓ"D�Kà1Ð1ò RØ'¨tÐ3òRä:¸;Àq¹>ÓJòRô !KÈ5Ó QÐQð	 ,ñ 1Ñ9PÐU`ÐUhØ4WÐ6OÐ4WÐQVÑ4WÐ1Ø Ù.Ø*Ð6Ð6Ð6Ø<GÑ9˜ W¨kÙ4Ø$+Ø"'Ø)4Ü/6×/AÑ/A×/JÑ/JØ,7Ø(/Ø-8Ø&+ð	 0Kó 0ð 04ôð ð +Dò -˜Ø,Ô,ð-à02Ð-Ø”KðM& ø ?ðN '@ò )�NØ(Ô(ñ)øäò 	Ø"&×"PÑ"PØ Ø)Ø-ØØ"Øó#÷ ñ ˜$ð ”Jõ#ûð	úô ×&Ñ&¨dÔ3ñ ?´Z×5HÑ5HÌÓ5Wñ ?Ù-¨oÓ>×>Ñ>÷?÷ ?ñ ?ú÷ ?÷ ?ñ ?û”U×&Ñ&¨dÔ3ñ ?´Z×5HÑ5HÌÓ5Wñ ?Ù-¨oÓ>×>Ñ>÷?÷ ?ñ ?ú÷ ?÷ ?ñ ?ÿsñ   ƒ*H.®D °D´DµD¸CD ÄDÄD ÄF> Ä	EÄE
Ä4EÄ8D;Ä9EÄ=E
ÅF> Å
EÅF> ÅH.Å(F2ÆFÆFÆFÆ	F2ÆF&	Æ"F2Æ)	H.Æ2F;Æ7H.Æ>H+ÇHÇ/H
	Ç;G>Ç<H
	È	HÈ
HÈHÈ	H+ÈH(È$H+È+H.)r  r¾  r¿  r   rR  r,  )r4  r  r¹  rF  r¾  r¿  r.  rÌ  s   ` ` @@@@rÙ   Ú'_aanthropic_messages_streaming_iteratorz.Router._aanthropic_messages_streaming_iterator�  sJ   ýè ø€ ÷^	
ð
 "*ˆðM	?¬^¼EÀ4¸KÑ-H÷ M	?ò M	?ôd >Ñ>SÓ>UÐWfÓgˆØˆùs   ˆ8A rË  r  rÆ  rÌ  r,  c                ó  K  — ddl m} t        ||«      r3t        ||«      r'|D ]  }|­–— Œ	 |j                  �|j                  |‚|‚t        ||«      r|nt        |||«      }	|	€|‚| j                  |	||«      2 3 d{  –—† }
|
­–— Œ7 Œ
6 y­w)zYTurns a source-iterator failure into a fallback attempt or the error reaching the caller.r   r¿   N)r&  rÀ   rá   r  r%  r'  Ú%_aanthropic_messages_fallback_attempt)r4  rË  r  rÆ  ré   r¹  rÌ  rÀ   rÊ  rE  rC  s              rÙ   rÃ  z0Router._aanthropic_messages_recover_stream_error  s»   è ø€ õ 	>ä�lÐ$:Ô;Ô@iØ! <ôA
ð #<ò %�Ø$Ô$ð%à×.Ñ.Ð:Ø"×5Ñ5¸<ÐGØÐô ˜,Ð(>Ô?ñ ä<¸\È5ÐRgÓhð 	ð
 Ð!ØÐØ×DÑDÀ^ÐUcÐelÓm÷ 	ð 	�$ØŒJð	øÑmùs*   ‚A8BÁ:BÁ>B	Á?BÂBÂ	BÂBr   rÀ   c                ó  K  — ddl m} ddlm}m} d}	 t        t        |j                  d«      «      }|j                  d| j                  «      }	|j                  d| j                  «      }
|j                  d| j                  «      }| j                  |d	<   | j                  ||d
¬«       | j                  |d|	|
||d||j                  dd«      du ¬«	      ƒ d{  –—† }t        j                  |«      \  }}|j!                  ||«       |j#                  |«       t%        |d«      r|2 3 d{  –—† }|­–— Œ |t        d|«      «      D ]  }|­–— Œ	 |�Rt1        j2                  d¬«      5  t5        j6                  t8        «      5   ||«      ƒ d{  –—†  ddd«       ddd«       yy7 ŒÍ7 Œ}6 Œ[# t&        $ rA}t)        j*                  d|«       t-        ||«      r|j.                  �|j.                  |‚‚ d}~ww xY w7 Œi# 1 sw Y   ŒhxY w# 1 sw Y   yxY w# |�lt1        j2                  d¬«      5  t5        j6                  t8        «      5   ||«      ƒ d{  –—†7   ddd«       n# 1 sw Y   nxY wddd«       w # 1 sw Y   w xY ww xY w­w)a6  
        Re-enters the Router's fallback chain for a mid-stream
        anthropic_messages error and yields whatever the fallback attempt
        produces. Split out of _aanthropic_messages_streaming_iterator to
        keep each function's cyclomatic complexity within the repo's C901
        budget.
        r   r¿   )r¾  Ú)anthropic_messages_response_as_sse_eventsNré   r‰  rŠ  r‹  r`  ru  rˆ  Fr  r5  Tr6  r=  rË   z5Anthropic messages streaming fallback also failed: %sr9  )r&  rÀ   r  r¾  rÑ  r   r  rà   r‰  rŠ  r‹  rŠ  r¦  r?  rg  r  rL  r;  r  r�  r   r  rá   r%  r@  rA  rÄ  rÅ  rB  )r4  r   r¹  rÌ  rÀ   r¾  rÑ  r9  r…  r‰  rŠ  r‹  rF  rG  r  ÚeventrE  s                    rÙ   rÏ  z,Router._aanthropic_messages_fallback_attempt*  sÈ  è ø€ õ 	>÷	
ð
 !Ðð4	AÜ!%¤c¨>×+=Ñ+=¸gÓ+FÓ!GˆKØ,:×,>Ñ,>Ø˜TŸ^™^ó-ˆIð <J×;MÑ;MØ*¨D×,IÑ,Ió<Ð$ð <J×;MÑ;MØ*¨D×,IÑ,Ió<Ð$ð 37×2_Ñ2_ˆNÐ.Ñ/Ø×0Ñ0Ø!Ø%Ø'9ð 1ô ð
 '+×&UÑ&UØØ"'Ø#Ø)AØ)AØ'ØØ%Ø(6×(:Ñ(:Ð;TÐV[Ó(\Ð`dÐ(dð 'Vó 
'÷ 
!Ðô 8>×7]Ñ7]Ð^oÓ7pÑ4Ð"Ð$4Ø×0Ñ0Ð1GÐIYÔZØ×)Ñ)Ð*;Ô<ÜÐ(¨+Ô6Ø+<÷ (ð (˜-Ø'Ô'ñ GÜÐ4Ð6GÓHóò  �Eð  ”Kð ð !Ð,Ü×&Ñ&¨dÔ3ñ A´Z×5HÑ5HÌÓ5Wñ AÙ-Ð.?Ó@×@Ð@÷A÷ Að Að -ðC
!øð(øÑ+<øô ò 	Ü!×'Ñ'Ð(_ÐaoÔpÜ˜.Ð*@ÔAÀn×FgÑFgÐFsØ$×7Ñ7¸^ÐKØûð		úð Aø÷Að Aú÷ Að Aûð !Ð,Ü×&Ñ&¨dÔ3ñ A´Z×5HÑ5HÌÓ5Wñ AÙ-Ð.?Ó@×@Ñ@÷A÷ Añ Aú÷ A÷ Añ Aúð -üsê   ‚J”CF- ÃF'ÃAF- Ä'F+Ä+F)Ä,F+Ä/#F- ÅJÅ*HÆG<ÆG:ÆG<ÆHÆ
JÆ'F- Æ)F+Æ+F- Æ-	G7Æ6<G2Ç2G7Ç7H Ç:G<Ç<H	ÈHÈHÈJÈJÈ-I7ÉI"	ÉIÉI"	É	I7É"I+É'I7É.	JÉ7J É<JÊJrË   c              ‹   ó¼  K  — ddl m} |j                  «       }t        |j	                  d«      t
        «      r ||d   «      |d<   t        |j	                  d«      t
        «      r ||d   «      |d<   ||d<    | j                  dd|i|¤Žƒ d{  –—† }|j	                  d«      r1t        |d	«      r%| j                  t        d
|«      |¬«      ƒ d{  –—† S |S 7 ŒH7 Œ­w)a  
        _ageneric_api_call_with_fallbacks for anthropic_messages, with the
        addition of mid-stream fallback handling (see
        _aanthropic_messages_streaming_iterator). Parity with
        _aresponses_with_streaming_fallbacks for the Responses API.
        r   rÒ  ru  rÄ  r—  r`  NrÖ  r=  zAsyncIterator[bytes]rº  r  )
rÚ  rÓ  r™  rá   rà   r3  râ  r  rÍ  r   )r4  r`  r¤  rÓ  r»  r  s         rÙ   Ú-_aanthropic_messages_with_streaming_fallbacksz4Router._aanthropic_messages_with_streaming_fallbackst  sì   è ø€ õ 	Kð 5;·K±K³MˆÜ�o×)Ñ)Ð*<Ó=¼tÔDÙ2@ÀÐQcÑAdÓ2eˆOÐ.Ñ/Ü�o×)Ñ)¨*Ó5´tÔ<Ù*8¸ÈÑ9TÓ*UˆO˜JÑ'Ø7HˆÐ3Ñ4à F × FÑ FÑ uÐYjÐ uÐntÑ u×uˆà�:‰:�hÔ¤G¨H°kÔ$BØ×EÑEÜÐ4°hÓ?Ø.ð Fó ÷ ð ð ˆð vøðús%   ‚BCÂCÂACÃCÃCÃCrµ  c              ‹   óŒ   K  — |dk(  r | j                   dd|i|¤Žƒ d{  –—† S  | j                  dd|i|¤Žƒ d{  –—† S 7 Œ 7 Œ­w)aV  
        factory_function's shared dispatch for call types with no
        call-specific handling, except anthropic_messages: kept out of
        factory_function's own async_wrapper (already at the repo's C901
        complexity ceiling) so routing its mid-stream fallback handling
        (#24004) doesn't add another branch there.
        r¶  r`  Nr  )rÔ  râ  )r4  rµ  r`  r¤  s       rÙ   Ú_dispatch_generic_call_typez"Router._dispatch_generic_call_type˜  si   è ø€ ð Ð,Ò,ØK˜×KÑKñ Ø"3ðØ7=ñ÷ ð ð <�T×;Ñ;ÑjÐN_ÐjÐciÑj×jÐjðøð kús   ‚AŸA  A»A¼AÁAc           	      ó¨  — |j                   }t        d¬«      }	 t        j                  d|||«       | j	                  |||¬«       | j                  ||j                  dd«      |j                  dd«      |j                  dd«      |¬	«      }| j                  ||d¬
«       |d   j                  «       }|d   }| j                  |xx   dz  cc<   d|v r|d   r|d   j                  ||«      |d<   ||d<   | j                  |¬«       	 |j                  d«      }	t        |d   |	¬«      \  }
}}
}
|	xs |}	 |di i |¥|	| j                  dœ¥|¥¤Ž}| j                   |xx   dz  cc<   t        j"                  d||«       |S # t        $ r d}	Y ŒXw xY w# t        $ r8}t        j"                  d|||«       |�| j$                  |xx   dz  cc<   |‚d}~ww xY w)a–  
        Make a generic LLM API call through the router, this allows you to use retries/fallbacks with litellm router
        Args:
            model: The model to use
            original_function: The handler function to call (e.g., litellm.completion)
            **kwargs: Additional arguments to pass to the handler function
        Returns:
            The response from the handler function
        Úgeneric_api_callrÉ  z?Inside _generic_api_call() - handler: %s, model: %s; kwargs: %srˆ  r_  Nr�  rª  ©ré   r_  r�  rª  r’  rÝ  r»  ré   r¼   r­  r°  r&  r¶  )r&  r²  z%s(model=%s)[32m 200 OK[0mz"%s(model=%s)[31m Exception %s[0mr  )rN  rV   r   rš  r¦  rº  rà   r»  r¿  r™  rù  r¯  rÁ  rµ   r�  ri  rû  r  rú  )r4  ré   r`  r¤  Úhandler_namer‰  r  ræ  rf  r&  r  r·  r  r   s                 rÙ   Ú _generic_api_call_with_fallbacksz'Router._generic_api_call_with_fallbacks«  s>  € ð 0×8Ñ8ˆÜ(JÐYkÔ(lÐð:	Ü!×'Ñ'ØQÐS_ÐafÐhnôð ×0Ñ0ØØØ'=ð 1ô ð
 !%× =Ñ =ØØŸ™ J°Ó5Ø—j‘j ¨$Ó/Ø$*§J¡JÐ/DÀdÓ$KØ%ð !>ó !ˆJð ×/Ñ/¸:ÈfÐdvÐ/Ôwà$Ð%5Ñ6×;Ñ;Ó=ˆDØ $ W¡ˆJà×Ñ˜ZÓ(¨AÑ-Ó(ð ˜VÑ#¨¨zÒ(:Ø%+¨JÑ%7×%?Ñ%?ÀÀzÓ%R��zÑ"Ø(ˆF�7‰Oð ×1Ñ1¸ZÐ1ÔHð+Ø&*§h¡hÐ/DÓ&EÐ#Ü8HØ˜w™-Ø(;ô9Ñ5�Ð/°°Að ':Ò&YÐ=YÐ#ñ 0ñ ðØðà+>Ø#×3Ñ3òð ð	ñˆHð ×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'KÈ\Ð[eÔfØˆOøô ò +Ø&*Ò#ð+ûô ò 	Ü!×&Ñ&Ð'QÐS_ÐafÐhiÔjØÐ Ø—‘ Ó&¨!Ñ+Ó&ØˆGûð		ús=   šC-F Ä,E? Ä4A
F Å?FÆ
F ÆFÆF Æ	GÆ3GÇGc                 óª   — 	 ||d<   ||d<   | j                   |d<   | j                  ||¬«        | j                  di |¤Ž}|S # t        $ r}|‚d }~ww xY w)Nré   r�  r`  r£  r  )Ú
_embeddingr¦  r§  r�  ©r4  ré   r�  r‚  r¤  r  r   s          rÙ   Ú	embeddingzRouter.embeddingó  sj   € ð	Ø#ˆF�7‰OØ#ˆF�7‰OØ*.¯/©/ˆFÐ&Ñ'Ø×0Ñ0°uÀVÐ0ÔLØ:˜d×:Ñ:ÑD¸VÑDˆHØˆOøÜò 	ØˆGûð	ús   ‚?A Á	AÁAÁAc           	      óØ  — d }	 t        j                  d||«       | j                  |||j                  dd «      ¬«      }| j	                  ||¬«       |d   j                  «       }|d   }| j                  ||d¬«      }|j                  d	d «      }|�|�||j                  k7  rd }	n|}	| j                  |xx   d
z  cc<   | j                  |¬«       t        j                  di i |¥|| j                  |	dœ¥|¥¤Ž}
| j                  |xx   d
z  cc<   t        j                  d|«       |
S # t         $ r7}t        j                  d||«       |�| j"                  |xx   d
z  cc<   |‚d }~ww xY w)Nz)Inside embedding()- model: %s; kwargs: %srª  )ré   r�  rª  r¯  r»  ré   Úsyncr¨  rê   r¼   r°  ©r�  r²  r³  z+litellm.embedding(model=%s)[32m 200 OK[0mz1litellm.embedding(model=%s)[31m Exception %s[0mr  )r   rš  rº  r»  r¿  r™  rÀ  rà   rê   rù  rÁ  rÍ  rß  ri  rû  r  r�  rú  )r4  r�  ré   r¤  rf  r  ræ  rÌ  rÍ  rÎ  r  r   s               rÙ   rÝ  zRouter._embedding  s¨  € Øˆ
ð,	Ü!×'Ñ'Ð(SÐUZÐ\bÔcØ $× =Ñ =ØØØ$*§J¡JÐ/DÀdÓ$Kð !>ó !ˆJð
 ×/Ñ/¸:ÈfÐ/ÔUØ$Ð%5Ñ6×;Ñ;Ó=ˆDØ˜g™ˆJà,0×,<Ñ,<È
Ð[aÐouÐ,<Ó,vÐ"à%+§Z¡Z°	¸4Ó%@ˆOàÐ+Ø*Ð6Ø#Ð'=×'EÑ'EÒEà#‘à5�à×Ñ˜ZÓ(¨AÑ-Ó(ð ×1Ñ1¸ZÐ1ÔHä%×/Ñ/ñ ðØðà"Ø#×3Ñ3Ø*ò	ð
 ðñˆHð ×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'ZÐ\fÔgØˆOøÜò 	Ü!×&Ñ&Ð'`ÐblÐnoÔpØÐ%Ø—‘ 
Ó+¨qÑ0Ó+ØˆGûð		ús   „D$D) Ä)	E)Ä22E$Å$E)c           	   ‹   ó.  K  — 	 ||d<   ||d<   | j                   |d<   | j                  ||¬«        | j                  di |¤Žƒ d {  –—† }|S 7 Œ# t        $ r;}t	        j
                  t        | |t        j                  «       |¬«      «       |‚d }~ww xY w­wr{  )	Ú_aembeddingr¦  r  r�  rä  r  rp   r  r  rÞ  s          rÙ   Ú
aembeddingzRouter.aembedding4  s¥   è ø€ ð	Ø#ˆF�7‰OØ#ˆF�7‰OØ*.×*:Ñ*:ˆFÐ&Ñ'Ø×0Ñ0°uÀVÐ0ÔLØ$F D×$FÑ$FÑ$PÈÑ$P×PˆHØˆOð Qùäò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		ürn  c           	   ‹   ó  K  — d }	 t        j                  d||«       t        |«      }| j                  |||j	                  dd «      |¬«      ƒ d {  –—† }| j                  ||¬«       |d   j                  «       }|d   }| j                  ||¬«      }| j                  |xx   dz  cc<   t        j                  di i |¥|| j                  |dœ¥|¥¤Ž}	| j                  ||d	¬
«      }
|
�\t        |
t        j                  «      rB|
4 ƒd {  –—†  	 | j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	d d d «      ƒd {  –—†  n%| j!                  ||¬«      ƒ d {  –—†  |	ƒ d {  –—† }	| j"                  |xx   dz  cc<   t        j$                  d|«       |	S 7 �ŒI7 Œ’7 Œx7 Œp7 Œb# 1 ƒd {  –—†7  sw Y   ŒLxY w7 Œ]7 ŒU# t&        $ r7}t        j$                  d||«       |�| j(                  |xx   dz  cc<   |‚d }~ww xY w­w)Nz+Inside _aembedding()- model: %s; kwargs: %srª  )ré   r�  rª  r’  r¯  r»  ré   r¼   râ  r§  r¨  r¦  z,litellm.aembedding(model=%s)[32m 200 OK[0mz2litellm.aembedding(model=%s)[31m Exception %s[0mr  )r   rš  r)   r¥  r»  r¿  r™  r«  rù  rÍ  rå  ri  rÀ  rá   rä  r¬  r­  rû  r  r�  rú  )r4  r�  ré   r¤  rf  rþ  r  ræ  rÎ  r  r³  r   s               rÙ   rä  zRouter._aembeddingM  sl  è ø€ Øˆ
ð:	Ü!×'Ñ'Ð(UÐW\Ð^dÔeÜ&GÈÓ&OÐØ&*×&IÑ&IØØØ$*§J¡JÐ/DÀdÓ$KØ%ð	 'Jó '÷ !ˆJð ×/Ñ/¸:ÈfÐ/ÔUØ$Ð%5Ñ6×;Ñ;Ó=ˆDØ˜g™ˆJØ"&×"EÑ"EØ%Øð #Fó #ˆLð
 ×Ñ˜ZÓ(¨AÑ-Ó(Ü×)Ñ)ñ ðØðà"Ø#×3Ñ3Ø*ò	ð
 ðñˆHð $(×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .ðð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'[Ð]gÔhØˆOðe!ùðB.øð
øð  .øð.ø÷ .÷ .ñ .úðøð *ùô
 ò 	Ü!×&Ñ&Ð'aÐcmÐopÔqØÐ%Ø—‘ 
Ó+¨qÑ0Ó+ØˆGûð		üsÆ   ‚H †A
F= ÁFÁB8F= Ä	FÄ
F= ÄF$Ä%FÄ&	F$Ä/F Ä0F$Ä4F= Ä?F"Å F= ÅF9Å	F= Å%F;Å&2F= ÆH ÆF= ÆF= ÆF$Æ F$Æ"F= Æ$F6Æ*F-Æ+F6Æ2F= Æ;F= Æ=	G=Ç2G8Ç8G=Ç=H c           	   ‹   ó$  K  — 	 ||d<   | j                   |d<   | j                  ||¬«        | j                  di |¤Žƒ d {  –—† }|S 7 Œ# t        $ r;}t	        j
                  t        | |t        j                  «       |¬«      «       |‚d }~ww xY w­w)Nré   r`  r£  rÿ  r  )	Ú_acreate_filer¦  r  r�  rä  r  rp   r  r  r}  s        rÙ   Úacreate_filezRouter.acreate_fileŒ  sž   è ø€ ð
	Ø#ˆF�7‰OØ*.×*<Ñ*<ˆFÐ&Ñ'Ø×0Ñ0°uÀVÐ0ÔLØ$F D×$FÑ$FÑ$PÈÑ$P×PˆHàˆOð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üs:   ‚B„<A	 Á AÁA	 ÁBÁA	 Á		BÁ6BÂBÂBc              ‹   óÐ  ‡ ‡‡K  — 	 ddl m} t        j                  d|‰«       t	        ‰«      Š‰ j                  |dddœg‰j                  dd «      ‰‰¬«      ƒ d {  –—† }d	t        d
t        fˆˆˆ fd„}g }t        |t        «      r|j                   ||«      «       n|D ]  }|j                   ||«      «       Œ t        j                  |Ž ƒ d {  –—† }t        |«      dk(  rt        d«      ‚ |||¬«      }	t        t        |d   «      }
|	|
j                   d<   |
S 7 ŒÁ7 ŒM# t        $ r8}t        j"                  d|‰|«       |�‰ j$                  |xx   dz  cc<   |‚d }~ww xY w­w)Nr   )Úadd_model_file_id_mappingsr‰  rd  úfiles-api-fake-textrO  rª  ©ré   r_  rª  r’  rþ  r  rÒ   c           	   “   ó  •K  — ddl m}  |‰«      }‰j                  | |d¬«       | d   j                  «       }|d   }‰j	                  | |¬«      }‰j
                  |xx   dz  cc<   |j                  d	«      }t        |d   |¬
«      \  }}}	}	|xs |}t        t        d z  ‰j                  d«      «      }
t        t        d z  ‰j                  d«      «      }|r|
st        d«      ‚t        |
¬«      }|rt        ||¬«      }||d<   |t        j                  j                   k(  r0t#        i |j                  d«      xs t#        i «      ¥d|i¥«      |d<   d|v r|d   |j%                  di «      d<   t'        j(                  di i |¥|‰j*                  |dœ¥|¥¤Ž}‰j-                  | |d¬«      }|�\t/        |t0        j2                  «      rB|4 ƒd {  –—†  	 ‰j5                  | ‰¬«      ƒ d {  –—†  |ƒ d {  –—† }d d d «      ƒd {  –—†  n%‰j5                  | ‰¬«      ƒ d {  –—†  |ƒ d {  –—† }‰j6                  |xx   dz  cc<   t9        j:                  d|«       |S 7 Œ�7 Œu7 Œm7 Œ_# 1 ƒd {  –—†7  sw Y   ŒIxY w7 ŒZ7 ŒR­w)Nr   rÒ  ré  rÝ  r»  ré   r¯  r¼   r&  r¶  Úpurposerp  z2file and file_purpose are required for create_file)rï  )Úfile_contentÚnew_model_nameÚ
extra_bodyÚtarget_model_namesÚgcs_bucket_nameru  ©r&  r²  r³  r§  r¨  r¦  z.litellm.acreate_file(model=%s)[32m 200 OK[0mr  )rÚ  rÓ  r¿  r™  r«  rù  rà   rµ   r   r„   r‚   r�  rX   rW   r¨   ÚLITELLM_PROXYrÑ   r   rþ  rÍ  ré  ri  rÀ  rá   rä  r¬  r­  rû  r   r  )r  rÓ  Úkwargs_copyræ  rf  rÎ  r&  Ústripped_modelr·  r  rï  rp  Úreplace_model_in_jsonl_boolr  r³  r¤  rþ  r4  s                  €€€rÙ   Úcreate_file_for_deploymentz8Router._acreate_file.<locals>.create_file_for_deploymentµ  s  øè ø€ ÝRá%3°FÓ%;�Ø×3Ñ3Ø)Ø&Ø"0ð 4ô ð
 )Ð)9Ñ:×?Ñ?ÓA�Ø$(¨¡M�
à&*×&IÑ&IØ)Ø&ð 'Jó '�ð × Ñ  Ó,°Ñ1Ó,ð '+§h¡hÐ/DÓ&EÐ#ÜEUØ˜w™-Ø(;ôFÑB�Ð <¸aÀð
 ':Ò&YÐ=YÐ#ô "&Ô&8¸4Ñ&?ÀÇÁÈIÓAVÓ!W�ÜœI¨Ñ,¨f¯j©j¸Ó.@ÓA�Ù¡7Ü#Ð$XÓYÐYä5RØ#ô6Ð+ñ /Ü1Ø%)Ø'5ô�Dð
 +/�K Ñ'Ø&¬,×*DÑ*D×*JÑ*JÒJÜ0@ðØ*Ÿ™¨|Ó<ÒTÔ@PÐQSÓ@Tðà0°.ñó1�K Ñ-ð &¨Ñ-àX\Ð]nÑXo�K×*Ñ*Ð+=¸rÓBÐCTÑUÜ"×/Ñ/ñ ðØðà/BØ#'×#7Ñ#7Ø".ò	ð
 &ðñ�ð (,×'7Ñ'7Ø)Ø&Ø 7ð (8ó (�ð !Ð,´¸MÌ7×K\ÑK\Ô1]Ø,÷ 2ñ 2ðð #×IÑIØ'1ÐDTð Jó ÷ ð ð *2§>˜÷2÷ 2ð 2ð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�Hà×"Ñ" :Ó.°!Ñ3Ó.Ü%×*Ñ*Ð+aÐcmÔnà�ð%2øð
øð $2øð2ø÷ 2÷ 2ñ 2úðøð  .úsŠ   ƒGJ ÇIÇJ ÇI'Ç+I!Ç,	I'Ç5I#Ç6I'Ç:J ÈI%ÈJ È!I<È"	J È+I>È,4J É!I'É#I'É%J É'I9É-I0É.I9É5J É>J úNo healthy deployments found.)rì  r¼  Úmodel_file_id_mappingz8litellm.acreate_file(model=%s, %s)[31m Exception %s[0mr¼   )Ú!litellm.router_utils.common_utilsrë  r   rš  r)   Úasync_get_healthy_deploymentsr»  r3  rƒ   rá   rø  rä  rç  r‰  r�  r   r0  r¹  rú  )r4  ré   r¤  rë  rì  rú  Útasksr  r¼  rü  Úreturned_responser   rþ  s   ` `         @rÙ   rè  zRouter._acreate_file£  s�  úè ø€ ð
B	ÝTä!×'Ñ'Ð([Ð]bÐdjÔkÜ&GÈÓ&OÐØ/3×/QÑ/QØØ#)Ð6KÑLÐMØ$*§J¡JÐ/DÀdÓ$KØ%Ø!1ð 0Ró 0÷ *ÐðZ ¼Tð Z ÔFV÷ Z ðx ˆEäÐ-¬tÔ4Ø—‘Ñ7Ð8KÓLÕMà"5ò I�JØ—L‘LÑ!;¸JÓ!GÕHðIô &-§^¡^°UÐ%;×;ˆIä�9‹~ Ò"ÜÐ ?Ó@Ð@á+EØ$7À9ô,Ð!ô (,Ô,<¸iÈ¹lÓ'KÐØH]Ð×,Ñ,Ð-DÑEØ$Ð$ðm*øðX  <ùô ò 	Ü!×+Ñ+ØPÐRWÐY_Ðabôð Ð Ø—‘ Ó&¨!Ñ+Ó&ØˆGûð	üsO   …E&‡AD" ÁDÁA5D" ÃD ÃA
D" ÄE&ÄD" Ä D" Ä"	E#Ä+3EÅE#Å#E&c           	   ‹   ó€  K  — 	 |€)ddl m} | j                  |d¬«      } |di |¤Žƒ d{  –—† S ddlm} t	        |«      }| j                  |dddœg|j                  d	d«      |¬
«      ƒ d{  –—† }|d   j                  «       }|d   }	| j                  ||d¬«       | j                  ||¬«      }
| j                  |	xx   dz  cc<   |j                  d«      }t        |d   |¬«      \  }}}}|xs |} |di i |¥|| j                  |
dœ¥|¥¤Ž}| j                  ||d¬«      }|�[t        |t         j"                  «      rA|4 ƒd{  –—†  | j%                  ||¬«      ƒ d{  –—†  |ƒ d{  –—† }ddd«      ƒd{  –—†  n%| j%                  ||¬«      ƒ d{  –—†  |ƒ d{  –—† }| j&                  |	xx   dz  cc<   t)        j*                  d|	«       |S 7 �Œª7 �Œk7 Œ”7 Œ{7 Œs7 Œe# 1 ƒd{  –—†7  sw Y   ŒOxY w7 Œ`7 ŒX# t,        $ r7}t)        j.                  d||«       |�| j0                  |xx   dz  cc<   |‚d}~ww xY w­w)zì
        Create a vector store for a specific model.

        Args:
            model: Model name from router config
            **kwargs: Vector store creation parameters

        Returns:
            VectorStoreCreateResponse
        Nr   rê  Úavector_store_creater´  rd  zvector-store-api-fake-textrO  rª  r«  r»  ré   rÝ  r¯  r¼   r&  r¶  rõ  r§  r¨  r¦  z6litellm.avector_store_create(model=%s)[32m 200 OK[0mz<litellm.avector_store_create(model=%s)[31m Exception %s[0mr  )rç  rë  r©  Úlitellm.vector_storesr)   r¥  r»  r™  r¿  r«  rù  rà   rµ   ri  rÀ  rá   rä  r¬  r­  rû  r   r  r�  r¹  rú  )r4  ré   r¤  rë  Ú
factory_fnÚavector_store_create_sdkrþ  r  ræ  rf  rÎ  r&  r  r·  r  r³  r   s                    rÙ   r  zRouter.avector_store_create-  sÖ  è ø€ ðN	àˆ}Ý>ð %)×$9Ñ$9¸'ÐMcÐ$9Ó$d�
Ù'Ñ1¨&Ñ1×1Ð1åQä&GÈÓ&OÐØ&*×&IÑ&IØØ#)Ð6RÑSÐTØ$*§J¡JÐ/DÀdÓ$KØ%ð	 'Jó '÷ !ˆJð %Ð%5Ñ6×;Ñ;Ó=ˆDØ $ W¡ˆJØ×/Ñ/Ø%ØØ4ð 0ô ð #'×"EÑ"EØ%Øð #Fó #ˆLð ×Ñ˜ZÓ(¨AÑ-Ó(ð #'§(¡(Ð+@Ó"AÐÜ4DØ˜7‘mØ$7ô5Ñ1ˆAÐ+¨Q°ð #6Ò"UÐ9UÐá/ñ ðØðà+>Ø#×3Ñ3Ø*ò	ð
 ðñˆHð $(×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .Ø×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷	.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'eÐgqÔràˆOðA 2ùð
!ùðZ.øðøð  .øð	.ø÷ .÷ .ñ .úðøð *ùô ò 	Ü!×+Ñ+ØTÐV[Ð]^ôð Ð Ø—‘ Ó&¨!Ñ+Ó&ØˆGûð	üsß   ‚H>„&G; ªG«G; ®H>¯=G; Á,GÁ-CG; ÅGÅG; Å	G"Å GÅ!	G"Å*GÅ+G"Å/G; Å:G Å;G; ÆG7Æ	G; Æ G9Æ!2G; ÇH>ÇG; ÇG; ÇG; ÇG"ÇG"Ç G; Ç"G4Ç(G+Ç)G4Ç0G; Ç9G; Ç;	H;È2H6È6H;È;H>c                  ó   — y)aE  
        Override factory-generated vector store methods with router-aware implementations.
        This is called after _initialize_vector_store_endpoints() to ensure our custom
        methods that handle deployment selection and credential injection are used instead
        of the generic factory-generated ones.
        Nr  r8  s    rÙ   rf  z0Router._override_vector_store_methods_for_routerŒ  s   � rç   c           	   ‹   ó>  K  — 	 ||d<   | j                   |d<   t        d¬«      }| j                  |||¬«        | j                  di |¤Žƒ d {  –—† }|S 7 Œ# t        $ r;}t        j                  t        | |t        j                  «       |¬«      «       |‚d }~ww xY w­w)Nré   r`  Ú_acreate_batchrÉ  rˆ  rÿ  r  )
r  rV   r¦  r  r�  rä  r  rp   r  r  ©r4  ré   r¤  r‰  r  r   s         rÙ   Úacreate_batchzRouter.acreate_batch—  s¶   è ø€ ð
	Ø#ˆF�7‰OØ*.×*=Ñ*=ˆFÐ&Ñ'Ü,NÐ]mÔ,nÐ"Ø×0Ñ0ØØØ'=ð 1ô ð
 %G D×$FÑ$FÑ$PÈÑ$P×PˆHàˆOð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üó;   ‚B„A	A ÁAÁA ÁBÁA Á	BÁ6BÂBÂBc           	   ‹   ód  K  — 	 t        j                  d||«       t        |«      }| j                  |dddœg|j	                  dd «      |¬«      ƒ d {  –—† }|d   j                  «       }|d   }| j                  ||d	¬
«       | j                  ||¬«      }| j                  |xx   dz  cc<   |j                  d«      }t        |d   |¬«      \  }	}
}	}	|xs |
}t        j                  di i |¥|| j                  |dœ¥|¥¤Ž}| j                  ||d¬«      }|�\t        |t         j"                  «      rB|4 ƒd {  –—†  	 | j%                  ||¬«      ƒ d {  –—†  |ƒ d {  –—† }d d d «      ƒd {  –—†  n%| j%                  ||¬«      ƒ d {  –—†  |ƒ d {  –—† }| j&                  |xx   dz  cc<   t        j(                  d|«       |S 7 �Œv7 Œ’7 Œx7 Œp7 Œb# 1 ƒd {  –—†7  sw Y   ŒLxY w7 Œ]7 ŒU# t*        $ r8}t        j,                  d|||«       |�| j.                  |xx   dz  cc<   |‚d }~ww xY w­w)Nz.Inside _acreate_batch()- model: %s; kwargs: %srd  rì  rO  rª  r«  r»  ré   r  rÝ  r¯  r¼   r&  r¶  rõ  r§  r¨  r¦  z/litellm.acreate_batch(model=%s)[32m 200 OK[0mz:litellm._acreate_batch(model=%s, %s)[31m Exception %s[0mr  )r   rš  r)   r¥  r»  r™  r¿  r«  rù  rà   rµ   rÍ  r
  ri  rÀ  rá   rä  r¬  r­  rû  r  r�  r¹  rú  )r4  ré   r¤  rþ  r  ræ  rf  rÎ  r&  r  r·  r  r³  r   s                 rÙ   r  zRouter._acreate_batch³  s¹  è ø€ ð
F	Ü!×'Ñ'Ð(XÐZ_ÐagÔhÜ&GÈÓ&OÐØ&*×&IÑ&IØØ#)Ð6KÑLÐMØ$*§J¡JÐ/DÀdÓ$KØ%ð	 'Jó '÷ !ˆJð %Ð%5Ñ6×;Ñ;Ó=ˆDØ $ W¡ˆJØ×/Ñ/¸:ÈfÐdtÐ/Ôuà"&×"EÑ"EØ%Øð #Fó #ˆLð ×Ñ˜ZÓ(¨AÑ-Ó(ð #'§(¡(Ð+@Ó"AÐÜ4DØ˜7‘mØ$7ô5Ñ1ˆAÐ+¨Q°ð #6Ò"UÐ9UÐä×,Ñ,ñ ðØðà+>Ø#×3Ñ3Ø*ò	ð
 ðñˆHð $(×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .ðð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'^Ð`jÔkàˆOðy!ùðT.øð
øð  .øð.ø÷ .÷ .ñ .úðøð *ùô ò 	Ü!×+Ñ+ØRÐTYÐ[aÐcdôð Ð Ø—‘ Ó&¨!Ñ+Ó&ØˆGûð	üsÆ   ‚H0„AG, ÁGÁC%G, Ä8GÄ9G, Ä<GÅGÅ	GÅGÅGÅ#G, Å.GÅ/G, Æ
G(Æ	G, ÆG*Æ2G, ÇH0ÇG, ÇG, ÇGÇGÇG, ÇG%ÇGÇG%Ç!G, Ç*G, Ç,	H-Ç53H(È(H-È-H0c              ‹   ór  ‡ ‡‡	K  — 	 t        ‰«      }|�3‰ j                  |dddœg‰j                  dd«      ‰|¬«      ƒ d{  –—† }n‰ j                  «       }|€t	        d«      ‚g Š	dt
        fˆˆ	ˆ fd	„}|�^t        |t        «      rNt        |«      d
kD  r@t        j                  |D �cg c]  } |t        t
        |«      «      ‘Œ c}ddiŽƒ d{  –—† }n<|�/t        |t        «      r |t        t
        |«      «      ƒ d{  –—† }nt	        d«      ‚|�=t        |t        «      r|S t        |t        «      r|D ]  }t        |t        «      sŒ|c S  ‰	r‰	d
   ‚t	        d‰	› �«      ‚7 �Œ#c c}w 7 Œ�7 Œn# t        $ r;}t        j                  t        ‰ ‰t!        j"                  «       |¬«      «       |‚d}~ww xY w­w)z€
        Iterate through all models in a model group to check for batch

        Future Improvement - cache the result.
        Nrd  zretrieve-api-fake-textrO  rª  rí  úRouter not yet initialized.rf  c              “   ó2  •K  — 	 ddl m} | d   j                  d«      }| d   j                  «       }|j                  d«      }|€t	        d| › �«      ‚|st        |¬«      \  }}}} |‰	«      }‰j                  t        t        | «      |d¬	«       |j                  dd «       |j                  dd «       t        j                  d
i i |¥d|i¥|¥¤Žƒ d {  –—† S 7 Œ# t        $ r0}dd l} |j                  «        ‰
j                  |«       Y d }~y d }~ww xY w­w)Nr   rÒ  r»  ré   r&  z2Model not found in litellm_params for deployment: r‡  Úaretrieve_batchrÝ  r  )rÚ  rÓ  rà   r™  r�  rµ   r¿  r   r3  r»  rÍ  r  r  Ú	print_excrø  )rf  rÓ  ré   ræ  r&  r  Ú
new_kwargsr   r  r¤  Úreceieved_exceptionsr4  s            €€€rÙ   Útry_retrieve_batchz2Router.aretrieve_batch.<locals>.try_retrieve_batch  s@  øè ø€ ð  ÝVà#-Ð.>Ñ#?×#CÑ#CÀGÓ#L�EØ",Ð-=Ñ">×"CÑ"CÓ"E�DØ*.¯(©(Ð3HÓ*IÐ'Ø�}Ü'Ð*\Ð]gÐ\hÐ(iÓjÐjñ /Ü7GÈeÔ7TÑ4˜Ð.°°1Ù(6°vÓ(>�JØ×7Ñ7Ü#'¬¨jÓ#9Ø)Ø&7ð 8ô ð
 —N‘NÐ#8¸$Ô?Ø—H‘HÐ2°DÔ9Ü!(×!8Ñ!8ñ "ðØ"ðà1Ð3Fñð )ðñ"÷ ð ð ùô !ò  Û$à'�I×'Ñ'Ô)Ø(×/Ñ/°Ô2Üûð üsA   ƒD…CC ÃCÃC ÃDÃC Ã	DÃ$&DÄ
DÄDÄDr   râ  Trû  z5Unable to find batch in any model. Received errors - rÿ  )r)   rþ  r»  rI  r�  rŽ   rá   râ   r‰  rä  rç  r   r3  r§   r  rp   r  r  )
r4  ré   r¤  rþ  Úfiltered_model_listr  Úresultsr  r   r  s
   ` `      @rÙ   r  zRouter.aretrieve_batch   sç  úè ø€ ð]	Ü&GÈÓ&OÐØÐ ð ×<Ñ<ØØ'-Ð:RÑSÐTØ(.¯
©
Ð3HÈ$Ó(OØ#)Ø%5ð =ó ÷ ñ $ð '+×&9Ñ&9Ó&;Ð#Ø"Ð*ÜÐ =Ó>Ð>à*,Ð ð! Ô5H÷ ! ðJ $Ð/ÜÐ2´DÔ9ÜÐ+Ó,¨qÒ0ä '§¡ØXkÖlÈuÑ(¬Ô.AÀ5Ó)IÕJÒlð!à&*ñ!÷ ‘ð %Ð0´ZÐ@SÔUYÔ5ZÙ 2´4Ô8KÐM`Ó3aÓ b×b‘äÐ ?Ó@Ð@ð Ð"Ü˜g¤|Ô4Ø"�NÜ ¬Ô.Ø")ò *˜Ü% f¬lÕ;Ø#)šMð*ñ
 $Ø*¨1Ñ-Ð-ô ÐSÐThÐSiÐjÓkÐkð]ûòp mðøð
 cùô& ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		üs}   …F7‡:E0 ÁE$ÁA%E0 Â'E'Ã
E0 ÃE,Ã0E0 Ã?E.Ä #E0 Ä#F7Ä$%E0 Å
E0 ÅF7ÅE0 Å'E0 Å.E0 Å0	F4Å96F/Æ/F4Æ4F7c           	   ‹   ó>  K  — 	 ||d<   | j                   |d<   t        d¬«      }| j                  |||¬«        | j                  di |¤Žƒ d{  –—† }|S 7 Œ# t        $ r;}t        j                  t        | |t        j                  «       |¬«      «       |‚d}~ww xY w­w)	zZ
        Cancel a batch through the router with proper model-to-provider mapping.
        ré   r`  Ú_acancel_batchrÉ  rˆ  Nrÿ  r  )
r  rV   r¦  r  r�  rä  r  rp   r  r  r	  s         rÙ   Úacancel_batchzRouter.acancel_batchi  s¶   è ø€ ð	Ø#ˆF�7‰OØ*.×*=Ñ*=ˆFÐ&Ñ'Ü,NÐ]mÔ,nÐ"Ø×0Ñ0ØØØ'=ð 1ô ð
 %G D×$FÑ$FÑ$PÈÑ$P×PˆHàˆOð Qùô ò 		Ü×ÑÜ(Ø,0Ø#)Ü(1×(<Ñ(<Ó(>Ø'(ô	ôð ˆGûð		ür  c           	   ‹   ó"  K  — 	 t        j                  d||«       t        |«      }| j                  |dddœg|j	                  dd «      |¬«      ƒ d {  –—† }|j                  d«      xs i j                  d«      }|d	   j                  «       }| j                  |xs |¬
«      }|�|j                  |«       |j	                  dd «       |d   }| j                  ||d¬«       | j                  ||¬«      }	| j                  |xx   dz  cc<   |j                  d«      }
t        |d   |
¬«      \  }}}}|
xs |}
t        j                  di i |¥|
| j                  |	dœ¥|¥¤Ž}| j!                  ||d¬«      }|�\t#        |t$        j&                  «      rB|4 ƒd {  –—†  	 | j)                  ||¬«      ƒ d {  –—†  |ƒ d {  –—† }d d d «      ƒd {  –—†  n%| j)                  ||¬«      ƒ d {  –—†  |ƒ d {  –—† }| j*                  |xx   dz  cc<   t        j,                  d|«       |S 7 �ŒÕ7 Œ’7 Œx7 Œp7 Œb# 1 ƒd {  –—†7  sw Y   ŒLxY w7 Œ]7 ŒU# t.        $ r8}t        j0                  d|||«       |�| j2                  |xx   dz  cc<   |‚d }~ww xY w­w)Nz.Inside _acancel_batch()- model: %s; kwargs: %srd  zbatch-api-fake-textrO  rª  r«  rÛ   rY  r»  ©Úmodel_idrá  ré   r  rÝ  r¯  r¼   r&  r¶  rõ  r§  r¨  r¦  z/litellm.acancel_batch(model=%s)[32m 200 OK[0mz:litellm._acancel_batch(model=%s, %s)[31m Exception %s[0mr  )r   rš  r)   r¥  r»  rà   r™  Ú(get_deployment_credentials_with_providerrÔ  r¿  r«  rù  rµ   rÍ  r  ri  rÀ  rá   rä  r¬  r­  rû  r  r�  r¹  rú  )r4  ré   r¤  rþ  r  Úselected_deployment_idræ  Úresolved_credentialsrf  rÎ  r&  r  r·  r  r³  r   s                   rÙ   r  zRouter._acancel_batchˆ  s  è ø€ ð
M	Ü!×'Ñ'Ð(XÐZ_ÐagÔhÜ&GÈÓ&OÐØ&*×&IÑ&IØØ#)Ð6KÑLÐMØ$*§J¡JÐ/DÀdÓ$KØ%ð	 'Jó '÷ !ˆJð .8¯^©^¸LÓ-IÒ-OÈR×,TÑ,TÐUYÓ,ZÐ"Ø$Ð%5Ñ6×;Ñ;Ó=ˆDØ*.×*WÑ*WØ/Ò8°5ð +Xó +Ð ð $Ð/Ø—‘Ð0Ô1Ø�H‰HÐ.°Ô5Ø $ W¡ˆJØ×/Ñ/¸:ÈfÐdtÐ/Ôuà"&×"EÑ"EØ%Øð #Fó #ˆLð ×Ñ˜ZÓ(¨AÑ-Ó(ð #'§(¡(Ð+@Ó"AÐÜ4DØ˜7‘mØ$7ô5Ñ1ˆAÐ+¨Q°ð #6Ò"UÐ9UÐä×,Ñ,ñ ðØðà+>Ø#×3Ñ3Ø*ò	ð
 ðñˆHð $(×#3Ñ#3Ø%ØØ3ð $4ó $ˆMð Ð(¬Z¸Äw×GXÑGXÔ-YØ(÷ .ñ .ðð ×EÑEØ#-Ð@Pð Fó ÷ ð ð &.Ÿ~�H÷.÷ .ð .ð ×AÑAØ)Ð<Lð Bó ÷ ð ð "*Ÿ>�à×Ñ˜zÓ*¨aÑ/Ó*Ü!×&Ñ&Ð'^Ð`jÔkàˆOðG!ùðb.øð
øð  .øð.ø÷ .÷ .ñ .úðøð *ùô ò 	Ü!×+Ñ+ØRÐTYÐ[aÐcdôð Ð Ø—‘ Ó&¨!Ñ+Ó&ØˆGûð	üsÆ   ‚J„AI ÁH'ÁEI ÆH*ÆI ÆH2Æ3H,Æ4	H2Æ=H.Æ>H2ÇI ÇH0ÇI Ç)IÇ*	I Ç3I	Ç42I È&JÈ'I È*I È,H2È.H2È0I È2IÈ8H;È9IÉ I É	I É	JÉ3JÊJÊJc              ‹   ó¸  ‡K  — | j                  |¬«      }|€t        d«      ‚dt        fˆfd„}t        j                  |D �cg c]
  } ||«      ‘Œ c}Ž ƒ d{  –—† }dg ddddœ}|D ]g  }|€Œ|d	   €t        |d	«      rt        |d	«      |d	<   t        |d
«      |d
<   |d   j                  |j                  «       t        |dd«      du sŒcd|d<   Œi |S c c}w 7 Œ­w)zQ
        Return all the batches across all deployments of a model group.
        rG  Nr  ré   c              “   óx   •K  — 	 t        j                  di i | d   ¥‰¥¤Žƒ d {  –—† S 7 Œ# t        $ r Y y w xY w­w)Nr»  r  )rÍ  Úalist_batchesr�  r£  s    €rÙ   r  z0Router.alist_batches.<locals>.try_retrieve_batché  sI   øè ø€ ðä$×2Ñ2Ñ[Ð5Z¸Ð>NÑ8OÐ5ZÐSYÐ5ZÑ[×[Ð[Ð[ùÜò Ùðüs(   ƒ:…+ ¤)¥+ ¨:©+ «	7´:¶7·:râ   F)rS  ræ  Úfirst_idÚlast_idÚhas_morer#  r$  ræ  r%  T)	rI  r�  rŽ   rä  rç  r  r  Úextendræ  )r4  ré   r¤  r  r  r  Úfinal_resultsr  s     `     rÙ   r"  zRouter.alist_batchesÜ  s  øè ø€ ð &*×%8Ñ%8ÀEÐ%8Ó%JÐØÐ&ÜÐ9Ó:Ð:ð	Ô,?õ 	ô  'Ÿ~™~ÐWjÖ/kÈeÑ0BÀ5Õ0IÒ/kÐl×lˆð ØØØØñ&
ˆð ò 
	5ˆFØÑ!à  Ñ,Ð4¼ÀÈÔ9TÜ07¸À
Ó0K�M *Ñ-Ü+2°6¸9Ó+E�˜iÑ(Ø˜fÑ%×,Ñ,¨V¯[©[Ô9ô ˜6 :¨uÓ5¸Ò=Ø04�M *Ò-ð
	5ð Ðùò- 0lÐlús*   ƒ?CÁCÁCÁCÁCÁ-ACÃ
Cr&  c              ‹   ó„  K  — | j                  |j                  dd«      |¬«       |j                  d«      ru| j                  |d   ¬«      r`| j                  |d   |¬«      ƒ d {  –—† }|d   d   |d<   |d   j	                  «       }| j                  ||¬«       |j                  |«        |di |¤Žƒ d {  –—† S 7 ŒV7 Œ­w)	Nré   ro  r£  rG  ©ré   r’  r»  r¯  r  )r¦  rà   rI  r¥  r™  r¿  rÔ  )r4  r`  r&  r¤  r  ræ  s         rÙ   Ú)_pass_through_moderation_endpoint_factoryz0Router._pass_through_moderation_endpoint_factory  sà   è ø€ ð 	×,Ñ,Ø—*‘*˜W bÓ)Øð 	-ô 	
ð �:‰:�gÔ 4×#6Ñ#6À&ÈÁ/Ð#6Ô#RØ&*×&IÑ&IØ˜W‘oØ%ð 'Jó '÷ !ˆJð )Ð)9Ñ:¸7ÑCˆF�7‰OØ$Ð%5Ñ6×;Ñ;Ó=ˆDØ×/Ñ/Ø%Øð 0ô ð �M‰M˜$Ôá&Ñ0¨Ñ0×0Ð0ð!øð 1ús%   ‚A#C Á%B<Á&AC Â7B>Â8C Â>C )qÚ
assistantsr³  r¶  r¹  r¾  r¿  r¼  r½  rÀ  rº  r»  rÂ  rÃ  rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  rÊ  rË  rÌ  rÍ  rÁ  r·  r  r  r  rÜ  r  rß  rá  rã  rå  ró  rõ  r÷  rù  rû  rý  rÝ  rÞ  rà  râ  rä  ræ  rô  rö  rø  rú  rü  rþ  r  r  rÖ  rÛ  r¸  r  r(  r!  r*  r#  r,  r  r$  r"  r+  r  r%  r   r)  r  r&  r  r'  r0  r4  r2  r6  r3  r7  r1  r5  Úaupload_container_fileÚupload_container_fileÚalist_container_filesÚlist_container_filesÚaretrieve_container_fileÚretrieve_container_fileÚadelete_container_fileÚdelete_container_filerA  rB  rC  rD  rL  rM  rN  rO  rP  rQ  rR  rS  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  c                 óR  ‡ ‡‡— ‰dv r	 	 ddt         dz  dt        dz  fˆˆ fd„}|S ‰dv r	 	 ddt         dz  dt        dz  fˆˆ fd„}|S ‰dv r	 	 ddt         dz  dt        dz  fˆfd	„}|S ‰d
v r	 	 ddt         dz  dt        dz  fˆfd„}|S 	 	 ddt         dz  dt        dz  fˆˆˆ fd„}|S )zê
        Creates appropriate wrapper functions for different API call types.

        Returns:
            - A synchronous function for synchronous call types
            - An asynchronous function for asynchronous call types
        )r¼  r  r  rÝ  rÞ  r  rÛ  r(  r*  r,  r$  r+  r4  r6  r7  r5  Nr&  r³  c                 ó,   •—  ‰j                   dd‰i|¤ŽS )Nr`  r  )rÛ  ©r&  r³  r¤  r`  r4  s      €€rÙ   Úsync_wrapperz-Router.factory_function.<locals>.sync_wrapper·  s"   ø€ ð
 =�t×<Ñ<ÑkÐO`ÐkÐdjÑkÐkrç   )rà  râ  rä  ræ  c                 ót   •— | r	d|vr| |d<   |j                  d«      r ‰j                  dd‰i|¤ŽS  ‰di |¤ŽS )Nr&  ré   r`  r  )rà   rÛ  r6  s      €€rÙ   Úvector_store_sync_wrapperz:Router.factory_function.<locals>.vector_store_sync_wrapperÇ  sR   ø€ ñ
 'Ð+@ÈÑ+NØ4G�FÐ0Ñ1Ø—:‘:˜gÔ&Ø@˜4×@Ñ@ÑoÐSdÐoÐhnÑoÐoÙ(Ñ2¨6Ñ2Ð2rç   )rô  rö  rø  rú  rü  rþ  c                 ó   •—  ‰d| |dœ|¤ŽS )N©r&  r³  r  r  ©r&  r³  r¤  r`  s      €rÙ   Úvector_store_file_sync_wrapperz?Router.factory_function.<locals>.vector_store_file_sync_wrapperÝ  s'   ø€ ñ
 )ð Ø(;Ø!ñð ñð rç   )rZ  r\  r^  r`  rb  c                 ó<   •— | r	d|vr| |d<   d|vrd|d<    ‰di |¤ŽS )Nr&  Úgeminir  r  r<  s      €rÙ   Úmanaged_agents_sync_wrapperz<Router.factory_function.<locals>.managed_agents_sync_wrapperò  s<   ø€ ñ
 'Ð+@ÈÑ+NØ4G�FÐ0Ñ1Ø(°Ñ6Ø4<�FÐ0Ñ1Ù(Ñ2¨6Ñ2Ð2rç   c              ›   óò  •K  — ‰dk(  r ‰j                   d‰| |dœ|¤Žƒ d {  –—† S ‰dk(  r ‰j                  dd‰i|¤Žƒ d {  –—† S ‰dv r ‰j                  dd‰i|¤Žƒ d {  –—† S ‰dv r ‰j                  d‰| dœ|¤Žƒ d {  –—† S ‰dk(  r ‰j                  dd‰i|¤Žƒ d {  –—† S ‰d	v r ‰j
                  d‰|d
œ|¤Žƒ d {  –—† S ‰dv r ‰j                  d‰‰dœ|¤Žƒ d {  –—† S ‰dv r ‰j                  d‰| dœ|¤Žƒ d {  –—† S ‰dk(  r ‰j
                  d‰ddœ|¤Žƒ d {  –—† S ‰dv r ‰j                  dd‰i|¤Žƒ d {  –—† S ‰dv r ‰j                  d‰| dœ|¤Žƒ d {  –—† S ‰dv r ‰j
                  d‰| |dœ|¤Žƒ d {  –—† S ‰dv r ‰j                  d‰| dœ|¤Žƒ d {  –—† S ‰dv r ‰j                  d‰| dœ|¤Žƒ d {  –—† S y 7 �Œ³7 �Œ•7 �Œx7 �ŒZ7 �Œ<7 �Œ7 Œÿ7 Œà7 ŒÀ7 Œ¢7 Œƒ7 Œc7 ŒD7 Œ%­w)Nr+  )r`  r&  r³  r³  r`  r  )ró  rõ  r÷  rù  rû  rý  )r`  r&  r¹  )rÃ  rÄ  rÅ  )r`  r³  )r¶  rÂ  rÆ  rÇ  rÈ  rÉ  rÊ  rË  rÌ  r·  r  r  r  r  r!  r#  r  r"  r  r   r  r  rA  rB  rC  rD  )rµ  r`  )	r0  r2  r3  r1  r,  r.  r0  r2  Ú aretrieve_container_file_contentrÍ  T)r`  r´  )r½  r¾  r¿  rÀ  rÁ  )rÜ  r  rß  rá  rã  rå  )rº  r»  )rL  rM  rN  rP  rR  )rY  r[  r]  r_  ra  r  )Ú)_pass_through_assistants_endpoint_factoryr*  r–  Ú _init_vector_store_api_endpointsr¼  râ  rÖ  Ú_init_containers_api_endpointsÚ_init_responses_api_endpointsÚ _init_interactions_api_endpointsÚ"_init_managed_agents_api_endpoints)r&  r³  r¤  rµ  r`  r4  s      €€€rÙ   Úasync_wrapperz.Router.factory_function.<locals>.async_wrapper   s³  øè ø€ ð
 ˜LÒ(ØK˜T×KÑKð Ø&7Ø(;Ø!ñð ñ	÷ ð ð ˜lÒ*ØK˜T×KÑKñ Ø&7ðØ;Añ÷ ð ð Ð3Ñ3Ø9˜T×9Ñ9ñ Ø&7ðàñ÷ ð ð ð ñ ð C˜T×BÑBð Ø&7Ø(;ñð ñ÷ ð ð
 ˜lÒ*ØF˜T×FÑFñ Ø&7ðàñ÷ ð ð ð ñ ð
 D˜T×CÑCð Ø&7Ø!ñð ñ÷ ð ð
 ð ñ ð8 >˜T×=Ñ=ð Ø'Ø&7ñð ñ÷ ð ð
 ð 
ñ 
ð A˜T×@Ñ@ð Ø&7Ø(;ñð ñ÷ ð ð
 Ð6Ò6ØC˜T×CÑCð Ø&7Ø15ñð ñ÷ ð ð
 ð ñ ð @˜T×?Ñ?ñ Ø&7ðàñ÷ ð ð ð ñ ð C˜T×BÑBð Ø&7Ø(;ñð ñ÷ ð ð
 Ð?Ñ?ØC˜T×CÑCð Ø&7Ø(;Ø!ñð ñ	÷ ð ð ð ñ ð C˜T×BÑBð Ø&7Ø(;ñð ñ÷ ð ð
 ð ñ ð E˜T×DÑDð Ø&7Ø(;ñð ñ÷ ð ðð[ùðùðùðùðùðùðBøð øðøðøðøðøðøðúsù   ƒG7¢G£ G7ÁGÁG7Á#GÁ$ G7ÂGÂ G7Â%G!Â& G7ÃG$Ã G7Ã'G'Ã( G7ÄG)Ä	!G7Ä*G+Ä+G7Å
G-Å G7Å+G/Å,!G7ÆG1Æ G7Æ.G3Æ/ G7ÇG5ÇG7ÇG7ÇG7ÇG7Ç!G7Ç$G7Ç'G7Ç)G7Ç+G7Ç-G7Ç/G7Ç1G7Ç3G7Ç5G7©NN)r  rS  r   )r4  r`  rµ  r7  r9  r=  r@  rI  s   ```     rÙ   r©  zRouter.factory_function%  s"  ú€ ð~ ð 
ñ 
ð( 37Ø(,ñlÜ%(¨4¡Zðlä ™ölð  Ðàð 
ñ 
ð 37Ø(,ñ	3Ü%(¨4¡Zð	3ä ™ö	3ð -Ð,àð 
ñ 
ð 37Ø(,ñ	Ü%(¨4¡Zð	ä ™õ	ð 2Ð1àð 
ñ 
ð 37Ø(,ñ	3Ü%(¨4¡Zð	3ä ™õ	3ð /Ð.ð /3Ø!%ñ^	Ü!$ t¡ð^	ä˜$‘J÷^	ð@ Ðrç   c              ‹   ó¢   K  — |r	d|vr||d<   |j                  d«      r | j                  dd|i|¤Žƒ d{  –—† S  |di |¤Žƒ d{  –—† S 7 Œ7 Œ­w)zè
        Initialize the Vector Store API endpoints on the router.

        If a model is provided in kwargs, use model-based routing to get
        the deployment credentials. Otherwise, call the original function directly.
        r&  ré   r`  Nr  ©rà   râ  ©r4  r`  r&  r¤  s       rÙ   rD  z'Router._init_vector_store_api_endpoints¢  st   è ø€ ñ Ð#8ÀÑ#FØ,?ˆFÐ(Ñ)ð �:‰:�gÔØ?˜×?Ñ?ñ Ø"3ðàñ÷ ð ñ 'Ñ0¨Ñ0×0Ð0ðøð 1ús!   ‚4A¶A·AÁAÁAÁAc              ‹   ó:  K  — |r	d|vr||d<   ddl m} |j                  d«      }|j                  d«      }t        |t        «      rÁ|j                  |«      }|j                  d|«      }||k7  r||d<   |j                  d«      }	|	r|j                  d«      dk(  r|	|d<   |j                  d«      xs2 t        |t        «      r |j                  «       r|j                  «       nd}
|
r!|
|d	<    | j                  dd
|i|¤Žƒ d{  –—† S  |di |¤Žƒ d{  –—† S 7 Œ7 Œ­w)aã  
        Initialize the Containers API endpoints on the router.

        LiteLLM-managed container IDs (``cntr_...``) encode ``model_id`` and provider
        metadata. When present, decode the ID, replace ``container_id`` with the
        upstream value, and route through ``_ageneric_api_call_with_fallbacks`` so
        deployment credentials (e.g. regional ``api_base`` for Azure) match
        :meth:`_init_responses_api_endpoints`. Otherwise call the handler directly.
        r&  r   ©ÚResponsesAPIRequestUtilsÚcontainer_idr  Úresponse_idrð  Nré   r`  r  )Úlitellm.responses.utilsrP  rà   rá   r  Ú_decode_container_idr%  râ  )r4  r`  r&  r¤  rP  rQ  Ú_forwarded_model_idÚdecodedÚoriginal_idÚdecoded_providerr  s              rÙ   rE  z%Router._init_containers_api_endpoints»  s?  è ø€ ñ Ð#8ÀÑ#FØ,?ˆFÐ(Ñ)åDà$Ÿj™j¨Ó8ˆØ%+§Z¡Z°
Ó%;ÐÜ�l¤CÔ(Ø5×JÑJÈ<ÓXˆGØ!(§¡¨]¸LÓ!IˆKØ˜lÒ*Ø)4��~Ñ&Ø&-§k¡kÐ2GÓ&HÐÙ F§J¡JÐ/DÓ$EÈÒ$QØ0@�Ð,Ñ-ð &Ÿk™k¨*Ó5ò äÐ1´3Ô7Ð<O×<UÑ<UÔ<Wð $×)Ñ)Ô+àð ñ
 Ø"*��w‘ØC˜T×CÑCñ Ø&7ðàñ÷ ð ñ
 'Ñ0¨Ñ0×0Ð0ðøð
 1ús$   ‚D DÄDÄDÄDÄDÄDc              ‹   ó    K  — ddl m} |j                  |j                  d«      «      }|�||d<    | j                  dd|i|¤Žƒ d{  –—† S 7 Œ­w)zí
        Initialize the Responses API endpoints on the router.

        GET, DELETE, CANCEL Responses API Requests encode the model_id in the response_id, this function decodes the response_id and sets the model to the model_id.
        r   rO  rR  Nré   r`  r  )rS  rP  Úget_model_id_from_response_idrà   râ  )r4  r`  r¤  rP  r  s        rÙ   rF  z$Router._init_responses_api_endpointsê  sg   è ø€ õ 	Eà2×PÑPÐQW×Q[ÑQ[Ð\iÓQjÓkˆØÐØ&ˆF�7‰OØ;�T×;Ñ;ñ 
Ø/ð
àñ
÷ 
ð 	
ð 
ús   ‚AAÁAÁAc              ‹   ó&  K  — |r	d|vr||d<   d|vrd|d<   |j                  d«      r(|j                  d«      |j                  d«      k(  rd|d<   |j                  d«      r | j                  dd|i|¤Žƒ d{  –—† S  |di |¤Žƒ d{  –—† S 7 Œ7 Œ­w)zñ
        Initialize the Interactions API endpoints on the router.

        GET, DELETE, CANCEL Interactions API Requests don't need model-based routing,
        so we call the original function directly with the custom_llm_provider.
        r&  r?  Úagentré   Nr`  r  rL  rM  s       rÙ   rG  z'Router._init_interactions_api_endpointsþ  sµ   è ø€ ñ Ð#8ÀÑ#FØ,?ˆFÐ(Ñ)à ¨Ñ.Ø,4ˆFÐ(Ñ)à�:‰:�gÔ 6§:¡:¨gÓ#6¸&¿*¹*ÀWÓ:MÒ#MØ"ˆF�7‰Oð �:‰:�gÔØ?˜×?Ñ?ñ Ø"3ðàñ÷ ð ñ 'Ñ0¨Ñ0×0Ð0ð	øð 1ús$   ‚A6BÁ8BÁ9BÂBÂ	BÂBc              ‹   óV   K  — |r	d|vr||d<   d|vrd|d<    |di |¤Žƒ d{  –—† S 7 Œ­w)zÿ
        Initialize the Managed Agents API endpoints on the router (v1beta/agents).

        CRUD operations for Gemini managed agents don't need model-based routing,
        so we call the original function directly with the custom_llm_provider.
        r&  r?  Nr  r  rM  s       rÙ   rH  z)Router._init_managed_agents_api_endpoints  sE   è ø€ ñ Ð#8ÀÑ#FØ,?ˆFÐ(Ñ)Ø ¨Ñ.Ø,4ˆFÐ(Ñ)Ù&Ñ0¨Ñ0×0Ð0Ð0úr›  r³  c              ‹   óÂ   K  — |€E| j                   �.| j                   d   }|j                  | j                   d   «       nt        d«      ‚ |d||dœ|¤Žƒ d{  –—† S 7 Œ­w)z@Internal helper function to pass through the assistants endpointNr&  r»  z™'custom_llm_provider' must be set. Either via:
 `Router(assistants_config={'custom_llm_provider': ..})` 
or
 `router.arun_thread(custom_llm_provider=..)`r;  r  )rr  rÔ  r�  )r4  r`  r&  r³  r¤  s        rÙ   rC  z0Router._pass_through_assistants_endpoint_factory-  sw   è ø€ ð Ð&Ø×%Ñ%Ð1Ø&*×&<Ñ&<Ð=RÑ&SÐ#Ø—‘˜d×4Ñ4Ð5EÑFÕGäð sóð ñ 'ÐhÐ;NÐW]ÑhÐagÑh×hÐhÐhús   ‚AAÁAÁAÚoriginal_model_groupÚall_deploymentsrÏ  c              ƒ   ó,  K  — | j                  ||«      \  }}|dk7  ryt        |dd«      }	|	sy| j                  |«      }
|j                  |
«      }|€i }|||
<   t	        |t
        «      syt        |j                  d«      xs g «      }||	hz  }|D �ch c]J  }|j                  d«      xs i j                  d«      �$|j                  d«      xs i j                  d«      ’ŒL }}t        t        | d¬«      ƒ d{  –—† «      }||z
  |z
  }|syt        j                  d|t        |«      |«       t        |«      |d<   |t        |«      d	œ}i |¥|g|d
œ¥}	 t        |i |¤Žƒ d{  –—† S c c}w 7 Œs7 Œ# t        j                  t        t         f$ r Y yw xY w­w)zQSame-model-group retry after a failed deployment; returns None if not applicable.rp  Nr½  Ú_failover_excluded_idsrÛ   rY  ©r   rþ  z>Weighted failover: exclude=%r, remaining=%s for model_group=%r)ré   Ú_excluded_deployment_ids©Úfallback_model_groupr_  )rœ  r  Ú'_get_metadata_variable_name_from_kwargsrà   rá   r3  rl  rd   r   rš  r‰  râ   rm   rð  rÂ  r›   rœ   )r4  r¹  r_  r`  r'  r¤  rÏ  rC  r  Ú	failed_idr‰  ÚmetaÚprev_excludedÚexcludedÚdÚall_idsÚcooldown_idsÚ	remainingÚentryÚfailover_kwargss                       rÙ   Ú_maybe_run_weighted_failoverz#Router._maybe_run_weighted_failoverA  s×  è ø€ ð ×/Ñ/Ð0DÀfÓM‰ˆ�!ØÐ'Ò'Øä'.¨yÐ:PÐRVÓ'Wˆ	ÙØà(,×(TÑ(TÐU[Ó(\ÐØ�z‰zÐ0Ó1ˆØˆ<ØˆDØ-1ˆFÐ)Ñ*Ü˜$¤Ô%ØÜ" 4§8¡8Ð,DÓ#EÒ#KÈÓLˆØ'¨9¨+Ñ5ˆð %ö
àØ—‘�lÓ#Ò) r×.Ñ.¨tÓ4Ð@ð �U‰U�<Ó Ò& B×+Ñ+¨DÕ1ð
ˆð 
ô Ô!@ÐY]ÐptÔ!u×uÓvˆØ# lÑ2°hÑ>ˆ	ÙØä×#Ñ#ØLØÜ�	‹NØ ô		
ô *.¨h«ˆÐ%Ñ&ð *Ü(,¨X«ñ
ˆð"
Øð"
à%* GØ$8ò"
ˆð

	Ü+¨TÐE°_ÑE×EÐEùòM
ð vøð8 FùÜ—‘Ô!5Ô7PÐQò 	ñ ð	üsV   ‚BFÂAE'Ã!FÃ8E,Ã9AFÅE0 Å"E.Å#E0 Å&FÅ.E0 Å0FÆFÆFÆFr7  r5  c
              ƒ   ó–  K  — t        j                  t        j                  «      r1t        j                  dt        t        j                  «       «      «       |}
d}|j                  d«      }d}|du s|€|‚| |
dœ|¥}d|vr| j                  |d<   d|vrd	|d<   |	rd|d
<   t        |t        j                  t        j                  f«      }|j                  di «      xs i j                  d«      }| j                  ||¬«      xs g }|D �ch c]@  }t        j                  j!                  |«      �t        j                  j!                  |«      ’ŒB }}t#        |«      }t%        |«      dkD  r§|s¥|j                  d«      }|�|n|d	   }|D �cg c]  }||kD  sŒ	||dœ‘Œ }}d}|�;|�9t'        |¬«      r|}n*t)        |t+        t,        |«      ¬«      \  }}|€
|�||   d   }||xs g z   }|r)|j/                  ||dœ«       t1        |i |¤Žƒ d{  –—† }|S | j2                  r'|s%|�#| j5                  ||||||¬«      ƒ d{  –—† }|�|S 	 t        j6                  d«       t'        |¬«      }|r)|j/                  ||dœ«       t1        |i |¤Žƒ d{  –—† }|S t        |t        j                  «      r¢|�@| j9                  ||¬«      }|€|
‚|j/                  ||dœ«       t1        |i |¤Žƒ d{  –—† }|S d|› dt;        |«      › dt;        |«      › d�}t        j6                  d|› �¬«       t        j<                  rÔ|xj>                  d|› �z  c_        n»t        |t        j                  «      r¡|�@| j9                  ||¬«      } | €|
‚|j/                  | |dœ«       t1        |i |¤Žƒ d{  –—† }|S d|› dt;        |«      › dt;        |«      › d�}t        j6                  d |› �¬«       t        j<                  r|xj>                  d|› �z  c_        |�Ñ|�Ït        j                  d!t;        |«      «       t)        |t+        t,        |«      ¬«      \  }}!|€
|!�||!   d   }|€[t;        |«      }"t        j6                  d"||"«       tA        |
d#«      r+t        j<                  r|
xj>                  d$|› d%|"› �z  c_        |
‚|j/                  ||dœ«       t1        |i |¤Žƒ d{  –—† }|S tA        |
d#«      rZt        j<                  rJ|
xj>                  d(|› d)t;        |«      › �z  c_        t%        |«      d	kD  r|
xj>                  d*|› �z  c_        |
‚c c}w c c}w 7 �ŒC7 �Œ7 �ŒÉ7 �Œp7 �Œ·7 Œ‡# tB        $ r_}#tE        |«      }$tG        t        t-        |#«      «      «      }tI        | |$¬&«      ƒ d{  –—†7  }%t        jJ                  d'||%«       Y d}#~#Œæd}#~#ww xY w­w)+zD
        Common utilities for async_function_with_fallbacks
        zTraceback%sNré   ro  T)Úlitellm_routerr%  r€  Úfallback_depthr   r5  rÄ  Úuser_api_key_team_idr{  r¼   Ú_target_order)ré   rw  )r‰  )r‰  r…  rÀ  re  )r¹  r_  r`  r'  r¤  rÏ  zTrying to fallback b/w modelszmodel=z. context_window_fallbacks=z. fallbacks=zQ.

Set 'context_window_fallback' - https://docs.litellm.ai/docs/routing#fallbacksz€Got 'ContextWindowExceededError'. No context_window_fallback set. Defaulting                         to fallbacks, if available.)Úmsgú
z. content_policy_fallback=zQ.

Set 'content_policy_fallback' - https://docs.litellm.ai/docs/routing#fallbacksz�Got 'ContentPolicyViolationError'. No content_policy_fallback set. Defaulting                         to fallbacks, if available.zinside model fallbacks: %szGNo fallback model group found for original model_group=%s. Fallbacks=%sr#  z7No fallback model group found for original model_group=z. Fallbacks=rc  z�litellm.router.py::async_function_with_fallbacks() - Error occurred while trying to do fallbacks - %s
Debug Information:
Cooldown Deployments=%sz. Received Model Group=z!
Available Model Group Fallbacks=z
Error doing the fallback: )&r   ÚisEnabledForrÐ  r‡  rš  r;   r  r  rà   r€  rá   rÍ  ÚContextWindowExceededErrorrÃ  rI  ÚutilsÚ_get_deployment_orderr”  r‰  rk   rl   r   r  rÔ  rm   r­  rr  r  Ú(_get_fallback_model_group_from_fallbacksr>   r°  r#  r  r�  r)   r`   re   r  )&r4  r   r7  r‰  rŠ  r‹  r…  r'  r¤  r5  r%  rf  r_  Úfallback_failure_exception_strrÏ  Ú_skip_order_fallbackÚ_request_team_idr`  rl  Ú
_order_setÚorder_valuesÚcurrent_targetÚ
skip_up_toÚoÚorder_fallback_entriesÚexternal_fallback_groupÚgeneric_idxÚcombined_fallbacksr  Úis_non_standard_fallback_formatÚ#context_window_fallback_model_groupÚerror_messageÚ#content_policy_fallback_model_groupÚgeneric_fallback_idxÚmasked_fallbacksÚnew_exceptionrþ  Úcooldown_infos&                                         rÙ   r?  z1Router.async_function_with_fallbacks_common_utilsŽ  s“  è ø€ ô !×-Ñ-¬g¯m©mÔ<Ü!×'Ñ'¨´}ÄY×EYÑEYÓE[Ó7\Ô]Ø$%ÐØ#ÐØ28·*±*¸WÓ2EÐØ)+Ð&à Ñ$Ð(<Ð(DØˆGð #Ø"4ñ
ð ð
ˆð  ,Ñ.Ø,0×,>Ñ,>ˆL˜Ñ)Ø <Ñ/Ø-.ˆLÐ)Ñ*Ù"Ø6:ˆLÐ2Ñ3ô '1ØÜ×/Ñ/´×1TÑ1TÐUó'
Ðð 06¯z©z¸*ÀbÓ/IÒ/OÈR×.TÑ.TÐUkÓ.lÐð "&×!4Ñ!4Ð@TÐ^nÐ!4Ó!oÒ!uÐsuˆð %ö"
àÜ�}‰}×2Ñ2°1Ó5ÐAô �M‰M×/Ñ/°Õ2ð"
ˆ
ð "
ô
 %+¨:Ó$6ˆÜˆ|Ó˜qÒ Ñ)=à$*§J¡J¨Ó$?ˆNØ2@Ð2L¡ÐR^Ð_`ÑRaˆJð NZö3ØHIÐ]^ÐakÓ]kÐ.ÀÓCð3Ð"ð 3ð 48Ð#ØÐ$¨Ð)@Ü6ÀÕKð /8Ñ+ä;SØ"+Ü$(¬¨kÓ$:ô<Ñ8Ð+¨[ð /Ð6¸;Ð;RØ2;¸KÑ2HÈÑ2MÐ/ð )?ÐBYÒB_Ð]_Ñ(`Ðá!Ø×#Ñ#à0BØ0Dñôô "4Øð"à"ñ"÷ �ð  �ð ×(Ò(Ñ1EÐJ^ÐJjØ!×>Ñ>ØØ%9Ø /ØØØ)ð ?ó ÷ ˆHð Ð#Ø�ðH	Ü!×&Ñ&Ð'FÔGô 6YÐclÔ5mÐ+á.Ø×#Ñ#à09Ø0Dñôô "4Øð"à"ñ"÷ �ð
  �ä˜!œW×?Ñ?Ô@Ø+Ð7à×EÑEØ&>Ø(3ð Fó ð 8ð ;ÐBØ0Ð0à ×'Ñ'à4WØ4Hñôô &8Øð&à&ñ&÷  �Hð $�Oð '-¨[¨MÐ9TÔUmð  oGó  VHð  UIð  IUô  Vnð  oxó  Vyð  Uzð  zMð  %N�MÜ)×.Ñ.ð4Ø4A°?ðDõô
 ×<Ò<ØŸ	š	 r¨-¨Ð%9Ñ9ž	Ü˜Aœw×BÑBÔCØ+Ð7à×EÑEØ&>Ø(3ð Fó ð 8ð ;ÐBØ0Ð0à ×'Ñ'à4WØ4Hñôô &8Øð&à&ñ&÷  �Hð $�Oà&,¨[¨MÐ9SÔTlð  nFó  UGð  THð  HTô  Umð  nwó  Uxð  Tyð  yLð  %M�MÜ)×.Ñ.ð4Ø4A°?ðDõô
 ×<Ò<ØŸ	š	 r¨-¨Ð%9Ñ9�	ØÐ$¨Ð)@Ü%×+Ñ+Ð,HÔJbÐclÓJmÔnô -Ø'Ü $¤S¨+Ó 6ôñØ(Ø(ð (Ð/Ð4HÐ4TØ+4Ð5IÑ+JÈ3Ñ+OÐ(à'Ð/Ü.FÀyÓ.QÐ$Ü)×.Ñ.ØaØ#Ø(ôô
 Ð1°9Ô=Ä'×BgÒBgØ*×2Ò2Ð8oÐp{Ðo|ð  }Ið  JZð  I[ð  7\ñ  \Õ2Ø,Ð,à×#Ñ#à0DØ0Dñôô "4Øð"à"ñ"÷ �ð
  �ô  Ð% yÔ1´g×6[Ò6[à×&Ò&Ð,CÀKÀ=ÐPrô  tLð  Maó  tbð  scð  +dñ  dÕ&ÜÐ1Ó2°QÒ6Ø"×*Ò*Ð0LÐMkÐLlÐ.mÑmÕ*à Ð ùòU"
ùò3ð8ùðùð2ùð2 ùðB ùðZùô ò 	Ü&GÈÓ&OÐÜ-KÌMÔZ]Ð^kÓZlÓLmÓ-nÐ*Ü)XØ(,Ø!1ô*÷ $ð $ˆMô "×'Ñ'ð>ð /Ø÷ñ ûð	üsë   ‚DW	Ä
AUÅ;W	Æ

UÆUÆA.W	È
UÈ0W	È;UÈ<W	ÉAU Ê
UÊU ÊW	ÊAU Ë&UË'U Ë,W	Ë-B5U Î"UÎ#U Î(W	Î)D+U ÓUÓU ÓA4W	ÕW	ÕU ÕU ÕU ÕU Õ	WÕ'8WÖV"Ö WÖ<W	×W×W	c              �   ór  K  — |j                  d«      }t        |j                  d«      t        «      s¡t        t	        |j                  d«      dd«      ¬«      }|dk(  rdnd}t        |j                  |«      x}t
        «      r$|j                  d	d«       |j                  d
d«       t        |j                  |«      x}t
        «      rd|d	<   |�||d
<   |j                  dd«      du }|j                  dd«      }	|j                  d| j                  «      }
|j                  d| j                  «      }|j                  d| j                  «      }|j                  dd«      }	 | j                  |||
||¬«       |� | j                  |i |¤d|i¤Žƒ d{  –—† }n | j                  |i |¤Žƒ d{  –—† }t        j                  t        j                  «      rt        j                   d|«       t#        |d¬«      }|S 7 Œg7 ŒN# t$        $ r-}| j'                  ||	|
||||||¬«	      ƒ d{  –—†7  cY d}~S d}~ww xY w­w)z
        Try calling the function_with_retries
        If it fails after num_retries, fall back to another model group
        ré   ra  r`  rN  NrÉ  ru  rÄ  Úattempted_fallbacksr_  r   r5  FTr7  r‰  rŠ  r‹  Úmock_timeout)r¤  r…  r‰  rŠ  r‹  zAsync Response: %s)r  r”  )r5  )rà   rá   rj   rV   r  r3  r»  r‰  rŠ  r‹  Ú_handle_mock_testing_fallbacksÚasync_function_with_retriesr   rz  rÐ  r‡  rš  rL   r�  r?  )r4  r'  r¤  r…  Ú_fallback_metadata_keyÚ_sibling_metadata_keyÚ_sibling_metadataÚ_fallback_metadatar5  r7  r‰  rŠ  r‹  r•  r  r   s                   rÙ   r  z$Router.async_function_with_fallbacksŠ  sY  è ø€ ð *0¯©°GÓ)<ˆÜ˜&Ÿ*™*Ð%8Ó9Ô;SÔTÜ,NÜ% f§j¡jÐ1DÓ&EÀzÐSWÓXô-Ð"ð 5Ð8JÒJ‘
ÐPbð "ô ¨v¯z©zÐ:OÓ/PÐPÐ+ÔRVÔWð "×%Ñ%Ð&;¸TÔBØ!×%Ñ%Ð&<¸dÔCÜ°·
±
Ð;QÓ0RÐRÐ,ÔTXÔYØ<=Ð"Ð#8Ñ9ØÐ*ØALÐ&Ð'=Ñ>Ø)/¯©Ð4MÈuÓ)UÐY]Ð)]ÐØ06·
±
Ð;NÐPUÓ0VÐØ(.¯
©
°;ÀÇÁÓ(Oˆ	Ø06·
±
Ð;UÐW[×WtÑWtÓ0uÐ Ø06·
±
Ð;UÐW[×WtÑWtÓ0uÐ à$Ÿj™j¨¸Ó>ˆð	Ø×/Ñ/ØØ'Ø#Ø)AØ)Að 0ô ð Ð'Ø!A ×!AÑ!AÀ4Ð!mÈ6Ñ!mÐ`lÒ!m×m‘à!A ×!AÑ!AÀ4Ð!RÈ6Ñ!R×R�Ü$×1Ñ1´'·-±-Ô@Ü%×+Ñ+Ð,@À(ÔKÜ7Ø!Ø$%ôˆHð ˆOð nøàRùô ò 	Ø×HÑHØØ!ØØ(Ø(ØØØØ(?ð Ió 
÷ 
ð 
õ 
ûð	üsg   ‚EH7Å!1G> ÆG:ÆG> Æ-G<Æ.AG> Ç9H7Ç:G> Ç<G> Ç>	H4ÈH/È$H'È%H/È)H4È*H7È/H4È4H7c                 ó€  — t        j                  |«      }|j                  �,|j                  du rt        j                  |dd|› d|› �¬«      ‚|j
                  �,|j
                  du rt        j                  |dd|› d|› �¬«      ‚|j                  �-|j                  du rt        j                  |dd|› d|› �¬«      ‚yy)	a»  
        Helper function to raise a litellm Error for mock testing purposes.

        Raises:
            litellm.InternalServerError: when `mock_testing_fallbacks=True` passed in request params
            litellm.ContextWindowExceededError: when `mock_testing_context_fallbacks=True` passed in request params
            litellm.ContentPolicyViolationError: when `mock_testing_content_policy_fallbacks=True` passed in request params
        NTro  ú#This is a mock exception for model=z#, to trigger a fallback. Fallbacks=)ré   r$  r#  zF, to trigger a fallback.                     Context_Window_Fallbacks=zF, to trigger a fallback.                     Context_Policy_Fallbacks=)	r’   Úfrom_kwargsÚmock_testing_fallbacksrÍ  ÚInternalServerErrorÚmock_testing_context_fallbacksr{  Ú%mock_testing_content_policy_fallbacksrÃ  )r4  r¤  r…  r‰  rŠ  r‹  Úmock_testing_paramss          rÙ   r–  z%Router._handle_mock_testing_fallbacksÊ  s  € ô  &=×%HÑ%HÈÓ%PÐà×6Ñ6ÐBØ#×:Ñ:¸dÑBä×-Ñ-Ø!ØØ=¸k¸]ÐJmÐnwÐmxÐyôð ð  ×>Ñ>ÐJØ#×BÑBÀdÑJä×4Ñ4Ø!ØØ=¸k¸]ð K.Ø.FÐ-GðIôð ð  ×EÑEÐQØ#×IÑIÈTÑQä×5Ñ5Ø!ØØ=¸k¸]ð K.Ø.FÐ-GðIôð ð Rð Rrç   c              �   óü  K  — t        j                  d«       |j                  d«      }|j                  d| j                  «      }t	        |«      }|j                  d| j
                  «      }|j                  d| j                  «      }|j                  d| j                  «      }|j                  d«      }	|j                  dd «      }
|
}|€| j                  �| j                  nd	}|j                  d
|j                  d«      «      xs i }d|v rFt        |d   t        «      r3| j                  |d   ¬«      }|�|j                  dt        |«      i«       t        j                  d||«       d	|d<   ||d<   	 | j                  |	|¬«        | j                   |g|¢­i |¤Žƒ d {  –—† }t#        |d	d ¬«      }|S 7 Œ# t$        $ �r¶}d }|}t'        |dd «      }|
€|�t        |t(        «      r|}	 | j+                  |j                  d«      xs d|¬«      ƒ d {  –—†7  \  }}d}| j,                  €|�G|	xs$ |j                  d«      xs |j                  d«      }t/        |||| j,                  ¬«      }|�|}d}|s| j1                  ||||||¬«       ||d<   |d	kD  r| j3                  ||¬«      }n‚ t        j                  d|«       | j5                  |||||¬«      }t7        j8                  |«      ƒ d {  –—†7   t;        |«      D �]/  }	 |dz   |d<   ||d<    | j                   |g|¢­i |¤Žƒ d {  –—†7  }t=        j>                  |«      r|ƒ d {  –—†7  }t#        ||dz   |¬«      }|c cY d }~S # t$        $ r»}|}| j3                  ||¬«      }||z
  dz
  }|j                  d«      }|� | j+                  ||¬«      ƒ d {  –—†7  \  }}ng }|s(	 | j1                  ||||||¬«       n# t$        $ r |‚w xY w| j5                  |||||¬«      }t7        j8                  |«      ƒ d {  –—†7   Y d }~�Œ*d }~ww xY w tA        |«      tB        jD                  v r#tG        |d|«       |�|dz   n|}tG        |d|«       |‚d }~ww xY w­w)Nz#Inside async function with retries.r`  r‰  rŠ  r‹  r”  ré   r  r   ru  rÄ  r…  rG  Úmodel_group_sizezCasync function w/ retries: original_function - %s, num_retries - %sÚattempted_retriesrÃ  )r…  r¤  )r  r¦  rÃ  ro  r3  F©r¹  r…  r”  r“  T)r  rì  r`  rŠ  Úregular_fallbacksr‹  )r¤  r   z%Retrying request with num_retries: %s)r   Úremaining_retriesr  rì  r`  r¼   )$r   rš  r»  r‰  r)   rŠ  r‹  r”  rà   r  rá   r  rI  rÔ  r‰  Ú%_handle_mock_testing_rate_limit_errorrÅ  rM   r�  r  r  r;  r“  Ú"_get_num_retries_from_retry_policyÚshould_retry_this_errorÚ	log_retryÚ_time_to_sleep_before_retryrä  r=  r
  r.   Úis_async_callabler¸  rÍ  ÚLITELLM_EXCEPTION_TYPESra  )r4  r'  r¤  r`  r‰  rþ  rŠ  r‹  r”  r…  Úrequest_num_retriesr  Ú	_metadatarq  r  r   Úcurrent_attemptr%  Údeployment_num_retriesrC  Ú_all_deploymentsÚ_retry_policy_appliesÚ_model_group_for_retry_policyÚ_retry_policy_retriesr’  r©  Ú_modelr  Ú_timeoutÚactual_retries_attempteds                                 rÙ   r—  z"Router.async_function_with_retriesù  sH  è ø€ ä×#Ñ#Ð$IÔJØ#)§:¡:Ð.AÓ#BÐØ!Ÿ:™: k°4·>±>ÓBˆ	Ü"CÀFÓ"KÐØ*0¯*©*Ð5OÐQU×QnÑQnÓ*oÐ Ø*0¯*©*Ð5OÐQU×QnÑQnÓ*oÐ à*0¯*©*Ð5OÐQU×QnÑQnÓ*oÐ Ø)/¯©°GÓ)<ˆØ17·±¸MÈ4Ó1PÐØ)ˆØÐð /3×.>Ñ.>Ð.J˜$×*Ò*ÐPQˆKð "(§¡Ð,>ÀÇ
Á
È:Ó@VÓ!WÒ!]Ð[]ˆ	Ø˜IÑ%¬*°Y¸}Ñ5MÌsÔ*SØ $× 3Ñ 3¸yÈÑ?WÐ 3Ó XˆJØÐ%Ø× Ñ Ð"4´c¸*³oÐ!FÔGä×#Ñ#ØQÐSdÐfqô	
ð *+ˆ	Ð%Ñ&Ø#.ˆ	�-Ñ ðX	%Ø×6Ñ6À;ÐW]Ð6Ô^à+˜TŸ^™^Ð,=ÐOÀÒOÈÑO×OˆHÜ4¸hÐZ[ÐimÔnˆHØˆOð Pùô ó R	%Ø"ˆOØ!"ÐÜ,3°A°}ÀdÓ,KÐ"ð $Ð+Ø*Ð6ÜÐ5´sÔ;à4�ðð ×9Ñ9Ø—j‘j Ó)Ò/¨RØ!1ð :ó ÷ ð ñØ$Ø ð %*Ð!Ø× Ñ Ð,Ð0HÐ0Tð 1<Ò0r¸y¿}¹}È]Ó?[Ò0rÐ_e×_iÑ_iÐjqÓ_rÐ-ä/QØ0Ø =Ø-EØ!%×!2Ñ!2ô	0Ð%ð )Ð4Ø"7�KØ,0Ð)ñ )Ø×,Ñ,ØØ(<Ø$4Ø-EØ&/Ø-Eð -ô ð (3ˆI�mÑ$ð ˜QŠØŸ™¨vÐ9K˜ÓL‘àä!×'Ñ'Ð(OÐQ\Ô]à!%×!AÑ!AØ$Ø"-Ø'Ø$8Ø 0ð "Bó "ˆKô —-‘- Ó,×,Ñ,ä#(¨Ó#5ó =2�ð<2à5DÀqÑ5H�IÐ1Ñ2Ø/:�I˜mÑ,à%3 T§^¡^Ð4EÐ%WÈÒ%WÐPVÑ%W×WÐW�HÜ(×:Ñ:¸8ÔDØ)1§> >˜ä<Ø!)Ø*9¸AÑ*=Ø$/ô �Hð
 $—Oøä ò ,2ð *+Ð&ð "Ÿ^™^°6¸Q˜^Ó?�FØ(3°oÑ(EÈÑ(IÐ%Ø)/¯©°GÓ)<�FØÐ)ð #'×"EÑ"EØ"(Ø-=ð #Fó #÷ ð ñØ0Ùð 02Ð,ñ 1ð
$Ø ×8Ñ8Ø&'Ø4HØ0@Ø9QØ2;Ø9Qð 9õ øô  )ò $Ø"#˜Gð$úð  $×?Ñ?ØØ*;Ø$/Ø,@Ø(8ð  @ó  �Hô "Ÿ-™-¨Ó1×1×1ûðY,2úð#=2ô~ Ð&Ó'¬7×+JÑ+JÑJÜÐ*¨M¸;ÔGð JYÐId°/ÀAÒ2EÐjuÐ(ÜÐ*¨MÐ;SÔTà$Ð$ûðeR	%üsÖ   ‚E3Q<Å6,F9 Æ"F7Æ#F9 Æ6Q<Æ7F9 Æ9
Q9ÇAQ4ÈHÈCQ4Ë0K3Ë1Q4Ì&M,Ì,L/Ì-M,ÍMÍM,Í$Q4Í&Q9Í'Q<Í,	P0Í5AP+Î;N>
Î<P+Ï
O"Ï!P+Ï"O.	Ï.1P+ÐP"
Ð P+Ð%Q4Ð+P0Ð0AQ4Ñ4Q9Ñ9Q<c              �   óè   K  — |j                  d«      } ||i |¤Ž}t        j                  |«      st        j                  |«      r
|ƒ d{  –—† }| j                  |||¬«      ƒ d{  –—† }|S 7 Œ"7 Œ­w)z^
        Handler for making a call to the .completion()/.embeddings()/etc. functions.
        ré   N)r  r…  r’  )rà   r.   r¯  r%  ÚisawaitableÚset_response_headers)r4  r`  r'  r¤  r…  r  s         rÙ   rÅ  zRouter.make_call²  sr   è ø€ ð $ŸZ™Z¨Ó0ˆÙ$ dÐ5¨fÑ5ˆÜ×.Ñ.¨xÔ8¼G×<OÑ<OÐPXÔ<YØ%—~ˆHà×2Ñ2¸HÐR]ÐntÐ2Óu×uˆàˆð	 &øàuús$   ‚A	A2ÁA.ÁA2Á'A0Á(A2Á0A2c                 ó4  — |j                  dd«      }| j                  |¬«      }d}|�6t        |«      dk(  r(t        t        dz  |d   d   j                  d«      «      }|�8|du r3t        j                  d	|«       t        j                  |d
d|› d�|¬«      ‚yy)zá
        Helper function to raise a mock litellm.RateLimitError error for testing purposes.

        Raises:
            litellm.RateLimitError error when `mock_testing_rate_limit_error=True` passed in request params
        Úmock_testing_rate_limit_errorNrG  r¼   r   r»  r  TzVlitellm.router.py::_mock_rate_limit_error() - Raising mock RateLimitError for model=%sro  r�  z , to trigger a rate limit error.)ré   r$  r#  r  )
r»  rI  r‰  r   r  rà   r   r  rÍ  ÚRateLimitError)r4  r¤  r…  rÀ  Úavailable_modelsr  s         rÙ   rª  z,Router._handle_mock_testing_rate_limit_error¿  sÃ   € ð =C¿J¹JÐGfÐhlÓ<mÐ%à"&×"5Ñ"5ÀÐ"5Ó"MÐØ"&ˆàÐ'¬CÐ0@Ó,AÀQÒ,FÜœs T™zÐ+;¸AÑ+>Ð?OÑ+P×+TÑ+TÐUbÓ+cÓdˆKà(Ð4Ð9VÐZ^Ñ9^Ü!×&Ñ&ØhÐjuôô ×(Ñ(Ø!ØØ=¸k¸]ÐJjÐkØ'ô	ð ð	 :_Ð4rç   r  r¨  c                 óX  — d}|�t        |t        «      rt        |«      }d}|�t        |t        «      rt        |«      }t        |t        j                  «      r|�|‚t        |t        j
                  «      r|�|‚t        |dd«      }	|	�t        j                  |	«      s|	dvr|‚t        |t        j                  «      r|‚t        |t        j                  «      r|dk  r|�t        |«      dkD  r|‚t        |t        j                  t        j                  f«      r	 |dk  r|‚|dk  r|‚y)au  
        1. raise an exception for ContextWindowExceededError if context_window_fallbacks is not None
        2. raise an exception for ContentPolicyViolationError if content_policy_fallbacks is not None

        2. raise an exception for RateLimitError if
            - there are no fallbacks
            - there are no healthy deployments in the same model group
        r   Nr  )i‘  i“  r¼   T)rá   râ   r‰  rÍ  r{  rÃ  r  Ú_should_retryÚNotFoundErrorrð  rÁ  ÚAuthenticationErrorÚPermissionDeniedError)
r4  r  rì  r`  rŠ  r‹  r¨  Ú_num_healthy_deploymentsÚ_num_all_deploymentsr  s
             rÙ   r¬  zRouter.should_retry_this_errorÙ  s3  € ð" $%Ð ØÐ*¬zÐ:MÌtÔ/TÜ'*Ð+>Ó'?Ð$à ÐØÐ&¬:°oÄtÔ+LÜ#& Ó#7Ð ô �eœW×?Ñ?Ô@ÐE]ÐEiØˆKä�eœW×@Ñ@ÔAÐF^ÐFjØˆKä$ U¨M¸4Ó@ˆØÐ"¬7×+@Ñ+@ÀÔ+Mà *Ñ,Ø�ä�eœW×2Ñ2Ô3ØˆKä�eœV×2Ñ2Ô3à(¨AÒ-Ø%Ð1ÜÐ)Ó*¨QÒ.à�ä�eœf×8Ñ8¼&×:VÑ:VÐWÔXðð $ qÒ(Ø�ð $ qÒ(ØˆKàrç   c                 ó4   — t        | j                  g|¢­i |¤ŽS )z~
        Sync wrapper for async_function_with_fallbacks

        Wrapped to reduce code duplication and prevent bugs.
        )r(   r  )r4  r'  r¤  s      rÙ   r§  zRouter.function_with_fallbacks  s   € ô " $×"DÑ"DÐVÀtÒVÈvÑVÐVrç   c                 ól   — |€yd}|D ])  }t        |j                  «       «      d   |k(  sŒ#||   } |S  |S )a@  
        Returns the list of fallback models to use for a given model group

        If no fallback model group is found, returns None

        Example:
            fallbacks = [{"gpt-3.5-turbo": ["gpt-4"]}, {"gpt-4o": ["gpt-3.5-turbo"]}]
            model_group = "gpt-3.5-turbo"
            returns: ["gpt-4"]
        Nr   )râ   Úkeys)r4  r‰  r…  rf  rC  s        rÙ   r~  z/Router._get_fallback_model_group_from_fallbacks!  sV   € ð ÐØà15ÐØò 	ˆDÜ�D—I‘I“KÓ  Ñ# {Ó2Ø'+¨KÑ'8Ð$ØØ#Ð#ð		ð $Ð#rç   c                 óÂ   — | j                   €y| j                   D ]C  }t        |t        «      sŒd|v sŒ|d   }t        |t        «      sŒ/t	        |«      dkD  sŒ>|d   c S  y)zX
        Returns the first model from the default_fallbacks list, if it exists.
        NrÀ  r   )r‰  rá   r3  râ   r‰  )r4  ÚfallbackÚdefault_lists      rÙ   Ú_get_first_default_fallbackz"Router._get_first_default_fallback:  sb   € ð �>‰>Ð!ØØŸ™ò 	+ˆHÜ˜(¤DÕ)¨c°XªoØ'¨™}�Ü˜l¬DÕ1´c¸,Ó6GÈ!Ó6KØ'¨™?Ò*ð		+ð
 rç   r©  c                 ó   — |�t        |«      dk(  rn!|�t        |t        «      rt        |«      dkD  ryd}t        |d«      r,t        |j                  d«      r|j                  j
                  }t        |d«      r|j                  }|�%t        j                  |||| j                  ¬«      }|S t        j                  ||| j                  ¬«      }|S )	zÞ
        Calculate back-off, then retry

        It should instantly retry only when:
            1. there are healthy deployments in the same model group
            2. there are fallbacks for the completion call
        Nr¼   r   r  ÚheadersÚlitellm_response_headers)r©  rÃ  Úresponse_headersÚmin_timeout)r©  rÃ  rÕ  )
r‰  rá   râ   r  r  rÒ  rÓ  rÍ  Ú_calculate_retry_afterr’  )r4  r   r©  r  rì  r`  rÔ  r�  s           rÙ   r®  z"Router._time_to_sleep_before_retryG  s×   € ð" Ð&¬3¨Ó+?À1Ò+DØØ Ð,´Ð<OÔQUÔ1VÔ[^Ð_rÓ[sÐvwÒ[wØà15ÐÜ�1�jÔ!¤g¨a¯j©j¸)Ô&DØ Ÿz™z×1Ñ1ÐÜ�1Ð0Ô1Ø ×9Ñ9ÐàÐ'Ü×4Ñ4Ø"3Ø'Ø!1Ø ×,Ñ,ô	ˆGð ˆô ×4Ñ4Ø"3Ø'Ø ×,Ñ,ôˆGð ˆrç   c              ƒ   óþ  K  — ddl m} 	 |j                  d«      dv ry|j                  dd«      }|€t        d«      ‚|d   j                  d	«      €y|d   d	   j                  d
d«      }|d   d	   j                  dd«      }|d   j                  di «      xs i }	|	j                  dd«      }
|�|
€yt	        |
t
        «      rt        |
«      }
| j                  |
¬«      }|€y| j                  ||¬«      }|j                  dd«      }|j                  dd«      }|j                  j                  }|j                  j                  }|j                  dd«      }|j                  dd«      }t        | |
¬«       t	        |t        «      r|n|j                  «       }t        |«      }|€|€|€	|€|€|€|syt!        |«      }|j                  dd«      }t#        «       }|j%                  d«      }t&        j(                  j*                  j-                  |
||¬«      }g }|j/                   |||t0        j2                  j*                  ¬«      «       t&        j4                  j*                  j-                  |
||¬«      }|j/                   ||dt0        j2                  j*                  ¬«      «       | j6                  j9                  ||¬«      ƒ d{  –—†  |S 7 Œ# t:        $ r }t=        j>                  d|«       Y d}~yd}~ww xY w­w)zG
        Track remaining tpm/rpm quota for model in model_list
        r   )ÚRedisPipelineIncrementOperationrµ  )rÆ  rÂ  NrÙ  zstandard_logging_object is Noner»  rÄ  r  r…  rÛ   rY  r  ©r  Úreceived_model_nameÚtpmÚrpm©r   r¾  rQ  ú%H-%M©rY  Úcurrent_minuteré   )rÅ  Úincrement_valuerY  r¼   )Úincrement_listrþ  zOlitellm.router.Router::deployment_callback_on_success(): Exception occured - %s) Úlitellm.types.cachingrØ  rà   r×   rá   r  r  Úget_deploymentÚget_router_model_infor»  rÛ  rÜ  r~   r3  r  ru   r)   r¸   Ústrftimer—   ÚTPMrÑ   Úformatrø  rW  rY  ÚRPMr¼  Úasync_increment_cache_pipeliner�  r   rš  )r4  r¤  Úcompletion_responserü  rý  rØ  rÙ  Údeployment_namer…  rÛ   rY  Údeployment_infoÚdeployment_model_inforÛ  rÜ  Útpm_litellm_paramsÚrpm_litellm_paramsÚtpm_model_infoÚrpm_model_infoÚdeployment_dictÚhas_io_token_limitsrþ  rQ  Údtrà  Útpm_keyÚpipeline_operationsÚrpm_keyr   s                                rÙ   r
  z%Router.deployment_callback_on_successv  sG  è ø€ õ 	Jðq	à�z‰z˜+Ó&Ð*QÑQØØLRÏJÉJÐWpÐrvÓLwÐ#Ø&Ð.Ü Ð!BÓCÐCØÐ&Ñ'×+Ñ+¨JÓ7Ð?Øà)/Ð0@Ñ)AÀ*Ñ)M×)QÑ)QØ  $ó*�ð &,Ð,<Ñ%=¸jÑ%I×%MÑ%MÈmÐ]aÓ%b�Ø$*Ð+;Ñ$<×$@Ñ$@ÀÈrÓ$RÒ$XÐVX�
Ø—^‘^ D¨$Ó/�ØÐ&¨"¨*ØÜ ¤CÔ(Ü˜R›�Bð *.×)<Ñ)<ÀbÐ)<Ó)I�à"Ð*Øà37×3MÑ3MØ#2Ø,7ð 4Nó 4Ð)ð
 "1×!4Ñ!4°U¸DÓ!A�CØ!0×!4Ñ!4°U¸DÓ!A�Cð 1@×0NÑ0N×0RÑ0RÐ&Ø0?×0NÑ0N×0RÑ0RÐ&ð -B×,EÑ,EÀeÈTÓ,R�NØ,A×,EÑ,EÀeÈTÓ,R�Nô BØ,0Ø"$õô
 6@ÀÔQUÔ5V¡/Ð\k×\vÑ\vÓ\x�Ü-KÈOÓ-\Ð#ð �KØ˜Ø*Ð2Ø*Ð2Ø&Ð.Ø&Ð.Ù/àä*KÈFÓ*SÐ Ø-D×-HÑ-HÈÐYZÓ-[�ô
 -Ó.�Ø(*¯©°GÓ(<�ä)×-Ñ-×3Ñ3×:Ñ:¸bÐQ_ÐgvÐ:Ów�ð
 UWÐ#ð $×*Ñ*Ù3Ø#Ø(4Ü'ŸO™O×1Ñ1ôôô *×-Ñ-×3Ñ3×:Ñ:¸bÐQ_ÐgvÐ:Ów�Ø#×*Ñ*Ù3Ø#Ø()Ü'ŸO™O×1Ñ1ôôð —j‘j×?Ñ?Ø#6Ø%5ð @ó ÷ ð ð
 �ðùô ò 	Ü!×'Ñ'ØaÐcd÷ñ ûð	üs}   ‚K=ŠK �K=ž3K ÁK=ÁAK Â1K=Â2/K Ã!K=Ã"CK Æ1K=Æ2DK ËKË	K ËK=ËK Ë	K:ËK5Ë0K=Ë5K:Ë:K=c                 ó  — d}|d   j                  d«      €nc|d   d   j                  dd«      }|d   j                  di «      xs i }|j                  dd«      }|�|€yt        |t        «      rt        |«      }|�t	        | |¬«      }|S y)zÝ
        Tracks the number of successes for a deployment in the current minute (using in-memory cache)

        Returns:
        - key: str - The key used to increment the cache
        - None: if no key is found
        Nr»  rÄ  r…  rÛ   rY  rÝ  )rà   rá   r  r  r~   )	r4  r¤  rë  rü  rý  rY  r…  rÛ   rÅ  s	            rÙ   r  z*Router.sync_deployment_callback_on_successõ  s®   € ð ˆØÐ"Ñ#×'Ñ'¨
Ó3Ð;Øà!'Ð(8Ñ!9¸*Ñ!E×!IÑ!IÈ-ÐY]Ó!^ˆKØ &Ð'7Ñ 8× <Ñ <¸\È2Ó NÒ TÐRTˆJØ—‘  dÓ+ˆBØÐ" b jØÜ˜B¤Ô$Ü˜“W�àˆ>ÜJØ(,Ø ôˆCð ˆJàrç   c           
      ó$  — t        j                  d«       	 |j                  dd«      }t        |«      rt        j                  d«       yt	        |dd«      }|j                  di «      }|j                  d	i «      }t
        j                  j                  j                  |¬
«      }	t        t        |t        «      r|nd|d¬«      }
d}|	� t
        j                  j                  |	¬«      }|
�|
dk\  r|
}n|�|dk\  r|}n| j                  }t        |t        «      rP|j                  d«      }|€yt        | |¬«       t!        | ||||t#        |«      xs i j                  d«      ¬«      }|S t        j                  d«       y# t$        $ r}|‚d}~ww xY w)a`  
        2 jobs:
        - Tracks the number of failures for a deployment in the current minute (using in-memory cache)
        - Puts the deployment in cooldown if it exceeds the allowed fails / minute

        Returns:
        - True if the deployment should be put in cooldown
        - False if the deployment should not be put in cooldown
        z1Router: Entering 'deployment_callback_on_failure'r¹  NzŽRouter: Exiting 'deployment_callback_on_failure' without cooldown. Failure originated from advisor orchestration, not the selected deployment.Fr  ro  r»  rÛ   )r%  r—  )rÅ  )rÔ  r   rY  rÝ  r…  )r   Úexception_statusr%  r  Útime_to_cooldownÚrequested_model_groupzWRouter: Exiting 'deployment_callback_on_failure' without cooldown. No model_info found.)r   rš  rà   ri   r  rÍ  Úlitellm_core_utilsÚexception_mapping_utilsÚ_get_response_headersrf   rá   r3  r|  Ú&_get_retry_after_from_exception_headerr—  r}   rh   r+   r�  )r4  r¤  rë  rü  rý  r¹  rû  r»  Ú_model_infoÚexception_headersÚdeployment_cooldownÚheader_cooldownÚ_time_to_cooldownr¾  r  r   s                   rÙ   r  z%Router.deployment_callback_on_failure  s¹  € ô  	×#Ñ#Ð$WÔXðD	Ø%Ÿz™z¨+°tÓ<ˆIä/°	Ô:Ü%×+Ñ+ðbôð ä&-¨i¸ÈÓ&KÐð %+§J¡JÐ/?ÀÓ$DˆNØ!/×!3Ñ!3°LÀ"Ó!EˆKä'.×'AÑ'A×'YÑ'Y×'oÑ'oØ#,ð (pó (Ðô
 *8Ü)¨+´tÔ<‘À$ÈÐ\kô*Ðð #ˆOØ Ð,Ü")§-¡-×"VÑ"VØ%6ð #Wó #�ð #Ð.Ð3FÈ!Ò3KØ$7Ñ!Ø Ð,°ÀAÒ1EØ$3Ñ!à$(×$6Ñ$6Ð!ä˜+¤tÔ,Ø3>·?±?À4Ó3H�Ø Ð(Ø Ü@Ø,0Ø"/õô !:Ø,0Ø%5Ø'0Ø,Ø%6Ü+KÈFÓ+SÒ+YÐWY×*^Ñ*^Ð_lÓ*mô!�ð �ä%×+Ñ+Ømôð øäò 	ØˆGûð	ús*   —2E? Á
C"E? Ä-;E? Å)E? Å?	FÆF
Æ
Frë  c              ƒ   ó(  K  — |d   d   j                  dd«      }|d   d   j                  dd«      }|d   j                  di «      xs i }|j                  dd«      }|�|€yt        |t        «      rt        |«      }t	        |«      }	t        «       }
|
j                  d«      }t        j                  j                  j                  |||¬	«      }| j                  j                  |d
|	t        j                  j                  ¬«      ƒ d{  –—†  y7 Œ­w)z3
        Update RPM usage for a deployment
        r»  rÄ  r  Nr…  rÛ   rY  rÞ  rß  r¼   )rÅ  rÑ   rþ  rY  )rà   rá   r  r  r)   r¸   ræ  r—   ré  rÑ   rè  r¼  Úasync_increment_cacherW  rY  )r4  r¤  rë  rü  rý  rì  r…  rÛ   rY  rþ  rõ  rà  rø  s                rÙ   r  z+Router.async_deployment_callback_on_failureo  s  è ø€ ð "(Ð(8Ñ!9¸*Ñ!E×!IÑ!IØ˜$ó"
ˆð $Ð$4Ñ5°jÑA×EÑEÀmÐUYÓZˆØ"Ð#3Ñ4×8Ñ8¸ÀrÓJÒPÈbˆ
Ø�^‰^˜D $Ó'ˆØÐ " *ØÜ˜œCÔ Ü�R“ˆBÜ"CÀFÓ"KÐä$Ó&ˆØ "§¡¨GÓ 4ˆô )×,Ñ,×2Ñ2×9Ñ9¸RÐP^ÐfuÐ9ÓvˆØ�j‰j×.Ñ.ØØØ-Ü—‘×%Ñ%ð	 /ó 
÷ 	
ò 	
ús   ‚DDÄ
DÄD)rÄ  ru  c                 ó   — t        |«      S )a«  
        Helper to return what the "metadata" field should be called in the request data

        - New endpoints return `litellm_metadata`
        - Old endpoints return `metadata`

        Context:
        - LiteLLM used `metadata` as an internal field for storing metadata
        - OpenAI then started using this field for their metadata
        - LiteLLM is now moving to using `litellm_metadata` for our metadata
        )r,   )r4  r¤  s     rÙ   rg  z.Router._get_metadata_variable_name_from_kwargs�  s   € ô 6°fÓ=Ð=rç   c                 ó$  — d|v rdnd}||   }t        |j                  «       D ��ci c]  \  }}||k7  sŒ|t        vsŒ||“Œ c}}«      }t        |j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}«      }t        t        |«      j                  t        |«      dœ|¥||i¥«      }	|j                  d«      }
t        |
t        t        f«      rt        |
«      t        dz
   d nd}g |¢t        |	«      ‘­}|||   d<   |S c c}}w c c}}w )zƒ
        When a retry or fallback happens, log the details of the just failed model call - similar to Sentry breadcrumbing
        ru  rÄ  Úprevious_models)Úexception_typeÚexception_stringr¼   Nr  )r   r;  rc  r¸  rN  r  rà   rá   râ   rã   re  r=   )r4  r¤  r   Ú_metadata_varÚrequest_metadatar`  ra  Úattempt_kwargsÚattempt_metadataÚprevious_modelÚearlier_breadcrumbsÚkept_breadcrumbsÚbreadcrumbss                rÙ   r­  zRouter.log_retry›  sH  € ð 6HÈ6Ñ5QÑ1ÐWaˆØ8>¸}Ñ8MÐÜ 0Ø$Ÿl™l›n×q‘d�a˜°°]Ó0BÀqÔPpÒGpˆQ�‰TÓqó!
ˆô #3Ø.×4Ñ4Ó6×Q‘d�a˜¸!Ð?PÓ:PˆQ�‰TÓQó#
Ðô !1ä"& q£'×"2Ñ"2Ü$'¨£Fñð !ðð Ð/ñ	ó!
ˆð &6×%9Ñ%9Ð:KÓ%LÐô Ð-´´e¨}Ô=ô Ð%Ó&Ô)?À!Ñ)CÐ'DÐ'FÑGàð 	ð
 ^Ð/Ð]Ô1LÈ^Ó1\Ñ]ˆØ3>ˆˆ}ÑÐ/Ñ0Øˆùó+ rùó Rs   ¦D
´D
½D
Á"D
Á0D
r¾  rþ  c                 óÖ   — |}| j                   j                  ||d¬«      }|€#d}| j                   j                  ||dd¬«       |S |dz  }| j                   j                  ||d¬«       |S )zf
        Update deployment rpm for that minute

        Returns:
        - int: request count
        T)rÅ  rþ  Ú
local_onlyr¼   rX  )rÅ  rÑ   r  rY  )rÅ  rÑ   r  )r¼  Ú	get_cacheÚ	set_cache)r4  r¾  rþ  rø  Úrequest_counts        rÙ   Ú_update_usagezRouter._update_usage¹  s€   € ð 'ˆàŸ
™
×,Ñ,°ÐK[ÐhlÐ,ÓmˆØÐ ØˆMØ�J‰J× Ñ  W°MÈdÐXZÐ Ô[ð
 Ðð ˜QÑˆMØ�J‰J× Ñ  W°MÈdÐ ÔSàÐrç   c                 ón   — | j                   €y| j                   D ]  }t        |t        «      sŒd|v sŒ y y)NFrÀ  T)r‰  rá   r3  )r4  rÎ  s     rÙ   Ú_has_default_fallbackszRouter._has_default_fallbacksÌ  s;   € Ø�>‰>Ð!ØØŸ™ò 	 ˆHÜ˜(¤DÕ)Ø˜(’?Ùð	 ð rç   c                 óv  — |j                   r5t        |j                   «      dkD  r|j                   d   j                  dk7  ry|j                  d| j                  «      }|�2d}|D ](  }t        |j                  «       «      d   |k(  sŒ#||   } n |�y| j                  «       ryt        j                  d||«       y)z§
        Determines if a content policy error should be raised.

        Only raised if a fallback is available.

        Else, original response is returned.
        r   Úcontent_filterFr‹  NTzyContent Policy Error occurred. No available fallbacks. Returning original response. model=%s, content_policy_fallbacks=%s)
rû   r‰  Úfinish_reasonrà   r‹  râ   rÌ  r  r   rš  )r4  ré   r  r¤  r‹  rf  rC  s          rÙ   rÂ  z)Router._should_raise_content_policy_errorÕ  sÐ   € ð ×Ò¤ H×$4Ñ$4Ó 5¸Ò 9Ø×Ñ Ñ"×0Ñ0Ð4DÒDØà*0¯*©*Ð5OÐQU×QnÑQnÓ*oÐ ð $Ð/Ø#'Ð Ø0ò �Ü˜Ÿ	™	›Ó$ QÑ'¨5Ó0Ø+/°©;Ð(Ùðð
 $Ð/ØØ×(Ñ(Ô*Øä×#Ñ#ð HØØ$ô	
ð
 rç   c                 ó  — g }	 | j                  |¬«      \  }}t        |t        «      rg S 	 t	        | |¬«      }t        |«      }|D �cg c]  }|d   d   |vsŒ|‘Œ }}| j                  |«      }||fS # t        $ r Y ŒRw xY wc c}w )Nr‡  rc  rÛ   rY  )Ú#_common_checks_available_deploymentrá   r3  r�  rg   rl  Ú_filter_blocked_deployments)	r4  ré   rþ  rµ  r  Úunhealthy_deploymentsÚunhealthy_setrl  rì  s	            rÙ   Ú_get_healthy_deploymentszRouter._get_healthy_deployments÷  sÁ   € Ø!#Ðð	Ø"&×"JÑ"JØð #Kó #ÑˆAÐô Ð*¬DÔ1Ø�	ð 2ô
 (AØ$(Ð;Kô(
Ðô  #Ð#8Ó9ˆØ0@Ö$o¨1ÀAÀlÁOÐTXÑDYÐanÒDn¢QÐ$oÐÐ$oØ"×>Ñ>Ð?RÓSÐà"Ð$4Ð4Ð4øô ò 	Ùð	üò %ps   „&A3 ÁBÁBÁ3	A?Á>A?c              ƒ   ó.  K  — g }	 | j                  |¬«      \  }}t        |t        «      rg |fS 	 t	        | |¬«      ƒ d{  –—† }t        |«      }|D �cg c]  }|d   d   |vsŒ|‘Œ }}| j                  |«      }||fS # t        $ r Y ŒZw xY w7 ŒMc c}w ­w)zÄ
        Returns Tuple of:
        - Tuple[List[Dict], List[Dict]]:
            1. healthy_deployments: list of healthy deployments
            2. all_deployments: list of all deployments
        r‡  rc  NrÛ   rY  )r"  rá   r3  r�  rd   rl  r#  )	r4  ré   rþ  rµ  r  r$  Úunhealthy_deployments_setrl  rì  s	            rÙ   r;  z%Router._async_get_healthy_deployments  sá   è ø€ ð "$Ðð	Ø"&×"JÑ"JØð #Kó #ÑˆAÐô Ð*¬DÔ1ØÐ+Ð+Ð+ð 2ô
 .MØ$(Ð;Kô.
÷ (
Ðô ,/Ð/DÓ+EÐ!à'ö%
Ø¨1¨\©?¸4Ñ+@ÐHaÒ+aŠAð%
Ðð %
ð #×>Ñ>Ð?RÓSÐØ"Ð$4Ð4Ð4øô ò 	Ùð	úð(
úò
%
ùsK   ‚B†(A? ®BÁ BÁBÁBÁ$BÁ(BÁ?	BÂBÂ
BÂBÂBc                 ór   — t         j                  D ]$  }t        |t        «      sŒ|j	                  |«       Œ& y)a  
        Mimics 'async_routing_strategy_pre_call_checks'

        Ensures consistent update rpm implementation for 'usage-based-routing-v2'

        Returns:
        - None

        Raises:
        - Rate Limit Exception - If the deployment is over it's tpm/rpm limits
        N)rÍ  r5  rá   r&   r“  )r4  r  r”  s      rÙ   rÁ  z'Router.routing_strategy_pre_call_checks)  s1   € ô !×*Ñ*ò 	5ˆIÜ˜)¤\Õ2Ø×(Ñ(¨Õ4ñ	5rç   r'  c           
   ƒ   ó|  K  — t         j                  D ].  }t        |t        «      sŒ	 |j	                  ||«      ƒ d{  –—†  Œ0 y7 Œ# t         j
                  $ rÁ}|�Žt        j                  |j                  |t        j                  «       t        j                  «       ¬«      «       t        j                  |j                  |t        j                  «       f¬«      j                  «        t!        | |j"                  ||d   d   | j$                  ¬«       |‚d}~wt&        $ r—}|�Žt        j                  |j                  |t        j                  «       t        j                  «       ¬«      «       t        j                  |j                  |t        j                  «       f¬«      j                  «        |‚d}~ww xY w­w)áO  
        For usage-based-routing-v2, enables running rpm checks before the call is made, inside the semaphore.

        -> makes the calls concurrency-safe, when rpm limits are set for a deployment

        Returns:
        - None

        Raises:
        - Rate Limit Exception - If the deployment is over it's tpm/rpm limits
        N©r¹  Útraceback_exceptionrý  ©r­  r'  rÛ   rY  )r   rû  r%  r  rü  )rÍ  r5  rá   r&   Úasync_pre_call_checkrÁ  rä  r  Úasync_failure_handlerr  r  r  r  r¼  Úfailure_handlerr¾  rh   r  r—  r�  )r4  r  rþ  r'  r”  r   s         rÙ   r­  z-Router.async_routing_strategy_pre_call_checks9  s‚  è ø€ ô" !×*Ñ*ò *	ˆIÜ˜)¤\Õ2ð(Ø#×8Ñ8¸ÐEUÓV×VÑVñ*	ð WùÜ×-Ñ-ò à"Ð.Ü×+Ñ+Ø'×=Ñ=Ø*+Ü4=×4HÑ4HÓ4JÜ)-¯©«ð >ó ôô "×(Ñ(Ø#.×#>Ñ#>Ø"#¤Y×%9Ñ%9Ó%;Ð!<ô÷  ™%œ'Ü-Ø04Ø)*¯©Ø+,Ø#-¨lÑ#;¸DÑ#AØ)-×);Ñ);õð �GûÜ ò à"Ð.Ü×+Ñ+Ø'×=Ñ=Ø*+Ü4=×4HÑ4HÓ4JÜ)-¯©«ð >ó ôô "×(Ñ(Ø#.×#>Ñ#>Ø"#¤Y×%9Ñ%9Ó%;Ð!<ô÷  ™%œ'Ø�GûðüsF   ‚$F<¨A½A¾AÁF<ÁAÁF9ÁB<DÄF9Ä"BF4Æ4F9Æ9F<c           
   ƒ   óæ  K  — |}t         j                  D ]2  }t        |t        «      sŒ	 |j	                  |||||¬«      ƒ d{  –—† }Œ4 |S 7 Œ# t
        $ r—}	|�Žt        j                  |j                  |	t        j                  «       t        j                  «       ¬«      «       t        j                  |j                  |	t        j                  «       f¬«      j                  «        |	‚d}	~	ww xY w­w)r+  ©ré   rì  r_  r’  rþ  Nr,  r.  )rÍ  r5  rá   r&   Úasync_filter_deploymentsr�  rä  r  r0  r  r  r  r  r¼  r1  r¾  )
r4  ré   rì  r_  rþ  r’  r'  Úreturned_healthy_deploymentsr”  r   s
             rÙ   Ú!async_callback_filter_deploymentsz(Router.async_callback_filter_deploymentsv  sò   è ø€ ð( (;Ð$Ü ×*Ñ*ò 	ˆIÜ˜)¤\Õ2ðØ9B×9[Ñ9[Ø#Ø,HØ!)Ø'5Ø)9ð :\ó :÷ 4Ñ0ð	ð4 ,Ð+ð/4ùô !ò à"Ð.Ü×+Ñ+Ø'×=Ñ=Ø*+Ü4=×4HÑ4HÓ4JÜ)-¯©«ð >ó ôô "×(Ñ(Ø#.×#>Ñ#>Ø"#¤Y×%9Ñ%9Ó%;Ð!<ô÷  ™%œ'Ø�Gûðüs;   ‚&C1ªAÁAÁAÁC1ÁAÁ	C.ÁBC)Ã)C.Ã.C1rÑ   c                 ó\   — t        | «      j                  › dt        | «      j                  › �S )a;  json.dumps default= for generate_model_id: plain str() on an arbitrary
        object (e.g. a RoutingPlugin instance) falls back to object.__repr__'s
        `<module.Class object at 0x...>`, so the hash -- and deployment id -- would
        change every restart. Use the class name instead, stable across restarts.ú.)r¸  rO  rP  rØ   s    rÙ   Ú_json_default_stable_idzRouter._json_default_stable_id§  s+   € ô �u“+×(Ñ(Ð)¨¬4°«;×+CÑ+CÐ*DÐEÐErç   r»  c                 óÈ  — | g}|j                  «       D �]  \  }}t        |t        «      r|j                  |«       n_t        |t        «      r5|j                  t        j                  |t        j                  ¬«      «       n|j                  t        |«      «       t        |t        «      r|j                  |«       Œªt        |t        «      r5|j                  t        j                  |t        j                  ¬«      «       Œï|j                  t        |«      «       �Œ dj                  |«      }t        j                  |j                  «       «      }|j                  «       S )z¶
        Helper function to consistently generate the same id for a deployment

        - create a string from all the litellm params
        - hash
        - use hash as id
        )rg  ro  )r;  rá   r  rø  r3  r:  Údumpsrg  r9  ÚjoinÚhashlibÚsha256ÚencodeÚ	hexdigest)r…  r»  Úpartsr`  ra  Ú
concat_strÚhash_objects          rÙ   rÌ  zRouter.generate_model_id¯  sô   € ð $�}ˆØ"×(Ñ(Ó*ó 	%‰DˆAˆqÜ˜!œSÔ!Ø—‘˜Q•Ü˜AœtÔ$Ø—‘œTŸZ™Z¨´6×3QÑ3QÔRÕSà—‘œS ›VÔ$ä˜!œSÔ!Ø—‘˜Q•Ü˜AœtÔ$Ø—‘œTŸZ™Z¨´6×3QÑ3QÔRÕSà—‘œS ›VÖ$ð	%ð ŸG™G E›Nˆ
Ü$Ÿ^™^¨J×,=Ñ,=Ó,?Ó@ˆà×$Ñ$Ó&Ð&rç   rÛ   Úbackend_modelc                 óæ   ‡ — d}t        ˆ fd„|D «       «      ry	 t        j                  ||¬«      }|D ]-  }‰ j	                  |«      �Œ|j	                  |«      }|€Œ)|‰ |<   Œ/ y# t        $ r Y yw xY w)a»  Fill missing cache pricing on a custom-priced deployment entry from
        the backend model's built-in cost map entry, so a deployment that
        only spells out ``input_cost_per_token``/``output_cost_per_token``
        does not silently bill cache_read/cache_creation at 0.

        User-specified cache fields always win; only ``None``/missing entries
        are inherited. No-op when the backend model has no canonical entry.
        )Úcache_creation_input_token_costÚ)cache_creation_input_token_cost_above_1hrÚ1cache_creation_input_token_cost_above_200k_tokensÚcache_read_input_token_costÚ-cache_read_input_token_cost_above_200k_tokensc              3   óD   •K  — | ]  }‰j                  |«      d u–— Œ y ­wrÔ   rK  )rŠ  ÚfrÛ   s     €rÙ   r‹  z8Router._inherit_builtin_cache_pricing.<locals>.<genexpr>à  s   øè ø€ ÒC°ˆz�~‰~˜aÓ ¨Ô,ÑCùó   ƒ Nr¶  )r	  rÍ  Úget_model_infor�  rà   )rÛ   rD  r&  Úcache_fieldsÚbackend_infoÚfieldÚbackend_values   `      rÙ   Ú_inherit_builtin_cache_pricingz%Router._inherit_builtin_cache_pricingÏ  s‰   ø€ ð
ˆô ÓC°lÔCÔCØð	Ü")×"8Ñ"8¸}ÐbuÔ"vˆLð "ò 	6ˆEØ�~‰~˜eÓ$Ñ,Ø ,× 0Ñ 0°Ó 7�Ø Ñ,Ø(5�J˜uÒ%ñ		6øô ò 	Ùð	ús   šA$ Á$	A0Á/A0c                 ó  — | j                  d«      }t        |t        «      r|sy| j                  d«      �yt        d„ |D «       «      ry	 t	        j
                  ||¬«      }|j                  d«      }|r|| d<   yy# t        $ r Y yw xY w)aO  Fill a missing entry-level output rate on a deployment entry whose tier
        table omits one, from the backend model's built-in cost map entry.

        A deployment's custom pricing is registered as its own standalone
        ``litellm.model_cost`` entry holding only the supplied fields, and the
        tiered-cost output fallback reads that same entry, so a tier table that
        spells out only input-side rates would bill every completion at 0.

        A user-specified ``output_cost_per_token`` always wins. No-op without a
        tier table, when every tier declares its own output rate, or when the
        backend model has no canonical entry or no flat output rate:
        ``get_model_info`` synthesizes a zero for tiered-only backends, and
        storing that zero would mark the deployment as explicitly priced free.
        Útiered_pricingNÚoutput_cost_per_tokenc              3   óH   K  — | ]  }t        |t        «      xr d |v –— Œ y­w)rV  Nr  )rŠ  Útiers     rÙ   r‹  z=Router._inherit_builtin_tiered_output_rate.<locals>.<genexpr>   s%   è ø€ Ò\ÈdŒz˜$¤Ó%ÒIÐ*AÀTÐ*IÓIÑ\ùs   ‚ "r¶  )rà   rá   râ   r	  rÍ  rN  r�  )rÛ   rD  r&  ÚtiersrP  Úbackend_rates         rÙ   Ú#_inherit_builtin_tiered_output_ratez*Router._inherit_builtin_tiered_output_rateì  s™   € ð$ "—~‘~Ð&6Ó7ˆÜ˜%¤Ô&©eØØ�>‰>Ð1Ó2Ð>ØÜÑ\ÐV[Ô\Ô\Øð	Ü")×"8Ñ"8¸}ÐbuÔ"vˆLð +×.Ñ.Ð/FÓGˆÙØ2>ˆJÐ.Ò/ð øô ò 	Ùð	ús   ÁA< Á<	BÂB)Údeclared_idÚduplicate_idsrí  Ú_model_nameÚ_litellm_paramsr  r\  r]  c          
      óF  — 	 |j                  d«      du}|r+t        |«      � t        |||v |j                  d«      |¬«      nd}|rt        ||¬«      xs |nd}	|	�t	        «       rt        |	«      ‚|rt        ||«      nd}
t        di |
€|nt        i |¥|
¥«      ¤Ž}t        ||¬«       t        di |¤|||dœ¤Ž}t        j                  D ]0  }|j                  j                  |«      €Œ|j                  |   ||<   Œ2 |j                  d	«      �@t        j                  ||j                  j                   |j                  j"                  ¬
«       t        j%                  ||j                  j                   |j                  j"                  ¬
«       t        j'                  |j(                  j*                  ||j                  j                   |j                  j"                  ¬«       | j-                  |¬«      dur/t/        j0                  d|j2                  |j(                  d   «       y|j                  j                  d«      xs g }|D ]  }	 t5        j6                  |«       Œ | j;                  |¬«      }|j=                  d¬«      }| j?                  ||j(                  j*                  ¬«       |S # t4        j8                  $ r$}t        d|j2                  › d|›d|› �«      |‚d}~ww xY w# t@        $ r.}| jB                  rt/        jD                  d|«       Y d}~y|‚d}~ww xY w)a^  
        Create a deployment object and add it to the model list

        If the deployment is not active for the current environment, it is ignored

        Returns:
        - Deployment: The deployment object
        - None: If the deployment is not active for the current environment (if 'supported_environments' is set in litellm_params)
        Údb_modelTNrY  )r\  ÚtakenÚ
current_idrf  rG  ©rf  r»  rË  Úinput_cost_per_token©rÛ   rD  r&  ©r  rÛ   ré   r&  r°  z=Ignoring deployment %s as it is not active for environment %srÝ   Ú	tag_regexz&Invalid regex in tag_regex for model 'z': u    â€” rÉ  ©ré   r  zNError creating deployment: %s, ignoring and continuing with other deployments.r  )#rà   r8   r7   r6   r5   r×   r9   r‘   r   ra   r�   r¥   Úmodel_fieldsr»  rg  rS  ré   r&  r[  Ú"_register_deployment_in_model_costrÛ   rY  Ú$deployment_is_active_for_environmentr   rÓ  rf  ÚreÚcompiler  Ú_add_deploymentÚto_jsonÚ _add_model_to_list_and_index_mapr�  r¨  r¹  )r4  rí  r^  r_  r  r\  r]  Úconfig_sourcedÚidentity_errorÚ	ptu_errorÚzeroed_pricingr»  r  rQ  Ú
_tag_regexÚpatternrŒ  ré   r   s                      rÙ   Ú_create_deploymentzRouter._create_deployment   sU  € ð&Y	Ø$/§O¡O°JÓ$?ÀtÐ$KˆNñ "¤i°Ó&<Ð&Hô #Ø +Ø%¨Ð6Ø*Ÿ™¨tÓ4Ø*õ	ð ð ñ ^lÔ! +¸+ÔFÒXÉ.Ðquð ð Ð$Ô)HÔ)JÜ  Ó+Ð+ÙXfÔ$6°{ÀOÔ$TÐlpˆNÜ4Bñ 5ð &Ð-ñ $ä)Ð*O¨_Ð*OÀÐ*OÓPñ	5ˆNô 1¸KÐXgÕhÜ#ñ Ø!ðà&Ø-Ø&ó	ˆJô 4×@Ñ@ò J�Ø×,Ñ,×0Ñ0°Ó7ÑCØ)3×)BÑ)BÀ5Ñ)I�K Ò&ðJð �‰Ð5Ó6ÐBÜ×5Ñ5Ø*Ø",×";Ñ";×"AÑ"AØ(2×(AÑ(A×(UÑ(Uð 6ô ô
 ×6Ñ6Ø&Ø(×7Ñ7×=Ñ=Ø$.×$=Ñ$=×$QÑ$Qð 7ô ô ×5Ñ5Ø#×.Ñ.×1Ñ1Ø&Ø ×/Ñ/×5Ñ5Ø$.×$=Ñ$=×$QÑ$Qð	 6ô ð ×8Ñ8ÀJÐ8ÓOÐW[Ñ[Ü%×-Ñ-ØSØ×)Ñ)Ø×)Ñ)Ð*BÑCôð
 ð !+× 9Ñ 9× =Ñ =¸kÓ JÒ PÈbˆJØ%ò �ðÜ—J‘J˜wÕ'ðð ×-Ñ-¸Ð-ÓDˆJà%×-Ñ-¸4Ð-Ó@ˆEà×1Ñ1¸È
×H]ÑH]×H`ÑH`Ð1ÔaØÐøô —x‘xò Ü$Ø@À×AVÑAVÐ@WÐWZÐ[bÐZeÐejÐknÐjoÐpóàðûðûô ò 	Ø×.Ò.Ü%×/Ñ/ØdÐfgôô à�ûð	úsP   ‚C&K) Ã)D<K) È&$K) ÉJ/É AK) Ê/K&ËK!Ë!K&Ë&K) Ë)	L Ë2"LÌLÌL c                 ó2   — t        |j                  «      dk(  S )aA  
        Check if the deployment is an auto-router deployment (semantic router).

        Returns True if the litellm_params model starts with "auto_router/"
        but NOT "auto_router/complexity_router" or "auto_router/adaptive_router"
        (which use the complexity-router and adaptive-router strategies).
        Úsemantic©rU   ré   ©r4  r»  s     rÙ   Ú_is_auto_router_deploymentz!Router._is_auto_router_deployment{   s   € ô .¨n×.BÑ.BÓCÀzÑQÐQrç   c                 óH   — t        | j                  j                  xs d«      S )zMDeployment tags used to disambiguate strategy registries keyed by model_name.r  )rã   r»  rà  r°  s    rÙ   Ú_deployment_tagszRouter._deployment_tags…   s    € ô �Z×.Ñ.×3Ñ3Ò9°rÓ:Ð:rç   c           	      ó¾  — ddl m} |j                  j                  }|j                  j                  }|€|€t        d«      ‚|j                  j                  }|€t        d«      ‚|j                  j                  }|€t        d«      ‚|j                  j                  } ||j                  ||||| |�|nt        ¬«      }| j                  | j                  ||d¬	«       y)
z‘
        Initialize the auto-router deployment.

        This will initialize the auto-router and add it to the auto-routers dictionary.
        r   )rÅ   Nzzauto_router_config_path or auto_router_config is required for auto-router deployments. Please set it in the litellm_paramszfauto_router_default_model is required for auto-router deployments. Please set it in the litellm_paramszhauto_router_embedding_model is required for auto-router deployments. Please set it in the litellm_params)rf  Úauto_router_config_pathÚauto_router_configÚdefault_modelÚembedding_modelr   Úmax_input_charszAuto-router©Úregistryr  rC  Ústrategy_label)Ú/litellm.router_strategy.auto_router.auto_routerrÅ   r»  r�  r‚  r×   Úauto_router_default_modelÚauto_router_embedding_modelÚauto_router_max_input_charsrf  r!   Ú_register_pre_routing_strategyrÜ  )	r4  r  rÅ   r�  r‚  rƒ  r„  r…  Úautor_routers	            rÙ   Úinit_auto_router_deploymentz"Router.init_auto_router_deploymentŠ   s  € õ 	Oà5?×5NÑ5N×5fÑ5fÐØ0:×0IÑ0I×0\Ñ0\ÐØ"Ð*Ð/AÐ/IÜð Móð ð ,6×+DÑ+D×+^Ñ+^ˆØÐ ÜØxóð ð .8×-FÑ-F×-bÑ-bˆØÐ"ÜØzóð ð .8×-FÑ-F×-bÑ-bˆá*4Ø!×,Ñ,Ø$;Ø1Ø'Ø+Ø$(Ø0?Ð0K™_ÔQtô+
ˆð 	×+Ñ+Ø×&Ñ&Ø!Ø!Ø(ð	 	,õ 	
rç   c                 ó2   — t        |j                  «      dk(  S )zª
        Check if the deployment is a complexity-router deployment.

        Returns True if the litellm_params model starts with "auto_router/complexity_router"
        Ú
complexityr{  r|  s     rÙ   Ú _is_complexity_router_deploymentz'Router._is_complexity_router_deployment·   s   € ô .¨n×.BÑ.BÓCÀ|ÑSÐSrç   c                 ón  — ddl m} ddlm} |j                  j
                  }|j                  j                  }|€œ|rš|j                  |«      }|j                  �%|j                  j                  |j                  «      ndxs8 |j                  j                  d«      xs |j                  j                  d«      }t        |t        «      r
|r|d   nd}n|}|€t        d«      ‚ ||j                  || |¬«      }| j                  | j                   ||d	¬
«       |j"                  r| j%                  «        yy)z£
        Initialize the complexity-router deployment.

        This will initialize the complexity-router and add it to the complexity-routers dictionary.
        r   rÇ   )ÚComplexityRouterConfigNÚMEDIUMÚSIMPLEz¢complexity_router_default_model is required for complexity-router deployments, or configure tiers in complexity_router_config. Please set it in the litellm_params)rf  rƒ  r   Úcomplexity_router_configzComplexity-routerr†  )Ú;litellm.router_strategy.complexity_router.complexity_routerrÈ   Ú0litellm.router_strategy.complexity_router.configr”  r»  r—  Úcomplexity_router_default_modelÚmodel_validateÚfallback_tierrY  rà   rá   râ   r×   rf  r�  rÝ  Ú_uses_deployment_pinr  )	r4  r  rÈ   r”  r—  rƒ  Ú	validatedÚderivedÚcomplexity_routers	            rÙ   Ú!init_complexity_router_deploymentz(Router.init_complexity_router_deployment¿   sE  € õ	
õ	
ð 8B×7PÑ7P×7iÑ7iÐ à$.×$=Ñ$=×$]Ñ$]ˆð
 Ð Ñ%=Ø5×DÑDÐE]Ó^ˆIð BK×AXÑAXÐAd�—‘×$Ñ$ Y×%<Ñ%<Ô=Ðjnò 1Ø—?‘?×&Ñ& xÓ0ò1à—?‘?×&Ñ& xÓ0ð ô
 ˜'¤4Ô(Ù.5 ¨¢
¸4‘à '�àÐ Üðfóð ñ
 6FØ!×,Ñ,Ø'Ø$(Ø%=ô	6
Ðð 	×+Ñ+Ø×,Ñ,Ø!Ø&Ø.ð	 	,ô 	
ð ×1Ò1Ø×5Ñ5Õ7ð 2rç   c                 ó2   — t        |j                  «      dk(  S )zUTrue when this deployment opts in via the `auto_router/adaptive_router` model prefix.Úadaptiver{  r|  s     rÙ   Ú_is_adaptive_router_deploymentz%Router._is_adaptive_router_deploymentø   s   € ä-¨n×.BÑ.BÓCÀzÑQÐQrç   c                 ó¤   — | j                  |¬«      ry| j                  |¬«      sy|j                  }|sy|j                  d«      }t	        |«      S )a+  True when this deployment owns an `adaptive_routers` entry once finalized:
        a dedicated adaptive router, or a complexity router whose config enables the
        adaptive companion. Mirrors the two arms of
        `_finalize_adaptive_router_if_configured`, which is the registry's only writer.©r»  TFr£  )r¤  r’  r—  rà   rU  )r4  r»  ÚconfigÚadaptive_flags       rÙ   Ú,_deployment_participates_in_adaptive_routingz3Router._deployment_participates_in_adaptive_routingü   sV   € ð
 ×.Ñ.¸nÐ.ÔMØØ×4Ñ4ÀNÐ4ÔSØØ&×?Ñ?ˆÙØØ'-§z¡z°*Ó'=ˆÜ�MÓ"Ð"rç   r‡  rà  c                 óL   ‡— t        ˆfd„| j                  |g «      D «       «      S )zLTrue when a strategy for this (model_name, tags) pair is already registered.c              3   ó<   •K  — | ]  }|j                   ‰k(  –— Œ y ­wrÔ   ©rà  )rŠ  Úexistingrà  s     €rÙ   r‹  z2Router._has_registered_strategy.<locals>.<genexpr>!  s   øè ø€ ÒV¨X�8—=‘= DÕ(ÑVùs   ƒ)r‡  rà   )r‡  rf  rà  s     `rÙ   Ú_has_registered_strategyzRouter._has_registered_strategy!  s"   ø€ ô ÓV¸¿¹ÀjÐRTÓ9UÔVÓVÐVrç   rˆ  c           	      ó  — | j                  |«      }| j                  ||j                  |«      r't        |› d|j                  › dt	        |«      › d�«      ‚g |j                  |j                  g «      ¢t        ||¬«      ‘||j                  <   y)zð
        Register `strategy` under `deployment.model_name`, scoped by its tags.
        Reusing a `model_name` is allowed when tags differ; a repeat of the same
        (model_name, tags) pair is a misconfiguration and is rejected.
        z deployment z with tags zI already exists. Please use a different model name or set different tags.©rà  rC  N)r  r®  rf  r×   râ   rà   r¢   )r4  r‡  r  rC  rˆ  rà  s         rÙ   r�  z%Router._register_pre_routing_strategy!  s¡   € ð ×+Ñ+¨JÓ7ˆØ×(Ñ(¨°:×3HÑ3HÈ$ÔOÜØ!Ð" ,¨z×/DÑ/DÐ.EÀ[ÔQUÐVZÓQ[ÐP\ð ]Kð Kóð ð+
Ø�\‰\˜*×/Ñ/°Ó4ð+
ä$¨$¸ÔBð+
ˆ�×&Ñ&Ò'rç   c                 óÔ   — | j                  |g «      }|D �cg c]  }|j                  |k7  sŒ|‘Œ }}t        |«      t        |«      k(  ry|r|| |<   y| j                  |d«       yc c}w )zÓDrop the strategy registered for this exact (model_name, tags) pair, leaving
        strategies registered under the same name with different tags in place. Returns
        whether anything was actually dropped.FNT)rà   rà  r‰  r»  )r‡  rf  rà  r­  rp  ro  s         rÙ   Ú _unregister_pre_routing_strategyz'Router._unregister_pre_routing_strategy+!  sp   € ð #Ÿ,™, z°2Ó6ˆØ/7ÖN e¸5¿:¹:ÈÓ;MšEÐNˆ	ÐNÜˆy‹>œS ›]Ò*ØÙØ#,ˆH�ZÑ ð ð �L‰L˜ TÔ*Øùò Os
   —A%¬A%c                 ó\  — |j                   j                  j                  d«      sy|j                  }| j	                  |«      }| j
                  | j                  | j                  fD ]  }| j                  |||«       Œ | j                  | j                  ||«      r| j                  «        yy)a§  
        Release the pre-routing strategy a deployment holds, so removing it from the
        model_list also frees its (model_name, tags) slot.

        Without this, re-adding the deployment (an edit arriving via upsert_deployment,
        or a router recreated under a name that was deleted earlier) hits the
        "already exists" guard in `_register_pre_routing_strategy`, which
        `ignore_invalid_deployments` swallows - the deployment then silently never
        makes it back into the model_list.

        Released from every registry rather than the first match, because registration is
        one-to-many: a complexity router configured with `adaptive` is also registered in
        `adaptive_routers` under the same (model_name, tags) by the deferred finalize pass.
        Guarded on the auto_router/ prefix so removing a *regular* deployment can't evict a
        router that merely shares its model_name.
        zauto_router/N)r»  ré   rY  rf  r  rÜ  rÝ  rß  r²  rÞ  Ú_sync_adaptive_router_hooks)r4  r  rf  rà  r‡  s        rÙ   Ú/_unregister_pre_routing_strategy_for_deploymentz6Router._unregister_pre_routing_strategy_for_deployment>!  s£   € ð" ×(Ñ(×.Ñ.×9Ñ9¸.ÔIØØ&×1Ñ1ˆ
Ø×+Ñ+¨JÓ7ˆØ×*Ñ*¨D×,CÑ,CÀT×EYÑEYÐZò 	NˆHØ×1Ñ1°(¸JÈÕMð	Nà×0Ñ0°×1FÑ1FÈ
ÐTXÔYØ×,Ñ,Õ.ð Zrç   c           	      óT  — | j                   xs g D �];  }t        |t        «      r|j                  d«      n|j                  }|r-t        |t        «      r|j                  d«      n|j
                  nd}|r|j                  d«      sŒvt        |t        «      r|j                  d«      n|j                  }|r|sŒ¨t        |t        |t        «      s|n
t        d
i |¤Žt        |t        «      r|j                  d«      n|j                  ¬«      }| j                  | j                  || j                  |«      «      r�Œ*| j                  |¬«       �Œ> | j                  j!                  «       D ]¬  \  }}|D ]¢  }|j"                  }|j$                  j&                  sŒ&| j                  | j                  ||j(                  «      rŒN|j+                  «       }	|	€Œag | j                  j                  |g «      ¢t-        |j(                  |	¬	«      ‘| j                  |<   Œ¤ Œ® | j/                  «        y)a9  Locate every adaptive-router deployment in the finalized model_list and
        build an AdaptiveRouter for each. Safe no-op when none are configured.
        Idempotent: skips any deployment whose (model_name, tags) pair is already
        initialized, so hot-reloads don't rebuild routers that would lose state.r»  ré   Nzauto_router/adaptive_routerrf  rÛ   rË  r°  r°  r  )rq  rá   r3  rà   r»  ré   rY  rf  r�   r‘   rÛ   r®  rÞ  r  Úinit_adaptive_router_deploymentrÝ  r;  rC  r§  r£  rà  Ú_ensure_adaptive_routerr¢   r´  )
r4  rp  ÚlpÚlp_modelrf  r  Útagged_complexity_routersÚtaggedr   Úadaptive_routers
             rÙ   Ú'_finalize_adaptive_router_if_configuredz.Router._finalize_adaptive_router_if_configuredX!  sí  € ð
 —_‘_Ò*¨ó 	HˆEÜ0:¸5Ä$Ô0G�—‘Ð+Ô,ÈU×MaÑMaˆBÙRT¬:°b¼$Ô+?˜Ÿ™˜wœÀRÇXÂXÐZ^ˆHÙ ×!4Ñ!4Ð5RÔ!SØÜ4>¸uÄdÔ4K˜Ÿ™ <Ô0ÐQV×QaÑQaˆJÙ¡RØÜ#Ø%Ü*4°R¼Ô*>¡ÄNÑDXÐUWÑDXÜ7AÀ%ÌÔ7N˜EŸI™I lÔ3ÐTY×TdÑTdôˆJð
 ×,Ñ,¨T×-BÑ-BÀJÐPT×PeÑPeÐfpÓPqÔrÙØ×0Ñ0¸JÐ0ÖGð	Hð" 6:×5LÑ5L×5RÑ5RÓ5Tò 	Ñ1ˆJÐ1Ø3ò �Ø$*§O¡OÐ!Ø(×/Ñ/×8Ò8ØØ×0Ñ0°×1FÑ1FÈ
ÐTZ×T_ÑT_Ô`ØØ9J×9bÑ9bÓ9d�Ø"Ñ.ð9Ø×.Ñ.×2Ñ2°:¸rÓBð9ä0°f·k±kÈOÔ\ð9�D×)Ñ)¨*Ò5ñð	ð 	×(Ñ(Õ*rç   c                 óB  — ddl m} t        j                  j	                  |«      D ]!  }t        j                  j                  |«       Œ# | j                  j                  «       D ]9  }|D ]2  }t        j                  j                   ||j                  ¬«      «       Œ4 Œ; y)zôRebuild the AdaptiveRouterPostCallHook set so it is exactly one hook per
        currently registered adaptive router. Run at every point the adaptive registry
        changes, otherwise a released router keeps recording turns through its hook.r   ©ÚAdaptiveRouterPostCallHook©r½  N)
Ú-litellm.router_strategy.adaptive_router.hooksrÁ  rÍ  r  Úget_custom_loggers_for_typeÚremove_callback_from_all_listsrÞ  r`  rT  rC  )r4  rÁ  r6  Útagged_adaptive_routersr¼  s        rÙ   r´  z"Router._sync_adaptive_router_hooks~!  sŽ   € õ	
ô  ×8Ñ8×TÑTÐUoÓpò 	VˆHÜ×,Ñ,×KÑKÈHÕUð	Và'+×'<Ñ'<×'CÑ'CÓ'Eò 	Ð#Ø1ò �Ü×0Ñ0×EÑEÙ.¸v¿¹ÔOõññ	rç   c                 ó  — ddl m} ddlm} ddlm}m} |j                  j                  }|€t        d«      ‚ |di |¤Ž}i }i }	|j                  D �]  }
| j                  j                  |
g «      }|sŒ#| j                  xs g |d      }t        |t        «      r|j                  d«      n|j                   }t        |t        «      r|n|r|j#                  «       ni }|j                  d«      }|� |di |¤Ž||
<   t        |t        «      r|j                  d	«      n|j                  }t        |t        «      r|n|r|j#                  «       ni }|j                  d
«      }|€�Œt%        |«      |	|
<   �Œ"  ||j&                  |||	¬«      }| j)                  | j*                  ||d¬«       t,        j.                  j1                   ||¬«      «       t3        j4                  d|j&                  t7        |j                  «      «       y)a¾  
        Build an AdaptiveRouter instance for this deployment and register its
        post-call hook. Multiple adaptive routers can coexist on a single Router,
        keyed by `deployment.model_name`.

        `model_to_prefs` and `model_to_cost` are derived from the OTHER models
        already registered in `self.model_list` whose `model_name` appears in
        `available_models`. Models not yet registered fall back to defaults.
        r   rÃ   rÀ  )ÚAdaptiveRouterConfigÚAdaptiveRouterPreferencesNzCadaptive_router_config is required for adaptive-router deployments.rÛ   Úadaptive_router_preferencesr»  re  )Úrouter_namer§  Úmodel_to_prefsÚmodel_to_costzAdaptive-routerr†  rÂ  z-AdaptiveRouter[%s] initialized with %d modelsr  )Ú7litellm.router_strategy.adaptive_router.adaptive_routerrÄ   rÃ  rÁ  Úlitellm.types.routerrÈ  rÉ  r»  Úadaptive_router_configr×   rÂ  râ  rà   rq  rá   r3  rÛ   r  rÕ   rf  r�  rÞ  rÍ  r  rT  r   r  r‰  )r4  r  rÄ   rÁ  rÈ  rÉ  Ú
raw_configr§  rÌ  rÍ  r=  Úindicesrl  ÚmiÚmi_dictÚ	prefs_rawr¹  Úlp_dictÚcostr½  s                       rÙ   r·  z&Router.init_adaptive_router_deploymentŽ!  sç  € õ	
õ	
÷	
ð
 '×5Ñ5×LÑLˆ
ØÐÜÐbÓcÐcá,Ñ:¨zÑ:ˆàFHˆØ13ˆð ×+Ñ+ó 	2ˆDØ×;Ñ;×?Ñ?ÀÀbÓIˆGÙØØ—‘Ò& B¨°©
Ñ3ˆAÜ(2°1´dÔ(;�—‘�|Ô$ÀÇÁˆBÜ,6°r¼4Ô,@¡bÑZ\ÀrÇ}Á}ÄÐbdˆGØŸ™Ð$AÓBˆIØÐ$Ù'@Ñ'MÀ9Ñ'M�˜tÑ$ô -7°q¼$Ô,?�—‘Ð'Ô(ÀQ×EUÑEUˆBÜ,6°r¼4Ô,@¡bÑZ\ÀrÇ}Á}ÄÐbdˆGØ—;‘;Ð5Ó6ˆDØÒÜ&+¨D£k�˜dÓ#ð!	2ñ$ "0Ø"×-Ñ-ØØ)Ø'ô	"
ˆð 	×+Ñ+Ø×*Ñ*Ø!Ø$Ø,ð	 	,ô 	
ô 	×(Ñ(×=Ñ=Ù&°ÔGô	
ô 	×"Ñ"Ø;Ø×!Ñ!Ü�×'Ñ'Ó(õ	
rç   c                 ó2   — t        |j                  «      dk(  S )z¥
        Check if the deployment is a quality-router deployment.

        Returns True if the litellm_params model starts with "auto_router/quality_router".
        Úqualityr{  r|  s     rÙ   Ú_is_quality_router_deploymentz$Router._is_quality_router_deploymentÖ!  s   € ô .¨n×.BÑ.BÓCÀyÑPÐPrç   c                 ó  — ddl m} |j                  j                  }|j                  j                  }|€|r|j                  d«      }|€t        d«      ‚ ||j                  || |¬«      }| j                  | j                  ||d¬«       y)	a  
        Initialize the quality-router deployment.

        Resolves the default model from either `quality_router_default_model` or
        `quality_router_config["default_model"]`, then instantiates the
        QualityRouter and stores it in `self.quality_routers`.
        r   rÉ   Nrƒ  z¡quality_router_default_model is required for quality-router deployments, or set default_model in quality_router_config. Please configure it in the litellm_params)rf  rƒ  r   Úquality_router_configzQuality-routerr†  )
Ú5litellm.router_strategy.quality_router.quality_routerrÊ   r»  rÜ  Úquality_router_default_modelrà   r×   rf  r�  rß  )r4  r  rÊ   rÜ  rƒ  Úquality_routers         rÙ   Úinit_quality_router_deploymentz%Router.init_quality_router_deploymentÞ!  s£   € õ	
ð 5?×4MÑ4M×4cÑ4cÐà$.×$=Ñ$=×$ZÑ$ZˆØÐ Ñ%:Ø1×5Ñ5°oÓFˆMàÐ Üðkóð ñ
 0=Ø!×,Ñ,Ø'Ø$(Ø"7ô	0
ˆð 	×+Ñ+Ø×)Ñ)Ø!Ø#Ø+ð	 	,õ 	
rç   c                 ó.   — t        |j                  ¬«      S )a  
        Function to check if a llm deployment is active for a given environment. Allows using the same config.yaml across multople environments

        Requires `LITELLM_ENVIRONMENT` to be set in .env. Valid values for environment:
            - development
            - staging
            - production

        Raises:
        - ValueError: If LITELLM_ENVIRONMENT is not set in .env or not one of the valid values
        - ValueError: If supported_environments is not set in model_info or not one of the valid values
        )rÛ   )ræ   rÛ   ©r4  r  s     rÙ   rl  z+Router.deployment_is_active_for_environment"  s   € ô 4¸z×?TÑ?TÔUÐUrç   c           
      óè  ‡— t        j                  |«      }g | _        i | _        i | _        i | _        i | _        t        «       | _        i | _	        i | _
        i | _        | j                  «        | j                  «        t        d„ |D «       «      Št        ˆfd„‰D «       «      }t        d„ |D «       «      }|r4t        «       s*t!        j"                  ddj%                  |«      t&        «       |D �]0  }|j)                  d«      }|j)                  d«      }t+        |t,        «      rI|j/                  «       D ]6  \  }}	t+        |	t0        «      sŒ|	j3                  d«      sŒ)t5        |	«      ||<   Œ8 |j)                  d	i «      }
|
j7                  d
«      €d nt1        |
d
   «      }d
|
vr| j9                  ||«      }||
d
<   |j7                  dd «      �;t+        |d   t:        «      r(|d   D ]  }||d<   | j=                  ||||
||¬«       Œ  �Œ| j=                  ||||
||¬«       �Œ3 t!        j>                  d| jA                  «       «       |D �ch c]  }|d   ’Œ	 c}| _!        | jE                  «        y c c}w )Nc              3   ó¤   K  — | ]H  }t        |j                  d «      t        «      r'|d    j                  d«      �t        |d    d   «      –— ŒJ y­w)rÛ   rY  N)rá   rà   r3  r  ©rŠ  rp  s     rÙ   r‹  z(Router.set_model_list.<locals>.<genexpr>%"  sP   è ø€ ò $
àÜ˜%Ÿ)™) LÓ1´4Ô8¸UÀ<Ñ=P×=TÑ=TÐUYÓ=ZÐ=fô ��lÑ# DÑ)×*ñ$
ùs   ‚AAc              3   óL   •K  — | ]  }‰j                  |«      d kD  sŒ|–— Œ y­w)r¼   N)Úcount)rŠ  r  Údeclared_idss     €rÙ   r‹  z(Router.set_model_list.<locals>.<genexpr>*"  s&   øè ø€ Ò(s°hÐR^×RdÑRdÐemÓRnÐqrÓRr¬Ñ(sùs   ƒ$�$c              3   óÖ   K  — | ]a  }t        |j                  d «      t        «      r@|d    j                  d«      dur*t        |d    «      rt	        |j                  d«      «      –— Œc y­w)rÛ   ra  Trf  N)rá   rà   r3  r4   r  rå  s     rÙ   r‹  z(Router.set_model_list.<locals>.<genexpr>,"  s^   è ø€ ò $
àÜ˜%Ÿ)™) LÓ1´4Ô8Ø�lÑ#×'Ñ'¨
Ó3¸4Ñ?Ü˜U <Ñ0Ô1ô	 �—	‘	˜,Ó'×(ñ$
ùs   ‚A'A)z°PTU fields are set on config.yaml deployment(s) %s, but PTU cost attribution is disabled, so no flat cost accrues and this traffic is billed per token. Set %s=True to enable itú, rf  r»  úos.environ/rÛ   rY  Úorganization)rí  r^  r_  r  r\  r]  z
Initialized Model List %s)#r™  rš  rq  rá  râ  rã  rÛ  rä  rå  rß  rÝ  rÜ  rj  rk  rã   r5   r   rÓ  r<  r3   r»  rá   r3  r;  r  rY  r·   rà   rÌ  râ   rx  rš  Úget_model_namesrh  r¾  )r4  rq  Úoriginal_model_listr]  Úptu_declaredré   r^  r_  r`  ra  r  r\  Ú_idÚorgr   rè  s                  @rÙ   rê  zRouter.set_model_list"  sŽ  ø€ Ü%)§]¡]°:Ó%>ÐØˆŒØ02ˆÔ-Ø02ˆÔ-Ø02ˆÔ-Ø$&ˆÔ!Ü'0£{ˆÔ$ð  "ˆÔØ"$ˆÔØˆÔØ×/Ñ/Ô1Ø×,Ñ,Ô.ô $ñ $
à,ô$
ó 
ˆô
  )Ó(sÀ,Ô(sÓsˆä#ñ $
à,ô$
ó 
ˆñ Ô ?Ô AÜ!×)Ñ)ðcà—	‘	˜,Ó'Ü,ô	ð )ó '	ˆEØŸ)™) LÓ1ˆKØ#Ÿi™iÐ(8Ó9ˆOä˜/¬4Ô0Ø+×1Ñ1Ó3ò ;‘D�A�qÜ! !¤SÕ)¨a¯l©l¸=Õ.IÜ-7¸«]˜¨Ò*ð;ð !&§	¡	¨,¸Ó ;ˆKà"-§/¡/°$Ó"7Ð"?™$ÄSÈÐUYÑIZÓE[ˆKð ˜;Ñ&Ø×,Ñ,¨[¸/ÓJ�Ø$'�˜DÑ!à×"Ñ" >°4Ó8ÐDÌØ Ñ/´ôJð +¨>Ñ:ò 	�CØ69�O NÑ3Ø×+Ñ+Ø(-Ø$/Ø(7Ø$/Ø$/Ø&3ð ,õ ò	ð ×'Ñ'Ø$)Ø +Ø$3Ø +Ø +Ø"/ð (ö ðA'	ôR 	×#Ñ#Ð$AÀ4×CWÑCWÓCYÔZØ5?Ö@°˜A˜l›OÒ@ˆÔð 	×4Ñ4Õ6ùò As   É
I/c                 óº  — dd l }|j                  j                  }d}d|v r(|j                  d«      d   }|t        j
                  v rd}|r	|}d }d }d }	n”t	        j                  |j                  j                  |j                  j                  dd «      |j                  j                  ¬«      \  }}}}	|t        j                  vr#t        j                  |«      st        d|› �«      ‚| j                  j                  |j                  j                  «       |j                  j                  €(t!        |dd «      �t!        |d«      |j                  _        |j                  j"                  €(t!        |d	d «      �t!        |d	«      |j                  _        d
|j$                  v r{| j&                  j)                  |j$                  |j+                  d¬«      «       |j,                  j.                  r/| j0                  j                  |j,                  j.                  «       |j,                  j                  d«      }
|j,                  j                  d«      }|
�Z|�Xd
|v rT|
| j2                  vrt5        «       | j2                  |
<   | j2                  |
   j)                  ||j+                  d¬«      «       |j                  j                  dg «      xs g }|D ]i  }|j                  di «      }dD ]P  }||v sŒ||   j7                  d«      sŒ||   j9                  dd«      }|j:                  j                  |d«      ||<   ŒR Œk |�| j=                  ||¬«       | j?                  |j                  ¬«      r| jA                  |¬«       | jC                  |j                  ¬«      r| jE                  |¬«       | jG                  |j                  ¬«      r| jI                  |¬«       |S )Nr   FrH  Tr&  r®  zUnsupported provider - rÜ  rÛ  rÀ  rÉ  ry  Úteam_public_model_nameÚdataSourcesÚ
parameters)r­  rÅ  rë  ro  )r  r&  r¦  r°  )%Úosr»  ré   r$  rÍ  rJ  rµ   rà   rë   Úprovider_listr?   Úexistsr�  rÑ  rø  rÜ  r  rÛ  rf  rÚ  Úadd_patternrp  rÛ   rY  rÙ  rÛ  r½   rY  r¯  ÚenvironÚ'_initialize_deployment_for_pass_throughr}  r�  r’  r¡  rÚ  rà  )r4  r  rö  rK  Úis_prompt_management_modelrL  r¹  r&  rÍ  rë   Ú_team_idÚ_team_public_model_nameÚdata_sourcesÚdata_sourcerÁ  Ú	param_keyÚenv_names                    rÙ   ro  zRouter._add_deploymentn"  sÆ  € Ûð  *×8Ñ8×>Ñ>ˆØ%*Ð"à�-ÑØ)6×)<Ñ)<¸SÓ)AÀ!Ñ)DÐØ"¤g×&WÑ&WÑWØ-1Ð*á%ð #ˆFØ"&ÐØ"ˆOØ‰Hô ×(Ñ(Ø ×/Ñ/×5Ñ5Ø$.×$=Ñ$=×$AÑ$AÐBWÐY]Ó$^Ø#×2Ñ2×;Ñ;ôñØØ#ØØð #¬'×*?Ñ*?Ñ?ÔH\×HcÑHcØ#ôIô  Ð"9Ð:MÐ9NÐ OÓPÐPð 	×Ñ×$Ñ$ Z×%>Ñ%>×%DÑ%DÔEð ×$Ñ$×(Ñ(Ð0´W¸ZÈÐPTÓ5UÐ5aÜ,3°JÀÓ,FˆJ×%Ñ%Ô)à×$Ñ$×(Ñ(Ð0´W¸ZÈÐPTÓ5UÐ5aÜ,3°JÀÓ,FˆJ×%Ñ%Ô)ð �*×'Ñ'Ñ'ð ×Ñ×+Ñ+¨J×,AÑ,AÀ:×CUÑCUÐcgÐCUÓChÔiØ×$Ñ$×'Ò'Ø×4Ñ4×;Ñ;¸J×<QÑ<Q×<TÑ<TÔUà$×/Ñ/×3Ñ3°IÓ>ˆØ5?×5JÑ5J×5NÑ5NÐOgÓ5hÐØÐÐ$;Ð$GÈCÐSjÑLjØ˜t×8Ñ8Ñ8Ü6HÓ6J�×)Ñ)¨(Ñ3Ø×%Ñ% hÑ/×;Ñ;Ø'¨×);Ñ);ÈÐ);Ó)Nôð
 )×7Ñ7×;Ñ;¸MÈ2ÓNÒTÐRTˆà'ò 	EˆKØ —_‘_ \°2Ó6ˆFØ0ò E�	à Ò&¨6°)Ñ+<×+GÑ+GÈÕ+VØ% iÑ0×8Ñ8¸ÈÓK�HØ(*¯
©
¯©°xÀÓ(D�F˜9Ò%ñ	Eð	Eð Ð*Ø×8Ñ8Ø%Ø$7ð 9ô ð ×*Ñ*¸*×:SÑ:SÐ*ÔTØ×,Ñ,¸
Ð,ÔCð
 ×0Ñ0À
×@YÑ@YÐ0ÔZØ×2Ñ2¸jÐ2ÔIð ×-Ñ-¸Z×=VÑ=VÐ-ÔWØ×/Ñ/¸:Ð/ÔFàÐrç   c                 óè  — |j                   j                  dury|dk7  ryddlm} |j                   j                  }|�t        j                  |«      ni }|j                  d«      xs |j                   j                  }|j                  d«      xs |j                   j                  }|j                  d«      xs |j                   j                  }|�|€t        d	«      ‚|j                  |||¬
«       y)a3  
        Optional: Register vertex credentials for pass-through endpoints if `deployment.litellm_params.use_in_pass_through` is True

        Other providers need no registration here: PassthroughEndpointRouter.get_credentials resolves their credentials per-request from the live router deployments
        TNÚ	vertex_air   )Úpassthrough_endpoint_routerÚvertex_projectÚvertex_locationÚvertex_credentialsz]vertex_project, and vertex_location must be set in litellm_params for pass-through endpoints.)Ú
project_idÚlocationr  )r»  Úuse_in_pass_throughÚ>litellm.proxy.pass_through_endpoints.llm_passthrough_endpointsr  rá  r/   Úget_credential_valuesrà   r  r  r  r×   Úadd_vertex_credentials)	r4  r  r&  r  rð  Úcredential_valuesr  r  r  s	            rÙ   rû  z.Router._initialize_deployment_for_pass_throughè"  s   € ð ×$Ñ$×8Ñ8ÀÑDØØ +Ò-Øõ	
ð ",×!:Ñ!:×!RÑ!RˆàIXÐIdÔ×4Ñ4°_ÔEÐjlð 	ð !2× 5Ñ 5Ð6FÓ GÒ sÈ:×KdÑKd×KsÑKsˆØ!2×!6Ñ!6Ð7HÓ!IÒ!vÈZ×MfÑMf×MvÑMvˆà×!Ñ!Ð"6Ó7Òg¸:×;TÑ;T×;gÑ;gð 	ð Ð! _Ð%<ÜØoóð ð 	$×:Ñ:Ø%Ø$Ø1ð 	;õ 	
rç   c                 ó4  — |j                   j                  }|r| j                  |«      ryt        |j                  |j
                  j                  d¬«      ¬«       |j                  d¬«      }| j                  |¬«       |j                   j                  d¬«      }t        j                  D ]%  }|j
                  j                  |«      }|€Œ!|||<   Œ' |j                  d«      �@t        j                  ||j
                  j                  |j
                  j                  ¬«       t        j!                  ||j
                  j                  |j
                  j                  ¬«       t        j#                  |j                   j                  ||j
                  j                  |j
                  j                  ¬«       | j%                  ||j                   j                  ¬	«       | j&                  j)                  |j                  «       | j+                  |¬«       |S )
zË
        Parameters:
        - deployment: Deployment - the deployment to be added to the Router

        Returns:
        - The added deployment
        - OR None (if deployment already exists)
        NTrÉ  rd  r°  re  rf  rg  ri  )rÛ   rY  r‚  ra   rf  r»  r  rp  ro  r¥   rj  rà   rg  rS  ré   r&  r[  rk  rq  rh  rë  Ú_sync_deployment_budget_config)r4  r  Ú_deployment_model_idÚ_deploymentÚ_model_info_dictrQ  Úfield_values          rÙ   Úadd_deploymentzRouter.add_deployment
#  sä  € ð '1×&;Ñ&;×&>Ñ&>ÐÙ D×$5Ñ$5Ð6JÔ$KØä,Ø!×,Ñ,Ø%×4Ñ4×?Ñ?ÈTÐ?ÓRõ	
ð (×/Ñ/¸TÐ/ÓBˆà×Ñ¨
ÐÔ3à(2×(=Ñ(=×(HÑ(HÐVZÐ(HÓ([ÐÜ/×<Ñ<ò 	6ˆEØ$×3Ñ3×7Ñ7¸Ó>ˆKØÑ&Ø*5Ð  Ò'ð	6ð
 ×ÑÐ 6Ó7ÐCÜ×1Ñ1Ø+Ø(×7Ñ7×=Ñ=Ø$.×$=Ñ$=×$QÑ$Qð 2ô ô
 	×2Ñ2Ø'Ø$×3Ñ3×9Ñ9Ø *× 9Ñ 9× MÑ Mð 	3ô 	
ô 	×1Ñ1Ø×*Ñ*×-Ñ-Ø'Ø×+Ñ+×1Ñ1Ø *× 9Ñ 9× MÑ Mð	 	2ô 	
ð 	×-Ñ-°KÈ*×J_ÑJ_×JbÑJbÐ-ÔcØ×Ñ×Ñ˜Z×2Ñ2Ô3Ø×+Ñ+°zÐ+ÔBØÐrç   r  Úremoval_idxc                 ó*  — | j                   j                  «       D ]  \  }}||kD  sŒ|dz
  | j                   |<   Œ || j                   v r| j                   |= t        | j                  j                  «       «      D ]…  \  }}g }|D ]3  }||k(  rŒ	||kD  r|j	                  |dz
  «       Œ#|j	                  |«       Œ5 t        |«      dkD  r|| j                  |<   Œ^| j                  |= | j                  j                  |«       Œ‡ t        | j                  j                  «       «      D ]j  \  }}g }|D ]3  }||k(  rŒ	||kD  r|j	                  |dz
  «       Œ#|j	                  |«       Œ5 t        |«      dkD  r|| j                  |<   Œ^| j                  |= Œl t        d„ | j                  D «       «      | _
        t        | j                  j                  «       «      D ]<  }	| j                  |	   }
|
j                  |«       |
j                  rŒ0| j                  |	= Œ> y)a"  
        Helper method to update deployment indices after a deployment has been removed from model_list.

        Parameters:
        - model_id: str - the id of the deployment that was removed
        - removal_idx: int - the index where the deployment was removed from model_list
        r¼   r   c              3   ó&   K  — | ]	  \  }}|–— Œ y ­wrÔ   r  )rŠ  r  Úpublic_model_names      rÙ   r‹  zBRouter._update_deployment_indices_after_removal.<locals>.<genexpr>�#  s   è ø€ ò 1
Ù"6 !Ð%6Ôñ1
ùó   ‚N)rá  r;  râ   râ  rø  r‰  rh  r1  rã  rä  rå  rÛ  rÌ  Úremove_deploymentÚpatterns)r4  r  r  r¾  rs  rf  rÒ  Úupdated_indicesrÅ  ry  Úteam_pattern_routers              rÙ   Ú(_update_deployment_indices_after_removalz/Router._update_deployment_indices_after_removalG#  s3  € ð #'×"GÑ"G×"MÑ"MÓ"Oò 	OÑˆM˜3Ø�[Ó ØGJÈQÁw�×5Ñ5°mÒDð	Oð �t×<Ñ<Ñ<Ø×5Ñ5°hÐ?ô $(¨×(MÑ(M×(SÑ(SÓ(UÓ#Vò 	5ÑˆJ˜à ˆOØò 	0�Ø˜+Ò%àØ˜;Ò&à#×*Ñ*¨3°©7Õ3ð $×*Ñ*¨3Õ/ð	0ô �?Ó# aÒ'ØDS�×5Ñ5°jÒAà×9Ñ9¸*ÐEØ× Ñ ×(Ñ(¨Õ4ð'	5ô, ! ×!FÑ!F×!LÑ!LÓ!NÓOò 	?‰LˆC�à ˆOØò 	0�Ø˜+Ò%àØ˜;Ò&à#×*Ñ*¨3°©7Õ3ð $×*Ñ*¨3Õ/ð	0ô �?Ó# aÒ'Ø=L�×5Ñ5°cÒ:à×9Ñ9¸#Ñ>ð%	?ô& (1ñ 1
Ø:>×:_Ñ:_ô1
ó (
ˆÔ$ô ˜D×5Ñ5×:Ñ:Ó<Ó=ò 	7ˆGØ"&×";Ñ";¸GÑ"DÐØ×1Ñ1°(Ô;Ø&×/Ó/Ø×-Ñ-¨gÑ6ñ		7rç   rs  c                 ó~  — |j                  d«      xs i j                  d«      }|j                  d«      xs i j                  d«      }|rs|rp||f}| j                  t        |h«      z  | _        || j                  vrg | j                  |<   || j                  |   vr| j                  |   j	                  |«       yyyy)zÎ
        Helper to update team_model_to_deployment_indices for a single deployment.

        Parameters:
        - model: dict - the deployment to index
        - idx: int - the index in model_list
        rÛ   ry  ró  N)rà   rå  rä  rã  rø  )r4  ré   rs  ry  ró  rÅ  s         rÙ   Ú_update_team_model_indexzRouter._update_team_model_index‹#  sÆ   € ð  Ÿ)™) LÓ1Ò7°R×<Ñ<¸YÓGˆØ).¯©°<Ó)@Ò)FÀB×(KÑ(KÐLdÓ(eÐÙÑ-Ø!Ð#9Ð:ˆCØ+/×+GÑ+GÌ)ÐUkÐTlÓJmÑ+mˆDÔ(Ø˜$×?Ñ?Ñ?Ø=?�×5Ñ5°cÑ:Ø˜$×?Ñ?ÀÑDÑDØ×5Ñ5°cÑ:×AÑAÀ#ÕFð Eð .ˆ7rç   c                 óô  — t        | j                  «      }| j                  j                  |«       | j                  «        | j	                  «        |�|| j
                  |<   n6|j                  di «      j                  d«      �|| j
                  |d   d   <   |j                  d«      }|r;|| j                  vrg | j                  |<   | j                  |   j                  |«       | j                  ||«       y)a!  
        Helper method to add a model to the model_list and update both indices.

        Parameters:
        - model: dict - the model to add to the list
        - model_id: Optional[str] - the model ID to use for indexing. If None, will try to get from model["model_info"]["id"]
        NrÛ   rY  rf  )	r‰  rq  rø  rj  rk  rá  rà   râ  r"  )r4  ré   r  rs  rf  s        rÙ   rq  z'Router._add_model_to_list_and_index_map�#  sæ   € ô ˜Ÿ™Ó)ˆØ�‰×Ñ˜uÔ%Ø×/Ñ/Ô1Ø×,Ñ,Ô.ð ÐØ>AˆD×1Ñ1°(Ò;Ø�Y‰Y�| RÓ(×,Ñ,¨TÓ2Ð>ØORˆD×1Ñ1°%¸Ñ2EÀdÑ2KÑLð "ŸI™I lÓ3ˆ
ÙØ ×!FÑ!FÑFØDF�×5Ñ5°jÑAØ×1Ñ1°*Ñ=×DÑDÀSÔIð 	×%Ñ% e¨SÕ1rç   c                 óz  — |j                   j                  xs d}| j                  |¬«      }	 |�Â|j                  |j                  k(  r|j                   |j                   k(  ryd}|j                   j                  }| j                  }||v rU||   }|�N| j
                  j                  |«       | j                  «        | j                  «        | j                  ||¬«       | j                  |¬«       | j                  |¬«       | j                  |j                  ¬«      s|�,| j                  |j                  ¬«      r| j                  «        |S # t        $ ra}| j                  rNt!        j"                  d|j$                  |j                   j                  |«       | j'                  ||¬«       Y d}~y|‚d}~ww xY w)	zÃ
        Add or update deployment
        Parameters:
        - deployment: Deployment - the deployment to be added to the Router

        Returns:
        - The added/updated deployment
        ro  r  N©r  r  r°  r¦  z]Error upserting deployment %s (id=%s): %s. Dropping it and continuing with other deployments.)Úprevious_deploymentr  )rÛ   rY  rä  r»  rá  rq  r»  rj  rk  r   rµ  r  r©  r¾  r�  r¨  r   rÓ  rf  Ú'_restore_deployment_after_failed_upsert)r4  r  r  Ú_deployment_on_routerr  r¾  Údeployment_fast_mappingr   s           rÙ   rÍ  zRouter.upsert_deploymentº#  sÉ  € ð '1×&;Ñ&;×&>Ñ&>Ò&DÀ"ÐØ:>×:MÑ:MÐWkÐ:MÓ:lÐð8	Ø$Ð0ð ×-Ñ-Ð1F×1UÑ1UÒUØ"×-Ñ-Ð1F×1QÑ1QÒQð  ð +/�Ø'1×'<Ñ'<×'?Ñ'?�Ø15×1VÑ1VÐ'à Ð$;Ñ;Ø"9¸-Ñ"H�Kà"Ð.ØŸ™×+Ñ+¨KÔ8Ø×?Ñ?ÔAØ×<Ñ<Ô>Ø×EÑEÈ}ÐjuÐEÔvð ×DÑDÐPeÐDÔfð ×Ñ¨:ÐÔ6ð
 ×@Ñ@ÐPZ×PiÑPiÐ@ÔjØ%Ð1Ø×EÑEØ#8×#GÑ#Gð Fô ð ×<Ñ<Ô>ØÐøÜò 	Ø×.Ò.Ü%×-Ñ-ØsØ×)Ñ)Ø×)Ñ)×,Ñ,Øô	ð ×<Ñ<Ø(=ÐH\ð =ô ô à�ûð	ús%   ®4E Á#C,E Å	F:ÅAF5Æ3F5Æ5F:r&  c                 ó  — |�| j                  |«      ry 	 | j                  |¬«       t        j                  d|j                  |«       y # t
        $ r,}t        j                  d|j                  ||«       Y d }~y d }~ww xY w)Nr°  zLRestored deployment %s (id=%s); it keeps serving its previous configuration.zUCould not restore previously served deployment %s (id=%s) after the failed upsert: %s)r‚  r  r   r  rf  r�  rÓ  )r4  r&  r  Úrestore_errors       rÙ   r'  z.Router._restore_deployment_after_failed_upsertÿ#  sƒ   € ØÐ&¨$×*;Ñ*;¸HÔ*EØð	Ø×ÑÐ+>ÐÔ?Ü!×&Ñ&Ø^Ø#×.Ñ.Øõøô
 ò 	Ü!×)Ñ)ØgØ#×.Ñ.ØØ÷	ñ ûð	ús   –3A
 Á
	A?Á"A:Á:A?c                 óN   — |€| n|› d| › �}d|v r||j                  dd«      fS |fS )zWThe ``litellm.model_cost`` keys a deployment's shared backend info is registered under.rH  z
responses/ro  )r¯  )ré   r&  Úbackend_keys      rÙ   Ú_backend_cost_map_keyszRouter._backend_cost_map_keys$  sH   € ð ':Ð&A™UÐJ]ÐI^Ð^_Ð`eÐ_fÐGgˆØ˜;Ñ&Ø ×!4Ñ!4°\À2Ó!FÐGÐGØˆ~Ðrç   c                 óÐ  — | j                   j                  d¬«      }t        j                  D ]%  }| j                  j                  |«      }|€Œ!|||<   Œ' |j                  d«      �@t        j                  || j                  j                  | j                  j                  ¬«       t        j                  || j                  j                  | j                  j                  ¬«       |S )a�  The ``model_info`` a deployment contributes to ``litellm.model_cost``.

        Custom pricing lives on ``litellm_params`` rather than ``model_info``, and
        the built-in cache-pricing inheritance is derived rather than stored, so
        both are folded back in here. That keeps this reproducible from a
        deployment alone, which is what lets a refresh rebuild the same entries.
        TrÉ  re  rf  )rÛ   r  r¥   rj  r»  rà   rg  rS  ré   r&  r[  )r  rÛ   rQ  r  s       rÙ   Ú_deployment_model_cost_payloadz%Router._deployment_model_cost_payload$  sÝ   € ð #-×"7Ñ"7×"BÑ"BÐPTÐ"BÓ"Uˆ
Ü/×<Ñ<ò 	0ˆEØ$×3Ñ3×7Ñ7¸Ó>ˆKØÑ&Ø$/�
˜5Ò!ð	0ð �>‰>Ð0Ó1Ð=Ü×1Ñ1Ø%Ø(×7Ñ7×=Ñ=Ø$.×$=Ñ$=×$QÑ$Qð 2ô ô
 	×2Ñ2Ø!Ø$×3Ñ3×9Ñ9Ø *× 9Ñ 9× MÑ Mð 	3ô 	
ð
 Ðrç   c                 óŠ  — t        |«      �6|j                  «       D ��ci c]  \  }}|t        j                  vsŒ||“Œ }}}| �t	        j
                  | |id|¬«       t        j                  ||¬«      }|d   }t        |«      }t        t        dz  t        j                  j                  |i «      «      xs i j                  d«      }	|j                  d«      }
|	dk(  xr |
dk(  }|	duxr |
du }|s|r|
�t        j                  d	|	||
«       |	|d<   t	        j
                  |D �ci c]  }||“Œ c}d¬
«       yc c}}w c c}w )a,  Write a deployment's metadata into ``litellm.model_cost``.

        Runs when a deployment is added and again after a price data reload, so
        the entries a refresh rebuilds are the ones a fresh boot would produce.
        Nothing is recorded for replay: a refresh walks the live routers instead,
        so a deleted, repointed or never-added deployment, and a discarded router,
        drop out of the rebuild on their own.

        A strategy-router alias is never the deployment actually called or
        billed, so custom pricing configured on it must not become a cost-map
        price: an explicit zero would let ``_is_cost_explicitly_configured``
        treat the alias as a genuinely free model and waive budget checks for
        requests that route to (and bill as) a real deployment.
        NF)Ú
model_costÚpersist_across_reloadsÚwarning_display_namer¶  r   Úmoder¼  rý  z±Router: preserving existing mode=%s for shared backend key %s instead of the deployment-specified mode=%s (prevents alias registration from downgrading the shared backend mode).)r2  r3  )rU   r;  r¥   rj  rÍ  Úregister_modelrg  r.  r¯   r   r3  r2  rà   r   rÓ  )r  rÛ   ré   r&  r`  ra  Úbackend_keysr-  Úshared_model_infoÚexisting_shared_modeÚdeployment_modeÚis_responses_to_chat_downgradeÚwould_clear_existing_modeÚ_keys                 rÙ   rk  z)Router._register_deployment_in_model_cost4$  s~  € ô, *¨%Ó0Ð<à!+×!1Ñ!1Ó!3÷Ù˜˜A°qÔ@Z×@gÑ@gÒ7g��1‘ðˆJñ ð ÐÜ×"Ñ"Ø$ jÐ1Ø',Ø%*õô %×;Ñ;À%Ð]pÐ;ÓqˆØ)¨!™_ˆô $=¸ZÓ#HÐÜ'+¬D°4©K¼×9KÑ9K×9OÑ9OÐP[Ð]_Ó9`Ó'aÒ'gÐeg×&lÑ&lÐmsÓ&tÐØ!2×!6Ñ!6°vÓ!>ˆð 1EÈÑ0SÒ0qÐXgÐkqÑXqÐ&Ø+?ÀtÐ+KÒ+gÐP_ÐcgÐPgÐ!Ù)Ñ-FØÐ*Ü%×-Ñ-ð,ð )ØØ#ôð )=Ð˜fÑ%ô 	×ÑØ<HÖI°D˜Ð/Ñ/ÒIØ#(ö	
ùóaùòb Js   ŸD:ºD:Ä&
E c                 óŒ  — t        | j                  «      D ]ˆ  }	 t        |t        «      r|n
t        di |¤Ž}t        j                  |j                  j                  t        j                  |«      |j                  j                  |j                  j                  ¬«       ŒŠ y# t        $ r t        j                  d«       Y Œ¬w xY w)zºRe-assert this router's deployments onto a freshly fetched catalog.

        Reads ``model_list`` at call time, so only deployments the router still
        serves are restored.
        zTRouter: could not rebuild cost-map entry for a deployment during a price data reloadrg  Nr  )rã   rq  rá   r�   r�  r   r¹  rg  rk  rÛ   rY  r0  r»  ré   r&  )r4  rp  r  s      rÙ   r\  z'Router._replay_model_cost_registrations€$  s±   € ô ˜4Ÿ?™?Ó+ò 	ˆEðÜ&0°¼
Ô&C™UÌÑI\ÐV[ÑI\�
ô ×5Ñ5Ø#×.Ñ.×1Ñ1Ü!×@Ñ@ÀÓLØ ×/Ñ/×5Ñ5Ø$.×$=Ñ$=×$QÑ$Qð	 6õ ñ	øô ò Ü%×/Ñ/Øjôñ ð	ús   šB"Â"CÃCrY  c                 óö  — d}|| j                   v r| j                   |   }	 |�¢| j                  j                  |«      }| j                  «        | j	                  «        | j                  ||¬«       | j                  «       }|�|j                  |¬«       	 | j                  t        |t        «      r|n
t        di |¤Ž¬«       |S y# t        $ r t        j                  d|«       Y |S w xY w# t        $ r Y yw xY w)z¿
        Parameters:
        - id: str - the id of the deployment to be deleted

        Returns:
        - The deleted deployment
        - OR None (if deleted deployment not found)
        Nr%  r  r°  z‘delete_deployment: could not release pre-routing strategies for model_id=%s; the deployment is out of the model_list and its indices are repairedr  )rá  rq  r»  rj  rk  r   r‘  Úunregister_deployment_budgetrµ  rá   r�   r�  r   r¹  )r4  rY  Údeployment_idxrC  Ú_budget_limiters        rÙ   Údelete_deploymentzRouter.delete_deployment•$  s  € ð ˆØ�×6Ñ6Ñ6Ø!×BÑBÀ2ÑFˆNð	ØÐ)à"Ÿo™o×1Ñ1°.ÓA�Ø×7Ñ7Ô9Ø×4Ñ4Ô6Ø×=Ñ=ÀrÐWeÐ=ÔfØ)-×)SÑ)SÓ)U�Ø"Ð.Ø#×@Ñ@È"Ð@ÔMð	Ø×HÑHÜ+5°d¼JÔ+G¡4ÌZÑM_ÐZ^ÑM_ð Iô ð �àøô !ò Ü)×3Ñ3ð_àõð
 �ðûô ò 	Ùð	ús6   ¡A4C, Â-C ÃC, ÃC)Ã%C, Ã(C)Ã)C, Ã,	C8Ã7C8c                 ó¦   — | j                   �| j                   S | j                  r-| j                  D ]  }t        |«      t        u sŒ|| _         |c S  y)zð
        Return the router's deployment-budget callback.

        Uses exact-type matching so proxy subclasses (e.g. virtual-key model budgets)
        registered on litellm.callbacks are not mistaken for router deployment budgets.
        N)r  rm  r¸  r@   )r4  Ú_cbs     rÙ   r‘  z,Router._get_router_deployment_budget_limiter¼$  sY   € ð ×$Ñ$Ð0Ø×,Ñ,Ð,à×"Ò"Ø×.Ñ.ò �Ü˜“9Ô 4Ò4Ø03�DÔ-Ø’Jðð rç   c                 ó®   — |j                   j                  d«      d uxr7 |j                   j                  d«      d uxr |j                  j                  d uS )NÚ
max_budgetÚbudget_duration)r»  rà   rÛ   rY  râ  s     rÙ   Ú_deployment_has_budget_limitsz$Router._deployment_has_budget_limitsÏ$  sX   € à×%Ñ%×)Ñ)¨,Ó7¸tÐCò 5Ø×)Ñ)×-Ñ-Ð.?Ó@ÈÐLò5à×%Ñ%×(Ñ(°Ð4ð	
rç   c                 ó8  — |j                   j                  }|€y | j                  «       }| j                  |¬«      s|�|j	                  |¬«       y |€#| j                  dg¬«       | j                  «       }|�#|j                  |j                  d¬«      ¬«       y y )Nr°  r  rÈ  )r   TrÉ  )rÛ   rY  r‘  rI  r@  r  Úregister_deployment_budgetrp  )r4  r  r  rB  s       rÙ   r  z%Router._sync_deployment_budget_configÖ$  s©   € Ø$×/Ñ/×2Ñ2ˆØÐØà×DÑDÓFˆà×1Ñ1¸ZÐ1ÔHØÐ*Ø×<Ñ<ÀhÐ<ÔOØàÐ"Ø×-Ñ-ÐH`ÐGaÐ-ÔbØ"×HÑHÓJˆOàÐ&Ø×6Ñ6À*×BTÑBTÐbfÐBTÓBgÐ6Õhð 'rç   c                 óä   — || j                   v rb| j                   |   }| j                  |   }t        |t        «      rt	        di |¤ŽS t        |t        «      r|S t        dt        |«      › �«      ‚y)zl
        Returns -> Deployment or None

        Raise Exception -> if model found in invalid format
        zModel invalid format - Nr  )rá  rq  rá   r3  r�   r�  r¸  )r4  r  rs  ré   s       rÙ   rä  zRouter.get_deploymenté$  sq   € ð �t×<Ñ<Ñ<Ø×>Ñ>¸xÑHˆCØŸ?™?¨3Ñ/ˆEÜ˜%¤Ô&Ü!Ñ* EÑ*Ð*Ü˜E¤:Ô.Ø�äÐ"9¼$¸u»+¸Ð GÓHÐHàrç   c                 óÌ   — | j                  |¬«      }|�| j                  |«      ryt        j                  |j                  j                  d¬«      «      j                  d¬«      S )a  
        Returns -> dict of credentials for a given model id.

        Returns None if the deployment is paused via `LiteLLM_ProxyModelTable.blocked`,
        so file/batch/passthrough callers that resolve credentials directly cannot keep
        using a paused deployment.
        r  NTrÉ  )rä  Ú_is_deployment_blockedr‹   r›  r»  r  )r4  r  r  s      rÙ   Úget_deployment_credentialsz!Router.get_deployment_credentialsü$  sc   € ð !×/Ñ/¸Ð/ÓBˆ
ØÐ ×!<Ñ!<¸ZÔ!HØÜ&×5Ñ5Ø×%Ñ%×0Ñ0¸dÐ0ÓCó
ç
‰* $ˆ*Ó
'ð	(rç   Úmodel_group_namec                 óî   — || j                   v rg| j                   |   }|rV| j                  |d      }t        |t        «      rt	        di |¤ŽS t        |t        «      r|S t        dt        |«      › �«      ‚y)z³
        Returns -> Deployment or None

        Raise Exception -> if model found in invalid format

        Optimized with O(1) index lookup instead of O(n) linear scan.
        r   zModel Name invalid - Nr  )râ  rq  rá   r3  r�   r�  r¸  )r4  rP  rÒ  ré   s       rÙ   Ú"get_deployment_by_model_group_namez)Router.get_deployment_by_model_group_name%  sy   € ð ˜t×DÑDÑDØ!×BÑBÐCSÑTˆGÙà#Ÿ™¨w°q©zÑ:�Ü˜e¤TÔ*Ü%Ñ.¨Ñ.Ð.Ü ¤zÔ2Ø �Lä#Ð&;¼DÀ»K¸=Ð$IÓJÐJØrç   c                 óœ   — t        | t        «      r| j                  d«      n| j                  }|�|j                  d«      nd}|du xs ||k(  S )z«
        A team-scoped deployment (``model_info.team_id`` set) is only usable by
        callers from that same team; deployments without a team owner are shared.
        rÛ   Nry  )rá   r3  rà   rÛ   )ré   ry  rÛ   Úowner_team_ids       rÙ   Ú_deployment_usable_by_teamz!Router._deployment_usable_by_team!%  sP   € ô 8BÀ%ÌÔ7N˜EŸI™I lÔ3ÐTY×TdÑTdˆ
Ø<FÐ<R˜zŸ~™~¨iÔ8ÐX\ˆØ Ð$Ò@¨¸Ñ(@Ð@rç   c                 ó´   ‡ ‡— ‰ j                   j                  |«      xs d}ˆ ˆfd„|D «       }t        |d«      }|€yt        |t        «      rt        di |¤ŽS |S )z»
        Like ``get_deployment_by_model_group_name``, but skips deployments owned
        by other teams so a shared model name never resolves another team's
        credentials.
        r  c              3   ó|   •K  — | ]3  }‰j                  ‰j                  |   ‰«      sŒ#‰j                  |   –— Œ5 y ­wrÔ   )rU  rq  )rŠ  rs  r4  ry  s     €€rÙ   r‹  zDRouter._get_model_group_deployment_usable_by_team.<locals>.<genexpr>4%  s<   øè ø€ ò 
Ø%(°t×7VÑ7VÐW[×WfÑWfÐgjÑWkÐmtÕ7uˆD�O‰O˜CÕ ñ
ùs   ƒ$<¨<N)râ  rà   rt  rá   r3  r�   )r4  rP  ry  rÒ  ÚusableÚfirst_usables   ` `   rÙ   Ú*_get_model_group_deployment_usable_by_teamz1Router._get_model_group_deployment_usable_by_team+%  se   ù€ ð ×>Ñ>×BÑBÐCSÓTÒZÐXZˆô
Ø,3ô
ˆô # 6¨4Ó0ˆØÐØÜ-7¸ÄdÔ-KŒzÑ)˜LÑ)Ð]ÐQ]Ð]rç   ztuple[int | None, int | None]c                 ó¬   — | j                  |¬«      }|€y|j                  }t        |j                  d«      «      t        |j                  d«      «      fS )aï  
        Return (max_input_tokens, max_output_tokens) explicitly configured in a concrete
        deployment's model_info for model_name, via O(1) index lookup.

        Returns (None, None) for wildcard-expanded or unknown names, and treats a
        malformed configured value as absent rather than failing the listing. Unlike
        get_model_group_info, this never triggers pattern matching or deep copies, so it
        is safe to call per listed model on the /v1/models hot path.
        )rP  rJ  Úmax_input_tokensÚmax_output_tokens)rR  rÛ   r*   rà   )r4  rf  r  rÛ   s       rÙ   Úget_configured_token_limitsz"Router.get_configured_token_limits<%  sZ   € ð !×CÑCÐU_ÐCÓ`ˆ
ØÐØà&×1Ñ1ˆ
ä˜zŸ~™~Ð.@ÓAÓBÜ˜zŸ~™~Ð.AÓBÓCð
ð 	
rç   c                 óT  — | j                  |¬«      }|€| j                  ||¬«      }|€Q|�O| j                  j                  ||fg «      }|r/| j                  |d      }t        |t        «      rt        di |¤Žn|}|€±|�| j                  j                  |«      nd}|r|j                  |«      xs g ng }| j                  j                  |«      xs g D �cg c]  }| j                  ||«      r|‘Œ }	}|xs |	}
|
r3|
d   }t        |t        «      rt        di |¤Ž}nt        |t        «      r|}|�| j                  |«      ryt        j                  |j                  j!                  d¬«      «      j!                  d¬«      }|j                  j"                  �xt%        j&                  |j                  j"                  «      }|s*t)        j*                  d|j                  j"                  «       |j-                  |«       |j/                  dd«       |j                  j0                  |d	<   |j                  j2                  r|j                  j2                  |d
<   |S d|j                  j0                  v r-|j                  j0                  j5                  d«      d   |d
<   |S d|d
<   |S c c}w )ab  
        Get API credentials and provider info from a model name in model_list.
        Useful for passthrough endpoints (files, batches, etc.) that need credentials.

        This method tries to find a deployment by model_id first, and if not found,
        it tries to find by model_group_name (model_name).

        Args:
            model_id: Model ID or model name from model_list (e.g., "gpt-4o-litellm")
            team_id: Optional team id of the caller. When set, team-scoped
                deployments (indexed by team public model name, including team
                wildcard models like "openai/*") are also considered. Name and
                wildcard lookups never resolve a deployment owned by a
                different team, so shared model names can't leak another
                team's credentials.

        Returns:
            Dictionary containing api_key, api_base, custom_llm_provider, etc.
            Returns None if model not found, or if the resolved deployment is
            paused via `LiteLLM_ProxyModelTable.blocked` (so passthrough callers
            cannot bypass an admin pause by resolving credentials directly).

        Example:
            credentials = router.get_deployment_credentials_with_provider("gpt-4o-litellm")
            # Returns: {"api_key": "sk-...", "custom_llm_provider": "openai", "model": "gpt-4o", ...}
        r  N)rP  ry  r   TrÉ  z,Credential '%s' not found in credential_listrá  ré   r&  rH  rð  r  )rä  rZ  rã  rà   rq  rá   r3  r�   rÛ  ÚrouterÚ  rU  rN  r‹   r›  r»  r  rá  r/   r  r   rÓ  rÔ  r»  ré   r&  r$  )r4  r  ry  r  Úteam_indicesÚ
team_modelr  Úteam_wildcard_modelsÚwildcard_modelÚglobal_wildcard_modelsÚpotential_wildcard_modelsró  Úcredentialsr  s                 rÙ   r  z/Router.get_deployment_credentials_with_providerP%  sÉ  € ð< ×(Ñ(°(Ð(Ó;ˆ
ð ÐØ×HÑHÐZbÐlsÐHÓtˆJð
 Ð 'Ð"5Ø"&×"GÑ"G×"KÑ"KÈWÐV^ÐL_ÐacÓ"dˆLÙØ$(§O¡O°LÀ±OÑ$D�
Ü9CÀJÔPTÔ9UœZÑ5¨*Ò5Ð[e�
ð
 ÐØSZÐSf¨×)BÑ)B×)FÑ)FÀwÔ)OÐlpÐÙYlÐ+>×+DÑ+DÀXÓ+NÒ+TÑRTÐrtÐ ð (,×':Ñ':×'@Ñ'@ÀÓ'JÒ'PÈbö-à"Ø×2Ñ2°>À7ÔKò ð-Ð"ð -ð
 0DÒ/]ÐG]Ð%Ù(à)BÀ1Ñ)E�Ü˜o¬tÔ4Ü!+Ñ!>¨oÑ!>‘JÜ ´Ô<Ø!0�JàÐ ×!<Ñ!<¸ZÔ!HØô 5×CÑCØ×%Ñ%×0Ñ0¸dÐ0ÓCó
ç
‰* $ˆ*Ó
'ð 	ð
 ×$Ñ$×<Ñ<ÐHÜ'9×'OÑ'OØ×)Ñ)×AÑAó(Ðñ %Ü%×-Ñ-ØBÀJ×D]ÑD]×DuÑDuôð ×ÑÐ0Ô1à�O‰OÐ5°tÔ<à)×8Ñ8×>Ñ>ˆ�GÑð ×$Ñ$×8Ò8Ø1;×1JÑ1J×1^Ñ1^ˆKÐ-Ñ.ð Ðð �J×-Ñ-×3Ñ3Ñ3à1;×1JÑ1J×1PÑ1P×1VÑ1VÐWZÓ1[Ð\]Ñ1^ˆKÐ-Ñ.ð Ðð 2:ˆKÐ-Ñ.àÐùò]-s   ÃJ%r�   rÚ  c                  ó   — y rÔ   r  ©r4  r  rÚ  rY  s       rÙ   rå  zRouter.get_router_model_info³%  s   € ð 	rç   c                  ó   — y rÔ   r  ri  s       rÙ   rå  zRouter.get_router_model_info¼%  s   € àrç   c           	      ó~  — |�| j                  |¬«      }|�|}|€t        d«      ‚|j                  d«      xs i j                  dd«      }|€%|j                  d«      xs i j                  dd«      }|}|j                  d«      }t        |t        «      r|}ngt        |t
        «      rd|v rt	        di |¤Ž}nGt        dt        |«      j                  › d	|j                  d«      xs i j                  d
d«      › �«      ‚t        j                  |j                  |¬«      \  }	}
}}|
dk(  r¼|€º|	j                  d«      r|	nd|	› �}t        j                  j                  |«      }|duxrL |j                  d«      xs ddkD  xs2 |j                  d«      xs ddkD  xs |j                  d«      xs ddkD  }|rt        j                  d|	|«       n¶t        j                  d|	«       nŸ|
dk7  rš|	}d|v r”| j                   j#                  |«      }|�w|D ]r  }	 |j                  d«      xs i j                  d
«      |j                  d«      xs i j                  d
«      k(  r&|j                  d«      xs i j                  d«      } nŒt |€|	}|j                  |
› d�«      s|
› d|› �}n|}t        j&                  |¬«      }|€|S |j                  d«      }t        |t(        «      r|j+                  d¬«      n|}t-        j.                  |«      }|r |j1                  «       D ]  \  }}|€Œ	|||<   Œ |S # t$        $ r Y �Œ+w xY w)a¿  
        For a given model id, return the model info (max tokens, input cost, output cost, etc.).

        Augment litellm info with additional params set in `model_info`.

        For azure models, ignore the `model:`. Only set max tokens, cost values if base_model is set.

        Returns
        - ModelInfo - If found -> typed dict with max tokens, input cost, etc.

        Raises:
        - ValueError -> If model is not mapped yet
        Nr  zDeployment not foundrÛ   Ú
base_modelr»  ré   z.Deployment missing valid litellm_params. Got: z, deployment_id: rY  Úunknown©ré   r»  Úazurezazure/r\  r   Ú
max_tokensre  zsAzure deployment '%s' has no base_model set; using '%s' from the model cost map for max tokens, cost tracking, etc.zÁCould not identify azure model '%s'. Set azure 'base_model' for accurate max tokens, cost tracking, etc.- https://docs.litellm.ai/docs/proxy/cost_tracking#spend-tracking-for-azure-openai-modelsrÀ  rH  r‡  TrÉ  r  )rä  r×   rà   rá   r‘   r3  r¸  rN  rÍ  rµ   ré   rY  r2  r   rš  r  rÚ  r`  r�  rN  r   r  r™  rš  r;  )r4  r  rÚ  rY  r  rl  ré   Úlitellm_params_datar»  r¹  r&  r  Ú_azure_fallback_keyÚ_fallback_entryÚ_fallback_resolvesÚpotential_modelsÚpotential_modelÚmodel_info_namerÛ   Úraw_user_model_infoÚuser_model_infoÚmerged_model_inforÅ  rÑ   s                           rÙ   rå  zRouter.get_router_model_infoÀ%  sÊ  € ð& ˆ>Ø!%×!4Ñ!4¸bÐ!4Ó!AˆKØÐ&Ø(�
àÐÜÐ3Ó4Ð4ð !—n‘n \Ó2Ò8°b×=Ñ=¸lÈDÓQˆ
ØÐØ$Ÿ.™.Ð)9Ó:Ò@¸b×EÑEÀlÐTXÓYˆJàˆð &0§^¡^Ð4DÓ%EÐäÐ)¬>Ô:Ø0‰NÜÐ+¬TÔ2°wÐBUÑ7UÜ+ÑBÐ.AÑB‰NäðÜÐ0Ó1×:Ñ:Ð;ð <"Ø#-§>¡>°,Ó#?Ò#EÀ2×"JÑ"JÈ4ÐQZÓ"[Ð!\ð^óð ô
 -4×,DÑ,DØ ×&Ñ&Ø)ô-
Ñ)ˆÐ# Q¨ð  'Ò)¨jÐ.@ð -3×,=Ñ,=¸hÔ,G¡&ÈvÐV\ÐU]ÐM^ÐÜ%×0Ñ0×4Ñ4Ð5HÓIˆOØ!0¸Ð!<ò "Ø ×$Ñ$Ð%7Ó8Ò=¸AÀÑBò JØ#×'Ñ'¨Ó5Ò:¸¸aÑ?òJà#×'Ñ'Ð(>Ó?ÒDÀ1ÈÑIð ñ
 "Ü%×+Ñ+ð JØØ'õô &×+Ñ+ð XØõð ! GÒ+ØˆEà�e‰|Ø*.×*=Ñ*=×*CÑ*CÐDWÓ*XÐ Ø#Ð/Ø+;ò !˜ð!Ø /× 3Ñ 3°LÓ AÒ GÀR×LÑLÈTÓRØ *§¡¨|Ó <Ò BÀß!™c $›iò (ð *9×)<Ñ)<Ð=MÓ)NÒ)TÐRT×(YÑ(YÐZaÓ(b Ù %ð	 (ð!ð ˆ=ð ˆEà×ÑÐ#6Ð"7°qÐ 9Ô:Ø!4Ð 5°Q°u°gÐ>‰Oà#ˆOä#×2Ñ2¸ÔIˆ
ØÐØÐð &0§^¡^°LÓ%AÐô Ð-¬yÔ9ð  ×*Ñ*¸Ð*Ô=à$ð 	ô $(§=¡=°Ó#<ÐÙØ-×3Ñ3Ó5ò 3‘
��UØÑ$Ø-2Ð% cÒ*ð3ð !Ð øôE  )ò !Ú ð!ús   ÈA-L/Ì/	L<Ì;L<c                 ó\   — || j                   v r| j                   |   }| j                  |   S y)a%  
        For a given model id, return the model info

        Returns
        - dict: the model in list with 'model_name', 'litellm_params', Optional['model_info']
        - None: could not find deployment in list

        Optimized with O(1) index lookup instead of O(n) linear scan.
        N)rá  rq  )r4  rY  rs  s      rÙ   rN  zRouter.get_model_info<&  s4   € ð �×6Ñ6Ñ6Ø×>Ñ>¸rÑBˆCØ—?‘? 3Ñ'Ð'Ørç   c                 óZ   — | j                  |¬«      }|€y|d   }| j                  |¬«      S )zT
        Return list of all models in the same model group as that model id
        )rY  Nrf  rG  )rN  rI  )r4  rY  rÛ   rf  s       rÙ   Úget_model_groupzRouter.get_model_groupL&  s>   € ð
 !×/Ñ/°2Ð/Ó6ˆ
ØÐØà& |Ñ4ˆ
Ø×"Ñ"¨jÐ"Ó9Ð9rç   c                 ó�  — ddl m} d}d}d}	 t        j                  t        j
                  j                  |«      «      }	 t	        j                  |¬«      }	 |�V|j                  dd«      }|�Bt        j                  t	        j                  |¬«      «      }|� |t        t        |«      |«      }|�<|�:t        t         |t        j                  t        t        |«      «      |«      «      }|S |�t        j                  |«      }|S |�t        t        |«      }|S # t        $ r Y Œæw xY w# t        $ r Y ŒÞw xY w# t        $ r Y Œ”w xY w)zË
        For a given model id, return the model info

        1. Check if model_id is in model info
        2. If not, check if litellm model name is in model info
        3. If not, return None
        r   )Ú_update_dictionaryNr‡  rl  )Úlitellm.utilsr  r™  rš  rÍ  r2  rà   r�  rN  r   r3  r©   )	r4  r  rf  r  rÛ   Úcustom_model_infoÚlitellm_model_name_model_inforl  Úbase_model_infos	            rÙ   Úget_deployment_model_infoz Router.get_deployment_model_infoX&  si  € õ 	5à'+ˆ
Ø)-ÐØ:>Ð%ð	Ü $§¡¬g×.@Ñ.@×.DÑ.DÀXÓ.NÓ OÐð	Ü,3×,BÑ,BÈÔ,TÐ)ð
	Ø Ð,Ø$5×$9Ñ$9¸,ÈÓ$M�
ØÐ)ä-1¯]©]¼7×;QÑ;QÐXbÔ;cÓ-d�OØ&Ð2á,>Ü ¤ Ó7Ø-ó-Ð)ð Ð(Ð-JÐ-Vô ÜÙ"Ü—M‘M¤$¤tÐ-JÓ"KÓLØ%óóˆJð Ðð +Ð6äŸ™Ð'DÓEˆJð Ðð Ð*ô œiÐ):Ó;ˆJàÐøôW ò 	Ùð	ûô
 ò 	Ùð	ûô  ò 	Ùð	ús6   Ž2D ÁD* ÁAD9 Ä	D'Ä&D'Ä*	D6Ä5D6Ä9	EÅEÚuser_facing_model_group_namec                 ó¢  — d}d}d}d}d}d}| j                  |¬«      }	|	€y|	D �]%  }
d}d|
v r|
d   |k(  sd|
v r| j                  j                  |«      �d}|sŒ6t        d$i |
d   ¤Ž}|j                  }|
j                  di «      }|
j                  di «      }d}|€|
j                  dd«      }|€|j                  dd«      }|€|j                  dd«      }d}|€|
j                  d	d«      }|€|j                  d	d«      }|€|j                  d	d«      }|
j                  d
«      }|€|j                  d
d«      }|€|j                  d
d«      }|
j                  d«      }|€|j                  dd«      }|€|j                  dd«      }	 |j                  dd«      }|�| j                  ||j                  ¬«      }nd}t        ||«      }d\  }}	 t        j                  |j                  |j                  ¬«      \  }}}}|€ˆt        j"                  ||¬«      }|€g }|
j                  di «      }|j                  dd«      }t%        |j                  d«      «      }t%        |j                  d«      «      }t'        |ddd|||||d¬«
      }|€t)        d$i ||gdœ|¥ddi¥¤Ž}�nV||j*                  vr|j*                  j-                  |«       |j                  dd«      �-|d   �(|j.                  �|d   |j.                  kD  r
|d   |_        |j                  dd«      �-|d   �(|j0                  �|d   |j0                  kD  r
|d   |_        t%        |j                  d«      «      }|�&|j2                  �||j2                  xs dkD  r||_        t%        |j                  d«      «      } | �&|j4                  �| |j4                  xs dkD  r| |_        |j                  dd«      �|d   du rd|_        |j                  dd«      �|d   du rd|_        |j                  dd«      �|d   du rd|_        |j                  dd«      �|d   du rd|_        |j                  dd«      �|d   du rd|_        |j                  d d«      �|d    du rd|_         |j                  d!d«      �|d!   �
|d!   |_!        |j                  dd«      �|€|j                  d«      }|j                  d	d«      �|€|j                  d	«      }tE        |jF                  tI        ||¬"«      «      |_#        |�	|€d#}||z  }|�	|€d#}||z  }|�	|€d#}||z  }|€�Œ|€d#}||z  }�Œ( |�-|�||_%        |�||_&        |�||_'        |�||_(        |�||_        |S # t        $ r d}Y �ŒÑw xY w# t        j                  j                  $ r!}t        j                   d|«       Y d}~�ŒÌd}~ww xY w)%zÒ
        For a given model group name, return the combined model info

        Returns:
        - ModelGroupInfo if able to construct a model group
        - None if error constructing model group info
        NrG  Frf  Tr»  rÛ   rÛ  rÜ  ÚitpmÚotpmrY  )r  rf  )ro  ro  r¶  z.litellm.router.py::get_model_group_info() - %sr5  rý  re  rV  )
rÅ  rp  r\  r]  re  rV  Úlitellm_providerr5  Úsupported_openai_paramsÚsupports_system_messages)r…  Ú	providersÚsupported_reasoning_effortsr\  r]  g        Ú"supports_parallel_function_callingÚsupports_visionÚsupports_function_callingÚsupports_web_searchÚsupports_url_contextÚsupports_reasoningrŠ  )Údeployment_is_mappedr   r  ))rI  rÚ  r`  r‘   Ú#configurable_clientside_auth_paramsrà   r„  ré   r�  rz   rÍ  rµ   r&  rÁ  ÚBadRequestErrorr   r  Úget_supported_openai_paramsrÚ   ÚModelMapInfor“   rŒ  rø  r\  r]  re  rV  rŽ  r�  r�  r‘  r’  r“  rŠ  r{   r�  r|   rÛ  rÜ  r‡  rˆ  )!r4  r…  r…  Úmodel_group_infoÚ	total_tpmÚ	total_rpmÚ
total_itpmÚ
total_otpmr•  rq  ré   Úis_matchr»  Úmodel_litellm_paramsÚmodel_info_dictÚ_deployment_tpmÚ_deployment_rpmÚ_deployment_itpmÚ_deployment_otpmr  rÛ   r”  rK  r$  r  r   rŠ  Údb_model_infor5  re  rV  Ú_input_cost_per_tokenÚ_output_cost_per_tokens!                                    rÙ   Ú_set_model_group_infozRouter._set_model_group_info•&  sV  € ð 37Ðà $ˆ	Ø $ˆ	Ø!%ˆ
Ø!%ˆ
ØSWÐ+Ø ×/Ñ/¸;Ð/ÓGˆ
ØÐØØó N	/ˆEØˆHà Ñ%Ø˜,Ñ'¨;Ò6Ø 5Ñ(Ø×'Ñ'×-Ñ-¨kÓ:ÐFà�áØä+ÑF¨eÐ4DÑ.EÑFˆNà2@×2dÑ2dÐ/ð $)§9¡9Ð-=¸rÓ#BÐ Ø#Ÿi™i¨°bÓ9ˆOð +/ˆOØÐ&Ø"'§)¡)¨E°4Ó"8�ØÐ&Ø"6×":Ñ":¸5À$Ó"G�ØÐ&Ø"1×"5Ñ"5°e¸TÓ"B�ð +/ˆOØÐ&Ø"'§)¡)¨E°4Ó"8�ØÐ&Ø"6×":Ñ":¸5À$Ó"G�ØÐ&Ø"1×"5Ñ"5°e¸TÓ"B�à+0¯9©9°VÓ+<ÐØÐ'Ø#7×#;Ñ#;¸FÀDÓ#IÐ ØÐ'Ø#2×#6Ñ#6°v¸tÓ#DÐ à+0¯9©9°VÓ+<ÐØÐ'Ø#7×#;Ñ#;¸FÀDÓ#IÐ ØÐ'Ø#2×#6Ñ#6°v¸tÓ#DÐ ð"Ø*×.Ñ.¨t°TÓ:�ØÐ'Ø!%×!?Ñ!?ÈÐ^l×^rÑ^rÐ!?Ó!s‘Jà!%�Jô $@À
ÈOÓ#\Ð ð +1Ñ'ˆM˜<ðaÜ4;×4LÑ4LØ(×.Ñ.Ø(6×(JÑ(Jô5Ñ1�˜|¨Q°ð Ð!Ü*1×*MÑ*MØ'¸\ô+Ð'ð +Ð2Ø.0Ð+ð !&§	¡	¨,¸Ó ;�Ø$×(Ñ(¨°Ó8�Ü';¸M×<MÑ<MÐNdÓ<eÓ'fÐ$Ü(<¸]×=NÑ=NÐOfÓ=gÓ(hÐ%ä)Ø#Ø#Ø%)Ø&*Ø)=Ø*?Ø%1ØØ,CØ-1ô�
ð  Ð'Ü#1ñ $à'CØ&2 ^ñð %ðð 6°tñ	ñ$Ò ð   Ð'7×'AÑ'AÑAØ$×.Ñ.×5Ñ5°lÔCà—N‘NÐ#5°tÓ<ÐHØ"Ð#5Ñ6ÐBà(×9Ñ9ÐAØ%Ð&8Ñ9Ð<L×<]Ñ<]Ò]ð 9CÐCUÑ8VÐ$Ô5à—N‘NÐ#6¸Ó=ÐIØ"Ð#6Ñ7ÐCà(×:Ñ:ÐBØ%Ð&9Ñ:Ð=M×=_Ñ=_Ò_ð :DÐDWÑ9XÐ$Ô6Ü(<¸Z¿^¹^ÐLbÓ=cÓ(dÐ%Ø(Ð4Ø$×9Ñ9ÐAØ,Ð0@×0UÑ0UÒ0\ÐY\Ò]à<QÐ$Ô9Ü)=¸j¿n¹nÐMdÓ>eÓ)fÐ&Ø)Ð5Ø$×:Ñ:ÐBØ-Ð1A×1WÑ1WÒ1^Ð[^Ò_à=SÐ$Ô:à—N‘NÐ#GÈÓNÐZØ"Ð#GÑHÈDÑPàJNÐ$ÔGØ—>‘>Ð"3°TÓ:ÐFÈ:ÐVgÑKhÐlpÑKpØ7;Ð$Ô4à—N‘NÐ#>ÀÓEÐQØ"Ð#>Ñ?À4ÑGàAEÐ$Ô>à—N‘NÐ#8¸$Ó?ÐKØ"Ð#8Ñ9¸TÑAà;?Ð$Ô8à—N‘NÐ#9¸4Ó@ÐLØ"Ð#9Ñ:¸dÑBà<@Ð$Ô9à—>‘>Ð"6¸Ó=ÐIÈjÐYmÑNnÐrvÑNvØ:>Ð$Ô7à—N‘NÐ#<¸dÓCÐOØ"Ð#<Ñ=ÐIà?IÐJcÑ?dÐ$Ô<Ø—>‘> %¨Ó.Ð:¸Ð?VØ&0§n¡n°UÓ&;�OØ—>‘> %¨Ó.Ð:¸Ð?VØ&0§n¡n°UÓ&;�Oä;`Ø ×<Ñ<Ü3°JÐUiÔjó<ÐÔ8ð
 Ð*ØÐ$Ø !�IØ˜_Ñ,�	àÐ*ØÐ$Ø !�IØ˜_Ñ,�	àÐ+ØÐ%Ø!"�JØÐ.Ñ.�
àÒ+ØÐ%Ø!"�JØÐ.Ñ.’
ð]N	/ð^ Ð'àÐ$Ø'0Ð Ô$àÐ$Ø'0Ð Ô$àÐ%Ø(2Ð Ô%àÐ%Ø(2Ð Ô%ð 3Ð>ØGjÐ ÔDàÐøôO ò "Ø!“
ð"ûô ×%Ñ%×5Ñ5ò aÜ%×+Ñ+Ð,\Ð^_×`Ò`ûðaús*   Æ4U>Ç0VÕ>VÖVÖWÖ-W	×	Wc                 óì   — || j                   v rT| j                   |   }t        |t        «      r|}nt        |t        «      r|d   du ry|d   }ny| j	                  ||¬«      S | j	                  ||¬«      S )zè
        For a given model group name, return the combined model info

        Returns:
        - ModelGroupInfo if able to construct a model group
        - None if error constructing model group info or hidden model group
        ÚhiddenTNré   )r…  r…  )rŒ  rá   r  r3  r¨  )r4  r…  rC  Ú_router_model_groups       rÙ   Úget_model_group_infozRouter.get_model_group_infoŠ'  s�   € ð ˜$×0Ñ0Ñ0Ø×0Ñ0°Ñ=ˆDÜ˜$¤Ô$Ø&*Ñ#Ü˜D¤$Ô'Ø˜‘> TÑ)Øà*.¨w©-Ñ'àà×-Ñ-Ø/Ø-8ð .ó ð ð ×)Ñ)°kÐ`kÐ)ÓlÐlrç   c              ƒ   ó  K  — t        «       }|j                  d«      }g }g }| j                  |¬«      }|€y|D ]²  }|j                  di «      j                  d«      }|d   j                  d«      }	|�|	€Œ=|j	                  t
        j                  j                  j                  ||	|¬	«      «       |j	                  t
        j                  j                  j                  ||	|¬	«      «       Œ´ ||z   }
| j                  j                  |
¬
«      ƒ d{  –—† }|€y|dt        |«       }|t        |«      d }d}|�!|D ]  }t        |t        «      sŒ|€d}||z  }Œ d}|�!|D ]  }t        |t        «      sŒ|€d}||z  }Œ ||fS 7 Œq­w)zå
        Returns current tpm/rpm usage for model group

        Parameters:
        - model_group: str - the received model name from the user (can be a wildcard route).

        Returns:
        - usage: Tuple[tpm, rpm]
        rÞ  rG  NrJ  rÛ   rY  r»  ré   ©rY  ré   rà  ©rÌ  r   )r¸   ræ  rI  rà   rø  r—   rç  rÑ   rè  ré  r¼  Úasync_batch_get_cacher‰  rá   r  )r4  r…  rõ  rà  Útpm_keysÚrpm_keysrq  ré   rY  rK  Úcombined_tpm_rpm_keysÚcombined_tpm_rpm_valuesÚtpm_usage_listÚrpm_usage_listÚ	tpm_usager  Ú	rpm_usages                    rÙ   Úget_model_group_usagezRouter.get_model_group_usage§'  sÙ  è ø€ ô %Ó&ˆØ "§¡¨GÓ 4ˆØ%'ˆØ%'ˆà ×/Ñ/¸;Ð/ÓGˆ
ØÐØàò 	ˆEØ"ŸY™Y |°RÓ8×<Ñ<¸TÓBˆBØ(-Ð.>Ñ(?×(CÑ(CØó)ˆMð ˆz˜]Ð2ØØ�O‰OÜ×#Ñ#×)Ñ)×0Ñ0ØØ'Ø#1ð 1ó ôð �O‰OÜ×#Ñ#×)Ñ)×0Ñ0ØØ'Ø#1ð 1ó õð	ð* (0°(Ñ':Ðà/3¯z©z×/OÑ/OÐUjÐ/OÓ/k×)kÐØ"Ð*Øà-DÀ_ÄsÈ8Ã}Ð-UˆØ-DÄSÈÃ]À_Ð-Uˆð !%ˆ	ØÐ%Ø#ò #�Ü˜a¤Õ%Ø Ð(Ø$%˜	Ø ‘N‘Ið	#ð !%ˆ	ØÐ%Ø#ò #�Ü˜a¤Õ%Ø Ð(Ø$%˜	Ø ‘N‘Ið	#ð
 ˜)Ð#Ð#ð/ *lús   ‚DFÄFÄ<FÅ$FÅ5Fc              ƒ   ó  K  — t        «       }|j                  d«      }g }g }| j                  |¬«      }|€y|D ]²  }|j                  di «      j                  d«      }|d   j                  d«      }	|�|	€Œ=|j	                  t
        j                  j                  j                  ||	|¬	«      «       |j	                  t
        j                  j                  j                  ||	|¬	«      «       Œ´ | j                  j                  ||z   ¬
«      ƒ d{  –—† }
|
€y|
dt        |«       }|
t        |«      d }d}|D ]  }t        |t        «      sŒ|xs d|z   }Œ d}|D ]  }t        |t        «      sŒ|xs d|z   }Œ ||fS 7 Œm­w)z]
        Returns current ITPM/OTPM usage for a model group (sum across deployments).
        rÞ  rG  NrJ  rÛ   rY  r»  ré   r®  r¯  r   )r¸   ræ  rI  rà   rø  r—   ÚITPMrÑ   rè  ÚOTPMr¼  r°  r‰  rá   r  )r4  r…  rõ  rà  Ú	itpm_keysÚ	otpm_keysrq  ré   r  rK  Úcombined_valuesÚitpm_valuesÚotpm_valuesrœ  rÑ   r�  s                   rÙ   Úget_model_group_io_token_usagez%Router.get_model_group_io_token_usageê'  sº  è ø€ ô %Ó&ˆØ "§¡¨GÓ 4ˆØ&(ˆ	Ø&(ˆ	à ×/Ñ/¸;Ð/ÓGˆ
ØÐØàò 	ˆEØ#(§9¡9¨\¸2Ó#>×#BÑ#BÀ4Ó#HˆHØ(-Ð.>Ñ(?×(CÑ(CÀGÓ(LˆMØÐ =Ð#8ØØ×ÑÜ×$Ñ$×*Ñ*×1Ñ1ØØ'Ø#1ð 2ó ôð ×ÑÜ×$Ñ$×*Ñ*×1Ñ1ØØ'Ø#1ð 2ó õð	ð( (,§z¡z×'GÑ'GÈYÐYbÑMbÐ'GÓ'c×!cˆØÐ"Øà,Ð-=¬s°9«~Ð>ˆØ,¬S°«^Ð-=Ð>ˆà!%ˆ
Ø ò 	7ˆEÜ˜%¤Õ%Ø(šo¨A°Ñ6‘
ð	7ð "&ˆ
Ø ò 	7ˆEÜ˜%¤Õ%Ø(šo¨A°Ñ6‘
ð	7ð ˜:Ð%Ð%ð# "dús   ‚DF ÄE>Ä:F Å"F Å/F )Úmaxsizec                 ó$   — | j                  |«      S )zÉ
        Cached version of get_model_group_info, uses @lru_cache wrapper

        This is a speed optimization, since set_response_headers makes a call to get_model_group_info on every request
        )r¬  )r4  r…  s     rÙ   Ú_cached_get_model_group_infoz#Router._cached_get_model_group_info(  s   € ð ×(Ñ(¨Ó5Ð5rç   c              ƒ   óÜ  K  — | j                  |«      }i }|�f|j                  €|j                  �N| j                  |«      ƒ d {  –—† \  }}|j	                  t        |j                  |j                  ||¬«      «       |�|j                  nd }|�|j                  nd }|€|€|S | j                  |«      ƒ d {  –—† \  }}	|�||xs dz
  |d<   ||d<   |�||	xs dz
  |d<   ||d<   |S 7 Œ£7 Œ1­w)N)Ú
itpm_limitÚ
otpm_limitÚcurrent_itpmÚcurrent_otpmr   zx-ratelimit-remaining-tokenszx-ratelimit-limit-tokenszx-ratelimit-remaining-requestszx-ratelimit-limit-requests)	rÅ  r‡  rˆ  rÂ  rÔ  rt   rÛ  rÜ  r¹  )
r4  r…  r™  Úreturned_dictrÉ  rÊ  Ú	tpm_limitÚ	rpm_limitÚcurrent_tpmÚcurrent_rpms
             rÙ   Úget_remaining_model_group_usagez&Router.get_remaining_model_group_usage'(  s8  è ø€ Ø"&×"CÑ"CÀKÓ"PÐà/1ˆð
 Ð'Ð-=×-BÑ-BÐ-NÐRb×RgÑRgÐRsØ/3×/RÑ/RÐS^Ó/_×)_Ñ&ˆL˜,Ø× Ñ Ü1Ø/×4Ñ4Ø/×4Ñ4Ø!-Ø!-ô	ôð 4DÐ3OÐ+×/Ò/ÐUYˆ	Ø3CÐ3OÐ+×/Ò/ÐUYˆ	àÐ Ð!2Ø Ð à)-×)CÑ)CÀKÓ)P×#PÑ ˆ�[àÐ Ø<EÈÒIYÐXYÑ<ZˆMÐ8Ñ9Ø8AˆMÐ4Ñ5ØÐ Ø>GÈ;ÒK[ÐZ[Ñ>\ˆMÐ:Ñ;Ø:CˆMÐ6Ñ7àÐð3 *`øð  $Qús%   ‚AC,ÁC(ÁA3C,Â8C*Â90C,Ã*C,c              ƒ   óÊ   K  — t        |«      }|€|S t        |«      }||d<   t        ||«       |�/| j                  |«      ƒ d{  –—† }t	        ||t        |«      «       |S 7 Œ­w)a  
        Add the most accurate rate limit headers for a given model response.

        ## TODO: add model group rate limit headers
        # - if healthy_deployments > 1, return model group rate limit headers
        # - else return the model's rate limit headers
        Nzx-litellm-model-group)rR   rP   rN   rÐ  rO   rS   )r4  r  r…  r’  rJ  Úremaining_usages         rÙ   r¾  zRouter.set_response_headersK(  s~   è ø€ ô :¸(ÓCˆØÐØˆOä$FÀxÓ$PÐØ6AÐÐ2Ñ3Ü-Ð.@À.ÔQàÐ"Ø+/×+OÑ+OÐP[Ó+\×%\ˆOô
 *Ø"ØÜ.¨xÓ8ôð
 ˆð &]ús   ‚AA#ÁA!ÁA#c                 óp  — | j                   j                  «        | j                  j                  «        t        «       | _        t        |«      D ]e  \  }}|j                  d«      }|r;|| j                   vrg | j                   |<   | j                   |   j                  |«       | j                  ||«       Œg y)zï
        Build model_name -> deployment indices mapping for O(1) lookups.

        This index allows us to find all deployments for a given model_name in O(1) time
        instead of O(n) linear scan through the entire model_list.
        rf  N)	râ  Úclearrã  rä  rå  ru  rà   rø  r"  )r4  rq  rs  ré   rf  s        rÙ   Ú_build_model_name_indexzRouter._build_model_name_indexm(  s¢   € ð 	×-Ñ-×3Ñ3Ô5Ø×-Ñ-×3Ñ3Ô5Ü'0£{ˆÔ$ä# JÓ/ò 	6‰JˆC�ØŸ™ <Ó0ˆJÙØ T×%JÑ%JÑJØHJ�D×9Ñ9¸*ÑEØ×5Ñ5°jÑA×HÑHÈÔMà×)Ñ)¨%°Õ5ñ	6rç   c                 óv  — g | _         | j                  «        | j                  «        t        |«      D ]„  \  }}|j	                  di «      }|j	                  d«      }|€G|j	                  dd«      }|j	                  di «      }| j                  ||«      }d|vri |d<   ||d   d<   | j                  ||¬«       Œ† y)zô
        Build model index from model list to enable O(1) lookups immediately.
        This is called during initialization to avoid the race condition where
        requests arrive before model_id_to_deployment_index_map is populated.
        rÛ   rY  Nrf  ro  r»  ri  )rq  rj  rk  ru  rà   rÌ  rq  )r4  rq  r  ré   rÛ   r  rf  r»  s           rÙ   Ú'_build_model_id_to_deployment_index_mapz.Router._build_model_id_to_deployment_index_map�(  sÊ   € ð ˆŒØ×/Ñ/Ô1Ø×,Ñ,Ô.Ü! *Ó-ò 	R‰HˆAˆuàŸ™ <°Ó4ˆJØ!—~‘~ dÓ+ˆHð ÐØ"ŸY™Y |°RÓ8�
Ø!&§¡Ð+;¸RÓ!@�Ø×1Ñ1°*¸nÓM�à uÑ,Ø*,�E˜,Ñ'Ø,4��lÑ# DÑ)à×1Ñ1¸ÈÐ1ÕQñ	Rrç   Úexclude_team_modelsc                 ó¶  — g }|�p|| j                   v r`| j                   |   }|D ]L  }| j                  |   }d|v sŒd|d   v sŒ|r|d   j                  d«      rŒ6|j                  |d   d   «       ŒN |S | j                  D ]U  }| j                  |   }| j                  |   }d|v sŒ&d|d   v sŒ.|r|d   j                  d«      rŒE|j                  |«       ŒW |S )zÍ
        if 'model_name' is none, returns all.

        Returns list of model id's.

        Optimized with O(1) or O(k) index lookup when model_name provided,
        instead of O(n) linear scan.
        rÛ   rY  ry  )râ  rq  rà   rø  rá  )r4  rf  rØ  ÚidsrÒ  rs  ré   r  s           rÙ   Úget_model_idszRouter.get_model_idsœ(  s  € ð ˆàÐ!à˜T×BÑBÑBØ!%×!FÑ!FÀzÑ!R�Ø"ò >�CØ ŸO™O¨CÑ0�EØ# uÒ,°¸¸|Ñ9LÒ1LÙ.°5¸Ñ3F×3JÑ3JÈ9Ô3UØ$ØŸ
™
 5¨Ñ#6°tÑ#<Õ=ð>ð" ˆ
ð !×AÑAò )�Ø×;Ñ;¸HÑE�ØŸ™¨Ñ,�Ø 5Ò(¨T°U¸<Ñ5HÒ-HÙ*¨u°\Ñ/B×/FÑ/FÀyÔ/QØ Ø—J‘J˜xÕ(ð)ð ˆ
rç   Úcandidate_idc                 ó   — || j                   v S )aª  
        O(1) membership check for a deployment ID without allocating large lists.

        Note: Call sites may pass a variable named `model` when it actually
        contains a deployment ID. This helper expects the deployment ID string.

        Uses the existing `model_id_to_deployment_index_map` which is kept
        in sync by `_build_model_id_to_deployment_index_map` and model-list
        mutation helpers.
        )rá  )r4  rÜ  s     rÙ   r‚  zRouter.has_model_id¾(  s   € ð ˜t×DÑDÐDÐDrç   c                 óÌ  — |sy|| j                   v r|S | j                  |«      r.| j                  |¬«      }|�|j                  r|j                  S |S | j	                  d¬«      }|sy|D ]x  }|j                  di «      }|j                  d«      }||k(  xs2 |xr |j                  d|› �«      xs |xr |j                  d|› �«      }|sŒb|j                  d«      }|sŒv|c S  y)	a  
        Resolve model_name from model_id.

        This method attempts to find the correct model_name to use with the router
        so that litellm_params can be automatically injected from the model config.

        Strategy:
        1. First, check if model_id directly matches a model_name or deployment ID
        2. If not, search through router's model_list to find a match by litellm_params.model
        3. Return the model_name if found, None otherwise

        Args:
            model_id: The model_id extracted from decoded video_id
                     (could be model_name or litellm_params.model value)

        Returns:
            model_name if found, None otherwise. If None, the request will fall through
            to normal flow using environment variables.
        Nr  rG  r»  ré   rH  ú:rf  )rh  r‚  rä  rf  rI  rà   Úendswith)r4  r  r  Ú
all_modelsr»  Úactual_modelÚmatchesrf  s           rÙ   Ú resolve_model_name_from_model_idz'Router.resolve_model_name_from_model_idË(  s  € ñ( Øð �t×'Ñ'Ñ'ØˆOØ×Ñ˜XÔ&Ø×,Ñ,°hÐ,Ó?ˆJØÐ%¨*×*?Ò*?Ø!×,Ñ,Ð,ØˆOð !×/Ñ/¸4Ð/Ó@ˆ
ÙØà$ò 	&ˆJØ'Ÿ^™^Ð,<¸bÓAˆNØ)×-Ñ-¨gÓ6ˆLð
  Ñ(ò LØ ÒJ \×%:Ñ%:¸Q¸x¸j¸>Ó%JòLà ÒJ \×%:Ñ%:¸Q¸x¸j¸>Ó%Jð ò Ø'Ÿ^™^¨LÓ9�
ÚØ%Ò%ð	&ð$ rç   Úteam_model_namec                 óþ   — | j                  ||¬«      }|sy|D ]b  }|j                  di «      j                  d«      |k(  sŒ(|€6|j                  di «      j                  d«      xs |j                  d«      c S |c S  y)aÀ  
        Check if team_model_name resolves to team-specific deployments.

        Returns the public model name (unchanged) so the router can find all
        sibling deployments via team_id filtering, instead of collapsing to a
        single internal model_name.

        When team_model_name is None (e.g. vector store / file endpoints that
        don't include a model in their request), returns the first matching
        team deployment's team_public_model_name so the router can inject BYOK
        credentials from the team-scoped deployment.

        Returns:
        - str: the team_model_name if team deployments exist for this team
        - None: if no team-specific model is found
        r{  NrÛ   ry  ró  rf  )rI  rà   )r4  rå  ry  rn  ré   s        rÙ   Úmap_team_modelzRouter.map_team_model)  s�   € ð" ×+Ñ+°ÐPWÐ+ÓXˆÙØØò 	'ˆEØ�y‰y˜ rÓ*×.Ñ.¨yÓ9¸WÓDØ"Ð*ð !Ÿ9™9 \°2Ó6×:Ñ:Ð;SÓTÒoÐX]×XaÑXaÐbnÓXoÒoØ&Ò&ð	'ð rç   c                 ó  — |�O|j                  d«      xs i j                  d«      |k(  r(||j                  d«      xs i j                  d«      k(  ry|�6|d   |k(  r.|j                  d«      xs i j                  d«      }|�|�||k(  ryy)zU
        Get the team-specific model name if team_id matches the deployment.
        rÛ   ry  ró  Trf  FrK  )r4  rf  ré   ry  Úmodel_team_ids        rÙ   Úshould_include_deploymentz Router.should_include_deployment%)  s›   € ð
 ÐØ—‘˜<Ó(Ò.¨B×3Ñ3°IÓ>À'ÒIØ˜uŸy™y¨Ó6Ò<¸"×AÑAÐBZÓ[Ò[àØÐ#¨¨lÑ(;¸zÒ(Ið %*§I¡I¨lÓ$;Ò$A¸r×#FÑ#FÀyÓ#QˆMà�Ø Ð(Ø  GÒ+ààrç   Úmodel_aliasc                 ó  — g }|�Š||f}|| j                   v rx| j                   |   }|D ]`  }| j                  |   }| j                  |||¬«      sŒ'|�'|j                  «       }	||	d<   |j	                  |	«       ŒP|j	                  |«       Œb |r|S || j
                  v rv| j
                  |   }|D ]`  }| j                  |   }| j                  |||¬«      sŒ'|�'|j                  «       }	||	d<   |j	                  |	«       ŒP|j	                  |«       Œb |S |�lt        | j                  «      D ]T  \  }}| j                  |||¬«      sŒ|�'|j                  «       }	||	d<   |j	                  |	«       ŒD|j	                  |«       ŒV |S )aM  
        Return all deployments of a model name

        Used for accurate 'get_model_list'.

        if team_id specified, only return team-specific models

        Optimized with O(1) index lookup instead of O(n) linear scan.

        Note: when team_id is provided, O(1) lookup in
        `team_model_to_deployment_indices` only applies when `model_name` is the
        team public model name. If a caller passes an internal deployment model
        name (for example, `model_name_<team_id>_<uuid>`), this method falls back
        to the standard model-name index / scan path.
        )rf  ré   ry  rf  )rã  rq  rê  r™  rø  râ  ru  )
r4  rf  rë  ry  Úreturned_modelsrÅ  rÒ  rs  ré   Úalias_models
             rÙ   r|  zRouter._get_all_deployments<)  sÃ  € ð* =?ˆð ÐØ! :Ð.ˆCØ�d×;Ñ;Ñ;Ø×?Ñ?ÀÑD�à"ò 	6�CØ ŸO™O¨CÑ0�EØ×9Ñ9ÀZÐW\ÐfmÐ9ÔnØ Ø"Ð.Ø&+§j¡j£l˜Ø4?˜ LÑ1Ø'×.Ñ.¨{Õ;à'×.Ñ.¨uÕ5ð	6ñ #Ø*Ð*ð ˜×>Ñ>Ñ>Ø×;Ñ;¸JÑGˆGð ò 
6�ØŸ™¨Ñ,�Ø×1Ñ1¸ZÈuÐ^eÐ1ÕfØ"Ð.ð ',§j¡j£l˜Ø4?˜ LÑ1Ø'×.Ñ.¨{Õ;à'×.Ñ.¨uÕ5ð
6ð2 Ðð Ð ô (¨¯©Ó8ò 6‘
��UØ×1Ñ1¸ZÈuÐ^eÐ1ÕfØ"Ð.à&+§j¡j£l˜Ø4?˜ LÑ1Ø'×.Ñ.¨{Õ;à'×.Ñ.¨uÕ5ð6ð Ðrç   c                 ó  — | j                  «       xs g }g }|D ]m  }|j                  d«      }| j                  |«      r(| j                  ||¬«      }|sŒ;|j	                  |«       ŒM|j	                  |j                  dd«      «       Œo |S )u  
        Returns all possible model names for the router, including models defined via model_group_alias.

        If a team_id is provided, only deployments configured with that team_id (i.e. teamâ€�specific models)
        will yield their team public name.
        rÛ   )r  ry  rf  ro  )rI  rà   Ú_is_team_specific_modelÚ_get_team_specific_modelrø  )r4  ry  Údeploymentsrh  r  rÛ   rå  s          rÙ   rí  zRouter.get_model_names†)  s‘   € ð "×0Ñ0Ó2Ò8°bˆØˆà%ò 	EˆJØ#Ÿ™¨Ó5ˆJØ×+Ñ+¨JÔ7Ø"&×"?Ñ"?È:Ð_fÐ"?Ó"g�Ú"Ø×&Ñ& Õ7à×"Ñ" :§>¡>°,ÀÓ#CÕDð	Eð Ðrç   c                 ó<  — | j                  «       xs g }i }|D ]V  }|j                  d«      xs d}|sŒ|j                  d«      xs i j                  d«      du }||v r||   xr |||<   ŒR|||<   ŒX |j                  «       D ��ch c]
  \  }}|sŒ	|’Œ c}}S c c}}w )a[  
        Returns the set of model_names where every backing deployment has `blocked=True`.

        Used by `/v1/models` to hide paused models from client listings while still
        surfacing them on admin endpoints (e.g. `/model/info`). A model with at least
        one non-blocked deployment is still serviceable and remains visible.
        rf  ro  rÛ   ÚblockedT)rI  rà   r;  )r4  rò  Úblocked_by_namer  r=  Ú
is_blockedÚfully_blockeds          rÙ   Úget_fully_blocked_model_namesz$Router.get_fully_blocked_model_names›)  sµ   € ð "×0Ñ0Ó2Ò8°bˆØ24ˆØ%ò 	3ˆJØ—>‘> ,Ó/Ò5°2ˆDÙØØ$Ÿ.™.¨Ó6Ò<¸"×AÑAÀ)ÓLÐPTÐTˆJØ�Ñ&Ø(7¸Ñ(=Ò(LÀ*� Ò%à(2� Ò%ð	3ð 1@×0EÑ0EÓ0G×YÑ,˜˜}Ê=’ÓYÐYùÓYs   Â
BÂBrò  c                 óF   — t        | «      dkD  xr t        d„ | D «       «      S )Nr   c              3   óh   K  — | ]*  }|j                  d «      xs i j                  d«      du –— Œ, y­w)rÛ   rô  TNrK  )rŠ  r  s     rÙ   r‹  z6Router._are_all_deployments_blocked.<locals>.<genexpr>´)  s3   è ø€ ò ,
ØLVˆZ�^‰^˜LÓ)Ò/¨R×4Ñ4°YÓ?À4ÔGñ,
ùs   ‚02)r‰  r	  ©rò  s    rÙ   Ú_are_all_deployments_blockedz#Router._are_all_deployments_blocked°)  s/   € ô �;Ó !Ñ#ò 
¬ñ ,
ØZeô,
ó )
ð 	
rç   c                 óR   — | j                  |¬«      xs g }| j                  |¬«      S )NrG  rû  )rI  rü  )r4  ré   rò  s      rÙ   Ú_is_model_fully_blockedzRouter._is_model_fully_blocked¸)  s.   € Ø!×0Ñ0¸EÐ0ÓBÒHÀbˆØ×0Ñ0¸[Ð0ÓIÐIrç   c              ƒ   ó,  K  — | j                   �
t        «       S | j                  j                  «       ƒ d{  –—† }|s
t        «       S | j	                  «       xs g }i }|D ]„  }|j                  d«      xs i }|j                  d«      xs dg}|j                  d«      }|r|j                  |«       |j                  d«      |v }|D ]  }	|	sŒ|	|v r||	   xr |||	<   Œ|||	<   Œ Œ† |j                  «       D �	�
ch c]
  \  }	}
|
sŒ	|	’Œ c}
}	S 7 ŒÕc c}
}	w ­w)u^  
        Returns the set of model names where every backing deployment is currently
        marked unhealthy by background health checks (and the health state is not stale).

        Used by `/v1/models?healthy_only=true` to hide models that cannot serve any
        request. A model with at least one healthy (or unknown-health) deployment
        remains visible. Returns an empty set when no health state is available, so
        callers fail open to the unfiltered listing.

        Notes:
            - Mirrors `_async_filter_health_check_unhealthy_deployments`: when
              `allowed_fails_policy` is set, cooldown is the sole routing exclusion
              mechanism, so nothing is hidden here either.
            - Team-specific public model names (`team_public_model_name`) are
              aggregated alongside `model_name`, so team aliases of fully-unhealthy
              deployments are hidden too (unlike `get_fully_blocked_model_names`,
              which matches `model_name` only).
            - Wildcard routes (e.g. `openai/*`) are matched by their literal
              deployment name only; models expanded from a wildcard route are not
              hidden (fail open).
            - Intentionally diverges from the routing-time safety net (which
              bypasses the health filter when every candidate is unhealthy and
              still attempts the request): hiding here is presentation-only â€”
              it answers "should this model be advertised?", not "should a
              request for it still be attempted?". A hidden model can still be
              called directly.
        NrÛ   rf  ro  ró  rY  )r–  rl  rî  Ú"async_get_unhealthy_deployment_idsrI  rà   rø  r;  )r4  Úunhealthy_idsrò  Úunhealthy_by_namer  rÛ   Únamesró  Úis_unhealthyr=  Úfully_unhealthys              rÙ   Ú%async_get_fully_unhealthy_model_namesz,Router.async_get_fully_unhealthy_model_names¼)  s.  è ø€ ð8 ×$Ñ$Ð0Ü“5ˆLØ%)×%<Ñ%<×%_Ñ%_Ó%a×aˆÙÜ“5ˆLØ!×0Ñ0Ó2Ò8°bˆØ46ÐØ%ò 	;ˆJØ#Ÿ™¨Ó5Ò;¸ˆJØ—^‘^ LÓ1Ò7°RÐ8ˆEØ%/§^¡^Ð4LÓ%MÐ"Ù%Ø—‘Ð3Ô4Ø%Ÿ>™>¨$Ó/°=Ð@ˆLØò ;�ÙØØÐ,Ñ,Ø.?ÀÑ.EÒ.VÈ,Ð% dÒ+à.:Ð% dÒ+ñ;ð	;ð 3D×2IÑ2IÓ2K×_Ñ.˜˜Ê’Ó_Ð_ð'  búó& `ùs(   ‚4D¶D·CDÃ9
DÄDÄDÄDc                 ó~   — |j                  d«      xs i }|€y||j                  d«      k(  r|j                  d«      S y)aº  
        Get the team-specific model name if team_id matches the deployment.

        Args:
            deployment: DeploymentTypedDict - The model deployment
            team_id: Optional[str] - If passed, will return router models set with a `team_id` matching the passed `team_id`.

        Returns:
            str: The `team_public_model_name` if team_id matches
            None: If team_id doesn't match or no team info exists
        rÛ   Nry  ró  rK  )r4  r  ry  rÛ   s       rÙ   rñ  zRouter._get_team_specific_modelï)  sD   € ð *4¯©¸Ó)EÒ)KÈˆ
ØÐØØ�j—n‘n YÓ/Ò/Ø—>‘>Ð":Ó;Ð;Ørç   c                 ó>   — t        |xr |j                  d«      «      S )zá
        Check if model info contains team-specific configuration.

        Args:
            model_info: Model information dictionary

        Returns:
            bool: True if model has team-specific configuration
        ry  )rU  rà   )r4  rÛ   s     rÙ   rð  zRouter._is_team_specific_model*  s   € ô �JÒ< :§>¡>°)Ó#<Ó=Ð=rç   c                 óp  — g }|�#|| j                   vr|S || j                   |   fg}n#t        | j                   j                  «       «      }|D ]f  \  }}t        |t        «      r|}n,t        |t
        «      rt        di |¤Ž}|d   du r|€Œ>|d   }nŒE|j                  | j                  ||¬«      «       Œh |S )zŒ
        Helper function to get model list from model alias.

        Used by `.get_model_list` to get model list from model alias.
        rª  Tré   ©rf  rë  r  )	rŒ  râ   r;  rá   r  r3  rš   r&  r|  )r4  rf  rí  Úalias_itemsrë  Úmodel_valueÚ_router_model_nameÚ_model_values           rÙ   Úget_model_list_from_model_aliasz&Router.get_model_list_from_model_alias*  sÜ   € ð =?ˆàÐ!à ×!7Ñ!7Ñ7Ø&Ð&Ø&¨×(>Ñ(>¸zÑ(JÐKÐL‰Kä˜t×5Ñ5×;Ñ;Ó=Ó>ˆKà(3ò 	vÑ$ˆK˜Ü˜+¤sÔ+Ø*5Ñ"Ü˜K¬Ô.Ü8ÑG¸;ÑG�Ø Ñ)¨TÑ1°jÐ6HØØ%1°'Ñ%:Ñ"àà×"Ñ" 4×#<Ñ#<ÐHZÐhsÐ#<Ó#tÕuð	vð Ðrç   c                 óæ   ‡ ‡— |�'‰ j                  |«      }|�‰ j                  |f«      S dS ‰ j                  }|�|S ‰ j                  t        ˆˆ fd„‰ j                  D «       «      «      }|‰ _        |S )a³  
        Callable routing groups materialized as model-list rows, mirroring
        `get_model_list_from_model_alias`: each member deployment is emitted
        under the group's name (via `_get_all_deployments`' `model_alias`
        rewrite), which is what surfaces groups in `get_model_names`,
        `/v1/models` discovery, `get_model_group_usage`, and the
        blocked/unhealthy hiding that all read `get_model_list`.
        r  c              3   óH   •K  — | ]  }‰j                  |«      xŠ�‰–— Œ y ­wrÔ   )rx  )rŠ  r=  Úcallable_groupr4  s     €€rÙ   r‹  z<Router.get_model_list_from_routing_groups.<locals>.<genexpr>=*  s/   øè ø€ ò àØ&*×&<Ñ&<¸TÓ&BÐB�NÐOô ñùs   ƒ")rx  Ú_materialize_routing_group_rowsrè  rã   rh  )r4  rf  rt  ÚcachedÚrowsr	  s   `    @rÙ   Ú"get_model_list_from_routing_groupsz)Router.get_model_list_from_routing_groups-*  s‰   ù€ ð Ð!Ø×1Ñ1°*Ó=ˆEØEJÐEV�4×7Ñ7¸¸ÓAÐ^Ð\^Ð^Ø×0Ñ0ˆØÐØˆMØ×:Ñ:Üô à ×0Ñ0ôó ó
ˆð $(ˆÔ Øˆrç   Úgroupsc                 ó,   ‡ — t        ˆ fd„|D «       «      S )Nc              3   ó¦   •K  — | ]H  }|j                   D ]7  }‰j                  ||j                  ¬ «      D ]  }‰j                  |«      –— Œ Œ9 ŒJ y­w)r
	  N)rn  r|  rm  Ú_as_routing_group_row)rŠ  rt  r~  r  r4  s       €rÙ   r‹  z9Router._materialize_routing_group_rows.<locals>.<genexpr>G*  si   øè ø€ ò 
àØŸ,™,ò
ð Ø"×7Ñ7À6ÐW\×WgÑWgÐ7Óhò	
ð ð ×&Ñ& z×2ð
Ø2ð
Ø2ñ
ùs   ƒAA)rã   )r4  r	  s   ` rÙ   r	  z&Router._materialize_routing_group_rowsF*  s   ø€ Üó 
àô
ó 
ð 	
rç   c                 ó–   — | j                  d«      xs i j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}i | ¥d|i¥S c c}}w )a&  
        A member deployment re-emitted under its group's name must not carry
        the member's `access_groups`: access groups grant member names, never
        the group, so inheriting them here would let a key holding a member's
        access group list and call the whole group.
        rÛ   r  )rà   r;  )r  r`  ra  rÛ   s       rÙ   r	  zRouter._as_routing_group_rowN*  s^   € ð )Ÿn™n¨\Ó:Ò@¸b×GÑGÓI÷
Ù�Q˜ÈQÐRaÓMaˆAˆq‰Dð
ˆ
ñ 
ð 8�*Ð7˜l¨JÑ7Ð7ùó
s
   §AµA>   ré   r_  rp  Údrop_paramsÚextra_headersÚmax_completion_tokensÚadditional_drop_paramsÚTIER_PARAMS_NEVER_DROPPEDrÁ  c                 óœ   — | j                  d«      }t        |t        t        t        t
        f«      s
t        «       S t        d„ |D «       «      S )NÚallowed_openai_paramsc              3   óB   K  — | ]  }t        |t        «      sŒ|–— Œ y ­wrÔ   )rá   r  rå  s     rÙ   r‹  z3Router._declared_param_allowlist.<locals>.<genexpr>l*  s   è ø€ ÒO 5¼
À5Ì#Õ8NœÑOùs   ‚˜)rà   rá   râ   rã   rl  rä  )rÁ  Údeclareds     rÙ   Ú_declared_param_allowlistz Router._declared_param_allowlistg*  s=   € à Ÿ*™*Ð%<Ó=ˆÜ˜(¤T¬5´#´yÐ$AÔBÜ“;ÐÜÑO¨HÔOÓOÐOrç   rt  Úparamc                 ó~  — | j                  d«      }|sy|t        j                  |«      v ryt        t	        |j                  d«      xs d«      |j                  d«      «      ry| j                  d«      }|r|j                  d«      nd xs |j                  d«      }	 t        j                  |j                  d«      xs ||j                  d«      ¬«      \  }}}}t        j                  ||t        |t        «      r|nd ¬	«      }	|	d u xs ||	v S # t        $ r"}
t        j                  d
|||
«       Y d }
~
yd }
~
ww xY w)Nr»  Tré   ro  r&  rÛ   rl  r¶  )ré   r&  rl  zOlitellm.router.py::_deployment_accepts_param: keeping %s for model=%s. Got - %s)rà   rg  r%	  r1   r  rÍ  rµ   r—  rá   r�  r   rš  )r  rt  r&	  Údeployment_paramsrî  rl  ré   r&  r  Ú	supportedr   s              rÙ   Ú_deployment_accepts_paramz Router._deployment_accepts_paramn*  sN  € à#-§>¡>Ð2BÓ#CÐÙ ØØ”F×4Ñ4Ð5FÓGÑGØÜ+ÜÐ!×%Ñ% gÓ.Ò4°"Ó5Ð7H×7LÑ7LÐMbÓ7cô
ð Ø'1§~¡~°lÓ'CÐá7LÐ!×%Ñ% lÔ3ÐRVò1à×"Ñ" <Ó0ð 	ð	Ü/6×/GÑ/GØ'×+Ñ+¨GÓ4Ò=¸Ø$5×$9Ñ$9Ð:OÓ$Pô0Ñ,ˆEÐ&¨¨1ô  '×BÑBØØ$7Ü)3°JÄÔ)D™:È$ô ˆIð ˜DÐ Ò6 E¨YÐ$6Ð6øô ò 	Ü!×'Ñ'ØaÐchÐjoÐqrôô ûð		ús   ÂA(D Ä	D<ÄD7Ä7D<Útier_paramsc                 óº  ‡ ‡‡	— ‰ j                  ‰¬«      xs dŠ	‰	s|S ‰ j                  |«      ‰ j                  |«      z  }t        |«      ‰ j                  z
  |z
  }t	        ˆ	ˆˆ fd„|D «       «      }|s|S t        j                  ddj                  t        |«      «      ‰«       t        |j                  «       D ��ci c]  \  }}||vsŒ||“Œ c}}«      S c c}}w )aY	  Drop an OpenAI param that no deployment behind ``model`` declares.

        A tier's litellm_params are an operator override applied to every request the tier routes,
        so one the target cannot take turns that whole tier into a 400 raised before the request
        leaves the proxy. The candidates are exactly what get_optional_params can reject, asked of
        the module that raises, so credentials and endpoint controls are never at risk.

        TIER_PARAMS_NEVER_DROPPED is excluded on top of that, for two reasons. No provider lists a
        litellm control among its supported params, so "no deployment declares it" means litellm
        consumes it rather than that the target refuses it, and dropping one changes litellm's own
        behavior: dropping drop_params or additional_drop_params silently disables the sanitization
        the operator configured. Providers do list extra_headers, but it carries auth, tenancy and
        routing information, so sending fewer headers than configured is worse than today's error.
        Token ceilings stay for the same reason: a tier's max_tokens or max_completion_tokens is a
        cost bound, and dropping it would let a caller's own larger value through where today the
        mismatch fails loudly.

        The trade this filter makes is a param for a working request, which is right for one that
        only shapes how the model answers and wrong for anything else.

        A param survives if ANY deployment could take it, because routing has not chosen one yet,
        and it survives both an unresolvable provider and a group with no deployments, because a
        best-effort filter must never narrow what the request already did.

        A github_copilot or chatgpt deployment counts as accepting everything, decided before any
        lookup: resolving either provider runs its OAuth device flow, so a capability question
        asked from the routing path can freeze the event loop for minutes waiting on a human.

        allowed_openai_params is the documented escape hatch for an outdated or incomplete
        supported-params list: request-time validation extends the supported list with it before
        comparing. The filter asks the same question, so a param named by the allowlist on the tier
        overlay, the request, or a deployment's own litellm_params is never a drop candidate.
        rG  r  c              3   óP   •‡K  — | ]  Št        ˆˆˆfd „‰D «       «      s‰–— Œ y­w)c              3   óD   •K  — | ]  }‰j                  |‰‰«      –— Œ y ­wrÔ   )r*	  )rŠ  r  ré   r&	  r4  s     €€€rÙ   r‹  zCRouter._tier_params_the_target_accepts.<locals>.<genexpr>.<genexpr>¼*  s!   øè ø€ ÒnÐT^�t×5Ñ5°jÀ%È×OÑnùrM  N©r‡  )rŠ  r&	  rò  ré   r4  s    @€€€rÙ   r‹  z9Router._tier_params_the_target_accepts.<locals>.<genexpr>¹*  s(   ùè ø€ ò '
àÜÕnÐbmÔnÔnô ñ'
ùs   „"&z^litellm.router.py: dropping tier params %s for model=%s, no deployment behind it declares themrê  )rI  r%	  rº   r 	  rä  r   rÓ  r<  r”  r   r;  )
r4  ré   r+	  r’  ÚallowlistedÚ
candidatesÚunsupportedrÅ  rÑ   rò  s
   ``       @rÙ   Ú_tier_params_the_target_acceptsz&Router._tier_params_the_target_acceptsŽ*  sæ   ú€ ðH "×0Ñ0¸EÐ0ÓBÒHÀbˆÙØÐØ!×;Ñ;¸KÓHÈ4×KiÑKiØóL
ñ 
ˆô 7°{ÓCÀd×FdÑFdÑdÐgrÑrˆ
Ü&õ '
à#ô'
ó 
ˆñ
 ØÐÜ×%Ñ%ØlØ�I‰I”f˜[Ó)Ó*Øô	
ô
  ¸k×>OÑ>OÓ>Q× l±
°°UÐUXÐ`kÒUk  e¡Ó lÓmÐmùÓ ls   Â=C
Ã
C
c                 ó4  — g }|�"|j                  | j                  ||¬«      «       |j                  | j                  |¬«      «       |j                  | j                  |¬«      «       t	        |«      dk(  r�| j
                  j                  |xs d¬«      }|�B|| j                  v r4| j                  |   j                  |xs d¬«      }|j                  |«       |�*|�(|D ]#  }t        di |¤Ž}||d<   |j                  |«       Œ% |€|| j                  z  }|S )zƒ
        Includes router model_group_alias'es as well

        if team_id specified, returns matching team-specific models
        r{  rG  r   ro  r‡  rf  r  )r&  r|  r	  r	  r‰  rÚ  Úget_deployments_by_patternrÛ  rŽ   rø  rq  )r4  rf  ry  rí  rf  Ú#potential_team_only_wildcard_modelsr   Údeployment_typed_dicts           rÙ   rI  zRouter.get_model_listÇ*  sE  € ð 68ˆàÐ!Ø×"Ñ" 4×#<Ñ#<È
Ð\cÐ#<Ó#dÔeà×Ñ˜t×CÑCÈzÐCÓZÔ[Ø×Ñ˜t×FÑFÐR\ÐFÓ]Ô^äˆÓ 1Ò$Ø/3×/BÑ/B×/]Ñ/]ÐdnÒdtÐrtÐ/]Ó/uÐ%ð Ð" w°$×2KÑ2KÑ'KØ=A×=VÑ=VØñ>ç,Ñ,°:Ò3CÀÐ,ÓDð 4ð *×0Ñ0Ð1TÔUàÐ%Ð*CÐ*OØ2ò B�AÜ,?Ñ,DÀ!Ñ,DÐ)Ø:DÐ)¨,Ñ7Ø#×*Ñ*Ð+@ÕAðBð
 ÐØ˜tŸ™Ñ.ˆOàÐrç   c                 óV   ‡— t        ˆfd„| j                  ||¬«      xs dD «       «      S )aí  The provider model strings `model_name` can actually be served by on this proxy.

        `get_model_list` composes every channel the request path itself uses (exact name,
        model_group_alias, routing groups, wildcards), so this answers "which models will
        answer a call to this name" rather than "what did the admin call it": the deployment
        name is admin-arbitrary, and two names over one provider model are one model.

        Empty when the name resolves to no deployment. That is not the same fact as "the
        call will fail" - a provider-qualified public name is served by the SDK with no
        deployment behind it - so the fallback for an empty result is the caller's policy,
        never this function's.
        c              3   óˆ   •K  — | ]9  }t        |j                  d i «      j                  d«      xŠt        «      r‰r‰–— Œ; y­w)r»  ré   N)rá   rà   r  )rŠ  r  rK  s     €rÙ   r‹  z1Router.resolved_litellm_models.<locals>.<genexpr>û*  sD   øè ø€ ò 
àÜ¨:¯>©>Ð:JÈBÓ+O×+SÑ+SÐT[Ó+\Ð\˜-Ô^aÔbÑgtô ñ
ùs   ƒ?Ar{  r  )rã   rI  )r4  rf  ry  rK  s      @rÙ   Úresolved_litellm_modelszRouter.resolved_litellm_modelsî*  s6   ø€ ô ó 
à"×1Ñ1¸ZÐQXÐ1ÓYÒ_Ð]_ô
ó 
ð 	
rç   c                 óz   — | j                   j                  «        | j                  j                  «        d| _        y)u¢  Invalidate the cached model group info.

        Call this whenever self.model_list is modified to ensure the cache is rebuilt.
        Also clears the auth-layer zero-cost cache, which depends on the same
        ``ModelGroupInfo`` data â€” without this, an in-place pricing update on
        an existing deployment (same model count) would keep a stale ``True``
        result and bypass budget enforcement.
        N)rÅ  Úcache_clearrç  rÔ  rè  r8  s    rÙ   rj  z)Router._invalidate_model_group_info_cache+  s0   € ð 	×)Ñ)×5Ñ5Ô7Ø×Ñ×#Ñ#Ô%Ø#'ˆÕ rç   c                 ó   — d| _         y)z…Invalidate the cached access groups.

        Call this whenever self.model_list is modified to ensure the cache is rebuilt.
        N)ræ  r8  s    rÙ   rk  z&Router._invalidate_access_groups_cache+  s   € ð
 %)ˆÕ!rç   Úmodel_access_groupc                 óÆ  — |du xr
 |du xr |du }|r| j                   �| j                   S ddlm}  |t        «      }| j	                  ||¬«      }|rq|D ]l  }|j                  d«      }	|	sŒ|	j                  dg «      xs g D ]=  }
|� |
|k(  sŒ|d   }||
   j                  |«       Œ%|d   }||
   j                  |«       Œ? Œn |rt        |«      | _         | j                   S |S )aí  
        If model_name is provided, only return access groups for that model.

        Parameters:
        - model_name: Optional[str] - the received model name from the user (can be a wildcard route). If set, will only return access groups for that model.
        - model_access_group: Optional[str] - the received model access group from the user. If set, will only return models for that access group.
        - team_id: Optional[str] - the team id, to resolve team-specific models
        Nr   r   r{  rÛ   r  rf  )ræ  Úcollectionsr   râ   rI  rà   rø  r3  )r4  rf  r>	  ry  Ú
_use_cacher   r  rq  r   r  rt  s              rÙ   Úget_model_access_groupszRouter.get_model_access_groups+  s  € ð '¨$Ð.ÒaÐ3EÈÐ3MÒaÐRYÐ]aÐRaˆ
ñ ˜$×3Ñ3Ð?Ø×,Ñ,Ð,å+á*¬4Ó0ˆà ×/Ñ/¸:ÈwÐ/ÓWˆ
ÙØò 
D�ØŸe™e LÓ1�ÚØ!,§¡°À"Ó!EÒ!KÈò D˜Ø-Ð9Ø$Ð(:Ó:Ø-.¨|©_ 
Ø -¨eÑ 4× ;Ñ ;¸JÕ Gà)*¨<©˜JØ)¨%Ñ0×7Ñ7¸
ÕCñDð
Dñ Ü(,¨]Ó(;ˆDÔ%Ø×,Ñ,Ð,àÐrç   c                 ó´   — | j                  |¬«      }t        |«      dk(  ry|j                  |g «      }|D ]   }| j                  j	                  |¬«      €Œ  y y)zG
        Return True if model access group is a wildcard route
        )r>	  r   Fr1  T)rB	  r‰  rà   rÚ  r`  )r4  r>	  r  rn  ré   s        rÙ   Ú)_is_model_access_group_for_wildcard_routez0Router._is_model_access_group_for_wildcard_routeC+  sl   € ð
  $×;Ñ;ÐOaÐ;Óbˆäˆ}Ó Ò"Øà%×)Ñ)Ð*<¸bÓAˆàò 	ˆEà×"Ñ"×(Ñ(°Ð(Ó7ÑCÙð	ð
 rç   c                 ó^  — t        | «      }i }g d¢}|D ]X  }||v r||   ||<   |dk(  sŒ| j                  dk(  sŒ%| j                  €Œ2| j                  j                  j	                  «       ||<   ŒZ | j
                  j                  «       D �cg c]  }|j                  «       ‘Œ c}|d<   |S c c}w )a  
        Get router settings method, returns a dictionary of the settings and their values.
        For example get the set values for routing_strategy_args, routing_strategy, allowed_fails, cooldown_time, num_retries, timeout, max_retries, retry_after
        )r¡  r™  r•  r—  r  r�  rÃ  r’  r‰  rŠ  r”  r“  rŒ  r­  rŽ  r�  r¡  rœ  r¢  )Úvarsr™  r@  rN  r:  rh  r`  r  )r4  Ú	_all_varsÚ_settings_to_returnÚvars_to_includeÚvarrt  s         rÙ   Úget_settingszRouter.get_settingsV+  sÇ   € ô
   ›:ˆ	Ø%'Ðò"
ˆð& #ò 	YˆCØ�iÑØ+4°S©>Ð# CÑ(àÐ.Ó.Ø×)Ñ)Ð-DÓDØ×-Ñ-Ñ9à+/×+DÑ+D×+QÑ+Q×+VÑ+VÓ+XÐ# CÒ(ð	Yð RV×QeÑQe×QlÑQlÓQnÖ0oÈ°×1AÑ1AÕ1CÒ0oÐÐ,Ñ-Ø"Ð"ùò 1ps   ÂB*c                 ól  — g d¢}g d¢}| j                  «       }d}d}|D �]  }||v rû||v rt        ||   «      }t        | ||«       Œ(|dk(  r||   | _        d}Œ:|dk(  rA||   }	t	        |	t
        «      rt        di |	¤Ž}	|	�t	        |	t        «      sŒrt        | ||	«       Œ€||   }	|dk(  rc| j                  |	«      }	|d   |	k7  rQ|	d	k(  rd
dlm	}
  |
| |j                  d«      «       n#| j                  |	|j                  di «      ¬«       d}n|dk(  rd}t        | ||	«       �Œt        j                  d|«       �Œ |r7| j                  | j                  «      d	k(  rd
dlm	}
  |
| | j                  «       |r| j!                  | j                  «       t        j                  d| j                  «       «       y)z-
        Update the router settings.
        )r¡  r™  r¢  r•  r—  r  r�  rÃ  r’  r‰  rŠ  r“  r”  rŒ  r­  rŽ  r�  )r�  r  r’  r•  r—  Fr¢  Tr“  Nr™  rŸ  r   rÅ  r¡  rÇ  zSetting %s is not allowedzUpdated Router settings: %sr  )rK	  r  ra  rö  rá   r3  r–   rõ  r   rÆ  rà   r  r   rš  r™  r¡  ré  )r4  r¤  Ú_allowed_settingsÚ_int_settingsÚ_existing_router_settingsÚrebuild_routing_groupsÚrelink_lar1_from_argsrJ	  Ú_casted_valuerÑ   rÆ  s              rÙ   Úupdate_settingszRouter.update_settings}+  sÝ  € ò
$
Ðò( 
ˆð ,0×+<Ñ+<Ó+>Ð!Ø!&ÐØ %ÐØó '	NˆCØÐ'Ñ'Ø˜-Ñ'Ü$'¨¨s©Ó$4�MÜ˜D # }Õ5ØÐ,Ò,Ø17¸±�DÔ.Ø-1Ñ*Ø˜NÒ*Ø" 3™K�EÜ! %¬Ô.Ü +Ñ 4¨eÑ 4˜Ø�}¬
°5¼+Õ(FÜ  c¨5Õ1à" 3™K�EàÐ0Ò0Ø $× 8Ñ 8¸Ó ?˜Ø4Ð5GÑHÈEÒQØ$¨šõ!"ñ !<Ø$(Ø$*§J¡JÐ/FÓ$Gõ!"ð
 !%× :Ñ :Ø5:Ø:@¿*¹*ÐE\Ð^`Ó:að !;ô !"ð 6:Ñ2ØÐ 7Ò7Ø04Ð-Ü˜D # uÖ-ä%×+Ñ+Ð,GÈÖMðO'	NñR ! T×%=Ñ%=¸d×>SÑ>SÓ%TÐX^Ò%^ÝXá'¨¨d×.HÑ.HÔIá!Ø×%Ñ% d×&@Ñ&@ÔAÜ×#Ñ#Ð$AÀ4×CTÑCTÓCVÕWrç   c                 ód  — |d   d   }t        |«      }|dk(  r\|› d�}| j                  j                  |d|¬«      }|€5t        j                  | |¬«       | j                  j                  |d|¬«      }|S |dk(  r]|j                  d	«      du r%|› d
�}| j                  j                  |d|¬«      }|S |› d�}| j                  j                  |d|¬«      }|S |j                  d	«      du r$|› d�}| j                  j                  ||¬«      }|S |› d�}| j                  j                  ||¬«      }|S )a´  
        Returns the appropriate client based on the given deployment, kwargs, and client_type.

        Parameters:
            deployment (dict): The deployment dictionary containing the clients.
            kwargs (dict): The keyword arguments passed to the function.
            client_type (str): The type of client to return.

        Returns:
            The appropriate client based on the given client_type and kwargs.
        rÛ   rY  r§  Ú_max_parallel_requests_clientT©rÅ  r  rþ  )r   ré   rô  rÖ  Ú_stream_async_clientÚ_async_clientÚ_stream_client)rÅ  rþ  Ú_client)r)   r¼  r  rY   Ú set_max_parallel_requests_clientrà   )r4  r  r¤  r©  r  rþ  Ú	cache_keyr³  s           rÙ   rÀ  zRouter._get_clientÓ+  sd  € ð % \Ñ2°4Ñ8ˆÜ/PÐQWÓ/XÐØÐ1Ò1Ø#˜*Ð$AÐBˆIØ—Z‘Z×)Ñ)¨iÀDÐ[kÐ)ÓlˆFØˆ~Ü%×FÑFÐ_cÐkuÕvØŸ™×-Ñ-°)ÈÐ_oÐ-Óp�ØˆMØ˜GÒ#Ø�z‰z˜(Ó# tÑ+Ø'˜jÐ(<Ð=�	ØŸ™×-Ñ-°)ÈÐ_oÐ-Óp�Ø�à'˜j¨Ð6�	ØŸ™×-Ñ-°)ÈÐ_oÐ-Óp�Ø�à�z‰z˜(Ó# tÑ+Ø'˜j¨Ð7�	ØŸ™×-Ñ-°)ÐN^Ð-Ó_�Ø�à'˜j¨Ð0�	ØŸ™×-Ñ-°)ÐN^Ð-Ó_�Ø�rç   Úinstructionsc                 ó  — |�t        j                  |¬«      S |�\ddlm} ddlm} t        t        |z  |«      }|j                  ||�d|ini ¬«      }t        j                  t        t        |«      ¬«      S t        d«      ‚)aì  
        Count input tokens for context-window pre-call checks.

        Chat Completions send `messages`; the Responses API sends `input` (a string or
        a list of Responses input items) plus an optional `instructions` system prompt.
        The Responses payload is normalized to chat messages via the shared
        LiteLLMCompletionResponsesConfig transform so the same token_counter path covers
        both API surfaces and `instructions` tokens are included in the count.
        )r_  r   )rÎ   )Ú LiteLLMCompletionResponsesConfigr]	  )r�  Úresponses_api_requestz9Either messages or input must be provided to count tokens)rÍ  Útoken_counterÚ-openai.types.responses.response_create_paramsrÎ   ÚBlitellm.responses.litellm_completion_transformation.transformationr_	  r   r  Ú)transform_responses_api_input_to_messagesrâ   r×   )r4  r_  r�  r]	  rÎ   r_	  Útyped_inputÚinput_messagess           rÙ   Ú_count_pre_call_check_tokensz#Router._count_pre_call_check_tokensû+  sŒ   € ð ÐÜ×(Ñ(°(Ô;Ð;ØÐÝXõô "&¤cÐ,>Ñ&>ÀÓ!FˆKØ$D×$nÑ$nØ!ØHTÐH` ~°|Ñ&DÐfhð %oó %ˆNô ×(Ñ(´$´t¸^Ó2LÔMÐMÜÐTÓUÐUrç   c                 óè   — 	 | j                  t        t        |«      |¬«      }|j                  d«      }t        |t        «      r|S dS # t        $ r }t	        j
                  d|«       Y d}~yd}~ww xY w)z^The deployment's declared context window, or None when it declares none or cannot be resolved.rÙ  zNlitellm.router.py::_deployment_max_input_tokens: skipping deployment. Got - %sNr\  )	rå  r   r3  r�  r   rš  rà   rá   r  )r4  ré   r  rÛ   r   r\  s         rÙ   Ú_deployment_max_input_tokensz#Router._deployment_max_input_tokens,  s|   € ð		Ø $× :Ñ :Ü¤ jÓ1Ø$)ð !;ó !ˆJð #-§.¡.Ð1CÓ"DÐÜ#-Ð.>ÄÔ#DÐÐNÈ$ÐNøô ò 	Ü!×'Ñ'Ø`Ðbcôô ûð		ús   ‚!A Á	A1ÁA,Á,A1c                 ó0   ‡ ‡— t        ˆˆ fd„|D «       «      S )zÿWhether any healthy deployment declares a context window that a token count could exceed.

        Resolves each deployment the way ``_pre_call_checks`` does, so one unmappable deployment
        cannot hide a later one that does declare a limit.
        c              3   óF   •K  — | ]  }‰j                  ‰|«      d u–— Œ y ­wrÔ   )ri	  )rŠ  r  ré   r4  s     €€rÙ   r‹  z;Router._pre_call_checks_need_token_count.<locals>.<genexpr>2,  s(   øè ø€ ò 
ØQ[ˆD×-Ñ-¨e°ZÓ@ÈÔLñ
ùs   ƒ!r/	  )r4  ré   rì  s   `` rÙ   Ú!_pre_call_checks_need_token_countz(Router._pre_call_checks_need_token_count*,  s   ù€ ô ô 
Ø_rô
ó 
ð 	
rç   c              ƒ   ó¬  K  — |€|€y|r|j                  d«      nd}	 | j                  ||«      sy t        | j                  «      t	        t
        t        t        t        f      dz  |«      t	        t        t
        z  dz  |«      t        |t        «      r|nd¬«      ƒ d{  –—† S 7 Œ# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)av  Count input tokens off the event loop, so a multi-MB prompt cannot stall the proxy.

        Returns None when no deployment limits its context window, and when counting fails. The
        caller pairs this with ``skip_inline_token_count`` so neither case puts the count back on
        the loop: a failed count leaves the deployments unfiltered, exactly as before.
        Nr]	  ©r_  r�  r]	  zRlitellm.router.py::_acount_pre_call_check_tokens: failed to count tokens. Got - %s)rà   rl	  r'   rg	  r   râ   r3  r  rá   r�  r   r  )r4  ré   rì  r_  r�  r’  Úraw_instructionsr   s           rÙ   Ú_acount_pre_call_check_tokensz$Router._acount_pre_call_check_tokens6,  sÒ   è ø€ ð Ð  ØÙHV .×"4Ñ"4°^Ô"DÐ\`Ðð	Ø×9Ñ9¸%ÐATÔUØØDœ $×"CÑ"CÓDÜœd¤4¬¬S¨¡>Ñ2°TÑ9¸8ÓDÜœ3¤™:¨Ñ,¨eÓ4Ü1;Ð<LÌcÔ1RÑ-ÐX\ô÷ ð ð ùô
 ò 	Ü!×'Ñ'ØdÐfgôô ûð		üsK   ‚CžB( °C±A0B( Â!B&Â"B( Â%CÂ&B( Â(	CÂ1CÃCÃCÃCÚinput_token_countÚskip_inline_token_countc           	      óN	  — t        j                  d|«       t        |«      }t        «       }	|}
d}d}d}t	        |«      }|r|j                  d«      nd}t        |t        «      r|nd}|duxs |du}t        «       }|j                  d«      }|› d|› �}| j                  j                  |d|¬	«      xs i }t        |«      D �]Ø  \  }}|j                  d
i «      }|j                  di «      }d}	 |j                  dd«      }|€|j                  dd«      }|xs |j                  dd«      }| j                  ||¬«      }t        |t        «      r|j                  d«      nd}t        |t        «      rF|rD|
€|r|c S 	 | j!                  |||¬«      }
|
|kD  r"|	j'                  |«       d}|d|› d|› d|
› �z  }Œö|j                  dd«      }| j                  j                  |d|¬	«      xs d} t        |t        «      r…| j*                  dk7  rv|j                  |d«      ||<   t-        | ||   «      }!t        |t        «      rB|j                  dd«      �0t        |d   t        «      r|d   |!k  r|	j'                  |«       d}�Œ¿|�M|j                  d«      �<|j                  d«      }"|"�)t/        t1        d%i |¤Ž|"¬«      s|	j'                  |«       �Œ|€�Œt2        j4                  du s�Œ&|xs |}#	 t3        j6                  |#t1        d%i |¤Ž¬«      \  }#}$}%}%t3        j8                  |#|$¬«      }&|&€�Œmt2        j:                  j=                  |¬«      }'d g}(|'j?                  «       D ]6  \  })}*|)|&vsŒ|)|(v sŒt        j                  d!|)«       |	j'                  |«       Œ8 �ŒÛ tA        |	«      tA        |«      k(  r0	 |du rtC        |¬"«      ‚|du rt3        jD                  d#|› �|d¬$«      ‚tA        |	«      dkD  r"t        |«      D �+�,cg c]  \  }+},|+|	vsŒ|,‘Œ }}+},|S # t"        $ r$}t        j$                  d|«       |cY d}~c S d}~ww xY w# t"        $ r!}t        j(                  d|«       Y d}~�Œ´d}~ww xY w# t"        $ r"}t        j                  d|#|«       Y d}~�ŒØd}~ww xY wc c},}+w )&a½  
        Filter out model in model group, if:

        - model context window < message length. For azure openai models, requires 'base_model' is set. - https://docs.litellm.ai/docs/proxy/cost_tracking#spend-tracking-for-azure-openai-models
        - filter models above rpm limits
        - if region given, filter out models not in that region / unknown region
        - [TODO] function call and model doesn't support function calling
        z4Starting Pre-call checks for deployments in model=%sFro  r]	  NrÞ  z:rpm:TrV	  r»  rÛ   rl  ré   rÙ  r\  rn	  zllitellm.router.py::_pre_call_checks: failed to count tokens. Returning initial list of deployments. Got - %szModel=z, Max Input Tokens=z, Got=zAn error occurs - %srY  r   rž  rÜ  Úallowed_model_region)r»  rt	  rn  z[litellm.router.py::_pre_call_checks: skipping supported-params check for model=%s. Got - %sr¶  )Úpassed_paramsÚresponse_formatz3INVALID MODEL INDEX @ REQUEST KWARG FILTERING, k=%sr‡  z|litellm._pre_call_checks: Context Window exceeded for given call. No models have context window large enough for this call.
r¶  r  )#r   rš  râ   rl  r)   rà   rá   r  r¸   ræ  r¼  r  ru  rå  r3  r  rg	  r�  r  rë  r¹  r™  Úmaxr¹   r‘   rÍ  r	  rµ   r—  r|  Úget_non_default_paramsr;  r‰  rœ   r{  )-r4  ré   rì  r_  r�  r’  rq	  rr	  Ú_returned_deploymentsÚinvalid_model_indicesrS  Ú_context_window_errorÚ_potential_error_strÚ_rate_limit_errorrþ  ro	  r]	  Úhas_countable_inputrõ  rà  rø  Úmodel_group_cachers  r  r_  r  Ú_deployment_modelrl  rÛ   r\  r   r  Úcurrent_request_cache_localÚcurrent_requestrt	  Ú_dep_model_for_paramsr&  r  rŠ  rT  Úspecial_paramsr`  ra  Úirl  s-                                                rÙ   Ú_pre_call_checkszRouter._pre_call_checksU,  sx  € ô& 	×#Ñ#Ð$ZÐ\aÔbô !%Ð%8Ó 9Ðä'*£uÐð $5ˆà %ÐØ!ÐØ!ÐÜ"CÀNÓ"SÐáHV .×"4Ñ"4°^Ô"DÐ\`ÐÜ2<Ð=MÌsÔ2SÑ.ÐY]ˆØ%-°TÐ%9Ò%N¸UÈ$Ð=NÐô %Ó&ˆØ "§¡¨GÓ 4ˆØ!˜7 %¨Ð'7Ð8ˆà�J‰J× Ñ  W¸ÐP`Ð ÓaÒgÐegð 	ô  )Ð)>Ó?ó k	;‰OˆC�à(Ÿn™nÐ-=¸rÓBˆOØ$Ÿ.™.¨°rÓ:ˆKð !%ÐðKØ(Ÿ_™_¨\¸4Ó@�
ØÐ%Ø!0×!4Ñ!4°\À4Ó!H�JØ$.Ò$T°/×2EÑ2EÀgÈtÓ2TÐ!Ø!×7Ñ7À:ÐchÐ7Ói�
äISÐT^Ô`dÔIe :§>¡>Ð2DÔ#EÐkoÐ ÜÐ.´Ô4Ñ9LØ#Ð+Ù2Ø#8Ò8ð	9Ø+/×+LÑ+LØ)1¸È\ð ,Mó ,˜Lð $Ð&6Ò6Ø-×1Ñ1°#Ô6Ø04Ð-Ø,Ø$Ð%6Ð$7Ð7JÐK[ÐJ\Ð\bÐcoÐbpÐqñÐ,ð !ð #—‘ t¨RÓ0ˆHð —
‘
×$Ñ$¨¸dÐUeÐ$ÓfÒkÐjkð (ô Ð+¬TÔ2°t×7LÑ7LÐPhÒ7hØ.?×.CÑ.CÀHÈaÓ.PÐ! (Ñ+ä"%Ð&AÐCTÐU]ÑC^Ó"_�ä˜o¬tÔ4¸×9LÑ9LÈUÐTXÓ9YÐ9eÜ! /°%Ñ"8¼#Ô>À?ÐSXÑCYÐ]lÒClØ-×1Ñ1°#Ô6Ø,0Ð)Ù ð Ð)¨n×.@Ñ.@ÐAWÓ.XÐ.dØ'5×'9Ñ'9Ð:PÓ'QÐ$à'Ð3Ü,Ü'5Ñ'H¸Ñ'HØ-Aõð .×1Ñ1°#Ô6Ù ð Ò)¬g×.AÑ.AÀUÓ.Jà->Ò-GÀ%Ð%ðô  ×0Ñ0Ø3Ü'5Ñ'H¸Ñ'HôñØ-Ø+ØØô +2×*MÑ*MØ/Ø(;ô+Ð'ð
 +Ð2Ùô *1¯©×)MÑ)MÐ\jÐ)MÓ)kÐ&Ø&7Ð%8�Nà 2× 8Ñ 8Ó :ò ;™˜˜1ØÐ$;Ò;ÀÀ^Ò@Sä1×7Ñ7Ð8mÐopÔqØ1×5Ñ5°cÕ:ò	;ðOk	;ôZ Ð$Ó%¬Ð-BÓ)CÒCðð ! DÑ(Ü/Øôð ð '¨$Ñ.Ü×8Ñ8ð \ð  ]qð  \rð  sØØ!#ôð ô
 Ð$Ó%¨Ò)ä3<Ð=RÓ3S×$v©4¨1¨aÐWXÐ`uÒWu¢QÐ$vÐ!Ñ$và$Ð$øôY  )ò 9Ü1×7Ñ7ð !OØ !ôð $9×8ûð9ûô ò KÜ%×/Ñ/Ð0FÈ×JÒJûðKûô^ !ò Ü)×/Ñ/ØuØ-Øôõ
 ûðüó\ %wsm   Ã/B	QÅ<PÆ&QË.%Q3Ð R!ÐR!Ð	QÐP>Ð6QÐ7QÐ>QÑQÑ	Q0ÑQ+Ñ+Q0Ñ3	RÑ<RÒRc                 ó.   — t        | j                  |«      S )zœ
        Get the model from the alias.

        Returns:
        - str, the litellm model name
        - None, if model is not in model group alias
        )r_   rŒ  rƒ  s     rÙ   r�  zRouter._get_model_from_alias-  s   € ô )¨×)?Ñ)?ÀÓGÐGrç   c                 óX   — | j                   D �cg c]  }|d   d   |k(  sŒ|‘Œ c}S c c}w )z6
        Get the deployment by litellm model.
        r»  ré   )rq  )r4  ré   r   s      rÙ   Ú _get_deployment_by_litellm_modelz'Router._get_deployment_by_litellm_model-  s.   € ð  Ÿ?™?ÖT�a¨aÐ0@Ñ.AÀ'Ñ.JÈeÓ.S’ÒTÐTùÒTs   �' 'Úrequest_team_idÚinclude_team_modelsc           	      ó0  — || j                   v ry|�| j                  ||¬«      }|r¹||fS |r³| j                  j                  «       D ����cg c]#  \  \  }}}||k(  r|D ]  }| j                  |   ‘Œ Œ% }}}}}|D �	�
ch c]*  }	|	j                  d«      xs i j                  d«      }
|
�|
’Œ, }}	}
t        |«      dkD  rt        j                  d|› d�|d¬	«      ‚|r||fS | j                  j                  |¬
«      }|r||fS |�3|| j                  v r%| j                  |   j                  |¬
«      }|r||fS | j                  �F| j                  j                  «       }| j                  d   j                  «       |d<   ||d   d<   ||fS yc c}}}}w c c}
}	w )z´
        When ``model`` is not in ``self.model_names``, try team routes, pattern routes,
        team pattern routers, then default deployment. Returns None if none apply.
        Nr{  rÛ   ry  r¼   zModel name 'z^' matches deployments from multiple teams. Specify the deployment ID directly to disambiguate.ro  r¶  r‡  r»  ré   )rh  r|  rã  r;  rq  rà   r‰  rÍ  r–  rÚ  r5	  rÛ  rØ  r™  )r4  ré   rŠ	  r‹	  Úteam_deploymentsr  r  rÒ  Úindexr  ry  Úteam_idsÚpattern_deploymentsÚupdated_deployments                 rÙ   Ú5_try_early_resolve_deployments_for_model_not_in_namesz<Router._try_early_resolve_deployments_for_model_not_in_names-  s!  € ð �D×$Ñ$Ñ$Øð Ð&Ø#×8Ñ8ÀEÐSbÐ8ÓcÐÙØÐ.Ð.Ð.Ù ð 8<×7\Ñ7\×7bÑ7bÓ7d÷ ñ  á3Ñ*�QÐ)¨GØ$¨Ò-Ø$ò	 ð ð —‘ Ó&ð Ø&ð Ðó  ð #3÷àØ!+§¡°Ó!=Ò!CÀ× HÑ HÈÓ S�GØÐ&ò ðˆHñ ô �8‹}˜qÒ Ü×-Ñ-à& u gð .Nð Nð  Ø!#ôð ñ  ØÐ.Ð.Ð.à"×1Ñ1×LÑLØð Mó 
Ðñ ØÐ-Ð-Ð-àÐ&¨?¸d×>WÑ>WÑ+WØ"&×";Ñ";¸OÑ"L×"gÑ"gØð #hó #Ðñ #ØÐ1Ð1Ð1à×"Ñ"Ð.à(,×(?Ñ(?×(DÑ(DÓ(FÐØ37×3JÑ3JÐK[Ñ3\×3aÑ3aÓ3cÐÐ/Ñ0Ø<AÐÐ/Ñ0°Ñ9ØÐ,Ð,Ð,àùõ[ ùós   Á(F

Á>/Fc                 ó¦   — | j                  d«      }t        |t        «      sy|j                  d«      }t        |t        «      xr t	        |«      d uS )Nr»  Fré   )rà   rá   r	   r  rU   )r  r»  Údeployment_models      rÙ   Ú_is_strategy_marker_deploymentz%Router._is_strategy_marker_deployment_-  sO   € à *§¡Ð/?Ó @ˆÜ˜.¬'Ô2ØØ"0×"4Ñ"4°WÓ"=ÐÜÐ*¬CÓ0ÒqÔ5SÐTdÓ5eÐmqÐ5qÐqrç   rª  c                 óÎ  ‡ — d}|�N|j                  d«      xs i }|j                  d«      xs i }|j                  d«      xs |j                  d«      }|du r|‰ j                  |¬«      fS ‰ j                  |«      rM‰ j                  |¬«      }	|	�*|	j                  j
                  }
|
|	j                  d¬«      fS t        d	|› d
�«      ‚‰ j                  |¬«      }|�|}‰ j                  ||¬«      }|€!‰ j                  ||t        |«      ¬«      }|�|S |�|n‰ j                  ||¬«      }t        |«      }‰ j                  ||||¬«      }|dkD  xr t        |«      dk(  }t        |«      dk(  rJ|dk(  rE‰ j                  |¬«      }‰ j                  ||||¬«      }t        |«      dkD  rt        |«      dk(  rd}t        j                   t"        j$                  «      rt        j&                  d|«       t        |«      dk(  r©‰ j)                  «       rU|sS‰ j+                  «       }|rAt        j,                  d||«       |}‰ j                  ||¬«      }‰ j                  ||||¬«      }t        |«      dk(  r6t/        j0                  d|› dt2        j4                  j6                  › �|d¬«      ‚t.        j8                  r%|t.        j8                  v rt.        j8                  |   }t;        ˆ fd„|D «       «      }t=        |«      s||fS t?        ||d¬«      D ��cg c]
  \  }}|rŒ	|‘Œ }}}|s6t/        j0                  d|› dt2        j@                  j6                  › �|d¬«      ‚||fS c c}}w )aF  
        Common checks for 'get_available_deployment' across sync + async call.

        If 'healthy_deployments' returned is None, this means the user chose a specific deployment

        Returns
        - str, the litellm model name
        - List, if multiple models chosen
        - Dict, if specific model chosen
        NrÄ  ru  rv  Tr‡  r  rÉ  zBLiteLLM Router: Trying to call specific deployment, but Model ID :z does not exist in Model ID map)ré   ry  )ré   rŠ	  r‹	  r{  )ré   rì  r’  rŠ	  r   zinitial list of deployments: %szDModel '%s' not found. Attempting to use default fallback model '%s'.zYou passed in model=z. ro  r¶  c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrÔ   )r•	  )rŠ  rl  r4  s     €rÙ   r‹  z=Router._common_checks_available_deployment.<locals>.<genexpr>ä-  s   øè ø€ Ò#hÈq D×$GÑ$GÈ×$JÑ#hùs   ƒ)Ústrict)!rà   r‰	  r‚  rä  r»  ré   r  r×   r�  r€  r’	  r\   r|  r‰  Ú*_filter_deployments_by_model_access_groupsr   rz  rÐ  r‡  rš  r  rÐ  r  rÍ  r–  r˜   Úno_healthy_deploymentsrÑ   Úmodel_alias_maprã   r‡  ÚzipÚ only_strategy_marker_deployments)r4  ré   r_  r�  rª  r’  rŠ	  rÄ  ru  r  r”	  Ú_model_from_aliasÚ_routing_group_deploymentsÚearlyrì  Ú"_pre_model_access_group_filter_lenÚ'_access_group_filter_emptied_candidatesÚ_litellm_model_deploymentsÚfallback_modelÚmarker_flagsrl  Ú	is_markerÚ
selectables   `                      rÙ   r"  z*Router._common_checks_available_deploymentg-  s  ø€ ð& '+ˆØÐ%Ø,×0Ñ0°Ó<ÒBÀˆHØ&4×&8Ñ&8Ð9KÓ&LÒ&RÐPRÐØ&Ÿl™lÐ+AÓBÒrÐFV×FZÑFZÐ[qÓFrˆOà $Ñ&Ø˜$×?Ñ?ÀeÐ?ÓLÐLÐLØ×Ñ˜uÔ%Ø $× 3Ñ 3¸UÐ 3Ó CˆJØÐ%Ø*4×*CÑ*C×*IÑ*IÐ Ø'¨×)>Ñ)>ÈDÐ)>Ó)QÐQÐQÜØTÐUZÐT[Ð[zÐ{óð ð $(×#=Ñ#=ÀEÐ#=Ó#JÐØÐ(Ø%ˆEà,0×,OÑ,OÐV[ÐetÐ,OÓ,uÐ"Ø%Ð-Ø×UÑUØØ /Ü$;¸NÓ$Kð Vó ˆEð
 Ð Ø�ð *Ð5ñ 'à×*Ñ*°eÀ_Ð*ÓUð 	ô
 58Ð8KÓ4LÐ*Ø"×MÑMØØ 3Ø)Ø+ð	 Nó 
Ðð /°Ñ2ÒT´sÐ;NÓ7OÐSTÑ7Tð 	0ô Ð"Ó# qÒ(ð 2°QÒ6Ø48×4YÑ4YÐ`eÐ4YÓ4fÐ*Ø&*×&UÑ&UØØ(BØ#1Ø$3ð	 'Vó 'Ð#ô Ð1Ó2°QÒ6¼3Ð?RÓ;SÐWXÒ;XØ>BÐ;ä ×-Ñ-¬g¯m©mÔ<Ü!×'Ñ'Ð(IÐK^Ô_äÐ"Ó# qÒ(ð
 ×*Ñ*Ô,Ñ5\Ø(,×(HÑ(HÓ(J�Ù!Ü)×.Ñ.Ø^Ð`eÐguôð +�EØ*.×*CÑ*CÈuÐ^mÐ*CÓ*nÐ'Ø*.×*YÑ*YØ#Ø,?Ø'5Ø(7ð	 +Zó +Ð'ô Ð&Ó'¨1Ò,Ü×-Ñ-Ø2°5°'¸¼L×<_Ñ<_×<eÑ<eÐ;fÐgØØ!#ôð ô ×"Ò" u´×0GÑ0GÑ'GÜ×+Ñ+ØñˆEô $Ó#hÐTgÔ#hÓhˆÜ�<Ô ØÐ-Ð-Ð-ä"%Ð&9¸<ÐPTÔ"U÷
Ù�!�YÒ]fŠAð
ˆ
ñ 
ñ Ü×)Ñ)Ø.¨u¨g°R¼×8eÑ8e×8kÑ8kÐ7lÐmØØôð ð
 �jÐ Ð ùó
s   Ì
M!ÌM!c                 óz  — |r|€|S |j                  d«      xs i }|j                  d«      xs i }|j                  d«      xs |j                  d«      }|€|S t        t        |dg «      xs g «      }t        t        |dg «      xs g «      }	||	z  }
|
s|S ||
v sd|
v sd|
v r|S | j                  ||¬«      }t	        |«      d	k(  r|S t        |j                  «       «      |
z  }|s|S g }|D ]M  }|j                  d
«      xs i }t        |j                  dg «      xs g «      }||z  sŒ=|j                  |«       ŒO |S )a;  
        Restrict candidate deployments to caller-authorized model access groups.

        This is only applied when:
        - request metadata includes `user_api_key_auth`, and
        - caller permissions for this model are access-group-only
          (no explicit model, wildcard, or all-proxy grants).
        rÄ  ru  Úuser_api_key_authrn  Úteam_modelsrÀ  zall-proxy-modelsr{  r   rÛ   r  )rà   rl  r  rB	  r‰  rÌ  rø  )r4  ré   rì  r’  rŠ	  rÄ  ru  r©	  Úobject_modelsÚobject_team_modelsÚallowed_modelsÚaccess_groups_for_modelÚallowed_access_groupsÚfiltered_deploymentsr  rî  Údeployment_access_groupss                    rÙ   r™	  z1Router._filter_deployments_by_model_access_groupsò-  sŽ  € ñ # nÐ&<Ø&Ð&à(×,Ñ,¨ZÓ8Ò>¸BˆØ"0×"4Ñ"4Ð5GÓ"HÒ"NÈBÐØ#+§<¡<Ð0CÓ#DÒ#qÐHX×H\ÑH\Ð]pÓHqÐØÐ$Ø&Ð&ä"¤7Ð+<¸hÈÓ#KÒ#QÈrÓRˆÜ$'¬Ð0AÀ=ÐRTÓ(UÒ([ÐY[Ó$\ÐØ -Ð0BÑ BˆÙØ&Ð&ð �NÑ" c¨^Ñ&;Ð?QÐUcÑ?cØ&Ð&à)-×)EÑ)EÐQVÐ`oÐ)EÓ)pÐÜÐ&Ó'¨1Ò,Ø&Ð&ä'*Ð+B×+GÑ+GÓ+IÓ'JÈ^Ñ'[ÐÙ$ð 'Ð&à&(ÐØ-ò 	8ˆJØ$.§N¡N°<Ó$@Ò$FÀBÐ!Ü'*Ð+@×+DÑ+DÀ_ÐVXÓ+YÒ+_Ð]_Ó'`Ð$Ø'Ð*?Ó?Ø$×+Ñ+¨JÕ7ð		8ð $Ð#rç   c              ƒ   ó´  K  — | j                  |||||¬«      \  }}t        ||¬«      }t        j                  t        j
                  «      rt        j                  d|«       t        ||¬«      }t        j                  t        j
                  «      rt        j                  d|«       t        |t        «      rD|j                  d«      xs i j                  d«      du rt        j                  d|› d	�|d
¬«      ‚|S | j                  ||¬«      ƒ d{  –—† }t        | |¬«      ƒ d{  –—† }t        j                  t        j
                  «      rt        j                  d|«       |}	| j                  ||¬«      }|s/| j                   r#| j"                  �t        j$                  d«       |	}| j'                  |«      }| j)                  |||�t+        t,        t.           |«      nd||¬«      ƒ d{  –—† }| j0                  rO|€|�Kt+        t,        t           |«      }
| j3                  ||
|||| j5                  ||
|||¬«      ƒ d{  –—† d¬«      }t7        | |||| j9                  |«      ¬«      ƒ d{  –—† }| j;                  ||¬«      }|xs i j=                  dd«      }t        j>                  jA                  t+        t,        t           |«      |¬«      }|xs i j=                  dd«      }t        j>                  jC                  t+        t,        t           |«      |¬«      }tE        |«      dk(  rtG        | ||¬«      ƒ d{  –—† }|‚|S 7 �Œ67 �Œ$7 �Œ`7 �Œ7 Œã7 Œ­w)z²
        Get the healthy deployments for a model.

        Returns:
        - List[Dict], if multiple models chosen
        *OR*
        - Dict, if specific model chosen
        rÙ  )rì  r’  z)healthy_deployments after team filter: %sz/healthy_deployments after web search filter: %srÛ   rô  TúModel 'ú1' is currently paused and cannot accept requests.ro  r¶  ©rì  rþ  Nrc  úcooldown deployments: %s©rì  Úcooldown_deploymentsúOAll deployments in cooldown via health-check routing, bypassing cooldown filterr3  ©ré   rì  r_  r�  r’  )ré   rì  r_  r�  r’  rq	  rr	  )r§  ré   r’  rì  r‰  rw  ©Útarget_orderrd  ©Úexcluded_deployment_idsr   ©r   ré   rþ  )$r"  r]   r   rz  rÐ  r‡  rš  r^   rá   r3  rà   rÍ  ÚServiceUnavailableErrorÚ0_async_filter_health_check_unhealthy_deploymentsrd   Ú_filter_cooldown_deploymentsr©  r–  rÓ  r#  r6  r   râ   r�   r�  r†	  rp	  rI   rg  Ú$_filter_by_routing_plugin_candidatesr»  r|  Ú_get_order_filtered_deploymentsÚ"_get_excluded_filtered_deploymentsr‰  ro   )r4  ré   r’  r_  r�  rª  rþ  rì  r¸	  Ú_pre_cooldown_deploymentsÚdeployments_to_checkrw  rd  r¹  s                 rÙ   rþ  z$Router.async_get_healthy_deployments(.  s´  è ø€ ð$ &*×%MÑ%MØØØØ 3Ø)ð &Nó &
Ñ"ˆÐ"ô 7Ø 3Ø)ô
Ðô
 !×-Ñ-¬g¯m©mÔ<Ü!×'Ñ'Ð(SÐUhÔiä;Ø 3Ø)ô
Ðô
 !×-Ñ-¬g¯m©mÔ<Ü!×'Ñ'Ð(YÐ[nÔoäÐ)¬4Ô0Ø#×'Ñ'¨Ó5Ò;¸×@Ñ@ÀÓKÈtÑSÜ×5Ñ5Ø% e WÐ,]Ð^ØØ!#ôð ð
 'Ð&ð %)×$YÑ$YØ 3Ø-ð %Zó %
÷ 
Ðô
 -LØ$(Ð;Kô-
÷ '
Ðô !×-Ñ-¬g¯m©mÔ<Ü!×'Ñ'Ð(BÐDXÔYØ+>Ð!Ø"×?Ñ?Ø 3Ø!5ð @ó 
Ðñ # t×'GÒ'GÈD×LeÑLeÐLqÜ!×)Ñ)Øaôð #<Ðà"×>Ñ>Ð?RÓSÐà$(×$JÑ$JØØ 3Ø@HÐ@T”dœ4Ô 0Ñ1°8Ô<ÐZ^Ø)Ø-ð %Kó %
÷ 
Ðð ×&Ò&¨HÐ,@ÀEÐDUÜ*.¬t´D©zÐ;NÓ*OÐ Ø"&×"7Ñ"7ØØ$8Ø!ØØ-Ø(,×(JÑ(JØØ(<Ø%ØØ#1ð )Kó )÷ #ð )-ð #8ó #Ðô  %<Ø $ØØ)Ø 3Ø#'×#OÑ#OÐP^Ó#_ô%
÷ 
Ðð #×GÑGØ 3Ø)ð Hó 
Ðð !/Ò 4°"×9Ñ9¸/È4ÓPˆÜ%Ÿm™m×KÑKÜ””d‘Ð0Ó1Àð Ló 
Ðð ,:Ò+?¸R×*DÑ*DÐE_ÐaeÓ*fÐ Ü%Ÿm™m×NÑNÜ””d‘Ð0Ó1Ø$<ð Oó 
Ðô
 Ð"Ó# qÒ(Ü%HØ(,ØØ!1ô&÷  ˆIð
 ˆOà"Ð"ðs
ùð
'
ùð*
ùð #ùð
øð< úso   ‚DMÄMÄMÄ'MÄ(CMÇ.MÇ/AMÉMÉ,MÉ0MÉ1CMÌ?MÍ 	MÍMÍMÍMÍMÍMÚcarrierc                 ó–   — | j                  |«      }t        |t        «      sy |j                  dd «       |s| j                  |d «       y y )NÚeffort)rà   rá   r3  r»  )r’  rÈ	  Únesteds      rÙ   Ú_pop_effort_from_nested_carrierz&Router._pop_effort_from_nested_carrier¹.  sE   € à&×*Ñ*¨7Ó3ˆÜ˜&¤$Ô'ØØ�
‰
�8˜TÔ"ÙØ×Ñ˜w¨Õ-ð rç   Útier_litellm_paramsc                 óŠ   — d|vry| j                  dd«       t        j                  | d«       t        j                  | d«       y)aã  Tier litellm_params are deliberate operator overrides, but provider
        translations let a caller-supplied carrier of the same setting
        (``thinking``, ``output_config.effort``, ``reasoning.effort``) outrank
        the ``reasoning_effort`` alias, so a pinned effort only reaches the wire
        if the client's other encodings are removed before the merge. Non-effort
        fields a carrier also holds (``output_config.format``,
        ``reasoning.summary``) are kept.Úreasoning_effortNÚthinkingÚoutput_configÚ	reasoning)r»  rg  rÌ	  )r’  rÍ	  s     rÙ   Ú2_drop_client_effort_carriers_a_tier_pin_supersedesz9Router._drop_client_effort_carriers_a_tier_pin_supersedesÂ.  s@   € ð Ð%8Ñ8ØØ×Ñ˜: tÔ,Ü×.Ñ.¨~¸ÔOÜ×.Ñ.¨~¸{ÕKrç   c           
   ƒ   óÄ  K  — | j                   dk7  rR| j                   dk7  rC| j                   dk7  r4| j                   dk7  r%| j                   dk7  r| j                  |||||¬«      S 	 t        |«      }| j                  |||||¬«      ƒ d{  –—† }|�d|j                  }|j
                  }|j                  r@| j                  ||j                  |«      }| j                  ||«       |j                  |«       | j                  ||«      \  }	}
| j                  ||||||¬	«      ƒ d{  –—† }t        |t        «      r|S |j                  d
«      rt        |«      dk(  r|d   S t!        j                   «       }|	dk(  rt#        | ||¬«      S | j%                  |	|
|||||¬«      ƒ d{  –—† }|€t'        | ||¬«      ƒ d{  –—† }|‚t)        j*                  d|| j-                  |«      |«       t!        j                   «       }||z
  }t/        j0                  | j2                  j5                  t6        j8                  |d|||¬«      «       |S 7 �Œº7 �Œ#7 Œ¨7 Œ’# t:        $ r‡}t=        j>                  «       }|�j|j                  dd«      }|�VtA        jB                  |jD                  ||f¬«      jG                  «        t/        j0                  |jI                  ||«      «       |‚d}~ww xY w­w)z�
        Async implementation of 'get_available_deployments'.

        Allows all cache calls to be made async => 10x perf impact (8rps -> 100 rps).
        rž  rp  r�  rœ  rš  rÙ  rµ  N©ré   r’  r_  r�  rª  rþ  Ú"_encrypted_content_affinity_pinnedr¼   r   r¦  ©rC  rU  ré   rì  r_  r�  r’  r¿	  úMget_available_deployment for model: %s, Selected deployment: %s for model: %sú2<routing_strategy>.async_get_available_deployments©rú  rû  rµ  rþ  rü  rý  rØ  r.  )%r™  rº  r)   Úasync_pre_routing_hookré   r_  r»  r3	  rÓ	  rÔ  rœ  rþ  rá   r3  rà   r‰  r  rG   r¥  ro   r   r  r¡  rä  r  rÌ  r	  r£   r
  r�  r  r  r  r¼  r1  r¾  r0  )r4  ré   r’  r_  r�  rª  rþ  Úpre_routing_hook_responseÚaccepted_tier_paramsrC  Ústrategy_selectorrì  rü  r  r¹  rý  r  r   r-  r'  s                       rÙ   r¥  z%Router.async_get_available_deploymentÔ.  sL  è ø€ ð ×!Ñ!Ð%=Ò=Ø×%Ñ%Ð)9Ò9Ø×%Ñ%Ð)=Ò=Ø×%Ñ%Ð)@Ò@Ø×%Ñ%¨Ò5à×0Ñ0ØØ!ØØ$7Ø-ð 1ó ð ðg	Ü&GÈÓ&WÐð 6:×5PÑ5PØØ-Ø!ØØ$7ð 6Qó 6÷ 0Ð%ð )Ð4Ø1×7Ñ7�Ø4×=Ñ=�Ø,×;Ò;Ø26×2VÑ2VØÐ8×GÑGÈó3Ð(ð ×KÑKÈNÐ\pÔqØ"×)Ñ)Ð*>Ô?ð +/×*CÑ*CÀEÈ>Ó*ZÑ'ˆHÐ'à/3×/QÑ/QØØ-Ø!ØØ$7Ø!1ð 0Ró 0÷ *Ðô Ð-¬tÔ4Ø*Ð*ð ×!Ñ!Ð"FÔGÌCÐPcÓLdÐhiÒLiØ*¨1Ñ-Ð-ä $§	¡	£ˆJØÐ+Ò+Ü%Ø(,Ø(;Øôð ð
 '+×&CÑ&CØ!Ø*ØØ$7Ø!ØØ-ð 'Dó '÷ !ˆJð Ð!Ü)LØ,0ØØ%5ô*÷ $�	ð
  �Ü!×&Ñ&Ø_ØØ×%Ñ% jÓ1Øô	ô #Ÿi™i›kˆHØ'¨*Ñ4ˆIÜ×ÑØ×'Ñ'×BÑBÜ(×/Ñ/Ø&ØRØ%5Ø)Ø%ð Có ô	ð Ððc0ùð.*ùð,!øð$ùô6 ò 	Ü)2×)=Ñ)=Ó)?ÐàÐ)Ø%3×%7Ñ%7Ð8MÈtÓ%T�àÐ*ä×$Ñ$Ø*×:Ñ:ØÐ!4Ð5ô÷ ‘e”gä×'Ñ'¨×(IÑ(IÈ!ÐM`Ó(aÔbØˆGûð	üs™   ‚A"K Á%$I Â	IÂ
BI Ä#IÄ$I Ä9K Ä:#I ÅK Å&I ÆK ÆI Æ I	Æ!I Æ8IÆ9B	I ÉK ÉI ÉI É	I ÉI É	KÉBKËKËK c           
   ƒ   óp  K  — 	 t        |«      }| j                  |||||¬«      ƒ d{  –—† }|�d|j                  }|j                  }|j                  r@| j                  ||j                  |«      }| j                  ||«       |j                  |«       | j                  ||||||¬«      ƒ d{  –—† }	t        |	t        «      r¢|	j                  d«      xs i j                  d«      du rt        j                  d|› d�|d	¬
«      ‚|	j                  di «      }
|
j                  d«      r|	S t        j                  d|	j                  di «      j                  d«      › d�|d	¬
«      ‚| j                  |	¬«      }t!        |«      dk(  rt        j                  d|› d�|d	¬
«      ‚t#        j$                  «       }| j'                  ||«      \  }}|dk(  rt)        | ||¬«      S | j+                  |||||||¬«      ƒ d{  –—† }|€t-        | ||¬«      ƒ d{  –—† }|‚t/        j0                  d|| j3                  |«      «       t#        j$                  «       }||z
  }t5        j6                  | j8                  j;                  t<        j>                  |d|||¬«      «       |S 7 �Œq7 �Œï7 Œ§7 Œ‘# t@        $ r‡}tC        jD                  «       }|�j|j                  dd«      }|�VtG        jH                  |jJ                  ||f¬«      jM                  «        t5        j6                  |jO                  ||«      «       |‚d}~ww xY w­w)z—
        Async version of get_available_deployment_for_pass_through

        Only returns deployments configured with use_in_pass_through=True
        rµ  NrÕ	  rÛ   rô  Tr³	  r´	  ro  r¶  r»  r  úDeployment rY  úC does not support pass-through endpoint (use_in_pass_through=False)©rì  r   úModel z‚ has no deployments configured with use_in_pass_through=True. Please add use_in_pass_through: true to the deployment configurationrp  r¦  r×	  r¿	  zRasync_get_available_deployment_for_pass_through model: %s, selected deployment: %srÙ	  rÚ	  rØ  r.  )(r)   rÛ	  ré   r_  r»  r3	  rÓ	  rÔ  rþ  rá   r3  rà   rÍ  rÀ	  r–  Ú _filter_pass_through_deploymentsr‰  r  Úperf_counterrœ  rG   r¥  ro   r   r  r¡  rä  r  rÌ  r	  r£   r
  r�  r  r  r  r¼  r1  r¾  r0  )r4  ré   r’  r_  r�  rª  rþ  rÜ	  rÝ	  rì  r»  Úpass_through_deploymentsrü  rC  rÞ	  r  r¹  rý  r  r   r-  r'  s                         rÙ   Ú/async_get_available_deployment_for_pass_throughz6Router.async_get_available_deployment_for_pass_throughX/  s¾  è ø€ ðt	Ü&GÈÓ&WÐð 6:×5PÑ5PØØ-Ø!ØØ$7ð 6Qó 6÷ 0Ð%ð )Ð4Ø1×7Ñ7�Ø4×=Ñ=�Ø,×;Ò;Ø26×2VÑ2VØÐ8×GÑGÈó3Ð(ð ×KÑKÈNÐ\pÔqØ"×)Ñ)Ð*>Ô?ð 04×/QÑ/QØØ-Ø!ØØ$7Ø!1ð 0Ró 0÷ *Ðô Ð-¬tÔ4Ø'×+Ñ+¨LÓ9Ò?¸R×DÑDÀYÓOÐSWÑWÜ!×9Ñ9Ø")¨%¨Ð0aÐ bØ#Ø%'ôð ð
 )<×(?Ñ(?Ð@PÐRTÓ(U�Ø!×%Ñ%Ð&;Ô<Ø.Ð.ä!×1Ñ1Ø"-Ð.A×.EÑ.EÀlÐTVÓ.W×.[Ñ.[Ð\`Ó.aÐ-bð  cfð  !gØ#Ø%'ôð ð (,×'LÑ'LÐatÐ'LÓ'uÐ$äÐ+Ó,°Ò1Ü×-Ñ-Ø$ U Gð  ,nð  oØØ!#ôð ô !%× 1Ñ 1Ó 3ˆJØ*.×*CÑ*CÀEÈ>Ó*ZÑ'ˆHÐ'ØÐ+Ò+Ü%Ø(,Ø(@Øôð ð
 '+×&CÑ&CØ!Ø*ØØ$<Ø!ØØ-ð 'Dó '÷ !ˆJð Ð!Ü)LØ,0ØØ%5ô*÷ $�	ð
  �ä!×&Ñ&ØdØØ×%Ñ% jÓ1ôô #×/Ñ/Ó1ˆHØ'¨*Ñ4ˆIÜ×ÑØ×'Ñ'×BÑBÜ(×/Ñ/Ø&ØRØ%5Ø)Ø%ð Có ô	ð ÐðK0ùð$*ùð\!øð$ùô6 ò 
	Ü)2×)=Ñ)=Ó)?ÐØÐ)Ø%3×%7Ñ%7Ð8MÈtÓ%T�ØÐ*Ü×$Ñ$Ø*×:Ñ:ØÐ!4Ð5ô÷ ‘e”gÜ×'Ñ'¨×(IÑ(IÈ!ÐM`Ó(aÔbØˆGûð
	üs‹   ‚L6„$J# ¨J©BJ# Â-JÂ.A:J# Ä(L6Ä)B2J# ÇL6ÇJ# Ç7JÇ8J# ÈJ!ÈBJ# ÊL6ÊJ# ÊJ# ÊJ# Ê!J# Ê#	L3Ê,BL.Ì.L3Ì3L6c              ƒ   ó¨  K  — ddl m} t        | j                  |«      «      }| j	                  |«      }|j                  |i «      }t        |xs g  |||¬«      xs g ||¬«      }| j                  D ]  }	|	j                  |«      ƒ d{  –—† }Œ |j                  |d<   t        |j                  «      t        |«      k  r|j                  |d<   |S 7 ŒG­w)aN  
        Build a RoutingContext for `model`, run it through `self.routing_plugins`
        in order, then stash the narrowed candidate list and accumulated signals
        onto `request_kwargs["metadata"]` so `_filter_by_routing_plugin_candidates`
        (called later, during healthy-deployment filtering) can consume them.
        r   )Úresolve_structured_messages)r_  r’  )Úraw_messagesÚstructured_messagesÚcandidate_modelsrÄ  NÚrouting_plugin_signalsÚ _routing_plugin_candidate_models)Ú3litellm.litellm_core_utils.prompt_templates.factoryré	  râ   r:	  rg  rþ  r�   rà  ÚrunÚsignalsr‰  rì	  )
r4  ré   r’  r_  ré	  rì	  Úmetadata_keyrÄ  ÚcontextÚplugins
             rÙ   Ú_run_routing_pluginszRouter._run_routing_pluginsÛ/  sÚ   è ø€ õ	
ô #' t×'CÑ'CÀEÓ'JÓ"KÐà"×JÑJÈ>ÓZˆØ(×3Ñ3°LÀ"ÓEˆä Ø!š RÙ ;ÀXÐ^lÔ mÒ sÐqsØ-Øô	
ˆð ×*Ñ*ò 	0ˆFØ"ŸJ™J wÓ/×/‰Gð	0ð .5¯_©_ˆÐ)Ñ*Üˆw×'Ñ'Ó(¬3Ð/?Ó+@Ò@Ø;B×;SÑ;SˆHÐ7Ñ8àˆð 0ús   ‚BCÂCÂ	ACc                 óZ  — | j                   rt        |t        «      s|S | j                  |«      }|j	                  |«      xs i j	                  d«      }|€|S t        |«      }|D �cg c](  }|j	                  di «      j	                  d«      |v sŒ'|‘Œ* }}|st        d|› �«      ‚|S c c}w )aI  
        Narrow `healthy_deployments` to whatever `self.routing_plugins` left in
        `context.candidate_models`. Raises rather than silently falling back to
        the unfiltered pool -- a plugin narrowing to nothing is a policy decision
        (e.g. no model this tenant's budget allows), not something to bypass.
        rî	  r»  ré   zENo deployments left after routing-plugin filtering. candidate_models=)rà  rá   râ   rg  rà   rl  r×   )r4  rì  r’  rò	  rì	  Úcandidate_setrl  Úfiltereds           rÙ   rÃ	  z+Router._filter_by_routing_plugin_candidates 0  s¿   € ð ×#Ò#¬:Ð6IÌ4Ô+PØ&Ð&à"×JÑJÈ>ÓZˆØ#1×#5Ñ#5°lÓ#CÒ#IÀr×"NÑ"NÐOqÓ"rÐð Ð#Ø&Ð&ä"Ð#3Ó4ˆØ&9Öw ¸Q¿U¹UÐCSÐUWÓ=X×=\Ñ=\Ð]dÓ=eÐivÒ=vš1ÐwˆÐwáÜÐdÐeuÐdvÐwÓxÐxàˆùò xs   Á'(B(ÂB(c                 ój   ‡ — ‰ j                   j                  |«      xs d}t        ˆ fd„|D «       «      S )Nr  c              3   ó\   •K  — | ]#  }‰j                  ‰j                  |   «       –— Œ% y ­wrÔ   )r•	  rq  )rŠ  rs  r4  s     €rÙ   r‹  z;Router._model_name_has_plain_deployments.<locals>.<genexpr> 0  s)   øè ø€ ÒdÐUX�t×:Ñ:¸4¿?¹?È3Ñ;OÓPÔPÑdùs   ƒ),)râ  rà   r‡  )r4  ré   rÒ  s   `  rÙ   Ú!_model_name_has_plain_deploymentsz(Router._model_name_has_plain_deployments0  s0   ø€ Ø×>Ñ>×BÑBÀ5ÓIÒOÈRˆÜÓdÐ\cÔdÓdÐdrç   z3TaggedPreRoutingStrategy[PreRoutingStrategy] | Nonec                 óP  — g | j                   j                  |g «      ¢| j                  j                  |g «      ¢| j                  j                  |g «      ¢| j                  j                  |g «      ¢}|syt        |«      }|rB|D ]=  }|j                  sŒt        t        |j                  «      || j                  «      sŒ;|c S  |D ]  }d|j                  v sŒ|c S  |j                  d«      du }| j                  s|r$t        d„ |D «       «      r| j                  |«      ry|d   S )an  
        Resolve the pre-routing strategy for `model`, disambiguating deployments
        that share a `model_name` by matching the request's tags against each
        registered strategy's tags before falling back to the first registered.
        Returns the tagged registry entry so the caller can tell whether the
        request's tags were what selected it, and can locate the marker
        deployment the strategy was registered from via its (model_name, tags)
        pair.

        With tag filtering enabled, router-wide or by the request's
        enable_tag_filtering (which the proxy sets from key/team
        router_settings), strategies that all carry real tags matching none of
        the request's do not capture it when the name also has plain
        deployments: returning None hands the request to ordinary tag-aware
        deployment selection.
        Nrg  rŽ  Tc              3   ó4   K  — | ]  }|j                   –— Œ y ­wrÔ   r¬  )rŠ  r¼  s     rÙ   r‹  z6Router._select_pre_routing_strategy.<locals>.<genexpr>K0  s   è ø€ Ò9 F�F—K•KÑ9ùs   ‚r   )rÜ  rà   rÝ  rÞ  rß  rH   rà  rJ   râ   r�  rŽ  r	  rû	  )r4  ré   r’  r1	  Úrequest_tagsr¼  Úrequest_scoped_filterings          rÙ   Ú_select_pre_routing_strategyz#Router._select_pre_routing_strategy"0  s?  € ð&Q
Ø×Ñ×"Ñ" 5¨"Ó-ðQ
à×$Ñ$×(Ñ(¨°Ó3ðQ
ð ×"Ñ"×&Ñ& u¨bÓ1ðQ
ð ×!Ñ!×%Ñ% e¨RÓ0ð	Q
ˆ
ñ Øä;¸NÓKˆÙØ$ò "�Ø—;“;Ô#:Ü˜Ÿ™Ó% |°T×5QÑ5Qõ$ð "’Mð	"ð
 !ò 	ˆFØ˜FŸK™KÒ'Ø’ð	ð +9×*<Ñ*<Ð=SÓ*TÐX\Ð*\Ð à×&Ò&Ñ*BÜÑ9¨jÔ9Ô9Ø×6Ñ6°uÔ=àØ˜!‰}Ðrç   c              ƒ   óØ  ‡‡K  — | j                  |¬«      xs |}| j                  r| j                  |‰|¬«      ƒ d{  –—†  | j                  |‰¬«      }|€D| j	                  ‰d¬«       | j                  ‰t        d¬«       | j                  ‰t        d¬«       y|j                  j                  |‰|||¬«      ƒ d{  –—† }| j	                  ‰|r|j                  nd¬«       | j                  ‰t        |r|j                  nd¬«       | j                  ‰t        | j                  ||t        ‰«      ¬«      ¬«       |�| j                  ||j                  ¬	«      nd
}	|�t!        |j"                  xs d
«      nd
Št!        ˆˆfd„|	D «       «      }
‰j%                  t&        d«       ‰j)                  |
«       |
r(‰j)                  t&        t!        d„ |
D «       «      ff«       |S 7 �Œ¦7 �Œ(­w)ad  
        This hook is called before the routing decision is made.

        Used for the litellm auto-router to modify the request before the routing decision is made.

        `model` is whatever the caller asked for, which may be a `model_group_alias` key, while the
        strategy registries and the marker deployment are keyed by the marker's own `model_name`, so
        every lookup below resolves the alias first. Only the lookups: the caller-facing name stays
        the alias, since spend metadata is stamped before routing and the response carries the tier
        group the strategy picked.
        r‡  )ré   r’  r_  Nr)  ©r’  Úrouting_decision©r’  rÅ  rÑ   rµ  )Úselected_strategyrÜ	  rþ	  )ré   Ústrategy_tagsr  c              3   ó@   •K  — | ]  \  }}|‰vsŒ|‰vsŒ||f–— Œ y ­wrÔ   r  )rŠ  rÅ  rÑ   r’  Útier_param_keyss      €€rÙ   r‹  z0Router.async_pre_routing_hook.<locals>.<genexpr>³0  s.   øè ø€ ò '
Ù'˜S %¸CÀ~Ò<UÐZ]ÐetÒZtˆS�%ŒLñ'
ùs   ƒ�•	c              3   ó&   K  — | ]	  \  }}|–— Œ y ­wrÔ   r  )rŠ  rÅ  r  s      rÙ   r‹  z0Router.async_pre_routing_hook.<locals>.<genexpr>¹0  s   è ø€ ÒOrÑX^ÐX[Ð]^ÔPSÑOrùr  )r�  rà  rõ	  r 
  Ú_record_routing_decisionÚ_stamp_or_clear_metadata_keyr%   r    rC  rÛ	  r
  Úsession_affinity_ttl_secondsÚ_consumed_request_tags_stamprH   Ú _forwardable_alias_marker_paramsrà  rã   r»  r»  rï   rÔ  )r4  ré   r’  r_  r�  rª  Úregistered_model_namer
  rÜ	  Úmarker_paramsÚnewly_forwardedr
  s     `        @rÙ   rÛ	  zRouter.async_pre_routing_hookQ0  sN  ùè ø€ ð& (,×'AÑ'AÈÐ'AÓ'NÒ'WÐRWÐð ×ÒØ×+Ñ+Ø+¸NÐU]ð ,ó ÷ ð ð $(×#DÑ#DØ'¸ð $Eó $
Ðð Ð$Ø×)Ñ)¸ÐZ^Ð)Ô_Ø×-Ñ-Ø-Ô3_Ðgkð .ô ð ×-Ñ-Ø-Ô3UÐ]að .ô ð à1B×1KÑ1K×1bÑ1bØ'Ø)ØØØ 3ð 2có 2
÷ ,
Ð!ð 	×%Ñ%Ø)ÙLeÐ7×HÒHÐkoð 	&ô 	
ð 	×)Ñ)Ø)Ü<ÙMfÐ,×IÒIÐlpð 	*ô 	
ð
 	×)Ñ)Ø)Ü2Ø×3Ñ3Ø"3Ø*CÜ:¸>ÓJð 4ó ð 	*ô 	
ð> )Ð4ð ×1Ñ1Ð8MÐ]n×]sÑ]sÐ1Ôtàð 	ð F_ÐEjŒEÐ+×:Ñ:Ò@¸bÔAÐprð 	ô "'ô '
Ø+8ô'
ó "
ˆð 	×ÑÔ?ÀÔFØ×Ñ˜oÔ.ÙØ×!Ñ!Ô$HÌ%ÑOrÐbqÔOrÓJrÐ#sÐ"uÔvà(Ð(ð]ùð",
ûs#   „:G*¾G$¿B G*Â?G'Ã D%G*Ç'G*r
  c                 óô   ‡ ‡‡— t        ˆˆ fd„‰ j                  j                  |d«      D «       «      }t        ˆfd„|D «       «      }|r|d   n|r|d   nd }|€yt        d„ |j                  «       D «       «      S )Nc              3   óÜ   •K  — | ]c  }t        ‰j                  |   j                  d i «      xŠt        «      r2t	        ‰j                  dd«      «      j                  t        «      r‰–— Œe y­w)r»  ré   ro  N)rá   rq  rà   r3  r  rY  rT   )rŠ  rs  r»  r4  s     €€rÙ   r‹  z:Router._forwardable_alias_marker_params.<locals>.<genexpr>À0  sb   øè ø€ ò %
àÜ¨D¯O©O¸CÑ,@×,DÑ,DÐEUÐWYÓ,ZÐZ˜.Ô\`ÔaÜ�N×&Ñ& w°Ó3Ó4×?Ñ?Ô@XÔYô ñ%
ùs   ƒA)A,r  c              3   óf   •K  — | ](  }t        |j                  d «      xs d«      ‰k(  sŒ%|–— Œ* y­w)rà  r  N)rã   rà   )rŠ  rÁ  r
  s     €rÙ   r‹  z:Router._forwardable_alias_marker_params.<locals>.<genexpr>Æ0  s1   øè ø€ ò #
Ø´%¸¿
¹
À6Ó8JÒ8PÈbÓ2QÐUbÓ2bŒFñ#
ùs   ƒ&1ª1r   c              3   ób   K  — | ]'  \  }}|t         vr|t        j                  vr|�||f–— Œ) y ­wrÔ   )rí   r¥   rj  )rŠ  rÅ  rÑ   s      rÙ   r‹  z:Router._forwardable_alias_marker_params.<locals>.<genexpr>Ì0  s>   è ø€ ò 
á��UØÔ7Ñ7ØÔ5×BÑBÑBØÐ!ð	 �%ŒLñ
ùs   ‚-/)rã   râ  rà   r;  )r4  ré   r
  r
  Útag_matchedÚselectedr»  s   ` `   @rÙ   r
  z'Router._forwardable_alias_marker_params½0  sŒ   ú€ ô  %ô %
à×<Ñ<×@Ñ@ÀÈÓKô%
ó  
ˆô #ó #
Ø!.ô#
ó 
ˆñ -8˜+ aš.ÑR_¸mÈAÒ>NÐeiˆØÐØÜñ 
à&Ÿn™nÓ.ô
ó 
ð 	
rç   rÜ  c                 ó�   ‡— | j                  d«      Št        ‰t        «      rt        |t        «      syt        ˆfd„|D «       «      S )Nr»  r  c              3   ón   •K  — | ],  }t        |t        «      rt        j                  ‰|«      r|–— Œ. y ­wrÔ   )rá   r  rg  Ú_deployment_sets_litellm_param)rŠ  rÅ  Údeployment_litellm_paramss     €rÙ   r‹  zJRouter._forwarded_alias_marker_keys_the_deployment_sets.<locals>.<genexpr>Û0  s4   øè ø€ ò 
àÜ˜#œsÔ#¬×(MÑ(MÐNgÐilÔ(mô ñ
ùrŒ  )rà   rá   r	   rã   )r  rÜ  r
  s     @rÙ   rç  z7Router._forwarded_alias_marker_keys_the_deployment_setsÔ0  sH   ø€ ð ,6¯>©>Ð:JÓ+KÐ!ÜÐ3´WÔ=ÄZÐP^Ô`eÔEfØÜó 
à%ô
ó 
ð 	
rç   r
  rÅ  c                 ó’   — | j                  |«      }|€yt        j                  j                  |«      }|d u xs ||j                  k7  S ©NF)rà   r‘   rj  rg  )r
  rÅ  rÑ   rQ  s       rÙ   r
  z%Router._deployment_sets_litellm_paramá0  sH   € à0×4Ñ4°SÓ9ˆØˆ=ØÜ%×2Ñ2×6Ñ6°sÓ;ˆØ˜ˆ}Ò6 ¨¯©Ñ 6Ð6rç   r
  z,TaggedPreRoutingStrategy[PreRoutingStrategy]rÜ	  rþ	  c                 óª   — |�|j                   r|syt        |j                   || j                  «      syt        |j                  |j                   ¬«      S )a•  Record which tags picked the router and which model group it rewrote to, or None.

        A request whose tags matched the selected strategy's tags has already spent those
        tags on picking the router; re-applying them to the routed tier's model group would
        empty the pool unless every tier deployment repeats the marker's tag. Only the
        strategy's own tags are spent: the request's other tags keep constraining
        deployment selection inside the routed group, and key/team policy tags are
        untouched because tag filtering separately re-applies whatever
        `metadata.inherited_tags` carries for the stamped group.
        N)r…  rà  )rà  rJ   r�  rŠ   ré   )r4  r
  rÜ	  rþ	  s       rÙ   r
  z#Router._consumed_request_tags_stampé0  sP   € ð  %Ð,Ð4E×4JÒ4JÑR^ØÜ&Ð'8×'=Ñ'=¸|ÈT×MiÑMiÔjØÜ'Ð4M×4SÑ4SÐZk×ZpÑZpÔqÐqrç   r
  c                 ór   — t         j                  | d|€d¬«       yt         j                  | |¬«      ¬«       y)aÙ  Make the request's metadata describe THIS routing attempt, and only this one.

        Fallbacks re-enter the hook with the same `request_kwargs`, so an attempt that
        picks a plain model group after an auto-router group failed must clear the
        earlier decision; leaving it would attribute the first router's tier and cause
        to the deployment that actually served the request. Every attempt therefore
        writes or clears, never just writes.
        r
  Nr
  r
  )rg  r
  Ú_redact_prompt_text_if_neededr
  s     rÙ   r

  zRouter._record_routing_decisionÿ0  sO   € ô 	×+Ñ+Ø)Ø"ð $Ð+ð ð	 	,õ 
	
ô ×9Ñ9Ø#1ÐDTð :ó ð 	,õ 
	
rç   c                 óÄ   — |€K| j                  d«      | j                  d«      fD ]%  }t        |t        «      sŒ|j                  |d«       Œ' yt	        | «      \  }}|||<   y)a,  Write a proxy-internal metadata key for THIS routing attempt, or clear it.

        Fallbacks and retries re-enter the pre-routing hook with the same
        `request_kwargs`, so every attempt must write or clear, never just write;
        a value left behind by an earlier attempt would be attributed to this one.
        `get_or_create_metadata_bucket` is the single owner of "which dict holds
        proxy-internal metadata": it picks `litellm_metadata` when present (so the
        value never lands in the `metadata` dict that routes like /v1/messages
        forward to the provider) and replaces a non-dict value rather than silently
        skipping the write. Clearing pops from BOTH buckets so a request whose
        bucket resolution changed between attempts cannot resurrect a stale value.
        NrÄ  ru  )rà   rá   r3  r»  r-   )r’  rÅ  rÑ   Úbucketr  Úmetadata_buckets         rÙ   r
  z#Router._stamp_or_clear_metadata_key1  sj   € ð ˆ=Ø)×-Ñ-¨jÓ9¸>×;MÑ;MÐN`Ó;aÐbò *�Ü˜f¤dÕ+Ø—J‘J˜s DÕ)ð*ð ä:¸>ÓJÑˆˆ?Ø$ˆ˜Òrç   c                 óÈ   — ddl m}  || | j                  d«      dœ«      s|S |j                  «       D ��ci c]  \  }}|t        vr||“Œ }}}t        t        |«      S c c}}w )ax  Drop verbatim prompt text from the record when message logging is redacted.

        An operator who turns message logging off has said prompt content must not reach
        the logs, so the fields that quote the prompt (the matched keywords, and the
        signals that name them) are omitted. Derived values are kept, because a tier, a
        cause, a score or an escalation flag aggregates the prompt rather than
        reproducing any of it, and dropping them would leave the row unexplainable for
        no privacy gain. Applied here rather than in each strategy so a strategy added
        later cannot bypass it.
        r   )Úshould_redact_message_loggingÚ standard_callback_dynamic_params)r»  r&
  )Ú*litellm.litellm_core_utils.redact_messagesr%
  rà   r;  r¤   r   r¬   )r’  r
  r%
  rQ  rÑ   Úkepts         rÙ   r 
  z$Router._redact_prompt_text_if_needed/1  s~   € õ	
ñ -à"0Ø4B×4FÑ4FÐGiÓ4jñô
ð $Ð#ð !1× 6Ñ 6Ó 8÷
á��uØÔBÑBð �5‰Lð
ˆñ 
ô
 Ô2°DÓ9Ð9ùó
s   ¶Ac           	      ó¨  — | j                   rt        d«      ‚| j                  |||||¬«      \  }}t        |t        «      rD|j                  d«      xs i j                  d«      du rt        j                  d|› d�|d¬	«      ‚|S t        |«      }| j                  ||¬
«      }t        | |¬«      }|}	| j                  ||¬«      }|s/| j                  r#| j                  �t        j                  d«       |	}| j!                  |«      }| j"                  r|€|�| j%                  |||||¬«      }|xs i j'                  dd«      }
t        j(                  j+                  ||
¬«      }|xs i j'                  dd«      }t        j(                  j-                  ||¬«      }t/        |«      dk(  rU| j1                  |¬«      }| j2                  j5                  ||¬«      }t        | |¬«      }t7        ||| j"                  |¬«      ‚| j9                  ||«      \  }}|dk(  rt;        | ||¬«      S | j=                  |||||||¬«      }|€kt        j>                  d|«       | j1                  |¬«      }| j2                  j5                  ||¬«      }t        | |¬«      }t7        ||| j"                  |¬«      ‚t        j>                  d|| jA                  |«      |«       |S )zB
        Returns the deployment based on routing strategy
        a{  Router(plugins=[...]) is configured, but this call resolved to the synchronous deployment-selection path, which never runs the routing-plugin pipeline. This happens for sync Router methods (e.g. Router.completion()) and for async calls with a routing_strategy that has no async-native selector (e.g. legacy 'usage-based-routing', v1). Silently skipping configured plugins would let a policy plugin (e.g. a deny-all rule) be bypassed. Use an async Router method with a supported routing_strategy (simple-shuffle, usage-based-routing-v2, cost-based-routing, latency-based-routing, least-busy), or remove `plugins` from the Router config.rÙ  rÛ   rô  Tr³	  r´	  ro  r¶  rµ	  rc  r·	  Nr¹	  rº	  rw  r»	  rd  r½	  r   rG  ©Ú	model_idsrþ  ©ré   r—  r�  Úcooldown_listrp  r¦  r×	  z?get_available_deployment for model: %s, No deployment availablerØ	  )!rà  r×   r"  rá   r3  rà   rÍ  rÀ	  r)   Ú*_filter_health_check_unhealthy_deploymentsrg   rÂ	  r©  r–  r   rÓ  r#  r�  r†	  r»  r|  rÄ	  rÅ	  r‰  rÛ  rí  Úget_min_cooldownr›   rœ  rG   r§  r  r¡  )r4  ré   r_  r�  rª  r’  rì  rþ  r¸	  rÆ	  rw  rd  r+
  Ú_cooldown_timeÚ_cooldown_listrC  rÞ	  r  s                     rÙ   rº  zRouter.get_available_deploymentP1  s‡  € ð ×ÒÜð>ó
ð 
ð &*×%MÑ%MØØØØ 3Ø)ð &Nó &
Ñ"ˆÐ"ô Ð)¬4Ô0Ø#×'Ñ'¨Ó5Ò;¸×@Ñ@ÀÓKÈtÑSÜ×5Ñ5Ø% e WÐ,]Ð^ØØ!#ôð ð
 'Ð&ä/PÐQ_Ó/`Ðð #×MÑMØ 3Ø-ð Nó 
Ðô
 '@Ø$(Ð;Kô'
Ðð ,?Ð!Ø"×?Ñ?Ø 3Ø!5ð @ó 
Ðñ # t×'GÒ'GÈD×LeÑLeÐLqÜ!×)Ñ)Øaôð #<Ðà"×>Ñ>Ð?RÓSÐð ×&Ò&¨HÐ,@ÀEÐDUØ"&×"7Ñ"7ØØ$7Ø!ØØ-ð #8ó #Ðð !/Ò 4°"×9Ñ9¸/È4ÓPˆÜ%Ÿm™m×KÑKØ¨mð Ló 
Ðð ,:Ò+?¸R×*DÑ*DÐE_ÐaeÓ*fÐ Ü%Ÿm™m×NÑNØØ$<ð Oó 
Ðô
 Ð"Ó# qÒ(Ø×*Ñ*°eÐ*Ó<ˆIØ!×0Ñ0×AÑAØ#Ð6Fð Bó ˆNô 7ÈtÐfvÔwˆNÜ&ØØ,Ø'+×'BÑ'BØ,ô	ð ð '+×&?Ñ&?ÀÀ~Ó&VÑ#ˆÐ#ØÐ'Ò'ô "Ø$(Ø$7Øôð ð
 !×8Ñ8ØØ&ØØ 3ØØØ)ð 9ó 
ˆ
ð ÐÜ!×&Ñ&Ð'hÐjoÔpØ×*Ñ*°eÐ*Ó<ˆIØ!×0Ñ0×AÑAØ#Ð6Fð Bó ˆNô 7ÈtÐfvÔwˆNÜ&ØØ,Ø'+×'BÑ'BØ,ô	ð ô 	×"Ñ"Ø[ØØ×!Ñ! *Ó-Øô		
ð Ðrç   c           	      óh  — | j                  ||||¬«      \  }}t        |t        «      r¢|j                  d«      xs i j                  d«      du rt	        j
                  d|› d�|d¬«      ‚|j                  d	i «      }|j                  d
«      r|S t	        j                  d|j                  di «      j                  d«      › d�|d¬«      ‚| j                  |¬«      }t        |«      dk(  rt	        j                  d|› d�|d¬«      ‚t        |«      }	| j                  ||	¬«      }t        | |	¬«      }
| j                  ||
¬«      }| j                  |«      }| j                  r|€|�| j                  |||||¬«      }t        |«      dk(  rU| j!                  |¬«      }| j"                  j%                  ||	¬«      }t        | |	¬«      }t'        ||| j                  |¬«      ‚| j)                  ||«      \  }}|dk(  rt+        | ||¬«      S | j-                  |||||||¬«      }|€kt/        j0                  d|«       | j!                  |¬«      }| j"                  j%                  ||	¬«      }t        | |	¬«      }t'        ||| j                  |¬«      ‚t/        j0                  d|| j3                  |«      «       |S )aÙ  
        Returns deployments available for pass-through endpoints (based on load balancing strategy)

        Similar to get_available_deployment, but only returns deployments with use_in_pass_through=True

        Args:
            model: Model name
            messages: Optional list of messages
            input: Optional input data
            specific_deployment: Whether to find a specific deployment
            request_kwargs: Optional request parameters

        Returns:
            Dict: Selected deployment configuration

        Raises:
            BadRequestError: If no deployment is configured with use_in_pass_through=True
            RouterRateLimitError: If no pass-through deployments are available
        )ré   r_  r�  rª  rÛ   rô  Tr³	  r´	  ro  r¶  r»  r  rà	  rY  rá	  râ	  r   rã	  z� has no deployment configured with use_in_pass_through=True. Please add use_in_pass_through: true in the deployment configurationrµ	  rc  r·	  rº	  rG  r*
  r,
  rp  r¦  r×	  zMget_available_deployment_for_pass_through model: %s, no available deploymentszLget_available_deployment_for_pass_through model: %s, selected deployment: %s)r"  rá   r3  rà   rÍ  rÀ	  r–  rä	  r‰  r)   r.
  rg   rÂ	  r#  r�  r†	  rÛ  rí  r/
  r›   rœ  rG   r§  r   r  r¡  )r4  ré   r_  r�  rª  r’  rì  r»  ræ	  rþ  r¸	  r+
  r0
  r1
  rC  rÞ	  r  s                    rÙ   Ú)get_available_deployment_for_pass_throughz0Router.get_available_deployment_for_pass_throughá1  sz  € ð8 &*×%MÑ%MØØØØ 3ð	 &Nó &
Ñ"ˆÐ"ô Ð)¬4Ô0Ø#×'Ñ'¨Ó5Ò;¸×@Ñ@ÀÓKÈtÑSÜ×5Ñ5Ø% e WÐ,]Ð^ØØ!#ôð ð
 %8×$;Ñ$;Ð<LÈbÓ$QˆNØ×!Ñ!Ð"7Ô8Ø*Ð*ô ×-Ñ-Ø)Ð*=×*AÑ*AÀ,ÐPRÓ*S×*WÑ*WÐX\Ó*]Ð)^ð  _bð  cØØ!#ôð ð $(×#HÑ#HÐ]pÐ#HÓ#qÐ äÐ'Ó(¨AÒ-ä×)Ñ)Ø   ð  (ið  jØØôð ô 0QÐQ_Ó/`ÐØ#'×#RÑ#RØ 8Ø-ð $Só $
Ð ô '@Ø$(Ð;Kô'
Ðð $(×#DÑ#DØ 8Ø!5ð $Eó $
Ð ð $(×#CÑ#CÐD\Ó#]Ð ð ×&Ò&¨HÐ,@ÀEÐDUØ'+×'<Ñ'<ØØ$<Ø!ØØ-ð (=ó (Ð$ô Ð'Ó(¨AÒ-Ø×*Ñ*°eÐ*Ó<ˆIØ!×0Ñ0×AÑAØ#Ð6Fð Bó ˆNô 7ÈtÐfvÔwˆNÜ&ØØ,Ø'+×'BÑ'BØ,ô	ð ð '+×&?Ñ&?ÀÀ~Ó&VÑ#ˆÐ#ØÐ'Ò'Ü!Ø$(Ø$<Øôð ð
 !×8Ñ8ØØ&ØØ 8ØØØ)ð 9ó 
ˆ
ð ÐÜ!×&Ñ&Ø_Ðafôð ×*Ñ*°eÐ*Ó<ˆIØ!×0Ñ0×AÑAØ#Ð6Fð Bó ˆNô 7ÈtÐfvÔwˆNÜ&ØØ,Ø'+×'BÑ'BØ,ô	ð ô 	×"Ñ"ØZØØ×!Ñ! *Ó-ô	
ð
 Ðrç   r¸	  c                 óÊ   — t        j                  t        j                  «      rt        j                  d|«       t        |«      }|D �cg c]  }|d   d   |vsŒ|‘Œ c}S c c}w )aÌ  
        Filters out the deployments currently cooling down from the list of healthy deployments

        Args:
            healthy_deployments: List of healthy deployments
            cooldown_deployments: List of model_ids cooling down. cooldown_deployments is a list of model_id's cooling down, cooldown_deployments = ["16700539-b3cd-42f4-b426-6a12a1bb706a", "16700539-b3cd-42f4-b426-7899"]

        Returns:
            List of healthy deployments
        r¶	  rÛ   rY  )r   rz  rÐ  r‡  rš  rl  )r4  rì  r¸	  Úcooldown_setr  s        rÙ   rÂ	  z#Router._filter_cooldown_deploymentsq2  sZ   € ô !×-Ñ-¬g¯m©mÔ<Ü!×'Ñ'Ð(BÐDXÔYä!Ð"6Ó7ˆØ-@Öw˜zÀJÈ|ÑD\Ð]aÑDbÐjvÒDv’
ÒwÐwùÒws   Á	A ÁA c                 óx   — |D �cg c]*  }|j                  d«      xs i j                  d«      dur|‘Œ, c}S c c}w )u  
        Filters out deployments that an admin has paused via `LiteLLM_ProxyModelTable.blocked`.

        Applied alongside the cooldown filter on every routing entry point that calls
        `_common_checks_available_deployment` directly â€” the primary sync/async path,
        the sync pass-through path, and the retry / health-check helpers â€” so paused
        deployments never serve a request. The async pass-through path inherits this
        filter through its delegation to `async_get_healthy_deployments`.
        rÛ   rô  TrK  )r4  rì  r  s      rÙ   r#  z"Router._filter_blocked_deployments„2  sE   € ð 2ö
àØ—‘˜|Ó,Ò2°×7Ñ7¸	ÓBÈ$ÑNò ò
ð 	
ùò 
s   …/7c                 ó@   — t        | dd«      }|€yt        |dd«      du S )zö
        Returns True when a `Deployment` Pydantic instance carries the admin-paused
        flag. Used by credential-lookup helpers so passthrough file / batch endpoints
        cannot bypass the pause by resolving credentials directly.
        rÛ   NFrô  T)r  )r  rÛ   s     rÙ   rN  zRouter._is_deployment_blocked”2  s/   € ô ,3°:¸|ÈTÓ+Rˆ
ØÐØÜ�z 9¨dÓ3°tÐ;Ð;rç   c              ƒ   ó6  K  — | j                   s|S | j                  }| j                  �|€|S | j                  j	                  |¬«      ƒ d{  –—† }|s|S |D �cg c]  }|d   d   |vs	|�	|d   |vr|‘Œ }}|st        j                  d«       |S |S 7 ŒEc c}w ­w)a9  
        Filter out deployments marked unhealthy by background health checks.
        No-op when enable_health_check_routing is False.
        When background_health_check_model_groups is set, only deployments in the
        listed model groups are filtered; every other group keeps its configured
        routing strategy untouched, and a router-level allowed_fails_policy no
        longer disables the filter for the listed groups.
        Returns all deployments if health state is unavailable, stale, or would
        exclude every candidate (safety net).
        N©rþ  rÛ   rY  rf  úJAll deployments marked unhealthy by health checks, bypassing health filter)r©  r¬  r–  rî  r 	  r   rÓ  ©r4  rì  rþ  Úscoped_groupsr	  rl  rø	  s          rÙ   rÁ	  z7Router._async_filter_health_check_unhealthy_deployments 2  sÔ   è ø€ ð ×/Ò/Ø&Ð&ð  $×HÑHˆØ×$Ñ$Ð0°]Ð5JØ&Ð&à%)×%<Ñ%<×%_Ñ%_Ø-ð &`ó &
÷  
ˆñ Ø&Ð&ð )ö
àØ�‰˜tÑ$¨MÑ9ØÐ)¨a°©oÀ]Ñ.Rò ð
ˆð 
ñ Ü!×)Ñ)Ð*vÔwØ&Ð&àˆð# 
úò
ùs$   ‚A
BÁBÁBÁBÁ5BÂBc                 ó  — | j                   s|S | j                  }| j                  �|€|S | j                  j	                  |¬«      }|s|S |D �cg c]  }|d   d   |vs	|�	|d   |vr|‘Œ }}|st        j                  d«       |S |S c c}w )zASync version of _async_filter_health_check_unhealthy_deployments.r9
  rÛ   rY  rf  r:
  )r©  r¬  r–  rî  Úget_unhealthy_deployment_idsr   rÓ  r;
  s          rÙ   r.
  z1Router._filter_health_check_unhealthy_deploymentsÍ2  s½   € ð ×/Ò/Ø&Ð&à#×HÑHˆØ×$Ñ$Ð0°]Ð5JØ&Ð&à#×6Ñ6×SÑSÐeuÐSÓvˆÙØ&Ð&ð )ö
àØ�‰˜tÑ$¨MÑ9ØÐ)¨a°©oÀ]Ñ.Rò ð
ˆð 
ñ Ü!×)Ñ)Ð*vÔwØ&Ð&àˆùò
s   ÁBc                 óî   — t        j                  dt        |«      «       |D �cg c]&  }|j                  di «      j                  dd«      r|‘Œ( }}t        j                  dt        |«      «       |S c c}w )a  
        Filter out deployments configured with use_in_pass_through=True

        Args:
            healthy_deployments: List of healthy deployments

        Returns:
            List[Dict]: Only includes a list of deployments that support pass-through
        z;Filter pass-through deployments from %s healthy deploymentsr»  r  Fz.Found %s deployments with pass-through enabled)r   rš  r‰  rà   )r4  rì  r  ræ	  s       rÙ   rä	  z'Router._filter_pass_through_deploymentsë2  s   € ô 	×#Ñ#ØIÌ3ÐObÓKcô	
ð 2ö+
àØ�~‰~Ð.°Ó3×7Ñ7Ð8MÈuÔUò ð+
Ð ð +
ô 	×#Ñ#Ð$TÔVYÐZrÓVsÔtà'Ð'ùò+
s   ¤+A2c                 óÒ   — 	 |j                  di «      j                  dd«      }|€|�| j                  ||«       yyy# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)z7
        Tracks successful requests rpm usage.
        rÛ   rY  Nz&Error in _track_deployment_metrics: %s)rà   r  r�  r   r  )r4  r  rþ  r  r  r   s         rÙ   rª  z Router._track_deployment_metrics3  su   € ð	UØ(Ÿn™n¨\¸2Ó>×BÑBÀ4ÈÓNˆHØÐàÐ'Ø×&Ñ& xÐ1AÕBð (ð  øô ò 	UÜ!×'Ñ'Ð(PÐRS×TÑTûð	Uús   ‚8= ½	A&ÁA!Á!A&c                 óH   — t        ||| j                  | j                  ¬«      S )Nr§  )r«  r”  r“  )r4  r¹  r…  s      rÙ   rn   z(Router.get_num_retries_from_retry_policy3  s'   € Ü1ØØ#Ø%)×%BÑ%BØ×*Ñ*ô	
ð 	
rç   c                 ó¨  — | j                   }|€yt        |t        j                  «      r|j                  �|j                  S t        |t        j
                  «      r|j                  �|j                  S t        |t        j                  «      r|j                  �|j                  S t        |t        j                  «      r|j                  �|j                  S t        |t        j                  «      r|j                  �|j                  S t        |t        j                  «      r|j                  �|j                  S t        |t        j                  «      r|j                   �|j                   S t        |t        j"                  «      r|j$                  �|j$                  S t        |t        j&                  «      r|j(                  �|j(                  S yy)a  
        BadRequestErrorRetries: Optional[int] = None
        AuthenticationErrorRetries: Optional[int] = None
        TimeoutErrorRetries: Optional[int] = None
        RateLimitErrorRetries: Optional[int] = None
        ContentPolicyViolationErrorRetries: Optional[int] = None
        N)r–  rá   rÍ  rÆ  ÚAuthenticationErrorAllowedFailsr¯  ÚTimeoutErrorAllowedFailsrÁ  ÚRateLimitErrorAllowedFailsrÃ  Ú'ContentPolicyViolationErrorAllowedFailsr–  ÚBadRequestErrorAllowedFailsr   ÚInternalServerErrorAllowedFailsrÀ	  Ú#ServiceUnavailableErrorAllowedFailsÚBadGatewayErrorÚBadGatewayErrorAllowedFailsrÅ  ÚNotFoundErrorAllowedFails)r4  r¹  r–  s      rÙ   Úget_allowed_fails_from_policyz$Router.get_allowed_fails_from_policy3  sŒ  € ð BF×AZÑAZÐàÐ'Øô �y¤'×"=Ñ"=Ô>Ø$×DÑDÐPà'×GÑGÐGÜ�i¤§¡Ô1Ð6J×6cÑ6cÐ6oØ'×@Ñ@Ð@ä�y¤'×"8Ñ"8Ô9Ø$×?Ñ?ÐKà'×BÑBÐBä�y¤'×"EÑ"EÔFØ$×LÑLÐXà'×OÑOÐOä�y¤'×"9Ñ"9Ô:Ø$×@Ñ@ÐLà'×CÑCÐCä�y¤'×"=Ñ"=Ô>Ø$×DÑDÐPà'×GÑGÐGä�y¤'×"AÑ"AÔBØ$×HÑHÐTà'×KÑKÐKä�y¤'×"9Ñ"9Ô:Ø$×@Ñ@ÐLà'×CÑCÐCÜ�i¤×!6Ñ!6Ô7Ð<P×<jÑ<jÐ<vØ'×AÑAÐAð =wÐ7rç   c                 óJ  — ddl m} | j                  €y | j                  } ||j                  dg|j                  ¬«      }|| _        t        j                  j                  |«       t        j                  j                  |j                  «       t        j                  d«       y )Nr   )ÚSlackAlertingÚslack)Úalerting_thresholdÚalertingÚdefault_webhook_urlz2[94m
Initialized Alerting for litellm.Router[0m
)Ú1litellm.integrations.SlackAlerting.slack_alertingrO
  r¤  rQ
  Úwebhook_urlÚslack_alerting_loggerrÍ  r  rT  r  Ú!response_taking_too_long_callbackr   r  )r4  rO
  Úrouter_alerting_configÚ_slack_alerting_loggers       rÙ   r  zRouter._initialize_alertingN3  s�   € ÝSà×ÑÐ'Øà8<×8LÑ8LÐá(5Ø5×HÑHØ�YØ 6× BÑ Bô)
Ðð &<ˆÔ"ä×(Ñ(×=Ñ=Ð>TÔUÜ×(Ñ(×EÑEØ"×DÑDô	
ô 	×"Ñ"Ð#_Õ`rç   ÚCustomRoutingStrategyc                 ó`   — t        | d|j                  «       t        | d|j                  «       y)a  
        Sets get_available_deployment and async_get_available_deployment on an instanced of litellm.Router

        Use this to set your custom routing strategy

        Args:
            CustomRoutingStrategy: litellm.router.CustomRoutingStrategyBase
        rº  r¥  N)ra  rº  r¥  )r4  rZ
  s     rÙ   Úset_custom_routing_strategyz"Router.set_custom_routing_strategyd3  s4   € ô 	ØØ&Ø!×:Ñ:ô	
ô
 	ØØ,Ø!×@Ñ@õ	
rç   c                 óH   — dD ]  }|| j                   v sŒt        | |«       Œ y )N)rº  r¥  )Ú__dict__Údelattr)r4  rb  s     rÙ   r_  z%Router._reset_custom_routing_strategyy3  s'   € ØRò 	$ˆDØ�t—}‘}Ò$Ü˜˜dÕ#ñ	$rç   c                 óN   — d t         _        | j                  j                  «        y rÔ   )rÍ  r¼  Úflush_cacher8  s    rÙ   ra
  zRouter.flush_cache~3  s   € ØŒŒØ�
‰
×ÑÕ rç   c                 óŠ   — g t         _        g t         _        g t         _        g t         _        d | _        | j                  «        y rÔ   )rÍ  r  r  r  r  r“  ra
  r8  s    rÙ   ÚresetzRouter.reset‚3  s6   € à#%ŒÔ Ø*,ŒÔ'Ø#%ŒÔ Ø*,ŒÔ'Ø ˆÔØ×ÑÕrç   )TrÔ   rM  )F)r  rÌ   r_  rÍ   rÒ   N)rÄ  )FFF)r+  rJ  )NNNN)NNNNNr
  )NNN)NNNNF)NNFN)NNF(u  rN  rO  rP  rl  rh  Ú__annotations__ri  rU  rj  r  Útenacityrk  rA   rl  rD   rm  râ   r&   r   r  r™   rŽ   r3  r   r‰   r¡   r�   rã   rÕ   r   rš   rŸ   r–   rˆ   r”   rž   r¦   r‡   r
   r�   r5  Ústaticmethodr,  r  r1  r   r   rÕ  r>  rB  r    rõ  rJ  rÐ   rV  rS  r\  r  ré  rx  r€  r„  r�  rä  r‘  r–  r˜  rœ  r¥  r§  r  rÑ  rè  r  r  r  r.  r?  rE  rU  rd  rg  r  r÷  r~  r  r  r¡  r²   r°   r¨  r¥  rÝ  r	   r½  r   r�   rã  rª   r­   r  r  r   rH  r   r]  ra  r   rm  r“  rÇ  r£  r  r¦  r�  rÈ  r¿  rÉ  rÆ  r�   rÑ  rÚ  r¿  r«  rö  rù  ré  r  r  r  r  rE  r  r  rg  re  rm  rl  r‚   rs  rr  rx  rw  r~  r|  r„  r†  r‡  rŽ  r�  r–  rš  rŸ  rž  r¤  râ  r²  rŠ  r¼  r   rR  rÍ  r   rÃ  rÏ  rÔ  rÖ  rÛ  r±   rß  rÝ  rå  rä  rƒ   ré  rè  r  rf  r§   r
  r  r  r  r  r"  r*  r©  rD  rE  rF  rG  rH  r   rC  rr  r?  r0   Úwrapr  r–  r—  rÅ  rª  r¬  r§  r~  rÐ  r®  r
  r  r  r  rg  r­  r¾   r  r  rÂ  r&  r;  rÁ  rX  r­  r6  r9  rÌ  rS  r[  rx  r‘   r}  r  r�  r’  r¡  r¤  r©  r¢   rè   r®  r�  r²  rµ  r¾  r´  r·  rÚ  rà  rl  rê  ro  rû  r  r   r"  rq  rÍ  r'  r.  r0  rk  r\  rC  r@   r‘  rI  r  rä  rO  rR  rU  rZ  r^  r  r˜  rå  rN  r}  r©   r„  r“   r¨  r¬  r¹  rÂ  r   r$   rÅ  rÐ  r¾  rÕ  r×  rÛ  r‚  rä  rç  rê  r|  rí  rø  rü  rþ  r	  rñ  rð  r	  r	  r	  r	  r®   r 	  r   r%	  r*	  r3	  rI  r:	  rj  rk  rB	  rD	  rK	  rS	  rÀ  rg	  ri	  rl	  rp	  r†	  r�  r‰	  r’	  r•	  r"  r™	  rþ  rÌ	  rÓ	  r¥  rç	  r�   rõ	  rÃ	  rû	  r 
  rÆ   rÛ	  r
  rç  r
  rŠ   r
  r¬   r

  r
  r 
  rº  r3
  rÂ	  r#  rN  rÁ	  r.
  rä	  rª  rn   rM
  r  rŒ   r\
  r_  ra
  rc
  r  rç   rÙ   rg  rg  5  s›2  … Ù“u€K�ÓØ#(€O�T˜D‘[Ó(Ø&1Ð Ó1Ø€HØ7;ÐÐ-°Ñ4Ó;Ø7;ÐÐ-°Ñ4Ó;ØEIÐ˜˜\¨HÑ4°sÑ:Ñ;¸dÑBÓIð OSà8<à9=à:>à $Ø!%Ø!%Ø%)Ø#Ø',ØØ-1Øà)-Ø'+à"&Ø$(Ø $Ø'+Ø.2Ø48Ø!Ø06Ø.2ØØ)+Ø)+ØOQØ',Ø%*Ø(,Ø"$Ø.2ØØ26Ø;=Ø$(Ø:>Ø&*Ø)-ð ØAEØ&(Ø;?ØAEØ15Ù@UÓ@WØ/3ØCGØ+0Ø,1Ø7;Ø5:ØEIØ).Ø<@ñOG&àÐ,Ñ-°°T¸#¸s¸(±^Ñ0DÑDÀtÑKðG&ð /°Ñ5ð	G&ð Ð.Ñ/°$Ñ6ðG&ð Ð/Ñ0°4Ñ7ðG&ð ˜‘:ðG&ð ˜$‘JðG&ð ˜$‘JðG&ð ˜d™
ðG&ð ˜‘*ðG&ð  ™ðG&ð  ð!G&ð" ˜U™ dÑ*ð#G&ð$ ð%G&ð(   $™,ð)G&ð*  ™*ð+G&ð. ˜4‘Zð/G&ð0 ˜T‘zð1G&ð2 ˜‘ð3G&ð4  ™ð5G&ð6 !% t¡ð7G&ð8 (+¨T¡zð9G&ð: ð;G&ð< ˜_Ñ-ð=G&ð>   ™9 tÑ+ð?G&ð@ ðAG&ðB #'ðCG&ðD #'ðEG&ðF    SÐ+DÑ%DÐ DÑEÈÑLðGG&ðH !%ðIG&ðJ #ðKG&ðL "&ðMG&ðN  ðOG&ðP �mÑ$ tÑ+ðQG&ðR ðSG&ðT " DÑ(¨4Ñ/ðUG&ðV #' s¨KÐ'7Ñ"8ðWG&ðX ˜T‘zðYG&ðZ 1°4Ñ7ð[G&ð\ ˜t‘|ð]G&ð^   $™;ð_G&ð` "ðñ
ðaG&ðr #8¸$Ñ">ðsG&ðt  $ðuG&ðv ˜\¨DÑ0Ñ1°DÑ8ðwG&ðx !8¸$Ñ >ðyG&ðz (¨$Ñ.ð{G&ð| "7¸Ñ!=ð}G&ð~ *-ðG&ð@ &*¨#¨t°C©y¨.Ñ%9¸DÑ%@ðAG&ðB %)ðCG&ðD &*ðEG&ðF +.°©*ðGG&ðH /3ðIG&ðJ /7°s©m¸dÑ.BðKG&ðL #'ðMG&ðN  3°TÑ9ðOG&ðP 
óQG&ðR ð˜D ™Iò ó ðòCòð. ð.Ø˜3 ˜8‘nð.à	Ð'Ñ	'ò.ó ð.ð"+¨ó +ð$ )Ø1Ø"7Ø!7Ø1ñ:Ð&¨¨S°#¨X©ó ð ðØ! CÑ'¨$Ñ.ðà	ˆt‰òó ðð¸?ÈSÑ;PÐSWÑ;Wð Ð\`ó ð& $(ò	.à! CÑ'ð.ð  $ð.ð !ð	.ð
 
  $Ñ	&ó.ð`f°h¸vÑ6Fð fÈ4ó fð*°oÈÑ6Kð *Ðdhó *ð:Mà˜<¨$Ñ.Ñ/°$Ñ6ðMð 
óMð^¨Cð °LÀ4Ñ4Gó ð( 15ò
Øð
Ø#&¨¡:ð
à	Ð!Ñ	" TÑ	)ó
ð2
¨ð 
°ó 
ðp¸#À¹*ð pÈó pñ" 7@ÐAQÐ@wÐTvÐ@wÓ6xÐ# Y¨s¡^ÓxðÀTÈDÁ[ð ÐUXÐ[_ÑU_ó ð26¸ð 6Ð@VÐY]Ñ@]ó 6ð, 9=ò'"Øð'"Ø*.°©+ð'"à	ˆs�T‰zÐ1°DÑ8Ð8Ñ	9ó'"ðR3ð ˜‘*ð3ð ˜‘*ð	3ð
 ð3ð "ð3ð �t˜C ˜H‘~Ñ&¨Ñ-ð3ð �T‰z˜DÑ ð3ð ˜t™ð3ð 
ˆt‰ó3ðj+ð ˜‘*ð+ð ˜‘*ð	+ð
 ð+ð "ð+ð �t˜C ˜H‘~Ñ&¨Ñ-ð+ð �T‰z˜DÑ ð+ð ˜t™ð+ð 
ˆt‰ó+òZ	Fò-
òbbò8F
òP
ò$
Hò*còXMò:eòlò(oò04ò1ð°¸±ó ð/MÈDð /MÐUYó /MôbQð,TMÐEZÐ]aÑEaó TMðl¨4ó ð. ð ¨t°D¸¸c¸±NÑ/Cð ÐR_ÐbuÑRuó ð"b ð b°°T¸#¸s¸(±^Ñ0Dð bÐS`ÐcvÑSvó bðH+¸ó +ðZ+f¸#ð +fÈÐRYÐZ]Ð_bÐZbÑRcÑIdó +fð^ ðØðØ$(Ð)9Ñ$:ðØDKÈDÁMðà	òó ðð
 àUZòØðØ$(Ð)9Ñ$:ðØDKÈEÁNðà	òó ðð
 à[`òØðØ$(Ð)9Ñ$:ðØDKÈKÑDXðà	˜}Ñ	,òó ðð ò	3àð3ð Ð'Ñ(ð3ð ó	3ðj ð8Ø*ð8à(-°©ð8ð 
ò8ó ð8ð$ ðSØ!ðSà	ˆt�C˜�KÑ  $ s¨F {Ñ"3Ð3Ñ	4òSó ðSð ð
Øð
à).¨t°C¸°KÑ/@À$ÀsÈFÀ{ÑBSÐ/SÑ)Tð
ð 
ò
ó ð
ð&D>à+ðD>ð �t˜C ˜H‘~Ñ&ðD>ð ð	D>ð
 
óD>ðL ðGØ<ðGà	Ð$Ñ	%òGó ðGðR ð'
Ø8ð'
à)ð'
ð 
ó'
ó ð'
ðR ð:?Ø˜Ð2Ð2Ñ3°dÑ:ð:?àð:?ð 
ò:?ó ð:?ðxpGà5ðpGð ˜S #˜X™ðpGð 
-ó	pGðdtBà+ðtBð �t˜C ˜H‘~Ñ&ðtBð ð	tBð
 
ótBðlfÀð fÐPXÐY`ÐadÐfiÐaiÑYjÑPkó fð4eØðeØ$(¨¨c°3¨h©Ñ$8ðeà	Ð,Ñ	,óeðV .8ò	
àð
ð ð
ð !$ d¡
ð	
ð
 
ó
ð0À)ð ÐY]ð Ðbfó ð&À	ð ÐW^Ð_bÐdgÐ_gÑWhð Ðmqó ð&wØ"ðwØ07¸¸V¸Ñ0DðwØNUÐVYÐ[aÐVaÑNbðwà	ówð BLòPØðPØ47¸$±JðPà	óPð, KOò'Øð'Ø(,ð'Ø=@À4¹Zð'à	ó'ð4 ð>°ð >¸tð >Èò >ó ð>ð. %)ò	WvàðWvð ðWvð ˜T‘zð	Wvð
 
óWvðr¸ð Àtó ð0
¨$ð 
°dð 
¸uÀs¹{ÈTÑ?Qó 
ð¨dð ¸$ð À5È3Á;ÐQUÑCUó ð	 4ð 	¨tð 	¸À¹ÀdÑ8Jó 	ð[#à�S‘	ð[#ð �t˜C ˜H‘~Ñ&¨¨d°4¸¸S¸±>Ñ.BÑ)CÑCó[#ðz%Øð%Ø$(¨Ð.>Ñ)?Ñ$@ó%ðR ðØðØ$(¨¨c°3¨h©Ñ$8ðØBIÈ$Á-ðà	òó ðð àSXòØðØ$(¨¨c°3¨h©Ñ$8ðØBIÈ%Á.ðà	òó ðð ò	E,àðE,ð �t˜C ˜H‘~Ñ&ðE,ð ó	E,ðV àdiòØðØ$(Ð)9Ñ$:ðØFIðØSZÐ[`ÑSaðà	òó ðð
 ðØðØ$(Ð)9Ñ$:ðØFIðØSZÐ[_ÑS`ðà	òó ðð ò:àð:ð Ð'Ñ(ð:ð ó	:ðx=àð=ð ð=ð $ð	=ð
 �F˜C�KÑ ð=ð �S˜&�[Ñ!ó=ð~
X°ð 
X¸ó 
XðTBàðTBð Ð'Ñ(ðTBð �S˜#�X‘ó	TBðl
 sð 
°3ó 
ð&¨ð &°Có &ðP¨cð ¸#ó ð(>¨sð >¸3ó >ð@(¨ð (¸3ó (ðT<¨)ð <¸Có <ð|2 3ð 2¨sð 2¸3ó 2ðh< Cð <°ð <¸Có <ð| 3ó ð*# Có #ðR !&Ø#(Ø %ò!àð!ð ð!ð ˜‘+ð	!ð
 ˜D‘[ð!ð ˜‘+ó!ðN !&Ø#(Ø %ò#àð#ð ð#ð ˜‘+ð	#ð
 ˜D‘[ð#ð ˜‘+ó#ðJ<¨Sð <¸#ó <ðD !&Ø#(Ø %òàðð ðð ˜‘+ð	ð
 ˜D‘[ðð ˜‘+óð8<°Sð <Àó <ð|
¸xó 
ð
¸#ð 
ÐZbó 
ðàðð $óð:àðð $,óð:
àð
ð 
ó
ðB¸Sð ÐU]ó ð6Ø˜3 ˜8‘nðØ-0ðØ>Aðà	ˆc�3ˆh‰óð:ZÀCð ZÐdló Zðx.Ø!)ð.Ø58ð.à	ÐJÑ	Kó.ð`Ià Ñ&ðIð ˜S #˜X™ðIð 
�uÑ	ó	IðVàðð  $ðð $)¨°¨Ñ#4ð	ð
 ðð ˜S #˜X™ðð 8ðð 
˜˜t˜Ñ	$óð<HAà#ðHAð ˜S #˜X™ðHAð 8ð	HAð
 
˜˜t˜Ñ	$óHAðT"à#ð"ð ð"ð 
Ð*¨M¸%Ñ,@Ð@Ñ	Aó	"ðHkàðkð $ðkð ó	kð&F°cð FÈhó FðX !&ò	àðð �T‰zðð ˜‘+ð	ð 
óð".  d¡
ð .°3ó .ðh !%ò	àðð �T‰zðð ˜‘+ð	ð 
ôð2< s¨T¡zð <¸#ô <ð~àðð 
ô	ð.GàðGð 
ô	GðT]à�T‰zô]ó~ðàðð 
ô	ð8KàðKð 
ô	Kð^ !ògà�T‰zðgð 
ô	gðRàðð 
ô	ð>RàðRð 
ô	Rðh+àô+ðd +/ò1à#ñ1ð ! 4™Zô1ð^ òk{à#ð{ð ñp#ñr
ô{ð@ +/ò1à#ñ1ð ! 4™Zô1ð8 +/ò-1à#ñ-1ð ! 4™Zô-1ð^
à#ô
ð. +/ò1à#ñ1ð ! 4™Zô1ð@ +/ò1à#ñ1ð ! 4™Zô1ð* +/Ø%)ò	ià#ñið ! 4™Zñið ˜dÑ"ô	ið(KàñKð "ñKð Ð1Ñ2ð	Kð
 ðKð ñKð ðKð 
ˆt‰ôKðn ).òz!àñz!ð   $™;ðz!ð ˜$‘;ð	z!ð
 #'¨¡+ðz!ð #'¨¡+ðz!ð ˜4‘Zðz!ð ðz!ð ñz!ð "&ôz!ðx €V‡[‚[ƒ]ò=ó ð=ðD #'Ø!%Ø04Ø04ò-àð-ð ˜4‘Zð-ð ˜$‘;ð	-ð
 #'¨¡+ð-ð #'¨¡+ô-ð^ €V‡[‚[ƒ]òv%ó ðv%ðp°ô ò¸Dð ÈsÐUYÉzô ð: ,0Ø'+Ø04Ø04Ø)-ó>àð>ð " D™[ñ>ð  ™ð	>ð
 #'¨¡+ð>ð #'¨¡+ñ>ð   $™;ô>ó@Wð #'ò$à˜˜S $ s¡)˜^Ñ,Ñ-ð$ð ˜4‘Zð$ð 
ˆc‰�TÑ	ô	$ð2¨S°4©Zô ð$ ,0Ø'+ò+àñ+ð ð+ð ð	+ð
 " D™[ñ+ð  ™ð+ð 
ˆu‰ô+ó^}ð~!ð 
ˆt‰ô!ðFUð 
ôUñn
Ø+1°D©=ô
ð<>¸dð >ÀwÑOmÑGnô >ð ð ¨ð °tô ñ<¨3ñ À$ÈÁ+ð ÐRUô ð&¨ô ð ¸ð  À}ð  Ð^bð  Ðgkô  ðD5¨cñ 5ÀTÈDÁ[ô 5ð(5Øñ5Ø,0°4©Kð5à	ˆt�D‰z˜4 ™:Ð%Ñ	&ô5ð<5¸4ô 5ð( .2ò	;àñ;ð  ™+ñ;ð $ dÑ*ô	;ðF '+Ø-1ò/,àð/,ð " $™Zð/,ð Ð'Ñ(¨4Ñ/ñ	/,ð
  ™+ð/,ð ˜t™ñ/,ð $ dÑ*ô/,ðb ñF vð F°#ó Fó ðFð ð' sñ '¸Dð 'ÀSó 'ó ð'ð> ñ6°4ñ 6Èñ 6ÐbeÐhlÑblð 6Ðquó 6ó ð6ð8 ñ?Øñ?Ø),ñ?ØCFÈÁ:ð?à	ó?ó ð?ðN #'Ù(1«ôlàñlð ñlð ñ	lð
 ñlð ˜4‘Zñlð ! ‘~ðlð 
�dÑ	ôlñ\R¸ð RÈDô Rð ð; Zð ;°E¸#¸s¸(±Oó ;ó ð;ð+
°jô +
ñZT¸~ð TÐRVô Tð78¸Jô 78ñrR¸^ð RÐPTô Rñ#È>ð #Ð^bô #ð ñWØ�s˜DÐ!9Ð:NÑ!OÑPÐPÑQðWàñWð �C˜�H‰oðWð 
ó	Wó ðWñ
à�s˜DÐ!9Ð:NÑ!OÑPÐPÑQð
ð ð
ð 'ñ	
ð
 ð
ð 
ô
ð. ñØ�s˜DÐ!9Ð:NÑ!OÑPÐPÑQðàñð �C˜�H‰oðð 
ó	ó ðð$/È*ð /ÐY]ô /õ4$+õLð F
¸*ð F
Èô F
ñPQ¸Nð QÈtô Qð%
¸ô %
ðNV¸zð VÈdô VðX7¨ô X7ðtx¨*ð x¸ô xðt 
À*ñ  
Ðcfô  
ðD;¨ð ;¸
ÀTÑ8Iô ;ñzB7Àñ B7ÐSVð B7Ð[_ô B7ðHG¨dñ G¸ð GÀô Gò$2°dñ 2ÀcÈDÁjð 2Ð\`ô 2ð:C¨Jð C¸:ÈÑ;Lõ CñJÈ:ÐX\ÑK\ñ Ðhkð Ðptõ ð$ ð cñ ÀÀdÁ
ð ÈuÐUXÐZ]ÐU]Éó ó ñð ð°:ð À$ó ó ñð4 ñI
à˜‘*ñI
ð ðI
ð ñ	I
ð
 ! 4™ZðI
ð 
óI
ó ñI
öVñ*% Cð %¨J¸Ñ,=õ %ðNá	 Ñ	$õð&
¸
ð 
Àtõ 
ði¸ð iÈõ iñ& sð ¨z¸DÑ/@õ ñ&(°3ð (¸4À$¹;õ (ñÀ3ð È:ÐX\ÑK\õ ð, ðA¨'°JÑ*>ð AÈÈtÉð AÐX\ó Aó ñAñ^Ø #ð^Ø.1°D©jð^à	�dÑ	õ^ð"
°cð 
Ñ>]õ 
ð* 48óaØðaØ&)¨D¡jðaà	ˆc�3ˆh‰˜$Ñ	õaðF ð
 ò	à˜$¡Ð,Ñ-ñð !ñð ð	ñ
 
óó ñð ð°ñ È3ñ ÐTWð Ñ\hó ó ñð ò	z!à˜$¡Ð,Ñ-°Ñ4ñz!ð !ñz!ð �$‰Jð	z!ñ
 
õz!ñx ð ¨°©õ ñ 
: #ð 
:¨$°©+õ 
:ñ;°#ð ;À3ð ;É9ÐW[ÑK[õ ;ðzs °ñ s ÐTWð s Ñ\jÐmqÑ\qõ s ðjm°ð m¹ÈÑ8Mõ mð:A$°sð A$¸uÀSÈ4ÁZÐQTÐW[ÑQ[ÐE[Ñ?\õ A$ðF2&Àð 2&ÈÈcÐTXÉjÐZ]Ð`dÑZdÐNdÑHeõ 2&òh Ñ1Õ2ð6¸ð 6ÁÐQUÑ@Uó 6ó 3ñ6ð"Àð "ÈÈcÐSVÈhÉõ "ðN #'Ø&*ò	 àð ð ˜4‘Zð ð ˜t™ð	 ð
 
õ ðD6°$ð 6¸4õ 6ð(RÀ$õ Rò6 ¨¨d©
ñ  ÐPTð  ÐaeÐfiÑajõ  ñDE¨ð E°õ Eñ7¸¸t¹ð 7ÈÈdÉ
õ 7ñr¨c°D©jð À3ð È3ÐQUÉ:õ òB°Cð Àð ÈsÐUYÉzð Ðeiõ ð4 #'Ø"ò	HàñHð ˜4‘ZðHð �t‘ð	Hð
 
Ð!Ñ	"õHòT s¨T¡zð ¸TÀ#¹Yõ ð*Z¨s°3©xõ Zð* ñ
ØÐ-Ñ.ð
à	ó
ó ñ
ðJ¨Sð J°Tõ Jð1`¸SÀ¹Xõ 1`òfÐ3Fð ÐQTÐW[ÑQ[ð ÐgjÐmqÑgqõ ñ&
>°$¸±+ð 
>À$õ 
>ò¸#À¹*ð ÐPTÐUhÑPiõ ò>¸SÀ4¹Zð ÐS[Ð\oÑSpõ ñ2
°e¸LÈ#Ð<MÑ6Nð 
ÐSXÐYlÐnqÐYqÑSrõ 
ð ð
8Ð*=ð 
8ÐBUó 
8ó ñ
8ñ (1Ñ1CÓ'DÁyó	
ó
Hñ 
(Ñ™uô 
ð ñP¨'°#°v°+Ñ*>ð PÀ9ÈSÁ>ó Pó ñPð ð7Ð.Añ 7È#ñ 7ÐVYð 7Ð^bó 7ó ñ7ð>7nØñ7nØ'.¨s°F¨{Ñ';ð7nØMTÐUXÐZ`ÐU`ÑMað7nà	��f�Ñ	õ7nðt DHò%Ø ™*ð%Ø69¸D±jð%à	Ð!Ñ	" TÑ	)õ%òN
°#ð 
ÀÀdÁ
ð 
ÐV[Ð\_ÐadÐ\dÑVeõ 
ö&(ö)ð "&Ø)-Ø"ò	,à˜$‘Jñ,ð   $™Jð,ð �t‘ð	,ð
 
ˆc�4˜‘9ˆnÑ	õ,ñ\ÈCð ÐTXõ ô&%#ôNTXöl&ðX $(ò	Và�t˜C ˜H‘~Ñ&¨Ñ-ðVð �T‰z˜DÑ ñVð ˜D‘jð	Vð
 
õVð@O°#ð OÀ7È3ÐPVÈ;ÑCWð OÐ\_ÐbfÑ\fõ Oð

Øð

Ø/7¸ÀÀVÀÑ8LÑ/Mð

à	õ

ðàðð & g¨c°6¨kÑ&:Ñ;ðð ˜7 3¨ 8Ñ,Ñ-°Ñ4ð	ð
 �X˜fÑ%Ñ%¨Ñ,ðð    V Ñ,¨tÑ3ðð 
ˆt‰õðF 15Ø#'Ø&*Ø(,Ø(-òu%àðu%ð "ðu%ð �t˜C ˜H‘~Ñ&¨Ñ-ð	u%ð
 �T‰z˜DÑ ðu%ð ˜t™ñu%ð  ™:ñu%ð "&õu%ðnH¨3ð H°3¸±:õ HðU°cð U¸dõ Uð %*ò	AàñAð ˜t™ñAð "ð	Að
 
ˆs�D˜4‘KÐÑ	  4Ñ	'õAðF ðr°7¸3À¸;Ñ3Gð rÈDó ró ñrð 15Ø#'Ø+0Ø&*òI!àðI!ð �t˜C ˜H‘~Ñ&¨Ñ-ðI!ð �T‰z˜DÑ ñ	I!ð
 " D™[ðI!ð ˜t™ðI!ð 
ˆs�D˜4‘KÐÑ	 õI!ðV4$àð4$ð "ð4$ð ˜t™ñ	4$ð
 ˜t™ð4$ð 
õ4$ðt 15Ø#'Ø+0Ø(,òO#àðO#ð ðO#ð �t˜C ˜H‘~Ñ&¨Ñ-ð	O#ð
 �T‰z˜DÑ ñO#ð " D™[ñO#ð  ™+ðO#ð 
ˆd‰�dÑ	õO#ðb ð.¸¸SÀ&¸[Ñ8Iñ .ÐTWð .Ð\`ó .ó ñ.ð ðLØ˜S &˜[Ñ)ñLà$ S¨& [Ñ1ðLð 
óLó ñLð* 15Ø#'Ø+0òBàðBð ðBð �t˜C ˜H‘~Ñ&¨Ñ-ð	Bð
 �T‰z˜DÑ ñBð " D™[õBðP 15Ø#'Ø+0òAàðAð ðAð �t˜C ˜H‘~Ñ&¨Ñ-ð	Að
 �T‰z˜DÑ ñAð " D™[õAðF#àð#ð ð#ð �t˜C ˜H‘~Ñ&¨Ñ-ð	#ñ
 
õ#ðJà! $™Z¨$Ñ.ðð ðð 
ˆd‰�dÑ	õ	ð<e°sð e¸tõ eð-Øð-Ø*.ð-á	>õ-ðf 15Ø#'Ø+0òj)àðj)ð ðj)ð �t˜C ˜H‘~Ñ&¨Ñ-ð	j)ð
 �T‰z˜DÑ ñj)ð " D™[ðj)ñ 
  $Ñ	&õj)ðX
Øñ
Ø).¨s°C¨x©ð
à	ˆu�S˜&�[Ñ! 3Ð&Ñ	'õ
ð. ð

Ø˜C ˜KÑ(ñ

Ø:@ð

à	ˆs�Cˆx‰ó

ó ñ

ð ñ7À'È#ÈvÈ+ÑBVñ 7Ð]`ð 7Ðeió 7ó ñ7ñráIñrñ $:¸DÑ#@ñrð ˜s‘mð	rñ
 
" DÑ	(õrð, ð
Øñ
á8¸4Ñ?ð
ð 
ó
ó ñ
ð0 ð%°Tñ %Àñ %ÈFÐUYÉMð %Ð^bó %ó ñ%ð, ð:Ø  V Ñ,ñ:á8ð:ñ 
(ó:ó ñ:ðF 15Ø#'Ø+0Ø&*òOàðOð �t˜C ˜H‘~Ñ&¨Ñ-ðOð �T‰z˜DÑ ñ	Oð
 " D™[ðOð ˜t™õOðh 15Ø#'Ø+0Ø&*òNàðNð �t˜C ˜H‘~Ñ&¨Ñ-ðNð �T‰z˜DÑ ñ	Nð
 " D™[ðNð ˜t™õNð`xØ#'¨¡:ñxØEIÈ#ÁYðxà	ˆd‰õxð&
¸tÀD¹zð 
ÈdÐSWÉjõ 
ð  ð	<©<ð 	<¸Dó 	<ó ñ	<ð )-ò+à! $™Zñ+ð  ™+ð+ð 
ˆd‰õ	+ð` )-òà! $™Zñð  ™+ðð 
ˆd‰õ	ð<(ÀDÈÁJð (ÐSWÐX\ÑS]õ (ó0UÀdÈTÁkõ Uò
¸9ð 
ÐSVÐY]ÑS]õ 
ð4B°yõ 4Bôlañ,
ÑAZõ 
ö*$ô
!õrç   rg  rM  (>  rä  rÄ  r™  Úenumr=  r%  r:  rÐ  rm  r  r  r  Úweakrefr@	  r   Úcollections.abcr   r   r   r   r	   r
   Ú	functoolsr   Útypesr   Útypingr   r   r   r   r   r   r   r   r   r@  Úhttpxrð  r   Úpydanticr   Útyping_extensionsr   rÍ  Ú2litellm.litellm_core_utils.exception_mapping_utilsr   Úlitellm._loggingr   Úlitellm._uuidr   Úlitellm.caching.cachingr   r   r   r   Úlitellm.constantsr    r!   r"   r#   r$   r%   Ú"litellm.integrations.custom_loggerr&   Ú#litellm.litellm_core_utils.asyncifyr'   r(   rÚ  r)   r*   r+   r,   r-   Ú,litellm.litellm_core_utils.coroutine_checkerr.   Ú.litellm.litellm_core_utils.credential_accessorr/   Ú%litellm.litellm_core_utils.dd_tracingr0   Ú1litellm.litellm_core_utils.get_llm_provider_logicr1   Ú*litellm.litellm_core_utils.litellm_loggingr2   rX  Ú&litellm.litellm_core_utils.ptu_pricingr3   r4   r5   r6   r7   r8   r9   Ú3litellm.litellm_core_utils.request_timeout_resolverr:   Ú+litellm.litellm_core_utils.secret_redactionr;   Ú0litellm.litellm_core_utils.sensitive_data_maskerr<   r=   r>   Ú$litellm.llms.openai_like.json_loaderr?   Ú&litellm.router_strategy.budget_limiterr@   Ú"litellm.router_strategy.least_busyrA   Ú#litellm.router_strategy.lowest_costrB   Ú&litellm.router_strategy.lowest_latencyrC   Ú&litellm.router_strategy.lowest_tpm_rpmrD   Ú)litellm.router_strategy.lowest_tpm_rpm_v2rE   r¨  rG   Ú)litellm.router_strategy.tag_based_routingrH   rI   rJ   Ú/litellm.router_utils.add_retry_fallback_headersrK   rL   rM   rN   rO   rP   rQ   rR   rS   Ú-litellm.router_utils.auto_router_model_namingrT   rU   Ú litellm.router_utils.batch_utilsrV   rW   rX   Ú/litellm.router_utils.client_initalization_utilsrY   Ú2litellm.router_utils.clientside_credential_handlerrZ   r[   rý  r\   r]   r^   r_   r`   ra   Ú#litellm.router_utils.cooldown_cacherb   Ú&litellm.router_utils.cooldown_handlersrc   rd   re   rf   rg   rh   ri   Ú,litellm.router_utils.fallback_event_handlersrj   rk   rl   rm   Ú*litellm.router_utils.get_retry_from_policyrn   r«  Ú!litellm.router_utils.handle_errorro   rp   Ú'litellm.router_utils.health_state_cacherq   Ú>litellm.router_utils.pre_call_checks.deployment_affinity_checkrr   rs   Ú>litellm.router_utils.pre_call_checks.io_token_rate_limit_checkrt   ru   rv   rw   Ú;litellm.router_utils.pre_call_checks.model_rate_limit_checkrx   ÚDlitellm.router_utils.pre_call_checks.prompt_caching_deployment_checkry   Ú0litellm.router_utils.reasoning_effort_capabilityrz   r{   r|   Ú>litellm.router_utils.router_callbacks.track_deployment_metricsr}   r~   Úlitellm.schedulerr   r€   rV  r�   r‚   rƒ   r„   rÏ  r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   Úlitellm.types.servicesr£   Úlitellm.types.utilsr¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r¯   r˜  r€  r°   r±   r²   r³   r´   rµ   r¶   r·   r¸   r¹   rº   r»   Ú&router_utils.pattern_match_deploymentsr½   Úopentelemetry.tracer¾   Ú_Spanr&  rÀ   r�  rÂ   rÎ  rÄ   r‰  rÅ   rÆ   r˜  rÈ   rÝ  rÊ   Ú8litellm.types.llms.anthropic_messages.anthropic_responserË   Úlitellm.types.llms.baserÌ   rÍ   rÎ   rÏ   rÐ   rd
  r  rÕ   rÚ   rS  rU  ræ   rè   rä  rí   rï   rþ   r   r  r  r
  r  r  r  r�  r  r'  r*  r,  ÚEnumrW  ÚWeakSetrZ  r^  rc  re  rg  r  rç   rÙ   ú<module>r¤
     sž  ðô Û Û Û Û Û Û Û Û 	Û Û Û Û Ý #ß a× aÝ Ý "ß `× `Õ `ã Û Û Ý Ý Ý &ã Û 9Ý "Ý 2Ý ÷ó ÷÷ õ <ß L÷õ õ KÝ MÝ 8Ý ^Ý P÷÷ ñ õõ F÷ñ õ
 FÝ GÝ FÝ HÝ NÝ JÝ PÝ A÷ñ ÷

÷ 
õ 
÷÷ñ õ
 R÷÷÷ õ >÷÷ ñ ÷ó õ÷õ J÷÷ó õõ÷ñ ÷
÷ 2÷ó ÷÷ ÷ ÷ ÷ ÷ ÷ ÷ õ@ 0÷÷ ÷ ó õ :÷÷ ÷ ÷ ó ÷ GÐ Fáß1Ð1ç9Ð9÷ð ÷ð ÷ô ÷ð ÷ð ÷ð ÷ HÐG÷÷ ñ ‚Dà�DØ�JØÑØ�NØ�MØ Ñð Øñà!ñ"ð ñð !ñ	!ñ ˜	ô ð¡¡e¡¨dÑ 2ð ±u¸t±|ô ð"°W¹SÁ&¸[Ñ5IÈDÑ5Pð "ÑUYô "ñJ Ð5Ó6Ñ â'0Ò1`Ó'aÑ ˜uÔ aØ.NÑ $ eÔ Nð°(Ð;NÑ2Oð ÑTXô ð0 47Ñ )¨5Ô 6ð*¹&ð *ÑY]ð *Ñbfô *ð*±ð *Étð *Ñknð *Ñswô *ð4±ð 4¹ô 4ð6±fð 6Áô 6ðAÁTð AÐRjð AÑosô AðI±ð I¹sÀT¹zô IðÙðÙ ðÙ9=ðà$ôð(x©ð xÉð xÑdgð xÑlpô x÷ 4
ò 4
ôn�$—)’)õ ð 3B°'·/²/Ó2C�ˆuÐ.Ñ/Ô Cô2ò Ñ9Ô :ò +4ðó+Ñ   %ô ð !"Ñ ˜Ô !÷TEó TErç   