> ## Documentation Index
> Fetch the complete documentation index at: https://docs.comfy.org/llms.txt
> Use this file to discover all available pages before exploring further.

# OpenAI GPT Image 1 - ComfyUI ネイティブノードドキュメント

> OpenAI の GPT-4 Vision モデルを用いて画像を生成するノード

<img src="https://mintcdn.com/dripart/5003JSxULDwNImme/images/built-in-nodes/api_nodes/openai/openai-gpt-image-1.jpg?fit=max&auto=format&n=5003JSxULDwNImme&q=85&s=b3bb270a55ced01ef601c882f66778c0" alt="ComfyUI ネイティブ OpenAI GPT Image 1 ノード" width="1576" height="1123" data-path="images/built-in-nodes/api_nodes/openai/openai-gpt-image-1.jpg" />

このノードは OpenAI の GPT Image 1 API に接続し、詳細なテキストプロンプトを用いて画像を生成できます。従来の DALL·E モデルとは異なり、GPT Image 1 は GPT-4 の言語理解能力を活用して、より複雑なプロンプトを処理し、ユーザーの意図により正確に合致した画像を生成します。

## パラメータ

### 基本パラメータ

| パラメータ   | 型   | デフォルト値 | 説明                                                 |
| ------- | --- | ------ | -------------------------------------------------- |
| prompt  | 文字列 | ""     | 生成対象を記述するテキストプロンプト                                 |
| quality | 選択肢 | "low"  | 画像品質レベル：「low」、「medium」、「high」のいずれか                 |
| size    | 選択肢 | "auto" | 出力画像サイズ：「auto」、「1024x1024」、「1024x1536」、「1536x1024」 |

### 画像編集パラメータ

| パラメータ | 型   | 説明                           |
| ----- | --- | ---------------------------- |
| image | 画像  | 画像編集用の入力画像（複数枚の画像をサポート）      |
| mask  | マスク | 変更対象領域を指定するオプションのマスク（単一画像のみ） |

### オプションパラメータ

| パラメータ      | 型   | 説明                                     |
| ---------- | --- | -------------------------------------- |
| background | 選択肢 | 背景設定：「opaque」（不透明）または「transparent」（透過） |
| seed       | 整数  | 乱数シード（現時点ではバックエンド未実装）                  |
| n          | 整数  | 生成する画像の枚数（1～8 の範囲）                     |

### 出力

| 出力    | 型  | 説明        |
| ----- | -- | --------- |
| IMAGE | 画像 | 生成された画像結果 |

## 動作原理

OpenAI GPT Image 1 ノードは、GPT-4 の言語理解能力と画像生成技術を統合しています。まずテキストプロンプトを解析し、その意味およびユーザーの意図を理解したうえで、それに合致する画像を生成します。

画像編集モードでは、既存の画像を修正・編集できます。マスクを併用することで、変更対象となる領域を精密に制御できます。ただし、マスク入力は単一画像のみに対応しており、複数画像には使用できません。

ユーザーは、品質レベル、出力サイズ、背景処理、生成枚数などのパラメータを調整することで、出力結果を制御できます。

## ソースコード

\[ノードソースコード（2025-05-03 更新）]

```python theme={null}

class OpenAIGPTImage1(ComfyNodeABC):
    """
    Generates images synchronously via OpenAI's GPT Image 1 endpoint.

    Uses the proxy at /proxy/openai/images/generations. Returned URLs are short‑lived,
    so download or cache results if you need to keep them.
    """

    def __init__(self):
        pass

    @classmethod
    def INPUT_TYPES(cls) -> InputTypeDict:
        return {
            "required": {
                "prompt": (
                    IO.STRING,
                    {
                        "multiline": True,
                        "default": "",
                        "tooltip": "Text prompt for GPT Image 1",
                    },
                ),
            },
            "optional": {
                "seed": (
                    IO.INT,
                    {
                        "default": 0,
                        "min": 0,
                        "max": 2**31 - 1,
                        "step": 1,
                        "display": "number",
                        "control_after_generate": True,
                        "tooltip": "not implemented yet in backend",
                    },
                ),
                "quality": (
                    IO.COMBO,
                    {
                        "options": ["low", "medium", "high"],
                        "default": "low",
                        "tooltip": "Image quality, affects cost and generation time.",
                    },
                ),
                "background": (
                    IO.COMBO,
                    {
                        "options": ["opaque", "transparent"],
                        "default": "opaque",
                        "tooltip": "Return image with or without background",
                    },
                ),
                "size": (
                    IO.COMBO,
                    {
                        "options": ["auto", "1024x1024", "1024x1536", "1536x1024"],
                        "default": "auto",
                        "tooltip": "Image size",
                    },
                ),
                "n": (
                    IO.INT,
                    {
                        "default": 1,
                        "min": 1,
                        "max": 8,
                        "step": 1,
                        "display": "number",
                        "tooltip": "How many images to generate",
                    },
                ),
                "image": (
                    IO.IMAGE,
                    {
                        "default": None,
                        "tooltip": "Optional reference image for image editing.",
                    },
                ),
                "mask": (
                    IO.MASK,
                    {
                        "default": None,
                        "tooltip": "Optional mask for inpainting (white areas will be replaced)",
                    },
                ),
            },
            "hidden": {"auth_token": "AUTH_TOKEN_COMFY_ORG"},
        }

    RETURN_TYPES = (IO.IMAGE,)
    FUNCTION = "api_call"
    CATEGORY = "api node/image/openai"
    DESCRIPTION = cleandoc(__doc__ or "")
    API_NODE = True

    def api_call(
        self,
        prompt,
        seed=0,
        quality="low",
        background="opaque",
        image=None,
        mask=None,
        n=1,
        size="1024x1024",
        auth_token=None,
    ):
        model = "gpt-image-1"
        path = "/proxy/openai/images/generations"
        content_type="application/json"
        request_class = OpenAIImageGenerationRequest
        img_binaries = []
        mask_binary = None
        files = []

        if image is not None:
            path = "/proxy/openai/images/edits"
            request_class = OpenAIImageEditRequest
            content_type ="multipart/form-data"

            batch_size = image.shape[0]

            for i in range(batch_size):
                single_image = image[i : i + 1]
                scaled_image = downscale_image_tensor(single_image).squeeze()

                image_np = (scaled_image.numpy() * 255).astype(np.uint8)
                img = Image.fromarray(image_np)
                img_byte_arr = io.BytesIO()
                img.save(img_byte_arr, format="PNG")
                img_byte_arr.seek(0)
                img_binary = img_byte_arr
                img_binary.name = f"image_{i}.png"

                img_binaries.append(img_binary)
                if batch_size == 1:
                    files.append(("image", img_binary))
                else:
                    files.append(("image[]", img_binary))

        if mask is not None:
            if image.shape[0] != 1:
                raise Exception("Cannot use a mask with multiple image")
            if image is None:
                raise Exception("Cannot use a mask without an input image")
            if mask.shape[1:] != image.shape[1:-1]:
                raise Exception("Mask and Image must be the same size")
            batch, height, width = mask.shape
            rgba_mask = torch.zeros(height, width, 4, device="cpu")
            rgba_mask[:, :, 3] = 1 - mask.squeeze().cpu()

            scaled_mask = downscale_image_tensor(rgba_mask.unsqueeze(0)).squeeze()

            mask_np = (scaled_mask.numpy() * 255).astype(np.uint8)
            mask_img = Image.fromarray(mask_np)
            mask_img_byte_arr = io.BytesIO()
            mask_img.save(mask_img_byte_arr, format="PNG")
            mask_img_byte_arr.seek(0)
            mask_binary = mask_img_byte_arr
            mask_binary.name = "mask.png"
            files.append(("mask", mask_binary))

        # Build the operation
        operation = SynchronousOperation(
            endpoint=ApiEndpoint(
                path=path,
                method=HttpMethod.POST,
                request_model=request_class,
                response_model=OpenAIImageGenerationResponse,
            ),
            request=request_class(
                model=model,
                prompt=prompt,
                quality=quality,
                background=background,
                n=n,
                seed=seed,
                size=size,
            ),
            files=files if files else None,
            content_type=content_type,
            auth_token=auth_token,
        )

        response = operation.execute()

        img_tensor = validate_and_cast_response(response)
        return (img_tensor,)
```
