From f22efbb986410bd39f17dc6a4ebb147e0c1c0984 Mon Sep 17 00:00:00 2001 From: bymyself Date: Mon, 4 May 2026 07:16:53 +0000 Subject: [PATCH] fix(website): address review comments on model pages PR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix missing comma in translations.ts (broke build/oxfmt parse) - Fix partner node huggingFaceUrl: use empty string instead of HF homepage - Add rel="noopener noreferrer" to external anchor tags - Remove client:load from ModelHeroSection (presentational, no JS needed) - Fix GH Actions workflow: rename .yml→.yaml, bump to @v6 actions (pinact exempt), pin pnpm action to SHA, fix m.slug→m.suggestedSlug in discovery comparison - Rewrite add-model-page skill to be repo-agnostic (no Glary-Bot references, no hardcoded paths/system assumptions) --- .claude/skills/add-model-page/SKILL.md | 129 +++++++----------- ...iscovery.yml => model-page-discovery.yaml} | 50 +++---- .../components/models/ModelHeroSection.vue | 2 +- apps/website/src/config/models.ts | 6 +- apps/website/src/i18n/translations.ts | 125 +---------------- .../src/pages/p/supported-models/[slug].astro | 2 +- 6 files changed, 77 insertions(+), 237 deletions(-) rename .github/workflows/{model-page-discovery.yml => model-page-discovery.yaml} (71%) diff --git a/.claude/skills/add-model-page/SKILL.md b/.claude/skills/add-model-page/SKILL.md index b1977e44bd..dab25f90d1 100644 --- a/.claude/skills/add-model-page/SKILL.md +++ b/.claude/skills/add-model-page/SKILL.md @@ -1,38 +1,17 @@ --- name: add-model-page -description: 'Add, update, or remove a model page entry in ComfyUI_frontend. Triggered by Glary-Bot Slack commands. Creates a PR to Comfy-Org/ComfyUI_frontend with the change and posts a Vercel preview link back to Slack.' +description: 'Add, update, or remove a model page entry on the comfy org website. Creates a PR to Comfy-Org/ComfyUI_frontend apps/website folder with the change.' --- # add-model-page -Handle Glary-Bot Slack commands that add, update, or remove model pages in the ComfyUI website. +Add, update, or remove model pages in the ComfyUI website. ## Trigger phrases -- `@Glary-Bot Add a model page for ` -- `@Glary-Bot Update the model page for ` -- `@Glary-Bot Remove from model pages` - -## Repos involved - -- **comfy-router** (this repo): skill lives here, no code changes needed -- **ComfyUI_frontend** (`Comfy-Org/ComfyUI_frontend`): all file edits happen here - -Assume ComfyUI_frontend is checked out at a sibling path. Find it: - -```bash -find ~ -maxdepth 5 -name "models.ts" -path "*/website/src/config/*" 2>/dev/null | head -1 -``` - -Set `FRONTEND` to that repo root (parent four levels up from the found path). - -Key files inside `$FRONTEND`: - -| File | Purpose | -|------|---------| -| `apps/website/src/config/models.ts` | Model array | -| `apps/website/src/i18n/translations.ts` | i18n string map | -| `apps/website/scripts/generate-models.ts` | Derives model data from workflow templates | +- `Add a model page for ` +- `Update the model page for ` +- `Remove from model pages` --- @@ -40,24 +19,32 @@ Key files inside `$FRONTEND`: Extract: - **action**: `add` | `update` | `remove` -- **model-name**: raw string from Slack (e.g. `flux1-schnell`, `flux1_dev.safetensors`) +- **model-name**: raw string (e.g. `flux1-schnell`, `flux1_dev.safetensors`) -Normalize to a slug: lowercase, replace `_` and `.` with `-`, strip `.safetensors` suffix. +Normalize to a slug: lowercase, replace `_` and `.` with `-`, strip file extensions. Example: `flux1_dev.safetensors` → `flux1-dev` --- ## Phase 2 — Gather model data (ADD / UPDATE) +Find the ComfyUI_frontend repo root. Key files: + +| File | Purpose | +|------|---------| +| `apps/website/src/config/models.ts` | Model array | +| `apps/website/src/i18n/translations.ts` | i18n string map | +| `apps/website/scripts/generate-models.ts` | Derives model data from workflow templates | + Run the generator to find the model: ```bash -cd $FRONTEND +cd ComfyUI_frontend pnpm tsx apps/website/scripts/generate-models.ts \ | jq '.[] | select(.name | ascii_downcase | contains("MODEL_NAME"))' ``` -Replace `MODEL_NAME` with the normalized slug (use `-` as wildcard-friendly substring). +Replace `MODEL_NAME` with the normalized slug (substring match). The output object contains: - `name` — exact filename (e.g. `flux1_dev.safetensors`) or display name for partner nodes @@ -67,17 +54,18 @@ The output object contains: - `suggestedSlug` — use this as `slug` if reasonable - `suggestedDisplayName` — use as seed for i18n `displayName` -If the generator returns no match and the model is a known API/partner model (e.g. Kling AI, Meshy AI, Nano Banana), add it manually as `directory: 'partner_nodes'` — no HuggingFace URL needed. Otherwise, tell the user the model was not found and stop. +If the generator returns no match and the model is a known API/partner model, add it +manually as `directory: 'partner_nodes'` with an empty `huggingFaceUrl`. --- ## Phase 3 — Check for existing entry ```bash -grep -n "slug: '${SLUG}'" $FRONTEND/apps/website/src/config/models.ts +grep -n "slug: '${SLUG}'" apps/website/src/config/models.ts ``` -- Match found + action is `add` → switch to UPDATE flow automatically; inform the user +- Match found + action is `add` → switch to UPDATE flow automatically - No match + action is `update` → stop and tell the user --- @@ -92,17 +80,17 @@ grep -n "slug: '${SLUG}'" $FRONTEND/apps/website/src/config/models.ts name: 'model_name.safetensors', // or display name for partner nodes displayName: 'models.MODEL-SLUG.displayName' as TranslationKey, description: 'models.MODEL-SLUG.description' as TranslationKey, - directory: 'diffusion_models', // from generate-models; or 'partner_nodes' for API models - huggingFaceUrl: 'https://huggingface.co/...', // from generate-models; use '' for partner nodes - docsUrl: 'https://docs.comfy.org/...', // optional: tutorial link on docs.comfy.org + directory: 'diffusion_models', // from generate-models; or 'partner_nodes' + huggingFaceUrl: 'https://huggingface.co/...', // empty '' for partner nodes + docsUrl: 'https://docs.comfy.org/...', // optional: tutorial link blogUrl: 'https://blog.comfy.org/...', // optional: blog post link ogImage: '/images/models/MODEL-SLUG-og.png', thumbnail: '/images/models/MODEL-SLUG-thumb.webp', featured: true, - workflowCount: N, // from generate-models output - tags: ['tag1', 'tag2'] as const, // derive from slug tokens - publishedDate: 'YYYY-MM-DD', // today - modifiedDate: 'YYYY-MM-DD', // today + workflowCount: N, + tags: ['tag1', 'tag2'] as const, + publishedDate: 'YYYY-MM-DD', + modifiedDate: 'YYYY-MM-DD', } ``` @@ -110,11 +98,14 @@ Tags: split the slug on `-`, drop pure numeric tokens, keep meaningful words. ### 4A.2 Insert into models array -The array in `apps/website/src/config/models.ts` is sorted by `workflowCount` descending. Find the first entry whose `workflowCount` is less than the new entry's count and insert before it. If all are greater, append at the end. +The array in `apps/website/src/config/models.ts` is sorted by `workflowCount` +descending. Find the first entry whose `workflowCount` is less than the new +entry's count and insert before it. If all are greater, append at the end. ### 4A.3 Add i18n keys -In `apps/website/src/i18n/translations.ts`, find the closing `}` of the `translations` object (the line before `} as const satisfies`). Insert before it: +In `apps/website/src/i18n/translations.ts`, find the line before +`} as const satisfies` and insert: ```typescript 'models.MODEL-SLUG.displayName': { @@ -122,47 +113,46 @@ In `apps/website/src/i18n/translations.ts`, find the closing `}` of the `transla 'zh-CN': '' }, 'models.MODEL-SLUG.description': { - en: 'SEO description: one sentence explaining what this model does.', + en: 'One sentence describing what this model does.', 'zh-CN': '' }, ``` -Use `suggestedDisplayName` from generate-models for the English `displayName`. Write a concise one-sentence English `description` based on the model name and directory. +Use `suggestedDisplayName` from generate-models for the English `displayName`. --- ## Phase 4B — UPDATE: edit existing entry -Find the entry by slug. Apply only the fields the user explicitly requested changing. Update `modifiedDate` to today. Leave all other fields unchanged. +Find the entry by slug. Apply only the fields requested. Update `modifiedDate` to +today. Leave all other fields unchanged. --- ## Phase 4C — REMOVE: delete entry 1. Remove the entire object literal (including trailing comma) from the `models` array. -2. Remove the two translation keys (`displayName` and `description`) from `translations.ts`. -3. Note in the PR description why the model was removed (quote the Slack request). +2. Remove the two translation keys from `translations.ts`. +3. Note in the PR description why the model was removed. --- ## Phase 5 — Verify TypeScript ```bash -cd $FRONTEND pnpm typecheck 2>&1 | grep -E "error|warning" | head -20 ``` Fix any type errors before proceeding. Common issues: - Missing `as TranslationKey` cast on `displayName`/`description` -- New translation key not yet present in `translations` when models.ts references it (add key first) +- New translation key not yet in `translations.ts` when `models.ts` references it --- ## Phase 6 — Create PR ```bash -cd $FRONTEND -BRANCH="glary/add-model-page-MODEL-SLUG" # or update- / remove- +BRANCH="add-model-page-MODEL-SLUG" # or update- / remove- git checkout -b $BRANCH git add apps/website/src/config/models.ts apps/website/src/i18n/translations.ts git commit -m "feat(models): add model page for MODEL-SLUG" @@ -172,8 +162,6 @@ gh pr create \ --body "$(cat <<'EOF' Adds a new model page entry for MODEL-SLUG. -Triggered by Glary-Bot from Slack: "" - ## Changes - `models.ts`: new entry with workflowCount N, directory DIRECTORY - `translations.ts`: placeholder i18n keys (zh-CN needs translation) @@ -181,34 +169,12 @@ Triggered by Glary-Bot from Slack: "" ## Images needed - `/images/models/MODEL-SLUG-og.png` (1200×630) - `/images/models/MODEL-SLUG-thumb.webp` - -cc @design-team for images EOF )" ``` -For UPDATE use branch `glary/update-model-page-MODEL-SLUG`. For REMOVE use `glary/remove-model-page-MODEL-SLUG` and remove the images note. - ---- - -## Phase 7 — Post Vercel preview to Slack - -After the PR is created, fetch the Vercel preview URL: - -```bash -# Wait ~60s for Vercel bot to comment, then: -gh pr view $BRANCH --json comments \ - --jq '.comments[].body | select(contains("vercel.app"))' | grep -o 'https://[^ )]*vercel.app[^ )]*' | head -1 -``` - -Post back to the original Slack thread: - -> PR created: -> Preview: /models/MODEL-SLUG -> Please review and approve. Once merged, the page will be live at comfy.org/models/MODEL-SLUG. -> Note: OG image and thumbnail still needed — tagged design team in the PR. - -If the Vercel URL is not available within 2 minutes, post the PR URL alone and note the preview is pending. +For UPDATE use branch `update-model-page-MODEL-SLUG`. +For REMOVE use `remove-model-page-MODEL-SLUG` and omit the images note. --- @@ -216,8 +182,7 @@ If the Vercel URL is not available within 2 minutes, post the PR URL alone and n | Situation | Response | |-----------|----------| -| Model not in workflow templates | "I couldn't find MODEL-NAME in the workflow templates. Check the spelling or ask an engineer to add it to `workflow_templates/templates/`." | -| Slug already exists (add) | Automatically switch to update flow; tell the user. | -| Slug not found (update/remove) | "There's no model page for MODEL-SLUG yet. Did you mean to add one?" | -| Typecheck fails | Fix the error, do not push a broken PR. | -| `generate-models.ts` errors | Share the error output in Slack and stop. | +| Model not in workflow templates | Ask user to verify spelling or add it manually as a partner node | +| Slug already exists (add) | Switch to update flow automatically | +| Slug not found (update/remove) | Stop and ask user to confirm | +| Typecheck fails | Fix the error before pushing | diff --git a/.github/workflows/model-page-discovery.yml b/.github/workflows/model-page-discovery.yaml similarity index 71% rename from .github/workflows/model-page-discovery.yml rename to .github/workflows/model-page-discovery.yaml index 9e224e158a..14a4e2b726 100644 --- a/.github/workflows/model-page-discovery.yml +++ b/.github/workflows/model-page-discovery.yaml @@ -2,7 +2,7 @@ name: Model Page Discovery on: schedule: - - cron: '0 9 * * 1' # Every Monday at 9am UTC + - cron: '0 9 * * 1' workflow_dispatch: jobs: @@ -14,41 +14,27 @@ jobs: steps: - name: Checkout ComfyUI_frontend - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: path: ComfyUI_frontend - name: Checkout workflow_templates - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: Comfy-Org/workflow_templates path: workflow_templates - - name: Setup Node 20 - uses: actions/setup-node@v4 + - name: Setup Node + uses: actions/setup-node@v6 with: node-version: '20' - name: Setup pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 with: version: latest run_install: false - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - working-directory: ComfyUI_frontend - - - name: Cache pnpm store - uses: actions/cache@v4 - with: - path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('ComfyUI_frontend/**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Install dependencies run: pnpm install --frozen-lockfile working-directory: ComfyUI_frontend @@ -66,26 +52,27 @@ jobs: set -euo pipefail cd ComfyUI_frontend - # Extract slugs from the generated out.json NEW_SLUGS=$(node -e " const fs = require('fs'); const models = JSON.parse(fs.readFileSync('out.json', 'utf8')); const arr = Array.isArray(models) ? models : Object.values(models); - const slugs = arr.map(m => m.slug).filter(Boolean); + const slugs = arr.map(m => m.suggestedSlug ?? m.slug).filter(Boolean); console.log(JSON.stringify(slugs)); ") - # Extract slugs from existing models.ts config EXISTING_SLUGS=$(node -e " const fs = require('fs'); - const content = fs.readFileSync('apps/website/src/config/models.ts', 'utf8'); - // Match slug: 'value' or slug: \"value\" patterns - const matches = [...content.matchAll(/slug\s*:\s*['\"]([^'\"]+)['\"]/g)]; + const content = fs.readFileSync( + 'apps/website/src/config/models.ts', + 'utf8' + ); + const matches = [ + ...content.matchAll(/slug\s*:\s*['\"]([^'\"]+)['\"]/g) + ]; const slugs = matches.map(m => m[1]); console.log(JSON.stringify(slugs)); " 2>/dev/null || echo '[]') - # Find new slugs not in existing config ADDED_SLUGS=$(node -e " const newSlugs = $NEW_SLUGS; const existing = $EXISTING_SLUGS; @@ -122,7 +109,8 @@ jobs: --title "New models detected — add to model pages" \ --body "## $NEW_COUNT new model(s) found in workflow_templates - The weekly model discovery scan found models present in \`workflow_templates\` that are not yet in \`apps/website/src/config/models.ts\`. + The weekly model discovery scan found models not yet in + \`apps/website/src/config/models.ts\`. ### New slugs ($NEW_COUNT) @@ -131,11 +119,11 @@ jobs: ### Next steps 1. Review which of these warrant an SEO model page - 2. Run \`pnpm tsx apps/website/scripts/generate-models.ts\` locally for full details - 3. Add entries to \`apps/website/src/config/models.ts\` via PR (or use Glary-Bot via Slack) + 2. Run \`pnpm tsx apps/website/scripts/generate-models.ts\` locally + 3. Add entries to \`apps/website/src/config/models.ts\` via PR --- - *Generated by the [model-page-discovery workflow](https://github.com/$GITHUB_REPOSITORY/actions/workflows/model-page-discovery.yml)*" + *Generated by the [model-page-discovery workflow](https://github.com/$GITHUB_REPOSITORY/actions/workflows/model-page-discovery.yaml)*" - name: No new models found if: steps.compare.outputs.new_count == '0' diff --git a/apps/website/src/components/models/ModelHeroSection.vue b/apps/website/src/components/models/ModelHeroSection.vue index 883d9370f3..ca65f90f03 100644 --- a/apps/website/src/components/models/ModelHeroSection.vue +++ b/apps/website/src/components/models/ModelHeroSection.vue @@ -101,7 +101,7 @@ const isPartnerNode = directory === 'partner_nodes' diff --git a/apps/website/src/config/models.ts b/apps/website/src/config/models.ts index 65299df9d3..9f80026ec1 100644 --- a/apps/website/src/config/models.ts +++ b/apps/website/src/config/models.ts @@ -26,7 +26,7 @@ export const models: readonly Model[] = [ displayName: 'models.nano-banana.displayName' as TranslationKey, description: 'models.nano-banana.description' as TranslationKey, directory: 'partner_nodes', - huggingFaceUrl: 'https://huggingface.co/', + huggingFaceUrl: '', docsUrl: 'https://docs.comfy.org/tutorials/partner-nodes/google/nano-banana-pro', ogImage: '/images/models/nano-banana-og.png', thumbnail: '/images/models/nano-banana-thumb.webp', @@ -42,7 +42,7 @@ export const models: readonly Model[] = [ displayName: 'models.kling-ai.displayName' as TranslationKey, description: 'models.kling-ai.description' as TranslationKey, directory: 'partner_nodes', - huggingFaceUrl: 'https://huggingface.co/', + huggingFaceUrl: '', docsUrl: 'https://docs.comfy.org/tutorials/partner-nodes/kling/kling-motion-control', ogImage: '/images/models/kling-ai-og.png', thumbnail: '/images/models/kling-ai-thumb.webp', @@ -58,7 +58,7 @@ export const models: readonly Model[] = [ displayName: 'models.meshy-ai.displayName' as TranslationKey, description: 'models.meshy-ai.description' as TranslationKey, directory: 'partner_nodes', - huggingFaceUrl: 'https://huggingface.co/', + huggingFaceUrl: '', docsUrl: 'https://docs.comfy.org/tutorials/partner-nodes/meshy/meshy-6', ogImage: '/images/models/meshy-ai-og.png', thumbnail: '/images/models/meshy-ai-thumb.webp', diff --git a/apps/website/src/i18n/translations.ts b/apps/website/src/i18n/translations.ts index d3e86a090a..5bb7392dfb 100644 --- a/apps/website/src/i18n/translations.ts +++ b/apps/website/src/i18n/translations.ts @@ -914,9 +914,9 @@ const translations = { 'zh-CN': '我应该选择 Comfy Cloud 还是本地 ComfyUI(自托管)?' }, 'cloud.faq.3.a': { - en: "Comfy Cloud has zero setup, is easy to share with your team, and is faster than most GPUs you can run on a desktop workstation. You can immediately run the best models and workflows from the community on Comfy Cloud.\nLocal ComfyUI is infinitely customizable, works offline, and you don't need to worry about queue times. However, depending on what you want to create, you might need to have a good GPU and some amount of technical knowledge to install community-created custom nodes.", + en: "Comfy Cloud (beta) has zero setup, is easy to share with your team, and is faster than most GPUs you can run on a desktop workstation. You can immediately run the best models and workflows from the community on Comfy Cloud.\nLocal ComfyUI is infinitely customizable, works offline, and you don't need to worry about queue times. However, depending on what you want to create, you might need to have a good GPU and some amount of technical knowledge to install community-created custom nodes.", 'zh-CN': - 'Comfy Cloud 无需任何设置,方便与团队共享,比大多数桌面工作站 GPU 更快。您可以立即在 Comfy Cloud 上运行社区中最好的模型和工作流。\n本地 ComfyUI 可以无限定制,支持离线工作,无需担心排队时间。但根据您的创作需求,可能需要一块好的 GPU 以及一定的技术知识来安装社区创建的自定义节点。' + 'Comfy Cloud(测试版)无需任何设置,方便与团队共享,比大多数桌面工作站 GPU 更快。您可以立即在 Comfy Cloud 上运行社区中最好的模型和工作流。\n本地 ComfyUI 可以无限定制,支持离线工作,无需担心排队时间。但根据您的创作需求,可能需要一块好的 GPU 以及一定的技术知识来安装社区创建的自定义节点。' }, 'cloud.faq.4.q': { en: 'Do I need a GPU or a strong computer to use Comfy Cloud?', @@ -1280,6 +1280,10 @@ const translations = { en: 'Run multiple workflows in parallel to speed up your pipeline.', 'zh-CN': '并行运行多个工作流,加速你的流程。' }, + 'pricing.included.comingSoon': { + en: 'coming soon', + 'zh-CN': '即将推出' + }, // VideoPlayer 'player.play': { en: 'Play', 'zh-CN': '播放' }, @@ -3542,80 +3546,6 @@ const translations = { 'zh-CN': '我们会为您处理请求。' }, - 'demos.category.templates': { en: 'TEMPLATES', 'zh-CN': '模板' }, - 'demos.category.gettingStarted': { en: 'GETTING STARTED', 'zh-CN': '入门' }, - - 'demos.image-to-video.title': { - en: 'Create a Video from an Image', - 'zh-CN': '从图片创建视频' - }, - 'demos.image-to-video.description': { - en: 'Learn how to use the Image to Video workflow template in ComfyUI to generate short video clips from a single image.', - 'zh-CN': - '了解如何使用 ComfyUI 中的图片转视频工作流模板,从单张图片生成短视频。' - }, - 'demos.image-to-video.transcript': { - en: '
  1. Open ComfyUI — Launch the application and you\'ll see the node-based workflow canvas where all your AI pipelines are built.
  2. Browse templates — Click the workflow templates button in the sidebar to browse available starting points.
  3. Select Image to Video — Find and select the "Image to Video" template from the list to load it onto your canvas.
  4. Upload your image — Click the image upload node and select the source image you want to animate.
  5. Run the workflow — Click the "Queue" button to execute the workflow and generate your video output.
', - 'zh-CN': - '
  1. 打开 ComfyUI — 启动应用程序,您将看到基于节点的工作流画布。
  2. 浏览模板 — 点击侧栏中的工作流模板按钮,浏览可用模板。
  3. 选择图片转视频 — 从列表中找到并选择"图片转视频"模板。
  4. 上传图片 — 点击图片上传节点,选择要动画化的源图片。
  5. 运行工作流 — 点击"排队"按钮执行工作流并生成视频输出。
' - }, - - 'demos.workflow-templates.title': { - en: 'Browse Workflow Templates', - 'zh-CN': '浏览工作流模板' - }, - 'demos.workflow-templates.description': { - en: "Explore ComfyUI's built-in workflow templates to quickly get started with common AI generation tasks.", - 'zh-CN': '探索 ComfyUI 内置的工作流模板,快速开始常见的 AI 生成任务。' - }, - 'demos.workflow-templates.transcript': { - en: '
  1. Open the template browser — Click the templates icon in the ComfyUI sidebar to open the template library.
  2. Browse categories — Templates are organized by task: image generation, video, upscaling, and more.
  3. Preview a template — Hover over any template to see a preview of its workflow and expected output.
  4. Load and customize — Click to load a template, then modify parameters to fit your needs.
', - 'zh-CN': - '
  1. 打开模板浏览器 — 点击 ComfyUI 侧栏中的模板图标。
  2. 浏览分类 — 模板按任务分类:图像生成、视频、放大等。
  3. 预览模板 — 将鼠标悬停在模板上查看预览。
  4. 加载并自定义 — 点击加载模板,然后修改参数。
' - }, - - 'demos.nav.nextDemo': { en: "What's Next", 'zh-CN': '下一个演示' }, - 'demos.nav.viewDemo': { en: 'View Demo', 'zh-CN': '查看演示' }, - 'demos.nav.allDemos': { en: 'All Demos', 'zh-CN': '所有演示' }, - 'demos.transcript.label': { en: 'Demo transcript', 'zh-CN': '演示文字记录' }, - 'demos.transcript.note': { - en: '(for accessibility & search)', - 'zh-CN': '(无障碍和搜索)' - }, - 'demos.loading': { - en: 'Loading interactive demo…', - 'zh-CN': '正在加载互动演示…' - }, - 'demos.noscript': { - en: 'This interactive demo requires JavaScript.', - 'zh-CN': '此互动演示需要 JavaScript。' - }, - 'demos.noscript.link': { - en: 'View on Arcade →', - 'zh-CN': '在 Arcade 上查看 →' - }, - 'demos.duration.2min': { en: '~2 min', 'zh-CN': '~2 分钟' }, - 'demos.difficulty.beginner': { en: 'Beginner', 'zh-CN': '入门' }, - 'demos.difficulty.intermediate': { - en: 'Intermediate', - 'zh-CN': '中级' - }, - 'demos.difficulty.advanced': { en: 'Advanced', 'zh-CN': '高级' }, - 'demos.embed.label': { - en: 'Interactive demo', - 'zh-CN': '互动演示' - }, - 'demos.comingSoon.title': { - en: 'Coming Soon', - 'zh-CN': '即将推出' - }, - 'demos.comingSoon.body': { - en: 'This page is being redesigned. Check back soon.', - 'zh-CN': '此页面正在重新设计中,请稍后再来。' - }, - 'demos.breadcrumb.home': { en: 'Home', 'zh-CN': '首页' }, - 'demos.breadcrumb.demos': { en: 'Demos', 'zh-CN': '演示' }, - 'customers.story.whatsNext': { en: "What's next?", 'zh-CN': '接下来看什么?' @@ -3668,49 +3598,6 @@ const translations = { 'zh-CN': 'Creative Studios AI 负责人' }, - // Payment status pages - 'payment.success.label': { - en: 'PAYMENT', - 'zh-CN': '支付' - }, - 'payment.success.title': { - en: 'Payment successful', - 'zh-CN': '支付成功' - }, - 'payment.success.subtitle': { - en: "Thanks for your purchase. Your account has been credited and you're ready to keep building.", - 'zh-CN': '感谢您的购买。您的账户已充值完成,可以继续创作了。' - }, - 'payment.success.primaryCta': { - en: 'CONTINUE TO COMFY CLOUD', - 'zh-CN': '前往 COMFY CLOUD' - }, - 'payment.success.secondaryCta': { - en: 'VIEW USAGE & PAYMENTS', - 'zh-CN': '查看用量与支付' - }, - 'payment.failed.label': { - en: 'PAYMENT', - 'zh-CN': '支付' - }, - 'payment.failed.title': { - en: 'Payment was not completed', - 'zh-CN': '支付未完成' - }, - 'payment.failed.subtitle': { - en: "Your payment didn't go through and you have not been charged. Reach out to support or read the subscription docs if you need help.", - 'zh-CN': - '您的支付未能完成,未发生扣款。如需帮助,请联系支持或查阅订阅文档。' - }, - 'payment.failed.primaryCta': { - en: 'CONTACT SUPPORT', - 'zh-CN': '联系支持' - }, - 'payment.failed.secondaryCta': { - en: 'READ SUBSCRIPTION DOCS', - 'zh-CN': '查看订阅文档' - } - // Models – UI keys 'models.hero.eyebrow': { en: 'AI Model', diff --git a/apps/website/src/pages/p/supported-models/[slug].astro b/apps/website/src/pages/p/supported-models/[slug].astro index 5f7d579864..58b222c3f8 100644 --- a/apps/website/src/pages/p/supported-models/[slug].astro +++ b/apps/website/src/pages/p/supported-models/[slug].astro @@ -130,7 +130,6 @@ const faqJsonLd = { blogUrl={model.blogUrl} workflowCount={model.workflowCount} directory={model.directory} - client:load />
@@ -144,6 +143,7 @@ const faqJsonLd = { Read the full tutorial →