Files
dinlo 34a40ae759 Initial release: Comfy-Studio v1.0.0
Десктопная галерея и менеджер изображений ComfyUI (PyQt6 + SQLite):
- мультипапочный мониторинг (watchdog), грид миниатюр, drag-and-drop
- теги, избранное, рейтинг, поиск по промтам
- парсер метаданных ComfyUI (PNG/WebP/JPEG), редактор workflow/prompt JSON
- перевод выделенного текста через контекстное меню (настраиваемые языки)
- отправка промта в очередь ComfyUI с внедрением правок и нового seed
- полноэкранный просмотр, локализация ru/en, тёмная тема

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:09:57 +08:00

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))