Google GenAI SDK
MarkdownHet native Gemini-formaat: Google GenAI SDK voor Python en JavaScript, en directe REST-verzoeken.
Volledige gids
Installatie
pip install google-genainpm install @google/genaiVerbinding instellen
Het adres is https://api.ailoot.ai zonder /v1beta: de SDK stelt zelf het pad /v1beta/models/<model>:generateContent samen. In Python stel je het adres in via HttpOptions(base_url=…), in JavaScript via httpOptions.baseUrl. De SDK stuurt de sleutel mee in de header 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"), # zonder /v1beta
)
resp = client.models.generate_content(
model="gemini-3.8-flash",
contents="Bedenk drie namen voor een koffiebar.",
)
print(resp.text)import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
apiKey: process.env.AILOOT_API_KEY,
httpOptions: { baseUrl: "https://api.ailoot.ai" }, // zonder /v1beta
});
const resp = await ai.models.generateContent({
model: "gemini-3.8-flash",
contents: "Bedenk drie namen voor een koffiebar.",
});
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": "Bedenk drie namen voor een koffiebar."}]}
]
}' Wat je kunt meegeven
- Velden op het hoogste niveau:
contents,systemInstruction,generationConfig,safetySettings,toolsentoolConfig. generationConfigaccepteerttemperature,topP,topK,maxOutputTokens,thinkingConfig,responseMimeType(text/plainofapplication/json),responseSchemaofresponseJsonSchema(JSON-object),stopSequences(array van strings),candidateCount: 1, een geheel getal voorseed, numerieke waarden voorpresencePenaltyenfrequencyPenalty. Toegestane bereiken en mogelijkheden hangen af van het specifieke model; kies voor een JSON-antwoord één ondersteunde schemavorm enapplication/json. Bij tekstmodellen isresponseModalities— alleen["TEXT"].safetySettings— een array van objecten metcategory,thresholden optionelemethod; kies de waarden volgens de documentatie van het specifieke model.- Bij Gemini-modellen die het betreffende invoertype ondersteunen,
parts[].inlineDatabevatmimeTypeen niet-lege base64-data; een PDF moet een echt PDF-bestand zijn.fileDatabevat een openbaarhttps-adres infileUrien het MIME-type van het bestand. Voor YouTube mag je het MIME-type weglaten.http, privéadressen,gs://en Google Files API-objecten worden niet ondersteund; uploaden via Google Files API ook niet. Bij video kun jevideoMetadata:startOffset/endOffsettoevoegen als string in seconden (bijvoorbeeld1.5s) enfpsmoet groter dan 0 en maximaal 24 zijn. De bodygrootte, context, toegestane invoer en antwoordlimiet worden per model en formaat gecontroleerd. - Clientfuncties in
functionDeclarationsworden uitgevoerd door je applicatie. Bij tekstmodellen worden ook{"googleSearch": {}}en{"urlContext": {}}geaccepteerd: afzonderlijk of samen in de arraytools. Noch Google Search noch URL context kan worden gecombineerd metfunctionDeclarationsin hetzelfde verzoek. Voor afbeeldingen als output zijn alleen clientfuncties beschikbaar. Andere ingebouwde tools en explicit cache worden niet ondersteund. Search/URL context kunnen een reservering vereisen op basis van de volledige invoerlimiet; de daadwerkelijketoolUsePromptTokenCountworden als invoertokens geteld. - Als het model een veld, bijlage of combinatie van tools niet ondersteunt, wordt het verzoek vóór de reservering afgewezen — er wordt niets afgeschreven. Je ontvangt HTTP
400metstatusINVALID_ARGUMENTen de klasseinvalid_request(inErrorInfo.reason—INVALID_REQUEST). Ongeldige JSON, fouten in padparameters en andere controles geven ook400terug; lees de foutmelding en de Request ID. De mogelijkheden hangen af van het model: controleer de formaten en invoertypen in de catalogus.
| Invoer | Ondersteunde MIME-typen |
|---|---|
| Inline-afbeeldingen | image/png, image/jpeg, image/webp |
| Documenten | 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 |
| Video | 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"},
)
# Eén keer versturen. Controleer na een time-out de Request ID in je gebruiksgeschiedenis voordat je opnieuw probeert.
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
# Geef een echt lokaal PDF-, audio- of videobestand op, met het ondersteunde MIME-type.
path, mime = pathlib.Path(sys.argv[1]), sys.argv[2]
payload = {"contents": [{"role": "user", "parts": [
{"text": "Beschrijf kort de inhoud van het bestand."},
{"inlineData": {"mimeType": mime,
"data": base64.b64encode(path.read_bytes()).decode()}},
]}]}
print(generate("gemini-3.8-flash", payload))
# Alternatieve bijlage: {"fileData": {"mimeType": mime, "fileUri": public_https_url}}
# Voor een echte YouTube-URL: {"fileData": {"fileUri": youtube_url}}De volledige functiecyclus
Geef de declaratie door, ontvang functionCall, voer je eigen functie uit, geef functionResponse terug en vraag het volgende antwoord op. Bewaar de volledige content van het model, inclusief thoughtSignature; maak de handtekening niet zelf aan.
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"},
)
# Eén keer versturen. Controleer na een time-out de Request ID in je gebruiksgeschiedenis voordat je opnieuw probeert.
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": "Twee getallen vermenigvuldigen",
"parameters": {"type": "object", "properties": {
"a": {"type": "number"}, "b": {"type": "number"}},
"required": ["a", "b"]},
}]}]
contents = [{"role": "user", "parts": [{"text": "Vermenigvuldig 7 met 8 met behulp van de functie"}]}]
for turn in range(4): # Beperk de toollus; verstuur een verzoek met een onduidelijk resultaat niet opnieuw.
reply = generate("gemini-3.8-flash", {"contents": contents, "tools": tools})
content = reply["candidates"][0]["content"]
contents.append(content) # Bewaar ALLE oorspronkelijke onderdelen en thoughtSignature ongewijzigd.
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")Gestreamd antwoord
for chunk in client.models.generate_content_stream(
model="gemini-3.8-flash",
contents="Beschrijf een zonsondergang boven zee",
):
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": "Beschrijf een zonsondergang boven zee"}]}]}' Beschikbare modellen
Het Gemini-formaat bevat 27 beschikbare identificatoren: 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.
Gemini-modellen zijn ook beschikbaar in het Anthropic Messages-formaat — handig voor clients die alleen dat ondersteunen: Anthropic SDK.