sd-webui-infinite-image-bro.../skills/iib/SKILL.md

402 lines
13 KiB
Markdown

---
name: iib
description: Interact with IIB (Infinite Image Browsing) service for searching, browsing, tagging, and organizing AI-generated images. Use when the user needs to search images by prompt/keyword, manage image tags, organize files into folders, get image generation parameters, or work with an image library.
---
# IIB (Infinite Image Browsing)
IIB is an image/video browsing and management tool that parses metadata from AI generation tools (Stable Diffusion, ComfyUI, etc.).
---
## Quick Links to Detailed Guides
| Topic | Description |
|-------|-------------|
| **[API Reference](references/api-reference.md)** | Complete API endpoint documentation |
| **[Search Strategies](references/search-strategies.md)** | Multi-word, regex, tag combination searches |
| **[Agent Patterns](references/agent-patterns.md)** | Common workflows and decision trees |
---
## Before You Start
**IMPORTANT:** Always do these two things first:
1. **Ask the user for the port** if they started the service themselves (common ports: `<port>` standalone, `7860` SD WebUI extension)
2. **Test connectivity** with a hello request before any other operation
```bash
curl --noproxy "*" -s http://127.0.0.1:<PORT>/infinite_image_browsing/hello
# Returns: "hello" if service is running
```
Note: Use `--noproxy "*"` to bypass proxy for localhost connections.
**If service is not running**, start it:
```bash
cd /path/to/sd-webui-infinite-image-browsing
python app.py --port <port>
```
To run as a background daemon:
```bash
nohup python app.py --port <port> > iib.log 2>&1 &
```
## Quick Reference
| Task | Method | Endpoint |
|------|--------|----------|
| Search images | POST | `/db/search_by_substr` |
| Search by tags | POST | `/db/match_images_by_tags` |
| Random images | GET | `/db/random_images` |
| List folder | GET | `/files?folder_path=...` |
| Move files | POST | `/move_files` |
| Copy files | POST | `/copy_files` |
| Tag images | POST | `/db/batch_update_image_tag` |
| Get image metadata | GET | `/image_geninfo?path=...` |
| Add library path | POST | `/db/extra_paths` |
| Remove library path | DELETE | `/db/extra_paths` |
Base URL: `http://127.0.0.1:<port>/infinite_image_browsing`
## Core Operations
### Search Images
#### Basic Keyword Search
Search by keyword in file path or generation parameters:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/search_by_substr \
-H "Content-Type: application/json" \
-d '{"surstr": "landscape", "size": 50}'
```
#### Advanced Search
For complex searches (multi-word, regex patterns, tag combinations), see **[Search Strategies](references/search-strategies.md)**.
**Quick tips:**
- Multi-word searches? Use regex OR: `(word1|word2)`
- Need tag combinations? Use `/db/match_images_by_tags` with AND/OR/NOT logic
- See **[Search Strategies](references/search-strategies.md)** for detailed strategies
#### Limit to Specific Folders
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/search_by_substr \
-H "Content-Type: application/json" \
-d '{"surstr": "portrait", "folder_paths": ["/path/to/folder"], "size": 50}'
```
Response:
```json
{
"files": [{"fullpath": "/path/to/image.png", "name": "image.png", "size": "1.2 MB", ...}],
"cursor": {"has_next": true, "next": "cursor_string"}
}
```
### Tag Management
Get all tags:
```bash
curl http://127.0.0.1:<port>/infinite_image_browsing/db/basic_info
# Response includes: {"tags": [{"id": 1, "name": "favorites", "type": "custom"}, ...]}
```
Create a tag:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/add_custom_tag \
-H "Content-Type: application/json" \
-d '{"tag_name": "favorites"}'
```
Tag multiple images:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/batch_update_image_tag \
-H "Content-Type: application/json" \
-d '{"img_paths": ["/path/to/img1.png", "/path/to/img2.png"], "action": "add", "tag_id": 1}'
```
Search by tags (AND/OR/NOT logic):
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/match_images_by_tags \
-H "Content-Type: application/json" \
-d '{"and_tags": [1], "or_tags": [], "not_tags": [2], "cursor": "", "size": 50}'
```
### File Operations
List folder contents:
```bash
curl "http://127.0.0.1:<port>/infinite_image_browsing/files?folder_path=/path/to/images"
```
Move files:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/move_files \
-H "Content-Type: application/json" \
-d '{"file_paths": ["/path/to/img1.png"], "dest": "/new/folder", "create_dest_folder": true}'
```
Copy files:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/copy_files \
-H "Content-Type: application/json" \
-d '{"file_paths": ["/path/to/img1.png"], "dest": "/backup/folder", "create_dest_folder": true}'
```
Delete files:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/delete_files \
-H "Content-Type: application/json" \
-d '{"file_paths": ["/path/to/unwanted.png"]}'
```
### Image Metadata
Get generation parameters (prompt, seed, model, etc.):
```bash
curl "http://127.0.0.1:<port>/infinite_image_browsing/image_geninfo?path=/path/to/image.png"
```
Batch get metadata:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/image_geninfo_batch \
-H "Content-Type: application/json" \
-d '{"paths": ["/path/to/img1.png", "/path/to/img2.png"]}'
```
### Library Management
List registered paths:
```bash
curl http://127.0.0.1:<port>/infinite_image_browsing/db/extra_paths
```
Add a folder to library:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/extra_paths \
-H "Content-Type: application/json" \
-d '{"path": "/new/image/folder", "types": ["scanned"]}'
```
Remove a folder (also cleans up orphaned image records):
```bash
curl -X DELETE http://127.0.0.1:<port>/infinite_image_browsing/db/extra_paths \
-H "Content-Type: application/json" \
-d '{"path": "/old/folder", "types": ["scanned"]}'
```
Rebuild index after adding paths:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/rebuild_index
```
Path types:
- `scanned`: Indexed, appears in search results
- `scanned-fixed`: Like scanned, but pinned in UI
- `walk`: Browse only, not indexed
## AI Features
### Smart File Organization
Automatically organize images into themed folders:
```bash
# Start organization job
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/organize_files_start \
-H "Content-Type: application/json" \
-d '{
"folder_paths": ["/messy/folder"],
"dest_folder": "/organized/folder",
"threshold": 0.85,
"lang": "en",
"action": "move"
}'
# Returns: {"job_id": "uuid"}
# Check status
curl "http://127.0.0.1:<port>/infinite_image_browsing/db/organize_files_status?job_id=<job_id>"
# Confirm and execute
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/organize_files_confirm \
-H "Content-Type: application/json" \
-d '{"job_id": "<job_id>"}'
```
### Image Clustering
Analyze images and group by semantic similarity:
```bash
curl -X POST http://127.0.0.1:<port>/infinite_image_browsing/db/cluster_iib_output_job_start \
-H "Content-Type: application/json" \
-d '{
"folder_paths": ["/path/to/images"],
"threshold": 0.85,
"min_cluster_size": 3,
"lang": "en",
"recursive": true
}'
```
## Reference
See [references/api-reference.md](references/api-reference.md) for complete API documentation.
## Viewing Images
When helping users view images, always provide BOTH:
1. A link to view the first/selected image
2. A link to the search results page showing all matching images
### Image Search Results
When a user searches for images (by keyword, tag, etc.):
1. **Provide a summary**: Show how many images were found
2. **First image link**: Use the quick view URL for the first result
3. **Search results page link**: Use the fuzzy-search or tag-search pane URL
**Example response format:**
```markdown
Found 150+ images matching "sunset":
[View First Image](http://127.0.0.1:<port>/infinite_image_browsing?action=view&path=/first/image.png)
[View All Results in IIB](http://127.0.0.1:<port>/infinite_image_browsing?action=pane&type=fuzzy-search&props=%7B%22substr%22%3A%22sunset%22%7D)
| # | Name | Path | Size |
|---|------|------|------|
| 1 | image1.png | /folder | 1.2 MB |
| 2 | image2.png | /folder | 1.1 MB |
...
```
**Note:** The search results page link includes the search term in the URL, so it will automatically display the matching results when opened.
### Building Shareable URLs
When generating URLs for users to open in their browser, you need to properly encode the `props` parameter (JSON URL-encoded).
**URL Format:**
```
http://127.0.0.1:<port>/infinite_image_browsing?action=pane&type=<pane_type>&props=<url_encoded_json>
```
**Encoding the props:**
The `props` parameter must be URL-encoded JSON. Use this encoding method:
| JSON Props | URL Encoded | Notes |
|------------|-------------|-------|
| `{"substr":"sunset"}` | `%7B%22substr%22%3A%22sunset%22%7D` | Standard encoding |
| `{"substr":"(词1\|词2)","isRegex":true}` | `%7B%22substr%22%3A%22(%E8%AF%8D1%7C%E8%AF%8D2)%22%2C%22isRegex%22%3Atrue%7D` | Chinese chars encoded |
| `{"substr":"a\|b","isRegex":true}` | `%7B%22substr%22%3A%22(a%7Cb)%22%2C%22isRegex%22%3Atrue%7D` | Pipe `\|` encoded as `%7C` |
**Common URL patterns:**
| Use Case | URL Pattern |
|----------|-------------|
| Simple keyword search | `?action=pane&type=fuzzy-search&props=%7B%22substr%22%3A%22keyword%22%7D` |
| Regex OR search | `?action=pane&type=fuzzy-search&props=%7B%22substr%22%3A%22(word1%7Cword2)%22%2C%22isRegex%22%3Atrue%7D` |
| Search in folder | `?action=pane&type=fuzzy-search&props=%7B%22substr%22%3A%22keyword%22%2C%22searchScope%22%3A%22%2Fpath%22%7D` |
| View single image | `?action=view&path=/path/to/image.png` |
**Tip:** When generating URLs with non-ASCII characters (Chinese, Japanese, etc.), use proper URL encoding (UTF-8 percent encoding).
**Example: Multi-word search with regex (Chinese)**
```bash
# Search for "太空电梯" OR "三体"
# JSON: {"substr":"(太空电梯|三体)","isRegex":true}
# Encoded: %7B%22substr%22%3A%22(%E5%A4%AA%E7%A9%BA%E7%94%B5%E6%A2%AF%7C%E4%B8%89%E4%BD%93)%22%2C%22isRegex%22%3Atrue%7D
?action=pane&type=fuzzy-search&props=%7B%22substr%22%3A%22(%E5%A4%AA%E7%A9%BA%E7%94%B5%E6%A2%AF%7C%E4%B8%89%E4%BD%93)%22%2C%22isRegex%22%3Atrue%7D
```
### Available View Options
#### 1. Quick View (Single Image)
```
http://127.0.0.1:<port>/infinite_image_browsing?action=view&path=/path/to/image.png
```
Opens IIB directly to the image in fullscreen preview.
#### 2. Keyword Search Page
```
http://127.0.0.1:<port>/infinite_image_browsing?action=pane&type=fuzzy-search
```
Opens the keyword search page where users can search.
**With pre-filled search term:**
```
http://127.0.0.1:<port>/infinite_image_browsing?action=pane&type=fuzzy-search&props=%7B%22substr%22%3A%22sunset%22%7D
```
Automatically searches for "sunset" when opened.
**Available props for fuzzy-search (URL → Component mapping):**
| URL Prop | Component Prop | Type | Description |
|----------|----------------|------|-------------|
| `substr` | `initialSubstr` | string | Search keyword or regex pattern |
| `isRegex` | `initialIsRegex` | boolean | Use regex mode (default: false) |
| `searchScope` | `searchScope` | string | Folder path to limit search |
| `pathOnly` | `initialPathOnly` | boolean | Search only file paths (default: false) |
| `mediaType` | `initialMediaType` | string | Filter by media type: "all", "image", "video" |
| `autoSearch` | `autoSearch` | boolean | Auto-trigger search (default: true when substr is set) |
**Note:** Use the URL prop names (left column) when constructing URLs. The component prop names (middle column) are for internal use.
**Examples:**
```bash
# Regex search for multiple keywords (OR logic)
?action=pane&type=fuzzy-search&props=%7B%22substr%22%3A%22(sunset%7Csunrise%7Cdawn)%22%2C%22isRegex%22%3Atrue%7D
# Search in specific folder
?action=pane&type=fuzzy-search&props=%7B%22substr%22%3A%22portrait%22%2C%22searchScope%22%3A%22%2Foutputs%22%7D
# Search images only
?action=pane&type=fuzzy-search&props=%7B%22substr%22%3A%22landscape%22%2C%22mediaType%22%3A%22image%22%7D
```
#### 3. Tag Search Page
```
http://127.0.0.1:<port>/infinite_image_browsing?action=pane&type=tag-search
```
Opens the tag search page for filtering by tags.
#### 4. Tag Search Results (Pre-filtered)
```
http://127.0.0.1:<port>/infinite_image_browsing?action=pane&type=tag-search-matched-image-grid&props=%7B%22selectedTagIds%22%3A%7B%22and_tags%22%3A%5B1%2C2%5D%7D%7D%7D
```
Shows images matching specific tags (replace tag IDs with actual values).
#### 5. Image Comparison
```
http://127.0.0.1:<port>/infinite_image_browsing?action=pane&type=img-sli&props=%7B%22left%22%3A%7B%22fullpath%22%3A%22%2Fa.png%22%7D%2C%22right%22%3A%7B%22fullpath%22%3A%22%2Fb.png%22%7D%7D
```
Compare two images side by side.
**Note:** The `props` parameter must be URL-encoded JSON.