Fix indentation error in concept_attention.py

🔧 **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
This commit is contained in:
Junst
2025-09-24 14:52:43 +09:00
parent cfadc10246
commit 7282bdf62f
+30 -30
View File
@@ -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}")