99 lines
2.8 KiB
Markdown
99 lines
2.8 KiB
Markdown
# ComfyUI Node Usage Stats
|
|
|
|
A ComfyUI custom node package that silently tracks which nodes and packages you actually use. Helps identify never-used packages that are safe to remove.
|
|
|
|
## Features
|
|
|
|
- Tracks every node used in every workflow execution
|
|
- Maps each node to its source package
|
|
- SQLite storage for efficient querying
|
|
- Per-package aggregated stats (total nodes, used/unused, execution counts)
|
|
- Frontend dialog with never-used packages highlighted for removal
|
|
- Expandable rows to see individual node-level stats within each package
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
cd /path/to/ComfyUI/custom_nodes
|
|
git clone https://github.com/ethanfel/Comfyui-Nodes-Stats.git
|
|
```
|
|
|
|
Restart ComfyUI. Tracking starts immediately and silently.
|
|
|
|
## Usage
|
|
|
|
### UI
|
|
|
|
Click the **"Node Stats"** button in the ComfyUI menu. A dialog shows:
|
|
|
|
- Summary: how many packages are never-used vs used
|
|
- **Never Used** section (highlighted) — safe to remove
|
|
- **Used** section sorted by least-to-most executions
|
|
- Click any row to expand and see individual node stats
|
|
|
|
### API
|
|
|
|
| Endpoint | Method | Description |
|
|
|----------|--------|-------------|
|
|
| `/nodes-stats/packages` | GET | Per-package aggregated stats |
|
|
| `/nodes-stats/usage` | GET | Raw per-node usage data |
|
|
| `/nodes-stats/reset` | POST | Clear all tracked data |
|
|
|
|
Example:
|
|
|
|
```bash
|
|
curl http://localhost:8188/nodes-stats/packages | python3 -m json.tool
|
|
```
|
|
|
|
### Package stats response format
|
|
|
|
```json
|
|
[
|
|
{
|
|
"package": "ComfyUI-Impact-Pack",
|
|
"total_executions": 42,
|
|
"used_nodes": 5,
|
|
"total_nodes": 30,
|
|
"never_used": false,
|
|
"last_seen": "2026-02-22T12:00:00+00:00",
|
|
"nodes": [
|
|
{
|
|
"class_type": "SAMDetectorCombined",
|
|
"package": "ComfyUI-Impact-Pack",
|
|
"count": 20,
|
|
"first_seen": "2026-01-01T00:00:00+00:00",
|
|
"last_seen": "2026-02-22T12:00:00+00:00"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
```
|
|
|
|
## File Structure
|
|
|
|
```
|
|
__init__.py # Entry point: prompt handler, API routes
|
|
mapper.py # class_type -> package name mapping
|
|
tracker.py # SQLite persistence and stats aggregation
|
|
js/
|
|
nodes_stats.js # Frontend: menu button + stats dialog
|
|
pyproject.toml # Package metadata
|
|
```
|
|
|
|
## How It Works
|
|
|
|
1. Registers a prompt handler via `PromptServer.instance.add_on_prompt_handler()`
|
|
2. On every prompt submission, extracts `class_type` from each node
|
|
3. Maps each class_type to its source package using `RELATIVE_PYTHON_MODULE`
|
|
4. Stores per-node counts and timestamps in SQLite (`usage_stats.db`)
|
|
5. Also logs the full set of nodes per prompt for future trend analysis
|
|
|
|
## Data Storage
|
|
|
|
All data is stored in `usage_stats.db` in the package directory. Two tables:
|
|
|
|
- **node_usage**: per-node counts, first/last seen timestamps
|
|
- **prompt_log**: JSON array of nodes used per prompt, with timestamp
|
|
|
|
Use `POST /nodes-stats/reset` to clear all data.
|