Ë
    uPêj`-  ã                   óÀ   — d Z ddlmZmZmZ ddlZddlmZ 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r	ddlmZ eZneZ G d„ de	«      Zy)z·
Stability AI Image Edit Config

Handles transformation between OpenAI-compatible format and Stability AI API format.

API Reference: https://platform.stability.ai/docs/api-reference
é    )ÚTYPE_CHECKINGÚAnyÚFinalN)ÚRequestFiles)ÚBaseImageEditConfig)Úget_secret_str)ÚImageEditOptionalRequestParams)Ú%OPENAI_SIZE_TO_STABILITY_ASPECT_RATIOÚSTABILITY_EDIT_ENDPOINTS)ÚGenericLiteLLMParams)Ú	FileTypesÚImageObjectÚImageResponse)Úget_model_info)ÚLoggingc                   óB  — e Zd ZU dZdZeed<   dedee   fd„Zde	dede
defd	„Zdedefd
„Zdededz  dedefd„Z	 	 	 ddedededz  dedz  dedz  defd„Zdededz  dedz  dedededeeef   fd„Z	 	 ddedej,                  dededz  de
dz  defd„Zde
fd„Zy)ÚStabilityImageEditConfigzt
    Configuration for Stability AI image edit.

    Supports:
    - Stable Diffusion 3 (SD3, SD3.5) Image Edit
    zhttps://api.stability.aiÚDEFAULT_BASE_URLÚmodelÚreturnc                 ó
   — g d¢S )zƒ
        Return list of OpenAI params supported by Stability AI.

        https://platform.stability.ai/docs/api-reference
        )ÚnÚsizeÚresponse_formatÚmask© )Úselfr   s     úv/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/stability/image_edit/transformations.pyÚget_supported_openai_paramsz4StabilityImageEditConfig.get_supported_openai_params+   s   € ò
ð 	
ó    Úimage_edit_optional_paramsÚdrop_paramsc           
      óR  — | j                  |«      }ddi}t        |«      }|j                  «       D ]Z  \  }}||v r|dk(  sŒ|t        v sŒt        |   |||   <   Œ)|dk(  r||d<   Œ4|dk(  r||d<   Œ?||vr|rŒFt	        d|› d|› d	|› d
�«      ‚Œ\ dD ]  }	|j                  |	d«       Œ |S )zÔ
        Map OpenAI parameters to Stability AI parameters.

        OpenAI -> Stability mappings:
        - size -> aspect_ratio
        - n -> (handled separately, Stability returns 1 image per request)
        r   Úaspect_ratior   Ú_nr   Ú_response_formatz
Parameter z is not supported for model z. Supported parameters are z6. Set drop_params=True to drop unsupported parameters.)r   r   r   N)r   ÚdictÚitemsr
   Ú
ValueErrorÚpop)
r   r!   r   r"   Úsupported_paramsÚparam_mappingÚmapped_paramsÚkÚvÚmappeds
             r   Úmap_openai_paramsz*StabilityImageEditConfig.map_openai_params8   s  € ð #'×"BÑ"BÀ5Ó"IÐð �Nð 
ˆô 04Ð4NÓ/Oˆà.×4Ñ4Ó6ò 	‰DˆAˆqØ�MÑ!à˜“; 1Ô(MÒ#MÜ6[Ð\]Ñ6^�M -°Ñ"2Ò3à�c’à&'�˜dÒ#ØÐ'Ò'à45�Ð0Ò1ØÐ*Ñ*Ú"Ü$Ø$ Q CÐ'CÀEÀ7ð K4Ø4DÐ3Eð FOðPóð ð ð-	ð2 7ò 	,ˆFØ×Ñ˜f dÕ+ð	,ð Ðr    c                 óŽ   — |j                  «       }|j                  d«      }t        j                  «       D ]  \  }}||v sŒ|c S  y)z9
        Get the API endpoint for a given model.
        z
stability/z!/v2beta/stable-image/edit/inpaint)ÚlowerÚremoveprefixr   r(   )r   r   Ú
model_nameÚkeyÚendpoints        r   Ú_get_model_endpointz,StabilityImageEditConfig._get_model_endpointm   sO   € ð
 —[‘[“]ˆ
Ø×,Ñ,¨\Ó:ˆ
ô 6×;Ñ;Ó=ò 	 ‰MˆC�Ø�jÒ Ø’ð	 ð
 3r    Úapi_baseNÚlitellm_paramsc                 ó´   — |xs- t        d«      xs  |j                  dd«      xs | j                  }|j                  d«      }| j	                  |«      }|› |› �S )zH
        Get the complete URL for the Stability AI API request.
        ÚSTABILITY_API_BASEr9   Nú/)r   Úgetr   Úrstripr8   )r   r   r9   r:   Úbase_urlr7   s         r   Úget_complete_urlz)StabilityImageEditConfig.get_complete_url}   sn   € ð ò %ÜÐ2Ó3ò%à×!Ñ! *¨dÓ3ò%ð ×$Ñ$ð	 	ð —?‘? 3Ó'ˆà×2Ñ2°5Ó9ˆØ�˜H˜:Ð&Ð&r    ÚheadersÚapi_keyc                 óX   — |xs t        d«      }|st        d«      ‚d|› �|d<   d|d<   |S )zK
        Validate environment and set up headers for Stability AI.
        ÚSTABILITY_API_KEYz_STABILITY_API_KEY is not set. Please set it via environment variable or pass api_key parameter.zBearer ÚAuthorizationzapplication/jsonÚAccept)r   r)   )r   rB   r   rC   r:   r9   Úfinal_api_keys          r   Úvalidate_environmentz-StabilityImageEditConfig.validate_environment‘   sI   € ð ,3Ò+Y´nÐEXÓ6YˆáÜØqóð ð &-¨]¨OÐ#<ˆ�Ñ Ø.ˆ�ÑØˆr    ÚpromptÚimageÚ"image_edit_optional_request_paramsc                 óÂ  — ddi}|�
|dk7  r||d<   t        |t        «      r|d   n|}i }	|�t        |t        «      r|d   n|}||	d<   |j                  «       D ]‚  \  }
}|
j                  d«      s|€Œ|
dk(  r+|}t        |t        «      rt	        |«      dkD  r|d   }||	d<   ŒJ|
d	v r+|}t        |t        «      rt	        |«      dkD  r|d   }||	|
<   Œy|
d
v sŒ~|||
<   Œ„ ||	fS )zÖ
        Transform OpenAI-style request to Stability AI request format.

        Note: Stability AI uses multipart/form-data, but the HTTP handler
        will handle the conversion from dict to form data.
        Úoutput_formatÚpngÚ rJ   r   rK   Ú_r   )Ú
init_imageÚstyle_image)Únegative_promptr$   ÚseedÚmodeÚstrengthÚstyle_presetÚleftÚbottomÚrightÚtopÚ
creativityÚsearch_promptÚ	grow_maskÚselect_promptÚcontrol_strengthÚcomposition_fidelityÚchange_strength)Ú
isinstanceÚlistr(   Ú
startswithÚlen)r   r   rJ   rK   rL   r:   rB   ÚdataÚ
image_fileÚfilesr6   ÚvalueÚ
mask_valueÚ
file_values                 r   Útransform_image_edit_requestz5StabilityImageEditConfig.transform_image_edit_request§   s,  € ð& ˜Uð'
ˆð
 Ð &¨B¢,Ø#ˆD�‰Nä!+¨E´4Ô!8�U˜1’X¸eˆ
Ø')ˆØÐÜ%/°´tÔ%<˜˜qšÀ%ˆJØ'ˆE�'‰Nð =×BÑBÓDò +	"‰JˆC�à�~‰~˜cÔ" e mØð �fŠ}à"�
Ü˜e¤TÔ*¬s°5«z¸Aª~Ø!& q¡�JØ *��f‘Øð Ð3Ñ3à"�
Ü˜e¤TÔ*¬s°5«z¸Aª~Ø!& q¡�JØ'��c‘
Øð ð ò ð& "��S’	ðW+	"ðZ �Uˆ{Ðr    Úraw_responseÚlogging_objÚ	json_modec                 óô  — 	 |j                  «       }d|v r.| j                  d|d   › �|j                  |j                  ¬«      ‚|j                  dd«      }|dk(  r| j                  d	d
|j                  ¬«      ‚t        «       }	|	j                  sg |	_        |j                  d«      }
|
r'|	j                  j                  t        |
dd¬«      «       t        |	d«      si |	_        d|	j                  vri |	j                  d<   t        |d¬«      }|j                  dd«      }|�t        |«      |	j                  d   d<   |	S # t        $ r0}| j                  d|› �|j                  |j                  ¬«      ‚d}~ww xY w)a  
        Transform Stability AI response to OpenAI-compatible ImageResponse.

        Stability returns: {"image": "base64...", "finish_reason": "SUCCESS", "seed": 123}
        OpenAI expects: {"data": [{"b64_json": "base64..."}], "created": timestamp}
        z%Error parsing Stability AI response: )Úerror_messageÚstatus_coderB   NÚerrorszStability AI error: Úfinish_reasonrP   ÚCONTENT_FILTEREDz3Content was filtered by Stability AI safety systemsi�  rK   )Úb64_jsonÚurlÚrevised_promptÚ_hidden_paramsÚadditional_headersÚ	stability)Úcustom_llm_providerÚoutput_cost_per_imager   z$llm_provider-x-litellm-response-cost)ÚjsonÚ	ExceptionÚget_error_classrt   rB   r>   r   rh   Úappendr   Úhasattrr{   r   Úfloat)r   r   ro   rp   rC   rq   Úresponse_dataÚerv   Úmodel_responseÚ	image_b64Ú
model_infoÚcost_per_images                r   Útransform_image_edit_responsez6StabilityImageEditConfig.transform_image_edit_response÷   s·  € ð	Ø#/×#4Ñ#4Ó#6ˆMð �}Ñ$Ø×&Ñ&Ø 4°]À8Ñ5LÐ4MÐNØ(×4Ñ4Ø$×,Ñ,ð 'ó ð ð  -×0Ñ0°À"ÓEˆØÐ.Ò.Ø×&Ñ&ØSØØ$×,Ñ,ð 'ó ð ô !.£ˆØ×"Ò"Ø"$ˆNÔð )×,Ñ,¨WÓ5ˆ	ÙØ×Ñ×&Ñ&ÜØ&ØØ#'ôôô �~Ð'7Ô8Ø,.ˆNÔ)Ø ~×'DÑ'DÑDØBDˆN×)Ñ)Ð*>Ñ?ä*¨5ÀkÔRˆ
Ø *§¡Ð/FÈÓ JˆØÐ%ÜjoØókˆN×)Ñ)Ð*>Ñ?Ð@fÑgð Ðøôe ò 	Ø×&Ñ&Ø EÀaÀSÐIØ(×4Ñ4Ø$×,Ñ,ð 'ó ð ûð	ús   ‚D> Ä>	E7Å+E2Å2E7c                  ó   — y)zQ
        Stability AI requires multipart/form-data for image generation.
        Tr   )r   s    r   Úuse_multipart_form_dataz0StabilityImageEditConfig.use_multipart_form_data;  s   € ð r    )NNN)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚstrÚ__annotations__re   r   r	   Úboolr'   r1   r8   rA   rI   r   r   Útupler   rn   ÚhttpxÚResponseÚLiteLLMLoggingObjr   rŒ   rŽ   r   r    r   r   r   !   s»  … ñð 7Ð�cÓ6ð
°ð 
¸¸c¹ó 
ð3à$Bð3ð ð3ð ð	3ð
 
ó3ðj3¨ð 3°ó 3ð 'àð'ð ˜‘*ð'ð ð	'ð
 
ó'ð0 #Ø&*Ø#ñàðð ðð �t‘ð	ð
 ˜t™ðð ˜‘*ðð 
óð,NàðNð �d‘
ðNð ˜4Ñð	Nð
 -1ðNð -ðNð ðNð 
ˆt�\Ð!Ñ	"óNðj #Ø!%ñBàðBð —n‘nðBð 'ð	Bð
 �t‘ðBð ˜$‘;ðBð 
óBðH¨ô r    r   )r’   Útypingr   r   r   r—   Úhttpx._typesr   Ú/litellm.llms.base_llm.image_edit.transformationr   Úlitellm.secret_managers.mainr   Úlitellm.types.images.mainr	   Úlitellm.types.llms.stabilityr
   r   Úlitellm.types.routerr   Úlitellm.types.utilsr   r   r   Úlitellm.utilsr   Ú*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjr™   r   r   r    r   ú<module>r¥      sU   ðñ÷ -Ñ ,ã Ý %å OÝ 7Ý D÷õ 6ß EÑ EÝ (áÝXà*ÑàÐô^Ð2õ ^r    