Source: https://ailoot.ai/docs/fr-ca/api/gemini/
Canonical: https://ailoot.ai/docs/fr-ca/api/gemini/
Language: fr-ca

[API](https://ailoot.ai/docs/fr-ca/) 

# Gemini generateContent

[Markdown](https://ailoot.ai/docs/fr-ca/api/gemini/index.md)

Format natif Google Gemini, pour Gemini CLI, Google GenAI SDK et les clients REST.

POST`https://api.ailoot.ai/v1beta/models/{model}:generateContent`

Gemini generateContent

```bash
curl "https://api.ailoot.ai/v1beta/models/gemini-3.8-flash:generateContent" \
  -H "x-goog-api-key: $AILOOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      {"role": "user", "parts": [{"text": "Propose trois noms pour un café."}]}
    ]
  }' 
```

```python
from google import genai
from google.genai import types
import os

client = genai.Client(
    api_key=os.environ["AILOOT_API_KEY"],
    http_options=types.HttpOptions(base_url="https://api.ailoot.ai"),  # sans /v1beta
)

resp = client.models.generate_content(
    model="gemini-3.8-flash",
    contents="Propose trois noms pour un café.",
)
print(resp.text)
```

```js
import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({
  apiKey: process.env.AILOOT_API_KEY,
  httpOptions: { baseUrl: "https://api.ailoot.ai" }, // sans /v1beta
});

const resp = await ai.models.generateContent({
  model: "gemini-3.8-flash",
  contents: "Propose trois noms pour un café.",
});
console.log(resp.text);
```

200 OK

```json
{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [{ "text": "1. « Grain et vapeur » 2. « La mouture du matin » 3. « Le café du coin »" }]
      },
      "finishReason": "STOP"
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 9,
    "candidatesTokenCount": 27,
    "totalTokenCount": 36
  },
  "modelVersion": "gemini-3.8-flash"
}
```

## Autorisation

| Paramètre | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `x-goog-api-key` | header | obligatoire | Clé `sk-…`. Conviennent également `Authorization: Bearer` ou `x-api-key`. Pour la compatibilité avec Google, est également accepté `?key=` dans l’URL, avec la priorité la plus faible; `?api_key=` est rejeté avec 400. Nous recommandons un en-tête pour que la clé n’apparaisse pas dans les journaux. |

## Chemin

| Paramètre | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `model` | string | obligatoire | ID d’un modèle prenant en charge le format Gemini, par exemple `gemini-3.8-flash` ou `gemini-3.1-pro`. Il y en a 27 au total. |

POST`https://api.ailoot.ai/v1beta/models/{model}:streamGenerateContent?alt=sse`

GET`https://api.ailoot.ai/v1beta/models`

## Corps de la requête

| Paramètre | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `contents` | array | obligatoire | Messages avec `role` (`user`/`model`) et `parts` : text, inlineData/fileData, functionCall/functionResponse. Les pièces jointes doivent correspondre aux entrées acceptées par le modèle. |
| `systemInstruction` | object | facultatif | Instruction système textuelle : `{"parts": [{"text": "…"}]}`. |
| `generationConfig` | object | facultatif | `generationConfig` accepte `temperature`, `topP`, `topK`, `maxOutputTokens`, `thinkingConfig`, `responseMimeType` (`text/plain` ou `application/json`), `responseSchema` ou `responseJsonSchema` (objet JSON), `stopSequences` (tableau de chaînes), `candidateCount: 1`, le paramètre entier `seed`, les paramètres numériques `presencePenalty` et `frequencyPenalty`. Les plages et capacités dépendent du modèle exact. Pour une réponse JSON, choisissez une seule forme de schéma prise en charge et `application/json`. Pour les modèles textuels, `responseModalities` — uniquement `["TEXT"]`. |
| `safetySettings` | array | facultatif | Objets avec les champs obligatoires `category` et `threshold`, le champ facultatif `method`. Les valeurs doivent être prises en charge par le modèle exact. |
| `tools` | array | facultatif | Les déclarations côté client `functionDeclarations` sont exécutées par votre application. Les modèles textuels acceptent aussi `{"googleSearch": {}}` et `{"urlContext": {}}`, séparément ou ensemble dans le tableau `tools`. Ni Google Search ni URL context ne peuvent être combinés avec `functionDeclarations` dans une même requête. Pour générer des images en sortie, seules les fonctions côté client sont disponibles. Les autres outils intégrés et la mise en cache explicite (explicit cache) ne sont pas pris en charge. Search/URL context peuvent exiger une réserve couvrant la limite d’entrée complète; les valeurs réelles `toolUsePromptTokenCount` sont comptées comme jetons d’entrée. |
| `toolConfig` | object | facultatif | `functionCallingConfig` : mode (AUTO/ANY/NONE/VALIDATED/MODE\_UNSPECIFIED), allowedFunctionNames. |

Si le modèle ne prend pas en charge un champ, une pièce jointe ou une combinaison d’outils, la requête est rejetée avant la réserve, sans débit. Vous recevrez un statut HTTP `400` avec `status` `INVALID_ARGUMENT` et la classe `invalid_request` (dans `ErrorInfo.reason` — `INVALID_REQUEST`). Un JSON incorrect, des erreurs de paramètres de chemin ou d’autres validations renvoient aussi `400`; lisez le message d’erreur et le Request ID. Les capacités dépendent du modèle : vérifiez ses formats et entrées dans le catalogue.

## PDF, audio, vidéo et liens

Pour les modèles Gemini prenant en charge l’entrée concernée, `parts[].inlineData` contient `mimeType` et des données base64 non vides; le PDF doit être un véritable fichier PDF. `fileData` contient une URL publique `https` dans `fileUri` et le type MIME du fichier. Pour YouTube, le MIME peut être omis. `http`, les adresses privées, `gs://` et les objets Google Files API ne sont pas pris en charge, pas plus que les téléversements par Google Files API. Pour la vidéo, vous pouvez ajouter `videoMetadata` : `startOffset`/`endOffset` sous forme de chaîne exprimée en secondes (par exemple, `1.5s`) et `fps` supérieur à 0 et inférieur ou égal à 24. La taille du corps, le contexte, l’entrée autorisée et la limite de réponse sont vérifiés selon le modèle et le format.

| Entrée | MIME pris en charge |
| --- | --- |
| Images intégrées (inline) | image/png, image/jpeg, image/webp |
| Documents | application/pdf; text/plain, text/html, text/css, text/csv, text/xml, text/rtf, text/markdown, text/javascript, application/x-javascript, text/x-python, application/x-python |
| Audio | audio/wav, audio/mp3, audio/mpeg, audio/aiff, audio/aac, audio/ogg, audio/flac |
| Vidéo | video/mp4, video/mpeg, video/mov, video/quicktime, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp |

```python
import json, os, urllib.request

def generate(model, payload):
    req = urllib.request.Request(
        "https://api.ailoot.ai/v1beta/models/" + model + ":generateContent",
        data=json.dumps(payload).encode(),
        headers={"x-goog-api-key": os.environ["AILOOT_API_KEY"],
                 "Content-Type": "application/json"},
    )
    # Un seul envoi. En cas de dépassement du délai, vérifiez le Request ID dans votre historique d’utilisation avant de réessayer.
    with urllib.request.urlopen(req, timeout=300) as response:
        print("Request ID:", response.headers.get("X-Request-ID"))
        return json.load(response)

import base64, pathlib, sys

# Fournissez un fichier PDF, audio ou vidéo local réel, avec son type MIME pris en charge.
path, mime = pathlib.Path(sys.argv[1]), sys.argv[2]
payload = {"contents": [{"role": "user", "parts": [
    {"text": "Décris brièvement le contenu du fichier."},
    {"inlineData": {"mimeType": mime,
                    "data": base64.b64encode(path.read_bytes()).decode()}},
]}]}
print(generate("gemini-3.8-flash", payload))
# Autre pièce jointe : {"fileData": {"mimeType": mime, "fileUri": public_https_url}}
# Pour une URL YouTube réelle : {"fileData": {"fileUri": youtube_url}}
```

## Search et URL context

Les déclarations côté client `functionDeclarations` sont exécutées par votre application. Les modèles textuels acceptent aussi `{"googleSearch": {}}` et `{"urlContext": {}}`, séparément ou ensemble dans le tableau `tools`. Ni Google Search ni URL context ne peuvent être combinés avec `functionDeclarations` dans une même requête. Pour générer des images en sortie, seules les fonctions côté client sont disponibles. Les autres outils intégrés et la mise en cache explicite (explicit cache) ne sont pas pris en charge. Search/URL context peuvent exiger une réserve couvrant la limite d’entrée complète; les valeurs réelles `toolUsePromptTokenCount` sont comptées comme jetons d’entrée.

```json
{"tools": [{"googleSearch": {}}, {"urlContext": {}}]}
```

## Images en sortie

Seul le modèle suivant peut produire des images dans une réponse au format Gemini : `gemini-3.1-flash-image`. Cette capacité est distincte de `/v1/images/generations` : les autres modèles d’image ne fonctionnent pas ici. Ce modèle accepte jusqu’à 131072 jetons en entrée et 32768 en réponse; le coût total de la réponse la plus longue est réservé à l’avance.

`responseModalities` — ensemble non vide de TEXT/IMAGE, sans doublons. `imageConfig.imageSize` : 1K/2K/4K ; `aspectRatio` : 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, 1:4, 4:1, 1:8, 8:1. Ce modèle accepte du texte et des images inline PNG/JPEG/WebP. PDF/audio/video/fileData et les outils intégrés Search/URL context ne sont pas acceptés ici. La disponibilité et les prix pour votre clé figurent dans le catalogue et dans `GET /v1/models`.

```python
import json, os, urllib.request

def generate(model, payload):
    req = urllib.request.Request(
        "https://api.ailoot.ai/v1beta/models/" + model + ":generateContent",
        data=json.dumps(payload).encode(),
        headers={"x-goog-api-key": os.environ["AILOOT_API_KEY"],
                 "Content-Type": "application/json"},
    )
    # Un seul envoi. En cas de dépassement du délai, vérifiez le Request ID dans votre historique d’utilisation avant de réessayer.
    with urllib.request.urlopen(req, timeout=300) as response:
        print("Request ID:", response.headers.get("X-Request-ID"))
        return json.load(response)

import base64, pathlib

reply = generate("gemini-3.1-flash-image", {
    "contents": [{"role": "user", "parts": [{"text": "Aquarelle : un phare à l’aube"}]}],
    "generationConfig": {
        "responseModalities": ["TEXT", "IMAGE"],
        "imageConfig": {"aspectRatio": "1:1", "imageSize": "1K"},
    },
})
index = 0
for candidate in reply.get("candidates", []):
    for part in candidate.get("content", {}).get("parts", []):
        if "text" in part:
            print(part["text"])
        blob = part.get("inlineData", {})
        if blob.get("mimeType", "").startswith("image/") and blob.get("data"):
            index += 1
            extension = {"image/png": "png", "image/jpeg": "jpg",
                         "image/webp": "webp"}.get(blob["mimeType"], "bin")
            pathlib.Path(f"gemini-image-v{index}.{extension}").write_bytes(
                base64.b64decode(blob["data"]))
print("All returned images:", index)
```

## Cycle complet d’appel de fonctions

Les fonctions sont exécutées par le client. Renvoyez tout le content d’origine du modèle avec thoughtSignature sans modification, puis functionResponse avec les mêmes name et id, si id figurait dans functionCall.

```python
import json, os, urllib.request

def generate(model, payload):
    req = urllib.request.Request(
        "https://api.ailoot.ai/v1beta/models/" + model + ":generateContent",
        data=json.dumps(payload).encode(),
        headers={"x-goog-api-key": os.environ["AILOOT_API_KEY"],
                 "Content-Type": "application/json"},
    )
    # Un seul envoi. En cas de dépassement du délai, vérifiez le Request ID dans votre historique d’utilisation avant de réessayer.
    with urllib.request.urlopen(req, timeout=300) as response:
        print("Request ID:", response.headers.get("X-Request-ID"))
        return json.load(response)

tools = [{"functionDeclarations": [{
    "name": "multiply", "description": "Multiplier deux nombres",
    "parameters": {"type": "object", "properties": {
        "a": {"type": "number"}, "b": {"type": "number"}},
        "required": ["a", "b"]},
}]}]
contents = [{"role": "user", "parts": [{"text": "Multiplie 7 par 8 à l’aide de la fonction"}]}]
for turn in range(4):  # Limitez la boucle d’outils ; ne renvoyez pas une requête dont le résultat est incertain.
    reply = generate("gemini-3.8-flash", {"contents": contents, "tools": tools})
    content = reply["candidates"][0]["content"]
    contents.append(content)  # Conservez TOUTES (ALL) les parties (parts) d’origine et thoughtSignature sans les modifier.
    results = []
    for part in content.get("parts", []):
        call = part.get("functionCall")
        if not call:
            continue
        if call["name"] != "multiply":
            raise ValueError("Unexpected function")
        args = call["args"]
        result = {"name": call["name"], "response": {"value": args["a"] * args["b"]}}
        if "id" in call:
            result["id"] = call["id"]
        results.append({"functionResponse": result})
    if not results:
        print(content)
        break
    contents.append({"role": "user", "parts": results})
else:
    raise RuntimeError("Tool loop limit reached")
```

## Réponse

| Paramètre | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `candidates[].content.parts` | array |  | Réponse du modèle. |
| `usageMetadata` | object |  | `promptTokenCount`, `candidatesTokenCount`, `totalTokenCount`. |

La réponse Gemini facturée arrive entière après le calcul du coût, et non mot par mot. Le flux Gemini ne contient pas de lignes de service : prévoyez une marge pour le délai d’attente du client.

Vous avez d’autres questions? Envoyez le Request ID et une description : nous vous aiderons à comprendre.[Contacter le soutien](mailto:support@ailoot.ai)

## Ailoot · L’entreprise et son portefeuille de projets





Ailoot s’appuie sur une expérience opérationnelle éprouvée, une large clientèle, un service stable et un suivi continu des KPI.





L’entreprise et son portefeuille de projets : des millions de clients ; des ventes qui se chiffrent en milliards chaque mois.





Ailoot met cette expérience opérationnelle au service de l’accès API aux fonctions d’IA dans les produits des clients, leurs agents, applications et automatisations.
