
    hA                         d dl mZ d dlmZmZmZmZ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 d d	lmZ d d
l d dlmZ d dlmZmZmZ er	d dlmZ  e Z!neZ! G d de      Z"y)    )BufferedReader)TYPE_CHECKINGAnyDictListOptionalTuplecastN)RequestFiles)ImageEditRequestUtils)BaseImageEditConfig)get_secret_str)ImageEditOptionalRequestParams)RecraftImageEditRequestParams)*)GenericLiteLLMParams)	FileTypesImageObjectImageResponse)Loggingc                      e Zd ZU dZeed<   dZeed<   dZeed<   dede	fd	Z
d
edededefdZdedee   dedefdZ	 ddededee   defdZdededededededeeef   fdZdede	eeef      fdZdedej6                  dedefdZy)RecraftImageEditConfigzhttps://external.api.recraft.aiDEFAULT_BASE_URLzv1/images/imageToImageIMAGE_EDIT_ENDPOINTg?DEFAULT_STRENGTHmodelreturnc                 
    g dS )z
        Supported OpenAI parameters that can be mapped to Recraft image edit API.
        
        Based on Recraft API docs: https://www.recraft.ai/docs#image-to-image
        )nresponse_formatstyle )selfr   s     j/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/recraft/image_edit/transformation.pyget_supported_openai_paramsz2RecraftImageEditConfig.get_supported_openai_params   s    
 	
    image_edit_optional_paramsdrop_paramsc                     t        |      }| j                  |      }|j                         D ci c]  \  }}||v s|| }}}|S c c}}w )z
        Map OpenAI image edit parameters to Recraft parameters.
        Reuses OpenAI logic but filters to supported params only.
        )dictr%   items)	r#   r'   r   r(   
all_paramssupported_paramskvfiltered_paramss	            r$   map_openai_paramsz(RecraftImageEditConfig.map_openai_params+   sZ     45
  ;;EB,6,<,<,>XDAq!GWBW1a4XX Ys
   AAapi_baselitellm_paramsc                     |xs t        d      xs | j                  }|j                  d      }| d| j                   }|S )zi
        Get the complete url for the request

        Some providers need `model` in `api_base`
        RECRAFT_API_BASE/)r   r   rstripr   )r#   r   r2   r3   complete_urls        r$   get_complete_urlz'RecraftImageEditConfig.get_complete_url?   sW      %01%$$ 	 $**3/&q)A)A(BCr&   Nheadersapi_keyc                 N    |xs t        d      }|st        d      d| |d<   |S )NRECRAFT_API_KEYzRECRAFT_API_KEY is not setzBearer Authorization)r   
ValueError)r#   r:   r   r;   final_api_keys        r$   validate_environmentz+RecraftImageEditConfig.validate_environmentT   sA      .,- 	 9::%,]O#< r&   promptimage"image_edit_optional_request_paramsc           	          t        d|||j                  d| j                        d|}t        t        |      }| j                  |      }	|j                         D 
ci c]  \  }
}|
dk7  s|
| }}
}||	fS c c}}
w )z
        Transform the image edit request to Recraft's multipart form format.
        Reuses OpenAI file handling logic but adapts for Recraft API structure.

        https://www.recraft.ai/docs#image-to-image
        strength)r   rB   rF   )rC   rC   r"   )r   popr   r
   r   _get_image_files_for_requestr+   )r#   r   rB   rC   rD   r3   r:   request_bodyrequest_dict
files_listr.   r/   data_without_imagess                r$   transform_image_edit_requestz3RecraftImageEditConfig.transform_image_edit_requeste   s      7T 7
7;;JH]H]^7
 1	7
 D,/ 66U6C
0<0B0B0DU1Wq!tUU"J.. Vs   A9-A9c                    g }|r{t        |t              r
|r|d   nd }n|}|]t        j                  |      }t        |t              r"|j                  d|j                  ||ff       |S |j                  dd||ff       |S )Nr   rC   z	image.png)
isinstancelistr   get_image_content_typer   appendname)r#   rC   rK   _imageimage_content_types        r$   rH   z3RecraftImageEditConfig._get_image_files_for_request   s     -/
 %&%*q!*?*V*VW]*^"fn5%% 6;;8J"KL 	 %% ;8J"KL r&   raw_responselogging_objc           
      z   t               }	 |j                         }|j                  sg |_        |d   D ]H  }|j                  j                  t        |j                  dd       |j                  dd                    J |S # t        $ r0}| j                  d| |j                  |j
                        d }~ww xY w)Nz(Error transforming image edit response: )error_messagestatus_coder:   dataurlb64_json)r\   r]   )
r   json	Exceptionget_error_classrZ   r:   r[   rR   r   get)r#   r   rV   rW   model_responseresponse_datae
image_datas           r$   transform_image_edit_responsez4RecraftImageEditConfig.transform_image_edit_response   s     '	(--/M """$N'/J&&{NN5$/#
D9(  0   	&& HL(44$,, '  	s   B 	B:
+B55B:)N)__name__
__module____qualname__r   str__annotations__r   r   floatr   r%   r   boolr   r1   r   r*   r9   rA   r   r   r	   r   rM   r   rH   httpxResponseLiteLLMLoggingObjr   rf   r"   r&   r$   r   r      sm   =c=77!e!

	
$B  	
 
( 3- 	
 
2 "&	  #	
 
"// / 	/
 -1/ -/ / 
t\!	"/@ 
eCHo	6 nn '	
 
r&   r   )#ior   typingr   r   r   r   r   r	   r
   rn   httpx._typesr   litellm.images.utilsr   /litellm.llms.base_llm.image_edit.transformationr   litellm.secret_managers.mainr   litellm.types.images.mainr   litellm.types.llms.recraftr   litellm.types.responses.mainlitellm.types.routerr   litellm.types.utilsr   r   r   *litellm.litellm_core_utils.litellm_loggingr   _LiteLLMLoggingObjrp   r   r"   r&   r$   <module>r~      sS     H H H  % 6 O 7 D D * 5 E EX*`0 `r&   