mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-28 02:02:08 +00:00
style: reformat codebase with oxfmt
This commit is contained in:
@@ -3,12 +3,15 @@
|
|||||||
## Task: Add English translations for all new localized strings
|
## Task: Add English translations for all new localized strings
|
||||||
|
|
||||||
### Step 1: Identify new translation keys
|
### Step 1: Identify new translation keys
|
||||||
|
|
||||||
Find all translation keys that were added in the current branch's changes. These keys appear as arguments to translation functions: `t()`, `st()`, `$t()`, or similar i18n functions.
|
Find all translation keys that were added in the current branch's changes. These keys appear as arguments to translation functions: `t()`, `st()`, `$t()`, or similar i18n functions.
|
||||||
|
|
||||||
### Step 2: Add translations to English locale file
|
### Step 2: Add translations to English locale file
|
||||||
|
|
||||||
For each new translation key found, add the corresponding English text to the file `src/locales/en/main.json`.
|
For each new translation key found, add the corresponding English text to the file `src/locales/en/main.json`.
|
||||||
|
|
||||||
### Key-to-JSON mapping rules:
|
### Key-to-JSON mapping rules:
|
||||||
|
|
||||||
- Translation keys use dot notation to represent nested JSON structure
|
- Translation keys use dot notation to represent nested JSON structure
|
||||||
- Convert dot notation to nested JSON objects when adding to the locale file
|
- Convert dot notation to nested JSON objects when adding to the locale file
|
||||||
- Example: The key `g.user.name` maps to:
|
- Example: The key `g.user.name` maps to:
|
||||||
@@ -23,6 +26,7 @@ For each new translation key found, add the corresponding English text to the fi
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Important notes:
|
### Important notes:
|
||||||
|
|
||||||
1. **Only modify the English locale file** (`src/locales/en/main.json`)
|
1. **Only modify the English locale file** (`src/locales/en/main.json`)
|
||||||
2. **Do not modify other locale files** - translations for other languages are automatically generated by the `i18n.yaml` workflow
|
2. **Do not modify other locale files** - translations for other languages are automatically generated by the `i18n.yaml` workflow
|
||||||
3. **Exception for manual translations**: Only add translations to non-English locale files if:
|
3. **Exception for manual translations**: Only add translations to non-English locale files if:
|
||||||
@@ -30,6 +34,7 @@ For each new translation key found, add the corresponding English text to the fi
|
|||||||
- The automated translation would likely be incorrect due to technical terminology or context-specific meaning
|
- The automated translation would likely be incorrect due to technical terminology or context-specific meaning
|
||||||
|
|
||||||
### Example workflow:
|
### Example workflow:
|
||||||
|
|
||||||
1. If you added `t('settings.advanced.enable')` in a Vue component
|
1. If you added `t('settings.advanced.enable')` in a Vue component
|
||||||
2. Add to `src/locales/en/main.json`:
|
2. Add to `src/locales/en/main.json`:
|
||||||
```json
|
```json
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ To post inline comments, you will use the GitHub API via the `gh` command. Here'
|
|||||||
- Run: `gh pr view $PR_NUMBER --json commits --jq '.commits[-1].oid'` to get the latest commit SHA
|
- Run: `gh pr view $PR_NUMBER --json commits --jq '.commits[-1].oid'` to get the latest commit SHA
|
||||||
|
|
||||||
2. For each issue you find, post an inline comment using this exact command structure (as a single line):
|
2. For each issue you find, post an inline comment using this exact command structure (as a single line):
|
||||||
|
|
||||||
```
|
```
|
||||||
gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/OWNER/REPO/pulls/$PR_NUMBER/comments -f body="YOUR_COMMENT_BODY" -f commit_id="COMMIT_SHA" -f path="FILE_PATH" -F line=LINE_NUMBER -f side="RIGHT"
|
gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/OWNER/REPO/pulls/$PR_NUMBER/comments -f body="YOUR_COMMENT_BODY" -f commit_id="COMMIT_SHA" -f path="FILE_PATH" -F line=LINE_NUMBER -f side="RIGHT"
|
||||||
```
|
```
|
||||||
@@ -22,13 +23,15 @@ To post inline comments, you will use the GitHub API via the `gh` command. Here'
|
|||||||
3. Format your comment body using actual newlines in the command. Use a heredoc or construct the body with proper line breaks:
|
3. Format your comment body using actual newlines in the command. Use a heredoc or construct the body with proper line breaks:
|
||||||
```
|
```
|
||||||
COMMENT_BODY="**[category] severity Priority**
|
COMMENT_BODY="**[category] severity Priority**
|
||||||
|
```
|
||||||
|
|
||||||
**Issue**: Brief description of the problem
|
**Issue**: Brief description of the problem
|
||||||
**Context**: Why this matters
|
**Context**: Why this matters
|
||||||
**Suggestion**: How to fix it"
|
**Suggestion**: How to fix it"
|
||||||
```
|
|
||||||
|
```
|
||||||
Then use: `-f body="$COMMENT_BODY"`
|
|
||||||
|
Then use: `-f body="$COMMENT_BODY"`
|
||||||
|
|
||||||
## Phase 1: Environment Setup and PR Context
|
## Phase 1: Environment Setup and PR Context
|
||||||
|
|
||||||
@@ -58,10 +61,12 @@ This is critical for better file inspection:
|
|||||||
1. Get PR metadata: `gh pr view $PR_NUMBER --json files,title,body,additions,deletions,baseRefName,headRefName > pr_info.json`
|
1. Get PR metadata: `gh pr view $PR_NUMBER --json files,title,body,additions,deletions,baseRefName,headRefName > pr_info.json`
|
||||||
2. Extract branch names from pr_info.json using jq
|
2. Extract branch names from pr_info.json using jq
|
||||||
3. Fetch and checkout the PR branch:
|
3. Fetch and checkout the PR branch:
|
||||||
```
|
```
|
||||||
git fetch origin "pull/$PR_NUMBER/head:pr-$PR_NUMBER"
|
|
||||||
git checkout "pr-$PR_NUMBER"
|
git fetch origin "pull/$PR_NUMBER/head:pr-$PR_NUMBER"
|
||||||
```
|
git checkout "pr-$PR_NUMBER"
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
### Step 1.4: Get Changed Files and Diffs
|
### Step 1.4: Get Changed Files and Diffs
|
||||||
|
|
||||||
@@ -100,9 +105,9 @@ Intelligently load only relevant knowledge:
|
|||||||
|
|
||||||
1. Use GitHub API to discover available knowledge folders: `https://api.github.com/repos/Comfy-Org/comfy-claude-prompt-library/contents/.claude/knowledge`
|
1. Use GitHub API to discover available knowledge folders: `https://api.github.com/repos/Comfy-Org/comfy-claude-prompt-library/contents/.claude/knowledge`
|
||||||
2. For each knowledge folder, check if it's relevant by searching for the folder name in:
|
2. For each knowledge folder, check if it's relevant by searching for the folder name in:
|
||||||
- Changed file paths
|
- Changed file paths
|
||||||
- PR title
|
- PR title
|
||||||
- PR body
|
- PR body
|
||||||
3. If relevant, download all files from that knowledge folder
|
3. If relevant, download all files from that knowledge folder
|
||||||
|
|
||||||
### Step 2.4: Load Validation Rules
|
### Step 2.4: Load Validation Rules
|
||||||
@@ -193,12 +198,14 @@ Consider:
|
|||||||
For each issue found, create a concise inline comment with this structure:
|
For each issue found, create a concise inline comment with this structure:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**[category] severity Priority**
|
**[category] severity Priority**
|
||||||
|
|
||||||
**Issue**: Brief description of the problem
|
**Issue**: Brief description of the problem
|
||||||
**Context**: Why this matters
|
**Context**: Why this matters
|
||||||
**Suggestion**: How to fix it
|
**Suggestion**: How to fix it
|
||||||
```
|
|
||||||
|
````
|
||||||
|
|
||||||
Categories: architecture/security/performance/quality
|
Categories: architecture/security/performance/quality
|
||||||
Severities: critical/high/medium/low
|
Severities: critical/high/medium/low
|
||||||
@@ -214,7 +221,7 @@ For EACH issue:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/OWNER/REPO/pulls/$PR_NUMBER/comments -f body="$COMMENT_BODY" -f commit_id="COMMIT_SHA" -f path="FILE_PATH" -F line=LINE_NUMBER -f side="RIGHT"
|
gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/OWNER/REPO/pulls/$PR_NUMBER/comments -f body="$COMMENT_BODY" -f commit_id="COMMIT_SHA" -f path="FILE_PATH" -F line=LINE_NUMBER -f side="RIGHT"
|
||||||
```
|
````
|
||||||
|
|
||||||
CRITICAL: The entire command must be on one line. Use actual values, not placeholders.
|
CRITICAL: The entire command must be on one line. Use actual values, not placeholders.
|
||||||
|
|
||||||
@@ -223,12 +230,14 @@ CRITICAL: The entire command must be on one line. Use actual values, not placeho
|
|||||||
Here's an example of how to review a file with a security issue:
|
Here's an example of how to review a file with a security issue:
|
||||||
|
|
||||||
1. First, get the repository info:
|
1. First, get the repository info:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
gh repo view --json owner,name
|
gh repo view --json owner,name
|
||||||
# Output: {"owner":{"login":"Comfy-Org"},"name":"ComfyUI_frontend"}
|
# Output: {"owner":{"login":"Comfy-Org"},"name":"ComfyUI_frontend"}
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Get the commit SHA:
|
2. Get the commit SHA:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
gh pr view $PR_NUMBER --json commits --jq '.commits[-1].oid'
|
gh pr view $PR_NUMBER --json commits --jq '.commits[-1].oid'
|
||||||
# Output: abc123def456
|
# Output: abc123def456
|
||||||
@@ -240,14 +249,17 @@ Here's an example of how to review a file with a security issue:
|
|||||||
```bash
|
```bash
|
||||||
# First, create the comment body with proper newlines
|
# First, create the comment body with proper newlines
|
||||||
COMMENT_BODY="**[security] critical Priority**
|
COMMENT_BODY="**[security] critical Priority**
|
||||||
|
```
|
||||||
|
|
||||||
**Issue**: SQL injection vulnerability - user input directly concatenated into query
|
**Issue**: SQL injection vulnerability - user input directly concatenated into query
|
||||||
**Context**: Allows attackers to execute arbitrary SQL commands
|
**Context**: Allows attackers to execute arbitrary SQL commands
|
||||||
**Suggestion**: Use parameterized queries or prepared statements"
|
**Suggestion**: Use parameterized queries or prepared statements"
|
||||||
|
|
||||||
# Then post the comment (as a single line)
|
# Then post the comment (as a single line)
|
||||||
gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/Comfy-Org/ComfyUI_frontend/pulls/$PR_NUMBER/comments -f body="$COMMENT_BODY" -f commit_id="abc123def456" -f path="src/db/queries.js" -F line=42 -f side="RIGHT"
|
|
||||||
```
|
gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/Comfy-Org/ComfyUI_frontend/pulls/$PR_NUMBER/comments -f body="$COMMENT_BODY" -f commit_id="abc123def456" -f path="src/db/queries.js" -F line=42 -f side="RIGHT"
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Repeat this process for every issue you find in the PR.
|
Repeat this process for every issue you find in the PR.
|
||||||
|
|
||||||
@@ -282,9 +294,9 @@ Analyze the PR to determine its type:
|
|||||||
1. Extract PR title and body from pr_info.json
|
1. Extract PR title and body from pr_info.json
|
||||||
2. Count files, additions, and deletions
|
2. Count files, additions, and deletions
|
||||||
3. Determine PR type:
|
3. Determine PR type:
|
||||||
- Feature: Check for tests, documentation, backward compatibility
|
- Feature: Check for tests, documentation, backward compatibility
|
||||||
- Bug fix: Verify root cause addressed, includes regression tests
|
- Bug fix: Verify root cause addressed, includes regression tests
|
||||||
- Refactor: Ensure behavior preservation, tests still pass
|
- Refactor: Ensure behavior preservation, tests still pass
|
||||||
|
|
||||||
## Phase 7: Generate Comprehensive Summary
|
## Phase 7: Generate Comprehensive Summary
|
||||||
|
|
||||||
@@ -292,16 +304,17 @@ After ALL inline comments are posted, create a summary:
|
|||||||
|
|
||||||
1. Calculate total issues by category and severity
|
1. Calculate total issues by category and severity
|
||||||
2. Use `gh pr review $PR_NUMBER --comment` to post a summary with:
|
2. Use `gh pr review $PR_NUMBER --comment` to post a summary with:
|
||||||
- Review disclaimer
|
- Review disclaimer
|
||||||
- Issue distribution (counts by severity)
|
- Issue distribution (counts by severity)
|
||||||
- Category breakdown
|
- Category breakdown
|
||||||
- Key findings for each category
|
- Key findings for each category
|
||||||
- Positive observations
|
- Positive observations
|
||||||
- References to guidelines
|
- References to guidelines
|
||||||
- Next steps
|
- Next steps
|
||||||
|
|
||||||
Include in the summary:
|
Include in the summary:
|
||||||
```
|
```
|
||||||
|
|
||||||
# Comprehensive PR Review
|
# Comprehensive PR Review
|
||||||
|
|
||||||
This review is generated by Claude. It may not always be accurate, as with human reviewers. If you believe that any of the comments are invalid or incorrect, please state why for each. For others, please implement the changes in one way or another.
|
This review is generated by Claude. It may not always be accurate, as with human reviewers. If you believe that any of the comments are invalid or incorrect, please state why for each. For others, please implement the changes in one way or another.
|
||||||
@@ -312,12 +325,14 @@ This review is generated by Claude. It may not always be accurate, as with human
|
|||||||
**Impact**: [X] additions, [Y] deletions across [Z] files
|
**Impact**: [X] additions, [Y] deletions across [Z] files
|
||||||
|
|
||||||
### Issue Distribution
|
### Issue Distribution
|
||||||
|
|
||||||
- Critical: [CRITICAL_COUNT]
|
- Critical: [CRITICAL_COUNT]
|
||||||
- High: [HIGH_COUNT]
|
- High: [HIGH_COUNT]
|
||||||
- Medium: [MEDIUM_COUNT]
|
- Medium: [MEDIUM_COUNT]
|
||||||
- Low: [LOW_COUNT]
|
- Low: [LOW_COUNT]
|
||||||
|
|
||||||
### Category Breakdown
|
### Category Breakdown
|
||||||
|
|
||||||
- Architecture: [ARCHITECTURE_ISSUES] issues
|
- Architecture: [ARCHITECTURE_ISSUES] issues
|
||||||
- Security: [SECURITY_ISSUES] issues
|
- Security: [SECURITY_ISSUES] issues
|
||||||
- Performance: [PERFORMANCE_ISSUES] issues
|
- Performance: [PERFORMANCE_ISSUES] issues
|
||||||
@@ -326,33 +341,42 @@ This review is generated by Claude. It may not always be accurate, as with human
|
|||||||
## Key Findings
|
## Key Findings
|
||||||
|
|
||||||
### Architecture & Design
|
### Architecture & Design
|
||||||
|
|
||||||
[Detailed architectural analysis based on repository patterns]
|
[Detailed architectural analysis based on repository patterns]
|
||||||
|
|
||||||
### Security Considerations
|
### Security Considerations
|
||||||
|
|
||||||
[Security implications beyond basic vulnerabilities]
|
[Security implications beyond basic vulnerabilities]
|
||||||
|
|
||||||
### Performance Impact
|
### Performance Impact
|
||||||
|
|
||||||
[Performance analysis including bundle size, render impact]
|
[Performance analysis including bundle size, render impact]
|
||||||
|
|
||||||
### Integration Points
|
### Integration Points
|
||||||
|
|
||||||
[How this affects other systems, extensions, etc.]
|
[How this affects other systems, extensions, etc.]
|
||||||
|
|
||||||
## Positive Observations
|
## Positive Observations
|
||||||
|
|
||||||
[What was done well, good patterns followed]
|
[What was done well, good patterns followed]
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
- [Repository Architecture Guide](https://github.com/Comfy-Org/comfy-claude-prompt-library/blob/master/project-summaries-for-agents/ComfyUI_frontend/REPOSITORY_GUIDE.md)
|
- [Repository Architecture Guide](https://github.com/Comfy-Org/comfy-claude-prompt-library/blob/master/project-summaries-for-agents/ComfyUI_frontend/REPOSITORY_GUIDE.md)
|
||||||
- [Frontend Standards](https://github.com/Comfy-Org/comfy-claude-prompt-library/blob/master/.claude/commands/validation/frontend-code-standards.md)
|
- [Frontend Standards](https://github.com/Comfy-Org/comfy-claude-prompt-library/blob/master/.claude/commands/validation/frontend-code-standards.md)
|
||||||
- [Security Guidelines](https://github.com/Comfy-Org/comfy-claude-prompt-library/blob/master/.claude/commands/validation/security-audit.md)
|
- [Security Guidelines](https://github.com/Comfy-Org/comfy-claude-prompt-library/blob/master/.claude/commands/validation/security-audit.md)
|
||||||
|
|
||||||
## Next Steps
|
## Next Steps
|
||||||
|
|
||||||
1. Address critical issues before merge
|
1. Address critical issues before merge
|
||||||
2. Consider architectural feedback for long-term maintainability
|
2. Consider architectural feedback for long-term maintainability
|
||||||
3. Add tests for uncovered scenarios
|
3. Add tests for uncovered scenarios
|
||||||
4. Update documentation if needed
|
4. Update documentation if needed
|
||||||
|
|
||||||
---
|
---
|
||||||
*This is a comprehensive automated review. For architectural decisions requiring human judgment, please request additional manual review.*
|
|
||||||
|
_This is a comprehensive automated review. For architectural decisions requiring human judgment, please request additional manual review._
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Important Guidelines
|
## Important Guidelines
|
||||||
@@ -375,4 +399,5 @@ This is a COMPREHENSIVE review, not a linting pass. Provide the same quality fee
|
|||||||
5. Phase 6: Consider PR type for additional checks
|
5. Phase 6: Consider PR type for additional checks
|
||||||
6. Phase 7: Post comprehensive summary ONLY after all inline comments
|
6. Phase 7: Post comprehensive summary ONLY after all inline comments
|
||||||
|
|
||||||
Remember: Individual inline comments for each issue, then one final summary. Never batch issues into a single comment.
|
Remember: Individual inline comments for each issue, then one final summary. Never batch issues into a single comment.
|
||||||
|
```
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ Create a frontend release with version type: $ARGUMENTS
|
|||||||
|
|
||||||
Expected format: Version increment type and optional description
|
Expected format: Version increment type and optional description
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
- `patch` - Bug fixes only
|
- `patch` - Bug fixes only
|
||||||
- `minor` - New features, backward compatible
|
- `minor` - New features, backward compatible
|
||||||
- `major` - Breaking changes
|
- `major` - Breaking changes
|
||||||
- `prerelease` - Alpha/beta/rc releases
|
- `prerelease` - Alpha/beta/rc releases
|
||||||
- `patch "Critical security fixes"` - With custom description
|
- `patch "Critical security fixes"` - With custom description
|
||||||
@@ -21,8 +22,9 @@ If no arguments provided, the command will always perform prerelease if the curr
|
|||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
Before starting, ensure:
|
Before starting, ensure:
|
||||||
|
|
||||||
- You have push access to the repository
|
- You have push access to the repository
|
||||||
- GitHub CLI (`gh`) is authenticated
|
- GitHub CLI (`gh`) is authenticated
|
||||||
- You're on a clean main branch working tree
|
- You're on a clean main branch working tree
|
||||||
- All intended changes are merged to main
|
- All intended changes are merged to main
|
||||||
- You understand the scope of changes being released
|
- You understand the scope of changes being released
|
||||||
@@ -30,6 +32,7 @@ Before starting, ensure:
|
|||||||
## Critical Checks Before Starting
|
## Critical Checks Before Starting
|
||||||
|
|
||||||
### 1. Check Current Version Status
|
### 1. Check Current Version Status
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Get current version and check if it's a pre-release
|
# Get current version and check if it's a pre-release
|
||||||
CURRENT_VERSION=$(node -p "require('./package.json').version")
|
CURRENT_VERSION=$(node -p "require('./package.json').version")
|
||||||
@@ -40,6 +43,7 @@ fi
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 2. Find Last Stable Release
|
### 2. Find Last Stable Release
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Get last stable release tag (no pre-release suffix)
|
# Get last stable release tag (no pre-release suffix)
|
||||||
LAST_STABLE=$(git tag -l "v*" | grep -v "\-" | sort -V | tail -1)
|
LAST_STABLE=$(git tag -l "v*" | grep -v "\-" | sort -V | tail -1)
|
||||||
@@ -49,6 +53,7 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
## Configuration Options
|
## Configuration Options
|
||||||
|
|
||||||
**Environment Variables:**
|
**Environment Variables:**
|
||||||
|
|
||||||
- `RELEASE_SKIP_SECURITY_SCAN=true` - Skip security audit
|
- `RELEASE_SKIP_SECURITY_SCAN=true` - Skip security audit
|
||||||
- `RELEASE_AUTO_APPROVE=true` - Skip some confirmation prompts
|
- `RELEASE_AUTO_APPROVE=true` - Skip some confirmation prompts
|
||||||
- `RELEASE_DRY_RUN=true` - Simulate release without executing
|
- `RELEASE_DRY_RUN=true` - Simulate release without executing
|
||||||
@@ -129,13 +134,14 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
### Step 4: Analyze Dependency Updates
|
### Step 4: Analyze Dependency Updates
|
||||||
|
|
||||||
1. **Use pnpm's built-in dependency analysis:**
|
1. **Use pnpm's built-in dependency analysis:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Get outdated dependencies with pnpm
|
# Get outdated dependencies with pnpm
|
||||||
pnpm outdated --format table > outdated-deps-${NEW_VERSION}.txt
|
pnpm outdated --format table > outdated-deps-${NEW_VERSION}.txt
|
||||||
|
|
||||||
# Check for license compliance
|
# Check for license compliance
|
||||||
pnpm licenses ls --json > licenses-${NEW_VERSION}.json
|
pnpm licenses ls --json > licenses-${NEW_VERSION}.json
|
||||||
|
|
||||||
# Analyze why specific dependencies exist
|
# Analyze why specific dependencies exist
|
||||||
echo "Dependency analysis:" > dep-analysis-${NEW_VERSION}.md
|
echo "Dependency analysis:" > dep-analysis-${NEW_VERSION}.md
|
||||||
MAJOR_DEPS=("vue" "vite" "@vitejs/plugin-vue" "typescript" "pinia")
|
MAJOR_DEPS=("vue" "vite" "@vitejs/plugin-vue" "typescript" "pinia")
|
||||||
@@ -147,22 +153,23 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
```
|
```
|
||||||
|
|
||||||
2. **Check for significant dependency updates:**
|
2. **Check for significant dependency updates:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Extract all dependency changes for major version bumps
|
# Extract all dependency changes for major version bumps
|
||||||
OTHER_DEP_CHANGES=""
|
OTHER_DEP_CHANGES=""
|
||||||
|
|
||||||
# Compare major dependency versions (you can extend this list)
|
# Compare major dependency versions (you can extend this list)
|
||||||
MAJOR_DEPS=("vue" "vite" "@vitejs/plugin-vue" "typescript" "pinia")
|
MAJOR_DEPS=("vue" "vite" "@vitejs/plugin-vue" "typescript" "pinia")
|
||||||
|
|
||||||
for dep in "${MAJOR_DEPS[@]}"; do
|
for dep in "${MAJOR_DEPS[@]}"; do
|
||||||
PREV_VER=$(echo "$PREV_PACKAGE_JSON" | grep -o "\"$dep\": \"[^\"]*\"" | grep -o '[0-9][^"]*' | head -1 || echo "")
|
PREV_VER=$(echo "$PREV_PACKAGE_JSON" | grep -o "\"$dep\": \"[^\"]*\"" | grep -o '[0-9][^"]*' | head -1 || echo "")
|
||||||
CURR_VER=$(echo "$CURRENT_PACKAGE_JSON" | grep -o "\"$dep\": \"[^\"]*\"" | grep -o '[0-9][^"]*' | head -1 || echo "")
|
CURR_VER=$(echo "$CURRENT_PACKAGE_JSON" | grep -o "\"$dep\": \"[^\"]*\"" | grep -o '[0-9][^"]*' | head -1 || echo "")
|
||||||
|
|
||||||
if [ "$PREV_VER" != "$CURR_VER" ] && [ -n "$PREV_VER" ] && [ -n "$CURR_VER" ]; then
|
if [ "$PREV_VER" != "$CURR_VER" ] && [ -n "$PREV_VER" ] && [ -n "$CURR_VER" ]; then
|
||||||
# Check if it's a major version change
|
# Check if it's a major version change
|
||||||
PREV_MAJOR=$(echo "$PREV_VER" | cut -d. -f1 | sed 's/[^0-9]//g')
|
PREV_MAJOR=$(echo "$PREV_VER" | cut -d. -f1 | sed 's/[^0-9]//g')
|
||||||
CURR_MAJOR=$(echo "$CURR_VER" | cut -d. -f1 | sed 's/[^0-9]//g')
|
CURR_MAJOR=$(echo "$CURR_VER" | cut -d. -f1 | sed 's/[^0-9]//g')
|
||||||
|
|
||||||
if [ "$PREV_MAJOR" != "$CURR_MAJOR" ]; then
|
if [ "$PREV_MAJOR" != "$CURR_MAJOR" ]; then
|
||||||
OTHER_DEP_CHANGES="${OTHER_DEP_CHANGES}\n- **${dep}**: ${PREV_VER} → ${CURR_VER} (Major version change)"
|
OTHER_DEP_CHANGES="${OTHER_DEP_CHANGES}\n- **${dep}**: ${PREV_VER} → ${CURR_VER} (Major version change)"
|
||||||
fi
|
fi
|
||||||
@@ -173,11 +180,12 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
### Step 5: Generate GTM Feature Summary
|
### Step 5: Generate GTM Feature Summary
|
||||||
|
|
||||||
1. **Collect PR data for analysis:**
|
1. **Collect PR data for analysis:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Get list of PR numbers from commits
|
# Get list of PR numbers from commits
|
||||||
PR_NUMBERS=$(git log ${BASE_TAG}..HEAD --oneline --no-merges --first-parent | \
|
PR_NUMBERS=$(git log ${BASE_TAG}..HEAD --oneline --no-merges --first-parent | \
|
||||||
grep -oE "#[0-9]+" | tr -d '#' | sort -u)
|
grep -oE "#[0-9]+" | tr -d '#' | sort -u)
|
||||||
|
|
||||||
# Save PR data for each PR
|
# Save PR data for each PR
|
||||||
echo "[" > prs-${NEW_VERSION}.json
|
echo "[" > prs-${NEW_VERSION}.json
|
||||||
first=true
|
first=true
|
||||||
@@ -189,16 +197,17 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
```
|
```
|
||||||
|
|
||||||
2. **Analyze for GTM-worthy features:**
|
2. **Analyze for GTM-worthy features:**
|
||||||
|
|
||||||
```
|
```
|
||||||
<task>
|
<task>
|
||||||
Review these PRs to identify features worthy of marketing attention.
|
Review these PRs to identify features worthy of marketing attention.
|
||||||
|
|
||||||
A feature is GTM-worthy if it meets ALL of these criteria:
|
A feature is GTM-worthy if it meets ALL of these criteria:
|
||||||
- Introduces a NEW capability users didn't have before (not just improvements)
|
- Introduces a NEW capability users didn't have before (not just improvements)
|
||||||
- Would be a compelling reason for users to upgrade to this version
|
- Would be a compelling reason for users to upgrade to this version
|
||||||
- Can be demonstrated visually or has clear before/after comparison
|
- Can be demonstrated visually or has clear before/after comparison
|
||||||
- Affects a significant portion of the user base
|
- Affects a significant portion of the user base
|
||||||
|
|
||||||
NOT GTM-worthy:
|
NOT GTM-worthy:
|
||||||
- Bug fixes (even important ones)
|
- Bug fixes (even important ones)
|
||||||
- Minor UI tweaks or color changes
|
- Minor UI tweaks or color changes
|
||||||
@@ -206,19 +215,20 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
- Internal refactoring
|
- Internal refactoring
|
||||||
- Small convenience features
|
- Small convenience features
|
||||||
- Features that only improve existing functionality marginally
|
- Features that only improve existing functionality marginally
|
||||||
|
|
||||||
For each GTM-worthy feature, note:
|
For each GTM-worthy feature, note:
|
||||||
- PR number, title, and author
|
- PR number, title, and author
|
||||||
- Media links from the PR description
|
- Media links from the PR description
|
||||||
- One compelling sentence on why users should care
|
- One compelling sentence on why users should care
|
||||||
|
|
||||||
If there are no GTM-worthy features, just say "No marketing-worthy features in this release."
|
If there are no GTM-worthy features, just say "No marketing-worthy features in this release."
|
||||||
</task>
|
</task>
|
||||||
|
|
||||||
PR data: [contents of prs-${NEW_VERSION}.json]
|
PR data: [contents of prs-${NEW_VERSION}.json]
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Generate GTM notification using this EXACT Slack-compatible format:**
|
3. **Generate GTM notification using this EXACT Slack-compatible format:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Only create file if GTM-worthy features exist:
|
# Only create file if GTM-worthy features exist:
|
||||||
if [ "$GTM_FEATURES_FOUND" = "true" ]; then
|
if [ "$GTM_FEATURES_FOUND" = "true" ]; then
|
||||||
@@ -252,8 +262,8 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
```
|
```
|
||||||
|
|
||||||
**CRITICAL Formatting Requirements:**
|
**CRITICAL Formatting Requirements:**
|
||||||
- Use single asterisk (*) for emphasis, NOT double (**)
|
- Use single asterisk (\*) for emphasis, NOT double (\*\*)
|
||||||
- Use underscore (_) for italics
|
- Use underscore (\_) for italics
|
||||||
- Use 4 spaces for indentation (not tabs)
|
- Use 4 spaces for indentation (not tabs)
|
||||||
- Convert author names to @username format (e.g., "John Smith" → "@john")
|
- Convert author names to @username format (e.g., "John Smith" → "@john")
|
||||||
- No section headers (#), no code language specifications
|
- No section headers (#), no code language specifications
|
||||||
@@ -263,6 +273,7 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
### Step 6: Version Preview
|
### Step 6: Version Preview
|
||||||
|
|
||||||
**Version Preview:**
|
**Version Preview:**
|
||||||
|
|
||||||
- Current: `${CURRENT_VERSION}`
|
- Current: `${CURRENT_VERSION}`
|
||||||
- Proposed: Show exact version number based on analysis:
|
- Proposed: Show exact version number based on analysis:
|
||||||
- Major version if breaking changes detected
|
- Major version if breaking changes detected
|
||||||
@@ -326,6 +337,7 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
done
|
done
|
||||||
```
|
```
|
||||||
3. Create standardized release notes using this exact template:
|
3. Create standardized release notes using this exact template:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat > release-notes-${NEW_VERSION}.md << 'EOF'
|
cat > release-notes-${NEW_VERSION}.md << 'EOF'
|
||||||
## ⚠️ Breaking Changes
|
## ⚠️ Breaking Changes
|
||||||
@@ -359,6 +371,7 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
**Full Changelog**: https://github.com/Comfy-Org/ComfyUI_frontend/compare/${BASE_TAG}...v${NEW_VERSION}
|
**Full Changelog**: https://github.com/Comfy-Org/ComfyUI_frontend/compare/${BASE_TAG}...v${NEW_VERSION}
|
||||||
EOF
|
EOF
|
||||||
```
|
```
|
||||||
|
|
||||||
4. **Parse commits and populate template:**
|
4. **Parse commits and populate template:**
|
||||||
- Group commits by conventional commit type (feat:, fix:, chore:, etc.)
|
- Group commits by conventional commit type (feat:, fix:, chore:, etc.)
|
||||||
- Extract PR numbers from commit messages
|
- Extract PR numbers from commit messages
|
||||||
@@ -375,6 +388,7 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
### Step 10: Create Version Bump PR
|
### Step 10: Create Version Bump PR
|
||||||
|
|
||||||
**For standard version bumps (patch/minor/major):**
|
**For standard version bumps (patch/minor/major):**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Trigger the workflow
|
# Trigger the workflow
|
||||||
gh workflow run version-bump.yaml -f version_type=${VERSION_TYPE}
|
gh workflow run version-bump.yaml -f version_type=${VERSION_TYPE}
|
||||||
@@ -384,7 +398,9 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
```
|
```
|
||||||
|
|
||||||
**For releasing a stable version:**
|
**For releasing a stable version:**
|
||||||
|
|
||||||
1. Must manually create branch and update version:
|
1. Must manually create branch and update version:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git checkout -b version-bump-${NEW_VERSION}
|
git checkout -b version-bump-${NEW_VERSION}
|
||||||
# Edit package.json to remove pre-release suffix
|
# Edit package.json to remove pre-release suffix
|
||||||
@@ -394,23 +410,25 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
```
|
```
|
||||||
|
|
||||||
2. Wait for PR creation (if using workflow) or create manually:
|
2. Wait for PR creation (if using workflow) or create manually:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# For workflow-created PRs - wait and find it
|
# For workflow-created PRs - wait and find it
|
||||||
sleep 30
|
sleep 30
|
||||||
# Look for PR from comfy-pr-bot (not github-actions)
|
# Look for PR from comfy-pr-bot (not github-actions)
|
||||||
PR_NUMBER=$(gh pr list --author comfy-pr-bot --limit 1 --json number --jq '.[0].number')
|
PR_NUMBER=$(gh pr list --author comfy-pr-bot --limit 1 --json number --jq '.[0].number')
|
||||||
|
|
||||||
# Verify we got the PR
|
# Verify we got the PR
|
||||||
if [ -z "$PR_NUMBER" ]; then
|
if [ -z "$PR_NUMBER" ]; then
|
||||||
echo "PR not found yet. Checking recent PRs..."
|
echo "PR not found yet. Checking recent PRs..."
|
||||||
gh pr list --limit 5 --json number,title,author
|
gh pr list --limit 5 --json number,title,author
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# For manual PRs
|
# For manual PRs
|
||||||
gh pr create --title "${NEW_VERSION}" \
|
gh pr create --title "${NEW_VERSION}" \
|
||||||
--body-file release-notes-${NEW_VERSION}.md \
|
--body-file release-notes-${NEW_VERSION}.md \
|
||||||
--label "Release"
|
--label "Release"
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Update PR with release notes:**
|
3. **Update PR with release notes:**
|
||||||
```bash
|
```bash
|
||||||
# For workflow-created PRs, update the body with our release notes
|
# For workflow-created PRs, update the body with our release notes
|
||||||
@@ -468,14 +486,14 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
# Monitor branch creation (for minor/major releases)
|
# Monitor branch creation (for minor/major releases)
|
||||||
gh run list --workflow=release-branch-create.yaml --limit=1
|
gh run list --workflow=release-branch-create.yaml --limit=1
|
||||||
```
|
```
|
||||||
4. If workflow didn't trigger due to [skip ci]:
|
5. If workflow didn't trigger due to [skip ci]:
|
||||||
```bash
|
```bash
|
||||||
echo "ERROR: Release workflow didn't trigger!"
|
echo "ERROR: Release workflow didn't trigger!"
|
||||||
echo "Options:"
|
echo "Options:"
|
||||||
echo "1. Create patch release (e.g., 1.24.1) to trigger workflow"
|
echo "1. Create patch release (e.g., 1.24.1) to trigger workflow"
|
||||||
echo "2. Investigate manual release options"
|
echo "2. Investigate manual release options"
|
||||||
```
|
```
|
||||||
5. If workflow triggered, monitor execution:
|
6. If workflow triggered, monitor execution:
|
||||||
```bash
|
```bash
|
||||||
WORKFLOW_RUN_ID=$(gh run list --workflow=release-draft-create.yaml --limit=1 --json databaseId --jq '.[0].databaseId')
|
WORKFLOW_RUN_ID=$(gh run list --workflow=release-draft-create.yaml --limit=1 --json databaseId --jq '.[0].databaseId')
|
||||||
gh run watch ${WORKFLOW_RUN_ID}
|
gh run watch ${WORKFLOW_RUN_ID}
|
||||||
@@ -484,6 +502,7 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
### Step 14: Enhance GitHub Release
|
### Step 14: Enhance GitHub Release
|
||||||
|
|
||||||
1. Wait for automatic release creation:
|
1. Wait for automatic release creation:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Wait for release to be created
|
# Wait for release to be created
|
||||||
while ! gh release view v${NEW_VERSION} >/dev/null 2>&1; do
|
while ! gh release view v${NEW_VERSION} >/dev/null 2>&1; do
|
||||||
@@ -493,13 +512,14 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
```
|
```
|
||||||
|
|
||||||
2. **Enhance the GitHub release:**
|
2. **Enhance the GitHub release:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Update release with our release notes
|
# Update release with our release notes
|
||||||
gh release edit v${NEW_VERSION} \
|
gh release edit v${NEW_VERSION} \
|
||||||
--title "🚀 ComfyUI Frontend v${NEW_VERSION}" \
|
--title "🚀 ComfyUI Frontend v${NEW_VERSION}" \
|
||||||
--notes-file release-notes-${NEW_VERSION}.md \
|
--notes-file release-notes-${NEW_VERSION}.md \
|
||||||
--latest
|
--latest
|
||||||
|
|
||||||
# Add any additional assets if needed
|
# Add any additional assets if needed
|
||||||
# gh release upload v${NEW_VERSION} additional-assets.zip
|
# gh release upload v${NEW_VERSION} additional-assets.zip
|
||||||
```
|
```
|
||||||
@@ -512,14 +532,17 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
### Step 15: Verify Multi-Channel Distribution
|
### Step 15: Verify Multi-Channel Distribution
|
||||||
|
|
||||||
1. **GitHub Release:**
|
1. **GitHub Release:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
gh release view v${NEW_VERSION} --json assets,body,createdAt,tagName
|
gh release view v${NEW_VERSION} --json assets,body,createdAt,tagName
|
||||||
```
|
```
|
||||||
|
|
||||||
- ✅ Check release notes
|
- ✅ Check release notes
|
||||||
- ✅ Verify dist.zip attachment
|
- ✅ Verify dist.zip attachment
|
||||||
- ✅ Confirm release marked as latest (for main branch)
|
- ✅ Confirm release marked as latest (for main branch)
|
||||||
|
|
||||||
2. **PyPI Package:**
|
2. **PyPI Package:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check PyPI availability (may take a few minutes)
|
# Check PyPI availability (may take a few minutes)
|
||||||
for i in {1..10}; do
|
for i in {1..10}; do
|
||||||
@@ -533,6 +556,7 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
```
|
```
|
||||||
|
|
||||||
3. **npm Package:**
|
3. **npm Package:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check npm availability
|
# Check npm availability
|
||||||
for i in {1..10}; do
|
for i in {1..10}; do
|
||||||
@@ -550,15 +574,17 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
### Step 16: Post-Release Monitoring Setup
|
### Step 16: Post-Release Monitoring Setup
|
||||||
|
|
||||||
1. **Monitor immediate release health:**
|
1. **Monitor immediate release health:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check for immediate issues
|
# Check for immediate issues
|
||||||
gh issue list --label "bug" --state open --limit 5 --json title,number,createdAt
|
gh issue list --label "bug" --state open --limit 5 --json title,number,createdAt
|
||||||
|
|
||||||
# Monitor download metrics (if accessible)
|
# Monitor download metrics (if accessible)
|
||||||
gh release view v${NEW_VERSION} --json assets --jq '.assets[].downloadCount'
|
gh release view v${NEW_VERSION} --json assets --jq '.assets[].downloadCount'
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Update documentation tracking:**
|
2. **Update documentation tracking:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat > post-release-checklist.md << EOF
|
cat > post-release-checklist.md << EOF
|
||||||
# Post-Release Checklist for v${NEW_VERSION}
|
# Post-Release Checklist for v${NEW_VERSION}
|
||||||
@@ -589,6 +615,7 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
```
|
```
|
||||||
|
|
||||||
3. **Create release summary:**
|
3. **Create release summary:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat > release-summary-${NEW_VERSION}.md << EOF
|
cat > release-summary-${NEW_VERSION}.md << EOF
|
||||||
# Release Summary: ComfyUI Frontend v${NEW_VERSION}
|
# Release Summary: ComfyUI Frontend v${NEW_VERSION}
|
||||||
@@ -626,6 +653,7 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
### Step 17: Create Release Summary
|
### Step 17: Create Release Summary
|
||||||
|
|
||||||
1. **Create comprehensive release summary:**
|
1. **Create comprehensive release summary:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat > release-summary-${NEW_VERSION}.md << EOF
|
cat > release-summary-${NEW_VERSION}.md << EOF
|
||||||
# Release Summary: ComfyUI Frontend v${NEW_VERSION}
|
# Release Summary: ComfyUI Frontend v${NEW_VERSION}
|
||||||
@@ -665,6 +693,7 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
### Rollback Procedures
|
### Rollback Procedures
|
||||||
|
|
||||||
**Pre-Merge Rollback:**
|
**Pre-Merge Rollback:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Close version bump PR and reset
|
# Close version bump PR and reset
|
||||||
gh pr close ${PR_NUMBER}
|
gh pr close ${PR_NUMBER}
|
||||||
@@ -673,6 +702,7 @@ git clean -fd
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Post-Merge Rollback:**
|
**Post-Merge Rollback:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Create immediate patch release with reverts
|
# Create immediate patch release with reverts
|
||||||
git revert ${RELEASE_COMMIT}
|
git revert ${RELEASE_COMMIT}
|
||||||
@@ -680,6 +710,7 @@ git revert ${RELEASE_COMMIT}
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Emergency Procedures:**
|
**Emergency Procedures:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Document incident
|
# Document incident
|
||||||
cat > release-incident-${NEW_VERSION}.md << EOF
|
cat > release-incident-${NEW_VERSION}.md << EOF
|
||||||
@@ -713,31 +744,39 @@ The command implements multiple quality gates:
|
|||||||
## Common Scenarios
|
## Common Scenarios
|
||||||
|
|
||||||
### Scenario 1: Regular Feature Release
|
### Scenario 1: Regular Feature Release
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
/project:create-frontend-release minor
|
/project:create-frontend-release minor
|
||||||
```
|
```
|
||||||
|
|
||||||
- Analyzes features since last release
|
- Analyzes features since last release
|
||||||
- Generates changelog automatically
|
- Generates changelog automatically
|
||||||
- Creates comprehensive release notes
|
- Creates comprehensive release notes
|
||||||
|
|
||||||
### Scenario 2: Critical Security Patch
|
### Scenario 2: Critical Security Patch
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
/project:create-frontend-release patch "Security fixes for CVE-2024-XXXX"
|
/project:create-frontend-release patch "Security fixes for CVE-2024-XXXX"
|
||||||
```
|
```
|
||||||
|
|
||||||
- Expedited security scanning
|
- Expedited security scanning
|
||||||
- Enhanced monitoring setup
|
- Enhanced monitoring setup
|
||||||
|
|
||||||
### Scenario 3: Major Version with Breaking Changes
|
### Scenario 3: Major Version with Breaking Changes
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
/project:create-frontend-release major
|
/project:create-frontend-release major
|
||||||
```
|
```
|
||||||
|
|
||||||
- Comprehensive breaking change analysis
|
- Comprehensive breaking change analysis
|
||||||
- Migration guide generation
|
- Migration guide generation
|
||||||
|
|
||||||
### Scenario 4: Pre-release Testing
|
### Scenario 4: Pre-release Testing
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
/project:create-frontend-release prerelease
|
/project:create-frontend-release prerelease
|
||||||
```
|
```
|
||||||
|
|
||||||
- Creates alpha/beta/rc versions
|
- Creates alpha/beta/rc versions
|
||||||
- Draft release status
|
- Draft release status
|
||||||
- Python package specs require that prereleases use alpha/beta/rc as the preid
|
- Python package specs require that prereleases use alpha/beta/rc as the preid
|
||||||
@@ -747,10 +786,12 @@ The command implements multiple quality gates:
|
|||||||
When executing this release process, pay attention to these key aspects:
|
When executing this release process, pay attention to these key aspects:
|
||||||
|
|
||||||
### Version Handling
|
### Version Handling
|
||||||
|
|
||||||
- For pre-release versions (e.g., 1.24.0-rc.1), the next stable release should be the same version without the suffix (1.24.0)
|
- For pre-release versions (e.g., 1.24.0-rc.1), the next stable release should be the same version without the suffix (1.24.0)
|
||||||
- Never skip version numbers - follow semantic versioning strictly
|
- Never skip version numbers - follow semantic versioning strictly
|
||||||
|
|
||||||
### Commit History Analysis
|
### Commit History Analysis
|
||||||
|
|
||||||
- **ALWAYS** use `--first-parent` flag with git log to avoid including commits from merged feature branches
|
- **ALWAYS** use `--first-parent` flag with git log to avoid including commits from merged feature branches
|
||||||
- Verify PR merge targets before including them in changelogs:
|
- Verify PR merge targets before including them in changelogs:
|
||||||
```bash
|
```bash
|
||||||
@@ -758,6 +799,7 @@ When executing this release process, pay attention to these key aspects:
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Release Workflow Triggers
|
### Release Workflow Triggers
|
||||||
|
|
||||||
- The "Release" label on the PR is **CRITICAL** - without it, PyPI/npm publishing won't occur
|
- The "Release" label on the PR is **CRITICAL** - without it, PyPI/npm publishing won't occur
|
||||||
- Check for `[skip ci]` in commit messages before merging - this blocks the release workflow
|
- Check for `[skip ci]` in commit messages before merging - this blocks the release workflow
|
||||||
- If you encounter `[skip ci]`, push an empty commit to override it:
|
- If you encounter `[skip ci]`, push an empty commit to override it:
|
||||||
@@ -766,11 +808,13 @@ When executing this release process, pay attention to these key aspects:
|
|||||||
```
|
```
|
||||||
|
|
||||||
### PR Creation Details
|
### PR Creation Details
|
||||||
|
|
||||||
- Version bump PRs come from `comfy-pr-bot`, not `github-actions`
|
- Version bump PRs come from `comfy-pr-bot`, not `github-actions`
|
||||||
- The workflow typically completes in 20-30 seconds
|
- The workflow typically completes in 20-30 seconds
|
||||||
- Always wait for the PR to be created before trying to edit it
|
- Always wait for the PR to be created before trying to edit it
|
||||||
|
|
||||||
### Breaking Changes Detection
|
### Breaking Changes Detection
|
||||||
|
|
||||||
- Analyze changes to public-facing APIs:
|
- Analyze changes to public-facing APIs:
|
||||||
- The `app` object and its methods
|
- The `app` object and its methods
|
||||||
- The `api` module exports
|
- The `api` module exports
|
||||||
@@ -779,9 +823,10 @@ When executing this release process, pay attention to these key aspects:
|
|||||||
- Any modifications to these require marking as breaking changes
|
- Any modifications to these require marking as breaking changes
|
||||||
|
|
||||||
### Recovery Procedures
|
### Recovery Procedures
|
||||||
|
|
||||||
If the release workflow fails to trigger:
|
If the release workflow fails to trigger:
|
||||||
|
|
||||||
1. Create a revert PR to restore the previous version
|
1. Create a revert PR to restore the previous version
|
||||||
2. Merge the revert
|
2. Merge the revert
|
||||||
3. Re-run the version bump workflow
|
3. Re-run the version bump workflow
|
||||||
4. This approach is cleaner than creating extra version numbers
|
4. This approach is cleaner than creating extra version numbers
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,11 @@
|
|||||||
This command creates patch/hotfix releases for ComfyUI Frontend by backporting fixes to stable core branches. It handles both automated backports (preferred) and manual cherry-picking (fallback).
|
This command creates patch/hotfix releases for ComfyUI Frontend by backporting fixes to stable core branches. It handles both automated backports (preferred) and manual cherry-picking (fallback).
|
||||||
|
|
||||||
**Process Overview:**
|
**Process Overview:**
|
||||||
|
|
||||||
1. **Check automated backports first** (via labels)
|
1. **Check automated backports first** (via labels)
|
||||||
2. **Skip to version bump** if backports already merged
|
2. **Skip to version bump** if backports already merged
|
||||||
3. **Manual cherry-picking** if automation failed
|
3. **Manual cherry-picking** if automation failed
|
||||||
4. **Create patch release** with version bump
|
4. **Create patch release** with version bump
|
||||||
5. **Publish GitHub release** (manually uncheck "latest")
|
5. **Publish GitHub release** (manually uncheck "latest")
|
||||||
6. **Update ComfyUI requirements.txt** via PR
|
6. **Update ComfyUI requirements.txt** via PR
|
||||||
|
|
||||||
@@ -14,7 +15,8 @@ This command creates patch/hotfix releases for ComfyUI Frontend by backporting f
|
|||||||
Create a hotfix release by backporting commits/PRs from main to a core branch: $ARGUMENTS
|
Create a hotfix release by backporting commits/PRs from main to a core branch: $ARGUMENTS
|
||||||
|
|
||||||
Expected format: Comma-separated list of commits or PR numbers
|
Expected format: Comma-separated list of commits or PR numbers
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
- `#1234,#5678` (PRs - preferred)
|
- `#1234,#5678` (PRs - preferred)
|
||||||
- `abc123,def456` (commit hashes)
|
- `abc123,def456` (commit hashes)
|
||||||
- `#1234,abc123` (mixed)
|
- `#1234,abc123` (mixed)
|
||||||
@@ -25,7 +27,7 @@ If no arguments provided, the command will guide you through identifying commits
|
|||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Push access to repository
|
- Push access to repository
|
||||||
- GitHub CLI (`gh`) authenticated
|
- GitHub CLI (`gh`) authenticated
|
||||||
- Clean working tree
|
- Clean working tree
|
||||||
- Understanding of what fixes need backporting
|
- Understanding of what fixes need backporting
|
||||||
|
|
||||||
@@ -36,11 +38,13 @@ If no arguments provided, the command will guide you through identifying commits
|
|||||||
**Check if automated backports were attempted:**
|
**Check if automated backports were attempted:**
|
||||||
|
|
||||||
1. **For each PR, check existing backport labels:**
|
1. **For each PR, check existing backport labels:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
gh pr view #1234 --json labels | jq -r '.labels[].name'
|
gh pr view #1234 --json labels | jq -r '.labels[].name'
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **If no backport labels exist, add them now:**
|
2. **If no backport labels exist, add them now:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Add backport labels (this triggers automated backports)
|
# Add backport labels (this triggers automated backports)
|
||||||
gh pr edit #1234 --add-label "needs-backport"
|
gh pr edit #1234 --add-label "needs-backport"
|
||||||
@@ -48,6 +52,7 @@ If no arguments provided, the command will guide you through identifying commits
|
|||||||
```
|
```
|
||||||
|
|
||||||
3. **Check for existing backport PRs:**
|
3. **Check for existing backport PRs:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check for backport PRs created by automation
|
# Check for backport PRs created by automation
|
||||||
PR_NUMBER=${ARGUMENTS%%,*} # Extract first PR number from arguments
|
PR_NUMBER=${ARGUMENTS%%,*} # Extract first PR number from arguments
|
||||||
@@ -58,18 +63,22 @@ If no arguments provided, the command will guide you through identifying commits
|
|||||||
4. **Handle existing backport scenarios:**
|
4. **Handle existing backport scenarios:**
|
||||||
|
|
||||||
**Scenario A: Automated backports already merged**
|
**Scenario A: Automated backports already merged**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check if backport PRs were merged to core branches
|
# Check if backport PRs were merged to core branches
|
||||||
gh pr list --search "backport-${PR_NUMBER}-to" --state merged
|
gh pr list --search "backport-${PR_NUMBER}-to" --state merged
|
||||||
```
|
```
|
||||||
|
|
||||||
- If backport PRs are merged → Skip to Step 10 (Version Bump)
|
- If backport PRs are merged → Skip to Step 10 (Version Bump)
|
||||||
- **CONFIRMATION**: Automated backports completed, proceeding to version bump?
|
- **CONFIRMATION**: Automated backports completed, proceeding to version bump?
|
||||||
|
|
||||||
**Scenario B: Automated backport PRs exist but not merged**
|
**Scenario B: Automated backport PRs exist but not merged**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Show open backport PRs that need merging
|
# Show open backport PRs that need merging
|
||||||
gh pr list --search "backport-${PR_NUMBER}-to" --state open
|
gh pr list --search "backport-${PR_NUMBER}-to" --state open
|
||||||
```
|
```
|
||||||
|
|
||||||
- **ACTION REQUIRED**: Merge the existing backport PRs first
|
- **ACTION REQUIRED**: Merge the existing backport PRs first
|
||||||
- Use: `gh pr merge [PR_NUMBER] --merge` for each backport PR
|
- Use: `gh pr merge [PR_NUMBER] --merge` for each backport PR
|
||||||
- After merging, return to this command and skip to Step 10 (Version Bump)
|
- After merging, return to this command and skip to Step 10 (Version Bump)
|
||||||
@@ -127,6 +136,7 @@ If no arguments provided, the command will guide you through identifying commits
|
|||||||
### Step 6: Cherry-pick Changes
|
### Step 6: Cherry-pick Changes
|
||||||
|
|
||||||
For each commit:
|
For each commit:
|
||||||
|
|
||||||
1. Attempt cherry-pick: `git cherry-pick <commit>`
|
1. Attempt cherry-pick: `git cherry-pick <commit>`
|
||||||
2. If conflicts occur:
|
2. If conflicts occur:
|
||||||
- Display conflict details
|
- Display conflict details
|
||||||
@@ -198,6 +208,7 @@ For each commit:
|
|||||||
```
|
```
|
||||||
3. **CRITICAL**: Verify "Release" label is added
|
3. **CRITICAL**: Verify "Release" label is added
|
||||||
4. Create standardized release notes:
|
4. Create standardized release notes:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat > release-notes-${NEW_VERSION}.md << 'EOF'
|
cat > release-notes-${NEW_VERSION}.md << 'EOF'
|
||||||
## ⚠️ Breaking Changes
|
## ⚠️ Breaking Changes
|
||||||
@@ -231,12 +242,14 @@ For each commit:
|
|||||||
**Full Changelog**: https://github.com/Comfy-Org/ComfyUI_frontend/compare/v${CURRENT_VERSION}...v${NEW_VERSION}
|
**Full Changelog**: https://github.com/Comfy-Org/ComfyUI_frontend/compare/v${CURRENT_VERSION}...v${NEW_VERSION}
|
||||||
EOF
|
EOF
|
||||||
```
|
```
|
||||||
|
|
||||||
- For hotfixes, typically only populate the "Bug Fixes" section
|
- For hotfixes, typically only populate the "Bug Fixes" section
|
||||||
- Include links to the cherry-picked PRs/commits
|
- Include links to the cherry-picked PRs/commits
|
||||||
- Update the PR body with the release notes:
|
- Update the PR body with the release notes:
|
||||||
```bash
|
```bash
|
||||||
gh pr edit ${PR_NUMBER} --body-file release-notes-${NEW_VERSION}.md
|
gh pr edit ${PR_NUMBER} --body-file release-notes-${NEW_VERSION}.md
|
||||||
```
|
```
|
||||||
|
|
||||||
5. **CONFIRMATION REQUIRED**: Release PR has "Release" label?
|
5. **CONFIRMATION REQUIRED**: Release PR has "Release" label?
|
||||||
|
|
||||||
### Step 12: Monitor Release Process
|
### Step 12: Monitor Release Process
|
||||||
@@ -262,7 +275,7 @@ For each commit:
|
|||||||
2. **Find the DRAFT release** (e.g., "v1.23.5 Draft")
|
2. **Find the DRAFT release** (e.g., "v1.23.5 Draft")
|
||||||
3. **Click "Edit release"**
|
3. **Click "Edit release"**
|
||||||
4. **UNCHECK "Set as the latest release"** ⚠️ **CRITICAL**
|
4. **UNCHECK "Set as the latest release"** ⚠️ **CRITICAL**
|
||||||
- This prevents the hotfix from showing as "latest"
|
- This prevents the hotfix from showing as "latest"
|
||||||
- Main branch should always be "latest release"
|
- Main branch should always be "latest release"
|
||||||
5. **Click "Publish release"**
|
5. **Click "Publish release"**
|
||||||
6. **CONFIRMATION REQUIRED**: Draft release published with "latest" unchecked?
|
6. **CONFIRMATION REQUIRED**: Draft release published with "latest" unchecked?
|
||||||
@@ -272,6 +285,7 @@ For each commit:
|
|||||||
**IMPORTANT**: Create PR to update ComfyUI's requirements.txt via fork:
|
**IMPORTANT**: Create PR to update ComfyUI's requirements.txt via fork:
|
||||||
|
|
||||||
1. **Setup fork (if needed):**
|
1. **Setup fork (if needed):**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check if fork already exists
|
# Check if fork already exists
|
||||||
if gh repo view ComfyUI --json owner | jq -r '.owner.login' | grep -q "$(gh api user --jq .login)"; then
|
if gh repo view ComfyUI --json owner | jq -r '.owner.login' | grep -q "$(gh api user --jq .login)"; then
|
||||||
@@ -284,30 +298,32 @@ For each commit:
|
|||||||
```
|
```
|
||||||
|
|
||||||
2. **Clone fork and create branch:**
|
2. **Clone fork and create branch:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Clone your fork (or use existing clone)
|
# Clone your fork (or use existing clone)
|
||||||
GITHUB_USER=$(gh api user --jq .login)
|
GITHUB_USER=$(gh api user --jq .login)
|
||||||
if [ ! -d "ComfyUI-fork" ]; then
|
if [ ! -d "ComfyUI-fork" ]; then
|
||||||
gh repo clone ${GITHUB_USER}/ComfyUI ComfyUI-fork
|
gh repo clone ${GITHUB_USER}/ComfyUI ComfyUI-fork
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd ComfyUI-fork
|
cd ComfyUI-fork
|
||||||
git checkout master
|
git checkout master
|
||||||
git pull origin master
|
git pull origin master
|
||||||
|
|
||||||
# Create update branch
|
# Create update branch
|
||||||
BRANCH_NAME="update-frontend-${NEW_VERSION}"
|
BRANCH_NAME="update-frontend-${NEW_VERSION}"
|
||||||
git checkout -b ${BRANCH_NAME}
|
git checkout -b ${BRANCH_NAME}
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Update requirements.txt:**
|
3. **Update requirements.txt:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Update the version in requirements.txt
|
# Update the version in requirements.txt
|
||||||
sed -i "s/comfyui-frontend-package==[0-9].*$/comfyui-frontend-package==${NEW_VERSION}/" requirements.txt
|
sed -i "s/comfyui-frontend-package==[0-9].*$/comfyui-frontend-package==${NEW_VERSION}/" requirements.txt
|
||||||
|
|
||||||
# Verify the change
|
# Verify the change
|
||||||
grep "comfyui-frontend-package" requirements.txt
|
grep "comfyui-frontend-package" requirements.txt
|
||||||
|
|
||||||
# Commit the change
|
# Commit the change
|
||||||
git add requirements.txt
|
git add requirements.txt
|
||||||
git commit -m "Bump frontend to ${NEW_VERSION}"
|
git commit -m "Bump frontend to ${NEW_VERSION}"
|
||||||
@@ -321,7 +337,8 @@ For each commit:
|
|||||||
--repo comfyanonymous/ComfyUI \
|
--repo comfyanonymous/ComfyUI \
|
||||||
--title "Bump frontend to ${NEW_VERSION}" \
|
--title "Bump frontend to ${NEW_VERSION}" \
|
||||||
--body "$(cat <<EOF
|
--body "$(cat <<EOF
|
||||||
Bump frontend to ${NEW_VERSION}
|
Bump frontend to ${NEW_VERSION}
|
||||||
|
```
|
||||||
|
|
||||||
\`\`\`
|
\`\`\`
|
||||||
python main.py --front-end-version Comfy-Org/ComfyUI_frontend@${NEW_VERSION}
|
python main.py --front-end-version Comfy-Org/ComfyUI_frontend@${NEW_VERSION}
|
||||||
@@ -334,15 +351,18 @@ python main.py --front-end-version Comfy-Org/ComfyUI_frontend@${NEW_VERSION}
|
|||||||
## Changes
|
## Changes
|
||||||
|
|
||||||
- Fix: [Brief description of hotfixes included]
|
- Fix: [Brief description of hotfixes included]
|
||||||
EOF
|
EOF
|
||||||
)"
|
)"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
5. **Clean up:**
|
5. **Clean up:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Return to original directory
|
# Return to original directory
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
# Keep fork directory for future updates
|
# Keep fork directory for future updates
|
||||||
echo "Fork directory 'ComfyUI-fork' kept for future use"
|
echo "Fork directory 'ComfyUI-fork' kept for future use"
|
||||||
```
|
```
|
||||||
@@ -375,6 +395,7 @@ EOF
|
|||||||
## Safety Checks
|
## Safety Checks
|
||||||
|
|
||||||
Throughout the process:
|
Throughout the process:
|
||||||
|
|
||||||
- Always verify core branch matches ComfyUI's requirements.txt
|
- Always verify core branch matches ComfyUI's requirements.txt
|
||||||
- For PRs: Ensure using correct commits (merge vs individual)
|
- For PRs: Ensure using correct commits (merge vs individual)
|
||||||
- Check version numbers follow semantic versioning
|
- Check version numbers follow semantic versioning
|
||||||
@@ -385,6 +406,7 @@ Throughout the process:
|
|||||||
## Rollback Procedures
|
## Rollback Procedures
|
||||||
|
|
||||||
If something goes wrong:
|
If something goes wrong:
|
||||||
|
|
||||||
- Before push: `git reset --hard origin/core/X.Y`
|
- Before push: `git reset --hard origin/core/X.Y`
|
||||||
- After PR creation: Close PR and start over
|
- After PR creation: Close PR and start over
|
||||||
- After failed release: Create new patch version with fixes
|
- After failed release: Create new patch version with fixes
|
||||||
@@ -404,16 +426,16 @@ If something goes wrong:
|
|||||||
## Modern Workflow Context
|
## Modern Workflow Context
|
||||||
|
|
||||||
**Primary Backport Method:** Automated via `needs-backport` + `X.YY` labels
|
**Primary Backport Method:** Automated via `needs-backport` + `X.YY` labels
|
||||||
**This Command Usage:**
|
**This Command Usage:**
|
||||||
|
|
||||||
- Smart path detection - skip to version bump if backports already merged
|
- Smart path detection - skip to version bump if backports already merged
|
||||||
- Fallback to manual cherry-picking only when automation fails/has conflicts
|
- Fallback to manual cherry-picking only when automation fails/has conflicts
|
||||||
**Complete Hotfix:** Includes GitHub release publishing + ComfyUI requirements.txt integration
|
**Complete Hotfix:** Includes GitHub release publishing + ComfyUI requirements.txt integration
|
||||||
|
|
||||||
## Workflow Paths
|
## Workflow Paths
|
||||||
|
|
||||||
- **Path A:** Backports already merged → Skip to Step 10 (Version Bump)
|
- **Path A:** Backports already merged → Skip to Step 10 (Version Bump)
|
||||||
- **Path B:** Backport PRs need merging → Merge them → Skip to Step 10 (Version Bump)
|
- **Path B:** Backport PRs need merging → Merge them → Skip to Step 10 (Version Bump)
|
||||||
- **Path C:** No/failed backports → Manual cherry-picking (Steps 2-9) → Version Bump (Step 10)
|
- **Path C:** No/failed backports → Manual cherry-picking (Steps 2-9) → Version Bump (Step 10)
|
||||||
|
|
||||||
|
This process ensures a complete hotfix release with proper GitHub publishing, ComfyUI integration, and multiple safety checkpoints.
|
||||||
This process ensures a complete hotfix release with proper GitHub publishing, ComfyUI integration, and multiple safety checkpoints.
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ Bootstrap the ComfyUI Frontend monorepo with all necessary dependencies and veri
|
|||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
This command will:
|
This command will:
|
||||||
|
|
||||||
1. Install pnpm package manager (if not present)
|
1. Install pnpm package manager (if not present)
|
||||||
2. Install all project dependencies
|
2. Install all project dependencies
|
||||||
3. Verify the project builds successfully
|
3. Verify the project builds successfully
|
||||||
@@ -93,7 +94,7 @@ sleep 10
|
|||||||
# Check if server is running
|
# Check if server is running
|
||||||
if curl -s http://localhost:5173 > /dev/null 2>&1; then
|
if curl -s http://localhost:5173 > /dev/null 2>&1; then
|
||||||
echo "✅ Development server started successfully at http://localhost:5173"
|
echo "✅ Development server started successfully at http://localhost:5173"
|
||||||
|
|
||||||
# Kill the background server
|
# Kill the background server
|
||||||
kill $SERVER_PID
|
kill $SERVER_PID
|
||||||
wait $SERVER_PID 2>/dev/null
|
wait $SERVER_PID 2>/dev/null
|
||||||
@@ -154,4 +155,4 @@ After running the setup, manually verify:
|
|||||||
- Node.js >= 24
|
- Node.js >= 24
|
||||||
- Git repository
|
- Git repository
|
||||||
- Internet connection for package downloads
|
- Internet connection for package downloads
|
||||||
- Available ports (typically 5173 for dev server)
|
- Available ports (typically 5173 for dev server)
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ Follow these steps systematically to verify our changes:
|
|||||||
2. **Visual Testing Process**
|
2. **Visual Testing Process**
|
||||||
- Navigate to http://localhost:5173/
|
- Navigate to http://localhost:5173/
|
||||||
- For each target page (specified in arguments or recently changed files):
|
- For each target page (specified in arguments or recently changed files):
|
||||||
* Navigate to the page using direct URL or site navigation
|
- Navigate to the page using direct URL or site navigation
|
||||||
* Take a high-quality screenshot
|
- Take a high-quality screenshot
|
||||||
* Analyze the screenshot for the specific changes we implemented
|
- Analyze the screenshot for the specific changes we implemented
|
||||||
* Document any visual issues or improvements needed
|
- Document any visual issues or improvements needed
|
||||||
|
|
||||||
3. **Quality Verification**
|
3. **Quality Verification**
|
||||||
Check each page for:
|
Check each page for:
|
||||||
@@ -27,7 +27,7 @@ Follow these steps systematically to verify our changes:
|
|||||||
- Typography and readability
|
- Typography and readability
|
||||||
- Color scheme consistency
|
- Color scheme consistency
|
||||||
- Interactive elements (buttons, links, forms)
|
- Interactive elements (buttons, links, forms)
|
||||||
</instructions>
|
</instructions>
|
||||||
|
|
||||||
<examples>
|
<examples>
|
||||||
Common issues to watch for:
|
Common issues to watch for:
|
||||||
@@ -48,10 +48,11 @@ For each page tested, provide:
|
|||||||
4. Overall assessment of visual quality
|
4. Overall assessment of visual quality
|
||||||
|
|
||||||
If you find issues, be specific about:
|
If you find issues, be specific about:
|
||||||
|
|
||||||
- Exact location of the problem
|
- Exact location of the problem
|
||||||
- Expected vs actual behavior
|
- Expected vs actual behavior
|
||||||
- Severity level (critical, important, minor)
|
- Severity level (critical, important, minor)
|
||||||
- Suggested fix if obvious
|
- Suggested fix if obvious
|
||||||
</reporting>
|
</reporting>
|
||||||
|
|
||||||
Remember: Take your time with each screenshot and analysis. Visual quality directly impacts user experience and our project's professional appearance.
|
Remember: Take your time with each screenshot and analysis. Visual quality directly impacts user experience and our project's professional appearance.
|
||||||
|
|||||||
1
.github/AGENTS.md
vendored
1
.github/AGENTS.md
vendored
@@ -5,6 +5,7 @@ Context for automated PR review system.
|
|||||||
## Review Scope
|
## Review Scope
|
||||||
|
|
||||||
This automated review performs comprehensive analysis:
|
This automated review performs comprehensive analysis:
|
||||||
|
|
||||||
- Architecture and design patterns
|
- Architecture and design patterns
|
||||||
- Security vulnerabilities
|
- Security vulnerabilities
|
||||||
- Performance implications
|
- Performance implications
|
||||||
|
|||||||
1
.github/CLAUDE.md
vendored
1
.github/CLAUDE.md
vendored
@@ -1,3 +1,4 @@
|
|||||||
<!-- A rose by any other name would smell as sweet,
|
<!-- A rose by any other name would smell as sweet,
|
||||||
But Claude insists on files named for its own conceit. -->
|
But Claude insists on files named for its own conceit. -->
|
||||||
|
|
||||||
@AGENTS.md
|
@AGENTS.md
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
2
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
@@ -60,7 +60,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: ComfyUI Frontend Version
|
label: ComfyUI Frontend Version
|
||||||
description: Found in Settings > About (e.g., "1.3.45")
|
description: Found in Settings > About (e.g., "1.3.45")
|
||||||
placeholder: "1.3.45"
|
placeholder: '1.3.45'
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
|
|||||||
2
.github/copilot-instructions.md
vendored
2
.github/copilot-instructions.md
vendored
@@ -34,4 +34,4 @@ Follow Vue 3 style guide and naming conventions
|
|||||||
|
|
||||||
Use Vite for fast development and building
|
Use Vite for fast development and building
|
||||||
|
|
||||||
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json.
|
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json.
|
||||||
|
|||||||
2
.github/workflows/ci-json-validation.yaml
vendored
2
.github/workflows/ci-json-validation.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: Validates JSON syntax in all tracked .json files (excluding tsconfig*.json) using jq
|
# Description: Validates JSON syntax in all tracked .json files (excluding tsconfig*.json) using jq
|
||||||
name: "CI: JSON Validation"
|
name: 'CI: JSON Validation'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
|||||||
2
.github/workflows/ci-lint-format.yaml
vendored
2
.github/workflows/ci-lint-format.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: Linting and code formatting validation for pull requests
|
# Description: Linting and code formatting validation for pull requests
|
||||||
name: "CI: Lint Format"
|
name: 'CI: Lint Format'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|||||||
2
.github/workflows/ci-python-validation.yaml
vendored
2
.github/workflows/ci-python-validation.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: Validates Python code in tools/devtools directory
|
# Description: Validates Python code in tools/devtools directory
|
||||||
name: "CI: Python Validation"
|
name: 'CI: Python Validation'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|||||||
2
.github/workflows/ci-shell-validation.yaml
vendored
2
.github/workflows/ci-shell-validation.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: Runs shellcheck on tracked shell scripts when they change
|
# Description: Runs shellcheck on tracked shell scripts when they change
|
||||||
name: "CI: Shell Validation"
|
name: 'CI: Shell Validation'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
|||||||
2
.github/workflows/ci-size-data.yaml
vendored
2
.github/workflows/ci-size-data.yaml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: "CI: Size Data"
|
name: 'CI: Size Data'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
# Description: Deploys Storybook previews from forked PRs (forks can't access deployment secrets)
|
# Description: Deploys Storybook previews from forked PRs (forks can't access deployment secrets)
|
||||||
name: "CI: Tests Storybook (Deploy for Forks)"
|
name: 'CI: Tests Storybook (Deploy for Forks)'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_run:
|
workflow_run:
|
||||||
workflows: ["CI: Tests Storybook"]
|
workflows: ['CI: Tests Storybook']
|
||||||
types: [requested, completed]
|
types: [requested, completed]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
|||||||
12
.github/workflows/ci-tests-storybook.yaml
vendored
12
.github/workflows/ci-tests-storybook.yaml
vendored
@@ -1,8 +1,8 @@
|
|||||||
# Description: Builds Storybook and runs visual regression testing via Chromatic, deploys previews to Cloudflare Pages
|
# Description: Builds Storybook and runs visual regression testing via Chromatic, deploys previews to Cloudflare Pages
|
||||||
name: "CI: Tests Storybook"
|
name: 'CI: Tests Storybook'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch: # Allow manual triggering
|
workflow_dispatch: # Allow manual triggering
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -88,7 +88,7 @@ jobs:
|
|||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # Required for Chromatic baseline
|
fetch-depth: 0 # Required for Chromatic baseline
|
||||||
|
|
||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
@@ -110,9 +110,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
||||||
buildScriptName: build-storybook
|
buildScriptName: build-storybook
|
||||||
autoAcceptChanges: 'main' # Auto-accept changes on main branch
|
autoAcceptChanges: 'main' # Auto-accept changes on main branch
|
||||||
exitOnceUploaded: true # Don't wait for UI tests to complete
|
exitOnceUploaded: true # Don't wait for UI tests to complete
|
||||||
onlyChanged: true # Only capture changed stories
|
onlyChanged: true # Only capture changed stories
|
||||||
|
|
||||||
- name: Set job status
|
- name: Set job status
|
||||||
id: job-status
|
id: job-status
|
||||||
|
|||||||
6
.github/workflows/ci-tests-unit.yaml
vendored
6
.github/workflows/ci-tests-unit.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: Unit and component testing with Vitest
|
# Description: Unit and component testing with Vitest
|
||||||
name: "CI: Tests Unit"
|
name: 'CI: Tests Unit'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
@@ -26,8 +26,8 @@ jobs:
|
|||||||
- name: Use Node.js
|
- name: Use Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: "lts/*"
|
node-version: 'lts/*'
|
||||||
cache: "pnpm"
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|||||||
2
.github/workflows/ci-yaml-validation.yaml
vendored
2
.github/workflows/ci-yaml-validation.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: Validates YAML syntax and style using yamllint with relaxed rules
|
# Description: Validates YAML syntax and style using yamllint with relaxed rules
|
||||||
name: "CI: YAML Validation"
|
name: 'CI: YAML Validation'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
|||||||
2
.github/workflows/i18n-update-core.yaml
vendored
2
.github/workflows/i18n-update-core.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: Generates and updates translations for core ComfyUI components using OpenAI
|
# Description: Generates and updates translations for core ComfyUI components using OpenAI
|
||||||
name: "i18n: Update Core"
|
name: 'i18n: Update Core'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
# Manual dispatch for urgent translation updates
|
# Manual dispatch for urgent translation updates
|
||||||
|
|||||||
4
.github/workflows/i18n-update-nodes.yaml
vendored
4
.github/workflows/i18n-update-nodes.yaml
vendored
@@ -43,8 +43,8 @@ jobs:
|
|||||||
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e
|
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.PR_GH_TOKEN }}
|
token: ${{ secrets.PR_GH_TOKEN }}
|
||||||
commit-message: "Update locales for node definitions"
|
commit-message: 'Update locales for node definitions'
|
||||||
title: "Update locales for node definitions"
|
title: 'Update locales for node definitions'
|
||||||
body: |
|
body: |
|
||||||
Automated PR to update locales for node definitions
|
Automated PR to update locales for node definitions
|
||||||
|
|
||||||
|
|||||||
1
.github/workflows/pr-backport.yaml
vendored
1
.github/workflows/pr-backport.yaml
vendored
@@ -462,7 +462,6 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
done < "$FILE"
|
done < "$FILE"
|
||||||
|
|
||||||
|
|
||||||
- name: Remove needs-backport label
|
- name: Remove needs-backport label
|
||||||
if: steps.filter-targets.outputs.skip != 'true' && success()
|
if: steps.filter-targets.outputs.skip != 'true' && success()
|
||||||
run: gh pr edit ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }} --remove-label "needs-backport"
|
run: gh pr edit ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }} --remove-label "needs-backport"
|
||||||
|
|||||||
4
.github/workflows/pr-claude-review.yaml
vendored
4
.github/workflows/pr-claude-review.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: AI-powered code review triggered by adding the 'claude-review' label to a PR
|
# Description: AI-powered code review triggered by adding the 'claude-review' label to a PR
|
||||||
name: "PR: Claude Review"
|
name: 'PR: Claude Review'
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -46,7 +46,7 @@ jobs:
|
|||||||
- name: Run Claude PR Review
|
- name: Run Claude PR Review
|
||||||
uses: anthropics/claude-code-action@v1.0.6
|
uses: anthropics/claude-code-action@v1.0.6
|
||||||
with:
|
with:
|
||||||
label_trigger: "claude-review"
|
label_trigger: 'claude-review'
|
||||||
prompt: |
|
prompt: |
|
||||||
Read the file .claude/commands/comprehensive-pr-review.md and follow ALL the instructions exactly.
|
Read the file .claude/commands/comprehensive-pr-review.md and follow ALL the instructions exactly.
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/pr-size-report.yaml
vendored
2
.github/workflows/pr-size-report.yaml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: "PR: Size Report"
|
name: 'PR: Size Report'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_run:
|
workflow_run:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Setting test expectation screenshots for Playwright
|
# Setting test expectation screenshots for Playwright
|
||||||
name: "PR: Update Playwright Expectations"
|
name: 'PR: Update Playwright Expectations'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
@@ -39,11 +39,11 @@ jobs:
|
|||||||
|
|
||||||
- name: Find Update Comment
|
- name: Find Update Comment
|
||||||
uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad
|
uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad
|
||||||
id: "find-update-comment"
|
id: 'find-update-comment'
|
||||||
with:
|
with:
|
||||||
issue-number: ${{ steps.pr-info.outputs.pr-number }}
|
issue-number: ${{ steps.pr-info.outputs.pr-number }}
|
||||||
comment-author: "github-actions[bot]"
|
comment-author: 'github-actions[bot]'
|
||||||
body-includes: "Updating Playwright Expectations"
|
body-includes: 'Updating Playwright Expectations'
|
||||||
|
|
||||||
- name: Add Starting Reaction
|
- name: Add Starting Reaction
|
||||||
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9
|
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Automated bi-weekly workflow to bump ComfyUI frontend RC releases
|
# Automated bi-weekly workflow to bump ComfyUI frontend RC releases
|
||||||
name: "Release: Bi-weekly ComfyUI"
|
name: 'Release: Bi-weekly ComfyUI'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
# Schedule for Monday at 12:00 PM PST (20:00 UTC)
|
# Schedule for Monday at 12:00 PM PST (20:00 UTC)
|
||||||
|
|||||||
2
.github/workflows/release-version-bump.yaml
vendored
2
.github/workflows/release-version-bump.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: Manual workflow to increment package version with semantic versioning support
|
# Description: Manual workflow to increment package version with semantic versioning support
|
||||||
name: "Release: Version Bump"
|
name: 'Release: Version Bump'
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|||||||
2
.github/workflows/weekly-docs-check.yaml
vendored
2
.github/workflows/weekly-docs-check.yaml
vendored
@@ -1,5 +1,5 @@
|
|||||||
# Description: Automated weekly documentation accuracy check and update via Claude
|
# Description: Automated weekly documentation accuracy check and update via Claude
|
||||||
name: "Weekly Documentation Check"
|
name: 'Weekly Documentation Check'
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
|||||||
18
.i18nrc.cjs
18
.i18nrc.cjs
@@ -1,7 +1,7 @@
|
|||||||
// This file is intentionally kept in CommonJS format (.cjs)
|
// This file is intentionally kept in CommonJS format (.cjs)
|
||||||
// to resolve compatibility issues with dependencies that require CommonJS.
|
// to resolve compatibility issues with dependencies that require CommonJS.
|
||||||
// Do not convert this file to ESModule format unless all dependencies support it.
|
// Do not convert this file to ESModule format unless all dependencies support it.
|
||||||
const { defineConfig } = require('@lobehub/i18n-cli');
|
const { defineConfig } = require('@lobehub/i18n-cli')
|
||||||
|
|
||||||
module.exports = defineConfig({
|
module.exports = defineConfig({
|
||||||
modelName: 'gpt-4.1',
|
modelName: 'gpt-4.1',
|
||||||
@@ -10,7 +10,19 @@ module.exports = defineConfig({
|
|||||||
entry: 'src/locales/en',
|
entry: 'src/locales/en',
|
||||||
entryLocale: 'en',
|
entryLocale: 'en',
|
||||||
output: 'src/locales',
|
output: 'src/locales',
|
||||||
outputLocales: ['zh', 'zh-TW', 'ru', 'ja', 'ko', 'fr', 'es', 'ar', 'tr', 'pt-BR', 'fa'],
|
outputLocales: [
|
||||||
|
'zh',
|
||||||
|
'zh-TW',
|
||||||
|
'ru',
|
||||||
|
'ja',
|
||||||
|
'ko',
|
||||||
|
'fr',
|
||||||
|
'es',
|
||||||
|
'ar',
|
||||||
|
'tr',
|
||||||
|
'pt-BR',
|
||||||
|
'fa'
|
||||||
|
],
|
||||||
reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg, stable audio, stable cascade, stable zero, controlnet, lora, HiDream, Civitai, Hugging Face.
|
reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg, stable audio, stable cascade, stable zero, controlnet, lora, HiDream, Civitai, Hugging Face.
|
||||||
'latent' is the short form of 'latent space'.
|
'latent' is the short form of 'latent space'.
|
||||||
'mask' is in the context of image processing.
|
'mask' is in the context of image processing.
|
||||||
@@ -26,4 +38,4 @@ module.exports = defineConfig({
|
|||||||
- Use Arabic-Indic numerals (۰-۹) for numbers where appropriate.
|
- Use Arabic-Indic numerals (۰-۹) for numbers where appropriate.
|
||||||
- Maintain consistency with terminology used in Persian software and design applications.
|
- Maintain consistency with terminology used in Persian software and design applications.
|
||||||
`
|
`
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
"no-console": [
|
"no-console": [
|
||||||
"error",
|
"error",
|
||||||
{
|
{
|
||||||
"allow": [
|
"allow": ["warn", "error"]
|
||||||
"warn",
|
|
||||||
"error"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"no-control-regex": "off",
|
"no-control-regex": "off",
|
||||||
@@ -66,12 +63,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "@/i18n--to-enable",
|
"name": "@/i18n--to-enable",
|
||||||
"importNames": [
|
"importNames": ["st", "t", "te", "d"],
|
||||||
"st",
|
|
||||||
"t",
|
|
||||||
"te",
|
|
||||||
"d"
|
|
||||||
],
|
|
||||||
"message": "Don't import `@/i18n` directly, prefer `useI18n()`"
|
"message": "Don't import `@/i18n` directly, prefer `useI18n()`"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -85,10 +77,7 @@
|
|||||||
"import/export": "error",
|
"import/export": "error",
|
||||||
"import/namespace": "error",
|
"import/namespace": "error",
|
||||||
"import/no-duplicates": "error",
|
"import/no-duplicates": "error",
|
||||||
"import/consistent-type-specifier-style": [
|
"import/consistent-type-specifier-style": ["error", "prefer-top-level"],
|
||||||
"error",
|
|
||||||
"prefer-top-level"
|
|
||||||
],
|
|
||||||
"jest/expect-expect": "off",
|
"jest/expect-expect": "off",
|
||||||
"jest/no-conditional-expect": "off",
|
"jest/no-conditional-expect": "off",
|
||||||
"jest/no-disabled-tests": "off",
|
"jest/no-disabled-tests": "off",
|
||||||
@@ -117,13 +106,10 @@
|
|||||||
},
|
},
|
||||||
"overrides": [
|
"overrides": [
|
||||||
{
|
{
|
||||||
"files": [
|
"files": ["**/*.{stories,test,spec}.ts", "**/*.stories.vue"],
|
||||||
"**/*.{stories,test,spec}.ts",
|
|
||||||
"**/*.stories.vue"
|
|
||||||
],
|
|
||||||
"rules": {
|
"rules": {
|
||||||
"no-console": "allow"
|
"no-console": "allow"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ See `@docs/guidance/storybook.md` for story patterns (auto-loaded for `*.stories
|
|||||||
## Available Context
|
## Available Context
|
||||||
|
|
||||||
Stories have access to:
|
Stories have access to:
|
||||||
|
|
||||||
- All ComfyUI stores
|
- All ComfyUI stores
|
||||||
- PrimeVue with ComfyUI theming
|
- PrimeVue with ComfyUI theming
|
||||||
- i18n system
|
- i18n system
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
<!-- Though standards bloom in open fields so wide,
|
<!-- Though standards bloom in open fields so wide,
|
||||||
Anthropic walks a path of lonely pride. -->
|
Anthropic walks a path of lonely pride. -->
|
||||||
|
|
||||||
@AGENTS.md
|
@AGENTS.md
|
||||||
|
|||||||
@@ -12,16 +12,17 @@ Storybook is a frontend workshop for building UI components and pages in isolati
|
|||||||
|
|
||||||
## Storybook vs Other Testing Tools
|
## Storybook vs Other Testing Tools
|
||||||
|
|
||||||
| Tool | Purpose | Use Case |
|
| Tool | Purpose | Use Case |
|
||||||
|------|---------|----------|
|
| ----------------------- | ----------------------------------- | ------------------------------------------------------------ |
|
||||||
| **Storybook** | Component isolation & documentation | Developing, testing, and showcasing individual UI components |
|
| **Storybook** | Component isolation & documentation | Developing, testing, and showcasing individual UI components |
|
||||||
| **Playwright** | End-to-end testing | Full user workflow testing across multiple pages |
|
| **Playwright** | End-to-end testing | Full user workflow testing across multiple pages |
|
||||||
| **Vitest** | Unit testing | Testing business logic, utilities, and component behavior |
|
| **Vitest** | Unit testing | Testing business logic, utilities, and component behavior |
|
||||||
| **Vue Testing Library** | Component testing | Testing component interactions and DOM output |
|
| **Vue Testing Library** | Component testing | Testing component interactions and DOM output |
|
||||||
|
|
||||||
### When to Use Storybook
|
### When to Use Storybook
|
||||||
|
|
||||||
**✅ Use Storybook for:**
|
**✅ Use Storybook for:**
|
||||||
|
|
||||||
- Developing new UI components in isolation
|
- Developing new UI components in isolation
|
||||||
- Creating component documentation and examples
|
- Creating component documentation and examples
|
||||||
- Testing different component states and props
|
- Testing different component states and props
|
||||||
@@ -30,6 +31,7 @@ Storybook is a frontend workshop for building UI components and pages in isolati
|
|||||||
- Building a component library or design system
|
- Building a component library or design system
|
||||||
|
|
||||||
**❌ Don't use Storybook for:**
|
**❌ Don't use Storybook for:**
|
||||||
|
|
||||||
- Testing complex user workflows (use Playwright)
|
- Testing complex user workflows (use Playwright)
|
||||||
- Testing business logic (use Vitest)
|
- Testing business logic (use Vitest)
|
||||||
- Integration testing between components (use Vue Testing Library)
|
- Integration testing between components (use Vue Testing Library)
|
||||||
@@ -96,6 +98,7 @@ export const WithVariant: Story = {
|
|||||||
## ComfyUI Storybook Guidelines
|
## ComfyUI Storybook Guidelines
|
||||||
|
|
||||||
### Scope – When to Create Stories
|
### Scope – When to Create Stories
|
||||||
|
|
||||||
- **PrimeVue components**:
|
- **PrimeVue components**:
|
||||||
No need to create stories. Just refer to the official PrimeVue documentation.
|
No need to create stories. Just refer to the official PrimeVue documentation.
|
||||||
- **Custom shared components (design system components)**:
|
- **Custom shared components (design system components)**:
|
||||||
@@ -104,6 +107,7 @@ export const WithVariant: Story = {
|
|||||||
Do not create stories. Only the underlying pure UI components should be included in Storybook.
|
Do not create stories. Only the underlying pure UI components should be included in Storybook.
|
||||||
|
|
||||||
### Maintenance Philosophy
|
### Maintenance Philosophy
|
||||||
|
|
||||||
- Stories are lightweight and generally stable.
|
- Stories are lightweight and generally stable.
|
||||||
Once created, they rarely need updates unless:
|
Once created, they rarely need updates unless:
|
||||||
- The design changes
|
- The design changes
|
||||||
@@ -111,10 +115,12 @@ export const WithVariant: Story = {
|
|||||||
- For existing usage patterns, simply copy real code examples into Storybook to create stories.
|
- For existing usage patterns, simply copy real code examples into Storybook to create stories.
|
||||||
|
|
||||||
### File Placement
|
### File Placement
|
||||||
- Keep `*.stories.ts` files at the **same level as the component** (similar to test files).
|
|
||||||
|
- Keep `*.stories.ts` files at the **same level as the component** (similar to test files).
|
||||||
- This makes it easier to check usage examples without navigating to another directory.
|
- This makes it easier to check usage examples without navigating to another directory.
|
||||||
|
|
||||||
### Developer/Designer Workflow
|
### Developer/Designer Workflow
|
||||||
|
|
||||||
- **UI vs Container**: Separate pure UI components from container components.
|
- **UI vs Container**: Separate pure UI components from container components.
|
||||||
Only UI components should live in Storybook.
|
Only UI components should live in Storybook.
|
||||||
- **Communication Tool**: Storybook is not just about code quality—it enables designers and developers to see:
|
- **Communication Tool**: Storybook is not just about code quality—it enables designers and developers to see:
|
||||||
@@ -126,9 +132,10 @@ export const WithVariant: Story = {
|
|||||||
→ Only create a story for the base UI button, not for the wrapper.
|
→ Only create a story for the base UI button, not for the wrapper.
|
||||||
|
|
||||||
### Suggested Workflow
|
### Suggested Workflow
|
||||||
1. Use PrimeVue docs for standard components
|
|
||||||
2. Use Storybook for **shared/custom components** that define our design system
|
1. Use PrimeVue docs for standard components
|
||||||
3. Keep story files alongside components
|
2. Use Storybook for **shared/custom components** that define our design system
|
||||||
|
3. Keep story files alongside components
|
||||||
4. When in doubt, focus on components reused across the app or those that need to be showcased to designers
|
4. When in doubt, focus on components reused across the app or those that need to be showcased to designers
|
||||||
|
|
||||||
### Best Practices
|
### Best Practices
|
||||||
@@ -211,13 +218,12 @@ This Storybook setup includes:
|
|||||||
|
|
||||||
## Icon Usage in Storybook
|
## Icon Usage in Storybook
|
||||||
|
|
||||||
In this project, only the `<i class="icon-[lucide--folder]" />` syntax from unplugin-icons is supported in Storybook.
|
In this project, only the `<i class="icon-[lucide--folder]" />` syntax from unplugin-icons is supported in Storybook.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
|
|
||||||
```vue
|
```vue
|
||||||
<script setup lang="ts">
|
<script setup lang="ts"></script>
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<i class="icon-[lucide--trophy] text-neutral size-4" />
|
<i class="icon-[lucide--trophy] text-neutral size-4" />
|
||||||
@@ -226,4 +232,3 @@ In this project, only the `<i class="icon-[lucide--folder]" />` syntax from unpl
|
|||||||
```
|
```
|
||||||
|
|
||||||
This approach ensures icons render correctly in Storybook and remain consistent with the rest of the app.
|
This approach ensures icons render correctly in Storybook and remain consistent with the rest of the app.
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
overflow-y: auto !important;
|
overflow-y: auto !important;
|
||||||
transition: background-color 0.3s ease, color 0.3s ease;
|
transition:
|
||||||
|
background-color 0.3s ease,
|
||||||
|
color 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Light theme default - with explicit color to override media queries */
|
/* Light theme default - with explicit color to override media queries */
|
||||||
@@ -57,8 +59,8 @@
|
|||||||
|
|
||||||
/* Override Storybook's problematic & selector styles */
|
/* Override Storybook's problematic & selector styles */
|
||||||
/* Reset only the specific properties that Storybook injects */
|
/* Reset only the specific properties that Storybook injects */
|
||||||
li+li {
|
li + li {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: revert-layer;
|
padding: revert-layer;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
2
.vscode/custom-css.json
vendored
2
.vscode/custom-css.json
vendored
@@ -47,4 +47,4 @@
|
|||||||
"status": "obsolete"
|
"status": "obsolete"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Repository Guidelines
|
# Repository Guidelines
|
||||||
|
|
||||||
See @docs/guidance/*.md for file-type-specific conventions (auto-loaded by glob).
|
See @docs/guidance/\*.md for file-type-specific conventions (auto-loaded by glob).
|
||||||
|
|
||||||
## Project Structure & Module Organization
|
## Project Structure & Module Organization
|
||||||
|
|
||||||
@@ -93,7 +93,6 @@ The project uses **Nx** for build orchestration and task management
|
|||||||
- composables `useXyz.ts`
|
- composables `useXyz.ts`
|
||||||
- Pinia stores `*Store.ts`
|
- Pinia stores `*Store.ts`
|
||||||
|
|
||||||
|
|
||||||
## Commit & Pull Request Guidelines
|
## Commit & Pull Request Guidelines
|
||||||
|
|
||||||
- PRs:
|
- PRs:
|
||||||
@@ -131,8 +130,8 @@ The project uses **Nx** for build orchestration and task management
|
|||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
const { nodes, showTotal = true } = defineProps<{
|
const { nodes, showTotal = true } = defineProps<{
|
||||||
nodes: ApiNodeCost[]
|
nodes: ApiNodeCost[]
|
||||||
showTotal?: boolean
|
showTotal?: boolean
|
||||||
}>()
|
}>()
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -178,7 +177,7 @@ The project uses **Nx** for build orchestration and task management
|
|||||||
|
|
||||||
## Testing Guidelines
|
## Testing Guidelines
|
||||||
|
|
||||||
See @docs/testing/*.md for detailed patterns.
|
See @docs/testing/\*.md for detailed patterns.
|
||||||
|
|
||||||
- Frameworks:
|
- Frameworks:
|
||||||
- Vitest (unit/component, happy-dom)
|
- Vitest (unit/component, happy-dom)
|
||||||
|
|||||||
@@ -24,12 +24,14 @@ Have another idea? Drop into Discord or open an issue, and let's chat!
|
|||||||
### Initial Setup
|
### Initial Setup
|
||||||
|
|
||||||
1. Clone the repository:
|
1. Clone the repository:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/Comfy-Org/ComfyUI_frontend.git
|
git clone https://github.com/Comfy-Org/ComfyUI_frontend.git
|
||||||
cd ComfyUI_frontend
|
cd ComfyUI_frontend
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Install dependencies:
|
2. Install dependencies:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm install
|
pnpm install
|
||||||
```
|
```
|
||||||
@@ -83,8 +85,7 @@ Make sure your desktop machine and touch device are on the same network. On your
|
|||||||
navigate to `http://<server_ip>:5173` (e.g. `http://192.168.2.20:5173` here), to access the ComfyUI frontend.
|
navigate to `http://<server_ip>:5173` (e.g. `http://192.168.2.20:5173` here), to access the ComfyUI frontend.
|
||||||
|
|
||||||
> ⚠️ IMPORTANT:
|
> ⚠️ IMPORTANT:
|
||||||
The dev server will NOT load JavaScript extensions from custom nodes. Only core extensions (built into the frontend) will be loaded. This is because the shim system that allows custom node JavaScript to import frontend modules only works in production builds. Python custom nodes still function normally. See [Extension Development Guide](docs/extensions/development.md) for details and workarounds. And See [Extension Overview](docs/extensions/README.md) for extensions overview.
|
> The dev server will NOT load JavaScript extensions from custom nodes. Only core extensions (built into the frontend) will be loaded. This is because the shim system that allows custom node JavaScript to import frontend modules only works in production builds. Python custom nodes still function normally. See [Extension Development Guide](docs/extensions/development.md) for details and workarounds. And See [Extension Overview](docs/extensions/README.md) for extensions overview.
|
||||||
|
|
||||||
|
|
||||||
## Development Workflow
|
## Development Workflow
|
||||||
|
|
||||||
@@ -109,7 +110,6 @@ When you fix a bug that affects a version in feature freeze, we use an automated
|
|||||||
2. Before merging, add these labels to your PR:
|
2. Before merging, add these labels to your PR:
|
||||||
- `needs-backport` - triggers the automated backport workflow
|
- `needs-backport` - triggers the automated backport workflow
|
||||||
- `core/1.24` - targets the `core/1.24` release candidate branch
|
- `core/1.24` - targets the `core/1.24` release candidate branch
|
||||||
|
|
||||||
3. Merge your PR normally
|
3. Merge your PR normally
|
||||||
4. The automated workflow will:
|
4. The automated workflow will:
|
||||||
- Create a new branch from `core/1.24`
|
- Create a new branch from `core/1.24`
|
||||||
@@ -127,6 +127,7 @@ When you fix a bug that affects a version in feature freeze, we use an automated
|
|||||||
#### Handling Conflicts
|
#### Handling Conflicts
|
||||||
|
|
||||||
If the automated cherry-pick fails due to conflicts, the workflow will comment on your PR with:
|
If the automated cherry-pick fails due to conflicts, the workflow will comment on your PR with:
|
||||||
|
|
||||||
- The list of conflicting files
|
- The list of conflicting files
|
||||||
- Instructions to manually cherry-pick to the release candidate branch
|
- Instructions to manually cherry-pick to the release candidate branch
|
||||||
|
|
||||||
@@ -241,6 +242,7 @@ The original litegraph repository (https://github.com/Comfy-Org/litegraph.js) is
|
|||||||
## Questions?
|
## Questions?
|
||||||
|
|
||||||
If you have questions about contributing:
|
If you have questions about contributing:
|
||||||
|
|
||||||
- Check existing issues and discussions
|
- Check existing issues and discussions
|
||||||
- Ask in our [Discord](https://discord.com/invite/comfyorg)
|
- Ask in our [Discord](https://discord.com/invite/comfyorg)
|
||||||
- Open a new issue for clarification
|
- Open a new issue for clarification
|
||||||
|
|||||||
189
README.md
189
README.md
@@ -13,7 +13,6 @@
|
|||||||
[![][github-downloads-shield]][github-downloads-link]
|
[![][github-downloads-shield]][github-downloads-link]
|
||||||
[![][github-downloads-latest-shield]][github-downloads-link]
|
[![][github-downloads-latest-shield]][github-downloads-link]
|
||||||
|
|
||||||
|
|
||||||
[github-release-shield]: https://img.shields.io/github/v/release/Comfy-Org/ComfyUI_frontend?style=flat&sort=semver
|
[github-release-shield]: https://img.shields.io/github/v/release/Comfy-Org/ComfyUI_frontend?style=flat&sort=semver
|
||||||
[github-release-link]: https://github.com/Comfy-Org/ComfyUI_frontend/releases
|
[github-release-link]: https://github.com/Comfy-Org/ComfyUI_frontend/releases
|
||||||
[github-release-date-shield]: https://img.shields.io/github/release-date/Comfy-Org/ComfyUI_frontend?style=flat
|
[github-release-date-shield]: https://img.shields.io/github/release-date/Comfy-Org/ComfyUI_frontend?style=flat
|
||||||
@@ -47,6 +46,7 @@ The project follows a structured release process for each minor version, consist
|
|||||||
- Version is finalized and made available to all users
|
- Version is finalized and made available to all users
|
||||||
|
|
||||||
### Nightly Releases
|
### Nightly Releases
|
||||||
|
|
||||||
Nightly releases are published daily at [https://github.com/Comfy-Org/ComfyUI_frontend/releases](https://github.com/Comfy-Org/ComfyUI_frontend/releases).
|
Nightly releases are published daily at [https://github.com/Comfy-Org/ComfyUI_frontend/releases](https://github.com/Comfy-Org/ComfyUI_frontend/releases).
|
||||||
|
|
||||||
To use the latest nightly release, add the following command line argument to your ComfyUI launch script:
|
To use the latest nightly release, add the following command line argument to your ComfyUI launch script:
|
||||||
@@ -56,16 +56,17 @@ To use the latest nightly release, add the following command line argument to yo
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Overlapping Release Cycles
|
## Overlapping Release Cycles
|
||||||
|
|
||||||
The development of successive minor versions overlaps. For example, while version 1.1 is in feature freeze, development for version 1.2 begins simultaneously. Each feature has approximately 4 weeks from merge to ComfyUI stable release (2 weeks on main, 2 weeks frozen on RC).
|
The development of successive minor versions overlaps. For example, while version 1.1 is in feature freeze, development for version 1.2 begins simultaneously. Each feature has approximately 4 weeks from merge to ComfyUI stable release (2 weeks on main, 2 weeks frozen on RC).
|
||||||
|
|
||||||
### Example Release Cycle
|
### Example Release Cycle
|
||||||
|
|
||||||
| Week | Date Range | Version 1.1 | Version 1.2 | Version 1.3 | Patch Releases |
|
| Week | Date Range | Version 1.1 | Version 1.2 | Version 1.3 | Patch Releases |
|
||||||
|------|------------|-------------|-------------|-------------|----------------|
|
| ---- | ------------- | -------------- | -------------- | -------------- | ----------------------------------------------- |
|
||||||
| 1-2 | Mar 1-14 | Development | - | - | - |
|
| 1-2 | Mar 1-14 | Development | - | - | - |
|
||||||
| 3-4 | Mar 15-28 | Feature Freeze | Development | - | 1.1.0 through 1.1.13 (daily) |
|
| 3-4 | Mar 15-28 | Feature Freeze | Development | - | 1.1.0 through 1.1.13 (daily) |
|
||||||
| 5-6 | Mar 29-Apr 11 | Released | Feature Freeze | Development | 1.1.14+ (daily)<br>1.2.0 through 1.2.13 (daily) |
|
| 5-6 | Mar 29-Apr 11 | Released | Feature Freeze | Development | 1.1.14+ (daily)<br>1.2.0 through 1.2.13 (daily) |
|
||||||
| 7-8 | Apr 12-25 | - | Released | Feature Freeze | 1.2.14+ (daily)<br>1.3.0 through 1.3.13 (daily) |
|
| 7-8 | Apr 12-25 | - | Released | Feature Freeze | 1.2.14+ (daily)<br>1.3.0 through 1.3.13 (daily) |
|
||||||
|
|
||||||
## Release Summary
|
## Release Summary
|
||||||
|
|
||||||
@@ -74,19 +75,21 @@ The development of successive minor versions overlaps. For example, while versio
|
|||||||
<details id='feature-native-translation'>
|
<details id='feature-native-translation'>
|
||||||
<summary>v1.5: Native translation (i18n)</summary>
|
<summary>v1.5: Native translation (i18n)</summary>
|
||||||
|
|
||||||
ComfyUI now includes built-in translation support, replacing the need for third-party translation extensions. Select your language
|
ComfyUI now includes built-in translation support, replacing the need for third-party translation extensions. Select your language
|
||||||
in `Comfy > Locale > Language` to translate the interface into English, Chinese (Simplified), Russian, Japanese, Korean, or Arabic. This native
|
in `Comfy > Locale > Language` to translate the interface into English, Chinese (Simplified), Russian, Japanese, Korean, or Arabic. This native
|
||||||
implementation offers better performance, reliability, and maintainability compared to previous solutions.<br>
|
implementation offers better performance, reliability, and maintainability compared to previous solutions.<br>
|
||||||
|
|
||||||
|
More details available here: https://blog.comfy.org/p/native-localization-support-i18n
|
||||||
|
|
||||||
More details available here: https://blog.comfy.org/p/native-localization-support-i18n
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='feature-mask-editor'>
|
<details id='feature-mask-editor'>
|
||||||
<summary>v1.4: New mask editor</summary>
|
<summary>v1.4: New mask editor</summary>
|
||||||
|
|
||||||
https://github.com/Comfy-Org/ComfyUI_frontend/pull/1284 implements a new mask editor.
|
https://github.com/Comfy-Org/ComfyUI_frontend/pull/1284 implements a new mask editor.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||

|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='feature-integrated-server-terminal'>
|
<details id='feature-integrated-server-terminal'>
|
||||||
@@ -95,18 +98,22 @@ The development of successive minor versions overlaps. For example, while versio
|
|||||||
Press Ctrl + ` to toggle integrated terminal.
|
Press Ctrl + ` to toggle integrated terminal.
|
||||||
|
|
||||||
https://github.com/user-attachments/assets/eddedc6a-07a3-4a83-9475-63b3977f6d94
|
https://github.com/user-attachments/assets/eddedc6a-07a3-4a83-9475-63b3977f6d94
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='feature-keybinding-customization'>
|
<details id='feature-keybinding-customization'>
|
||||||
<summary>v1.3.7: Keybinding customization</summary>
|
<summary>v1.3.7: Keybinding customization</summary>
|
||||||
|
|
||||||
## Basic UI
|
## Basic UI
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Reset button
|
## Reset button
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Edit Keybinding
|
## Edit Keybinding
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
@@ -117,27 +124,34 @@ https://github.com/user-attachments/assets/eddedc6a-07a3-4a83-9475-63b3977f6d94
|
|||||||
<details id='feature-node-library-sidebar'>
|
<details id='feature-node-library-sidebar'>
|
||||||
<summary>v1.2.4: Node library sidebar tab</summary>
|
<summary>v1.2.4: Node library sidebar tab</summary>
|
||||||
|
|
||||||
#### Drag & Drop
|
#### Drag & Drop
|
||||||
|
|
||||||
https://github.com/user-attachments/assets/853e20b7-bc0e-49c9-bbce-a2ba7566f92f
|
https://github.com/user-attachments/assets/853e20b7-bc0e-49c9-bbce-a2ba7566f92f
|
||||||
|
|
||||||
#### Filter
|
#### Filter
|
||||||
|
|
||||||
https://github.com/user-attachments/assets/4bbca3ee-318f-4cf0-be32-a5a5541066cf
|
https://github.com/user-attachments/assets/4bbca3ee-318f-4cf0-be32-a5a5541066cf
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='feature-queue-sidebar'>
|
<details id='feature-queue-sidebar'>
|
||||||
<summary>v1.2.0: Queue/History sidebar tab</summary>
|
<summary>v1.2.0: Queue/History sidebar tab</summary>
|
||||||
|
|
||||||
https://github.com/user-attachments/assets/86e264fe-4d26-4f07-aa9a-83bdd2d02b8f
|
https://github.com/user-attachments/assets/86e264fe-4d26-4f07-aa9a-83bdd2d02b8f
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='feature-node-search'>
|
<details id='feature-node-search'>
|
||||||
<summary>v1.1.0: Node search box</summary>
|
<summary>v1.1.0: Node search box</summary>
|
||||||
|
|
||||||
#### Fuzzy search & Node preview
|
#### Fuzzy search & Node preview
|
||||||

|
|
||||||
|

|
||||||
|
|
||||||
|
#### Release link with shift
|
||||||
|
|
||||||
|
https://github.com/user-attachments/assets/a1b2b5c3-10d1-4256-b620-345de6858f25
|
||||||
|
|
||||||
#### Release link with shift
|
|
||||||
https://github.com/user-attachments/assets/a1b2b5c3-10d1-4256-b620-345de6858f25
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### QoL changes
|
### QoL changes
|
||||||
@@ -146,12 +160,14 @@ https://github.com/user-attachments/assets/4bbca3ee-318f-4cf0-be32-a5a5541066cf
|
|||||||
<summary>v1.3.32: **Litegraph** Nested group</summary>
|
<summary>v1.3.32: **Litegraph** Nested group</summary>
|
||||||
|
|
||||||
https://github.com/user-attachments/assets/f51adeb1-028e-40af-81e4-0ac13075198a
|
https://github.com/user-attachments/assets/f51adeb1-028e-40af-81e4-0ac13075198a
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='feature-group-selection'>
|
<details id='feature-group-selection'>
|
||||||
<summary>v1.3.24: **Litegraph** Group selection</summary>
|
<summary>v1.3.24: **Litegraph** Group selection</summary>
|
||||||
|
|
||||||
https://github.com/user-attachments/assets/e6230a94-411e-4fba-90cb-6c694200adaa
|
https://github.com/user-attachments/assets/e6230a94-411e-4fba-90cb-6c694200adaa
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='feature-toggle-link-visibility'>
|
<details id='feature-toggle-link-visibility'>
|
||||||
@@ -227,17 +243,21 @@ https://github.com/user-attachments/assets/c142c43f-2fe9-4030-8196-b3bfd4c6977d
|
|||||||
<details id='feature-auto-connect-link'>
|
<details id='feature-auto-connect-link'>
|
||||||
<summary>v1.2.2: **Litegraph** auto connects to correct slot</summary>
|
<summary>v1.2.2: **Litegraph** auto connects to correct slot</summary>
|
||||||
|
|
||||||
#### Before
|
#### Before
|
||||||
https://github.com/user-attachments/assets/c253f778-82d5-4e6f-aec0-ea2ccf421651
|
|
||||||
|
https://github.com/user-attachments/assets/c253f778-82d5-4e6f-aec0-ea2ccf421651
|
||||||
|
|
||||||
|
#### After
|
||||||
|
|
||||||
|
https://github.com/user-attachments/assets/b6360ac0-f0d2-447c-9daa-8a2e20c0dc1d
|
||||||
|
|
||||||
#### After
|
|
||||||
https://github.com/user-attachments/assets/b6360ac0-f0d2-447c-9daa-8a2e20c0dc1d
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='feature-hide-text-overflow'>
|
<details id='feature-hide-text-overflow'>
|
||||||
<summary>v1.1.8: **Litegraph** hides text overflow on widget value</summary>
|
<summary>v1.1.8: **Litegraph** hides text overflow on widget value</summary>
|
||||||
|
|
||||||
https://github.com/user-attachments/assets/5696a89d-4a47-4fcc-9e8c-71e1264943f2
|
https://github.com/user-attachments/assets/5696a89d-4a47-4fcc-9e8c-71e1264943f2
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Developer APIs
|
### Developer APIs
|
||||||
@@ -283,8 +303,7 @@ window['app'].extensionManager.dialog
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// window.alert
|
// window.alert
|
||||||
window['app'].extensionManager.toast
|
window['app'].extensionManager.toast.addAlert('Test Alert')
|
||||||
.addAlert("Test Alert")
|
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
@@ -383,28 +402,28 @@ app.extensionManager.setting.set('TestSetting', 'Hello, universe!')
|
|||||||
<details id='extension-api-commands-keybindings'>
|
<details id='extension-api-commands-keybindings'>
|
||||||
<summary>v1.3.7: Register commands and keybindings</summary>
|
<summary>v1.3.7: Register commands and keybindings</summary>
|
||||||
|
|
||||||
Extensions can call the following API to register commands and keybindings. Do
|
Extensions can call the following API to register commands and keybindings. Do
|
||||||
note that keybindings defined in core cannot be overwritten, and some keybindings
|
note that keybindings defined in core cannot be overwritten, and some keybindings
|
||||||
are reserved by the browser.
|
are reserved by the browser.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
app.registerExtension({
|
app.registerExtension({
|
||||||
name: 'TestExtension1',
|
name: 'TestExtension1',
|
||||||
commands: [
|
commands: [
|
||||||
{
|
{
|
||||||
id: 'TestCommand',
|
id: 'TestCommand',
|
||||||
function: () => {
|
function: () => {
|
||||||
alert('TestCommand')
|
alert('TestCommand')
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
}
|
||||||
keybindings: [
|
],
|
||||||
{
|
keybindings: [
|
||||||
combo: { key: 'k' },
|
{
|
||||||
commandId: 'TestCommand'
|
combo: { key: 'k' },
|
||||||
}
|
commandId: 'TestCommand'
|
||||||
]
|
}
|
||||||
})
|
]
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
@@ -412,66 +431,69 @@ app.extensionManager.setting.set('TestSetting', 'Hello, universe!')
|
|||||||
<details id='extension-api-topbar-menu'>
|
<details id='extension-api-topbar-menu'>
|
||||||
<summary>v1.3.1: Extension API to register custom topbar menu items</summary>
|
<summary>v1.3.1: Extension API to register custom topbar menu items</summary>
|
||||||
|
|
||||||
Extensions can call the following API to register custom topbar menu items.
|
Extensions can call the following API to register custom topbar menu items.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
app.registerExtension({
|
app.registerExtension({
|
||||||
name: 'TestExtension1',
|
name: 'TestExtension1',
|
||||||
commands: [
|
commands: [
|
||||||
{
|
{
|
||||||
id: 'foo-id',
|
id: 'foo-id',
|
||||||
label: 'foo',
|
label: 'foo',
|
||||||
function: () => {
|
function: () => {
|
||||||
alert(1)
|
alert(1)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
}
|
||||||
menuCommands: [
|
],
|
||||||
{
|
menuCommands: [
|
||||||
path: ['ext', 'ext2'],
|
{
|
||||||
commands: ['foo-id']
|
path: ['ext', 'ext2'],
|
||||||
}
|
commands: ['foo-id']
|
||||||
]
|
}
|
||||||
})
|
]
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='extension-api-toast'>
|
<details id='extension-api-toast'>
|
||||||
<summary>v1.2.27: Extension API to add toast message</summary>i
|
<summary>v1.2.27: Extension API to add toast message</summary>i
|
||||||
|
|
||||||
Extensions can call the following API to add toast messages.
|
Extensions can call the following API to add toast messages.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
app.extensionManager.toast.add({
|
app.extensionManager.toast.add({
|
||||||
severity: 'info',
|
severity: 'info',
|
||||||
summary: 'Loaded!',
|
summary: 'Loaded!',
|
||||||
detail: 'Extension loaded!',
|
detail: 'Extension loaded!',
|
||||||
life: 3000
|
life: 3000
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
Documentation of all supported options can be found here: <https://primevue.org/toast/#api.toast.interfaces.ToastMessageOptions>
|
Documentation of all supported options can be found here: <https://primevue.org/toast/#api.toast.interfaces.ToastMessageOptions>
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='extension-api-sidebar-tab'>
|
<details id='extension-api-sidebar-tab'>
|
||||||
<summary>v1.2.4: Extension API to register custom sidebar tab</summary>
|
<summary>v1.2.4: Extension API to register custom sidebar tab</summary>
|
||||||
|
|
||||||
Extensions now can call the following API to register a sidebar tab.
|
Extensions now can call the following API to register a sidebar tab.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
app.extensionManager.registerSidebarTab({
|
app.extensionManager.registerSidebarTab({
|
||||||
id: "search",
|
id: 'search',
|
||||||
icon: "pi pi-search",
|
icon: 'pi pi-search',
|
||||||
title: "search",
|
title: 'search',
|
||||||
tooltip: "search",
|
tooltip: 'search',
|
||||||
type: "custom",
|
type: 'custom',
|
||||||
render: (el) => {
|
render: (el) => {
|
||||||
el.innerHTML = "<div>Custom search tab</div>";
|
el.innerHTML = '<div>Custom search tab</div>'
|
||||||
},
|
}
|
||||||
});
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
The list of supported icons can be found here: <https://primevue.org/icons/#list>
|
The list of supported icons can be found here: <https://primevue.org/icons/#list>
|
||||||
@@ -479,6 +501,7 @@ The list of supported icons can be found here: <https://primevue.org/icons/#list
|
|||||||
We will support custom icons later.
|
We will support custom icons later.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details id='extension-api-selection-toolbox'>
|
<details id='extension-api-selection-toolbox'>
|
||||||
@@ -539,4 +562,4 @@ For comprehensive troubleshooting and technical support, please refer to our off
|
|||||||
|
|
||||||
- **[General Troubleshooting Guide](https://docs.comfy.org/troubleshooting/overview)** - Common issues, performance optimization, and reporting bugs
|
- **[General Troubleshooting Guide](https://docs.comfy.org/troubleshooting/overview)** - Common issues, performance optimization, and reporting bugs
|
||||||
- **[Custom Node Issues](https://docs.comfy.org/troubleshooting/custom-node-issues)** - Debugging custom node problems and conflicts
|
- **[Custom Node Issues](https://docs.comfy.org/troubleshooting/custom-node-issues)** - Debugging custom node problems and conflicts
|
||||||
- **[Desktop Installation Guide](https://docs.comfy.org/installation/desktop/windows)** - Desktop-specific installation and troubleshooting
|
- **[Desktop Installation Guide](https://docs.comfy.org/installation/desktop/windows)** - Desktop-specific installation and troubleshooting
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
AMD and the AMD Arrow logo are trademarks of Advanced Micro Devices, Inc.
|
AMD and the AMD Arrow logo are trademarks of Advanced Micro Devices, Inc.
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<title>ComfyUI</title>
|
<title>ComfyUI</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, initial-scale=1.0, user-scalable=no"
|
||||||
|
/>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="desktop-app"></div>
|
<div id="desktop-app"></div>
|
||||||
|
|||||||
@@ -2,6 +2,36 @@
|
|||||||
"name": "@comfyorg/desktop-ui",
|
"name": "@comfyorg/desktop-ui",
|
||||||
"version": "0.0.6",
|
"version": "0.0.6",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"lint": "nx run @comfyorg/desktop-ui:lint",
|
||||||
|
"typecheck": "nx run @comfyorg/desktop-ui:typecheck",
|
||||||
|
"storybook": "storybook dev -p 6007",
|
||||||
|
"build-storybook": "storybook build -o dist/storybook"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@comfyorg/comfyui-electron-types": "catalog:",
|
||||||
|
"@comfyorg/shared-frontend-utils": "workspace:*",
|
||||||
|
"@primevue/core": "catalog:",
|
||||||
|
"@primevue/themes": "catalog:",
|
||||||
|
"@vueuse/core": "catalog:",
|
||||||
|
"pinia": "catalog:",
|
||||||
|
"primeicons": "catalog:",
|
||||||
|
"primevue": "catalog:",
|
||||||
|
"vue": "catalog:",
|
||||||
|
"vue-i18n": "catalog:",
|
||||||
|
"vue-router": "catalog:"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@tailwindcss/vite": "catalog:",
|
||||||
|
"@vitejs/plugin-vue": "catalog:",
|
||||||
|
"dotenv": "catalog:",
|
||||||
|
"unplugin-icons": "catalog:",
|
||||||
|
"unplugin-vue-components": "catalog:",
|
||||||
|
"vite": "catalog:",
|
||||||
|
"vite-plugin-html": "catalog:",
|
||||||
|
"vite-plugin-vue-devtools": "catalog:",
|
||||||
|
"vue-tsc": "catalog:"
|
||||||
|
},
|
||||||
"nx": {
|
"nx": {
|
||||||
"tags": [
|
"tags": [
|
||||||
"scope:desktop",
|
"scope:desktop",
|
||||||
@@ -85,35 +115,5 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "nx run @comfyorg/desktop-ui:lint",
|
|
||||||
"typecheck": "nx run @comfyorg/desktop-ui:typecheck",
|
|
||||||
"storybook": "storybook dev -p 6007",
|
|
||||||
"build-storybook": "storybook build -o dist/storybook"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@comfyorg/comfyui-electron-types": "catalog:",
|
|
||||||
"@comfyorg/shared-frontend-utils": "workspace:*",
|
|
||||||
"@primevue/core": "catalog:",
|
|
||||||
"@primevue/themes": "catalog:",
|
|
||||||
"@vueuse/core": "catalog:",
|
|
||||||
"pinia": "catalog:",
|
|
||||||
"primeicons": "catalog:",
|
|
||||||
"primevue": "catalog:",
|
|
||||||
"vue": "catalog:",
|
|
||||||
"vue-i18n": "catalog:",
|
|
||||||
"vue-router": "catalog:"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@tailwindcss/vite": "catalog:",
|
|
||||||
"@vitejs/plugin-vue": "catalog:",
|
|
||||||
"dotenv": "catalog:",
|
|
||||||
"unplugin-icons": "catalog:",
|
|
||||||
"unplugin-vue-components": "catalog:",
|
|
||||||
"vite": "catalog:",
|
|
||||||
"vite-plugin-html": "catalog:",
|
|
||||||
"vite-plugin-vue-devtools": "catalog:",
|
|
||||||
"vue-tsc": "catalog:"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
<!-- In gardens where the agents freely play,
|
<!-- In gardens where the agents freely play,
|
||||||
One stubborn flower turns the other way. -->
|
One stubborn flower turns the other way. -->
|
||||||
|
|
||||||
@AGENTS.md
|
@AGENTS.md
|
||||||
|
|||||||
@@ -16,10 +16,11 @@ Without this flag, parallel tests will conflict and fail randomly.
|
|||||||
|
|
||||||
### ComfyUI devtools
|
### ComfyUI devtools
|
||||||
|
|
||||||
ComfyUI_devtools is included in this repository under `tools/devtools/`. During CI/CD, these files are automatically copied to the `custom_nodes` directory.
|
ComfyUI*devtools is included in this repository under `tools/devtools/`. During CI/CD, these files are automatically copied to the `custom_nodes` directory.
|
||||||
_ComfyUI_devtools adds additional API endpoints and nodes to ComfyUI for browser testing._
|
\_ComfyUI_devtools adds additional API endpoints and nodes to ComfyUI for browser testing.*
|
||||||
|
|
||||||
For local development, copy the devtools files to your ComfyUI installation:
|
For local development, copy the devtools files to your ComfyUI installation:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp -r tools/devtools/* /path/to/your/ComfyUI/custom_nodes/ComfyUI_devtools/
|
cp -r tools/devtools/* /path/to/your/ComfyUI/custom_nodes/ComfyUI_devtools/
|
||||||
```
|
```
|
||||||
@@ -119,13 +120,11 @@ export default defineConfig({
|
|||||||
Browser tests in this project follow a specific organization pattern:
|
Browser tests in this project follow a specific organization pattern:
|
||||||
|
|
||||||
- **Fixtures**: Located in `fixtures/` - These provide test setup and utilities
|
- **Fixtures**: Located in `fixtures/` - These provide test setup and utilities
|
||||||
|
|
||||||
- `ComfyPage.ts` - The main fixture for interacting with ComfyUI
|
- `ComfyPage.ts` - The main fixture for interacting with ComfyUI
|
||||||
- `ComfyMouse.ts` - Utility for mouse interactions with the canvas
|
- `ComfyMouse.ts` - Utility for mouse interactions with the canvas
|
||||||
- Components fixtures in `fixtures/components/` - Page object models for UI components
|
- Components fixtures in `fixtures/components/` - Page object models for UI components
|
||||||
|
|
||||||
- **Tests**: Located in `tests/` - The actual test specifications
|
- **Tests**: Located in `tests/` - The actual test specifications
|
||||||
|
|
||||||
- Organized by functionality (e.g., `widget.spec.ts`, `interaction.spec.ts`)
|
- Organized by functionality (e.g., `widget.spec.ts`, `interaction.spec.ts`)
|
||||||
- Snapshot directories (e.g., `widget.spec.ts-snapshots/`) contain reference screenshots
|
- Snapshot directories (e.g., `widget.spec.ts-snapshots/`) contain reference screenshots
|
||||||
|
|
||||||
@@ -263,7 +262,6 @@ Most common testing needs are already addressed by these helpers, which will mak
|
|||||||
```
|
```
|
||||||
|
|
||||||
Available debug methods:
|
Available debug methods:
|
||||||
|
|
||||||
- `debugAddMarker(position)` - Red circle at position
|
- `debugAddMarker(position)` - Red circle at position
|
||||||
- `debugAttachScreenshot(testInfo, name)` - Attach to test report
|
- `debugAttachScreenshot(testInfo, name)` - Attach to test report
|
||||||
- `debugShowCanvasOverlay()` - Show canvas as overlay
|
- `debugShowCanvasOverlay()` - Show canvas as overlay
|
||||||
|
|||||||
@@ -52,7 +52,9 @@
|
|||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
"outputs": [{ "name": "LATENT", "type": "LATENT", "links": [2], "slot_index": 0 }],
|
"outputs": [
|
||||||
|
{ "name": "LATENT", "type": "LATENT", "links": [2], "slot_index": 0 }
|
||||||
|
],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [512, 512, 1]
|
"widgets_values": [512, 512, 1]
|
||||||
},
|
},
|
||||||
@@ -70,7 +72,9 @@
|
|||||||
{ "name": "negative", "type": "CONDITIONING", "link": 6 },
|
{ "name": "negative", "type": "CONDITIONING", "link": 6 },
|
||||||
{ "name": "latent_image", "type": "LATENT", "link": 2 }
|
{ "name": "latent_image", "type": "LATENT", "link": 2 }
|
||||||
],
|
],
|
||||||
"outputs": [{ "name": "LATENT", "type": "LATENT", "links": [7], "slot_index": 0 }],
|
"outputs": [
|
||||||
|
{ "name": "LATENT", "type": "LATENT", "links": [7], "slot_index": 0 }
|
||||||
|
],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [156680208700286, true, 20, 8, "euler", "normal", 1]
|
"widgets_values": [156680208700286, true, 20, 8, "euler", "normal", 1]
|
||||||
},
|
},
|
||||||
@@ -86,7 +90,9 @@
|
|||||||
{ "name": "samples", "type": "LATENT", "link": 7 },
|
{ "name": "samples", "type": "LATENT", "link": 7 },
|
||||||
{ "name": "vae", "type": "VAE", "link": 8 }
|
{ "name": "vae", "type": "VAE", "link": 8 }
|
||||||
],
|
],
|
||||||
"outputs": [{ "name": "IMAGE", "type": "IMAGE", "links": [9], "slot_index": 0 }],
|
"outputs": [
|
||||||
|
{ "name": "IMAGE", "type": "IMAGE", "links": [9], "slot_index": 0 }
|
||||||
|
],
|
||||||
"properties": {}
|
"properties": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
{
|
{
|
||||||
"id": 19,
|
"id": 19,
|
||||||
"type": "workflow>two_VAE_decode",
|
"type": "workflow>two_VAE_decode",
|
||||||
"pos": [
|
"pos": [1368.800048828125, 768.7999877929688],
|
||||||
1368.800048828125,
|
"size": [418.1999816894531, 86],
|
||||||
768.7999877929688
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
418.1999816894531,
|
|
||||||
86
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -49,10 +43,7 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"node_versions": {},
|
"node_versions": {},
|
||||||
"ue_links": [],
|
"ue_links": [],
|
||||||
@@ -62,14 +53,8 @@
|
|||||||
{
|
{
|
||||||
"id": -1,
|
"id": -1,
|
||||||
"type": "VAEDecode",
|
"type": "VAEDecode",
|
||||||
"pos": [
|
"pos": [1368.800048828125, 768.7999877929688],
|
||||||
1368.800048828125,
|
"size": [210, 46],
|
||||||
768.7999877929688
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
210,
|
|
||||||
46
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -103,14 +88,8 @@
|
|||||||
{
|
{
|
||||||
"id": -1,
|
"id": -1,
|
||||||
"type": "VAEDecode",
|
"type": "VAEDecode",
|
||||||
"pos": [
|
"pos": [1368.800048828125, 873.7999877929688],
|
||||||
1368.800048828125,
|
"size": [210, 46],
|
||||||
873.7999877929688
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
210,
|
|
||||||
46
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
|
|||||||
@@ -76,11 +76,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "EmptyLatentImage"
|
"Node name for S&R": "EmptyLatentImage"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [512, 512, 1],
|
||||||
512,
|
|
||||||
512,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"index": 0
|
"index": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -121,9 +117,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CheckpointLoaderSimple"
|
"Node name for S&R": "CheckpointLoaderSimple"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["v1-5-pruned-emaonly.ckpt"],
|
||||||
"v1-5-pruned-emaonly.ckpt"
|
|
||||||
],
|
|
||||||
"index": 1
|
"index": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -195,9 +189,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["text, watermark"],
|
||||||
"text, watermark"
|
|
||||||
],
|
|
||||||
"index": 3
|
"index": 3
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -320,85 +312,20 @@
|
|||||||
],
|
],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [
|
"widgets_values": ["ComfyUI"],
|
||||||
"ComfyUI"
|
|
||||||
],
|
|
||||||
"index": 6
|
"index": 6
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [
|
||||||
[
|
[1, 1, 2, 0, 4, "CLIP"],
|
||||||
1,
|
[1, 1, 3, 0, 4, "CLIP"],
|
||||||
1,
|
[1, 0, 4, 0, 4, "MODEL"],
|
||||||
2,
|
[2, 0, 4, 1, 6, "CONDITIONING"],
|
||||||
0,
|
[3, 0, 4, 2, 7, "CONDITIONING"],
|
||||||
4,
|
[0, 0, 4, 3, 5, "LATENT"],
|
||||||
"CLIP"
|
[4, 0, 5, 0, 3, "LATENT"],
|
||||||
],
|
[1, 2, 5, 1, 4, "VAE"],
|
||||||
[
|
[5, 0, 6, 0, 8, "IMAGE"]
|
||||||
1,
|
|
||||||
1,
|
|
||||||
3,
|
|
||||||
0,
|
|
||||||
4,
|
|
||||||
"CLIP"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
4,
|
|
||||||
0,
|
|
||||||
4,
|
|
||||||
"MODEL"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
2,
|
|
||||||
0,
|
|
||||||
4,
|
|
||||||
1,
|
|
||||||
6,
|
|
||||||
"CONDITIONING"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
3,
|
|
||||||
0,
|
|
||||||
4,
|
|
||||||
2,
|
|
||||||
7,
|
|
||||||
"CONDITIONING"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
4,
|
|
||||||
3,
|
|
||||||
5,
|
|
||||||
"LATENT"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
4,
|
|
||||||
0,
|
|
||||||
5,
|
|
||||||
0,
|
|
||||||
3,
|
|
||||||
"LATENT"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
5,
|
|
||||||
1,
|
|
||||||
4,
|
|
||||||
"VAE"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
5,
|
|
||||||
0,
|
|
||||||
6,
|
|
||||||
0,
|
|
||||||
8,
|
|
||||||
"IMAGE"
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
"external": []
|
"external": []
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -235,15 +235,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "normal", 1],
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"index": 1
|
"index": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -48,15 +48,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "normal", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
@@ -104,15 +96,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "normal", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
@@ -160,15 +144,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "normal", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -177,10 +153,7 @@
|
|||||||
"id": 0,
|
"id": 0,
|
||||||
"title": "Group",
|
"title": "Group",
|
||||||
"bounding": [
|
"bounding": [
|
||||||
406.9701232910156,
|
406.9701232910156, 59.079444885253906, 335, 345.6000061035156
|
||||||
59.079444885253906,
|
|
||||||
335,
|
|
||||||
345.6000061035156
|
|
||||||
],
|
],
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
"font_size": 24,
|
"font_size": 24,
|
||||||
@@ -190,10 +163,7 @@
|
|||||||
"id": 3,
|
"id": 3,
|
||||||
"title": "Group Parent",
|
"title": "Group Parent",
|
||||||
"bounding": [
|
"bounding": [
|
||||||
796.9703979492188,
|
796.9703979492188, 14.796443939208984, 355, 399.20001220703125
|
||||||
14.796443939208984,
|
|
||||||
355,
|
|
||||||
399.20001220703125
|
|
||||||
],
|
],
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
"font_size": 24,
|
"font_size": 24,
|
||||||
@@ -203,10 +173,7 @@
|
|||||||
"id": 2,
|
"id": 2,
|
||||||
"title": "Group Child",
|
"title": "Group Child",
|
||||||
"bounding": [
|
"bounding": [
|
||||||
806.9703979492188,
|
806.9703979492188, 58.39643096923828, 335, 345.6000061035156
|
||||||
58.39643096923828,
|
|
||||||
335,
|
|
||||||
345.6000061035156
|
|
||||||
],
|
],
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
"font_size": 24,
|
"font_size": 24,
|
||||||
@@ -217,11 +184,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 17,
|
"id": 17,
|
||||||
"type": "VAEDecode",
|
"type": "VAEDecode",
|
||||||
"pos": [
|
"pos": [318.8446183157076, 355.3961392345528],
|
||||||
318.8446183157076,
|
"size": [225, 102],
|
||||||
355.3961392345528
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
225,
|
|
||||||
102
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -49,9 +43,7 @@
|
|||||||
"id": 4,
|
"id": 4,
|
||||||
"title": "Outer Group",
|
"title": "Outer Group",
|
||||||
"bounding": [
|
"bounding": [
|
||||||
-46.25245366331014,
|
-46.25245366331014, -150.82497138023245, 1034.4034361963616,
|
||||||
-150.82497138023245,
|
|
||||||
1034.4034361963616,
|
|
||||||
1007.338460439933
|
1007.338460439933
|
||||||
],
|
],
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
@@ -62,9 +54,7 @@
|
|||||||
"id": 3,
|
"id": 3,
|
||||||
"title": "Inner Group",
|
"title": "Inner Group",
|
||||||
"bounding": [
|
"bounding": [
|
||||||
80.96059074101554,
|
80.96059074101554, 28.123757436778178, 718.286373661183,
|
||||||
28.123757436778178,
|
|
||||||
718.286373661183,
|
|
||||||
691.2397164539732
|
691.2397164539732
|
||||||
],
|
],
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
@@ -76,10 +66,7 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 0.7121393732101533,
|
"scale": 0.7121393732101533,
|
||||||
"offset": [
|
"offset": [289.18242848011835, 367.0747755524199]
|
||||||
289.18242848011835,
|
|
||||||
367.0747755524199
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"frontendVersion": "1.35.5",
|
"frontendVersion": "1.35.5",
|
||||||
"VHS_latentpreview": false,
|
"VHS_latentpreview": false,
|
||||||
@@ -89,4 +76,4 @@
|
|||||||
"workflowRendererVersion": "Vue"
|
"workflowRendererVersion": "Vue"
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [37, 98],
|
||||||
37,
|
"size": [315, 262],
|
||||||
98
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
262
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -65,12 +59,7 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"title": "Group",
|
"title": "Group",
|
||||||
"bounding": [
|
"bounding": [23, 23, 900, 825],
|
||||||
23,
|
|
||||||
23,
|
|
||||||
900,
|
|
||||||
825
|
|
||||||
],
|
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
"font_size": 24,
|
"font_size": 24,
|
||||||
"flags": {}
|
"flags": {}
|
||||||
@@ -80,11 +69,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,12 +64,7 @@
|
|||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"title": "Group",
|
"title": "Group",
|
||||||
"bounding": [
|
"bounding": [0, 0, 335, 346],
|
||||||
0,
|
|
||||||
0,
|
|
||||||
335,
|
|
||||||
346
|
|
||||||
],
|
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
"font_size": 24
|
"font_size": 24
|
||||||
}
|
}
|
||||||
@@ -78,11 +73,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +6,7 @@
|
|||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"title": "Group",
|
"title": "Group",
|
||||||
"bounding": [
|
"bounding": [0, 0, 335, 346],
|
||||||
0,
|
|
||||||
0,
|
|
||||||
335,
|
|
||||||
346
|
|
||||||
],
|
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
"font_size": 24
|
"font_size": 24
|
||||||
}
|
}
|
||||||
@@ -20,11 +15,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1.2100000000000006,
|
"scale": 1.2100000000000006,
|
||||||
"offset": [
|
"offset": [104.34159172650945, 241.35965953210126]
|
||||||
104.34159172650945,
|
|
||||||
241.35965953210126
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 6,
|
"id": 6,
|
||||||
"type": "DevToolsNodeWithDefaultInput",
|
"type": "DevToolsNodeWithDefaultInput",
|
||||||
"pos": [
|
"pos": [8.39722728729248, 29.727279663085938],
|
||||||
8.39722728729248,
|
"size": [315, 82],
|
||||||
29.727279663085938
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
82
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -30,11 +24,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "DevToolsNodeWithDefaultInput"
|
"Node name for S&R": "DevToolsNodeWithDefaultInput"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, 1, 0]
|
||||||
0,
|
|
||||||
1,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -43,10 +33,7 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
|
|||||||
@@ -5,10 +5,7 @@
|
|||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [0, 30],
|
||||||
0,
|
|
||||||
30
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 315,
|
"0": 315,
|
||||||
"1": 262
|
"1": 262
|
||||||
@@ -36,7 +33,7 @@
|
|||||||
"name": "latent_image",
|
"name": "latent_image",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"link": null
|
"link": null
|
||||||
} ,
|
},
|
||||||
{
|
{
|
||||||
"name": "dynamic_input",
|
"name": "dynamic_input",
|
||||||
"type": "FLOAT",
|
"type": "FLOAT",
|
||||||
@@ -72,11 +69,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,11 +39,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "DevToolsNodeWithForceInput"
|
"Node name for S&R": "DevToolsNodeWithForceInput"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, 1, 0]
|
||||||
0,
|
|
||||||
1,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -52,11 +48,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,7 @@
|
|||||||
"0": 449,
|
"0": 449,
|
||||||
"1": 204
|
"1": 204
|
||||||
},
|
},
|
||||||
"size": [
|
"size": [340.20001220703125, 166],
|
||||||
340.20001220703125,
|
|
||||||
166
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -61,11 +58,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "ControlNetApplyAdvanced"
|
"Node name for S&R": "ControlNetApplyAdvanced"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [1, 0, 1]
|
||||||
1,
|
|
||||||
0,
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
@@ -74,10 +67,7 @@
|
|||||||
"0": 177,
|
"0": 177,
|
||||||
"1": 265
|
"1": 265
|
||||||
},
|
},
|
||||||
"size": [
|
"size": [210, 82],
|
||||||
210,
|
|
||||||
82
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -86,9 +76,7 @@
|
|||||||
{
|
{
|
||||||
"name": "FLOAT",
|
"name": "FLOAT",
|
||||||
"type": "FLOAT",
|
"type": "FLOAT",
|
||||||
"links": [
|
"links": [1],
|
||||||
1
|
|
||||||
],
|
|
||||||
"widget": {
|
"widget": {
|
||||||
"name": "strength"
|
"name": "strength"
|
||||||
}
|
}
|
||||||
@@ -97,22 +85,10 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Run widget replace on values": false
|
"Run widget replace on values": false
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [1, "fixed"]
|
||||||
1,
|
|
||||||
"fixed"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [[1, 2, 0, 1, 4, "FLOAT"]],
|
||||||
[
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
4,
|
|
||||||
"FLOAT"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"config": {},
|
"config": {},
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -125,4 +101,4 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,9 +29,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "DevToolsNodeWithOnlyOptionalInput"
|
"Node name for S&R": "DevToolsNodeWithOnlyOptionalInput"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [""]
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
|
|||||||
@@ -47,11 +47,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,11 +46,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,11 +47,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
{
|
{
|
||||||
"id": 15,
|
"id": 15,
|
||||||
"type": "DevToolsRemoteWidgetNode",
|
"type": "DevToolsRemoteWidgetNode",
|
||||||
"pos": [
|
"pos": [495, 735],
|
||||||
495,
|
"size": [315, 58],
|
||||||
735
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
58
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -27,9 +21,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "DevToolsRemoteWidgetNode"
|
"Node name for S&R": "DevToolsRemoteWidgetNode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["v1-5-pruned-emaonly-fp16.safetensors"]
|
||||||
"v1-5-pruned-emaonly-fp16.safetensors"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -38,11 +30,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 0.8008869919566275,
|
"scale": 0.8008869919566275,
|
||||||
"offset": [
|
"offset": [538.9801226576359, -55.24554581806672]
|
||||||
538.9801226576359,
|
|
||||||
-55.24554581806672
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"type": "EmptyLatentImage",
|
"type": "EmptyLatentImage",
|
||||||
"pos": [
|
"pos": [380.51641845703125, 191.39659118652344],
|
||||||
380.51641845703125,
|
"size": [315, 106],
|
||||||
191.39659118652344
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
106
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -36,23 +30,13 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "EmptyLatentImage"
|
"Node name for S&R": "EmptyLatentImage"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [512, 512, 1]
|
||||||
512,
|
|
||||||
512,
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 4,
|
"id": 4,
|
||||||
"type": "PrimitiveNode",
|
"type": "PrimitiveNode",
|
||||||
"pos": [
|
"pos": [73.6164321899414, 197.9966278076172],
|
||||||
73.6164321899414,
|
"size": [210, 82],
|
||||||
197.9966278076172
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
210,
|
|
||||||
82
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -64,31 +48,17 @@
|
|||||||
"widget": {
|
"widget": {
|
||||||
"name": "bredth"
|
"name": "bredth"
|
||||||
},
|
},
|
||||||
"links": [
|
"links": [2]
|
||||||
2
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"title": "breadth",
|
"title": "breadth",
|
||||||
"properties": {
|
"properties": {
|
||||||
"Run widget replace on values": false
|
"Run widget replace on values": false
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [512, "fixed"]
|
||||||
512,
|
|
||||||
"fixed"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [[2, 4, 0, 3, 0, "INT"]],
|
||||||
[
|
|
||||||
2,
|
|
||||||
4,
|
|
||||||
0,
|
|
||||||
3,
|
|
||||||
0,
|
|
||||||
"INT"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"config": {},
|
"config": {},
|
||||||
"extra": {
|
"extra": {
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
{
|
{
|
||||||
"id": 12,
|
"id": 12,
|
||||||
"type": "DevToolsSimpleSlider",
|
"type": "DevToolsSimpleSlider",
|
||||||
"pos": [
|
"pos": [50, 50],
|
||||||
50,
|
"size": [315, 58],
|
||||||
50
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
58
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -28,9 +22,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "DevToolsSimpleSlider"
|
"Node name for S&R": "DevToolsSimpleSlider"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0.5]
|
||||||
0.5
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -39,11 +31,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"type": "DevToolsNodeWithStringInput",
|
"type": "DevToolsNodeWithStringInput",
|
||||||
"pos": [
|
"pos": [15, 48],
|
||||||
15,
|
"size": [315, 58],
|
||||||
48
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
58
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -21,9 +15,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "DevToolsNodeWithStringInput"
|
"Node name for S&R": "DevToolsNodeWithStringInput"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [""]
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -32,11 +24,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 4,
|
"id": 4,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [867.4669799804688, 347.22369384765625],
|
||||||
867.4669799804688,
|
"size": [315, 262],
|
||||||
347.22369384765625
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
262
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -58,27 +52,13 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "normal", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 5,
|
"id": 5,
|
||||||
"type": "PrimitiveInt",
|
"type": "PrimitiveInt",
|
||||||
"pos": [
|
"pos": [443.0852355957031, 441.131591796875],
|
||||||
443.0852355957031,
|
"size": [315, 82],
|
||||||
441.131591796875
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
82
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -87,40 +67,23 @@
|
|||||||
{
|
{
|
||||||
"name": "INT",
|
"name": "INT",
|
||||||
"type": "INT",
|
"type": "INT",
|
||||||
"links": [
|
"links": [3]
|
||||||
3
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "PrimitiveInt"
|
"Node name for S&R": "PrimitiveInt"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize"]
|
||||||
0,
|
|
||||||
"randomize"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [[3, 5, 0, 4, 5, "INT"]],
|
||||||
[
|
|
||||||
3,
|
|
||||||
5,
|
|
||||||
0,
|
|
||||||
4,
|
|
||||||
5,
|
|
||||||
"INT"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"config": {},
|
"config": {},
|
||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1.9487171000000016,
|
"scale": 1.9487171000000016,
|
||||||
"offset": [
|
"offset": [-325.57196748514497, -168.13150517966463]
|
||||||
-325.57196748514497,
|
|
||||||
-168.13150517966463
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,7 @@
|
|||||||
{
|
{
|
||||||
"id": 4,
|
"id": 4,
|
||||||
"type": "CheckpointLoaderSimple",
|
"type": "CheckpointLoaderSimple",
|
||||||
"pos": [
|
"pos": [0, 92],
|
||||||
0,
|
|
||||||
92
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 315,
|
"0": 315,
|
||||||
"1": 98
|
"1": 98
|
||||||
@@ -26,10 +23,7 @@
|
|||||||
{
|
{
|
||||||
"name": "CLIP",
|
"name": "CLIP",
|
||||||
"type": "CLIP",
|
"type": "CLIP",
|
||||||
"links": [
|
"links": [3, 5],
|
||||||
3,
|
|
||||||
5
|
|
||||||
],
|
|
||||||
"slot_index": 1
|
"slot_index": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -42,17 +36,12 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CheckpointLoaderSimple"
|
"Node name for S&R": "CheckpointLoaderSimple"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["3Guofeng3_v32Light.safetensors"]
|
||||||
"3Guofeng3_v32Light.safetensors"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 6,
|
"id": 6,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [460, 92],
|
||||||
460,
|
|
||||||
92
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 422.84503173828125,
|
"0": 422.84503173828125,
|
||||||
"1": 164.31304931640625
|
"1": 164.31304931640625
|
||||||
@@ -85,10 +74,7 @@
|
|||||||
{
|
{
|
||||||
"id": 7,
|
"id": 7,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [460, 368],
|
||||||
460,
|
|
||||||
368
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 425.27801513671875,
|
"0": 425.27801513671875,
|
||||||
"1": 180.6060791015625
|
"1": 180.6060791015625
|
||||||
@@ -114,17 +100,12 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["text, watermark"]
|
||||||
"text, watermark"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"type": "CheckpointLoaderSimple",
|
"type": "CheckpointLoaderSimple",
|
||||||
"pos": [
|
"pos": [0, 276],
|
||||||
0,
|
|
||||||
276
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 315,
|
"0": 315,
|
||||||
"1": 98
|
"1": 98
|
||||||
@@ -155,39 +136,20 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CheckpointLoaderSimple"
|
"Node name for S&R": "CheckpointLoaderSimple"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["3Guofeng3_v32Light.safetensors"]
|
||||||
"3Guofeng3_v32Light.safetensors"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [
|
||||||
[
|
[3, 4, 1, 6, 0, "CLIP"],
|
||||||
3,
|
[5, 4, 1, 7, 0, "CLIP"]
|
||||||
4,
|
|
||||||
1,
|
|
||||||
6,
|
|
||||||
0,
|
|
||||||
"CLIP"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
5,
|
|
||||||
4,
|
|
||||||
1,
|
|
||||||
7,
|
|
||||||
0,
|
|
||||||
"CLIP"
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"config": {},
|
"config": {},
|
||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,7 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [590, 40],
|
||||||
590,
|
|
||||||
40
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 315,
|
"0": 315,
|
||||||
"1": 262
|
"1": 262
|
||||||
@@ -53,23 +50,12 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "normal", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 4,
|
"id": 4,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [20, 50],
|
||||||
20,
|
|
||||||
50
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 400,
|
"0": 400,
|
||||||
"1": 200
|
"1": 200
|
||||||
@@ -88,26 +74,19 @@
|
|||||||
{
|
{
|
||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"links": [
|
"links": [3],
|
||||||
3
|
|
||||||
],
|
|
||||||
"shape": 3
|
"shape": 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [""]
|
||||||
""
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 5,
|
"id": 5,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [20, 320],
|
||||||
20,
|
|
||||||
320
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 400,
|
"0": 400,
|
||||||
"1": 200
|
"1": 200
|
||||||
@@ -134,31 +113,17 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [""]
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [[3, 4, 0, 1, 1, "CONDITIONING"]],
|
||||||
[
|
|
||||||
3,
|
|
||||||
4,
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
"CONDITIONING"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"config": {},
|
"config": {},
|
||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,7 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"models": [
|
"models": [
|
||||||
@@ -22,4 +19,4 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,7 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"type": "UNKNOWN NODE",
|
"type": "UNKNOWN NODE",
|
||||||
"pos": [
|
"pos": [48, 86],
|
||||||
48,
|
|
||||||
86
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 358.80780029296875,
|
"0": 358.80780029296875,
|
||||||
"1": 314.7989501953125
|
"1": 314.7989501953125
|
||||||
@@ -36,14 +33,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "UNKNOWN NODE"
|
"Node name for S&R": "UNKNOWN NODE"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["wd-v1-4-moat-tagger-v2", 0.35, 0.85, false, false, ""]
|
||||||
"wd-v1-4-moat-tagger-v2",
|
|
||||||
0.35,
|
|
||||||
0.85,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -52,10 +42,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0, 0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,7 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"type": "UNKNOWN NODE",
|
"type": "UNKNOWN NODE",
|
||||||
"pos": [
|
"pos": [48, 86],
|
||||||
48,
|
|
||||||
86
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 358.80780029296875,
|
"0": 358.80780029296875,
|
||||||
"1": 314.7989501953125
|
"1": 314.7989501953125
|
||||||
|
|||||||
@@ -179,4 +179,4 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,9 +42,7 @@
|
|||||||
{
|
{
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"links": [
|
"links": [7],
|
||||||
7
|
|
||||||
],
|
|
||||||
"slot_index": 0
|
"slot_index": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -82,35 +80,26 @@
|
|||||||
{
|
{
|
||||||
"name": "MODEL",
|
"name": "MODEL",
|
||||||
"type": "MODEL",
|
"type": "MODEL",
|
||||||
"links": [
|
"links": [1],
|
||||||
1
|
|
||||||
],
|
|
||||||
"slot_index": 0
|
"slot_index": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "CLIP",
|
"name": "CLIP",
|
||||||
"type": "CLIP",
|
"type": "CLIP",
|
||||||
"links": [
|
"links": [3, 5],
|
||||||
3,
|
|
||||||
5
|
|
||||||
],
|
|
||||||
"slot_index": 1
|
"slot_index": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "VAE",
|
"name": "VAE",
|
||||||
"type": "VAE",
|
"type": "VAE",
|
||||||
"links": [
|
"links": [8],
|
||||||
8
|
|
||||||
],
|
|
||||||
"slot_index": 2
|
"slot_index": 2
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CheckpointLoaderSimple"
|
"Node name for S&R": "CheckpointLoaderSimple"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["Stable-diffusion/v1-5-pruned-emaonly.safetensors"],
|
||||||
"Stable-diffusion/v1-5-pruned-emaonly.safetensors"
|
|
||||||
],
|
|
||||||
"color": "#322",
|
"color": "#322",
|
||||||
"bgcolor": "#533"
|
"bgcolor": "#533"
|
||||||
},
|
},
|
||||||
@@ -133,20 +122,14 @@
|
|||||||
{
|
{
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"links": [
|
"links": [2],
|
||||||
2
|
|
||||||
],
|
|
||||||
"slot_index": 0
|
"slot_index": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "EmptyLatentImage"
|
"Node name for S&R": "EmptyLatentImage"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [512, 512, 1],
|
||||||
512,
|
|
||||||
512,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"color": "#323",
|
"color": "#323",
|
||||||
"bgcolor": "#535"
|
"bgcolor": "#535"
|
||||||
},
|
},
|
||||||
@@ -175,9 +158,7 @@
|
|||||||
{
|
{
|
||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"links": [
|
"links": [4],
|
||||||
4
|
|
||||||
],
|
|
||||||
"slot_index": 0
|
"slot_index": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -215,18 +196,14 @@
|
|||||||
{
|
{
|
||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"links": [
|
"links": [6],
|
||||||
6
|
|
||||||
],
|
|
||||||
"slot_index": 0
|
"slot_index": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["text, watermark"],
|
||||||
"text, watermark"
|
|
||||||
],
|
|
||||||
"color": "#323",
|
"color": "#323",
|
||||||
"bgcolor": "#535"
|
"bgcolor": "#535"
|
||||||
},
|
},
|
||||||
@@ -260,9 +237,7 @@
|
|||||||
{
|
{
|
||||||
"name": "IMAGE",
|
"name": "IMAGE",
|
||||||
"type": "IMAGE",
|
"type": "IMAGE",
|
||||||
"links": [
|
"links": [9],
|
||||||
9
|
|
||||||
],
|
|
||||||
"slot_index": 0
|
"slot_index": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -280,10 +255,7 @@
|
|||||||
"0": 857,
|
"0": 857,
|
||||||
"1": 611
|
"1": 611
|
||||||
},
|
},
|
||||||
"size": [
|
"size": [214.2000732421875, 59.4000244140625],
|
||||||
214.2000732421875,
|
|
||||||
59.4000244140625
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 9,
|
"order": 9,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -296,9 +268,7 @@
|
|||||||
],
|
],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [
|
"widgets_values": ["ComfyUI"]
|
||||||
"ComfyUI"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
@@ -335,9 +305,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CheckpointLoaderSimple"
|
"Node name for S&R": "CheckpointLoaderSimple"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["Stable-diffusion/v1-5-pruned-emaonly.safetensors"],
|
||||||
"Stable-diffusion/v1-5-pruned-emaonly.safetensors"
|
|
||||||
],
|
|
||||||
"color": "#332922",
|
"color": "#332922",
|
||||||
"bgcolor": "#593930"
|
"bgcolor": "#593930"
|
||||||
},
|
},
|
||||||
@@ -376,9 +344,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CheckpointLoaderSimple"
|
"Node name for S&R": "CheckpointLoaderSimple"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["Stable-diffusion/v1-5-pruned-emaonly.safetensors"],
|
||||||
"Stable-diffusion/v1-5-pruned-emaonly.safetensors"
|
|
||||||
],
|
|
||||||
"color": "#223",
|
"color": "#223",
|
||||||
"bgcolor": "#335"
|
"bgcolor": "#335"
|
||||||
},
|
},
|
||||||
@@ -413,89 +379,21 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "ImageScale"
|
"Node name for S&R": "ImageScale"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["nearest-exact", 512, 512, "disabled"],
|
||||||
"nearest-exact",
|
|
||||||
512,
|
|
||||||
512,
|
|
||||||
"disabled"
|
|
||||||
],
|
|
||||||
"color": "#2a363b",
|
"color": "#2a363b",
|
||||||
"bgcolor": "#3f5159"
|
"bgcolor": "#3f5159"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [
|
||||||
[
|
[1, 4, 0, 3, 0, "MODEL"],
|
||||||
1,
|
[2, 5, 0, 3, 3, "LATENT"],
|
||||||
4,
|
[3, 4, 1, 6, 0, "CLIP"],
|
||||||
0,
|
[4, 6, 0, 3, 1, "CONDITIONING"],
|
||||||
3,
|
[5, 4, 1, 7, 0, "CLIP"],
|
||||||
0,
|
[6, 7, 0, 3, 2, "CONDITIONING"],
|
||||||
"MODEL"
|
[7, 3, 0, 8, 0, "LATENT"],
|
||||||
],
|
[8, 4, 2, 8, 1, "VAE"],
|
||||||
[
|
[9, 8, 0, 9, 0, "IMAGE"]
|
||||||
2,
|
|
||||||
5,
|
|
||||||
0,
|
|
||||||
3,
|
|
||||||
3,
|
|
||||||
"LATENT"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
3,
|
|
||||||
4,
|
|
||||||
1,
|
|
||||||
6,
|
|
||||||
0,
|
|
||||||
"CLIP"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
4,
|
|
||||||
6,
|
|
||||||
0,
|
|
||||||
3,
|
|
||||||
1,
|
|
||||||
"CONDITIONING"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
5,
|
|
||||||
4,
|
|
||||||
1,
|
|
||||||
7,
|
|
||||||
0,
|
|
||||||
"CLIP"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
6,
|
|
||||||
7,
|
|
||||||
0,
|
|
||||||
3,
|
|
||||||
2,
|
|
||||||
"CONDITIONING"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
7,
|
|
||||||
3,
|
|
||||||
0,
|
|
||||||
8,
|
|
||||||
0,
|
|
||||||
"LATENT"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
8,
|
|
||||||
4,
|
|
||||||
2,
|
|
||||||
8,
|
|
||||||
1,
|
|
||||||
"VAE"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
9,
|
|
||||||
8,
|
|
||||||
0,
|
|
||||||
9,
|
|
||||||
0,
|
|
||||||
"IMAGE"
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"config": {},
|
"config": {},
|
||||||
|
|||||||
@@ -47,9 +47,7 @@
|
|||||||
{
|
{
|
||||||
"name": "IMAGE",
|
"name": "IMAGE",
|
||||||
"type": "IMAGE",
|
"type": "IMAGE",
|
||||||
"links": [
|
"links": [15],
|
||||||
15
|
|
||||||
],
|
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"shape": 3
|
"shape": 3
|
||||||
}
|
}
|
||||||
@@ -59,26 +57,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [[15, 17, 0, 14, 0, "IMAGE"]],
|
||||||
[
|
|
||||||
15,
|
|
||||||
17,
|
|
||||||
0,
|
|
||||||
14,
|
|
||||||
0,
|
|
||||||
"IMAGE"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"config": {},
|
"config": {},
|
||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [117.20766722169206, 472.69035116826046]
|
||||||
117.20766722169206,
|
|
||||||
472.69035116826046
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,44 +5,30 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"type": "Note",
|
"type": "Note",
|
||||||
"pos": [
|
"pos": [50, 50],
|
||||||
50, 50
|
"size": [322.3645935058594, 167.91612243652344],
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
322.3645935058594,
|
|
||||||
167.91612243652344
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [
|
"widgets_values": ["Foo\n123"],
|
||||||
"Foo\n123"
|
|
||||||
],
|
|
||||||
"color": "#432",
|
"color": "#432",
|
||||||
"bgcolor": "#653"
|
"bgcolor": "#653"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"type": "MarkdownNote",
|
"type": "MarkdownNote",
|
||||||
"pos": [
|
"pos": [50, 300],
|
||||||
50, 300
|
"size": [320.9985656738281, 179.52735900878906],
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
320.9985656738281,
|
|
||||||
179.52735900878906
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [
|
"widgets_values": ["# Bar\n123"],
|
||||||
"# Bar\n123"
|
|
||||||
],
|
|
||||||
"color": "#432",
|
"color": "#432",
|
||||||
"bgcolor": "#653"
|
"bgcolor": "#653"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,7 @@
|
|||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [0, 30],
|
||||||
0,
|
|
||||||
30
|
|
||||||
],
|
|
||||||
"size": {
|
"size": {
|
||||||
"0": 315,
|
"0": 315,
|
||||||
"1": 262
|
"1": 262
|
||||||
@@ -66,11 +63,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,7 @@
|
|||||||
],
|
],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [
|
"widgets_values": ["ComfyUI"]
|
||||||
"ComfyUI"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -36,11 +34,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,35 +21,26 @@
|
|||||||
{
|
{
|
||||||
"name": "MODEL",
|
"name": "MODEL",
|
||||||
"type": "MODEL",
|
"type": "MODEL",
|
||||||
"links": [
|
"links": [12],
|
||||||
12
|
|
||||||
],
|
|
||||||
"shape": 3
|
"shape": 3
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "CLIP",
|
"name": "CLIP",
|
||||||
"type": "CLIP",
|
"type": "CLIP",
|
||||||
"links": [
|
"links": [10, 11],
|
||||||
10,
|
|
||||||
11
|
|
||||||
],
|
|
||||||
"shape": 3
|
"shape": 3
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "VAE",
|
"name": "VAE",
|
||||||
"type": "VAE",
|
"type": "VAE",
|
||||||
"links": [
|
"links": [17],
|
||||||
17
|
|
||||||
],
|
|
||||||
"shape": 3
|
"shape": 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CheckpointLoaderSimple"
|
"Node name for S&R": "CheckpointLoaderSimple"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["v1-5-pruned-emaonly.ckpt"]
|
||||||
"v1-5-pruned-emaonly.ckpt"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "CLIPTextEncode.0",
|
"id": "CLIPTextEncode.0",
|
||||||
@@ -76,9 +67,7 @@
|
|||||||
{
|
{
|
||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"links": [
|
"links": [13],
|
||||||
13
|
|
||||||
],
|
|
||||||
"shape": 3
|
"shape": 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -114,18 +103,14 @@
|
|||||||
{
|
{
|
||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"links": [
|
"links": [14],
|
||||||
14
|
|
||||||
],
|
|
||||||
"shape": 3
|
"shape": 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["text, watermark"]
|
||||||
"text, watermark"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "EmptyLatentImage.0",
|
"id": "EmptyLatentImage.0",
|
||||||
@@ -146,20 +131,14 @@
|
|||||||
{
|
{
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"links": [
|
"links": [15],
|
||||||
15
|
|
||||||
],
|
|
||||||
"shape": 3
|
"shape": 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "EmptyLatentImage"
|
"Node name for S&R": "EmptyLatentImage"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [512, 512, 1]
|
||||||
512,
|
|
||||||
512,
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "KSampler.0",
|
"id": "KSampler.0",
|
||||||
@@ -201,24 +180,14 @@
|
|||||||
{
|
{
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"links": [
|
"links": [16],
|
||||||
16
|
|
||||||
],
|
|
||||||
"shape": 3
|
"shape": 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [3, "randomize", 20, 8, "euler", "normal", 1]
|
||||||
3,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "VAEDecode.0",
|
"id": "VAEDecode.0",
|
||||||
@@ -250,9 +219,7 @@
|
|||||||
{
|
{
|
||||||
"name": "IMAGE",
|
"name": "IMAGE",
|
||||||
"type": "IMAGE",
|
"type": "IMAGE",
|
||||||
"links": [
|
"links": [18],
|
||||||
18
|
|
||||||
],
|
|
||||||
"shape": 3
|
"shape": 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -283,94 +250,26 @@
|
|||||||
],
|
],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [
|
"widgets_values": ["ComfyUI"]
|
||||||
"ComfyUI"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [
|
||||||
[
|
[10, "CheckpointLoaderSimple.0", 1, "CLIPTextEncode.0", 0, "CLIP"],
|
||||||
10,
|
[11, "CheckpointLoaderSimple.0", 1, "CLIPTextEncode.1", 0, "CLIP"],
|
||||||
"CheckpointLoaderSimple.0",
|
[12, "CheckpointLoaderSimple.0", 0, "KSampler.0", 0, "MODEL"],
|
||||||
1,
|
[13, "CLIPTextEncode.0", 0, "KSampler.0", 1, "CONDITIONING"],
|
||||||
"CLIPTextEncode.0",
|
[14, "CLIPTextEncode.1", 0, "KSampler.0", 2, "CONDITIONING"],
|
||||||
0,
|
[15, "EmptyLatentImage.0", 0, "KSampler.0", 3, "LATENT"],
|
||||||
"CLIP"
|
[16, "KSampler.0", 0, "VAEDecode.0", 0, "LATENT"],
|
||||||
],
|
[17, "CheckpointLoaderSimple.0", 2, "VAEDecode.0", 1, "VAE"],
|
||||||
[
|
[18, "VAEDecode.0", 0, "SaveImage.0", 0, "IMAGE"]
|
||||||
11,
|
|
||||||
"CheckpointLoaderSimple.0",
|
|
||||||
1,
|
|
||||||
"CLIPTextEncode.1",
|
|
||||||
0,
|
|
||||||
"CLIP"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
12,
|
|
||||||
"CheckpointLoaderSimple.0",
|
|
||||||
0,
|
|
||||||
"KSampler.0",
|
|
||||||
0,
|
|
||||||
"MODEL"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
13,
|
|
||||||
"CLIPTextEncode.0",
|
|
||||||
0,
|
|
||||||
"KSampler.0",
|
|
||||||
1,
|
|
||||||
"CONDITIONING"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
14,
|
|
||||||
"CLIPTextEncode.1",
|
|
||||||
0,
|
|
||||||
"KSampler.0",
|
|
||||||
2,
|
|
||||||
"CONDITIONING"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
15,
|
|
||||||
"EmptyLatentImage.0",
|
|
||||||
0,
|
|
||||||
"KSampler.0",
|
|
||||||
3,
|
|
||||||
"LATENT"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
16,
|
|
||||||
"KSampler.0",
|
|
||||||
0,
|
|
||||||
"VAEDecode.0",
|
|
||||||
0,
|
|
||||||
"LATENT"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
17,
|
|
||||||
"CheckpointLoaderSimple.0",
|
|
||||||
2,
|
|
||||||
"VAEDecode.0",
|
|
||||||
1,
|
|
||||||
"VAE"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
18,
|
|
||||||
"VAEDecode.0",
|
|
||||||
0,
|
|
||||||
"SaveImage.0",
|
|
||||||
0,
|
|
||||||
"IMAGE"
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"config": {},
|
"config": {},
|
||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
|
|||||||
@@ -65,15 +65,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "normal", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
@@ -90,10 +82,7 @@
|
|||||||
"8": 0,
|
"8": 0,
|
||||||
"9": 0
|
"9": 0
|
||||||
},
|
},
|
||||||
"size": [
|
"size": [446.96645387135936, 108.34243389566905],
|
||||||
446.96645387135936,
|
|
||||||
108.34243389566905
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -102,9 +91,7 @@
|
|||||||
{
|
{
|
||||||
"name": "INT",
|
"name": "INT",
|
||||||
"type": "INT",
|
"type": "INT",
|
||||||
"links": [
|
"links": [1],
|
||||||
1
|
|
||||||
],
|
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"widget": {
|
"widget": {
|
||||||
"name": "steps"
|
"name": "steps"
|
||||||
@@ -114,32 +101,17 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Run widget replace on values": false
|
"Run widget replace on values": false
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [20, "fixed"]
|
||||||
20,
|
|
||||||
"fixed"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [[1, 1, 0, 2, 4, "INT"]],
|
||||||
[
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
2,
|
|
||||||
4,
|
|
||||||
"INT"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"config": {},
|
"config": {},
|
||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,7 @@
|
|||||||
"0": 304.3653259277344,
|
"0": 304.3653259277344,
|
||||||
"1": 42.15586471557617
|
"1": 42.15586471557617
|
||||||
},
|
},
|
||||||
"size": [
|
"size": [315, 262],
|
||||||
315,
|
|
||||||
262
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -49,15 +46,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "normal", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
@@ -66,10 +55,7 @@
|
|||||||
"0": 14,
|
"0": 14,
|
||||||
"1": 43
|
"1": 43
|
||||||
},
|
},
|
||||||
"size": [
|
"size": [203.1999969482422, 40.368401303242536],
|
||||||
203.1999969482422,
|
|
||||||
40.368401303242536
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -94,11 +80,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,7 @@
|
|||||||
"0": 304.3653259277344,
|
"0": 304.3653259277344,
|
||||||
"1": 42.15586471557617
|
"1": 42.15586471557617
|
||||||
},
|
},
|
||||||
"size": [
|
"size": [315, 262],
|
||||||
315,
|
|
||||||
262
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -49,15 +46,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "normal", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"normal",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
@@ -66,10 +55,7 @@
|
|||||||
"0": 14,
|
"0": 14,
|
||||||
"1": 43
|
"1": 43
|
||||||
},
|
},
|
||||||
"size": [
|
"size": [203.1999969482422, 40.368401303242536],
|
||||||
203.1999969482422,
|
|
||||||
40.368401303242536
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -94,11 +80,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"type": "e5fb1765-9323-4548-801a-5aead34d879e",
|
"type": "e5fb1765-9323-4548-801a-5aead34d879e",
|
||||||
"pos": [
|
"pos": [627.5973510742188, 423.0972900390625],
|
||||||
627.5973510742188,
|
"size": [144.15234375, 46],
|
||||||
423.0972900390625
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
144.15234375,
|
|
||||||
46
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -54,30 +48,18 @@
|
|||||||
"name": "New Subgraph",
|
"name": "New Subgraph",
|
||||||
"inputNode": {
|
"inputNode": {
|
||||||
"id": -10,
|
"id": -10,
|
||||||
"bounding": [
|
"bounding": [347.90441582814213, 417.3822440655296, 120, 60]
|
||||||
347.90441582814213,
|
|
||||||
417.3822440655296,
|
|
||||||
120,
|
|
||||||
60
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"outputNode": {
|
"outputNode": {
|
||||||
"id": -20,
|
"id": -20,
|
||||||
"bounding": [
|
"bounding": [892.5973510742188, 416.0972900390625, 120, 60]
|
||||||
892.5973510742188,
|
|
||||||
416.0972900390625,
|
|
||||||
120,
|
|
||||||
60
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"id": "c5cc99d8-a2b6-4bf3-8be7-d4949ef736cd",
|
"id": "c5cc99d8-a2b6-4bf3-8be7-d4949ef736cd",
|
||||||
"name": "positive",
|
"name": "positive",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"linkIds": [
|
"linkIds": [1],
|
||||||
1
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 447.9044189453125,
|
"0": 447.9044189453125,
|
||||||
"1": 437.3822326660156
|
"1": 437.3822326660156
|
||||||
@@ -89,9 +71,7 @@
|
|||||||
"id": "9bd488b9-e907-4c95-a7a4-85c5597a87af",
|
"id": "9bd488b9-e907-4c95-a7a4-85c5597a87af",
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"linkIds": [
|
"linkIds": [2],
|
||||||
2
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 912.5973510742188,
|
"0": 912.5973510742188,
|
||||||
"1": 436.0972900390625
|
"1": 436.0972900390625
|
||||||
@@ -103,14 +83,8 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [554.8743286132812, 100.95539093017578],
|
||||||
554.8743286132812,
|
"size": [270, 262],
|
||||||
100.95539093017578
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
270,
|
|
||||||
262
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -145,35 +119,19 @@
|
|||||||
"localized_name": "LATENT",
|
"localized_name": "LATENT",
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"links": [
|
"links": [2]
|
||||||
2
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "simple", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"simple",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"type": "VAEEncode",
|
"type": "VAEEncode",
|
||||||
"pos": [
|
"pos": [685.1265869140625, 439.1734619140625],
|
||||||
685.1265869140625,
|
"size": [140, 46],
|
||||||
439.1734619140625
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
140,
|
|
||||||
46
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -196,9 +154,7 @@
|
|||||||
"localized_name": "LATENT",
|
"localized_name": "LATENT",
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"links": [
|
"links": [4]
|
||||||
4
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -233,12 +189,9 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 0.8894351682943402,
|
"scale": 0.8894351682943402,
|
||||||
"offset": [
|
"offset": [58.7671207025881, 137.7124650620126]
|
||||||
58.7671207025881,
|
|
||||||
137.7124650620126
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"frontendVersion": "1.24.1"
|
"frontendVersion": "1.24.1"
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"type": "8beb610f-ddd1-4489-ae0d-2f732a4042ae",
|
"type": "8beb610f-ddd1-4489-ae0d-2f732a4042ae",
|
||||||
"pos": [
|
"pos": [532, 412.5],
|
||||||
532,
|
"size": [140, 46],
|
||||||
412.5
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
140,
|
|
||||||
46
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -23,16 +17,12 @@
|
|||||||
{
|
{
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"links": [
|
"links": [10]
|
||||||
10
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "VAE",
|
"name": "VAE",
|
||||||
"type": "VAE",
|
"type": "VAE",
|
||||||
"links": [
|
"links": [11]
|
||||||
11
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"title": "subgraph 2",
|
"title": "subgraph 2",
|
||||||
@@ -42,14 +32,8 @@
|
|||||||
{
|
{
|
||||||
"id": 8,
|
"id": 8,
|
||||||
"type": "VAEDecode",
|
"type": "VAEDecode",
|
||||||
"pos": [
|
"pos": [758.2109985351562, 398.3681335449219],
|
||||||
758.2109985351562,
|
"size": [210, 46],
|
||||||
398.3681335449219
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
210,
|
|
||||||
46
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -70,9 +54,7 @@
|
|||||||
"name": "IMAGE",
|
"name": "IMAGE",
|
||||||
"type": "IMAGE",
|
"type": "IMAGE",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [9]
|
||||||
9
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -83,14 +65,8 @@
|
|||||||
{
|
{
|
||||||
"id": 9,
|
"id": 9,
|
||||||
"type": "SaveImage",
|
"type": "SaveImage",
|
||||||
"pos": [
|
"pos": [1028.9615478515625, 381.83746337890625],
|
||||||
1028.9615478515625,
|
"size": [210, 270],
|
||||||
381.83746337890625
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
210,
|
|
||||||
270
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 2,
|
"order": 2,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -103,36 +79,13 @@
|
|||||||
],
|
],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [
|
"widgets_values": ["ComfyUI"]
|
||||||
"ComfyUI"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [
|
||||||
[
|
[9, 8, 0, 9, 0, "IMAGE"],
|
||||||
9,
|
[10, 10, 0, 8, 0, "LATENT"],
|
||||||
8,
|
[11, 10, 1, 8, 1, "VAE"]
|
||||||
0,
|
|
||||||
9,
|
|
||||||
0,
|
|
||||||
"IMAGE"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
10,
|
|
||||||
10,
|
|
||||||
0,
|
|
||||||
8,
|
|
||||||
0,
|
|
||||||
"LATENT"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
11,
|
|
||||||
10,
|
|
||||||
1,
|
|
||||||
8,
|
|
||||||
1,
|
|
||||||
"VAE"
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
"groups": [],
|
"groups": [],
|
||||||
"definitions": {
|
"definitions": {
|
||||||
@@ -151,21 +104,11 @@
|
|||||||
"name": "subgraph 2",
|
"name": "subgraph 2",
|
||||||
"inputNode": {
|
"inputNode": {
|
||||||
"id": -10,
|
"id": -10,
|
||||||
"bounding": [
|
"bounding": [-154, 415.5, 120, 40]
|
||||||
-154,
|
|
||||||
415.5,
|
|
||||||
120,
|
|
||||||
40
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"outputNode": {
|
"outputNode": {
|
||||||
"id": -20,
|
"id": -20,
|
||||||
"bounding": [
|
"bounding": [1238, 395.5, 120, 80]
|
||||||
1238,
|
|
||||||
395.5,
|
|
||||||
120,
|
|
||||||
80
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@@ -173,9 +116,7 @@
|
|||||||
"id": "4d6c7e4e-971e-4f78-9218-9a604db53a4b",
|
"id": "4d6c7e4e-971e-4f78-9218-9a604db53a4b",
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"linkIds": [
|
"linkIds": [7],
|
||||||
7
|
|
||||||
],
|
|
||||||
"localized_name": "LATENT",
|
"localized_name": "LATENT",
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 1258,
|
"0": 1258,
|
||||||
@@ -186,9 +127,7 @@
|
|||||||
"id": "f8201d4f-7fc6-4a1b-b8c9-9f0716d9c09a",
|
"id": "f8201d4f-7fc6-4a1b-b8c9-9f0716d9c09a",
|
||||||
"name": "VAE",
|
"name": "VAE",
|
||||||
"type": "VAE",
|
"type": "VAE",
|
||||||
"linkIds": [
|
"linkIds": [14],
|
||||||
14
|
|
||||||
],
|
|
||||||
"localized_name": "VAE",
|
"localized_name": "VAE",
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 1258,
|
"0": 1258,
|
||||||
@@ -201,14 +140,8 @@
|
|||||||
{
|
{
|
||||||
"id": 6,
|
"id": 6,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [415, 186],
|
||||||
415,
|
"size": [422.84503173828125, 164.31304931640625],
|
||||||
186
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
422.84503173828125,
|
|
||||||
164.31304931640625
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -226,9 +159,7 @@
|
|||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [4]
|
||||||
4
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -241,14 +172,8 @@
|
|||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [863, 186],
|
||||||
863,
|
"size": [315, 262],
|
||||||
186
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
262
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 2,
|
"order": 2,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -284,9 +209,7 @@
|
|||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [7]
|
||||||
7
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -305,14 +228,8 @@
|
|||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"type": "dbe5763f-440b-47b4-82ac-454f1f98b0e3",
|
"type": "dbe5763f-440b-47b4-82ac-454f1f98b0e3",
|
||||||
"pos": [
|
"pos": [194.13900756835938, 657.3333740234375],
|
||||||
194.13900756835938,
|
"size": [140, 106],
|
||||||
657.3333740234375
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
140,
|
|
||||||
106
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -322,41 +239,31 @@
|
|||||||
"localized_name": "CONDITIONING",
|
"localized_name": "CONDITIONING",
|
||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"links": [
|
"links": [10]
|
||||||
10
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"localized_name": "LATENT",
|
"localized_name": "LATENT",
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"links": [
|
"links": [11]
|
||||||
11
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"localized_name": "MODEL",
|
"localized_name": "MODEL",
|
||||||
"name": "MODEL",
|
"name": "MODEL",
|
||||||
"type": "MODEL",
|
"type": "MODEL",
|
||||||
"links": [
|
"links": [12]
|
||||||
12
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"localized_name": "CLIP",
|
"localized_name": "CLIP",
|
||||||
"name": "CLIP",
|
"name": "CLIP",
|
||||||
"type": "CLIP",
|
"type": "CLIP",
|
||||||
"links": [
|
"links": [13]
|
||||||
13
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"localized_name": "VAE",
|
"localized_name": "VAE",
|
||||||
"name": "VAE",
|
"name": "VAE",
|
||||||
"type": "VAE",
|
"type": "VAE",
|
||||||
"links": [
|
"links": [14]
|
||||||
14
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"title": "subgraph 3",
|
"title": "subgraph 3",
|
||||||
@@ -439,21 +346,11 @@
|
|||||||
"name": "subgraph 3",
|
"name": "subgraph 3",
|
||||||
"inputNode": {
|
"inputNode": {
|
||||||
"id": -10,
|
"id": -10,
|
||||||
"bounding": [
|
"bounding": [-154, 517, 120, 40]
|
||||||
-154,
|
|
||||||
517,
|
|
||||||
120,
|
|
||||||
40
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"outputNode": {
|
"outputNode": {
|
||||||
"id": -20,
|
"id": -20,
|
||||||
"bounding": [
|
"bounding": [898.2780151367188, 467, 128.6640625, 140]
|
||||||
898.2780151367188,
|
|
||||||
467,
|
|
||||||
128.6640625,
|
|
||||||
140
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@@ -461,9 +358,7 @@
|
|||||||
"id": "b4882169-329b-43f6-a373-81abfbdea55b",
|
"id": "b4882169-329b-43f6-a373-81abfbdea55b",
|
||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"linkIds": [
|
"linkIds": [6],
|
||||||
6
|
|
||||||
],
|
|
||||||
"localized_name": "CONDITIONING",
|
"localized_name": "CONDITIONING",
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 918.2780151367188,
|
"0": 918.2780151367188,
|
||||||
@@ -474,9 +369,7 @@
|
|||||||
"id": "01f51f96-a741-428e-8772-9557ee50b609",
|
"id": "01f51f96-a741-428e-8772-9557ee50b609",
|
||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"linkIds": [
|
"linkIds": [2],
|
||||||
2
|
|
||||||
],
|
|
||||||
"localized_name": "LATENT",
|
"localized_name": "LATENT",
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 918.2780151367188,
|
"0": 918.2780151367188,
|
||||||
@@ -487,9 +380,7 @@
|
|||||||
"id": "47fa906e-d80b-45c3-a596-211a0e59d4a1",
|
"id": "47fa906e-d80b-45c3-a596-211a0e59d4a1",
|
||||||
"name": "MODEL",
|
"name": "MODEL",
|
||||||
"type": "MODEL",
|
"type": "MODEL",
|
||||||
"linkIds": [
|
"linkIds": [1],
|
||||||
1
|
|
||||||
],
|
|
||||||
"localized_name": "MODEL",
|
"localized_name": "MODEL",
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 918.2780151367188,
|
"0": 918.2780151367188,
|
||||||
@@ -500,9 +391,7 @@
|
|||||||
"id": "f03dccd7-10e8-4513-9994-15854a92d192",
|
"id": "f03dccd7-10e8-4513-9994-15854a92d192",
|
||||||
"name": "CLIP",
|
"name": "CLIP",
|
||||||
"type": "CLIP",
|
"type": "CLIP",
|
||||||
"linkIds": [
|
"linkIds": [3],
|
||||||
3
|
|
||||||
],
|
|
||||||
"localized_name": "CLIP",
|
"localized_name": "CLIP",
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 918.2780151367188,
|
"0": 918.2780151367188,
|
||||||
@@ -513,9 +402,7 @@
|
|||||||
"id": "a666877f-e34f-49bc-8a78-b26156656b83",
|
"id": "a666877f-e34f-49bc-8a78-b26156656b83",
|
||||||
"name": "VAE",
|
"name": "VAE",
|
||||||
"type": "VAE",
|
"type": "VAE",
|
||||||
"linkIds": [
|
"linkIds": [8],
|
||||||
8
|
|
||||||
],
|
|
||||||
"localized_name": "VAE",
|
"localized_name": "VAE",
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 918.2780151367188,
|
"0": 918.2780151367188,
|
||||||
@@ -528,14 +415,8 @@
|
|||||||
{
|
{
|
||||||
"id": 7,
|
"id": 7,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [413, 389],
|
||||||
413,
|
"size": [425.27801513671875, 180.6060791015625],
|
||||||
389
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
425.27801513671875,
|
|
||||||
180.6060791015625
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 2,
|
"order": 2,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -553,29 +434,19 @@
|
|||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [6]
|
||||||
6
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["text, watermark"]
|
||||||
"text, watermark"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 5,
|
"id": 5,
|
||||||
"type": "EmptyLatentImage",
|
"type": "EmptyLatentImage",
|
||||||
"pos": [
|
"pos": [473, 609],
|
||||||
473,
|
"size": [315, 106],
|
||||||
609
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
106
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -586,31 +457,19 @@
|
|||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [2]
|
||||||
2
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "EmptyLatentImage"
|
"Node name for S&R": "EmptyLatentImage"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [512, 512, 1]
|
||||||
512,
|
|
||||||
512,
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 4,
|
"id": 4,
|
||||||
"type": "CheckpointLoaderSimple",
|
"type": "CheckpointLoaderSimple",
|
||||||
"pos": [
|
"pos": [26, 474],
|
||||||
26,
|
"size": [315, 98],
|
||||||
474
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
98
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -621,36 +480,27 @@
|
|||||||
"name": "MODEL",
|
"name": "MODEL",
|
||||||
"type": "MODEL",
|
"type": "MODEL",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [1]
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"localized_name": "CLIP",
|
"localized_name": "CLIP",
|
||||||
"name": "CLIP",
|
"name": "CLIP",
|
||||||
"type": "CLIP",
|
"type": "CLIP",
|
||||||
"slot_index": 1,
|
"slot_index": 1,
|
||||||
"links": [
|
"links": [3, 5]
|
||||||
3,
|
|
||||||
5
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"localized_name": "VAE",
|
"localized_name": "VAE",
|
||||||
"name": "VAE",
|
"name": "VAE",
|
||||||
"type": "VAE",
|
"type": "VAE",
|
||||||
"slot_index": 2,
|
"slot_index": 2,
|
||||||
"links": [
|
"links": [8]
|
||||||
8
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CheckpointLoaderSimple"
|
"Node name for S&R": "CheckpointLoaderSimple"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["v1-5-pruned-emaonly-fp16.safetensors"]
|
||||||
"v1-5-pruned-emaonly-fp16.safetensors"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"groups": [],
|
"groups": [],
|
||||||
@@ -713,4 +563,4 @@
|
|||||||
"frontendVersion": "1.24.0-1"
|
"frontendVersion": "1.24.0-1"
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,30 +7,17 @@
|
|||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"type": "8bfe4227-f272-49e1-a892-0a972a86867c",
|
"type": "8bfe4227-f272-49e1-a892-0a972a86867c",
|
||||||
"pos": [
|
"pos": [-317, -336],
|
||||||
-317,
|
"size": [210, 58],
|
||||||
-336
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
210,
|
|
||||||
58
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
"inputs": [],
|
"inputs": [],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"properties": {
|
"properties": {
|
||||||
"proxyWidgets": [
|
"proxyWidgets": [["-1", "batch_size"]]
|
||||||
[
|
|
||||||
"-1",
|
|
||||||
"batch_size"
|
|
||||||
]
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [1]
|
||||||
1
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -51,34 +38,19 @@
|
|||||||
"name": "New Subgraph",
|
"name": "New Subgraph",
|
||||||
"inputNode": {
|
"inputNode": {
|
||||||
"id": -10,
|
"id": -10,
|
||||||
"bounding": [
|
"bounding": [-562, -358, 120, 60]
|
||||||
-562,
|
|
||||||
-358,
|
|
||||||
120,
|
|
||||||
60
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"outputNode": {
|
"outputNode": {
|
||||||
"id": -20,
|
"id": -20,
|
||||||
"bounding": [
|
"bounding": [-52, -358, 120, 40]
|
||||||
-52,
|
|
||||||
-358,
|
|
||||||
120,
|
|
||||||
40
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"id": "b4a8bc2a-8e9f-41aa-938d-c567a11d2c00",
|
"id": "b4a8bc2a-8e9f-41aa-938d-c567a11d2c00",
|
||||||
"name": "batch_size",
|
"name": "batch_size",
|
||||||
"type": "INT",
|
"type": "INT",
|
||||||
"linkIds": [
|
"linkIds": [1],
|
||||||
1
|
"pos": [-462, -338]
|
||||||
],
|
|
||||||
"pos": [
|
|
||||||
-462,
|
|
||||||
-338
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
@@ -87,14 +59,8 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"type": "EmptyLatentImage",
|
"type": "EmptyLatentImage",
|
||||||
"pos": [
|
"pos": [-382, -376],
|
||||||
-382,
|
"size": [270, 106],
|
||||||
-376
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
270,
|
|
||||||
106
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -120,11 +86,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "EmptyLatentImage"
|
"Node name for S&R": "EmptyLatentImage"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [512, 512, 1]
|
||||||
512,
|
|
||||||
512,
|
|
||||||
1
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"groups": [],
|
"groups": [],
|
||||||
@@ -147,4 +109,4 @@
|
|||||||
"frontendVersion": "1.35.1"
|
"frontendVersion": "1.35.1"
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 11,
|
"id": 11,
|
||||||
"type": "422723e8-4bf6-438c-823f-881ca81acead",
|
"type": "422723e8-4bf6-438c-823f-881ca81acead",
|
||||||
"pos": [
|
"pos": [791.59912109375, 386.13336181640625],
|
||||||
791.59912109375,
|
"size": [210, 202],
|
||||||
386.13336181640625
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
210,
|
|
||||||
202
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -48,10 +42,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [
|
"widgets_values": ["", ""]
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -72,30 +63,18 @@
|
|||||||
"name": "New Subgraph",
|
"name": "New Subgraph",
|
||||||
"inputNode": {
|
"inputNode": {
|
||||||
"id": -10,
|
"id": -10,
|
||||||
"bounding": [
|
"bounding": [481.59912109375, 379.13336181640625, 120, 160]
|
||||||
481.59912109375,
|
|
||||||
379.13336181640625,
|
|
||||||
120,
|
|
||||||
160
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"outputNode": {
|
"outputNode": {
|
||||||
"id": -20,
|
"id": -20,
|
||||||
"bounding": [
|
"bounding": [1121.59912109375, 379.13336181640625, 128.6640625, 60]
|
||||||
1121.59912109375,
|
|
||||||
379.13336181640625,
|
|
||||||
128.6640625,
|
|
||||||
60
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"id": "0f07c10e-5705-4764-9b24-b69606c6dbcc",
|
"id": "0f07c10e-5705-4764-9b24-b69606c6dbcc",
|
||||||
"name": "text",
|
"name": "text",
|
||||||
"type": "STRING",
|
"type": "STRING",
|
||||||
"linkIds": [
|
"linkIds": [10],
|
||||||
10
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 399.13336181640625
|
"1": 399.13336181640625
|
||||||
@@ -105,9 +84,7 @@
|
|||||||
"id": "736e5a03-0f7f-4e48-93e4-fd66ea6c30f1",
|
"id": "736e5a03-0f7f-4e48-93e4-fd66ea6c30f1",
|
||||||
"name": "text_1",
|
"name": "text_1",
|
||||||
"type": "STRING",
|
"type": "STRING",
|
||||||
"linkIds": [
|
"linkIds": [11],
|
||||||
11
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 419.13336181640625
|
"1": 419.13336181640625
|
||||||
@@ -117,9 +94,7 @@
|
|||||||
"id": "b62e7a0b-cc7e-4ca5-a4e1-c81607a13f58",
|
"id": "b62e7a0b-cc7e-4ca5-a4e1-c81607a13f58",
|
||||||
"name": "model",
|
"name": "model",
|
||||||
"type": "MODEL",
|
"type": "MODEL",
|
||||||
"linkIds": [
|
"linkIds": [13],
|
||||||
13
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 439.13336181640625
|
"1": 439.13336181640625
|
||||||
@@ -129,9 +104,7 @@
|
|||||||
"id": "7a2628da-4879-4f82-a7d3-7b1c00db50a5",
|
"id": "7a2628da-4879-4f82-a7d3-7b1c00db50a5",
|
||||||
"name": "positive",
|
"name": "positive",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"linkIds": [
|
"linkIds": [14],
|
||||||
14
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 459.13336181640625
|
"1": 459.13336181640625
|
||||||
@@ -141,9 +114,7 @@
|
|||||||
"id": "651cf4ad-e8bf-47f6-b181-8f8aeacd6669",
|
"id": "651cf4ad-e8bf-47f6-b181-8f8aeacd6669",
|
||||||
"name": "negative",
|
"name": "negative",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"linkIds": [
|
"linkIds": [15],
|
||||||
15
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 479.13336181640625
|
"1": 479.13336181640625
|
||||||
@@ -153,9 +124,7 @@
|
|||||||
"id": "c41765ea-61ef-4a77-8cc6-74113903078f",
|
"id": "c41765ea-61ef-4a77-8cc6-74113903078f",
|
||||||
"name": "latent_image",
|
"name": "latent_image",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"linkIds": [
|
"linkIds": [16],
|
||||||
16
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 499.13336181640625
|
"1": 499.13336181640625
|
||||||
@@ -167,9 +136,7 @@
|
|||||||
"id": "55dd1505-12bd-4cb4-8e75-031a97bb4387",
|
"id": "55dd1505-12bd-4cb4-8e75-031a97bb4387",
|
||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"linkIds": [
|
"linkIds": [12],
|
||||||
12
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 1141.59912109375,
|
"0": 1141.59912109375,
|
||||||
"1": 399.13336181640625
|
"1": 399.13336181640625
|
||||||
@@ -181,14 +148,8 @@
|
|||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [661.59912109375, 314.13336181640625],
|
||||||
661.59912109375,
|
"size": [400, 200],
|
||||||
314.13336181640625
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
400,
|
|
||||||
200
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -220,21 +181,13 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [""]
|
||||||
""
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 11,
|
"id": 11,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [668.755859375, 571.7766723632812],
|
||||||
668.755859375,
|
"size": [400, 200],
|
||||||
571.7766723632812
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
400,
|
|
||||||
200
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 2,
|
"order": 2,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -260,29 +213,19 @@
|
|||||||
"localized_name": "CONDITIONING",
|
"localized_name": "CONDITIONING",
|
||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"links": [
|
"links": [12]
|
||||||
12
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [""]
|
||||||
""
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 12,
|
"id": 12,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [671.7379760742188, 1.621593713760376],
|
||||||
671.7379760742188,
|
"size": [270, 262],
|
||||||
1.621593713760376
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
270,
|
|
||||||
262
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -323,15 +266,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "simple", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"simple",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"groups": [],
|
"groups": [],
|
||||||
@@ -401,12 +336,9 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 0.9581355200690549,
|
"scale": 0.9581355200690549,
|
||||||
"offset": [
|
"offset": [184.687451089395, 80.38288288288285]
|
||||||
184.687451089395,
|
|
||||||
80.38288288288285
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"frontendVersion": "1.24.1"
|
"frontendVersion": "1.24.1"
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 11,
|
"id": 11,
|
||||||
"type": "422723e8-4bf6-438c-823f-881ca81acead",
|
"type": "422723e8-4bf6-438c-823f-881ca81acead",
|
||||||
"pos": [
|
"pos": [400, 300],
|
||||||
400,
|
"size": [210, 168],
|
||||||
300
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
210,
|
|
||||||
168
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -47,9 +41,7 @@
|
|||||||
],
|
],
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"widgets_values": [
|
"widgets_values": [""]
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -70,30 +62,18 @@
|
|||||||
"name": "New Subgraph",
|
"name": "New Subgraph",
|
||||||
"inputNode": {
|
"inputNode": {
|
||||||
"id": -10,
|
"id": -10,
|
||||||
"bounding": [
|
"bounding": [481.59912109375, 379.13336181640625, 120, 160]
|
||||||
481.59912109375,
|
|
||||||
379.13336181640625,
|
|
||||||
120,
|
|
||||||
160
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"outputNode": {
|
"outputNode": {
|
||||||
"id": -20,
|
"id": -20,
|
||||||
"bounding": [
|
"bounding": [1121.59912109375, 379.13336181640625, 120, 40]
|
||||||
1121.59912109375,
|
|
||||||
379.13336181640625,
|
|
||||||
120,
|
|
||||||
40
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"id": "0f07c10e-5705-4764-9b24-b69606c6dbcc",
|
"id": "0f07c10e-5705-4764-9b24-b69606c6dbcc",
|
||||||
"name": "text",
|
"name": "text",
|
||||||
"type": "STRING",
|
"type": "STRING",
|
||||||
"linkIds": [
|
"linkIds": [10],
|
||||||
10
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 399.13336181640625
|
"1": 399.13336181640625
|
||||||
@@ -103,9 +83,7 @@
|
|||||||
"id": "214a5060-24dd-4299-ab78-8027dc5b9c59",
|
"id": "214a5060-24dd-4299-ab78-8027dc5b9c59",
|
||||||
"name": "clip",
|
"name": "clip",
|
||||||
"type": "CLIP",
|
"type": "CLIP",
|
||||||
"linkIds": [
|
"linkIds": [11],
|
||||||
11
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 419.13336181640625
|
"1": 419.13336181640625
|
||||||
@@ -115,9 +93,7 @@
|
|||||||
"id": "8ab94c5d-e7df-433c-9177-482a32340552",
|
"id": "8ab94c5d-e7df-433c-9177-482a32340552",
|
||||||
"name": "model",
|
"name": "model",
|
||||||
"type": "MODEL",
|
"type": "MODEL",
|
||||||
"linkIds": [
|
"linkIds": [12],
|
||||||
12
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 439.13336181640625
|
"1": 439.13336181640625
|
||||||
@@ -127,9 +103,7 @@
|
|||||||
"id": "8a4cd719-8c67-473b-9b44-ac0582d02641",
|
"id": "8a4cd719-8c67-473b-9b44-ac0582d02641",
|
||||||
"name": "positive",
|
"name": "positive",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"linkIds": [
|
"linkIds": [13],
|
||||||
13
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 459.13336181640625
|
"1": 459.13336181640625
|
||||||
@@ -139,9 +113,7 @@
|
|||||||
"id": "a78d6b3a-ad40-4300-b0a5-2cdbdb8dc135",
|
"id": "a78d6b3a-ad40-4300-b0a5-2cdbdb8dc135",
|
||||||
"name": "negative",
|
"name": "negative",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"linkIds": [
|
"linkIds": [14],
|
||||||
14
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 479.13336181640625
|
"1": 479.13336181640625
|
||||||
@@ -151,9 +123,7 @@
|
|||||||
"id": "4c7abe0c-902d-49ef-a5b0-cbf02b50b693",
|
"id": "4c7abe0c-902d-49ef-a5b0-cbf02b50b693",
|
||||||
"name": "latent_image",
|
"name": "latent_image",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"linkIds": [
|
"linkIds": [15],
|
||||||
15
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 499.13336181640625
|
"1": 499.13336181640625
|
||||||
@@ -166,14 +136,8 @@
|
|||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [661.59912109375, 314.13336181640625],
|
||||||
661.59912109375,
|
"size": [400, 200],
|
||||||
314.13336181640625
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
400,
|
|
||||||
200
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -205,21 +169,13 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [""]
|
||||||
""
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 11,
|
"id": 11,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [674.1234741210938, 570.5839233398438],
|
||||||
674.1234741210938,
|
"size": [270, 262],
|
||||||
570.5839233398438
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
270,
|
|
||||||
262
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -260,15 +216,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "KSampler"
|
"Node name for S&R": "KSampler"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize", 20, 8, "euler", "simple", 1]
|
||||||
0,
|
|
||||||
"randomize",
|
|
||||||
20,
|
|
||||||
8,
|
|
||||||
"euler",
|
|
||||||
"simple",
|
|
||||||
1
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"groups": [],
|
"groups": [],
|
||||||
@@ -330,12 +278,9 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 0.9581355200690549,
|
"scale": 0.9581355200690549,
|
||||||
"offset": [
|
"offset": [258.6405769416877, 147.17927927927929]
|
||||||
258.6405769416877,
|
|
||||||
147.17927927927929
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"frontendVersion": "1.24.1"
|
"frontendVersion": "1.24.1"
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 11,
|
"id": 11,
|
||||||
"type": "422723e8-4bf6-438c-823f-881ca81acead",
|
"type": "422723e8-4bf6-438c-823f-881ca81acead",
|
||||||
"pos": [
|
"pos": [791.59912109375, 386.13336181640625],
|
||||||
791.59912109375,
|
"size": [140, 26],
|
||||||
386.13336181640625
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
140,
|
|
||||||
26
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -48,30 +42,18 @@
|
|||||||
"name": "New Subgraph",
|
"name": "New Subgraph",
|
||||||
"inputNode": {
|
"inputNode": {
|
||||||
"id": -10,
|
"id": -10,
|
||||||
"bounding": [
|
"bounding": [481.59912109375, 379.13336181640625, 120, 60]
|
||||||
481.59912109375,
|
|
||||||
379.13336181640625,
|
|
||||||
120,
|
|
||||||
60
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"outputNode": {
|
"outputNode": {
|
||||||
"id": -20,
|
"id": -20,
|
||||||
"bounding": [
|
"bounding": [1121.59912109375, 379.13336181640625, 120, 40]
|
||||||
1121.59912109375,
|
|
||||||
379.13336181640625,
|
|
||||||
120,
|
|
||||||
40
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"id": "79e69fca-ad12-499b-8d9b-9f1656b85354",
|
"id": "79e69fca-ad12-499b-8d9b-9f1656b85354",
|
||||||
"name": "clip",
|
"name": "clip",
|
||||||
"type": "CLIP",
|
"type": "CLIP",
|
||||||
"linkIds": [
|
"linkIds": [10],
|
||||||
10
|
|
||||||
],
|
|
||||||
"pos": {
|
"pos": {
|
||||||
"0": 581.59912109375,
|
"0": 581.59912109375,
|
||||||
"1": 399.13336181640625
|
"1": 399.13336181640625
|
||||||
@@ -84,14 +66,8 @@
|
|||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [661.59912109375, 314.13336181640625],
|
||||||
661.59912109375,
|
"size": [400, 200],
|
||||||
314.13336181640625
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
400,
|
|
||||||
200
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -114,9 +90,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "CLIPTextEncode"
|
"Node name for S&R": "CLIPTextEncode"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [""]
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"groups": [],
|
"groups": [],
|
||||||
@@ -143,11 +117,8 @@
|
|||||||
"VHS_KeepIntermediate": true,
|
"VHS_KeepIntermediate": true,
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 0.9581355200690549,
|
"scale": 0.9581355200690549,
|
||||||
"offset": [
|
"offset": [258.6405769416877, 147.17927927927929]
|
||||||
258.6405769416877,
|
|
||||||
147.17927927927929
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 4,
|
"id": 4,
|
||||||
"type": "CheckpointLoaderSimple",
|
"type": "CheckpointLoaderSimple",
|
||||||
"pos": [
|
"pos": [60, 200],
|
||||||
60,
|
"size": [315, 98],
|
||||||
200
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
98
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -24,26 +18,19 @@
|
|||||||
"name": "MODEL",
|
"name": "MODEL",
|
||||||
"type": "MODEL",
|
"type": "MODEL",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [1]
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "CLIP",
|
"name": "CLIP",
|
||||||
"type": "CLIP",
|
"type": "CLIP",
|
||||||
"slot_index": 1,
|
"slot_index": 1,
|
||||||
"links": [
|
"links": [3, 5]
|
||||||
3,
|
|
||||||
5
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "VAE",
|
"name": "VAE",
|
||||||
"type": "VAE",
|
"type": "VAE",
|
||||||
"slot_index": 2,
|
"slot_index": 2,
|
||||||
"links": [
|
"links": [8]
|
||||||
8
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -58,21 +45,13 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["v1-5-pruned-emaonly-fp16.safetensors"]
|
||||||
"v1-5-pruned-emaonly-fp16.safetensors"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"type": "KSampler",
|
"type": "KSampler",
|
||||||
"pos": [
|
"pos": [870, 170],
|
||||||
870,
|
"size": [315, 474],
|
||||||
170
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
474
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 4,
|
"order": 4,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -103,9 +82,7 @@
|
|||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [7]
|
||||||
7
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -126,14 +103,8 @@
|
|||||||
{
|
{
|
||||||
"id": 8,
|
"id": 8,
|
||||||
"type": "VAEDecode",
|
"type": "VAEDecode",
|
||||||
"pos": [
|
"pos": [975, 700],
|
||||||
975,
|
"size": [210, 46],
|
||||||
700
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
210,
|
|
||||||
46
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 5,
|
"order": 5,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -167,14 +138,8 @@
|
|||||||
{
|
{
|
||||||
"id": 7,
|
"id": 7,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [410, 410],
|
||||||
410,
|
"size": [425.27801513671875, 180.6060791015625],
|
||||||
410
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
425.27801513671875,
|
|
||||||
180.6060791015625
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 3,
|
"order": 3,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -190,9 +155,7 @@
|
|||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [6]
|
||||||
6
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -200,23 +163,15 @@
|
|||||||
"cnr_id": "comfy-core",
|
"cnr_id": "comfy-core",
|
||||||
"ver": "0.3.65"
|
"ver": "0.3.65"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["text, watermark"],
|
||||||
"text, watermark"
|
|
||||||
],
|
|
||||||
"color": "#223",
|
"color": "#223",
|
||||||
"bgcolor": "#335"
|
"bgcolor": "#335"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 5,
|
"id": 5,
|
||||||
"type": "EmptyLatentImage",
|
"type": "EmptyLatentImage",
|
||||||
"pos": [
|
"pos": [520, 690],
|
||||||
520,
|
"size": [315, 106],
|
||||||
690
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
106
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -226,9 +181,7 @@
|
|||||||
"name": "LATENT",
|
"name": "LATENT",
|
||||||
"type": "LATENT",
|
"type": "LATENT",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [2]
|
||||||
2
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -236,23 +189,13 @@
|
|||||||
"cnr_id": "comfy-core",
|
"cnr_id": "comfy-core",
|
||||||
"ver": "0.3.65"
|
"ver": "0.3.65"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [512, 512, 1]
|
||||||
512,
|
|
||||||
512,
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 6,
|
"id": 6,
|
||||||
"type": "CLIPTextEncode",
|
"type": "CLIPTextEncode",
|
||||||
"pos": [
|
"pos": [411.21649169921875, 203.68695068359375],
|
||||||
411.21649169921875,
|
"size": [422.84503173828125, 164.31304931640625],
|
||||||
203.68695068359375
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
422.84503173828125,
|
|
||||||
164.31304931640625
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 2,
|
"order": 2,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -268,9 +211,7 @@
|
|||||||
"name": "CONDITIONING",
|
"name": "CONDITIONING",
|
||||||
"type": "CONDITIONING",
|
"type": "CONDITIONING",
|
||||||
"slot_index": 0,
|
"slot_index": 0,
|
||||||
"links": [
|
"links": [4]
|
||||||
4
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -286,81 +227,20 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [
|
||||||
[
|
[1, 4, 0, 3, 0, "MODEL"],
|
||||||
1,
|
[2, 5, 0, 3, 3, "LATENT"],
|
||||||
4,
|
[3, 4, 1, 6, 0, "CLIP"],
|
||||||
0,
|
[4, 6, 0, 3, 1, "CONDITIONING"],
|
||||||
3,
|
[5, 4, 1, 7, 0, "CLIP"],
|
||||||
0,
|
[6, 7, 0, 3, 2, "CONDITIONING"],
|
||||||
"MODEL"
|
[7, 3, 0, 8, 0, "LATENT"],
|
||||||
],
|
[8, 4, 2, 8, 1, "VAE"]
|
||||||
[
|
|
||||||
2,
|
|
||||||
5,
|
|
||||||
0,
|
|
||||||
3,
|
|
||||||
3,
|
|
||||||
"LATENT"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
3,
|
|
||||||
4,
|
|
||||||
1,
|
|
||||||
6,
|
|
||||||
0,
|
|
||||||
"CLIP"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
4,
|
|
||||||
6,
|
|
||||||
0,
|
|
||||||
3,
|
|
||||||
1,
|
|
||||||
"CONDITIONING"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
5,
|
|
||||||
4,
|
|
||||||
1,
|
|
||||||
7,
|
|
||||||
0,
|
|
||||||
"CLIP"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
6,
|
|
||||||
7,
|
|
||||||
0,
|
|
||||||
3,
|
|
||||||
2,
|
|
||||||
"CONDITIONING"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
7,
|
|
||||||
3,
|
|
||||||
0,
|
|
||||||
8,
|
|
||||||
0,
|
|
||||||
"LATENT"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
8,
|
|
||||||
4,
|
|
||||||
2,
|
|
||||||
8,
|
|
||||||
1,
|
|
||||||
"VAE"
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"title": "Step 1 - Load model",
|
"title": "Step 1 - Load model",
|
||||||
"bounding": [
|
"bounding": [50, 130, 335, 181.60000610351562],
|
||||||
50,
|
|
||||||
130,
|
|
||||||
335,
|
|
||||||
181.60000610351562
|
|
||||||
],
|
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
"font_size": 24,
|
"font_size": 24,
|
||||||
"flags": {}
|
"flags": {}
|
||||||
@@ -368,12 +248,7 @@
|
|||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"title": "Step 3 - Image size",
|
"title": "Step 3 - Image size",
|
||||||
"bounding": [
|
"bounding": [510, 620, 335, 189.60000610351562],
|
||||||
510,
|
|
||||||
620,
|
|
||||||
335,
|
|
||||||
189.60000610351562
|
|
||||||
],
|
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
"font_size": 24,
|
"font_size": 24,
|
||||||
"flags": {}
|
"flags": {}
|
||||||
@@ -381,12 +256,7 @@
|
|||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"title": "Step 2 - Prompt",
|
"title": "Step 2 - Prompt",
|
||||||
"bounding": [
|
"bounding": [400, 130, 445.27801513671875, 467.2060852050781],
|
||||||
400,
|
|
||||||
130,
|
|
||||||
445.27801513671875,
|
|
||||||
467.2060852050781
|
|
||||||
],
|
|
||||||
"color": "#3f789e",
|
"color": "#3f789e",
|
||||||
"font_size": 24,
|
"font_size": 24,
|
||||||
"flags": {}
|
"flags": {}
|
||||||
@@ -396,10 +266,7 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 0.44218252181616574,
|
"scale": 0.44218252181616574,
|
||||||
"offset": [
|
"offset": [-666.5670907104311, -2227.894644048147]
|
||||||
-666.5670907104311,
|
|
||||||
-2227.894644048147
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"frontendVersion": "1.35.3",
|
"frontendVersion": "1.35.3",
|
||||||
"VHS_latentpreview": false,
|
"VHS_latentpreview": false,
|
||||||
@@ -409,4 +276,4 @@
|
|||||||
"workflowRendererVersion": "LG"
|
"workflowRendererVersion": "LG"
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1,166 @@
|
|||||||
{"id":"4412323e-2509-4258-8abc-68ddeea8f9e1","revision":0,"last_node_id":39,"last_link_id":29,"nodes":[{"id":37,"type":"KSampler","pos":[3635.923095703125,870.237548828125],"size":[428,437],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"MODEL","link":null},{"localized_name":"positive","name":"positive","type":"CONDITIONING","link":null},{"localized_name":"negative","name":"negative","type":"CONDITIONING","link":null},{"localized_name":"latent_image","name":"latent_image","type":"LATENT","link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"sampler_name","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"scheduler","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"denoise","name":"denoise","type":"FLOAT","widget":{"name":"denoise"},"link":null}],"outputs":[{"localized_name":"LATENT","name":"LATENT","type":"LATENT","links":null}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[0,"randomize",20,8,"euler","simple",1]},{"id":38,"type":"VAEDecode","pos":[4164.01611328125,925.5230712890625],"size":[193.25,107],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"samples","name":"samples","type":"LATENT","link":null},{"localized_name":"vae","name":"vae","type":"VAE","link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":null}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":39,"type":"CLIPTextEncode","pos":[3259.289794921875,927.2508544921875],"size":[239.9375,155],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"clip","name":"clip","type":"CLIP","link":null},{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":null}],"outputs":[{"localized_name":"CONDITIONING","name":"CONDITIONING","type":"CONDITIONING","links":null}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":[""]}],"links":[],"groups":[],"config":{},"extra":{"ds":{"scale":1.1576250000000001,"offset":[-2808.366467322067,-478.34316506594797]}},"version":0.4}
|
{
|
||||||
|
"id": "4412323e-2509-4258-8abc-68ddeea8f9e1",
|
||||||
|
"revision": 0,
|
||||||
|
"last_node_id": 39,
|
||||||
|
"last_link_id": 29,
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"type": "KSampler",
|
||||||
|
"pos": [3635.923095703125, 870.237548828125],
|
||||||
|
"size": [428, 437],
|
||||||
|
"flags": {},
|
||||||
|
"order": 0,
|
||||||
|
"mode": 0,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"localized_name": "model",
|
||||||
|
"name": "model",
|
||||||
|
"type": "MODEL",
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "positive",
|
||||||
|
"name": "positive",
|
||||||
|
"type": "CONDITIONING",
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "negative",
|
||||||
|
"name": "negative",
|
||||||
|
"type": "CONDITIONING",
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "latent_image",
|
||||||
|
"name": "latent_image",
|
||||||
|
"type": "LATENT",
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "seed",
|
||||||
|
"name": "seed",
|
||||||
|
"type": "INT",
|
||||||
|
"widget": { "name": "seed" },
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "steps",
|
||||||
|
"name": "steps",
|
||||||
|
"type": "INT",
|
||||||
|
"widget": { "name": "steps" },
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "cfg",
|
||||||
|
"name": "cfg",
|
||||||
|
"type": "FLOAT",
|
||||||
|
"widget": { "name": "cfg" },
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "sampler_name",
|
||||||
|
"name": "sampler_name",
|
||||||
|
"type": "COMBO",
|
||||||
|
"widget": { "name": "sampler_name" },
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "scheduler",
|
||||||
|
"name": "scheduler",
|
||||||
|
"type": "COMBO",
|
||||||
|
"widget": { "name": "scheduler" },
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "denoise",
|
||||||
|
"name": "denoise",
|
||||||
|
"type": "FLOAT",
|
||||||
|
"widget": { "name": "denoise" },
|
||||||
|
"link": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"localized_name": "LATENT",
|
||||||
|
"name": "LATENT",
|
||||||
|
"type": "LATENT",
|
||||||
|
"links": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": { "Node name for S&R": "KSampler" },
|
||||||
|
"widgets_values": [0, "randomize", 20, 8, "euler", "simple", 1]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 38,
|
||||||
|
"type": "VAEDecode",
|
||||||
|
"pos": [4164.01611328125, 925.5230712890625],
|
||||||
|
"size": [193.25, 107],
|
||||||
|
"flags": {},
|
||||||
|
"order": 1,
|
||||||
|
"mode": 0,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"localized_name": "samples",
|
||||||
|
"name": "samples",
|
||||||
|
"type": "LATENT",
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{ "localized_name": "vae", "name": "vae", "type": "VAE", "link": null }
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"localized_name": "IMAGE",
|
||||||
|
"name": "IMAGE",
|
||||||
|
"type": "IMAGE",
|
||||||
|
"links": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": { "Node name for S&R": "VAEDecode" }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"type": "CLIPTextEncode",
|
||||||
|
"pos": [3259.289794921875, 927.2508544921875],
|
||||||
|
"size": [239.9375, 155],
|
||||||
|
"flags": {},
|
||||||
|
"order": 2,
|
||||||
|
"mode": 0,
|
||||||
|
"inputs": [
|
||||||
|
{
|
||||||
|
"localized_name": "clip",
|
||||||
|
"name": "clip",
|
||||||
|
"type": "CLIP",
|
||||||
|
"link": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"localized_name": "text",
|
||||||
|
"name": "text",
|
||||||
|
"type": "STRING",
|
||||||
|
"widget": { "name": "text" },
|
||||||
|
"link": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"localized_name": "CONDITIONING",
|
||||||
|
"name": "CONDITIONING",
|
||||||
|
"type": "CONDITIONING",
|
||||||
|
"links": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": { "Node name for S&R": "CLIPTextEncode" },
|
||||||
|
"widgets_values": [""]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"links": [],
|
||||||
|
"groups": [],
|
||||||
|
"config": {},
|
||||||
|
"extra": {
|
||||||
|
"ds": {
|
||||||
|
"scale": 1.1576250000000001,
|
||||||
|
"offset": [-2808.366467322067, -478.34316506594797]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version": 0.4
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,14 +7,8 @@
|
|||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"type": "LoadAudio",
|
"type": "LoadAudio",
|
||||||
"pos": [
|
"pos": [41.52964782714844, 16.930862426757812],
|
||||||
41.52964782714844,
|
"size": [444, 125],
|
||||||
16.930862426757812
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
444,
|
|
||||||
125
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -29,23 +23,13 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "LoadAudio"
|
"Node name for S&R": "LoadAudio"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [null, null, ""]
|
||||||
null,
|
|
||||||
null,
|
|
||||||
""
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"type": "LoadVideo",
|
"type": "LoadVideo",
|
||||||
"pos": [
|
"pos": [502.28570556640625, 16.857147216796875],
|
||||||
502.28570556640625,
|
"size": [444, 525],
|
||||||
16.857147216796875
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
444,
|
|
||||||
525
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -60,22 +44,13 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "LoadVideo"
|
"Node name for S&R": "LoadVideo"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [null, "image"]
|
||||||
null,
|
|
||||||
"image"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 3,
|
"id": 3,
|
||||||
"type": "DevToolsLoadAnimatedImageTest",
|
"type": "DevToolsLoadAnimatedImageTest",
|
||||||
"pos": [
|
"pos": [41.71427917480469, 188.0000457763672],
|
||||||
41.71427917480469,
|
"size": [444, 553],
|
||||||
188.0000457763672
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
444,
|
|
||||||
553
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 2,
|
"order": 2,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -95,22 +70,13 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "DevToolsLoadAnimatedImageTest"
|
"Node name for S&R": "DevToolsLoadAnimatedImageTest"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [null, "image"]
|
||||||
null,
|
|
||||||
"image"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 5,
|
"id": 5,
|
||||||
"type": "LoadImage",
|
"type": "LoadImage",
|
||||||
"pos": [
|
"pos": [958.285888671875, 16.57145118713379],
|
||||||
958.285888671875,
|
"size": [444, 553],
|
||||||
16.57145118713379
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
444,
|
|
||||||
553
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 3,
|
"order": 3,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -130,22 +96,13 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "LoadImage"
|
"Node name for S&R": "LoadImage"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [null, "image"]
|
||||||
null,
|
|
||||||
"image"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 6,
|
"id": 6,
|
||||||
"type": "LoadImageMask",
|
"type": "LoadImageMask",
|
||||||
"pos": [
|
"pos": [503.4285888671875, 588],
|
||||||
503.4285888671875,
|
"size": [444, 563],
|
||||||
588
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
444,
|
|
||||||
563
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 4,
|
"order": 4,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -160,23 +117,13 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "LoadImageMask"
|
"Node name for S&R": "LoadImageMask"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [null, "alpha", "image"]
|
||||||
null,
|
|
||||||
"alpha",
|
|
||||||
"image"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 7,
|
"id": 7,
|
||||||
"type": "LoadImageOutput",
|
"type": "LoadImageOutput",
|
||||||
"pos": [
|
"pos": [965.1429443359375, 612],
|
||||||
965.1429443359375,
|
"size": [444, 553],
|
||||||
612
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
444,
|
|
||||||
553
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 5,
|
"order": 5,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -196,12 +143,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "LoadImageOutput"
|
"Node name for S&R": "LoadImageOutput"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [null, false, "refresh", "image"]
|
||||||
null,
|
|
||||||
false,
|
|
||||||
"refresh",
|
|
||||||
"image"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -210,12 +152,9 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"frontendVersion": "1.28.3"
|
"frontendVersion": "1.28.3"
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
{
|
{
|
||||||
"id": 11,
|
"id": 11,
|
||||||
"type": "DevToolsNodeWithBooleanInput",
|
"type": "DevToolsNodeWithBooleanInput",
|
||||||
"pos": [
|
"pos": [0, 30],
|
||||||
0,
|
"size": [315, 58],
|
||||||
30
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
58
|
|
||||||
],
|
|
||||||
"flags": {
|
"flags": {
|
||||||
"collapsed": false
|
"collapsed": false
|
||||||
},
|
},
|
||||||
@@ -23,9 +17,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "DevToolsNodeWithBooleanInput"
|
"Node name for S&R": "DevToolsNodeWithBooleanInput"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [false]
|
||||||
false
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"type": "LoadImage",
|
"type": "LoadImage",
|
||||||
"pos": [
|
"pos": [50, 50],
|
||||||
50,
|
"size": [315, 314],
|
||||||
50
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
314
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 0,
|
"order": 0,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -32,10 +26,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "LoadImage"
|
"Node name for S&R": "LoadImage"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": ["example.png", "image"]
|
||||||
"example.png",
|
|
||||||
"image"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
{
|
{
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"type": "DevToolsNodeWithSeedInput",
|
"type": "DevToolsNodeWithSeedInput",
|
||||||
"pos": [
|
"pos": [20, 50],
|
||||||
20,
|
"size": [315, 82],
|
||||||
50
|
|
||||||
],
|
|
||||||
"size": [
|
|
||||||
315,
|
|
||||||
82
|
|
||||||
],
|
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"order": 1,
|
"order": 1,
|
||||||
"mode": 0,
|
"mode": 0,
|
||||||
@@ -21,10 +15,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"Node name for S&R": "DevToolsNodeWithSeedInput"
|
"Node name for S&R": "DevToolsNodeWithSeedInput"
|
||||||
},
|
},
|
||||||
"widgets_values": [
|
"widgets_values": [0, "randomize"]
|
||||||
0,
|
|
||||||
"randomize"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [],
|
"links": [],
|
||||||
@@ -33,11 +24,8 @@
|
|||||||
"extra": {
|
"extra": {
|
||||||
"ds": {
|
"ds": {
|
||||||
"scale": 1,
|
"scale": 1,
|
||||||
"offset": [
|
"offset": [0, 0]
|
||||||
0,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": 0.4
|
"version": 0.4
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,5 @@
|
|||||||
"noUnusedParameters": true,
|
"noUnusedParameters": true,
|
||||||
"resolveJsonModule": true
|
"resolveJsonModule": true
|
||||||
},
|
},
|
||||||
"include": [
|
"include": ["**/*.ts"]
|
||||||
"**/*.ts",
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,5 @@
|
|||||||
"noUnusedParameters": true,
|
"noUnusedParameters": true,
|
||||||
"resolveJsonModule": true
|
"resolveJsonModule": true
|
||||||
},
|
},
|
||||||
"include": [
|
"include": ["**/*.ts"]
|
||||||
"**/*.ts"
|
}
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -17,4 +17,4 @@
|
|||||||
"lib": "@/lib"
|
"lib": "@/lib"
|
||||||
},
|
},
|
||||||
"iconLibrary": "lucide"
|
"iconLibrary": "lucide"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,19 +17,19 @@ sequenceDiagram
|
|||||||
|
|
||||||
Frontend->>WebSocket: Connect
|
Frontend->>WebSocket: Connect
|
||||||
WebSocket-->>Frontend: Connection established
|
WebSocket-->>Frontend: Connection established
|
||||||
|
|
||||||
Note over Frontend: First message must be feature flags
|
Note over Frontend: First message must be feature flags
|
||||||
Frontend->>WebSocket: Send client feature flags
|
Frontend->>WebSocket: Send client feature flags
|
||||||
WebSocket->>Backend: Receive feature flags
|
WebSocket->>Backend: Receive feature flags
|
||||||
Backend->>FeatureFlags Module: Store client capabilities
|
Backend->>FeatureFlags Module: Store client capabilities
|
||||||
|
|
||||||
Backend->>FeatureFlags Module: Get server features
|
Backend->>FeatureFlags Module: Get server features
|
||||||
FeatureFlags Module-->>Backend: Return server capabilities
|
FeatureFlags Module-->>Backend: Return server capabilities
|
||||||
Backend->>WebSocket: Send server feature flags
|
Backend->>WebSocket: Send server feature flags
|
||||||
WebSocket-->>Frontend: Receive server features
|
WebSocket-->>Frontend: Receive server features
|
||||||
|
|
||||||
Note over Frontend,Backend: Both sides now know each other's capabilities
|
Note over Frontend,Backend: Both sides now know each other's capabilities
|
||||||
|
|
||||||
Frontend->>Frontend: Store server features
|
Frontend->>Frontend: Store server features
|
||||||
Frontend->>Frontend: Components use useFeatureFlags()
|
Frontend->>Frontend: Components use useFeatureFlags()
|
||||||
```
|
```
|
||||||
@@ -44,15 +44,15 @@ graph TB
|
|||||||
D[useFeatureFlags composable] --> B
|
D[useFeatureFlags composable] --> B
|
||||||
E[Vue Components] --> D
|
E[Vue Components] --> D
|
||||||
end
|
end
|
||||||
|
|
||||||
subgraph Backend
|
subgraph Backend
|
||||||
F[feature_flags.py] --> G[SERVER_FEATURE_FLAGS]
|
F[feature_flags.py] --> G[SERVER_FEATURE_FLAGS]
|
||||||
H[server.py WebSocket] --> F
|
H[server.py WebSocket] --> F
|
||||||
I[Feature Consumers] --> F
|
I[Feature Consumers] --> F
|
||||||
end
|
end
|
||||||
|
|
||||||
C <--> H
|
C <--> H
|
||||||
|
|
||||||
style A fill:#f9f,stroke:#333,stroke-width:2px
|
style A fill:#f9f,stroke:#333,stroke-width:2px
|
||||||
style G fill:#f9f,stroke:#333,stroke-width:2px
|
style G fill:#f9f,stroke:#333,stroke-width:2px
|
||||||
style D fill:#9ff,stroke:#333,stroke-width:2px
|
style D fill:#9ff,stroke:#333,stroke-width:2px
|
||||||
@@ -98,19 +98,19 @@ classDiagram
|
|||||||
+supports_feature(sockets_metadata, sid, feature_name) bool
|
+supports_feature(sockets_metadata, sid, feature_name) bool
|
||||||
+get_connection_feature(sockets_metadata, sid, feature_name, default) Any
|
+get_connection_feature(sockets_metadata, sid, feature_name, default) Any
|
||||||
}
|
}
|
||||||
|
|
||||||
class PromptServer {
|
class PromptServer {
|
||||||
-sockets_metadata: Dict
|
-sockets_metadata: Dict
|
||||||
+websocket_handler()
|
+websocket_handler()
|
||||||
+send()
|
+send()
|
||||||
}
|
}
|
||||||
|
|
||||||
class FeatureConsumer {
|
class FeatureConsumer {
|
||||||
<<interface>>
|
<<interface>>
|
||||||
+check_feature()
|
+check_feature()
|
||||||
+use_feature()
|
+use_feature()
|
||||||
}
|
}
|
||||||
|
|
||||||
PromptServer --> FeatureFlagsModule
|
PromptServer --> FeatureFlagsModule
|
||||||
FeatureConsumer --> FeatureFlagsModule
|
FeatureConsumer --> FeatureFlagsModule
|
||||||
```
|
```
|
||||||
@@ -127,19 +127,19 @@ classDiagram
|
|||||||
+serverSupportsFeature(name) boolean
|
+serverSupportsFeature(name) boolean
|
||||||
+getServerFeature(name, default) T
|
+getServerFeature(name, default) T
|
||||||
}
|
}
|
||||||
|
|
||||||
class useFeatureFlags {
|
class useFeatureFlags {
|
||||||
+serverSupports(name) boolean
|
+serverSupports(name) boolean
|
||||||
+getServerFeature(name, default) T
|
+getServerFeature(name, default) T
|
||||||
+createServerFeatureFlag(name) ComputedRef
|
+createServerFeatureFlag(name) ComputedRef
|
||||||
+extension: ExtensionFlags
|
+extension: ExtensionFlags
|
||||||
}
|
}
|
||||||
|
|
||||||
class VueComponent {
|
class VueComponent {
|
||||||
<<component>>
|
<<component>>
|
||||||
+setup()
|
+setup()
|
||||||
}
|
}
|
||||||
|
|
||||||
ComfyApi <-- useFeatureFlags
|
ComfyApi <-- useFeatureFlags
|
||||||
VueComponent --> useFeatureFlags
|
VueComponent --> useFeatureFlags
|
||||||
```
|
```
|
||||||
@@ -153,12 +153,13 @@ graph LR
|
|||||||
A[Preview Generation] --> B{supports_preview_metadata?}
|
A[Preview Generation] --> B{supports_preview_metadata?}
|
||||||
B -->|Yes| C[Send metadata with preview]
|
B -->|Yes| C[Send metadata with preview]
|
||||||
B -->|No| D[Send preview only]
|
B -->|No| D[Send preview only]
|
||||||
|
|
||||||
C --> E[Enhanced preview with node info]
|
C --> E[Enhanced preview with node info]
|
||||||
D --> F[Basic preview image]
|
D --> F[Basic preview image]
|
||||||
```
|
```
|
||||||
|
|
||||||
**Backend Usage:**
|
**Backend Usage:**
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# Check if client supports preview metadata
|
# Check if client supports preview metadata
|
||||||
if feature_flags.supports_feature(
|
if feature_flags.supports_feature(
|
||||||
@@ -189,13 +190,14 @@ graph TB
|
|||||||
B --> C{File size OK?}
|
B --> C{File size OK?}
|
||||||
C -->|Yes| D[Upload file]
|
C -->|Yes| D[Upload file]
|
||||||
C -->|No| E[Show error]
|
C -->|No| E[Show error]
|
||||||
|
|
||||||
F[Backend] --> G[Set from CLI args]
|
F[Backend] --> G[Set from CLI args]
|
||||||
G --> H[Convert MB to bytes]
|
G --> H[Convert MB to bytes]
|
||||||
H --> I[Include in feature flags]
|
H --> I[Include in feature flags]
|
||||||
```
|
```
|
||||||
|
|
||||||
**Backend Configuration:**
|
**Backend Configuration:**
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# In feature_flags.py
|
# In feature_flags.py
|
||||||
SERVER_FEATURE_FLAGS = {
|
SERVER_FEATURE_FLAGS = {
|
||||||
@@ -205,6 +207,7 @@ SERVER_FEATURE_FLAGS = {
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Frontend Usage:**
|
**Frontend Usage:**
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
const { getServerFeature } = useFeatureFlags()
|
const { getServerFeature } = useFeatureFlags()
|
||||||
const maxUploadSize = getServerFeature('max_upload_size', 100 * 1024 * 1024) // Default 100MB
|
const maxUploadSize = getServerFeature('max_upload_size', 100 * 1024 * 1024) // Default 100MB
|
||||||
@@ -215,10 +218,11 @@ const maxUploadSize = getServerFeature('max_upload_size', 100 * 1024 * 1024) //
|
|||||||
### Frontend Access Patterns
|
### Frontend Access Patterns
|
||||||
|
|
||||||
1. **Direct API access:**
|
1. **Direct API access:**
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// Check boolean feature
|
// Check boolean feature
|
||||||
if (api.serverSupportsFeature('supports_preview_metadata')) {
|
if (api.serverSupportsFeature('supports_preview_metadata')) {
|
||||||
// Feature is supported
|
// Feature is supported
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get feature value with default
|
// Get feature value with default
|
||||||
@@ -226,21 +230,23 @@ const maxSize = api.getServerFeature('max_upload_size', 100 * 1024 * 1024)
|
|||||||
```
|
```
|
||||||
|
|
||||||
2. **Using the composable (recommended for reactive components):**
|
2. **Using the composable (recommended for reactive components):**
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
const { serverSupports, getServerFeature, extension } = useFeatureFlags()
|
const { serverSupports, getServerFeature, extension } = useFeatureFlags()
|
||||||
|
|
||||||
// Check feature support
|
// Check feature support
|
||||||
if (serverSupports('supports_preview_metadata')) {
|
if (serverSupports('supports_preview_metadata')) {
|
||||||
// Use enhanced previews
|
// Use enhanced previews
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use reactive convenience properties (automatically update if flags change)
|
// Use reactive convenience properties (automatically update if flags change)
|
||||||
if (extension.manager.supportsV4.value) {
|
if (extension.manager.supportsV4.value) {
|
||||||
// Use V4 manager API
|
// Use V4 manager API
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Reactive usage in templates:**
|
3. **Reactive usage in templates:**
|
||||||
|
|
||||||
```vue
|
```vue
|
||||||
<template>
|
<template>
|
||||||
<div v-if="featureFlags.extension.manager.supportsV4">
|
<div v-if="featureFlags.extension.manager.supportsV4">
|
||||||
@@ -262,12 +268,12 @@ const featureFlags = useFeatureFlags()
|
|||||||
```python
|
```python
|
||||||
# Check if a specific client supports a feature
|
# Check if a specific client supports a feature
|
||||||
if feature_flags.supports_feature(
|
if feature_flags.supports_feature(
|
||||||
sockets_metadata,
|
sockets_metadata,
|
||||||
client_id,
|
client_id,
|
||||||
"supports_preview_metadata"
|
"supports_preview_metadata"
|
||||||
):
|
):
|
||||||
# Client supports this feature
|
# Client supports this feature
|
||||||
|
|
||||||
# Get feature value with default
|
# Get feature value with default
|
||||||
max_size = feature_flags.get_connection_feature(
|
max_size = feature_flags.get_connection_feature(
|
||||||
sockets_metadata,
|
sockets_metadata,
|
||||||
@@ -282,6 +288,7 @@ max_size = feature_flags.get_connection_feature(
|
|||||||
### Backend
|
### Backend
|
||||||
|
|
||||||
1. **For server capabilities**, add to `SERVER_FEATURE_FLAGS` in `comfy_api/feature_flags.py`:
|
1. **For server capabilities**, add to `SERVER_FEATURE_FLAGS` in `comfy_api/feature_flags.py`:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
SERVER_FEATURE_FLAGS = {
|
SERVER_FEATURE_FLAGS = {
|
||||||
"supports_preview_metadata": True,
|
"supports_preview_metadata": True,
|
||||||
@@ -291,6 +298,7 @@ SERVER_FEATURE_FLAGS = {
|
|||||||
```
|
```
|
||||||
|
|
||||||
2. **Use in your code:**
|
2. **Use in your code:**
|
||||||
|
|
||||||
```python
|
```python
|
||||||
if feature_flags.supports_feature(sockets_metadata, sid, "your_new_feature"):
|
if feature_flags.supports_feature(sockets_metadata, sid, "your_new_feature"):
|
||||||
# Feature-specific code
|
# Feature-specific code
|
||||||
@@ -299,28 +307,34 @@ if feature_flags.supports_feature(sockets_metadata, sid, "your_new_feature"):
|
|||||||
### Frontend
|
### Frontend
|
||||||
|
|
||||||
1. **For client capabilities**, add to `src/config/clientFeatureFlags.json`:
|
1. **For client capabilities**, add to `src/config/clientFeatureFlags.json`:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"supports_preview_metadata": false,
|
"supports_preview_metadata": false,
|
||||||
"your_new_feature": true
|
"your_new_feature": true
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **For extension features**, update the composable to add convenience accessors:
|
2. **For extension features**, update the composable to add convenience accessors:
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// In useFeatureFlags.ts
|
// In useFeatureFlags.ts
|
||||||
const extension = {
|
const extension = {
|
||||||
manager: {
|
manager: {
|
||||||
supportsV4: computed(() => getServerFeature('extension.manager.supports_v4', false))
|
supportsV4: computed(() =>
|
||||||
},
|
getServerFeature('extension.manager.supports_v4', false)
|
||||||
yourExtension: {
|
)
|
||||||
supportsNewFeature: computed(() => getServerFeature('extension.yourExtension.supports_new_feature', false))
|
},
|
||||||
}
|
yourExtension: {
|
||||||
|
supportsNewFeature: computed(() =>
|
||||||
|
getServerFeature('extension.yourExtension.supports_new_feature', false)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
// ... existing returns
|
// ... existing returns
|
||||||
extension
|
extension
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -332,7 +346,7 @@ graph LR
|
|||||||
A --> C[Only frontend supports]
|
A --> C[Only frontend supports]
|
||||||
A --> D[Only backend supports]
|
A --> D[Only backend supports]
|
||||||
A --> E[Neither supports]
|
A --> E[Neither supports]
|
||||||
|
|
||||||
B --> F[Feature enabled]
|
B --> F[Feature enabled]
|
||||||
C --> G[Feature disabled]
|
C --> G[Feature disabled]
|
||||||
D --> H[Feature disabled]
|
D --> H[Feature disabled]
|
||||||
@@ -340,6 +354,7 @@ graph LR
|
|||||||
```
|
```
|
||||||
|
|
||||||
Test your feature flags with different combinations:
|
Test your feature flags with different combinations:
|
||||||
|
|
||||||
- Frontend with flag + Backend with flag = Feature works
|
- Frontend with flag + Backend with flag = Feature works
|
||||||
- Frontend with flag + Backend without = Graceful degradation
|
- Frontend with flag + Backend without = Graceful degradation
|
||||||
- Frontend without + Backend with flag = No feature usage
|
- Frontend without + Backend with flag = No feature usage
|
||||||
@@ -350,13 +365,14 @@ Test your feature flags with different combinations:
|
|||||||
```typescript
|
```typescript
|
||||||
// In tests-ui/tests/api.featureFlags.test.ts
|
// In tests-ui/tests/api.featureFlags.test.ts
|
||||||
it('should handle preview metadata based on feature flag', () => {
|
it('should handle preview metadata based on feature flag', () => {
|
||||||
// Mock server supports feature
|
// Mock server supports feature
|
||||||
api.serverFeatureFlags = { supports_preview_metadata: true }
|
api.serverFeatureFlags = { supports_preview_metadata: true }
|
||||||
|
|
||||||
expect(api.serverSupportsFeature('supports_preview_metadata')).toBe(true)
|
expect(api.serverSupportsFeature('supports_preview_metadata')).toBe(true)
|
||||||
|
|
||||||
// Mock server doesn't support feature
|
// Mock server doesn't support feature
|
||||||
api.serverFeatureFlags = {}
|
api.serverFeatureFlags = {}
|
||||||
|
|
||||||
expect(api.serverSupportsFeature('supports_preview_metadata')).toBe(false)
|
expect(api.serverSupportsFeature('supports_preview_metadata')).toBe(false)
|
||||||
})
|
})
|
||||||
|
```
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
ComfyUI frontend uses a comprehensive settings system for user preferences with support for dynamic defaults, version-based rollouts, and environment-aware configuration.
|
ComfyUI frontend uses a comprehensive settings system for user preferences with support for dynamic defaults, version-based rollouts, and environment-aware configuration.
|
||||||
|
|
||||||
### Settings Architecture
|
### Settings Architecture
|
||||||
|
|
||||||
- Settings are defined as `SettingParams` in `src/constants/coreSettings.ts`
|
- Settings are defined as `SettingParams` in `src/constants/coreSettings.ts`
|
||||||
- Registered at app startup, loaded/saved via `useSettingStore` (Pinia)
|
- Registered at app startup, loaded/saved via `useSettingStore` (Pinia)
|
||||||
- Persisted per user via backend `/settings` endpoint
|
- Persisted per user via backend `/settings` endpoint
|
||||||
@@ -45,6 +46,7 @@ await newUserService().initializeIfNewUser(settingStore)
|
|||||||
## Dynamic and Environment-Based Defaults
|
## Dynamic and Environment-Based Defaults
|
||||||
|
|
||||||
### Computed Defaults
|
### Computed Defaults
|
||||||
|
|
||||||
You can compute defaults dynamically using function defaults that access runtime context:
|
You can compute defaults dynamically using function defaults that access runtime context:
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
@@ -65,14 +67,15 @@ You can compute defaults dynamically using function defaults that access runtime
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Version-Based Defaults
|
### Version-Based Defaults
|
||||||
|
|
||||||
You can vary defaults by installed frontend version using `defaultsByInstallVersion`:
|
You can vary defaults by installed frontend version using `defaultsByInstallVersion`:
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// From src/stores/settingStore.ts:129-150
|
// From src/stores/settingStore.ts:129-150
|
||||||
function getVersionedDefaultValue<K extends keyof Settings, TValue = Settings[K]>(
|
function getVersionedDefaultValue<
|
||||||
key: K,
|
K extends keyof Settings,
|
||||||
param: SettingParams<TValue> | undefined
|
TValue = Settings[K]
|
||||||
): TValue | null {
|
>(key: K, param: SettingParams<TValue> | undefined): TValue | null {
|
||||||
const defaultsByInstallVersion = param?.defaultsByInstallVersion
|
const defaultsByInstallVersion = param?.defaultsByInstallVersion
|
||||||
if (defaultsByInstallVersion && key !== 'Comfy.InstalledVersion') {
|
if (defaultsByInstallVersion && key !== 'Comfy.InstalledVersion') {
|
||||||
const installedVersion = get('Comfy.InstalledVersion')
|
const installedVersion = get('Comfy.InstalledVersion')
|
||||||
@@ -166,15 +169,13 @@ The initial installed version is captured for new users to ensure versioned defa
|
|||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// From src/services/newUserService.ts:49-53
|
// From src/services/newUserService.ts:49-53
|
||||||
await settingStore.set(
|
await settingStore.set('Comfy.InstalledVersion', __COMFYUI_FRONTEND_VERSION__)
|
||||||
'Comfy.InstalledVersion',
|
|
||||||
__COMFYUI_FRONTEND_VERSION__
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Practical Patterns for Environment-Based Defaults
|
## Practical Patterns for Environment-Based Defaults
|
||||||
|
|
||||||
### Dynamic Default Patterns
|
### Dynamic Default Patterns
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// Device-based default
|
// Device-based default
|
||||||
{
|
{
|
||||||
@@ -199,6 +200,7 @@ await settingStore.set(
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Version-Based Rollout Pattern
|
### Version-Based Rollout Pattern
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
{
|
{
|
||||||
id: 'Comfy.Example.NewFeature',
|
id: 'Comfy.Example.NewFeature',
|
||||||
@@ -214,6 +216,7 @@ await settingStore.set(
|
|||||||
## Settings Persistence and Access
|
## Settings Persistence and Access
|
||||||
|
|
||||||
### API Interaction
|
### API Interaction
|
||||||
|
|
||||||
Values are stored per user via the backend. The store writes through API and falls back to defaults when not set:
|
Values are stored per user via the backend. The store writes through API and falls back to defaults when not set:
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
@@ -224,6 +227,7 @@ await api.storeSetting(key, newValue)
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Usage in Components
|
### Usage in Components
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
const settingStore = useSettingStore()
|
const settingStore = useSettingStore()
|
||||||
|
|
||||||
@@ -234,7 +238,6 @@ const value = settingStore.get('Comfy.SomeSetting')
|
|||||||
await settingStore.set('Comfy.SomeSetting', newValue)
|
await settingStore.set('Comfy.SomeSetting', newValue)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Advanced Settings Features
|
## Advanced Settings Features
|
||||||
|
|
||||||
### Migration and Backward Compatibility
|
### Migration and Backward Compatibility
|
||||||
@@ -243,10 +246,7 @@ Settings support migration from deprecated values:
|
|||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// From src/stores/settingStore.ts:68-69, 172-175
|
// From src/stores/settingStore.ts:68-69, 172-175
|
||||||
const newValue = tryMigrateDeprecatedValue(
|
const newValue = tryMigrateDeprecatedValue(settingsById.value[key], clonedValue)
|
||||||
settingsById.value[key],
|
|
||||||
clonedValue
|
|
||||||
)
|
|
||||||
|
|
||||||
// Migration happens during addSetting for existing values:
|
// Migration happens during addSetting for existing values:
|
||||||
if (settingValues.value[setting.id] !== undefined) {
|
if (settingValues.value[setting.id] !== undefined) {
|
||||||
@@ -263,8 +263,8 @@ Settings can define onChange callbacks that receive the setting definition, new
|
|||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// From src/stores/settingStore.ts:73, 177
|
// From src/stores/settingStore.ts:73, 177
|
||||||
onChange(settingsById.value[key], newValue, oldValue) // During set()
|
onChange(settingsById.value[key], newValue, oldValue) // During set()
|
||||||
onChange(setting, get(setting.id), undefined) // During addSetting()
|
onChange(setting, get(setting.id), undefined) // During addSetting()
|
||||||
```
|
```
|
||||||
|
|
||||||
### Settings UI and Categories
|
### Settings UI and Categories
|
||||||
@@ -290,4 +290,4 @@ Settings are automatically grouped for UI based on their `category` or derived f
|
|||||||
- **Settings**: User preferences with dynamic/versioned defaults, persisted per user
|
- **Settings**: User preferences with dynamic/versioned defaults, persisted per user
|
||||||
- **Environment Defaults**: Use function defaults to read runtime context (window, navigator, env)
|
- **Environment Defaults**: Use function defaults to read runtime context (window, navigator, env)
|
||||||
- **Version Rollouts**: Use `defaultsByInstallVersion` for gradual feature releases
|
- **Version Rollouts**: Use `defaultsByInstallVersion` for gradual feature releases
|
||||||
- **API Interaction**: Settings persist to `/settings` endpoint via `storeSetting()`
|
- **API Interaction**: Settings persist to `/settings` endpoint via `storeSetting()`
|
||||||
|
|||||||
@@ -11,11 +11,13 @@ Accepted
|
|||||||
ComfyUI's frontend architecture currently depends on a forked version of litegraph.js maintained as a separate package (@comfyorg/litegraph). This separation has created several architectural and operational challenges:
|
ComfyUI's frontend architecture currently depends on a forked version of litegraph.js maintained as a separate package (@comfyorg/litegraph). This separation has created several architectural and operational challenges:
|
||||||
|
|
||||||
**Architectural Issues:**
|
**Architectural Issues:**
|
||||||
|
|
||||||
- The current split creates a distributed monolith where both packages handle rendering, user interactions, and data models without clear separation of responsibilities
|
- The current split creates a distributed monolith where both packages handle rendering, user interactions, and data models without clear separation of responsibilities
|
||||||
- Both frontend and litegraph manipulate the same data structures, forcing tight coupling across the frontend's data model, views, and business logic
|
- Both frontend and litegraph manipulate the same data structures, forcing tight coupling across the frontend's data model, views, and business logic
|
||||||
- The lack of clear boundaries prevents implementation of modern architectural patterns like MVC or event-sourcing
|
- The lack of clear boundaries prevents implementation of modern architectural patterns like MVC or event-sourcing
|
||||||
|
|
||||||
**Operational Issues:**
|
**Operational Issues:**
|
||||||
|
|
||||||
- ComfyUI is the only known user of the @comfyorg/litegraph fork
|
- ComfyUI is the only known user of the @comfyorg/litegraph fork
|
||||||
- Managing separate repositories significantly slows developer velocity due to coordination overhead
|
- Managing separate repositories significantly slows developer velocity due to coordination overhead
|
||||||
- Version mismatches between frontend and litegraph cause recurring issues
|
- Version mismatches between frontend and litegraph cause recurring issues
|
||||||
@@ -23,6 +25,7 @@ ComfyUI's frontend architecture currently depends on a forked version of litegra
|
|||||||
|
|
||||||
**Future Requirements:**
|
**Future Requirements:**
|
||||||
The following planned features are blocked by the current architecture:
|
The following planned features are blocked by the current architecture:
|
||||||
|
|
||||||
- Multiplayer collaboration requiring CRDT-based state management
|
- Multiplayer collaboration requiring CRDT-based state management
|
||||||
- Cloud-based backend support
|
- Cloud-based backend support
|
||||||
- Alternative rendering backends
|
- Alternative rendering backends
|
||||||
@@ -34,6 +37,7 @@ The following planned features are blocked by the current architecture:
|
|||||||
We will merge litegraph.js directly into the ComfyUI frontend repository using git subtree to preserve the complete commit history.
|
We will merge litegraph.js directly into the ComfyUI frontend repository using git subtree to preserve the complete commit history.
|
||||||
|
|
||||||
The merge will:
|
The merge will:
|
||||||
|
|
||||||
1. Move litegraph source to `src/lib/litegraph/`
|
1. Move litegraph source to `src/lib/litegraph/`
|
||||||
2. Update all import paths from `@comfyorg/litegraph` to `@/lib/litegraph`
|
2. Update all import paths from `@comfyorg/litegraph` to `@/lib/litegraph`
|
||||||
3. Remove the npm dependency on `@comfyorg/litegraph`
|
3. Remove the npm dependency on `@comfyorg/litegraph`
|
||||||
@@ -62,4 +66,4 @@ This integration is the first step toward restructuring the application along cl
|
|||||||
|
|
||||||
- Git subtree was chosen over submodules to provide a cleaner developer experience
|
- Git subtree was chosen over submodules to provide a cleaner developer experience
|
||||||
- The original litegraph repository will be archived after the merge
|
- The original litegraph repository will be archived after the merge
|
||||||
- Future litegraph improvements will be made directly in the frontend repository
|
- Future litegraph improvements will be made directly in the frontend repository
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ Proposed
|
|||||||
[Most of the context is in here](https://github.com/Comfy-Org/ComfyUI_frontend/issues/4661)
|
[Most of the context is in here](https://github.com/Comfy-Org/ComfyUI_frontend/issues/4661)
|
||||||
|
|
||||||
TL;DR: As we're merging more subprojects like litegraph, devtools, and soon a fork of PrimeVue,
|
TL;DR: As we're merging more subprojects like litegraph, devtools, and soon a fork of PrimeVue,
|
||||||
a monorepo structure will help a lot with code sharing and organization.
|
a monorepo structure will help a lot with code sharing and organization.
|
||||||
|
|
||||||
For more information on Monorepos, check out [monorepo.tools](https://monorepo.tools/)
|
For more information on Monorepos, check out [monorepo.tools](https://monorepo.tools/)
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ There's a [whole list here](https://monorepo.tools/#tools-review) if you're inte
|
|||||||
|
|
||||||
- Adding new projects with shared dependencies becomes really easy
|
- Adding new projects with shared dependencies becomes really easy
|
||||||
- Makes the process of forking and customizing projects more structured, if not strictly easier
|
- Makes the process of forking and customizing projects more structured, if not strictly easier
|
||||||
- It *could* speed up the build and development process (not guaranteed)
|
- It _could_ speed up the build and development process (not guaranteed)
|
||||||
- It would let us cleanly organize and release packages like `comfyui-frontend-types`
|
- It would let us cleanly organize and release packages like `comfyui-frontend-types`
|
||||||
|
|
||||||
### Negative
|
### Negative
|
||||||
@@ -47,4 +47,4 @@ There's a [whole list here](https://monorepo.tools/#tools-review) if you're inte
|
|||||||
|
|
||||||
<!-- ## Notes
|
<!-- ## Notes
|
||||||
|
|
||||||
Optional section for additional information, references, or clarifications. -->
|
Optional section for additional information, references, or clarifications. -->
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ The existing system allows each node to directly mutate its position within Lite
|
|||||||
|
|
||||||
5. **Inefficient Change Detection**: While LiteGraph provides some events, many operations require polling via changeTracker.ts. The current undo/redo system performs expensive diffs on every interaction rather than using reactive push/pull signals, creating performance bottlenecks and blocking efficient animations and viewport culling.
|
5. **Inefficient Change Detection**: While LiteGraph provides some events, many operations require polling via changeTracker.ts. The current undo/redo system performs expensive diffs on every interaction rather than using reactive push/pull signals, creating performance bottlenecks and blocking efficient animations and viewport culling.
|
||||||
|
|
||||||
This represents a fundamental architectural limitation: diff-based systems scale O(n) with graph complexity (traverse entire structure to detect changes), while signal-based reactive systems scale O(1) with actual changes (data mutations automatically notify subscribers). Modern frameworks (Vue 3, Angular signals, SolidJS) have moved to reactive approaches for precisely this performance reason.
|
This represents a fundamental architectural limitation: diff-based systems scale O(n) with graph complexity (traverse entire structure to detect changes), while signal-based reactive systems scale O(1) with actual changes (data mutations automatically notify subscribers). Modern frameworks (Vue 3, Angular signals, SolidJS) have moved to reactive approaches for precisely this performance reason.
|
||||||
|
|
||||||
### Business Context
|
### Business Context
|
||||||
|
|
||||||
@@ -53,12 +53,14 @@ This provides single source of truth, predictable state updates, and natural sys
|
|||||||
### Core Architecture
|
### Core Architecture
|
||||||
|
|
||||||
1. **Centralized Layout Store**: A Yjs CRDT maintains all spatial data in a single authoritative store:
|
1. **Centralized Layout Store**: A Yjs CRDT maintains all spatial data in a single authoritative store:
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// Instead of: node.position = {x, y}
|
// Instead of: node.position = {x, y}
|
||||||
layoutStore.moveNode(nodeId, {x, y})
|
layoutStore.moveNode(nodeId, { x, y })
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Command Pattern**: All spatial mutations flow through explicit commands:
|
2. **Command Pattern**: All spatial mutations flow through explicit commands:
|
||||||
|
|
||||||
```
|
```
|
||||||
User Input → Commands → Layout Store → Observer Notifications → Renderers
|
User Input → Commands → Layout Store → Observer Notifications → Renderers
|
||||||
```
|
```
|
||||||
@@ -74,12 +76,14 @@ This provides single source of truth, predictable state updates, and natural sys
|
|||||||
### Implementation Strategy
|
### Implementation Strategy
|
||||||
|
|
||||||
**Phase 1: Parallel System**
|
**Phase 1: Parallel System**
|
||||||
|
|
||||||
- Build CRDT layout store alongside existing system
|
- Build CRDT layout store alongside existing system
|
||||||
- Layout store initially mirrors LiteGraph changes via observers
|
- Layout store initially mirrors LiteGraph changes via observers
|
||||||
- Gradually migrate user interactions to use command interface
|
- Gradually migrate user interactions to use command interface
|
||||||
- Maintain full backward compatibility
|
- Maintain full backward compatibility
|
||||||
|
|
||||||
**Phase 2: Inversion of Control**
|
**Phase 2: Inversion of Control**
|
||||||
|
|
||||||
- CRDT store becomes single source of truth
|
- CRDT store becomes single source of truth
|
||||||
- LiteGraph receives position updates via reactive subscriptions
|
- LiteGraph receives position updates via reactive subscriptions
|
||||||
- Enable alternative renderers and advanced features
|
- Enable alternative renderers and advanced features
|
||||||
@@ -89,17 +93,20 @@ This provides single source of truth, predictable state updates, and natural sys
|
|||||||
This combination provides both architectural and technical benefits:
|
This combination provides both architectural and technical benefits:
|
||||||
|
|
||||||
**Centralized State Benefits:**
|
**Centralized State Benefits:**
|
||||||
|
|
||||||
- **Single Source of Truth**: All layout data managed in one place, eliminating conflicts
|
- **Single Source of Truth**: All layout data managed in one place, eliminating conflicts
|
||||||
- **System Decoupling**: Rendering, interaction, and layout systems operate independently
|
- **System Decoupling**: Rendering, interaction, and layout systems operate independently
|
||||||
- **Predictable Updates**: Clear data flow makes debugging and testing easier
|
- **Predictable Updates**: Clear data flow makes debugging and testing easier
|
||||||
- **Extensibility**: Easy to add new layout behaviors without modifying existing systems
|
- **Extensibility**: Easy to add new layout behaviors without modifying existing systems
|
||||||
|
|
||||||
**CRDT Benefits:**
|
**CRDT Benefits:**
|
||||||
|
|
||||||
- **Conflict Resolution**: Automatic merging eliminates position conflicts between systems
|
- **Conflict Resolution**: Automatic merging eliminates position conflicts between systems
|
||||||
- **Collaboration-Ready**: Built-in support for multi-user editing
|
- **Collaboration-Ready**: Built-in support for multi-user editing
|
||||||
- **Eventual Consistency**: Guaranteed convergence to same state across all clients
|
- **Eventual Consistency**: Guaranteed convergence to same state across all clients
|
||||||
|
|
||||||
**Yjs-Specific Benefits:**
|
**Yjs-Specific Benefits:**
|
||||||
|
|
||||||
- **Event-Driven**: Native observer pattern removes need for polling
|
- **Event-Driven**: Native observer pattern removes need for polling
|
||||||
- **Selective Updates**: Only changed nodes trigger system updates
|
- **Selective Updates**: Only changed nodes trigger system updates
|
||||||
- **Fine-Grained Changes**: Efficient delta synchronization
|
- **Fine-Grained Changes**: Efficient delta synchronization
|
||||||
@@ -109,7 +116,7 @@ This combination provides both architectural and technical benefits:
|
|||||||
### Positive
|
### Positive
|
||||||
|
|
||||||
- **Eliminates Polling**: Observer pattern removes O(n) graph traversals, improving performance
|
- **Eliminates Polling**: Observer pattern removes O(n) graph traversals, improving performance
|
||||||
- **System Modularity**: Independent systems can be developed, tested, and optimized separately
|
- **System Modularity**: Independent systems can be developed, tested, and optimized separately
|
||||||
- **Renderer Flexibility**: Easy to add WebGL, DOM accessibility, or hybrid rendering systems
|
- **Renderer Flexibility**: Easy to add WebGL, DOM accessibility, or hybrid rendering systems
|
||||||
- **Rich Interactions**: Command pattern enables robust undo/redo, macros, and interaction history
|
- **Rich Interactions**: Command pattern enables robust undo/redo, macros, and interaction history
|
||||||
- **Collaboration-Ready**: CRDT foundation enables real-time multi-user editing
|
- **Collaboration-Ready**: CRDT foundation enables real-time multi-user editing
|
||||||
@@ -140,9 +147,10 @@ This centralized state + CRDT architecture follows patterns from modern collabor
|
|||||||
**CRDT in Collaboration**: Tools like Figma, Linear, and Notion use similar approaches for real-time collaboration, demonstrating the effectiveness of separating authoritative data from presentation logic.
|
**CRDT in Collaboration**: Tools like Figma, Linear, and Notion use similar approaches for real-time collaboration, demonstrating the effectiveness of separating authoritative data from presentation logic.
|
||||||
|
|
||||||
**Future Capabilities**: This foundation enables advanced features that would be difficult with the current architecture:
|
**Future Capabilities**: This foundation enables advanced features that would be difficult with the current architecture:
|
||||||
|
|
||||||
- Macro recording and workflow automation
|
- Macro recording and workflow automation
|
||||||
- Programmatic layout optimization and constraints
|
- Programmatic layout optimization and constraints
|
||||||
- API-driven workflow construction
|
- API-driven workflow construction
|
||||||
- Multiple simultaneous renderers (canvas + accessibility DOM)
|
- Multiple simultaneous renderers (canvas + accessibility DOM)
|
||||||
- Real-time collaborative editing
|
- Real-time collaborative editing
|
||||||
- Advanced spatial features (physics, animations, auto-layout)
|
- Advanced spatial features (physics, animations, auto-layout)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user