diff --git a/README.md b/README.md index 437786b..2e7bb07 100644 --- a/README.md +++ b/README.md @@ -1,121 +1,347 @@ -# 🎛️ AI Settings Manager for ComfyUI +

+ + + + + + + + + + + + + + { JSON } + ComfyUI JSON Manager + Visual dashboard & dynamic nodes for AI video workflows + +

-A 100% vibecoded, visual dashboard for managing, versioning, and batch-processing JSON configuration files used in AI video generation workflows (I2V, VACE). +

+ License + Python + Streamlit + ComfyUI +

-This tool consists of two parts: -1. **Streamlit Web Interface:** A Dockerized editor to manage prompts, LoRAs, settings, and **branching history**. -2. **ComfyUI Custom Nodes:** A set of nodes to read these JSON files (including custom keys) directly into your workflows. +A visual dashboard for managing, versioning, and batch-processing JSON configuration files used in AI video generation workflows (I2V, VACE). Two parts: -![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg) ![Python](https://img.shields.io/badge/Python-3.10%2B-green) ![Streamlit](https://img.shields.io/badge/Built%20with-Streamlit-red) ---- - -## ✨ Features - -### 📝 Single File Editor -* **Visual Interface:** Edit Prompts, Negative Prompts, Seeds, LoRAs, and advanced settings (Camera, FLF, VACE params) without touching raw JSON. -* **🔧 Custom Parameters:** Add arbitrary key-value pairs (e.g., `controlnet_strength`, `my_custom_value`) that persist and can be read by ComfyUI. -* **Conflict Protection:** Prevents accidental overwrites if the file is modified by another tab or process. -* **Snippet Library:** Save reusable prompt fragments (e.g., "Cinematic Lighting", "Anime Style") and append them with one click. - -### 🚀 Batch Processor -* **Sequence Management:** Create unlimited sequences within a single JSON file. -* **Smart Import:** Copy settings from **any other file** or **history entry** into your current batch sequence. -* **Custom Keys per Shot:** Define unique parameters for specific shots in a batch (e.g., Shot 1 has `fog: 0.5`, Shot 2 has `fog: 0.0`). -* **Promote to Single:** One-click convert a specific batch sequence back into a standalone Single File. - -### 🕒 Visual Timeline (New!) -* **Git-Style Branching:** A dedicated tab visualizes your edit history as a **horizontal node graph**. -* **Non-Destructive:** If you jump back to an old version and make changes, the system automatically **forks a new branch** so you never lose history. -* **Visual Diff:** Inspect any past version and see a "Delta View" highlighting exactly what changed (e.g., `Seed: 100 -> 555`) compared to your current state. -* **Interactive Mode (WIP):** A zoomed-out, interactive canvas to explore complex history trees. +1. **Streamlit Web Interface** — Dockerized editor for prompts, LoRAs, settings, and branching history +2. **ComfyUI Custom Nodes** — Read JSON files directly into workflows, including a dynamic node that auto-discovers keys --- -## 🛠️ Installation +## Features -### 1. Unraid / Docker Setup (The Manager) -This tool is designed to run as a lightweight container on Unraid. + + + + + + + + + +
-1. **Prepare a Folder:** Create a folder on your server (e.g., `/mnt/user/appdata/ai-manager/`) and place the following files inside: - * `app.py` - * `utils.py` - * `history_tree.py` (New logic engine) - * `tab_single.py` - * `tab_batch.py` - * `tab_timeline.py` - * `tab_timeline_wip.py` -2. **Add Container in Unraid:** - * **Repository:** `python:3.12-slim` - * **Network:** `Bridge` - * **WebUI:** `http://[IP]:[PORT:8501]` -3. **Path Mappings:** - * **App Location:** Container `/app` ↔ Host `/mnt/user/appdata/ai-manager/` - * **Project Data:** Container `/mnt/user/` ↔ Host `/mnt/user/` (Your media/JSON location) -4. **Post Arguments (Crucial):** - Enable "Advanced View" and paste this command to install the required graph engines: - ```bash - /bin/sh -c "apt-get update && apt-get install -y graphviz && pip install streamlit opencv-python-headless graphviz streamlit-agraph && cd /app && streamlit run app.py --server.headless true --server.port 8501" - ``` +

+E +Single File Editor +

-### 2. ComfyUI Setup (The Nodes) -1. Navigate to your ComfyUI installation: `ComfyUI/custom_nodes/` -2. Create a folder named `ComfyUI-JSON-Loader`. -3. Place the `json_loader.py` file inside. -4. Restart ComfyUI. +- Visual editing of Prompts, Seeds, LoRAs, Camera, FLF, VACE params +- Custom key-value parameters that persist and flow to ComfyUI +- Conflict protection against external file modifications +- Snippet library for reusable prompt fragments + +
+ +

+B +Batch Processor +

+ +- Unlimited sequences within a single JSON file +- Import settings from any file or history entry +- Per-shot custom keys (e.g. Shot 1: `fog: 0.5`, Shot 2: `fog: 0.0`) +- Clone, reorder, and manage sequences visually + +
+ +

+T +Visual Timeline +

+ +- Git-style branching with horizontal node graph +- Non-destructive: forking on old-version edits preserves all history +- Visual diff highlighting changes between any two versions +- Restore any past state with one click + +
+ +

+D +Dynamic Node (New) +

+ +- Auto-discovers all JSON keys and exposes them as outputs +- No code changes needed when JSON structure evolves +- Preserves connections when keys are added on refresh +- Native type handling: `int`, `float`, `string` + +
--- -## 🖥️ Usage Guide +## Installation + +### 1. Unraid / Docker (Streamlit Manager) + +```bash +# Repository: python:3.12-slim +# Network: Bridge +# WebUI: http://[IP]:[PORT:8501] +``` + +**Path Mappings:** +| Container | Host | Purpose | +|:---|:---|:---| +| `/app` | `/mnt/user/appdata/ai-manager/` | App files | +| `/mnt/user/` | `/mnt/user/` | Project data / JSON location | + +**Post Arguments:** +```bash +/bin/sh -c "apt-get update && apt-get install -y graphviz && \ + pip install streamlit opencv-python-headless graphviz streamlit-agraph && \ + cd /app && streamlit run app.py --server.headless true --server.port 8501" +``` + +### 2. ComfyUI (Custom Nodes) + +```bash +cd ComfyUI/custom_nodes/ +git clone ComfyUI-JSON-Manager +# Restart ComfyUI +``` + +--- + +## ComfyUI Nodes + +### Node Overview + + +

+ + + + + + + + + + + + + + batch_prompt + .json + + + + + + + + JSON Loader (Dynamic) + auto-discovers keys + click Refresh to populate + + + + JSON Batch Loader (I2V) + prompts, flf, seed, paths + + + + JSON Batch Loader (VACE) + + vace frames, schedule + + + + JSON Loader (Custom 1/3/6) + + + + general_prompt + seed (int) + my_custom_key ... + + + general_prompt, camera, + flf, seed, paths ... + + + + frame_to_skip, vace_schedule, + input_a_frames ... + + + manual key lookup (1-6 slots) + +

+ +### Dynamic Node + +The **JSON Loader (Dynamic)** node reads your JSON file and automatically creates output slots for every key it finds. No code changes needed when your JSON structure evolves. + +**How it works:** +1. Enter a `json_path` and `sequence_number` +2. Click **Refresh Outputs** +3. Outputs appear named after JSON keys, with native types preserved + +

+ + + + + + + + + + + + + JSON Loader (Dynamic) + + + json_path: /data/prompt.json + sequence_number: 1 + + + + Refresh Outputs + + + + general_prompt + + + negative + + + seed + + + flf + + + camera + + + + + + + + KSampler + + positive + + seed + + + + STRING + + INT + + FLOAT + +

+ +**Type handling:** Values keep their native Python type — `int` stays `int`, `float` stays `float`, booleans become `"true"`/`"false"` strings, everything else becomes `string`. The `*` (any) output type allows connecting to any input. + +**Refreshing is safe:** Clicking Refresh after adding new keys to your JSON preserves all existing connections. Only removed keys get disconnected. + +### Standard & Batch Nodes + +| Node | Outputs | Use Case | +|:---|:---|:---| +| **JSON Loader (Standard/I2V)** | prompts, flf, seed, paths | Single-file I2V workflows | +| **JSON Loader (VACE Full)** | above + VACE integers | Single-file VACE workflows | +| **JSON Loader (LoRAs Only)** | 6 LoRA strings | Single-file LoRA loading | +| **JSON Batch Loader (I2V)** | prompts, flf, seed, paths | Batch I2V with sequence_number | +| **JSON Batch Loader (VACE)** | above + VACE integers | Batch VACE with sequence_number | +| **JSON Batch Loader (LoRAs)** | 6 LoRA strings | Batch LoRA loading | +| **JSON Loader (Custom 1/3/6)** | 1, 3, or 6 string values | Manual key lookup by name | + +--- + +## Web Interface Usage -### The Web Interface Navigate to your container's IP (e.g., `http://192.168.1.100:8501`). -* **Custom Parameters:** Scroll to the bottom of the editor (Single or Batch) to find the "🔧 Custom Parameters" section. Type a Key (e.g., `strength`) and Value (e.g., `0.8`) and click "Add". -* **Timeline:** Switch to the **Timeline Tab** to see your version history. - * **Restore:** Select a node from the list or click on the graph (WIP tab) to view details. Click "Restore" to revert settings to that point. - * **Branching:** If you restore an old node and click "Save/Snap", a new branch is created automatically. +**Path navigation** supports case-insensitive matching — typing `/media/P5/myFolder` will resolve to `/media/p5/MyFolder` automatically. -### ComfyUI Workflow -Search for "JSON" in ComfyUI to find the new nodes. - -image - -#### Standard Nodes -| Node Name | Description | -| :--- | :--- | -| **JSON Loader (Standard/I2V)** | Outputs prompts, FLF, Seed, and paths for I2V. | -| **JSON Loader (VACE Full)** | Outputs everything above plus VACE integers (frames to skip, schedule, etc.). | -| **JSON Loader (LoRAs Only)** | Outputs the 6 LoRA strings. | - -#### Universal Custom Nodes (New!) -These nodes read *any* key you added in the "Custom Parameters" section. They work for both Single files (ignores sequence input) and Batch files (reads specific sequence). - -| Node Name | Description | -| :--- | :--- | -| **JSON Loader (Custom 1)** | Reads 1 custom key. Input the key name (e.g., "strength"), outputs the value string. | -| **JSON Loader (Custom 3)** | Reads 3 custom keys. | -| **JSON Loader (Custom 6)** | Reads 6 custom keys. | - -#### Batch Nodes -These nodes require an integer input (Primitive or Batch Indexer) for `sequence_number`. - -| Node Name | Description | -| :--- | :--- | -| **JSON Batch Loader (I2V)** | Loads specific sequence data for I2V. | -| **JSON Batch Loader (VACE)** | Loads specific sequence data for VACE. | -| **JSON Batch Loader (LoRAs)** | Loads specific LoRAs for that sequence. | +- **Custom Parameters:** Scroll to "Custom Parameters" in any editor tab. Type a key and value, click Add. +- **Timeline:** Switch to the Timeline tab to see version history as a graph. Restore any version, and new edits fork a branch automatically. +- **Snippets:** Save reusable prompt fragments and append them with one click. --- -## 📂 File Structure +## JSON Format -```text -/ai-manager -├── app.py # Main entry point & Tab controller -├── utils.py # I/O logic, Config, and Defaults -├── history_tree.py # Graph logic, Branching engine, Graphviz generator -├── tab_single.py # Single Editor UI -├── tab_batch.py # Batch Processor UI -├── tab_timeline.py # Stable Timeline UI (Compact Graphviz + Diff Inspector) -├── tab_timeline_wip.py # Interactive Timeline UI (Streamlit Agraph) -└── json_loader.py # ComfyUI Custom Node script +```jsonc +{ + "batch_data": [ + { + "sequence_number": 1, + "general_prompt": "A cinematic scene...", + "negative": "blurry, low quality", + "seed": 42, + "flf": 0.5, + "camera": "pan_left", + "video file path": "/data/input.mp4", + "reference image path": "/data/ref.png", + "my_custom_key": "any value" + // ... any additional keys are auto-discovered by the Dynamic node + } + ] +} +``` + +--- + +## File Structure + +``` +ComfyUI-JSON-Manager/ +├── __init__.py # ComfyUI entry point, exports nodes + WEB_DIRECTORY +├── json_loader.py # All ComfyUI node classes + /json_manager/get_keys API +├── web/ +│ └── json_dynamic.js # Frontend extension for Dynamic node (refresh, show/hide) +├── app.py # Streamlit main entry point & navigator +├── utils.py # I/O, config, defaults, case-insensitive path resolver +├── history_tree.py # Git-style branching engine +├── tab_single.py # Single file editor UI +├── tab_batch.py # Batch processor UI +├── tab_timeline.py # Visual timeline UI +├── tab_comfy.py # ComfyUI server monitor +├── tab_raw.py # Raw JSON editor +└── tests/ + ├── test_json_loader.py + ├── test_utils.py + └── test_history_tree.py +``` + +--- + +## License + +[Apache 2.0](LICENSE)