docs
Connexion à l’API

SDK Google GenAI

Markdown

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

Guide complet

Installation

pip install google-genai

Connexion à l’API

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.

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)

Données acceptées

  • 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 envois de fichiers 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 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 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éeMIME pris en charge
Images inlineimage/png, image/jpeg, image/webp
Documentsapplication/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
Audioaudio/wav, audio/mp3, audio/mpeg, audio/aiff, audio/aac, audio/ogg, audio/flac
Vidéovideo/mp4, video/mpeg, video/mov, video/quicktime, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp
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}}

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.

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 en streaming

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)

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 : SDK Anthropic.

Des questions ? Envoyez-nous le Request ID et une description : nous vous aiderons à y voir plus clair.Contacter l’assistance