Skip to main content
Gemini 2.5 Flash Image (Stream) generates images using Google’s Gemini 2.5 Flash Image model through the native Gemini API via AnyFast. Responses are delivered in real-time using Server-Sent Events (SSE), with thinking chunks arriving first followed by the image data chunk.
Streaming requires a Direct group token. Select the Direct group when creating your token in the AnyFast console.

Key capabilities

  • SSE Streaming — Real-time delivery of thinking and image chunks
  • Thinking mode — Internal reasoning chunks (thought: true) stream before the final image
  • Text-to-image — Generate images from text descriptions
  • Image editing — Pass a reference image in inline_data alongside your text instruction
  • Aspect ratio control1:1, 4:3, 3:4, 16:9, 9:16
  • Resolution control1K (~1024px), 2K (~2048px), 4K (~4096px) on the long edge

SSE response format

The streaming endpoint returns newline-delimited SSE lines. Each line starts with data: followed by a JSON object. There are three chunk types:
  1. Thinking chunks — Arrive first; parts[0].thought is true
  2. Image chunk — Contains parts[0].inlineData with mimeType and base64 data (note: camelCase in stream response)
  3. Final usage chunk — Contains top-level usageMetadata with thoughtsTokenCount and token details
data: {"candidates":[{"content":{"role":"model","parts":[{"text":"...","thought":true}]}}],"usageMetadata":{"trafficType":"ON_DEMAND"},"modelVersion":"gemini-2.5-flash-image","createTime":"...","responseId":"..."}

data: {"candidates":[{"content":{"role":"model","parts":[{"inlineData":{"mimeType":"image/png","data":"<base64>"}}]}}],...}

data: {"usageMetadata":{"promptTokenCount":8,"candidatesTokenCount":1120,"totalTokenCount":1392,"trafficType":"ON_DEMAND","promptTokensDetails":[{"modality":"TEXT","tokenCount":8}],"candidatesTokensDetails":[{"modality":"IMAGE","tokenCount":1120}],"thoughtsTokenCount":264}}
In the streaming response, the image field is named inlineData (camelCase). In the non-streaming request body, the field is inline_data (snake_case). This is a native Gemini API behaviour.

Text-to-image example

curl "https://www.anyfast.ai/v1beta/models/gemini-2.5-flash-image:streamGenerateContent?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      {
        "role": "user",
        "parts": [
          { "text": "Generate an image of a sunset over mountains" }
        ]
      }
    ],
    "generationConfig": {
      "responseModalities": ["TEXT", "IMAGE"],
      "imageConfig": {
        "aspectRatio": "16:9",
        "imageSize": "1K"
      }
    }
  }'
import requests, base64, json

url = "https://www.anyfast.ai/v1beta/models/gemini-2.5-flash-image:streamGenerateContent"
params = {"key": "YOUR_API_KEY"}
data = {
    "contents": [
        {
            "role": "user",
            "parts": [{"text": "Generate an image of a sunset over mountains"}]
        }
    ],
    "generationConfig": {
        "responseModalities": ["TEXT", "IMAGE"],
        "imageConfig": {"aspectRatio": "16:9", "imageSize": "1K"}
    }
}

response = requests.post(url, params=params, json=data, stream=True)

for line in response.iter_lines():
    if not line:
        continue
    decoded = line.decode("utf-8")
    if not decoded.startswith("data:"):
        continue
    chunk = json.loads(decoded[len("data:"):].strip())

    candidates = chunk.get("candidates", [])
    if not candidates:
        continue
    parts = candidates[0].get("content", {}).get("parts", [])
    for part in parts:
        # Skip thinking chunks
        if part.get("thought"):
            continue
        # Save image chunk
        if "inlineData" in part:
            img_bytes = base64.b64decode(part["inlineData"]["data"])
            with open("output.png", "wb") as f:
                f.write(img_bytes)
            print("Image saved to output.png")

Image editing example (with reference image)

Include both a text instruction and an inline_data reference image in the same parts array.
# First encode your image to base64:
# BASE64=$(base64 -i your_photo.jpg)
#
# Then send the request:
curl "https://www.anyfast.ai/v1beta/models/gemini-2.5-flash-image:streamGenerateContent?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      {
        "role": "user",
        "parts": [
          {
            "text": "Hi, this is a picture of me. Can you add a llama next to me?"
          },
          {
            "inline_data": {
              "mime_type": "image/jpeg",
              "data": "<YOUR_BASE64_ENCODED_IMAGE>"
            }
          }
        ]
      }
    ],
    "generationConfig": {
      "responseModalities": ["TEXT", "IMAGE"],
      "imageConfig": {
        "aspectRatio": "1:1",
        "imageSize": "1K"
      }
    }
  }'
import requests, base64, json

# Read and encode your reference image
with open("your_photo.jpg", "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode("utf-8")

url = "https://www.anyfast.ai/v1beta/models/gemini-2.5-flash-image:streamGenerateContent"
params = {"key": "YOUR_API_KEY"}
data = {
    "contents": [
        {
            "role": "user",
            "parts": [
                {
                    "text": "Hi, this is a picture of me. Can you add a llama next to me?"
                },
                {
                    "inline_data": {
                        "mime_type": "image/jpeg",
                        "data": image_b64
                    }
                }
            ]
        }
    ],
    "generationConfig": {
        "responseModalities": ["TEXT", "IMAGE"],
        "imageConfig": {"aspectRatio": "1:1", "imageSize": "1K"}
    }
}

response = requests.post(url, params=params, json=data, stream=True)

for line in response.iter_lines():
    if not line:
        continue
    decoded = line.decode("utf-8")
    if not decoded.startswith("data:"):
        continue
    chunk = json.loads(decoded[len("data:"):].strip())

    candidates = chunk.get("candidates", [])
    if not candidates:
        continue
    parts = candidates[0].get("content", {}).get("parts", [])
    for part in parts:
        if part.get("thought"):
            continue
        if "inlineData" in part:
            img_bytes = base64.b64decode(part["inlineData"]["data"])
            with open("output.png", "wb") as f:
                f.write(img_bytes)
            print("Image saved to output.png")

Parameters

ParameterTypeRequiredDescription
keystringYesAPI key (query parameter)
altstringNoSet to sse for explicit SSE mode (optional, streaming is default)
contents[].parts[].textstringYesText prompt or instruction
contents[].parts[].inline_data.mime_typestringNoReference image type: image/jpeg, image/png, image/webp
contents[].parts[].inline_data.datastringNoBase64-encoded reference image
generationConfig.responseModalitiesarrayYes["IMAGE"] or ["TEXT", "IMAGE"]
generationConfig.imageConfig.aspectRatiostringNo1:1 / 4:3 / 3:4 / 16:9 / 9:16
generationConfig.imageConfig.imageSizestringNo1K / 2K / 4K (default: 1K)

API Reference

View the interactive API playground for Gemini 2.5 Flash Image (Stream).