From f914fe0a8a82186c178c40fff46759afb35c551b Mon Sep 17 00:00:00 2001 From: Balpreet Brar Date: Thu, 2 Jul 2026 18:17:06 +0530 Subject: [PATCH 1/3] feat: improve GEO metadata and page headings --- built-in-nodes/Canny.mdx | 4 ++-- built-in-nodes/ClipTextEncodeSdxlRefiner.mdx | 4 ++-- built-in-nodes/GLSLShader.mdx | 4 ++-- built-in-nodes/OpenAIDalle2.mdx | 4 ++-- community/links.mdx | 4 +++- index.mdx | 4 ++-- 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/built-in-nodes/Canny.mdx b/built-in-nodes/Canny.mdx index 5ce44fbd06..f69046a25c 100755 --- a/built-in-nodes/Canny.mdx +++ b/built-in-nodes/Canny.mdx @@ -1,13 +1,13 @@ --- title: "Canny - ComfyUI Built-in Node Documentation" -description: "Complete documentation for the Canny node in ComfyUI. Learn its inputs, outputs, parameters and usage." +description: "The Canny node applies Canny edge detection to an image, using adjustable low/high thresholds to control sensitivity." sidebarTitle: "Canny" icon: "circle" mode: wide --- Extract all edge lines from photos, like using a pen to outline a photo, drawing out the contours and detail boundaries of objects. -## Working Principle +## How does the Canny node detect edges in ComfyUI? Imagine you are an artist who needs to use a pen to outline a photo. The Canny node acts like an intelligent assistant, helping you decide where to draw lines (edges) and where not to. diff --git a/built-in-nodes/ClipTextEncodeSdxlRefiner.mdx b/built-in-nodes/ClipTextEncodeSdxlRefiner.mdx index d47b0aed46..88fdbd2831 100755 --- a/built-in-nodes/ClipTextEncodeSdxlRefiner.mdx +++ b/built-in-nodes/ClipTextEncodeSdxlRefiner.mdx @@ -1,13 +1,13 @@ --- title: "CLIPTextEncodeSDXLRefiner - ComfyUI Built-in Node Documentation" -description: "Complete documentation for the CLIPTextEncodeSDXLRefiner node in ComfyUI. Learn its inputs, outputs, parameters and usage." +description: "CLIPTextEncodeSDXLRefiner encodes text prompts specifically for the SDXL refiner stage, improving detail in the final image pass." sidebarTitle: "CLIPTextEncodeSDXLRefiner" icon: "circle" mode: wide --- This node is specifically designed for the SDXL Refiner model to convert text prompts into conditioning information by incorporating aesthetic scores and dimensional information to enhance the conditions for generation tasks, thereby improving the final refinement effect. It acts like a professional art director, not only conveying your creative intent but also injecting precise aesthetic standards and specification requirements into the work. -## About SDXL Refiner +## What is the CLIPTextEncodeSDXLRefiner node used for in SDXL workflows? SDXL Refiner is a specialized refinement model that focuses on enhancing image details and quality based on the SDXL base model. This process is like having an art retoucher: diff --git a/built-in-nodes/GLSLShader.mdx b/built-in-nodes/GLSLShader.mdx index 6c5f0e9611..9cf59985a9 100644 --- a/built-in-nodes/GLSLShader.mdx +++ b/built-in-nodes/GLSLShader.mdx @@ -1,6 +1,6 @@ --- title: "GLSLShader - ComfyUI Built-in Node Documentation" -description: "Complete documentation for the GLSLShader node in ComfyUI. Learn its inputs, outputs, parameters and usage." +description: "GLSLShader lets you write custom GLSL fragment shaders directly inside a ComfyUI node to process images in real time." sidebarTitle: "GLSLShader" icon: "circle" mode: wide @@ -11,7 +11,7 @@ The **GLSL Shader** node lets you write custom fragment shaders in **GLSL ES 3.0 The GLSL Shader node is currently marked as **experimental**, so the node may be updated and extended in future releases. -## Minimal Shader +## What is the GLSLShader node, and how do you write a custom shader in ComfyUI? The simplest possible shader - a passthrough that outputs the input image unchanged: diff --git a/built-in-nodes/OpenAIDalle2.mdx b/built-in-nodes/OpenAIDalle2.mdx index 4e33e9b12b..2d7f433cc5 100644 --- a/built-in-nodes/OpenAIDalle2.mdx +++ b/built-in-nodes/OpenAIDalle2.mdx @@ -1,6 +1,6 @@ --- title: "OpenAIDalle2 - ComfyUI Built-in Node Documentation" -description: "Complete documentation for the OpenAIDalle2 node in ComfyUI. Learn its inputs, outputs, parameters and usage." +description: "The OpenAIDalle2 node sends prompts to OpenAI's DALL-E 2 API and returns generated images directly into your ComfyUI workflow." sidebarTitle: "OpenAIDalle2" icon: "circle" mode: wide @@ -9,7 +9,7 @@ mode: wide Generates images synchronously via OpenAI's DALL·E 2 endpoint. -## How It Works +## How does the OpenAI DALL-E 2 node generate images in ComfyUI? This node connects to OpenAI's DALL·E 2 API to create images based on text descriptions. When you provide a text prompt, the node sends it to OpenAI's servers which generate corresponding images and return them to ComfyUI. The node can operate in two modes: standard image generation using just a text prompt, or image editing mode when both an image and mask are provided. In editing mode, it uses the mask to determine which parts of the original image should be modified while keeping other areas unchanged. diff --git a/community/links.mdx b/community/links.mdx index 0a71b0c6ae..1d828a2cee 100644 --- a/community/links.mdx +++ b/community/links.mdx @@ -1,8 +1,10 @@ --- title: "Community links" -description: "Connect with the ComfyUI community through various platforms" +description: "Join the ComfyUI community on Discord (7000 members), GitHub Discussions, and Reddit for support and workflow sharing." --- +## Where can you get ComfyUI support? Discord, GitHub, and 3 other community channels + Join the ComfyUI community and get help, share your work, and stay updated with the latest developments. diff --git a/index.mdx b/index.mdx index a9d1f8b914..a094c39b9a 100644 --- a/index.mdx +++ b/index.mdx @@ -1,6 +1,6 @@ --- title: "ComfyUI Official Documentation" -description: "ComfyUI Official Documentation" +description: "ComfyUI is a node-based interface for building Stable Diffusion and AI image workflows - install and run your first workflow in under 5 mins." icon: "book-open" sidebarTitle: "Introduction" mode: "frame" @@ -56,7 +56,7 @@ The most powerful open source node-based application for generative AI {/* Getting Started Section */}
-

Getting Started

+

What is ComfyUI, and how do you create your first workflow?

Date: Mon, 31 Aug 2026 16:10:37 +0530 Subject: [PATCH 2/3] docs: scope GEO changes to docs-owned pages, align community copy Address CodeRabbit review feedback: - Revert the four built-in-nodes/*.mdx heading edits (Canny, ClipTextEncodeSdxlRefiner, GLSLShader, OpenAIDalle2). Those pages are synced from Comfy-Org/embedded-docs and edits here are overwritten on the next sync. GEO description improvements for node pages are handled pipeline-wide in embedded-docs. - Rewrite community/links.mdx description and H2 so the copy matches the channels actually listed on the page (no fabricated member count, no "GitHub Discussions" / "3 other channels" mismatch). index.mdx and community/links.mdx GEO/heading improvements are retained. --- built-in-nodes/Canny.mdx | 2 +- built-in-nodes/ClipTextEncodeSdxlRefiner.mdx | 2 +- built-in-nodes/GLSLShader.mdx | 2 +- built-in-nodes/OpenAIDalle2.mdx | 2 +- community/links.mdx | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/built-in-nodes/Canny.mdx b/built-in-nodes/Canny.mdx index 8a7a0db4a5..70acddb761 100755 --- a/built-in-nodes/Canny.mdx +++ b/built-in-nodes/Canny.mdx @@ -8,7 +8,7 @@ mode: wide Extract all edge lines from photos, like using a pen to outline a photo, drawing out the contours and detail boundaries of objects. -## How does the Canny node detect edges in ComfyUI? +## Working Principle Imagine you are an artist who needs to use a pen to outline a photo. The Canny node acts like an intelligent assistant, helping you decide where to draw lines (edges) and where not to. diff --git a/built-in-nodes/ClipTextEncodeSdxlRefiner.mdx b/built-in-nodes/ClipTextEncodeSdxlRefiner.mdx index 100829d15d..71af96b679 100755 --- a/built-in-nodes/ClipTextEncodeSdxlRefiner.mdx +++ b/built-in-nodes/ClipTextEncodeSdxlRefiner.mdx @@ -8,7 +8,7 @@ mode: wide This node is specifically designed for the SDXL Refiner model to convert text prompts into conditioning information by incorporating aesthetic scores and dimensional information to enhance the conditions for generation tasks, thereby improving the final refinement effect. It acts like a professional art director, not only conveying your creative intent but also injecting precise aesthetic standards and specification requirements into the work. -## What is the CLIPTextEncodeSDXLRefiner node used for in SDXL workflows? +## About SDXL Refiner SDXL Refiner is a specialized refinement model that focuses on enhancing image details and quality based on the SDXL base model. This process is like having an art retoucher: diff --git a/built-in-nodes/GLSLShader.mdx b/built-in-nodes/GLSLShader.mdx index a6ef0a2545..731fd3a8da 100644 --- a/built-in-nodes/GLSLShader.mdx +++ b/built-in-nodes/GLSLShader.mdx @@ -12,7 +12,7 @@ The **GLSL Shader** node lets you write custom fragment shaders in **GLSL ES 3.0 The GLSL Shader node is currently marked as **experimental**, so the node may be updated and extended in future releases. -## What is the GLSLShader node, and how do you write a custom shader in ComfyUI? +## Minimal Shader The simplest possible shader - a passthrough that outputs the input image unchanged: diff --git a/built-in-nodes/OpenAIDalle2.mdx b/built-in-nodes/OpenAIDalle2.mdx index b7b3998dea..c7984c7311 100644 --- a/built-in-nodes/OpenAIDalle2.mdx +++ b/built-in-nodes/OpenAIDalle2.mdx @@ -8,7 +8,7 @@ mode: wide Generates images synchronously via OpenAI's DALL·E 2 endpoint. -## How does the OpenAI DALL-E 2 node generate images in ComfyUI? +## How It Works This node connects to OpenAI's DALL·E 2 API to create images based on text descriptions. When you provide a text prompt, the node sends it to OpenAI's servers which generate corresponding images and return them to ComfyUI. The node can operate in two modes: standard image generation using just a text prompt, or image editing mode when both an image and mask are provided. In editing mode, it uses the mask to determine which parts of the original image should be modified while keeping other areas unchanged. diff --git a/community/links.mdx b/community/links.mdx index 1d828a2cee..bc891fc97e 100644 --- a/community/links.mdx +++ b/community/links.mdx @@ -1,9 +1,9 @@ --- title: "Community links" -description: "Join the ComfyUI community on Discord (7000 members), GitHub Discussions, and Reddit for support and workflow sharing." +description: "Get ComfyUI help and share your work through the community's Discord, support portal, forum, Matrix, GitHub, YouTube, X, LinkedIn, and Reddit channels." --- -## Where can you get ComfyUI support? Discord, GitHub, and 3 other community channels +## Where can you get ComfyUI help and connect with the community? Join the ComfyUI community and get help, share your work, and stay updated with the latest developments. From fc2d82d91537f935e03dd4e67c50d3ca3135cb20 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 25 Oct 2026 15:59:39 +0000 Subject: [PATCH 3/3] docs: sync zh/ja/ko/es locales for GEO heading and description edits - zh/ja/ko community/links.mdx: translate new description and add 'Where can you get ComfyUI help' H2; refresh translationSourceHash - zh/ja/ko/es index.mdx: update Getting Started H2 to the new question-style heading; refresh translationSourceHash - Merge origin/main into the PR branch (no conflicts) Co-authored-by: Daxiong (Lin) --- .github/workflows/agents-md-integrity.yml | 4 +- .github/workflows/anchor-check.yml | 2 +- .github/workflows/claude.yml | 2 +- .github/workflows/cms-changelog-sync.yml | 2 +- .../cms-published-versions-check.yml | 2 +- .github/workflows/cms-scripts-test.yml | 2 +- .github/workflows/code-pages-check.yml | 95 ---------------- .github/workflows/docs-checks.yml | 7 +- .github/workflows/external-link-tracking.yml | 2 +- .github/workflows/giscus-path-map-update.yml | 104 ------------------ .github/workflows/i18n-scripts-test.yml | 2 +- .github/workflows/i18n-sync-check.yml | 50 ++------- .github/workflows/link-validation.yml | 5 +- .github/workflows/redirect-check.yml | 8 +- .github/workflows/router-pricing-i18n.yml | 101 ----------------- .github/workflows/structure-parity.yml | 71 ------------ .github/workflows/sync-owned-check.yml | 88 --------------- .github/workflows/sync-pr-automerge.yml | 93 ---------------- es/index.mdx | 4 +- ja/community/links.mdx | 6 +- ja/index.mdx | 4 +- ko/community/links.mdx | 6 +- ko/index.mdx | 4 +- zh/community/links.mdx | 6 +- zh/index.mdx | 4 +- 25 files changed, 46 insertions(+), 628 deletions(-) delete mode 100644 .github/workflows/code-pages-check.yml delete mode 100644 .github/workflows/giscus-path-map-update.yml delete mode 100644 .github/workflows/router-pricing-i18n.yml delete mode 100644 .github/workflows/structure-parity.yml delete mode 100644 .github/workflows/sync-owned-check.yml delete mode 100644 .github/workflows/sync-pr-automerge.yml diff --git a/.github/workflows/agents-md-integrity.yml b/.github/workflows/agents-md-integrity.yml index 8ca2fae494..e020dea93f 100644 --- a/.github/workflows/agents-md-integrity.yml +++ b/.github/workflows/agents-md-integrity.yml @@ -16,6 +16,6 @@ jobs: agents-md: permissions: contents: read - uses: Comfy-Org/github-workflows/.github/workflows/agents-md-integrity.yml@1376eeff8a7a27caf9813e0da7f576fa47ea1989 # github-workflows main (1376eef) + uses: Comfy-Org/github-workflows/.github/workflows/agents-md-integrity.yml@c6b3effa6d2e9fff97500d9688b54106f556c433 # github-workflows main (c6b3eff) with: - workflows_ref: 1376eeff8a7a27caf9813e0da7f576fa47ea1989 + workflows_ref: c6b3effa6d2e9fff97500d9688b54106f556c433 diff --git a/.github/workflows/anchor-check.yml b/.github/workflows/anchor-check.yml index 5f8fd50800..58778232d8 100644 --- a/.github/workflows/anchor-check.yml +++ b/.github/workflows/anchor-check.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 persist-credentials: false diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 9c93a08979..bcd8ef5933 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -25,7 +25,7 @@ jobs: id-token: write steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: fetch-depth: 1 diff --git a/.github/workflows/cms-changelog-sync.yml b/.github/workflows/cms-changelog-sync.yml index 8b6d7bcb87..12eb3debcd 100644 --- a/.github/workflows/cms-changelog-sync.yml +++ b/.github/workflows/cms-changelog-sync.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: fetch-depth: 0 persist-credentials: false diff --git a/.github/workflows/cms-published-versions-check.yml b/.github/workflows/cms-published-versions-check.yml index 13d0306d26..f0301240df 100644 --- a/.github/workflows/cms-published-versions-check.yml +++ b/.github/workflows/cms-published-versions-check.yml @@ -18,7 +18,7 @@ jobs: if: github.event.pull_request.head.repo.full_name == github.repository steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/cms-scripts-test.yml b/.github/workflows/cms-scripts-test.yml index 058e64171e..b366b3b876 100644 --- a/.github/workflows/cms-scripts-test.yml +++ b/.github/workflows/cms-scripts-test.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Set up Bun uses: oven-sh/setup-bun@v2 diff --git a/.github/workflows/code-pages-check.yml b/.github/workflows/code-pages-check.yml deleted file mode 100644 index 0926e15a3a..0000000000 --- a/.github/workflows/code-pages-check.yml +++ /dev/null @@ -1,95 +0,0 @@ -name: Code Pages Freshness - -on: - pull_request: - paths: - - 'development/comfy-router/models/**/code.yaml' - - 'development/comfy-router/models/**/code.mdx' - - 'snippets/comfy-router/**' - - 'router-schemas/**' - - 'tutorials/partner-nodes/pricing.mdx' - - 'router-pricing/**' - - 'development/comfy-router/pricing.mdx' - - 'ja/development/comfy-router/pricing.mdx' - - 'zh/development/comfy-router/pricing.mdx' - - 'ko/development/comfy-router/pricing.mdx' - - '.github/scripts/i18n/translate-router-pricing*' - - '.github/scripts/i18n/sync-hash-i18n.ts' - - '.github/scripts/i18n/chunked-translate.ts' - - '.github/scripts/i18n/i18n-config.mjs' - - '.github/scripts/i18n/fix-anchor-slugs.ts' - - '.github/scripts/i18n/translation-config.json' - - 'docs.json' - - '.github/scripts/snippets/**' - - '.github/workflows/code-pages-check.yml' - - 'package.json' - -permissions: - contents: read - -jobs: - code-pages: - # Pinned until swift-actions/setup-swift supports ubuntu-26.04 (the ubuntu-latest image). - runs-on: ubuntu-24.04 - timeout-minutes: 15 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - # code-pages:check syntax-checks the Swift snippets with `swiftc -parse`, so this - # job (and only this job) needs a Swift toolchain. Pinned to a commit SHA: it runs - # on every PR touching these paths, on a public repo. The cloud-side regen path runs - # code-pages:gen without --validate, so it still needs bun alone and is unaffected. - - name: Setup Swift - uses: swift-actions/setup-swift@7ca6abe6b3b0e8b5421b88be48feee39cbf52c6a # v2.4.0 - with: - swift-version: "6.1" - - - name: Check generated code pages are fresh and their snippets parse - run: bun run code-pages:check - - - name: Check English and localized Router pricing pages are fresh - run: bun run router-pricing:check - - snippet-script-tests: - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - # Fixture-driven, so unlike provider-schemas below it needs no network and cannot go red on a provider outage. - - name: Run the snippet script unit tests - run: bun test ./.github/scripts/snippets/ - - provider-schemas: - runs-on: ubuntu-latest - # Fetches each provider's published spec, so a stalled provider host must not hold the runner. - timeout-minutes: 15 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - - name: Check documented input/output schemas against each provider's published spec - run: bun run code-pages:check-providers diff --git a/.github/workflows/docs-checks.yml b/.github/workflows/docs-checks.yml index d348939320..234286538d 100644 --- a/.github/workflows/docs-checks.yml +++ b/.github/workflows/docs-checks.yml @@ -11,16 +11,15 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v4 with: - package-manager-cache: false node-version: '20' - name: Install Mint CLI - run: npm install -g mint@4.2.700 + run: npm install -g mint - name: Run Broken Links Check run: mint broken-links diff --git a/.github/workflows/external-link-tracking.yml b/.github/workflows/external-link-tracking.yml index 865d361f61..bed7b3243d 100644 --- a/.github/workflows/external-link-tracking.yml +++ b/.github/workflows/external-link-tracking.yml @@ -29,7 +29,7 @@ jobs: issues: write steps: - name: Checkout documentation repo - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} fetch-depth: 0 diff --git a/.github/workflows/giscus-path-map-update.yml b/.github/workflows/giscus-path-map-update.yml deleted file mode 100644 index e876f2d89d..0000000000 --- a/.github/workflows/giscus-path-map-update.yml +++ /dev/null @@ -1,104 +0,0 @@ -name: Update Giscus Path Map - -# Regenerates the pathname → discussion number map embedded in giscus-comments.js -# so newly created comment threads get number mapping (#1468). Prefer opening a -# PR over pushing to main so the map can be reviewed. - -on: - schedule: - # Monday 00:00 Asia/Shanghai (UTC+8) == Sunday 16:00 UTC - - cron: "0 16 * * 0" - workflow_dispatch: - -concurrency: - group: giscus-path-map-update - cancel-in-progress: true - -permissions: - contents: write - pull-requests: write - discussions: read - -jobs: - update-map: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v7 - with: - # Need a token that can push a branch and open a PR - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Regenerate GISCUS_PATH_MAP - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # Prefer gh over curl; script shells out to `gh api graphql` - GH_PROMPT_DISABLED: "1" - run: python3 scripts/generate-giscus-path-map.py - - - name: Check for map changes - id: diff - run: | - if git diff --quiet -- giscus-comments.js; then - echo "changed=false" >> "$GITHUB_OUTPUT" - echo "No giscus path-map changes." - else - echo "changed=true" >> "$GITHUB_OUTPUT" - git --no-pager diff --stat -- giscus-comments.js - fi - - - name: Create or update pull request - if: steps.diff.outputs.changed == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: chore/giscus-path-map-update - run: | - set -euo pipefail - - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - - git fetch origin "$BRANCH" || true - git checkout -B "$BRANCH" - - git add giscus-comments.js - if git diff --cached --quiet; then - echo "Nothing staged; exiting." - exit 0 - fi - - git commit -m "$(cat <<'MSG' - chore(giscus): refresh pathname→discussion number map - - Auto-generated by scripts/generate-giscus-path-map.py so newly - created Announcements threads are reachable via number mapping - (#1468). - MSG - )" - - git push -u origin "$BRANCH" --force-with-lease - - EXISTING_PR=$(gh pr list --head "$BRANCH" --base main --state open --json number --jq '.[0].number // empty') - if [ -n "$EXISTING_PR" ]; then - echo "Updated existing PR #$EXISTING_PR" - gh pr comment "$EXISTING_PR" --body "Path map refreshed by scheduled workflow run ${{ github.run_id }}." - else - gh pr create --base main --head "$BRANCH" \ - --title "chore(giscus): refresh pathname→discussion number map" \ - --body "$(cat <<'BODY' - ## Summary - Weekly refresh of the Giscus pathname → discussion number map in `giscus-comments.js`. - - Generated by `scripts/generate-giscus-path-map.py` (GraphQL list of Announcements discussions, not search). Keeps #1468 fix current for newly created comment threads. - - ## Notes - - Unmapped pages still use pathname + strict so new discussions can be created. - - Review the diff of `giscus-comments.js` only; no content docs change. - BODY - )" - fi diff --git a/.github/workflows/i18n-scripts-test.yml b/.github/workflows/i18n-scripts-test.yml index 777f9dac87..e349420f0a 100644 --- a/.github/workflows/i18n-scripts-test.yml +++ b/.github/workflows/i18n-scripts-test.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Set up Bun uses: oven-sh/setup-bun@v2 diff --git a/.github/workflows/i18n-sync-check.yml b/.github/workflows/i18n-sync-check.yml index e6afffe7f8..63be8b7286 100644 --- a/.github/workflows/i18n-sync-check.yml +++ b/.github/workflows/i18n-sync-check.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -30,13 +30,11 @@ jobs: "${{ github.event.pull_request.base.sha }}" \ "${{ github.event.pull_request.head.sha }}" - - name: Comment i18n sync status on PR + - name: Notify translator on PR if: always() env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} CHECK_I18N_OUTPUT: /tmp/i18n-check.json - PR_HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }} - PR_BASE_REPO: ${{ github.repository }} run: | if [ ! -f "$CHECK_I18N_OUTPUT" ]; then echo "No check output; skipping comment." @@ -46,27 +44,12 @@ jobs: MISSING=$(node -e " const data = require('$CHECK_I18N_OUTPUT'); if (data.skipped) process.exit(2); - const sameRepository = process.env.PR_HEAD_REPO === process.env.PR_BASE_REPO; - const autoTranslated = new Set(sameRepository ? [ - 'ja/development/comfy-router/pricing.mdx', - 'zh/development/comfy-router/pricing.mdx', - 'ko/development/comfy-router/pricing.mdx', - ] : []); - const n = Object.values(data.missingByLang || {}).reduce((s, v) => s + v.files.filter(f => !autoTranslated.has(f)).length, 0); + const n = Object.values(data.missingByLang || {}).reduce((s, v) => s + v.files.length, 0); if (n === 0) process.exit(2); process.stdout.write(String(n)); " 2>/dev/null) || true if [ -z "$MISSING" ]; then - REPO="${{ github.repository }}" - PR_NUMBER="${{ github.event.pull_request.number }}" - MARKER="" - EXISTING_ID=$(gh api "repos/${REPO}/issues/${PR_NUMBER}/comments" \ - --jq '.[] | select(.body | contains("'"$MARKER"'")) | .id' | head -1) - if [ -n "$EXISTING_ID" ]; then - gh api -X DELETE "repos/${REPO}/issues/comments/${EXISTING_ID}" - echo "Removed the resolved i18n reminder comment." - fi echo "No missing translations; skipping PR comment." exit 0 fi @@ -74,35 +57,20 @@ jobs: BODY_FILE=/tmp/i18n-comment.md BODY_FILE="$BODY_FILE" node -e " const data = require(process.env.CHECK_I18N_OUTPUT); - const sameRepository = process.env.PR_HEAD_REPO === process.env.PR_BASE_REPO; - const autoTranslated = new Set(sameRepository ? [ - 'ja/development/comfy-router/pricing.mdx', - 'zh/development/comfy-router/pricing.mdx', - 'ko/development/comfy-router/pricing.mdx', - ] : []); - const groups = Object.entries(data.missingByLang) - .map(([code, { name, files }]) => ({ code, name, files: files.filter(f => !autoTranslated.has(f)) })) - .filter(g => g.files.length > 0); - const total = groups.reduce((s, g) => s + g.files.length, 0); - const plural = (n) => n + ' file' + (n === 1 ? '' : 's'); const lines = [ - '## 🌐 i18n translation sync check', + '## 🌐 i18n translation sync reminder', '', - 'English docs changed in this PR. ' + plural(total) + ' in ' + groups.length + ' language' + (groups.length === 1 ? '' : 's') + ' may not be synced yet. The automated translation workflow handles these updates. Expand a language to see the files.', + '@comfyui-wiki English documentation was updated in this PR. Please complete or schedule translation updates for the following files:', '', ]; - for (const { code, name, files } of groups) { - lines.push('
'); - lines.push('' + name + ' (' + code + '): ' + plural(files.length) + ''); - lines.push(''); - for (const f of files) lines.push('- ' + f.replace(/[&<>\`]/g, c => '&#' + c.charCodeAt(0) + ';') + ''); - lines.push(''); - lines.push('
'); + for (const [code, { name, files }] of Object.entries(data.missingByLang)) { + lines.push('### ' + name + ' (\`' + code + '\`)'); + for (const f of files) lines.push('- \`' + f + '\`'); lines.push(''); } lines.push('---'); lines.push(''); - lines.push('**Local sync:** \`npm run translate\` (see [README: Automated translation](https://github.com/${{ github.repository }}/blob/main/README.md#automated-translation))'); + lines.push('**Local sync:** \`npm run translate\` (see [README — Automated translation](https://github.com/${{ github.repository }}/blob/main/README.md#automated-translation))'); lines.push(''); lines.push(''); require('fs').writeFileSync(process.env.BODY_FILE, lines.join('\n')); diff --git a/.github/workflows/link-validation.yml b/.github/workflows/link-validation.yml index 2ef1086d16..22c1b68307 100644 --- a/.github/workflows/link-validation.yml +++ b/.github/workflows/link-validation.yml @@ -13,14 +13,13 @@ on: jobs: validate-links: - # Pinned until actions/setup-python ships Python 3.9 for ubuntu-26.04 (the ubuntu-latest image). - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest permissions: contents: write pull-requests: write steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} fetch-depth: 0 diff --git a/.github/workflows/redirect-check.yml b/.github/workflows/redirect-check.yml index 56d8101547..f8149bf62c 100644 --- a/.github/workflows/redirect-check.yml +++ b/.github/workflows/redirect-check.yml @@ -10,19 +10,17 @@ on: jobs: check-redirects: - # Pinned until Playwright supports webkit on ubuntu-26.04 (its postinstall breaks npm ci there). - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v4 with: - package-manager-cache: false node-version: '20' - name: Install dependencies diff --git a/.github/workflows/router-pricing-i18n.yml b/.github/workflows/router-pricing-i18n.yml deleted file mode 100644 index 8f12122c16..0000000000 --- a/.github/workflows/router-pricing-i18n.yml +++ /dev/null @@ -1,101 +0,0 @@ -name: Generate Router pricing translations - -on: - pull_request: - branches: - - main - paths: - - '.github/scripts/i18n/translate-i18n.ts' - - '.github/scripts/i18n/translate-router-pricing.ts' - - '.github/scripts/i18n/sync-hash-i18n.ts' - - '.github/scripts/i18n/chunked-translate.ts' - - '.github/scripts/i18n/i18n-config.mjs' - - '.github/scripts/i18n/fix-anchor-slugs.ts' - - '.github/scripts/i18n/translation-config.json' - - '.github/scripts/snippets/gen-router-pricing.ts' - - '.github/scripts/snippets/router-pricing-display.ts' - - '.github/workflows/router-pricing-i18n.yml' - - 'development/comfy-router/models/**/code.mdx' - - 'development/comfy-router/pricing.mdx' - - 'ja/development/comfy-router/pricing.mdx' - - 'zh/development/comfy-router/pricing.mdx' - - 'ko/development/comfy-router/pricing.mdx' - - 'package.json' - - 'router-pricing/metronome-rates.json' - -concurrency: - group: router-pricing-i18n-${{ github.event.pull_request.head.repo.full_name || github.repository }}-${{ github.event.pull_request.head.ref || github.ref_name }} - cancel-in-progress: true - -permissions: - contents: write - -jobs: - translate: - # Fork PRs cannot access the translation key or push to the source branch. - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository - runs-on: ubuntu-latest - timeout-minutes: 20 - steps: - # Checks on a commit pushed with GITHUB_TOKEN wait for a maintainer to - # approve them, so Sync PR Auto-merge never sees them pass. Push as - # cloud-code-bot instead, which starts them normally. The mint is - # continue-on-error: an unset vars.APP_ID or - # secrets.CLOUD_CODE_BOT_PRIVATE_KEY falls back to GITHUB_TOKEN. - - name: Mint the cloud-code-bot token - id: app-token - continue-on-error: true - uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 - with: - app-id: ${{ vars.APP_ID }} - private-key: ${{ secrets.CLOUD_CODE_BOT_PRIVATE_KEY }} - permission-contents: write - - - name: Warn that the push falls back to GITHUB_TOKEN - if: steps.app-token.outcome == 'failure' - run: echo "::warning::cloud-code-bot token mint failed; pushing with GITHUB_TOKEN, so checks on the new commit need manual approval. Check vars.APP_ID and secrets.CLOUD_CODE_BOT_PRIVATE_KEY." - - - name: Check out the PR branch - uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} - ref: ${{ github.event.pull_request.head.ref || github.ref_name }} - token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }} - - - name: Set up Bun - uses: oven-sh/setup-bun@v2 - - - name: Regenerate pricing data, English page, and locale pages - run: | - bun run router-pricing:gen - - - name: Verify all locale pages were generated - run: | - for locale in ja zh ko; do - page="${locale}/development/comfy-router/pricing.mdx" - if [ ! -s "$page" ]; then - echo "Translation did not produce $page" - exit 1 - fi - done - - - name: Commit locale pages to the PR branch - env: - PR_BRANCH: ${{ github.event.pull_request.head.ref || github.ref_name }} - APP_TOKEN_MINTED: ${{ steps.app-token.outputs.token != '' }} - run: | - # The committer follows the token that pushes. - if [ "$APP_TOKEN_MINTED" = "true" ]; then - git config user.name "cloud-code-bot[bot]" - git config user.email "234529496+cloud-code-bot[bot]@users.noreply.github.com" - else - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - fi - git add development/comfy-router/pricing.mdx ja/development/comfy-router/pricing.mdx zh/development/comfy-router/pricing.mdx ko/development/comfy-router/pricing.mdx - if git diff --cached --quiet; then - echo "Router pricing data and translations are already up to date." - exit 0 - fi - git commit -m "Sync Router pricing translations" - git push origin "HEAD:refs/heads/${PR_BRANCH}" diff --git a/.github/workflows/structure-parity.yml b/.github/workflows/structure-parity.yml deleted file mode 100644 index e256e251cb..0000000000 --- a/.github/workflows/structure-parity.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Structure Parity - -# A translated page must carry the same MDX structure as its English source: -# the same components (counted per tag name), the same number of images and the -# same selected asset links. It compares structure, not image identity: a -# present-but-swapped image or a mistranslated card is outside this gate and -# belongs to the review pass. -# `pnpm translate:dry-run` compares section hashes only, so a localized page can -# silently lose its download cards, workflow previews or card grouping and still -# pass every other check. This job fails the pull request when a translation -# lost structure the English page has, or when an English change left an -# existing translation behind. -# -# Both directions are checked: a changed localized page is compared with its -# English source, and a changed English page is compared with its existing -# ja/zh/ko counterparts. The second direction only fails when the counterpart -# matched the English page before the change, so pre-existing debt never blocks -# a pull request (it is reported as a warning). The backlog is reported by -# `bun .github/scripts/i18n/check-structure-parity.ts --all`. - -on: - workflow_dispatch: - pull_request: - paths: - - '**/*.mdx' - - '.github/scripts/i18n/check-structure-parity*' - - '.github/workflows/structure-parity.yml' - push: - branches: [main] - paths: - - '**/*.mdx' - - '.github/scripts/i18n/check-structure-parity*' - - '.github/workflows/structure-parity.yml' - -permissions: - contents: read - -jobs: - structure-parity: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Set up Bun - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 - with: - bun-version: latest - - - name: Test structure parity detection - run: bun test ./.github/scripts/i18n/check-structure-parity.test.ts - - - name: Check changed localized pages against their English source - env: - # Diff range for the change under review: `base` up to `head`. For a - # pull request that is the base branch SHA and the pull request's own - # head, for a push the previous and the current commit. Read the base - # branch SHA first: `github.event.before` also exists on pull_request - # events, where it holds the previous head of the pull request, and - # diffing that against the checked out merge commit also lists every - # commit the base branch added after the branch point. The gate would - # then audit pages this pull request never touched. - # The script falls back to `~1` when the base is unreachable - # after a force-push. - STRUCTURE_PARITY_BASE: ${{ github.event.pull_request.base.sha || github.event.before }} - STRUCTURE_PARITY_HEAD: ${{ github.event.pull_request.head.sha || github.sha }} - run: bun .github/scripts/i18n/check-structure-parity.ts diff --git a/.github/workflows/sync-owned-check.yml b/.github/workflows/sync-owned-check.yml deleted file mode 100644 index caca78ae59..0000000000 --- a/.github/workflows/sync-owned-check.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: Sync-Owned Files Check - -# Refuse a pull request that edits a file the Comfy API spec sync owns and -# rewrites on every run. Such an edit publishes now and is reverted by the next -# sync; this fails it while its author can still move the change upstream. -# -# The path filter is the guarded set plus this check's own files, so a pull -# request that touches none of them never starts this workflow. `docs.json` -# (co-owned) and the hand-curated `development/comfy-router/models/**/code.yaml` -# generator inputs are deliberately absent. See the script's header comment. - -on: - pull_request: - paths: - - 'openapi-v2.yaml' - - 'router-openapi.yaml' - - 'development/comfy-router/reference.mdx' - - 'development/comfy-router/quickstart.mdx' - - 'development/comfy-router/limitations.mdx' - - 'development/comfy-router/higgsfield-byok.mdx' - - 'development/comfy-router/models.mdx' - - 'development/comfy-router/providers.mdx' - - 'development/comfy-router/models/**/code.mdx' - - 'router-schemas/**' - - '.github/scripts/sync-owned/**' - - '.github/workflows/sync-owned-check.yml' - -permissions: - contents: read - -jobs: - sync-owned: - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - # A generated page that matches the generator's output is that output, - # however it got there, so it is a regeneration rather than a hand-edit and - # the guard lets it through. `code-pages-check.yml` asserts the same thing, - # but its path filter omits `development/comfy-router/models.mdx`, so a pull - # request that hand-edits only the provider index never starts it. - - name: Are the generated code pages fresh? - id: fresh - continue-on-error: true - run: bun run code-pages:check - - - name: Check for edits to sync-owned files - env: - # Read through the environment rather than interpolated into the shell: - # a head branch name is contributor-controlled text. - PR_AUTHOR: ${{ github.event.pull_request.user.login }} - PR_HEAD_REF: ${{ github.event.pull_request.head.ref }} - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - GENERATED_PAGES_FRESH: ${{ steps.fresh.outcome == 'success' }} - run: | - set -euo pipefail - # --no-renames so a guarded file renamed away is reported as a deletion - # of the guarded path rather than only as its new name. - git diff --name-only --no-renames -z "$BASE_SHA...$HEAD_SHA" \ - | bun .github/scripts/sync-owned/check-sync-owned.ts - - sync-owned-script-tests: - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - - name: Run the sync-owned check unit tests - run: bun test ./.github/scripts/sync-owned/ diff --git a/.github/workflows/sync-pr-automerge.yml b/.github/workflows/sync-pr-automerge.yml deleted file mode 100644 index ef8bf530f8..0000000000 --- a/.github/workflows/sync-pr-automerge.yml +++ /dev/null @@ -1,93 +0,0 @@ -name: Sync PR Auto-merge - -# Merge the Comfy API spec sync pull request (branch chore/sync-comfy-api-v2-spec, -# opened by cloud-code-bot from Comfy-Org/cloud push-v2-spec-to-sdks.yml) once its -# checks are green. Off unless the repository variable DOCS_SYNC_AUTOMERGE is -# 'true'. Only that branch and author are ever merged; every other pull request -# is untouched, so this needs no ruleset on main. -# -# "Green" is decided here rather than by required checks, because most checks -# are path-filtered and a given sync may not start them. The rule: every check -# run on the head commit has finished, none failed, and mint-checks (no path -# filter, so it runs on every sync) passed. provider-schemas is exempt: it -# fetches live provider specs, so an upstream spec change can fail it with no -# fault in the pull request. -# -# Each finished pull_request workflow re-evaluates; the schedule covers checks -# from apps (Mintlify, Socket) that do not raise workflow_run. - -on: - workflow_run: - workflows: - - 'AGENTS.md Integrity' - - 'Anchor Check' - - 'Code Pages Freshness' - - 'Documentation Checks' - - 'External Link Tracking' - - 'Generate Router pricing translations' - - 'i18n Translation Sync Check' - - 'Link Validation' - - 'Redirect Check' - - 'Structure Parity' - - 'Sync-Owned Files Check' - types: [completed] - schedule: - - cron: '*/20 * * * *' - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - checks: read - -concurrency: - group: sync-pr-automerge - cancel-in-progress: false - -env: - SYNC_BRANCH: chore/sync-comfy-api-v2-spec - SYNC_AUTHOR: cloud-code-bot - ANCHOR_CHECK: mint-checks - EXEMPT_CHECKS: provider-schemas - -jobs: - automerge: - if: >- - vars.DOCS_SYNC_AUTOMERGE == 'true' && - (github.event_name != 'workflow_run' || github.event.workflow_run.head_branch == 'chore/sync-comfy-api-v2-spec') - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Merge the sync pull request if its checks are green - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_REPO: ${{ github.repository }} - run: | - set -euo pipefail - # gh reports an App author as "app/" or "[bot]" depending on the API; accept both. - pr=$(gh pr list --head "$SYNC_BRANCH" --base main --state open \ - --json number,author,isDraft,headRefOid \ - --jq "[.[] | select(.author.login | IN(\"$SYNC_AUTHOR\", \"app/$SYNC_AUTHOR\", \"${SYNC_AUTHOR}[bot]\")) | select(.isDraft | not)][0] // empty") - if [ -z "$pr" ]; then echo "No open sync pull request by $SYNC_AUTHOR."; exit 0; fi - number=$(jq -r .number <<<"$pr"); sha=$(jq -r .headRefOid <<<"$pr") - echo "Sync pull request #$number at $sha" - - runs=$(gh api --paginate "repos/$GH_REPO/commits/$sha/check-runs?per_page=100" \ - --jq '.check_runs[] | {name, status, conclusion}' | jq -s .) - jq -r '.[] | " \(.name): \(.status) \(.conclusion // "")"' <<<"$runs" - - # This job's own check run is in progress while it evaluates, so leave it out. - pending=$(jq '[.[] | select(.name != "automerge" and .status != "completed")] | length' <<<"$runs") - if [ "$pending" -gt 0 ]; then echo "$pending check(s) still running; waiting."; exit 0; fi - - failed=$(jq -r --arg exempt "$EXEMPT_CHECKS" '[.[] | select(.name != "automerge") - | select(.name as $n | $exempt | split(",") | index($n) | not) - | select(.conclusion as $c | ["success", "neutral", "skipped"] | index($c) | not) | .name] | join(", ")' <<<"$runs") - if [ -n "$failed" ]; then echo "::notice::Not merging #$number: $failed did not pass."; exit 0; fi - - anchor=$(jq --arg n "$ANCHOR_CHECK" '[.[] | select(.name == $n and .conclusion == "success")] | length' <<<"$runs") - if [ "$anchor" -eq 0 ]; then echo "$ANCHOR_CHECK has not passed on $sha yet; waiting."; exit 0; fi - - # --match-head-commit refuses the merge if the bot pushed again since the checks above ran. - gh pr merge "$number" --squash --match-head-commit "$sha" - echo "::notice::Merged sync pull request #$number at $sha." diff --git a/es/index.mdx b/es/index.mdx index 707ba70104..672a7957a6 100644 --- a/es/index.mdx +++ b/es/index.mdx @@ -4,7 +4,7 @@ description: "Documentación oficial de ComfyUI, la aplicación de código abier icon: "book-open" sidebarTitle: "Inicio" mode: "frame" -translationSourceHash: 2a1adf8b +translationSourceHash: ee7b0862 translationFrom: index.mdx --- @@ -58,7 +58,7 @@ La aplicación de código abierto basada en nodos más potente para IA generativ {/* Getting Started Section */}
-

Primeros pasos

+

¿Qué es ComfyUI y cómo creas tu primer flujo de trabajo?

diff --git a/ja/index.mdx b/ja/index.mdx index 20ac438957..2700a5e04a 100644 --- a/ja/index.mdx +++ b/ja/index.mdx @@ -4,7 +4,7 @@ description: "ComfyUI の公式ドキュメント。オープンソースのノ icon: "book-open" sidebarTitle: "ホーム" mode: "frame" -translationSourceHash: 2a1adf8b +translationSourceHash: ee7b0862 translationFrom: index.mdx --- @@ -58,7 +58,7 @@ translationFrom: index.mdx {/* Getting Started Section */}
-

はじめに

+

ComfyUI とは何か、最初のワークフローはどう作る?

diff --git a/ko/index.mdx b/ko/index.mdx index 9d3f6de17b..df7baf9b6e 100644 --- a/ko/index.mdx +++ b/ko/index.mdx @@ -4,7 +4,7 @@ description: "ComfyUI 공식 문서. 노드 기반 오픈소스 생성형 AI 애 icon: "book-open" sidebarTitle: "홈" mode: "frame" -translationSourceHash: 2a1adf8b +translationSourceHash: ee7b0862 translationFrom: index.mdx --- @@ -58,7 +58,7 @@ translationFrom: index.mdx {/* 시작하기 섹션 */}
-

시작하기

+

ComfyUI란 무엇이며, 첫 워크플로는 어떻게 만드나요?

diff --git a/zh/index.mdx b/zh/index.mdx index 18d3e25697..9809f85e3b 100644 --- a/zh/index.mdx +++ b/zh/index.mdx @@ -4,7 +4,7 @@ description: "ComfyUI 官方文档。开源、基于节点的生成式 AI 应用 icon: "book-open" mode: "frame" sidebarTitle: "首页" -translationSourceHash: 2a1adf8b +translationSourceHash: ee7b0862 translationFrom: index.mdx --- @@ -61,7 +61,7 @@ translationFrom: index.mdx {/* Getting Started Section */}
-

开始使用

+

ComfyUI 是什么,如何创建你的第一个工作流?