o
    i                  
   @   s0  d Z ddlZddlZdejd< ddlmZmZ ddlmZm	Z	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 ddlmZ ddlmZ ddlmZmZmZ zddlmZ ddl m!Z! W n  e"y Z# ze$de#  e$d e%de# dZ#[#ww eG dd deZ&G dd deZ'dS )zGoogle AI image generation service implementation.

This module provides integration with Google's Imagen model for generating
images from text prompts using the Google AI API.
    NfalseGRPC_ENABLE_FORK_SUPPORT)	dataclassfield)AnyAsyncGeneratorOptional)logger)Image)	BaseModelField)
ErrorFrameFrameURLImageRawFrame)!update_google_client_http_options)ImageGenService)	NOT_GIVENImageGenSettings	_NotGiven)genai)typeszException: zHIn order to use Google AI, you need to `pip install pipecat-ai[google]`.zMissing module: c                   @   sJ   e Zd ZU dZedd dZeeB ed< edd dZ	e
dB eB ed< dS )	GoogleImageGenSettingsa  Settings for the Google image generation service.

    Parameters:
        model: Google Imagen model identifier.
        number_of_images: Number of images to generate per request.
        negative_prompt: Text describing what not to include in generated images.
    c                   C      t S Nr    r   r   Q/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/services/google/image.py<lambda>2       zGoogleImageGenSettings.<lambda>)default_factorynumber_of_imagesc                   C   r   r   r   r   r   r   r   r   3   r   Nnegative_prompt)__name__
__module____qualname____doc__r   r    intr   __annotations__r!   strr   r   r   r   r   (   s   
 "r   c                
       s   e Zd ZU dZeZeed< G dd deZddddde	de
e d	e
e d
e
e f fddZdefddZde	deedf fddZ  ZS )GoogleImageGenServicea  Google AI image generation service using Imagen models.

    Provides text-to-image generation capabilities using Google's Imagen models
    through the Google AI API. Supports multiple image generation and negative
    prompting for enhanced control over generated content.
    	_settingsc                   @   sP   e Zd ZU dZeddddZeed< eddZe	ed< ed	dZ
ee	 ed
< d	S )z!GoogleImageGenService.InputParamsa  Configuration parameters for Google image generation.

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

        Parameters:
            number_of_images: Number of images to generate (1-8). Defaults to 1.
            model: Google Imagen model to use. Defaults to "imagen-3.0-generate-002".
            negative_prompt: Optional negative prompt to guide what not to include.
              )defaultgeler    imagen-3.0-generate-002)r-   modelNr!   )r"   r#   r$   r%   r   r    r&   r'   r1   r(   r!   r   r   r   r   r   InputParamsA   s
   
 r2   N)paramshttp_optionssettingsapi_keyr3   r4   r5   c                   s   | j dddd}|dur| d |s|j|_|j|_|j|_|dur(|| t jdd|i| t|}t	j
||d| _dS )	aq  Initialize the GoogleImageGenService with API key and parameters.

        Args:
            api_key: Google AI API key for authentication.
            params: Configuration parameters for image generation.

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

            http_options: HTTP options for the client.
            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            **kwargs: Additional arguments passed to the parent ImageGenService.
        r0   r+   N)r1   r    r!   r3   r5   )r6   r4   r   )Settings"_warn_init_param_moved_to_settingsr1   r    r!   apply_updatesuper__init__r   r   Client_client)selfr6   r3   r4   r5   kwargsdefault_settings	__class__r   r   r;   Q   s    

zGoogleImageGenService.__init__returnc                 C   s   dS )zCheck if this service can generate processing metrics.

        Returns:
            True, as Google image generation service supports metrics.
        Tr   )r>   r   r   r   can_generate_metrics   s   z*GoogleImageGenService.can_generate_metricspromptc              
   C  s   t d|  |  I dH  zQ| jjjj| jj|t	j
| jj| jjddI dH }|  I dH  |r6|js>tdV  W dS |jD ]}|jj}tt|}td| |j|jd}|V  qAW dS  ty~ } ztdt| V  W Y d}~dS d}~ww )a  Generate images from a text prompt using Google's Imagen model.

        Args:
            prompt: The text description to generate images from.

        Yields:
            Frame: Generated URLImageRawFrame objects containing the generated
                images, or ErrorFrame objects if generation fails.

        Raises:
            Exception: If there are issues with the Google AI API or image processing.
        zGenerating image from prompt: N)r    r!   )r1   rE   configzImage generation failed)urlimagesizeformatzImage generation error: )r	   debugstart_ttfb_metricsr=   aiomodelsgenerate_imagesr*   r1   r   GenerateImagesConfigr    r!   stop_ttfb_metricsgenerated_imagesr   rH   image_bytesr
   openioBytesIOr   tobytesrI   rJ   	Exceptionr(   )r>   rE   responseimg_responserS   rH   frameer   r   r   run_image_gen   s>   



"z#GoogleImageGenService.run_image_gen)r"   r#   r$   r%   r   r7   r'   r   r2   r(   r   r   r;   boolrD   r   r   r]   __classcell__r   r   rA   r   r)   6   s&   
 1"r)   )(r%   rU   osenvirondataclassesr   r   typingr   r   r   logurur	   PILr
   pydanticr   r   pipecat.frames.framesr   r   r   pipecat.services.google.utilsr   pipecat.services.image_servicer   pipecat.services.settingsr   r   r   googler   google.genair   ModuleNotFoundErrorr\   errorrX   r   r)   r   r   r   r   <module>   s2   

