Source: https://ailoot.ai/docs/fr/connect/google-genai/
Canonical: https://ailoot.ai/docs/fr/connect/google-genai/
Language: fr

[Connexion](https://ailoot.ai/docs/fr/) 

# Google GenAI SDK

[Markdown](https://ailoot.ai/docs/fr/connect/google-genai/index.md)

Le format natif Gemini : Google GenAI SDK pour Python et JavaScript, ainsi que des requêtes REST directes.

## [](https://ailoot.ai/docs/fr/connect/google-genai/#install)Installation

```bash
pip install google-genai
```

```bash
npm install @google/genai
```

## [](https://ailoot.ai/docs/fr/connect/google-genai/#client)Connexion

L’adresse est `https://api.ailoot.ai` sans `/v1beta` : le SDK construit lui-même le chemin `/v1beta/models/<modèle>:generateContent` . En Python, l’adresse se configure avec `HttpOptions(base_url=…)`, et en JavaScript, avec `httpOptions.baseUrl`. Le SDK transmet la clé dans l’en-tête `x-goog-api-key`.

```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);
```

```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é."}]}
    ]
  }' 
```

## [](https://ailoot.ai/docs/fr/connect/google-genai/#body)Champs acceptés

- Champs de premier niveau : `contents`, `systemInstruction`, `generationConfig`, `safetySettings`, `tools` et `toolConfig`.
- `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` — un tableau d’objets contenant `category`, `threshold` et, facultativement, `method`; choisissez les valeurs selon la documentation du modèle exact.
- 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 via 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.
- Les déclarations clientes `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 clientes sont disponibles. Les autres outils intégrés et explicit cache ne sont pas pris en charge. Search/URL context peuvent exiger une réservation couvrant la limite d’entrée complète ; les valeurs réelles `toolUsePromptTokenCount` sont comptées comme tokens d’entrée.
- 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éservation, 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.

| Entrée | MIME pris en charge |
| --- | --- |
| Images 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. Après un dépassement de 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 véritable fichier PDF, audio ou vidéo local, ainsi que 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 véritable URL YouTube : {"fileData": {"fileUri": youtube_url}}
```

## [](https://ailoot.ai/docs/fr/connect/google-genai/#function-loop)Cycle complet d’un appel de fonction

Transmettez la déclaration, recevez functionCall, exécutez votre fonction, renvoyez functionResponse, puis demandez la réponse suivante. Conservez l’intégralité du content du modèle, y compris thoughtSignature ; ne créez pas vous-même la signature.

```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. Après un dépassement de 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 le nombre d’itérations de 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 les parties d’origine et thoughtSignature sans modification.
    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")
```

## [](https://ailoot.ai/docs/fr/connect/google-genai/#stream)Réponse en streaming

```python
for chunk in client.models.generate_content_stream(
    model="gemini-3.8-flash",
    contents="Décris un coucher de soleil sur la mer",
):
    print(chunk.text, end="", flush=True)
```

```bash
curl -N "https://api.ailoot.ai/v1beta/models/gemini-3.8-flash:streamGenerateContent?alt=sse" \
  -H "x-goog-api-key: $AILOOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contents": [{"role": "user", "parts": [{"text": "Décris un coucher de soleil sur la mer"}]}]}' 
```

Ailoot fournit la réponse payante Gemini après le calcul du coût : le texte du flux arrive en entier lorsque le modèle a terminé, et non mot à mot. Le flux Gemini ne contient pas de lignes de service ; prévoyez donc une marge dans le délai d’attente du client pour les réponses longues.

## [](https://ailoot.ai/docs/fr/connect/google-genai/#models)Modèles disponibles

Le format Gemini donne accès à 27 identifiants : `gemini-3.8-flash`, `gemini-3.1-pro`, `gemini-pro-agent`, `gemini-3.8-flash-tiered`, `gemini-3.8-flash-medium`, `gemini-3.8-flash-low`, `gemini-3.8-flash-high`, `gemini-3.7-flash`, `gemini-3.7-flash-tiered`, `gemini-3.7-flash-medium`, `gemini-3.7-flash-low`, `gemini-3.7-flash-high`, `gemini-3.6-flash`, `gemini-3.6-flash-tiered`, `gemini-3.6-flash-medium`, `gemini-3.6-flash-low`, `gemini-3.6-flash-high`, `gemini-3.5-flash-lite`, `gemini-3.1-pro-preview`, `gemini-3.1-pro-low`, `gemini-3.1-pro-high`, `gemini-3.1-flash-lite`, `gemini-3-flash`, `gemini-2.5-pro`, `gemini-2.5-flash`, `gemini-2.5-flash-thinking`, `gemini-2.5-flash-lite`.

Les modèles Gemini sont aussi disponibles au format Anthropic Messages, ce qui est pratique pour les clients qui ne prennent en charge que ce format : [Anthropic SDK](https://ailoot.ai/docs/fr/connect/anthropic-sdk/).

Encore des questions ? Envoyez le Request ID et une description : nous vous aiderons à comprendre.[Contacter l’assistance](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.
