メインコンテンツへスキップ

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

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

LaoZhang AI Team公開23 分で読めます
目次
GPT Image 2.6のGIFアニメAPIの要点。フレーム数は16以下が安全、512×512・9フレームで約$0.062、例文どおりのループはつなぎ目の指標が1.38で跳ぶ

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 は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。

例外が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出力の節)は案内しています。2026年11月5日時点の各文書の記載は次のとおりです。

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

注記:laozhang.ai は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。

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

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

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

注記:laozhang.ai は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。

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

実際に作った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 は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。

作り方フレーム×表示時間1フレームの大きさループ1周ファイルサイズ生成時間
web経路、ループ指示あり4×300ミリ秒1024×10241.2秒2.02MB43.5秒
web経路、ループ指示あり9×200ミリ秒1024×10241.8秒4.53MB49.3秒
web経路、短いあいまいなプロンプト9×200ミリ秒1024×10241.8秒4.85MB52.1秒
web経路、ループ指示あり16×120ミリ秒1024×10241.92秒8.20MB49.3秒
OpenAIがガイドで公開しているSunburstの作例9×200ミリ秒512×5121.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秒

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 は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。

GIFのサイズと課金で経路を選ぶ図。512×512など小さいGIFはOpenAIのAPIかLaoZhang APIの公式転送、1024×1024以上を1回定額で作るならweb経路、-vip付きモデルはGIF非対応

経路モデルIDGIFの最小サイズ課金フレーム数1本の生成時間の目安
OpenAIのAPIに直接gpt-image-2.6-flare、gpt-image-2.6-sunburst512x512で動作、256×256・2フレームは失敗トークン課金(画像出力$30/100万トークン)ガイド2〜64、リファレンス2〜16Flare、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のVIPgpt-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ドキュメントに載っています。

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

OpenAIのAPIと公式転送では、GIF 1本の費用は出力トークン数で決まります。GPT Image 2.6の画像出力は100万トークンあたり$30(OpenAIの料金ページ)なので、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の違いで比較しています。

注記:laozhang.ai は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。

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

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

注記:laozhang.ai は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。

症状・エラー原因対処
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の節は、滑らかにするには「戻ってくる開始ポーズを与え、カメラを動かすかどうかを書く」よう勧めていますが、これは指示であって保証ではありません。

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 は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。

次のスクリプトは、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のプロンプトの書き方を参照してください。

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

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

注記:laozhang.ai は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。

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

参考資料5

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

  1. 1.OpenAIの画像生成ガイド(GIF出力の節)developers.openai.com/api/docs/guides/image-generation
  2. 2.OpenAIのAPIリファレンス(images.generate)developers.openai.com/api/reference/resources/images/methods/generate
  3. 3.OpenAIの料金ページdevelopers.openai.com/api/docs/pricing
  4. 4.画像プロンプトガイドのループGIFの節developers.openai.com/api/docs/guides/image-prompting
  5. 5.OpenAIのAPIリファレンス(images.edit)developers.openai.com/api/reference/resources/images/methods/edit
さらに読む: AI 画像生成