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>
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
"""
|
||||
Клиент 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))
|
||||
Reference in New Issue
Block a user