Ë
    tPêj$0  ã                   ó¤  — U d dl Z d dlZd dlZd dlmZ d dl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 d dlmZ d dlZd dlmZ d dlmZ d dl­ d d	lmZmZ d d
lmZ d dlmZ d dl m!Z!  e	«       Z"ee#d<   dedejH                  fd„Z%dee   dz  de&ejH                     dz  fd„Z'e"jQ                  d e
e«      gedg¬«      e"jQ                  d e
e«      gedg¬«      e"jQ                  d e
e«      gedg¬«       e
e«      dfdededede)dz  fd„«       «       «       Z*e"jQ                  d e
e«      gdg¬«      e"jQ                  d e
e«      gdg¬«      e"jQ                  d  e
e«      gedg¬«       e
e«       ed«       edd!¬"«       ed«       edd#¬"«      dfdededed$e&e   dz  d%e&e   dz  d&e&e   dz  d'e&e   dz  de)dz  fd(„«       «       «       Z+y))é    N)ÚSequence)ÚFinal)Ú	APIRouterÚDependsÚFileÚHTTPExceptionÚRequestÚResponseÚ
UploadFileÚstatus)ÚORJSONResponse)Úverbose_proxy_logger)Úget_str_from_messages)Ú*)ÚUserAPIKeyAuthÚuser_api_key_auth)ÚProxyBaseLLMRequestProcessing)Úroute_request)ÚChatCompletionUserMessageÚrouterÚuploadÚreturnc              ƒ   óŽ   K  — | j                  «       ƒ d{  –—† }t        j                  |«      }| j                  |_        |S 7 Œ,­w)zz
    Read a FastAPI UploadFile into a BytesIO and set .name so OpenAI SDK
    infers filename/content-type correctly.
    N)ÚreadÚioÚBytesIOÚfilenameÚname)r   ÚdataÚbuffers      úl/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/image_endpoints/endpoints.pyÚuploadfile_to_bytesior"      s9   è ø€ ð
 Ÿ™›×%€DÜ—J‘J˜tÓ$€FØ—/‘/€F„KØ€Mð &ús   ‚A–A—-AÚuploadsc              ƒ   ó`   K  — | sy| D �cg c]  }t        |«      ƒ d{  –—† ‘Œ c}S 7 Œ	c c}w ­w)zR
    Convert a sequence of UploadFiles to a list of BytesIO buffers, or None.
    N)r"   )r#   Úus     r!   Úbatch_to_bytesior&   $   s1   è ø€ ñ ØØ4;Ö<¨qÔ'¨Ó*×*Ñ*Ò<Ð<Ð*úÒ<ùs   ‚.Š)�'
ž)¤.§)©.z/v1/images/generationsÚimages)ÚdependenciesÚresponse_classÚtagsz/images/generationsz3/openai/deployments/{model:path}/images/generationsÚrequestÚfastapi_responseÚuser_api_key_dictÚmodelc              ƒ   ó  K  — ddl m} ddlm}m}m}m}m}	m}
m	} i }	 | j                  «       ƒ d {  –—† }t        j                  |«      } ||| ||||¬«      ƒ d {  –—† }t        |t        «      r	 |d|«       |xs* |j                  dd «      xs |
xs |j                  dd «      |d<   |
r|
|d<   |d   t         j"                  v rt         j"                  |d      |d<   |j                  d«      }|�d|d	œ}|g|d
<   |	j%                  ||d¬«      ƒ d {  –—† }|j                  d
«      }t        |t&        «      r|rt)        |«      |d<   |j+                  d
d «       t-        |d||
¬«      ƒ d {  –—† }|ƒ d {  –—† }t/        j0                  |	j3                  |j                  dd«      d¬«      «       |	j5                  |||¬«      ƒ d {  –—† }t7        |di «      xs i }|j                  dd «      xs d}|j                  dd «      xs d}|j                  dd «      xs d}|j                  dd «      xs d}|j                  dd «      xs d}|j8                  j;                  t=        j>                  ||||||t7        |dd«      |||¬«
      «       |	jA                  |||tC        | j8                  «      ¬«      ƒ d {  –—† }|r|j8                  j;                  |«       |S 7 �Œ°7 �Œˆ7 �ŒÒ7 �Œ{7 �Œt7 �Œ%7 Œ5# tD        $ �r}|	jG                  |||¬«      ƒ d {  –—†7   tI        jJ                  d|«       tI        jL                  tO        jP                  «       «       t        |tR        «      rRtU        t7        |dt        |«      «      t7        |dd «      t7        |d!d «      t7        |d"tV        jX                  «      ¬#«      ‚|› }tU        t7        |d|«      t7        |dd «      t7        |d!d «      t7        |d$d «      t7        |d"d%«      ¬&«      ‚d }~ww xY w­w)'Nr   )Úreject_url_valued_destination)Úadd_litellm_data_to_requestÚgeneral_settingsÚ
llm_routerÚproxy_configÚproxy_logging_objÚ
user_modelÚversion)r   r+   r2   r-   r7   r4   r.   Úimage_generation_modelÚpromptÚuser)ÚroleÚcontentÚmessagesÚimage_generation)r-   r   Ú	call_typeÚaimage_generation)r   Ú
route_typer3   r6   Úlitellm_call_idÚ Úsuccess)rB   r   )r   r-   ÚresponseÚ_hidden_paramsÚmodel_idÚ	cache_keyÚapi_baseÚresponse_costÚallowed_model_region)
r-   rG   rH   rI   r7   rJ   Úmodel_regionÚcall_idÚrequest_dataÚhidden_params)r   r-   rE   Úrequest_headers)r-   Úoriginal_exceptionrN   zElitellm.proxy.proxy_server.image_generation(): Exception occured - %sÚmessageÚtypeÚNoneÚparamÚstatus_code)rR   rS   rU   ÚcoderW   iô  )rR   rS   rU   Úopenai_coderW   )-Ú$litellm.proxy.litellm_pre_call_utilsr0   Úlitellm.proxy.proxy_serverr1   r2   r3   r4   r5   r6   r7   ÚbodyÚorjsonÚloadsÚ
isinstanceÚstrÚgetÚlitellmÚmodel_alias_mapÚpre_call_hookÚlistr   Úpopr   ÚasyncioÚcreate_taskÚupdate_request_statusÚpost_call_success_hookÚgetattrÚheadersÚupdater   Úget_custom_headersÚpost_call_response_headers_hookÚdictÚ	ExceptionÚpost_call_failure_hookr   ÚerrorÚdebugÚ	tracebackÚ
format_excr   ÚProxyExceptionr   ÚHTTP_400_BAD_REQUEST)r+   r,   r-   r.   r0   r1   r2   r3   r4   r5   r6   r7   r   r[   Úprompt_valueÚuser_messager=   Úllm_callrE   rO   rG   rH   rI   rJ   rB   Úcallback_headersÚeÚ	error_msgs                               r!   r>   r>   /   sX  è ø€ õ0 S÷÷ ñ ð €Dð}à#ŸL™L›N×*ˆÜ�|‰|˜DÓ!ˆñ 1ØØØ-Ø/ØØ%ô
÷ 
ˆô �eœSÔ!Ù)¨'°5Ô9ð ò 'Ø×#Ñ#Ð$<¸dÓCò'àò'ð �x‰x˜ Ó&ð	 	ˆW‰ñ Ø&ˆD�‰Mð
 �‰=œG×3Ñ3Ñ3Ü#×3Ñ3°D¸±MÑBˆD�‰Mð #Ÿh™h xÓ0ˆØÐ#ð Ø'ñ>ˆLð !-˜~ˆD�ÑØ&×4Ñ4Ø/°dÐFXð 5ó 
÷ 
ˆð Ÿ(™( :Ó.ˆÜ�h¤Ô%©(Ü2°8Ó<ˆD�‰NØ�‰�˜TÔ"ô !.ØØ*Ø!Ø!ô	!
÷ 
ˆð "—>ˆô 	×ÑØ×3Ñ3ÀDÇHÁHÐM^Ð`bÓDcÐluÐ3Óvô	
ð
 +×AÑAØÐ):ÀXð Bó 
÷ 
ˆô
  ' xÐ1AÀ2ÓFÒLÈ"ˆØ'×+Ñ+¨J¸Ó=ÒCÀˆØ(×,Ñ,¨[¸$Ó?ÒEÀ2ˆ	Ø'×+Ñ+¨J¸Ó=ÒCÀˆØ,×0Ñ0°À$ÓGÒMÈ2ˆØ!.×!2Ñ!2Ð3DÀdÓ!KÒ!QÈrˆà× Ñ ×'Ñ'Ü)×<Ñ<Ø"3Ø!Ø#Ø!ØØ+Ü$Ð%6Ð8NÐPRÓSØ'Ø!Ø+ôô	
ð  ):×(YÑ(YØØ/ØÜ  §¡Ó1ð	 )Zó )
÷ #
Ðñ Ø×$Ñ$×+Ñ+Ð,<Ô=àˆðK +ùð
ùðH
ùð
ùð "ùð
ùð8#
ùô ó Ø×6Ñ6Ø/ÀAÐTXð 7ó 
÷ 	
ñ 	
ô 	×"Ñ"Ð#jÐlmÔnÜ×"Ñ"¤9×#7Ñ#7Ó#9Ô:Ü�aœÔ'Ü Ü  9¬c°!«fÓ5Ü˜Q ¨Ó/Ü˜a ¨&Ó1Ü˜Q ¬v×/JÑ/JÓKô	ð ð #$ ˆIÜ Ü  9¨iÓ8Ü˜Q ¨Ó/Ü˜a ¨&Ó1Ü# A v¨tÓ4Ü˜Q ¨sÓ3ôð ûðüsµ   ‚PžK5 ±K!²*K5 ÁK$ÁB8K5 ÄK'ÄAK5 Å/K*Å0	K5 Å9K-Å:AK5 ÇK0ÇC1K5 Ê=K3Ê>"K5 Ë PË!K5 Ë$K5 Ë'K5 Ë*K5 Ë-K5 Ë0K5 Ë3K5 Ë5
P
Ë?PÌLÌC.PÐP
Ð
Pz/v1/images/edits)r(   r*   z/images/editsz-/openai/deployments/{model:path}/images/editszimage[])Úaliaszmask[]ÚimageÚimage_arrayÚmaskÚ
mask_arrayc              ƒ   óÖ  K  — |�|�t        dd¬«      ‚|�|�t        dd¬«      ‚|€|�|}|€|�|}ddlm}m}	m}
m}m}m}m}m	}m
}m}m}m}  || ¬«      ƒ d{  –—† }t        |«      ƒ d{  –—† }t        |«      ƒ d{  –—† }|r||d	<   |r||d
<   dD ]+  }||v sŒt        ||   t         «      sŒt        dd|› d�¬«      ‚ d|vrd|d<   |xs* |	j#                  dd«      xs |xs |j#                  dd«      |d<   t%        |¬«      }	 |j'                  | ||d||
|	||d||||||¬«      ƒ d{  –—† S 7 ŒØ7 ŒÇ7 Œ¶7 Œ
# t(        $ r#}|j+                  ||||¬«      ƒ d{  –—†7  ‚d}~ww xY w­w)aÄ  
    Follows the OpenAI Images API spec: https://platform.openai.com/docs/api-reference/images/create

    ```bash
    curl -s -D >(grep -i x-request-id >&2)     -o >(jq -r '.data[0].b64_json' | base64 --decode > gift-basket.png)     -X POST "http://localhost:4000/v1/images/edits"     -H "Authorization: Bearer sk-1234"         -F "model=gpt-image-1"         -F "image[]=@soap.png"         -F 'prompt=Create a studio ghibli image of this'
    ```
    Ni¦  z)Cannot specify both 'image' and 'image[]')rV   Údetailz'Cannot specify both 'mask' and 'mask[]'r   )Ú_read_request_bodyr2   r3   r4   r5   Úselect_data_generatorÚuser_api_baseÚuser_max_tokensr6   Úuser_request_timeoutÚuser_temperaturer7   )r+   r   r�   )r   r�   ú'z<' must be provided as a multipart file upload, not a string.r9   r8   r.   )r   Úaimage_edit)r+   r,   r-   rA   r5   r3   r2   r4   r†   r.   r6   rŠ   r‰   rˆ   r‡   r7   )r|   r-   r5   r7   )r   rZ   r…   r2   r3   r4   r5   r†   r‡   rˆ   r6   r‰   rŠ   r7   r&   r^   r_   r`   r   Úbase_process_llm_requestrp   Ú_handle_llm_api_exception)r+   r,   r-   r   r€   r�   r‚   r.   r…   r2   r3   r4   r5   r†   r‡   rˆ   r6   r‰   rŠ   r7   r   Úimage_filesÚ
mask_filesÚ_fieldÚ	processorr|   s                             r!   Úimage_edit_apir“   Ó   sò  è ø€ ðN Ð˜[Ð4Ü¨Ð4_Ô`Ð`ØÐ˜JÐ2Ü¨Ð4]Ô^Ð^Ø€}˜Ð0ØˆØ€|˜
Ð.Øˆ÷÷ ÷ ó ñ$ +°7Ô;×;€DÜ/°Ó6×6€KÜ.¨tÓ4×4€JÙØ#ˆˆW‰ÙØ!ˆˆV‰à#ò ˆØ�TŠ>œj¨¨f©´sÕ;ÜØØ˜6˜(Ð"^Ð_ôð ðð �tÑØˆˆX‰ð 	ò 	#Ø×ÑÐ 8¸$Ó?ò	#àò	#ð �8‰8�G˜TÓ"ð	 	ˆ�Mô 5¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø$Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! 8ó 
÷ 
ð 	
ð? <øØ6øØ4øð:
ùô$ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üs…   ‚AE)ÁD2ÁE)Á,D4Á-E)Á?D6Â E)ÂE)Â0AE)Ä	$D: Ä-D8Ä.D: Ä1E)Ä4E)Ä6E)Ä8D: Ä:	E&ÅE!ÅEÅE!Å!E&Å&E)),rf   r   rt   Úcollections.abcr   Útypingr   r\   Úfastapir   r   r   r   r	   r
   r   r   Úfastapi.responsesr   ra   Úlitellm._loggingr   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr   Úlitellm.proxy._typesÚ$litellm.proxy.auth.user_api_key_authr   r   Ú'litellm.proxy.common_request_processingr   Úlitellm.proxy.route_llm_requestr   Úlitellm.types.llms.openair   r   Ú__annotations__r   r"   rd   r&   Úpostr_   r>   r“   © ó    r!   ú<module>r£      s¦  ðÜ Û 	Û Ý $Ý ã ß b× bÓ bÝ ,ã Ý 1õô #ß RÝ QÝ 9Ý ?á“€ˆÓ ð¨
ð °r·z±zó ð=Ø�jÑ! DÑ(ð=à	ˆ"�*‰*Ñ˜Ñó=ð ‡�ØÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ð ‡�ØÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ð ‡�Ø9ÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ñ )0Ð0AÓ(BØñ	OØðOàðOð &ðOð �‰:ò	Oóóóð$Oðd ‡�ØÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�ØÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�Ø3ÙÐ+Ó,Ð-Ø!Ø
ˆð	 ó ñ )0Ð0AÓ(BÙ%)¨$£ZÙ+/°¸IÔ+FÙ$(¨£JÙ*.¨t¸8Ô*DØñn
Øðn
àðn
ð &ðn
ð �
Ñ˜dÑ"ð	n
ð
 �jÑ! DÑ(ðn
ð ˆzÑ
˜TÑ
!ðn
ð �ZÑ  4Ñ'ðn
ð �‰:òn
óóóñ n
r¢   