Ë
    tPêj€á  ã            @       ó  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ	 d dl
mZ d dlmZ d dlmZmZmZ d dlZd dlZd dlmZ d dlmZmZ d dlZd dlmZ d dlmZ erd d	lmZ neZd»d„Z  e «        ejB                  jE                   ejF                  «       «       dZ$ee%d<    ejL                  dd«      Z'ee%d<   e'dk(  r e«        d dl(m)Z) dZ*ee%d<    G d„ de)«      Z+	 	 	 	 d¼de,de-dz  de-dz  de-dz  de.de/dz  d
e/fd„Z0 G d„ de«      Z1de2d e-dz  d!e-dz  d
e2fd"„Z3d#e2dz  d$e2d
e2fd%„Z4d#e2d$e2d&e2d
e2fd'„Z5d#e2dz  d(e/d
e2fd)„Z6 G d*„ d+«      Z7 ejp                  «        ejr                  d,d-¬.«       ejt                  d/d0d1d2¬3«       ejt                  d4d5d6d7¬3«       ejt                  d8ed9d:¬3«       ejt                  d;d ejv                  d<¬=«      d>d?¬@«       ejt                  dAddB¬C«       ejt                  dDejx                  dE¬C«       ejt                  dFdGddH¬C«       ejt                  dIddJ¬C«       ejt                  dKddH¬C«       ejt                  dLddM¬C«       ejt                  dNdOe.dP¬Q«       ejt                  dRddOe.dSdT¬U«       ejt                  dVddOe.dWdX¬U«       ejt                  dYddOe.dZ¬[«       ejt                  d\de-d]¬^«       ejt                  d_de,d`¬^«       ejt                  dade,db¬^«       ejt                  dcdOdd¬e«       ejt                  dfdOdg¬e«       ejt                  dhdiddj¬C«       ejt                  dkde-dl¬^«       ejt                  dmdOe.dn¬^«       ejt                  dode2dp¬^«       ejt                  dqdOddr¬s«       ejt                  dtduddOe.dv¬[«       ejt                  dwdOdx¬y«       ejt                  dzdOd{¬y«       ejt                  d|ddOd}¬~«       ejt                  dddOd€¬~«       ejt                  d�ddOd‚¬~«       ejt                  dƒd„e,d…¬^«       ejt                  d†ddOd‡¬~«       ejt                  dˆddOd‰¬~«       ejt                  dŠddOd‹¬~«       ejt                  dŒde2d�dŽ¬@«       ejt                  d�de2d�d‘¬@«       ejt                  d’de2d“¬^«       ejt                  d”dOdd•¬s«       ejt                  d–dOdd—¬s«       ejt                  d˜dOdd™¬s«       ejt                  dšde,d›dœ¬@«       ejt                  d�de,dždŸ¬@«       ejt                  d de,d¡d¢¬@«       ejt                  d£de,d¤d¥¬@«       ejt                  d¦d ejv                  d<¬=«      d§d¨¬@«       ejt                  d©dOddªd«¬¬«       ejt                  d­dOdd®d¯¬¬«       ejt                  d°dOdd±¬s«      d²e.d³e.d´e,dz  dµe,dz  d¶e.d·e.d¸e.fd¹„«       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       «       Z=e>dºk(  r e=«        yy)½é    N)ÚIterable©ÚPath)ÚTYPE_CHECKINGÚAnyÚFinal)Úload_dotenv)Ú	BaseModelÚ
ConfigDict)Ú!DEFAULT_NUM_WORKERS_LITELLM_PROXY)Ústart_query_engine_reaper)ÚFastAPIÚreturnc                  ó†  — t         j                  j                  t         j                  j                  t        «      «      } t
        j                  rqt         j                  j                  t
        j                  d   «      | k(  r=t
        j                  j                  t
        j                  j                  d«      «       yyy)aÒ  Stop ``litellm/proxy`` modules from shadowing installed packages.

    Running this file as a script puts its own directory at ``sys.path[0]``, so
    ``import a2a`` resolves to ``litellm/proxy/a2a`` instead of the ``a2a`` SDK
    and A2A agent calls fail. The entry is moved to the end rather than dropped,
    because the sibling-import fallbacks in this module (``from proxy_server
    import ...``) still need it. No-op under the ``litellm`` console script.
    r   N)ÚosÚpathÚdirnameÚabspathÚ__file__ÚsysÚappendÚpop)Ú
script_dirs    ú\/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/proxy_cli.pyÚ$_deprioritize_script_dir_in_sys_pathr      si   € ô Ÿ™Ÿ™¬¯©¯©¼Ó(AÓB€JÜ
‡x‚x”B—G‘G—O‘O¤C§H¡H¨Q¡KÓ0°JÒ>Ü�‰�‰œŸ™Ÿ™ Q›Õ(ð ?€xó    zlitellm.secretsÚconfig_filenameÚLITELLM_MODEÚDEVÚlitellm_mode)ÚEnumÚ	telemetryc                   ó   — e Zd ZdZdZy)ÚLiteLLMDatabaseConnectionPoolé
   é<   N)Ú__name__Ú
__module__Ú__qualname__Údatabase_connection_pool_limitÚ database_connection_pool_timeout© r   r   r$   r$   8   s   „ Ø%'Ð"Ø')Ñ$r   r$   FÚconnection_limitÚpool_timeoutÚconnect_timeoutÚsocket_timeoutÚdisable_prepared_statementsÚextra_paramsc                 ól   — d| i}|�||d<   |�||d<   |�||d<   |rd|d<   |r|j                  |«       |S )uÑ  Build the Prisma DATABASE_URL query params controlling connection pool behavior.

    `connect_timeout` / `socket_timeout` map to the Prisma URL params of the same
    name (https://www.prisma.io/docs/orm/overview/databases/postgresql) and are
    omitted when None so Prisma's defaults apply. `disable_prepared_statements`
    sets `pgbouncer=true`, which makes Prisma stop using server-side prepared
    statements (pgbouncer transaction-pool compatible; also sidesteps the
    "cached plan must not change result type" error during rolling migrations).
    `extra_params` is an untyped passthrough â€” keys it provides win over the
    named arguments above, so it can be used to override any default we set here.
    r-   r.   r/   r0   ÚtrueÚ	pgbouncer)Úupdate)r-   r.   r/   r0   r1   r2   Úparamss          r   Ú_build_db_connection_url_paramsr8   =   sf   € ð( 	Ð,ð€Fð ÐØ!-ˆˆ~ÑØÐ"Ø$3ˆÐ Ñ!ØÐ!Ø#1ˆÐÑ Ù"Ø$ˆˆ{ÑÙØ�‰�lÔ#Ø€Mr   c                   óL   — e Zd ZU dZ ed¬«      ZdZedz  ed<   dZ	edz  ed<   y)ÚDatabaseTimeoutSettingszåThe `general_settings` keys that bound how long a statement may hold locks.

    Validated at the boundary so a mistyped value fails at startup with a clear
    pydantic error instead of a TypeError deep inside URL assembly.
    Úignore)ÚextraNÚdatabase_statement_timeoutÚdatabase_lock_timeout)
r'   r(   r)   Ú__doc__r   Úmodel_configr=   ÚfloatÚ__annotations__r>   r,   r   r   r:   r:   `   s1   … ññ  HÔ-€Là/3Ð ¨¡Ó3Ø*.Ð˜5 4™<Ô.r   r:   Úexisting_optionsÚstatement_timeoutÚlock_timeoutc                 óp   ‡ — t        ˆ fd„d|fd|ffD «       «      }dj                  d„ ‰ g|¢­D «       «      S )a¡  Return the Postgres ``options`` value carrying the configured timeouts.

    Prisma has no URL parameter for `statement_timeout` / `lock_timeout`; they are
    server settings delivered through the standard libpq ``options`` parameter as
    ``-c <name>=<value>``. Values arrive in seconds (matching the sibling
    ``database_*_timeout`` settings) and are emitted as integer milliseconds,
    which is the unit Postgres assumes for a unit-less value.

    Both settings are bounds on how long a single statement may hold its locks.
    Without them a batch that outlives the Prisma client's HTTP read timeout keeps
    running server side, holding row locks for as long as the database takes,
    while the client has already given up; every later flush queues behind it.
    The query engine's own transaction timeout cannot end that wait, because it
    cannot interrupt a statement that is already executing.

    Any ``options`` the operator already pinned on the URL is preserved, and a
    setting they pinned there wins over the configured one. Postgres applies the
    last occurrence of a setting, so a pinned one is honoured by not appending
    ours at all; it is matched in every spelling the backend accepts
    (``-c name=``, ``-cname=``, ``--name=``). The result is applied to
    ``DATABASE_URL`` only, never ``DIRECT_URL``: that one serves migrations,
    which legitimately run long and must not be cancelled mid-way.
    c              3   óª   •K  — | ]J  \  }}|�Ct        j                  dt        j                  |«      › d�‰«      sd|› dt        |dz  «      › �–— ŒL y ­w)Nz(?:-c\s*|--)ú=z-c iè  )ÚreÚsearchÚescapeÚint)Ú.0ÚnameÚsecondsrC   s      €r   ú	<genexpr>z,_pg_options_with_timeouts.<locals>.<genexpr>‰   s]   øè ø€ ò áˆD�'ð Ð¤r§y¡y°LÄÇÁÈ4ÃÐ@QÐQRÐ1SÐUeÔ'fð ˆdˆV�1”S˜ 4™Ó(Ð)Ô*ñùs   ƒAArD   rE   ú c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­w©Nr,   )rM   Úparts     r   rP   z,_pg_options_with_timeouts.<locals>.<genexpr>‘   s   è ø€ ÒM˜TÊ”DÑMùs   ‚Š)ÚtupleÚjoin)rC   rD   rE   Ú
configureds   `   r   Ú_pg_options_with_timeoutsrX   m   sQ   ø€ ô8 ó ð !Ð"3Ð4Ø˜\Ð*ð
ôó €Jð �8‰8ÑMÐ&6Ð%D¸Ñ%DÔMÓMÐMr   ÚurlÚkeyc           	      óÞ   — t        | t        «      r| dk(  ryt        t        t	        j
                  t	        j                  | «      j                  «      j                  |«      xs d«      d«      S )zFReturn a single query-param value already present on ``url``, else "".Ú r,   )Ú
isinstanceÚstrÚnextÚiterÚurlparseÚparse_qsÚqueryÚget)rY   rZ   s     r   Ú_url_query_valuere   ”   sU   € ä�cœ3Ô 3¨"¢9ØÜ””X×&Ñ&¤x×'8Ñ'8¸Ó'=×'CÑ'CÓD×HÑHÈÓMÒSÐQSÓTÐVXÓYÐYr   Úvaluec                 ó  ‡— t        j                   | «      }t        ˆfd„t        j                  |j                  «      D «       «      ‰|ffz   }t        j                  |j                  t        j                  |«      ¬«      «      S )z?Return ``url`` with a single query param replaced by ``value``.c              3   ó8   •K  — | ]  \  }}|‰k7  sŒ||f–— Œ y ­wrS   r,   )rM   ÚkÚvrZ   s      €r   rP   z$_with_query_value.<locals>.<genexpr>ž   s"   øè ø€ ÒY¡D A qÐPQÐUXÓPX˜!˜QœÑYùs   ƒ‘	©rc   )ra   rU   Ú	parse_qslrc   Ú
urlunparseÚ_replaceÚ	urlencode)rY   rZ   rf   ÚparsedÚpairss    `   r   Ú_with_query_valuerr   ›   sh   ø€ ä×%Ñ% cÓ*€FÜÓY¬H×,>Ñ,>¸v¿|¹|Ó,LÔYÓYÐ^aÐchÐ]iÐ\kÑk€EÜ×Ñ˜vŸ™´X×5GÑ5GÈÓ5N˜ÓOÓPÐPr   r7   c                 óª  — ddl m} |j                  d| «       |j                  d|«       t        | t        «      r| dk(  r|j                  d«       yt        j                  | «      }t        j                  |j                  «      }|j                  |«       t        j                  |d¬«      }t        j                  |j                  |¬	«      «      }|S )
Nr   ©Úverbose_proxy_loggerzurl: %sz
params: %sr\   zLappend_query_params received empty or non-string URL, returning empty stringT)Údoseqrk   )Úlitellm._loggingru   Údebugr]   r^   Úwarningra   rb   rc   r6   ro   rm   rn   )rY   r7   ru   Ú
parsed_urlÚparsed_queryÚencoded_queryÚmodified_urls          r   Úappend_query_paramsr~   ¢   s³   € Ý5à×Ñ˜y¨#Ô.Ø×Ñ˜|¨VÔ4Ü�cœ3Ô 3¨"¢9ð 	×$Ñ$Ð%sÔtØÜ ×)Ñ)¨#Ó.€JÜ"×+Ñ+¨J×,<Ñ,<Ó=€LØ×Ñ˜ÔÜ#×-Ñ-¨lÀ$ÔG€MÜ"×-Ñ-¨j×.AÑ.AÈÐ.AÓ.VÓW€LØÐr   c                   óN  — e Zd Zed„ «       Zed„ «       Zededededeez  fd„«       Z	e	 	 	 d&deded	edz  d
edz  dedz  de
fd„«       Zede
dedz  deddfd„«       Zededz  de
fd„«       Zedeedz     defd„«       Zede
dedz  ddfd„«       Ze	 d'dededededededz  fd„«       Ze	 d'dededededz  dedz  dedz  dedz  dedz  ddfd„«       Ze	 	 d(dedededededededz  dedz  fd „«       Zed!„ «       Zed"„ «       Zed#„ «       Zeded$e
dz  ddfd%„«       Zy))ÚProxyInitializationHelpersc                  ót   — t         j                  j                  d«      } t        j                  d| › d�«       y )NÚlitellmz
LiteLLM: Current Version = ú
)Ú	importlibÚmetadataÚversionÚclickÚecho)Úpkg_versions    r   Ú_echo_litellm_versionz0ProxyInitializationHelpers._echo_litellm_versionµ   s.   € ä&×/Ñ/×7Ñ7¸	ÓBˆÜ�
‰
Ð2°;°-¸rÐBÕCr   c                 ó°   — t        d«       t        j                  d| › d|› d�¬«      }t        t        j                  |j                  «       d¬«      «       y )Nz)
LiteLLM: Health Testing models in configúhttp://ú:z/health)rY   é   )Úindent)ÚprintÚhttpxrd   ÚjsonÚdumps)ÚhostÚportÚresponses      r   Ú_run_health_checkz,ProxyInitializationHelpers._run_health_checkº   sA   € äÐ:Ô;ÜŸ)™)¨'°$°°q¸¸¸gÐ(FÔGˆÜŒd�j‰j˜Ÿ™›°Ô3Õ4r   r”   r•   ÚmodelÚtestc                 óZ  — |xs d}t        j                  d|› �«       dd l}d| › d|› �}t        |t        «      r|}nt        d«      ‚|j                  d|¬«      }|j                  j                  j                  |d	d
dœgd¬«      }t        j                  d|› �«       t        d|› �«       |j                  j                  j                  |d	d
dœgd¬«      }	|	D ]  }
t        j                  d|
› �«       Œ t        d«       |j                  j                  |d
¬«      }t        |«       y )Nzgpt-3.5-turbozE
LiteLLM: Making a test ChatCompletions request to your proxy. Model=r   rŒ   r�   zInvalid test valuez
My API Key)Úapi_keyÚbase_urlÚuserz*this is a test request, write a short poem)ÚroleÚcontenté   )r˜   ÚmessagesÚ
max_tokensz
LiteLLM: response from proxy zN
 LiteLLM: Making a test ChatCompletions + streaming r equest to proxy. Model=T)r˜   r¡   Ústreamz'LiteLLM: streaming response from proxy z$
 making completion request to proxy)r˜   Úprompt)r‡   rˆ   Úopenair]   r^   Ú
ValueErrorÚOpenAIÚchatÚcompletionsÚcreater�   )r”   r•   r˜   r™   Úrequest_modelr¥   Úapi_baseÚclientr–   Ústream_responseÚchunkÚcompletion_responses               r   Ú_run_test_chat_completionz4ProxyInitializationHelpers._run_test_chat_completionÀ   s^  € ð  %Ò7¨ˆÜ�
‰
Ð[Ð\iÐ[jÐkÔlÛà˜T˜F ! D 6Ð*ˆÜ�dœCÔ Ø‰HäÐ1Ó2Ð2ØŸ™¨lÀX˜ÓNˆà Ÿ+™+×1Ñ1×8Ñ8Øð #ØKñðð ð 9ó 	
ˆô 	�
‰
Ð4°X°JÐ?Ô@äÐ_Ð`mÐ_nÐoÔpà!'§¡×!8Ñ!8×!?Ñ!?Øð #ØKñðð ð "@ó 	"
ˆð %ò 	JˆEÜ�J‰JÐ@ÀÀÐHÕIð	JäÐ5Ô6Ø%+×%7Ñ%7×%>Ñ%>ØÐ(Tð &?ó &
Ðô 	Ð!Õ"r   NÚ
log_configÚkeepalive_timeoutÚtimeout_worker_healthcheckr   c                 óB  — ddl }ddl}ddl}ddlm} d| |dœ}	|�t        d|› �«       ||	d<   n|j                  r
 |«       |	d<   |�||	d<   |�Qd	|j                  |j                  j                  «      j                  v r||	d	<   |	S t        d
|j                  › d�«       |	S )z8
        Get the arguments for `uvicorn` worker
        r   N)Ú_get_uvicorn_json_log_configúlitellm.proxy.proxy_server:app)Úappr”   r•   zUsing log_config: r²   Útimeout_keep_aliver´   zd[1;33mLiteLLM Proxy: --timeout_worker_healthcheck requires uvicorn>=0.37.0, but installed uvicorn==ú. Ignoring the flag.[0m)ÚinspectÚuvicornr‚   rw   r¶   r�   Ú	json_logsÚ	signatureÚConfigÚ__init__Ú
parametersÚ__version__)
r”   r•   r²   r³   r´   r»   r¼   r‚   r¶   Úuvicorn_argss
             r   Ú_get_default_unvicorn_init_argsz:ProxyInitializationHelpers._get_default_unvicorn_init_argsò   sÖ   € ó 	ããÝAð 4ØØñ
ˆð
 Ð!ÜÐ& z lÐ3Ô4Ø)3ˆL˜Ò&Ø×Òá)EÓ)GˆL˜Ñ&ØÐ(Ø1BˆLÐ-Ñ.Ø%Ð1Ø+¨w×/@Ñ/@ÀÇÁ×AXÑAXÓ/Y×/dÑ/dÑdØ=W�Ð9Ñ:ð Ðô ðHØHO×H[ÑH[ÐG\ð ]0ð1ôð
 Ðr   rÃ   Úmax_requests_before_restartÚjitterc                 óÐ   — ddl }ddl}|€t        d«       yd|j                  |j                  j
                  «      j                  v r|| d<   yt        d|j                  › d�«       y)zb
        Stagger uvicorn worker restarts via limit_max_requests_jitter (uvicorn>=0.41.0).
        r   Nús[1;33mLiteLLM Proxy: --max_requests_before_restart_jitter has no effect without --max_requests_before_restart[0m
Úlimit_max_requests_jitterzl[1;33mLiteLLM Proxy: --max_requests_before_restart_jitter requires uvicorn>=0.41.0, but installed uvicorn==rº   )r»   r¼   r�   r¾   r¿   rÀ   rÁ   rÂ   )rÃ   rÅ   rÆ   r»   r¼   s        r   Ú"_apply_uvicorn_max_requests_jitterz=ProxyInitializationHelpers._apply_uvicorn_max_requests_jitter  sv   € ó 	ãà&Ð.ÜðOôð Ø&¨'×*;Ñ*;¸G¿N¹N×<SÑ<SÓ*T×*_Ñ*_Ñ_Ø8>ˆLÐ4Ò5äðDØDK×DWÑDWÐCXð Y,ð-õr   Úconfig_pathc                 óŠ  — t         j                  j                  t        j                  «       «      }|g}ddg}| r„t         j                  j                  | «      }t         j                  j	                  |«      }|r||k7  r|j                  |«       |j                  t         j                  j                  |«      «       d||dœS )zKBuild uvicorn reload kwargs so --reload also reacts to .env and YAML edits.z*.pyú.envT)ÚreloadÚreload_dirsÚreload_includes)r   r   r   Úgetcwdr   r   Úbasename)rË   ÚcwdrÏ   rÐ   Ú
config_absÚ
config_dirs         r   Ú_get_reload_optionsz.ProxyInitializationHelpers._get_reload_options8  sž   € ô —W‘W—_‘_¤R§Y¡Y£[Ó1ˆØ!˜Uˆð #)¨&Ð!1ˆÙÜ "§¡§¡°Ó <ˆJÜ "§¡§¡°
Ó ;ˆJÙ˜j¨CÒ/Ø×"Ñ" :Ô.Ø×"Ñ"¤2§7¡7×#3Ñ#3°JÓ#?Ô@àØ&Ø.ñ
ð 	
r   Úpathsc                 ó0  ‡‡— 	 ddl mŠ ddlm} | D �ch c]  }|sŒ ||«      j                  «       ’Œ }}|syt        ‰dd«      }|€*‰j                  Št        «       }ˆˆfd„}|‰_        |‰_	        |j                  |«       y# t        $ r Y yw xY wc c}w )	a9  Make uvicorn's StatReload reloader notice non-Python dev files
        (the --config YAML and .env).

        Uvicorn uses WatchFilesReload when the optional `watchfiles` package
        is installed, otherwise StatReload. StatReload hard-codes `*.py` in
        `iter_py_files()` and silently ignores `reload_includes`, so the
        kwargs from `_get_reload_options` alone don't trigger reloads on those
        files. We monkey-patch `iter_py_files` to also yield the given paths.

        Idempotent across calls and a no-op for the WatchFilesReload path.
        r   )Ú
StatReloadFr   Ú_litellm_patched_config_pathsNc              3   ó~   •K  —  ‰| «      E d {  –—†  ‰j                   D ]  }|j                  «       sŒ|–— Œ y 7 Œ+­wrS   )rÚ   Úexists)Úselfr   rÙ   Úoriginal_iters     €€r   Ú_iter_with_extrazRProxyInitializationHelpers._patch_statreload_extra_paths.<locals>._iter_with_extraj  s=   øè ø€ Ù(¨Ó.×.Ð.Ø&×DÑDò #�DØ—{‘{•}Ø"›
ñ#ð /ús   ƒ=�;�#=´=T)Úuvicorn.supervisors.statreloadrÙ   ÚImportErrorÚpathlibr   ÚresolveÚgetattrÚiter_py_filesÚsetrÚ   r6   )r×   r   ÚpÚresolvedÚpatched_pathsrß   rÙ   rÞ   s         @@r   Ú_patch_statreload_extra_pathsz8ProxyInitializationHelpers._patch_statreload_extra_pathsM  sž   ù€ ð	ÝAõ 	!à6;ÖA°ºq™4 ›7Ÿ?™?Õ,ÐAˆÐAÙØä 
Ð,KÈTÓRˆØÐ Ø#-×#;Ñ#;ˆMÜ›EˆMõ#ð (8ˆJÔ$Ø7DˆJÔ4à×Ñ˜XÔ&Øøô1 ò 	Ùð	üò
 Bs   „B ”BœBÂ	BÂBc                 ó2  — ddl m} | j                  t        j	                  |«      «       dt
        j                  d<   t
        j                  j                  t        j                  «       d«      }t        j                  ||g«       |j                  d«       y)a  Wire up --reload (dev only): watch *.py, the --config YAML, and .env,
        and signal reloaded workers to re-read .env with override so edits to
        existing keys actually take effect rather than staying masked by the
        value inherited from the reloader process.r   rt   ÚTrueÚLITELLM_DEV_ENV_HOT_RELOADrÍ   z¿LiteLLM --reload: worker processes re-read .env with override, so .env values win over shell-exported environment variables. Unset a key in .env to let a shell-exported value take precedence.N)rw   ru   r6   r€   rÖ   r   Úenvironr   rV   rÑ   rê   ry   )rÃ   rË   ru   Úenv_paths       r   Ú_configure_dev_reloadz0ProxyInitializationHelpers._configure_dev_reloadv  sp   € õ 	:à×ÑÔ6×JÑJÈ;ÓWÔXØ39Œ�
‰
Ð/Ñ0ÜŸ'™'Ÿ,™,¤r§y¡y£{°FÓ;ˆÜ"×@Ñ@À+ÈxÐAXÔYØ×$Ñ$ð=õ	
r   r¸   Ússl_certfile_pathÚssl_keyfile_pathÚciphersc                 óú   — ddl }ddlm} ddlm} t        d|› d|› d�«        |«       }	|› d|› �g|	_        |�+|�)t        d|› d	|› d
�«       ||	_        ||	_        |�||	_	        |j                   || |	«      «       y)z5
        Initialize litellm with `hypercorn`
        r   N)Úserve)r¿   ú)[1;32mLiteLLM Proxy: Starting server on r�   z using Hypercorn[0m
ú/[1;32mLiteLLM Proxy: Using SSL with certfile: ú and keyfile: ú[0m
)ÚasyncioÚhypercorn.asynciorõ   Úhypercorn.configr¿   r�   ÚbindÚcertfileÚkeyfileró   Úrun)
r¸   r”   r•   rñ   rò   ró   rú   rõ   r¿   Úconfigs
             r   Ú_init_hypercorn_serverz1ProxyInitializationHelpers._init_hypercorn_serverˆ  s§   € ó 	å+Ý+äÐ<¸T¸FÀ!ÀDÀ6ÐIbÐcÔdÙ›ˆØ˜˜q  Ð'Ð(ˆŒàÐ(Ð-=Ð-IÜØDÐEVÐDWÐWeÐfvÐewð  xAð  Bôð 0ˆFŒOØ-ˆFŒNØÐ"Ø!(�”ð 	�‰‘E˜#˜vÓ&Õ'r   Únum_workersÚgranian_runtime_threadsc                 ó€  — ddl m} ddlm}	 t	        d| › d|› d�«       |�t	        d«       |�t	        d	«       d
| |t        d|«      |	j                  ddœ}
|�||
d<   |�1|�/t	        d|› d|› d�«       t        |«      |
d<   t        |«      |
d<   n|€|�t        j                  d«      ‚ |di |
¤Žj                  «        y)zè
        Run the proxy with Granian (Rust-backed ASGI server, HTTP/1 + HTTP/2).

        Uses a string import path so workers load ``litellm.proxy.proxy_server:app``
        the same way as uvicorn's ``app=`` string target.
        r   )ÚGranian)Ú
Interfacesrö   r�   z using Granian[0m
Nz“[1;33mLiteLLM: --max_requests_before_restart is not supported by Granian (Granian uses workers_lifetime in seconds, not a per-request limit).[0m
zG[1;33mLiteLLM: --ciphers is not applied when using --run_granian.[0m
r·   é   T)ÚtargetÚaddressr•   ÚworkersÚ	interfaceÚ
websocketsÚruntime_threadsr÷   rø   rù   Ússl_certÚssl_keyzEBoth --ssl_certfile_path and --ssl_keyfile_path are required for SSL.r,   )Úgranianr  Úgranian.constantsr  r�   ÚmaxÚASGIr   r‡   ÚClickExceptionrõ   )r”   r•   r  rñ   rò   rÅ   ró   r  r  r  Úkwargss              r   Ú_init_granian_serverz/ProxyInitializationHelpers._init_granian_server©  s  € õ" 	$Ý0äÐ<¸T¸FÀ!ÀDÀ6ÐI`ÐaÔbØ&Ð2Üð`ôð ÐÜÐbÔcð 7ØØÜ˜1˜kÓ*Ø#Ÿ™Øñ)
ˆð #Ð.Ø(?ˆFÐ$Ñ%ØÐ(Ð-=Ð-IÜØDÐEVÐDWÐWeÐfvÐewð  xAð  Bôô "&Ð&7Ó!8ˆF�:ÑÜ $Ð%5Ó 6ˆF�9ÒØÐ*Ð.>Ð.JÜ×&Ñ&Ð'nÓoÐoáÑ�&Ñ×ÑÕ!r   Ú"max_requests_before_restart_jitterc           	      óð  ‡‡— t         j                  dk(  rnddl} G ˆfd„dj                  j                  j
                  «      }	t        d| › d‰› d|› d	�«       | › d‰› �|d
dddddœ}
|�||
d<   |�|€t        d«       n||
d<   t         j                  j                  d«      rddl	m
Š ˆfd„}||
d<   |�|�t        d|› d|› d�«       ||
d<   ||
d<   t        «         |	||
¬«      j                  «        y)z-
        Run litellm with `gunicorn`
        Úntr   Nc                   ó0   •‡ — e Zd Zdˆ ˆfd„	Zd„ Zd„ Zˆ xZS )úNProxyInitializationHelpers._run_gunicorn_server.<locals>.StandaloneApplicationc                 óØ   •— |xs i | _         || _        t        ‰| �  «        d‰› d�}|dz   }t	        «        t	        d«       t	        d|› d�«       t	        d«       t	        d‰› d�«       y )	Nz curl --location 'http://0.0.0.0:z/chat/completions' \ai  
                --header 'Content-Type: application/json' \
                --data ' {
                "model": "gpt-3.5-turbo",
                "messages": [
                    {
                    "role": "user",
                    "content": "what llm are you"
                    }
                ]
                }'
                

                z’[1;34mLiteLLM: Test your local proxy with: "litellm --test" This runs an openai.ChatCompletion request to your proxy [In a new terminal tab][0m
z8[1;34mLiteLLM: Curl Command Test for your local proxy
 z [0m
z;[1;34mDocs: https://docs.litellm.ai/docs/simple_proxy[0m
z5[1;34mSee all Router/Swagger docs on http://0.0.0.0:)ÚoptionsÚapplicationÚsuperrÀ   r�   )rÝ   r¸   r  Ú_endpoint_strÚcurl_commandÚ	__class__r•   s        €€r   rÀ   zWProxyInitializationHelpers._run_gunicorn_server.<locals>.StandaloneApplication.__init__ð  sŒ   ø€ Ø&š}¨"�”Ø#&�Ô Ü‘Ñ Ô"à)IÈ$ÈÐOdÐ'e�à!ðñð ô  ”Üð pôô ÐTÐUaÐTbÐblÐmÔnÜÐZÔ[ÜÐPÐQUÐPVÐV`ÐaÕbr   c                 óZ  — | j                   �H| j                  j                  «       D ��ci c]"  \  }}|| j                   j                  v r|�||“Œ$ }}}ni }|j                  «       D ]<  \  }}| j                   €Œ| j                   j	                  |j                  «       |«       Œ> y c c}}w rS   )Úcfgr  ÚitemsÚsettingsræ   Úlower)rÝ   rZ   rf   r  s       r   Úload_configzZProxyInitializationHelpers._run_gunicorn_server.<locals>.StandaloneApplication.load_config  sž   € à—8‘8Ð'ð +/¯,©,×*<Ñ*<Ó*>÷á&˜C Ø $§(¡(×"3Ñ"3Ñ3¸Ð8Ið ˜U™
ð�Fò ð  �FØ"(§,¡,£.ò 9‘J�C˜Ø—x‘xÑ+ØŸ™Ÿ™ S§Y¡Y£[°%Õ8ñ9ùós   ª'B'c                 ó   — | j                   S rS   )r  )rÝ   s    r   ÚloadzSProxyInitializationHelpers._run_gunicorn_server.<locals>.StandaloneApplication.load  s   € à×'Ñ'Ð'r   rS   )r'   r(   r)   rÀ   r)  r+  Ú__classcell__)r#  r•   s   @€r   ÚStandaloneApplicationr  ï  s   ù„ öcò<9ö(r   r-  rö   r�   z with z workers[0m
zuvicorn.workers.UvicornWorkerTú-iX  z+%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s)rý   r  Úworker_classÚpreloadÚ	accesslogÚtimeoutÚaccess_log_formatÚmax_requestsrÈ   Úmax_requests_jitterÚPROMETHEUS_MULTIPROC_DIR)Úmark_worker_exitc                 ó*   •—  ‰|j                   «       y rS   )Úpid)ÚserverÚworkerr7  s     €r   Ú
child_exitzCProxyInitializationHelpers._run_gunicorn_server.<locals>.child_exit;  s   ø€ Ù  §¡Õ,r   r<  r÷   rø   rù   rþ   rÿ   )r¸   r  )r   rN   Úgunicorn.app.baser¸   ÚbaseÚBaseApplicationr�   rî   rd   Ú litellm.proxy.prometheus_cleanupr7  r   r   )r”   r•   r¸   r  rñ   rò   rÅ   r  Úgunicornr-  Úgunicorn_optionsr<  r7  s    `          @r   Ú_run_gunicorn_serverz/ProxyInitializationHelpers._run_gunicorn_serverÛ  sF  ù€ ô �7‰7�dŠ?Øã$ö/	( H§L¡L×$5Ñ$5×$EÑ$Eô /	(ôb 	Ð<¸T¸FÀ!ÀDÀ6ÈÐP[È}Ð\mÐnÔoà�f˜A˜d˜VÐ$Ø"Ø;ØØØØ!Nñ#
Ðð 'Ð2Ø/JÐ˜^Ñ,Ø-Ð9Ø*Ð2ÜðSõð
 ;]Ð Ð!6Ñ7ô �:‰:�>‰>Ð4Ô5ÝIô-ð .8Ð˜\Ñ*àÐ(Ð-=Ð-IÜØDÐEVÐDWÐWeÐfvÐewð  xAð  Bôð ,=Ð˜ZÑ(Ø*:Ð˜YÑ'ä!Ô#Ù #Ð/?Ô@×DÑDÕFr   c                  óæ   — 	 ddg} t        t        j                  d«      5 }t        j                  | ||¬«       d d d «       y # 1 sw Y   y xY w# t
        $ r}t        d|› d�«       Y d }~y d }~ww xY w)NÚollamarõ   Úw)ÚstdoutÚstderrzh
                LiteLLM Warning: proxy started with `ollama` model
`ollama serve` failed with Exceptionz-. 
Ensure you run `ollama serve`
            )Úopenr   ÚdevnullÚ
subprocessÚPopenÚ	Exceptionr�   )ÚcommandrJ  Úes      r   Ú_run_ollama_servez,ProxyInitializationHelpers._run_ollama_serveJ  s   € ð	Ø&¨Ð0ˆGä”b—j‘j #Ó&ð J¨'Ü× Ñ  °ÀÕI÷J÷ Jñ Jûäò 	Üð iØijÐhkð lð÷ ñ ûð	ús3   ‚A  A¹A ÁAÁA ÁA Á	A0ÁA+Á+A0c                 ó®   — dd l }|j                  |j                  |j                  «      5 }|j                  d| f«      dk(  cd d d «       S # 1 sw Y   y xY w)Nr   Ú	localhost)ÚsocketÚAF_INETÚSOCK_STREAMÚ
connect_ex)r•   rS  Úss      r   Ú_is_port_in_usez*ProxyInitializationHelpers._is_port_in_useV  sJ   € ãà�]‰]˜6Ÿ>™>¨6×+=Ñ+=Ó>ð 	:À!Ø—<‘< ¨dÐ 3Ó4¸Ñ9÷	:÷ 	:ò 	:ús   «AÁAc                  ó*   — t         j                  dv ryy)zBHelper function to determine the event loop type based on platform)Úwin32ÚcygwinÚcliNÚuvloop)r   Úplatformr,   r   r   Ú_get_loop_typez)ProxyInitializationHelpers._get_loop_type]  s   € ô �<‰<Ð5Ñ5ØØr   Úlitellm_settingsc                 óª  — ddl }| dk  s|€y|j                  d«      xs g }|j                  d«      xs g }|j                  d«      xs g }t        |t        «      r|g}t        |t        «      r|g}t        |t        «      r|g}||z   |z   }d|vryddlm} t        j                  j                  d	«      xs t        j                  j                  d
«      }| }	|sAt        j                  j                  |j                  «       d«      }|t        j                  d	<   t        j                  |d¬«        ||«       |	rdnd}
t        d|
› d|› �«       y)z�
        Auto-create PROMETHEUS_MULTIPROC_DIR when running with multiple workers
        and prometheus is configured as a callback.
        r   Nr  Ú	callbacksÚsuccess_callbackÚfailure_callbackÚ
prometheus)Úwipe_directoryr6  Úprometheus_multiproc_dirÚlitellm_prometheus_multiprocT)Úexist_okzAuto-createdzUsing existingz	LiteLLM: z PROMETHEUS_MULTIPROC_DIR=)Útempfilerd   r]   r^   r@  rf  r   rî   r   rV   Ú
gettempdirÚmakedirsr�   )r  r`  rj  rb  Úsuccess_callbacksÚfailure_callbacksÚall_callbacksrf  Úmultiproc_dirÚauto_createdÚactions              r   Ú%_maybe_setup_prometheus_multiproc_dirz@ProxyInitializationHelpers._maybe_setup_prometheus_multiproc_dird  sI  € ó 	à˜!ÒÐ/Ð7Øð %×(Ñ(¨Ó5Ò;¸ˆ	Ø,×0Ñ0Ð1CÓDÒJÈÐØ,×0Ñ0Ð1CÓDÒJÈÐÜ�i¤Ô%Ø"˜ˆIÜÐ'¬Ô-Ø!2Ð 3ÐÜÐ'¬Ô-Ø!2Ð 3ÐØ(Ð+<Ñ<Ð?PÑPˆØ˜}Ñ,ØåCäŸ
™
Ÿ™Ð'AÓBÒpÄbÇjÁjÇnÁnÐUoÓFpˆà"/Ð/ˆÙÜŸG™GŸL™L¨×)<Ñ)<Ó)>Ð@^Ó_ˆMØ5BŒB�J‰JÐ1Ñ2ä
�‰�M¨DÕ1Ù�}Ô%Ù*6™Ð<LˆÜ�	˜&˜Ð!;¸M¸?ÐKÕLr   )NNNrS   )NN)r'   r(   r)   ÚstaticmethodrŠ   r—   r^   rL   Úboolr±   ÚdictrÄ   rÊ   rÖ   r   rê   rð   r   r  r  rC  rP  rX  r_  rs  r,   r   r   r€   r€   ´   sX  „ ØñDó ðDð ñ5ó ð5ð
 ð/#Øð/#àð/#ð ð/#ð �S‰jò	/#ó ð/#ðb ð "&Ø(,Ø15ñ'Øð'àð'ð ˜$‘Jð'ð  ™:ð	'ð
 %(¨$¡Jð'ð 
ò'ó ð'ðR ðØðà%(¨4¡Zðð ðð 
ò	ó ðð6 ð
¨¨t©ð 
¸ò 
ó ð
ð( ð&¨X°c¸D±jÑ-Að &Àdò &ó ð&ðP ð
¨Dð 
¸sÀT¹zð 
Èdò 
ó ð
ð" ð #ñ(Øð(àð(ð ð(ð ð	(ð
 ð(ð �t‘ò(ó ð(ð@ ð /3ñ/"Øð/"àð/"ð ð/"ð  ™:ð	/"ð
  ™*ð/"ð &)¨4¡Zð/"ð �t‘ð/"ð "% t¡ð/"ð 
ò/"ó ð/"ðb ð 37Ø9=ñlGØðlGàðlGð ðlGð ð	lGð
 ðlGð ðlGð &)¨4¡ZðlGð -0°$©JòlGó ðlGð\ ñ	ó ð	ð ñ:ó ð:ð ñó ðð ð(MØð(Mà ™+ð(Mð 
ò(Mó ñ(Mr   r€   Úcli_argséÿÿÿÿ)Únargsz--hostz0.0.0.0z!Host for the server to listen on.ÚHOST)ÚdefaultÚhelpÚenvvarz--porté   zPort to bind the server to.ÚPORTz--num_workerszÜNumber of worker processes for uvicorn / gunicorn, or Granian worker processes (--workers). Default is 1 (from DEFAULT_NUM_WORKERS_LITELLM_PROXY). With --run_granian, use --granian_threads for runtime threads per worker.ÚNUM_WORKERSz--granian_threadsr  )Úminz•Only with --run_granian: runtime threads per worker process (Granian --runtime-threads / GRANIAN_RUNTIME_THREADS). Omit to use Granian's default (1).ÚGRANIAN_RUNTIME_THREADS)r{  Útyper|  r}  z
--api_basezAPI base URL.)r{  r|  z--api_versionz$For azure - pass in the api version.z--modelz-mz)The model name to pass to litellm expectsz--aliaszŸThe alias for the model - use this to give a litellm model name (e.g. "huggingface/codellama/CodeLlama-7b-Instruct-hf") a more user-friendly name ("codellama")z	--add_keyz	--headerszheaders for the API callz--saveTzSave the model-specific config)Úis_flagrƒ  r|  z--debugzTo debug the inputÚDEBUG)r{  r„  rƒ  r|  r}  z--detailed_debugzTo view detailed debug logsÚDETAILED_DEBUGz--use_queuez)To use celery workers for async endpoints)r{  r„  rƒ  r|  z--temperaturezSet temperature for the model)r{  rƒ  r|  z--max_tokenszSet max tokens for the modelz--request_timeoutz+Set timeout in seconds for completion callsz--drop_paramszDrop any unmapped params)r„  r|  z--add_function_to_promptz5If function passed but unsupported, pass it as promptz--configz-cz]Path to the proxy configuration file (e.g. config.yaml). Usage `litellm --config config.yaml`z--max_budgetz`Set max budget for API calls - works for hosted models like OpenAI, TogetherAI, Anthropic, etc.`z--telemetryzZHelps us know if people are using this feature. Turn this off by doing `--telemetry False`z--log_configz&Path to the logging configuration filez--setupzRRun the interactive setup wizard to configure providers and generate a config file)r„  r{  r|  z	--versionz-vzPrint LiteLLM versionz--healthz:Make a chat/completions request to all llms in config.yaml)Ú
flag_valuer|  z--testz4proxy chat completions url to make a test request toz--test_asyncz9Calls async endpoints /queue/requests and /queue/response)r{  r„  r|  z--iam_token_db_authz!Connects to RDS DB with IAM tokenz--azure_postgresql_authzIConnects to Azure Database for PostgreSQL with a Microsoft Entra ID tokenz--num_requestsr%   z-Number of requests to hit async endpoint withz--run_gunicornzTStarts proxy via gunicorn, instead of uvicorn (better for managing multiple workers)z--run_hypercornz@Starts proxy via hypercorn, instead of uvicorn (supports HTTP/2)z--run_granianzpStarts proxy via Granian (Rust ASGI server) instead of uvicorn. Requires Python 3.10+ and the `granian` package.z--ssl_keyfile_pathz^Path to the SSL keyfile. Use this when you want to provide SSL certificate when starting proxyÚSSL_KEYFILE_PATHz--ssl_certfile_pathz_Path to the SSL certfile. Use this when you want to provide SSL certificate when starting proxyÚSSL_CERTFILE_PATHz	--ciphersz!Ciphers to use for the SSL setup.z--use_prisma_db_pushzHUse prisma db push instead of prisma migrate for database schema updatesz--localzfor local debuggingz--skip_server_startupzASkip starting the server after setup (useful for migrations only)z--keepalive_timeoutzSSet the uvicorn keepalive timeout in seconds (uvicorn timeout_keep_alive parameter)ÚKEEPALIVE_TIMEOUTz--timeout_worker_healthcheckzñSet the uvicorn worker health-check timeout in seconds (uvicorn timeout_worker_healthcheck parameter). Requires uvicorn>=0.37.0. Only applies when running uvicorn directly with --num_workers>1; ignored under --run_gunicorn / --run_hypercorn.ÚTIMEOUT_WORKER_HEALTHCHECKz--max_requests_before_restartz]Restart worker after this many requests (uvicorn: limit_max_requests, gunicorn: max_requests)ÚMAX_REQUESTS_BEFORE_RESTARTz$--max_requests_before_restart_jittera   Stagger worker restarts by adding a random amount in [0, jitter] to --max_requests_before_restart so workers do not recycle at the same time (uvicorn: limit_max_requests_jitter, requires uvicorn>=0.41.0; gunicorn: max_requests_jitter). Has no effect without --max_requests_before_restart.Ú"MAX_REQUESTS_BEFORE_RESTART_JITTERz--limit_concurrencyaY  Set uvicorn's concurrency limit. Uvicorn counts both active tasks and accepted connections and returns HTTP 503 after the limit is reached. Idle connections can consume capacity, so use upstream connection/header timeouts and per-client connection limits. Only applies to uvicorn (ignored under --run_gunicorn / --run_hypercorn / --run_granian).ÚLIMIT_CONCURRENCYz --enforce_prisma_migration_checkz7Exit with error if database migration fails on startup.ÚENFORCE_PRISMA_MIGRATION_CHECK)r„  r{  r|  r}  z--use_v2_migration_resolverzÒOpt into the v2 migration resolver. Avoids the diff-and-force recovery path that can cause schema thrashing during rolling deploys where two LiteLLM versions contend for the same DB. Default is the v1 resolver.ÚUSE_V2_MIGRATION_RESOLVERz--reloadzŸEnable uvicorn hot reload (dev only). Also reloads when the --config YAML file changes. Incompatible with --num_workers>1, --run_gunicorn, and --run_hypercorn.Úazure_postgresql_authÚuse_prisma_db_pushr  Úlimit_concurrencyÚenforce_prisma_migration_checkÚuse_v2_migration_resolverrÎ   c1           
      óD  — | rš| dk(  rnddl m}1  |1«       }2|2j                  «       }3t        j                  d|2j
                  › d�«       |3j                  d«      rt        j                  d|3d   › d�«       y t        j                  dd	j                  | «      › �«      ‚|rdd
l	m
}4  |4«        y t        «       }5|rddlm}6m}7m}8m}9 n	 ddlm}6m}7m}8m}9 |du rt(        j+                  «        y |rd|v r|€t(        j-                  «        |du rt(        j/                  ||«       y |du rt(        j1                  ||||«       y |rt3        j4                  |«      } |9dpi d|“d|“d|“d|“d|
“d|“d|“d|“d|“d|“d|“d|“d|“d|“d |	“d!|“d"|“Ž |"r	 dd l};n	 dd l}<d%}=d&}>d }?d }@d'}Ad }Bd }Cd }Di }Edd(lm}F dd)l m!}Gm"}Hm#}I |xs  ItI        jJ                  H«      |H¬*«      }J|xs  ItI        jJ                  G«      |G¬*«      }KJrd+tH        jL                  H<   Krd+tH        jL                  G<   JsKrFjO                  «       jQ                  «        dd,l)m*}L tI        jJ                  d-d «      �JtI        jJ                  d-«      d+k(  r2 L«       }M|MjW                  «       D ]  \  }N}O|OtH        jL                  |N<   Œ d }P|��Ð	 	 dd l,}Q |7«       }RQj[                  |Rj]                  |¬/«      «      }S|Sj                  d0d «      }P|P�'d1Pv r#Pd1   du rdd l/}Td|T_0         |Tjb                  «        Sj                  d2i «      }E|E€i }EEj                  d3d «      }U|U�dd l/}T |6dpi U¤Ž|T_2        Er%Ej                  d4d «      }VRjg                  |V|¬5«       Ej                  d6d «      }W|W€7tI        jJ                  d7«      €"dd8l4m5}X  |X«       }W|WrWtH        jL                  d7<   Ej                  d9tl        jn                  jp                  «      }=|Ej                  d:«      }>|>€Ej                  d;«      }>|>€tl        jr                  jp                  }>Ej                  d<«      }?|Ej                  d=«      }@|Ej                  d>d'«      }Ytu        |Yt&        «      rdd?l;m<}Z  |ZY«      du }Ant{        Y«      }AEj                  d@«      }Bt|        j                  |E«      }[|[j€                  }C|[j‚                  }DWr‹Wj…                  dA«      rztI        j†                  «       }\tˆ        jŠ                  j�                  dtH        jŠ                  j�                  dB«      «       dd l/}TddCl/mH}]  |]Wd ¬D«      }WtI        j’                  |\«       W�#tu        Wt&        «      rWtH        jL                  d7<   |€7tI        jJ                  d7«      €"dd8l4m5}X  |X«       }W|WrWtH        jL                  d7<   |€4tl        jn                  jp                  }=tl        jr                  jp                  }>tI        jJ                  d7d «      €tI        jJ                  dEd «      ��TddFlmJ}^mK}_mL}`mM}a dGD ]a  }btI        jJ                  |b«      }c|c€Œ `c«      }d|d€Œ&t�        dH abd«      › dI�tˆ        jž                  d¬J«       t‰        j                   d«       Œc 	 ddKl;mQ}e t¥        |=|>|?@AB¬L«      }ftI        jJ                  d7d «      �b ed7d ¬D«      }W|Wrt'        W«      nd }gt§        t©        |gdM«      CD«      }h|grhrt«        gdMh«      ng}it­        |if«      }j|jtH        jL                  d7<   tI        jJ                  dEd «      �4tI        jJ                  dE«      }Wt­        |Wf«      }j|jtH        jL                  dE<   tI        jJ                  dN«      }k|krFt§        t©        kdM«      CD«      }l ^|lrt«        kdMl«      nk _f«      «      tH        jL                  dN<   t¯        jZ                  dOgd¬P«       d}mmr„ddQlYmZ}n ddRl[m\}om]}p  |pEj                  dS«      «      d'u r
 nd ¬T«       n^|/st�        dU«       	 oj½                  |' |/¬V«      }qqs:|.r!t�        dY«       t‰        j                   d«       nt�        dZ«       nt�        d[«       |d\k(  r+t(        jÁ                  |«      rtÃ        jÄ                  d]d^«      }dd l/}T|du r TjÆ                  «        dd_ldm}8 t(        jË                  ||rPnd ¬`«       |(rt�        da«       y | d'u xr |!d'u }rt(        jÍ                  |||&|)|rr|*nd ¬b«      }s|+�|+sdc<   | d'u r¢|!d'u rž|"d'u rš|-�|-sdd<   |,�t(        jÏ                  s|+|,¬e«       |$�|#�t�        df|$› dg|#› dh�«       |#sdi<   |$|sdj<   t(        jÑ                  «       }t|trtsdk<   |0rt(        jÓ                  s|«       |dkD  r
tÕ        «         <jZ                  dpi s¤dl|i¤Ž y | du rt(        j×                  |||8||$|#|+|,¬m«       y |!du rt(        jÙ                  |8|||$|#|%¬n«       y |"du rt(        jÛ                  ||||$|#|+|%|¬o«       y y # t"        $ r}:t#        d|:› d�«      ‚d }:~:wt$        $ r&}:dt'        |:«      v r|:‚ddlm}6m}7m}8m}9 Y d }:~:�	Œœd }:~:ww xY w# t$        $ r}:t%        d#«      |:‚d }:~:ww xY w# t:        $ r t%        d$«      ‚w xY w# t:        $ r t%        d.«      ‚w xY w# t°        $ r d'}mY �Œëw xY w# t¾        $ r@}:t�        dW|:› dI�tˆ        jž                  d¬J«       t‰        j                   dX«       Y d }:~:�ŒÞd }:~:ww xY w)qN)z	xai-oauthÚloginr   )ÚXAIOAuthAuthenticatorz1xAI OAuth login successful. Credentials saved to ú.Ú
expires_atzAccess token expires at zUnknown command: rQ   )Úrun_setup_wizard)ÚKeyManagementSettingsÚProxyConfigr¸   Úsave_worker_configr  zMissing dependency z$. Run `pip install 'litellm[proxy]'`zlitellm[proxy]TrE  r˜   Úaliasr¬   Úapi_versionrx   Údetailed_debugÚtemperaturer¢   Úrequest_timeoutÚ
max_budgetr"   Údrop_paramsÚadd_function_to_promptÚheadersÚsaver  Ú	use_queuezŒgranian must be installed to use --run_granian. Run `pip install granian` or `pip install 'litellm[proxy]'` (Granian requires Python 3.10+).zLuvicorn, gunicorn needs to be imported. Run - `pip install 'litellm[proxy]'`éd   r&   F)ÚDatabaseURLSettings)ÚAZURE_POSTGRESQL_AUTH_ENV_VARÚIAM_TOKEN_DB_AUTH_ENV_VARÚtoken_auth_flag_enabled)Úenv_varrì   )Údecrypt_env_varÚUSE_AWS_KMSz?yaml needs to be imported. Run - `pip install 'litellm[proxy]'`)Úconfig_file_pathr`  r½   Úgeneral_settingsÚkey_management_settingsÚkey_management_system)rµ  r²  Údatabase_urlÚDATABASE_URL)Ú$construct_database_url_from_env_varsr*   Údatabase_connection_timeoutr+   Údatabase_connect_timeoutÚdatabase_socket_timeoutÚ$database_disable_prepared_statements)Ústr_to_boolÚ database_extra_connection_paramszos.environ/z../..)Úget_secret_str)Údefault_valueÚ
DIRECT_URL)Úadd_missing_query_paramsÚreader_shareable_paramsÚunsupported_db_schemeÚunsupported_db_scheme_message)r·  rÁ  z[1;31mLiteLLM Proxy: z[0m)ÚfileÚflush)Ú
get_secret)r-   r.   r/   r0   r1   r2   r  ÚDATABASE_URL_READ_REPLICAÚprisma)Úcapture_output)Úcheck_prisma_schema_diff)ÚPrismaManagerÚshould_update_prisma_schemaÚdisable_prisma_schema_update)Údb_urlzé[1;33mLiteLLM Proxy: Using default (v1) migration resolver. If your deployment has seen schema thrashing during rolling deploys, try --use_v2_migration_resolver (safer: avoids the diff-and-force recovery that caused the thrash).[0m)Úuse_migrateÚuse_v2_resolverz9[1;31mLiteLLM Proxy: Database migration cannot proceed. é   z¢[1;31mLiteLLM Proxy: Database setup failed after multiple retries. The proxy cannot start safely. Please check your database connection and migration status.[0mz«[1;33mLiteLLM Proxy: Database migration failed but continuing startup. Set --enforce_prisma_migration_check or ENFORCE_PRISMA_MIGRATION_CHECK=true to exit on failure.[0mzYUnable to connect to DB. DATABASE_URL found in environment, but prisma package not found.r~  i   i À  )r¸   )r  r`  z>LiteLLM: Setup complete. Skipping server startup as requested.)r”   r•   r²   r³   r´   Úlimit_max_requestsr“  )rÃ   rÅ   rÆ   r÷   rø   rù   Ússl_keyfileÚssl_certfileÚloopr  )r”   r•   r¸   r  rñ   rò   rÅ   r  )r¸   r”   r•   rñ   rò   ró   )r”   r•   r  rñ   rò   rÅ   ró   r  r,   )nÚlitellm.llms.xai.oauthr˜  r—  r‡   rˆ   Ú	auth_filerd   Ú
UsageErrorrV   Úlitellm.setup_wizardr›  ÚlocalsÚproxy_serverrœ  r�  r¸   rž  ÚModuleNotFoundErrorrá   r^   r€   rŠ   rP  r—   r±   r’   Úloadsr  r¼   rM  Ú litellm.proxy.db.db_url_settingsr«  Úlitellm.proxy.db.token_authr¬  r­  r®  r   Úgetenvrî   Úfrom_envÚapply_writer_url_to_envÚ*litellm.secret_managers.aws_secret_managerr°  r&  rú   r   Ú
get_configr‚   r½   Ú_turn_on_jsonÚ_key_management_settingsÚinitialize_secret_managerÚlitellm.proxy.utilsr¸  r$   r*   rf   r+   r]   Úlitellm.secret_managers.mainr½  ru  r:   Úmodel_validater=   r>   Ú
startswithrÑ   r   r   Úinsertr   r¿  ÚchdirrÂ  rÃ  rÄ  rÅ  r�   rH  ÚexitrÈ  r8   rX   re   rr   r~   rK  ÚFileNotFoundErrorÚ litellm.proxy.db.check_migrationrÌ  Úlitellm.proxy.db.prisma_clientrÍ  rÎ  Úsetup_databaseÚRuntimeErrorrX  ÚrandomÚrandintÚ_turn_on_debugÚlitellm.proxy.proxy_serverrs  rÄ   rÊ   r_  rð   r   rC  r  r  )urw  r”   r•   r¬   r   r˜   rŸ  Úadd_keyr§  r¨  rx   r¡  r¢  r¢   r£  r¥  r¦  r  r¤  r"   r™   Úlocalr  Úgranian_threadsÚ
test_asyncÚiam_token_db_authr‘  Únum_requestsr©  ÚhealthÚsetupr†   Úrun_gunicornÚrun_hypercornÚrun_granianrò   rñ   ró   r²   r’  Úskip_server_startupr³   r´   rÅ   r  r“  r”  r•  rÎ   r˜  ÚauthenticatorÚ	auth_datar›  Úargsrœ  r�  r¸   rž  rO  r  r¼   Údb_connection_pool_limitÚdb_connection_timeoutÚdb_connect_timeoutÚdb_socket_timeoutÚdb_disable_prepared_statementsÚdb_extra_connection_paramsÚdb_statement_timeoutÚdb_lock_timeoutr³  r«  r¬  r­  r®  Úwants_rds_iamÚwants_azure_entrar°  Únew_env_varri   rj   r`  rú   Úproxy_configÚ_configr‚   r´  rµ  r¶  r¸  Ú_disable_prepared_statementsr½  Údb_timeoutsÚoriginal_dirr¿  rÂ  rÃ  rÄ  rÅ  Ú_db_envÚ_candidate_urlÚ_bad_schemerÈ  Úconnection_url_paramsÚresolved_urlÚ
pg_optionsÚ
writer_urlr}   Úread_replica_urlÚreader_optionsÚis_prisma_runnablerÌ  rÍ  rÎ  Úsetup_okÚrunning_uvicornrÃ   Ú	loop_typesu                                                                                                                        r   Ú
run_serverr&  �  sg  € ñN
 ØÐ-Ò-ÝDá#8Ó#:ˆMØ,×2Ñ2Ó4ˆIÜ�J‰JÐJÈ=×KbÑKbÐJcÐcdÐeÔfØ�}‰}˜\Ô*Ü—
‘
Ð5°iÀÑ6MÐ5NÈaÐPÔQØÜ×ÑÐ!2°3·8±8¸HÓ3EÐ2FÐGÓHÐHáÝ9áÔØä“(€DÙ÷	
ô 	
ð	÷ó ð( �$�Ü"×8Ñ8Ô:ØÙ�˜UÑ" xÐ'7Ü"×4Ñ4Ô6Ø��~Ü"×4Ñ4°T¸4Ô@ØØˆt�|Ü"×<Ñ<¸TÀ4ÈÐPTÔUØáÜ—j‘j Ó)ˆGÙò 	
Ùð	
áð	
ñ ð	
ñ $ð		
ñ
 ð	
ñ *ð	
ñ $ð	
ñ "ð	
ñ ,ð	
ñ "ð	
ñ  ð	
ñ $ð	
ñ $:ð	
ñ ð	
ñ ð	
ñ  ð!	
ñ"  ñ#	
ñ& ðÜðrÛð $'Ð à46ÐØ15ÐØ04ÐØ/4Ð&Ø26Ð"Ø-1ÐØ(,ˆØÐõ 	I÷	
ñ 	
ð  1ò  
Ñ4KÜ�I‰IÐ/Ó0Ð:Sô5
ˆð $9ò $
Ñ<SÜ�I‰IÐ3Ó4Ð>[ô=
Ðñ Ø4:ŒB�J‰JÐ0Ñ1ÙØ8>ŒB�J‰JÐ4Ñ5ÙÑ-Ø×(Ñ(Ó*×BÑBÔDõ 	Oä�9‰9�] DÓ)Ð5¼"¿)¹)ÀMÓ:RÐV\Ò:\á!0Ó!2ˆKà#×)Ñ)Ó+ò "‘��1Ø !”—
‘
˜1’ð"ð  ÐØÑðð
eÛñ
 #.£-ˆLØ$Ÿ[™[¨×)@Ñ)@ÐRXÐ)@Ó)YÓZˆGð  'Ÿ{™{Ð+=¸tÓDÐà Ð,ØÐ#3Ñ3Ø$ [Ñ1°TÑ9ãà$(�Ô!à%�×%Ñ%Ô'à&Ÿ{™{Ð+=¸rÓBÐØÐ'Ø#%Ð à-=×-AÑ-AÐB[Ð]aÓ-bÐ#Ø&Ð2Ûá3HÑ3cÐKbÑ3c�Ô0áà/?×/CÑ/CÐD[Ð]aÓ/bÐ%Ø×6Ñ6Ø*?ÐRXð 7ô ð ,×/Ñ/°ÀÓEˆLØÐ#¬¯	©	°.Ó(AÐ(IåTáCÓE�ÙØ1=”B—J‘J˜~Ñ.Ø'7×';Ñ';Ø0Ü-×LÑL×RÑRó(Ð$ð %5×$8Ñ$8Ð9VÓ$WÐ!Ø$Ð,Ø(8×(<Ñ(<Ð=_Ó(`Ð%Ø$Ð,Ü(E×(fÑ(f×(lÑ(lÐ%Ø!1×!5Ñ!5Ð6PÓ!QÐØ 0× 4Ñ 4Ð5NÓ OÐØ2B×2FÑ2FÐGmÐotÓ2uÐ(ÜÐ6¼Ô<ÝDá1<Ð=YÓ1ZÐ^bÐ1bÑ.ä15Ð6RÓ1SÐ.Ø)9×)=Ñ)=Ð>`Ó)aÐ&Ü!8×!GÑ!GÐHXÓ!YˆKØ#.×#IÑ#IÐ Ø)×?Ñ?ˆOÙ × 7Ñ 7¸Ô FÜ&(§i¡i£k�ä—‘—‘Ø”r—w‘w—‘ wÓ/ôó Ý2á-¨lÈ$ÔO�Ü—‘˜Ô&ØÐ'¬J°|ÄSÔ,IØ-9”—
‘
˜>Ñ*ð ˆ>œbŸi™i¨Ó7Ð?åPá?ÓAˆLÙØ-9”—
‘
˜>Ñ*ð ˆ>Ü'D×'cÑ'c×'iÑ'iÐ$Ü$A×$bÑ$b×$hÑ$hÐ!ä�9‰9�^ TÓ*Ð6¼"¿)¹)ÀLÐRVÓ:WÑ:c÷ó ð :ò  �Ü!#§¡¨7Ó!3�Ø!Ð)ØÙ3°NÓC�ØÑ*ÜØ3Ñ4QÐRYÐ[fÓ4gÐ3hÐhoÐpÜ ŸZ™ZØ"õô
 —H‘H˜Q•Kð ð6+ÝCä/NØ%=Ø!6Ø$6Ø#4Ø0NØ!;ô0Ð%ô —9‘9˜^¨TÓ2Ð>Ù#-¨nÈDÔ#Q�LÙKW´c¸,Ô6GÐ]a�LÜ-FÜ(¨°yÓAØ,Ø'ó.�Jñ (©Jô *¨,¸	À:ÔNà)ð ô
 $7Ø"Ø-ó$�Lð 2>”B—J‘J˜~Ñ.Ü—9‘9˜\¨4Ó0Ð<Ü#%§9¡9¨\Ó#:�LÜ#6°|ÐEZÓ#[�LØ/;”B—J‘J˜|Ñ,ô 79·i±iÐ@[Ó6\Ð Ù#Ü1JÜ(Ð)9¸9ÓEØ,Ø'ó2�Nñ
 ?Wá)ô *Ð*:¸IÀ~ÔVà-Ù/Ð0EÓFó	?”B—J‘JÐ:Ñ;ô —‘ ˜z¸$Õ?Ø%)Ð"ñ "ÝU÷ñ
 /Ð/?×/CÑ/CÐDbÓ/cÓdÐhmÑmÙ,°DÖ9á4ÜðVôð$Ø*7×*FÑ*FØ,>Ð(>Ø,Eð +Gó +˜ñ $Ù9Ü!ð!Dôô  ŸH™H Q�Kä!ð!Iõô
 Øoôð �4Š<Ô6×FÑFÀtÔLÜ—>‘> $¨Ó.ˆDãà˜TÑ!Ø"ˆG×"Ñ"Ô$õ 	3ô 	#×HÑHØ#Ù17Ñ-¸Tð 	Iô 	
ñ ÜÐRÔSØà!-°Ð!6Ò!Q¸=ÈEÐ;QˆÜ8×XÑXØØØ!Ø/ÙFUÑ(BÐ[_ð Yó 
ˆð 'Ð2Ø1LˆLÐ-Ñ.Ø˜5Ñ  ]°eÑ%;ÀÈuÑ@TØ Ð,Ø4E�Ð0Ñ1Ø1Ð=Ü*×MÑMØ!-Ø0KØ=ð Nô ð
 !Ð,Ð1AÐ1MÜØHÐIZÐH[Ð[iÐjzÐi{ð  |Eð  Fôð /?�˜]Ñ+Ø/@�˜^Ñ,ä9×HÑHÓJˆIÙØ'0�˜VÑ$áÜ*×@Ñ@ÀÈvÔVà˜QŠÜ)Ô+ØˆG�K‰Kñ Øñà#ôð ˜TÑ!Ü&×;Ñ;ØØØØ'Ø"3Ø!1Ø,GØ3Uð <õ 	ð ˜dÑ"Ü&×=Ñ=ØØØØ"3Ø!1Øð >õ ð ˜DÑ Ü&×;Ñ;ØØØ'Ø"3Ø!1Ø,GØØ(7ð <õ 	ð !øô #ò 	eÜ%Ð(;¸A¸3Ð>bÐ&cÓdÐdûÜò 	Ø¤3 q£6Ñ)à�÷÷ ñ ûð	ûô` ò Ü!ð7óð ð	ûðûô ò rÜ!Ð"pÓqÐqðrûôp ò eÜ!Ð"cÓdÐdðeûôL %ò +Ø%*Ó"ð+ûô2 (ò 
$ô
 ØZÐ[\ÐZ]Ð]dÐeÜ!$§¡Ø"&õô
 Ÿ™ Ÿšûð
$ús   Ãh* Æi7 Æj Ê:j, ÚEk à(k è*	i4è3iéi4éi/é/i4é7	jê jêjêj)ê,këkëkë	lë5lìlÚ__main__)r   N)NNFN)?r„   r’   r   rö  rI   rK  r   Úurllib.parseÚparsera   Úcollections.abcr   râ   r   Útypingr   r   r   r‡   r‘   Údotenvr	   Úpydanticr
   r   r‚   Úlitellm.constantsr   Ú$litellm.proxy.db.query_engine_reaperr   Úfastapir   r   r   r   rÑ   r   rB   râ  r    Úenumr!   r"   r$   rL   rA   ru  rv  r8   r:   r^   rX   re   rr   r~   r€   rN  ÚargumentÚoptionÚIntRangeÚAZURE_DEFAULT_API_VERSIONr&  r'   r,   r   r   ú<module>r6     sÆ  ðä Û Û 	Û Û 	Û Û 
Ý Ý $Ý ß ,Ñ ,ã Û Ý ß *ã Ý ?Ý JáÞà€Gó)ñ %Ô &Ø ‡�‡��	�—	‘	“Ô à*€�Ó *à�b—i‘i °Ó6€ˆeÓ 6Ø�5ÒÙ„MÝ à€	ˆ5Ó ô* Dô *ð %)Ø#'Ø(-Ø $ñ Øð à˜$‘,ð ð ˜T‘\ð ð ˜D‘Lð	 ð
 "&ð ð ˜‘+ð ð 
ó ôF
/˜iô 
/ð$NØð$Nà˜t‘|ð$Nð ˜$‘,ð$Nð 	ó	$NðNZ˜# ™*ð Z¨3ð Z°3ó ZðQ˜3ð Q Sð Q°ð Q¸ó Qð˜S 4™Zð °ð ¸#ó ÷$YMñ YMðx €‡�ƒØ€‡��
 "Ô%Ø€‡�ˆh 	Ð0SÐ\bÔcØ€‡�ˆh Ð+HÐQWÔXØ€‡�ØØ-ð	Tð ô	ð €‡�ØØØ	ˆ�‰˜AÔ	ð	dð %ô	ð €‡�ˆl D¨Ô?Ø€‡�ØØ×-Ñ-Ø	/ôð
 €‡�ˆi˜ tÐ2]Ô^Ø€‡�ØØð 
kôð
 €‡�ˆk 4Ð.YÔZØ€‡�ˆk 4Ð.HÔIØ€‡�ˆh ¨4Ð6VÔWØ€‡�ØØØØ	Ø	Øôð €‡�ØØØØ	Ø	&Øôð €‡�ØØØØ	Ø	4ôð €‡�ˆo t°%Ð>]Ô^Ø€‡�ˆn d°Ð;YÔZØ€‡�ØØØ	Ø	6ô	ð €‡�ˆo tÐ2LÔMØ€‡�ØØØ	@ôð
 €‡�ØØØØ	hô	ð €‡�ØØØ	Ø	kô	ð €‡�ØØØ	Ø	eô	ð €‡�ØØØ	Ø	1ô	ð €‡�ØØØØ	]ô	ð €‡�ØØØØØ	Ø	 ôð €‡�ØØØ	Eôð
 €‡�ØØØ	?ôð
 €‡�ØØØØ	Dô	ð €‡�ØØØØ	,ô	ð €‡�ØØØØ	Tô	ð €‡�ØØØ	Ø	8ô	ð €‡�ØØØØ	_ô	ð €‡�ØØØØ	Kô	ð €‡�ØØØð	;ôð €‡�ØØØ	Ø	iØôð €‡�ØØØ	Ø	jØôð €‡�ØØØ	Ø	,ô	ð €‡�ØØØØ	Sô	ð €‡�ˆi ¨uÐ;PÔQØ€‡�ØØØØ	Lô	ð €‡�ØØØ	Ø	^Øôð €‡�Ø"ØØ	ð	:ð (ô
ð €‡�Ø#ØØ	Ø	hØ(ôð €‡�Ø*ØØ	ð	?ð
 0ôð €‡�ØØØ	ˆ�‰˜AÔ	ð	Lð ôð €‡�Ø&ØØØ	BØ+ôð €‡�Ø!ØØð	Pð 'ô
ð €‡�ØØØð 
kô	ð~ð6  ð7~ðP ðQ~ðZ ),¨d©
ð[~ð\ ˜T‘zð]~ð^ %)ð_~ð`  $ða~ðb òc~óó
óóóóó
óóó Róóóóóóóóóóóóóóóóóóóóó Nóó [ó _óóóó Xó Jó [óó _óó @ó	ó	ó Yó dó &ó ðh~ðB ˆzÒÙ…Lð r   