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

概要

元の画像とプロンプトを使用して、編集または拡張された画像を作成します。 このルートは次の両方をサポートします:
  • 下記で説明する OpenAI 互換の multipart/form-data アップロードフロー
  • サポートされる画像-to-画像ファミリー向けの image_urlimage_urls、または公式 images 参照を含む JSON リクエスト
gpt-image-2 はこのエンドポイントで利用できます。multipart image アップロード、JSON image_url / image_urls、公式 images[] 参照(image_url または file_id)に対応し、最大 16 枚のソース画像を受け付けます。file_id は先に /v1/files で作成してください。async: true を指定すると先にタスクを返します。公式 FLUX/BFL 編集モデルも同じタスクポーリングフローを使用します。gpt-image-2 の編集では resolutionbackground は受け付けません。出力寸法には size を使用してください。複数画像または高レイテンシの編集では async: true を推奨し、返されたタスクをポーリングしてください。Nano Banana の参照画像リクエスト(nano-banananano-banana-2nano-banana-pro)は /v1/images/generations で公開され、operation: "image-to-image"image_urls を使用します。この /v1/images/edits エンドポイントには送信しないでください。xAI Grok Imagine 画像編集モデル(grok-imagine-imagegrok-imagine-image-quality、および legacy grok-imagine-image-pro)はソース画像を最大 3 枚まで受け付けます。3 枚を超えるリクエストは入力検証で 400 too_many_images として失敗します。input_fidelity は現在の TokenLab の gpt-image-2 支援欄位には含まれません。省略してください。送信すると 400 unsupported_parameter が返ります。

リクエストボディ

同期リクエストのタイムアウト: 一部の画像リクエストでは、生成完了まで待って最終画像をインラインで返します。高解像度または高品質のリクエストは 1 分前後、またはそれ以上かかることがあるため、HTTP クライアントのタイムアウトは少なくとも 120s に設定してください。作成レスポンスに status: "pending"task_id、または poll_url が含まれる場合は、返された poll_url をポーリングしてください。 リモート画像 URL: multipart 入力が必要な場合、TokenLab は JSON image_urlimage_urls、または images[].image_url を取得し、そのバイト列を multipart の image パートとして送信します。URL は公開 http/https で、埋め込み認証情報やフラグメントを含まず、localhost、プライベート IP、予約済み IP 範囲へ解決されてはいけません。リダイレクト先も毎回再検証されます。取得される内容は実際の PNG、JPEG、または WebP 画像である必要があります。制限は画像 1 枚あたり 50MB、URL 取得画像の合計 200MB/リクエスト、取得 timeout 10s、最大 3 リダイレクトです。
image
file
multipart のソース画像。複数の GPT Image ソースを渡す場合は image を繰り返してください。ファイルは PNG、JPEG、または WebP、最大 16 枚、各 50MB までです。xAI Grok Imagine 編集モデルは同じ入力フィールドを使用しますが、ソース画像は 3 枚までです。
prompt
string
必須
希望する編集内容のテキスト説明。
mask
file
完全に透明な領域が編集箇所を示す追加画像。有効な PNG ファイルで、50MB 未満、image と同じサイズである必要があります。JSON リクエストでは、maskimage_url または file_id のどちらか一方だけを含むオブジェクトとして送信できます。file_id/v1/files で作成され、同じ画像編集設定に紐づいている必要があります。
model
string
必須
画像編集に使用するモデル。GPT Image 編集には gpt-image-2 を使用するか、GET /v1/models?recommended_for=image が返す現在の画像編集モデルを使用してください。
n
integer
デフォルト:"1"
生成する画像の数。1 から 10 の間である必要があります。
size
string
生成画像のサイズ。gpt-image-2 では auto または WIDTHxHEIGHT を使用します。寸法は 16 の倍数、最長辺は 3840px 以下、長辺/短辺比は 3:1 以下、総ピクセル数は 655,360 から 8,294,400 の範囲である必要があります。
response_format
string
デフォルト:"url"
生成画像の返却形式。url または b64_json である必要があり、デフォルトは url です。Azure Official または Azure-compatible の gpt-image-2 リクエストでは、TokenLab は画像データを b64_json として受け取ります。url リクエストでは各画像を CDN にアップロードして data[].url を返します。CDN ストレージが利用できない、またはアップロードに失敗した場合は、Base64 レスポンスへ変換せずリクエストを失敗させます。b64_json では生の Base64 を返します。
async
boolean
デフォルト:"false"
gpt-image-2 または公式 FLUX/BFL 編集モデルで true にすると、最終画像が準備できる前にタスクを返します。完了した非同期編集は、要求された response_format に関係なく URL を返します。b64_json が必要な場合は同期リクエストを使用してください。
user
string
不正利用監視のためのエンドユーザーの一意識別子。

レスポンス

created
integer
画像が作成された時の Unix タイムスタンプ。
data
array
生成された画像の配列。各オブジェクトには以下が含まれます:
  • url (string): 編集された画像の URL(response_format が url の場合)
  • b64_json (string): Base64 エンコードされた画像(response_format が b64_json の場合)

非同期タスクレスポンス

gpt-image-2 または公式 FLUX/BFL 編集モデルで async: true を指定すると、リクエスト内で編集済み画像を待たずにタスクを作成します。レスポンスには status: "pending"task_idpoll_url が含まれます。タスクが completed または failed になるまで /v1/tasks/{task_id} をポーリングしてください。 非同期編集タスクは最終画像の URL のみを返します。生の b64_json 画像データが必要な場合は、同期リクエストを使用してください。 タスク作成時に見積もり金額が予約される場合があります。完了したタスクは実際の使用量で精算され、失敗またはタイムアウトしたタスクは予約が解放または返金されます。
curl -X POST "https://api.tokenlab.sh/v1/images/edits" \
  -H "Authorization: Bearer sk-your-api-key" \
  -F "model=gpt-image-2" \
  -F "image=@sunlit_lounge.png" \
  -F "mask=@mask.png" \
  -F "prompt=A sunlit indoor lounge area with a pool" \
  -F "n=1" \
  -F "size=1024x1024"
from openai import OpenAI

client = OpenAI(
    api_key="sk-your-api-key",
    base_url="https://api.tokenlab.sh/v1"
)

response = client.images.edit(
    model="gpt-image-2",
    image=open("sunlit_lounge.png", "rb"),
    mask=open("mask.png", "rb"),
    prompt="A sunlit indoor lounge area with a pool",
    n=1,
    size="1024x1024"
)

print(response.data[0].url)
import OpenAI from 'openai';
import fs from 'fs';

const client = new OpenAI({
  apiKey: 'sk-your-api-key',
  baseURL: 'https://api.tokenlab.sh/v1'
});

const response = await client.images.edit({
  model: 'gpt-image-2',
  image: fs.createReadStream('sunlit_lounge.png'),
  mask: fs.createReadStream('mask.png'),
  prompt: 'A sunlit indoor lounge area with a pool',
  n: 1,
  size: '1024x1024'
});

console.log(response.data[0].url);
package main

import (
    "bytes"
    "fmt"
    "io"
    "mime/multipart"
    "net/http"
    "os"
)

func main() {
    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)

    writer.WriteField("model", "gpt-image-2")

    image, _ := os.Open("sunlit_lounge.png")
    defer image.Close()
    part, _ := writer.CreateFormFile("image", "sunlit_lounge.png")
    io.Copy(part, image)

    mask, _ := os.Open("mask.png")
    defer mask.Close()
    maskPart, _ := writer.CreateFormFile("mask", "mask.png")
    io.Copy(maskPart, mask)

    writer.WriteField("prompt", "A sunlit indoor lounge area with a pool")
    writer.WriteField("n", "1")
    writer.WriteField("size", "1024x1024")
    writer.Close()

    req, _ := http.NewRequest("POST", "https://api.tokenlab.sh/v1/images/edits", body)
    req.Header.Set("Authorization", "Bearer sk-your-api-key")
    req.Header.Set("Content-Type", writer.FormDataContentType())

    client := &http.Client{}
    resp, _ := client.Do(req)
    defer resp.Body.Close()

    result, _ := io.ReadAll(resp.Body)
    fmt.Println(string(result))
}
<?php
$ch = curl_init('https://api.tokenlab.sh/v1/images/edits');

$image = new CURLFile('sunlit_lounge.png', 'image/png', 'sunlit_lounge.png');
$mask = new CURLFile('mask.png', 'image/png', 'mask.png');

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer sk-your-api-key'
    ],
    CURLOPT_POSTFIELDS => [
        'model' => 'gpt-image-2',
        'image' => $image,
        'mask' => $mask,
        'prompt' => 'A sunlit indoor lounge area with a pool',
        'n' => 1,
        'size' => '1024x1024'
    ]
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
echo $data['data'][0]['url'];
{
  "created": 1706000000,
  "data": [
    {
      "url": "https://..."
    }
  ]
}

注意事項

リモート画像の取得失敗は、生成開始前に入力エラーとして返されます。アクセスできない URL、timeout、403/404 応答、プライベート/内部ホスト、URL 内の認証情報やフラグメント、画像ではないコンテンツ、未対応形式、サイズ制限超過は 400 または 413 を返し、image_url / image_urls[n] 入力を示します。プライベートまたはヘッダー保護された素材は、multipart image ファイルとして直接アップロードするか、/v1/files 参照を作成してください。