From 7282bdf62f31d848393aed3711fe03340311c1c2 Mon Sep 17 00:00:00 2001 From: Junst Date: Wed, 24 Sep 2025 14:52:43 +0900 Subject: [PATCH] Fix indentation error in concept_attention.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🔧 **Indentation Fix**: - Fixed IndentationError in _extract_concept_embeddings method - Corrected else block indentation after if statement - Properly aligned all code blocks within with torch.no_grad() context - Ensures clean Python syntax for ComfyUI import --- concept_attention.py | 60 ++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/concept_attention.py b/concept_attention.py index 79e43fe..49913a6 100644 --- a/concept_attention.py +++ b/concept_attention.py @@ -399,40 +399,40 @@ class ConceptAttention: logger.error(f"❌ Text encoder or tokenizer is None for concept '{concept}'! Real text encoding is required.") raise RuntimeError(f"Text encoder and tokenizer are required for concept '{concept}'. No fallback allowed.") else: - # Use ComfyUI CLIP's encode method directly (supports dual CLIP) - with torch.no_grad(): - if hasattr(text_encoder, 'encode'): - # ComfyUI CLIP.encode(text) method - works with dual CLIP - embedding = text_encoder.encode(concept) - logger.info(f"Using ComfyUI CLIP.encode for '{concept}': {type(embedding)}") - elif hasattr(text_encoder, 'encode_from_tokens'): - # ComfyUI CLIP.encode_from_tokens(tokens) method - works with dual CLIP - tokens = tokenizer(concept, return_tensors="pt", padding=True, truncation=True) - tokens = {k: v.to(self.device) for k, v in tokens.items()} - embedding = text_encoder.encode_from_tokens(tokens) - logger.info(f"Using ComfyUI CLIP.encode_from_tokens for '{concept}': {type(embedding)}") - elif hasattr(text_encoder, 'cond_stage_model'): - # Direct access to cond_stage_model (dual CLIP structure) - if hasattr(text_encoder.cond_stage_model, 'encode_token_weights'): + # Use ComfyUI CLIP's encode method directly (supports dual CLIP) + with torch.no_grad(): + if hasattr(text_encoder, 'encode'): + # ComfyUI CLIP.encode(text) method - works with dual CLIP + embedding = text_encoder.encode(concept) + logger.info(f"Using ComfyUI CLIP.encode for '{concept}': {type(embedding)}") + elif hasattr(text_encoder, 'encode_from_tokens'): + # ComfyUI CLIP.encode_from_tokens(tokens) method - works with dual CLIP tokens = tokenizer(concept, return_tensors="pt", padding=True, truncation=True) tokens = {k: v.to(self.device) for k, v in tokens.items()} - embedding = text_encoder.cond_stage_model.encode_token_weights(tokens) - logger.info(f"Using cond_stage_model.encode_token_weights for '{concept}': {type(embedding)}") + embedding = text_encoder.encode_from_tokens(tokens) + logger.info(f"Using ComfyUI CLIP.encode_from_tokens for '{concept}': {type(embedding)}") + elif hasattr(text_encoder, 'cond_stage_model'): + # Direct access to cond_stage_model (dual CLIP structure) + if hasattr(text_encoder.cond_stage_model, 'encode_token_weights'): + tokens = tokenizer(concept, return_tensors="pt", padding=True, truncation=True) + tokens = {k: v.to(self.device) for k, v in tokens.items()} + embedding = text_encoder.cond_stage_model.encode_token_weights(tokens) + logger.info(f"Using cond_stage_model.encode_token_weights for '{concept}': {type(embedding)}") + else: + logger.error(f"❌ No recognized encoding method for concept '{concept}'!") + raise RuntimeError(f"Text encoder must have encode, encode_from_tokens, or cond_stage_model.encode_token_weights method. No fallback allowed.") else: logger.error(f"❌ No recognized encoding method for concept '{concept}'!") - raise RuntimeError(f"Text encoder must have encode, encode_from_tokens, or cond_stage_model.encode_token_weights method. No fallback allowed.") - else: - logger.error(f"❌ No recognized encoding method for concept '{concept}'!") - raise RuntimeError(f"Text encoder must have encode, encode_from_tokens, or cond_stage_model method. No fallback allowed.") - - # Handle multiple outputs (e.g., [hidden_states, pooled_output]) - if isinstance(embedding, (list, tuple)): - embedding = embedding[0] if len(embedding) > 0 else embedding - - # Ensure embedding is on correct device and dtype - embedding = embedding.to(device=self.device) - concept_embeddings[concept] = embedding - logger.info(f"Extracted embedding for '{concept}': shape {embedding.shape}, dtype {embedding.dtype}") + raise RuntimeError(f"Text encoder must have encode, encode_from_tokens, or cond_stage_model method. No fallback allowed.") + + # Handle multiple outputs (e.g., [hidden_states, pooled_output]) + if isinstance(embedding, (list, tuple)): + embedding = embedding[0] if len(embedding) > 0 else embedding + + # Ensure embedding is on correct device and dtype + embedding = embedding.to(device=self.device) + concept_embeddings[concept] = embedding + logger.info(f"Extracted embedding for '{concept}': shape {embedding.shape}, dtype {embedding.dtype}") except Exception as e: logger.error(f"Error extracting concept embeddings: {e}")