in diagnosing integration issues with ComfyUI-SwissArmyKnife 🔧 (docker-compose.yml): add CIVITAI_API_KEY environment variable to docker-compose for CivitAI service integration 📝 (CIVITAI_API_KEY_WIDGET.md): document implementation details for CivitAI API key widget in LoRAInfoExtractor node, including usage examples and security considerations ✨ (MULTIPLE_LORA_SUPPORT.md): enhance LoRAInfoExtractor to support multiple LoRAs from WANVIDLORA list structure, improving processing and output format ♻️ (civitai_service.py): refactor CivitAIService to accept API key as parameter, allowing for better flexibility and debugging ♻️ (nodes.py): update LoRAInfoExtractor to support multiple LoRAs and CivitAI API key input, improving overall functionality and user experience
5.5 KiB
CivitAI API Key Widget Implementation
Overview
Added a UI widget for CivitAI API key input to the LoRAInfoExtractor node, with automatic environment variable mapping similar to the Gemini API implementation.
Implementation Details
1. New UI Widget
Added civitai_api_key input widget to LoRAInfoExtractor:
"civitai_api_key": ("STRING", {
"multiline": False,
"default": os.environ.get("CIVITAI_API_KEY") or os.environ.get("CIVIT_API_KEY", "YOUR_CIVITAI_API_KEY_HERE"),
"tooltip": "Your CivitAI API key (automatically uses CIVITAI_API_KEY or CIVIT_API_KEY environment variable if available)"
}),
2. Environment Variable Mapping
- Dual Variable Support: Widget checks both
CIVITAI_API_KEYandCIVIT_API_KEYenvironment variables - Automatic Detection: Widget automatically loads environment variable as default value
- Manual Override: Users can enter API key directly in the widget
- Placeholder Handling: Uses
"YOUR_CIVITAI_API_KEY_HERE"as placeholder when no key is available
3. WANVIDLORA Structure Support
Enhanced file path extraction to handle WANVIDLORA list structure:
# Handles list of LoRA dictionaries like:
[
{
'path': '/workspace/ComfyUI/models/loras/Wan2.2-Low-MysticXXX.safetensors',
'strength': 0.9999,
'name': 'Wan2.2-Low-MysticXXX',
'blocks': {},
'layer_filter': '',
'low_mem_load': False
}
]
4. CivitAI Service Updates
Enhanced CivitAIService to accept API key parameter with dual environment variable support:
def __init__(self, api_key=None):
self.cache = {}
# Use provided API key, otherwise fallback to environment variables (try both variants)
self.api_key = api_key or os.environ.get("CIVITAI_API_KEY") or os.environ.get("CIVIT_API_KEY", "")
5. Debug Logging Implementation
Added comprehensive debug logging throughout the process:
print(f"[DEBUG] LoRAInfoExtractor.extract_lora_info called:")
print(f" - civitai_api_key: {'PROVIDED' if civitai_api_key and civitai_api_key != 'YOUR_CIVITAI_API_KEY_HERE' else 'NOT PROVIDED'}")
print(f" - fallback_name: '{fallback_name}'")
print(f" - use_civitai_api: {use_civitai_api}")
Usage Examples
Example 1: Using Environment Variable (Full Name)
- Set environment variable:
export CIVITAI_API_KEY="your_actual_key_here" - Restart ComfyUI
- LoRAInfoExtractor widget will automatically show the key
- CivitAI API calls will use the environment key
Example 1b: Using Environment Variable (Short Name)
- Set environment variable:
export CIVIT_API_KEY="your_actual_key_here" - Restart ComfyUI
- LoRAInfoExtractor widget will automatically show the key
- CivitAI API calls will use the environment key
Example 2: Using Widget Input
- Add LoRAInfoExtractor node to workflow
- Enter CivitAI API key directly in the
civitai_api_keyfield - Key will override any environment variable setting
- CivitAI API calls will use the widget-provided key
Example 3: No API Key (Local Only)
- Leave
civitai_api_keyfield as placeholder - Set
use_civitai_apitoFalse - Node will use local metadata extraction only
Debug Output Example
When running with debug logging enabled:
[DEBUG] LoRAInfoExtractor.extract_lora_info called:
- civitai_api_key: PROVIDED
- fallback_name: 'My Custom LoRA'
- use_civitai_api: True
- lora type: <class 'list'>
[DEBUG] LoRA is a list with 1 items
[DEBUG] Processing first LoRA: <class 'dict'>
[DEBUG] First LoRA keys: ['path', 'strength', 'name', 'blocks', 'layer_filter', 'low_mem_load']
[DEBUG] Found path in first LoRA dict: /workspace/ComfyUI/models/loras/Wan2.2-Low-MysticXXX.safetensors
[DEBUG] Creating CivitAI service with API key: PROVIDED
[DEBUG] CivitAI Service initialized
[DEBUG] ✅ CivitAI API key found: test_wid...2345
Benefits
- User-Friendly: No need to set environment variables - can enter key directly in UI
- Flexible: Supports both environment variables and direct input
- Secure: API key is masked in debug output (shows only first 8 and last 4 characters)
- Debug-Ready: Comprehensive logging helps troubleshoot issues
- Consistent: Follows same pattern as Gemini API key implementation
Security Considerations
- API keys are masked in debug output:
test_wid...2345 - Keys are not logged in full to prevent accidental exposure
- Widget input is treated as sensitive data
Testing Results
✅ Widget Creation: CivitAI API key widget successfully added
✅ Environment Mapping: Automatic detection of CIVITAI_API_KEY or CIVIT_API_KEY environment variables
✅ Service Integration: CivitAI service accepts and uses provided API key
✅ Debug Logging: Comprehensive debug output for troubleshooting
✅ Fallback Mechanism: Works correctly when no API key provided
✅ WANVIDLORA Support: Properly handles WANVIDLORA list structure for file path extraction
✅ File Path Extraction: Successfully extracts paths from LoRA dictionaries in list format
Related Files
utils/nodes.py: LoRAInfoExtractor class with new widgetutils/civitai_service.py: Enhanced CivitAIService with API key parameterdocs/LORA_METADATA_INTEGRATION.md: Updated documentation
Next Steps
- Users can now enter CivitAI API keys directly in the ComfyUI interface
- Debug logging will help identify if CivitAI API calls are working correctly
- Consider adding API key validation to provide immediate feedback
- May want to add a "Test Connection" button for API key validation
Date
September 24, 2025