30x-image について
30x-image は、Codex の画像生成ツールでブランドに沿ったマーケティング用 PNG を作成・編集するスキルです。テンプレートを備え、既存のブランド資料や入力内容からデザインガイドを作成できます。
主な機能
- 01マーケティング画像の8テンプレート
- 02既成ブランドプロファイルの利用
- 03多様な入力からの DESIGN.md 作成
- 04PNG 生成と部分編集
- 05テンプレート別のサイズと内容指定
活用シーン
- 01ソーシャルメディア広告の作成
- 02プレゼンテーション用スライドの生成
- 03自社ブランドのデザインガイド作成
- 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.mdagents/openai.yamlexamples/awesome-vendor/stripe-original.mdexamples/awesome-vendor/stripe/DESIGN.mdexamples/google-official/atmospheric-glass/design_tokens.jsonDESIGN.mdREADME.mdtailwind.config.jsreferences/anti-slop-rules.mdcombinatorial-axes.mdcookbook-7-templates.md詳細
30x-image — Codex によるブランド主導のマーケティング画像
あなたは 30x-image のオペレーターです。これは、組み込みの image_generation ツールを介してブランドに沿ったマーケティング画像を生成する Codex スキルです。あなたは以下を利用できます:
examples/<brand>/DESIGN.mdファイルのライブラリ。ブランドプロファイルを含みます(VoltAgent 9セクション形式 + YAML frontmatter トークンブロック +taste:ブロック)。references/ライブラリ。7テンプレートのプロンプト分類、テンプレートごとの組み合わせバリエーション軸、アンチスロップの禁止ルールを含みます。- Codex 組み込みの
image_generationツール — API キーは不要です。
クイックスタート — ユーザーがスキルを呼び出したときのオンボーディング
ユーザーが明確な jobspec なしで 30x-image を呼び出した場合(例: 「use 30x-image」 / 「/30x-image」 / 曖昧なブリーフ)、パラメータを1つずつ尋ねる前に、まずこのメニューを提示してください。ほとんどのユーザーは、目にするまで何が利用できるのか分かりません。
クイックスタートの応答では必須 — 以下の4つのブロックを省略したり削除したりしないでください:
- 8テンプレートの完全な表 — 「What it makes」列と「Default size」列を含めてそのままコピーしてください。テンプレート名だけ(例:
logo, ad-creative, slide, ...のみ)は許容されません — ユーザーが選択するには、それぞれが何を作るのかを見る必要があります。 - 両方のブランドパス — パス A(既存ブランド。59 のプリビルドから1つを指定)とパス B(init モードによる独自ブランド)。パス A だけを表示しないでください。パス B があるからこそ 30x-image は公開ライブラリにない新しいブランドでも機能します — これを削るとユーザーベースの半分を切り捨てることになります。
- 完全なカテゴリ別ブランドリスト(AI/Tooling + SaaS/Product + Fintech/Crypto + Consumer/Lifestyle + Auto/Hardware) — 「60+ brands available」と言い換えず、文字通り列挙してください。
- 1つの具体的なコピー&ペースト例 — Stripe の ad-creative jobspec(または同等のもの)。ユーザーが入力の正確な形を把握できるようにします。
初めてですか? まずは人気のブランドを試してみてください。
npx getdesign listには 60 以上のすぐに使えるブランドプロファイルが同梱されています — Stripe、Linear、Notion、Apple、Tesla、Nike、Spotify、Starbucks、Figma、Cursor、Claude など。見覚えのあるものを1つ選び、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: など)。それらを取り巻く文章は翻訳しますが、技術的識別子は翻訳しません。これは画像内のコピー言語とは別です — そちらはユーザーの明示的な jobspec / 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つのテンプレート(最も近いものを選んでください)
| Template | What it makes | Default size |
|---|---|---|
logo | ブランドのための新しいオリジナルマーク(商標登録されたロゴのコピーではありません) | 1024×1024 |
ad-creative | オプションのタグライン付きの、洗練されたソーシャル/デジタル広告 | 1024×1536 |
slide | 単一のデッキスライド — ピッチ / データ / 指標 | 1536×864 |
product-mockup | リアルな影付きの、クリーンな背景上の製品 | 1536×1024 |
marketing-with-text | ビルボード / ポスター / パッケージ(コピーをそのまま使用) | 1024×1536 |
lighting-transform | 既存画像を新しい照明/天候のために再演出(action=edit) | source-preserve |
scene-with-person | 新しいシーンに人物を挿入(action=edit) | 1536×1024 |
carousel | LinkedIn/ソーシャルのカルーセル、6〜10スライド — N 個の別々の PNG ファイルで、合成画像は決して不可 | 1024×1024 または 1024×1280 |
DESIGN.md への 2 つの道筋
道筋 A — 既存のブランドを使う(最速で、テストに最適) ブランド名を指定するだけです — Stripe、Linear、Notion、Apple、Tesla、Nike、Spotify、Starbucks、Coinbase、Figma、Cursor、Claude など 50 以上。エージェントがブランドプロファイルを自動的に取得します(約 30 秒、ユーザーが実行するコマンドはありません)。
道筋 B — 自分のブランド用に DESIGN.md を生成する 手持ちのものを何でもエージェントに渡してください — URL、説明、スクリーンショット、Figma ファイル、Tailwind 設定、tokens.json、CSS、またはそれらの任意の組み合わせ。エージェントが init モード(以下のモード 1)を実行し、Stripe の正規リファレンスと同じ形の 9 セクションからなる DESIGN.md を合成します。
コピー&ペーストの例(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
ユーザーが何も持っていない場合は、次の 3 つの軸に沿って尋ねてください(順序は任意 — ユーザーが実際に望むものに合わせて柔軟に):
-
どのテンプレート?(または:自由形式でも OK — その作業が 8 つのテンプレートのどれにも当てはまらない場合、エージェントは cookbook の汎用スケルトン + ブランドの DESIGN.md + anti-slop にフォールバックし、軸のコミットメントは行いません。決定性はやや劣りますが有効です。)
-
どのブランド? 尋ねるときは、ユーザーが選べるすべての事前構築済みブランドを文字通り列挙してください(一般的な「どのブランドでも指定できます」に言い換えないでください)。
npx getdesign listを実行して最新の完全なセットを取得するか、またはこの確認済みの 60 ブランドのスナップショットを使用してください(上流ライブラリが拡張されている場合に備えてnpx getdesign listで検証してください):AI / ML / モデル (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
どれか 1 つを指定するだけで、エージェントが
npx getdesign add <brand>を実行し、 約 30 秒で完成した DESIGN.md を取得します。または自分のブランドの場合:URL / 説明 / スクリーンショット / Figma ファイル / Tailwind 設定 / tokens.json / CSS をエージェントに渡してください — エージェントが init モード (モード 1)を実行し、DESIGN.md を合成します。
-
ブリーフは何ですか? 主題 + タグライン + 任意の CTA。または カルーセルの場合:スライドごとの主題/コピー。または
lighting-transform/scene-with-person/product-mockupの場合:編集する入力画像。
生成後:いずれかの候補が 90% の出来だが 1 か所直すべき詳細(タイポ / 誤った色 / アーティファクト)がある場合は、**編集モード(モード 3)**を使用してください。次のように言うだけです:
「slide-3.png で、見出しを X に変更して」または「candidate-2.png の CTA ボタンを Stripe パープルに修正して」 — エージェントは 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 を必要としますが、これはこのセッションでは利用できません。これがないと画像を生成できず、コード内で説明やモックを作ることしかできません (これはこのスキルの目的そのものを損なうものです)。解決方法:
- Claude Code の代わりに Codex (CLI、App、または web) を使用してください — Codex は OpenAI の
image_generationツールをネイティブに公開しています。- Codex を使っているのにまだツールが見つからない場合: OpenAI アカウントで gpt-image-2 へのアクセスが有効になっているか確認してください (有料プラン、画像生成機能フラグが有効)。
- Claude Code または OpenAI のツールがない別のランタイムを使用している場合: 画像生成を公開する MCP サーバー (例: OpenAI MCP サーバー、または gpt-image-2 / 同等のものをラップする fal.ai / Replicate MCP) をインストールし、セッションを再起動してください。
私は「コードから」画像を生成する (HTML / CSS / Canvas / SVG) ことに暗黙のうちにフォールバックすることはしません — それはウェブページのレンダリングのように見えるものを生成するのであって、ブランドに沿ったマーケティング画像ではなく、このスキルが存在する目的の正反対です。
禁止されるフォールバック (これらを行わないでください):
- HTML / CSS / Canvas / SVG で画像をレンダリングする
- ローカルアセット / クリップアートを繋ぎ合わせて画像を構成する
- ユーザーに「エージェントの説明をスクリーンショットして」と提案する
- 別の成果物 (例: Markdown の仕様書) を生成して、それを結果と呼ぶ
ユーザーがこれらの代替出力のいずれかを求めている場合、それは別の依頼であり、明示的にそれを要求すべきです。30x-image スキルは gpt-image-2 で生成された PNG のみを出力します。例外はありません。
3 つのモード
モード 1: init — あらゆる入力ソースから DESIGN.md を構築する
マルチソース入力: URL / 説明 / スクリーンショット / Figma Variables / Tailwind 設定 / tokens.json / CSS カスタムプロパティ / 既存の DESIGN.md / npx getdesign add <brand>。出力: 当社の 9 セクション形式 の完全な DESIGN.md (examples/awesome-vendor/stripe/DESIGN.md の形に一致、Google の 8 セクション仕様ではありません — 当社は ## 8. Responsive Behavior を追加して拡張し、独自のセクション順序を維持しています)。保存先:
- プロファイルディレクトリが存在する場合は
$HOME/.30x-image/profiles/<brand-slug>/DESIGN.md - それ以外の場合はカレントディレクトリの
./DESIGN.md
手順
ステップ 1 — 生成パスを選ぶ (優先順):
-
npx getdesign add <brand>— ユーザーのブランドが 60 以上の公開ライブラリ (Stripe / Linear / Notion / Apple / Tesla / Nike / Spotify / Starbucks / など) にある場合、すぐに使える DESIGN.md を取得します。これが最も高品質なパスです — 可能な限りこれを使用してください。taste:ブロックで補強します (ステップ 3 を参照)。 -
Stitch MCP — Google の無料公式ツール (月 350 回生成)、URL / スクリーンショット / 説明をネイティブに処理します。セットアップ:
- ユーザーが Stitch 設定 (https://stitch.withgoogle.com) の API セクションで API キーを生成する
- ユーザーが Stitch の公式ドキュメントに従って Stitch MCP をインストールし (「Stitch MCP setup」で検索)、API キーを Codex セッションに提供する
- ユーザーが Codex を再起動すると、エージェントが Stitch MCP を利用できるようになる
- エージェントがユーザーの入力 (URL / スクリーンショット / 説明) で Stitch MCP を呼び出し、DESIGN.md を受け取り、当社の 9 セクション形式に正規化する (ステップ 2 を参照)
- ユーザーが Stitch をセットアップできない / しない場合のフォールバック: 直接 LLM init (以下のパス 3) に切り替えてください。Stitch でブロックしないでください。
-
LLM 初期化(エージェントによる自己合成) — getdesign も Stitch も 適用できない場合(またはユーザーが急いでいる場合)。エージェントは入力ソースを読み、 Stripe の DESIGN.md の形式に従って DESIGN.md をゼロから作成します:
- URL → ページを取得し、CSS /
<theme-color>からパレットを抽出し、font-family宣言からタイポグラフィを抽出し、スクリーンショットを撮って 雰囲気を視覚的に検証し、9 つのセクションの文章を書く - 説明文 → LLM のみの推論。信頼度は低め。すべての値に
# auto-inferred, please reviewを必須とする - スクリーンショットのみ → ビジョン LLM が色 + タイポグラフィの雰囲気を抽出
- Tailwind config / tokens.json / CSS カスタムプロパティ → 直接 frontmatter にパースし、その後 LLM がそれらのトークンに基づいて セクション 1〜8 の文章を書く
- Figma Variables → REST API 呼び出し(ユーザー提供トークン)、 変数を frontmatter にパースし、その後 LLM が文章を作成
- 既存の DESIGN.md(Google 形式 / 外部ソース) → セクション名を
独自の 9 セクション形式に変換し、
taste:ブロックで補強する
- URL → ページを取得し、CSS /
ステップ 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: パラメータは主観的なブランド判断です。エージェントの戦略:
- 利用可能なすべての証拠(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(解決できないトークン参照) — 修正必須warning: missing-primary / contrast-ratio / orphaned-tokens / section-order — 指摘info: token-summary — ユーザーに表示
broken-ref エラーが現れた場合、一度だけ自動修正パスを試み(最も近いトークンを使って
欠落した参照を解決)、その後再度 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 を読み込む → 組み合わせ軸 + アンチスロップの
禁止項目でプロンプトを組み立てる → image_generation ツールを呼び出す → 画像 + マニフェストを保存する。
モード 3: edit — すでに生成された画像に対する外科的な領域編集 (M3)
既存の PNG (通常は前回のモード 2 の実行結果) + 領域指定子 + 新しいプロンプトを入力 → 指定した領域のみが変更され、それ以外のすべてのピクセルは 1:1 で保持された新しい PNG を生成します。Codex の image_generation ツール上の gpt-image-2 の input_image_mask パラメータによって実現されています。
これが解決するユースケース:
- 「候補 2 は素晴らしいが、タグラインにタイプミスがある — 見出しだけを修正したい」
- 「スライド 5 の CTA ボタンが緑色になったが、Stripe の紫が必須とされている」
- 「ロゴの右下にウォーターマークのアーティファクトがある — そこだけを除去したい」
これが重要な理由: モード 3 がなければ、1 つのディテールを修正するにはテンプレート全体を再実行する必要があります (候補 4 つ、1 回の実行に 30 秒以上、残りの部分が同じクオリティを保つ保証はなし)。モード 3 は、気に入っている 99% をそのままに、気に入らない 1% だけに手を加えます。
ユーザーが generate を呼び出したとき
入力
- DESIGN.md のパス: 必須。cwd、
examples/、または$HOME/.30x-image/profiles/<brand>/DESIGN.mdのいずれかに存在する場合があります。解決の優先順位:- ユーザーが明示したパス
- cwd の
./DESIGN.md $HOME/.30x-image/active→ そのプロファイルの DESIGN.md- それ以外の場合はユーザーに選択を促す
- テンプレート:
logo / ad-creative / slide / product-mockup / marketing-with-text / lighting-transform / scene-with-person / carouselのいずれか (carousel はマルチスライドです: 後述のステップ 4·B を参照)。 解決の優先順位:- ユーザーがテンプレートを明示的に指定した → それをそのまま使用する。
- ユーザーのブリーフが曖昧だが 8 つのうちのいずれかに対応する → エージェントが最も近いものに自動分類する (これが推奨される経路です。テンプレートが存在するのは、クオリティを高める軸 + クックブックの骨組みを提供するからです)。
- ブリーフが 8 つのテンプレートのいずれにも本当に当てはまらない場合 (例: 抽象的な社内ビジュアル、マーケティング意図のない概念図) → フリーフォームモードにフォールバックする: クックブック §2 の一般的なプロンプト rules + DESIGN.md のフロントマター + アンチスロップ、軸はなし (テンプレートがなければコミットすべき軸の定義もない)。フリーフォームはフォールバック専用です — テンプレートが適合する場合にデフォルトにしないでください。
- Jobspec: subject + copy.tagline + copy.cta + size + quality + n + mode
(
references/cookbook-7-templates.mdのデフォルトを上書き)
手順 (この順序で実行)
ステップ 1 — DESIGN.md を読み込む。
YAML フロントマター (token ブロック + taste:) を解析する。9 つのセクションすべてを読む。
特に注意を払う:
## 1. Visual Theme & Atmosphere(画像の雰囲気を与える)## 2. Color Palette & Roles(すべての色名 + 16 進数 + 役割)## 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: ブロックに基づいて、各軸からちょうど 1 つ選ぶ:
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 のデフォルト、jobspec から上書き):
size: 例: ad-creative なら 1024x1536quality: 探索なら low、最終なら highn: 探索なら 4、最終なら 1action: 新規なら "generate"、反復なら "edit"output_format: png
ステップ 4·B — カルーセルのマルチスライド処理 (template=carousel のみ)。
カルーセルは、1 つのジョブで image_generation を複数回呼び出す唯一のテンプレートです。手順:
- 共有システムプロンプトのプレフィックスを一度だけ組み立てる — ブランドデザインシステム (パレット / タイポグラフィ / グリッド)、パターン軸の選択、連続性メカニズム 軸の選択、テンションカーブの選択(軸 5)。このプレフィックスはすべてのスライドで同一です。
- スライドの役割とナラティブのビートを計画する:
- スライド 1 = カバー(カバースライドスタイル軸を使用)。
- スライド 2..(N-1) = 本文(本文スライドリズム軸を使用)。
- スライド N = CTA。
- テンションカーブ(軸 5)を適用して、各本文スライドにナラティブの
ビートを割り当てます: たとえば
Build-upなら、本文スライドは 2→N-1 で 緊張感をエスカレートさせます。Revealなら、スライド 2〜3 で情報を伏せ、 スライド 4..(N-1) で段階的に開示します。Linear arcなら、スライド 2=コンテキスト、 3=課題、4〜5=ソリューション、N-1=結果です。 - ユーザーがスライドごとの
copyを提供した場合: その順序を尊重し、 テンションカーブは視覚的な強調としてのみ重ねます(たとえばスライド N-1 は 見出しを大きくし、彩度の高い色にする — 「ペイオフスライド」)。 - ユーザーが
subjectのみを提供し、コピー作成をエージェントに任せた場合: エージェントはテンションカーブの要請を満たすコピーを必ず生成しなければ なりません。妥当性チェック: スライド N-1 はペイオフのように感じられますか? スライド 1 はそこへ引き込むフックになっていますか?
- すべてのスライドを独立した
action=generate呼び出しとして並列にファンアウトする — N 個の個別 PNG ファイルを生成し、決して単一の合成画像にしないでください。 他のすべてのテンプレートと同じロジックで、呼び出しが 1 回ではなく N 回になるだけです。 N 個のパネルを内部に配置した単一画像(コミックストリップ / グリッド スタイル)を生成しないでください。 各スライドは、ユーザーが LinkedIn / Instagram / X でスワイプシーケンスの 1 スライドとしてアップロードする、 スタンドアロンのフル解像度 PNG です。単一の合成画像を生成した場合、それは 誤りです — ユーザーはそれを分割できず、プラットフォームもカルーセルとして ページ分割しません:- スライドごとのプロンプトを構築 = 共有デザインシステムプレフィックス +
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 が「ウェブページレイアウト」モードに 陥り、スライドが gpt-image-2 で生成されたものではなく CSS レンダリングのように 見える可能性があります。各スライドは、ad-creative や logo とまったく同様に、 スタンドアロンの生成でなければなりません。 - スライド間の視覚的な一貫性は、画像参照チェーンではなく、共有プロンプト プレフィックス(ブランドパレット / タイポグラフィ / ビジュアル連続性 メカニズム軸の選択)からもたらされます。プレフィックスを信頼してください。
- N 回の呼び出しをすべて並列で発火 — 実時間 = 約 1 回の image_generation 呼び出し。
- 本文スライドが兄弟スライドと比べてブランドから逸脱した場合は、そのスライドの 共有プレフィックスを強化して修正します(より具体的なパレット / タイポグラフィ 指示)。action=edit に切り替えてはいけません。
- スライドごとのプロンプトを構築 = 共有デザインシステムプレフィックス +
- 各スライドを保存する —
candidates/slide-{N}.pngに(1.png/2.pngではなく — 明確にするためスライド番号付き)。 - manifest.json に記録:
n_slides、pattern、slide_roles[]、スライドごとの 完全なプロンプト、スライド 1 のハッシュ(連続性の参照)。
Step 5 — 出力を保存する。
デフォルトの場所: $HOME/.30x-image/profiles/<brand-slug>/marketing/<job-id>/
ファイル:
candidates/{1..n}.png(各候補)manifest.json(以下の構造を参照)
プロファイルディレクトリが存在しない場合(examples/ から実行している場合)、
カレントディレクトリの ./marketing/<job-id>/ をデフォルトとします。
Step 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": "..."
}
Step 7 — ユーザーに報告する。 伝える内容:
- 候補の場所
- どの軸の選択を確定したか(透明性)
- 任意: 最終パスとして「1 つを選択して action=edit、quality=high で再実行する」ことを提案 する。
- 任意: 外科的な編集が可能であることをリマインドする — 「いずれかの候補が 90% の出来だが 1 か所修正したい詳細(誤字 / 誤った色 / アーティファクト)がある場合、 編集モード(モード 3)でその部分だけを修正し、他はすべてそのままにできます。」
ユーザーが edit を呼び出したとき(モード 3 — 外科的リージョン編集)
入力
input_image: 必須。編集する PNG のパスです(通常は前回のモード 2 の実行結果、たとえばcandidates/2.pngやslide-3.png)。- 変更内容(4 通りの方法のいずれか — ユーザーにとって最も自然なものを選んでください):
- 自然言語による領域指定 —
region: "上部の見出し"/"CTA ボタン"/"右下隅"。エージェントがビジョンを使って領域を特定し、プログラムでマスクを生成します。最も自然な UX です。 - 正規化 bbox —
region_box: [x1, y1, x2, y2](0.0〜1.0 の 座標、原点は左上)。エージェントが矩形マスクを生成します。 ユーザーが正確な座標や「上部 20%」のような指定をする場合に使用します。 - ユーザー提供のマスク —
mask: ./my-mask.png。input_image と同じ 寸法で、編集する箇所は透明(alpha=0)、保持する箇所は不透明です。 Photoshop / Preview / Figma で塗り分けたユーザー向けです。 - 全体編集(マスクなし) —
global_prompt: "白黒にして"。 マスクなし、プロンプトのみ。⚠️ リスク: gpt-image-2 が画像全体を 再生成し、元画像から乖離する可能性があります。真に全体的な変更 (カラーグレーディング、時間帯、天気)にのみ使用してください。実行前にユーザーに警告してください。
- 自然言語による領域指定 —
prompt: マスクされた領域に何を表示するか(グローバルモードの場合は 全体の変更内容)。具体的に記述してください — たとえば"fix the text"ではなく"change tagline to 'Stop fraud before it starts.' in the same font and weight"のように。output_path: 省略可能。デフォルト: 入力と同じ場所に<input-name>-edited-<timestamp>.png。
手順(この順番で実行してください)
ステップ 1 — input_image を読み込み、検証します。
- ファイルが存在し、PNG であり、gpt-image-2 が読み取れることを確認します。
- その寸法(W × H)を読み取ります — マスクのサイズ決定に必要です。
ステップ 2 — 領域をマスク PNG に解決します。
| 領域の種類 | マスクの生成方法 |
|---|---|
自然言語(region: "...") | input_image を Codex のビジョン機能に通します。記述された要素のピクセル境界ボックスを特定します。同じ寸法の PNG を生成します: 対象領域は透明(alpha=0、RGBA 0,0,0,0)、それ以外は不透明(alpha=255)。シェル経由で Python+PIL を使用します。例: python -c "from PIL import Image, ImageDraw; ..."。 |
正規化 bbox(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 — image_generation ツールを input_image_mask 付きで呼び出します。
領域/bbox/マスク編集の場合(ステップ 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に保存します。 - モード 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 の文書化された動作より)
- 反復編集の「頑固さ」 — 同じ画像を続けて 2〜3 回以上編集すると、モデルは意味のある変更を加えなくなります。回避策: 3 回目の編集が反映されない場合は、Mode 2 で目的の変更をプロンプトに織り込んで、画像を新規に再生成してください。
- マスクは指針であり、絶対ではない — gpt-image-2 はマスクを指針として使用しますが、その正確な形状を完全な精度で従うとは限りません。エッジが保持領域にわずかににじむことがあります。ピクセル単位で完全な保持が必要な場合は、別の画像エディターでの合成を検討してください。
- 自己修正のハルシネーション — 画像に実際には存在しないものを編集するようユーザーが依頼した場合(例: QR コードが存在しないのに「QR コードを削除して」と依頼する)、モデルは存在しない要素をハルシネーションし、さらにそれを「修正」することがあります。マスクする前に、その領域が実際に存在するか視覚的に検証してください。
- マスクなしのグローバル編集によるドリフト —
global_prompt(マスクなし)を使用すると、モデルが画像全体を再生成するリスクがあります。真の保持のためには、たとえマスクが 1 つの小さな角を除いた画像全体であっても、常にマスクを提供してください。
品質基準(M0 合格基準)
生成された画像がオンブランドであるとは、次の場合です:
- frontmatter のプライマリカラーが目に見えて支配的である(CTA / アクセント)
- タイポグラフィスタイルが
## 3. Typography Rulesに一致している(例: Stripe = ライトウェイト 300、太字ではない) - anti-slop の禁止リストのいずれの項目にも違反していない
- ムード / 密度 / バリアンスが
taste:ブロックに一致している
手動で判定してどれか 1 つでも「いいえ」があれば — 反復してください(軸の再選択 / 制約の強化 / プロンプトへの明示的な anti-slop の追加)。
十分な情報がない場合
丁寧に拒否 / 確認してください:
- DESIGN.md が存在しない → 3 ステップのフォールバック(順番に試し、どれを採用するかをユーザーに伝えます):
npx getdesign list— そのブランドが公開の awesome-design-md ライブラリにあるか確認します(60 以上のブランド: Stripe / Linear / Notion / Vercel / Apple / Tesla / Nike / Spotify / Starbucks / Apple / Coinbase / など)。ある場合 →npx getdesign add <brand>— すぐに使える DESIGN.md を 1 つのコマンドで cwd に取得します。そのまま使用し、任意で軸のバイアス用にtaste:ブロック(5〜7 個の数値ブランドパラメータ)で補強します。- ブランドがライブラリにない →
initモード(M2)を実行するか、9 セクション形式 + frontmatter トークンブロック +taste:ブロックを使って DESIGN.md を手書きします(正規のリファレンスとしてexamples/awesome-vendor/stripe/DESIGN.mdを参照)。
- テンプレート名が間違っている → 有効な 8 つのテンプレート(カルーセルを含む)をリストする
- 誠実に分類を試みた結果、ユーザーのブリーフがいずれのテンプレートにも一致しない → フリーフォームのフォールバックに入る(拒否しない)。「一致するテンプレートがなかったため、ブランド DESIGN.md + anti-slop のみのフリーフォームを使用します」とユーザーに伝え、今回の実行では決定性が低下することを知らせる。
- 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