
    g,l              '          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	Z	d dl
mZ ej                  j                   ej                                dZ ej                   dd      Zedk(  r e        d dlmZ dZ G d de      Zd	efd
Zd Zd Z e	j4                          e	j6                  dddd       e	j6                  dddd       e	j6                  dddd       e	j6                  ddd       e	j6                  ddd       e	j6                  d d!dd"       e	j6                  d#dd$       e	j6                  d%dd"       e	j6                  d&dd'       e	j6                  d(d)ed*+       e	j6                  d,d-d)ed.d/0       e	j6                  d1d-d)ed2d30       e	j6                  d4d-d)ed56       e	j6                  d7ded89       e	j6                  d:ded;9       e	j6                  d<ded=9       e	j6                  d>d)d?@       e	j6                  dAd)dB@       e	j6                  dCdDddE       e	j6                  dFdedG9       e	j6                  dHd)edI9       e	j6                  dJdedK9       e	j6                  dLdMd-d)edN6       e	j6                  dOd)dPQ       e	j6                  dRd)dSQ       e	j6                  dTd-d)dUV       e	j6                  dWd-d)dXV       e	j6                  dYdZed[9       e	j6                  d\d-d)d]V       e	j6                  d^d-d)d_V       e	j6                  d`dedadbc       e	j6                  dddededfc       e	j6                  dgd)d-dhi      dj                                                                                                                                                                                                                                               Ze dkk(  r e        yy)l    N)load_dotenvzlitellm.secretsLITELLM_MODEDEV)Enumc                       e Zd ZdZdZy)LiteLLMDatabaseConnectionPool
   <   N)__name__
__module____qualname__database_connection_pool_limit database_connection_pool_timeout     L/var/www/openai/venv/lib/python3.12/site-packages/litellm/proxy/proxy_cli.pyr   r      s    %'"')$r   r   returnc                 d   ddl m} |j                  d|         |j                  d|        t        j                  |       }t        j                  |j
                        }|j                  |       t        j                  |d      }t        j                  |j                  |            }|S )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                      	 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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)commandr/   es      r   run_ollama_server6   *   sr    

W%"**c"gWWWE #"" 
eefdg h		
 	

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)portr9   ss      r   is_port_in_user?   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   zONumber of uvicorn / gunicorn workers to spin up. By default, 1 uvicorn is used.NUM_WORKERSz
--api_basezAPI base URL.)rA   rB   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typerB   z--debugFzTo debug the inputDEBUG)rA   rH   rI   rB   rC   z--detailed_debugzTo view detailed debug logsDETAILED_DEBUGz--use_queuez)To use celery workers for async endpoints)rA   rH   rI   rB   z--temperaturezSet temperature for the model)rA   rI   rB   z--max_tokenszSet max tokens for the modelz--request_timeoutz+Set timeout in seconds for completion callsz--drop_paramszDrop any unmapped params)rH   rB   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_valuerB   z--testz4proxy chat completions url to make a test request toz--test_asyncz9Calls async endpoints /queue/requests and /queue/response)rA   rH   rB   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)rA   rI   rB   rC   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)rH   rA   rB   c!           
      R  de t               }!|rddlm}"m}#m}$m}% n	 ddlm}"m}#m}$m}% |du r9t        j                  j                  d      }'t        j                  d|' d       y |rd	|v r
t                dd ld|du r*dd l}(dd led
|  d defd})|}*g }+ej!                         },|(j"                  j%                  |*      5 }-t'        |*      D ]"  }.|+j)                  |-j+                  |)             $ 	 d d d        |(j"                  j-                  |+       d}/d}0|+D ].  }1|1j/                         s|1j1                         |/dz  }/*|0dz  }00 ej!                         }2t3        d|2|,z
          t3        d       t3        d|*        t3        d|/        t3        d|0        y |durSt3        d       dj5                  d
|  d d      }3t3        t7        j8                  |3j7                         d             y |dur|xs d}4t        j                  d|4        dd l}5|du r	d
|  d n||5j=                  d      }6|6j>                  j@                  jC                  |4dddgd !      }3t        j                  d"|3        t3        d#|4        |6j>                  j@                  jC                  |4dddgd$      }3|3D ]  }7t        j                  d%|7         t3        d&       |6j@                  jC                  |4d'      }3t3        |3       y |rt7        jD                  |      } |%di d(|d)|d*d+|d,|	d-|
d.|d/|d0|d1|d2|d3|d4|d5|d6|d7|d8| 	 dd l#}8tH        jJ                  d9k(  rndd l&}9d;}:d<};i }<|rdd=l(m)}= tI        jT                  d>      }>tI        jT                  d?      }?tI        jT                  d@      }@tI        jT                  dA      }AtI        jT                  dB      }B |=|>|?|@C      }CdD|@ d|C dE|> d|? dF|A 
}D|BrDdGB z  }DDtH        jV                  dH<   dItH        jV                  dJ<   ddKl,m-}E tI        jT                  dLd       JtI        jT                  dL      dIk(  r2 E       }F|Fj]                         D ]  \  }G}H|HtH        jV                  |G<    |_	 	 dd l/}I |#       }JIja                  |Jjc                  |N            }K|Kj5                  dOd       }L|L&dPLv r"LdP   du rdd l2}Md|M_3        |Mji                          Kj5                  dQi       }<|<i }<|<r#|<j5                  dRd       }NJjk                  |N       |<j5                  dSd       }O|Odd l2}M |"di O|M_6        |<j5                  dTd       }P|P}tI        jT                  d>      }QtI        jT                  dU      }RtI        jT                  dV      }StI        jT                  dA      }T|Qr'Rr%Sr#Tr!dDR dS dEQ dFT }P|PtH        jV                  dH<   |<j5                  dWtn        jp                  jr                        }:|<j5                  dXtn        jt                  jr                        };PrPjw                  dY      rztI        jx                         }Utz        j|                  j                  dtH        j|                  j                  dZ             dd l2}Mdd[l2mA}V  |VPd \      }PtI        j                  |U       P#t        Pt              rPtH        jV                  dH<   tI        jT                  dHd       tI        jT                  d]d       	 dd^lDmE}W tI        jT                  dHd       .|:|;d_}X WdHd \      }Pt        |P|X      }Y|YtH        jV                  dH<   tI        jT                  d]d       9|:|;d_}XtI        jT                  d]      }Pt        |P|X      }Y|YtH        jV                  d]<   t        j`                  d`gda       d}ZZrddblImJ}[ ddclKmL}\  |\|<j5                  dd            du r
 [d e       nt'        d      D ]  }.tI        jx                         }UtH        j|                  j                  t              }]tH        j|                  j                  |]      }^tI        j                  |^       	 t        j`                  g df       	 tI        j                  U        n nt3        dj       dkk(  r!t              rt        j                  dldm      dd l2}M|
du rMj                          ddnlVm}$ do| dp}_| t3        dq|         | _dr<   nMjf                  rt3        ds       d _dr<   |du r<|du r8||t3        dt| du| dv       |_dw<   ||_dx<    |8j`                  di _dy|dz y |du r G fd{d|9j                  j                  j                        }`t3        d}|  d d~| d       |  d |dddddd}a||t3        dt| du| dv       |ad<   ||ad<    `|$a      ja                          y |du rsdd l/}IddlYmZ}b ddl[m\}c t3        d}|  d d        |c       }|  d g|_]        |"| t3        dt| du| dv       ||_^        ||__        Ija                   b|$|             y y # t        $ r&}&dt        |&      v r|&ddlm}"m}#m}$m}% Y d }&~&
d }&~&ww xY w# 1 sw Y   	xY w# tN        $ r t        d:      w xY w# tN        $ r t        dM      w xY w# t        $ r d}ZY $w xY w# t        j                  $ rB}&dd let3        dg|&        ej                  t        j                  ddhi             Y d }&~&nd }&~&ww xY w	 tI        j                  U       \# tI        j                  U       w xY w)Nr   )KeyManagementSettingsProxyConfigappsave_worker_configrF   zlitellm[proxy]Tlitellmz
LiteLLM: Current Version = 
r(   zhttp://:c                     ddddgd} j                  d|       }|j                         }	 	 |d   } | }j                  |      }|j                         }t        d	|       |d
   }|dk(  r|d    y t        d| d| d|        	j	                  d       o# t
        $ r}t        d|       Y d }~y d }~ww xY w)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)postr_   getr3   sleepr2   )
dataresponser    polling_urlpolling_responser`   r5   api_basehttpxtimes
          r   _make_openai_completionz+run_server.<locals>._make_openai_completion*  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 8%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       )indentrX   zE
LiteLLM: Making a test ChatCompletions request to your proxy. Model=z
My API Key)api_keybase_urlrY   z*this is a test request, write a short poemrZ      )r]   r^   
max_tokensz
LiteLLM: response from proxy zN
 LiteLLM: Making a test ChatCompletions + streaming r equest to proxy. Model=)r]   r^   streamz'LiteLLM: streaming response from proxy z$
 making completion request to proxy)r]   promptr]   aliasrj   api_versionr   detailed_debugtemperaturert   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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.rD   i   i   )rR   zlitellm.proxy.proxy_server:app)rR   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_certfileuvloop)loopworkersc                   0     e Zd Zd fd	Zd Zd Z xZS ))run_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' \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__r3   )selfrR   r   _endpoint_strcurl_command	__class__r=   s        r   r   z2run_server.<locals>.StandaloneApplication.__init__  s    #*=bDL'*D$G$& ;4&@UV " & !  G t VWcVddno \ RSWRXXbcr   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 N)cfgr   itemssettingssetlower)r   keyvaluer   s       r   load_configz5run_server.<locals>.StandaloneApplication.load_config  s    xx+ /3ll.@.@.B".B
U"dhh&7&77E<M  J.B  " "$&,lln
U88/ HHLLe< '5"s   'B'c                     | j                   S r   )r   )r   s    r   loadz.run_server.<locals>.StandaloneApplication.load  s    +++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)bindr   worker_classpreload	accesslogtimeoutaccess_log_formatcertfilekeyfile)rR   r   )r)   )Configz using Hypercorn[0m
r   )`localsproxy_serverrP   rQ   rR   rS   ImportErrorstr	importlibmetadataversionclickechor6   rk   
concurrentrl   futuresThreadPoolExecutorrangeappendsubmitwaitdonerb   r3   rd   r_   dumpsopenaiOpenAIchatcompletionscreateloadsuvicornr.   namegunicorn.app.baser2    litellm.proxy.auth.rds_iam_tokenr   getenvenviron*litellm.secret_managers.aws_secret_managerr   r   asynciorun
get_configrT   r   _turn_on_jsoninitialize_secret_manager_key_management_settingsr   r   r   r   
startswithgetcwdsyspathinsertabspathr   chdir
isinstancelitellm.secret_managers.mainr   r&   r0   FileNotFoundError litellm.proxy.db.check_migrationr   litellm.proxy.db.prisma_clientr   __file__dirnameCalledProcessErrorre   random	randranger?   randint_turn_on_debuglitellm.proxy.proxy_serverbaseBaseApplicationhypercorn.asyncior)   hypercorn.configr   r   r   r   )fr   r=   rj   rx   r]   rw   add_keyr   r   r   ry   rz   rt   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   argsrP   rQ   rR   rS   r5   pkg_versionr   rm   concurrent_callsr   
start_timeexecutor_successful_callsfailed_callsfutureend_timerg   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   rT   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   rk   rl   sf    ``                                                                                                 @@r   
run_serverrF  ?   s   B 8D	
 	
	 $ $((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)% 667LM&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!yy{rwww/ 2-l$O&'J|S,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>>$.DT!""$ 	3 4

 !&zl34)3L&@A)-L&5 ]e%; ,1A1MHIZH[[ijzi{  |E  F /?]+/@^,GKK #
 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*+) #S  	3q6)  	@
 
Z  	^ 	l  !U T % +%*"+8  *<< J'!GA3-0 JJv'7'7aa'HII	J JHH\2BHH\2sx   j 
1k/k 9k5 B3l "l	k'kkkk25l
llm428m/*n/m44nn&__main__)!r   r_   r.   r  r0   r  urllib.parseparser   r   dotenvr   r  r   r  config_filenamer   litellm_modeenumr   r}   r   r   r&   r6   r?   r4   optionboolfloatintrF  r   r   r   r   <module>rR     s     	   
    			 #ryy/5M 	*D *

 

6 i&IRX h+HQWX	Z	 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p, R N X J @ Y |p,f zL r   