--- title: "Ejemplos de API" description: "Tres patrones comunes para llamar a la API de ComfyUI Server" translationSourceHash: 7cb0120b translationFrom: development/comfyui-server/api-examples.mdx translationBlockHashes: "_intro": 84518317 "Method 1: Submit and Forget (HTTP only)": 040a0a2d "Method 2: WebSocket + History (Monitor Completion)": ce4e5a84 "Method 3: WebSocket with SaveImageWebsocket (Real-time Images)": e0bafb7d "Which Method Should I Use?": 95cec253 --- Esta página muestra tres formas de interactuar con la API del servidor de ComfyUI, desde un envío HTTP simple hasta una integración completa con WebSocket y salida de imágenes en tiempo real. Todos los ejemplos usan el [flujo de trabajo predeterminado de SD1.5](https://github.com/Comfy-Org/ComfyUI/blob/master/script_examples) a modo de ilustración. Antes de usar la API, debes exportar tu flujo de trabajo en [formato API](/es/development/api-development/workflow-api-format). Estos ejemplos usan Python con la biblioteca estándar y el paquete `websocket-client` (`pip install websocket-client`). El protocolo subyacente de la API es el mismo independientemente del idioma. Consulta la [Referencia de la API de Cloud](/es/development/cloud/api-reference) para ver los equivalentes en TypeScript y curl. --- ## Método 1: Enviar y olvidar (solo HTTP) Fuente: [`basic_api_example.py`](https://github.com/Comfy-Org/ComfyUI/blob/master/script_examples/basic_api_example.py) El enfoque más sencillo: envía un flujo de trabajo y no esperes los resultados. Es útil para tareas en las que envías y te olvidas, y revisas las salidas más tarde. ```python """basic_api_example.py: envía un flujo de trabajo solo por HTTP.""" import json from urllib import request SERVER_ADDRESS = "127.0.0.1:8188" def queue_prompt(prompt): p = {"prompt": prompt} data = json.dumps(p).encode("utf-8") req = request.Request( f"http://{SERVER_ADDRESS}/prompt", data=data ) request.urlopen(req) if __name__ == "__main__": # Carga un flujo de trabajo exportado en formato API prompt_text = """{ "3": { "class_type": "KSampler", "inputs": { "cfg": 8, "denoise": 1, "latent_image": ["5", 0], "model": ["4", 0], "negative": ["7", 0], "positive": ["6", 0], "sampler_name": "euler", "scheduler": "normal", "seed": 8566257, "steps": 20 } }, "4": { "class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "v1-5-pruned-emaonly.safetensors"} }, "5": { "class_type": "EmptyLatentImage", "inputs": {"batch_size": 1, "height": 512, "width": 512} }, "6": { "class_type": "CLIPTextEncode", "inputs": {"clip": ["4", 1], "text": "masterpiece best quality man"} }, "7": { "class_type": "CLIPTextEncode", "inputs": {"clip": ["4", 1], "text": "bad hands"} }, "8": { "class_type": "VAEDecode", "inputs": {"samples": ["3", 0], "vae": ["4", 2]} }, "9": { "class_type": "SaveImage", "inputs": {"filename_prefix": "ComfyUI", "images": ["8", 0]} } }""" prompt = json.loads(prompt_text) # Modifica las entradas antes de enviar prompt["3"]["inputs"]["seed"] = 5 prompt["6"]["inputs"]["text"] = "masterpiece best quality man" queue_prompt(prompt) print("Prompt submitted successfully.") ``` Este método usa el nodo `SaveImage`, que guarda las imágenes en el disco del servidor. Para recuperarlas, tendrías que hacer después una llamada a `GET /view?filename=...`. --- ## Método 2: WebSocket + historial (supervisar la finalización) Fuente: [`websockets_api_example.py`](https://github.com/Comfy-Org/ComfyUI/blob/master/script_examples/websockets_api_example.py) Usa WebSocket para esperar a que finalice la ejecución y luego obtén las salidas a través del endpoint `/history`. Este es el patrón recomendado para la mayoría de los casos de uso. ```python """websockets_api_example.py: supervisa la ejecución por WebSocket y descarga mediante /history.""" import websocket # pip install websocket-client import uuid import json import urllib.request import urllib.parse SERVER_ADDRESS = "127.0.0.1:8188" client_id = str(uuid.uuid4()) def queue_prompt(prompt, prompt_id): p = {"prompt": prompt, "client_id": client_id, "prompt_id": prompt_id} data = json.dumps(p).encode("utf-8") req = urllib.request.Request( f"http://{SERVER_ADDRESS}/prompt", data=data ) urllib.request.urlopen(req) def get_image(filename, subfolder, folder_type): params = urllib.parse.urlencode({ "filename": filename, "subfolder": subfolder, "type": folder_type, }) with urllib.request.urlopen( f"http://{SERVER_ADDRESS}/view?{params}" ) as response: return response.read() def get_history(prompt_id): with urllib.request.urlopen( f"http://{SERVER_ADDRESS}/history/{prompt_id}" ) as response: return json.loads(response.read()) def get_images(ws, prompt): prompt_id = str(uuid.uuid4()) queue_prompt(prompt, prompt_id) while True: out = ws.recv() if isinstance(out, str): message = json.loads(out) if message["type"] == "executing": data = message["data"] if data["node"] is None and data["prompt_id"] == prompt_id: break # Ejecución terminada # Los frames binarios son imágenes de vista previa, omítelos aquí continue history = get_history(prompt_id)[prompt_id] output_images = {} for node_id in history["outputs"]: node_output = history["outputs"][node_id] images_output = [] if "images" in node_output: for image in node_output["images"]: image_data = get_image( image["filename"], image["subfolder"], image["type"] ) images_output.append(image_data) output_images[node_id] = images_output return output_images if __name__ == "__main__": prompt_text = """{ "3": { ... }, "4": { ... }, "5": { ... }, "6": { ... }, "7": { ... }, "8": { ... }, "9": { "class_type": "SaveImage", "inputs": { ... } } }""" prompt = json.loads(prompt_text) prompt["3"]["inputs"]["seed"] = 5 prompt["6"]["inputs"]["text"] = "masterpiece best quality man" ws = websocket.WebSocket() ws.connect(f"ws://{SERVER_ADDRESS}/ws?clientId={client_id}") images = get_images(ws, prompt) ws.close() print(f"Got {len(images)} output node(s) with images.") # Mostrar las imágenes (requiere Pillow): # for node_id in images: # for image_data in images[node_id]: # from PIL import Image # import io # img = Image.open(io.BytesIO(image_data)) # img.show() ``` Los frames binarios del WebSocket contienen imágenes de vista previa del progreso durante la generación. Puedes decodificarlos para obtener vistas previas en vivo (consulta la página [Server Messages](/es/development/comfyui-server/comms_messages) para conocer el formato binario). --- ## Método 3: WebSocket con SaveImageWebsocket (imágenes en tiempo real) Fuente: [`websockets_api_example_ws_images.py`](https://github.com/Comfy-Org/ComfyUI/blob/master/script_examples/websockets_api_example_ws_images.py) Para casos en los que no quieres que las imágenes se guarden en el disco, usa el nodo `SaveImageWebsocket`. Las imágenes llegan directamente mediante frames binarios de WebSocket. ```python """websockets_api_example_ws_images.py: recibe imágenes directamente por WebSocket.""" import websocket # pip install websocket-client import uuid import json import urllib.request import urllib.parse SERVER_ADDRESS = "127.0.0.1:8188" client_id = str(uuid.uuid4()) def queue_prompt(prompt): p = {"prompt": prompt, "client_id": client_id} data = json.dumps(p).encode("utf-8") req = urllib.request.Request( f"http://{SERVER_ADDRESS}/prompt", data=data ) return json.loads(urllib.request.urlopen(req).read()) def get_images(ws, prompt): prompt_id = queue_prompt(prompt)["prompt_id"] output_images = {} current_node = "" while True: out = ws.recv() if isinstance(out, str): message = json.loads(out) if message["type"] == "executing": data = message["data"] if data["prompt_id"] == prompt_id: if data["node"] is None: break # Ejecución terminada current_node = data["node"] else: # Frame binario: datos de imagen de SaveImageWebsocket if current_node == "save_image_websocket_node": images_output = output_images.get(current_node, []) # Los primeros 8 bytes son tipo/meta, el resto son datos de imagen images_output.append(out[8:]) output_images[current_node] = images_output return output_images if __name__ == "__main__": prompt_text = """{ "3": { "class_type": "KSampler", "inputs": { ... } }, ... "save_image_websocket_node": { "class_type": "SaveImageWebsocket", "inputs": {"images": ["8", 0]} } }""" prompt = json.loads(prompt_text) prompt["3"]["inputs"]["seed"] = 5 ws = websocket.WebSocket() ws.connect(f"ws://{SERVER_ADDRESS}/ws?clientId={client_id}") images = get_images(ws, prompt) ws.close() print(f"Received {len(images)} image(s) via WebSocket.") # Mostrar (requiere Pillow): # for image_data in images.get("save_image_websocket_node", []): # from PIL import Image # import io # img = Image.open(io.BytesIO(image_data)) # img.show() ``` El flujo de trabajo debe usar un nodo con `class_type: "SaveImageWebsocket"` (un nodo integrado) en lugar del nodo `SaveImage` habitual. --- ## ¿Qué método debería usar? **Envía y olvídate.** Úsalo cuando no necesites la salida de inmediato o cuando obtener los resultados más tarde sea aceptable. **Recomendado.** Espera a que termine y luego descarga las salidas. Es el mejor equilibrio entre simplicidad y fiabilidad. **Imágenes en tiempo real.** Ideal para aplicaciones interactivas en las que quieres recibir las imágenes sin escribir en disco. Para consultar la referencia completa de la API (endpoints, formatos de payload y manejo de errores), revisa las páginas [Server Routes](/es/development/comfyui-server/comms_routes) y [Server Messages](/es/development/comfyui-server/comms_messages).