Files
Comfy-Studio/comfy_studio/services/comfy_api.py
T

66 lines
2.5 KiB
Python
Raw Normal View History

2026-07-02 14:09:57 +08:00
"""
Клиент API ComfyUI + фоновый воркер отправки промтов (не блокирует GUI).
"""
import json
import logging
import requests
from PyQt6.QtCore import QThread, pyqtSignal
from comfy_studio.core.config import COMFYUI_PROMPT_ENDPOINT
from comfy_studio.core.i18n import tr
logger = logging.getLogger(__name__)
class ComfyAPIClient:
def __init__(self, base_url: str):
self.base_url = base_url.rstrip("/")
class ComfySendWorker(QThread):
"""Фоновая отправка prompt-графа в очередь ComfyUI."""
finished = pyqtSignal(bool, str) # (success, message)
def __init__(self, api_client: ComfyAPIClient, prompt_json_str: str):
super().__init__()
self.api_client = api_client
self.prompt_json_str = prompt_json_str
def run(self):
logger.info("Запущена фоновая отправка промта в ComfyUI.")
try:
prompt_data = json.loads(self.prompt_json_str)
payload = {"prompt": prompt_data}
url = f"{self.api_client.base_url}{COMFYUI_PROMPT_ENDPOINT}"
response = requests.post(url, json=payload, timeout=5)
if response.status_code == 200:
res_data = response.json()
prompt_id = res_data.get("prompt_id", "?")
logger.info(f"Задача принята ComfyUI. ID: {prompt_id}")
self.finished.emit(
True,
f"{tr('prompt_queued')}\n\n{tr('task_id')}: {prompt_id}"
)
else:
logger.error(f"ComfyUI отклонил запрос: {response.status_code} {response.text}")
self.finished.emit(
False,
f"{tr('comfy_server_error', code=response.status_code)}:\n{response.text}"
)
except json.JSONDecodeError as je:
logger.error(f"Не удалось распарсить prompt_json: {je}")
self.finished.emit(False, f"{tr('metadata_error')}:\n{je}")
except requests.exceptions.RequestException as re:
logger.error(f"Сетевое исключение при отправке: {re}")
self.finished.emit(
False,
f"{tr('comfy_connect_error', url=self.api_client.base_url)}\n\n{re}"
)
except Exception as e:
logger.error(f"Непредвиденная ошибка воркера: {e}")
self.finished.emit(False, str(e))