o
    iI                     @   s   d Z ddlZddlZddlmZmZ ddlmZmZ ddl	Z	ddl
mZ ddlmZmZmZ ddlmZ ddlmZmZmZ eG d	d
 d
eZG dd deZdS )zAzure OpenAI image generation service implementation.

This module provides integration with Azure's OpenAI image generation API
using REST endpoints for creating images from text prompts.
    N)	dataclassfield)AsyncGeneratorOptional)Image)
ErrorFrameFrameURLImageRawFrame)ImageGenService)	NOT_GIVENImageGenSettings	_NotGivenc                   @   s0   e Zd ZU dZedd dZedB eB ed< dS )AzureImageGenSettingszSettings for the Azure image generation service.

    Parameters:
        model: Azure image generation model identifier.
        image_size: Target size for generated images.
    c                   C   s   t S )N)r    r   r   P/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/services/azure/image.py<lambda>#   s    zAzureImageGenSettings.<lambda>)default_factoryN
image_size)	__name__
__module____qualname____doc__r   r   strr   __annotations__r   r   r   r   r      s   
 "r   c                       s|   e Zd ZU dZeZeed< ddddddee deded	ee d
e	j
dee f fddZdedeedf fddZ  ZS )AzureImageGenServiceRESTzAzure OpenAI REST-based image generation service.

    Provides image generation using Azure's OpenAI service via REST API.
    Supports asynchronous image generation with polling for completion
    and automatic image download and processing.
    	_settingsNz2023-06-01-preview)r   modelapi_versionsettingsr   api_keyendpointr   aiohttp_sessionr   c          	         s~   | j ddd}|dur| dd ||_|dur!| dd ||_|dur*|| t j|d || _|| _|| _	|| _
dS )a{  Initialize the AzureImageGenServiceREST.

        Args:
            image_size: Size specification for generated images (e.g., "1024x1024").

                .. deprecated:: 0.0.105
                    Use ``settings=AzureImageGenServiceREST.Settings(image_size=...)`` instead.

            api_key: Azure OpenAI API key for authentication.
            endpoint: Azure OpenAI endpoint URL.
            model: The image generation model to use.

                .. deprecated:: 0.0.105
                    Use ``settings=AzureImageGenServiceREST.Settings(model=...)`` instead.

            aiohttp_session: Shared aiohttp session for HTTP requests.
            api_version: Azure API version string. Defaults to "2023-06-01-preview".
            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
        N)r   r   r   r   )r   )Settings"_warn_init_param_moved_to_settingsr   r   apply_updatesuper__init___api_key_azure_endpoint_api_version_aiohttp_session)	selfr   r   r    r   r!   r   r   default_settings	__class__r   r   r&   1   s"    

z!AzureImageGenServiceREST.__init__promptreturnc              
   C  s  | j  d| j }| jdd}|dd}| jjdur!| jj|d< | jj|||d4 I dH }|jd	 }d
}d}d}	|dkry|d8 }|dkrWtdV  	 W d  I dH  dS t	
dI dH  | jj||dI dH }
|
 I dH }	|	d }|dks>|	r|	d d d d nd}|stdV  	 W d  I dH  dS | j|4 I dH *}
t|
j I dH }t|}t|| |j|jd}|V  W d  I dH  n1 I dH sw   Y  W d  I dH  dS 1 I dH sw   Y  dS )a  Generate an image from a text prompt using Azure OpenAI.

        Args:
            prompt: The text prompt describing the desired image.

        Yields:
            URLImageRawFrame containing the generated image data, or
            ErrorFrame if generation fails.
        z-openai/images/generations:submit?api-version=zapplication/json)zapi-keyzContent-Type   )r/   nNsize)headersjsonzoperation-location x   	succeededr   zImage generation timed out)r4   statusresultdataurlzImage generation failed)r<   imager3   format)r(   r)   r'   r   r   r*   postr4   r   asynciosleepgetr5   ioBytesIOcontentreadr   openr	   tobytesr3   r>   )r+   r/   r<   r4   body
submissionoperation_locationr9   attempts_leftjson_responseresponse	image_urlimage_streamr=   framer   r   r   run_image_genj   sL   




*.z&AzureImageGenServiceREST.run_image_gen)r   r   r   r   r   r"   r   r   r   aiohttpClientSessionr&   r   r   rR   __classcell__r   r   r-   r   r   &   s,   
 	"9r   )r   r@   rC   dataclassesr   r   typingr   r   rS   PILr   pipecat.frames.framesr   r   r	   pipecat.services.image_servicer
   pipecat.services.settingsr   r   r   r   r   r   r   r   r   <module>   s   