# ChatGPT サブスクで agent が自分で画像を作る CLI

> {一言|ひとこと}でいうと、Claude Code が「{画像|がぞう}が1{枚|まい}{必要|ひつよう}」になったときに、**{自分|じぶん}でその{画像|がぞう}を{描く|かく}**ようにするものです。{人間|にんげん}が ChatGPT で{画像|がぞう}を{作って|つくって}から{貼り戻す|はりもどす}{必要|ひつよう}もなければ、そのためだけに `OPENAI_API_KEY` を{別途|べっと}{用意|ようい}する{必要|ひつよう}もありません。

![Claude Code が{自分|じぶん}でWebページに{足りない|たりない}あの{画像|がぞう}を{描いた|かいた}：i do it myself](https://img.leeguoo.com/media/885d47ec-d67e-462c-97b6-073eabae6c5f/hero-autonomy.png)

## 1. {初心|しょしん}：agent を「{人|ひと}が{絵|え}を{描く|かく}のを{待つ|まつ}」ところで{止めない|とめない}

Claude Code のような agent に、プロジェクトを{本当に|ほんとうに}エンドツーエンドでやらせようとすると、いずれ{同じ|おなじ}{壁|かべ}にぶつかります。**{画像|がぞう}が1{枚|まい}{必要|ひつよう}になる**のです。

README の hero banner、app の{仮|かり}アイコン、landing page の{挿絵|さしえ}、prototype の mockup、いくつかの sprite……コードは{書けても|かけても}、{絵|え}は{描けない|かけない}。するとフローはここで{途切れます|とぎれます}。

- **あるいは** `OPENAI_API_KEY` を{渡して|わたして}{公式|こうしき}の{画像|がぞう} API を{使わせる|つかわせる}——{追加|ついか}の{鍵|かぎ}、{追加|ついか}の{課金|かきん}、{追加|ついか}の{設定|せってい}が{必要|ひつよう}で、しかもあなたの ChatGPT サブスクとは{別会計|べつかいけい}です。
- **あるいは**あなたが{自分|じぶん}で ChatGPT を{開き|ひらき}、{画像|がぞう}を{生成|せいせい}し、ダウンロードしてプロジェクトに{貼り戻す|はりもどす}——agent はその{場|ば}で{待ちぼうけ|まちぼうけ}、「{自律|じりつ}」の2{文字|もじ}は{跡形|あとかた}もなくなります。

chatgpt-imagegen の{初心|しょしん}は、この{壁|かべ}を{取り払う|とりはらう}ことです。**agent が{画像|がぞう}を{必要|ひつよう}としたら、{自分|じぶん}で{作る|つくる}。{人手|ひとで}による{引き継ぎ|ひきつぎ}はゼロ。** {使う|つかう}のは、あなたが**もともと{持っている|もっている}** ChatGPT サブスクです。API key は{不要|ふよう}、gateway service を{立てる|たてる}{必要|ひつよう}もありません。

## 2. コマンド{一発|いっぱつ}で、agent が{使える|つかえる}

これは**{単一|たんいつ}ファイル・{依存|いぞん}ゼロ**の Python CLI（{標準|ひょうじゅん}ライブラリのみ{使用|しよう}）で、skill として{導入|どうにゅう}すれば、agent はそのまま{呼び出せます|よびだせます}。

```bash
chatgpt-imagegen "a watercolor cat sitting on a windowsill" -o assets/cat.png
# -> assets/cat.png  (1,344,804 bytes)
```

agent {向け|むけ}に{最適化|さいてきか}した{細部|さいぶ}も{揃っています|そろっています}。`--quiet` のとき stdout は**{保存先|ほぞんさき}パスだけ**を{出力|しゅつりょく}（`OUT=$(...)` で{受け取り|うけとり}やすい）、{進捗|しんちょく}バーは stderr へ。さらに各 backend にはプロセス{横断|おうだん}の{並行|へいこう}ロックがあり、agent が batch fan-out してもアカウントを{叩き潰しません|たたきつぶしません}。

![コマンド{一発|いっぱつ}：テキストが{入り|はいり}、{画像|がぞう}ファイルが{出る|でる}。API key も{人手|ひとで}も{不要|ふよう}](https://img.leeguoo.com/media/7ec4d116-8f96-4df0-8827-992bc9b24b1f/one-command.png)

## 3. {核心原理|かくしんげんり}：2つのバックエンド、2つの{課金|かきん}バケット

これはプロジェクト{全体|ぜんたい}でいちばん{重要|じゅうよう}な{設計|せっけい}です。同じ ChatGPT サブスクでも、{実は|じつは}**2つ**の{画像生成|がぞうせいせい}エントリがあり、{消費|しょうひ}するのは**{別々|べつべつ}の{上限|じょうげん}バケット**です：

![2つのバックエンド：web は{ログイン済み|ログインずみ}ブラウザ{経由|けいゆ}（Codex {枠|わく}を{節約|せつやく}）、codex は{計量|けいりょう}の{直結|ちょっけつ}](https://img.leeguoo.com/media/8b7dd618-86f7-40e3-b8aa-39ef9fc9cf2f/cover.png)

| バックエンド | どう{画像|がぞう}を{出す|だす}か | どの{枠|わく}を{使う|つかう}か | {向いている|むいている}{人|ひと} |
| --- | --- | --- | --- |
| **`web`**（デフォルト） | [`chrome-use`](https://chrome-use.leeguoo.com/en/) で**{ログイン済み|ログインずみ}の{本物|ほんもの}の Chrome**を{操作|そうさ}し、{通常|つうじょう}の{会話|かいわ}の中で{画像|がぞう}を{出す|だす} | **{会話枠|かいわわく}**、{計量|けいりょう}の Codex-usage には**{触れない|ふれない}** | ノートPC/デスクトップ、{ログイン済み|ログインずみ} Chrome を{開いている|ひらいている}{環境|かんきょう}；**{無料|むりょう}アカウントでも{使える|つかえる}** |
| **`codex`** | ヘッドレスで `backend-api/codex/responses` に POST し、`~/.codex/auth.json` を{再利用|さいりよう} | **Codex-usage**（{計量|けいりょう}バケット、たいてい{節約|せつやく}したい{方|ほう}） | サーバー/ヘッドレス agent {機|き}、ブラウザなし |

デフォルトは `auto`：**まず web を{試す|ためす}**（Codex {枠|わく}を{節約|せつやく}）、ブラウザが{使えない|つかえない}（chrome-use が{未導入|みどうにゅう} / {未|み}ログイン）{場合|ばあい}だけ codex にフォールバックします。この{戦略|せんりゃく}の{意味|いみ}は——**{計量枠|けいりょうわく}を{使わず|つかわず}に{済む|すむ}なら、{使わない|つかわない}。**

### なぜ web バックエンドには{本物|ほんもの}のブラウザが{必要|ひつよう}なのか？

{直感的|ちょっかんてき}には、「{通常会話|つうじょうかいわ}で{画像|がぞう}を{出す|だす}」なら、その `backend-api/*` インターフェースへ{直接|ちょくせつ} POST すればよさそうです。でも、それはできません：コンシューマー{版|ばん}のこれらのインターフェースは、**Cloudflare の{人間確認|にんげんかくにん} + sentinel の proof-of-work の{奥|おく}にいる**ためです——{ページ内|ページない}の `sentinel/sdk.js` がその{場|ば}で token を{計算|けいさん}し、{裸|はだか}の bearer リクエストはエッジで{弾かれます|はじかれます}。

この{関門|かんもん}を{通れる|とおれる}のは、**{ログイン済み|ログインずみ}の{本物|ほんもの}のブラウザ**だけです。これが web バックエンドが Chrome を{操作|そうさ}し、{直接|ちょくせつ} API を{呼ばない|よばない}{理由|りゆう}のすべてであり、また{通常|つうじょう}のヘッドレス driver ではなく `chrome-use`（{本物|ほんもの}の Chrome {接続|せつぞく}で、反 bot {検証|けんしょう}を{通過|つうか}できる）を{使わなければ|つかわなければ}ならない{理由|りゆう}でもあります。

## 4. image {模型|もけい}、{効果|こうか}は{本当に|ほんとうに}いい

{枠|わく}を{節約|せつやく}することは{画質|がしつ}を{下げる|さげる}ことではありません——web バックエンドが{使っている|つかっている}のは、ChatGPT のウェブ{画面|がめん}にあるあのネイティブ{画像生成器|がぞうせいせいき}そのものなので、{効果|こうか}は app で{手打ち|てうち}するのと{同じ|おなじ}です。{下|した}の 3 {枚|まい}はいずれもこのツールの**{実際|じっさい}の{出力|しゅつりょく}**です（{文|ぶん}から{画像|がぞう} + {画像|がぞう}から{画像|がぞう}の{両方|りょうほう}あり）：



| {文|ぶん}から{画像|がぞう} | {画像|がぞう}から{画像|がぞう}：{水彩|すいさい}の{猫|ねこ}を{金色|きんいろ}の{光|ひかり}の{油絵|あぶらえ}に | {画像|がぞう}から{画像|がぞう}：logo を{木|き}の{看板|かんばん}に{貼る|はる} |
| --- | --- | --- |
| ![{文|ぶん}から{画像|がぞう}：{白背景|しろはいけい}の{苺|いちご}](https://img.leeguoo.com/media/751116c9-3829-4bde-9000-e4e2cd47ebd4/real-strawberry.png) | ![{画像|がぞう}から{画像|がぞう}：{金色|きんいろ}の{光|ひかり}の{油絵|あぶらえ}の{猫|ねこ}](https://img.leeguoo.com/media/7b6038a8-47b1-4f40-add8-7f8177cd4868/real-cat-goldenhour.png) | ![{画像|がぞう}から{画像|がぞう}：{木|き}の{看板|かんばん} logo](https://img.leeguoo.com/media/c266f47a-e55a-40ad-8f9b-bbbe755e06fb/real-logo-sign.png) |

## 5. {画像|がぞう}から{画像|がぞう}へ：{参考画像|さんこうがぞう}を1{枚|まい}{渡す|わたす}

{参考画像|さんこうがぞう}（`-i`）を1{枚|まい}{渡す|わたす}と、ゼロから{描く|かく}のではなく**{画像|がぞう}を{編集|へんしゅう}**します——{画像|がぞう}を ChatGPT の{入力欄|にゅうりょくらん}にドラッグして、{描き直して|かきなおして}もらうのと{同じ|おなじ}です。2つのバックエンドはそれぞれ{実装|じっそう}が{異なります|ことなります}：

- **web**：{参考画像|さんこうがぞう}を `chrome-use upload` {経由|けいゆ}で composer の{標準|ひょうじゅん} `<input type="file">` に{注入|ちゅうにゅう}し、それから{編集指示|へんしゅうしじ}を{送ります|おくります}——**サイトごとの{適配|てきはい}はゼロ**、Codex の{枠|わく}も{消費|しょうひ}しません；
- **codex**：{参考画像|さんこうがぞう}を `input_image` のコンテンツブロックとしてリクエストに{詰め|つめ}、{画像|がぞう}ツールを{強制的|きょうせいてき}に{発火|はっか}させます。

```bash
# logo をサイバーパンクなネオン看板に変える
chatgpt-imagegen "これをサイバーパンクなネオン看板にして" -i logo.png -o neon.png
```

![{参考画像|さんこうがぞう}を{入力欄|にゅうりょくらん}にドラッグすると、{編集済み|へんしゅうずみ}の{新しい|あたらしい}{画像|がぞう}が{出る|でる}](https://img.leeguoo.com/media/79c167d1-7486-4295-aa2f-590533005000/img2img-flow.png)

### ちょっと{面白い|おもしろい}{仕組み|しくみ}の{落とし穴|おとしあな}：「{生成|せいせい}されたその{画像|がぞう}」をどう{見分ける|みわける}か

web バックエンドは{実際|じっさい}のページを{操作|そうさ}しているので、**DOM から{生成画像|せいせいがぞう}を{見つけ出す|みつけだす}**{必要|ひつよう}があります。ここには{直感|ちょっかん}に{反する|はんする}ポイントが3つあります：

1. {新版|しんばん} ChatGPT の{画像|がぞう}は `backend-api/estuary/content` を{通り|とおり}、もう{古い|ふるい} `oaiusercontent` ではありません；
2. {画像|がぞう}から{画像|がぞう}のとき、アップロードした**{参考画像|さんこうがぞう}はユーザーの{吹き出し内|ふきだしない}に{全く|まったく}{新しい|あたらしい} src で{再表示|さいひょうじ}されます**——うっかりすると「{自分|じぶん}がアップロードした{元画像|もとがぞう}」を{結果|けっか}として{取って|とって}しまいます；
3. {生成画像|せいせいがぞう}は**{独立|どくりつ}した{画像|がぞう}カード**で、アシスタントメッセージの{要素|ようそ}には{包まれて|つつまれて}いません。

したがって{正しい|ただしい}{判定|はんてい}は：**`<main>` の{中|なか}で{画像|がぞう}ホスティングのドメインに{一致|いっち}する{新しい|あたらしい}{画像|がぞう}を{探しつつ|さがしつつ}、ユーザーの{吹き出し|ふきだし}に{属する|ぞくする}{画像|がぞう}はすべて{除外|じょがい}すること**です。

![main の{中|なか}で{生成画像|せいせいがぞう}を{探す|さがす}が、ユーザーの{吹き出し内|ふきだしない}のアップロード{画像|がぞう}は{除外|じょがい}する](https://img.leeguoo.com/media/4055de23-2c4e-46fd-b438-5828de68d92e/detect.png)

## 6. agent のために{生まれた|うまれた}{設計思想|せっけいしそう}

これらの{原則|げんそく}をつなげると、このプロジェクトの{設計方針|せっけいほうしん}はこうなります：

- **{単一|たんいつ}ファイル・ゼロ{依存|いぞん}・{純標準|じゅんひょうじゅん}ライブラリ**——agent が{持って|もって}くればそのまま{動き|うごき}、`pip install` も、{仮想環境|かそうかんきょう}も、{常駐|じょうちゅう}プロセスもありません；
- **skill としてインストール{可能|かのう}**——`npx skills add leeguooooo/chatgpt-imagegen -g` により、Claude Code / Codex / Cursor などから{直接|ちょくせつ}{呼び出せます|よびだせます}；
- **デフォルトで{節約|せつやく}**——auto モードは{優先|ゆうせん}して{計量|けいりょう}されない web を{使います|つかいます}；{本当に|ほんとうに}{速さ|はやさ}が{必要|ひつよう}なとき、またはヘッドレス{環境|かんきょう}では codex を{使います|つかいます}；
- **{結果|けっか}はワークスペースへ{保存|ほぞん}**——agent が{受け取る|うけとる}のは{保存済み|ほぞんずみ}のファイルパスで、そのまま repo に{入ります|はいります}；
- **{会話|かいわ}を{自動|じどう}アーカイブ**——web バックエンドは、{毎回|まいかい}の{画像生成|がぞうせいせい}の{会話|かいわ}を ChatGPT Project（デフォルトは `imagegen`）に{分類|ぶんるい}し、あなたの{履歴|りれき}を{汚しません|よごしません}。

{一言|ひとこと}でいうと：これは{人間向け|にんげんむけ}の{画像|がぞう}ツールに CLI をかぶせたものではなく、**「agent が{自分|じぶん}で{足りない|たりない}{資源|しげん}を{作る|つくる}」ことのために、{最初|さいしょ}から{設計|せっけい}されたもの**です。

## 7. {上手|じょうず}

```bash
# skill として（おすすめ、agent 用）
npx skills add leeguooooo/chatgpt-imagegen -g

# または独立 CLI（依存ゼロ、単一ファイル）
git clone https://github.com/leeguooooo/chatgpt-imagegen
```

あとはあなたの agent に「README {用|よう}の hero {画像|がぞう}を{描いて|かいて}」と{一言|ひとこと}いえばOK——{残り|のこり}は agent が{自分|じぶん}でやります。

ツール repo：[chatgpt-imagegen](https://github.com/leeguooooo/chatgpt-imagegen) ｜ {裏側|うらがわ}のブラウザ{自動化|じどうか}エンジン：[chrome-use](https://chrome-use.leeguoo.com/en/)。

> {余談|よだん}：この記事に{出てくる|でてくる}、あえて**ヘタに{描いた|かいた}**{落書き風|らくがきふう}の{原理図|げんりず}と、上にある{数枚|すうまい}の**{見栄え|みばえ}のいい**サンプル{画像|がぞう}は、{全部|ぜんぶ}このツール{自身|じしん}が{出力|しゅつりょく}したものです。ヘタなのは{説明|せつめい}スタイルで、きれいなのはその{本当|ほんとう}の{実力|じつりょく}——このギャップそのものが、いちばん{良い|よい}デモになっています。
