Todos os produtos
Search
Central de documentação

Platform For AI:Use the PAI ArtLab Developer Center

Última atualização: Jun 27, 2026

Este tópico descreve como usar o Developer Center para validar a integração com a API do ComfyUI.

Faça login no console do PAI ArtLab .

Validar a integração da API do ComfyUI

API edition

A edição de API do ComfyUI permite fazer chamadas de API em várias instâncias do ComfyUI. Essa edição foi projetada para integração de desenvolvedores e não possui interface gráfica baseada na web. Como o ComfyUI é um serviço com estado, use o serviço de fila assíncrona do EAS para chamar o serviço do ComfyUI quando houver múltiplas instâncias implantadas.

Pré-requisitos

Ambiente Python configurado e kit de desenvolvimento de software (SDK) do EAS para fila assíncrona instalado: pip install eas_prediction

Procedimento

  1. Faça login no console do PAI ArtLab. Na página Developer Center, clique em aba Custom Services e, em seguida, clique em Create Custom Service.

    Em Service Version, selecione ComfyUI (API Edition).

  2. Quando o Service Status mudar para Running, clique em Call Information. Na aba Reponse URL (Internet), obtenha a URL de solicitação, o token, o endpoint e o ID do serviço.

    A parte do nome de domínio da URL, como cn-shanghai.pai-eas.aliyuncs.com, corresponde ao endpoint. O último segmento do caminho da URL, como ai4d_comfyuiapi_, é o ID do serviço. Clique em botão de cópia ao lado da URL para copiar o endereço. Por padrão, o token fica oculto por asteriscos. Clique em ícone de olho para visualizar o token.

  3. Substitua o conteúdo correspondente no código pelas informações obtidas e execute o código.

    Exemplo de código

    import requests
    ##### Replace the following parameters based on your endpoint information. #####
    input_url = "http://115************.cn-shanghai.pai-eas.aliyuncs.com/api/predict/ai4d_comfyuiapi_1u38************"
    token = "Yjha************"
    endpoint = "115************.cn-shanghai.pai-eas.aliyuncs.com"
    service_name = "ai4d_comfyuiapi_1u38************/sink"
    ################################
    session = requests.session()
    session.headers.update({"Authorization": f"{token}"})
    work_flow = {
        "3": {
            "inputs": {
                "seed": 156680208700286,
                "steps": 20,
                "cfg": 8,
                "sampler_name": "euler",
                "scheduler": "normal",
                "denoise": 1,
                "model": [
                    "4",
                    0
                ],
                "positive": [
                    "6",
                    0
                ],
                "negative": [
                    "7",
                    0
                ],
                "latent_image": [
                    "5",
                    0
                ]
            },
            "class_type": "KSampler",
            "_meta": {
                "title": "K Sampler"
            }
        },
        "4": {
            "inputs": {
                "ckpt_name": "3dAnimationDiffusion_v10.safetensors"
            },
            "class_type": "CheckpointLoaderSimple",
            "_meta": {
                "title": "Checkpoint Loader (Simple)"
            }
        },
        "5": {
            "inputs": {
                "width": 512,
                "height": 512,
                "batch_size": 1
            },
            "class_type": "EmptyLatentImage",
            "_meta": {
                "title": "Empty Latent"
            }
        },
        "6": {
            "inputs": {
                "text": "beautiful scenery nature glass bottle landscape, , purple galaxy bottle,",
                "clip": [
                    "4",
                    1
                ]
            },
            "class_type": "CLIPTextEncode",
            "_meta": {
                "title": "CLIP Text Encoder"
            }
        },
        "7": {
            "inputs": {
                "text": "text, watermark",
                "clip": [
                    "4",
                    1
                ]
            },
            "class_type": "CLIPTextEncode",
            "_meta": {
                "title": "CLIP Text Encoder"
            }
        },
        "8": {
            "inputs": {
                "samples": [
                    "3",
                    0
                ],
                "vae": [
                    "4",
                    2
                ]
            },
            "class_type": "VAEDecode",
            "_meta": {
                "title": "VAE Decoding"
            }
        },
        "9": {
            "inputs": {
                "filename_prefix": "ComfyUI",
                "images": [
                    "8",
                    0
                ]
            },
            "class_type": "SaveImage",
            "_meta": {
                "title": "Save Image"
            }
        }
    }
    for i in range(1):
        payload = work_flow
        response = session.post(url=f'{input_url}/api_prompt?task_id=txt2img_test', json=payload)
        if response.status_code != 200:
            exit(f"send request error:{response.content}, response code:{response.status_code}")
        else:
            print(f"send {i} success, index is {response.content}")
    from eas_prediction import QueueClient
    sink_queue = QueueClient(f'{endpoint}', f'{service_name}')
    sink_queue.set_token(f'{token}')
    sink_queue.init()
    watcher = sink_queue.watch(0, 1, auto_commit=False)
    for x in watcher.run():
        if 'task_id' in x.tags:
            print('index {} task_id is {}'.format(x.index, x.tags['task_id']))
            print(f'index {x.index} data is {x.data}')
            sink_queue.commit(x.index)
    
  4. Após a execução do código, obtenha o nome do arquivo na saída.

    send 0 success,index is b'1'
    index 1 task_id is txt2img_test
    index 1 data is b'{"status_code":200},{"type":"executed","data":{"node":"9","display_node":"9","output":{"images":[{"filename":"ComfyUI_00000000_174427782695938_599ffc33-edea-4e64-bb60-28e834940f5c_..png"}]}}}'
  5. Na página do PAI ArtLab, passe o mouse sobre o ícone image no canto superior direito e clique em Storage para acessar o bucket do OSS e obter o caminho de armazenamento.

    Na lista de arquivos do OSS, o nome da pasta, como 26*/, e sua subpasta data-115*/ representam o caminho de armazenamento.

  6. Monte e acesse a URL da imagem no OSS. O formato é: Caminho do bucket do OSS/output/nome do arquivo

    Por exemplo, 26**/data-115****/output/ComfyUI_00000000_174427782695938_599ffc33-edea-4e64-bb60-28e834940f5c_.png

Dedicated edition

A edição Dedicated do ComfyUI suporta chamadas de API e depuração via web. Para o procedimento de teste e validação, consulte a seção da edição de API.

Pré-requisitos

Ambiente Python configurado.

Procedimento

  1. Faça login no console do PAI ArtLab. Na página Developer Center, clique em aba Custom Services e, em seguida, clique em Create Custom Service.

    Em Service Version, selecione ComfyUI (Dedicated Edition).

  2. Quando o Service Status mudar para Running, clique em Call Information. Na aba Public network address call, obtenha a URL de solicitação e o token.

    A caixa de diálogo Synchronous Call Information indica que apenas serviços da Standard Edition suportam chamadas síncronas.

  3. Substitua o conteúdo correspondente no código pelas informações obtidas e execute o código.

    Exemplo de código

    import requests
    ##### Replace the following parameters based on your endpoint information. #####
    url = "http://ai4d_comfyuiapi_1u38************.115************.cn-shanghai.pai-eas.aliyuncs.com/"
    token = "Yjha************"
    ################################
    payload = {
        "prompt": {
            "3": {
                "inputs": {
                    "seed": 156680208700286,
                    "steps": 20,
                    "cfg": 8,
                    "sampler_name": "euler",
                    "scheduler": "normal",
                    "denoise": 1,
                    "model": [
                        "4",
                        0
                    ],
                    "positive": [
                        "6",
                        0
                    ],
                    "negative": [
                        "7",
                        0
                    ],
                    "latent_image": [
                        "5",
                        0
                    ]
                },
                "class_type": "KSampler",
                "_meta": {
                    "title": "K Sampler"
                }
            },
            "4": {
                "inputs": {
                    "ckpt_name": "3dAnimationDiffusion_v10.safetensors"
                },
                "class_type": "CheckpointLoaderSimple",
                "_meta": {
                    "title": "Checkpoint Loader (Simple)"
                }
            },
            "5": {
                "inputs": {
                    "width": 512,
                    "height": 512,
                    "batch_size": 1
                },
                "class_type": "EmptyLatentImage",
                "_meta": {
                    "title": "Empty Latent"
                }
            },
            "6": {
                "inputs": {
                    "text": "beautiful scenery nature glass bottle landscape, , purple galaxy bottle,",
                    "clip": [
                        "4",
                        1
                    ]
                },
                "class_type": "CLIPTextEncode",
                "_meta": {
                    "title": "CLIP Text Encoder"
                }
            },
            "7": {
                "inputs": {
                    "text": "text, watermark",
                    "clip": [
                        "4",
                        1
                    ]
                },
                "class_type": "CLIPTextEncode",
                "_meta": {
                    "title": "CLIP Text Encoder"
                }
            },
            "8": {
                "inputs": {
                    "samples": [
                        "3",
                        0
                    ],
                    "vae": [
                        "4",
                        2
                    ]
                },
                "class_type": "VAEDecode",
                "_meta": {
                    "title": "VAE Decoding"
                }
            },
            "9": {
                "inputs": {
                    "filename_prefix": "ComfyUI",
                    "images": [
                        "8",
                        0
                    ]
                },
                "class_type": "SaveImage",
                "_meta": {
                    "title": "Save Image"
                }
            }
        }
    }
    # Send the request
    session = requests.session()
    session.headers.update({"Authorization": f"{token}"})
    prompt_url = url + "prompt"
    response = session.post(url=f'{prompt_url}', json=payload)
    if response.status_code != 200:
        raise Exception(response.content)
    data = response.json()
    prompt_id = data['prompt_id']
    print(f"Get data: {data}, get prompt ID: {prompt_id}")
    # Get the result
    # Construct the request URL
    history_url = f"{url}history/{prompt_id}"
    session = requests.session()
    session.headers.update({"Authorization": f"{token}"})
    response = session.get(url=f'{history_url}')
    if response.status_code != 200:
        raise Exception(response.content)
    data = response.json()
    print(data)
    # Parse the JSON-formatted data to get image information from all outputs
    for prompt_id, prompt_data in data.items():
        outputs = prompt_data.get("outputs", {})
        for node_id, node_data in outputs.items():
            images = node_data.get("images", [])
            for image in images:
                filename = image.get("filename")
                print(f"Node ID: {node_id}, Image file name: {filename}")
                    
  4. Após a execução do código, obtenha o nome do arquivo na saída.

    Get data:{'prompt_id':'d086402a-7454-43c5-a753-b338e4870be2','number':6,'node_errors':{}}get prompt ID:d086402a-7454-43c5-a753-b338e4870be2
    {'d086402a-7454-43c5-a753-b338e4870be2':{'prompt':[6,'d086402a-7454-43c5-a753-b338e4870be2',{'3':{'inputs':{'seed':156680208700286,'steps':20,'cfg':8.0,'sampler_name':'eu1er','schedu1er':'normal',...}}}]}}
    Node ID: 9, Image file name: ComfyUI_00000000_174427782695938_599ffc33-edea-4e64-bb60-28e834940f5c_.png
  5. Na página do PAI ArtLab, passe o mouse sobre o ícone image no canto superior direito e clique em Storage para acessar o bucket do OSS e obter o caminho de armazenamento.

  6. Monte e acesse a URL da imagem no OSS. O formato é: Caminho do bucket do OSS/output/nome do arquivo

    Por exemplo, 26**/data-115****/output/ComfyUI_00000000_174427782695938_599ffc33-edea-4e64-bb60-28e834940f5c_.png