Ë
    uPêjÑ7  ã                   ó¸   — d Z ddlmZmZmZ ddl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mZmZmZ erddlZdd
lmZ neZ G d„ de
«      Zy)aá  
OpenRouter Image Generation Support

OpenRouter provides image generation through chat completion endpoints.
Models like google/gemini-2.5-flash-image return images in the message content.

Response format:
{
    "choices": [{
        "message": {
            "content": "Here is a beautiful sunset for you! ",
            "role": "assistant",
            "images": [{
                "image_url": {"url": "data:image/png;base64,..."},
                "index": 0,
                "type": "image_url"
            }]
        }
    }],
    "usage": {
        "completion_tokens": 1299,
        "prompt_tokens": 6,
        "total_tokens": 1305,
        "completion_tokens_details": {"image_tokens": 1290},
        "cost": 0.0387243
    }
}
é    )ÚTYPE_CHECKINGÚAnyÚFinalN)ÚBaseLLMException)ÚBaseImageGenerationConfig©ÚOpenRouterException)Úget_secret_str)ÚAllMessageValuesÚ#OpenAIImageGenerationOptionalParams)ÚImageObjectÚImageResponseÚ
ImageUsageÚImageUsageInputTokensDetails)ÚLoggingc                   ó¦  — e Zd ZdZdedee   fd„Zdededede	def
d„Z
d	edefd
„Zdededz  fd„Zdedededdfd„Z	 d%dedz  dedz  dededede	dz  defd„Z	 	 d&dededee   dedededz  dedz  defd„Zdedededededefd„Z	 	 d&dedej(                  dedededededddedz  d e	dz  defd!„Zd"ed#edeej0                  z  defd$„Zy)'ÚOpenRouterImageGenerationConfiga  
    Configuration for OpenRouter image generation via chat completions.

    OpenRouter uses chat completion endpoints for image generation,
    so we need to transform image generation requests to chat format
    and extract images from chat responses.
    ÚmodelÚreturnc                 ó
   — g d¢S )zÍ
        Get supported OpenAI parameters for OpenRouter image generation.

        Since OpenRouter uses chat completions for image generation,
        we support standard image generation params.
        )ÚsizeÚqualityÚn© )Úselfr   s     ú|/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/openrouter/image_generation/transformation.pyÚget_supported_openai_paramsz;OpenRouterImageGenerationConfig.get_supported_openai_paramsE   s   € ò
ð 	
ó    Únon_default_paramsÚoptional_paramsÚdrop_paramsc                 ó"  — | j                  |«      }|j                  «       D ]j  \  }}||v rY|dk(  r#| j                  |«      }d|vri |d<   ||d   d<   Œ2|dk(  r&| j                  |«      }	|	sŒKd|vri |d<   |	|d   d<   Œ]|||<   Œc|rŒf|||<   Œl |S )zñ
        Map image generation params to OpenRouter chat completion format.

        Maps OpenAI parameters to OpenRouter's image_config format:
        - size -> image_config.aspect_ratio
        - quality -> image_config.image_size
        r   Úimage_configÚaspect_ratior   Ú
image_size)r   ÚitemsÚ_map_size_to_aspect_ratioÚ_map_quality_to_image_size)
r   r   r    r   r!   Úsupported_paramsÚkeyÚvaluer$   r%   s
             r   Úmap_openai_paramsz1OpenRouterImageGenerationConfig.map_openai_paramsR   sÏ   € ð #'×"BÑ"BÀ5Ó"IÐà,×2Ñ2Ó4ò 	-‰JˆC�ØÐ&Ñ&Ø˜&’=à#'×#AÑ#AÀ%Ó#H�LØ%¨_Ñ<Ø:<˜¨Ñ7ØFR�O NÑ3°NÒCØ˜IÒ%à!%×!@Ñ!@ÀÓ!G�JÚ!Ø)°Ñ@Ø>@˜O¨NÑ;ØHR˜¨Ñ7¸ÒEð ,1�O CÒ(Ú à',� Ò$ð)	-ð, Ðr   r   c           	      ó<   — dddddddddœ}|j                  |d«      S )u£  
        Map OpenAI size format to OpenRouter aspect_ratio format.

        OpenAI sizes:
        - 1024x1024 (square)
        - 1536x1024 (landscape)
        - 1024x1536 (portrait)
        - 1792x1024 (wide landscape, dall-e-3)
        - 1024x1792 (tall portrait, dall-e-3)
        - 256x256, 512x512 (dall-e-2)
        - auto (default)

        OpenRouter aspect_ratios:
        - 1:1 â†’ 1024Ã—1024 (default)
        - 2:3 â†’ 832Ã—1248
        - 3:2 â†’ 1248Ã—832
        - 3:4 â†’ 864Ã—1184
        - 4:3 â†’ 1184Ã—864
        - 4:5 â†’ 896Ã—1152
        - 5:4 â†’ 1152Ã—896
        - 9:16 â†’ 768Ã—1344
        - 16:9 â†’ 1344Ã—768
        - 21:9 â†’ 1536Ã—672
        z1:1z3:2z16:9z2:3z9:16)Ú256x256Ú512x512Ú	1024x1024Ú	1536x1024Ú	1792x1024Ú	1024x1536Ú	1024x1792Úauto©Úget)r   r   Úsize_to_aspect_ratios      r   r'   z9OpenRouterImageGenerationConfig._map_size_to_aspect_ratioz   s9   € ð6 ØØàØàØàñ'
Ðð $×'Ñ'¨¨eÓ4Ð4r   r   Nc                 ó6   — dddddddœ}|j                  |«      S )u¦  
        Map OpenAI quality to OpenRouter image_size format.

        OpenAI quality values:
        - auto (default) - automatically select best quality
        - high, medium, low - for GPT image models
        - hd, standard - for dall-e-3

        OpenRouter image_size values (Gemini only):
        - 1K â†’ Standard resolution (default)
        - 2K â†’ Higher resolution
        - 4K â†’ Highest resolution
        Ú1KÚ2KÚ4K)ÚlowÚstandardÚmediumÚhighÚhdr5   r6   )r   r   Úquality_to_image_sizes      r   r(   z:OpenRouterImageGenerationConfig._map_quality_to_image_size£   s1   € ð  ØØØØàñ	(
Ðð %×(Ñ(¨Ó1Ð1r   Úmodel_responseÚresponse_jsonc                 ó”  — |j                  di «      }|�r|j                  dd«      }|j                  dd«      }|j                  di «      }|j                  dd«      }t        |t        d|¬«      ||¬«      |_        |j                  d	«      }	|	�Kt	        |d«      si |_        d|j
                  vri |j
                  d<   t        |	«      |j
                  d   d<   |j                  di «      }
|
r;d|j
                  vri |j
                  d<   |j
                  d   j                  |
«       |j                  d|«      |j
                  d<   y
)a  
        Extract and set usage and cost information from OpenRouter response.

        Args:
            model_response: ImageResponse object to populate
            response_json: Parsed JSON response from OpenRouter
            model: The model name
        ÚusageÚprompt_tokensr   Útotal_tokensÚcompletion_tokens_detailsÚimage_tokens)rJ   Útext_tokens)Úinput_tokensÚinput_tokens_detailsÚoutput_tokensrH   ÚcostNÚ_hidden_paramsÚadditional_headersz$llm_provider-x-litellm-response-costÚcost_detailsÚresponse_cost_detailsr   )r7   r   r   rF   ÚhasattrrP   ÚfloatÚupdate)r   rC   rD   r   Ú
usage_datarG   rH   rI   rJ   rO   rR   s              r   Ú_set_usage_and_costz3OpenRouterImageGenerationConfig._set_usage_and_cost½   sX  € ð *×-Ñ-¨g°rÓ:ˆ
ÚØ#-§>¡>°/À1Ó#EˆMØ",§.¡.°ÀÓ"CˆLà/9¯~©~Ð>YÐ[]Ó/^Ð%Ø";×"?Ñ"?ÀÐPQÓ"RˆLä#-Ø*Ü%AØ!"Ø -ô&ð +Ø)ô$ˆNÔ ð %Ÿ.™.¨Ó0ˆDØÐÜ˜~Ð/?Ô@Ø46�NÔ1Ø'¨~×/LÑ/LÑLØJL�N×1Ñ1Ð2FÑGÜnsØóo�×-Ñ-Ð.BÑCÐDjÑkð #-§.¡.°ÀÓ"DˆLÙØ*°.×2OÑ2OÑOØMO�N×1Ñ1Ð2IÑJØ×-Ñ-Ð.EÑF×MÑMÈlÔ[à1>×1BÑ1BÀ7ÈEÓ1Rˆ×%Ñ% gÒ.r   Úapi_baseÚapi_keyÚlitellm_paramsÚstreamc                 óZ   — |r)|j                  d«      s|j                  d«      }|› d�S |S y)zÏ
        Get the complete URL for OpenRouter image generation.

        OpenRouter uses chat completions endpoint for image generation.
        Default: https://openrouter.ai/api/v1/chat/completions
        z/chat/completionsú/z-https://openrouter.ai/api/v1/chat/completions)ÚendswithÚrstrip)r   rY   rZ   r   r    r[   r\   s          r   Úget_complete_urlz0OpenRouterImageGenerationConfig.get_complete_urlï   s:   € ñ Ø×$Ñ$Ð%8Ô9Ø#Ÿ?™?¨3Ó/�Ø"˜Ð#4Ð5Ð5ØˆOà>r   ÚheadersÚmessagesc                 ót   — |xs t         j                  xs t        d«      }|j                  dd|› �i«       |S )NÚOPENROUTER_API_KEYÚAuthorizationzBearer )ÚlitellmrZ   r
   rV   )r   rb   r   rc   r    r[   rZ   rY   s           r   Úvalidate_environmentz4OpenRouterImageGenerationConfig.validate_environment  sA   € ð ÒTœWŸ_™_ÒT´Ð?SÓ0TˆØ�‰à 7¨7¨)Ð!4ðô	
ð
 ˆr   Úpromptc                 ó\   — |d|dœgdœ}|j                  «       D ]  \  }}|dvsŒ|||<   Œ |S )a¶  
        Transform image generation request to OpenRouter chat completion format.

        Args:
            model: The model name
            prompt: The image generation prompt
            optional_params: Optional parameters (including image_config)
            litellm_params: LiteLLM parameters
            headers: Request headers

        Returns:
            dict: Request body in chat completion format with image_config
        Úuser)ÚroleÚcontent)r   rc   )r   rc   Ú
modalities)r&   )	r   r   ri   r    r[   rb   Úrequest_bodyr*   r+   s	            r   Ú"transform_image_generation_requestzBOpenRouterImageGenerationConfig.transform_image_generation_request  sR   € ð, Ø"(°VÑ<Ð=ñ
ˆð *×/Ñ/Ó1ò 	*‰JˆC�ØÐ=Ò=Ø$)�˜SÒ!ð	*ð Ðr   Úraw_responseÚlogging_objÚrequest_dataÚencodingztiktoken.Encoding | NoneÚ	json_modec           	      ó  — 	 |j                  «       }|j
                  sg |_        	 |j                  dg «      }|D ]Ú  }|j                  di «      }|j                  dg «      }|D ]¯  }|j                  di «      }|j                  d«      }|sŒ)|j                  d	«      rO|j                  d
d«      }t        |«      dkD  r|d   nd}|j
                  j                  t        |dd¬«      «       Œ‰|j
                  j                  t        d|d¬«      «       Œ± ŒÜ | j                  |||«       |S # t        $ r*}t        d|› �|j                  |j                  ¬«      ‚d}~ww xY w# t        $ r}t        d|› �di ¬«      ‚d}~ww xY w)aµ  
        Transform OpenRouter chat completion response to ImageResponse format.

        Extracts images from the message content and maps usage/cost information.

        Args:
            model: The model name
            raw_response: Raw HTTP response from OpenRouter
            model_response: ImageResponse object to populate
            logging_obj: Logging object
            request_data: Original request data
            optional_params: Optional parameters
            litellm_params: LiteLLM parameters
            encoding: Encoding
            api_key: API key
            json_mode: JSON mode flag

        Returns:
            ImageResponse: Populated image response
        z#Error parsing OpenRouter response: ©ÚmessageÚstatus_coderb   NÚchoicesrx   ÚimagesÚ	image_urlÚurlzdata:ú,é   )Úb64_jsonr}   Úrevised_promptz9Error transforming OpenRouter image generation response: iô  )ÚjsonÚ	Exceptionr	   ry   rb   Údatar7   Ú
startswithÚsplitÚlenÚappendr   rX   )r   r   rq   rC   rr   rs   r    r[   rt   rZ   ru   rD   Úerz   Úchoicerx   r{   Ú
image_dataÚimage_url_objr|   ÚpartsÚb64_datas                         r   Ú#transform_image_generation_responsezCOpenRouterImageGenerationConfig.transform_image_generation_response9  sª  € ðB	Ø#/×#4Ñ#4Ó#6ˆMð ×"Ò"Ø"$ˆNÔð,	Ø*×.Ñ.¨y¸"Ó=ˆGà!ò �Ø Ÿ*™* Y°Ó3�Ø Ÿ™ X¨rÓ2�à"(ò �JØ$.§N¡N°;ÀÓ$C�MØ -× 1Ñ 1°%Ó 8�Iâ Ø$×/Ñ/°Ô8ð %.§O¡O°C¸Ó$;˜EÜ36°u³:À²> u¨Q¢xÀt˜Hà*×/Ñ/×6Ñ6Ü +Ø-5Ø(,Ø37ô!"õð +×/Ñ/×6Ñ6Ü +Ø-1Ø(1Ø37ô!"õñ'ð	ð@ ×$Ñ$ ^°]ÀEÔJà!Ð!øô_ ò 	Ü%Ø=¸a¸SÐAØ(×4Ñ4Ø$×,Ñ,ôð ûð	ûôb ò 	Ü%ØSÐTUÐSVÐWØØôð ûð	ús6   ‚D, ¦A%E" ÂBE" Ä,	EÄ5%EÅEÅ"	FÅ+E<Å<FÚerror_messagery   c                 ó   — t        |||¬«      S )z6Get the appropriate error class for OpenRouter errors.rw   r   )r   r�   ry   rb   s       r   Úget_error_classz/OpenRouterImageGenerationConfig.get_error_class”  s   € ä"Ø!Ø#Øô
ð 	
r   )N)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚlistr   r   ÚdictÚboolr,   r'   r(   r   rX   ra   r   rh   rp   ÚhttpxÚResponseÚLiteLLMLoggingObjr�   ÚintÚHeadersr   r’   r   r   r   r   r   <   su  „ ñð
°ð 
¸Ð>aÑ9bó 
ð&à ð&ð ð&ð ð	&ð
 ð&ð 
ó&ðP'5¨cð '5°có '5ðR2°#ð 2¸#À¹*ó 2ð40Sà%ð0Sð ð0Sð ð	0Sð
 
ó0Sðr #ñ?à˜‘*ð?ð �t‘ð?ð ð	?ð
 ð?ð ð?ð �t‘ð?ð 
ó?ð< #Ø#ñàðð ðð Ð'Ñ(ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óð$àðð ðð ð	ð
 ðð ðð 
óðV #Ø!%ñYàðYð —n‘nðYð &ð	Yð
 'ðYð ðYð ðYð ðYð -ðYð �t‘ðYð ˜$‘;ðYð 
óYðv
¨Sð 
¸sð 
ÈTÐTY×TaÑTaÑMað 
Ðfvô 
r   r   )r–   Útypingr   r   r   r›   rg   Ú)litellm.llms.base_llm.chat.transformationr   Ú5litellm.llms.base_llm.image_generation.transformationr   Ú$litellm.llms.openrouter.common_utilsr	   Úlitellm.secret_managers.mainr
   Úlitellm.types.llms.openair   r   Úlitellm.types.utilsr   r   r   r   ÚtiktokenÚ*litellm.litellm_core_utils.litellm_loggingr   r�   r   r   r   r   ú<module>r©      sX   ðñ÷: -Ñ ,ã ã Ý Fõõ EÝ 7÷÷ó ñ ÛæWàÐô^
Ð&?õ ^
r   