SDK Google GenAI
MarkdownLe format natif Gemini : le SDK Google GenAI pour Python et JavaScript, ainsi que des requêtes REST directes.
Guide complet
Installation
pip install google-genainpm install @google/genaiConnexion
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)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);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é."}]}
]
}' Champs acceptés
- Champs de premier niveau :
contents,systemInstruction,generationConfig,safetySettings,toolsettoolConfig. generationConfigacceptetemperature,topP,topK,maxOutputTokens,thinkingConfig,responseMimeType(text/plainouapplication/json),responseSchemaouresponseJsonSchema(objet JSON),stopSequences(tableau de chaînes),candidateCount: 1, le paramètre entierseed, les paramètres numériquespresencePenaltyetfrequencyPenalty. Les plages autorisées et les capacités dépendent du modèle exact ; pour une réponse JSON, choisissez une seule représentation de schéma prise en charge etapplication/json. Pour les modèles textuels,responseModalities— uniquement["TEXT"].safetySettings— un tableau d’objets contenantcategory,thresholdet, 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[].inlineDatacontientmimeTypeet des données base64 non vides ; le PDF doit être un véritable fichier PDF.fileDatacontient une URL publiquehttpsdansfileUriet 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 l’envoi de fichiers via Google Files API. Pour une vidéo, vous pouvez ajoutervideoMetadata:startOffset/endOffsetsous forme de chaîne exprimée en secondes (par exemple,1.5s) etfpssupé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 fonctions déclarées côté client dans
functionDeclarationssont exécutées par votre application. Les modèles textuels acceptent aussi{"googleSearch": {}}et{"urlContext": {}}: séparément ou ensemble dans le tableautools. Ni Google Search ni URL context ne peuvent être combinés avecfunctionDeclarationsdans une même requête. Pour les images en sortie, seules les fonctions clientes sont disponibles. Les autres outils intégrés et le cache explicite (explicit cache) ne sont pas pris en charge. Search/URL context peuvent exiger une réservation correspondant à la limite maximale d’entrée ; les valeurs réellestoolUsePromptTokenCountsont 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
400avecstatusINVALID_ARGUMENTet la classeinvalid_request(dansErrorInfo.reason—INVALID_REQUEST). Un JSON incorrect, des erreurs de paramètres de chemin ou d’autres validations renvoient aussi400; lisez le message d’erreur et le Request ID. Les capacités dépendent du modèle : vérifiez ses formats et les entrées acceptées dans le catalogue.
| Entrée | Types 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 |
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)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"}]}]}' 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.