
    hR                        d dl Z d dlZd dlmZmZmZ d dlZd dlmZm	Z	m
Z
mZmZmZmZmZmZ d dlZd dlmZmZ d dlmZ d dlmZ d dl d dlmZ d d	lmZ d d
lmZ d dlm Z m!Z! d dl"m#Z# d dl$m%Z%m&Z&m'Z' ddl(m)Z)  e       Z*da+d Z,de-fdZ.de/dee0   fdZ1de0dee-   fdZ2dee#   de-dede&fdZ3dee#   dede'de de4de5e-   d e6dee-   de-de&fd!Z7e*jq                  d" e	e      gd#g$      e*jq                  d% e	e      gd#g$      e*jq                  d& e	e      gd#g$       ed'       ed()      d ed*)       e
d'       e	e      fd+ed,ede-d-e-d.ee-   de-d/ede4fd0                     Z9e*ju                  d1 e	e      gd#g$      e*ju                  d2 e	e      gd#g$      e*ju                  d3 e	e      gd#g$      d e	e      fd+ed,ed4e-d.ee-   de4f
d5                     Z;e*ju                  d6 e	e      gd#g$      e*ju                  d7 e	e      gd#g$      e*ju                  d8 e	e      gd#g$      d e	e      fd+ed,ed4e-d.ee-   de4f
d9                     Z<e*j{                  d6 e	e      gd#g$      e*j{                  d7 e	e      gd#g$      e*j{                  d8 e	e      gd#g$      d e	e      fd+ed,ed4e-d.ee-   de4f
d:                     Z>e*ju                  d" e	e      gd#g$      e*ju                  d% e	e      gd#g$      e*ju                  d& e	e      gd#g$       e	e      dddfd+ed,ede4d.ee-   d-ee-   dee-   fd;                     Z?y)<    N)Optionalcastget_args)		APIRouterDependsFileFormHTTPExceptionRequestResponse
UploadFilestatus)CreateFileRequestget_secret_str)verbose_proxy_logger)BaseFileEndpoints)*)user_api_key_auth)ProxyBaseLLMRequestProcessing))get_custom_llm_provider_from_request_body)ProxyLoggingis_known_model)Router)CREATE_FILE_REQUESTS_PURPOSEOpenAIFileObjectOpenAIFilesPurpose   )"_is_base64_encoded_unified_file_idc                    | y t        | t              st        d      | D ]\  }t        |t              s|j	                         D ]6  \  }}t        |t
              s|j                  d      s)t        |      ||<   8 ^ | ay )Nz3invalid files config, expected a list is not a listzos.environ/)	
isinstancelist
ValueErrordictitemsstr
startswithr   files_config)configelementkeyvalues       p/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/proxy/openai_files_endpoints/files_endpoints.pyset_files_configr-   2   st    ~fd#NOOgt$%mmo
UeS)e.>.>}.M#1%#8GCL .  L    custom_llm_providerc                 x    | dk(  ry t         t        d      t         D ]  }|j                  d      | k(  s|c S  y )N	vertex_aiz;files_settings is not set, set it on your config.yaml file.r/   )r'   r"   get)r/   settings     r,   get_files_provider_configr4   C   sH     k)VWW;;,-1DDN   r.   file_content_bytesreturnc                     	 | j                  d      }|j                         d   j                         }t        j	                  |      }|S # t        j
                  t        f$ r Y y w xY w)Nzutf-8r   )decode
splitlinesstripjsonloadsJSONDecodeErrorUnicodeDecodeError)r5   file_content
first_linejson_objects       r,   get_first_json_objectrB   Q   sg    	)009!,,.q1779
 jj,  "45 s   AA A'&A'rA   c                 T    | j                  di       xs i }|j                  d      }|S )Nbodymodel)r2   )rA   rD   rE   s      r,   get_model_from_json_objrF   ^   s*    ??62&,"DHHWELr.   
llm_routerrouter_model_create_file_requestc                 l   K   | t        dddi       | j                  dd|i| d {   }|S 7 w)N  error9LLM Router not initialized. Ensure models added to proxy.status_codedetailrE    )r
   acreate_file)rG   rH   rI   responses       r,   $_deprecated_loadbalanced_create_filerT   e   sT     
 T
 	
 -Z,,X<XCWXXHO Ys   )424purposeproxy_logging_objuser_api_key_dicttarget_model_names_listis_router_modelc	                   K   t         j                  du r|r|t        | ||       d {   }	|	S |r||j                  d      }
|
t	        dddd      | t	        dddd      t        |
t              st	        d	ddd      |
j                  | |||j                  |
       d {   }	|	S t        |      }||j                  |       |j                  dd        t        j                  di |d|i d {   }	|	S 7 7 \7 
w)NT)rG   rH   rI   managed_filesManaged files hook not foundNonerK   messagetypeparamcodeLLM Router not found-Managed files hook is not a BaseFileEndpoints)rG   create_file_requestrX   litellm_parent_otel_spanrW   )r/   r/   rQ   )litellm'enable_loadbalancing_on_batch_endpointsrT   get_proxy_hookProxyExceptionr    r   rR   parent_otel_spanr4   updatepop)rG   rI   rU   rV   rW   rX   rY   rH   r/   rS   managed_files_objllm_provider_configs               r,   route_create_filerp   v   sb     	774?$=!%!5
 
^ OU 
!-<<_M$ 6	   .	  +->? G	  +77! 4$;%6%G%G/ 8 
 
& O 8 3
 * ''(;<  !6= --n0DnZmnnO_
8
" os5   (D	DA=D	(D)AD	<D=D	D	D	z/{provider}/v1/filesfiles)dependenciestagsz	/v1/filesz/files. )defaultopenairequestfastapi_responsetarget_model_namesproviderfilec                   K   ddl m}m}	m}
m}m}m} i }	 |j                          d{   }|xs t        |        d{   xs d}|r|j                  d      ng }|D cg c]  }|j                          }}t        t              }||vrt        ddd	| d
| i      t        t        |      }i } ||| |	|||       d{   }|j                  ||j                   f}d}d}t"        j$                  du r't'        |      }|rt)        |      }t+        ||
      }t-        d)|t        t.        |      d|}t1        |
||||||||	       d{   }|t        dddi      t3        j4                  |j7                  |j9                  dd      d             |j;                  |||       d{   }|t=        |t>              r|}tA        |di       xs i }|j9                  dd      xs d}|j9                  dd      xs d}|j9                  dd      xs d}|jB                  jE                  tG        jH                  |||||tA        |dd                    |S 7 <7 'c c}w 7 7 7 # tJ        $ r}|jM                  |||!       d{  7   tO        jP                  d"jS                  tU        |                   t=        |t              r\tW        tA        |d#tU        |jX                              tA        |d$d%      tA        |d&d%      tA        |d'tZ        j\                        (      tU        |       }tW        tA        |d#|      tA        |d$d%      tA        |d&d%      tA        |d'd      (      d}~ww xY ww)*a  
    Upload a file that can be used across - Assistants API, Batch API 
    This is the equivalent of POST https://api.openai.com/v1/files

    Supports Identical Params as: https://platform.openai.com/docs/api-reference/files/create

    Example Curl
    ```
    curl http://localhost:4000/v1/files         -H "Authorization: Bearer sk-1234"         -F purpose="batch"         -F file="@mydata.jsonl"

    ```
    r   add_litellm_data_to_requestgeneral_settingsrG   proxy_configrV   versionNrw   rv   ,  rL   zInvalid purpose: z. Must be one of: rN   datarw   r   rW   r   r   FT)r5   )rA   )rE   rG   )r{   rU   )	rG   rI   rU   rV   rW   rX   rY   rH   r/   rK   z(Failed to create file. Please try again.litellm_call_idrt   successr   r   r   rW   rS   _hidden_paramsmodel_id	cache_keyapi_baseallowed_model_regionrW   r   r   r   r   model_regionrW   original_exceptionrequest_dataz@litellm.proxy.proxy_server.create_file(): Exception occured - {}r_   r`   r]   ra   rO   r^   rQ   )/litellm.proxy.proxy_serverr~   r   rG   r   rV   r   readr   splitr:   r   r   r
   r   filenamecontent_typerg   rh   rB   rF   r   r   r   rp   asynciocreate_taskupdate_request_statusr2   post_call_success_hookr    r   getattrheadersrl   r   get_custom_headers	Exceptionpost_call_failure_hookr   	exceptionformatr%   rj   rP   r   HTTP_400_BAD_REQUEST) rw   rx   rU   ry   rz   r/   r{   rW   r~   r   rG   r   rV   r   r   r?   rX   rE   valid_purposes	file_datarH   rY   json_objrI   rS   	_responsehidden_paramsr   r   r   e	error_msgs                                    r,   create_filer      s    P  DA "YY[( >wOO 	 .@$$S)R 	  ?V"VU5;;="V"V ""45.(0	9KNK[\  )73 1-/%
 
 ]]L$2C2CD	 '+::dB,MH68L"0&:#  1  
D)Ew$O 
SW 
 +!!5//$;+% 3

 

 !KL 
 	33 $):B ?	 4 	
 ,BB):X C 
 
	  Z	;K%L H  *:B?E2 $$Z6<"!%%k48>B	 $$Z6<"  '')<<"3!#!$%68NPRS		
 M ) P #W$
6

2
.  66/ATX 7 
 	
 	
 	&&NUUA	

 a' 9c!((m<Q/a&1Qv/J/JK	  q6(I 9i8Q/a&1Qs3	 %s   NI8 I%I8 I(!I8 #I+:AI8 I0BI8 I3A"I8 8I69B+I8 $N%I8 (I8 +I8 3I8 6I8 8
NM?JC%M??NNz+/{provider}/v1/files/{file_id:path}/contentz /v1/files/{file_id:path}/contentz/files/{file_id:path}/contentfile_idc                 Z  K   ddl m}m}m}m}m}	 d|i}
	 t        |
      }|j                  | |||	||d       d{   \  }
}|xs t        |        d{   xs d	}t        |      }|r|j                  d
      }|t        dddd      |t        dddd      t        |t              st        dddd      t        t        t            |
j#                  d            }|r  |j$                  d(i ||d|
 d{   }nM |j$                  d(i ||j&                  |d|
 d{   }n"t)        j$                  d(i ||d|
 d{   }t+        j,                  |j/                  |
j#                  dd      d             t1        |di       xs i }|j#                  dd      xs d}|j#                  dd      xs d}|j#                  dd      xs d}|j2                  j5                  t        j6                  |||||	t1        |dd                   t1        |dd      }|t9        d |       t;        |j<                  |j>                  |j2                  !      S 7 )7 7 j7 B7 "# t@        $ r)}|jC                  |||
"       d{  7   tE        jF                  d#jI                  t!        |                   tE        jJ                  tM        jN                                t        |tP              r\t        t1        |d$t!        |jR                              t1        |d%d      t1        |d&d      t1        |d'tT        jV                              t!        |       }t        t1        |d$|      t1        |d%d      t1        |d&d      t1        |d'd            d}~ww xY ww))a  
    Returns information about a specific file. that can be used across - Assistants API, Batch API 
    This is the equivalent of GET https://api.openai.com/v1/files/{file_id}/content

    Supports Identical Params as: https://platform.openai.com/docs/api-reference/files/retrieve-contents

    Example Curl
    ```
    curl http://localhost:4000/v1/files/file-abc123/content         -H "Authorization: Bearer sk-1234"

    ```
    r   r   rG   r   rV   r   r   r   afile_contentrw   r   rW   r   rV   r   
route_typeNr   rv   r[   r\   r]   rK   r^   rc   rd   rE   )rE   r   r   rf   rG   r/   r   r   rt   r   r   r   r   r   r   r   r   rS   z3Invalid response - response.response is None - got )contentrO   r   r   zJlitellm.proxy.proxy_server.retrieve_file_content(): Exception occured - {}r_   r`   ra   rO   rQ   ),r   r   rG   r   rV   r   r    common_processing_pre_call_logicr   r   ri   rj   r    r   r   r   r%   r2   r   rk   rg   r   r   r   r   r   rl   r   r"   r   r   rO   r   r   r   r   r   debug	traceback
format_excr
   rP   r   r   )rw   rx   r   rz   rW   r   rG   r   rV   r   r   base_llm_response_processorlitellm_logging_objr/   is_base64_unified_file_idrn   rE   rS   r   r   r   r   httpx_responser   r   s                            r,   get_file_contentr   n  s,    F  W%DF&C&N# .NN-//%& O 
 
	
  >wOO 	 %Gw$O!$ 1 @ @ Q ($: 	  !$2 	  /1BC$K 	  #(9:E!9!9!9 "!&#* "  "A!2!@!@ "#*4E4V4V&0 	"  %22 +>&  H 	33 $):B ?	 4 	
  *:B?E2 $$Z6<"!%%k48>B	 $$Z6<"  '')<<"3!#!$%68NPRS		
 4;8ZQU3V!EhZP  "**&22"**
 	
E
 P>V  66/ATX 7 
 	
 	
 	&&X__A	

 	""9#7#7#9:a' 9c!((m<Q/a&1Qv/J/JK	  q6(I 9i8Q/a&1Qs3	 's   N+'I5 I&I5 I)B)I5 I,*I5 -I/."I5 I2DI5 %N+&I5 )I5 ,I5 /I5 2I5 5
N(?N#JDN##N((N+z#/{provider}/v1/files/{file_id:path}z/v1/files/{file_id:path}z/files/{file_id:path}c                   K   ddl m}m}m}m}m}	 i }
	 |xs t        |        d{   xs d} ||
| |||	|       d{   }
t        |      }|rg|j                  d      }|t        dd	d	d
      t        |t              st        dd	d	d
      |j                  ||j                         d{   }n t        j                  d||d|
 d{   }t        j                   |j#                  |
j%                  dd      d             t'        |di       xs i }|j%                  dd      xs d}|j%                  dd      xs d}|j%                  dd      xs d}|j(                  j+                  t-        j.                  |||||	t'        |dd                   |S 7 }7 f7 7 # t0        $ r)}|j3                  |||
       d{  7   t5        j6                  dj9                  t;        |                   t5        j<                  t?        j@                                t        |tB              r\t        t'        |dt;        |jD                              t'        |dd	      t'        |dd	      t'        |dtF        jH                              t;        |       }t        t'        |d|      t'        |dd	      t'        |dd	      t'        |dd
            d}~ww xY ww) a  
    Returns information about a specific file. that can be used across - Assistants API, Batch API 
    This is the equivalent of GET https://api.openai.com/v1/files/{file_id}

    Supports Identical Params as: https://platform.openai.com/docs/api-reference/files/retrieve

    Example Curl
    ```
    curl http://localhost:4000/v1/files/file-abc123         -H "Authorization: Bearer sk-1234"

    ```
    r   )r~   r   r   rV   r   r   Nrv   r   r[   r\   r]   rK   r^   rd   )r   rf   r   r   rt   r   r   r   r   r   r   r   r   r   Blitellm.proxy.proxy_server.retrieve_file(): Exception occured - {}r_   r`   ra   rO   rQ   )%r   r~   r   r   rV   r   r   r   ri   rj   r    r   afile_retrieverk   rg   r   r   r   r2   r   r   rl   r   r   r   r   r   rL   r   r%   r   r   r   r
   rP   r   r   )rw   rx   r   rz   rW   r~   r   r   rV   r   r   r/   r   rn   rS   r   r   r   r   r   r   s                        r,   get_filer   #  s    F  D] >wOO 	 1-/%
 
 %Gw$O!$ 1 @ @ Q ($: 	  /1BC$K 	  /==):)K)K >  H
 %33 $7LP H
 	33 $):B ?	 4 	
  *:B?E2 $$Z6<"!%%k48>B	 $$Z6<"  '')<<"3!#!$%68NPRS		
 A P
8
:  66/ATX 7 
 	
 	
 	""PWWA	

 	""9#7#7#9:a' 9c!((m<Q/a&1Qv/J/JK	  q6(I 9i8Q/a&1Qs3	 's}   K$F. F$F. F'A2F. 4F*5 F. F,CF. #K$$F. 'F. *F. ,F. .
K!8KGDKK!!K$c                   K   ddl m}m}m}m}m}	m}
 i }	 |xs t        |        d{   xs d} ||| |||
|       d{   }t        |      }|r{|	j                  d      }|t        dd	d	d
      |t        dd	d	d
      t        |t              st        dd	d	d
       |j                  d ||j                  |d| d{   }n t        j                  d ||d| d{   }t!        j"                  |	j%                  |j'                  dd      d             t)        |di       xs i }|j'                  dd      xs d}|j'                  dd      xs d}|j'                  dd      xs d}|j*                  j-                  t/        j0                  |||||
t)        |dd                   |S 7 7 z7 7 # t2        $ r)}|	j5                  |||       d{  7   t7        j8                  dj;                  t=        |                   t7        j>                  tA        jB                                t        |tD              r\t        t)        |dt=        |jF                              t)        |dd	      t)        |dd	      t)        |dtH        jJ                              t=        |       }t        t)        |d|      t)        |dd	      t)        |dd	      t)        |dd
            d}~ww xY ww)!a  
    Deletes a specified file. that can be used across - Assistants API, Batch API 
    This is the equivalent of DELETE https://api.openai.com/v1/files/{file_id}

    Supports Identical Params as: https://platform.openai.com/docs/api-reference/files/delete

    Example Curl
    ```
    curl http://localhost:4000/v1/files/file-abc123     -X DELETE     -H "Authorization: Bearer $OPENAI_API_KEY"

    ```
    r   r}   r   Nrv   r   r[   r\   r]   rK   r^   rc   rd   r   r   r   rt   r   r   r   r   r   r   r   r   r   r   r_   r`   ra   rO   rQ   )&r   r~   r   rG   r   rV   r   r   r   ri   rj   r    r   afile_deleterk   rg   r   r   r   r2   r   r   rl   r   r   r   r   r   rL   r   r%   r   r   r   r
   rP   r   r   )rw   rx   r   rz   rW   r~   r   rG   r   rV   r   r   r/   r   rn   rS   r   r   r   r   r   r   s                         r,   delete_filer     sN    H  Df >wOO 	 1-/%
 
 %Gw$O!$ 1 @ @ Q ($: 	  !$2 	  /1BC$K 	  <.;; ):)K)K% 	 H %11 $7LP H
 	33 $):B ?	 4 	
  *:B?E2 $$Z6<"!%%k48>B	 $$Z6<"  '')<<"3!#!$%68NPRS		
 S P
F:  66/ATX 7 
 	
 	
 	""PWWA	

 	""9#7#7#9:a' 9c!((m<Q/a&1Qv/J/JK	  q6(I 9i8Q/a&1Qs3	 's}   K:G F:G F=BG 
G  G +G,CG 9K::G =G  G G 
K7K2%G(&DK22K77K:c                   K   ddl m}m}m}m}	m}
 i }	 t        |      }|j                  | |||
|	|t        j                  j                         d{   \  }}d}|rnt        |t              r^|j                  d      }t        |      dk7  rt        dd	
      |t        dd
      |d   |d<    |j                   d%i | d{   }n<|xs t#        |        d{   xs d}t%        j                   d%||d| d{   }|t        dd
      |	j'                  |||       d{   }|t        |t(              r|}t+        j,                  |	j/                  |j1                  dd      d             t3        |di       xs i }|j1                  dd      xs d}|j1                  dd      xs d}|j1                  dd      xs d}|j4                  j7                  t        j8                  |||||
t3        |dd                   |S 7 7 N7 87 7 # t:        $ r)}|	j=                  |||       d{  7   t?        j@                  djC                  t        |                   t?        jD                  tG        jH                                t        |t              r\tK        t3        |dt        |jL                              t3        |d d!      t3        |d"d!      t3        |d#tN        jP                        $      t        |       }tK        t3        |d|      t3        |d d!      t3        |d"d!      t3        |d#d      $      d}~ww xY ww)&a~  
    Returns information about a specific file. that can be used across - Assistants API, Batch API 
    This is the equivalent of GET https://api.openai.com/v1/files/

    Supports Identical Params as: https://platform.openai.com/docs/api-reference/files/list

    Example Curl
    ```
    curl http://localhost:4000/v1/files        -H "Authorization: Bearer sk-1234"

    ```
    r   r   r   r   Nr   r   r   zVtarget_model_names on list files must be a list of one model name. Example: ['gpt-4o']rN   rK   rM   rE   r   rv   )r/   rU   z\Either 'provider' or 'target_model_names' must be provided e.g. `?target_model_names=gpt-4o`r   r   rt   r   r   r   r   r   r   r   r   r   z?litellm.proxy.proxy_server.list_files(): Exception occured - {}r_   r`   r]   ra   rO   r^   rQ   ))r   r   rG   r   rV   r   r   r   	CallTypesalist_fine_tuning_jobsr+   r    r%   r   lenr
   
afile_listr   rg   r   r   r   r   r   r2   r   r   rl   r   r   r   r   rL   r   r   r   r   rj   rP   r   r   )rw   rx   rW   rz   ry   rU   r   rG   r   rV   r   r   r   r   rS   rX   r/   r   r   r   r   r   r   r   s                           r,   
list_filesr   F  s    H  Dk&C&N# .NN-//% 77== O 
 
	
 #'*-?"E&8&>&>s&C#*+q0# #s 
 !# #V  4A6DM2Z22  H
  B7SS   %// $7LP H u  ,BB):X C 
 
	  Z	;K%L H 	33 $):B ?	 4 	
  *:B?E2 $$Z6<"!%%k48>B	 $$Z6<"  '')<<"3!#!$%68NPRS		
 W
2 T
>  66/ATX 7 
 	
 	
 	""MTTA	

 	""9#7#7#9:a' 9c!((m<Q/a&1Qv/J/JK	  q6(I 9i8Q/a&1Qs3	 's   M?H  HA3H  HH   H!#H  H*H  /H0C!H  MH  H  H  H  H   
M*MIDMMM)@r   r   typingr   r   r   httpxfastapir   r   r   r	   r
   r   r   r   r   rg   r   r   litellm._loggingr   *litellm.llms.base_llm.files.transformationr   litellm.proxy._types$litellm.proxy.auth.user_api_key_authr   'litellm.proxy.common_request_processingr   0litellm.proxy.common_utils.openai_endpoint_utilsr   litellm.proxy.utilsr   r   litellm.routerr   litellm.types.llms.openair   r   r   common_utilsr   routerr'   r-   r%   r4   bytesr#   rB   rF   rT   UserAPIKeyAuthListboolrp   postr   r2   r   r   deleter   r   rQ   r.   r,   <module>r      s     + + 
 
 
  5 1 H " B Q = !  =	"
e 
 
 (3-   , 	"? ?+?  ? $	?
 &? "#Y? ? 3-? ? ?D +,-
  
 +,-
  
 +,-
   9"2."#H5Cy(/0A(Bddd d 	d
 smd d d &ddN 1+,-
  
 &+,-
  
 #+,-
   #(/0A(Bccc c sm	c
 &ccL )+,-
  
 +,-
  
 +,-
   #(/0A(Bzzz z sm	z
 &zzz )+,-
  
 +,-
  
 +,-
   #(/0A(BEEE E sm	E
 &EEP +,-
  
 +,-
  
 +,-
   )00A(B"(,!III &I sm	I
 !I c]IIr.   