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

# Gemini Image generation

## Request

<CodeGroup>
  ```shellscript cURL theme={null}
  curl --location 'https://api.znapai.com/gemini/v1beta/models/gemini-3.1-flash-image-preview:generateContent' \
  --header 'x-goog-api-key: $ZnapAI_API_KEY' \
  --header 'Content-Type: application/json' \
  --header 'spend-logs-metadata: {"user_id": "user-123", "project_id": "proj_abc", "env": "production"}' \
  --data '{
      "contents": [{
        "parts": [
          {"text": "Create a picture of an F35 flying"}
        ]
      }]
    }'
  ```
</CodeGroup>

## Response

<Frame>
  <img src="https://mintcdn.com/znapai/evv7zK2wdD9gNlYj/images/candidates_0__content_parts_0__inlineData_data.jpg?fit=max&auto=format&n=evv7zK2wdD9gNlYj&q=85&s=ba0a6817387a93bffffc223e55ebb461" alt="Candidates 0 Content Parts 0 Inline Data Data" width="1408" height="768" data-path="images/candidates_0__content_parts_0__inlineData_data.jpg" />
</Frame>

```json theme={null}
{
    "candidates": [
        {
            "content": {
                "parts": [
                    {
                        "inlineData": {
                            "mimeType": "image/jpeg",
                            "data": "/9j/4AAQSkZJRgABAQEBLAEsAAD/+JpoOGMBqHGeRke60T7CXodaqWL92nEd0z8JH8Nvu24UMiCgWZSpq0jSaejI2QA3Y8NFdzPJtcHM4IqqhRR4WUV359PPHxmn/Vkn2yowWe3OXfCfXQhtSiN0hUk2KrjFmI5TyG18="
                    }
                ],
                "role": "model"
            },
            "finishReason": "STOP",
            "index": 0
        }
    ],
    "usageMetadata": {
        "promptTokenCount": 9,
        "candidatesTokenCount": 1586,
        "totalTokenCount": 1595,
        "promptTokensDetails": [
            {
                "modality": "TEXT",
                "tokenCount": 9
            }
        ],
        "candidatesTokensDetails": [
            {
                "modality": "IMAGE",
                "tokenCount": 1120
            }
        ]
    },
    "modelVersion": "gemini-3.1-flash-image-preview",
    "responseId": "Y3Lead_eL62Ag8UP-tun8QU"
}
```

***

# Image generation using Gemini model with additional parameters and tool calling

## Request

<CodeGroup>
  ```shellscript cURL theme={null}
  curl --location 'https://api.znapai.com/v1beta/models/gemini-3.1-flash-image-preview:generateContent' \
  --header 'x-goog-api-key: $ZnapAI_API_KEY' \
  --header 'Content-Type: application/json' \
  --header 'spend-logs-metadata: {"user_id": "user-123", "project_id": "proj_abc", "env": "production"}' \
  --data '{
      "contents": [{"parts": [{"text": "Visualize the current weather forecast for the next 5 days in San Francisco as a clean, modern weather chart. Add a visual on what I should wear each day"}]}],
      "tools": [{"google_search": {}}],
      "generationConfig": {
        "responseModalities": ["TEXT", "IMAGE"],
        "imageConfig": {"aspectRatio": "16:9",  "imageSize": "2K"}
      }
    }'
  ```
</CodeGroup>

## Response

<Frame>
  <Frame>
    <img src="https://mintcdn.com/znapai/evv7zK2wdD9gNlYj/images/candidates_0__content_parts_0__inlineData_data-(1).jpg?fit=max&auto=format&n=evv7zK2wdD9gNlYj&q=85&s=3b15547c7fff7fec33ded4c562a8b934" alt="Candidates 0 Content Parts 0 Inline Data Data (1)" width="2752" height="1536" data-path="images/candidates_0__content_parts_0__inlineData_data-(1).jpg" />
  </Frame>
</Frame>

```json theme={null}
{
    "candidates": [
        {
            "content": {
                "parts": [
                    {
                        "inlineData": {
                            "mimeType": "image/jpeg",
                            "data": "/9j/4AAQSkZJRgABAQEBLAEsAAD/P2oO6jEwp8Kpx9u64pFvqRiLEPY0UjEW2XmNMgbG4E8u0G9BMV+IN8Bo1UFcJ5dIUw=="
                        }
                    ],
                    "role": "model"
                },
                "finishReason": "STOP",
                "index": 0,
                "groundingMetadata": {
                    "searchEntryPoint": {
                        "renderedContent": "<style>\n.container {\n  align-items: center;\n  border-radius: 8px;\n  display: flex;\n  font-family: Google Sans, Roboto, sans-serif;\n  font-size: 14px;\n  line-height: 20px;\n  padding: 8px 12px;\n}\n.chip {\n  display: inline-block;\n  border: solid 1px;\n  border-radius: 16px;\n  min-width: 14px;\n  padding: 5px 16px;\n  text-align: center;\n  user-select: none;\n  margin: 0 8px;\n  -webkit-tap-highlight-color: transparent;\n}\n.carousel {\n  overflow: auto;\n  scrollbar-width: none;\n  white-space: nowrap;\n  margin-right: -12px;\n}\n.headline {\n  display: flex;\n  margin-right: 4px;\n}\n.gradient-container {\n  position: relative;\n}\n.gradient {\n  position: absolute;\n  transform: translate(3px, -9px);\n  height: 36px;\n  width: 9px;\n}\n@media (prefers-color-scheme: light) {\n  .container {\n    background-color: #fafafa;\n    box-shadow: 0 0 0 1px #0000000f;\n  }\n  .headline-label {\n    color: #1f1f1f;\n  }\n  .chip {\n    background-color: #ffffff;\n    border-color: #d2d2d2;\n    color: #5e5e5e;\n    text-decoration: none;\n  }\n  .chip:hover {\n    background-color: #f2f2f2;\n  }\n  .chip:focus {\n    background-color: #f2f2f2;\n  }\n  .chip:active {\n    background-color: #d8d8d8;\n    border-color: #b6b6b6;\n  }\n  .logo-dark {\n    display: none;\n  }\n  .gradient {\n    background: linear-gradient(90deg, #fafafa 15%, #fafafa00 100%);\n  }\n}\n@media (prefers-color-scheme: dark) {\n  .container {\n    background-color: #1f1f1f;\n    box-shadow: 0 0 0 1px #ffffff26;\n  }\n  .headline-label {\n    color: #fff;\n  }\n  .chip {\n    background-color: #2c2c2c;\n    border-color: #3c4043;\n    color: #fff;\n    text-decoration: none;\n  }\n  .chip:hover {\n    background-color: #353536;\n  }\n  .chip:focus {\n    background-color: #353536;\n  }\n  .chip:active {\n    background-color: #464849;\n    border-color: #53575b;\n  }\n  .logo-light {\n    display: none;\n  }\n  .gradient {\n    background: linear-gradient(90deg, #1f1f1f 15%, #1f1f1f00 100%);\n  }\n}\n</style>\n<div class=\"container\">\n  <div class=\"headline\">\n    <svg class=\"logo-light\" width=\"18\" height=\"18\" viewBox=\"9 9 35 35\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M42.8622 27.0064C42.8622 25.7839 42.7525 24.6084 42.5487 23.4799H26.3109V30.1568H35.5897C35.1821 32.3041 33.9596 34.1222 32.1258 35.3448V39.6864H37.7213C40.9814 36.677 42.8622 32.2571 42.8622 27.0064V27.0064Z\" fill=\"#4285F4\"/>\n      <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M26.3109 43.8555C30.9659 43.8555 34.8687 42.3195 37.7213 39.6863L32.1258 35.3447C30.5898 36.3792 28.6306 37.0061 26.3109 37.0061C21.8282 37.0061 18.0195 33.9811 16.6559 29.906H10.9194V34.3573C13.7563 39.9841 19.5712 43.8555 26.3109 43.8555V43.8555Z\" fill=\"#34A853\"/>\n      <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16.6559 29.8904C16.3111 28.8559 16.1074 27.7588 16.1074 26.6146C16.1074 25.4704 16.3111 24.3733 16.6559 23.3388V18.8875H10.9194C9.74388 21.2072 9.06992 23.8247 9.06992 26.6146C9.06992 29.4045 9.74388 32.022 10.9194 34.3417L15.3864 30.8621L16.6559 29.8904V29.8904Z\" fill=\"#FBBC05\"/>\n      <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M26.3109 16.2386C28.85 16.2386 31.107 17.1164 32.9095 18.8091L37.8466 13.8719C34.853 11.082 30.9659 9.3736 26.3109 9.3736C19.5712 9.3736 13.7563 13.245 10.9194 18.8875L16.6559 23.3388C18.0195 19.2636 21.8282 16.2386 26.3109 16.2386V16.2386Z\" fill=\"#EA4335\"/>\n    </svg>\n    <svg class=\"logo-dark\" width=\"18\" height=\"18\" viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle cx=\"24\" cy=\"23\" fill=\"#FFF\" r=\"22\"/>\n      <path d=\"M33.76 34.26c2.75-2.56 4.49-6.37 4.49-11.26 0-.89-.08-1.84-.29-3H24.01v5.99h8.03c-.4 2.02-1.5 3.56-3.07 4.56v.75l3.91 2.97h.88z\" fill=\"#4285F4\"/>\n      <path d=\"M15.58 25.77A8.845 8.845 0 0 0 24 31.86c1.92 0 3.62-.46 4.97-1.31l4.79 3.71C31.14 36.7 27.65 38 24 38c-5.93 0-11.01-3.4-13.45-8.36l.17-1.01 4.06-2.85h.8z\" fill=\"#34A853\"/>\n      <path d=\"M15.59 20.21a8.864 8.864 0 0 0 0 5.58l-5.03 3.86c-.98-2-1.53-4.25-1.53-6.64 0-2.39.55-4.64 1.53-6.64l1-.22 3.81 2.98.22 1.08z\" fill=\"#FBBC05\"/>\n      <path d=\"M24 14.14c2.11 0 4.02.75 5.52 1.98l4.36-4.36C31.22 9.43 27.81 8 24 8c-5.93 0-11.01 3.4-13.45 8.36l5.03 3.85A8.86 8.86 0 0 1 24 14.14z\" fill=\"#EA4335\"/>\n    </svg>\n    <div class=\"gradient-container\"><div class=\"gradient\"></div></div>\n  </div>\n  <div class=\"carousel\">\n    <a class=\"chip\" href=\"https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGkrDkG9ZR7my5zanm4LeSqVuepETltE0195EWrpa0VYTUd3Dmv6ZMU7L2Ia0jmI22G9_SmRTJojD_0V-uqX0tAD6zT7ZgmE3Y-8yEiHHe_x3jsYIex5wYxRe-ql6E77VsG5d13PLhVuUwWw3RYIVwbq3L2WLMmV_gi5It1DKjY8ymipr3FZL-_HQakk1REieoeq1XvOgsX8vCIB8k6KvOXrab0HHvuhtbNA7T7-PNatmo3aKOOp3Pey3G9r8k=\">San Francisco current weather and clothing recommendation</a>\n    <a class=\"chip\" href=\"https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGUiDoNKNBOB-fErD6JlNE4m1ogQiqduj-bSvczVqDcw43rfLjIUcLexe3F_a6zQCiVgfSTdPaqSuyn1UgNo_aBw0HCyoM-tclofvFCqcJBAc_Qd9IH_GSG1KXpacjxgz92BIto_vkL67-IrTNSfbA_4HCMmRrYxDXJpKCGa_hr0WRH912gRo8ABkHvyxJsOdNTWd0ckUQwA6EFWiVKpjPhwPNsFuyfZz1T1s6BnOWjcKoY\">San Francisco 5-day weather forecast April 2026</a>\n  </div>\n</div>\n"
                    },
                    "groundingChunks": [
                        {
                            "web": {
                                "uri": "https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH6YE7qjDm9XDBfg2DNU5jaK9nYfQ1W8k-vb-Xg0aqbkJn8LWkT5SaBDFlsreSeVrFVl4mjFlLjQuVZKrZZRpUPnSVBkabkENWLUc4srlaDzhr2-egP0K7y_sSQ67KWpbeplLE5WtFyVoL_tFRp5pUfUn4RBpgMllFp",
                                "title": "sftourismtips.com"
                            }
                        },
                        {
                            "web": {
                                "uri": "https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHwiuxln0bc0hLj-q141I8u3JbRDx9Vo8kYoFJP5svPXlRainK9o7uM5tRlZrDWM1uu3EeMOp_SY_uv7jSZ3KyISJnfMU0F4lzNDMgkHX4LL2MP9k7RNcyoiqfpOh9JEIpCAGjndtVH3xuDCG0wpcJbX7ti8OHbPE4L9mmnbUnJx-V97dSt",
                                "title": "accuweather.com"
                            }
                        },
                        {
                            "web": {
                                "uri": "https://www.google.com/search?q=weather+in+San Francisco, CA,+US",
                                "title": "google.com"
                            }
                        }
                    ],
                    "webSearchQueries": [
                        "",
                        "San Francisco 5-day weather forecast April 2026",
                        "San Francisco current weather and clothing recommendation"
                    ]
                }
            }
        ],
        "usageMetadata": {
            "promptTokenCount": 32,
            "candidatesTokenCount": 1796,
            "totalTokenCount": 1828,
            "promptTokensDetails": [
                {
                    "modality": "TEXT",
                    "tokenCount": 32
                }
            ],
            "candidatesTokensDetails": [
                {
                    "modality": "IMAGE",
                    "tokenCount": 1120
                }
            ]
        },
        "modelVersion": "gemini-3.1-flash-image-preview",
        "responseId": "NHrNafm2FZaWg8UPo-TQ6Ak"
    }
```

***

## Parameters

<ParamField path="spend-logs-metadata" type="header" required={false}>
  An optional header used for spend logging metadata, containing JSON properties like `user_id`, `project_id`, and `env`.
</ParamField>

<ParamField path="contents" type="array" required>
  The conversation history or input prompts as an array of content objects.

  <Expandable title="contents[]" defaultOpen="True">
    <ResponseField name="role" type="string">
      The role of the creator of the content (e.g. `"user"` or `"model"`).
    </ResponseField>

    <ResponseField name="parts" type="array" required>
      An ordered list of parts that constitute a single message turn.

      <Expandable title="parts[]" defaultOpen="True">
        <ResponseField name="text" type="string">
          The text prompt or description for image generation.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ParamField>

<ParamField path="systemInstruction" type="object">
  Instructions to the model that dictate how it should behave.

  <Expandable title="systemInstruction" defaultOpen="True">
    <ResponseField name="parts" type="array" required>
      An ordered list of parts that constitute the system instruction.

      <Expandable title="parts[]" defaultOpen="True">
        <ResponseField name="text" type="string">
          The text of the system instruction.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ParamField>

<ParamField path="tools" type="array">
  A list of tools the model may call. Supports `google_search` for search grounding.
</ParamField>

<ParamField path="toolConfig" type="object">
  Tool configuration for any `Tool` specified in the request.

  <Expandable title="toolConfig" defaultOpen="False">
    <ResponseField name="function_calling_config" type="object">
      Configuration for function calling behavior.

      <Expandable title="function_calling_config">
        <ResponseField name="mode" type="string">
          Controls how the model uses the provided functions. One of:

          * `"AUTO"` — model decides whether to call a function or respond
          * `"ANY"` — model must call one of the provided functions
          * `"NONE"` — model must not call any functions
        </ResponseField>

        <ResponseField name="allowed_function_names" type="array">
          Optional. Limits the model to only call functions from this list when `mode` is `"ANY"`.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ParamField>

<ParamField path="generationConfig" type="object">
  Configuration options for the generation.

  <Expandable title="generationConfig" defaultOpen="True">
    <ResponseField name="temperature" type="number">
      Controls the randomness of the output.
    </ResponseField>

    <ResponseField name="topP" type="number">
      The maximum cumulative probability of tokens to consider when sampling.
    </ResponseField>

    <ResponseField name="topK" type="number">
      The maximum number of tokens to consider when sampling.
    </ResponseField>

    <ResponseField name="maxOutputTokens" type="number">
      The maximum number of tokens to include in a candidate.
    </ResponseField>

    <ResponseField name="candidateCount" type="integer">
      Number of generated responses to return. Currently only `1` is supported for image generation.
    </ResponseField>

    <ResponseField name="stopSequences" type="array">
      A list of sequences that will stop generation.
    </ResponseField>

    <ResponseField name="responseModalities" type="array">
      Allowed modalities of the output. Use `["TEXT", "IMAGE"]` to request image output.
    </ResponseField>

    <ResponseField name="imageConfig" type="object">
      Settings for generating images.

      <Expandable title="imageConfig" defaultOpen="True">
        <ResponseField name="aspectRatio" type="string">
          Aspect ratio of the generated image (e.g. `16:9`, `1:1`).
        </ResponseField>

        <ResponseField name="imageSize" type="string">
          Output image resolution level (e.g. `1K`, `2K`, `4K`).
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ParamField>

<ParamField path="safetySettings" type="array">
  A list of unique safety settings for blocking unsafe content.

  <Expandable title="safetySettings[]" defaultOpen="True">
    <ResponseField name="category" type="string">
      The category for this setting (e.g., `HARM_CATEGORY_HATE_SPEECH`).
    </ResponseField>

    <ResponseField name="threshold" type="string">
      The threshold for blocking (e.g., `BLOCK_MEDIUM_AND_ABOVE`).
    </ResponseField>
  </Expandable>
</ParamField>

***

## Params to Avoid

| Param                                                   | Reason                                                                                                                                      |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `prompt`, `n`, `size`, `quality`                        | OpenAI/Azure OpenAI parameters; sending these at the root level will fail schema validation. Use `contents` and `generationConfig` instead. |
| `response_format`, `output_format`                      | Not supported by the Gemini API. Response format is determined by `responseModalities`.                                                     |
| `background`, `output_compression`, `style`             | OpenAI/Azure specific parameters; not supported by Gemini models.                                                                           |
| `generationConfig.responseMimeType: "application/json"` | Not supported when `responseModalities` includes `"IMAGE"`.                                                                                 |
| `spend-logs-metadata`                                   | This metadata must be passed as an HTTP header, not in the JSON request body                                                                |

<Warning>
  Ensure you do not mix OpenAI or Azure-specific parameters (such as `prompt`, `size`, `quality`, or `n`) with Gemini's request structure. Gemini expects prompt text inside the nested `contents.parts` object.
</Warning>
