Inside GoClaw — v3.11.0 リリース

Codex OAuth で GPT Image 2 によるネイティブ画像生成

ChatGPT サブスクリプション(Plus / Pro / Team / Enterprise)にはすでに gpt-image-2 がクォータに含まれています — Plus は十分な上限、Pro は最高上限と優先処理付き。

PR #1002 は GoClaw の create_image ツールを Codex OAuth 経由のネイティブパイプラインに接続します。ここでの Codex は、GoClaw が API キーなしで OpenAI Responses API を呼び出すために使用している OAuth フローです。

GoClaw コントリビューターの Richard Ng 氏による gpt-image-2-pro-max スキルは、MIT ライセンスのオープンソースで、Claude Code Skill 仕様に準拠し、GoClaw の Skill システムと互換性があります。スキルディレクトリを ZIP 圧縮してダッシュボードからアップロードすれば、エージェントがすぐに使えます。コーパス内の 3,000 以上のプロンプトテンプレートは Twitter/X クリエイターのものです。スキルは検索を高速化するためにインデックスを作成するだけです。PR #1002 とこのスキルを組み合わせることで、エージェントはスキルを読み込み、プロンプトを自分でブレインストーミングして create_image を呼び出し、ChatGPT サブスクリプションクォータ経由でポスタークオリティの画像を生成できます。API 使用料は発生しません。

01PR #1002 以前の問題

create_image は API キーでしか動作しなかった

PR #1002 以前、GoClaw の create_image ツールは credentialProvider インターフェース経由でプロバイダーを検索していました — つまりプロバイダーは APIKey() stringAPIBase() string の 2 つのメソッドを実装している必要がありました。CodexProvider は OAuth フローを使用しているため、これら 2 つのメソッドを意図的に実装していません。トークンは refresh_token グラントで更新されます(internal/oauth/token.go を参照)。デフォルトのバックエンド URL https://chatgpt.com/backend-api(定数 DefaultProviderAPIBase)は内部専用であり、ツール層が触れることのできるクレデンシャルサーフェスには含まれません。

その結果: ChatGPT Plus/Pro サブスクリプションにはクォータに gpt-image-2 が含まれており、ウェブ(chatgpt.com/images)や Codex CLI からは呼び出せるのに、GoClaw のエージェントからは APIKey()/APIBase() チェックで create_image がブロックされるため呼び出せませんでした。ユーザーは並行する API キーパスを使わざるを得ませんでした。最も人気だったのは OpenRouter 経由の Gemini Nano Banana 2 で、その理由は:

GoClaw のデフォルトチェーン imageGenModelDefaults は各プロバイダーを 1 つのモデルにマッピングしています: openai → gpt-image-1.5openrouter → google/gemini-2.5-flash-image(Nano Banana 2)、gemini → gemini-2.5-flash-imageminimax → image-01dashscope → wan2.6-imagebyteplus → seedream-5-0-260128。プロバイダーの優先順位は openrouter → gemini → openai → minimax → dashscope → byteplus。すべてそれぞれの API キーが必要です。

問題: ユーザーはコーディングワークフローのために ChatGPT Plus/Pro を毎月すでに支払っており、gpt-image-2 は最高品質の画像生成モデルの 1 つ — しかしそのクォータはエージェントから使えず、眠ったままでした。

PR #1002 以前PR #1002 以降
単一パス: API キー(APIKey() + APIBase() 必須)OAuth トークン経由のネイティブパスが追加openaigeminiopenrouter などの API キーパスは引き続き利用可)
openai プロバイダー + OPENAI_API_KEY 経由の gpt-image-1.5api.openai.com/v1/chat/completions を呼び出す); OpenRouter 経由の Nano Banana 2Codex OAuth 経由の gpt-image-2(デフォルト)+ gpt-image-1.5(レガシー)、chatgpt.com/backend-api/codex/responses を呼び出す; サブスクリプションクォータを消費
画像ごとに従量課金が発生サブスクリプションで支払い済み
タイムアウト 120s × 2 リトライタイムアウト 600s × 1 リトライ
プロンプト出所情報なしPNG tEXt チャンク埋め込み
1 層ゲート(プロバイダーにクレデンシャルがあるか?)2 層(ケーパビリティ + エージェント設定)

プロンプトエンジニアリングの分散

gpt-image-2 コミュニティは X/Twitter でプロンプトテンプレートを散発的に共有しています。EvoLinkAI が awesome-gpt-image-2-prompts リポジトリ(約 370 ケース)を管理していますが、データは README とツイートリンクの形式で、検索エンジンはありません。エージェントがそれを活用するには手動で読み込んでフィルタリングする必要があります。

02OAuth 向けネイティブ画像アーキテクチャ

PR #1002internal/providers/native_image.go に新しいインターフェースを追加します。エンドツーエンドのフローは以下の図のとおりです。

OAuth プロバイダー向けネイティブ画像パス Tool: create_image · MediaProviderChain · 2-tier gate AGENT LOOP · buildFilteredTools() GATE 1 Loop.allowImage Generation == true AND GATE 2 provider.Capabilities() .ImageGeneration == true append imageGenToolDef tool available to model Tool: create_image user request → tool call MediaProviderChain.ExecuteWithChain loop over chain entries · resolve provider Provider implements NativeImageProvider? YES · OAuth NO · API-key params["_native_provider"] = rawProvider (Codex OAuth) CodexProvider .GenerateImage(ctx, req) POST chatgpt.com/backend-api /codex/responses stream:true · tool_choice forced parseNativeImageSSE SSE → base64 → PNG bytes guard: cp != nil credentialProvider check APIKey() + APIBase() openai · gemini · openrouter · … Provider.Chat(messages, tools) with image_generation tool api.openai.com/v1/... parse JSON / tool result → PNG bytes Result.Media → bus → UI OAuth path API-key path

実際のコードは短いインターフェースです。

type NativeImageProvider interface {
    GenerateImage(ctx context.Context, req NativeImageRequest) (*NativeImageResult, error)
}

create_image ツールは MediaProviderChain 経由でプロバイダーを検索します。チェーンエントリが Codex OAuth の場合、生のプロバイダーオブジェクトが params["_native_provider"] に渡されます。callProvider 内では:

if rawProvider, ok := params["_native_provider"]; ok {
    if np, ok := rawProvider.(providers.NativeImageProvider); ok {
        // ネイティブパス — APIKey/APIBase 不要
        return np.GenerateImage(ctx, ...)
    }
}
if cp == nil {
    return error("provider does not expose API credentials")
}
// openai、gemini、minimax、dashscope、byteplus、openrouter のクレデンシャルパス

ネイティブチェックは cp == nil ガードの前に実行されます。OAuth プロバイダーは意図的にクレデンシャルを公開しません。順序を逆にすると、リクエストは誤った方向を指すエラーで失敗します —— ユーザーは「クレデンシャル不足」と見てクレデンシャル設定に走りますが、本当の原因はネイティブパスの間違いです。

2 層ゲート

image_generation ツールは以下の 2 つの条件が両方満たされた場合にのみリクエストに付与されます。

  1. プロバイダーケーパビリティ: プロバイダーが CapabilitiesAware を実装し、Capabilities().ImageGeneration == true であること。Codex プロバイダーは OpenAI Responses API が image_generation ツールをサポートしているため true にハードコードされています。
  2. エージェント設定: AgentConfigAllowImageGeneration フィールド(デフォルト true)。管理者は other_config.allow_image_generation: false を設定して画像生成を禁止できます。

loop_tool_filter.go::buildFilteredTools のロジック:

if l.allowImageGeneration {
    if aware, ok := l.provider.(providers.CapabilitiesAware); ok {
        if aware.Capabilities().ImageGeneration {
            toolDefs = append(toolDefs, imageGenToolDef)
        }
    }
}

imageGenToolDef はフラグ {Type: "image_generation"} だけ — nameparameters スキーマもありません。通常の function calling ではクライアントがすべてを定義する必要があります(例: {type: "function", function: {name, description, parameters}})が、ここで image_generation は Codex Responses API の組み込みツールです — サーバーがスキーマを付与し、ハンドラーを実行します。クライアントはセンチネルで有効化するだけで済みます。

03Codex Responses API ワイヤーフォーマット

エンドポイント: POST {apiBase}/codex/responses

map[string]any{
    "model":        "gpt-5.4",  // 親 LLM(画像モデルではない)
    "stream":       true,        // 必須 — false は HTTP 400 で拒否される
    "store":        false,
    "instructions": "Generate an image matching the user's description using the image_generation tool. Return only the image; do not describe it in text.",
    "input":        []any{...user message...},
    "tools": []map[string]any{{
        "type":          "image_generation",
        "action":        "generate",
        "model":         "gpt-image-2",   // 画像モデルはここ
        "output_format": "png",
        "size":          "1024x1024",
    }},
    "tool_choice": map[string]any{"type": "image_generation"},  // force tool call
}

注意点:

レスポンスのパース

メインパスは SSE ストリームです(stream:true が必須のため)。エンドツーエンドのフロー:

Codex Responses API · request → SSE stream → parse Agent loop CodexProvider chatgpt.com/codex GenerateImage(ctx, req) build request body stream:true · tool_choice forced POST /codex/responses SSE STREAM · loop data: response.created data: response.in_progress data: output_item.done item.result = base64 PNG data: response.completed [DONE] parseNativeImageSSE → base64 decode → PNG bytes return NativeImageResult サーバーが予期せず raw object を返した場合の防御的な非ストリーミング JSON パースフォールバック

コードにはまだ非ストリーミング JSON パースのフォールバックがあります。サーバーが予期せず生の JSON オブジェクト(data: 行でなく)を返した場合、parseNativeImageResponseoutput[] を走査し、type == "image_generation_call" を見つけて result を base64 デコードします。stream:false を設定してこのパスをトリガーすることはできません — リクエストは先に HTTP 400 で拒否されるためです。

SSE パス: data: 行をスキャンし、2 つのイベントを優先します。

for line := range bytes.SplitSeq(data, []byte("\n")) {
    if !bytes.HasPrefix(line, []byte("data: ")) { continue }
    payload := line[len("data: "):]
    if bytes.Equal(payload, []byte("[DONE]")) { break }
    // ... イベントをアンマーシャル、event.Type で switch
}

04モデルホワイトリスト + チェーン設定

サーバーサイドのホワイトリスト

var allowedImageModels = map[string]bool{
    "gpt-image-2":   true, // デフォルト — 最新品質
    "gpt-image-1.5": true, // レガシーフォールバック
}

ValidateImageModel は他の値(例: dall-e-3)をプロバイダーレベルで即座に拒否します — アップストリームに黙って拒否させません。ユーザーはチェーンエントリパラメーター image_model でモデルを選択します。この値は NativeImageRequest.ImageModel に渡され、検証されてから Responses API リクエストの tools[0].model に付与されます。

gpt-image-1.5 に関する注意: PR #1002 以前、gpt-image-1.5openai プロバイダーのデフォルトモデル(imageGenModelDefaults["openai"] = "gpt-image-1.5")でした — API キーパスで動作し、OPENAI_API_KEYapi.openai.com/v1/chat/completions を呼び出していました。PR #1002 以降、このモデルはネイティブパスのホワイトリストにレガシーフォールバックとして残ります — エージェントは Codex OAuth 経由で選択できます。PR は新しいパスを追加するだけで古いモデルを削除しません。両方のモデルをネイティブで実行でき、デフォルトは gpt-image-2 です。

チェーン設定

デフォルトの MediaProviderChainEntry:

Timeout    int  // 秒、デフォルト 600(10 分 — 画像/動画生成は低速)
MaxRetries int  // デフォルト 1(画像生成はリトライで成功することはまれ)

タイムアウトは 120s から 600s に引き上げられました。gpt-image-2 は実際に 30〜180s かかることがあるためです。タイムアウトが途中で発生してもアップストリームのリクエストが引き続き実行されることがあるため、リトライはほとんど効果がありません。そのため MaxRetries はリトライループでエラーを隠すのではなく早期に表面化させるため、2 から 1 に削減されました。

UI は ui/web/src/pages/builtin-tools/media-provider-params-schema.ts のスキーマを使用して設定フォームをレンダリングするため、管理者はテナントとツールごとに調整できます。

05出所情報: PNG tEXt チャンク + キャプション UI

create_image がファイルを保存するとき、pngEmbedPrompt は PNG のバイトストリームを書き換え、IEND の直前に tEXt チャンク Description を挿入します。tools→agent のインポートサイクルを避けるため、この関数は tools/png_embed.go に配置されています。

Description = <ユーザーが送信したプロンプト>

PNG tEXt チャンクの標準フォーマットとバイトストリームへの挿入位置:

PNG tEXt chunk insertion before IEND ORIGINAL PNG (input bytes) Signature 8 bytes IHDR 13 bytes IDAT... N bytes IDAT... N bytes IDAT... N bytes IEND 12 bytes ... insert tEXt here scan for IEND signature, splice before INSERTED tEXt CHUNK Length 4 bytes (BE uint32) Type "tEXt" 4 bytes ASCII keyword \0 text Description\0<prompt> CRC32 4 bytes OUTPUT PNG (with provenance) Signature 8 bytes IHDR IDAT... IDAT... IDAT... tEXt NEW · prompt IEND 12 bytes Failure-safe: 入力に PNG シグネチャがないか IEND が見つからない場合、関数は元のバイト列をそのまま返す(エラーなし)。
注意: モジュール agent.EmbedPNGPrompt は追加で Software = goclaw チャンクも書き込みますが、現在の create_image パスはそのモジュールを呼び出しません — Description のみが埋め込まれます。

関数は入力に PNG シグネチャ(8 バイトマジック)がないか IEND チャンクが見つからない場合は静かにスキップします。失敗モード: 元のバイト列をそのまま返し、エラーなし。

結果: 元のプロンプトがダウンロードファイルに同行しますexiftool image.pngDescription フィールド)または PNG メタデータビューアーで読み返せます。監査、類似画像の再生成、プロンプトのデバッグがすべて簡単になります。

UI は MediaGallery 内の画像の下にキャプションをレンダリングします: ミュートイタリック、2 行クランプ、ホバー時に全プロンプトを表示するツールチップ。ファイルは次のパスに保存されます: {workspace}/generated/{YYYY-MM-DD}/image_{hint}_{timestamp}.png

06スキル gpt-image-2-pro-max: Skill システム経由のプロンプトレジストリ

GoClaw コントリビューターの Richard Ng 氏によるスキル gpt-image-2-pro-max は MIT ライセンスのオープンソースです。コーパス内の 3,000 以上のプロンプトテンプレートは Twitter/X クリエイターのものです。スキルは検索を高速化するためにインデックスを作成するだけで、返される各プロンプトには元の著者が引用され、コーパスは上流の EvoLinkAI/awesome-gpt-image-2-prompts リポジトリにクレジットを記載しています。スキルは Claude Code スキル規約に準拠してパッケージ化されており、GoClaw は互換性のある Skill システムを搭載しているため、同じスキルディレクトリが両方で動作します。

Anatomy

Skill resolution: 5-tier hierarchy + skill anatomy RESOLUTION ORDER · highest priority first Tier 1 workspace/skills/ プロジェクトごと、最高優先度 Tier 2 workspace/.agents/skills/ project agent skills Tier 3 ~/.agents/skills/ personal agent skills Tier 4 ~/.goclaw/skills/ global / managed (DB-versioned) Tier 5 builtin バイナリにバンドル Loader.LoadForContext walks tiers, first match wins SKILL DIRECTORY ANATOMY gpt-image-2-pro-max/ ├── SKILL.md frontmatter (name, desc) + workflow body エージェントのシステムプロンプトに注入 └── scripts/ search.py — Python HTTP client エージェントが既存の bash ツール経由で呼び出す Watcher hot-reload internal/skills/watcher.go が SKILL.md の変更を検出 → バージョンをバンプ → 次のエージェントターンで新しいスキルを反映、再起動不要

コーパス: コミュニティが審査した 3,238 のプロンプトが https://gpt-image-2-prompts.goclawoffice.com でホストされています。タグは 10 のファセットで推定されます: subjectsstyleslightingcamerasmoodspalettescompositionsmediumstechniquesusecases。各レコードにはプロンプト本文、Twitter/X の帰属、参照画像が含まれます。エンドポイントは IP レート制限があり、フェアユースに配慮しています。

エージェントが呼び出す CLI インターフェース:

python scripts/search.py "luxury shoe ecommerce ad cream pastel" -n 5
python scripts/search.py "perfume bottle" --shape ecommerce -n 3
python scripts/search.py "neon ui" --persist plans/neon-refs.md

最初のクエリのサンプル出力(3 件表示、プロンプト本文は省略):

#1  bm25=-10.76  shape=ecommerce  source=None
  id    : 64dp29km
  title : E-commerce Main Image - Luxury Perfume Ad on Marble Vanity
  author: @MiguelMaestroIA
  tweet : https://x.com/MiguelMaestroIA/status/2047555836252151831
  image : https://gpt-image-2-prompts.goclawoffice.com/img/64dp29km_0
  imgid : 64dp29km_0
  tags  : cameras=1-1 | compositions=negative-space | moods=dreamy,edgy,elegant,intense,luxurious,minimal | palettes=crimson-burgundy,duotone,monochrome | styles=cinematic,editorial | subjects=product | techniques=parameterised-template,text-overlay-explicit | usecases=ecommerce-main-image,poster-flyer
  prompt:
    A luxury cosmetics advertisement poster featuring a single upright {argument name="product type" default="lipstick"} centered on a glossy black cube pedestal against a rich monochrome {argument name="background color" default="deep crimson red"} studio background. The product is a bold satin-finish {argument name="product shade" default="true red"} lipstick with the bullet fully extended, dramatic...

#2  bm25=-9.85  shape=  source=None
  id    : z9q36mnc
  title : Futuristic Bionic Super Shoe
  author: @Ericool 🇲🇾
  tweet : https://x.com/EricoolWong/status/2048353098897453286
  image : https://gpt-image-2-prompts.goclawoffice.com/img/z9q36mnc_0
  imgid : z9q36mnc_0
  tags  : cameras=low-angle | moods=energetic,futuristic,intense,luxurious | palettes=gold-black | styles=cinematic | subjects=fashion-item,product | techniques=parameterised-template
  prompt:
    Extreme futuristic {argument name="subject" default="cheetah bionic super shoe"}, hybrid of supercar and running sneaker, aggressive mechanical structure, layered carbon fiber, glowing energy core, dynamic speed trails, {argument name="colors" default="black gold"} luxury finish, dramatic low angle, cinematic lighting, high-end sports ad, ultra detailed, 8k

#3  bm25=-9.82  shape=ecommerce  source=None
  id    : 0zjvnji7
  title : Vitamin C Skincare Ad
  author: @Gem Alpha
  tweet : https://x.com/Gemalpha_88/status/2046796479562678589
  image : https://gpt-image-2-prompts.goclawoffice.com/img/0zjvnji7_0
  imgid : 0zjvnji7_0
  tags  : cameras=1-1 | moods=dreamy,edgy,elegant,luxurious,minimal,warm-emotional | palettes=earth-tones | styles=photorealistic | subjects=abstract,product | techniques=aspect-explicit,parameterised-template
  prompt:
    Create a clean luxury skincare product advertisement in a square 1:1 layout with a warm beige studio background and strong natural sunlight casting soft palm-leaf shadows across the wall. Place 1 amber glass dropper bottle on the left-center, standing upright on a round cream stone pedestal. The bottle has a glossy gold collar and a matte white rubber dropper top. Add a white rectangular label wit...

(3 matched, showing 3)

出力は BM25 でランク付けされ、prompt_bodytags.{moods,palettes,subjects,...}authortweetimage を含みます。主なフィルター: --shape--has-image-n--full--persist

07Web ダッシュボードからのセットアップ

GoClaw は Core / Capabilities / System でグループ化されたサイドバーを持つ Web ダッシュボードを提供します。このセットアップには 4 つのセクションが必要です: Agents(Core)、Skills(Capabilities)、Providers + Builtin Tools(System)。最小セットアップではエージェント 1 つだけで十分です — Step 2a のグローバル Provider Chain により、すべてのエージェントが create_image ツールを使用できます(Step 2b の read_image 設定はオプションで、ネイティブビジョン搭載モデルはスキップ可)。

Step 1 — Codex プロバイダーを接続する

サイドバー → System / ProvidersAdd Provider ボタン。Add Provider モーダルで ChatGPT Subscription (OAuth) を選択し、Account Alias(例: openai-codex)を保持または編集、必要に応じて Display Name を入力して Connect OpenAI Account をクリックします。システムが新しい OAuth タブを開き、ChatGPT アカウント(Plus / Pro / Team / Enterprise いずれも可)へのサインインとアクセス許可を求めます。

サインイン後、ブラウザは http://localhost:1455/auth/callback?code=...&state=... のようなコールバックにリダイレクトされます。リモート/VPS ホストでブラウザが localhost に接続できない場合は、アドレスバーの URL 全体をコピーしてモーダルのコールバックフィールドに貼り付け、Submit をクリックします。Providers リストに新しいプロバイダーが Connected ステータスで表示されれば完了です。

Add Provider modal with ChatGPT Subscription OAuth, account alias openai-codex, status 'waiting for authentication' and a callback URL paste field for remote/VPS hosts.
Step 1 · OAuth フローの Add Provider モーダル

Step 2a — create_image を有効化 + 設定する

サイドバー → System / Builtin Tools(ルート /builtin-tools)→ Media タブ → Create ImageEnabled フラグはデフォルト OFFcmd/gateway_builtin_tools.go:55 のシードデータを参照)— まずトグルを ON にします(テナント全体のマスタースイッチ)。次に Configure をクリックして Provider Chain モーダルに進みます。

Create Image — Provider Chain モーダルでフォールバックプロバイダーの順序を設定できます。最初の enabled エントリが最初に試行されます。最小セットアップ: Codex Plus エントリを 1 つ追加し、モデル GPT-5.4Timeout 600s(複雑なプロンプトの場合、画像生成に時間がかかることがある)、Retries 1、最も重要なのは Image modelDefault · gpt-image-2 (recommended) を選択。Save をクリック。OAuth クォータが枯渇した際のグレースフルデグラデーションのため Add Provider でフォールバック(例: OpenAI API キー)を追加することもできます。

'Create Image — Provider Chain' modal with entry #1 Codex Plus enabled, Provider dropdown set to Codex Plus, Model GPT-5.4, Timeout 600s, Retries 1, Image model 'Default · gpt-image-2 (recommended)', Add Provider button below and Cancel/Save.
Step 2a · create_image の Provider Chain — Codex Plus + GPT-5.4 + gpt-image-2

Step 2b — read_image を有効化 + 設定する (オプション)

エージェントのメインモデルがすでにネイティブビジョンを持つ場合(Qwen3.6-Plus など)はスキップしてください — ランタイムがインラインモードにフォールバックし、画像バイナリをメッセージに添付して LLM が直接読み取ります。テキストのみのモデルを使用する場合、またはコスト/レイテンシを最適化するためにビジョンプロバイダーを推論モデルから分離したい場合は設定が必要です。

同じ /builtin-tools ページ → Media タブ → Read ImageEnabled トグルをオンにします(デフォルト OFF)。ツール名の横にある req バッジに注意してください — "requires"(依存関係)の略です。ホバーすると vision_provider 要件が表示されます: トグルが意味を持つには Step 1 で少なくとも 1 つのビジョン対応プロバイダー(Gemini、OpenAI、Anthropic、OpenRouter、dashscope qwen-vl など)が登録されている必要があります — そうでなければ、ツールは実行時に "No vision provider configured" エラーをスローします。

有効化後、Configure をクリック → Read Image — Provider Chain モーダル。スクリーンショットのサンプルセットアップ: OpenRouter エントリ 1 つ、モデル google/gemini-2.5-flash-imageTimeout 120s(ビジョン呼び出しは通常高速で 600s は不要)、Retries 3(ビジョン呼び出しは安価でプロバイダーが不安定な場合のリトライは安全)。これは read_image 専用のチェーンであり、create_image とは共有されません。

ルーティング: read_image チェーンが設定済みの場合 → エージェントのメインモデルがネイティブビジョンを持っていても、すべての read_image 呼び出しがこのチェーンを通ります。チェーンが未設定の場合 → 画像がメッセージにインラインで添付されて LLM が直接読み取ります(モデルがビジョンをサポートしている場合のみ動作)。コード: internal/agent/media_tool_routing.go
'Read Image — Provider Chain' modal with entry #1 OpenRouter enabled, Provider dropdown set to OpenRouter, Model 'google/gemini-2.5-flash-image', Timeout 120s, Retries 3, Add Provider button below and Cancel/Save.
Step 2b · read_image の Provider Chain — OpenRouter + google/gemini-2.5-flash-image、Timeout 120s、Retries 3
なぜ 2 つのチェーンを分けるのか? create_image は画像生成モデル(gpt-image-2、DALL-E 3 など)が必要です。read_image はビジョンモデル(Gemini 2.5 Flash、GPT-4o-mini など)が必要です。モデルクラスが異なり、プロバイダーが異なり、課金が異なり、レイテンシ/リトライ特性も異なります(画像生成は 4〜8 分かかりリトライは高コスト、ビジョン呼び出しは数秒でリトライは安価)— そのため GoClaw は builtin_tools.settings に 2 つの別々のチェーンを保存します(internal/tools/media_provider_chain.go:64-100 を参照)。各ツールを個別に有効化・設定してください。

Step 3 — エージェントを作成する

サイドバー → Core / AgentsNew Agent。最小フィールド: NameProviderModel(例: Tiểu Hổ + qwen3.6-plus、または画像を読み取りスキルを実行できる十分に賢いモデル)。保存するとエージェントがリストに表示されます。このエージェントの役割は推論を実行することです: ブリーフを分析し、画像を読み取り、コーパスを検索し、プロンプトをリファクタリングして、create_image ツールを呼び出します。

Agent card 'Tiểu Hổ' (handle tieu-ho), provider qwen / qwen3.6-plus, active badge, description 'A versatile personal assistant for fast, accurate task handling, work management, and health & habit reminders', with Full + Evolving badges and a 200K ctx context window.
Step 3 · 作成後の Agent tieu-ho — provider qwen、model qwen3.6-plus

Step 4 — スキル gpt-image-2-pro-max をアップロードする

上流からスキルをクローンして ZIP 圧縮:

macOS / Linux · bash
git clone https://github.com/therichardngai-code/gpt-image-2-pro-max /tmp/g2pm
cd /tmp/g2pm/.claude/skills/gpt-image-2-pro-max
zip -r ~/Desktop/gpt-image-2-pro-max.zip .
Windows · PowerShell
git clone https://github.com/therichardngai-code/gpt-image-2-pro-max $env:TEMP\g2pm
Set-Location $env:TEMP\g2pm\.claude\skills\gpt-image-2-pro-max
Compress-Archive -Path * -DestinationPath $HOME\Desktop\gpt-image-2-pro-max.zip -Force

サイドバー → Capabilities / SkillsUpload Skill → ZIP ファイルをドロップ → ダッシュボードが SKILL.md フロントマターをパースし name + description を取得、DB にスキルレコードを保存(version は DB が自動採番する整数で、アップロードのたびにインクリメント — フロントマターからは取得しない)。スキルが Enabled トグル付きでリストに表示されます。

最後に、作成したエージェントにスキルをグラントします: Agent detailSkills セクション → gpt-image-2-pro-maxgranted にトグル。ローダーが次のターンからエージェントのシステムプロンプトに SKILL.md を注入します — 再起動不要。このスキルは プロンプトエンジニアリングパイプライン — エージェントに、ブリーフの診断、3,238 プロンプトのコーパス検索、ムードに合ったテンプレートの選択、スロットのリファクタリングと解決、そして最後に磨かれたプロンプトで create_image を呼び出す方法を教えます。

Upload Skills modal with instructions to upload a ZIP containing SKILL.md with YAML frontmatter (name, description, slug); drop zone, file gpt-image-2-pro-max.zip 7.3 KB with a NEW badge, status '1 of 1 valid', Upload (1) button.
Step 4a · Upload Skill モーダル — ZIP をドロップ、有効なエントリをプレビュー
Agent detail page for 'Tiểu Hổ' (handle tieu-ho, provider qwen, model qwen3.6-plus, badges Full / V3 / Evolving): Dreaming Memory Consolidation section (Enabled, threshold 5, debounce 600000ms), Heartbeat (not set up), Hooks (not configured), Skills (1/1) listing gpt-image-2-pro-max with internal badge and granted toggle ON; description 'Production prompt-engineering pipeline for GPT-Image-2 / OpenAI image generation. Pairs a media-designer agent with a hosted searc...'.
Step 4b · Agent detail tieu-ho (qwen3.6-plus) — gpt-image-2-pro-max グラントトグルを ON
応用パターン(オプション)— Agent Team で 2 エージェントに分割: オーケストレーター(リード、スキル実行、タスク調整)と 画像ワーカーcreate_image のみ呼び出し)を同一の Agent Team にまとめることができます: オーケストレーターが長いコンテキストを保持し、ワーカーはレンダリングを軽量に実行し、監査・トレースはチームタスクボードで明確に分離されます。Sidebar → Core / Teams → 両エージェントをメンバーとして追加してチームを作成します。ランタイムはエージェントを ModeTeaminternal/agent/orchestration_mode.go)に切り替え、フルのチームタスク・デリゲート・スポーンツールが利用可能になります。ただしランタイム上は必須ではありません — 1 つのエージェントだけでフルワークフローを実行できます。

1 ターントレース(セットアップ後)

ユーザーブリーフ: "poster cao điểm Tết với cáo đỏ Việt Nam, style infographic"

Trace 1 turn — brief → cited image User brief enters → 7 steps → reply with prompt citation USER BRIEF "poster cao điểm Tết với cáo đỏ Việt Nam, style infographic" 1 Loader.LoadForContext SKILL.md の description とブリーフを照合 → SKILL.md 本文をシステムプロンプトに注入 前提: スキルがエージェントにグラントされている(Step 4b) 2 エージェントがブリーフを分析 SKILL.md のワークフローを読み、ファセットを抽出: subject=fox · mood=festive · shape=infographic · palette=red-gold 3 エージェントが bash ツール経由で scripts/search.py を呼び出す python search.py "lunar new year fox infographic poster" --shape infographic -n 5 --has-image 4 search.py → corpus server (HTTP) https://gpt-image-2-prompts.goclawoffice.com · BM25 + tag boost ranking 上位 5 件のレコードを返す(prompt body + tags + author + twitter_link + reference image URL) 5 エージェントがレコードを選択 + プロンプトをリファクタリング filter tags: moods=festive ∧ palettes=red-gold substitute {argument name="subject"} = "red fox" + 詳細を追加: "Vietnamese tet decorations, lì xì, mai blossom" 6 create_image(prompt=<refactored>, aspect_ratio="3:4") → Section 02 のネイティブパス(Codex Responses API、image_generation ツール、2 段階ゲート) 7 Agent reply + citation 画像を添付 + 元プロンプトの author/twitter_link(出所情報)

実際の実行からの詳細なビジュアルトレース: PR #1002 · UX trace

マルチテナント: テナントモードではサイドバーに System / Tenants メニューが追加されます。各テナントは独自の Codex プロバイダー + エージェント + スキルグラントを持ちます — スキルをシェアドスコープに 1 度アップロードして、必要に応じて各テナントにグラントするだけ — スキルを複数コピーする必要はありません。

08ワークフロー: GoClaw で画像を生成する

"GoClaw ユーザーの皆さん — GPT Image 2 を使ってプロンプト 1 つで画像を生成できます。ベース画像をアップロード → エージェントがプロンプトを最適化 → GoClaw 内で画像を生成。

P.S. メインモデルは Qwen3.6-Plus(+ read_image)、画像生成は GPT_Image_2(create_image)で設定しました。" — 著者 (Richard Ng)

これは著者自身が共有したワークフローです: 作りたい画像をアップロードして数個の説明キーワードを入力するだけ(例: "ecommerce 広告ポスターを作成")。残りはエージェントがすべて行います — アップロード 1 回で完結します。

GoClaw の最小セットアップ

Agenttieu-ho (Tiểu Hổ) · qwen3.6-plus · スキル gpt-image-2-pro-max をグラント済み。ユーザーが会話する唯一のエージェントです。推論(ブリーフ分析、コーパス検索、プロンプトリファクタリング)を実行し create_image を直接呼び出します。Qwen3.6-Plus はネイティブビジョンを搭載しているため、アップロードされた画像を直接読み取れます — read_image ツールの設定は不要です。
Tool create_imageビルトインツール — テナントが /builtin-tools のトグルを有効化し(Section 07 の Step 2a)、エージェントに AllowImageGeneration=true(デフォルト)フラグが付いているときに、ランタイムがツールリストに自動的に追加します。Provider Chain → Codex Plus + gpt-image-2 が PNG をレンダリング。エージェントのメインモデル(Qwen3.6-Plus)は推論のみ実行し、画像生成モデルとは無関係 — ランタイムがメディアツールを専用チェーン経由でルーティングします。read_image ツール(Step 2b)はエージェントのメインモデルがテキストオンリー(ビジョン機能なし)の場合のみ設定が必要です。

ワークフロー: ブリーフ → 完成画像

ワークフロー: ブリーフ → 画像 — 1 ターン vs 2 ターン ユーザーのインテントで分岐: "今すぐ生成" vs "先にレビュー" USER INPUT (turn 1) 📎 Upload poster.jpg + brief text 例: "ecommerce 広告ポスターを作成" AGENT REASONING — スキル gpt-image-2-pro-max を実行(6 ステップ) SKILL.md はエージェントにグラントされるとシステムプロンプトに注入される Read imageposter.jpg を読み取る: subject, palette, composition Search corpusscripts/search.py BM25 → 上位 5 プロンプト Pick template — ムード不一致フィルター、ベースを 1 つ選択 Refactor{argument} スロットでテンプレートをパラメータ化 Resolve — スロットを埋める; 曖昧な場合はデフォルトフォールバック、絶対に創作しない Output 4-block — Base · Parameterised · Resolved · Rationale — ユーザーのインテントで分岐 — User intent? (エージェントの推論) "今すぐ生成" "先にレビュー" Ⓐ ブランチ A — 1 ターン(自律) エージェントは end_turn せず、ツール呼び出しをチェーン継続 create_image(prompt=Resolved) を呼び出す → Provider Chain → Codex / gpt-image-2 → PNG Reply: PNG + 4-block + reference ユーザーの操作は 1 回で完了 Ⓑ ブランチ B — 2 ターン(レビュー優先) エージェントはステップ⑥後に end_turn、ユーザー承認を待機 Reply turn 1: 4-block + reference image ユーザーが Resolved プロンプトを確認、OK / スロット調整 USER INPUT (turn 2): "OK、生成して" → ⑦ create_image をトリガー、PNG が返る GoClaw ランタイム: create_image にハードゲートなし 分岐はブリーフのワーディングに基づくエージェントの推論によって 100% 決定される。 "今すぐ生成 / 画像を作って" → A · "プロンプトを提案 / 下書きを見せて" → B Tool loop: internal/agent/loop_run.go · max 30 LLM iterations / user turn (DefaultMaxIterations) ターン 2 のユーザー入力がブランチ B の唯一のトリガー — エージェントはターン 1 で end_turn 済み
1 ターンか 2 ターンか — インストラクション次第: 「画像を今すぐ生成して」系のブリーフ(上のデモのように — ダイアグラムのブランチ A)→ エージェントは同じユーザーターン内で 7 ステップを連鎖し、PNG が返るまで自律実行。「プロンプトを先に見せて」系のブリーフ(ブランチ B)→ エージェントはステップ⑥後に停止(4-block + reference を返却)、end_turn; ターン 2 でユーザーが承認・スロット調整して初めて create_image 呼び出しをトリガー。GoClaw ランタイムは両方をサポート — create_image にハードゲートなし、すべての決定はエージェントの推論に委ねられます。
Ecommerce ad poster output: HARBORIIS brand showcases Mary Jane shoes, three models in cream silk outfits seated around an oversized floral-embroidery shoe on a pastel cream background with pearl spheres and crystal formations; tagline 'Where Softness Becomes Form. Floral mesh, weightless step, quiet confidence.' along with four feature icons (Sheer Mesh, Floral Embroidery, Soft Cream Tone, Hand-Finished); top corner reads 'Designed with ChatGPT'.
ワークフロー出力 — HARBORIIS シューズブランドの広告ポスター、ベース画像 + キーワード "ecommerce 広告ポスターを作成" から 1 ターンで生成

09ベストプラクティス

このコンボを運用する際の最重要ヒント 2 つ:

  1. ブリーフが詳細なほど、エージェントの検索精度が上がる。 ユーザーが "red fox" とだけ入力すると、エージェントは "red fox" で検索し、無関係なテンプレートが大量に返ります(森の狐、カートゥーン狐、リアル狐など)。ブリーフに shape(poster / infographic / portrait / ad…)、mood(festive / moody / minimal…)、palette(red-gold / pastel / neon…)のキーワードを追加すれば、検索結果がインテントに大幅に絞り込まれます。例: "Tet poster, Vietnamese red fox, infographic style, festive red-gold palette" → エージェントの検索クエリに infographic festive red-gold が含まれ、適切なテンプレートへのフィルタリングが可能になります。
  2. タイムアウトを 600s 未満に下げないこと。 複雑な画像の生成(例: テキストを多く含む infographic)は通常サーバー側で 4〜8 分かかります — これはエラーではなくリアルな数値です。旧デフォルトの 120s × 2 retries は処理途中で切断されることが多く(context deadline exceeded)、実行を台無しにしていました。PR #1002 で 600s × 1 retry に変更しました: 待機時間は長くなりますがサーバーに十分な時間を与えられます。リトライは 1 回のみ — タイムアウト後のリトライはコストが 2 倍になる割に成功することはほとんどないためです。オペレーターは必要に応じて変更できますが、600s を下回ると設定しないでください — 旧来の失敗モードが再発することはほぼ確実です。

10技術サマリー

ファイルリファレンス

ComponentFile役割
Native image interfaceinternal/providers/native_image.goNativeImageProvider インターフェース、ValidateImageModelSizeFromAspect
Codex implinternal/providers/codex_native_image.goリクエストボディを構築、JSON / SSE レスポンスをパース
Tool entryinternal/tools/create_image.goツールディスパッチ、チェーン解決、ネイティブパス
Provider chaininternal/tools/media_provider_chain.goチェーンタイムアウト 600s、max_retries 1 デフォルト
PNG embed (runtime)internal/tools/png_embed.gopngEmbedPrompt — IEND の直前に "Description" tEXt チャンクを挿入
PNG embed (2-chunk)internal/agent/png_metadata.goEmbedPNGPrompt 2 チャンク(Description + Software)— create_image からはまだ呼び出されていない
Tool filter gateinternal/agent/loop_tool_filter.go2 段階ゲート: capability AND allowImageGeneration
Vision routinginternal/agent/media_tool_routing.gohasReadImageProvider — アップロード画像のファイル参照 vs インラインモード
Orchestration modeinternal/agent/orchestration_mode.goModeTeam / ModeDelegate / ModeSpawn をチーム + エージェントリンクから解決
Builtin tool seedcmd/gateway_builtin_tools.goデフォルト Enabled: false + Requires 依存関係(vision、image_gen など)

スキルバックエンド

スキルはダッシュボード経由でアップロードします(Section 07 · Step 4 参照)。scripts/search.py は外部コーパスホストを呼び出します。BM25 + タグブーストランキングはサーバー側にあり、GoClaw コアには含まれません。