docs
Connexion

Google GenAI SDK

Markdown

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

Guide complet

Installation

pip install google-genai

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.

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)

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é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. 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}}

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. 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")

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

Encore des questions ? Envoyez le Request ID et une description : nous vous aiderons à comprendre.Contacter l’assistance