""" Клиент 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))