66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
|
|
"""
|
||
|
|
Клиент 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))
|