Update Hook.py
This commit is contained in:
@@ -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.")
|
||||
|
||||
Reference in New Issue
Block a user