Create Hook.py

This commit is contained in:
XchanBik
2025-05-10 22:20:25 +02:00
committed by GitHub
parent f71279dbb2
commit 84f89e0eaf
+118
View File
@@ -0,0 +1,118 @@
# ComfyUI/custom_nodes/minimal_hook_extension.py
import types
import json # Pour un affichage lisible du workflow
# --- Récupération de l'instance de PromptServer ---
# Ceci est la manière standard dont les composants de ComfyUI accèdent à l'instance du serveur.
# Cela suppose que server.py de ComfyUI a initialisé PromptServer.instance.
PROMPT_SERVER_INSTANCE = None
try:
# Importe le module 'server' de ComfyUI
import server
if hasattr(server, 'PromptServer') and hasattr(server.PromptServer, 'instance'):
PROMPT_SERVER_INSTANCE = server.PromptServer.instance
print("MINIMAL HOOK: Instance de PromptServer trouvée.")
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}")
# --- 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:
print("MINIMAL HOOK (init): Instance de PromptServer non disponible lors de l'initialisation de l'intercepteur.")
def hooked_queue_prompt(self, server_instance_passed_by_type, *args, **kwargs):
"""
Cette méthode remplacera PromptServer.instance.queue_prompt.
Le premier argument 'server_instance_passed_by_type' sera l'instance de PromptServer,
car types.MethodType lie cette méthode à cette instance.
'self' ici est l'instance de 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)}")
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)}")
if isinstance(workflow, dict):
print(f"Nombre de nœuds dans le workflow: {len(workflow)}")
print("Les 3 premiers nœuds (ou tous si moins de 3):")
node_count = 0
for node_id, node_data in workflow.items():
print(f" ID Nœud: {node_id}")
print(f" Type de Classe: {node_data.get('class_type', 'N/A')}")
# Pourrait être verbeux : print(f" Inputs: {node_data.get('inputs', {})}")
node_count += 1
if node_count >= 3:
if len(workflow) > 3:
print(" ... (et potentiellement d'autres nœuds)")
break
# Option pour afficher une partie du JSON (peut être très long pour de gros workflows)
# print("Workflow (extrait JSON du premier noeud):")
# if workflow:
# first_node_id = next(iter(workflow))
# print(json.dumps({first_node_id: workflow[first_node_id]}, indent=2, default=str))
else:
print(f"Données du workflow (brutes): {workflow}")
else:
print("MINIMAL HOOK: Aucun argument positionnel reçu dans le hook.")
print("MINIMAL HOOK: Appel de la méthode originale 'queue_prompt'...")
print("=====================================================================\n")
if self.original_queue_prompt_method:
# Appelle la méthode originale stockée.
# Elle est déjà liée à la bonne instance de PromptServer.
return self.original_queue_prompt_method(*args, **kwargs)
else:
# 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.")