TEKION Slide Generator v4
実行モード
mode: auto # Pre-flight〜Phase 5を承認なしで連続実行
pause_only_on: [route_ambiguous, api_key_missing]
chain_commands: true # bashは && で連結
定数
SKILL_DIR="<path-to-this-skill>"
PYTHON="python3"
前提条件
- Python 3.10+
- Gemini API Key(
.env.localまたはGEMINI_API_KEY環境変数) —--provider gemini時 - OpenAI API Key(
.env.localまたはOPENAI_API_KEY環境変数) —--provider openai時 - SubAgent定義(ルートB使用時):
~/.claude/agents/nanobanana-prompt-generator-subagent.md(setup.shが${SKILL_DIR}/agents/から自動インストール)
初回セットアップ:
bash ${SKILL_DIR}/scripts/setup.sh
言語ルール
display_language: "ターゲット聴衆に合わせる(素材の言語ではない)"
target_fields: [title, subtitle, key_message, content]
english_allowed: "固有名詞のみ (Cursor, MCP等)"
content_suffix: "※スライド上の全テキストは{lang}で表示すること。"
スタイル選択
Phase 3 のプロンプト生成で --style フラグを指定、またはスライド毎に JSON で _style を付与することで、
スライドの雰囲気(文字量・ビジュアル比率・余白)を切り替えられます。
| 判断基準 | スタイル | テンプレート |
|---|---|---|
| 「登壇」「ピッチ」「Keynote風」「ビジュアル重視」「写真主役」 | visual | prompt_template_visual.j2 |
| 「営業資料」「提案書」「バランス」「図解と文字の両立」(デフォルト) | balanced | prompt_template_balanced.j2 |
visual スタイル(ピッチデッキ風)
- Apple Keynote / TED Talk の余白美学、Less is more
- タイトル15文字 + キーメッセージ1文(最大2行)
- 画面の**60-80%**を1つの大胆なビジュアル(全面写真・巨大数字・大きなシンボル)
- 複数カード・網羅リストは禁止、大胆な余白
- 用途: 登壇・ピッチ・表紙・中扉・感情に訴える1枚
balanced スタイル(営業資料・提案書風/デフォルト)
- Pitch.com / MorningBrew / Figma Slides の洗練
- 見出し + 3-5項目の簡潔な箇条書き / 2-3ブロックの図解
- テキスト40-60% / ビジュアル40-60%のバランス
- 情報網羅は求めず、要点を絞る
- 用途: 営業資料・提案書・プラン比較・実績紹介(今回のVibeCoder Bootcamp資料相当)
スライド毎のオーバーライド(_style)
slides_plan.json で個別指定可能:
{
"source_file": "00_cover",
"_style": "visual", ← 表紙だけ visual にする
"title": "...",
"content": "..."
}
_style が未指定なら --style のデフォルトを継承。
ユースケース別レコメンド
| 用途 | 推奨 | 備考 |
|---|---|---|
| 登壇用ピッチ資料 | visual | 表紙・章扉・キーメッセージを visual で |
| 営業資料・提案書 | balanced | 今回の VibeCoder Bootcamp 相当 |
| 表紙+本編の混在 | --style balanced + 表紙だけ _style: visual | 最も良く使うパターン |
ルート選択
| 判断基準 | ルート |
|---|---|
| 「サクッと」「一括で」「まとめてスライドにして」 | B(高速) |
| 「いい感じに」「ちゃんと」「プレゼン用に」 | A(高品質) |
| 迷ったら聞く: 「丁寧に作る?サクッと作る?」 | — |
- ルートA: 10-15枚、見た目重視。JSON手動作成5-10分 + 生成2-3分
- ルートB: 20枚以上、速度重視。SubAgent並列JSON自動生成、全自動2-3分
Provider選択
デフォルトは OpenAI (gpt-image-2)。特段の理由がない限り OpenAI を使う。
| 判断基準 | Provider |
|---|---|
| 指定なし(デフォルト) | openai |
| 「OpenAIで」「GPTで」「gpt-image-2で」 | openai |
| 「Geminiで」「nano bananaで」「3.1 Flashで」 | gemini |
| 日本語テキスト精度・営業資料・提案書 | openai |
| Google検索グラウンディング必要 | gemini |
| 20枚以上の大量生成でコスト抑えたい | gemini(並列度20・無料枠) |
| 透明背景 / 参考画像多数(最大16枚) | openai |
比較したい場合: compare_providers.py で同じプロンプトで両方生成(後述)。
レート制限の目安(OpenAI)
| Tier | IPM | 推奨--max-parallel |
|---|---|---|
| 1 | 5 | 3 |
| 2 | 20 | 8 |
| 3 | 50 | 10 |
| 4 | 150 | 20 |
| 5 | 250 | 20+ |
Pre-flight
.env.localからGEMINI_API_KEYを確認(プロジェクトルート →~/.claude/.env.localの順)- 未設定 → STOP(APIキー取得案内: https://aistudio.google.com/apikey)
- 依存チェック:
python3 -c "import PIL, pptx, requests, jinja2; print('OK')" 2>/dev/null || bash ${SKILL_DIR}/scripts/setup.sh
Phase 0: セッション準備
TIMESTAMP=$(date +%Y-%m-%d_%H%M) && OUTPUT_DIR="[指定された出力先]" && SESSION_DIR="${OUTPUT_DIR}/slides_output/${TIMESTAMP}" && mkdir -p ${SESSION_DIR}/{json,prompts,images}
Phase 1: デザインガイドライン作成
テンプレート: ${SKILL_DIR}/references/design_guidelines_template.md
プリセット使用時:
design-setup スキルでブランドを設定済みなら references/presets/.active_preset にプリセット名が記録されている。それを優先し、無ければ example-preset.md にフォールバックする。
ACTIVE_PRESET_FILE="${SKILL_DIR}/references/presets/.active_preset"
if [ -f "${ACTIVE_PRESET_FILE}" ]; then
PRESET_NAME=$(cat "${ACTIVE_PRESET_FILE}")
PRESET_PATH="${SKILL_DIR}/references/presets/${PRESET_NAME}"
[ -f "${PRESET_PATH}" ] || PRESET_PATH="${SKILL_DIR}/references/presets/example-preset.md"
else
PRESET_PATH="${SKILL_DIR}/references/presets/example-preset.md"
fi
cp "${PRESET_PATH}" "${SESSION_DIR}/design_guidelines.md"
echo "Using preset: $(basename "${PRESET_PATH}")"
カスタム作成時 — テンプレート参照し以下を決定:
- カラーパレット(テーマに合った色)
- 写真スタイル(ターゲット層の年代・性別・シーン)
- トーン(1-2文で方向性)
- フォントサイズ(ターゲットに応じて調整)
cat > ${SESSION_DIR}/design_guidelines.md << 'EOF'
[カスタマイズした内容]
EOF
Phase 2: slides_plan.json 作成(最重要)
route_a: 手動作成
入力を読み、各スライドの content を丁寧に書く。
content に含める項目:
<!-- Pattern X: 説明 -->— レイアウトヒント- 表示テキスト全文(タイトル、箇条書き、数値データ)
- 背景写真指示(被写体、構図、雰囲気)
- 図解・アイコン・グラフの内容
- カラー使い分け(アクセント色の配置)
- 言語強制:
※スライド上の全テキストは{lang}で表示すること。
構成目安: 表紙(G) → 課題提起(C/D) → ソリューション(B/C) → 市場(J) → ビジネスモデル(E) → 差別化(H/A) → ロードマップ(I) → まとめ(D) → CTA(G)
route_b: SubAgent並列
- MDファイルを Glob で検出
- 3-5個ずつチャンク分割
- 各チャンクに
nanobanana-prompt-generator-subagentを並列起動(同一メッセージ内で複数Task呼び出し) - 統合:
${PYTHON} ${SKILL_DIR}/scripts/merge_chunks.py \
--input-dir ${SESSION_DIR}/json \
--output ${SESSION_DIR}/json/slides_plan.json
グラウンディング制御
_grounding | 条件 |
|---|---|
true | 実在する製品・都市・ブランド・市場データ |
false(デフォルト) | 抽象図解・テキスト中心・表紙/中扉・オリジナルイラスト |
JSONスキーマ
{
"slides": [
{
"slide_number": 0,
"source_file": "00_cover",
"title": "タイトル",
"subtitle": "サブタイトル",
"content": "<!-- Pattern G --> ...",
"key_message": "核心メッセージ1文",
"_grounding": false
}
],
"total_slides": 12
}
フィールド:
- 必須:
slide_number(数値),source_file(文字列),title,subtitle,content - オプション:
key_message(文字列),_grounding(真偽値) - 禁止:
slide_type,layout,visual_description(デザイン判断はGeminiが行う)
命名規則: 表紙 "00_cover" / 本編 "01_xxx"〜"97_xxx" / まとめ "98_summary" / CTA "99_cta"
バリデーション
cat > ${SESSION_DIR}/json/slides_plan.json << 'JSONEOF'
{作成したJSON}
JSONEOF
${PYTHON} ${SKILL_DIR}/scripts/validate_slides_json.py --file ${SESSION_DIR}/json/slides_plan.json
Phase 3: プロンプト生成 + グラウンディングマップ
.active_style ファイル(design-setup が書き出す)があればその値を --style に渡す。無ければ balanced。
ACTIVE_STYLE_FILE="${SKILL_DIR}/references/presets/.active_style"
if [ -f "${ACTIVE_STYLE_FILE}" ]; then
STYLE=$(cat "${ACTIVE_STYLE_FILE}")
[ -z "${STYLE}" ] && STYLE=balanced
else
STYLE=balanced
fi
${PYTHON} ${SKILL_DIR}/scripts/generate_prompts_from_json.py \
--session-dir ${SESSION_DIR} \
--json-file json/slides_plan.json \
--output-dir prompts \
--design-guidelines ${SESSION_DIR}/design_guidelines.md \
--style "${STYLE}" \
--image-size 2K
スタイル切替:
--style balanced(デフォルト) — 営業資料・提案書風--style visual— ピッチデッキ風(文字極少、ビジュアル主役)- JSON で個別指定 — 各スライドに
"_style": "visual"を書けば、そのスライドだけ Visual に
JSONでの混在例:
{"source_file": "00_cover", "_style": "visual", "title": "...", "content": "..."},
{"source_file": "01_body", "title": "...", "content": "..."}
→ 表紙だけ Visual、本編は --style のデフォルト(balanced)を継承。
Phase 3.5: プロンプト検証(任意)
${PYTHON} ${SKILL_DIR}/scripts/render_test.py \
--session-dir ${SESSION_DIR} \
--design-guidelines ${SESSION_DIR}/design_guidelines.md
Phase 3.7: リファレンス画像マップ作成(任意)
特定のスライドに参照画像(キャラクター・ロゴ・写真等)をGeminiに渡したい場合、リファレンス画像マップを作成する。
cat > ${SESSION_DIR}/reference_image_map.json << 'JSONEOF'
{
"Ryoko": "/path/to/ryoko_avatar.jpeg",
"5-1.1_オープニング_07": "/path/to/specific_image.png"
}
JSONEOF
マッチングルール:
- キーがスライドのベース名に部分一致すれば適用される
- 例:
"Ryoko"→5-3.6_総合ケーススタディ_Ryoko_01.pngにマッチ - 完全一致キーが優先される
ユーザーが画像を添付した場合、${SESSION_DIR}/images/ にコピーしてマップに登録する。
Phase 4: スライド画像生成
OpenAI GPT-image-2(デフォルト)
if [ -f .env.local ]; then source .env.local; elif [ -f ~/.claude/.env.local ]; then source ~/.claude/.env.local; fi && \
${PYTHON} ${SKILL_DIR}/scripts/generate_slides_parallel.py \
--prompts-dir ${SESSION_DIR}/prompts \
--output-dir ${SESSION_DIR}/images \
--api-key "${OPENAI_API_KEY}" \
--max-parallel 10 --max-retries 3 \
--image-size 2K \
--logo ${SKILL_DIR}/assets/