{"id":"5e7ec268-2b31-433f-9831-7e5d8ea54c7d","entityType":"agent","slug":"clawhub-weipaiban-weipaiban-skill","name":"微排版","canonicalUrl":"https://www.xpersona.co/agent/clawhub-weipaiban-weipaiban-skill","canonicalPath":"/agent/clawhub-weipaiban-weipaiban-skill","generatedAt":"2026-10-12T09:07:50.992Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-12T00:32:08.853Z","emptyReason":null},"description":"微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换 Skill: 微排版 Owner: weipaiban Summary: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换 Tags: design:1.0.0, latest:1.2.0, productivity:1.0.0, social:1.0.0, wechat:1.0.0 Version history: v1.2.0 | 2026-04-29T03:07:07.634Z | auto **v1.2.0 introduces enhanced execution safety and improved dependency transparency.** - 增加“执行门禁（安全基线）”说明，明确强制确认及受控自动连续执行动作，提升交互安全性 - 新增“写入最小化说明”，详细说明本地缓存及中间文件写入范围 - 明确 Step 9 增加“最终提交前变更摘要确认”为强制交互点","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 967 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s17fbxhkd59r66jc27xkyxzkh984dbpe:weipaiban-skill","sourceUrl":"https://clawhub.ai/weipaiban/weipaiban-skill","homepage":"https://clawhub.ai/weipaiban/skills/weipaiban-skill","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/weipaiban/weipaiban-skill","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/weipaiban/skills/weipaiban-skill","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换 Skill: 微排版 Owner: weipaiban Summary: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换 Tags: design:1.0.0, latest:1."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:32:08.853Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:32:08.853Z","emptyReason":null},"stars":null,"forks":null,"downloads":967,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.2.0","tractionLabel":"967 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T00:32:08.834Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T00:32:08.853Z","lastCrawledAt":"2026-10-12T00:32:08.834Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T00:32:08.834Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.0","createdAt":"2026-04-29T03:07:07.634Z","changelog":"**v1.2.0 introduces enhanced execution safety and improved dependency transparency.** - 增加“执行门禁（安全基线）”说明，明确强制确认及受控自动连续执行动作，提升交互安全性 - 新增“写入最小化说明”，详细说明本地缓存及中间文件写入范围 - 明确 Step 9 增加“最终提交前变更摘要确认”为强制交互点 - 细化外部依赖和缓存行为，完善任务目录的写入说明 - 文档内用词及结构小幅优化，提升可读性","fileCount":18,"zipByteSize":41594},{"version":"1.1.0","createdAt":"2026-04-26T01:35:36.200Z","changelog":"- 更新图片生成可选依赖：使用 VOLCENGINE_AK/SK/TOKEN 代替 JIMENG_ACCESS_KEY/SECRET_KEY - SKILL.md、运行时依赖和图片生成步骤文档同步变更为 Volcengine 配置方式 - 可选依赖检测和降级逻辑调整为匹配 VOLCENGINE 环境变量要求 - 其他文档细节与提示内容适配上述凭据变动","fileCount":17,"zipByteSize":37621},{"version":"1.0.1","createdAt":"2026-04-24T09:05:00.730Z","changelog":"**Step 8 图片生成改为可选并增加运行环境自检** - 新增详细依赖清单与降级说明，支持图片生成功能的缺省与跳过 - 交互点增加依赖检测，图片生成阶段（Step 8）支持缺失 jimeng-ai/凭据/rembg 时由用户选择跳过 - 优化 metadata，声明可选环境变量、外部依赖和技能写入目录 - 迁移依赖、运行环境和执行流程相关说明至 references/runtime-dependencies.md - 删除了旧的 CHANGELOG.md 与 README.md，精简文档结构","fileCount":17,"zipByteSize":36960},{"version":"1.0.0","createdAt":"2026-04-24T03:43:24.381Z","changelog":"首次发布","fileCount":18,"zipByteSize":34033}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17fbxhkd59r66jc27xkyxzkh984dbpe:weipaiban-skill","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T09:07:50.989Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-weipaiban-weipaiban-skill/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-12T00:32:08.853Z","emptyReason":null},"readme":"Skill: 微排版\n\nOwner: weipaiban\n\nSummary: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换\n\nTags: design:1.0.0, latest:1.2.0, productivity:1.0.0, social:1.0.0, wechat:1.0.0\n\nVersion history:\n\nv1.2.0 | 2026-04-29T03:07:07.634Z | auto\n\n**v1.2.0 introduces enhanced execution safety and improved dependency transparency.**\n\n- 增加“执行门禁（安全基线）”说明，明确强制确认及受控自动连续执行动作，提升交互安全性\n- 新增“写入最小化说明”，详细说明本地缓存及中间文件写入范围\n- 明确 Step 9 增加“最终提交前变更摘要确认”为强制交互点\n- 细化外部依赖和缓存行为，完善任务目录的写入说明\n- 文档内用词及结构小幅优化，提升可读性\n\nv1.1.0 | 2026-04-26T01:35:36.200Z | auto\n\n- 更新图片生成可选依赖：使用 VOLCENGINE_AK/SK/TOKEN 代替 JIMENG_ACCESS_KEY/SECRET_KEY\n- SKILL.md、运行时依赖和图片生成步骤文档同步变更为 Volcengine 配置方式\n- 可选依赖检测和降级逻辑调整为匹配 VOLCENGINE 环境变量要求\n- 其他文档细节与提示内容适配上述凭据变动\n\nv1.0.1 | 2026-04-24T09:05:00.730Z | auto\n\n**Step 8 图片生成改为可选并增加运行环境自检**\n\n- 新增详细依赖清单与降级说明，支持图片生成功能的缺省与跳过\n- 交互点增加依赖检测，图片生成阶段（Step 8）支持缺失 jimeng-ai/凭据/rembg 时由用户选择跳过\n- 优化 metadata，声明可选环境变量、外部依赖和技能写入目录\n- 迁移依赖、运行环境和执行流程相关说明至 references/runtime-dependencies.md\n- 删除了旧的 CHANGELOG.md 与 README.md，精简文档结构\n\nv1.0.0 | 2026-04-24T03:43:24.381Z | user\n\n首次发布\n\nArchive index:\n\nArchive v1.2.0: 18 files, 41594 bytes\n\nFiles: examples/usage-example.md (1698b), references/api-formats.md (3771b), references/error-handling.md (524b), references/runtime-dependencies.md (6097b), skill-card.md (2900b), SKILL.md (11237b), steps/01-extract-tags.md (1313b), steps/02-search-templates.md (3972b), steps/03-create-and-parse.md (8597b), steps/05-color-scheme.md (3330b), steps/06-generate-text.md (2119b), steps/07-image-analysis.md (10225b), steps/08a-image-prompts.md (13260b), steps/08b-image-generate.md (3314b), steps/08c-image-bg-remove.md (2988b), steps/08d-image-upload.md (4911b), steps/09-update-and-complete.md (3985b), _meta.json (134b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: weipaiban-skill\ndescription: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换\nversion: 1.2.0\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: '🎨'\n    requires:\n      env:\n        - WEIPAIBAN_API_KEY\n    primaryEnv: WEIPAIBAN_API_KEY\n    optionalEnv:\n      - VOLCENGINE_AK\n      - VOLCENGINE_SK\n      - VOLCENGINE_TOKEN\n    optionalSkills:\n      - jimeng-ai\n    optionalBinaries:\n      - python3\n      - rembg\n    externalServices:\n      - weipaiban.cn\n      - jimeng.com\n    writes:\n      - /tmp/weipaiban-task-*/\n      - ~/.u2net/u2netp.onnx\n---\n\n# 微排版技能\n\n你是微排版 AI 助手，能够帮助用户基于模板快速创建和编辑微信图文作品。\n\n## 环境变量\n\n- `WEIPAIBAN_API_KEY`：微排版平台 API 密钥（必须），格式为 `sk-` 开头，如果没有，需要用户去 <https://weipaiban.cn/settings/api-keys> 上进行生成\n- `WEIPAIBAN_API_BASE`：微排版 API 地址（可选），默认值为 `https://weipaiban.cn`\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```text\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\n## 运行时依赖\n\n微排版技能将依赖项按\"必需 / 可选\"区分，透明告知用户并支持降级执行。详细说明见 [references/runtime-dependencies.md](references/runtime-dependencies.md)。\n\n### 必需依赖\n\n- **凭据**：`WEIPAIBAN_API_KEY`\n- **外部服务**：`weipaiban.cn`（模板搜索、作品管理、CDN 上传）\n- **磁盘写入**：`/tmp/weipaiban-task-{workId}/`（任务中间结果，任务结束后可清理）\n\n### 可选依赖（仅 Step 8 图片生成阶段使用）\n\n- **凭据**：`VOLCENGINE_AK`（必需），`VOLCENGINE_SK` 与 `VOLCENGINE_TOKEN` 至少配置其一（永久凭证用 SK；临时凭证 AKTP/STS 用 TOKEN）\n- **依赖技能**：`jimeng-ai`（通过 clawhub 或 find-skill 安装）\n- **本地二进制**：\n  - `python3`（≥3.9）\n  - `rembg`：仅使用 `u2netp` 轻量模型（固定参数 `-m u2netp`），首次运行下载 `~/.u2net/u2netp.onnx`（约 4.7MB）\n- **外部服务**：即梦 API（图片生成）\n\n### 缺失可选依赖时的降级行为\n\n**如果未配置 VOLCENGINE_* 或未安装 jimeng-ai / rembg，Step 8（图片生成）将被跳过**，作品保留模板原图；其他步骤（模板选择、配色、文本替换、作品更新）仍正常执行。Step 8a 在执行前会检测依赖并进入交互点，由用户选择「安装」「跳过图片生成」或「取消」。**技能不会在未经用户同意的情况下自动执行 `pip install` 或安装其他技能。**\n\n### 写入最小化说明\n\n- `/tmp/weipaiban-task-{workId}/`：仅用于当前任务中间文件与断点恢复，默认不会触达其他业务路径\n- `~/.u2net/u2netp.onnx`：仅在用户启用 Step 8 且实际执行去背景时才会触发首次缓存写入\n- 任务完成后可按需手动清理：`rm -rf /tmp/weipaiban-task-{workId}/`，模型缓存可单独删除\n\n## 交互规则\n\n**⚠️ 逐步确认模式**：每个标记了 ⏸️ 的步骤都是强制交互点，必须暂停等待用户明确回复后才能继续执行下一步。禁止跳过交互点或自动连续执行多个步骤。\n\n## 执行门禁（安全基线）\n\n为平衡体验与安全，执行遵循“默认连续执行 + 关键动作确认”的门禁：\n\n1. **强制确认动作**：模板选择（Step 2 交互点）、依赖安装（Step 8a 交互点）、失败重试策略（Step 8d 交互点）、最终提交前变更摘要确认（Step 9）\n2. **受控自动动作**：仅在强制确认已完成且用户未中止时，允许连续执行 Step 3-4.1 与 Step 8b-8d 的非交互子步骤\n3. **中止优先**：用户任意时刻提出暂停/取消，立即停止后续外部请求与写入动作\n4. **占位命令规则**：步骤文件中的命令为模板示例，执行前必须替换占位值并校验目标路径/参数\n\n## 执行协议\n\n**⚠️ 严格逐步执行**：本技能采用\"按需加载、逐步执行\"模式，必须遵循以下规则：\n\n1. **一次只执行一个步骤**：当前步骤完全完成前，禁止读取或执行下一个步骤的详情文件\n2. **按需读取**：执行每个步骤时才读取该步骤的详情文件（如 `steps/01-extract-tags.md`），禁止提前读取后续步骤\n3. **禁止批量加载**：禁止一次性读取多个步骤文件，每个步骤的详情文件在需要时才加载\n4. **步骤完成确认**：每个步骤完成后确认产出数据写入任务目录，再进入下一步骤\n5. **上下文精简**：进入新步骤时，从任务目录读取该步所需的最小数据，不保留上一步骤文件的完整指令文本或上下文中的大段数据\n\n## 任务目录\n\n每次执行微排版任务时，使用临时任务目录在磁盘上持久化中间结果，步骤间通过文件传递数据，避免在上下文中累积大量数据。\n\n**目录路径**：`/tmp/weipaiban-task-{workId}/`（Step 1 时 workId 未知，使用时间戳创建临时目录；Step 3 获得 workId 后重命名）\n\n**目录结构**：\n\n```\n/tmp/weipaiban-task-{workId}/\n├── meta.json                    # 全局元信息（workId, theme, currentStep 等）\n├── elements.json                # Step 4 原始 elements 完整数据\n├── template-profile.json        # Step 4.1 模板画像\n├── color-changes.json           # Step 5 配色变更\n├── text-changes.json            # Step 6 文本变更\n├── image-classifications.json   # Step 7 图片分类结果\n├── image-prompts.json           # Step 8a 提示词计划\n├── image-progress.json          # Step 8b/8c/8d 逐张进度追踪\n├── update-payload.json          # Step 9 最终提交负载\n└── images/                      # 图片处理临时文件\n```\n\n**使用规则**：\n\n- 每个步骤开始时，仅从任务目录读取该步所需的文件和字段（各步骤详情文件中有明确说明）\n- 每个步骤完成后，将产出数据写入对应文件，并更新 `meta.json` 的 `currentStep`\n- 禁止将完整 elements JSON、template_profile 等大段数据保持在上下文中——需要时从文件重新读取\n\n## 工作流程\n\n当用户请求使用微排版技能创建图文作品时，严格按照以下步骤**顺序**执行。**每个步骤开始时，才读取该步骤的详情文件**——禁止提前读取后续步骤文件。\n\n> **Step 8（图片生成）为可选阶段**：依赖 `jimeng-ai` 技能、`VOLCENGINE_*` 凭据和本地 `rembg` 工具。缺失依赖时由用户选择跳过，作品将保留模板原图；其他步骤（配色、文本替换、作品更新）仍正常执行。\n\n| 步骤      | 名称                 | 说明                                                  | 交互点                   | 详情                                                               |\n| --------- | -------------------- | ----------------------------------------------------- | ------------------------ | ------------------------------------------------------------------ |\n| Step 1    | 提取分类标签和关键词 | 从用户输入提取标签、关键词、具体要求                  | -                        | [steps/01-extract-tags.md](steps/01-extract-tags.md)               |\n| Step 2    | 搜索模板             | 级联降级搜索模板库（分路检索 + 合并去重 + 默认兜底）  | ⏸️ 用户选择模板          | [steps/02-search-templates.md](steps/02-search-templates.md)       |\n| Step 3-4  | 创建作品 + 获取元素  | 克隆模板、获取元素、自动生成模板画像                  | - (连续执行)             | [steps/03-create-and-parse.md](steps/03-create-and-parse.md)       |\n| Step 5    | 生成配色方案         | 根据主题生成 3-5 个协调主色调，替换 rect/text 颜色    | ⏸️ 用户确认配色          | [steps/05-color-scheme.md](steps/05-color-scheme.md)               |\n| Step 6    | 生成新文本           | 根据主题生成匹配长度和用途的替换文本                  | ⏸️ 用户确认文本          | [steps/06-generate-text.md](steps/06-generate-text.md)             |\n| Step 7    | 图片分析与分类       | 三重信号（名称/尺寸/视觉）分析，6 级分类              | ⏸️ 用户确认分类          | [steps/07-image-analysis.md](steps/07-image-analysis.md)           |\n| Step 8a   | 图片提示词规划（可选）| 检测依赖 + 构造每张图片的生成 prompt                 | ⏸️ 缺失依赖时确认安装/跳过 | [steps/08a-image-prompts.md](steps/08a-image-prompts.md)           |\n| Step 8b   | 图片生成（可选）     | 逐张调用即梦 API 生成图片                             | -                        | [steps/08b-image-generate.md](steps/08b-image-generate.md)         |\n| Step 8c   | 图片背景去除（可选） | 使用 rembg 仅以 `u2netp` 轻量模型去背景并输出透明图   | -                        | [steps/08c-image-bg-remove.md](steps/08c-image-bg-remove.md)       |\n| Step 8d   | 图片上传 CDN（可选） | 逐张上传微排版素材库，汇总结果                        | ⏸️ 失败重试确认          | [steps/08d-image-upload.md](steps/08d-image-upload.md)             |\n| Step 9-10 | 更新作品 + 完成      | 汇总所有变更，批量提交更新，展示编辑链接              | -                        | [steps/09-update-and-complete.md](steps/09-update-and-complete.md) |\n\n## 断点恢复\n\n如果用户提供了已有的作品 ID（workId），或提到之前中断的任务，先检查任务目录是否存在：\n\n1. 检查 `/tmp/weipaiban-task-{workId}/meta.json` 是否存在\n2. 如果存在，读取 `currentStep` 字段，确定上次执行到哪一步\n3. 验证该步骤之前的所有必要文件是否完整（如 elements.json、template-profile.json 等）\n4. 向用户展示恢复状态，从断点步骤继续执行\n\n| currentStep  | 恢复行为                                                                 |\n| ------------ | ------------------------------------------------------------------------ |\n| 01 / 02      | 从对应步骤重新开始                                                       |\n| 03           | 检查 elements.json 和 template-profile.json 是否完整，完整则跳到 Step 5  |\n| 05 / 06 / 07 | 检查对应输出文件是否存在，存在则展示给用户确认，否则重新执行该步骤       |\n| 08a          | 若 `meta.json` 中 `skipImageGeneration=true`，直接跳到 Step 9；否则重新执行依赖检测交互点 |\n| 08b          | 读取 image-progress.json，仅对 status=pending 的图片重新生成             |\n| 08c          | 读取 image-progress.json，仅对需透明且 status=generated 的图片执行去白底 |\n| 08d          | 读取 image-progress.json，仅对未上传的图片执行上传                       |\n| 09 / done    | 重新构建 payload 并提交，或告知用户已完成                                |\n\n## 参考资料\n\n- [API 端点与响应格式](references/api-formats.md)\n- [错误处理](references/error-handling.md)\n- [使用示例](examples/usage-example.md)\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn729y74k4eyhx5ax4zzmqvd1s84decf\",\n  \"slug\": \"weipaiban-skill\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1777432027634\n}\n\nFile v1.2.0:references/api-formats.md\n\n# API 端点与响应格式参考\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\nAPI 基础地址：`${WEIPAIBAN_API_BASE:-https://weipaiban.cn}`\n\n---\n\n## 模板搜索响应\n\n`GET /api/v1/templates`\n\n```json\n{\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": \"模板ID\",\n        \"title\": \"模板标题\",\n        \"description\": \"模板描述\",\n        \"tags\": [\"标签1\", \"标签2\"],\n        \"thumbnail\": \"缩略图URL\",\n        \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n      }\n    ],\n    \"total\": 10,\n    \"page\": 1,\n    \"perPage\": 5\n  }\n}\n```\n\n## 默认模板响应\n\n`GET /api/v1/templates/default`\n\n```json\n{\n  \"data\": {\n    \"id\": \"模板ID\",\n    \"title\": \"模板标题\",\n    \"description\": \"模板描述\",\n    \"tags\": [\"标签1\", \"标签2\"],\n    \"thumbnail\": \"缩略图URL\",\n    \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## 克隆模板响应\n\n`POST /api/v1/templates/{模板ID}/clone`\n\n请求体：`{\"title\": \"作品标题\"}`\n\n```json\n{\n  \"data\": {\n    \"id\": \"新作品ID\",\n    \"title\": \"作品标题\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## Parser 获取响应\n\n`GET /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"elements\": [\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"标题文本\",\n        \"type\": \"text\",\n        \"text\": \"原始文本内容\",\n        \"charCount\": 7,\n        \"fill\": \"#333333\"\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景色块\",\n        \"type\": \"rect\",\n        \"fill\": \"#d9d9d9\",\n        \"width\": 750,\n        \"height\": 1200\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景图\",\n        \"type\": \"image\",\n        \"image\": {\n          \"src\": \"https://原始图片地址\",\n          \"width\": 800,\n          \"height\": 600,\n          \"ratio\": \"4:3\"\n        }\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"轮播图\",\n        \"type\": \"slideshow\",\n        \"assets\": [\n          {\n            \"id\": \"asset1\",\n            \"title\": \"高山.jpg\",\n            \"src\": \"https://图片地址1\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          },\n          {\n            \"id\": \"asset2\",\n            \"title\": \"草地.jpg\",\n            \"src\": \"https://图片地址2\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n## Parser 更新响应\n\n`POST /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## CDN 上传响应\n\n`POST /api/v1/assets/fetch`\n\n请求体：`{\"url\": \"图片URL\"}`\n\n该接口基于文件内容 SHA1 哈希自动去重：相同图片重复上传返回 HTTP 200（已有记录），新图片上传返回 HTTP 201。\n\n成功响应：\n\n```json\n{\n  \"data\": {\n    \"id\": \"资源ID\",\n    \"type\": \"image\",\n    \"name\": \"存储路径\",\n    \"title\": \"文件名\",\n    \"src\": \"https://svg-cdn.creatby.com/...\",\n    \"width\": 800,\n    \"height\": 600,\n    \"size\": 123456,\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n错误响应（400/413/415/502/504）：\n\n```json\n{\n  \"error\": {\n    \"message\": \"错误描述\",\n    \"code\": 400\n  }\n}\n```\n\n## CDN 文件上传\n\n`POST /api/v1/assets/upload`\n\n请求格式：`multipart/form-data`，字段 `file` 为图片文件。\n\n```bash\ncurl -s --max-time 30 -X POST \\\n  -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  -F \"file=@本地文件路径\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/assets/upload\"\n```\n\n响应格式与 `/api/v1/assets/fetch` 相同（同样支持 SHA1 去重）。\n\nFile v1.2.0:references/error-handling.md\n\n# 错误处理\n\n- **401 Unauthorized**：API Key 无效或过期，提示用户在微排版平台重新生成 API Key\n- **403 Forbidden**：用户角色权限不足，需要 admin 或 developer 角色\n- **404 Not Found**：模板或作品不存在，检查 ID 是否正确\n- **429 Too Many Requests**：请求频率超限（60次/分钟），等待后重试\n- **模板搜索无结果**：按级联降级策略自动重试（tags+search → 仅search → 仅tags → 默认模板），全部无果时使用默认模板兜底\n\nFile v1.2.0:references/runtime-dependencies.md\n\n# 运行时依赖与数据流参考\n\n本文件集中说明微排版技能在运行时所需的凭据、外部服务、本地二进制、磁盘写入以及数据流向。元数据（SKILL.md / README.md 顶部）是简要声明，此处是完整释义。\n\n---\n\n## 依赖总览\n\n| 类别       | 名称                  | 必需 / 可选 | 用途                                   |\n| ---------- | --------------------- | ----------- | -------------------------------------- |\n| 凭据       | `WEIPAIBAN_API_KEY`   | 必需        | 微排版平台 API 鉴权                    |\n| 凭据       | `WEIPAIBAN_API_BASE`  | 可选        | 自定义微排版 API 地址（默认官方）      |\n| 凭据       | `VOLCENGINE_AK`       | 可选\\*      | 火山引擎鉴权（Step 8 必需）            |\n| 凭据       | `VOLCENGINE_SK`       | 可选\\*      | 永久凭证鉴权（SK/TOKEN 二选一）        |\n| 凭据       | `VOLCENGINE_TOKEN`    | 可选\\*      | 临时凭证（AKTP/STS）鉴权               |\n| 依赖技能   | `jimeng-ai`           | 可选        | 封装即梦图片生成调用                   |\n| 本地二进制 | `python3`（≥3.9）     | 可选        | 运行 rembg                             |\n| 本地二进制 | `rembg` CLI           | 可选        | 背景去除（仅使用 `u2netp` 轻量模型）   |\n| 外部服务   | `weipaiban.cn`        | 必需        | 模板搜索、作品管理、素材 CDN 上传      |\n| 外部服务   | 即梦 API              | 可选        | 根据 prompt 生成图片                   |\n| 磁盘写入   | `/tmp/weipaiban-task-{workId}/` | 必需 | 任务中间文件（元信息、图片、进度）     |\n| 磁盘写入   | `~/.u2net/u2netp.onnx`| 可选        | rembg u2netp 模型缓存（约 4.7MB）      |\n\n> \\* 整体 Step 8（图片生成）为可选阶段；一旦启用，则 `VOLCENGINE_AK` 必需，且 `VOLCENGINE_SK` 与 `VOLCENGINE_TOKEN` 至少配置其一。\n\n---\n\n## 数据流\n\n### 基础流程（必需依赖）\n\n```text\n用户输入\n  → 主代理\n  → weipaiban.cn（模板搜索、克隆、获取 elements、更新作品）\n  → 本地 /tmp/weipaiban-task-{workId}/（缓存中间 JSON）\n  → 返回作品编辑链接\n```\n\n此流程仅在微排版平台和本地磁盘之间往返，不涉及第三方图片服务。\n\n### 图片生成流程（可选阶段 Step 8）\n\n```text\n主代理\n  → jimeng-ai 技能 → 即梦 API（发送 prompt / ratio，返回临时图片 URL）\n  → 本地下载到 /tmp/weipaiban-task-{workId}/images/{elementId}_generated.png\n  → rembg -m u2netp（若 needsTransparent=true）→ {elementId}_nobg.png\n  → weipaiban.cn /api/v1/assets/upload 或 /api/v1/assets/fetch\n  → 获取 CDN 永久 URL\n```\n\n> **重要**：发送给即梦 API 的 prompt 由用户主题 + 模板画像 + 配色方案拼接而成；图片内容最终会上传到 weipaiban CDN 并成为作品的一部分。用户应确认这两个服务对上传内容的隐私政策。\n\n---\n\n## 安装命令与副作用\n\n### 安装 `jimeng-ai` 技能\n\n通过 clawhub 或 find-skill 技能查找并安装。具体命令由 clawhub/find-skill 决定，不在本技能控制范围内。\n\n### 安装 `rembg`\n\n```bash\npip3 install \"rembg[cpu,cli]~=2.0.67\"\n```\n\n**副作用**：\n\n- 安装 `rembg`、`onnxruntime`（CPU 版本）、`pymatting` 等依赖\n- **首次运行时**下载 `u2netp.onnx`（约 4.7MB）到 `~/.u2net/u2netp.onnx`\n- 本技能**固定**使用 `u2netp` 轻量模型（命令 `rembg i -m u2netp`），不会下载其他模型（如完整版 `u2net` 176MB）\n\n### 版本升级流程（锁定版本维护）\n\n为降低供应链风险，`rembg` 采用精确版本锁定。升级时按以下流程执行：\n\n1. 在隔离环境评估新版本兼容性（命令参数、模型下载行为、处理质量）\n2. 通过 Step 8 全链路回归（8a/8b/8c/8d）验证稳定性\n3. 更新本文和 Step 8a 中的锁定版本号，保持文档口径一致\n4. 在变更记录中注明升级理由与验证范围\n\n### 申请 `VOLCENGINE_AK` / `VOLCENGINE_SK` / `VOLCENGINE_TOKEN`\n\n需在火山引擎/即梦平台自行申请。本技能不会通过 API 自动生成或读取密钥文件。\n\n- **永久凭证**：在火山引擎控制台创建访问密钥，得到 `AKLT…` 开头的 AK 与对应的 SK，配置 `VOLCENGINE_AK` + `VOLCENGINE_SK`\n- **临时凭证（STS）**：通过 STS 接口换取临时凭证，得到 `AKTP…` 开头的 AK + Token，配置 `VOLCENGINE_AK` + `VOLCENGINE_TOKEN`（此时 SK 可省略）\n\n---\n\n## 用户同意原则\n\n本技能严格遵循以下原则：\n\n1. **不在未经用户同意的情况下执行安装命令**。Step 8a 的依赖检测只做\"检测 + 展示结果 + 请求用户选择\"，不会直接运行 `pip install` 或安装其他技能\n2. **降级可用**：缺失可选依赖时，用户可选择跳过 Step 8，作品保留模板原图，其他步骤仍然完成\n3. **展示完整命令**：用户选择「安装」后，每条命令执行前都会再次展示并请求确认\n\n---\n\n## 隔离与最小化凭据建议\n\n- **隔离运行**：若对隐私或磁盘占用有顾虑，建议在容器或沙箱环境中运行。任务目录 `/tmp/weipaiban-task-*/` 默认随系统重启清理；`~/.u2net/u2netp.onnx` 可以手动删除\n- **凭据最小化**：仅为微排版账号提供必要权限的 API Key。若使用火山引擎/即梦，建议优先使用 STS 临时凭证（`VOLCENGINE_AK` + `VOLCENGINE_TOKEN`），并设定使用期限或调用配额限制\n- **任务目录清理**：任务完成后可手动执行 `rm -rf /tmp/weipaiban-task-{workId}/` 清理中间文件（技能本身不会主动删除，以便失败重试）\n\n---\n\n## 已知外部端点清单\n\n- `https://weipaiban.cn/api/v1/templates` / `/templates/default` / `/templates/{id}/clone`\n- `https://weipaiban.cn/api/v1/vectors/{workId}/parser`\n- `https://weipaiban.cn/api/v1/assets/fetch` / `/assets/upload`\n- 即梦图片生成端点（由 `jimeng-ai` 技能内部调用，本技能不直接暴露 URL）\n\n本技能不会向除此之外的任何外部服务发送请求。\n\nFile v1.2.0:examples/usage-example.md\n\n# 使用示例\n\n用户：\"请帮我用微排版创建一个清明节的微信图文\"\n\n执行流程：\n\n1. 提取分类标签和关键词：标签 `节日`，关键词\"清明\"。创建任务目录 `/tmp/weipaiban-task-tmp-{时间戳}/`，写入 `meta.json`\n2. 搜索模板：分别执行仅关键词搜索（`search=清明`）和仅标签搜索（`tags=节日`），每路各取前 5，按模板 ID 去重合并\n3. 展示最多 10 个候选模板，用户选择一个。更新 `meta.json` 的 templateId\n4. 从模板创建新作品，重命名任务目录为 `/tmp/weipaiban-task-{作品ID}/`\n5. 获取简化元素（文本、矩形色块、图片、轮播），写入 `elements.json`\n6. 自动分析模板画像（排版类型、色系、密度），写入 `template-profile.json`\n7. 根据清明节主题生成清新绿色系配色方案，替换 rect 和 text 的颜色。用户确认后写入 `color-changes.json`\n8. 为每个文本生成清明节主题的新内容。用户确认后写入 `text-changes.json`\n9. 分析每张图片的用途和内容（通过名称、尺寸、视觉识别），分类为场景背景/人物/装饰等，跳过 logo 和二维码。用户确认后写入 `image-classifications.json`\n10. 为每张图片构造分类专属的生成 prompt，写入 `image-prompts.json`，初始化 `image-progress.json`\n11. 逐张调用即梦 API 生成图片，每张完成后即时反馈进度\n12. 对需要透明背景的图片逐张执行 rembg 白底转透明\n13. 逐张上传到微排版 CDN，展示汇总结果，失败可重试\n14. 从 `color-changes.json`、`text-changes.json`、`image-progress.json` 汇总所有变更，批量更新作品\n15. 返回编辑链接给用户\n\nFile v1.2.0:skill-card.md\n\n## Description:\n\n微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[weipaiban](https://clawhub.ai/user/weipaiban)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal creators, marketers, and developers use this skill to create and revise WeChat article designs from Weipaiban templates, including template selection, color updates, text replacement, optional image generation, and final publication handoff.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill sends a powerful Weipaiban API credential to a configurable API endpoint.\n\nMitigation: Use a narrowly scoped API key and keep WEIPAIBAN_API_BASE on the official Weipaiban origin unless the alternate server is fully trusted.\n\nRisk: Generated prompts, image URLs, and uploaded image files may be sent to Weipaiban and, when optional image generation is enabled, Jimeng.\n\nMitigation: Do not process content that should not be shared with those services; review their privacy terms before enabling image generation or upload flows.\n\nRisk: Optional image generation and background removal may require installing jimeng-ai and rembg.\n\nMitigation: Approve optional installs only after checking the package identity and source, and prefer running the workflow in an isolated environment.\n\nRisk: Execution can leave task intermediates and a rembg model cache on local disk.\n\nMitigation: Clean /tmp/weipaiban-task-* directories after use and remove ~/.u2net/u2netp.onnx when the background-removal cache is no longer needed.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/weipaiban/skills/weipaiban-skill)\n- [Weipaiban publisher profile](https://clawhub.ai/user/weipaiban)\n- [Runtime Dependencies and Data Flow](references/runtime-dependencies.md)\n- [API Endpoints and Response Formats](references/api-formats.md)\n- [Error Handling](references/error-handling.md)\n- [Usage Example](examples/usage-example.md)\n- [Weipaiban API key settings](https://weipaiban.cn/settings/api-keys)\n- [Weipaiban service](https://weipaiban.cn)\n- [Jimeng service](https://jimeng.com)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with JSON and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May create temporary JSON and image files under /tmp/weipaiban-task-* during execution.]\n\n## Skill Version(s):\n\n1.2.0 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.2.0:steps/01-extract-tags.md\n\n# Step 1：提取分类标签和关键词\n\n从用户输入中提取以下信息：\n\n- **类别标签**：用于筛选模板分类，必须从以下固定列表中匹配（可多选）：\n  `基础` `推荐` `节日` `点击` `展开` `切换` `弹窗` `答题` `轮播` `滑动` `美化` `新年` `圣诞` `媒体` `路径` `音频` `视频` `链接` `特效`\n  例如：用户提到\"清明节\"→ 匹配标签 `节日`；用户提到\"新年贺卡\"→ 匹配标签 `新年`\n- **主题关键词**：用于按标题搜索相关模板（如\"清明\"、\"端午\"、\"春节\"）\n- **具体要求**：用户对内容的特殊说明\n\n## 初始化任务目录\n\n提取完成后，创建任务目录并写入初始元信息：\n\n1. 生成临时目录：`/tmp/weipaiban-task-tmp-{当前时间戳}/`（workId 在 Step 3 才获得）\n2. 在目录中创建 `images/` 子目录\n3. 写入 `meta.json`：\n\n```json\n{\n  \"taskDir\": \"/tmp/weipaiban-task-tmp-{时间戳}\",\n  \"workId\": null,\n  \"templateId\": null,\n  \"theme\": \"用户主题\",\n  \"tags\": [\"匹配到的标签\"],\n  \"keywords\": \"主题关键词\",\n  \"requirements\": \"具体要求（如无则为空字符串）\",\n  \"currentStep\": \"01\",\n  \"createdAt\": \"ISO时间戳\"\n}\n```\n\n记录 `taskDir` 路径，后续所有步骤都通过此路径访问任务目录。然后进入下一步。\n\nFile v1.2.0:steps/02-search-templates.md\n\n# Step 2：搜索模板\n\n## 前置读取\n\n从任务目录读取 `meta.json`，获取 `tags` 和 `keywords` 用于搜索。\n\n---\n\n采用分路检索 + 合并去重 + 默认兜底策略搜索微排版模板库，确保尽可能找到匹配的模板。\n\n## 参数说明\n\n- `tags`：Step 1 中匹配到的类别标签（来自 meta.json），支持多选（如 `tags=节日&tags=推荐`）\n- `search`：主题关键词（来自 meta.json 的 keywords），按标题模糊匹配\n- 本步骤首轮搜索分为两路：仅 `search` 与仅 `tags`，每路最多取 5 条\n- **重要**：所有查询参数中的中文值必须进行 URL 编码。使用 curl 时请使用 `-G --data-urlencode` 自动处理编码。\n\n## 执行门禁（必须遵守）\n\n- 本文所有命令均为**受控执行模板**，仅在用户已明确进入微排版任务并同意继续时才可执行\n- 命令中的占位值（如 `关键词`、`类别标签`）必须先由当前任务数据替换，再执行\n- 若用户要求暂停、改词或终止，必须先停止调用 API，再等待下一次明确指令\n\n## 数据发送范围（透明披露）\n\n- 请求目标：`${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates*`\n- 发送字段：`Authorization` 头（Bearer Token）与查询参数（`search`、`tags`、`per_page`）\n- 不发送内容：任务目录中的本地文件（如 `elements.json`、`template-profile.json`）及图片二进制\n\n## 搜索策略（按顺序执行）\n\n### 2.1 分路搜索：仅 search + 仅 tags 并行\n\n同时发起以下两个请求，每路 `per_page=5`：\n\n#### 请求 A：仅关键词搜索（search）\n\n```bash\n# 受控执行模板：执行前确认用户已同意继续\ncurl -s -G -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  --data-urlencode \"search=关键词\" \\\n  --data-urlencode \"per_page=5\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates\"\n```\n\n#### 请求 B：仅标签搜索（tags）\n\n```bash\n# 受控执行模板：执行前确认用户已同意继续\ncurl -s -G -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  --data-urlencode \"tags=类别标签\" \\\n  --data-urlencode \"per_page=5\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates\"\n```\n\n> 如果有多个 `tags`，可在一个请求中传多个 `tags` 参数；也可按标签逐个请求后再合并，最终都按模板 ID 去重。\n\n### 2.2 合并结果并展示给用户\n\n将两路结果按模板 ID 去重合并后展示给用户，展示上限为最多 10 个。\n\n- 合并结果非空：告知用户\"已分别按关键词和分类标签搜索，并合并结果供您选择。\"\n- 合并结果为空：进入 2.3 兜底方案\n\n### 2.3 兜底方案：使用默认模板\n\n两路搜索合并后仍无结果时，通过 API 获取系统默认模板：\n\n```bash\n# 受控执行模板：执行前确认用户已同意继续\ncurl -s -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates/default\"\n```\n\n告知用户：\"未找到匹配模板，将使用默认模板为您创建作品。\"展示默认模板的信息，确认后直接进入 Step 3。\n\n## 响应格式\n\n搜索接口响应格式详见 [references/api-formats.md](../references/api-formats.md#模板搜索响应)。\n\n## 展示格式\n\n将搜索结果展示给用户，每个模板以简短信息进行一行展示：\n\n1. 【[tags]】标题 + 模板预览网址（如：【节日】清明节模板 - ${WEIPAIBAN_API_BASE}/templates/${模板ID}）\n\n> 展示数量上限：最多 10 个（两路各取前 5，合并去重后展示）。\n>\n> ⏸️ **交互点**：展示搜索结果列表，等待用户明确选择一个模板后才能继续。用户也可以要求更换关键词或标签后重新搜索。**必须等到用户回复后再执行 Step 3，禁止自动选择模板。**\n\n## 后置写入\n\n用户选择模板后，更新任务目录 `meta.json`：将 `templateId` 设为选中的模板 ID，`currentStep` 更新为 `\"02\"`。\n\nFile v1.2.0:steps/03-create-and-parse.md\n\n# Step 3-4：创建作品 + 获取元素数据 + 模板画像分析\n\n> Step 3、Step 4、Step 4.1 将连续自动执行（克隆模板 → 获取元素数据 → 生成模板画像），无需等待用户确认。\n\n## 前置读取\n\n从任务目录读取 `meta.json`，获取 `templateId` 和 `theme`。\n\n## 执行门禁与中止规则\n\n- Step 3-4.1 虽为连续步骤，但只允许在 Step 2 已完成用户模板选择后进入\n- 本文命令均为受控执行模板：仅在用户未要求暂停/取消时执行\n- 任一请求失败或用户中途明确中止时，停止后续自动步骤并返回当前状态\n\n## 数据发送范围（透明披露）\n\n- 发送到微排版 API 的数据仅包括：认证头、克隆标题、作品 ID、elements 更新内容\n- 不发送本地任务目录中的其他文件内容；本地 JSON 仅用于构建请求参数\n\n## Step 3：从模板创建作品\n\n基于用户选择的模板创建新作品：\n\n```bash\n# 受控执行模板：仅在已完成模板选择且用户未中止时执行\ncurl -s -X POST \\\n  -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"title\":\"基于用户主题的标题\"}' \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates/选中的模板ID/clone\"\n```\n\n响应格式详见 [references/api-formats.md](../references/api-formats.md#克隆模板响应)。\n\n记录返回的作品 ID。然后将任务目录从临时路径重命名为正式路径：\n\n```bash\nmv /tmp/weipaiban-task-tmp-{时间戳} /tmp/weipaiban-task-{作品ID}\n```\n\n说明：\n\n- 该重命名仅作用于 `/tmp/weipaiban-task-*` 任务目录命名规范化，便于断点恢复\n- 不会移动系统其他路径文件；任务结束后可由用户手动清理对应目录\n- 如重命名失败，保留原目录并停止进入后续步骤，避免路径不一致\n\n更新 `meta.json` 中的 `workId` 和 `taskDir` 为新路径。\n\n## Step 4：获取简化元素数据\n\n调用 parser 接口获取作品的简化元素数据：\n\n```bash\n# 受控执行模板：仅在 Step 3 已成功获得作品 ID 后执行\ncurl -s -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/vectors/作品ID/parser\"\n```\n\n响应格式详见 [references/api-formats.md](../references/api-formats.md#parser-获取响应)。\n\n### 元素类型说明\n\n- `text` 元素：包含文本内容和 `fill` 颜色属性\n- `rect` 元素：提取所有非透明填充的矩形元素，包含 `fill` 颜色、`width` 和 `height`\n- `image` 元素：包含图片信息，请注意完整识别图片的src地址信息\n- `slideshow` 元素：轮播图组件，包含 `assets` 数组，每个 asset 代表轮播中的一张图片\n\n**重要**：将 parser 接口返回的完整 `data.elements` 数组写入任务目录的 `elements.json` 文件。后续步骤将从该文件按需读取。\n\n## Step 4.1：模板画像分析（自动执行，不打断用户）\n\n> 这是一次**内部的客观分析**，不调用任何 API，也不设交互点。完成后立即进入 Step 5。\n>\n> **目的**：用户已经在 Step 2 选定了特定模板，该模板本身就携带了排版规划意图（类型、色系、节奏）。后续 Step 5-8 如果只按\"主题驱动\"生成，会丢失原模板的视觉调性。本步骤产出一份 `template_profile` 内部上下文对象，作为 Step 5-8 的额外约束输入，让生成结果\"有方向\"而不是\"从零重建\"。\n\n基于 Step 4 获取的 `elements` 数据，从三个客观维度分析模板：\n\n### ① 排版类型识别（layout_type）\n\n统计 elements 中各类型的数量与比例：\n\n- `text_count`：`type: \"text\"` 的元素数\n- `image_count`：`type: \"image\"` 的元素数\n- `has_slideshow`：是否存在 `type: \"slideshow\"` 元素\n- `large_rect_count`：宽高均 > 300 的 `type: \"rect\"` 元素数\n\n按以下规则判定 `layout_type`（命中即停止）：\n\n| 优先级 | layout_type    | 判定条件                                               |\n| ------ | -------------- | ------------------------------------------------------ |\n| 1      | **轮播展示型** | `has_slideshow=true` 且 slideshow.assets.length ≥ 3    |\n| 2      | **封面单图型** | `image_count=1` 且 `text_count ≤ 3` 且有大尺寸背景图   |\n| 3      | **图片主导型** | `image_count ≥ text_count` 且 `image_count ≥ 3`        |\n| 4      | **纯文字型**   | `image_count ≤ 1` 且 `text_count ≥ 5`                  |\n| 5      | **卡片堆叠型** | `large_rect_count ≥ 3` 且存在成组重复的 text/rect 结构 |\n| 6      | **图文混排型** | 其他情况（文本与图片数量接近，元素混合排布）           |\n\n### ② 原始色系提取（original_palette）\n\n遍历所有 `type: \"rect\"` 和 `type: \"text\"` 元素的 `fill` 字段：\n\n1. **频次归纳**：统计每种颜色出现的次数（rect 因面积大权重 ×2），取最高频为 `dominant`，次高频 2-3 个为 `secondary`，出现频次低但色相差异大的 1 个为 `accent`\n2. **HSL 转换**：将 dominant 从 hex 转 HSL，得到 (h, s, l)\n3. **特征判定**：\n   - `temperature`：`h ∈ [0°, 60°] ∪ [300°, 360°]` → warm；`h ∈ [180°, 270°]` → cool；其他 → neutral\n   - `saturation`：`s < 30%` → low；`30% ≤ s < 70%` → medium；`s ≥ 70%` → high\n   - `brightness`：`l < 35%` → dark；`35% ≤ l < 70%` → medium；`l ≥ 70%` → light\n   - `contrast`：对比 dominant 与 secondary 中最深色的 L 值差；差 < 20 → soft；20-50 → balanced；> 50 → strong\n\n### ③ 内容密度与结构（content_density）\n\n- `text_elements`：text 元素总数\n- `avg_char_count` / `max_char_count` / `min_char_count`：基于 `charCount` 字段的统计\n- `text_roles`：根据每个 text 元素的 `name` 字段分类推断（title/subtitle/body/caption），关键词匹配：\n  - `title`：包含\"标题\"、\"title\"、\"主标\"、\"大标\"\n  - `subtitle`：包含\"副标\"、\"subtitle\"、\"小标\"\n  - `body`：包含\"正文\"、\"内容\"、\"body\"、\"段落\"\n  - `caption`：包含\"注释\"、\"说明\"、\"caption\"、\"脚注\"\n  - 无匹配时：按 `charCount` 判断——≤ 8 字归入 title，8-20 归入 subtitle，20-50 归入 body，> 50 归入 body，< 4 归入 caption\n- `image_elements` / `slideshow_assets`：图片数量统计\n- `density_level`：\n  - `sparse`：`text_elements ≤ 4` 且 `avg_char_count ≤ 12`\n  - `dense`：`text_elements ≥ 10` 或 `avg_char_count ≥ 25`\n  - `balanced`：其他\n\n### 输出 template_profile\n\n将以上分析结果组装为一份 JSON 对象，并基于客观维度推导三条**自然语言排版规划**：\n\n```json\n{\n  \"template_profile\": {\n    \"layout_type\": \"图文混排型\",\n    \"layout_signals\": {\n      \"text_count\": 8,\n      \"image_count\": 3,\n      \"has_slideshow\": false,\n      \"large_rect_count\": 2\n    },\n    \"original_palette\": {\n      \"dominant\": \"#A3D9A5\",\n      \"secondary\": [\"#F5F5F5\", \"#5E8B73\"],\n      \"accent\": \"#FF6B6B\",\n      \"temperature\": \"cool\",\n      \"saturation\": \"low\",\n      \"brightness\": \"light\",\n      \"contrast\": \"soft\"\n    },\n    \"content_density\": {\n      \"text_elements\": 8,\n      \"avg_char_count\": 15,\n      \"max_char_count\": 42,\n      \"min_char_count\": 4,\n      \"text_roles\": { \"title\": 1, \"subtitle\": 2, \"body\": 4, \"caption\": 1 },\n      \"image_elements\": 3,\n      \"slideshow_assets\": 0,\n      \"density_level\": \"balanced\"\n    },\n    \"typography_plan\": \"本模板为图文混排，正文偏短句（avg 15 字），标题精炼；生成新文本时保持相近字数节奏，避免长段堆砌。\",\n    \"color_plan\": \"原模板为低饱和度冷色调、柔和对比；即使切换到新主题色系，新配色需保持 low 饱和度与 soft 对比层次，避免突兀的高饱和冲击。\",\n    \"image_plan\": \"以简洁构图为主，明度偏亮（light）、饱和度低；生成图应遵循相近的明度与饱和度，与模板原有氛围协调。\"\n  }\n}\n```\n\n三条 `*_plan` 文本由对应客观维度自动推导得出，需真实反映当前模板的特征（不要使用模板化文本）。\n\n**重要**：将 `template_profile` 对象写入任务目录的 `template-profile.json` 文件。**后续 Step 5、Step 6、Step 7、Step 8a 必须从该文件读取 template_profile 并作为生成约束输入**。\n\n## 后置写入\n\n确认以下文件已写入任务目录：\n\n- `meta.json`（已更新 workId、taskDir、currentStep=\"03\"）\n- `elements.json`（完整 elements 数组）\n- `template-profile.json`（完整 template_profile 对象）\n\n本步骤不输出任何用户可见内容，直接进入 Step 5。\n\nFile v1.2.0:steps/05-color-scheme.md\n\n# Step 5：生成配色方案\n\n> Step 5 在生成文本和图片之前执行，因为配色方案决定了整体视觉基调。\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"rect\"` 和 `type: \"text\"` 的元素，仅提取每个元素的 `id`、`name`、`type`、`fill` 字段（忽略其他类型和字段以节省上下文）\n3. **`template-profile.json`**：仅读取 `original_palette`（temperature/saturation/brightness/contrast）和 `color_plan` 两个字段\n\n如果 elements.json 中没有 `type: \"rect\"` 和 `type: \"text\"` 的元素，则跳过本步骤。\n\n---\n\n配色生成的核心原则是：\"**色相可以跟随用户主题切换，但饱和度层级、明度层次、对比强度必须延续原模板**\"，这样替换后的作品在视觉感受上仍与原模板协调。\n\n## 配色生成要求\n\n- 分析用户指定的主题，确定整体色彩基调（如清明节 → 清新绿色系，春节 → 红金色系，科技 → 蓝色系）\n- 生成 3-5 个互相协调的主色调，数量应与原模板 `original_palette` 的层级数量对齐（dominant + secondary + accent），避免强行扩展或收缩\n- **保留原模板的饱和度等级**：`original_palette.saturation` 是 low，新配色也必须是 low（例：用户主题\"春节红\" → 低饱和胭脂红/豆沙红，而非高饱和正红）\n- **保留原模板的明度层次**：`original_palette.brightness` 是 light，新配色的明度分布也应偏亮；是 dark 则整体偏深\n- **保留原模板的对比强度**：`original_palette.contrast` 是 soft，新配色 dominant 与 secondary 的 L 值差应保持在 20 以内；balanced 保持 20-50；strong 保持 > 50\n- **rect 元素**（大面积背景色块）：分配主色调中的背景色，通常使用较柔和或较深的色调\n- **text 元素**：分配与对应背景有足够对比度的文字颜色，确保可读性（对比度建议至少 4.5:1）\n- 保持配色方案在整体视觉上的协调统一\n- 参考元素的 `name` 属性了解其用途（如\"标题文字\"应更醒目，\"正文\"应更柔和）\n\n> ⏸️ **交互点**：展示配色方案时，**先用一句话说明画像依据**（例：「原模板为 low 饱和度 / cool 色调 / light 明度 / soft 对比；已在新配色中延续相同的饱和度、明度与对比层次，仅将色相切换至 {用户主题} 基调」），然后以表格形式展示所有配色替换方案（元素名称 | 类型 | 原颜色 | 新颜色），并用色块预览展示新旧颜色对比。等待用户确认或要求调整。**必须等到用户确认后才能继续。**\n\n## 后置写入\n\n用户确认后，将配色方案写入任务目录的 `color-changes.json`：\n\n```json\n{\n  \"palette\": {\n    \"primary\": \"#主色调\",\n    \"secondary\": [\"#辅助色1\", \"#辅助色2\"],\n    \"accent\": \"#点缀色\"\n  },\n  \"changes\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"type\": \"rect\",\n      \"oldFill\": \"#原颜色\",\n      \"newFill\": \"#新颜色\"\n    },\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"type\": \"text\",\n      \"oldFill\": \"#原颜色\",\n      \"newFill\": \"#新颜色\"\n    }\n  ]\n}\n```\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"05\"`。\n\nFile v1.2.0:steps/06-generate-text.md\n\n# Step 6：生成新文本\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"text\"` 的元素，仅提取每个元素的 `id`、`name`、`text`、`charCount` 字段\n3. **`template-profile.json`**：仅读取 `content_density`（density_level、text_roles）和 `typography_plan` 两个字段\n\n---\n\n文本生成的核心原则是：\"**内容可以围绕用户主题，但字数节奏与文本角色风格必须延续原模板**\"，避免替换后的文字超出排版框、或让整体密度失衡。\n\n## 生成要求\n\n- 参考原始文本的字数（`charCount`），生成**相近长度**的替换文本，单个元素的新文本字数应严格贴近原字数（允许 ±20% 的浮动，禁止大幅偏离，保护原排版不溢出）\n- **遵循 density_level**：\n  - `sparse` → 精炼短句、留白优先，整体信息密度低\n  - `balanced` → 中等长度、有呼吸感，信息密度适中\n  - `dense` → 允许较多信息量，但保持层次清晰\n- **按 text_roles 区分风格**：\n  - `title`（标题）：精炼有力，字数短，用词醒目\n  - `subtitle`（副标题）：辅助说明主题，承上启下\n  - `body`（正文）：连贯成段，逻辑清晰\n  - `caption`（注释/脚注）：简洁点题，不抢主角戏份\n- 内容要契合用户指定的主题\n- 注意元素的 `name` 属性，它描述了文本的用途，生成内容应匹配其用途\n- 保持文本之间的逻辑连贯性\n- 语言风格要统一\n\n> ⏸️ **交互点**：以表格形式展示所有文本替换方案（原文本 → 新文本），等待用户确认或要求修改。**必须等到用户确认后才能继续。**\n\n## 后置写入\n\n用户确认后，将文本变更写入任务目录的 `text-changes.json`：\n\n```json\n{\n  \"changes\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"oldText\": \"原始文本\",\n      \"newText\": \"新文本\",\n      \"oldCharCount\": 7,\n      \"newCharCount\": 7\n    }\n  ]\n}\n```\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"06\"`。\n\nArchive v1.1.0: 17 files, 37621 bytes\n\nFiles: examples/usage-example.md (1698b), references/api-formats.md (3771b), references/error-handling.md (524b), references/runtime-dependencies.md (5650b), SKILL.md (10154b), steps/01-extract-tags.md (1313b), steps/02-search-templates.md (3070b), steps/03-create-and-parse.md (7596b), steps/05-color-scheme.md (3330b), steps/06-generate-text.md (2119b), steps/07-image-analysis.md (10225b), steps/08a-image-prompts.md (13252b), steps/08b-image-generate.md (3314b), steps/08c-image-bg-remove.md (2605b), steps/08d-image-upload.md (4173b), steps/09-update-and-complete.md (3252b), _meta.json (134b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: weipaiban-skill\ndescription: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换\nversion: 1.1.0\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: '🎨'\n    requires:\n      env:\n        - WEIPAIBAN_API_KEY\n    primaryEnv: WEIPAIBAN_API_KEY\n    optionalEnv:\n      - VOLCENGINE_AK\n      - VOLCENGINE_SK\n      - VOLCENGINE_TOKEN\n    optionalSkills:\n      - jimeng-ai\n    optionalBinaries:\n      - python3\n      - rembg\n    externalServices:\n      - weipaiban.cn\n      - jimeng.com\n    writes:\n      - /tmp/weipaiban-task-*/\n      - ~/.u2net/u2netp.onnx\n---\n\n# 微排版技能\n\n你是微排版 AI 助手，能够帮助用户基于模板快速创建和编辑微信图文作品。\n\n## 环境变量\n\n- `WEIPAIBAN_API_KEY`：微排版平台 API 密钥（必须），格式为 `sk-` 开头，如果没有，需要用户去 <https://weipaiban.cn/settings/api-keys> 上进行生成\n- `WEIPAIBAN_API_BASE`：微排版 API 地址（可选），默认值为 `https://weipaiban.cn`\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```text\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\n## 运行时依赖\n\n微排版技能将依赖项按\"必需 / 可选\"区分，透明告知用户并支持降级执行。详细说明见 [references/runtime-dependencies.md](references/runtime-dependencies.md)。\n\n### 必需依赖\n\n- **凭据**：`WEIPAIBAN_API_KEY`\n- **外部服务**：`weipaiban.cn`（模板搜索、作品管理、CDN 上传）\n- **磁盘写入**：`/tmp/weipaiban-task-{workId}/`（任务中间结果，任务结束后可清理）\n\n### 可选依赖（仅 Step 8 图片生成阶段使用）\n\n- **凭据**：`VOLCENGINE_AK`（必需），`VOLCENGINE_SK` 与 `VOLCENGINE_TOKEN` 至少配置其一（永久凭证用 SK；临时凭证 AKTP/STS 用 TOKEN）\n- **依赖技能**：`jimeng-ai`（通过 clawhub 或 find-skill 安装）\n- **本地二进制**：\n  - `python3`（≥3.9）\n  - `rembg`：仅使用 `u2netp` 轻量模型（固定参数 `-m u2netp`），首次运行下载 `~/.u2net/u2netp.onnx`（约 4.7MB）\n- **外部服务**：即梦 API（图片生成）\n\n### 缺失可选依赖时的降级行为\n\n**如果未配置 VOLCENGINE_* 或未安装 jimeng-ai / rembg，Step 8（图片生成）将被跳过**，作品保留模板原图；其他步骤（模板选择、配色、文本替换、作品更新）仍正常执行。Step 8a 在执行前会检测依赖并进入交互点，由用户选择「安装」「跳过图片生成」或「取消」。**技能不会在未经用户同意的情况下自动执行 `pip install` 或安装其他技能。**\n\n## 交互规则\n\n**⚠️ 逐步确认模式**：每个标记了 ⏸️ 的步骤都是强制交互点，必须暂停等待用户明确回复后才能继续执行下一步。禁止跳过交互点或自动连续执行多个步骤。\n\n## 执行协议\n\n**⚠️ 严格逐步执行**：本技能采用\"按需加载、逐步执行\"模式，必须遵循以下规则：\n\n1. **一次只执行一个步骤**：当前步骤完全完成前，禁止读取或执行下一个步骤的详情文件\n2. **按需读取**：执行每个步骤时才读取该步骤的详情文件（如 `steps/01-extract-tags.md`），禁止提前读取后续步骤\n3. **禁止批量加载**：禁止一次性读取多个步骤文件，每个步骤的详情文件在需要时才加载\n4. **步骤完成确认**：每个步骤完成后确认产出数据写入任务目录，再进入下一步骤\n5. **上下文精简**：进入新步骤时，从任务目录读取该步所需的最小数据，不保留上一步骤文件的完整指令文本或上下文中的大段数据\n\n## 任务目录\n\n每次执行微排版任务时，使用临时任务目录在磁盘上持久化中间结果，步骤间通过文件传递数据，避免在上下文中累积大量数据。\n\n**目录路径**：`/tmp/weipaiban-task-{workId}/`（Step 1 时 workId 未知，使用时间戳创建临时目录；Step 3 获得 workId 后重命名）\n\n**目录结构**：\n\n```\n/tmp/weipaiban-task-{workId}/\n├── meta.json                    # 全局元信息（workId, theme, currentStep 等）\n├── elements.json                # Step 4 原始 elements 完整数据\n├── template-profile.json        # Step 4.1 模板画像\n├── color-changes.json           # Step 5 配色变更\n├── text-changes.json            # Step 6 文本变更\n├── image-classifications.json   # Step 7 图片分类结果\n├── image-prompts.json           # Step 8a 提示词计划\n├── image-progress.json          # Step 8b/8c/8d 逐张进度追踪\n├── update-payload.json          # Step 9 最终提交负载\n└── images/                      # 图片处理临时文件\n```\n\n**使用规则**：\n\n- 每个步骤开始时，仅从任务目录读取该步所需的文件和字段（各步骤详情文件中有明确说明）\n- 每个步骤完成后，将产出数据写入对应文件，并更新 `meta.json` 的 `currentStep`\n- 禁止将完整 elements JSON、template_profile 等大段数据保持在上下文中——需要时从文件重新读取\n\n## 工作流程\n\n当用户请求使用微排版技能创建图文作品时，严格按照以下步骤**顺序**执行。**每个步骤开始时，才读取该步骤的详情文件**——禁止提前读取后续步骤文件。\n\n> **Step 8（图片生成）为可选阶段**：依赖 `jimeng-ai` 技能、`VOLCENGINE_*` 凭据和本地 `rembg` 工具。缺失依赖时由用户选择跳过，作品将保留模板原图；其他步骤（配色、文本替换、作品更新）仍正常执行。\n\n| 步骤      | 名称                 | 说明                                                  | 交互点                   | 详情                                                               |\n| --------- | -------------------- | ----------------------------------------------------- | ------------------------ | ------------------------------------------------------------------ |\n| Step 1    | 提取分类标签和关键词 | 从用户输入提取标签、关键词、具体要求                  | -                        | [steps/01-extract-tags.md](steps/01-extract-tags.md)               |\n| Step 2    | 搜索模板             | 级联降级搜索模板库（分路检索 + 合并去重 + 默认兜底）  | ⏸️ 用户选择模板          | [steps/02-search-templates.md](steps/02-search-templates.md)       |\n| Step 3-4  | 创建作品 + 获取元素  | 克隆模板、获取元素、自动生成模板画像                  | - (连续执行)             | [steps/03-create-and-parse.md](steps/03-create-and-parse.md)       |\n| Step 5    | 生成配色方案         | 根据主题生成 3-5 个协调主色调，替换 rect/text 颜色    | ⏸️ 用户确认配色          | [steps/05-color-scheme.md](steps/05-color-scheme.md)               |\n| Step 6    | 生成新文本           | 根据主题生成匹配长度和用途的替换文本                  | ⏸️ 用户确认文本          | [steps/06-generate-text.md](steps/06-generate-text.md)             |\n| Step 7    | 图片分析与分类       | 三重信号（名称/尺寸/视觉）分析，6 级分类              | ⏸️ 用户确认分类          | [steps/07-image-analysis.md](steps/07-image-analysis.md)           |\n| Step 8a   | 图片提示词规划（可选）| 检测依赖 + 构造每张图片的生成 prompt                 | ⏸️ 缺失依赖时确认安装/跳过 | [steps/08a-image-prompts.md](steps/08a-image-prompts.md)           |\n| Step 8b   | 图片生成（可选）     | 逐张调用即梦 API 生成图片                             | -                        | [steps/08b-image-generate.md](steps/08b-image-generate.md)         |\n| Step 8c   | 图片背景去除（可选） | 使用 rembg 仅以 `u2netp` 轻量模型去背景并输出透明图   | -                        | [steps/08c-image-bg-remove.md](steps/08c-image-bg-remove.md)       |\n| Step 8d   | 图片上传 CDN（可选） | 逐张上传微排版素材库，汇总结果                        | ⏸️ 失败重试确认          | [steps/08d-image-upload.md](steps/08d-image-upload.md)             |\n| Step 9-10 | 更新作品 + 完成      | 汇总所有变更，批量提交更新，展示编辑链接              | -                        | [steps/09-update-and-complete.md](steps/09-update-and-complete.md) |\n\n## 断点恢复\n\n如果用户提供了已有的作品 ID（workId），或提到之前中断的任务，先检查任务目录是否存在：\n\n1. 检查 `/tmp/weipaiban-task-{workId}/meta.json` 是否存在\n2. 如果存在，读取 `currentStep` 字段，确定上次执行到哪一步\n3. 验证该步骤之前的所有必要文件是否完整（如 elements.json、template-profile.json 等）\n4. 向用户展示恢复状态，从断点步骤继续执行\n\n| currentStep  | 恢复行为                                                                 |\n| ------------ | ------------------------------------------------------------------------ |\n| 01 / 02      | 从对应步骤重新开始                                                       |\n| 03           | 检查 elements.json 和 template-profile.json 是否完整，完整则跳到 Step 5  |\n| 05 / 06 / 07 | 检查对应输出文件是否存在，存在则展示给用户确认，否则重新执行该步骤       |\n| 08a          | 若 `meta.json` 中 `skipImageGeneration=true`，直接跳到 Step 9；否则重新执行依赖检测交互点 |\n| 08b          | 读取 image-progress.json，仅对 status=pending 的图片重新生成             |\n| 08c          | 读取 image-progress.json，仅对需透明且 status=generated 的图片执行去白底 |\n| 08d          | 读取 image-progress.json，仅对未上传的图片执行上传                       |\n| 09 / done    | 重新构建 payload 并提交，或告知用户已完成                                |\n\n## 参考资料\n\n- [API 端点与响应格式](references/api-formats.md)\n- [错误处理](references/error-handling.md)\n- [使用示例](examples/usage-example.md)\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn729y74k4eyhx5ax4zzmqvd1s84decf\",\n  \"slug\": \"weipaiban-skill\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1777167336200\n}\n\nFile v1.1.0:references/api-formats.md\n\n# API 端点与响应格式参考\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\nAPI 基础地址：`${WEIPAIBAN_API_BASE:-https://weipaiban.cn}`\n\n---\n\n## 模板搜索响应\n\n`GET /api/v1/templates`\n\n```json\n{\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": \"模板ID\",\n        \"title\": \"模板标题\",\n        \"description\": \"模板描述\",\n        \"tags\": [\"标签1\", \"标签2\"],\n        \"thumbnail\": \"缩略图URL\",\n        \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n      }\n    ],\n    \"total\": 10,\n    \"page\": 1,\n    \"perPage\": 5\n  }\n}\n```\n\n## 默认模板响应\n\n`GET /api/v1/templates/default`\n\n```json\n{\n  \"data\": {\n    \"id\": \"模板ID\",\n    \"title\": \"模板标题\",\n    \"description\": \"模板描述\",\n    \"tags\": [\"标签1\", \"标签2\"],\n    \"thumbnail\": \"缩略图URL\",\n    \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## 克隆模板响应\n\n`POST /api/v1/templates/{模板ID}/clone`\n\n请求体：`{\"title\": \"作品标题\"}`\n\n```json\n{\n  \"data\": {\n    \"id\": \"新作品ID\",\n    \"title\": \"作品标题\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## Parser 获取响应\n\n`GET /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"elements\": [\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"标题文本\",\n        \"type\": \"text\",\n        \"text\": \"原始文本内容\",\n        \"charCount\": 7,\n        \"fill\": \"#333333\"\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景色块\",\n        \"type\": \"rect\",\n        \"fill\": \"#d9d9d9\",\n        \"width\": 750,\n        \"height\": 1200\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景图\",\n        \"type\": \"image\",\n        \"image\": {\n          \"src\": \"https://原始图片地址\",\n          \"width\": 800,\n          \"height\": 600,\n          \"ratio\": \"4:3\"\n        }\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"轮播图\",\n        \"type\": \"slideshow\",\n        \"assets\": [\n          {\n            \"id\": \"asset1\",\n            \"title\": \"高山.jpg\",\n            \"src\": \"https://图片地址1\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          },\n          {\n            \"id\": \"asset2\",\n            \"title\": \"草地.jpg\",\n            \"src\": \"https://图片地址2\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n## Parser 更新响应\n\n`POST /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## CDN 上传响应\n\n`POST /api/v1/assets/fetch`\n\n请求体：`{\"url\": \"图片URL\"}`\n\n该接口基于文件内容 SHA1 哈希自动去重：相同图片重复上传返回 HTTP 200（已有记录），新图片上传返回 HTTP 201。\n\n成功响应：\n\n```json\n{\n  \"data\": {\n    \"id\": \"资源ID\",\n    \"type\": \"image\",\n    \"name\": \"存储路径\",\n    \"title\": \"文件名\",\n    \"src\": \"https://svg-cdn.creatby.com/...\",\n    \"width\": 800,\n    \"height\": 600,\n    \"size\": 123456,\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n错误响应（400/413/415/502/504）：\n\n```json\n{\n  \"error\": {\n    \"message\": \"错误描述\",\n    \"code\": 400\n  }\n}\n```\n\n## CDN 文件上传\n\n`POST /api/v1/assets/upload`\n\n请求格式：`multipart/form-data`，字段 `file` 为图片文件。\n\n```bash\ncurl -s --max-time 30 -X POST \\\n  -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  -F \"file=@本地文件路径\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/assets/upload\"\n```\n\n响应格式与 `/api/v1/assets/fetch` 相同（同样支持 SHA1 去重）。\n\nFile v1.1.0:references/error-handling.md\n\n# 错误处理\n\n- **401 Unauthorized**：API Key 无效或过期，提示用户在微排版平台重新生成 API Key\n- **403 Forbidden**：用户角色权限不足，需要 admin 或 developer 角色\n- **404 Not Found**：模板或作品不存在，检查 ID 是否正确\n- **429 Too Many Requests**：请求频率超限（60次/分钟），等待后重试\n- **模板搜索无结果**：按级联降级策略自动重试（tags+search → 仅search → 仅tags → 默认模板），全部无果时使用默认模板兜底\n\nFile v1.1.0:references/runtime-dependencies.md\n\n# 运行时依赖与数据流参考\n\n本文件集中说明微排版技能在运行时所需的凭据、外部服务、本地二进制、磁盘写入以及数据流向。元数据（SKILL.md / README.md 顶部）是简要声明，此处是完整释义。\n\n---\n\n## 依赖总览\n\n| 类别       | 名称                  | 必需 / 可选 | 用途                                   |\n| ---------- | --------------------- | ----------- | -------------------------------------- |\n| 凭据       | `WEIPAIBAN_API_KEY`   | 必需        | 微排版平台 API 鉴权                    |\n| 凭据       | `WEIPAIBAN_API_BASE`  | 可选        | 自定义微排版 API 地址（默认官方）      |\n| 凭据       | `VOLCENGINE_AK`       | 可选\\*      | 火山引擎鉴权（Step 8 必需）            |\n| 凭据       | `VOLCENGINE_SK`       | 可选\\*      | 永久凭证鉴权（SK/TOKEN 二选一）        |\n| 凭据       | `VOLCENGINE_TOKEN`    | 可选\\*      | 临时凭证（AKTP/STS）鉴权               |\n| 依赖技能   | `jimeng-ai`           | 可选        | 封装即梦图片生成调用                   |\n| 本地二进制 | `python3`（≥3.9）     | 可选        | 运行 rembg                             |\n| 本地二进制 | `rembg` CLI           | 可选        | 背景去除（仅使用 `u2netp` 轻量模型）   |\n| 外部服务   | `weipaiban.cn`        | 必需        | 模板搜索、作品管理、素材 CDN 上传      |\n| 外部服务   | 即梦 API              | 可选        | 根据 prompt 生成图片                   |\n| 磁盘写入   | `/tmp/weipaiban-task-{workId}/` | 必需 | 任务中间文件（元信息、图片、进度）     |\n| 磁盘写入   | `~/.u2net/u2netp.onnx`| 可选        | rembg u2netp 模型缓存（约 4.7MB）      |\n\n> \\* 整体 Step 8（图片生成）为可选阶段；一旦启用，则 `VOLCENGINE_AK` 必需，且 `VOLCENGINE_SK` 与 `VOLCENGINE_TOKEN` 至少配置其一。\n\n---\n\n## 数据流\n\n### 基础流程（必需依赖）\n\n```text\n用户输入\n  → 主代理\n  → weipaiban.cn（模板搜索、克隆、获取 elements、更新作品）\n  → 本地 /tmp/weipaiban-task-{workId}/（缓存中间 JSON）\n  → 返回作品编辑链接\n```\n\n此流程仅在微排版平台和本地磁盘之间往返，不涉及第三方图片服务。\n\n### 图片生成流程（可选阶段 Step 8）\n\n```text\n主代理\n  → jimeng-ai 技能 → 即梦 API（发送 prompt / ratio，返回临时图片 URL）\n  → 本地下载到 /tmp/weipaiban-task-{workId}/images/{elementId}_generated.png\n  → rembg -m u2netp（若 needsTransparent=true）→ {elementId}_nobg.png\n  → weipaiban.cn /api/v1/assets/upload 或 /api/v1/assets/fetch\n  → 获取 CDN 永久 URL\n```\n\n> **重要**：发送给即梦 API 的 prompt 由用户主题 + 模板画像 + 配色方案拼接而成；图片内容最终会上传到 weipaiban CDN 并成为作品的一部分。用户应确认这两个服务对上传内容的隐私政策。\n\n---\n\n## 安装命令与副作用\n\n### 安装 `jimeng-ai` 技能\n\n通过 clawhub 或 find-skill 技能查找并安装。具体命令由 clawhub/find-skill 决定，不在本技能控制范围内。\n\n### 安装 `rembg`\n\n```bash\npip3 install \"rembg[cpu,cli]\"\n```\n\n**副作用**：\n\n- 安装 `rembg`、`onnxruntime`（CPU 版本）、`pymatting` 等依赖\n- **首次运行时**下载 `u2netp.onnx`（约 4.7MB）到 `~/.u2net/u2netp.onnx`\n- 本技能**固定**使用 `u2netp` 轻量模型（命令 `rembg i -m u2netp`），不会下载其他模型（如完整版 `u2net` 176MB）\n\n### 申请 `VOLCENGINE_AK` / `VOLCENGINE_SK` / `VOLCENGINE_TOKEN`\n\n需在火山引擎/即梦平台自行申请。本技能不会通过 API 自动生成或读取密钥文件。\n\n- **永久凭证**：在火山引擎控制台创建访问密钥，得到 `AKLT…` 开头的 AK 与对应的 SK，配置 `VOLCENGINE_AK` + `VOLCENGINE_SK`\n- **临时凭证（STS）**：通过 STS 接口换取临时凭证，得到 `AKTP…` 开头的 AK + Token，配置 `VOLCENGINE_AK` + `VOLCENGINE_TOKEN`（此时 SK 可省略）\n\n---\n\n## 用户同意原则\n\n本技能严格遵循以下原则：\n\n1. **不在未经用户同意的情况下执行安装命令**。Step 8a 的依赖检测只做\"检测 + 展示结果 + 请求用户选择\"，不会直接运行 `pip install` 或安装其他技能\n2. **降级可用**：缺失可选依赖时，用户可选择跳过 Step 8，作品保留模板原图，其他步骤仍然完成\n3. **展示完整命令**：用户选择「安装」后，每条命令执行前都会再次展示并请求确认\n\n---\n\n## 隔离与最小化凭据建议\n\n- **隔离运行**：若对隐私或磁盘占用有顾虑，建议在容器或沙箱环境中运行。任务目录 `/tmp/weipaiban-task-*/` 默认随系统重启清理；`~/.u2net/u2netp.onnx` 可以手动删除\n- **凭据最小化**：仅为微排版账号提供必要权限的 API Key。若使用火山引擎/即梦，建议优先使用 STS 临时凭证（`VOLCENGINE_AK` + `VOLCENGINE_TOKEN`），并设定使用期限或调用配额限制\n- **任务目录清理**：任务完成后可手动执行 `rm -rf /tmp/weipaiban-task-{workId}/` 清理中间文件（技能本身不会主动删除，以便失败重试）\n\n---\n\n## 已知外部端点清单\n\n- `https://weipaiban.cn/api/v1/templates` / `/templates/default` / `/templates/{id}/clone`\n- `https://weipaiban.cn/api/v1/vectors/{workId}/parser`\n- `https://weipaiban.cn/api/v1/assets/fetch` / `/assets/upload`\n- 即梦图片生成端点（由 `jimeng-ai` 技能内部调用，本技能不直接暴露 URL）\n\n本技能不会向除此之外的任何外部服务发送请求。\n\nFile v1.1.0:examples/usage-example.md\n\n# 使用示例\n\n用户：\"请帮我用微排版创建一个清明节的微信图文\"\n\n执行流程：\n\n1. 提取分类标签和关键词：标签 `节日`，关键词\"清明\"。创建任务目录 `/tmp/weipaiban-task-tmp-{时间戳}/`，写入 `meta.json`\n2. 搜索模板：分别执行仅关键词搜索（`search=清明`）和仅标签搜索（`tags=节日`），每路各取前 5，按模板 ID 去重合并\n3. 展示最多 10 个候选模板，用户选择一个。更新 `meta.json` 的 templateId\n4. 从模板创建新作品，重命名任务目录为 `/tmp/weipaiban-task-{作品ID}/`\n5. 获取简化元素（文本、矩形色块、图片、轮播），写入 `elements.json`\n6. 自动分析模板画像（排版类型、色系、密度），写入 `template-profile.json`\n7. 根据清明节主题生成清新绿色系配色方案，替换 rect 和 text 的颜色。用户确认后写入 `color-changes.json`\n8. 为每个文本生成清明节主题的新内容。用户确认后写入 `text-changes.json`\n9. 分析每张图片的用途和内容（通过名称、尺寸、视觉识别），分类为场景背景/人物/装饰等，跳过 logo 和二维码。用户确认后写入 `image-classifications.json`\n10. 为每张图片构造分类专属的生成 prompt，写入 `image-prompts.json`，初始化 `image-progress.json`\n11. 逐张调用即梦 API 生成图片，每张完成后即时反馈进度\n12. 对需要透明背景的图片逐张执行 rembg 白底转透明\n13. 逐张上传到微排版 CDN，展示汇总结果，失败可重试\n14. 从 `color-changes.json`、`text-changes.json`、`image-progress.json` 汇总所有变更，批量更新作品\n15. 返回编辑链接给用户\n\nFile v1.1.0:steps/01-extract-tags.md\n\n# Step 1：提取分类标签和关键词\n\n从用户输入中提取以下信息：\n\n- **类别标签**：用于筛选模板分类，必须从以下固定列表中匹配（可多选）：\n  `基础` `推荐` `节日` `点击` `展开` `切换` `弹窗` `答题` `轮播` `滑动` `美化` `新年` `圣诞` `媒体` `路径` `音频` `视频` `链接` `特效`\n  例如：用户提到\"清明节\"→ 匹配标签 `节日`；用户提到\"新年贺卡\"→ 匹配标签 `新年`\n- **主题关键词**：用于按标题搜索相关模板（如\"清明\"、\"端午\"、\"春节\"）\n- **具体要求**：用户对内容的特殊说明\n\n## 初始化任务目录\n\n提取完成后，创建任务目录并写入初始元信息：\n\n1. 生成临时目录：`/tmp/weipaiban-task-tmp-{当前时间戳}/`（workId 在 Step 3 才获得）\n2. 在目录中创建 `images/` 子目录\n3. 写入 `meta.json`：\n\n```json\n{\n  \"taskDir\": \"/tmp/weipaiban-task-tmp-{时间戳}\",\n  \"workId\": null,\n  \"templateId\": null,\n  \"theme\": \"用户主题\",\n  \"tags\": [\"匹配到的标签\"],\n  \"keywords\": \"主题关键词\",\n  \"requirements\": \"具体要求（如无则为空字符串）\",\n  \"currentStep\": \"01\",\n  \"createdAt\": \"ISO时间戳\"\n}\n```\n\n记录 `taskDir` 路径，后续所有步骤都通过此路径访问任务目录。然后进入下一步。\n\nFile v1.1.0:steps/02-search-templates.md\n\n# Step 2：搜索模板\n\n## 前置读取\n\n从任务目录读取 `meta.json`，获取 `tags` 和 `keywords` 用于搜索。\n\n---\n\n采用分路检索 + 合并去重 + 默认兜底策略搜索微排版模板库，确保尽可能找到匹配的模板。\n\n## 参数说明\n\n- `tags`：Step 1 中匹配到的类别标签（来自 meta.json），支持多选（如 `tags=节日&tags=推荐`）\n- `search`：主题关键词（来自 meta.json 的 keywords），按标题模糊匹配\n- 本步骤首轮搜索分为两路：仅 `search` 与仅 `tags`，每路最多取 5 条\n- **重要**：所有查询参数中的中文值必须进行 URL 编码。使用 curl 时请使用 `-G --data-urlencode` 自动处理编码。\n\n## 搜索策略（按顺序执行）\n\n### 2.1 分路搜索：仅 search + 仅 tags 并行\n\n同时发起以下两个请求，每路 `per_page=5`：\n\n#### 请求 A：仅关键词搜索（search）\n\n```bash\ncurl -s -G -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  --data-urlencode \"search=关键词\" \\\n  --data-urlencode \"per_page=5\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates\"\n```\n\n#### 请求 B：仅标签搜索（tags）\n\n```bash\ncurl -s -G -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  --data-urlencode \"tags=类别标签\" \\\n  --data-urlencode \"per_page=5\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates\"\n```\n\n> 如果有多个 `tags`，可在一个请求中传多个 `tags` 参数；也可按标签逐个请求后再合并，最终都按模板 ID 去重。\n\n### 2.2 合并结果并展示给用户\n\n将两路结果按模板 ID 去重合并后展示给用户，展示上限为最多 10 个。\n\n- 合并结果非空：告知用户\"已分别按关键词和分类标签搜索，并合并结果供您选择。\"\n- 合并结果为空：进入 2.3 兜底方案\n\n### 2.3 兜底方案：使用默认模板\n\n两路搜索合并后仍无结果时，通过 API 获取系统默认模板：\n\n```bash\ncurl -s -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates/default\"\n```\n\n告知用户：\"未找到匹配模板，将使用默认模板为您创建作品。\"展示默认模板的信息，确认后直接进入 Step 3。\n\n## 响应格式\n\n搜索接口响应格式详见 [references/api-formats.md](../references/api-formats.md#模板搜索响应)。\n\n## 展示格式\n\n将搜索结果展示给用户，每个模板以简短信息进行一行展示：\n\n1. 【[tags]】标题 + 模板预览网址（如：【节日】清明节模板 - ${WEIPAIBAN_API_BASE}/templates/${模板ID}）\n\n> 展示数量上限：最多 10 个（两路各取前 5，合并去重后展示）。\n>\n> ⏸️ **交互点**：展示搜索结果列表，等待用户明确选择一个模板后才能继续。用户也可以要求更换关键词或标签后重新搜索。**必须等到用户回复后再执行 Step 3，禁止自动选择模板。**\n\n## 后置写入\n\n用户选择模板后，更新任务目录 `meta.json`：将 `templateId` 设为选中的模板 ID，`currentStep` 更新为 `\"02\"`。\n\nFile v1.1.0:steps/03-create-and-parse.md\n\n# Step 3-4：创建作品 + 获取元素数据 + 模板画像分析\n\n> Step 3、Step 4、Step 4.1 将连续自动执行（克隆模板 → 获取元素数据 → 生成模板画像），无需等待用户确认。\n\n## 前置读取\n\n从任务目录读取 `meta.json`，获取 `templateId` 和 `theme`。\n\n## Step 3：从模板创建作品\n\n基于用户选择的模板创建新作品：\n\n```bash\ncurl -s -X POST \\\n  -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"title\":\"基于用户主题的标题\"}' \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates/选中的模板ID/clone\"\n```\n\n响应格式详见 [references/api-formats.md](../references/api-formats.md#克隆模板响应)。\n\n记录返回的作品 ID。然后将任务目录从临时路径重命名为正式路径：\n\n```bash\nmv /tmp/weipaiban-task-tmp-{时间戳} /tmp/weipaiban-task-{作品ID}\n```\n\n更新 `meta.json` 中的 `workId` 和 `taskDir` 为新路径。\n\n## Step 4：获取简化元素数据\n\n调用 parser 接口获取作品的简化元素数据：\n\n```bash\ncurl -s -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/vectors/作品ID/parser\"\n```\n\n响应格式详见 [references/api-formats.md](../references/api-formats.md#parser-获取响应)。\n\n### 元素类型说明\n\n- `text` 元素：包含文本内容和 `fill` 颜色属性\n- `rect` 元素：提取所有非透明填充的矩形元素，包含 `fill` 颜色、`width` 和 `height`\n- `image` 元素：包含图片信息，请注意完整识别图片的src地址信息\n- `slideshow` 元素：轮播图组件，包含 `assets` 数组，每个 asset 代表轮播中的一张图片\n\n**重要**：将 parser 接口返回的完整 `data.elements` 数组写入任务目录的 `elements.json` 文件。后续步骤将从该文件按需读取。\n\n## Step 4.1：模板画像分析（自动执行，不打断用户）\n\n> 这是一次**内部的客观分析**，不调用任何 API，也不设交互点。完成后立即进入 Step 5。\n>\n> **目的**：用户已经在 Step 2 选定了特定模板，该模板本身就携带了排版规划意图（类型、色系、节奏）。后续 Step 5-8 如果只按\"主题驱动\"生成，会丢失原模板的视觉调性。本步骤产出一份 `template_profile` 内部上下文对象，作为 Step 5-8 的额外约束输入，让生成结果\"有方向\"而不是\"从零重建\"。\n\n基于 Step 4 获取的 `elements` 数据，从三个客观维度分析模板：\n\n### ① 排版类型识别（layout_type）\n\n统计 elements 中各类型的数量与比例：\n\n- `text_count`：`type: \"text\"` 的元素数\n- `image_count`：`type: \"image\"` 的元素数\n- `has_slideshow`：是否存在 `type: \"slideshow\"` 元素\n- `large_rect_count`：宽高均 > 300 的 `type: \"rect\"` 元素数\n\n按以下规则判定 `layout_type`（命中即停止）：\n\n| 优先级 | layout_type    | 判定条件                                               |\n| ------ | -------------- | ------------------------------------------------------ |\n| 1      | **轮播展示型** | `has_slideshow=true` 且 slideshow.assets.length ≥ 3    |\n| 2      | **封面单图型** | `image_count=1` 且 `text_count ≤ 3` 且有大尺寸背景图   |\n| 3      | **图片主导型** | `image_count ≥ text_count` 且 `image_count ≥ 3`        |\n| 4      | **纯文字型**   | `image_count ≤ 1` 且 `text_count ≥ 5`                  |\n| 5      | **卡片堆叠型** | `large_rect_count ≥ 3` 且存在成组重复的 text/rect 结构 |\n| 6      | **图文混排型** | 其他情况（文本与图片数量接近，元素混合排布）           |\n\n### ② 原始色系提取（original_palette）\n\n遍历所有 `type: \"rect\"` 和 `type: \"text\"` 元素的 `fill` 字段：\n\n1. **频次归纳**：统计每种颜色出现的次数（rect 因面积大权重 ×2），取最高频为 `dominant`，次高频 2-3 个为 `secondary`，出现频次低但色相差异大的 1 个为 `accent`\n2. **HSL 转换**：将 dominant 从 hex 转 HSL，得到 (h, s, l)\n3. **特征判定**：\n   - `temperature`：`h ∈ [0°, 60°] ∪ [300°, 360°]` → warm；`h ∈ [180°, 270°]` → cool；其他 → neutral\n   - `saturation`：`s < 30%` → low；`30% ≤ s < 70%` → medium；`s ≥ 70%` → high\n   - `brightness`：`l < 35%` → dark；`35% ≤ l < 70%` → medium；`l ≥ 70%` → light\n   - `contrast`：对比 dominant 与 secondary 中最深色的 L 值差；差 < 20 → soft；20-50 → balanced；> 50 → strong\n\n### ③ 内容密度与结构（content_density）\n\n- `text_elements`：text 元素总数\n- `avg_char_count` / `max_char_count` / `min_char_count`：基于 `charCount` 字段的统计\n- `text_roles`：根据每个 text 元素的 `name` 字段分类推断（title/subtitle/body/caption），关键词匹配：\n  - `title`：包含\"标题\"、\"title\"、\"主标\"、\"大标\"\n  - `subtitle`：包含\"副标\"、\"subtitle\"、\"小标\"\n  - `body`：包含\"正文\"、\"内容\"、\"body\"、\"段落\"\n  - `caption`：包含\"注释\"、\"说明\"、\"caption\"、\"脚注\"\n  - 无匹配时：按 `charCount` 判断——≤ 8 字归入 title，8-20 归入 subtitle，20-50 归入 body，> 50 归入 body，< 4 归入 caption\n- `image_elements` / `slideshow_assets`：图片数量统计\n- `density_level`：\n  - `sparse`：`text_elements ≤ 4` 且 `avg_char_count ≤ 12`\n  - `dense`：`text_elements ≥ 10` 或 `avg_char_count ≥ 25`\n  - `balanced`：其他\n\n### 输出 template_profile\n\n将以上分析结果组装为一份 JSON 对象，并基于客观维度推导三条**自然语言排版规划**：\n\n```json\n{\n  \"template_profile\": {\n    \"layout_type\": \"图文混排型\",\n    \"layout_signals\": {\n      \"text_count\": 8,\n      \"image_count\": 3,\n      \"has_slideshow\": false,\n      \"large_rect_count\": 2\n    },\n    \"original_palette\": {\n      \"dominant\": \"#A3D9A5\",\n      \"secondary\": [\"#F5F5F5\", \"#5E8B73\"],\n      \"accent\": \"#FF6B6B\",\n      \"temperature\": \"cool\",\n      \"saturation\": \"low\",\n      \"brightness\": \"light\",\n      \"contrast\": \"soft\"\n    },\n    \"content_density\": {\n      \"text_elements\": 8,\n      \"avg_char_count\": 15,\n      \"max_char_count\": 42,\n      \"min_char_count\": 4,\n      \"text_roles\": { \"title\": 1, \"subtitle\": 2, \"body\": 4, \"caption\": 1 },\n      \"image_elements\": 3,\n      \"slideshow_assets\": 0,\n      \"density_level\": \"balanced\"\n    },\n    \"typography_plan\": \"本模板为图文混排，正文偏短句（avg 15 字），标题精炼；生成新文本时保持相近字数节奏，避免长段堆砌。\",\n    \"color_plan\": \"原模板为低饱和度冷色调、柔和对比；即使切换到新主题色系，新配色需保持 low 饱和度与 soft 对比层次，避免突兀的高饱和冲击。\",\n    \"image_plan\": \"以简洁构图为主，明度偏亮（light）、饱和度低；生成图应遵循相近的明度与饱和度，与模板原有氛围协调。\"\n  }\n}\n```\n\n三条 `*_plan` 文本由对应客观维度自动推导得出，需真实反映当前模板的特征（不要使用模板化文本）。\n\n**重要**：将 `template_profile` 对象写入任务目录的 `template-profile.json` 文件。**后续 Step 5、Step 6、Step 7、Step 8a 必须从该文件读取 template_profile 并作为生成约束输入**。\n\n## 后置写入\n\n确认以下文件已写入任务目录：\n\n- `meta.json`（已更新 workId、taskDir、currentStep=\"03\"）\n- `elements.json`（完整 elements 数组）\n- `template-profile.json`（完整 template_profile 对象）\n\n本步骤不输出任何用户可见内容，直接进入 Step 5。\n\nFile v1.1.0:steps/05-color-scheme.md\n\n# Step 5：生成配色方案\n\n> Step 5 在生成文本和图片之前执行，因为配色方案决定了整体视觉基调。\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"rect\"` 和 `type: \"text\"` 的元素，仅提取每个元素的 `id`、`name`、`type`、`fill` 字段（忽略其他类型和字段以节省上下文）\n3. **`template-profile.json`**：仅读取 `original_palette`（temperature/saturation/brightness/contrast）和 `color_plan` 两个字段\n\n如果 elements.json 中没有 `type: \"rect\"` 和 `type: \"text\"` 的元素，则跳过本步骤。\n\n---\n\n配色生成的核心原则是：\"**色相可以跟随用户主题切换，但饱和度层级、明度层次、对比强度必须延续原模板**\"，这样替换后的作品在视觉感受上仍与原模板协调。\n\n## 配色生成要求\n\n- 分析用户指定的主题，确定整体色彩基调（如清明节 → 清新绿色系，春节 → 红金色系，科技 → 蓝色系）\n- 生成 3-5 个互相协调的主色调，数量应与原模板 `original_palette` 的层级数量对齐（dominant + secondary + accent），避免强行扩展或收缩\n- **保留原模板的饱和度等级**：`original_palette.saturation` 是 low，新配色也必须是 low（例：用户主题\"春节红\" → 低饱和胭脂红/豆沙红，而非高饱和正红）\n- **保留原模板的明度层次**：`original_palette.brightness` 是 light，新配色的明度分布也应偏亮；是 dark 则整体偏深\n- **保留原模板的对比强度**：`original_palette.contrast` 是 soft，新配色 dominant 与 secondary 的 L 值差应保持在 20 以内；balanced 保持 20-50；strong 保持 > 50\n- **rect 元素**（大面积背景色块）：分配主色调中的背景色，通常使用较柔和或较深的色调\n- **text 元素**：分配与对应背景有足够对比度的文字颜色，确保可读性（对比度建议至少 4.5:1）\n- 保持配色方案在整体视觉上的协调统一\n- 参考元素的 `name` 属性了解其用途（如\"标题文字\"应更醒目，\"正文\"应更柔和）\n\n> ⏸️ **交互点**：展示配色方案时，**先用一句话说明画像依据**（例：「原模板为 low 饱和度 / cool 色调 / light 明度 / soft 对比；已在新配色中延续相同的饱和度、明度与对比层次，仅将色相切换至 {用户主题} 基调」），然后以表格形式展示所有配色替换方案（元素名称 | 类型 | 原颜色 | 新颜色），并用色块预览展示新旧颜色对比。等待用户确认或要求调整。**必须等到用户确认后才能继续。**\n\n## 后置写入\n\n用户确认后，将配色方案写入任务目录的 `color-changes.json`：\n\n```json\n{\n  \"palette\": {\n    \"primary\": \"#主色调\",\n    \"secondary\": [\"#辅助色1\", \"#辅助色2\"],\n    \"accent\": \"#点缀色\"\n  },\n  \"changes\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"type\": \"rect\",\n      \"oldFill\": \"#原颜色\",\n      \"newFill\": \"#新颜色\"\n    },\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"type\": \"text\",\n      \"oldFill\": \"#原颜色\",\n      \"newFill\": \"#新颜色\"\n    }\n  ]\n}\n```\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"05\"`。\n\nFile v1.1.0:steps/06-generate-text.md\n\n# Step 6：生成新文本\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"text\"` 的元素，仅提取每个元素的 `id`、`name`、`text`、`charCount` 字段\n3. **`template-profile.json`**：仅读取 `content_density`（density_level、text_roles）和 `typography_plan` 两个字段\n\n---\n\n文本生成的核心原则是：\"**内容可以围绕用户主题，但字数节奏与文本角色风格必须延续原模板**\"，避免替换后的文字超出排版框、或让整体密度失衡。\n\n## 生成要求\n\n- 参考原始文本的字数（`charCount`），生成**相近长度**的替换文本，单个元素的新文本字数应严格贴近原字数（允许 ±20% 的浮动，禁止大幅偏离，保护原排版不溢出）\n- **遵循 density_level**：\n  - `sparse` → 精炼短句、留白优先，整体信息密度低\n  - `balanced` → 中等长度、有呼吸感，信息密度适中\n  - `dense` → 允许较多信息量，但保持层次清晰\n- **按 text_roles 区分风格**：\n  - `title`（标题）：精炼有力，字数短，用词醒目\n  - `subtitle`（副标题）：辅助说明主题，承上启下\n  - `body`（正文）：连贯成段，逻辑清晰\n  - `caption`（注释/脚注）：简洁点题，不抢主角戏份\n- 内容要契合用户指定的主题\n- 注意元素的 `name` 属性，它描述了文本的用途，生成内容应匹配其用途\n- 保持文本之间的逻辑连贯性\n- 语言风格要统一\n\n> ⏸️ **交互点**：以表格形式展示所有文本替换方案（原文本 → 新文本），等待用户确认或要求修改。**必须等到用户确认后才能继续。**\n\n## 后置写入\n\n用户确认后，将文本变更写入任务目录的 `text-changes.json`：\n\n```json\n{\n  \"changes\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"oldText\": \"原始文本\",\n      \"newText\": \"新文本\",\n      \"oldCharCount\": 7,\n      \"newCharCount\": 7\n    }\n  ]\n}\n```\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"06\"`。\n\nFile v1.1.0:steps/07-image-analysis.md\n\n# Step 7：图片分析与分类\n\n在生成新图片之前，先对每张原始图片进行深入分析，理解其用途和内容特征，从而为后续生成提供精准的策略指导。这一步不调用即梦 API，完全由 AI 基于已有数据和视觉能力完成。\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"image\"` 和 `type: \"slideshow\"` 的元素\n3. **`template-profile.json`**：仅读取以下字段：\n   - `original_palette`：原模板色系特征（温度、饱和度、明度、对比）\n   - `image_plan`：基于原模板推导出的图片调性约束文本\n   - `layout_type`：排版类型（影响图片在构图中的角色定位）\n\n这些信息用于在分析每张图片时同步记录\"该图是否与原模板调性一致\"，并作为 Step 8a 生成 prompt 时决定\"延续原调性\"还是\"融入新主题\"的依据。\n\n---\n\n从 elements 中筛选出所有 `type: \"image\"` 的元素，以及所有 `type: \"slideshow\"` 元素中 `assets` 数组里的每张图片，逐一进行分析和分类。\n\n**处理顺序**：按元素在 `elements.json` 中出现的顺序处理，先独立 `image` 元素，再处理 `slideshow` 元素中的每张 `asset`。\n\n> **轮播图片说明**：slideshow 元素的每张 asset 图片与普通 image 元素采用相同的分析流程。在后续展示和处理中，轮播图片以「轮播组件名称 > asset 标题」的格式标识其来源。\n\n**⚠️ 并发限制**：图片视觉识别调用模型，存在并发限制，必须通过**子代理模式**逐张串行处理。主代理控制循环，每次仅启动一个子代理分析一张图片，等待其完全返回后再处理下一张。禁止并行启动多个子代理。\n\n## Step 7.1：逐张分析（子代理模式）\n\n对每张图片，使用**子代理**处理。子代理完成**一张图片的完整分析闭环**：三重信号收集 + 分类判定 + 结果返回。\n\n### 子代理任务\n\n> **子代理任务**：分析一张图片，返回分类结果。\n>\n> **输入参数**：\n>\n> - name: \"{元素名称}\"\n> - width: {宽度}\n> - height: {高度}\n> - imageSrc: \"{image.src URL}\"\n> - originalPalette: \"{original_palette 摘要，如：中等饱和度/高明度/低对比/暖色温}\"\n>\n> **参考数据**（内嵌到子代理指令中）：\n>\n> - 名称关键词表：\n>   - 跳过：logo, Logo, LOGO, 品牌, 商标, brand, 二维码, qr, QR, qrcode, 扫码, 水印, watermark\n>   - 背景：背景, bg, 底图, banner\n>   - 人物：人物, 角色, 头像, 人像, avatar\n>   - 装饰：装饰, 图标, icon, 插图, 分隔, 线条, 点缀\n>   - 文字图：标题图, 文字, 书法, 艺术字\n> - 尺寸规则：\n>   - 大图：宽≥600 且 高≥400（或反之）→ 倾向背景（但透明背景除外，透明大图更可能是人物/装饰）\n>   - 小图：任一边 < 200px → 倾向装饰/图标\n>   - 极端比例：宽高比 > 3:1 或 < 1:3 → 可能是分隔条/装饰条\n> - 分类优先级（从高到低，命中即停）：\n>   1. **跳过保留**：name 匹配跳过关键词 OR 视觉为 logo/二维码/水印\n>   2. **场景背景图**：name 匹配背景关键词 OR（大图 且 视觉为场景/纹理/渐变 且 **无透明背景**）\n>   3. **人物/角色**：name 匹配人物关键词 OR 视觉主体为人物/角色 OR（**有透明背景** 且 视觉主体为人物/角色/卡通形象）\n>   4. **文字类图片**：视觉主体为文字/书法/艺术字\n>   5. **装饰/插图**：name 匹配装饰关键词 OR 小图 OR 视觉为小图形/图标 OR（**有透明背景** 且不属于以上）\n>   6. **通用配图**：兜底\n>\n> **执行步骤**：\n>\n> 1. 从 name 匹配关键词表，记录名称信号\n> 2. 从 width/height 判断尺寸信号\n> 3. 查看 imageSrc 图片，识别以下特征：\n>    - 图片主体内容（场景、人物、物体、文字、抽象图案等）\n>    - **是否有透明背景**（重点检测）：URL 以 `.png` 结尾表示可能有 alpha 通道；视觉上背景呈棋盘格/无背景/主体\"悬浮\"；主体干净抠出无残留。**注意：大尺寸图片同样可能有透明背景**（如 750×1200 人物立绘 PNG）\n>    - 是否为 logo 标识或二维码\n>    - 整体风格（摄影、插画、扁平、卡通、水彩等）\n>    - 主要颜色/色调\n> 4. 综合三重信号，按分类优先级判定 category\n> 5. 判断 tone_alignment（与 originalPalette 对比）：`aligned`（色调与模板主色系一致）或 `independent`（独立色系）\n> 6. 判断 needs_transparent：透明背景图 或 人物/角色/装饰/文字类 → `true`；场景背景/跳过 → `false`\n> 7. 返回结果\n>\n> **返回格式**（严格 JSON）：\n>\n> ```json\n> {\n>   \"category\": \"场景背景图|人物/角色|文字类图片|装饰/插图|通用配图|跳过保留\",\n>   \"visualDescription\": \"一句话描述原图内容和风格\",\n>   \"toneAlignment\": \"aligned|independent\",\n>   \"needsTransparent\": true,\n>   \"hasTransparent\": false,\n>   \"skip\": false\n> }\n> ```\n\n**⚠️ 串行约束**：必须等待当前子代理完全返回结果后，才能启动下一个子代理。\n\n### 子代理返回后\n\n子代理返回后，主代理**立即执行**以下操作：\n\n1. **如果成功**（返回了有效 JSON）：\n   - 基于元素的 `width` 和 `height` 计算原始宽高比，化简为最简整数比（如 750×1200 → `\"5:8\"`），记为 `ratio`\n   - 将子代理返回的结果 + 计算得到的 `ratio` 一起暂存到内存中的结果数组\n   - 向用户反馈：`✅ [{当前序号}/{总数}] {元素名称} → {分类}（{一句话描述}）`\n\n2. **如果失败**（子代理报错或返回格式异常）：\n   - 使用兜底分类：`category: \"通用配图\"`，`skip: false`\n   - 向用户反馈：`⚠️ [{当前序号}/{总数}] {元素名称} → 分析失败，兜底为\"通用配图\"`\n\n3. 如果后续还有未处理的图片：`🔄 正在分析下一张：{下一张元素名称}...`\n\n## Step 7.2：汇总校验\n\n所有子代理返回后，主代理对结果进行一致性检查：\n\n- 确认每张图片都有有效的 `category`\n- 确认每张图片都有有效的 `ratio`（从 width/height 计算得到的最简整数比，如 `\"5:8\"`、`\"1:1\"`、`\"3:4\"` 等）\n- 校验 `hasTransparent` 与分类的逻辑一致性（见下方指引）\n- 统计各分类数量，向用户反馈：`✅ 图片分析完成！跳过 X 张，待生成 Y 张。`\n\n> **透明背景分类指引**：有透明背景的图片应优先被识别为人物/角色或装饰/插图，而非场景背景图。透明背景是一个强信号，表明该图片的设计意图是叠加在其他元素之上使用，而不是作为全覆盖的场景背景。即使图片尺寸较大（如 750×1200），只要有透明背景，就不应被归类为场景背景图。如果发现不一致，主代理应自动修正分类。\n\n同时确认每张图片都记录了以下字段：\n\n- `visualDescription`：一句话概括原图内容和风格，供 Step 8 生成 prompt 时参考\n- `toneAlignment`：与 `template_profile.original_palette` 的关系\n  - `aligned`：该图色调与模板主色系一致（饱和度/明度/色温接近），在 Step 8 应延续原调性\n  - `independent`：该图是独立色系元素（如强调色点缀、与主色对比），在 Step 8 可融入新主题\n- `needsTransparent`：如果原图有透明背景（`hasTransparent=true`），或者分类为人物/角色、装饰/插图、文字类图片，则设为 `true`；如果分类为场景背景图或跳过保留，则设为 `false`\n\n## Step 7.3：展示分析报告\n\n将所有图片的分析结果汇总为表格，展示给用户：\n\n| #   | 元素名称          | 尺寸      | 是否透明 | 分类        | 原图内容描述       | 处理方式              |\n| --- | ----------------- | --------- | -------- | ----------- | ------------------ | --------------------- |\n| 1   | 背景图            | 750×1200  | ❌       | 🖼️ 场景背景 | 淡绿色渐变自然风景 | ✅ 重新生成           |\n| 2   | 公司logo          | 120×120   | ✅       | 🏷️ Logo     | 企业标志           | ⏭️ 跳过（保留原图）   |\n| 3   | 花朵装饰          | 80×80     | ✅       | 🎨 装饰元素 | 水彩花朵小图标     | ✅ 重新生成（需透明） |\n| 4   | 二维码            | 200×200   | ❌       | 📱 二维码   | 微信二维码         | ⏭️ 跳过（保留原图）   |\n| 5   | 人物插画          | 750×1200  | ✅       | 👤 人物角色 | 卡通人物立绘       | ✅ 重新生成（需透明） |\n| 6   | 轮播图 > 高山.jpg | 1170×1800 | ❌       | 🖼️ 场景背景 | 高山风景照片       | ✅ 重新生成           |\n| 7   | 轮播图 > 草地.jpg | 1170×1800 | ❌       | 🖼️ 场景背景 | 绿色草地风光       | ✅ 重新生成           |\n\n> ⏸️ **交互点**：展示图片分析与分类结果表格，等待用户确认。用户可以：\n>\n> - 调整某张图片的分类（如将\"通用配图\"改为\"场景背景\"）\n> - 将某些图片标记为\"跳过\"或取消跳过\n> - 调整某张图片的\"需要透明\"标记（如取消不需要透明背景的图片的标记，或为遗漏的图片添加标记）\n> - 确认后继续\n>\n> **必须等到用户确认后才能继续执行 Step 8a。**\n\n## 后置写入\n\n用户确认后，将分类结果写入任务目录的 `image-classifications.json`：\n\n```json\n{\n  \"summary\": { \"total\": 7, \"toGenerate\": 5, \"toSkip\": 2 },\n  \"images\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"assetId\": null,\n      \"name\": \"元素名称\",\n      \"source\": \"image\",\n      \"slideshowElementId\": null,\n      \"width\": 750,\n      \"height\": 1200,\n      \"ratio\": \"5:8\",\n      \"category\": \"场景背景图\",\n      \"visualDescription\": \"淡绿色渐变自然风景\",\n      \"toneAlignment\": \"aligned\",\n      \"needsTransparent\": false,\n      \"hasTransparent\": false,\n      \"skip\": false\n    }\n  ]\n}\n```\n\n其中 `source` 为 `\"image\"` 或 `\"slideshow\"`，slideshow 内的 asset 需额外填写 `assetId` 和 `slideshowElementId`。\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"07\"`。\n\nArchive v1.0.1: 17 files, 36960 bytes\n\nFiles: examples/usage-example.md (1698b), references/api-formats.md (3771b), references/error-handling.md (524b), references/runtime-dependencies.md (4948b), SKILL.md (10025b), steps/01-extract-tags.md (1313b), steps/02-search-templates.md (3070b), steps/03-create-and-parse.md (7596b), steps/05-color-scheme.md (3330b), steps/06-generate-text.md (2119b), steps/07-image-analysis.md (10225b), steps/08a-image-prompts.md (12526b), steps/08b-image-generate.md (3153b), steps/08c-image-bg-remove.md (2605b), steps/08d-image-upload.md (4173b), steps/09-update-and-complete.md (3252b), _meta.json (134b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: weipaiban-skill\ndescription: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换\nversion: 1.1.0\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: '🎨'\n    requires:\n      env:\n        - WEIPAIBAN_API_KEY\n    primaryEnv: WEIPAIBAN_API_KEY\n    optionalEnv:\n      - JIMENG_ACCESS_KEY\n      - JIMENG_SECRET_KEY\n    optionalSkills:\n      - jimeng-ai\n    optionalBinaries:\n      - python3\n      - rembg\n    externalServices:\n      - weipaiban.cn\n      - jimeng.com\n    writes:\n      - /tmp/weipaiban-task-*/\n      - ~/.u2net/u2netp.onnx\n---\n\n# 微排版技能\n\n你是微排版 AI 助手，能够帮助用户基于模板快速创建和编辑微信图文作品。\n\n## 环境变量\n\n- `WEIPAIBAN_API_KEY`：微排版平台 API 密钥（必须），格式为 `sk-` 开头，如果没有，需要用户去 <https://weipaiban.cn/settings/api-keys> 上进行生成\n- `WEIPAIBAN_API_BASE`：微排版 API 地址（可选），默认值为 `https://weipaiban.cn`\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```text\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\n## 运行时依赖\n\n微排版技能将依赖项按\"必需 / 可选\"区分，透明告知用户并支持降级执行。详细说明见 [references/runtime-dependencies.md](references/runtime-dependencies.md)。\n\n### 必需依赖\n\n- **凭据**：`WEIPAIBAN_API_KEY`\n- **外部服务**：`weipaiban.cn`（模板搜索、作品管理、CDN 上传）\n- **磁盘写入**：`/tmp/weipaiban-task-{workId}/`（任务中间结果，任务结束后可清理）\n\n### 可选依赖（仅 Step 8 图片生成阶段使用）\n\n- **凭据**：`JIMENG_ACCESS_KEY` / `JIMENG_SECRET_KEY`\n- **依赖技能**：`jimeng-ai`（通过 clawhub 或 find-skill 安装）\n- **本地二进制**：\n  - `python3`（≥3.9）\n  - `rembg`：仅使用 `u2netp` 轻量模型（固定参数 `-m u2netp`），首次运行下载 `~/.u2net/u2netp.onnx`（约 4.7MB）\n- **外部服务**：即梦 API（图片生成）\n\n### 缺失可选依赖时的降级行为\n\n**如果未配置 JIMENG_* 或未安装 jimeng-ai / rembg，Step 8（图片生成）将被跳过**，作品保留模板原图；其他步骤（模板选择、配色、文本替换、作品更新）仍正常执行。Step 8a 在执行前会检测依赖并进入交互点，由用户选择「安装」「跳过图片生成」或「取消」。**技能不会在未经用户同意的情况下自动执行 `pip install` 或安装其他技能。**\n\n## 交互规则\n\n**⚠️ 逐步确认模式**：每个标记了 ⏸️ 的步骤都是强制交互点，必须暂停等待用户明确回复后才能继续执行下一步。禁止跳过交互点或自动连续执行多个步骤。\n\n## 执行协议\n\n**⚠️ 严格逐步执行**：本技能采用\"按需加载、逐步执行\"模式，必须遵循以下规则：\n\n1. **一次只执行一个步骤**：当前步骤完全完成前，禁止读取或执行下一个步骤的详情文件\n2. **按需读取**：执行每个步骤时才读取该步骤的详情文件（如 `steps/01-extract-tags.md`），禁止提前读取后续步骤\n3. **禁止批量加载**：禁止一次性读取多个步骤文件，每个步骤的详情文件在需要时才加载\n4. **步骤完成确认**：每个步骤完成后确认产出数据写入任务目录，再进入下一步骤\n5. **上下文精简**：进入新步骤时，从任务目录读取该步所需的最小数据，不保留上一步骤文件的完整指令文本或上下文中的大段数据\n\n## 任务目录\n\n每次执行微排版任务时，使用临时任务目录在磁盘上持久化中间结果，步骤间通过文件传递数据，避免在上下文中累积大量数据。\n\n**目录路径**：`/tmp/weipaiban-task-{workId}/`（Step 1 时 workId 未知，使用时间戳创建临时目录；Step 3 获得 workId 后重命名）\n\n**目录结构**：\n\n```\n/tmp/weipaiban-task-{workId}/\n├── meta.json                    # 全局元信息（workId, theme, currentStep 等）\n├── elements.json                # Step 4 原始 elements 完整数据\n├── template-profile.json        # Step 4.1 模板画像\n├── color-changes.json           # Step 5 配色变更\n├── text-changes.json            # Step 6 文本变更\n├── image-classifications.json   # Step 7 图片分类结果\n├── image-prompts.json           # Step 8a 提示词计划\n├── image-progress.json          # Step 8b/8c/8d 逐张进度追踪\n├── update-payload.json          # Step 9 最终提交负载\n└── images/                      # 图片处理临时文件\n```\n\n**使用规则**：\n\n- 每个步骤开始时，仅从任务目录读取该步所需的文件和字段（各步骤详情文件中有明确说明）\n- 每个步骤完成后，将产出数据写入对应文件，并更新 `meta.json` 的 `currentStep`\n- 禁止将完整 elements JSON、template_profile 等大段数据保持在上下文中——需要时从文件重新读取\n\n## 工作流程\n\n当用户请求使用微排版技能创建图文作品时，严格按照以下步骤**顺序**执行。**每个步骤开始时，才读取该步骤的详情文件**——禁止提前读取后续步骤文件。\n\n> **Step 8（图片生成）为可选阶段**：依赖 `jimeng-ai` 技能、`JIMENG_*` 凭据和本地 `rembg` 工具。缺失依赖时由用户选择跳过，作品将保留模板原图；其他步骤（配色、文本替换、作品更新）仍正常执行。\n\n| 步骤      | 名称                 | 说明                                                  | 交互点                   | 详情                                                               |\n| --------- | -------------------- | ----------------------------------------------------- | ------------------------ | ------------------------------------------------------------------ |\n| Step 1    | 提取分类标签和关键词 | 从用户输入提取标签、关键词、具体要求                  | -                        | [steps/01-extract-tags.md](steps/01-extract-tags.md)               |\n| Step 2    | 搜索模板             | 级联降级搜索模板库（分路检索 + 合并去重 + 默认兜底）  | ⏸️ 用户选择模板          | [steps/02-search-templates.md](steps/02-search-templates.md)       |\n| Step 3-4  | 创建作品 + 获取元素  | 克隆模板、获取元素、自动生成模板画像                  | - (连续执行)             | [steps/03-create-and-parse.md](steps/03-create-and-parse.md)       |\n| Step 5    | 生成配色方案         | 根据主题生成 3-5 个协调主色调，替换 rect/text 颜色    | ⏸️ 用户确认配色          | [steps/05-color-scheme.md](steps/05-color-scheme.md)               |\n| Step 6    | 生成新文本           | 根据主题生成匹配长度和用途的替换文本                  | ⏸️ 用户确认文本          | [steps/06-generate-text.md](steps/06-generate-text.md)             |\n| Step 7    | 图片分析与分类       | 三重信号（名称/尺寸/视觉）分析，6 级分类              | ⏸️ 用户确认分类          | [steps/07-image-analysis.md](steps/07-image-analysis.md)           |\n| Step 8a   | 图片提示词规划（可选）| 检测依赖 + 构造每张图片的生成 prompt                 | ⏸️ 缺失依赖时确认安装/跳过 | [steps/08a-image-prompts.md](steps/08a-image-prompts.md)           |\n| Step 8b   | 图片生成（可选）     | 逐张调用即梦 API 生成图片                             | -                        | [steps/08b-image-generate.md](steps/08b-image-generate.md)         |\n| Step 8c   | 图片背景去除（可选） | 使用 rembg 仅以 `u2netp` 轻量模型去背景并输出透明图   | -                        | [steps/08c-image-bg-remove.md](steps/08c-image-bg-remove.md)       |\n| Step 8d   | 图片上传 CDN（可选） | 逐张上传微排版素材库，汇总结果                        | ⏸️ 失败重试确认          | [steps/08d-image-upload.md](steps/08d-image-upload.md)             |\n| Step 9-10 | 更新作品 + 完成      | 汇总所有变更，批量提交更新，展示编辑链接              | -                        | [steps/09-update-and-complete.md](steps/09-update-and-complete.md) |\n\n## 断点恢复\n\n如果用户提供了已有的作品 ID（workId），或提到之前中断的任务，先检查任务目录是否存在：\n\n1. 检查 `/tmp/weipaiban-task-{workId}/meta.json` 是否存在\n2. 如果存在，读取 `currentStep` 字段，确定上次执行到哪一步\n3. 验证该步骤之前的所有必要文件是否完整（如 elements.json、template-profile.json 等）\n4. 向用户展示恢复状态，从断点步骤继续执行\n\n| currentStep  | 恢复行为                                                                 |\n| ------------ | ------------------------------------------------------------------------ |\n| 01 / 02      | 从对应步骤重新开始                                                       |\n| 03           | 检查 elements.json 和 template-profile.json 是否完整，完整则跳到 Step 5  |\n| 05 / 06 / 07 | 检查对应输出文件是否存在，存在则展示给用户确认，否则重新执行该步骤       |\n| 08a          | 若 `meta.json` 中 `skipImageGeneration=true`，直接跳到 Step 9；否则重新执行依赖检测交互点 |\n| 08b          | 读取 image-progress.json，仅对 status=pending 的图片重新生成             |\n| 08c          | 读取 image-progress.json，仅对需透明且 status=generated 的图片执行去白底 |\n| 08d          | 读取 image-progress.json，仅对未上传的图片执行上传                       |\n| 09 / done    | 重新构建 payload 并提交，或告知用户已完成                                |\n\n## 参考资料\n\n- [API 端点与响应格式](references/api-formats.md)\n- [错误处理](references/error-handling.md)\n- [使用示例](examples/usage-example.md)\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn729y74k4eyhx5ax4zzmqvd1s84decf\",\n  \"slug\": \"weipaiban-skill\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1777021500730\n}\n\nFile v1.0.1:references/api-formats.md\n\n# API 端点与响应格式参考\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\nAPI 基础地址：`${WEIPAIBAN_API_BASE:-https://weipaiban.cn}`\n\n---\n\n## 模板搜索响应\n\n`GET /api/v1/templates`\n\n```json\n{\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": \"模板ID\",\n        \"title\": \"模板标题\",\n        \"description\": \"模板描述\",\n        \"tags\": [\"标签1\", \"标签2\"],\n        \"thumbnail\": \"缩略图URL\",\n        \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n      }\n    ],\n    \"total\": 10,\n    \"page\": 1,\n    \"perPage\": 5\n  }\n}\n```\n\n## 默认模板响应\n\n`GET /api/v1/templates/default`\n\n```json\n{\n  \"data\": {\n    \"id\": \"模板ID\",\n    \"title\": \"模板标题\",\n    \"description\": \"模板描述\",\n    \"tags\": [\"标签1\", \"标签2\"],\n    \"thumbnail\": \"缩略图URL\",\n    \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## 克隆模板响应\n\n`POST /api/v1/templates/{模板ID}/clone`\n\n请求体：`{\"title\": \"作品标题\"}`\n\n```json\n{\n  \"data\": {\n    \"id\": \"新作品ID\",\n    \"title\": \"作品标题\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## Parser 获取响应\n\n`GET /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"elements\": [\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"标题文本\",\n        \"type\": \"text\",\n        \"text\": \"原始文本内容\",\n        \"charCount\": 7,\n        \"fill\": \"#333333\"\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景色块\",\n        \"type\": \"rect\",\n        \"fill\": \"#d9d9d9\",\n        \"width\": 750,\n        \"height\": 1200\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景图\",\n        \"type\": \"image\",\n        \"image\": {\n          \"src\": \"https://原始图片地址\",\n          \"width\": 800,\n          \"height\": 600,\n          \"ratio\": \"4:3\"\n        }\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"轮播图\",\n        \"type\": \"slideshow\",\n        \"assets\": [\n          {\n            \"id\": \"asset1\",\n            \"title\": \"高山.jpg\",\n            \"src\": \"https://图片地址1\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          },\n          {\n            \"id\": \"asset2\",\n            \"title\": \"草地.jpg\",\n            \"src\": \"https://图片地址2\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n## Parser 更新响应\n\n`POST /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## CDN 上传响应\n\n`POST /api/v1/assets/fetch`\n\n请求体：`{\"url\": \"图片URL\"}`\n\n该接口基于文件内容 SHA1 哈希自动去重：相同图片重复上传返回 HTTP 200（已有记录），新图片上传返回 HTTP 201。\n\n成功响应：\n\n```json\n{\n  \"data\": {\n    \"id\": \"资源ID\",\n    \"type\": \"image\",\n    \"name\": \"存储路径\",\n    \"title\": \"文件名\",\n    \"src\": \"https://svg-cdn.creatby.com/...\",\n    \"width\": 800,\n    \"height\": 600,\n    \"size\": 123456,\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n错误响应（400/413/415/502/504）：\n\n```json\n{\n  \"error\": {\n    \"message\": \"错误描述\",\n    \"code\": 400\n  }\n}\n```\n\n## CDN 文件上传\n\n`POST /api/v1/assets/upload`\n\n请求格式：`multipart/form-data`，字段 `file` 为图片文件。\n\n```bash\ncurl -s --max-time 30 -X POST \\\n  -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  -F \"file=@本地文件路径\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/assets/upload\"\n```\n\n响应格式与 `/api/v1/assets/fetch` 相同（同样支持 SHA1 去重）。\n\nFile v1.0.1:references/error-handling.md\n\n# 错误处理\n\n- **401 Unauthorized**：API Key 无效或过期，提示用户在微排版平台重新生成 API Key\n- **403 Forbidden**：用户角色权限不足，需要 admin 或 developer 角色\n- **404 Not Found**：模板或作品不存在，检查 ID 是否正确\n- **429 Too Many Requests**：请求频率超限（60次/分钟），等待后重试\n- **模板搜索无结果**：按级联降级策略自动重试（tags+search → 仅search → 仅tags → 默认模板），全部无果时使用默认模板兜底\n\nFile v1.0.1:references/runtime-dependencies.md\n\n# 运行时依赖与数据流参考\n\n本文件集中说明微排版技能在运行时所需的凭据、外部服务、本地二进制、磁盘写入以及数据流向。元数据（SKILL.md / README.md 顶部）是简要声明，此处是完整释义。\n\n---\n\n## 依赖总览\n\n| 类别       | 名称                  | 必需 / 可选 | 用途                                   |\n| ---------- | --------------------- | ----------- | -------------------------------------- |\n| 凭据       | `WEIPAIBAN_API_KEY`   | 必需        | 微排版平台 API 鉴权                    |\n| 凭据       | `WEIPAIBAN_API_BASE`  | 可选        | 自定义微排版 API 地址（默认官方）      |\n| 凭据       | `JIMENG_ACCESS_KEY`   | 可选        | 即梦 API 鉴权（Step 8 图片生成）       |\n| 凭据       | `JIMENG_SECRET_KEY`   | 可选        | 即梦 API 鉴权（Step 8 图片生成）       |\n| 依赖技能   | `jimeng-ai`           | 可选        | 封装即梦图片生成调用                   |\n| 本地二进制 | `python3`（≥3.9）     | 可选        | 运行 rembg                             |\n| 本地二进制 | `rembg` CLI           | 可选        | 背景去除（仅使用 `u2netp` 轻量模型）   |\n| 外部服务   | `weipaiban.cn`        | 必需        | 模板搜索、作品管理、素材 CDN 上传      |\n| 外部服务   | 即梦 API              | 可选        | 根据 prompt 生成图片                   |\n| 磁盘写入   | `/tmp/weipaiban-task-{workId}/` | 必需 | 任务中间文件（元信息、图片、进度）     |\n| 磁盘写入   | `~/.u2net/u2netp.onnx`| 可选        | rembg u2netp 模型缓存（约 4.7MB）      |\n\n---\n\n## 数据流\n\n### 基础流程（必需依赖）\n\n```text\n用户输入\n  → 主代理\n  → weipaiban.cn（模板搜索、克隆、获取 elements、更新作品）\n  → 本地 /tmp/weipaiban-task-{workId}/（缓存中间 JSON）\n  → 返回作品编辑链接\n```\n\n此流程仅在微排版平台和本地磁盘之间往返，不涉及第三方图片服务。\n\n### 图片生成流程（可选阶段 Step 8）\n\n```text\n主代理\n  → jimeng-ai 技能 → 即梦 API（发送 prompt / ratio，返回临时图片 URL）\n  → 本地下载到 /tmp/weipaiban-task-{workId}/images/{elementId}_generated.png\n  → rembg -m u2netp（若 needsTransparent=true）→ {elementId}_nobg.png\n  → weipaiban.cn /api/v1/assets/upload 或 /api/v1/assets/fetch\n  → 获取 CDN 永久 URL\n```\n\n> **重要**：发送给即梦 API 的 prompt 由用户主题 + 模板画像 + 配色方案拼接而成；图片内容最终会上传到 weipaiban CDN 并成为作品的一部分。用户应确认这两个服务对上传内容的隐私政策。\n\n---\n\n## 安装命令与副作用\n\n### 安装 `jimeng-ai` 技能\n\n通过 clawhub 或 find-skill 技能查找并安装。具体命令由 clawhub/find-skill 决定，不在本技能控制范围内。\n\n### 安装 `rembg`\n\n```bash\npip3 install \"rembg[cpu,cli]\"\n```\n\n**副作用**：\n\n- 安装 `rembg`、`onnxruntime`（CPU 版本）、`pymatting` 等依赖\n- **首次运行时**下载 `u2netp.onnx`（约 4.7MB）到 `~/.u2net/u2netp.onnx`\n- 本技能**固定**使用 `u2netp` 轻量模型（命令 `rembg i -m u2netp`），不会下载其他模型（如完整版 `u2net` 176MB）\n\n### 申请 `JIMENG_ACCESS_KEY` / `JIMENG_SECRET_KEY`\n\n需在即梦平台自行申请。本技能不会通过 API 自动生成或读取密钥文件。\n\n---\n\n## 用户同意原则\n\n本技能严格遵循以下原则：\n\n1. **不在未经用户同意的情况下执行安装命令**。Step 8a 的依赖检测只做\"检测 + 展示结果 + 请求用户选择\"，不会直接运行 `pip install` 或安装其他技能\n2. **降级可用**：缺失可选依赖时，用户可选择跳过 Step 8，作品保留模板原图，其他步骤仍然完成\n3. **展示完整命令**：用户选择「安装」后，每条命令执行前都会再次展示并请求确认\n\n---\n\n## 隔离与最小化凭据建议\n\n- **隔离运行**：若对隐私或磁盘占用有顾虑，建议在容器或沙箱环境中运行。任务目录 `/tmp/weipaiban-task-*/` 默认随系统重启清理；`~/.u2net/u2netp.onnx` 可以手动删除\n- **凭据最小化**：仅为微排版账号提供必要权限的 API Key。若使用即梦，建议创建有使用期限或调用配额限制的临时凭据\n- **任务目录清理**：任务完成后可手动执行 `rm -rf /tmp/weipaiban-task-{workId}/` 清理中间文件（技能本身不会主动删除，以便失败重试）\n\n---\n\n## 已知外部端点清单\n\n- `https://weipaiban.cn/api/v1/templates` / `/templates/default` / `/templates/{id}/clone`\n- `https://weipaiban.cn/api/v1/vectors/{workId}/parser`\n- `https://weipaiban.cn/api/v1/assets/fetch` / `/assets/upload`\n- 即梦图片生成端点（由 `jimeng-ai` 技能内部调用，本技能不直接暴露 URL）\n\n本技能不会向除此之外的任何外部服务发送请求。\n\nFile v1.0.1:examples/usage-example.md\n\n# 使用示例\n\n用户：\"请帮我用微排版创建一个清明节的微信图文\"\n\n执行流程：\n\n1. 提取分类标签和关键词：标签 `节日`，关键词\"清明\"。创建任务目录 `/tmp/weipaiban-task-tmp-{时间戳}/`，写入 `meta.json`\n2. 搜索模板：分别执行仅关键词搜索（`search=清明`）和仅标签搜索（`tags=节日`），每路各取前 5，按模板 ID 去重合并\n3. 展示最多 10 个候选模板，用户选择一个。更新 `meta.json` 的 templateId\n4. 从模板创建新作品，重命名任务目录为 `/tmp/weipaiban-task-{作品ID}/`\n5. 获取简化元素（文本、矩形色块、图片、轮播），写入 `elements.json`\n6. 自动分析模板画像（排版类型、色系、密度），写入 `template-profile.json`\n7. 根据清明节主题生成清新绿色系配色方案，替换 rect 和 text 的颜色。用户确认后写入 `color-changes.json`\n8. 为每个文本生成清明节主题的新内容。用户确认后写入 `text-changes.json`\n9. 分析每张图片的用途和内容（通过名称、尺寸、视觉识别），分类为场景背景/人物/装饰等，跳过 logo 和二维码。用户确认后写入 `image-classifications.json`\n10. 为每张图片构造分类专属的生成 prompt，写入 `image-prompts.json`，初始化 `image-progress.json`\n11. 逐张调用即梦 API 生成图片，每张完成后即时反馈进度\n12. 对需要透明背景的图片逐张执行 rembg 白底转透明\n13. 逐张上传到微排版 CDN，展示汇总结果，失败可重试\n14. 从 `color-changes.json`、`text-changes.json`、`image-progress.json` 汇总所有变更，批量更新作品\n15. 返回编辑链接给用户\n\nFile v1.0.1:steps/01-extract-tags.md\n\n# Step 1：提取分类标签和关键词\n\n从用户输入中提取以下信息：\n\n- **类别标签**：用于筛选模板分类，必须从以下固定列表中匹配（可多选）：\n  `基础` `推荐` `节日` `点击` `展开` `切换` `弹窗` `答题` `轮播` `滑动` `美化` `新年` `圣诞` `媒体` `路径` `音频` `视频` `链接` `特效`\n  例如：用户提到\"清明节\"→ 匹配标签 `节日`；用户提到\"新年贺卡\"→ 匹配标签 `新年`\n- **主题关键词**：用于按标题搜索相关模板（如\"清明\"、\"端午\"、\"春节\"）\n- **具体要求**：用户对内容的特殊说明\n\n## 初始化任务目录\n\n提取完成后，创建任务目录并写入初始元信息：\n\n1. 生成临时目录：`/tmp/weipaiban-task-tmp-{当前时间戳}/`（workId 在 Step 3 才获得）\n2. 在目录中创建 `images/` 子目录\n3. 写入 `meta.json`：\n\n```json\n{\n  \"taskDir\": \"/tmp/weipaiban-task-tmp-{时间戳}\",\n  \"workId\": null,\n  \"templateId\": null,\n  \"theme\": \"用户主题\",\n  \"tags\": [\"匹配到的标签\"],\n  \"keywords\": \"主题关键词\",\n  \"requirements\": \"具体要求（如无则为空字符串）\",\n  \"currentStep\": \"01\",\n  \"createdAt\": \"ISO时间戳\"\n}\n```\n\n记录 `taskDir` 路径，后续所有步骤都通过此路径访问任务目录。然后进入下一步。\n\nFile v1.0.1:steps/02-search-templates.md\n\n# Step 2：搜索模板\n\n## 前置读取\n\n从任务目录读取 `meta.json`，获取 `tags` 和 `keywords` 用于搜索。\n\n---\n\n采用分路检索 + 合并去重 + 默认兜底策略搜索微排版模板库，确保尽可能找到匹配的模板。\n\n## 参数说明\n\n- `tags`：Step 1 中匹配到的类别标签（来自 meta.json），支持多选（如 `tags=节日&tags=推荐`）\n- `search`：主题关键词（来自 meta.json 的 keywords），按标题模糊匹配\n- 本步骤首轮搜索分为两路：仅 `search` 与仅 `tags`，每路最多取 5 条\n- **重要**：所有查询参数中的中文值必须进行 URL 编码。使用 curl 时请使用 `-G --data-urlencode` 自动处理编码。\n\n## 搜索策略（按顺序执行）\n\n### 2.1 分路搜索：仅 search + 仅 tags 并行\n\n同时发起以下两个请求，每路 `per_page=5`：\n\n#### 请求 A：仅关键词搜索（search）\n\n```bash\ncurl -s -G -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  --data-urlencode \"search=关键词\" \\\n  --data-urlencode \"per_page=5\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates\"\n```\n\n#### 请求 B：仅标签搜索（tags）\n\n```bash\ncurl -s -G -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  --data-urlencode \"tags=类别标签\" \\\n  --data-urlencode \"per_page=5\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates\"\n```\n\n> 如果有多个 `tags`，可在一个请求中传多个 `tags` 参数；也可按标签逐个请求后再合并，最终都按模板 ID 去重。\n\n### 2.2 合并结果并展示给用户\n\n将两路结果按模板 ID 去重合并后展示给用户，展示上限为最多 10 个。\n\n- 合并结果非空：告知用户\"已分别按关键词和分类标签搜索，并合并结果供您选择。\"\n- 合并结果为空：进入 2.3 兜底方案\n\n### 2.3 兜底方案：使用默认模板\n\n两路搜索合并后仍无结果时，通过 API 获取系统默认模板：\n\n```bash\ncurl -s -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates/default\"\n```\n\n告知用户：\"未找到匹配模板，将使用默认模板为您创建作品。\"展示默认模板的信息，确认后直接进入 Step 3。\n\n## 响应格式\n\n搜索接口响应格式详见 [references/api-formats.md](../references/api-formats.md#模板搜索响应)。\n\n## 展示格式\n\n将搜索结果展示给用户，每个模板以简短信息进行一行展示：\n\n1. 【[tags]】标题 + 模板预览网址（如：【节日】清明节模板 - ${WEIPAIBAN_API_BASE}/templates/${模板ID}）\n\n> 展示数量上限：最多 10 个（两路各取前 5，合并去重后展示）。\n>\n> ⏸️ **交互点**：展示搜索结果列表，等待用户明确选择一个模板后才能继续。用户也可以要求更换关键词或标签后重新搜索。**必须等到用户回复后再执行 Step 3，禁止自动选择模板。**\n\n## 后置写入\n\n用户选择模板后，更新任务目录 `meta.json`：将 `templateId` 设为选中的模板 ID，`currentStep` 更新为 `\"02\"`。\n\nFile v1.0.1:steps/03-create-and-parse.md\n\n# Step 3-4：创建作品 + 获取元素数据 + 模板画像分析\n\n> Step 3、Step 4、Step 4.1 将连续自动执行（克隆模板 → 获取元素数据 → 生成模板画像），无需等待用户确认。\n\n## 前置读取\n\n从任务目录读取 `meta.json`，获取 `templateId` 和 `theme`。\n\n## Step 3：从模板创建作品\n\n基于用户选择的模板创建新作品：\n\n```bash\ncurl -s -X POST \\\n  -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"title\":\"基于用户主题的标题\"}' \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates/选中的模板ID/clone\"\n```\n\n响应格式详见 [references/api-formats.md](../references/api-formats.md#克隆模板响应)。\n\n记录返回的作品 ID。然后将任务目录从临时路径重命名为正式路径：\n\n```bash\nmv /tmp/weipaiban-task-tmp-{时间戳} /tmp/weipaiban-task-{作品ID}\n```\n\n更新 `meta.json` 中的 `workId` 和 `taskDir` 为新路径。\n\n## Step 4：获取简化元素数据\n\n调用 parser 接口获取作品的简化元素数据：\n\n```bash\ncurl -s -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/vectors/作品ID/parser\"\n```\n\n响应格式详见 [references/api-formats.md](../references/api-formats.md#parser-获取响应)。\n\n### 元素类型说明\n\n- `text` 元素：包含文本内容和 `fill` 颜色属性\n- `rect` 元素：提取所有非透明填充的矩形元素，包含 `fill` 颜色、`width` 和 `height`\n- `image` 元素：包含图片信息，请注意完整识别图片的src地址信息\n- `slideshow` 元素：轮播图组件，包含 `assets` 数组，每个 asset 代表轮播中的一张图片\n\n**重要**：将 parser 接口返回的完整 `data.elements` 数组写入任务目录的 `elements.json` 文件。后续步骤将从该文件按需读取。\n\n## Step 4.1：模板画像分析（自动执行，不打断用户）\n\n> 这是一次**内部的客观分析**，不调用任何 API，也不设交互点。完成后立即进入 Step 5。\n>\n> **目的**：用户已经在 Step 2 选定了特定模板，该模板本身就携带了排版规划意图（类型、色系、节奏）。后续 Step 5-8 如果只按\"主题驱动\"生成，会丢失原模板的视觉调性。本步骤产出一份 `template_profile` 内部上下文对象，作为 Step 5-8 的额外约束输入，让生成结果\"有方向\"而不是\"从零重建\"。\n\n基于 Step 4 获取的 `elements` 数据，从三个客观维度分析模板：\n\n### ① 排版类型识别（layout_type）\n\n统计 elements 中各类型的数量与比例：\n\n- `text_count`：`type: \"text\"` 的元素数\n- `image_count`：`type: \"image\"` 的元素数\n- `has_slideshow`：是否存在 `type: \"slideshow\"` 元素\n- `large_rect_count`：宽高均 > 300 的 `type: \"rect\"` 元素数\n\n按以下规则判定 `layout_type`（命中即停止）：\n\n| 优先级 | layout_type    | 判定条件                                               |\n| ------ | -------------- | ------------------------------------------------------ |\n| 1      | **轮播展示型** | `has_slideshow=true` 且 slideshow.assets.length ≥ 3    |\n| 2      | **封面单图型** | `image_count=1` 且 `text_count ≤ 3` 且有大尺寸背景图   |\n| 3      | **图片主导型** | `image_count ≥ text_count` 且 `image_count ≥ 3`        |\n| 4      | **纯文字型**   | `image_count ≤ 1` 且 `text_count ≥ 5`                  |\n| 5      | **卡片堆叠型** | `large_rect_count ≥ 3` 且存在成组重复的 text/rect 结构 |\n| 6      | **图文混排型** | 其他情况（文本与图片数量接近，元素混合排布）           |\n\n### ② 原始色系提取（original_palette）\n\n遍历所有 `type: \"rect\"` 和 `type: \"text\"` 元素的 `fill` 字段：\n\n1. **频次归纳**：统计每种颜色出现的次数（rect 因面积大权重 ×2），取最高频为 `dominant`，次高频 2-3 个为 `secondary`，出现频次低但色相差异大的 1 个为 `accent`\n2. **HSL 转换**：将 dominant 从 hex 转 HSL，得到 (h, s, l)\n3. **特征判定**：\n   - `temperature`：`h ∈ [0°, 60°] ∪ [300°, 360°]` → warm；`h ∈ [180°, 270°]` → cool；其他 → neutral\n   - `saturation`：`s < 30%` → low；`30% ≤ s < 70%` → medium；`s ≥ 70%` → high\n   - `brightness`：`l < 35%` → dark；`35% ≤ l < 70%` → medium；`l ≥ 70%` → light\n   - `contrast`：对比 dominant 与 secondary 中最深色的 L 值差；差 < 20 → soft；20-50 → balanced；> 50 → strong\n\n### ③ 内容密度与结构（content_density）\n\n- `text_elements`：text 元素总数\n- `avg_char_count` / `max_char_count` / `min_char_count`：基于 `charCount` 字段的统计\n- `text_roles`：根据每个 text 元素的 `name` 字段分类推断（title/subtitle/body/caption），关键词匹配：\n  - `title`：包含\"标题\"、\"title\"、\"主标\"、\"大标\"\n  - `subtitle`：包含\"副标\"、\"subtitle\"、\"小标\"\n  - `body`：包含\"正文\"、\"内容\"、\"body\"、\"段落\"\n  - `caption`：包含\"注释\"、\"说明\"、\"caption\"、\"脚注\"\n  - 无匹配时：按 `charCount` 判断——≤ 8 字归入 title，8-20 归入 subtitle，20-50 归入 body，> 50 归入 body，< 4 归入 caption\n- `image_elements` / `slideshow_assets`：图片数量统计\n- `density_level`：\n  - `sparse`：`text_elements ≤ 4` 且 `avg_char_count ≤ 12`\n  - `dense`：`text_elements ≥ 10` 或 `avg_char_count ≥ 25`\n  - `balanced`：其他\n\n### 输出 template_profile\n\n将以上分析结果组装为一份 JSON 对象，并基于客观维度推导三条**自然语言排版规划**：\n\n```json\n{\n  \"template_profile\": {\n    \"layout_type\": \"图文混排型\",\n    \"layout_signals\": {\n      \"text_count\": 8,\n      \"image_count\": 3,\n      \"has_slideshow\": false,\n      \"large_rect_count\": 2\n    },\n    \"original_palette\": {\n      \"dominant\": \"#A3D9A5\",\n      \"secondary\": [\"#F5F5F5\", \"#5E8B73\"],\n      \"accent\": \"#FF6B6B\",\n      \"temperature\": \"cool\",\n      \"saturation\": \"low\",\n      \"brightness\": \"light\",\n      \"contrast\": \"soft\"\n    },\n    \"content_density\": {\n      \"text_elements\": 8,\n      \"avg_char_count\": 15,\n      \"max_char_count\": 42,\n      \"min_char_count\": 4,\n      \"text_roles\": { \"title\": 1, \"subtitle\": 2, \"body\": 4, \"caption\": 1 },\n      \"image_elements\": 3,\n      \"slideshow_assets\": 0,\n      \"density_level\": \"balanced\"\n    },\n    \"typography_plan\": \"本模板为图文混排，正文偏短句（avg 15 字），标题精炼；生成新文本时保持相近字数节奏，避免长段堆砌。\",\n    \"color_plan\": \"原模板为低饱和度冷色调、柔和对比；即使切换到新主题色系，新配色需保持 low 饱和度与 soft 对比层次，避免突兀的高饱和冲击。\",\n    \"image_plan\": \"以简洁构图为主，明度偏亮（light）、饱和度低；生成图应遵循相近的明度与饱和度，与模板原有氛围协调。\"\n  }\n}\n```\n\n三条 `*_plan` 文本由对应客观维度自动推导得出，需真实反映当前模板的特征（不要使用模板化文本）。\n\n**重要**：将 `template_profile` 对象写入任务目录的 `template-profile.json` 文件。**后续 Step 5、Step 6、Step 7、Step 8a 必须从该文件读取 template_profile 并作为生成约束输入**。\n\n## 后置写入\n\n确认以下文件已写入任务目录：\n\n- `meta.json`（已更新 workId、taskDir、currentStep=\"03\"）\n- `elements.json`（完整 elements 数组）\n- `template-profile.json`（完整 template_profile 对象）\n\n本步骤不输出任何用户可见内容，直接进入 Step 5。\n\nFile v1.0.1:steps/05-color-scheme.md\n\n# Step 5：生成配色方案\n\n> Step 5 在生成文本和图片之前执行，因为配色方案决定了整体视觉基调。\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"rect\"` 和 `type: \"text\"` 的元素，仅提取每个元素的 `id`、`name`、`type`、`fill` 字段（忽略其他类型和字段以节省上下文）\n3. **`template-profile.json`**：仅读取 `original_palette`（temperature/saturation/brightness/contrast）和 `color_plan` 两个字段\n\n如果 elements.json 中没有 `type: \"rect\"` 和 `type: \"text\"` 的元素，则跳过本步骤。\n\n---\n\n配色生成的核心原则是：\"**色相可以跟随用户主题切换，但饱和度层级、明度层次、对比强度必须延续原模板**\"，这样替换后的作品在视觉感受上仍与原模板协调。\n\n## 配色生成要求\n\n- 分析用户指定的主题，确定整体色彩基调（如清明节 → 清新绿色系，春节 → 红金色系，科技 → 蓝色系）\n- 生成 3-5 个互相协调的主色调，数量应与原模板 `original_palette` 的层级数量对齐（dominant + secondary + accent），避免强行扩展或收缩\n- **保留原模板的饱和度等级**：`original_palette.saturation` 是 low，新配色也必须是 low（例：用户主题\"春节红\" → 低饱和胭脂红/豆沙红，而非高饱和正红）\n- **保留原模板的明度层次**：`original_palette.brightness` 是 light，新配色的明度分布也应偏亮；是 dark 则整体偏深\n- **保留原模板的对比强度**：`original_palette.contrast` 是 soft，新配色 dominant 与 secondary 的 L 值差应保持在 20 以内；balanced 保持 20-50；strong 保持 > 50\n- **rect 元素**（大面积背景色块）：分配主色调中的背景色，通常使用较柔和或较深的色调\n- **text 元素**：分配与对应背景有足够对比度的文字颜色，确保可读性（对比度建议至少 4.5:1）\n- 保持配色方案在整体视觉上的协调统一\n- 参考元素的 `name` 属性了解其用途（如\"标题文字\"应更醒目，\"正文\"应更柔和）\n\n> ⏸️ **交互点**：展示配色方案时，**先用一句话说明画像依据**（例：「原模板为 low 饱和度 / cool 色调 / light 明度 / soft 对比；已在新配色中延续相同的饱和度、明度与对比层次，仅将色相切换至 {用户主题} 基调」），然后以表格形式展示所有配色替换方案（元素名称 | 类型 | 原颜色 | 新颜色），并用色块预览展示新旧颜色对比。等待用户确认或要求调整。**必须等到用户确认后才能继续。**\n\n## 后置写入\n\n用户确认后，将配色方案写入任务目录的 `color-changes.json`：\n\n```json\n{\n  \"palette\": {\n    \"primary\": \"#主色调\",\n    \"secondary\": [\"#辅助色1\", \"#辅助色2\"],\n    \"accent\": \"#点缀色\"\n  },\n  \"changes\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"type\": \"rect\",\n      \"oldFill\": \"#原颜色\",\n      \"newFill\": \"#新颜色\"\n    },\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"type\": \"text\",\n      \"oldFill\": \"#原颜色\",\n      \"newFill\": \"#新颜色\"\n    }\n  ]\n}\n```\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"05\"`。\n\nFile v1.0.1:steps/06-generate-text.md\n\n# Step 6：生成新文本\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"text\"` 的元素，仅提取每个元素的 `id`、`name`、`text`、`charCount` 字段\n3. **`template-profile.json`**：仅读取 `content_density`（density_level、text_roles）和 `typography_plan` 两个字段\n\n---\n\n文本生成的核心原则是：\"**内容可以围绕用户主题，但字数节奏与文本角色风格必须延续原模板**\"，避免替换后的文字超出排版框、或让整体密度失衡。\n\n## 生成要求\n\n- 参考原始文本的字数（`charCount`），生成**相近长度**的替换文本，单个元素的新文本字数应严格贴近原字数（允许 ±20% 的浮动，禁止大幅偏离，保护原排版不溢出）\n- **遵循 density_level**：\n  - `sparse` → 精炼短句、留白优先，整体信息密度低\n  - `balanced` → 中等长度、有呼吸感，信息密度适中\n  - `dense` → 允许较多信息量，但保持层次清晰\n- **按 text_roles 区分风格**：\n  - `title`（标题）：精炼有力，字数短，用词醒目\n  - `subtitle`（副标题）：辅助说明主题，承上启下\n  - `body`（正文）：连贯成段，逻辑清晰\n  - `caption`（注释/脚注）：简洁点题，不抢主角戏份\n- 内容要契合用户指定的主题\n- 注意元素的 `name` 属性，它描述了文本的用途，生成内容应匹配其用途\n- 保持文本之间的逻辑连贯性\n- 语言风格要统一\n\n> ⏸️ **交互点**：以表格形式展示所有文本替换方案（原文本 → 新文本），等待用户确认或要求修改。**必须等到用户确认后才能继续。**\n\n## 后置写入\n\n用户确认后，将文本变更写入任务目录的 `text-changes.json`：\n\n```json\n{\n  \"changes\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"oldText\": \"原始文本\",\n      \"newText\": \"新文本\",\n      \"oldCharCount\": 7,\n      \"newCharCount\": 7\n    }\n  ]\n}\n```\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"06\"`。\n\nFile v1.0.1:steps/07-image-analysis.md\n\n# Step 7：图片分析与分类\n\n在生成新图片之前，先对每张原始图片进行深入分析，理解其用途和内容特征，从而为后续生成提供精准的策略指导。这一步不调用即梦 API，完全由 AI 基于已有数据和视觉能力完成。\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"image\"` 和 `type: \"slideshow\"` 的元素\n3. **`template-profile.json`**：仅读取以下字段：\n   - `original_palette`：原模板色系特征（温度、饱和度、明度、对比）\n   - `image_plan`：基于原模板推导出的图片调性约束文本\n   - `layout_type`：排版类型（影响图片在构图中的角色定位）\n\n这些信息用于在分析每张图片时同步记录\"该图是否与原模板调性一致\"，并作为 Step 8a 生成 prompt 时决定\"延续原调性\"还是\"融入新主题\"的依据。\n\n---\n\n从 elements 中筛选出所有 `type: \"image\"` 的元素，以及所有 `type: \"slideshow\"` 元素中 `assets` 数组里的每张图片，逐一进行分析和分类。\n\n**处理顺序**：按元素在 `elements.json` 中出现的顺序处理，先独立 `image` 元素，再处理 `slideshow` 元素中的每张 `asset`。\n\n> **轮播图片说明**：slideshow 元素的每张 asset 图片与普通 image 元素采用相同的分析流程。在后续展示和处理中，轮播图片以「轮播组件名称 > asset 标题」的格式标识其来源。\n\n**⚠️ 并发限制**：图片视觉识别调用模型，存在并发限制，必须通过**子代理模式**逐张串行处理。主代理控制循环，每次仅启动一个子代理分析一张图片，等待其完全返回后再处理下一张。禁止并行启动多个子代理。\n\n## Step 7.1：逐张分析（子代理模式）\n\n对每张图片，使用**子代理**处理。子代理完成**一张图片的完整分析闭环**：三重信号收集 + 分类判定 + 结果返回。\n\n### 子代理任务\n\n> **子代理任务**：分析一张图片，返回分类结果。\n>\n> **输入参数**：\n>\n> - name: \"{元素名称}\"\n> - width: {宽度}\n> - height: {高度}\n> - imageSrc: \"{image.src URL}\"\n> - originalPalette: \"{original_palette 摘要，如：中等饱和度/高明度/低对比/暖色温}\"\n>\n> **参考数据**（内嵌到子代理指令中）：\n>\n> - 名称关键词表：\n>   - 跳过：logo, Logo, LOGO, 品牌, 商标, brand, 二维码, qr, QR, qrcode, 扫码, 水印, watermark\n>   - 背景：背景, bg, 底图, banner\n>   - 人物：人物, 角色, 头像, 人像, avatar\n>   - 装饰：装饰, 图标, icon, 插图, 分隔, 线条, 点缀\n>   - 文字图：标题图, 文字, 书法, 艺术字\n> - 尺寸规则：\n>   - 大图：宽≥600 且 高≥400（或反之）→ 倾向背景（但透明背景除外，透明大图更可能是人物/装饰）\n>   - 小图：任一边 < 200px → 倾向装饰/图标\n>   - 极端比例：宽高比 > 3:1 或 < 1:3 → 可能是分隔条/装饰条\n> - 分类优先级（从高到低，命中即停）：\n>   1. **跳过保留**：name 匹配跳过关键词 OR 视觉为 logo/二维码/水印\n>   2. **场景背景图**：name 匹配背景关键词 OR（大图 且 视觉为场景/纹理/渐变 且 **无透明背景**）\n>   3. **人物/角色**：name 匹配人物关键词 OR 视觉主体为人物/角色 OR（**有透明背景** 且 视觉主体为人物/角色/卡通形象）\n>   4. **文字类图片**：视觉主体为文字/书法/艺术字\n>   5. **装饰/插图**：name 匹配装饰关键词 OR 小图 OR 视觉为小图形/图标 OR（**有透明背景** 且不属于以上）\n>   6. **通用配图**：兜底\n>\n> **执行步骤**：\n>\n> 1. 从 name 匹配关键词表，记录名称信号\n> 2. 从 width/height 判断尺寸信号\n> 3. 查看 imageSrc 图片，识别以下特征：\n>    - 图片主体内容（场景、人物、物体、文字、抽象图案等）\n>    - **是否有透明背景**（重点检测）：URL 以 `.png` 结尾表示可能有 alpha 通道；视觉上背景呈棋盘格/无背景/主体\"悬浮\"；主体干净抠出无残留。**注意：大尺寸图片同样可能有透明背景**（如 750×1200 人物立绘 PNG）\n>    - 是否为 logo 标识或二维码\n>    - 整体风格（摄影、插画、扁平、卡通、水彩等）\n>    - 主要颜色/色调\n> 4. 综合三重信号，按分类优先级判定 category\n> 5. 判断 tone_alignment（与 originalPalette 对比）：`aligned`（色调与模板主色系一致）或 `independent`（独立色系）\n> 6. 判断 needs_transparent：透明背景图 或 人物/角色/装饰/文字类 → `true`；场景背景/跳过 → `false`\n> 7. 返回结果\n>\n> **返回格式**（严格 JSON）：\n>\n> ```json\n> {\n>   \"category\": \"场景背景图|人物/角色|文字类图片|装饰/插图|通用配图|跳过保留\",\n>   \"visualDescription\": \"一句话描述原图内容和风格\",\n>   \"toneAlignment\": \"aligned|independent\",\n>   \"needsTransparent\": true,\n>   \"hasTransparent\": false,\n>   \"skip\": false\n> }\n> ```\n\n**⚠️ 串行约束**：必须等待当前子代理完全返回结果后，才能启动下一个子代理。\n\n### 子代理返回后\n\n子代理返回后，主代理**立即执行**以下操作：\n\n1. **如果成功**（返回了有效 JSON）：\n   - 基于元素的 `width` 和 `height` 计算原始宽高比，化简为最简整数比（如 750×1200 → `\"5:8\"`），记为 `ratio`\n   - 将子代理返回的结果 + 计算得到的 `ratio` 一起暂存到内存中的结果数组\n   - 向用户反馈：`✅ [{当前序号}/{总数}] {元素名称} → {分类}（{一句话描述}）`\n\n2. **如果失败**（子代理报错或返回格式异常）：\n   - 使用兜底分类：`category: \"通用配图\"`，`skip: false`\n   - 向用户反馈：`⚠️ [{当前序号}/{总数}] {元素名称} → 分析失败，兜底为\"通用配图\"`\n\n3. 如果后续还有未处理的图片：`🔄 正在分析下一张：{下一张元素名称}...`\n\n## Step 7.2：汇总校验\n\n所有子代理返回后，主代理对结果进行一致性检查：\n\n- 确认每张图片都有有效的 `category`\n- 确认每张图片都有有效的 `ratio`（从 width/height 计算得到的最简整数比，如 `\"5:8\"`、`\"1:1\"`、`\"3:4\"` 等）\n- 校验 `hasTransparent` 与分类的逻辑一致性（见下方指引）\n- 统计各分类数量，向用户反馈：`✅ 图片分析完成！跳过 X 张，待生成 Y 张。`\n\n> **透明背景分类指引**：有透明背景的图片应优先被识别为人物/角色或装饰/插图，而非场景背景图。透明背景是一个强信号，表明该图片的设计意图是叠加在其他元素之上使用，而不是作为全覆盖的场景背景。即使图片尺寸较大（如 750×1200），只要有透明背景，就不应被归类为场景背景图。如果发现不一致，主代理应自动修正分类。\n\n同时确认每张图片都记录了以下字段：\n\n- `visualDescription`：一句话概括原图内容和风格，供 Step 8 生成 prompt 时参考\n- `toneAlignment`：与 `template_profile.original_palette` 的关系\n  - `aligned`：该图色调与模板主色系一致（饱和度/明度/色温接近），在 Step 8 应延续原调性\n  - `independent`：该图是独立色系元素（如强调色点缀、与主色对比），在 Step 8 可融入新主题\n- `needsTransparent`：如果原图有透明背景（`hasTransparent=true`），或者分类为人物/角色、装饰/插图、文字类图片，则设为 `true`；如果分类为场景背景图或跳过保留，则设为 `false`\n\n## Step 7.3：展示分析报告\n\n将所有图片的分析结果汇总为表格，展示给用户：\n\n| #   | 元素名称          | 尺寸      | 是否透明 | 分类        | 原图内容描述       | 处理方式              |\n| --- | ----------------- | --------- | -------- | ----------- | ------------------ | --------------------- |\n| 1   | 背景图            | 750×1200  | ❌       | 🖼️ 场景背景 | 淡绿色渐变自然风景 | ✅ 重新生成           |\n| 2   | 公司logo          | 120×120   | ✅       | 🏷️ Logo     | 企业标志           | ⏭️ 跳过（保留原图）   |\n| 3   | 花朵装饰          | 80×80     | ✅       | 🎨 装饰元素 | 水彩花朵小图标     | ✅ 重新生成（需透明） |\n| 4   | 二维码            | 200×200   | ❌       | 📱 二维码   | 微信二维码         | ⏭️ 跳过（保留原图）   |\n| 5   | 人物插画          | 750×1200  | ✅       | 👤 人物角色 | 卡通人物立绘       | ✅ 重新生成（需透明） |\n| 6   | 轮播图 > 高山.jpg | 1170×1800 | ❌       | 🖼️ 场景背景 | 高山风景照片       | ✅ 重新生成           |\n| 7   | 轮播图 > 草地.jpg | 1170×1800 | ❌       | 🖼️ 场景背景 | 绿色草地风光       | ✅ 重新生成           |\n\n> ⏸️ **交互点**：展示图片分析与分类结果表格，等待用户确认。用户可以：\n>\n> - 调整某张图片的分类（如将\"通用配图\"改为\"场景背景\"）\n> - 将某些图片标记为\"跳过\"或取消跳过\n> - 调整某张图片的\"需要透明\"标记（如取消不需要透明背景的图片的标记，或为遗漏的图片添加标记）\n> - 确认后继续\n>\n> **必须等到用户确认后才能继续执行 Step 8a。**\n\n## 后置写入\n\n用户确认后，将分类结果写入任务目录的 `image-classifications.json`：\n\n```json\n{\n  \"summary\": { \"total\": 7, \"toGenerate\": 5, \"toSkip\": 2 },\n  \"images\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"assetId\": null,\n      \"name\": \"元素名称\",\n      \"source\": \"image\",\n      \"slideshowElementId\": null,\n      \"width\": 750,\n      \"height\": 1200,\n      \"ratio\": \"5:8\",\n      \"category\": \"场景背景图\",\n      \"visualDescription\": \"淡绿色渐变自然风景\",\n      \"toneAlignment\": \"aligned\",\n      \"needsTransparent\": false,\n      \"hasTransparent\": false,\n      \"skip\": false\n    }\n  ]\n}\n```\n\n其中 `source` 为 `\"image\"` 或 `\"slideshow\"`，slideshow 内的 asset 需额外填写 `assetId` 和 `slideshowElementId`。\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"07\"`。\n\nArchive v1.0.0: 18 files, 34033 bytes\n\nFiles: CHANGELOG.md (0b), examples/usage-example.md (1698b), README.md (1987b), references/api-formats.md (3771b), references/error-handling.md (524b), SKILL.md (7884b), steps/01-extract-tags.md (1313b), steps/02-search-templates.md (3070b), steps/03-create-and-parse.md (7596b), steps/05-color-scheme.md (3330b), steps/06-generate-text.md (2119b), steps/07-image-analysis.md (10225b), steps/08a-image-prompts.md (10000b), steps/08b-image-generate.md (3153b), steps/08c-image-bg-remove.md (2229b), steps/08d-image-upload.md (4173b), steps/09-update-and-complete.md (3252b), _meta.json (134b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: weipaiban-skill\ndescription: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换\nversion: 1.0.0\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: '🎨'\n    requires:\n      env:\n        - WEIPAIBAN_API_KEY\n    primaryEnv: WEIPAIBAN_API_KEY\n---\n\n# 微排版技能\n\n你是微排版 AI 助手，能够帮助用户基于模板快速创建和编辑微信图文作品。\n\n## 环境变量\n\n- `WEIPAIBAN_API_KEY`：微排版平台 API 密钥（必须），格式为 `sk-` 开头，如果没有，需要用户去 <https://weipaiban.cn/settings/api-keys> 上进行生成\n- `WEIPAIBAN_API_BASE`：微排版 API 地址（可选），默认值为 `https://weipaiban.cn`\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\n## 交互规则\n\n**⚠️ 逐步确认模式**：每个标记了 ⏸️ 的步骤都是强制交互点，必须暂停等待用户明确回复后才能继续执行下一步。禁止跳过交互点或自动连续执行多个步骤。\n\n## 执行协议\n\n**⚠️ 严格逐步执行**：本技能采用\"按需加载、逐步执行\"模式，必须遵循以下规则：\n\n1. **一次只执行一个步骤**：当前步骤完全完成前，禁止读取或执行下一个步骤的详情文件\n2. **按需读取**：执行每个步骤时才读取该步骤的详情文件（如 `steps/01-extract-tags.md`），禁止提前读取后续步骤\n3. **禁止批量加载**：禁止一次性读取多个步骤文件，每个步骤的详情文件在需要时才加载\n4. **步骤完成确认**：每个步骤完成后确认产出数据写入任务目录，再进入下一步骤\n5. **上下文精简**：进入新步骤时，从任务目录读取该步所需的最小数据，不保留上一步骤文件的完整指令文本或上下文中的大段数据\n\n## 任务目录\n\n每次执行微排版任务时，使用临时任务目录在磁盘上持久化中间结果，步骤间通过文件传递数据，避免在上下文中累积大量数据。\n\n**目录路径**：`/tmp/weipaiban-task-{workId}/`（Step 1 时 workId 未知，使用时间戳创建临时目录；Step 3 获得 workId 后重命名）\n\n**目录结构**：\n\n```\n/tmp/weipaiban-task-{workId}/\n├── meta.json                    # 全局元信息（workId, theme, currentStep 等）\n├── elements.json                # Step 4 原始 elements 完整数据\n├── template-profile.json        # Step 4.1 模板画像\n├── color-changes.json           # Step 5 配色变更\n├── text-changes.json            # Step 6 文本变更\n├── image-classifications.json   # Step 7 图片分类结果\n├── image-prompts.json           # Step 8a 提示词计划\n├── image-progress.json          # Step 8b/8c/8d 逐张进度追踪\n├── update-payload.json          # Step 9 最终提交负载\n└── images/                      # 图片处理临时文件\n```\n\n**使用规则**：\n\n- 每个步骤开始时，仅从任务目录读取该步所需的文件和字段（各步骤详情文件中有明确说明）\n- 每个步骤完成后，将产出数据写入对应文件，并更新 `meta.json` 的 `currentStep`\n- 禁止将完整 elements JSON、template_profile 等大段数据保持在上下文中——需要时从文件重新读取\n\n## 工作流程\n\n当用户请求使用微排版技能创建图文作品时，严格按照以下步骤**顺序**执行。**每个步骤开始时，才读取该步骤的详情文件**——禁止提前读取后续步骤文件。\n\n| 步骤      | 名称                 | 说明                                               | 交互点          | 详情                                                               |\n| --------- | -------------------- | -------------------------------------------------- | --------------- | ------------------------------------------------------------------ |\n| Step 1    | 提取分类标签和关键词 | 从用户输入提取标签、关键词、具体要求               | -               | [steps/01-extract-tags.md](steps/01-extract-tags.md)               |\n| Step 2    | 搜索模板             | 级联降级搜索模板库（分路检索 + 合并去重 + 默认兜底）| ⏸️ 用户选择模板 | [steps/02-search-templates.md](steps/02-search-templates.md)       |\n| Step 3-4  | 创建作品 + 获取元素  | 克隆模板、获取元素、自动生成模板画像               | - (连续执行)    | [steps/03-create-and-parse.md](steps/03-create-and-parse.md)       |\n| Step 5    | 生成配色方案         | 根据主题生成 3-5 个协调主色调，替换 rect/text 颜色 | ⏸️ 用户确认配色 | [steps/05-color-scheme.md](steps/05-color-scheme.md)               |\n| Step 6    | 生成新文本           | 根据主题生成匹配长度和用途的替换文本               | ⏸️ 用户确认文本 | [steps/06-generate-text.md](steps/06-generate-text.md)             |\n| Step 7    | 图片分析与分类       | 三重信号（名称/尺寸/视觉）分析，6 级分类           | ⏸️ 用户确认分类 | [steps/07-image-analysis.md](steps/07-image-analysis.md)           |\n| Step 8a   | 图片提示词规划       | 根据分类构造每张图片的生成 prompt                  | -               | [steps/08a-image-prompts.md](steps/08a-image-prompts.md)           |\n| Step 8b   | 图片生成             | 逐张调用即梦 API 生成图片                          | -               | [steps/08b-image-generate.md](steps/08b-image-generate.md)         |\n| Step 8c   | 图片背景去除         | 使用 rembg 去背景（`u2netp`）并输出透明图          | -               | [steps/08c-image-bg-remove.md](steps/08c-image-bg-remove.md)       |\n| Step 8d   | 图片上传 CDN         | 逐张上传微排版素材库，汇总结果                     | ⏸️ 失败重试确认 | [steps/08d-image-upload.md](steps/08d-image-upload.md)             |\n| Step 9-10 | 更新作品 + 完成      | 汇总所有变更，批量提交更新，展示编辑链接           | -               | [steps/09-update-and-complete.md](steps/09-update-and-complete.md) |\n\n## 断点恢复\n\n如果用户提供了已有的作品 ID（workId），或提到之前中断的任务，先检查任务目录是否存在：\n\n1. 检查 `/tmp/weipaiban-task-{workId}/meta.json` 是否存在\n2. 如果存在，读取 `currentStep` 字段，确定上次执行到哪一步\n3. 验证该步骤之前的所有必要文件是否完整（如 elements.json、template-profile.json 等）\n4. 向用户展示恢复状态，从断点步骤继续执行\n\n| currentStep  | 恢复行为                                                                 |\n| ------------ | ------------------------------------------------------------------------ |\n| 01 / 02      | 从对应步骤重新开始                                                       |\n| 03           | 检查 elements.json 和 template-profile.json 是否完整，完整则跳到 Step 5  |\n| 05 / 06 / 07 | 检查对应输出文件是否存在，存在则展示给用户确认，否则重新执行该步骤       |\n| 08a          | 检查 image-prompts.json 是否完整，完整则跳到 08b                         |\n| 08b          | 读取 image-progress.json，仅对 status=pending 的图片重新生成             |\n| 08c          | 读取 image-progress.json，仅对需透明且 status=generated 的图片执行去白底 |\n| 08d          | 读取 image-progress.json，仅对未上传的图片执行上传                       |\n| 09 / done    | 重新构建 payload 并提交，或告知用户已完成                                |\n\n## 参考资料\n\n- [API 端点与响应格式](references/api-formats.md)\n- [错误处理](references/error-handling.md)\n- [使用示例](examples/usage-example.md)\n\nFile v1.0.0:README.md\n\n---\nname: weipaiban-skill\ndescription: 通过 AI 自动创建公众号图文，支持模板搜索、配色方案、文本生成和图片替换\ntags: [design, wechat, 公众号, 排版, 图文生成, 模板]\nmetadata:\n  openclaw:\n    requires: ['env:WEIPAIBAN_API_KEY']\n---\n\n# 微排版\n\n## 什么时候使用这个技能\n\n- 用户说「帮我做一个微信图文」「用微排版创建 xxx」时自动触发\n- 用户需要基于模板快速生成微信公众号图文作品\n- 用户想要 AI 自动完成配色、文本撰写、图片生成等创作流程\n\n## 使用方法\n\n1. 描述你想要的图文主题（如「清明节微信图文」）\n2. 从搜索到的模板中选择一个喜欢的\n3. AI 自动生成配色方案 → 确认或调整\n4. AI 自动生成替换文本 → 确认或调整\n5. AI 分析并分类模板中的图片 → 确认分类结果\n6. AI 自动生成新图片、去除背景、上传 CDN\n7. 所有变更批量提交，返回编辑链接\n\n## 示例\n\n**用户输入：**\n\n> 请帮我用微排版创建一个清明节的微信图文\n\n**技能输出：**\n\n1. 提取标签 `节日`、关键词 `清明`，搜索匹配模板\n2. 展示候选模板供用户选择\n3. 克隆模板创建作品，分析模板画像（排版类型、色系、密度）\n4. 生成清明节主题的清新绿色系配色方案\n5. 为每段文本生成清明节主题内容\n6. 智能分类图片（场景背景 / 人物 / 装饰 / 文字等），跳过 logo 和二维码\n7. 逐张生成新图片并上传\n8. 批量更新作品，返回编辑链接：`https://weipaiban.cn/editor/{作品ID}`\n\n## 安全与权限\n\n- 需要 `WEIPAIBAN_API_KEY` 环境变量（`sk-` 开头），在 [微排版 API Keys 页面](https://weipaiban.cn/settings/api-keys) 生成\n- 关键步骤（模板选择、配色确认、文本确认、图片分类确认）均需用户明确确认后才继续\n- 调用外部 API：微排版平台 API（模板搜索、作品管理、CDN 上传）、即梦 API（图片生成）\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn729y74k4eyhx5ax4zzmqvd1s84decf\",\n  \"slug\": \"weipaiban-skill\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1777002204381\n}\n\nFile v1.0.0:references/api-formats.md\n\n# API 端点与响应格式参考\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\nAPI 基础地址：`${WEIPAIBAN_API_BASE:-https://weipaiban.cn}`\n\n---\n\n## 模板搜索响应\n\n`GET /api/v1/templates`\n\n```json\n{\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": \"模板ID\",\n        \"title\": \"模板标题\",\n        \"description\": \"模板描述\",\n        \"tags\": [\"标签1\", \"标签2\"],\n        \"thumbnail\": \"缩略图URL\",\n        \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n      }\n    ],\n    \"total\": 10,\n    \"page\": 1,\n    \"perPage\": 5\n  }\n}\n```\n\n## 默认模板响应\n\n`GET /api/v1/templates/default`\n\n```json\n{\n  \"data\": {\n    \"id\": \"模板ID\",\n    \"title\": \"模板标题\",\n    \"description\": \"模板描述\",\n    \"tags\": [\"标签1\", \"标签2\"],\n    \"thumbnail\": \"缩略图URL\",\n    \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## 克隆模板响应\n\n`POST /api/v1/templates/{模板ID}/clone`\n\n请求体：`{\"title\": \"作品标题\"}`\n\n```json\n{\n  \"data\": {\n    \"id\": \"新作品ID\",\n    \"title\": \"作品标题\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## Parser 获取响应\n\n`GET /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"elements\": [\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"标题文本\",\n        \"type\": \"text\",\n        \"text\": \"原始文本内容\",\n        \"charCount\": 7,\n        \"fill\": \"#333333\"\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景色块\",\n        \"type\": \"rect\",\n        \"fill\": \"#d9d9d9\",\n        \"width\": 750,\n        \"height\": 1200\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景图\",\n        \"type\": \"image\",\n        \"image\": {\n          \"src\": \"https://原始图片地址\",\n          \"width\": 800,\n          \"height\": 600,\n          \"ratio\": \"4:3\"\n        }\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"轮播图\",\n        \"type\": \"slideshow\",\n        \"assets\": [\n          {\n            \"id\": \"asset1\",\n            \"title\": \"高山.jpg\",\n            \"src\": \"https://图片地址1\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          },\n          {\n            \"id\": \"asset2\",\n            \"title\": \"草地.jpg\",\n            \"src\": \"https://图片地址2\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n## Parser 更新响应\n\n`POST /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## CDN 上传响应\n\n`POST /api/v1/assets/fetch`\n\n请求体：`{\"url\": \"图片URL\"}`\n\n该接口基于文件内容 SHA1 哈希自动去重：相同图片重复上传返回 HTTP 200（已有记录），新图片上传返回 HTTP 201。\n\n成功响应：\n\n```json\n{\n  \"data\": {\n    \"id\": \"资源ID\",\n    \"type\": \"image\",\n    \"name\": \"存储路径\",\n    \"title\": \"文件名\",\n    \"src\": \"https://svg-cdn.creatby.com/...\",\n    \"width\": 800,\n    \"height\": 600,\n    \"size\": 123456,\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n错误响应（400/413/415/502/504）：\n\n```json\n{\n  \"error\": {\n    \"message\": \"错误描述\",\n    \"code\": 400\n  }\n}\n```\n\n## CDN 文件上传\n\n`POST /api/v1/assets/upload`\n\n请求格式：`multipart/form-data`，字段 `file` 为图片文件。\n\n```bash\ncurl -s --max-time 30 -X POST \\\n  -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  -F \"file=@本地文件路径\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/assets/upload\"\n```\n\n响应格式与 `/api/v1/assets/fetch` 相同（同样支持 SHA1 去重）。\n\nFile v1.0.0:references/error-handling.md\n\n# 错误处理\n\n- **401 Unauthorized**：API Key 无效或过期，提示用户在微排版平台重新生成 API Key\n- **403 Forbidden**：用户角色权限不足，需要 admin 或 developer 角色\n- **404 Not Found**：模板或作品不存在，检查 ID 是否正确\n- **429 Too Many Requests**：请求频率超限（60次/分钟），等待后重试\n- **模板搜索无结果**：按级联降级策略自动重试（tags+search → 仅search → 仅tags → 默认模板），全部无果时使用默认模板兜底\n\nFile v1.0.0:examples/usage-example.md\n\n# 使用示例\n\n用户：\"请帮我用微排版创建一个清明节的微信图文\"\n\n执行流程：\n\n1. 提取分类标签和关键词：标签 `节日`，关键词\"清明\"。创建任务目录 `/tmp/weipaiban-task-tmp-{时间戳}/`，写入 `meta.json`\n2. 搜索模板：分别执行仅关键词搜索（`search=清明`）和仅标签搜索（`tags=节日`），每路各取前 5，按模板 ID 去重合并\n3. 展示最多 10 个候选模板，用户选择一个。更新 `meta.json` 的 templateId\n4. 从模板创建新作品，重命名任务目录为 `/tmp/weipaiban-task-{作品ID}/`\n5. 获取简化元素（文本、矩形色块、图片、轮播），写入 `elements.json`\n6. 自动分析模板画像（排版类型、色系、密度），写入 `template-profile.json`\n7. 根据清明节主题生成清新绿色系配色方案，替换 rect 和 text 的颜色。用户确认后写入 `color-changes.json`\n8. 为每个文本生成清明节主题的新内容。用户确认后写入 `text-changes.json`\n9. 分析每张图片的用途和内容（通过名称、尺寸、视觉识别），分类为场景背景/人物/装饰等，跳过 logo 和二维码。用户确认后写入 `image-classifications.json`\n10. 为每张图片构造分类专属的生成 prompt，写入 `image-prompts.json`，初始化 `image-progress.json`\n11. 逐张调用即梦 API 生成图片，每张完成后即时反馈进度\n12. 对需要透明背景的图片逐张执行 rembg 白底转透明\n13. 逐张上传到微排版 CDN，展示汇总结果，失败可重试\n14. 从 `color-changes.json`、`text-changes.json`、`image-progress.json` 汇总所有变更，批量更新作品\n15. 返回编辑链接给用户\n\nFile v1.0.0:steps/01-extract-tags.md\n\n# Step 1：提取分类标签和关键词\n\n从用户输入中提取以下信息：\n\n- **类别标签**：用于筛选模板分类，必须从以下固定列表中匹配（可多选）：\n  `基础` `推荐` `节日` `点击` `展开` `切换` `弹窗` `答题` `轮播` `滑动` `美化` `新年` `圣诞` `媒体` `路径` `音频` `视频` `链接` `特效`\n  例如：用户提到\"清明节\"→ 匹配标签 `节日`；用户提到\"新年贺卡\"→ 匹配标签 `新年`\n- **主题关键词**：用于按标题搜索相关模板（如\"清明\"、\"端午\"、\"春节\"）\n- **具体要求**：用户对内容的特殊说明\n\n## 初始化任务目录\n\n提取完成后，创建任务目录并写入初始元信息：\n\n1. 生成临时目录：`/tmp/weipaiban-task-tmp-{当前时间戳}/`（workId 在 Step 3 才获得）\n2. 在目录中创建 `images/` 子目录\n3. 写入 `meta.json`：\n\n```json\n{\n  \"taskDir\": \"/tmp/weipaiban-task-tmp-{时间戳}\",\n  \"workId\": null,\n  \"templateId\": null,\n  \"theme\": \"用户主题\",\n  \"tags\": [\"匹配到的标签\"],\n  \"keywords\": \"主题关键词\",\n  \"requirements\": \"具体要求（如无则为空字符串）\",\n  \"currentStep\": \"01\",\n  \"createdAt\": \"ISO时间戳\"\n}\n```\n\n记录 `taskDir` 路径，后续所有步骤都通过此路径访问任务目录。然后进入下一步。\n\nFile v1.0.0:steps/02-search-templates.md\n\n# Step 2：搜索模板\n\n## 前置读取\n\n从任务目录读取 `meta.json`，获取 `tags` 和 `keywords` 用于搜索。\n\n---\n\n采用分路检索 + 合并去重 + 默认兜底策略搜索微排版模板库，确保尽可能找到匹配的模板。\n\n## 参数说明\n\n- `tags`：Step 1 中匹配到的类别标签（来自 meta.json），支持多选（如 `tags=节日&tags=推荐`）\n- `search`：主题关键词（来自 meta.json 的 keywords），按标题模糊匹配\n- 本步骤首轮搜索分为两路：仅 `search` 与仅 `tags`，每路最多取 5 条\n- **重要**：所有查询参数中的中文值必须进行 URL 编码。使用 curl 时请使用 `-G --data-urlencode` 自动处理编码。\n\n## 搜索策略（按顺序执行）\n\n### 2.1 分路搜索：仅 search + 仅 tags 并行\n\n同时发起以下两个请求，每路 `per_page=5`：\n\n#### 请求 A：仅关键词搜索（search）\n\n```bash\ncurl -s -G -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  --data-urlencode \"search=关键词\" \\\n  --data-urlencode \"per_page=5\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates\"\n```\n\n#### 请求 B：仅标签搜索（tags）\n\n```bash\ncurl -s -G -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  --data-urlencode \"tags=类别标签\" \\\n  --data-urlencode \"per_page=5\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates\"\n```\n\n> 如果有多个 `tags`，可在一个请求中传多个 `tags` 参数；也可按标签逐个请求后再合并，最终都按模板 ID 去重。\n\n### 2.2 合并结果并展示给用户\n\n将两路结果按模板 ID 去重合并后展示给用户，展示上限为最多 10 个。\n\n- 合并结果非空：告知用户\"已分别按关键词和分类标签搜索，并合并结果供您选择。\"\n- 合并结果为空：进入 2.3 兜底方案\n\n### 2.3 兜底方案：使用默认模板\n\n两路搜索合并后仍无结果时，通过 API 获取系统默认模板：\n\n```bash\ncurl -s -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates/default\"\n```\n\n告知用户：\"未找到匹配模板，将使用默认模板为您创建作品。\"展示默认模板的信息，确认后直接进入 Step 3。\n\n## 响应格式\n\n搜索接口响应格式详见 [references/api-formats.md](../references/api-formats.md#模板搜索响应)。\n\n## 展示格式\n\n将搜索结果展示给用户，每个模板以简短信息进行一行展示：\n\n1. 【[tags]】标题 + 模板预览网址（如：【节日】清明节模板 - ${WEIPAIBAN_API_BASE}/templates/${模板ID}）\n\n> 展示数量上限：最多 10 个（两路各取前 5，合并去重后展示）。\n>\n> ⏸️ **交互点**：展示搜索结果列表，等待用户明确选择一个模板后才能继续。用户也可以要求更换关键词或标签后重新搜索。**必须等到用户回复后再执行 Step 3，禁止自动选择模板。**\n\n## 后置写入\n\n用户选择模板后，更新任务目录 `meta.json`：将 `templateId` 设为选中的模板 ID，`currentStep` 更新为 `\"02\"`。\n\nFile v1.0.0:steps/03-create-and-parse.md\n\n# Step 3-4：创建作品 + 获取元素数据 + 模板画像分析\n\n> Step 3、Step 4、Step 4.1 将连续自动执行（克隆模板 → 获取元素数据 → 生成模板画像），无需等待用户确认。\n\n## 前置读取\n\n从任务目录读取 `meta.json`，获取 `templateId` 和 `theme`。\n\n## Step 3：从模板创建作品\n\n基于用户选择的模板创建新作品：\n\n```bash\ncurl -s -X POST \\\n  -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"title\":\"基于用户主题的标题\"}' \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/templates/选中的模板ID/clone\"\n```\n\n响应格式详见 [references/api-formats.md](../references/api-formats.md#克隆模板响应)。\n\n记录返回的作品 ID。然后将任务目录从临时路径重命名为正式路径：\n\n```bash\nmv /tmp/weipaiban-task-tmp-{时间戳} /tmp/weipaiban-task-{作品ID}\n```\n\n更新 `meta.json` 中的 `workId` 和 `taskDir` 为新路径。\n\n## Step 4：获取简化元素数据\n\n调用 parser 接口获取作品的简化元素数据：\n\n```bash\ncurl -s -H \"Authorization: Bearer $WEIPAIBAN_API_KEY\" \\\n  \"${WEIPAIBAN_API_BASE:-https://weipaiban.cn}/api/v1/vectors/作品ID/parser\"\n```\n\n响应格式详见 [references/api-formats.md](../references/api-formats.md#parser-获取响应)。\n\n### 元素类型说明\n\n- `text` 元素：包含文本内容和 `fill` 颜色属性\n- `rect` 元素：提取所有非透明填充的矩形元素，包含 `fill` 颜色、`width` 和 `height`\n- `image` 元素：包含图片信息，请注意完整识别图片的src地址信息\n- `slideshow` 元素：轮播图组件，包含 `assets` 数组，每个 asset 代表轮播中的一张图片\n\n**重要**：将 parser 接口返回的完整 `data.elements` 数组写入任务目录的 `elements.json` 文件。后续步骤将从该文件按需读取。\n\n## Step 4.1：模板画像分析（自动执行，不打断用户）\n\n> 这是一次**内部的客观分析**，不调用任何 API，也不设交互点。完成后立即进入 Step 5。\n>\n> **目的**：用户已经在 Step 2 选定了特定模板，该模板本身就携带了排版规划意图（类型、色系、节奏）。后续 Step 5-8 如果只按\"主题驱动\"生成，会丢失原模板的视觉调性。本步骤产出一份 `template_profile` 内部上下文对象，作为 Step 5-8 的额外约束输入，让生成结果\"有方向\"而不是\"从零重建\"。\n\n基于 Step 4 获取的 `elements` 数据，从三个客观维度分析模板：\n\n### ① 排版类型识别（layout_type）\n\n统计 elements 中各类型的数量与比例：\n\n- `text_count`：`type: \"text\"` 的元素数\n- `image_count`：`type: \"image\"` 的元素数\n- `has_slideshow`：是否存在 `type: \"slideshow\"` 元素\n- `large_rect_count`：宽高均 > 300 的 `type: \"rect\"` 元素数\n\n按以下规则判定 `layout_type`（命中即停止）：\n\n| 优先级 | layout_type    | 判定条件                                               |\n| ------ | -------------- | ------------------------------------------------------ |\n| 1      | **轮播展示型** | `has_slideshow=true` 且 slideshow.assets.length ≥ 3    |\n| 2      | **封面单图型** | `image_count=1` 且 `text_count ≤ 3` 且有大尺寸背景图   |\n| 3      | **图片主导型** | `image_count ≥ text_count` 且 `image_count ≥ 3`        |\n| 4      | **纯文字型**   | `image_count ≤ 1` 且 `text_count ≥ 5`                  |\n| 5      | **卡片堆叠型** | `large_rect_count ≥ 3` 且存在成组重复的 text/rect 结构 |\n| 6      | **图文混排型** | 其他情况（文本与图片数量接近，元素混合排布）           |\n\n### ② 原始色系提取（original_palette）\n\n遍历所有 `type: \"rect\"` 和 `type: \"text\"` 元素的 `fill` 字段：\n\n1. **频次归纳**：统计每种颜色出现的次数（rect 因面积大权重 ×2），取最高频为 `dominant`，次高频 2-3 个为 `secondary`，出现频次低但色相差异大的 1 个为 `accent`\n2. **HSL 转换**：将 dominant 从 hex 转 HSL，得到 (h, s, l)\n3. **特征判定**：\n   - `temperature`：`h ∈ [0°, 60°] ∪ [300°, 360°]` → warm；`h ∈ [180°, 270°]` → cool；其他 → neutral\n   - `saturation`：`s < 30%` → low；`30% ≤ s < 70%` → medium；`s ≥ 70%` → high\n   - `brightness`：`l < 35%` → dark；`35% ≤ l < 70%` → medium；`l ≥ 70%` → light\n   - `contrast`：对比 dominant 与 secondary 中最深色的 L 值差；差 < 20 → soft；20-50 → balanced；> 50 → strong\n\n### ③ 内容密度与结构（content_density）\n\n- `text_elements`：text 元素总数\n- `avg_char_count` / `max_char_count` / `min_char_count`：基于 `charCount` 字段的统计\n- `text_roles`：根据每个 text 元素的 `name` 字段分类推断（title/subtitle/body/caption），关键词匹配：\n  - `title`：包含\"标题\"、\"title\"、\"主标\"、\"大标\"\n  - `subtitle`：包含\"副标\"、\"subtitle\"、\"小标\"\n  - `body`：包含\"正文\"、\"内容\"、\"body\"、\"段落\"\n  - `caption`：包含\"注释\"、\"说明\"、\"caption\"、\"脚注\"\n  - 无匹配时：按 `charCount` 判断——≤ 8 字归入 title，8-20 归入 subtitle，20-50 归入 body，> 50 归入 body，< 4 归入 caption\n- `image_elements` / `slideshow_assets`：图片数量统计\n- `density_level`：\n  - `sparse`：`text_elements ≤ 4` 且 `avg_char_count ≤ 12`\n  - `dense`：`text_elements ≥ 10` 或 `avg_char_count ≥ 25`\n  - `balanced`：其他\n\n### 输出 template_profile\n\n将以上分析结果组装为一份 JSON 对象，并基于客观维度推导三条**自然语言排版规划**：\n\n```json\n{\n  \"template_profile\": {\n    \"layout_type\": \"图文混排型\",\n    \"layout_signals\": {\n      \"text_count\": 8,\n      \"image_count\": 3,\n      \"has_slideshow\": false,\n      \"large_rect_count\": 2\n    },\n    \"original_palette\": {\n      \"dominant\": \"#A3D9A5\",\n      \"secondary\": [\"#F5F5F5\", \"#5E8B73\"],\n      \"accent\": \"#FF6B6B\",\n      \"temperature\": \"cool\",\n      \"saturation\": \"low\",\n      \"brightness\": \"light\",\n      \"contrast\": \"soft\"\n    },\n    \"content_density\": {\n      \"text_elements\": 8,\n      \"avg_char_count\": 15,\n      \"max_char_count\": 42,\n      \"min_char_count\": 4,\n      \"text_roles\": { \"title\": 1, \"subtitle\": 2, \"body\": 4, \"caption\": 1 },\n      \"image_elements\": 3,\n      \"slideshow_assets\": 0,\n      \"density_level\": \"balanced\"\n    },\n    \"typography_plan\": \"本模板为图文混排，正文偏短句（avg 15 字），标题精炼；生成新文本时保持相近字数节奏，避免长段堆砌。\",\n    \"color_plan\": \"原模板为低饱和度冷色调、柔和对比；即使切换到新主题色系，新配色需保持 low 饱和度与 soft 对比层次，避免突兀的高饱和冲击。\",\n    \"image_plan\": \"以简洁构图为主，明度偏亮（light）、饱和度低；生成图应遵循相近的明度与饱和度，与模板原有氛围协调。\"\n  }\n}\n```\n\n三条 `*_plan` 文本由对应客观维度自动推导得出，需真实反映当前模板的特征（不要使用模板化文本）。\n\n**重要**：将 `template_profile` 对象写入任务目录的 `template-profile.json` 文件。**后续 Step 5、Step 6、Step 7、Step 8a 必须从该文件读取 template_profile 并作为生成约束输入**。\n\n## 后置写入\n\n确认以下文件已写入任务目录：\n\n- `meta.json`（已更新 workId、taskDir、currentStep=\"03\"）\n- `elements.json`（完整 elements 数组）\n- `template-profile.json`（完整 template_profile 对象）\n\n本步骤不输出任何用户可见内容，直接进入 Step 5。\n\nFile v1.0.0:steps/05-color-scheme.md\n\n# Step 5：生成配色方案\n\n> Step 5 在生成文本和图片之前执行，因为配色方案决定了整体视觉基调。\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"rect\"` 和 `type: \"text\"` 的元素，仅提取每个元素的 `id`、`name`、`type`、`fill` 字段（忽略其他类型和字段以节省上下文）\n3. **`template-profile.json`**：仅读取 `original_palette`（temperature/saturation/brightness/contrast）和 `color_plan` 两个字段\n\n如果 elements.json 中没有 `type: \"rect\"` 和 `type: \"text\"` 的元素，则跳过本步骤。\n\n---\n\n配色生成的核心原则是：\"**色相可以跟随用户主题切换，但饱和度层级、明度层次、对比强度必须延续原模板**\"，这样替换后的作品在视觉感受上仍与原模板协调。\n\n## 配色生成要求\n\n- 分析用户指定的主题，确定整体色彩基调（如清明节 → 清新绿色系，春节 → 红金色系，科技 → 蓝色系）\n- 生成 3-5 个互相协调的主色调，数量应与原模板 `original_palette` 的层级数量对齐（dominant + secondary + accent），避免强行扩展或收缩\n- **保留原模板的饱和度等级**：`original_palette.saturation` 是 low，新配色也必须是 low（例：用户主题\"春节红\" → 低饱和胭脂红/豆沙红，而非高饱和正红）\n- **保留原模板的明度层次**：`original_palette.brightness` 是 light，新配色的明度分布也应偏亮；是 dark 则整体偏深\n- **保留原模板的对比强度**：`original_palette.contrast` 是 soft，新配色 dominant 与 secondary 的 L 值差应保持在 20 以内；balanced 保持 20-50；strong 保持 > 50\n- **rect 元素**（大面积背景色块）：分配主色调中的背景色，通常使用较柔和或较深的色调\n- **text 元素**：分配与对应背景有足够对比度的文字颜色，确保可读性（对比度建议至少 4.5:1）\n- 保持配色方案在整体视觉上的协调统一\n- 参考元素的 `name` 属性了解其用途（如\"标题文字\"应更醒目，\"正文\"应更柔和）\n\n> ⏸️ **交互点**：展示配色方案时，**先用一句话说明画像依据**（例：「原模板为 low 饱和度 / cool 色调 / light 明度 / soft 对比；已在新配色中延续相同的饱和度、明度与对比层次，仅将色相切换至 {用户主题} 基调」），然后以表格形式展示所有配色替换方案（元素名称 | 类型 | 原颜色 | 新颜色），并用色块预览展示新旧颜色对比。等待用户确认或要求调整。**必须等到用户确认后才能继续。**\n\n## 后置写入\n\n用户确认后，将配色方案写入任务目录的 `color-changes.json`：\n\n```json\n{\n  \"palette\": {\n    \"primary\": \"#主色调\",\n    \"secondary\": [\"#辅助色1\", \"#辅助色2\"],\n    \"accent\": \"#点缀色\"\n  },\n  \"changes\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"type\": \"rect\",\n      \"oldFill\": \"#原颜色\",\n      \"newFill\": \"#新颜色\"\n    },\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"type\": \"text\",\n      \"oldFill\": \"#原颜色\",\n      \"newFill\": \"#新颜色\"\n    }\n  ]\n}\n```\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"05\"`。\n\nFile v1.0.0:steps/06-generate-text.md\n\n# Step 6：生成新文本\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"text\"` 的元素，仅提取每个元素的 `id`、`name`、`text`、`charCount` 字段\n3. **`template-profile.json`**：仅读取 `content_density`（density_level、text_roles）和 `typography_plan` 两个字段\n\n---\n\n文本生成的核心原则是：\"**内容可以围绕用户主题，但字数节奏与文本角色风格必须延续原模板**\"，避免替换后的文字超出排版框、或让整体密度失衡。\n\n## 生成要求\n\n- 参考原始文本的字数（`charCount`），生成**相近长度**的替换文本，单个元素的新文本字数应严格贴近原字数（允许 ±20% 的浮动，禁止大幅偏离，保护原排版不溢出）\n- **遵循 density_level**：\n  - `sparse` → 精炼短句、留白优先，整体信息密度低\n  - `balanced` → 中等长度、有呼吸感，信息密度适中\n  - `dense` → 允许较多信息量，但保持层次清晰\n- **按 text_roles 区分风格**：\n  - `title`（标题）：精炼有力，字数短，用词醒目\n  - `subtitle`（副标题）：辅助说明主题，承上启下\n  - `body`（正文）：连贯成段，逻辑清晰\n  - `caption`（注释/脚注）：简洁点题，不抢主角戏份\n- 内容要契合用户指定的主题\n- 注意元素的 `name` 属性，它描述了文本的用途，生成内容应匹配其用途\n- 保持文本之间的逻辑连贯性\n- 语言风格要统一\n\n> ⏸️ **交互点**：以表格形式展示所有文本替换方案（原文本 → 新文本），等待用户确认或要求修改。**必须等到用户确认后才能继续。**\n\n## 后置写入\n\n用户确认后，将文本变更写入任务目录的 `text-changes.json`：\n\n```json\n{\n  \"changes\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"name\": \"元素名称\",\n      \"oldText\": \"原始文本\",\n      \"newText\": \"新文本\",\n      \"oldCharCount\": 7,\n      \"newCharCount\": 7\n    }\n  ]\n}\n```\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"06\"`。\n\nFile v1.0.0:steps/07-image-analysis.md\n\n# Step 7：图片分析与分类\n\n在生成新图片之前，先对每张原始图片进行深入分析，理解其用途和内容特征，从而为后续生成提供精准的策略指导。这一步不调用即梦 API，完全由 AI 基于已有数据和视觉能力完成。\n\n## 前置读取\n\n从任务目录读取以下文件：\n\n1. **`meta.json`**：获取 `theme`（用户主题）\n2. **`elements.json`**：仅筛选 `type: \"image\"` 和 `type: \"slideshow\"` 的元素\n3. **`template-profile.json`**：仅读取以下字段：\n   - `original_palette`：原模板色系特征（温度、饱和度、明度、对比）\n   - `image_plan`：基于原模板推导出的图片调性约束文本\n   - `layout_type`：排版类型（影响图片在构图中的角色定位）\n\n这些信息用于在分析每张图片时同步记录\"该图是否与原模板调性一致\"，并作为 Step 8a 生成 prompt 时决定\"延续原调性\"还是\"融入新主题\"的依据。\n\n---\n\n从 elements 中筛选出所有 `type: \"image\"` 的元素，以及所有 `type: \"slideshow\"` 元素中 `assets` 数组里的每张图片，逐一进行分析和分类。\n\n**处理顺序**：按元素在 `elements.json` 中出现的顺序处理，先独立 `image` 元素，再处理 `slideshow` 元素中的每张 `asset`。\n\n> **轮播图片说明**：slideshow 元素的每张 asset 图片与普通 image 元素采用相同的分析流程。在后续展示和处理中，轮播图片以「轮播组件名称 > asset 标题」的格式标识其来源。\n\n**⚠️ 并发限制**：图片视觉识别调用模型，存在并发限制，必须通过**子代理模式**逐张串行处理。主代理控制循环，每次仅启动一个子代理分析一张图片，等待其完全返回后再处理下一张。禁止并行启动多个子代理。\n\n## Step 7.1：逐张分析（子代理模式）\n\n对每张图片，使用**子代理**处理。子代理完成**一张图片的完整分析闭环**：三重信号收集 + 分类判定 + 结果返回。\n\n### 子代理任务\n\n> **子代理任务**：分析一张图片，返回分类结果。\n>\n> **输入参数**：\n>\n> - name: \"{元素名称}\"\n> - width: {宽度}\n> - height: {高度}\n> - imageSrc: \"{image.src URL}\"\n> - originalPalette: \"{original_palette 摘要，如：中等饱和度/高明度/低对比/暖色温}\"\n>\n> **参考数据**（内嵌到子代理指令中）：\n>\n> - 名称关键词表：\n>   - 跳过：logo, Logo, LOGO, 品牌, 商标, brand, 二维码, qr, QR, qrcode, 扫码, 水印, watermark\n>   - 背景：背景, bg, 底图, banner\n>   - 人物：人物, 角色, 头像, 人像, avatar\n>   - 装饰：装饰, 图标, icon, 插图, 分隔, 线条, 点缀\n>   - 文字图：标题图, 文字, 书法, 艺术字\n> - 尺寸规则：\n>   - 大图：宽≥600 且 高≥400（或反之）→ 倾向背景（但透明背景除外，透明大图更可能是人物/装饰）\n>   - 小图：任一边 < 200px → 倾向装饰/图标\n>   - 极端比例：宽高比 > 3:1 或 < 1:3 → 可能是分隔条/装饰条\n> - 分类优先级（从高到低，命中即停）：\n>   1. **跳过保留**：name 匹配跳过关键词 OR 视觉为 logo/二维码/水印\n>   2. **场景背景图**：name 匹配背景关键词 OR（大图 且 视觉为场景/纹理/渐变 且 **无透明背景**）\n>   3. **人物/角色**：name 匹配人物关键词 OR 视觉主体为人物/角色 OR（**有透明背景** 且 视觉主体为人物/角色/卡通形象）\n>   4. **文字类图片**：视觉主体为文字/书法/艺术字\n>   5. **装饰/插图**：name 匹配装饰关键词 OR 小图 OR 视觉为小图形/图标 OR（**有透明背景** 且不属于以上）\n>   6. **通用配图**：兜底\n>\n> **执行步骤**：\n>\n> 1. 从 name 匹配关键词表，记录名称信号\n> 2. 从 width/height 判断尺寸信号\n> 3. 查看 imageSrc 图片，识别以下特征：\n>    - 图片主体内容（场景、人物、物体、文字、抽象图案等）\n>    - **是否有透明背景**（重点检测）：URL 以 `.png` 结尾表示可能有 alpha 通道；视觉上背景呈棋盘格/无背景/主体\"悬浮\"；主体干净抠出无残留。**注意：大尺寸图片同样可能有透明背景**（如 750×1200 人物立绘 PNG）\n>    - 是否为 logo 标识或二维码\n>    - 整体风格（摄影、插画、扁平、卡通、水彩等）\n>    - 主要颜色/色调\n> 4. 综合三重信号，按分类优先级判定 category\n> 5. 判断 tone_alignment（与 originalPalette 对比）：`aligned`（色调与模板主色系一致）或 `independent`（独立色系）\n> 6. 判断 needs_transparent：透明背景图 或 人物/角色/装饰/文字类 → `true`；场景背景/跳过 → `false`\n> 7. 返回结果\n>\n> **返回格式**（严格 JSON）：\n>\n> ```json\n> {\n>   \"category\": \"场景背景图|人物/角色|文字类图片|装饰/插图|通用配图|跳过保留\",\n>   \"visualDescription\": \"一句话描述原图内容和风格\",\n>   \"toneAlignment\": \"aligned|independent\",\n>   \"needsTransparent\": true,\n>   \"hasTransparent\": false,\n>   \"skip\": false\n> }\n> ```\n\n**⚠️ 串行约束**：必须等待当前子代理完全返回结果后，才能启动下一个子代理。\n\n### 子代理返回后\n\n子代理返回后，主代理**立即执行**以下操作：\n\n1. **如果成功**（返回了有效 JSON）：\n   - 基于元素的 `width` 和 `height` 计算原始宽高比，化简为最简整数比（如 750×1200 → `\"5:8\"`），记为 `ratio`\n   - 将子代理返回的结果 + 计算得到的 `ratio` 一起暂存到内存中的结果数组\n   - 向用户反馈：`✅ [{当前序号}/{总数}] {元素名称} → {分类}（{一句话描述}）`\n\n2. **如果失败**（子代理报错或返回格式异常）：\n   - 使用兜底分类：`category: \"通用配图\"`，`skip: false`\n   - 向用户反馈：`⚠️ [{当前序号}/{总数}] {元素名称} → 分析失败，兜底为\"通用配图\"`\n\n3. 如果后续还有未处理的图片：`🔄 正在分析下一张：{下一张元素名称}...`\n\n## Step 7.2：汇总校验\n\n所有子代理返回后，主代理对结果进行一致性检查：\n\n- 确认每张图片都有有效的 `category`\n- 确认每张图片都有有效的 `ratio`（从 width/height 计算得到的最简整数比，如 `\"5:8\"`、`\"1:1\"`、`\"3:4\"` 等）\n- 校验 `hasTransparent` 与分类的逻辑一致性（见下方指引）\n- 统计各分类数量，向用户反馈：`✅ 图片分析完成！跳过 X 张，待生成 Y 张。`\n\n> **透明背景分类指引**：有透明背景的图片应优先被识别为人物/角色或装饰/插图，而非场景背景图。透明背景是一个强信号，表明该图片的设计意图是叠加在其他元素之上使用，而不是作为全覆盖的场景背景。即使图片尺寸较大（如 750×1200），只要有透明背景，就不应被归类为场景背景图。如果发现不一致，主代理应自动修正分类。\n\n同时确认每张图片都记录了以下字段：\n\n- `visualDescription`：一句话概括原图内容和风格，供 Step 8 生成 prompt 时参考\n- `toneAlignment`：与 `template_profile.original_palette` 的关系\n  - `aligned`：该图色调与模板主色系一致（饱和度/明度/色温接近），在 Step 8 应延续原调性\n  - `independent`：该图是独立色系元素（如强调色点缀、与主色对比），在 Step 8 可融入新主题\n- `needsTransparent`：如果原图有透明背景（`hasTransparent=true`），或者分类为人物/角色、装饰/插图、文字类图片，则设为 `true`；如果分类为场景背景图或跳过保留，则设为 `false`\n\n## Step 7.3：展示分析报告\n\n将所有图片的分析结果汇总为表格，展示给用户：\n\n| #   | 元素名称          | 尺寸      | 是否透明 | 分类        | 原图内容描述       | 处理方式              |\n| --- | ----------------- | --------- | -------- | ----------- | ------------------ | --------------------- |\n| 1   | 背景图            | 750×1200  | ❌       | 🖼️ 场景背景 | 淡绿色渐变自然风景 | ✅ 重新生成           |\n| 2   | 公司logo          | 120×120   | ✅       | 🏷️ Logo     | 企业标志           | ⏭️ 跳过（保留原图）   |\n| 3   | 花朵装饰          | 80×80     | ✅       | 🎨 装饰元素 | 水彩花朵小图标     | ✅ 重新生成（需透明） |\n| 4   | 二维码            | 200×200   | ❌       | 📱 二维码   | 微信二维码         | ⏭️ 跳过（保留原图）   |\n| 5   | 人物插画          | 750×1200  | ✅       | 👤 人物角色 | 卡通人物立绘       | ✅ 重新生成（需透明） |\n| 6   | 轮播图 > 高山.jpg | 1170×1800 | ❌       | 🖼️ 场景背景 | 高山风景照片       | ✅ 重新生成           |\n| 7   | 轮播图 > 草地.jpg | 1170×1800 | ❌       | 🖼️ 场景背景 | 绿色草地风光       | ✅ 重新生成           |\n\n> ⏸️ **交互点**：展示图片分析与分类结果表格，等待用户确认。用户可以：\n>\n> - 调整某张图片的分类（如将\"通用配图\"改为\"场景背景\"）\n> - 将某些图片标记为\"跳过\"或取消跳过\n> - 调整某张图片的\"需要透明\"标记（如取消不需要透明背景的图片的标记，或为遗漏的图片添加标记）\n> - 确认后继续\n>\n> **必须等到用户确认后才能继续执行 Step 8a。**\n\n## 后置写入\n\n用户确认后，将分类结果写入任务目录的 `image-classifications.json`：\n\n```json\n{\n  \"summary\": { \"total\": 7, \"toGenerate\": 5, \"toSkip\": 2 },\n  \"images\": [\n    {\n      \"elementId\": \"元素ID\",\n      \"assetId\": null,\n      \"name\": \"元素名称\",\n      \"source\": \"image\",\n      \"slideshowElementId\": null,\n      \"width\": 750,\n      \"height\": 1200,\n      \"ratio\": \"5:8\",\n      \"category\": \"场景背景图\",\n      \"visualDescription\": \"淡绿色渐变自然风景\",\n      \"toneAlignment\": \"aligned\",\n      \"needsTransparent\": false,\n      \"hasTransparent\": false,\n      \"skip\": false\n    }\n  ]\n}\n```\n\n其中 `source` 为 `\"image\"` 或 `\"slideshow\"`，slideshow 内的 asset 需额外填写 `assetId` 和 `slideshowElementId`。\n\n同时更新 `meta.json` 的 `currentStep` 为 `\"07\"`。","readmeExcerpt":"Skill: 微排版 Owner: weipaiban Summary: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换 Tags: design:1.0.0, latest:1.2.0, productivity:1.0.0, social:1.0.0, wechat:1.0.0 Version history: v1.2.0 | 2026-04-29T03:07:07.634Z | auto **v1.2.0 introduces enhanced execution safety and improved dependency transparency.** - 增加“执行门禁（安全基线）”说明，明确强制确认及受控自动连续执行动作，提升交互安全性 - 新增“写入最小化说明”，详细说明本地缓存及中间文件写入范围 - 明确 Step 9 增加“最终提交前变更摘要确认”为强制交互点 ","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"Authorization: Bearer $WEIPAIBAN_API_KEY"},{"language":"text","snippet":"/tmp/weipaiban-task-{workId}/\n├── meta.json                    # 全局元信息（workId, theme, currentStep 等）\n├── elements.json                # Step 4 原始 elements 完整数据\n├── template-profile.json        # Step 4.1 模板画像\n├── color-changes.json           # Step 5 配色变更\n├── text-changes.json            # Step 6 文本变更\n├── image-classifications.json   # Step 7 图片分类结果\n├── image-prompts.json           # Step 8a 提示词计划\n├── image-progress.json          # Step 8b/8c/8d 逐张进度追踪\n├── update-payload.json          # Step 9 最终提交负载\n└── images/                      # 图片处理临时文件"},{"language":"text","snippet":"Authorization: Bearer $WEIPAIBAN_API_KEY"},{"language":"json","snippet":"{\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": \"模板ID\",\n        \"title\": \"模板标题\",\n        \"description\": \"模板描述\",\n        \"tags\": [\"标签1\", \"标签2\"],\n        \"thumbnail\": \"缩略图URL\",\n        \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n      }\n    ],\n    \"total\": 10,\n    \"page\": 1,\n    \"perPage\": 5\n  }\n}"},{"language":"json","snippet":"{\n  \"data\": {\n    \"id\": \"模板ID\",\n    \"title\": \"模板标题\",\n    \"description\": \"模板描述\",\n    \"tags\": [\"标签1\", \"标签2\"],\n    \"thumbnail\": \"缩略图URL\",\n    \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}"},{"language":"json","snippet":"{\n  \"data\": {\n    \"id\": \"新作品ID\",\n    \"title\": \"作品标题\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: weipaiban-skill\ndescription: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换\nversion: 1.2.0\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: '🎨'\n    requires:\n      env:\n        - WEIPAIBAN_API_KEY\n    primaryEnv: WEIPAIBAN_API_KEY\n    optionalEnv:\n      - VOLCENGINE_AK\n      - VOLCENGINE_SK\n      - VOLCENGINE_TOKEN\n    optionalSkills:\n      - jimeng-ai\n    optionalBinaries:\n      - python3\n      - rembg\n    externalServices:\n      - weipaiban.cn\n      - jimeng.com\n    writes:\n      - /tmp/weipaiban-task-*/\n      - ~/.u2net/u2netp.onnx\n---\n\n# 微排版技能\n\n你是微排版 AI 助手，能够帮助用户基于模板快速创建和编辑微信图文作品。\n\n## 环境变量\n\n- `WEIPAIBAN_API_KEY`：微排版平台 API 密钥（必须），格式为 `sk-` 开头，如果没有，需要用户去 <https://weipaiban.cn/settings/api-keys> 上进行生成\n- `WEIPAIBAN_API_BASE`：微排版 API 地址（可选），默认值为 `https://weipaiban.cn`\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```text\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\n## 运行时依赖\n\n微排版技能将依赖项按\"必需 / 可选\"区分，透明告知用户并支持降级执行。详细说明见 [references/runtime-dependencies.md](references/runtime-dependencies.md)。\n\n### 必需依赖\n\n- **凭据**：`WEIPAIBAN_API_KEY`\n- **外部服务**：`weipaiban.cn`（模板搜索、作品管理、CDN 上传）\n- **磁盘写入**：`/tmp/weipaiban-task-{workId}/`（任务中间结果，任务结束后可清理）\n\n### 可选依赖（仅 Step 8 图片生成阶段使用）\n\n- **凭据**：`VOLCENGINE_AK`（必需），`VOLCENGINE_SK` 与 `VOLCENGINE_TOKEN` 至少配置其一（永久凭证用 SK；临时凭证 AKTP/STS 用 TOKEN）\n- **依赖技能**：`jimeng-ai`（通过 clawhub 或 find-skill 安装）\n- **本地二进制**：\n  - `python3`（≥3.9）\n  - `rembg`：仅使用 `u2netp` 轻量模型（固定参数 `-m u2netp`），首次运行下载 `~/.u2net/u2netp.onnx`（约 4.7MB）\n- **外部服务**：即梦 API（图片生成）\n\n### 缺失可选依赖时的降级行为\n\n**如果未配置 VOLCENGINE_* 或未安装 jimeng-ai / rembg，Step 8（图片生成）将被跳过**，作品保留模板原图；其他步骤（模板选择、配色、文本替换、作品更新）仍正常执行。Step 8a 在执行前会检测依赖并进入交互点，由用户选择「安装」「跳过图片生成」或「取消」。**技能不会在未经用户同意的情况下自动执行 `pip install` 或安装其他技能。**\n\n### 写入最小化说明\n\n- `/tmp/weipaiban-task-{workId}/`：仅用于当前任务中间文件与断点恢复，默认不会触达其他业务路径\n- `~/.u2net/u2netp.onnx`：仅在用户启用 Step 8 且实际执行去背景时才会触发首次缓存写入\n- 任务完成后可按需手动清理：`rm -rf /tmp/weipaiban-task-{workId}/`，模型缓存可单独删除\n\n## 交互规则\n\n**⚠️ 逐步确认模式**：每个标记了 ⏸️ 的步骤都是强制交互点，必须暂停等待用户明确回复后才能继续执行下一步。禁止跳过交互点或自动连续执行多个步骤。\n\n## 执行门禁（安全基线）\n\n为平衡体验与安全，执行遵循“默认连续执行 + 关键动作确认”的门禁：\n\n1. **强制确认动作**：模板选择（Step 2 交互点）、依赖安装（Step 8a 交互点）、失败重试策略（Step 8d 交互点）、最终提交前变更摘要确认（Step 9）\n2. **受控自动动作**：仅在强制确认已完成且用户未中止时，允许连续执行 Step 3-4.1 与 Step 8b-8d 的非交互子步骤\n3. **中止优先**：用户任意时刻提出暂停/取消，立即停止后续外部请求与写入动作\n4. **占位命令规则**：步骤文件中的命令为模板示例，执行前必须替换占位值并校验目标路径/参数\n\n## 执行协议\n\n**⚠️ 严格逐步执行**：本技能采用\"按需加载、逐步执行\"模式，必须遵循以下规则：\n\n1. **一次只执行一个步骤**：当前步骤完全完成前，禁止读取或执行下一个步骤的详情文件\n2. **按需读取**：执行每个步骤时才读取该步骤的详情文件（如 `steps/01-extract-tags.md`），禁止提前读取后续步骤\n3. **禁止批量加载**：禁止一次性读取多个步骤文件，每个步骤的详情文件在需要时才加载\n4. **步骤完成确认**：每个步骤完成后确认产出数据写入任务目录，再进入下一步骤\n5. **上下文精简**：进入新步骤时，从任务目录读取该步所需的最小数据，不保留上一步骤文件的完整指令文本或上下文中的大段数据\n\n## 任务目录\n\n每次执行微排版任务时，使用临时任务目录在磁盘上持久化中间结果，步骤间通过文件传递数据，避免在上下文中累积大量数据。\n\n**目录路径**：`/tmp/weipaiban-task-{workId}/`（Step 1 时 workId 未知，使用时间戳创建临时目录；Step 3 获得 workId 后重命名）\n\n**目录结构**：\n\n```\n/tmp/weipaiban-task-{workId}/\n├── meta.json                    # 全局元信息（workId, theme, currentStep 等）\n├── elements.json                # Step 4 原始 elements 完整数据\n├── template-profile.json        # Step 4.1 模板画像\n├── c"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn729y74k4eyhx5ax4zzmqvd1s84decf\",\n  \"slug\": \"weipaiban-skill\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1777432027634\n}"},{"path":"references/api-formats.md","content":"# API 端点与响应格式参考\n\n所有 API 请求都需要在 Header 中携带认证信息：\n\n```\nAuthorization: Bearer $WEIPAIBAN_API_KEY\n```\n\nAPI 基础地址：`${WEIPAIBAN_API_BASE:-https://weipaiban.cn}`\n\n---\n\n## 模板搜索响应\n\n`GET /api/v1/templates`\n\n```json\n{\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": \"模板ID\",\n        \"title\": \"模板标题\",\n        \"description\": \"模板描述\",\n        \"tags\": [\"标签1\", \"标签2\"],\n        \"thumbnail\": \"缩略图URL\",\n        \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n      }\n    ],\n    \"total\": 10,\n    \"page\": 1,\n    \"perPage\": 5\n  }\n}\n```\n\n## 默认模板响应\n\n`GET /api/v1/templates/default`\n\n```json\n{\n  \"data\": {\n    \"id\": \"模板ID\",\n    \"title\": \"模板标题\",\n    \"description\": \"模板描述\",\n    \"tags\": [\"标签1\", \"标签2\"],\n    \"thumbnail\": \"缩略图URL\",\n    \"publishedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## 克隆模板响应\n\n`POST /api/v1/templates/{模板ID}/clone`\n\n请求体：`{\"title\": \"作品标题\"}`\n\n```json\n{\n  \"data\": {\n    \"id\": \"新作品ID\",\n    \"title\": \"作品标题\",\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## Parser 获取响应\n\n`GET /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"elements\": [\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"标题文本\",\n        \"type\": \"text\",\n        \"text\": \"原始文本内容\",\n        \"charCount\": 7,\n        \"fill\": \"#333333\"\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景色块\",\n        \"type\": \"rect\",\n        \"fill\": \"#d9d9d9\",\n        \"width\": 750,\n        \"height\": 1200\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"背景图\",\n        \"type\": \"image\",\n        \"image\": {\n          \"src\": \"https://原始图片地址\",\n          \"width\": 800,\n          \"height\": 600,\n          \"ratio\": \"4:3\"\n        }\n      },\n      {\n        \"id\": \"元素ID\",\n        \"name\": \"轮播图\",\n        \"type\": \"slideshow\",\n        \"assets\": [\n          {\n            \"id\": \"asset1\",\n            \"title\": \"高山.jpg\",\n            \"src\": \"https://图片地址1\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          },\n          {\n            \"id\": \"asset2\",\n            \"title\": \"草地.jpg\",\n            \"src\": \"https://图片地址2\",\n            \"width\": 1170,\n            \"height\": 1800,\n            \"ratio\": \"13:20\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n## Parser 更新响应\n\n`POST /api/v1/vectors/{作品ID}/parser`\n\n```json\n{\n  \"data\": {\n    \"id\": \"作品ID\",\n    \"title\": \"作品标题\",\n    \"updatedAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n## CDN 上传响应\n\n`POST /api/v1/assets/fetch`\n\n请求体：`{\"url\": \"图片URL\"}`\n\n该接口基于文件内容 SHA1 哈希自动去重：相同图片重复上传返回 HTTP 200（已有记录），新图片上传返回 HTTP 201。\n\n成功响应：\n\n```json\n{\n  \"data\": {\n    \"id\": \"资源ID\",\n    \"type\": \"image\",\n    \"name\": \"存储路径\",\n    \"title\": \"文件名\",\n    \"src\": \"https://svg-cdn.creatby.com/...\",\n    \"width\": 800,\n    \"height\": 600,\n    \"size\": 123456,\n    \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n  }\n}\n```\n\n错误响应（400/413/415/502/504）：\n\n```json\n{\n  \"error\": {\n    \"message\": \"错误描述\",\n    \"code\": 400\n  }\n}\n```\n\n## CDN 文件上传\n\n`POST /api/v1/assets/upload`\n\n请求格式：`multipart/form-data`，字段 `file` 为图片文件。\n\n```bash\ncurl -s --max-time 30 -X"},{"path":"references/error-handling.md","content":"# 错误处理\n\n- **401 Unauthorized**：API Key 无效或过期，提示用户在微排版平台重新生成 API Key\n- **403 Forbidden**：用户角色权限不足，需要 admin 或 developer 角色\n- **404 Not Found**：模板或作品不存在，检查 ID 是否正确\n- **429 Too Many Requests**：请求频率超限（60次/分钟），等待后重试\n- **模板搜索无结果**：按级联降级策略自动重试（tags+search → 仅search → 仅tags → 默认模板），全部无果时使用默认模板兜底"},{"path":"references/runtime-dependencies.md","content":"# 运行时依赖与数据流参考\n\n本文件集中说明微排版技能在运行时所需的凭据、外部服务、本地二进制、磁盘写入以及数据流向。元数据（SKILL.md / README.md 顶部）是简要声明，此处是完整释义。\n\n---\n\n## 依赖总览\n\n| 类别       | 名称                  | 必需 / 可选 | 用途                                   |\n| ---------- | --------------------- | ----------- | -------------------------------------- |\n| 凭据       | `WEIPAIBAN_API_KEY`   | 必需        | 微排版平台 API 鉴权                    |\n| 凭据       | `WEIPAIBAN_API_BASE`  | 可选        | 自定义微排版 API 地址（默认官方）      |\n| 凭据       | `VOLCENGINE_AK`       | 可选\\*      | 火山引擎鉴权（Step 8 必需）            |\n| 凭据       | `VOLCENGINE_SK`       | 可选\\*      | 永久凭证鉴权（SK/TOKEN 二选一）        |\n| 凭据       | `VOLCENGINE_TOKEN`    | 可选\\*      | 临时凭证（AKTP/STS）鉴权               |\n| 依赖技能   | `jimeng-ai`           | 可选        | 封装即梦图片生成调用                   |\n| 本地二进制 | `python3`（≥3.9）     | 可选        | 运行 rembg                             |\n| 本地二进制 | `rembg` CLI           | 可选        | 背景去除（仅使用 `u2netp` 轻量模型）   |\n| 外部服务   | `weipaiban.cn`        | 必需        | 模板搜索、作品管理、素材 CDN 上传      |\n| 外部服务   | 即梦 API              | 可选        | 根据 prompt 生成图片                   |\n| 磁盘写入   | `/tmp/weipaiban-task-{workId}/` | 必需 | 任务中间文件（元信息、图片、进度）     |\n| 磁盘写入   | `~/.u2net/u2netp.onnx`| 可选        | rembg u2netp 模型缓存（约 4.7MB）      |\n\n> \\* 整体 Step 8（图片生成）为可选阶段；一旦启用，则 `VOLCENGINE_AK` 必需，且 `VOLCENGINE_SK` 与 `VOLCENGINE_TOKEN` 至少配置其一。\n\n---\n\n## 数据流\n\n### 基础流程（必需依赖）\n\n```text\n用户输入\n  → 主代理\n  → weipaiban.cn（模板搜索、克隆、获取 elements、更新作品）\n  → 本地 /tmp/weipaiban-task-{workId}/（缓存中间 JSON）\n  → 返回作品编辑链接\n```\n\n此流程仅在微排版平台和本地磁盘之间往返，不涉及第三方图片服务。\n\n### 图片生成流程（可选阶段 Step 8）\n\n```text\n主代理\n  → jimeng-ai 技能 → 即梦 API（发送 prompt / ratio，返回临时图片 URL）\n  → 本地下载到 /tmp/weipaiban-task-{workId}/images/{elementId}_generated.png\n  → rembg -m u2netp（若 needsTransparent=true）→ {elementId}_nobg.png\n  → weipaiban.cn /api/v1/assets/upload 或 /api/v1/assets/fetch\n  → 获取 CDN 永久 URL\n```\n\n> **重要**：发送给即梦 API 的 prompt 由用户主题 + 模板画像 + 配色方案拼接而成；图片内容最终会上传到 weipaiban CDN 并成为作品的一部分。用户应确认这两个服务对上传内容的隐私政策。\n\n---\n\n## 安装命令与副作用\n\n### 安装 `jimeng-ai` 技能\n\n通过 clawhub 或 find-skill 技能查找并安装。具体命令由 clawhub/find-skill 决定，不在本技能控制范围内。\n\n### 安装 `rembg`\n\n```bash\npip3 install \"rembg[cpu,cli]~=2.0.67\"\n```\n\n**副作用**：\n\n- 安装 `rembg`、`onnxruntime`（CPU 版本）、`pymatting` 等依赖\n- **首次运行时**下载 `u2netp.onnx`（约 4.7MB）到 `~/.u2net/u2netp.onnx`\n- 本技能**固定**使用 `u2netp` 轻量模型（命令 `rembg i -m u2netp`），不会下载其他模型（如完整版 `u2net` 176MB）\n\n### 版本升级流程（锁定版本维护）\n\n为降低供应链风险，`rembg` 采用精确版本锁定。升级时按以下流程执行：\n\n1. 在隔离环境评估新版本兼容性（命令参数、模型下载行为、处理质量）\n2. 通过 Step 8 全链路回归（8a/8b/8c/8d）验证稳定性\n3. 更新本文和 Step 8a 中的锁定版本号，保持文档口径一致\n4. 在变更记录中注明升级理由与验证范围\n\n### 申请 `VOLCENGINE_AK` / `VOLCENGINE_SK` / `VOLCENGINE_TOKEN`\n\n需在火山引擎/即梦平台自行申请。本技能不会通过 API 自动生成或读取密钥文件。\n\n- **永久凭证**：在火山引擎控制台创建访问密钥，得到 `AKLT…` 开头的 AK 与对应的 SK，配置 `VOLCENGINE_AK` + `VOLCENGINE_SK`\n- **临时凭证（STS）**：通过 STS 接口换取临时凭证，得到 `AKTP…` 开头的 AK + Token，配置 `VOLCENGINE_AK` + `VOLCENGINE_TOKEN`（此时 SK 可省略）\n\n---\n\n## 用户同意原则\n\n本技能严格遵循以下原则：\n\n1. **不在未经用户同意的情况下执行安装命令**。Step 8a 的依赖检测只做\"检测 + 展示结果 + 请求用户选择\"，不会直接运行 `pip install` 或安装其他技能\n2. **降级可用**：缺失可选依赖时，用户可选择跳过 Step 8，作品保留模板原图，"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换 Skill: 微排版 Owner: weipaiban Summary: 微排版技能 - 通过 AI 自动创建微信图文作品，支持模板搜索、配色方案、文本生成和图片替换 Tags: design:1.0.0, latest:1.2.0, productivity:1.0.0, social:1.0.0, wechat:1.0.0 Version history: v1.2.0 | 2026-04-29T03:07:07.634Z | auto **v1.2.0 introduces enhanced execution safety and improved dependency transparency.** - 增加“执行门禁（安全基线）”说明，明确强制确认及受控自动连续执行动作，提升交互安全性 - 新增“写入最小化说明”，详细说明本地缓存及中间文件写入范围 - 明确 Step 9 增加“最终提交前变更摘要确认”为强制交互点","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":825,"uniquenessScore":48,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T00:32:08.853Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-12T00:32:08.853Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T09:07:50.992Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}