Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -9,17 +9,15 @@ from huggingface_hub import hf_hub_download
|
|
| 9 |
import spaces
|
| 10 |
from typing import Union, Sequence, Mapping, Any
|
| 11 |
import logging
|
| 12 |
-
|
| 13 |
-
# Adicione se ainda não tiver
|
| 14 |
from nodes import NODE_CLASS_MAPPINGS, init_extra_nodes, SaveImage # <-- Node SaveImage
|
| 15 |
from comfy import model_management
|
| 16 |
import folder_paths
|
| 17 |
|
| 18 |
-
# Configurar logging para debug
|
| 19 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
| 20 |
logger = logging.getLogger(__name__)
|
| 21 |
|
| 22 |
-
#
|
| 23 |
current_dir = os.path.dirname(os.path.abspath(__file__))
|
| 24 |
sys.path.append(current_dir)
|
| 25 |
|
|
@@ -31,7 +29,7 @@ os.makedirs(output_dir, exist_ok=True)
|
|
| 31 |
os.makedirs(models_dir, exist_ok=True)
|
| 32 |
folder_paths.set_output_directory(output_dir)
|
| 33 |
|
| 34 |
-
# Configurar caminhos dos modelos e verificar estrutura
|
| 35 |
MODEL_FOLDERS = ["style_models", "text_encoders", "vae", "unet", "clip_vision"]
|
| 36 |
for model_folder in MODEL_FOLDERS:
|
| 37 |
folder_path = os.path.join(models_dir, model_folder)
|
|
@@ -39,7 +37,7 @@ for model_folder in MODEL_FOLDERS:
|
|
| 39 |
folder_paths.add_model_folder_path(model_folder, folder_path)
|
| 40 |
logger.info(f"Pasta de modelo configurada: {model_folder}")
|
| 41 |
|
| 42 |
-
#
|
| 43 |
logger.info(f"Python version: {sys.version}")
|
| 44 |
logger.info(f"Torch version: {torch.__version__}")
|
| 45 |
logger.info(f"CUDA disponível: {torch.cuda.is_available()}")
|
|
@@ -47,7 +45,7 @@ logger.info(f"Quantidade de GPUs: {torch.cuda.device_count()}")
|
|
| 47 |
if torch.cuda.is_available():
|
| 48 |
logger.info(f"GPU atual: {torch.cuda.get_device_name(0)}")
|
| 49 |
|
| 50 |
-
#
|
| 51 |
logger.info("Inicializando ComfyUI...")
|
| 52 |
try:
|
| 53 |
init_extra_nodes()
|
|
@@ -55,7 +53,7 @@ except Exception as e:
|
|
| 55 |
logger.warning(f"Aviso na inicialização de nós extras: {str(e)}")
|
| 56 |
logger.info("Continuando mesmo com avisos nos nós extras...")
|
| 57 |
|
| 58 |
-
#
|
| 59 |
def get_value_at_index(obj: Union[Sequence, Mapping], index: int) -> Any:
|
| 60 |
try:
|
| 61 |
return obj[index]
|
|
@@ -69,7 +67,7 @@ def verify_file_exists(folder: str, filename: str) -> bool:
|
|
| 69 |
logger.error(f"Arquivo não encontrado: {file_path}")
|
| 70 |
return exists
|
| 71 |
|
| 72 |
-
#
|
| 73 |
logger.info("Baixando modelos necessários...")
|
| 74 |
try:
|
| 75 |
hf_hub_download(
|
|
@@ -106,7 +104,7 @@ except Exception as e:
|
|
| 106 |
logger.error(f"Erro ao baixar modelos: {str(e)}")
|
| 107 |
raise
|
| 108 |
|
| 109 |
-
#
|
| 110 |
logger.info("Inicializando modelos...")
|
| 111 |
try:
|
| 112 |
with torch.no_grad():
|
|
@@ -169,7 +167,7 @@ except Exception as e:
|
|
| 169 |
logger.error(f"Erro ao inicializar modelos: {str(e)}")
|
| 170 |
raise
|
| 171 |
|
| 172 |
-
#
|
| 173 |
@spaces.GPU
|
| 174 |
def generate_image(
|
| 175 |
prompt, input_image, lora_weight, guidance, downsampling_factor,
|
|
@@ -246,35 +244,15 @@ def generate_image(
|
|
| 246 |
vae=VAE_MODEL[0]
|
| 247 |
)
|
| 248 |
|
| 249 |
-
#
|
| 250 |
logger.info("Salvando imagem via node SaveImage...")
|
| 251 |
-
|
| 252 |
-
# 1. Pegue a saída do decode (tensor)
|
| 253 |
-
decoded_tensor = decoded[0] # se 'decoded' for um dict/tuple, ajuste conforme preciso
|
| 254 |
-
|
| 255 |
-
# 2. Instancia o SaveImage
|
| 256 |
saveimage_node = NODE_CLASS_MAPPINGS["SaveImage"]()
|
| 257 |
-
|
| 258 |
-
# 3. Usa o método save_images
|
| 259 |
-
# 'filename_prefix' é o prefixo do arquivo de saída
|
| 260 |
result_dict = saveimage_node.save_images(
|
| 261 |
-
filename_prefix="
|
| 262 |
images=decoded_tensor
|
| 263 |
)
|
| 264 |
-
|
| 265 |
-
# 4. Normalmente, o node 'save_images' retorna um dicionário contendo:
|
| 266 |
-
# {
|
| 267 |
-
# 'ui': {
|
| 268 |
-
# 'images': [
|
| 269 |
-
# {'filename': 'FluxRedux_12345.png', 'subfolder': ''},
|
| 270 |
-
# ...
|
| 271 |
-
# ]
|
| 272 |
-
# },
|
| 273 |
-
# ...
|
| 274 |
-
# }
|
| 275 |
-
# Assim, para pegar o nome do arquivo salvo:
|
| 276 |
saved_path = os.path.join(output_dir, result_dict["ui"]["images"][0]["filename"])
|
| 277 |
-
|
| 278 |
logger.info(f"Imagem salva em: {saved_path}")
|
| 279 |
return saved_path
|
| 280 |
|
|
|
|
| 9 |
import spaces
|
| 10 |
from typing import Union, Sequence, Mapping, Any
|
| 11 |
import logging
|
|
|
|
|
|
|
| 12 |
from nodes import NODE_CLASS_MAPPINGS, init_extra_nodes, SaveImage # <-- Node SaveImage
|
| 13 |
from comfy import model_management
|
| 14 |
import folder_paths
|
| 15 |
|
| 16 |
+
# 1. Configurar logging para debug
|
| 17 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
| 18 |
logger = logging.getLogger(__name__)
|
| 19 |
|
| 20 |
+
# 2. Configuração de Caminhos e Imports
|
| 21 |
current_dir = os.path.dirname(os.path.abspath(__file__))
|
| 22 |
sys.path.append(current_dir)
|
| 23 |
|
|
|
|
| 29 |
os.makedirs(models_dir, exist_ok=True)
|
| 30 |
folder_paths.set_output_directory(output_dir)
|
| 31 |
|
| 32 |
+
# 4. Configurar caminhos dos modelos e verificar estrutura
|
| 33 |
MODEL_FOLDERS = ["style_models", "text_encoders", "vae", "unet", "clip_vision"]
|
| 34 |
for model_folder in MODEL_FOLDERS:
|
| 35 |
folder_path = os.path.join(models_dir, model_folder)
|
|
|
|
| 37 |
folder_paths.add_model_folder_path(model_folder, folder_path)
|
| 38 |
logger.info(f"Pasta de modelo configurada: {model_folder}")
|
| 39 |
|
| 40 |
+
# 5. Diagnóstico CUDA
|
| 41 |
logger.info(f"Python version: {sys.version}")
|
| 42 |
logger.info(f"Torch version: {torch.__version__}")
|
| 43 |
logger.info(f"CUDA disponível: {torch.cuda.is_available()}")
|
|
|
|
| 45 |
if torch.cuda.is_available():
|
| 46 |
logger.info(f"GPU atual: {torch.cuda.get_device_name(0)}")
|
| 47 |
|
| 48 |
+
# 6. Inicialização do ComfyUI
|
| 49 |
logger.info("Inicializando ComfyUI...")
|
| 50 |
try:
|
| 51 |
init_extra_nodes()
|
|
|
|
| 53 |
logger.warning(f"Aviso na inicialização de nós extras: {str(e)}")
|
| 54 |
logger.info("Continuando mesmo com avisos nos nós extras...")
|
| 55 |
|
| 56 |
+
# 7. Helper Functions
|
| 57 |
def get_value_at_index(obj: Union[Sequence, Mapping], index: int) -> Any:
|
| 58 |
try:
|
| 59 |
return obj[index]
|
|
|
|
| 67 |
logger.error(f"Arquivo não encontrado: {file_path}")
|
| 68 |
return exists
|
| 69 |
|
| 70 |
+
# 8. Download de Modelos
|
| 71 |
logger.info("Baixando modelos necessários...")
|
| 72 |
try:
|
| 73 |
hf_hub_download(
|
|
|
|
| 104 |
logger.error(f"Erro ao baixar modelos: {str(e)}")
|
| 105 |
raise
|
| 106 |
|
| 107 |
+
# 9. Inicialização dos Modelos
|
| 108 |
logger.info("Inicializando modelos...")
|
| 109 |
try:
|
| 110 |
with torch.no_grad():
|
|
|
|
| 167 |
logger.error(f"Erro ao inicializar modelos: {str(e)}")
|
| 168 |
raise
|
| 169 |
|
| 170 |
+
# 10. Função de Geração
|
| 171 |
@spaces.GPU
|
| 172 |
def generate_image(
|
| 173 |
prompt, input_image, lora_weight, guidance, downsampling_factor,
|
|
|
|
| 244 |
vae=VAE_MODEL[0]
|
| 245 |
)
|
| 246 |
|
| 247 |
+
# Salvar Imagem
|
| 248 |
logger.info("Salvando imagem via node SaveImage...")
|
| 249 |
+
decoded_tensor = decoded[0]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 250 |
saveimage_node = NODE_CLASS_MAPPINGS["SaveImage"]()
|
|
|
|
|
|
|
|
|
|
| 251 |
result_dict = saveimage_node.save_images(
|
| 252 |
+
filename_prefix="Flux_",
|
| 253 |
images=decoded_tensor
|
| 254 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
saved_path = os.path.join(output_dir, result_dict["ui"]["images"][0]["filename"])
|
|
|
|
| 256 |
logger.info(f"Imagem salva em: {saved_path}")
|
| 257 |
return saved_path
|
| 258 |
|