
    h                         d dl Z d dlmZmZmZmZ d dlZd dlmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ dee   defd	Zdee   dee   fd
Zdee   deddfdZdee   defdZdede	dee   defdZdedeeef   fdZdedeeef   fdZy)    N)AnyDictListOptional)Request
UploadFilestatus)verbose_proxy_logger)ProxyException)
Deploymentrequestreturnc                 $  K   	 | i S t        |       }||S t        |       }|j                  dd      }d|v r"t        | j	                          d{         }n3| j                          d{   }|si }n	 t        j                  |      }t+        | |       |S 7 K7 0# t        j                  $ r}t        |t              r|j                  d      n|}ddl}|j                  dd|      }|j                  d	d|      }	 t        j                  |      }na# t        j                  $ rK t        j                   d
t#        |              t%        dt#        |       ddt&        j(                        w xY wY d}~d}~ww xY w# t        j                  t        j                  t$        f$ r'}t        j                   d
t#        |               d}~wt,        $ r0}t        j.                  dj1                  |             i cY d}~S d}~ww xY ww)z
    Safely read the request body and parse it as JSON.

    Parameters:
    - request: The request object to read the body from

    Returns:
    - dict: Parsed request data as a dictionary or an empty dictionary if parsing fails
    Nr   content-type formzutf-8r   z"[\uD800-\uDBFF](?![\uDC00-\uDFFF])z#(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]zInvalid JSON payload received: zInvalid JSON payload: invalid_request_errorrequest_body)messagetypeparamcode)r   parsed_bodyz*Unexpected error reading request body - {})_safe_get_request_parsed_body_safe_get_request_headersgetdictr   bodyorjsonloadsJSONDecodeError
isinstancebytesdecoderesubjsonr
   errorstrr   r	   HTTP_400_BAD_REQUEST_safe_set_request_parsed_body	Exception	exceptionformat)	r   _cached_request_body_request_headerscontent_typer   r   ebody_strr&   s	            i/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/proxy/common_utils/http_parsing_utils.py_read_request_bodyr6      s    D?I 0M0
  +''!:7!K'++NB?\!W\\^34K !'D  "(,,t"4K> 	&g;OU  4 ( --  8B$7Nt{{73TXH   "vv=r8 H  "vv>H H
&*jj&:// ,225TUXYZU[T\3]^,&<SVH$E!8"0!'!<!<	  $%B   &"8"8.I ""%DSVH#MN &&8??B	
 	s   HF HF H:F BF /B 0	F :B" F HF  F "F5AE?DE?AE77E?:F ?FF (H/"GH%HHHHHc                     | y t        | d      rQd| j                  v rCt        | j                  d   t              r&| j                  d   \  }}|D ci c]  }|||   
 c}S y c c}w )Nscoper   )hasattrr8   r#   tuple)r   accepted_keysr   keys       r5   r   r   ]   sj    !W]]*w}}]3U;%,]]=%A"{1>?#[%%?? @s   A"r   c                     	 | y t        |j                               |f| j                  d<   y # t        $ r.}t	        j
                  dj                  |             Y d }~y d }~ww xY w)Nr   z1Unexpected error setting request parsed body - {})r:   keysr8   r-   r
   debugr/   )r   r   r3   s      r5   r,   r,   j   sa    
?(-k.>.>.@(A;'Om$ 
""?FFqI	
 	

s   . (. 	A%$A  A%c                     	 | i S t        | j                        S # t        $ r0}t        j                  dj                  |             i cY d}~S d}~ww xY w)z7
    [Non-Blocking] Safely get the request headers
    Nz-Unexpected error reading request headers - {})r   headersr-   r
   r?   r/   )r   r3   s     r5   r   r   x   sS    ?IGOO$$ "";BB1E	
 		s     	A%A	AArequest_datafilerouter_model_namesc                 l   ddl m}m}m}m} |j
                  xs d}|dz  }d| vri | d<   || d   d<   d}	|W| d   |v rP	 |j                  | d         }
|
r8|
j                  ,|
j                  j                  |
j                  j                  }	|	pt        j                  d
||	       |s1 |d|j                  j                   t         j"                  dd      ||	kD  r! |d| d|	 dt         j"                  dd      y# t        $ r)}t        j                  d	t        |             Y d}~d}~ww xY w)z
    Check if any files passed in request are under max_file_size_mb

    Returns True -> when file size is under max_file_size_mb limit
    Raises ProxyException -> when file size is over max_file_size_mb limit or not a premium_user
    r   )CommonProxyErrorsr   
llm_routerpremium_useri   metadatafile_size_in_mbNmodel)model_group_namez%Got error when checking file size: %sz=Checking file size, file content size=%s, max_file_size_mb=%sz:Tried setting max_file_size_mb for /audio/transcriptions. bad_requestrC   )r   r   r   r   zGFile size is too large. Please check your file size. Passed file size: z MB. Max file size: z MBT)litellm.proxy.proxy_serverrF   r   rG   rH   size"get_deployment_by_model_group_namelitellm_paramsmax_file_size_mbr-   r
   r)   r*   r?   not_premium_uservaluer	   r+   )rB   rC   rD   rF   r   rG   rH   file_contents_sizefile_content_size_in_mbrR   
deploymentr3   s               r5   check_file_size_under_limitrX      s     a0K@%#%Z 2IL./,w"7;M"M	 ==!-g!6 >   --9-->>J#-#<#<#M#M  #""K#	

  TUfUwUwU}U}T~00"	  #%55 abyaz  {O  P`  Oa  ad  e00"	  5  	 &&7#a& 	s   AD 	D3
D..D3c                   K   | j                          d{   }t        |      }i }|j                         D ]B  \  }}|j                  d      r'|dd }|j	                  |g       j                  |       >|||<   D |S 7 hw)z
    Read form data from request

    Handles when OpenAI SDKs pass form keys as `timestamp_granularities[]="word"` instead of `timestamp_granularities=["word", "sentence"]`
    Nz[])r   r   itemsendswith
setdefaultappend)r   r   	form_dataparsed_form_datar<   rT   	clean_keys          r5   get_form_datarb      s      DT
I')oo'
U<<CRI''	26==eD$)S! (   s   BA?A)Bc                 `  K   | j                   j                  d      dk(  rt        |        d{   S | j                   j                  d      dk(  s| j                   j                  d      dk(  rt        |        d{   S t	        d| j                   j                  d             7 z7 -w)z5
    Read the request body and parse it as JSON.
    r   zapplication/jsonNzmultipart/form-dataz!application/x-www-form-urlencodedzUnsupported content type: )rA   r   r6   rb   
ValueErrorr   s    r5   get_request_bodyre      s      >*.@@'000N+/DD??~.2UU"7+++()<)<^)L(MN
 	
 1
 ,s"   -B.B*AB.>B,?,B.,B.)r(   typingr   r   r   r   r    fastapir   r   r	   litellm._loggingr
   litellm.proxy._typesr   litellm.types.routerr   r6   r   r   r,   r   r*   boolrX   rb   re        r5   <module>rn      s     , ,  / / 1 / +Nhw&7 ND Nb
8G+< 
$ 

g

 

x'8 T @@
@ S	@ 
	@F T#s(^ &
G 
S#X 
rm   