"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""

from .basesdk import BaseSDK
from r9s import errors, models, utils
from r9s._hooks import HookContext
from r9s.types import OptionalNullable, UNSET
from r9s.utils import eventstreaming
from r9s.utils.unmarshal_json_response import unmarshal_json_response
from typing import Any, Literal, Mapping, Optional, Union, overload


class Images(BaseSDK):
    @overload
    def create(
        self,
        *,
        prompt: str,
        model: Optional[str] = None,
        n: Optional[int] = 1,
        quality: Optional[models.Quality] = None,
        response_format: Optional[models.ImageGenerationRequestResponseFormat] = None,
        size: Optional[models.Size] = "1024x1024",
        style: Optional[models.Style] = None,
        user: Optional[str] = None,
        # GPT Image model parameters
        background: Optional[models.ImageGenerationBackground] = None,
        moderation: Optional[models.ImageGenerationModeration] = None,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageGenerationOutputFormat] = None,
        partial_images: Optional[int] = None,
        stream: Union[Literal[False], None] = None,
        # Extended parameters for advanced providers
        negative_prompt: Optional[str] = None,
        seed: Optional[int] = None,
        prompt_extend: Optional[bool] = None,
        watermark: Optional[bool] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> models.ImageGenerationResponse:
        ...

    @overload
    def create(
        self,
        *,
        prompt: str,
        model: Optional[str] = None,
        n: Optional[int] = 1,
        quality: Optional[models.Quality] = None,
        response_format: Optional[models.ImageGenerationRequestResponseFormat] = None,
        size: Optional[models.Size] = "1024x1024",
        style: Optional[models.Style] = None,
        user: Optional[str] = None,
        # GPT Image model parameters
        background: Optional[models.ImageGenerationBackground] = None,
        moderation: Optional[models.ImageGenerationModeration] = None,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageGenerationOutputFormat] = None,
        partial_images: Optional[int] = None,
        stream: Literal[True] = ...,
        # Extended parameters for advanced providers
        negative_prompt: Optional[str] = None,
        seed: Optional[int] = None,
        prompt_extend: Optional[bool] = None,
        watermark: Optional[bool] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> eventstreaming.EventStream[models.CreateImageGenerationResponseBody]:
        ...

    def create(
        self,
        *,
        prompt: str,
        model: Optional[str] = None,
        n: Optional[int] = 1,
        quality: Optional[models.Quality] = None,
        response_format: Optional[models.ImageGenerationRequestResponseFormat] = None,
        size: Optional[models.Size] = "1024x1024",
        style: Optional[models.Style] = None,
        user: Optional[str] = None,
        # GPT Image model parameters
        background: Optional[models.ImageGenerationBackground] = None,
        moderation: Optional[models.ImageGenerationModeration] = None,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageGenerationOutputFormat] = None,
        partial_images: Optional[int] = None,
        stream: Optional[bool] = None,
        # Extended parameters for advanced providers
        negative_prompt: Optional[str] = None,
        seed: Optional[int] = None,
        prompt_extend: Optional[bool] = None,
        watermark: Optional[bool] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> Union[models.ImageGenerationResponse, eventstreaming.EventStream[models.CreateImageGenerationResponseBody]]:
        r"""Create image

        Generate images from text prompts

        :param prompt: Image description prompt
        :param model: Model name
        :param n: Number of images to generate
        :param quality:
        :param response_format:
        :param size:
        :param style:
        :param user:
        :param background: Background transparency setting (GPT models only)
        :param moderation: Content moderation level (GPT models only)
        :param output_compression: Compression level for webp/jpeg (GPT models only)
        :param output_format: Output format (GPT models only)
        :param partial_images: Number of partial images for streaming (GPT models only)
        :param stream: Enable streaming mode (GPT models only)
        :param negative_prompt: Negative prompt to exclude elements (Qwen, Stability)
        :param seed: Random seed for reproducibility
        :param prompt_extend: Enable AI prompt optimization (Qwen-specific)
        :param watermark: Add watermark to generated images (Qwen-specific)
        :param retries: Override the default retry configuration for this method
        :param server_url: Override the default server URL for this method
        :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
        :param http_headers: Additional headers to set or replace on requests.
        """
        base_url = None
        url_variables = None
        if timeout_ms is None:
            timeout_ms = self.sdk_configuration.timeout_ms

        if server_url is not None:
            base_url = server_url
        else:
            base_url = self._get_url(base_url, url_variables)

        request = models.ImageGenerationRequest(
            prompt=prompt,
            model=model,
            n=n,
            quality=quality,
            response_format=response_format,
            size=size,
            style=style,
            user=user,
            background=background,
            moderation=moderation,
            output_compression=output_compression,
            output_format=output_format,
            partial_images=partial_images,
            stream=stream,
            negative_prompt=negative_prompt,
            seed=seed,
            prompt_extend=prompt_extend,
            watermark=watermark,
        )

        req = self._build_request(
            method="POST",
            path="/images/generations",
            base_url=base_url,
            url_variables=url_variables,
            request=request,
            request_body_required=True,
            request_has_path_params=False,
            request_has_query_params=True,
            user_agent_header="user-agent",
            accept_header_value="text/event-stream" if stream else "application/json",
            http_headers=http_headers,
            security=self.sdk_configuration.security,
            get_serialized_body=lambda: utils.serialize_request_body(
                request, False, False, "json", models.ImageGenerationRequest
            ),
            allow_empty_value=None,
            timeout_ms=timeout_ms,
        )

        if retries == UNSET:
            if self.sdk_configuration.retry_config is not UNSET:
                retries = self.sdk_configuration.retry_config

        retry_config = None
        if isinstance(retries, utils.RetryConfig):
            retry_config = (retries, ["429", "500", "502", "503", "504"])

        http_res = self.do_request(
            hook_ctx=HookContext(
                config=self.sdk_configuration,
                base_url=base_url or "",
                operation_id="createImageGeneration",
                oauth2_scopes=None,
                security_source=self.sdk_configuration.security,
            ),
            request=req,
            error_status_codes=[
                "400",
                "401",
                "403",
                "422",
                "429",
                "4XX",
                "500",
                "503",
                "5XX",
            ],
            retry_config=retry_config,
            stream=True,
        )

        response_data: Any = None
        if utils.match_response(http_res, "200", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            return unmarshal_json_response(
                models.ImageGenerationResponse, http_res, http_res_text
            )
        if utils.match_response(http_res, "200", "text/event-stream"):
            return eventstreaming.EventStream(
                http_res,
                lambda raw: utils.unmarshal_json(raw, models.CreateImageGenerationResponseBody),
                sentinel="[DONE]",
                client_ref=self,
            )
        if utils.match_response(http_res, "400", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.BadRequestErrorData, http_res, http_res_text
            )
            raise errors.BadRequestError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "401", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.AuthenticationErrorData, http_res, http_res_text
            )
            raise errors.AuthenticationError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "403", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.PermissionDeniedErrorData, http_res, http_res_text
            )
            raise errors.PermissionDeniedError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "422", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.UnprocessableEntityErrorData, http_res, http_res_text
            )
            raise errors.UnprocessableEntityError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "429", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(errors.RateLimitErrorData, http_res, http_res_text)
            raise errors.RateLimitError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "500", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.InternalServerErrorData, http_res, http_res_text
            )
            raise errors.InternalServerError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "503", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.ServiceUnavailableErrorData, http_res, http_res_text
            )
            raise errors.ServiceUnavailableError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "4XX", "*"):
            http_res_text = utils.stream_to_text(http_res)
            raise errors.R9SDefaultError("API error occurred", http_res, http_res_text)
        if utils.match_response(http_res, "5XX", "*"):
            http_res_text = utils.stream_to_text(http_res)
            raise errors.R9SDefaultError("API error occurred", http_res, http_res_text)

        raise errors.R9SDefaultError("Unexpected response received", http_res)

    @overload
    async def create_async(
        self,
        *,
        prompt: str,
        model: Optional[str] = None,
        n: Optional[int] = 1,
        quality: Optional[models.Quality] = None,
        response_format: Optional[models.ImageGenerationRequestResponseFormat] = None,
        size: Optional[models.Size] = "1024x1024",
        style: Optional[models.Style] = None,
        user: Optional[str] = None,
        # GPT Image model parameters
        background: Optional[models.ImageGenerationBackground] = None,
        moderation: Optional[models.ImageGenerationModeration] = None,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageGenerationOutputFormat] = None,
        partial_images: Optional[int] = None,
        stream: Union[Literal[False], None] = None,
        # Extended parameters for advanced providers
        negative_prompt: Optional[str] = None,
        seed: Optional[int] = None,
        prompt_extend: Optional[bool] = None,
        watermark: Optional[bool] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> models.ImageGenerationResponse:
        ...

    @overload
    async def create_async(
        self,
        *,
        prompt: str,
        model: Optional[str] = None,
        n: Optional[int] = 1,
        quality: Optional[models.Quality] = None,
        response_format: Optional[models.ImageGenerationRequestResponseFormat] = None,
        size: Optional[models.Size] = "1024x1024",
        style: Optional[models.Style] = None,
        user: Optional[str] = None,
        # GPT Image model parameters
        background: Optional[models.ImageGenerationBackground] = None,
        moderation: Optional[models.ImageGenerationModeration] = None,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageGenerationOutputFormat] = None,
        partial_images: Optional[int] = None,
        stream: Literal[True] = ...,
        # Extended parameters for advanced providers
        negative_prompt: Optional[str] = None,
        seed: Optional[int] = None,
        prompt_extend: Optional[bool] = None,
        watermark: Optional[bool] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> eventstreaming.EventStreamAsync[models.CreateImageGenerationResponseBody]:
        ...

    async def create_async(
        self,
        *,
        prompt: str,
        model: Optional[str] = None,
        n: Optional[int] = 1,
        quality: Optional[models.Quality] = None,
        response_format: Optional[models.ImageGenerationRequestResponseFormat] = None,
        size: Optional[models.Size] = "1024x1024",
        style: Optional[models.Style] = None,
        user: Optional[str] = None,
        # GPT Image model parameters
        background: Optional[models.ImageGenerationBackground] = None,
        moderation: Optional[models.ImageGenerationModeration] = None,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageGenerationOutputFormat] = None,
        partial_images: Optional[int] = None,
        stream: Optional[bool] = None,
        # Extended parameters for advanced providers
        negative_prompt: Optional[str] = None,
        seed: Optional[int] = None,
        prompt_extend: Optional[bool] = None,
        watermark: Optional[bool] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> Union[models.ImageGenerationResponse, eventstreaming.EventStreamAsync[models.CreateImageGenerationResponseBody]]:
        r"""Create image

        Generate images from text prompts

        :param prompt: Image description prompt
        :param model: Model name
        :param n: Number of images to generate
        :param quality:
        :param response_format:
        :param size:
        :param style:
        :param user:
        :param background: Background transparency setting (GPT models only)
        :param moderation: Content moderation level (GPT models only)
        :param output_compression: Compression level for webp/jpeg (GPT models only)
        :param output_format: Output format (GPT models only)
        :param partial_images: Number of partial images for streaming (GPT models only)
        :param stream: Enable streaming mode (GPT models only)
        :param negative_prompt: Negative prompt to exclude elements (Qwen, Stability)
        :param seed: Random seed for reproducibility
        :param prompt_extend: Enable AI prompt optimization (Qwen-specific)
        :param watermark: Add watermark to generated images (Qwen-specific)
        :param retries: Override the default retry configuration for this method
        :param server_url: Override the default server URL for this method
        :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
        :param http_headers: Additional headers to set or replace on requests.
        """
        base_url = None
        url_variables = None
        if timeout_ms is None:
            timeout_ms = self.sdk_configuration.timeout_ms

        if server_url is not None:
            base_url = server_url
        else:
            base_url = self._get_url(base_url, url_variables)

        request = models.ImageGenerationRequest(
            prompt=prompt,
            model=model,
            n=n,
            quality=quality,
            response_format=response_format,
            size=size,
            style=style,
            user=user,
            background=background,
            moderation=moderation,
            output_compression=output_compression,
            output_format=output_format,
            partial_images=partial_images,
            stream=stream,
            negative_prompt=negative_prompt,
            seed=seed,
            prompt_extend=prompt_extend,
            watermark=watermark,
        )

        req = self._build_request_async(
            method="POST",
            path="/images/generations",
            base_url=base_url,
            url_variables=url_variables,
            request=request,
            request_body_required=True,
            request_has_path_params=False,
            request_has_query_params=True,
            user_agent_header="user-agent",
            accept_header_value="text/event-stream" if stream else "application/json",
            http_headers=http_headers,
            security=self.sdk_configuration.security,
            get_serialized_body=lambda: utils.serialize_request_body(
                request, False, False, "json", models.ImageGenerationRequest
            ),
            allow_empty_value=None,
            timeout_ms=timeout_ms,
        )

        if retries == UNSET:
            if self.sdk_configuration.retry_config is not UNSET:
                retries = self.sdk_configuration.retry_config

        retry_config = None
        if isinstance(retries, utils.RetryConfig):
            retry_config = (retries, ["429", "500", "502", "503", "504"])

        http_res = await self.do_request_async(
            hook_ctx=HookContext(
                config=self.sdk_configuration,
                base_url=base_url or "",
                operation_id="createImageGeneration",
                oauth2_scopes=None,
                security_source=self.sdk_configuration.security,
            ),
            request=req,
            error_status_codes=[
                "400",
                "401",
                "403",
                "422",
                "429",
                "4XX",
                "500",
                "503",
                "5XX",
            ],
            retry_config=retry_config,
            stream=True,
        )

        response_data: Any = None
        if utils.match_response(http_res, "200", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            return unmarshal_json_response(
                models.ImageGenerationResponse, http_res, http_res_text
            )
        if utils.match_response(http_res, "200", "text/event-stream"):
            return eventstreaming.EventStreamAsync(
                http_res,
                lambda raw: utils.unmarshal_json(raw, models.CreateImageGenerationResponseBody),
                sentinel="[DONE]",
                client_ref=self,
            )
        if utils.match_response(http_res, "400", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.BadRequestErrorData, http_res, http_res_text
            )
            raise errors.BadRequestError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "401", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.AuthenticationErrorData, http_res, http_res_text
            )
            raise errors.AuthenticationError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "403", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.PermissionDeniedErrorData, http_res, http_res_text
            )
            raise errors.PermissionDeniedError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "422", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.UnprocessableEntityErrorData, http_res, http_res_text
            )
            raise errors.UnprocessableEntityError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "429", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(errors.RateLimitErrorData, http_res, http_res_text)
            raise errors.RateLimitError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "500", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.InternalServerErrorData, http_res, http_res_text
            )
            raise errors.InternalServerError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "503", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.ServiceUnavailableErrorData, http_res, http_res_text
            )
            raise errors.ServiceUnavailableError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "4XX", "*"):
            http_res_text = await utils.stream_to_text_async(http_res)
            raise errors.R9SDefaultError("API error occurred", http_res, http_res_text)
        if utils.match_response(http_res, "5XX", "*"):
            http_res_text = await utils.stream_to_text_async(http_res)
            raise errors.R9SDefaultError("API error occurred", http_res, http_res_text)

        raise errors.R9SDefaultError("Unexpected response received", http_res)

    @overload
    def edit(
        self,
        *,
        image: Union[
            models.ImageFile,
            models.ImageFileTypedDict,
            list[Union[models.ImageFile, models.ImageFileTypedDict]]
        ],
        prompt: str,
        background: Optional[models.ImageEditBackground] = None,
        input_fidelity: Optional[models.ImageEditInputFidelity] = "low",
        mask: Optional[Union[models.ImageFile, models.ImageFileTypedDict]] = None,
        model: Optional[str] = None,
        moderation: Optional[models.ImageEditModeration] = None,
        n: Optional[int] = 1,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageEditOutputFormat] = None,
        partial_images: Optional[int] = 0,
        quality: Optional[models.ImageEditQuality] = None,
        response_format: Optional[models.ImageEditResponseFormat] = None,
        size: Optional[models.ImageEditSize] = "1024x1024",
        stream: Union[Literal[False], None] = None,
        user: Optional[str] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> models.ImageGenerationResponse:
        ...

    @overload
    def edit(
        self,
        *,
        image: Union[
            models.ImageFile,
            models.ImageFileTypedDict,
            list[Union[models.ImageFile, models.ImageFileTypedDict]]
        ],
        prompt: str,
        background: Optional[models.ImageEditBackground] = None,
        input_fidelity: Optional[models.ImageEditInputFidelity] = "low",
        mask: Optional[Union[models.ImageFile, models.ImageFileTypedDict]] = None,
        model: Optional[str] = None,
        moderation: Optional[models.ImageEditModeration] = None,
        n: Optional[int] = 1,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageEditOutputFormat] = None,
        partial_images: Optional[int] = 0,
        quality: Optional[models.ImageEditQuality] = None,
        response_format: Optional[models.ImageEditResponseFormat] = None,
        size: Optional[models.ImageEditSize] = "1024x1024",
        stream: Literal[True] = ...,
        user: Optional[str] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> eventstreaming.EventStream[models.EditImageResponseBody]:
        ...

    def edit(
        self,
        *,
        image: Union[
            models.ImageFile,
            models.ImageFileTypedDict,
            list[Union[models.ImageFile, models.ImageFileTypedDict]]
        ],
        prompt: str,
        background: Optional[models.ImageEditBackground] = None,
        input_fidelity: Optional[models.ImageEditInputFidelity] = "low",
        mask: Optional[Union[models.ImageFile, models.ImageFileTypedDict]] = None,
        model: Optional[str] = None,
        moderation: Optional[models.ImageEditModeration] = None,
        n: Optional[int] = 1,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageEditOutputFormat] = None,
        partial_images: Optional[int] = 0,
        quality: Optional[models.ImageEditQuality] = None,
        response_format: Optional[models.ImageEditResponseFormat] = None,
        size: Optional[models.ImageEditSize] = "1024x1024",
        stream: Optional[bool] = None,
        user: Optional[str] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> Union[models.ImageGenerationResponse, eventstreaming.EventStream[models.EditImageResponseBody]]:
        r"""Edit image

        Edit an existing image using a text prompt (inpainting).

        :param image: The image to edit (PNG, <4MB, square)
        :param prompt: Text description of desired edit
        :param model: Model name
        :param mask: Optional mask PNG with transparent edit regions
        :param n: Number of images to generate (1-10)
        :param size: Output size
        :param response_format: 'url' or 'b64_json'
        :param user: End-user identifier
        :param retries: Override the default retry configuration for this method
        :param server_url: Override the default server URL for this method
        :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
        :param http_headers: Additional headers to set or replace on requests.
        """
        base_url = None
        url_variables = None
        if timeout_ms is None:
            timeout_ms = self.sdk_configuration.timeout_ms

        if server_url is not None:
            base_url = server_url
        else:
            base_url = self._get_url(base_url, url_variables)

        # Handle list of images - use first image if list is provided
        image_to_use = image[0] if isinstance(image, list) else image

        request = models.ImageEditRequest(
            image=utils.get_pydantic_model(image_to_use, models.ImageFile),
            prompt=prompt,
            background=background,
            input_fidelity=input_fidelity,
            mask=utils.get_pydantic_model(mask, models.ImageFile) if mask else None,
            model=model,
            moderation=moderation,
            n=n,
            output_compression=output_compression,
            output_format=output_format,
            partial_images=partial_images,
            quality=quality,
            response_format=response_format,
            size=size,
            stream=stream,
            user=user,
        )

        req = self._build_request(
            method="POST",
            path="/images/edits",
            base_url=base_url,
            url_variables=url_variables,
            request=request,
            request_body_required=True,
            request_has_path_params=False,
            request_has_query_params=True,
            user_agent_header="user-agent",
            accept_header_value="text/event-stream" if stream else "application/json",
            http_headers=http_headers,
            security=self.sdk_configuration.security,
            get_serialized_body=lambda: utils.serialize_request_body(
                request, False, False, "multipart", models.ImageEditRequest
            ),
            allow_empty_value=None,
            timeout_ms=timeout_ms,
        )

        if retries == UNSET:
            if self.sdk_configuration.retry_config is not UNSET:
                retries = self.sdk_configuration.retry_config

        retry_config = None
        if isinstance(retries, utils.RetryConfig):
            retry_config = (retries, ["429", "500", "502", "503", "504"])

        http_res = self.do_request(
            hook_ctx=HookContext(
                config=self.sdk_configuration,
                base_url=base_url or "",
                operation_id="editImage",
                oauth2_scopes=None,
                security_source=self.sdk_configuration.security,
            ),
            request=req,
            error_status_codes=[
                "400",
                "401",
                "403",
                "422",
                "429",
                "4XX",
                "500",
                "503",
                "5XX",
            ],
            retry_config=retry_config,
            stream=True,
        )

        response_data: Any = None
        if utils.match_response(http_res, "200", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            return unmarshal_json_response(
                models.ImageGenerationResponse, http_res, http_res_text
            )
        if utils.match_response(http_res, "200", "text/event-stream"):
            return eventstreaming.EventStream(
                http_res,
                lambda raw: utils.unmarshal_json(raw, models.EditImageResponseBody),
                sentinel="[DONE]",
                client_ref=self,
            )
        if utils.match_response(http_res, "400", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.BadRequestErrorData, http_res, http_res_text
            )
            raise errors.BadRequestError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "401", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.AuthenticationErrorData, http_res, http_res_text
            )
            raise errors.AuthenticationError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "403", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.PermissionDeniedErrorData, http_res, http_res_text
            )
            raise errors.PermissionDeniedError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "422", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.UnprocessableEntityErrorData, http_res, http_res_text
            )
            raise errors.UnprocessableEntityError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "429", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(errors.RateLimitErrorData, http_res, http_res_text)
            raise errors.RateLimitError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "500", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.InternalServerErrorData, http_res, http_res_text
            )
            raise errors.InternalServerError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "503", "application/json"):
            http_res_text = utils.stream_to_text(http_res)
            response_data = unmarshal_json_response(
                errors.ServiceUnavailableErrorData, http_res, http_res_text
            )
            raise errors.ServiceUnavailableError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "4XX", "*"):
            http_res_text = utils.stream_to_text(http_res)
            raise errors.R9SDefaultError("API error occurred", http_res, http_res_text)
        if utils.match_response(http_res, "5XX", "*"):
            http_res_text = utils.stream_to_text(http_res)
            raise errors.R9SDefaultError("API error occurred", http_res, http_res_text)

        raise errors.R9SDefaultError("Unexpected response received", http_res)

    @overload
    async def edit_async(
        self,
        *,
        image: Union[
            models.ImageFile,
            models.ImageFileTypedDict,
            list[Union[models.ImageFile, models.ImageFileTypedDict]]
        ],
        prompt: str,
        background: Optional[models.ImageEditBackground] = None,
        input_fidelity: Optional[models.ImageEditInputFidelity] = "low",
        mask: Optional[Union[models.ImageFile, models.ImageFileTypedDict]] = None,
        model: Optional[str] = None,
        moderation: Optional[models.ImageEditModeration] = None,
        n: Optional[int] = 1,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageEditOutputFormat] = None,
        partial_images: Optional[int] = 0,
        quality: Optional[models.ImageEditQuality] = None,
        response_format: Optional[models.ImageEditResponseFormat] = None,
        size: Optional[models.ImageEditSize] = "1024x1024",
        stream: Union[Literal[False], None] = None,
        user: Optional[str] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> models.ImageGenerationResponse:
        ...

    @overload
    async def edit_async(
        self,
        *,
        image: Union[
            models.ImageFile,
            models.ImageFileTypedDict,
            list[Union[models.ImageFile, models.ImageFileTypedDict]]
        ],
        prompt: str,
        background: Optional[models.ImageEditBackground] = None,
        input_fidelity: Optional[models.ImageEditInputFidelity] = "low",
        mask: Optional[Union[models.ImageFile, models.ImageFileTypedDict]] = None,
        model: Optional[str] = None,
        moderation: Optional[models.ImageEditModeration] = None,
        n: Optional[int] = 1,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageEditOutputFormat] = None,
        partial_images: Optional[int] = 0,
        quality: Optional[models.ImageEditQuality] = None,
        response_format: Optional[models.ImageEditResponseFormat] = None,
        size: Optional[models.ImageEditSize] = "1024x1024",
        stream: Literal[True] = ...,
        user: Optional[str] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> eventstreaming.EventStreamAsync[models.EditImageResponseBody]:
        ...

    async def edit_async(
        self,
        *,
        image: Union[
            models.ImageFile,
            models.ImageFileTypedDict,
            list[Union[models.ImageFile, models.ImageFileTypedDict]]
        ],
        prompt: str,
        background: Optional[models.ImageEditBackground] = None,
        input_fidelity: Optional[models.ImageEditInputFidelity] = "low",
        mask: Optional[Union[models.ImageFile, models.ImageFileTypedDict]] = None,
        model: Optional[str] = None,
        moderation: Optional[models.ImageEditModeration] = None,
        n: Optional[int] = 1,
        output_compression: Optional[int] = None,
        output_format: Optional[models.ImageEditOutputFormat] = None,
        partial_images: Optional[int] = 0,
        quality: Optional[models.ImageEditQuality] = None,
        response_format: Optional[models.ImageEditResponseFormat] = None,
        size: Optional[models.ImageEditSize] = "1024x1024",
        stream: Optional[bool] = None,
        user: Optional[str] = None,
        retries: OptionalNullable[utils.RetryConfig] = UNSET,
        server_url: Optional[str] = None,
        timeout_ms: Optional[int] = None,
        http_headers: Optional[Mapping[str, str]] = None,
    ) -> Union[models.ImageGenerationResponse, eventstreaming.EventStreamAsync[models.EditImageResponseBody]]:
        r"""Edit image

        Edit an existing image using a text prompt (inpainting).

        :param image: The image to edit (PNG, <4MB, square)
        :param prompt: Text description of desired edit
        :param model: Model name
        :param mask: Optional mask PNG with transparent edit regions
        :param n: Number of images to generate (1-10)
        :param size: Output size
        :param response_format: 'url' or 'b64_json'
        :param user: End-user identifier
        :param retries: Override the default retry configuration for this method
        :param server_url: Override the default server URL for this method
        :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
        :param http_headers: Additional headers to set or replace on requests.
        """
        base_url = None
        url_variables = None
        if timeout_ms is None:
            timeout_ms = self.sdk_configuration.timeout_ms

        if server_url is not None:
            base_url = server_url
        else:
            base_url = self._get_url(base_url, url_variables)

        # Handle list of images - use first image if list is provided
        image_to_use = image[0] if isinstance(image, list) else image

        request = models.ImageEditRequest(
            image=utils.get_pydantic_model(image_to_use, models.ImageFile),
            prompt=prompt,
            background=background,
            input_fidelity=input_fidelity,
            mask=utils.get_pydantic_model(mask, models.ImageFile) if mask else None,
            model=model,
            moderation=moderation,
            n=n,
            output_compression=output_compression,
            output_format=output_format,
            partial_images=partial_images,
            quality=quality,
            response_format=response_format,
            size=size,
            stream=stream,
            user=user,
        )

        req = self._build_request_async(
            method="POST",
            path="/images/edits",
            base_url=base_url,
            url_variables=url_variables,
            request=request,
            request_body_required=True,
            request_has_path_params=False,
            request_has_query_params=True,
            user_agent_header="user-agent",
            accept_header_value="text/event-stream" if stream else "application/json",
            http_headers=http_headers,
            security=self.sdk_configuration.security,
            get_serialized_body=lambda: utils.serialize_request_body(
                request, False, False, "multipart", models.ImageEditRequest
            ),
            allow_empty_value=None,
            timeout_ms=timeout_ms,
        )

        if retries == UNSET:
            if self.sdk_configuration.retry_config is not UNSET:
                retries = self.sdk_configuration.retry_config

        retry_config = None
        if isinstance(retries, utils.RetryConfig):
            retry_config = (retries, ["429", "500", "502", "503", "504"])

        http_res = await self.do_request_async(
            hook_ctx=HookContext(
                config=self.sdk_configuration,
                base_url=base_url or "",
                operation_id="editImage",
                oauth2_scopes=None,
                security_source=self.sdk_configuration.security,
            ),
            request=req,
            error_status_codes=[
                "400",
                "401",
                "403",
                "422",
                "429",
                "4XX",
                "500",
                "503",
                "5XX",
            ],
            retry_config=retry_config,
            stream=True,
        )

        response_data: Any = None
        if utils.match_response(http_res, "200", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            return unmarshal_json_response(
                models.ImageGenerationResponse, http_res, http_res_text
            )
        if utils.match_response(http_res, "200", "text/event-stream"):
            return eventstreaming.EventStreamAsync(
                http_res,
                lambda raw: utils.unmarshal_json(raw, models.EditImageResponseBody),
                sentinel="[DONE]",
                client_ref=self,
            )
        if utils.match_response(http_res, "400", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.BadRequestErrorData, http_res, http_res_text
            )
            raise errors.BadRequestError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "401", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.AuthenticationErrorData, http_res, http_res_text
            )
            raise errors.AuthenticationError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "403", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.PermissionDeniedErrorData, http_res, http_res_text
            )
            raise errors.PermissionDeniedError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "422", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.UnprocessableEntityErrorData, http_res, http_res_text
            )
            raise errors.UnprocessableEntityError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "429", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(errors.RateLimitErrorData, http_res, http_res_text)
            raise errors.RateLimitError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "500", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.InternalServerErrorData, http_res, http_res_text
            )
            raise errors.InternalServerError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "503", "application/json"):
            http_res_text = await utils.stream_to_text_async(http_res)
            response_data = unmarshal_json_response(
                errors.ServiceUnavailableErrorData, http_res, http_res_text
            )
            raise errors.ServiceUnavailableError(response_data, http_res, http_res_text)
        if utils.match_response(http_res, "4XX", "*"):
            http_res_text = await utils.stream_to_text_async(http_res)
            raise errors.R9SDefaultError("API error occurred", http_res, http_res_text)
        if utils.match_response(http_res, "5XX", "*"):
            http_res_text = await utils.stream_to_text_async(http_res)
            raise errors.R9SDefaultError("API error occurred", http_res, http_res_text)

        raise errors.R9SDefaultError("Unexpected response received", http_res)
