> ## Documentation Index
> Fetch the complete documentation index at: https://docs.auriko.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Image generation

> Generate images with Gemini models in chat completions

Send a text prompt to an image-capable model and receive base64-encoded images in `choices[0].message.images`.

## Prerequisites

* An [Auriko API key](https://auriko.ai/signup?redirectTo=%2Fdashboard%3Ftab%3Dapi-keys)
* Python 3.10+ with the OpenAI SDK (`pip install openai`) or the auriko SDK (`pip install auriko`)
  * OR Node.js 18+ with the OpenAI SDK (`npm install openai`) or `@auriko/sdk` (`npm install @auriko/sdk`)
* An image-capable model: `gemini-2.5-flash-image`, `gemini-3-pro-image`, or `gemini-3.1-flash-image`

## Generate images

Create a chat completion with an image-capable model and save the generated image:

<CodeGroup>
  ```python Python OpenAI theme={null}
  import os
  import base64
  from openai import OpenAI

  client = OpenAI(
      api_key=os.environ["AURIKO_API_KEY"],
      base_url="https://api.auriko.ai/v1",
  )

  response = client.chat.completions.create(
      model="gemini-2.5-flash-image",
      messages=[{
          "role": "user",
          "content": "Draw a cartoon cat wearing a top hat",
      }],
  )

  image = response.choices[0].message.images[0]
  image_bytes = base64.b64decode(image["data"])

  with open("output.png", "wb") as f:
      f.write(image_bytes)

  print(f"Saved {image['mime_type']} image ({len(image_bytes)} bytes)")
  ```

  ```typescript TypeScript OpenAI theme={null}
  import OpenAI from "openai";
  import { writeFileSync } from "fs";

  const client = new OpenAI({
      apiKey: process.env.AURIKO_API_KEY,
      baseURL: "https://api.auriko.ai/v1",
  });

  const response = await client.chat.completions.create({
      model: "gemini-2.5-flash-image",
      messages: [{
          role: "user",
          content: "Draw a cartoon cat wearing a top hat",
      }],
  });

  const image = response.choices[0].message.images[0];
  const imageBytes = Buffer.from(image.data, "base64");

  writeFileSync("output.png", imageBytes);

  console.log(`Saved ${image.mime_type} image (${imageBytes.length} bytes)`);
  ```

  ```python Python Auriko theme={null}
  import os
  import base64
  from auriko import Client

  client = Client(
      api_key=os.environ["AURIKO_API_KEY"],
      base_url="https://api.auriko.ai/v1",
  )

  response = client.chat.completions.create(
      model="gemini-2.5-flash-image",
      messages=[{
          "role": "user",
          "content": "Draw a cartoon cat wearing a top hat",
      }],
  )

  image = response.choices[0].message.images[0]
  image_bytes = base64.b64decode(image["data"])

  with open("output.png", "wb") as f:
      f.write(image_bytes)

  print(f"Saved {image['mime_type']} image ({len(image_bytes)} bytes)")
  ```

  ```typescript TypeScript Auriko theme={null}
  import { Client } from "@auriko/sdk";
  import { writeFileSync } from "fs";

  const client = new Client({
      apiKey: process.env.AURIKO_API_KEY,
      baseUrl: "https://api.auriko.ai/v1",
  });

  const response = await client.chat.completions.create({
      model: "gemini-2.5-flash-image",
      messages: [{
          role: "user",
          content: "Draw a cartoon cat wearing a top hat",
      }],
  });

  const image = response.choices[0].message.images[0];
  const imageBytes = Buffer.from(image.data, "base64");

  writeFileSync("output.png", imageBytes);

  console.log(`Saved ${image.mime_type} image (${imageBytes.length} bytes)`);
  ```

  ```bash cURL theme={null}
  curl https://api.auriko.ai/v1/chat/completions \
    -H "Authorization: Bearer $AURIKO_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "gemini-2.5-flash-image",
      "messages": [{
        "role": "user",
        "content": "Draw a cartoon cat wearing a top hat"
      }]
    }' | jq -r '.choices[0].message.images[0].data' | base64 --decode > output.png
  ```
</CodeGroup>

`image_tokens` in `usage.completion_tokens_details` reports tokens consumed by generated images. The `images` field is absent when no images are generated. In streaming responses, images arrive complete in a single `delta` chunk.

## Response shape

Each entry in the `images` array is a `GeneratedImage` object:

| Field               | Type      | Description                           |
| ------------------- | --------- | ------------------------------------- |
| `type`              | `string`  | Always `"image"`                      |
| `mime_type`         | `string`  | MIME type (e.g., `image/png`)         |
| `data`              | `string`  | Base64-encoded image data             |
| `thought_signature` | `string?` | Opaque model signature. Response-only |

## Related

* [Vision](/guides/vision) — analyze images in chat completions
* [Streaming](/guides/streaming) — stream image responses chunk-by-chunk
* [Extensions and thinking](/guides/extensions-and-thinking) — pass provider-specific parameters
