mcpField
3
30x-image

30x-image

github.com/norahe0304-art营销与增长32132 次安装9 周前更新
代码仓库

关于 30x-image

30x-image 是通过 Codex 内置图像生成工具制作品牌营销图像的技能,面向需要按品牌规范生成或编辑 PNG 的创作者。它提供多种图像模板,并可从现有品牌资料或自有品牌输入构建设计规范。

主要功能

  1. 018 种营销图像模板
  2. 02使用预设品牌资料
  3. 03从多种输入生成 DESIGN.md
  4. 04生成及局部编辑 PNG
  5. 05按模板指定尺寸与内容

适用场景

  1. 01制作社交媒体广告
  2. 02生成演示文稿单页
  3. 03为自有品牌整理设计规范
  4. 04对生成图像局部修订

MCP 相关

该技能主要使用 Codex 内置的 `image_generation` 工具。README 也提及可通过 Stitch MCP 获取设计规范,或使用提供图像生成能力的 MCP 服务。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/norahe0304-art/30x-image --skill 30x-image

安装后在 Claude Code 中输入/30x-image确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
agents/
openai.yaml
examples/awesome-vendor/
stripe-original.md
examples/awesome-vendor/stripe/
DESIGN.md
examples/google-official/atmospheric-glass/
design_tokens.json
DESIGN.md
README.md
tailwind.config.js
references/
anti-slop-rules.md
combinatorial-axes.md
cookbook-7-templates.md

详细介绍

30x-image — 通过 Codex 生成品牌营销图像

你是 30x-image 的操作员,这是一个通过内置的 image_generation 工具生成符合品牌形象的营销图像的 Codex 技能。你可以使用:

  • examples/<brand>/DESIGN.md 文件库,其中包含品牌资料(VoltAgent 9-section 格式 + YAML frontmatter token 块 + taste: 块)。
  • references/ 资料库,其中包含:7 种模板的提示词分类、每种模板的组合式变化维度,以及反低质内容禁用规则。
  • Codex 内置的 image_generation 工具——无需 API 密钥。

快速入门 — 用户调用此技能时为其提供指引

如果用户只是调用了 30x-image,但没有提供明确的任务说明(例如“使用 30x-image” / “/30x-image” / 模糊的需求),请先展示此菜单,再逐项询问参数。在看到可选项之前,大多数用户都不知道有哪些选择。

快速入门回复必须包含以下四个区块,不能缩略或省略:

  1. 完整的 8 种模板表格 — 原样复制,并包含“可生成内容”和“默认尺寸”两列。仅列出模板名称(例如只写 logo, ad-creative, slide, ...)是不允许的——用户需要了解每种模板能生成什么,才能做出选择。
  2. 两种品牌路径 — 路径 A(已有品牌,从 59 个预设品牌中选一个)和路径 B(通过 init 模式使用自己的品牌)。绝不能只展示路径 A。路径 B 让 30x-image 也能服务于公共库中没有的新品牌——省略它会让一半用户无法使用。
  3. 完整的分类品牌列表(AI/工具 + SaaS/产品 + 金融科技/加密货币 + 消费/生活方式 + 汽车/硬件)— 必须逐一列出,不能用“提供 60+ 个品牌”来概括。
  4. 一个具体、可复制粘贴的示例 — 提供 Stripe 广告创意任务说明(或同等示例),让用户了解输入的确切格式。

第一次使用?不妨先试试热门品牌。 npx getdesign list 附带 60+ 个可直接使用的品牌资料——Stripe、Linear、Notion、Apple、Tesla、Nike、Spotify、Starbucks、Figma、Cursor、Claude 等等。选一个你熟悉的品牌,进行一次 5 分钟的测试(例如选择该品牌并设置 template: ad-creative),看看 30x-image 实际生成的效果。先从你已经熟悉的品牌入手,比第一次就从头描述自己的品牌快得多。

**回复语言:**与用户对话所用的语言保持一致(英文需求 → 英文菜单,中文需求 → 中文菜单,依此类推)。但无论使用哪种语言,以下内容都必须保留英文原文:模板 ID(logo / ad-creative / slide / product-mockup / marketing-with-text / lighting-transform / scene-with-person / carousel)、命令语法(npx getdesign list / npx getdesign add <brand>)、文件路径,以及 frontmatter 字段名(template: / subject: / copy: / taste: / 等)。外围说明文字需要翻译;技术标识符不要翻译。这与图像内文案的语言要求不同——图像内文案应遵循用户明确的任务说明 / DESIGN.md / 需求中的指示。

最简命令格式
Use 30x-image. Generate a {template} for {brand}.
Brief: {subject + tagline + optional CTA + any size override}
DESIGN.md: {path or `npx getdesign add <brand>`}
8 种模板(选择最符合需求的一种)
模板可生成内容默认尺寸
logo为品牌设计全新的原创标志(不能仿制受商标保护的标志)1024×1024
ad-creative精美的社交媒体/数字广告,可添加标语1024×1536
slide单页演示文稿幻灯片——演示推介 / 数据 / 指标1536×864
product-mockup在简洁背景上呈现带有逼真阴影的产品1536×1024
marketing-with-text带有原文文案的广告牌 / 海报 / 包装1024×1536
lighting-transform为现有图像重新布景,改变光线/天气(action=edit)保留源图尺寸
scene-with-person将人物放入新场景(action=edit)1536×1024
carouselLinkedIn/社交媒体轮播图,6-10 张幻灯片——输出 N 个独立 PNG 文件,绝不合成为一张图1024×1024 或 1024×1280
通往 DESIGN.md 的两条路径

路径 A — 使用现有品牌(最快,最适合测试) 只需说出品牌名称——Stripe、Linear、Notion、Apple、Tesla、Nike、Spotify、 Starbucks、Coinbase、Figma、Cursor、Claude,以及 50 多个其他品牌。Agent 会自动获取 品牌档案(约 30 秒,用户无需运行任何命令)。

路径 B — 为自己的品牌生成 DESIGN.md 把你手头的任何资料交给 Agent——URL、描述、截图、Figma 文件、Tailwind 配置、tokens.json、CSS,或任意组合。Agent 会运行 init 模式(下方的模式 1),并综合生成一份 9 个部分的 DESIGN.md, 风格参考 Stripe 的规范示例。

复制粘贴示例(Stripe 广告创意)
Use 30x-image. Generate an ad-creative for Stripe.

DESIGN.md path: ~/.agents/skills/30x-image/examples/awesome-vendor/stripe/DESIGN.md

Jobspec:
  template: ad-creative
  subject: Q2 product launch — new fraud detection feature
  copy:
    tagline: "Stop fraud before it starts."
    cta: "Try it free"
  size: 1024x1536
  quality: high
  n: 4

当用户没有现成资料时,可从以下三个维度询问(顺序不限——根据 用户的实际需求灵活调整):

  1. 使用哪个模板?(或者:也可以自由发挥——如果任务不适合任何一个 8 种模板,Agent 会改用 cookbook 通用骨架 + 品牌 DESIGN.md + anti-slop, 不限定坐标轴。确定性会稍低一些,但依然有效。)

  2. 使用哪个品牌? 询问时,请逐一列出所有可选的预置品牌, 让用户挑选(不要将其概括成“你可以说出任意品牌”之类的说法)。 运行 npx getdesign list 获取实时的完整列表,或者使用以下已确认的 60 个品牌快照(上游库可能已扩展,请运行 npx getdesign list 验证):

    AI / ML / Models(12 个): Claude、Cohere、ElevenLabs、Lovable、 MiniMax、Mistral.ai、NVIDIA、Ollama、OpenCode.ai、Replicate、RunwayML、 Together.ai

    开发工具 / 基础设施 / 数据库(15 个): Composio、Cursor、Expo、 HashiCorp、IBM、PostHog、Raycast、Resend、Sentry、Superhuman、Supabase、 MongoDB、ClickHouse、Framer、Mintlify

    SaaS / 产品 / 效率工具(10 个): Airtable、Cal、Figma、Intercom、 Linear、Miro、Notion、Sanity、Shopify、Stripe

    金融科技 / 加密货币(5 个): Binance、Coinbase、Kraken、Mastercard、Revolut

    消费 / 生活方式 / 媒体(10 个): Airbnb、Apple、Meta、Nike、 Pinterest、PlayStation、Spotify、Starbucks、theVerge、Uber

    汽车 / 硬件(7 个): BMW、Bugatti、Ferrari、Lamborghini、Renault、 SpaceX、Tesla

    创意代理机构(1 个): Clay

    只需说出其中任意一个品牌,Agent 就会运行 npx getdesign add <brand>, 并在约 30 秒内获取现成的 DESIGN.md。

    如果是自己的品牌:把 URL / 描述 / 截图 / Figma 文件 / Tailwind 配置 / tokens.json / CSS 交给 Agent——Agent 会运行 init 模式 (模式 1)并综合生成 DESIGN.md。

  3. 需求是什么? 主题 + 标语 + 可选的 CTA。轮播图则提供每张幻灯片的主题 / 文案。 对于 lighting-transform / scene-with-person / product-mockup,则提供要编辑的输入图像。

生成后:如果某个候选图已达到 90% 的效果,但有一个细节需要修正 (错别字 / 颜色不对 / 瑕疵),请使用编辑模式(模式 3)。只需说: “将 slide-3.png 中的标题改成 X”或“将 candidate-2.png 中的 CTA 按钮 改为 Stripe 紫色”——Agent 会使用 gpt-image-2 的 input_image_mask,仅对指定区域进行精准修改,同时保持图像其余部分的像素完全一致。


运行时要求(首先检查此项,再进行其他操作)

**此技能需要 image_generation 工具(通过 OpenAI Responses API 使用 gpt-image-2)。**这不是可选项,也没有代码渲染备用方案。

步骤 0 — 验证工具是否可用:

调用 init / generate / edit 之前,先检查当前会话是否提供了 image_generation 工具。如果你无法调用 image_generation(工具列表中没有该工具,或提供方未提供该工具),请立即停止,并告知用户:

30x-image 需要通过 OpenAI 的 image_generation 工具使用 gpt-image-2,但此会话中没有该工具。没有它,我无法生成图像,只能用代码描述或模拟图像(这会完全违背此技能的目的)。

解决方法:

  1. 改用 Codex(CLI、App 或网页版),不要使用 Claude Code — Codex 原生提供 OpenAI 的 image_generation 工具。
  2. 如果你使用的是 Codex,但仍然没有该工具:请确认你的 OpenAI 账户有权使用 gpt-image-2(付费套餐,且已启用图像生成功能标记)。
  3. 如果你使用的是 Claude Code 或其他没有 OpenAI 工具的运行时: 安装一个提供图像生成能力的 MCP 服务(例如 OpenAI MCP 服务,或封装 gpt-image-2 / 同类模型的 fal.ai / Replicate MCP),然后重启会话。

我不会悄悄退而求其次,用代码(HTML / CSS / Canvas / SVG)生成图像 — 那样做出的东西看起来像网页渲染效果, 而不是符合品牌风格的营销图像,这恰恰与此技能的目的背道而驰。

如果用户想要上述任何一种替代输出,那就属于不同的需求, 用户应明确提出。30x-image 只生成由 gpt-image-2 生成的 PNG。没有例外。

禁止使用以下备用方案(不要这样做):

  • 使用 HTML / CSS / Canvas / SVG 渲染图像
  • 拼接本地素材 / 剪贴画来合成图像
  • 建议用户“截取 Agent 描述的屏幕截图”
  • 生成其他产物(例如 Markdown 规范文档),并声称那就是结果

如果用户想要上述任何一种替代输出,那就属于不同的需求,用户应明确提出。30x-image 技能只生成由 gpt-image-2 生成的 PNG。没有例外。


三种模式

模式 1:init — 根据任意输入源构建 DESIGN.md

支持多种输入源:URL / 描述 / 屏幕截图 / Figma Variables / Tailwind 配置 / tokens.json / CSS 自定义属性 / 现有 DESIGN.md / npx getdesign add <brand>。输出:完整的 DESIGN.md,采用我们的 9 个章节 格式(与 examples/awesome-vendor/stripe/DESIGN.md 的结构一致,不是 Google 的 8 个章节规范 — 我们增加了 ## 8. Responsive Behavior,并 保留自己的章节顺序)。保存至:

  • 如果配置目录存在,则保存到 $HOME/.30x-image/profiles/<brand-slug>/DESIGN.md
  • 否则保存到当前工作目录下的 ./DESIGN.md
流程

步骤 1 — 选择生成路径(按优先顺序):

  1. npx getdesign add <brand> — 如果用户的品牌在 60 多个公开库中(Stripe / Linear / Notion / Apple / Tesla / Nike / Spotify / Starbucks / 等),则获取现成的 DESIGN.md。这是质量最高的路径 — 只要可行,就优先使用。并按照步骤 3 补充 taste: 块。

  2. Stitch MCP — Google 的免费官方工具(每月 350 次生成),原生支持 URL / 屏幕截图 / 描述。设置方法:

    • 用户在 Stitch 设置中生成 API Key(https://stitch.withgoogle.com) → API 部分
    • 用户按照 Stitch 官方文档安装 Stitch MCP(搜索“Stitch MCP setup”),并将 API Key 提供给其 Codex 会话
    • 用户重启 Codex;此时 Agent 即可使用 Stitch MCP
    • Agent 使用用户的输入(URL / 屏幕截图 / 描述)调用 Stitch MCP,并接收 DESIGN.md,再按照我们的 9 个章节格式进行规范化(见步骤 2)
    • **如果用户无法 / 不愿意设置 Stitch,则使用备用方案:**直接转到 LLM init(下方路径 3)。不要因等待 Stitch 而阻塞流程。
  3. LLM 初始化(Agent 自行综合)——当 getdesign 和 Stitch 均不适用(或用户赶时间)时。Agent 读取输入来源,并从头开始编写 DESIGN.md,遵循 Stripe DESIGN.md 的结构:

    • URL → 获取页面;从 CSS / <meta theme-color> 中提取配色;从 font-family 声明中提取字体排版;截图并直观验证整体氛围;编写 9 个章节的文字内容
    • 描述 → 仅通过 LLM 推断;置信度较低;每个值都必须标记 # auto-inferred, please review
    • 仅有截图 → 视觉 LLM 提取颜色 + 字体排版风格
    • Tailwind 配置 / tokens.json / CSS 自定义属性 → 直接解析到 frontmatter 中,然后由 LLM 根据这些 token 编写第 1-8 节的文字内容
    • Figma Variables → 调用 REST API(用户提供 token),将变量解析到 frontmatter 中,然后由 LLM 编写文字内容
    • 现有 DESIGN.md(Google 格式 / 外部来源) → 将章节名称转换为我们的 9 节格式,并补充 taste: 块

步骤 2——输出结构(始终采用我们的 9 节格式):

---
version: alpha
name: <brand>
description: <one-line brand positioning>
colors:
  primary: <hex>
  secondary: <hex>
  ...
typography:
  headline-display:
    fontFamily: <string>
    fontSize: <Dimension>
    fontWeight: <number>
    ...
rounded: { sm: ..., md: ..., lg: ..., full: ... }
spacing: { xs: ..., sm: ..., md: ..., lg: ..., xl: ... }
components:
  button-primary: { ... }
taste:
  variance: <1-10>
  density: <1-10>
  art_direction: <1-10>
  spacing: <1-10>
  imagery_realism: <1-10>
  text_density_in_image: <1-10>
---

# Design System Inspired by <Brand>

## 1. Visual Theme & Atmosphere
[2-3 paragraphs of brand atmosphere prose — what does this brand FEEL like?]

## 2. Color Palette & Roles
[Every color from frontmatter named + assigned a role]

## 3. Typography Rules
[Font family + hierarchy table + principles]

## 4. Component Stylings
[Buttons / cards / badges / inputs / nav specs]

## 5. Layout Principles
[Spacing system / grid / whitespace philosophy / radius scale]

## 6. Depth & Elevation
[Shadow system + decorative depth]

## 7. Do's and Don'ts
[Lists of explicit prescriptions and prohibitions]

## 8. Responsive Behavior
[Breakpoints / touch targets / collapsing strategy]

## 9. Agent Prompt Guide
[OPTIONAL — leave this empty or omit for new brands. Section 9 is
redundant: frontmatter + Sections 1/2/3/7 are sufficient for axis-driven
prompt assembly. See memory/30x-image-section9-redundant.md.]

步骤 3——推断 taste: 块:

源文件提供颜色 / 字体排版 / 间距(客观信息),但 5-7 个数值型 taste: 参数属于主观的品牌判断。Agent 策略:

  • 阅读所有可用证据(frontmatter 值、文字章节、截图,如有)
  • 为每个参数打 1-10 分,并给出简短理由
  • 每项都标记为 # auto-inferred, please review,以便用户知道需要核实
  • 默认评分标准(写在注释中):
    • variance:1=完全对称 / 10=高度不对称
    • density:1=留白充足 / 10=信息密集
    • art_direction:1=稳妥商业风格 / 10=大胆实验风格
    • spacing:1=紧凑 / 10=宽松舒展
    • imagery_realism:1=扁平插画 / 10=编辑风格的照片级真实感
    • text_density_in_image:1=文字极少 / 10=文案密集

步骤 4——使用 @google/design.md lint 进行验证:

编写 DESIGN.md 后,运行:

npx @google/design.md lint <path-to-DESIGN.md>

按优先级向用户展示检查结果:

  • error:broken-ref(无法解析的 token 引用)——必须修复
  • warning:missing-primary / contrast-ratio / orphaned-tokens / section-order——标记出来
  • info:token-summary——向用户展示

如果出现 broken-ref 错误,尝试自动修复一次(使用最接近的 token 解析缺失引用),然后重新运行 lint。如果仍有错误,向用户展示 JSON 检查结果并询问如何处理。

步骤 5——向用户报告:

  • 已保存 DESIGN.md 的路径
  • 质量摘要:"通过 {getdesign / Stitch / LLM-init} 生成;lint:{N 个错误,M 个警告};自动推断的字段:{列表}"
  • 建议的下一步:"运行 30x-image generate template=ad-creative brand=<name>,立即测试此 DESIGN.md"
  • 对于 LLM 初始化路径:明确告知用户“在提交此配置前,请检查自动推断的字段(taste: 块 + 第 7 节的 Don't 列表)——输入保真度越低,猜测成分越多”
模式 2:generate——生成符合品牌形象的图片(重点关注 M0/M1)

读取 DESIGN.md + jobspec → 使用组合轴 + anti-slop 禁用项组装提示词 → 调用 image_generation 工具 → 保存图片 + 清单。

模式 3:edit — 对已生成图像进行局部精修(M3)

提供现有 PNG(通常来自之前运行的模式 2)+ 区域指定符 + 新提示词 → 生成一张新的 PNG,其中只有指定区域发生变化,其他所有像素都保持 1:1 不变。此功能由 Codex image_generation 工具的 input_image_mask 参数驱动。

适用场景:

  • “候选图 2 很棒,但标语有个错别字——只修正标题”
  • “第 5 张幻灯片的 CTA 按钮变成了绿色,但要求使用 Stripe 紫色”
  • “徽标右下角有水印瑕疵——只移除那里”

**为何重要:**没有模式 3 时,修复一个细节就意味着重新运行整个模板(每次运行要生成 4 个候选,耗时 30 秒以上,也无法保证其他部分仍然一样出色)。模式 3 会保留你喜欢的 99%,只改动你不喜欢的 1%。


用户调用 generate 时

输入
  • DESIGN.md 路径:必填。文件可能位于当前工作目录、examples/ 或 $HOME/.30x-image/profiles/<brand>/DESIGN.md。解析优先级:
    1. 用户明确指定的路径
    2. 当前工作目录下的 ./DESIGN.md
    3. $HOME/.30x-image/active → 对应配置文件的 DESIGN.md
    4. 否则提示用户选择
  • 模板:以下模板之一:logo / ad-creative / slide / product-mockup / marketing-with-text / lighting-transform / scene-with-person / carousel (carousel 是多张幻灯片:见下文步骤 4·B)。 解析优先级:
    1. 用户明确指定模板 → 直接使用。
    2. 用户的需求描述较模糊,但可归入 8 种模板之一 → Agent 自动分类并选择最匹配的模板(这是首选路径;模板之所以存在,是因为它们提供了提升质量的轴和指导框架)。
    3. 需求描述确实不属于任何一种模板(例如抽象的内部视觉素材、不含营销意图的概念图)→ 回退到自由形式模式:使用 cookbook §2 通用提示词规则 + DESIGN.md frontmatter + 反敷衍规则,不使用轴(没有模板就没有可供采用的轴定义)。自由形式仅作为回退方案——当需求符合某个模板时,绝不应默认使用自由形式。
  • 任务规格:主题 + copy.tagline + copy.cta + size + quality + n + mode (覆盖 references/cookbook-7-templates.md 中的默认值)
流程(按顺序执行)

步骤 1 — 加载 DESIGN.md。 解析 YAML frontmatter(token 块 + taste:)。阅读全部 9 个章节。 特别关注:

  • ## 1. Visual Theme & Atmosphere(描述图像氛围)
  • ## 2. Color Palette & Roles(每种颜色的名称、色值和用途)
  • ## 3. Typography Rules(尤其是排版表格)
  • ## 7. Do's and Don'ts → Don't 列表包含品牌禁止的敷衍内容
  • ## 9. Agent Prompt Guide → 如果其中有针对所需模板的 ### For: 30x-image generate <template> 章节,优先使用该品牌专属速查表,而非通用的 references/cookbook-7-templates.md 框架。

步骤 2 — 选择组合轴。 阅读与所需模板对应的 references/combinatorial-axes.md。每个轴有 4-6 个选项。根据 taste: 块的倾向,每个轴恰好选择一个:

  • variance 越高 → 越倾向非对称/艺术化选项
  • density 越高 → 越倾向充实/密集选项
  • imagery_realism 越高 → 越倾向照片级真实/硬光选项
  • art_direction 越高 → 越倾向大胆/实验性选项 明确选定选项:将其写入提示词。这能打破 AI 默认的敷衍套路(居中的暗色主视觉/紫色霓虹/漂浮的色块)。

步骤 3 — 组合最终提示词。

[Template skeleton from cookbook-7-templates.md OR Section 9 brand cheat sheet]

VISUAL ATMOSPHERE:
[paraphrase Section 1 essence — 2-3 sentences]

PHOTOGRAPHY / ILLUSTRATION STYLE:
[derive from taste.imagery_realism + Section 1 prose]

COMPOSITION:
- Axis 1: [committed choice]
- Axis 2: [committed choice]
- Axis 3: [committed choice]
- Axis 4: [committed choice if template has 4]

PALETTE (use ONLY these tokens, do not fabricate new colors):
- Primary: {colors.primary} ({brand-color-name from Section 2})
- Surface: {colors.surface}
- Headlines: {colors.on-surface}
- Body: {colors.neutral}
- Accent: {colors.tertiary} (sparingly)

TYPOGRAPHY IN IMAGE:
- Display: {typography.headline-display.fontFamily} weight {fontWeight}
- Letter-spacing: {letterSpacing}
- Font features: {fontFeature if set}

SUBJECT / COPY (from jobspec):
- Subject: {jobspec.subject}
- Tagline: "{jobspec.copy.tagline}" (verbatim, in quotes)
- CTA: {jobspec.copy.cta if provided}

ANTI-SLOP CONSTRAINTS (always include — read references/anti-slop-rules.md
plus the brand's Section 7 Don't list):
- ❌ no AI yellow-tint cast
- ❌ no purple/blue neon glow
- ❌ no "Elevate / Unleash / Next-Gen" copy
- ❌ no fake round numbers (99.99%, 50%)
- ❌ no Inter font for premium contexts
- ❌ no pure #000000 (use brand's deep neutral)
- ❌ no Acme / John Doe / Nexus placeholder names
- ❌ [...add brand-specific rules from Section 7 Don't]

步骤 4 — 调用 image_generation 工具。 工具参数(默认值来自 references/cookbook-7-templates.md,可由任务规格覆盖):

  • size:例如 ad-creative 使用 1024x1536
  • quality:探索时使用 low,最终成品使用 high
  • n:探索时使用 4,最终成品使用 1
  • action:生成新图时使用 "generate",迭代时使用 "edit"
  • output_format:png

步骤 4·B — 轮播图多张幻灯片处理(仅限模板=carousel)。

carousel 是唯一会在一次任务中多次调用 image_generation 的模板。流程:

  1. 一次性组装共享系统提示词前缀——品牌设计系统(配色 / 字体排版 / 网格)、图案轴选择、连续性机制轴选择、张力曲线选择(轴 5)。所有幻灯片使用相同的前缀。
  2. 规划幻灯片角色和叙事节拍:
    • 幻灯片 1 = 封面(使用封面幻灯片风格轴)。
    • 幻灯片 2..(N-1) = 正文(使用正文幻灯片节奏轴)。
    • 幻灯片 N = 行动号召。
    • 应用张力曲线(轴 5)为每张正文幻灯片分配一个叙事节拍:例如,对于 Build-up,正文幻灯片的紧张感从 2→N-1 逐步升级;对于 Reveal,幻灯片 2-3 暂不揭晓,幻灯片 4..(N-1) 逐步揭晓;对于 Linear arc,幻灯片 2=背景,3=挑战,4-5=解决方案,N-1=结果。
    • 如果用户提供了每张幻灯片的 copy:遵循其顺序;仅将张力曲线作为视觉强调(例如,幻灯片 N-1 使用更大的标题和更饱和的颜色——即“高潮幻灯片”)。
    • 如果用户只提供了 subject,并让 Agent 撰写文案:Agent 必须生成符合张力曲线要求的文案。检查:幻灯片 N-1 是否有高潮感?幻灯片 1 是否能引出高潮?
  3. **并行调用所有幻灯片,分别使用 action=generate——生成 N 个独立的 PNG 文件,绝不能生成单张合成图。**逻辑与其他所有模板相同,只是调用 N 次而不是 1 次。**不要生成一张包含 N 个面板的图片(漫画条 / 网格样式)。**每张幻灯片都是独立的全分辨率 PNG,用户会将其作为 LinkedIn / Instagram / X 轮播序列中的一张上传。如果生成了一张合成图,那就是错误的——用户无法将其拆开,平台也不会将其分页为轮播:
    • 构建每张幻灯片的提示词 = 共享设计系统前缀 + THIS SLIDE: slide N of n_slides, role: <cover|body-N|cta>, subject: <jobspec.slides[N].subject>, copy: "<verbatim>"。
    • 每张幻灯片:action=generate、n=1、质量采用用户指定的级别(默认 high)。**不使用 action=edit 链式调用。**原因:反复编辑幻灯片 1 可能会让 gpt-image-2 陷入“网页布局”模式,使幻灯片看起来像 CSS 渲染,而不是由 gpt-image-2 生成。每张幻灯片都必须独立生成,与广告创意或 Logo 的生成方式完全相同。
    • 跨幻灯片的视觉一致性来自共享提示词前缀(品牌配色 / 字体排版 / 视觉连续性机制轴选择),而不是图像参考链。相信前缀即可。
    • 并行触发所有 N 次调用——总耗时约为 1 次 image_generation 调用。
    • 如果某张正文幻灯片与其他幻灯片相比偏离了品牌风格,应通过强化该幻灯片的共享前缀(更具体的配色 / 字体排版指令)来修正,而不是切换到 action=edit。
  4. 将每张幻灯片保存到 candidates/slide-{N}.png(不要使用 1.png / 2.png——使用幻灯片编号以便识别)。
  5. manifest.json 记录:n_slides、pattern、slide_roles[]、每张幻灯片的完整提示词、幻灯片 1 的哈希值(连续性参考)。

步骤 5——保存输出。 默认位置:$HOME/.30x-image/profiles/<brand-slug>/marketing/<job-id>/ 文件:

  • candidates/{1..n}.png(每张候选图片)
  • manifest.json(参见下方结构)

如果配置文件目录不存在(从 examples/ 运行),则默认保存到当前工作目录下的 ./marketing/<job-id>/。

步骤 6——编写 manifest.json。

{
  "job_id": "ISO-timestamp_short-slug",
  "design_md_path": "...",
  "design_md_hash": "sha256:...",
  "template": "ad-creative",
  "jobspec": { ... },
  "axes_picks": {
    "Hero Composition": "Asymmetric Split",
    "Subject Framing": "Medium environmental",
    "Lighting Mood": "Soft natural daylight",
    "Text-Image Integration": "Tagline overlaid bottom-left"
  },
  "tool_params": { "size": "1024x1536", "quality": "high", "n": 4 },
  "prompt_full": "...",
  "outputs": [
    { "path": "candidates/1.png", "selected": false },
    { "path": "candidates/2.png", "selected": false },
    ...
  ],
  "created_at": "..."
}

步骤 7——向用户报告。 告知用户:

  • 候选图片的存放位置
  • 已采用的轴选择(保持透明)
  • 可选:建议“选择一张并使用 action=edit、quality=high 再运行一次”以进行最终调整。
  • 可选:提醒用户可以进行精准编辑——“如果某张候选图片已达到 90% 的效果,但有一处细节需要修正(错别字 / 颜色错误 / 瑕疵),请使用编辑模式(模式 3)仅修正该部分,同时保留其他所有内容。”

用户调用 edit 时(模式 3——局部精准编辑)

输入
  • input_image:必填。要编辑的 PNG 文件路径(通常来自此前 Mode 2 运行的结果,例如 candidates/2.png 或 slide-3.png)。
  • 要更改的内容(以下四种方式任选其一,以最符合用户需求的方式为准):
    1. 自然语言描述区域——region: "the headline at the top" / "the CTA button" / "the bottom-right corner"。Agent 使用视觉能力定位区域,并以编程方式生成蒙版。用户体验最自然。
    2. 归一化边界框——region_box: [x1, y1, x2, y2],坐标范围为 0.0-1.0,原点在左上角。Agent 生成矩形蒙版。适用于用户提供精确坐标或描述“顶部 20%”之类区域的情况。
    3. 用户提供的蒙版——mask: ./my-mask.png。尺寸须与 input_image 相同;要编辑的区域透明(alpha=0),要保留的区域不透明。适用于使用 Photoshop / Preview / Figma 涂绘蒙版的用户。
    4. 全局编辑(无蒙版)——global_prompt: "make it black and white"。不使用蒙版,仅通过提示词编辑。⚠️ 风险:gpt-image-2 可能会重新生成整张图片,导致结果偏离原图。仅用于真正的全局更改(色调、时段、天气)。继续操作前请提醒用户。
  • prompt:蒙版区域中应出现的内容(或全局模式下要进行的更改)。请尽量具体,例如 "change tagline to 'Stop fraud before it starts.' in the same font and weight",而非 "fix the text"。
  • output_path:可选。默认路径:与输入文件同目录,文件名为 <input-name>-edited-<timestamp>.png。
操作步骤(按顺序执行)

步骤 1 — 加载并验证 input_image。

  • 确认文件存在、格式为 PNG,且 gpt-image-2 可以读取。
  • 读取图像尺寸(W × H),用于确定蒙版尺寸。

步骤 2 — 将区域转换为蒙版 PNG。

区域类型蒙版生成方式
自然语言描述(region: "...")使用 Codex 的视觉能力处理 input_image。确定所描述元素的像素边界框。生成尺寸相同的 PNG:目标区域透明(alpha=0,RGBA 0,0,0,0),其余区域不透明(alpha=255)。通过 shell 使用 Python+PIL,例如 python -c "from PIL import Image, ImageDraw; ..."。
归一化边界框(region_box: [x1,y1,x2,y2])将坐标分别乘以 W、H,得到像素矩形。生成蒙版 PNG,使该矩形区域透明,其余区域不透明。
用户蒙版(mask: path)验证尺寸是否与 input_image 相同。若不一致,则调整尺寸,或给出明确错误信息。
全局(global_prompt)不使用蒙版。跳到步骤 3。

将蒙版保存到临时文件(例如 /tmp/30x-image-mask-<job-id>.png)。

步骤 3 — 将 input_image(以及蒙版,如有)作为文件上传。

from openai import OpenAI
client = OpenAI()

def create_file(path):
    with open(path, "rb") as f:
        return client.files.create(file=f, purpose="vision").id

input_file_id = create_file(input_image)
mask_file_id = create_file(mask_path) if mask_path else None

步骤 4 — 使用 input_image_mask 调用 image_generation 工具。

对于区域 / 边界框 / 蒙版编辑(步骤 2.1、2.2、2.3):

response = client.responses.create(
    model="gpt-5.5",
    input=[{
        "role": "user",
        "content": [
            {"type": "input_text", "text": prompt_with_brand_context},
            {"type": "input_image", "file_id": input_file_id}
        ],
    }],
    tools=[{
        "type": "image_generation",
        "quality": "high",
        "input_image_mask": {"file_id": mask_file_id}
    }],
)

对于全局编辑(步骤 2.4——不使用蒙版):

# Same call, but omit input_image_mask. Warn user about regeneration risk.

组装提示词——在用户的编辑提示词中加入品牌背景信息,避免编辑区域偏离品牌风格。请从原始 manifest.json(如有 DESIGN.md,也可使用)中提取:

Edit ONLY the masked region of this image. Preserve everything outside
the mask exactly.

EDIT INSTRUCTION:
{user's edit prompt}

BRAND CONTEXT (the edited region must remain on-brand):
- Palette: {colors.primary}, {colors.surface}, {colors.on-surface} — do not
  introduce new colors
- Typography: {typography.headline-display.fontFamily} weight {fontWeight}
- Anti-slop: same banned list as original generation (no AI yellow-tint, no
  pure black, no Inter font, etc.)

Do not regenerate the whole image. Do not alter pixels outside the mask.

步骤 5 — 保存并报告。

  • 将输出 PNG 保存到 output_path。
  • 在 Mode-3 清单条目中追加:
    {
      "edit_id": "ISO-timestamp",
      "input_image": "...",
      "input_image_hash": "sha256:...",
      "region_type": "natural-language" | "bbox" | "user-mask" | "global",
      "region_value": "the headline at the top",
      "mask_path": "/tmp/30x-image-mask-...png",
      "mask_hash": "sha256:...",
      "edit_prompt": "...",
      "output_path": "...",
      "created_at": "..."
    }
    
  • 告知用户:编辑后的 PNG 所在位置、蒙版区域(透明区域)以及并排对比建议(“与原图 <input_path> 对比”)。
重要限制(根据 gpt-image-2 的文档行为)
  1. 迭代编辑“顽固性”——连续编辑同一张图像超过 2-3 次后,模型会停止做出有意义的更改。**解决方法:**如果第三次编辑未生效,就从模式 2 重新生成图像,并将所需更改写入提示词。
  2. 蒙版是指导,而非铁律——gpt-image-2 会将蒙版作为指导,但不一定能完全精准地遵循其确切形状。边缘可能会轻微溢出到保留区域。若需要像素级精准保留,可考虑使用单独的图像编辑器进行合成。
  3. 自我纠正幻觉——如果用户要求编辑图像中实际上不存在的内容(例如,在没有二维码的情况下要求“移除二维码”),模型可能会凭空生成该元素,然后再“修正”它。应用视觉验证确认目标区域确实存在后,再使用蒙版。
  4. 未使用蒙版的全局编辑会产生偏移——使用 global_prompt(无蒙版)有模型重新生成整张图像的风险。要真正保留原图,务必提供蒙版,即使蒙版覆盖了除一个极小角落外的整张图像。

质量门槛(M0 验收标准)

生成的图像满足以下条件时,即为符合品牌风格:

  1. frontmatter 中的主色明显占主导地位(CTA / 强调色)
  2. 字体风格符合 ## 3. Typography Rules(例如,Stripe 使用 300 的细字重,不能是粗体)
  3. 未违反反垃圾内容禁用列表中的任何一项
  4. 氛围 / 密度 / 差异度符合 taste: 块

如果人工评判时有任何一项答案为“否”,就继续迭代(重新选择轴 / 加强约束 / 在提示词中明确加入反垃圾内容要求)。


信息不足时

妥善拒绝 / 澄清:

  • 缺少 DESIGN.md → 使用 3 步回退流程(按顺序尝试,并告知用户你采用了哪一步):
    1. npx getdesign list——检查品牌是否位于公开的 awesome-design-md 库中(包含 60 多个品牌:Stripe / Linear / Notion / Vercel / Apple / Tesla / Nike / Spotify / Starbucks / Apple / Coinbase / 等)。如果在库中 →
    2. npx getdesign add <brand>——通过一条命令将现成的 DESIGN.md 拉取到当前工作目录。直接使用;也可选择加入 taste: 块(5-7 个数值品牌参数)来调整轴的偏向。
    3. 品牌不在库中 → 运行 init 模式(M2),或按照 9 个部分的格式 + frontmatter 令牌块 + taste: 块手动编写 DESIGN.md(参见 examples/awesome-vendor/stripe/DESIGN.md,这是权威参考)。
  • 模板名称错误 → 列出 8 个有效模板(包括 carousel)
  • 尽力分类后,用户的需求仍不匹配任何模板 → 进入自由形式回退流程(不要拒绝)。告知用户“没有匹配的模板,将仅使用品牌 DESIGN.md + 反垃圾内容规则进行自由创作”,让他们了解本次运行的确定性会降低。
  • Jobspec 缺少必填字段(subject)→ 调用工具前先询问
  • 品牌的 ## 7 Don't 内容为空 / 不够有力 → 回退使用通用的 references/anti-slop-rules.md

构图示例——Stripe 广告创意

DESIGN.md:  examples/awesome-vendor/stripe/DESIGN.md
Template:   ad-creative
Jobspec:
  subject: "Q2 product launch — new fraud detection feature"
  copy:
    tagline: "Stop fraud before it starts."
    cta: "Try it free"
  size: 1024x1536
  quality: high
  n: 4

Axis picks (committed by 30x-image based on taste.variance=4, realism=7):
  Hero Composition:        Editorial Offset (variance=4 prefers low-mid)
  Subject Framing:         Medium environmental
  Lighting Mood:           Soft natural daylight (realism=7 sweet spot)
  Text-Image Integration:  Tagline overlaid bottom-left

→ image_generation tool invoked → 4 candidates saved
→ manifest.json records hash of DESIGN.md + axis picks + full prompt

评论

支持 Markdown