# LoRAInfoExtractor JSON Output Format ## Overview The `LoRAInfoExtractor` node now outputs structured JSON data instead of concatenated strings, providing better data handling and parsing capabilities for downstream processing. ## Implementation Details ### Return Types and Names - **RETURN_TYPES**: `("STRING", "STRING", "WANVIDLORA")` - **RETURN_NAMES**: `("lora_json", "lora_info", "lora_passthrough")` ### Output Structure The first output (`lora_json`) contains a JSON string with the following structure: ```json { "loras": [ { "index": 0, "name": "LoRA Name", "info": "Detailed info string", "path": "/path/to/lora.safetensors", "strength": 1.0, "has_civitai_data": true } ], "count": 1, "combined_display": "LoRA Name + Another LoRA" } ``` ### JSON Fields Description #### Root Level Fields - **`loras`**: Array of LoRA objects containing detailed metadata for each processed LoRA - **`count`**: Integer representing the total number of valid LoRAs processed - **`combined_display`**: String with " + " separated LoRA names for easy display (maintains backward compatibility) #### LoRA Object Fields - **`index`**: Zero-based index of the LoRA in the processing order - **`name`**: Clean LoRA name (from CivitAI or extracted from filename) - **`info`**: Human-readable information string including source (CivitAI/Local) and strength - **`path`**: Full file path to the LoRA file - **`strength`**: Numeric strength value from the WANVIDLORA configuration - **`has_civitai_data`**: Boolean indicating whether CivitAI metadata was successfully retrieved ## Example Outputs ### Multiple LoRAs with Mixed Sources ```json { "loras": [ { "index": 0, "name": "Realistic Vision", "info": "CivitAI: Realistic Vision (v5.1) by SomeCreator", "path": "/ComfyUI/models/loras/realistic_vision.safetensors", "strength": 1.0, "has_civitai_data": true }, { "index": 1, "name": "CustomStyle", "info": "Local: CustomStyle (strength: 0.8)", "path": "/ComfyUI/models/loras/custom_style.safetensors", "strength": 0.8, "has_civitai_data": false } ], "count": 2, "combined_display": "Realistic Vision + CustomStyle" } ``` ### No Valid LoRAs (Error Case) ```json { "loras": [], "count": 0, "combined_display": "No Valid LoRAs", "error": "No valid LoRAs found" } ``` ### Exception Handling ```json { "loras": [], "count": 0, "combined_display": "Error Extracting LoRA", "error": "Specific error message" } ``` ## Processing Logic ### Multiple LoRA Processing 1. **Input Validation**: Check if input is WANVIDLORA list structure 2. **LoRA Filtering**: Skip entries with `path: 'none'` or empty paths 3. **CivitAI Lookup**: Query CivitAI API for each valid LoRA (if enabled) 4. **Name Extraction**: Use CivitAI name or extract from filename 5. **JSON Construction**: Build structured JSON with all metadata 6. **Return**: JSON string, human-readable info, and original passthrough ### Single LoRA Processing (Compatibility) - Maintains backward compatibility with non-list inputs - Returns same JSON structure with single LoRA in array - Handles both CivitAI and local extraction methods ## Usage Examples ### Parsing JSON Output in Python ```python import json # From ComfyUI workflow lora_json, lora_info, lora_passthrough = lora_extractor_node_output # Parse JSON lora_data = json.loads(lora_json) # Access data total_loras = lora_data["count"] display_name = lora_data["combined_display"] # Iterate through LoRAs for lora in lora_data["loras"]: print(f"LoRA: {lora['name']} (strength: {lora['strength']})") if lora["has_civitai_data"]: print(" Has CivitAI metadata") else: print(" Local metadata only") ``` ### JavaScript Processing ```javascript // Parse JSON output const loraData = JSON.parse(loraJsonOutput); // Access combined display for UI document.getElementById('lora-display').textContent = loraData.combined_display; // Process individual LoRAs loraData.loras.forEach((lora, index) => { console.log(`LoRA ${index + 1}: ${lora.name} at ${lora.strength} strength`); }); ``` ## Benefits of JSON Format ### Structured Data Access - **Programmatic Processing**: Easy to parse and process in any language - **Type Safety**: Clear data types for each field - **Extensibility**: Easy to add new fields without breaking existing code ### Backward Compatibility - **Combined Display**: `combined_display` field maintains the " + " separated format - **Info String**: Second output still provides human-readable information - **Passthrough**: Third output preserves original WANVIDLORA data ### Enhanced Metadata - **Strength Values**: Individual strength values for each LoRA - **Source Information**: Clear indication of CivitAI vs local metadata - **File Paths**: Full paths available for further processing - **Processing Status**: Error handling and success indicators ## Migration Guide ### From String Format **Old Usage** (string concatenation): ```python # Old format returned: "LoRA1 + LoRA2" lora_names = old_output[0] names_list = lora_names.split(" + ") ``` **New Usage** (JSON parsing): ```python # New format returns structured JSON lora_json = json.loads(new_output[0]) names_list = [lora["name"] for lora in lora_json["loras"]] combined_display = lora_json["combined_display"] # Same as old format ``` ### Accessing Additional Data With JSON format, you now have access to: - Individual LoRA strength values - Full file paths - CivitAI metadata indicators - Processing error information - Structured arrays for iteration ## Implementation Status - ✅ **JSON Structure**: Complete with all metadata fields - ✅ **Multiple LoRA Support**: Handles WANVIDLORA list structure - ✅ **Single LoRA Compatibility**: Backward compatibility maintained - ✅ **Error Handling**: Proper JSON error responses - ✅ **CivitAI Integration**: Preserves CivitAI metadata detection - ✅ **Testing**: Validated with mock data and real WANVIDLORA structures ## Technical Notes ### JSON Library Uses Python's built-in `json` module for serialization: - **Consistency**: Standard JSON formatting with 2-space indentation - **Reliability**: Built-in error handling and validation - **Performance**: Efficient serialization and parsing ### Memory Considerations - JSON strings are larger than simple concatenated strings - Rich metadata provides more value than storage overhead - Structured data enables better caching and processing optimization ### Future Enhancements Potential additions to JSON structure: - **Model Hash**: File hash for verification - **File Size**: LoRA file size information - **Last Modified**: File timestamp data - **Tags**: CivitAI tag information - **Ratings**: CivitAI popularity/rating data