Update Hook.py

This commit is contained in:
XchanBik
2025-05-10 22:44:05 +02:00
committed by GitHub
parent 007a171923
commit a9077eab85
+46 -47
View File
@@ -1,5 +1,4 @@
import types
import server
import json # Pour un affichage lisible du workflow
# --- Récupération de l'instance de PromptServer ---
@@ -7,29 +6,62 @@ import json # Pour un affichage lisible du workflow
# Cela suppose que server.py de ComfyUI a initialisé PromptServer.instance.
PROMPT_SERVER_INSTANCE = None
def get_prompt_server():
def init_prompt_server():
global PROMPT_SERVER_INSTANCE
try:
# Importe le module 'server' de ComfyUI
import server # Lazy import here
if hasattr(server, 'PromptServer') and hasattr(server.PromptServer, 'instance'):
PROMPT_SERVER_INSTANCE = server.PromptServer.instance
print("MINIMAL HOOK: Instance de PromptServer trouvée.")
return PROMPT_SERVER_INSTANCE
else:
print("MINIMAL HOOK: 'server.PromptServer.instance' non trouvée après l'import du module 'server'.")
except ImportError:
print("MINIMAL HOOK: Impossible d'importer le module 'server'. Le hook ne peut pas être installé de cette manière.")
except Exception as e:
print(f"MINIMAL HOOK: Erreur lors de la récupération de l'instance du serveur : {e}")
# Ce message est important pour que l'utilisateur le voie si la configuration échoue.
print("\n" + "="*70)
print("MINIMAL HOOK EXTENSION: Instance de PromptServer NON TROUVÉE au chargement du module.")
print("Le hook pour 'queue_prompt' N'A PAS ÉTÉ INSTALLÉ.")
print("Cela signifie généralement que l'environnement du serveur ComfyUI n'est pas celui attendu,")
print("ou que ce script est chargé avant que 'PromptServer.instance' ne soit prêt.")
print("Si ComfyUI démarre normalement, vérifiez la console pour les messages 'MINIMAL HOOK' précédents.")
print("="*70 + "\n")
return None
# --- Classe pour gérer l'interception ---
class MinimalWorkflowInterceptor:
def __init__(self):
self.original_queue_prompt_method = None
if PROMPT_SERVER_INSTANCE:
# Stocke la méthode originale. Elle est déjà liée à PROMPT_SERVER_INSTANCE.
self.original_queue_prompt_method = PROMPT_SERVER_INSTANCE.queue_prompt
print("MINIMAL HOOK (init): Méthode originale 'queue_prompt' stockée.")
else:
class MinimalWorkflowInterceptor:
def install(self):
server_instance = init_prompt_server()
if not server_instance:
print("MINIMAL HOOK (init): Instance de PromptServer non disponible lors de l'initialisation de l'intercepteur.")
return
# Stocke la méthode originale. Elle est déjà liée à PROMPT_SERVER_INSTANCE.
self.original_queue_prompt_method = PROMPT_SERVER_INSTANCE.queue_prompt
print("MINIMAL HOOK (init): Méthode originale 'queue_prompt' stockée.")
# Vérifier si le hook est déjà le nôtre pour éviter de patcher plusieurs fois
# Note: PROMPT_SERVER_INSTANCE.queue_prompt.__func__ == self.hooked_queue_prompt ne marche pas directement
# à cause de la liaison par types.MethodType. Une façon simple est d'utiliser un flag.
if hasattr(PROMPT_SERVER_INSTANCE.queue_prompt, '_hooked_by_minimal_interceptor'):
print("MINIMAL HOOK (install): Hook déjà installé par MinimalWorkflowInterceptor. Annulation.")
return
# Real hook install
try:
# Remplace la méthode sur l'instance de PROMPT_SERVER_INSTANCE par notre méthode 'hooked_queue_prompt'.
# types.MethodType fait en sorte que 'hooked_queue_prompt' se comporte comme une méthode de PROMPT_SERVER_INSTANCE.
PROMPT_SERVER_INSTANCE.queue_prompt = types.MethodType(self.hooked_queue_prompt, PROMPT_SERVER_INSTANCE)
# Marquer la méthode hookée pour éviter de la patcher à nouveau
PROMPT_SERVER_INSTANCE.queue_prompt._hooked_by_minimal_interceptor = True
print("MINIMAL HOOK: Hook 'queue_prompt' installé avec succès sur PromptServer.instance.")
except Exception as e:
print(f"MINIMAL HOOK: Échec de l'installation du hook : {e}")
# Tenter de restaurer si le patch a échoué et que l'original a été stocké
if self.original_queue_prompt_method:
PROMPT_SERVER_INSTANCE.queue_prompt = self.original_queue_prompt_method
print("MINIMAL HOOK: Tentative de restauration de la méthode originale 'queue_prompt' suite à une erreur d'installation.")
def hooked_queue_prompt(self, server_instance_passed_by_type, *args, **kwargs):
"""
@@ -40,12 +72,12 @@ class MinimalWorkflowInterceptor:
"""
print("\n=====================================================================")
print(f"MINIMAL HOOK: Appel à 'queue_prompt' intercepté ! (ID intercepteur: {id(self)})")
# print(f"Instance de PromptServer sur laquelle le hook est appelé: {id(server_instance_passed_by_type)}")
print(f"Instance de PromptServer sur laquelle le hook est appelé: {id(server_instance_passed_by_type)}")
if args:
workflow = args[0] # Le 'prompt' (workflow) est généralement le premier argument.
client_id = args[1] if len(args) > 1 else "ID Client Inconnu"
print(f"ID Client: {client_id}")
print(f"Type de données du Workflow: {type(workflow)}")
@@ -83,36 +115,3 @@ class MinimalWorkflowInterceptor:
# Cela ne devrait pas arriver si l'installation a réussi.
print("ERREUR MINIMAL HOOK: Méthode originale 'queue_prompt' non trouvée dans l'instance de l'intercepteur!")
raise RuntimeError("MINIMAL HOOK: Méthode originale 'queue_prompt' non disponible.")
def install(self):
"""Installe le hook sur l'instance de PromptServer."""
if not PROMPT_SERVER_INSTANCE:
print("MINIMAL HOOK (install): Instance de PromptServer non disponible. Le hook ne peut pas être installé.")
return
if not self.original_queue_prompt_method:
print("MINIMAL HOOK (install): Méthode 'queue_prompt' originale non capturée lors de l'init. Installation annulée.")
return
# Vérifier si le hook est déjà le nôtre pour éviter de patcher plusieurs fois
# Note: PROMPT_SERVER_INSTANCE.queue_prompt.__func__ == self.hooked_queue_prompt ne marche pas directement
# à cause de la liaison par types.MethodType. Une façon simple est d'utiliser un flag.
if hasattr(PROMPT_SERVER_INSTANCE.queue_prompt, '_hooked_by_minimal_interceptor'):
print("MINIMAL HOOK (install): Hook déjà installé par MinimalWorkflowInterceptor. Annulation.")
return
try:
# Remplace la méthode sur l'instance de PROMPT_SERVER_INSTANCE par notre méthode 'hooked_queue_prompt'.
# types.MethodType fait en sorte que 'hooked_queue_prompt' se comporte comme une méthode de PROMPT_SERVER_INSTANCE.
PROMPT_SERVER_INSTANCE.queue_prompt = types.MethodType(self.hooked_queue_prompt, PROMPT_SERVER_INSTANCE)
# Marquer la méthode hookée pour éviter de la patcher à nouveau
PROMPT_SERVER_INSTANCE.queue_prompt._hooked_by_minimal_interceptor = True
print("MINIMAL HOOK: Hook 'queue_prompt' installé avec succès sur PromptServer.instance.")
except Exception as e:
print(f"MINIMAL HOOK: Échec de l'installation du hook : {e}")
# Tenter de restaurer si le patch a échoué et que l'original a été stocké
if self.original_queue_prompt_method:
PROMPT_SERVER_INSTANCE.queue_prompt = self.original_queue_prompt_method
print("MINIMAL HOOK: Tentative de restauration de la méthode originale 'queue_prompt' suite à une erreur d'installation.")