
    ^hs              (       "   S SK r S SKrS SKrS SKrS SKrS SKrS SKJr  S SK	r	S SK
Jr  \R                  R                  \R                  " 5       5        Sr\R                   " SS5      r\S:X  a  \" 5         S SKJr  Sr " S S\5      rS	\4S
 jrS rS r\	R4                  " 5       \	R6                  " SSSSS9\	R6                  " SSSSS9\	R6                  " SSSSS9\	R6                  " SSSS9\	R6                  " SSSS9\	R6                  " S S!SS"S9\	R6                  " S#SS$S9\	R6                  " S%SS"S9\	R6                  " S&SS'S9\	R6                  " S(S)\S*S+9\	R6                  " S,S-S)\S.S/S09\	R6                  " S1S-S)\S2S3S09\	R6                  " S4S-S)\S5S69\	R6                  " S7S\S8S99\	R6                  " S:S\S;S99\	R6                  " S<S\S=S99\	R6                  " S>S)S?S@9\	R6                  " SAS)SBS@9\	R6                  " SCSDSSES9\	R6                  " SFS\SGS99\	R6                  " SHS)\SIS99\	R6                  " SJS\SKS99\	R6                  " SLSMS-S)\SNS69\	R6                  " SOS)SPSQ9\	R6                  " SRS)SSSQ9\	R6                  " STS-S)SUSV9\	R6                  " SWS-S)SXSV9\	R6                  " SYSZ\S[S99\	R6                  " S\S-S)S]SV9\	R6                  " S^S-S)S_SV9\	R6                  " S`S\SaSbSc9\	R6                  " SdS\SeSfSc9\	R6                  " SgS)S-ShSi9Sj 5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       5       r\ Sk:X  a  \" 5         gg)l    N)load_dotenvzlitellm.secretsLITELLM_MODEDEV)Enumc                       \ rS rSrSrSrSrg)LiteLLMDatabaseConnectionPool   
   <    N)__name__
__module____qualname____firstlineno__database_connection_pool_limit database_connection_pool_timeout__static_attributes__r       Q/home/james-whalen/.local/lib/python3.13/site-packages/litellm/proxy/proxy_cli.pyr   r      s    %'"')$r   r   returnc                 `   SSK Jn  UR                  SU  35        UR                  SU 35        [        R                  " U 5      n[        R                  " UR
                  5      nUR                  U5        [        R                  " USS9n[        R                  " UR                  US95      nU$ )Nr   )verbose_proxy_loggerzurl: zparams: T)doseq)query)
litellm._loggingr   debugurlparseparse_qsr   update	urlencode
urlunparse_replace)urlparamsr   
parsed_urlparsed_queryencoded_querymodified_urls          r   append_query_paramsr)      s    5se}-&23""3'J$$Z%5%56L&&|4@M&&z':':':'OPLr   c                       SS/n [        [        R                  S5       n[        R                  " XUS9  S S S 5        g ! , (       d  f       g = f! [
         a  n[        SU S35         S nAg S nAff = f)Nollamaservew)stdoutstderrzd
            LiteLLM Warning: proxy started with `ollama` model
`ollama serve` failed with Exceptionz). 
Ensure you run `ollama serve`
        )openosdevnull
subprocessPopen	Exceptionprint)commandr2   es      r   run_ollama_server9   *   sp    

W%"**c"gWWE #"" 
eefdg h		
 	

s1   A ?A 
A	A A 
A3A..A3c                     SS K nUR                  UR                  UR                  5       nUR                  SU 45      S:H  sS S S 5        $ ! , (       d  f       g = f)Nr   	localhost)socketAF_INETSOCK_STREAM
connect_ex)portr<   ss      r   is_port_in_userB   8   sA    	v~~v'9'9	:a||[$/0A5 
;	:	:s   A
Az--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_workers   z%Number of gunicorn workers to spin upNUM_WORKERSz
--api_basezAPI base URL.)rD   rE   z--api_versionz2024-07-01-previewz$For azure - pass in the api version.z--modelz-mz)The model name to pass to litellm expectsz--aliaszThe 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_flagtyperE   z--debugFzTo debug the inputDEBUG)rD   rK   rL   rE   rF   z--detailed_debugzTo view detailed debug logsDETAILED_DEBUGz--use_queuez)To use celery workers for async endpoints)rD   rK   rL   rE   z--temperaturezSet temperature for the model)rD   rL   rE   z--max_tokenszSet max tokens for the modelz--request_timeoutz+Set timeout in seconds for completion callsz--drop_paramszDrop any unmapped params)rK   rE   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	--versionz-vzPrint LiteLLM versionz--healthz:Make a chat/completions request to all llms in config.yaml)
flag_valuerE   z--testz4proxy chat completions url to make a test request toz--test_asyncz9Calls async endpoints /queue/requests and /queue/response)rD   rK   rE   z--iam_token_db_authz!Connects to RDS DB with IAM 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--ssl_keyfile_pathz^Path to the SSL keyfile. Use this when you want to provide SSL certificate when starting proxySSL_KEYFILE_PATH)rD   rL   rE   rF   z--ssl_certfile_pathz_Path to the SSL certfile. Use this when you want to provide SSL certificate when starting proxySSL_CERTFILE_PATHz--localzfor local debugging)rK   rD   rE   c!           
        ^^^j^k [        5       n!U(       a  SSKJn"Jn#Jn$Jn%Jn&Jn'Jn(J	n)  O SSKJn"Jn#Jn$Jn%Jn&Jn'Jn(J	n)  USL a:  [        R                  R                  S5      n+[        R                   " SU+ S35        g U(       a  S	U;   a  Tc
  [#        5         SS KmjUSL Ga3  SS Kn,SS KmkS
U  ST 3mUUjUk4S jn-Un./ n/TkR)                  5       n0U,R*                  R-                  U.S9 n1[/        U.5       H#  n2U/R1                  U1R3                  U-5      5        M%     S S S 5        U,R*                  R5                  U/5        Sn3Sn4U/ H7  n5U5R7                  5       (       d  M  U5R9                  5       b  U3S-  n3M2  U4S-  n4M9     TkR)                  5       n6[;        SU6U0-
   35        [;        S5        [;        SU. 35        [;        SU3 35        [;        SU4 35        g USLaN  [;        S5        TjR=                  S
U  ST S3S9n7[;        [>        R@                  " U7R?                  5       SS95        g USLGa  U=(       d    Sn8[        R                   " SU8 35        SS K!n9USL a	  S
U  ST 3mOUmU9RE                  STS9n:U:RF                  RH                  RK                  U8SSS./S S!9n7[        R                   " S"U7 35        [;        S#U8 35        U:RF                  RH                  RK                  U8SSS./SS$9n7U7 H  n;[        R                   " S%U; 35        M     [;        S&5        U:RH                  RK                  U8SS'9n7[;        U75        g U(       a  [>        RL                  " U5      nU)" S0 S(U_S)U_S*T_S+U_S,U	_S-U
_S.U_S/U_S0U_S1U_S2U_S3U_S4U_S5U_S6U_S7U_S8U_6   SS K'n<[P        RR                  S9:X  a  OSS K*n= S;n>S<n?0 n@U(       a  SS=K,J-nA  [P        R\                  " S>5      nB[P        R\                  " S?5      nC[P        R\                  " S@5      nD[P        R\                  " SA5      nE[P        R\                  " SB5      nFUA" UBUCUDSC9nGSDUD SUG SEUB SUC SFUE 3
nHUF(       a  WHSGWF 3-  nHWH[P        R^                  SH'   SI[P        R^                  SJ'   SSKK0J1nI  [P        R\                  " SLS 5      bN  [P        R\                  " SL5      SI:X  a4  WI" 5       nJUJRe                  5        H  u  nKnLUL[P        R^                  UK'   M     UGbG    SS K3nMU$" 5       nNWMRi                  UNRk                  USN95      nOUOR=                  SOS 5      nPUPb)  SPWP;   a#  WPSP   SL a  SS K6nQSUQl7        UQRq                  5         WOR=                  SQ0 5      n@U@c  0 n@W@(       a  W@R=                  SRS 5      nRURb  WRU#Rr                  Rt                  :X  a  U'" SSS9  OWRU#Rv                  Rt                  :X  a  U(" SST9  OWRU#Rx                  Rt                  :X  a  SSUK=J>nS  USR                  SSV9  OTWRU#R                  Rt                  :X  a  U&" SSW9  O3WRU#R                  Rt                  :X  a  SSXKBJCnT  UT" 5         O[        SY5      eW@R=                  SZS 5      nUUUb  SS K6nQU"" S0 WUD6UQlE        W@R=                  S[S 5      nVUVc  [P        R\                  " S>5      nW[P        R\                  " S\5      nX[P        R\                  " S]5      nY[P        R\                  " SA5      nZUW(       a6  WX(       a/  WY(       a(  WZ(       a!  SDWX SWY SEWW SFWZ 3nVUV[P        R^                  SH'   W@R=                  S^[        R                  Rt                  5      n>U@R=                  S_[        R                  Rt                  5      n?WV(       a  WVR                  S`5      (       ay  [P        R                  " 5       n[[        R                  R                  S[P        R                  R                  Sa5      5        SS K6nQSSbK6JOn\  U\" WVS Sc9nV[P        R                  " U[5        WVb(  [        WV[        5      (       a  WV[P        R^                  SH'   [P        R\                  " SHS 5      c  [P        R\                  " SdS 5      Gb   SSeKRJSn]  [P        R\                  " SHS 5      b+  U>U?Sf.n^W]" SHS Sc9nV[        UVU^5      n_U_[P        R^                  SH'   [P        R\                  " SdS 5      b:  U>U?Sf.n^[P        R\                  " Sd5      nV[        UVU^5      n_U_[P        R^                  Sd'   [        Rh                  " Sg/SSh9  Sn`W`(       a  SSiKWJXna  SSjKYJZnb  Ub" W@R=                  Sk5      5      SL a  Wa" S Sl9  O[/        S5       H  n2[P        R                  " 5       n[[P        R                  R                  [        5      nc[P        R                  R                  Uc5      nd[P        R                  " Ud5         [        Rh                  " / SmQ5         [P        R                  " U[5          O   O[;        Sq5        TSr:X  a'  [        T5      (       a  [        R                  " SsSt5      mSS K6nQU
SL a  WQR                  5         SSuKdJn%  U%U TSv.neU b  [;        SwU  35        U WeSx'   O!WQRn                  (       a  [;        Sy5        S WeSx'   USL a:  USL a5  Ub  Ub  [;        SzU S{U S|35        UWeS}'   UUeS~'   U<Rh                  " S0 WeD6  g USL a   " U4S jSW=R
                  R                  R                  5      nf[;        SU  ST SU S35        U  ST 3USSSSSS.ngUb  Ub  [;        SzU S{U S|35        UWgS'   UUgS'   Wf" U%WgS9Ri                  5         g USL au  SS K3nMSSKgJhnh  SSKiJjni  [;        SU  ST S35        Ui" 5       nU  ST 3/Ulk        Ub#  Ub   [;        SzU S{U S|35        UUll        UUlm        WMRi                  Wh" U%U5      5        g g ! [         a0  n*S[        U*5      ;   a  U*eSSKJn"Jn#Jn$Jn%Jn&Jn'Jn(J	n)   S n*A*GNS n*A*ff = f! , (       d  f       GN= f! [V         a    [        S:5      ef = f! [V         a    [        SM5      ef = f! [         a    Sn` GNPf = f! [        R                   a@  n*SS Kmk[;        SnU* 35        TkR                  [        R                  " SSoSp95         S n*A*OS n*A*ff = f [P        R                  " W[5        GM  ! [P        R                  " W[5        f = f)Nr   )KeyManagementSettingsKeyManagementSystemProxyConfigappload_aws_kmsload_from_azure_key_vaultload_google_kmssave_worker_configrI   zlitellm[proxy]Tlitellmz
LiteLLM: Current Version = 
r+   zhttp://:c                    > SSSS./S.n TR                  SU S9nUR                  5       n  US   nT U 3nTR                  U5      nUR                  5       n[        S	U5        US
   nUS:X  a  US     g [        SU SU SU 35        T	R	                  S5        Mq  ! [
         a  n[        SU5         S nAg S nAff = f)Ngpt-3.5-turbouserz!Write a short poem about the moonrolecontent)modelmessagesz!http://0.0.0.0:4000/queue/request)jsonr#   z
 RESPONSE FROM POLLING JOBstatusfinishedresultzPOLLING JOBz	
STATUS: z, 
 Response g      ?zgot exception in polling)postrf   getr6   sleepr5   )
dataresponser#   polling_urlpolling_responserg   r8   api_basehttpxtimes
          r   _make_openai_completion+run_server.<locals>._make_openai_completion6  s    (#0STD zz"EDzQH}}H"5/C%-Jse"4K',yy'=$'7'<'<'>$8:JK-h7F+(2%k]*VHNScRde JJsO  ! 4a8s   AB 6%B 
B='B88B=)max_workerszElapsed Time: zLoad test Summary:zTotal Requests: zSuccessful Calls: zFailed Calls: Fz)
LiteLLM: Health Testing models in configz/health)r#      )indentr_   zE
LiteLLM: Making a test ChatCompletions request to your proxy. Model=z
My API Key)api_keybase_urlr`   z*this is a test request, write a short poemra      )rd   re   
max_tokensz
LiteLLM: response from proxy zN
 LiteLLM: Making a test ChatCompletions + streaming r equest to proxy. Model=)rd   re   streamz'LiteLLM: streaming response from proxy z$
 making completion request to proxy)rd   promptrd   aliasrq   api_versionr   detailed_debugtemperaturer|   request_timeout
max_budget	telemetrydrop_paramsadd_function_to_promptheaderssaveconfig	use_queuentzLuvicorn, gunicorn needs to be imported. Run - `pip install 'litellm[proxy]'`d   r   )generate_iam_auth_tokenDATABASE_HOSTDATABASE_PORTDATABASE_USERDATABASE_NAMEDATABASE_SCHEMA)db_hostdb_portdb_userzpostgresql://@/z?schema=DATABASE_URLTrueIAM_TOKEN_DB_AUTH)decrypt_env_varUSE_AWS_KMSz?yaml needs to be imported. Run - `pip install 'litellm[proxy]'`)config_file_pathlitellm_settings	json_logsgeneral_settingskey_management_system)use_azure_key_vault)use_google_kms)AWSSecretsManagerV2)use_aws_secret_manager)use_aws_kms)GoogleSecretManagerz&Invalid Key Management System selectedkey_management_settingsdatabase_urlDATABASE_USERNAMEDATABASE_PASSWORDr   database_connection_timeoutzos.environ/z../..)get_secret_str)default_value
DIRECT_URL)
get_secret)connection_limitpool_timeoutprisma)capture_output)check_prisma_schema_diff)should_update_schemadisable_prisma_schema_update)db_url)r   dbpushz--accept-data-losszError:    )startstopzYUnable to connect to DB. DATABASE_URL found in environment, but prisma package not found.rG   i   i   )rV   )rV   hostr@   zUsing log_config: 
log_configz,Using json logs. Setting log_config to None.z/[1;32mLiteLLM Proxy: Using SSL with certfile: z and keyfile: z[0m
ssl_keyfilessl_certfilec                   <   >^  \ rS rSrSU U4S jjrS rS rSrU =r$ ))run_server.<locals>.StandaloneApplicationi  c                    > U=(       d    0 U l         Xl        [        TU ]  5         ST S3nUS-   n[	        5         [	        S5        [	        SU S35        [	        S5        [	        ST S35        g )	Nz curl --location 'http://0.0.0.0:z/chat/completions' \a  
                    --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super__init__r6   )selfrV   r   _endpoint_strcurl_command	__class__r@   s        r   r   2run_server.<locals>.StandaloneApplication.__init__  s    #*=bDL'*$G$& ;4&@UV " & !  G t VWcVddno \ RSWRXXbcr   c                 p   U R                   bO  U R                  R                  5        VVs0 s H'  u  pXR                   R                  ;   d  M   Uc  M%  X_M)     nnnO0 nUR                  5        H>  u  pU R                   c  M  U R                   R	                  UR                  5       U5        M@     g s  snnf N)cfgr   itemssettingssetlower)r   keyvaluer   s       r   load_config5run_server.<locals>.StandaloneApplication.load_config  s    xx+ /3ll.@.@.B".B
"hh&7&77 '<A 'CJ.B  " "$&,lln
88/ HHLLe< '5"s   B2B2B2c                     U R                   $ r   )r   )r   s    r   load.run_server.<locals>.StandaloneApplication.load  s    +++r   )r   r   r   )	r   r   r   r   r   r   r   r   __classcell__)r   r@   s   @r   StandaloneApplicationr     s    $ $L=, ,r   r   z)[1;32mLiteLLM Proxy: Starting server on z with z workers[0m
zuvicorn.workers.UvicornWorker-iX  z+%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s)bindworkersworker_classpreload	accesslogtimeoutaccess_log_formatcertfilekeyfile)rV   r   )r,   )Configz using Hypercorn[0m
r   )nlocalsproxy_serverrS   rT   rU   rV   rW   rX   rY   rZ   ImportErrorstr	importlibmetadataversionclickechor9   rr   
concurrentrs   futuresThreadPoolExecutorrangeappendsubmitwaitdoneri   r6   rk   rf   dumpsopenaiOpenAIchatcompletionscreateloadsuvicornr1   namegunicorn.app.baser5    litellm.proxy.auth.rds_iam_tokenr   getenvenviron*litellm.secret_managers.aws_secret_managerr   r   asynciorun
get_configr[   r   _turn_on_jsonAZURE_KEY_VAULTr   
GOOGLE_KMSAWS_SECRET_MANAGER-litellm.secret_managers.aws_secret_manager_v2r   load_aws_secret_managerAWS_KMSGOOGLE_SECRET_MANAGER-litellm.secret_managers.google_secret_managerr   
ValueError_key_management_settingsr   r   r   
startswithgetcwdsyspathinsertabspathr   chdir
isinstancelitellm.secret_managers.mainr   r)   r3   FileNotFoundError litellm.proxy.db.check_migrationr   litellm.proxy.db.prisma_clientr   __file__dirnameCalledProcessErrorrl   random	randrangerB   randint_turn_on_debuglitellm.proxy.proxy_serverbaseBaseApplicationhypercorn.asyncior,   hypercorn.configr   r   r   r   )lr   r@   rq   r   rd   r   add_keyr   r   r   r   r   r|   r   r   r   r   r   r   testlocalnum_workers
test_asynciam_token_db_authnum_requestsr   healthr   run_gunicornrun_hypercornssl_keyfile_pathssl_certfile_pathr   argsrS   rT   rU   rV   rW   rX   rY   rZ   r8   pkg_versionr   rt   concurrent_callsr   
start_timeexecutor_successful_callsfailed_callsfutureend_timern   request_modelr   clientchunkr  gunicorndb_connection_pool_limitdb_connection_timeoutr   r   r   r   r   db_name	db_schematoken_db_urlr   new_env_varkvr	  proxy_config_configr   r[   r   r   r   r   r   database_hostdatabase_usernamedatabase_passworddatabase_nameoriginal_dirr   r   r$   r(   is_prisma_runnabler   r   r  dnameuvicorn_argsr   gunicorn_optionsr,   r   rr   rs   sl    ``                                                                                                       @@r   
run_serverr]  ?   s   B 8D		
 		
 		
		 	 	4 $((00;

2;-rBCU"x'7TTF!D6*	@ ( YY[
22( 3 
+,x/FGH -
 	( F{{}}==?.$)$ A%L  99;x
2345"$ !1 234"#3"456|n-.U:;9974&$w!?9@djj3450

TUbTcd	
 	4< av.HH|hG;;**11 #K  2 	
 	

4XJ?@]^k]lm	
 ;;**11 #K  2 	
 EJJ@HI 56%%,,(T - 
 	hjj)G 	
	
	
 	
 $		

 	
 *	
 $	
 "	
 ,	
 "	
  	
 $	
 $:	
 	
 	
  !	
"  #	
&
	ww$( $'  " Pii0Gii0Gii0Gii0G		"34I+'E
 &gYaway'!G9UGXi[11)0BJJ~&.4BJJ*+ 	O IImT*6		-(F2 *+K#))+1 !

1 , 
 '=Lkk,"9"96"9"RSG  '{{+=tD ,#33$[1T9$(!%%'&{{+=rB'#% (8(<(<+T)% )4-.>>DDE 2dK.2E2P2P2V2VV't<-.AAGGH
 ,CC37 D  /2E2M2M2S2SS$6-.DDJJK ,-()QRR&6&:&:)4'# '23H 4-40 ,//EL# "		/ :$&II.A$B!$&II.A$B! "		/ : "))% &33D2EQGXFYYZ[hZiijkxjy#zL1=BJJ~.'7';';0-LLRR($ %5$8$8--NNTT%!  7 7 F F!yy{rwww/ 2-l$O&'J|S,I,I-9

>* IInd+7yyt,8+C99^T2> -E(=F $.nD#QL#6|V#LL1=BJJ~.99\40< -E(=F $&99\#:L#6|V#LL/;BJJ|,z$?%)" "UO )(,,-KL 
 -D9"1X (*yy{"$''//("; " 83&NN N " HH\2' &* o 4<N400>>$.DT!""$ 	3 

 !&zl34)3L&@A)-L&5 ]e%; ,1A1MHIZH[[ijzi{  |E  F /?]+/@^,KK','T!7,(9(9(I(I 7,r >tfAdV6R]Q^^op  &$(& ? %R  !,1A1MHIZH[[ijzi{  |E  F 0A ,.> +!!1ced"//>tfAdVKde XF"V1TF+,FK ,1A1MHIZH[[ijzi{  |E  F #4!1 KKc6*+) #W  	3q6)	 	 	 		H
 
Z  	^ 	l  !U X % +%*"+8  *<< J'!GA3-0 JJv'7'7aa'HII	J JHH\2BHH\2s~   o# (3p p2 3p2 9q 0B3q$ q7#
p-%pp 
p/2qq!$q43q47s6ss(ss((t __main__)!r   rf   r1   r&  r3   r  urllib.parseparser   r   dotenvr   r  r   r  config_filenamer  litellm_modeenumr   r   r   r   r)   r9   rB   r7   optionboolfloatintr]  r   r   r   r   <module>ri     s     	   
    		 #yy/5M 	*D *

 

6 i&IRX h+HQWX	0	 lD? 	/
 tT(S  
k
 $O k4.HIh46VW		 		& 		4 T4S Ds1O 		6	 ot2LM	@
 	h	 		k	 		e	 		1	 		  	E
 	?
 	D	 	,	 		8	 	_	 	K	 		i 		j iu;PQZ	, R N X J @ Y |Z	,z zL r   