
    AHjA              /       	   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZmZmZ d dlZd dlZd dl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ej2                  j5                   ej6                                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e#   de$de#fdZ% G d d      Z& ejN                          ejP                  dddd       ejP                  dddd       ejP                  dedd       ejP                  ddd !       ejP                  d"ejR                  d#!       ejP                  d$d%dd&!       ejP                  d'dd(!       ejP                  d)dd&!       ejP                  d*dd+!       ejP                  d,d-e*d./       ejP                  d0d1d-e*d2d34       ejP                  d5d1d-e*d6d74       ejP                  d8d1d-e*d9:       ejP                  d;de+d<=       ejP                  d>de,d?=       ejP                  d@de,dA=       ejP                  dBd-dCD       ejP                  dEd-dFD       ejP                  dGdHddI!       ejP                  dJde+dK=       ejP                  dLd-e*dM=       ejP                  dNde#dO=       ejP                  dPd-d1dQR       ejP                  dSdTd1d-e*dU:       ejP                  dVd-dWX       ejP                  dYd-dZX       ejP                  d[d1d-d\]       ejP                  d^d1d-d_]       ejP                  d`dae,db=       ejP                  dcd1d-dd]       ejP                  ded1d-df]       ejP                  dgde#dhdij       ejP                  dkde#dldmj       ejP                  dnde#do=       ejP                  dpd-d1dqR       ejP                  drd-d1dsR       ejP                  dtd-d1duR       ejP                  dvde,dwdxj       ejP                  dyde,dzd{j       ejP                  d|d-d1d}d~      de*de*fd                                                                                                                                                                                                                                                                                               Z-e.dk(  r e-        yy)    N)TYPE_CHECKINGAnyOptionalUnion)load_dotenv)!DEFAULT_NUM_WORKERS_LITELLM_PROXY)get_secret_bool)FastAPIz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     O/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/proxy/proxy_cli.pyr   r   $   s    %'"')$r   r   urlparamsreturnc                    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: zparams:  zLappend_query_params received empty or non-string URL, returning empty stringT)doseq)query)litellm._loggingr   debug
isinstancestrwarningurlparseparse_qsr!   update	urlencode
urlunparse_replace)r   r   r   
parsed_urlparsed_queryencoded_querymodified_urls          r   append_query_paramsr1   )   s    5se}-&23c33"9 	$$Z	
 ""3'J$$Z%5%56L&&|4@M&&z':':':'OPLr   c                   P   e Zd Zed        Zed        Zededededee	ef   fd       Z
e	 	 ddeded	ee   d
ee   def
d       Ze	 ddedededededee   fd       Ze	 ddededededededee   fd       Zed        Zed        Zed        Zededee   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.    ((00;

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)r      )indent)printhttpxgetjsondumps)hostportresponses      r   _run_health_checkz,ProxyInitializationHelpers._run_health_checkC   sA    :;9974&$w!?@djj34r   rH   rI   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   )rL   messages
max_tokensz
LiteLLM: response from proxy zN
 LiteLLM: Making a test ChatCompletions + streaming r equest to proxy. Model=T)rL   rU   streamz'LiteLLM: streaming response from proxy z$
 making completion request to proxy)rL   prompt)r:   r;   openair$   r%   
ValueErrorOpenAIchatcompletionscreaterC   )rH   rI   rL   rM   request_modelrY   api_baseclientrJ   stream_responsechunkcompletion_responses               r   _run_test_chat_completionz4ProxyInitializationHelpers._run_test_chat_completionI   se    0

TUbTcd	
 	TF!D6*dC H122|hG;;**11 #K  2 	
 	

4XJ?@]^k]lm	
 !++1188 #K  9 	
 % 	JEJJ@HI	J56$0077(T 8 
 	!"r   N
log_configkeepalive_timeoutr   c                     ddl }ddlm} d| |d}|t        d|        ||d<   n|j                  r
 |       |d<   |||d<   |S )	z8
        Get the arguments for `uvicorn` worker
        r   N)_get_uvicorn_json_log_configzlitellm.proxy.proxy_server:app)apprH   rI   zUsing log_config: rf   timeout_keep_alive)r5   r"   ri   rC   	json_logs)rH   rI   rf   rg   r5   ri   uvicorn_argss          r   _get_default_unvicorn_init_argsz:ProxyInitializationHelpers._get_default_unvicorn_init_args   sk     	A 4

 !&zl34)3L&)E)GL&(1BL-.r   rj   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)Config)[1;32mLiteLLM Proxy: Starting server on r@   z using Hypercorn[0m
/[1;32mLiteLLM Proxy: Using SSL with certfile:  and keyfile: [0m
)asynciohypercorn.asynciors   hypercorn.configrt   rC   bindcertfilekeyfilerq   run)
rj   rH   rI   ro   rp   rq   ry   rs   rt   configs
             r   _init_hypercorn_serverz1ProxyInitializationHelpers._init_hypercorn_server   s     	++:4&$G`a	
 q'((-=-IDEVDWWefvew  xA  B 0FO-FN"!( 	E#v&'r   num_workersmax_requests_before_restartc           	         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         j                  j                  d      rddl	m
 fd}
|
|	d<   ||t        d| d| d       ||	d<   ||	d<    |||	      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super__init__rC   )selfrj   r   _endpoint_strcurl_command	__class__rI   s        r   r   zWProxyInitializationHelpers._run_gunicorn_server.<locals>.StandaloneApplication.__init__   s    &}"#&  " 7tf<QR  "    p RS_R``jk X NtfT^_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_configzZProxyInitializationHelpers._run_gunicorn_server.<locals>.StandaloneApplication.load_config   s    88' +/,,*<*<*>&C$(("3"338I U
F   F"(,,. 9JCxx+SYY[%89s   'B'c                     | j                   S r   )r   )r   s    r   loadzSProxyInitializationHelpers._run_gunicorn_server.<locals>.StandaloneApplication.load  s    '''r   r   )r   r   r   r   r   r   __classcell__)r   rI   s   @r   StandaloneApplicationr      s    $L9(r   r   ru   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|   workersworker_classpreload	accesslogtimeoutaccess_log_formatmax_requestsPROMETHEUS_MULTIPROC_DIR)mark_worker_exitc                 *     |j                          y r   )pid)serverworkerr   s     r   
child_exitzCProxyInitializationHelpers._run_gunicorn_server.<locals>.child_exit  s     ,r   r   rv   rw   rx   r}   r~   )rj   r   )osnamegunicorn.app.baserj   baseBaseApplicationrC   environrE    litellm.proxy.prometheus_cleanupr   r   )rH   rI   rj   r   ro   rp   r   gunicornr   gunicorn_optionsr   r   s    `         @r   _run_gunicorn_serverz/ProxyInitializationHelpers._run_gunicorn_server   s    77d?$7	(HLL$5$5$E$E 7	(r 	:4&$vk]Zkl	
 fAdV$";!N
 '2/J^, ::>>45I- .8\*(-=-IDEVDWWefvew  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ollamars   w)stdoutstderrzh
                LiteLLM Warning: proxy started with `ollama` model
`ollama serve` failed with Exceptionz-. 
Ensure you run `ollama serve`
            )openr   devnull
subprocessPopen	ExceptionrC   )commandr   es      r   _run_ollama_servez,ProxyInitializationHelpers._run_ollama_serve-  s    
	)Gbjj#& J'  IJ J J 	iijhk 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)rI   r   ss      r   _is_port_in_usez*ProxyInitializationHelpers._is_port_in_use;  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)sysplatformr   r   r   _get_loop_typez)ProxyInitializationHelpers._get_loop_typeB  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   N   	callbackssuccess_callbackfailure_callback
prometheus)wipe_directoryr   prometheus_multiproc_dirlitellm_prometheus_multiprocT)exist_okzAuto-createdzUsing existingz	LiteLLM: z PROMETHEUS_MULTIPROC_DIR=)tempfilerE   r$   r%   r   r   r   r   pathjoin
gettempdirmakedirsrC   )r   r   r   r   success_callbacksfailure_callbacksall_callbacksr   multiproc_dirauto_createdactions              r   %_maybe_setup_prometheus_multiproc_dirz@ProxyInitializationHelpers._maybe_setup_prometheus_multiproc_dirI  sV    	!/7 %((5;	,001CDJ,001CDJi%"I'-!2 3'-!2 3!$558II},C

'AB 
bjjnn&G
 )(GGLL##%'EM 6CBJJ12
MD1}%#/5E	&!;M?KLr   )NNr   )r   r   r   staticmethodr=   rK   r%   intr   boolre   r   dictrn   r
   r   r   r   r   r   r   r   r   r   r3   r3   =   s   D D 5 5
 3#3#3# 3# D#I	3# 3#j  %)+/	 SM $C=	
 
 6  "& ( ( (  ( 	 (
  ( # (  (D  6:lGlGlG lG 	lG
 lG lG &.c]lG lG\   : :   ,M,M"4.,M 
,M ,Mr   r3   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_workerszfNumber of uvicorn / gunicorn workers to spin up. Default is 1 (from DEFAULT_NUM_WORKERS_LITELLM_PROXY)NUM_WORKERSz
--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--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typer   z--debugFz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--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)r   r   r   r   z--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--max_requests_before_restartz]Restart worker after this many requests (uvicorn: limit_max_requests, gunicorn: max_requests)MAX_REQUESTS_BEFORE_RESTARTz --enforce_prisma_migration_checkz7Exit with error if database migration fails on startup.ENFORCE_PRISMA_MIGRATION_CHECK)r   r   r   r   use_prisma_db_pushenforce_prisma_migration_checkc(           
         |rddl m}(  |(        y t               })|rddlm}*m}+m},m}- n	 ddlm}*m}+m},m}- |du rt        j                          y |rd	|v r|t        j                          |du rt        j                  | |       y |du rt        j                  | |||       y |rt!        j"                  |      } |-d^i d
|d|d|d|d|	d|
d|d|d|d|d|d|d|d|d|d|d| 	 dd l}/d}0d}1i }2|st)        d      rddlm}3 t/        j0                  d       }4t/        j0                  d!      }5t/        j0                  d"      }6t/        j0                  d#      }7t/        j0                  d$      }8 |3|4|5|6%      }9d&|6 d'|9 d(|4 d'|5 d)|7 
}:|8r|:d*|8 z  }:|:t.        j2                  d+<   d,t.        j2                  d<   dd-lm}; t/        j0                  d.d       Jt/        j0                  d.      d,k(  r2 |;       }<|<j9                         D ]  \  }=}>|>t.        j2                  |=<    d }?|	 	 dd l}@ |+       }A@j=                  |Aj?                  |0            }B|BjA                  d1d       }?|?'d2|?v r#|?d2   du rdd l!}Cd|C_"         |CjF                          BjA                  d3i       }2|2i }2|2jA                  d4d       }D|Ddd l!}C |*d^i D|C_$        |2r%|2jA                  d5d       }EAjK                  |E|6       |2jA                  d7d       }F|F7t/        j0                  d+      "dd8l&m'}G  |G       }F|FrFt.        j2                  d+<   |2jA                  d9tP        jR                  jT                        }0|2jA                  d:tP        jV                  jT                        }1FrFjY                  d;      rzt/        jZ                         }Ht\        j^                  ja                  dt.        j^                  jc                  d<             dd l!}Cdd=l!m2}I  |IFd >      }Ft/        jf                  |H       F#ti        Ft              rFt.        j2                  d+<   |7t/        j0                  d+      "dd8l&m'}G  |G       }F|FrFt.        j2                  d+<   |4tP        jR                  jT                  }0tP        jV                  jT                  }1t/        j0                  d+d       t/        j0                  d?d       A	 dd@l5m6}J t/        j0                  d+d       ;|0|1dA}K Jd+d >      }Fto        |Frt        F      nd K      }L|Lt.        j2                  d+<   t/        j0                  d?d       9|0|1dA}Kt/        j0                  d?      }Fto        |F|K      }L|Lt.        j2                  d?<   tq        j<                  dBgdC       d}MMrsddEl:m;}N ddFl<m=}Om>}P  |P|2jA                  dG            dDu r
 Nd H       nMOj                  |# I      s:|'r!t        dJ       t]        j                  d       nt        dK       nt        dL       |dMk(  r+t        j                  |      rt        j                  dNdO      }dd l!}C|
du r Cj                          ddPlFm}, t        j                  ||r|?nd Q       |$rt        dR       y t        j                  | ||"|%S      }Q|&|&QdT<   |dDu rV|dDu rR| |t        dU|  dV| dW       |QdX<   | |QdY<   t        j                         }R|RrRQdZ<    |/j<                  d^i Qd[|i y |du rt        j                  | ||,|| ||&\       y |du rt        j                  |,| || ||!]       y y # t        $ r}.t        d|. d      d }.~.wt        $ r&}.dt        |.      v r|.ddlm}*m}+m},m}- Y d }.~.md }.~.ww xY w# t&        $ r t        d      w xY w# t&        $ r t        d/      w xY w# tr        $ r dD}MY ?w xY w)_Nr   )run_setup_wizard)KeyManagementSettingsProxyConfigrj   save_worker_configr   zMissing dependency z$. Run `pip install 'litellm[proxy]'`zlitellm[proxy]Tr   rL   aliasr`   api_versionr#   detailed_debugtemperaturerV   request_timeout
max_budget	telemetrydrop_paramsadd_function_to_promptheaderssaver   	use_queuezLuvicorn, gunicorn needs to be imported. Run - `pip install 'litellm[proxy]'`d   r   IAM_TOKEN_DB_AUTH)generate_iam_auth_tokenDATABASE_HOSTDATABASE_PORTDATABASE_USERDATABASE_NAMEDATABASE_SCHEMA)db_hostdb_portdb_userzpostgresql://r@   @/z?schema=DATABASE_URLTrue)decrypt_env_varUSE_AWS_KMSz?yaml needs to be imported. Run - `pip install 'litellm[proxy]'`)config_file_pathr   rl   general_settingskey_management_settingskey_management_system)r(  r%  database_url)$construct_database_url_from_env_varsr   r   zos.environ/z../..)get_secret_str)default_value
DIRECT_URL)
get_secret)connection_limitpool_timeoutprisma)capture_outputF)check_prisma_schema_diff)PrismaManagershould_update_prisma_schemadisable_prisma_schema_update)db_url)use_migratez[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   )rj   )r   r   z>LiteLLM: Setup complete. Skipping server startup as requested.)rH   rI   rf   rg   limit_max_requestsrv   rw   rx   ssl_keyfilessl_certfileloopr   )rH   rI   rj   r   ro   rp   r   )rj   rH   rI   ro   rp   rq   r   )Llitellm.setup_wizardr  localsproxy_serverr  r  rj   r  ModuleNotFoundErrorImportErrorr%   r3   r=   r   rK   re   rF   loadsuvicornr   r	    litellm.proxy.auth.rds_iam_tokenr  r   getenvr   *litellm.secret_managers.aws_secret_managerr#  r   ry   r   
get_configrE   r5   rl   _turn_on_json_key_management_settingsinitialize_secret_managerlitellm.proxy.utilsr*  r   r   r   r   
startswithgetcwdr   r   insertabspathr+  chdirr$   litellm.secret_managers.mainr.  r1   r   FileNotFoundError litellm.proxy.db.check_migrationr3  litellm.proxy.db.prisma_clientr4  r5  setup_databaserC   exitr   randomrandint_turn_on_debuglitellm.proxy.proxy_serverr   rn   r   r   r   )SrH   rI   r`   r	  rL   r  add_keyr  r  r#   r
  r  rV   r  r  r  r   r  r  rM   localr   
test_asynciam_token_db_authnum_requestsr  healthsetupr9   run_gunicornrun_hypercornrp   ro   rq   rf   r  skip_server_startuprg   r   r  r  argsr  r  rj   r  r   rC  db_connection_pool_limitdb_connection_timeoutr&  r  r  r  r  db_name	db_schematoken_db_urlr#  new_env_varkvr   ry   proxy_config_configr5   r'  r(  r)  r*  original_dirr+  r.  r   r0   is_prisma_runnabler3  r4  r5  rm   	loop_typesS                                                                                      r   
run_serverrt  y  s   j 98D	
 	
	 , $"88:U"x'7"446~"44T4@t|"<<T4PTUjj)G 	
	
	
 	
 $		

 	
 *	
 $	
 "	
 ,	
 "	
  	
 $	
 $:	
 	
 	
  !	
"  #	
&	 $'  " 0C D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'#% &6&:&:)4'# '23H 4-40  (8(<(<+T)% 66*?RX 7  ,//EL#		.(A(ITCE1=BJJ~.'7';';0-LLRR($ %5$8$82-NNTT%!  7 7 F!yy{rwww/ 2-l$O&'J|S,I-9

>* >bii7?P?AL-9

>* >-LLRR % .NNTT "
 IInd+7yyt,8+C99^T2> -E(=F $.nD#QL#6-9L)tV$L 2>BJJ~.99\40< -E(=F $&99\#:L#6|V#LL/;BJJ|,z$?%)" "U 0(,,-KL 
 -D9(77(:$: 8  :!!D  HHQK!!I
 o 4<6FFtL>>$.DT!"G""$ 	3 	#HH#17-T 	I 	
 P 1QQ!/	 R 
 '21LL-.5 ]e%; ,1A1MHIZH[[ijzi{  |E  F /?]+/@^,2AACI'0V$GKK # T!&;;'"3!1,G <  d"&=="3!1 >  #O
 # 	%%aS(LM   	3q6)  	^  	^ 	n  !U r % +%*"+sN   ] 5^, 4_ +C _ 	^)(]77^)^$$^),___+*_+__main__)/r7   rF   r   rW  r   r   urllib.parseparser'   typingr   r   r   r   r:   rD   dotenvr   r5   litellm.constantsr   rQ  r	   fastapir
   r   appendrM  config_filenamerE  litellm_modeenumr   r  r   r%   r   r1   r3   r   optionAZURE_DEFAULT_API_VERSIONr   floatr   rt  r   r   r   r   <module>r     s     	   
  6 6     ? 8G 			 #ryy/5M 	*D *
Xc] D S (yM yMx	 i&IRX h+HQWX-	q	 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 		,	 	S	 iu;PQ	L	 		^ #		h( &	B+OH IOP %)QO R N X J @ Y VOd zL r   