# GPT Image 2.6 GIF API：PythonでGIFアニメを作る手順と上限・料金

> GPT Image 2.6のAPIはoutput_formatの「gif」指定でGIFアニメを返します。フレームは16以下が安全、512×512・9フレームで約$0.062です。

- URL: https://blog.laozhang.ai/ja/posts/gpt-image-2-6-gif-api
- Published: 2026-11-05
- Updated: 2026-11-05
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ja/about)
- Topic: AI 画像生成
- Tags: GPT Image 2.6, GIFアニメ, 画像生成API, OpenAI API, Python

---
2026年11月4日に公開されたGPT Image 2.6のAPIでGIFアニメを作るには、`POST /v1/images/generations`のリクエストに`output_format: "gif"`を加え、フレーム数を`frame_count`、1フレームの表示時間を`frame_duration_ms`で指定します。モデルは`gpt-image-2.6-flare`か`gpt-image-2.6-sunburst`です。返ってきた`b64_json`をbase64デコードして`.gif`で保存すれば、無限ループ指定のGIFになります。`size`はアニメ全体ではなく、1フレームの大きさです。

値を決めるうえで先に知っておきたいのは、フレーム数の上限です。OpenAIの画像生成ガイドは2〜64、APIリファレンスは2〜16と書いていて食い違っているため、OpenAIのAPIで確実に動かすコードは16フレーム以下にしておくのが安全です。費用はトークン課金で、512×512・9フレーム・`quality: "medium"`のGIFは出力2,073トークン、約$0.062でした（LaoZhang APIのドキュメントチームが2026年11月5日にOpenAIへ直接送った計測）。1024×1024以上を定額で作りたい場合は、LaoZhang APIの`gpt-image-2.6-web`（1回$0.03）も選べますが、こちらは1フレームが655,360ピクセル以上（正方形なら816×816以上）でないと受け付けません。

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

例外が2つあります。OpenAIの画像生成ガイドでは、GIFを返すのは生成エンドポイントだけで、編集エンドポイントはGIFに対応していません。また、プロンプトで「元のポーズに戻る」と指示しても、ループのつなぎ目が滑らかになるとは限りません。2026年11月5日の実測（1024×1024）では、OpenAIの例文どおりに作った9フレームのGIFが、最後のフレームから最初に戻るところで目に見えて跳びました。つなぎ目は公開前に数値で確かめられます。

## PythonでGIFを保存するまで：output_formatに"gif"を指定する

必要なのは`openai`と`Pillow`の2つのパッケージと、GPT Image 2.6を呼べるAPIキーです。OpenAIのAPIリファレンスは`frame_count`の説明に「選んだモデルのGIFプレビューへのアクセスが必要」と書いており、どの組織が対象かは公開情報に記載がありません。自分のキーで通らない場合は、後述の経路の選択肢も参考にしてください。

1. `pip install openai pillow`を実行し、APIキーを環境変数`OPENAI_API_KEY`に設定します。
2. 下のコードで`images.generate`に`output_format="gif"`と`frame_count`、`frame_duration_ms`を渡します。
3. `result.data[0].b64_json`をbase64デコードし、拡張子`.gif`で保存します。
4. 保存したファイルのフレーム数・表示時間・ループ指定を、後半の確認スクリプトで確かめます。

```python
import base64
from openai import OpenAI

client = OpenAI()  # LaoZhang APIを使う場合は base_url と api_key を指定

result = client.images.generate(
    model="gpt-image-2.6-flare",
    prompt=(
        "A little monkey in an olive-green hooded coat stands in a snowy pine forest at dusk. "
        "The monkey holds a glowing amber paper lantern at chest height, slowly lifts it, "
        "looks up and blinks, then lowers it back to its starting pose. "
        "Keep the lantern in its hands and the camera still. Make the motion loop smoothly."
    ),
    size="512x512",          # 1フレームの大きさ
    quality="medium",
    output_format="gif",
    extra_body={
        "frame_count": 9,          # フレーム数
        "frame_duration_ms": 200,  # 1フレームの表示時間（ミリ秒）
    },
)

with open("loop.gif", "wb") as f:
    f.write(base64.b64decode(result.data[0].b64_json))

print(result.usage)  # 出力トークン数。費用の計算に使う
```

`frame_count`と`frame_duration_ms`を`extra_body`に入れているのは、SDKのバージョンによってはこの2つを引数として受け付けず、`unexpected keyword argument`で止まるためです。`extra_body`に入れた項目はそのままリクエスト本文に追加されるので、SDKの版に関係なく送れます。使っているSDKのバージョンの`images.generate`に`frame_count`が引数として載っていない限り、`extra_body`で渡しておくのが確実です。この例の9フレーム×200ミリ秒は、ループ1周が1.8秒になる設定で、OpenAIのガイドにある作例と同じ値です。

## frame_count・frame_duration_ms・sizeに指定できる範囲

GIF専用のパラメータは`frame_count`（既定9）と`frame_duration_ms`（既定200ミリ秒）の2つで、ループ1周の長さはこの2つの掛け算で決まります。`size`は1フレームの幅×高さで、フレーム数、フレームの大きさ、`n`（作るアニメの数）の合計が、モデルのサイズ上限とリクエスト全体のピクセル予算に収まる必要があります。超えた場合は、フレーム数、サイズ、`n`のどれかを減らすよう[OpenAIの画像生成ガイド（GIF出力の節）](https://developers.openai.com/api/docs/guides/image-generation#generate-animated-gif-output)は案内しています。2026年11月5日時点の各文書の記載は次のとおりです。

| パラメータ | OpenAIの画像生成ガイド | OpenAIのAPIリファレンス | LaoZhang APIのweb経路 |
| --- | --- | --- | --- |
| `frame_count` | 2〜64、既定9 | 2〜16、既定9 | 2〜64、既定9 |
| `frame_duration_ms` | 20〜2000ミリ秒、10ミリ秒単位に丸め、既定200 | 最小20、既定200、2000の上限は記載なし | 20〜2000、既定200 |
| `size` | `auto`か、16の倍数の`幅x高さ` | モデルのGIFサイズ上限を満たすこと | 655,360ピクセル以上（正方形なら816x816から）、省略不可 |
| `n` | フレーム数・サイズと合わせてピクセル予算内 | 記載なし | 1のみ |
| GIFで使えない機能 | ストリーミング、部分画像、`output_compression`、`prompt_rewriter` | ストリーミング、部分画像、マスク、`output_compression` | `stream: true`でも完成後に一括で返る |

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

web経路で`size`を省略すると、439×390のような小さく半端なサイズで返ってくることがLaoZhang APIのドキュメントに記載されています。どの経路でも`size`は明示しておくほうが、結果のサイズを予測できます。

## フレームは64まで？16まで？公式文書の食い違い

OpenAIの公式文書どうしで、フレーム数の上限が4倍違います。画像生成ガイドは`frame_count`を2〜64としていますが、[OpenAIのAPIリファレンス（images.generate）](https://developers.openai.com/api/reference/resources/images/methods/generate)は「2から16までの整数」と書き、`maximum: 16`を明記しています。17フレーム以上がOpenAI本体のAPIで通ることを示した公開の計測はありません。LaoZhang APIのドキュメントチームがOpenAIに直接送ったGIFも9フレームまでです。そのため、OpenAIのAPIで確実に動かす必要があるコードは16フレーム以下に収め、17フレーム以上はエラーになる前提で扱うのが無難です。

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

LaoZhang APIのweb経路は2〜64を受け付けると記載しており、2026年11月5日に65フレームを送ると400で拒否されました。この日にweb経路で実際に作った最大は16フレームです。ChatGPTアプリのGIF機能にある0.25×〜2×の速度メニューはアプリ側の機能で、APIでは`frame_duration_ms`で表示時間を決めます。コードを書かずに作る方法は[ChatGPTでGIFアニメを作成する方法](https://blog.laozhang.ai/ja/posts/how-to-make-a-gif-in-chatgpt)を参照してください。

## 実際に作ったGIFのフレーム数・容量・生成時間（2026年11月5日）

2026年11月5日にLaoZhang APIの`gpt-image-2.6-web`で1024×1024のGIFを4本作ったところ、4本ともフレーム数と1フレームの表示時間は指定どおりで、ループ指定は0（無限ループ）でした。ファイルサイズはフレーム数にほぼ比例し、1フレームあたり約0.5MBです。生成時間は43.5〜52.1秒で、この日は16フレームでも9フレームと変わりませんでした。

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

| 作り方 | フレーム×表示時間 | 1フレームの大きさ | ループ1周 | ファイルサイズ | 生成時間 |
| --- | --- | --- | --- | --- | --- |
| web経路、ループ指示あり | 4×300ミリ秒 | 1024×1024 | 1.2秒 | 2.02MB | 43.5秒 |
| web経路、ループ指示あり | 9×200ミリ秒 | 1024×1024 | 1.8秒 | 4.53MB | 49.3秒 |
| web経路、短いあいまいなプロンプト | 9×200ミリ秒 | 1024×1024 | 1.8秒 | 4.85MB | 52.1秒 |
| web経路、ループ指示あり | 16×120ミリ秒 | 1024×1024 | 1.92秒 | 8.20MB | 49.3秒 |
| OpenAIがガイドで公開しているSunburstの作例 | 9×200ミリ秒 | 512×512 | 1.8秒 | 1.28MB | 公開なし |

生成時間は混雑で変わります。LaoZhang APIのドキュメントは、同じweb経路の1024×1024で4〜9フレームが約35〜42秒、16フレームが約100秒、64フレームが約2分（約18MB）としています。OpenAIに直接送った`gpt-image-2.6-flare`の512×512・9フレームは11〜12秒でした（同社ドキュメントチームの計測）。web経路を使うときは、HTTPクライアントやプロキシのタイムアウトを300秒以上にしておきます。

フレーム数を増やすと、容量と時間に加えて画質にも影響します。全フレームは1枚の大きなシートにまとめて描かれるため、フレームが多いほど1フレームに割ける細部が減り、LaoZhang APIのドキュメントも64フレームではフレームが甘くなると書いています。ループを長くしたいときは、フレーム数を増やすより`frame_duration_ms`を延ばすほうが、容量も画質も保ちやすくなります。動きを滑らかにしたい場合だけフレーム数を増やし、16フレームあたりから容量と画質を見比べてください。

![1024×1024のGIFを4・9・16フレームで作ったときのファイルサイズと生成時間の比較。全フレームが1枚のシートに描かれ、容量は2.02MB、4.53MB、8.20MBとフレーム数に比例し、生成時間は43.5〜49.3秒](https://blog.laozhang.ai/posts/ja/gpt-image-2-6-gif-api/img/frames-size-time.webp)

## GPT Image 2.6のGIFをどの経路で呼ぶか：サイズと課金で選ぶ

512×512のような小さいGIFを作るならOpenAIのAPIかLaoZhang APIの公式転送、1024×1024以上を1回定額で作るならLaoZhang APIのweb経路、という分け方になります。同じLaoZhang APIでもVIPモデル（`-vip`付き）はGIFを返さないので、GIF用には選びません。2026年11月5日時点の各経路の違いは次のとおりです。

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

![GIFのサイズと課金で経路を選ぶ図。512×512など小さいGIFはOpenAIのAPIかLaoZhang APIの公式転送、1024×1024以上を1回定額で作るならweb経路、-vip付きモデルはGIF非対応](https://blog.laozhang.ai/posts/ja/gpt-image-2-6-gif-api/img/route-by-size-billing.webp)

| 経路 | モデルID | GIFの最小サイズ | 課金 | フレーム数 | 1本の生成時間の目安 |
| --- | --- | --- | --- | --- | --- |
| OpenAIのAPIに直接 | `gpt-image-2.6-flare`、`gpt-image-2.6-sunburst` | 512x512で動作、256×256・2フレームは失敗 | トークン課金（画像出力$30/100万トークン） | ガイド2〜64、リファレンス2〜16 | Flare、512×512・9フレームで11〜12秒 |
| LaoZhang APIの公式転送 | 同じID（`OpenAI Official`グループ） | 512x512で動作 | OpenAIと同じトークン単価（`OpenAI Official Enterprise`は+20%） | OpenAIと同じ | Flare、512×512・9フレームで約11秒 |
| LaoZhang APIのweb経路 | `gpt-image-2.6-web`（`default`グループ） | 655,360ピクセル以上（正方形なら816x816から） | 1回$0.03、フレーム数とサイズで変わらない | 2〜64（65は400） | 1024×1024で43〜52秒（2026年11月5日の実測） |
| LaoZhang APIのVIP | `gpt-image-2.6-flare-vip`など | GIF非対応（400） | 1枚$0.03 | — | — |

LaoZhang APIの公式転送はリクエスト本文がOpenAIとまったく同じで、上のPythonコードの`OpenAI()`に`base_url="https://api.laozhang.ai/v1"`と公式転送グループのキーを渡せばそのまま動きます。web経路を使う場合は、`default`グループのキーで`model`を`gpt-image-2.6-web`に、`size`を`"1024x1024"`などに変えます。`n`は1だけで、混雑時に大きいサイズや多いフレームのGIFが約2分後に429を返すことがありますが、その場合は課金されません。経路ごとの設定は[LaoZhang APIのGPT Image 2.6ドキュメント](https://docs.laozhang.ai/ja/api-capabilities/gpt-image-2-5)に載っています。

## GIF 1枚の料金：トークン課金なら512×512・9フレームで約$0.062

OpenAIのAPIと公式転送では、GIF 1本の費用は出力トークン数で決まります。GPT Image 2.6の画像出力は100万トークンあたり$30（[OpenAIの料金ページ](https://developers.openai.com/api/docs/pricing)）なので、512×512・9フレーム・`medium`で出力2,073トークンなら、2,073×$30÷1,000,000＝約$0.062です。プロンプトの入力トークン分は$0.001未満にとどまります。同じ計測で`low`・4フレームは1,172トークン、約$0.035でした。比較の目安として、1024×1024の静止画を`high`で1枚作ると1,756トークン、約$0.053です。

出力トークンはサイズ、品質、フレーム数で変わるため、1024×1024のGIFがトークン課金でいくらになるかは、公開された計測がありません。自分の設定での費用は、レスポンスの`usage`に出る出力トークン数に$30÷100万を掛けて確かめます。`quality`を省略するとモデルが品質を選び、同じリクエストでも費用がぶれるので、明示しておきます。LaoZhang APIのweb経路はフレーム数やサイズにかかわらず1回$0.03（プラットフォームの提示価格）で、200以外の応答は課金されません。2.5から乗り換えるかどうかや品質別の静止画の費用は、[GPT Image 2.6と2.5の違い](https://blog.laozhang.ai/ja/posts/gpt-image-2-6-vs-2-5)で比較しています。

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

## GIFリクエストが失敗するとき：エラー別の原因と対処

GIFのリクエストで出やすい失敗は、範囲外の値、サイズの下限、経路の非対応、混雑、タイムアウトの5種類です。LaoZhang APIのweb経路では、範囲外の値に対するエラーの`message`は「上流がリクエストを受け付けなかった」としか言わないので、`param`と`code`で原因を見分けます。表の境界値エラーのうち3件は2026年11月5日に実際に送って確かめたもので、いずれも1〜2秒で返り、課金されませんでした。

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

| 症状・エラー | 原因 | 対処 |
| --- | --- | --- |
| 400、`code: invalid_image_request`、`param`が空（web経路で`frame_count: 65`を送ったとき、実測） | `frame_count`か`frame_duration_ms`が範囲外 | `frame_count`は2〜64（OpenAIに直接なら16以下）、`frame_duration_ms`は20〜2000に収める |
| 400、`param: "size"`、`code: "invalid_value"`（web経路で`512x512`、実測） | web経路の下限655,360ピクセルに届かない | 幅×高さを655,360ピクセル以上にする（正方形なら816x816以上、1024x640なども可）。512x512で作るならOpenAIか公式転送へ |
| 400「GIF and SVG output are not supported on this route」（VIPモデル、実測） | `-vip`付きのモデルはGIFを返さない | web経路か、公式転送の`gpt-image-2.6-flare`／`-sunburst`に切り替える |
| `No supported sheet fits`で始まるエラー（OpenAIに直接、256×256・2フレーム） | 全フレームを1枚のシートに描くため、小さすぎるサイズは下限に届かない | 512x512以上にする。512x512なら4〜9フレームで動作している |
| 400、`code: invalid_image_request`（web経路の`/v1/images/edits`でGIFを指定） | web経路の編集エンドポイントはGIFを返さない | `/v1/images/generations`で生成する |
| 約2分後に429（web経路、混雑時） | 大きいサイズや多いフレームのGIFが上流の容量不足で拒否された（課金なし） | 時間をおいて再送するか、フレーム数かサイズを減らす |
| クライアントがタイムアウト | web経路のGIFは生成に40秒〜2分かかることがあり、クライアントやプロキシの待ち時間が足りない | タイムアウトを300秒以上にする。LaoZhang APIでは切断してもサーバー側の生成は止まらないので、すぐ再送せず呼び出しログを確認する |
| `unexpected keyword argument 'frame_count'` | 古いSDKがGIF用の引数を知らない | `extra_body`で渡す（上のPythonコードの書き方） |

## ループのつなぎ目がカクッとする理由と確認スクリプト

GIFの「ループ」には2つの意味があります。ひとつはファイルに書かれたループ指定で、GPT Image 2.6のGIFは0（無限ループ）になっていて、これは問題になりません。もうひとつは、最後のフレームから最初のフレームへ戻るときの動きが自然かどうかで、カクッとするのはこちらです。OpenAIの[画像プロンプトガイドのループGIFの節](https://developers.openai.com/api/docs/guides/image-prompting#generate-a-looping-gif)は、滑らかにするには「戻ってくる開始ポーズを与え、カメラを動かすかどうかを書く」よう勧めていますが、これは指示であって保証ではありません。

2026年11月5日にweb経路で作ったGIFを、「最後→最初のフレームの差 ÷ 隣り合うフレームの差の平均」という指標で測った結果は次のとおりです。1以下なら、戻るときの跳びが、隣り合うフレーム間の普段の動きより大きくないという意味です。OpenAIの例文どおりにループを指示した9フレームは1.38で、ランタンとポーズが戻りきらずに跳ぶのが目で見ても分かりました。同じ設定で「A cute monkey with a lantern in the snow, animated.」とだけ書いたGIFは1.08、ループ指示ありの4フレームは0.72、16フレームは0.93です。比較用に測ると、OpenAIがガイドで公開しているSunburstの作例は0.72、LaoZhang APIのドキュメントにあるFlareの作例は0.68でした。各条件1本ずつの結果なので、ループの指示が滑らかさを保証しないことは言えますが、あいまいなプロンプトのほうが良いとは言えません。

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

次のスクリプトは、GIFのフレーム数・表示時間・ループ指定と、つなぎ目の指標をまとめて表示します。`python3 check_gif.py loop.gif`のように実行します。

```python
import sys
from PIL import Image, ImageChops, ImageStat

def diff(a, b):
    # 2枚のフレームの平均画素差（0〜100%）
    d = ImageChops.difference(a, b)
    return sum(ImageStat.Stat(d).mean) / 3 / 255 * 100

im = Image.open(sys.argv[1])
loop = im.info.get("loop")
frames, durations = [], []
try:
    while True:
        frames.append(im.copy().convert("RGB"))
        durations.append(im.info.get("duration"))
        im.seek(im.tell() + 1)
except EOFError:
    pass

steps = [diff(frames[i], frames[i + 1]) for i in range(len(frames) - 1)]
seam = diff(frames[-1], frames[0])
print("frames:", len(frames), "duration_ms:", sorted(set(durations)), "loop:", loop)
print("seam / step:", round(seam / (sum(steps) / len(steps)), 2))
```

`seam / step`が1を大きく超えたら、最後から最初へ戻る瞬間に跳びが出ている可能性が高いので、実際に再生して確かめ、気になるなら同じリクエストで作り直します。指標は画面全体の平均なので、背景が大きく動くGIFでは小さな被写体の跳びを見逃すことがあり、最終判断は目で見て行います。`loop`が0ならファイル側は無限ループです。開始ポーズの書き方などプロンプト全般は[GPT Image 2.6のプロンプトの書き方](https://blog.laozhang.ai/ja/posts/gpt-image-2-6-prompt-guide)を参照してください。

## 手持ちの画像をAPIでGIFにできるか：ガイドは編集からのGIFに非対応

OpenAIの画像生成ガイドは、GIF出力は生成用で、画像編集エンドポイントはGIF出力に対応しないと明記しています。一方で、[OpenAIのAPIリファレンス（images.edit）](https://developers.openai.com/api/reference/resources/images/methods/edit)には2026年11月5日時点で`output_format`の値として`"gif"`があり、`frame_count`（2〜16）と`frame_duration_ms`も載っていて、文書どうしが食い違っています。手持ちの写真やイラストを動かす手順を説明した公式の案内はなく、LaoZhang APIのweb経路では、編集エンドポイントでGIFを指定すると`invalid_image_request`で拒否されます。

*注記：[laozhang.ai は当ブログ運営チームの自社サービスです](https://blog.laozhang.ai/ja/about#laozhang)。その料金は中立的な比較ではなく、自社の提示価格です。*

例外として、LaoZhang APIのドキュメントチームは2026年11月5日に、公式転送の編集リクエストからGIFが返った例を1回観測しており、同社のドキュメントもこれを公式転送の用途に挙げています。ただしガイドが非対応としている使い方で、OpenAIに直接送った場合の結果は公開されていません。予告なく使えなくなる可能性があるため、本番の処理はこれに頼らず、生成エンドポイントでGIFを作る設計にしておくのが安全です。画像の一部に印を付けて直す編集は[GPT Image 2.6のマークアップ編集API](https://blog.laozhang.ai/ja/posts/gpt-image-2-6-image-markup-api)、アイコンやロゴをベクターで出す方法は[GPT Image 2.6のAPIでSVGを出力する方法](https://blog.laozhang.ai/ja/posts/gpt-image-2-6-svg-output)を参照してください。

## 参考資料

本文で参照している外部ページを、登場順に並べています。最終更新日：2026-11-05。

- [OpenAIの画像生成ガイド（GIF出力の節）](https://developers.openai.com/api/docs/guides/image-generation) (developers.openai.com)
- [OpenAIのAPIリファレンス（images.generate）](https://developers.openai.com/api/reference/resources/images/methods/generate) (developers.openai.com)
- [OpenAIの料金ページ](https://developers.openai.com/api/docs/pricing) (developers.openai.com)
- [画像プロンプトガイドのループGIFの節](https://developers.openai.com/api/docs/guides/image-prompting) (developers.openai.com)
- [OpenAIのAPIリファレンス（images.edit）](https://developers.openai.com/api/reference/resources/images/methods/edit) (developers.openai.com)
