メインコンテンツへスキップ
ComfyUI ネイティブ Flux 1.1 [pro] Ultra Image ノード Flux 1.1 [pro] Ultra Image ノードは、テキストプロンプトを用いて超高解像度の画像を生成する機能を提供し、Black Forest Labs の最新画像生成 API に直接接続します。 このノードは、以下の2つの主要な使用モードをサポートしています:
  1. テキスト→画像(Text-to-Image):画像入力がない場合、テキストプロンプトから高品質な画像を生成します
  2. 画像→画像(Image-to-Image):既存の画像とプロンプトを組み合わせ、両者の特徴を融合した新しい画像を生成します(Remix モード)
このノードは API 呼び出しを通じて Ultra モードをサポートしており、標準的な Flux 1.1 [pro] と比較して最大4倍の解像度(最大4MP)で画像を生成できます。また、プロンプトへの忠実性を損なわず、わずか10秒という超高速な生成時間を実現します。他の高解像度モデルと比較すると、その生成速度は2.5倍以上高速です。

パラメータ説明

基本パラメータ

パラメータデフォルト値説明
prompt文字列""画像生成のためのテキストによる説明
prompt_upsamplingブール値Falseプロンプトのディテール強化にプロンプトアップサンプリング技術を用いるかどうか。有効にすると、より創造的な生成のために自動的にプロンプトが修正されますが、結果は非決定論的になります(同一のシードでも完全に同じ結果にはなりません)
seed整数0乱数シード値。生成時のランダム性を制御します
aspect_ratio文字列”16:9”画像の幅と高さの比率。1:4 ~ 4:1 の範囲内である必要があります
rawブール値FalseTrue に設定すると、処理が少なく、より自然な見た目の画像が生成されます

オプションパラメータ

パラメータデフォルト値説明
image_prompt画像なしオプションの入力。画像→画像(Remix)モードで使用します
image_prompt_strength浮動小数点数0.1image_prompt が入力された場合に有効になり、プロンプトと画像プロンプトのブレンド具合を調整します。値が大きいほど出力画像は入力画像に近くなります(範囲:0.0~1.0)

出力

出力説明
IMAGE画像生成された高解像度画像の結果

使用例

対応する使用例については、以下のチュートリアルをご覧ください。

動作原理

Flux 1.1 [pro] Ultra モードは、最適化されたディープラーニングアーキテクチャと効率的な GPU 加速技術を活用することで、高速性を犠牲にすることなく高解像度画像の生成を実現します。API へリクエストが送信されると、システムはプロンプトを解析し、適切なパラメータを適用した上で並列処理により画像を計算し、最終的に高解像度の結果を生成・返却します。 常規モデルと比較して、Ultra モードは特に大規模なスケールにおけるディテールの保持と一貫性に重点を置いており、4MP という高解像度においても優れた画質を保証します。

ソースコード

[ノードソースコード(2025-05-03 更新)]
class FluxProUltraImageNode(ComfyNodeABC):
    """
    Generates images synchronously based on prompt and resolution.
    """

    MINIMUM_RATIO = 1 / 4
    MAXIMUM_RATIO = 4 / 1
    MINIMUM_RATIO_STR = "1:4"
    MAXIMUM_RATIO_STR = "4:1"

    @classmethod
    def INPUT_TYPES(s):
        return {
            "required": {
                "prompt": (
                    IO.STRING,
                    {
                        "multiline": True,
                        "default": "",
                        "tooltip": "Prompt for the image generation",
                    },
                ),
                "prompt_upsampling": (
                    IO.BOOLEAN,
                    {
                        "default": False,
                        "tooltip": "Whether to perform upsampling on the prompt. If active, automatically modifies the prompt for more creative generation, but results are nondeterministic (same seed will not produce exactly the same result).",
                    },
                ),
                "seed": (
                    IO.INT,
                    {
                        "default": 0,
                        "min": 0,
                        "max": 0xFFFFFFFFFFFFFFFF,
                        "control_after_generate": True,
                        "tooltip": "The random seed used for creating the noise.",
                    },
                ),
                "aspect_ratio": (
                    IO.STRING,
                    {
                        "default": "16:9",
                        "tooltip": "Aspect ratio of image; must be between 1:4 and 4:1.",
                    },
                ),
                "raw": (
                    IO.BOOLEAN,
                    {
                        "default": False,
                        "tooltip": "When True, generate less processed, more natural-looking images.",
                    },
                ),
            },
            "optional": {
                "image_prompt": (IO.IMAGE,),
                "image_prompt_strength": (
                    IO.FLOAT,
                    {
                        "default": 0.1,
                        "min": 0.0,
                        "max": 1.0,
                        "step": 0.01,
                        "tooltip": "Blend between the prompt and the image prompt.",
                    },
                ),
            },
            "hidden": {
                "auth_token": "AUTH_TOKEN_COMFY_ORG",
            },
        }

    @classmethod
    def VALIDATE_INPUTS(cls, aspect_ratio: str):
        try:
            validate_aspect_ratio(
                aspect_ratio,
                minimum_ratio=cls.MINIMUM_RATIO,
                maximum_ratio=cls.MAXIMUM_RATIO,
                minimum_ratio_str=cls.MINIMUM_RATIO_STR,
                maximum_ratio_str=cls.MAXIMUM_RATIO_STR,
            )
        except Exception as e:
            return str(e)
        return True

    RETURN_TYPES = (IO.IMAGE,)
    DESCRIPTION = cleandoc(__doc__ or "")  # Handle potential None value
    FUNCTION = "api_call"
    API_NODE = True
    CATEGORY = "api node/image/bfl"

    def api_call(
        self,
        prompt: str,
        aspect_ratio: str,
        prompt_upsampling=False,
        raw=False,
        seed=0,
        image_prompt=None,
        image_prompt_strength=0.1,
        auth_token=None,
        **kwargs,
    ):
        operation = SynchronousOperation(
            endpoint=ApiEndpoint(
                path="/proxy/bfl/flux-pro-1.1-ultra/generate",
                method=HttpMethod.POST,
                request_model=BFLFluxProUltraGenerateRequest,
                response_model=BFLFluxProGenerateResponse,
            ),
            request=BFLFluxProUltraGenerateRequest(
                prompt=prompt,
                prompt_upsampling=prompt_upsampling,
                seed=seed,
                aspect_ratio=validate_aspect_ratio(
                    aspect_ratio,
                    minimum_ratio=self.MINIMUM_RATIO,
                    maximum_ratio=self.MAXIMUM_RATIO,
                    minimum_ratio_str=self.MINIMUM_RATIO_STR,
                    maximum_ratio_str=self.MAXIMUM_RATIO_STR,
                ),
                raw=raw,
                image_prompt=(
                    image_prompt
                    if image_prompt is None
                    else convert_image_to_base64(image_prompt)
                ),
                image_prompt_strength=(
                    None if image_prompt is None else round(image_prompt_strength, 2)
                ),
            ),
            auth_token=auth_token,
        )
        output_image = handle_bfl_synchronous_operation(operation)
        return (output_image,)