3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

仕様駆動開発(Kiro流SDD)でClaude Code用の画像生成Skillを作ってみた

3
Posted at

image.png

TL;DR

  • Claude Code の Agent Skill として、Azure の gpt-image-2 でテキストから画像を生成する仕組みを作りました。
  • 作り方は Kiro 流の仕様駆動開発(Spec-Driven Development, SDD)要件 → 設計 → タスク → 実装 を Claude Code のスラッシュコマンドで段階的に進めます。
  • 設計の肝は「Claude に API を手書きさせない」「パラメータは検証付き CLI 引数 + .env で既定値を設定」の2点。
  • この記事では、SDD の進め方スキルの構成Git からの導入 / グローバルインストール / .env 既定設定まで、実際の生成画像つきで解説します。

なぜ「仕様駆動開発」なのか

LLM にいきなり「画像生成スキルを作って」と頼むと、それっぽいコードは出てきますが、

  • API の呼び出しがハードコードされ、検証もエラー処理も曖昧
  • 要件と実装の対応が追えず、レビューもしづらい
  • あとから「ここ仕様どうだっけ?」が発生

になりがちです。

Kiro 流の SDD は、これを次の3フェーズ + 実装に分け、各フェーズで人間がレビュー・承認してから次へ進みます。

Phase 1: 要件 (requirements.md)   ← EARS 形式で「何を」
Phase 2: 設計 (design.md)         ← アーキテクチャと契約で「どう」
Phase 3: タスク (tasks.md)        ← 実装可能な単位に分解
Phase 4: 実装 (TDD)               ← テスト先行で1タスクずつ

ドキュメントが残るので、要件 ↔ 設計 ↔ タスク ↔ コードのトレーサビリティが確保できるのが最大の利点です。

この記事の /kiro:* コマンドは cc-sdd(OSS)が提供します。 cc-sdd は Kiro 互換の仕様駆動開発を Claude Code・Cursor・Gemini CLI などに導入するツールで、steering / spec-init / spec-requirements / spec-design / spec-tasks / spec-impl のスラッシュコマンドと、.kiro/ 配下のテンプレート・ルール一式を用意してくれます。導入はワンコマンドです。

npx cc-sdd@latest --lang ja --os windows   # mac / linux も指定可

本スキルも、この cc-sdd による仕様駆動開発で開発しました。


作るもの:gpt-image-2 画像生成 Skill

Claude Code 上で「画像を生成して」と頼むと、自動的にスキルが読み込まれ、Azure AI Foundry にデプロイした gpt-image-2 を呼び出して画像をローカル保存します。

設計の中心方針

  1. モデル(Claude)に API を手書きさせない。 生成ロジックは自己完結した Python スクリプトに閉じ込め、Claude は SKILL.md の手順どおりスクリプトを呼ぶだけ。再現性と安全性を担保します。
  2. パラメータは検証付き CLI 引数 + 妥当なデフォルト。 必須は --prompt のみ。size / quality / format などは検証付きの名前付き引数として公開し、未指定なら .env または組み込み既定を使います。

生成サンプル

実際にこのスキルで生成した画像です(プロンプトを変えるだけ)。

プロンプト(要約) 生成結果
秋の居心地のよいブックカフェ、暖かい照明、シネマティック sample-bookstore.png
夜明けの霧の山脈、パノラマ sample-mountain.jpg
ファッション誌ドラマ風の人物相関図(日本語ラベル付き) sample-relationship-chart.png

冒頭のバナーもこのスキルで生成 → 仕上げに Pillow でリサイズしたものです。


仕様駆動開発の実際の流れ

Claude Code のスラッシュコマンド(cc-sddのコマンドパック)で進めます。

Phase 0〜1:ステアリングと要件

/kiro:steering                      # プロジェクト全体のルール・文脈を生成
/kiro:spec-init gpt-image_specs.md
/kiro:spec-requirements gpt-image-2-skill

gpt-image_specs.mdはClaudeと壁打ちした要件書です。

要件は EARS 形式When ... the system shall ...)で記述します。たとえば size 制約の要件はこうなりました。

### Requirement 3: パラメータ値の検証(size 制約)
1. If `--size` の両辺のいずれかが 16px の倍数でないとき、
   then the 画像生成スクリプト shall API を呼び出さずにエラーを返す。
2. If `--size` の長辺が 3840px を超えるとき、then ... エラーを返す。
...

Phase 2:設計

/kiro:spec-design gpt-image-2-skill -y

このフェーズで Web 検索により Azure の公式 API 仕様を実際に確認しました(後述の「ハマりどころ」参照)。設計は次のレイヤード構成に。

ユーザー依頼 → Claude(SKILL.md)→ generate_image.py
                                      ├─ config     : .env / 環境変数読み込み
                                      ├─ validation : size 制約・依存関係の検証
                                      ├─ auth       : Entra ID 優先・APIキー代替
                                      ├─ client     : API 呼び出し・リトライ
                                      └─ storage    : Base64 デコード・保存

依存方向は Types → Config → Validation/Auth → Client → Storage、CLI が統括する一方向に固定。各層が単体テスト可能になります。

Phase 3:タスク分解

/kiro:spec-tasks gpt-image-2-skill -y

要件・設計から実装タスクを生成。各タスクには対応する要件 ID(_Requirements: 3.1, 4.2_)と境界(_Boundary:_)が付き、並列実行可能なタスクには (P) マークが付きます。

Phase 4:TDD 実装

/kiro:spec-impl gpt-image-2-skill 1,2,3   # タスク 1〜3 を実装

Kent Beck の RED → GREEN → REFACTOR に従い、テストを先に書いてから実装。最終的に 82 件のテストが通る状態になりました。

$ python -m pytest -q
......................................................... (82 passed)

セキュリティ設計:シークレットを「載せない」

生成 AI 連携で最重要なのが認証情報の扱いです。このスキルでは徹底して:

  • 認証情報は 環境変数 / .env からのみ取得
  • SKILL.md やスクリプトに直書きしない(モデルのコンテキストに載るため)
  • キー・トークンを stdout / stderr / ログ・例外メッセージに一切出力しない
  • 認証は Entra ID(キーレス)を優先し、API キーは代替
# auth.py(抜粋):Entra ID 優先・失敗時は API キーへフォールバック
def resolve_auth(api_key, credential=None):
    if credential is None:
        credential = _default_credential()
    if credential is not None:
        try:
            token = credential.get_token(TOKEN_SCOPE)
            return AuthHeader("Authorization", f"Bearer {token.token}")
        except Exception:
            pass  # Entra ID 不可 → API キーへ
    if api_key:
        return AuthHeader("api-key", api_key)
    raise AuthError("有効な認証情報が見つかりません ...")  # ← キー値は含めない

導入方法

1. Git リポジトリからダウンロード

git clone https://github.com/potofo/gpt-image.git
cd gpt-image

スキル本体はリポジトリ内の .claude/skills/gpt-image-2/ にあります(SKILL.md / scripts/ / requirements.txt で自己完結)。

2. グローバルインストール(全プロジェクトで使う)

個人用スキルディレクトリ ~/.claude/skills/ にコピーすると、どのプロジェクトを開いてもスキルが有効になります。

macOS / Linux

mkdir -p ~/.claude/skills
cp -r .claude/skills/gpt-image-2 ~/.claude/skills/
pip install -r ~/.claude/skills/gpt-image-2/requirements.txt

Windows (PowerShell)

New-Item -ItemType Directory -Force "$env:USERPROFILE\.claude\skills" | Out-Null
Copy-Item -Recurse -Force ".claude\skills\gpt-image-2" "$env:USERPROFILE\.claude\skills\"
pip install -r "$env:USERPROFILE\.claude\skills\gpt-image-2\requirements.txt"

コピー後、Claude Code を再起動すると gpt-image-2 スキルが認識されます。「画像を生成して」と頼めば自動で読み込まれます。

プロジェクト単位で使いたい場合は、.claude/skills/gpt-image-2/ をそのプロジェクトに置くだけでOKです。

3. デフォルトの環境設定(.env

認証情報と生成パラメータの既定値は .env から読み込めます。テンプレートをコピーして編集します。

cp .env.example .env   # Windows は Copy-Item .env.example .env

.env の探索ルール:

  • スキル実行時、カレントディレクトリから上位へ辿って最初の .env を使用
  • OS 環境変数が優先.env は未設定分のみ補完

Azure 接続設定

# 必須
AZURE_OPENAI_ENDPOINT=https://<resource>.openai.azure.com
AZURE_OPENAI_DEPLOYMENT=gpt-image-2
# API キー認証を使う場合のみ(未設定なら Entra ID キーレス認証)
AZURE_OPENAI_API_KEY=
# 既定: 2025-04-01-preview(gpt-image-2 には 2025-04-01-preview 以降が必須)
AZURE_OPENAI_API_VERSION=2025-04-01-preview

生成パラメータの既定値(地味に便利)

GPT_IMAGE_* で、よく使う設定を .env に固定できます。優先順位は CLI 引数 > .env > 組み込み既定

# 常に横長・高画質 PNG を ./assets に出力する例
GPT_IMAGE_SIZE=1536x1024
GPT_IMAGE_QUALITY=high
GPT_IMAGE_FORMAT=png
GPT_IMAGE_OUTPUT_DIR=./assets
パラメータ 環境変数 既定 取り得る値
size GPT_IMAGE_SIZE 1024x1024 WxH(制約あり)
quality GPT_IMAGE_QUALITY high low/medium/high
format GPT_IMAGE_FORMAT png png/jpeg
background GPT_IMAGE_BACKGROUND auto auto/transparent
compression GPT_IMAGE_COMPRESSION 100 0100(JPEG のみ)
n GPT_IMAGE_N 1 110
output GPT_IMAGE_OUTPUT_DIR ./images 任意のパス

これで --prompt だけ渡せば、毎回フラグを書かずに好みの設定で生成できます。

注意: .env は秘密情報を含むので 絶対にコミットしない.gitignore.env を入れ、.env.example だけを追跡しましょう。


使い方

Claude Code から(自然言語)

「Azure で水彩画風の富士山の画像を作って」

と頼むだけ。Claude がスキルを読み込み、スクリプトを実行して保存先パスを返します。

CLI から直接

# 既定の正方形 PNG を ./images に
python scripts/generate_image.py --prompt "桜並木の通学路、アニメ風"

# 透過 PNG(ロゴ・アイコン向け)
python scripts/generate_image.py --prompt "ミニマルな山のロゴ" \
  --background transparent --format png

# 複数枚を任意フォルダへ
python scripts/generate_image.py --prompt "猫のキャラクター案" --n 4 --output ./out

成功すると保存ファイルの絶対パスが stdout に出ます。ファイル名は <プロンプト由来のタイトル>_<タイムスタンプ>_<連番>.<拡張子> で一意になります。


ハマりどころ(実際に踏んだ罠)

仕様駆動開発の「設計フェーズで一次情報を確認する」習慣のおかげで、事前に潰せたもの/実装中に気づいたものを共有します。

1. gpt-image-2 の size 制約が独特

任意解像度をサポートしますが、次をすべて満たす必要があります。

  • 両辺が 16px の倍数
  • 長辺 3840px 以下
  • アスペクト比 3:1 以下
  • 総ピクセル数 655,360〜8,294,400

たとえば「1208×512 のバナーを」と頼まれても、1208 は 16 の倍数でなく、総画素も下限割れ。そこで 1280×512 で生成し、Pillow で 1208×512 にリサイズする、という運用にしました。検証ロジックが API 呼び出し前にエラーを返すので、無駄な課金を防げます。

2. api-version が古いと gpt-image-2 が動かない

ポータルが例示する 2024-02-01 は DALL·E 3 世代のもので、gpt-image-2 では 2025-04-01-preview 以降が必須。設計時の Web 調査で気づき、既定値を 2025-04-01-preview にしました。

3. ドキュメントの表記ゆれ

公式ドキュメントのコード例コメントに background / output_format を「GPT-image-1 only」と書く箇所と、本文で「両対応」と書く箇所があり、表記がゆれています。実装時は使用する api-version で実挙動を検証するのが安全です。

4. DefaultAzureCredential の冗長ログ

Entra ID が使えない環境だと azure-identity が長大なエラーログを stderr に吐きます(機能的にはフォールバックして成功します)。気になる場合はログレベル調整で抑制可能です。


まとめ

  • 仕様駆動開発で作ると、要件 → 設計 → タスク → コードが一直線につながり、レビューも保守もしやすい。
  • Agent Skill の勘所は「Claude に API を手書きさせない」「検証 + デフォルトを .env で外出し」。
  • Azure gpt-image-2 特有の size 制約 / api-version は設計フェーズの一次情報確認で先回りできた。

生成 AI を「呼ぶ側」のツールを作るとき、仕様駆動開発はかなり相性が良いと感じました。Claude Code のスラッシュコマンドで段階的に進められるので、個人開発でも導入のハードルは低いです。

リポジトリ

git clone https://github.com/potofo/gpt-image.git
  • スキル本体: .claude/skills/gpt-image-2/
  • 仕様一式: .kiro/specs/gpt-image-2-skill/(requirements / design / tasks / research)
  • ライセンス: MIT

この記事のサンプル画像はすべて本スキル(Azure gpt-image-2)で生成しました。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?